diff --git a/src/apps/terminal/CodeConv.cpp b/src/apps/terminal/CodeConv.cpp index e5b343096d..18c8652ecf 100644 --- a/src/apps/terminal/CodeConv.cpp +++ b/src/apps/terminal/CodeConv.cpp @@ -72,7 +72,7 @@ CodeConv::ConvertFromInternal(const char *src, int32 srclen, char *dst, int codi // system api for code conversion... check if this (which looks a lot like a workaround) // applies to haiku, and if not, get rid of this class and just use the system api directly. if (coding == B_EUC_CONVERSION && state != 0) { - const char *end_of_jis = ""; + const char *end_of_jis = "\033(B"; strncpy((char *)dst + dstlen, end_of_jis, 3); dstlen += 3; } diff --git a/src/apps/terminal/TermView.cpp b/src/apps/terminal/TermView.cpp index 9a813c71d3..31fa6f3531 100644 --- a/src/apps/terminal/TermView.cpp +++ b/src/apps/terminal/TermView.cpp @@ -1483,26 +1483,28 @@ TermView::KeyDown(const char *bytes, int32 numBytes) // Terminal filters RET, ENTER, F1...F12, and ARROW key code. // TODO: Cleanup if (numBytes == 1) { + const char *toWrite = NULL; switch (*bytes) { case B_RETURN: - if (rawChar == B_RETURN) { - char c = 0x0d; - fShell->Write(&c, 1); - return; - } + if (rawChar == B_RETURN) + toWrite = "\r"; break; case B_LEFT_ARROW: if (rawChar == B_LEFT_ARROW) { - fShell->Write(LEFT_ARROW_KEY_CODE, sizeof(LEFT_ARROW_KEY_CODE) - 1); - return; + if (mod & B_CONTROL_KEY) + toWrite = CTRL_LEFT_ARROW_KEY_CODE; + else + toWrite = LEFT_ARROW_KEY_CODE; } break; case B_RIGHT_ARROW: if (rawChar == B_RIGHT_ARROW) { - fShell->Write(RIGHT_ARROW_KEY_CODE, sizeof(RIGHT_ARROW_KEY_CODE) - 1); - return; + if (mod & B_CONTROL_KEY) + toWrite = CTRL_RIGHT_ARROW_KEY_CODE; + else + toWrite = RIGHT_ARROW_KEY_CODE; } break; @@ -1515,8 +1517,10 @@ TermView::KeyDown(const char *bytes, int32 numBytes) return; } if (rawChar == B_UP_ARROW) { - fShell->Write(UP_ARROW_KEY_CODE, sizeof(UP_ARROW_KEY_CODE) - 1); - return; + if (mod & B_CONTROL_KEY) + toWrite = CTRL_UP_ARROW_KEY_CODE; + else + toWrite = UP_ARROW_KEY_CODE; } break; @@ -1528,30 +1532,26 @@ TermView::KeyDown(const char *bytes, int32 numBytes) } if (rawChar == B_DOWN_ARROW) { - fShell->Write(DOWN_ARROW_KEY_CODE, sizeof(DOWN_ARROW_KEY_CODE) - 1); - return; + if (mod & B_CONTROL_KEY) + toWrite = CTRL_DOWN_ARROW_KEY_CODE; + else + toWrite = DOWN_ARROW_KEY_CODE; } break; case B_INSERT: - if (rawChar == B_INSERT) { - fShell->Write(INSERT_KEY_CODE, sizeof(INSERT_KEY_CODE) - 1); - return; - } + if (rawChar == B_INSERT) + toWrite = INSERT_KEY_CODE; break; case B_HOME: - if (rawChar == B_HOME) { - fShell->Write(HOME_KEY_CODE, sizeof(HOME_KEY_CODE) - 1); - return; - } + if (rawChar == B_HOME) + toWrite = HOME_KEY_CODE; break; case B_END: - if (rawChar == B_END) { - fShell->Write(END_KEY_CODE, sizeof(END_KEY_CODE) - 1); - return; - } + if (rawChar == B_END) + toWrite = END_KEY_CODE; break; case B_PAGE_UP: @@ -1562,10 +1562,8 @@ TermView::KeyDown(const char *bytes, int32 numBytes) } return; } - if (rawChar == B_PAGE_UP) { - fShell->Write(PAGE_UP_KEY_CODE, sizeof(PAGE_UP_KEY_CODE) - 1); - return; - } + if (rawChar == B_PAGE_UP) + toWrite = PAGE_UP_KEY_CODE; break; case B_PAGE_DOWN: @@ -1575,10 +1573,8 @@ TermView::KeyDown(const char *bytes, int32 numBytes) return; } - if (rawChar == B_PAGE_DOWN) { - fShell->Write(PAGE_DOWN_KEY_CODE, sizeof(PAGE_DOWN_KEY_CODE) - 1); - return; - } + if (rawChar == B_PAGE_DOWN) + toWrite = PAGE_DOWN_KEY_CODE; break; case B_FUNCTION_KEY: @@ -1593,6 +1589,10 @@ TermView::KeyDown(const char *bytes, int32 numBytes) default: break; } + if (toWrite) { + fShell->Write(toWrite, strlen(toWrite)); + return; + } } else { // input multibyte character if (fEncoding != M_UTF8) { @@ -1636,7 +1636,7 @@ void TermView::MessageReceived(BMessage *msg) { entry_ref ref; - char *ctrl_l = " "; + char *ctrl_l = "\x0c"; // first check for any dropped message if (msg->WasDropped()) { diff --git a/src/apps/terminal/VTKeyTbl.c b/src/apps/terminal/VTKeyTbl.c index d12af62835..ad64d40f64 100644 --- a/src/apps/terminal/VTKeyTbl.c +++ b/src/apps/terminal/VTKeyTbl.c @@ -48,16 +48,16 @@ F12_KEY, char *function_key_char_table [] = { -"[11~", -"[12~", -"[13~", -"[14~", -"[15~", -"[16~", -"[17~", -"[18~", -"[19~", -"[20~", -"[21~", -"[22~", +"\033[11~", +"\033[12~", +"\033[13~", +"\033[14~", +"\033[15~", +"\033[16~", +"\033[17~", +"\033[18~", +"\033[19~", +"\033[20~", +"\033[21~", +"\033[22~", }; diff --git a/src/apps/terminal/VTkeymap.h b/src/apps/terminal/VTkeymap.h index cecb0c3535..e1b6b5bd7c 100644 --- a/src/apps/terminal/VTkeymap.h +++ b/src/apps/terminal/VTkeymap.h @@ -65,16 +65,23 @@ -#define LEFT_ARROW_KEY_CODE "" -#define RIGHT_ARROW_KEY_CODE "" -#define UP_ARROW_KEY_CODE "" -#define DOWN_ARROW_KEY_CODE "" +#define LEFT_ARROW_KEY_CODE "\033[D" +#define RIGHT_ARROW_KEY_CODE "\033[C" +#define UP_ARROW_KEY_CODE "\033[A" +#define DOWN_ARROW_KEY_CODE "\033[B" -#define HOME_KEY_CODE "[@" -#define INSERT_KEY_CODE "[2~" -#define END_KEY_CODE "[[" -#define PAGE_UP_KEY_CODE "[5~" -#define PAGE_DOWN_KEY_CODE "[6~" +#define CTRL_LEFT_ARROW_KEY_CODE "\033[5D" +#define CTRL_RIGHT_ARROW_KEY_CODE "\033[5C" +#define CTRL_UP_ARROW_KEY_CODE "\033[5A" +#define CTRL_DOWN_ARROW_KEY_CODE "\033[5B" + +//#define HOME_KEY_CODE "\033[@" +#define HOME_KEY_CODE "\033[1~" +#define INSERT_KEY_CODE "\033[2~" +//#define END_KEY_CODE "\033[[" +#define END_KEY_CODE "\033[4~" +#define PAGE_UP_KEY_CODE "\033[5~" +#define PAGE_DOWN_KEY_CODE "\033[6~" //#define IS_DOWN_KEY(x) (info.key_states[(x) / 8] & key_state_table[(x) % 8]) #define IS_DOWN_KEY(x) \