More or less reverted TermView::KeyDown() to r21695. Fixes bug #1340.

Thanks to Ingo & Korli for the help.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@21751 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Stefano Ceccherini
2007-07-30 15:05:04 +00:00
parent 60be800755
commit 67188b4ca2
+70 -37
View File
@@ -1432,6 +1432,7 @@ TermView::_DoPrint(BRect updateRect)
void void
TermView::WindowActivated(bool active) TermView::WindowActivated(bool active)
{ {
BView::WindowActivated(active);
if (active == false) { if (active == false) {
// DoIMConfirm(); // DoIMConfirm();
} }
@@ -1457,35 +1458,49 @@ TermView::KeyDown(const char *bytes, int32 numBytes)
fShell->Signal(SIGINT); fShell->Signal(SIGINT);
} }
// Terminal changes RET, ENTER, F1...F12, and ARROW key code. // Terminal filters RET, ENTER, F1...F12, and ARROW key code.
// TODO: Cleanup
if (numBytes == 1) { if (numBytes == 1) {
switch (bytes[0]) { switch (*bytes) {
case B_RETURN: case B_RETURN:
{ if (key == RETURN_KEY || key == ENTER_KEY) {
char c = 0x0d; char c = 0x0d;
fShell->Write(&c, 1); fShell->Write(&c, 1);
return;
} else {
fShell->Write(bytes, numBytes);
return;
}
break; break;
}
case B_LEFT_ARROW: case B_LEFT_ARROW:
fShell->Write(LEFT_ARROW_KEY_CODE, sizeof(LEFT_ARROW_KEY_CODE)-1); if (key == LEFT_ARROW_KEY) {
fShell->Write(LEFT_ARROW_KEY_CODE, sizeof(LEFT_ARROW_KEY_CODE) - 1);
return;
}
break; break;
case B_RIGHT_ARROW: case B_RIGHT_ARROW:
fShell->Write(RIGHT_ARROW_KEY_CODE, sizeof(RIGHT_ARROW_KEY_CODE)-1); if (key == RIGHT_ARROW_KEY) {
fShell->Write(RIGHT_ARROW_KEY_CODE, sizeof(RIGHT_ARROW_KEY_CODE) - 1);
return;
}
break; break;
case B_UP_ARROW: case B_UP_ARROW:
if (mod & B_SHIFT_KEY) { if (mod & B_SHIFT_KEY) {
if (Bounds().top <= 0) if (Bounds().top > 0) {
return; ScrollBy(0, -fFontHeight);
ScrollBy(0, -fFontHeight); Window()->UpdateIfNeeded();
Window()->UpdateIfNeeded(); }
return;
}
if (key == UP_ARROW_KEY) {
fShell->Write(UP_ARROW_KEY_CODE, sizeof(UP_ARROW_KEY_CODE) - 1);
return; return;
} }
fShell->Write(UP_ARROW_KEY_CODE, sizeof(UP_ARROW_KEY_CODE)-1);
break; break;
case B_DOWN_ARROW: case B_DOWN_ARROW:
if (mod & B_SHIFT_KEY) { if (mod & B_SHIFT_KEY) {
ScrollBy(0, fFontHeight); ScrollBy(0, fFontHeight);
@@ -1493,27 +1508,45 @@ TermView::KeyDown(const char *bytes, int32 numBytes)
return; return;
} }
fShell->Write(DOWN_ARROW_KEY_CODE, sizeof(DOWN_ARROW_KEY_CODE)-1); if (key == DOWN_ARROW_KEY) {
fShell->Write(DOWN_ARROW_KEY_CODE, sizeof(DOWN_ARROW_KEY_CODE) - 1);
return;
}
break; break;
case B_INSERT: case B_INSERT:
fShell->Write(INSERT_KEY_CODE, sizeof(INSERT_KEY_CODE)-1); if (key == INSERT_KEY) {
fShell->Write(INSERT_KEY_CODE, sizeof(INSERT_KEY_CODE) - 1);
return;
}
break; break;
case B_HOME: case B_HOME:
fShell->Write(HOME_KEY_CODE, sizeof(HOME_KEY_CODE)-1); if (key == HOME_KEY) {
fShell->Write(HOME_KEY_CODE, sizeof(HOME_KEY_CODE) - 1);
return;
}
break;
case B_END:
if (key == END_KEY) {
fShell->Write(END_KEY_CODE, sizeof(END_KEY_CODE) - 1);
return;
}
break; break;
case B_PAGE_UP: case B_PAGE_UP:
if (mod & B_SHIFT_KEY) { if (mod & B_SHIFT_KEY) {
if (Bounds().top <= 0) if (Bounds().top > 0) {
return; ScrollBy(0, -fFontHeight * fTermRows );
ScrollBy(0, -fFontHeight * fTermRows ); Window()->UpdateIfNeeded();
Window()->UpdateIfNeeded(); }
return;
}
if (key == PAGE_UP_KEY) {
fShell->Write(PAGE_UP_KEY_CODE, sizeof(PAGE_UP_KEY_CODE) - 1);
return; return;
} }
fShell->Write(PAGE_UP_KEY_CODE, sizeof(PAGE_UP_KEY_CODE)-1);
break; break;
case B_PAGE_DOWN: case B_PAGE_DOWN:
@@ -1522,37 +1555,37 @@ TermView::KeyDown(const char *bytes, int32 numBytes)
Window()->UpdateIfNeeded(); Window()->UpdateIfNeeded();
return; return;
} }
fShell->Write(PAGE_DOWN_KEY_CODE, sizeof(PAGE_DOWN_KEY_CODE)-1); if (key == PAGE_DOWN_KEY) {
break; fShell->Write(PAGE_DOWN_KEY_CODE, sizeof(PAGE_DOWN_KEY_CODE) - 1);
return;
case B_END: }
fShell->Write(END_KEY_CODE, sizeof(END_KEY_CODE)-1);
break; break;
case B_FUNCTION_KEY: case B_FUNCTION_KEY:
for (int32 c = 0; c < 12; c++) { // TODO: Why not just fShell->Write(key) ?
if (key == function_keycode_table[c]) { for (int32 i = 0; i < 12; i++) {
fShell->Write(function_key_char_table[c], 5); if (key == function_keycode_table[i]) {
fShell->Write(function_key_char_table[i], 5);
return; return;
} }
} }
break; break;
default: default:
fShell->Write(bytes, numBytes);
break; break;
} }
} else { } else {
// input multibyte character // input multibyte character
if (fEncoding != M_UTF8) { if (fEncoding != M_UTF8) {
uchar destBuffer[1024]; char destBuffer[16];
int cnum = CodeConv::ConvertFromInternal(bytes, numBytes, int cnum = CodeConv::ConvertFromInternal(bytes, numBytes,
(char *)destBuffer, fEncoding); (char *)destBuffer, fEncoding);
fShell->Write(destBuffer, cnum); fShell->Write(destBuffer, cnum);
destBuffer[cnum] = 0; return;
} }
} }
fShell->Write(bytes, numBytes);
} }