billiob pushed a commit to branch master. http://git.enlightenment.org/apps/terminology.git/commit/?id=ae820f389726fac7b43e74d4f6fc7a38198b3e1b
commit ae820f389726fac7b43e74d4f6fc7a38198b3e1b Author: Boris Faure <[email protected]> Date: Mon Aug 11 22:02:56 2014 +0200 extract csi_reset_mode --- src/bin/termptyesc.c | 544 +++++++++++++++++++++++---------------------------- 1 file changed, 250 insertions(+), 294 deletions(-) diff --git a/src/bin/termptyesc.c b/src/bin/termptyesc.c index f529764..d8e67ff 100644 --- a/src/bin/termptyesc.c +++ b/src/bin/termptyesc.c @@ -109,6 +109,254 @@ _handle_cursor_control(Termpty *ty, const Eina_Unicode *cc) } static void +_handle_esc_csi_reset_mode(Termpty *ty, Eina_Unicode cc, Eina_Unicode *b) +{ + int mode = 0, priv = 0, arg; + + if (cc == 'h') mode = 1; + if (*b == '?') + { + priv = 1; + b++; + } + if (priv) /* DEC Private Mode Reset (DECRST) */ + { + while (b) + { + arg = _csi_arg_get(&b); + if (b) + { + // complete-ish list here: + // http://ttssh2.sourceforge.jp/manual/en/about/ctrlseq.html + switch (arg) + { + case 1: + ty->state.appcursor = mode; + break; + case 2: + ty->state.kbd_lock = mode; + break; + case 3: // 132 column mode… should we handle this? +#if defined(SUPPORT_80_132_COLUMNS) + if (ty->state.att.is_80_132_mode_allowed) + { + /* ONLY FOR TESTING PURPOSE FTM */ + Evas_Object *wn; + int w, h; + + wn = termio_win_get(ty->obj); + elm_win_size_step_get(wn, &w, &h); + evas_object_resize(wn, + 4 + + (mode ? 132 : 80) * w, + 4 + ty->h * h); + termpty_resize(ty, mode ? 132 : 80, + ty->h); + _termpty_reset_state(ty); + _termpty_clear_screen(ty, + TERMPTY_CLR_ALL); + } +#endif + break; + case 4: + WRN("TODO: scrolling mode (DECSCLM): %i", mode); + break; + case 5: + ty->state.reverse = mode; + break; + case 6: + if (mode) + { + ty->state.margin_top = ty->state.cy; + ty->state.cx = 0; + } + else + { + ty->state.cx = 0; + ty->state.margin_top = 0; + } + DBG("origin mode (%d): cursor is at 0,0" + " cursor limited to screen/start point" + " for line #'s depends on top margin", + mode); + break; + case 7: + DBG("set wrap mode to %i", mode); + ty->state.wrap = mode; + break; + case 8: + ty->state.no_autorepeat = !mode; + DBG("auto repeat %i", mode); + break; + case 9: + DBG("set mouse (X10) %i", mode); + if (mode) ty->mouse_mode = MOUSE_X10; + else ty->mouse_mode = MOUSE_OFF; + break; + case 12: // ignore + WRN("TODO: set blinking cursor to (stop?) %i or local echo (ignored)", mode); + break; + case 19: // never seen this - what to do? + WRN("TODO: set print extent to full screen"); + break; + case 20: // crfl==1 -> cur moves to col 0 on LF, FF or VT, ==0 -> mode is cr+lf + ty->state.crlf = mode; + break; + case 25: + ty->state.hidecursor = !mode; + DBG("hide cursor: %d", !mode); + break; + case 30: // ignore + WRN("TODO: set scrollbar mapping %i", mode); + break; + case 33: // ignore + WRN("TODO: Stop cursor blink %i", mode); + break; + case 34: // ignore + WRN("TODO: Underline cursor mode %i", mode); + break; + case 35: // ignore + WRN("TODO: set shift keys %i", mode); + break; + case 38: // ignore + WRN("TODO: switch to tek window %i", mode); + break; + case 40: + DBG("Allow 80 -> 132 Mode %i", mode); +#if defined(SUPPORT_80_132_COLUMNS) + ty->state.att.is_80_132_mode_allowed = mode; +#endif + break; + case 45: // ignore + WRN("TODO: Reverse-wraparound Mode"); + break; + case 59: // ignore + WRN("TODO: kanji terminal mode %i", mode); + break; + case 66: + WRN("TODO: app keypad mode %i", mode); + break; + case 67: + ty->state.send_bs = mode; + DBG("backspace send bs not del = %i", mode); + break; + case 1000: + if (mode) ty->mouse_mode = MOUSE_NORMAL; + else ty->mouse_mode = MOUSE_OFF; + DBG("set mouse (press+release only) to %i", mode); + break; + case 1001: + WRN("TODO: x11 mouse highlighting %i", mode); + break; + case 1002: + if (mode) ty->mouse_mode = MOUSE_NORMAL_BTN_MOVE; + else ty->mouse_mode = MOUSE_OFF; + DBG("set mouse (press+release+motion while pressed) %i", mode); + break; + case 1003: + if (mode) ty->mouse_mode = MOUSE_NORMAL_ALL_MOVE; + else ty->mouse_mode = MOUSE_OFF; + DBG("set mouse (press+release+all motion) %i", mode); + break; + case 1004: // i dont know what focus repporting is? + WRN("TODO: enable focus reporting %i", mode); + break; + case 1005: + if (mode) ty->mouse_ext = MOUSE_EXT_UTF8; + else ty->mouse_ext = MOUSE_EXT_NONE; + DBG("set mouse (xterm utf8 style) %i", mode); + break; + case 1006: + if (mode) ty->mouse_ext = MOUSE_EXT_SGR; + else ty->mouse_ext = MOUSE_EXT_NONE; + DBG("set mouse (xterm sgr style) %i", mode); + break; + case 1010: // ignore + WRN("TODO: set home on tty output %i", mode); + break; + case 1012: // ignore + WRN("TODO: set home on tty input %i", mode); + break; + case 1015: + if (mode) ty->mouse_ext = MOUSE_EXT_URXVT; + else ty->mouse_ext = MOUSE_EXT_NONE; + DBG("set mouse (rxvt-unicode style) %i", mode); + break; + case 1034: // ignore + /* libreadline6 emits it but it shouldn't. + See http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=577012 + */ + DBG("Ignored screen mode %i", arg); + break; + case 1047: + case 1049: + case 47: + DBG("DDD: switch buf"); + if (ty->altbuf) + { + // if we are looking at alt buf now, + // clear main buf before we swap it back + // into the screen2 save (so save is + // clear) + _termpty_clear_all(ty); + } + // swap screen content now + if (mode != ty->altbuf) + termpty_screen_swap(ty); + break; + case 1048: + if (mode) + _termpty_cursor_copy(&(ty->state), &(ty->save)); + else + _termpty_cursor_copy(&(ty->save), &(ty->state)); + break; + case 2004: + ty->bracketed_paste = mode; + break; + case 7727: // ignore + WRN("TODO: enable application escape mode %i", mode); + break; + case 7786: // ignore + WRN("TODO: enable mouse wheel -> cursor key xlation %i", mode); + break; + default: + ERR("Unhandled DEC Private Reset Mode arg %i", arg); + break; + } + } + } + } + else /* Reset Mode (RM) */ + { + while (b) + { + arg = _csi_arg_get(&b); + if (b) + { + switch (arg) + { + case 1: + ty->state.appcursor = mode; + break; + case 4: + DBG("set insert mode to %i", mode); + ty->state.insert = mode; + break; + case 34: + WRN("TODO: hebrew keyboard mapping: %i", mode); + break; + case 36: + WRN("TODO: hebrew encoding mode: %i", mode); + break; + default: + ERR("Unhandled ANSI Reset Mode arg %i", arg); + } + } + } + } +} + +static void _handle_esc_csi_color_set(Termpty *ty, Eina_Unicode **ptr) { Eina_Unicode *b = *ptr; @@ -619,301 +867,9 @@ _handle_esc_csi(Termpty *ty, const Eina_Unicode *c, Eina_Unicode *ce) } else _termpty_clear_line(ty, TERMPTY_CLR_END, ty->w); break; - case 'h': // list - set screen mode or line wrap ("7h" == turn on line wrap, "7l" disables line wrap , ...) + case 'h': case 'l': - { - int mode = 0, priv = 0; - int handled = 0; - - if (*cc == 'h') mode = 1; - if (*b == '?') - { - priv = 1; - b++; - } - if (priv) /* DEC Private Mode Reset (DECRST) */ - { - while (b) - { - arg = _csi_arg_get(&b); - if (b) - { - // complete-ish list here: - // http://ttssh2.sourceforge.jp/manual/en/about/ctrlseq.html - switch (arg) - { - case 1: - handled = 1; - ty->state.appcursor = mode; - break; - case 2: - handled = 1; - ty->state.kbd_lock = mode; - break; - case 3: // 132 column mode… should we handle this? - handled = 1; -#if defined(SUPPORT_80_132_COLUMNS) - if (ty->state.att.is_80_132_mode_allowed) - { - /* ONLY FOR TESTING PURPOSE FTM */ - Evas_Object *wn; - int w, h; - - wn = termio_win_get(ty->obj); - elm_win_size_step_get(wn, &w, &h); - evas_object_resize(wn, - 4 + - (mode ? 132 : 80) * w, - 4 + ty->h * h); - termpty_resize(ty, mode ? 132 : 80, - ty->h); - _termpty_reset_state(ty); - _termpty_clear_screen(ty, - TERMPTY_CLR_ALL); - } -#endif - break; - case 4: - handled = 1; - ERR("TODO: scrolling mode (DECSCLM): %i", mode); - break; - case 5: - handled = 1; - ty->state.reverse = mode; - break; - case 6: - handled = 1; - if (mode) - { - ty->state.margin_top = ty->state.cy; - ty->state.cx = 0; - } - else - { - ty->state.cx = 0; - ty->state.margin_top = 0; - } - DBG("XXX: origin mode (%d): cursor is at 0,0" - "cursor limited to screen/start point" - " for line #'s depends on top margin", - mode); - break; - case 7: - handled = 1; - DBG("XXX: set wrap mode to %i", mode); - ty->state.wrap = mode; - break; - case 8: - handled = 1; - ty->state.no_autorepeat = !mode; - INF("XXX: auto repeat %i", mode); - break; - case 9: - handled = 1; - INF("XXX: set mouse (X10) %i", mode); - if (mode) ty->mouse_mode = MOUSE_X10; - else ty->mouse_mode = MOUSE_OFF; - break; - case 12: // ignore - handled = 1; - DBG("set blinking cursor to (stop?) %i or local echo (ignored)", mode); - break; - case 19: // never seen this - what to do? - handled = 1; -// INF("XXX: set print extent to full screen"); - break; - case 20: // crfl==1 -> cur moves to col 0 on LF, FF or VT, ==0 -> mode is cr+lf - handled = 1; - ty->state.crlf = mode; - break; - case 25: - handled = 1; - ty->state.hidecursor = !mode; - DBG("hide cursor: %d", !mode); - break; - case 30: // ignore - handled = 1; -// DBG("XXX: set scrollbar mapping %i", mode); - break; - case 33: // ignore - handled = 1; -// INF("XXX: Stop cursor blink %i", mode); - break; - case 34: // ignore - handled = 1; -// INF("XXX: Underline cursor mode %i", mode); - break; - case 35: // ignore - handled = 1; -// DBG("XXX: set shift keys %i", mode); - break; - case 38: // ignore - handled = 1; -// INF("XXX: switch to tek window %i", mode); - break; - case 40: - handled = 1; - // INF("XXX: Allow 80 -> 132 Mode %i", mode); -#if defined(SUPPORT_80_132_COLUMNS) - ty->state.att.is_80_132_mode_allowed = mode; -#endif - break; - case 45: // ignore - handled = 1; - INF("TODO: Reverse-wraparound Mode"); - break; - case 59: // ignore - handled = 1; -// INF("XXX: kanji terminal mode %i", mode); - break; - case 66: - handled = 1; - ERR("XXX: app keypad mode %i", mode); - break; - case 67: - handled = 1; - ty->state.send_bs = mode; - INF("XXX: backspace send bs not del = %i", mode); - break; - case 1000: - handled = 1; - if (mode) ty->mouse_mode = MOUSE_NORMAL; - else ty->mouse_mode = MOUSE_OFF; - INF("XXX: set mouse (press+release only) to %i", mode); - break; - case 1001: - handled = 1; - ERR("XXX: x11 mouse highlighting %i", mode); - break; - case 1002: - handled = 1; - if (mode) ty->mouse_mode = MOUSE_NORMAL_BTN_MOVE; - else ty->mouse_mode = MOUSE_OFF; - INF("XXX: set mouse (press+release+motion while pressed) %i", mode); - break; - case 1003: - handled = 1; - if (mode) ty->mouse_mode = MOUSE_NORMAL_ALL_MOVE; - else ty->mouse_mode = MOUSE_OFF; - ERR("XXX: set mouse (press+release+all motion) %i", mode); - break; - case 1004: // i dont know what focus repporting is? - handled = 1; - ERR("XXX: enable focus reporting %i", mode); - break; - case 1005: - handled = 1; - if (mode) ty->mouse_ext = MOUSE_EXT_UTF8; - else ty->mouse_ext = MOUSE_EXT_NONE; - INF("XXX: set mouse (xterm utf8 style) %i", mode); - break; - case 1006: - handled = 1; - if (mode) ty->mouse_ext = MOUSE_EXT_SGR; - else ty->mouse_ext = MOUSE_EXT_NONE; - INF("XXX: set mouse (xterm sgr style) %i", mode); - break; - case 1010: // ignore - handled = 1; -// DBG("XXX: set home on tty output %i", mode); - break; - case 1012: // ignore - handled = 1; -// DBG("XXX: set home on tty input %i", mode); - break; - case 1015: - handled = 1; - if (mode) ty->mouse_ext = MOUSE_EXT_URXVT; - else ty->mouse_ext = MOUSE_EXT_NONE; - INF("XXX: set mouse (rxvt-unicode style) %i", mode); - break; - case 1034: // ignore - /* libreadline6 emits it but it shouldn't. - See http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=577012 - */ - handled = 1; -// DBG("Ignored screen mode %i", arg); - break; - case 1047: - case 1049: - case 47: - handled = 1; - DBG("DDD: switch buf"); - if (ty->altbuf) - // if we are looking at alt buf now, - // clear main buf before we swap it back - // into the screen2 save (so save is - // clear) - _termpty_clear_all(ty); - // swap screen content now - if (mode != ty->altbuf) - termpty_screen_swap(ty); - break; - case 1048: - if (mode) - _termpty_cursor_copy(&(ty->state), &(ty->save)); - else - _termpty_cursor_copy(&(ty->save), &(ty->state)); - break; - case 2004: - handled = 1; - ty->bracketed_paste = mode; - break; - case 7727: // ignore - handled = 1; -// INF("XXX: enable application escape mode %i", mode); - break; - case 7786: // ignore - handled = 1; -// INF("XXX: enable mouse wheel -> cursor key xlation %i", mode); - break; - default: - ERR("Unhandled DEC Private Reset Mode arg %i", arg); - break; - } - } - } - } - else /* Reset Mode (RM) */ - { - while (b) - { - arg = _csi_arg_get(&b); - if (b) - { - switch (arg) - { - case 1: - handled = 1; - ty->state.appcursor = mode; - break; - case 4: - handled = 1; - DBG("DDD: set insert mode to %i", mode); - ty->state.insert = mode; - break; - case 34: - handled = 1; - DBG("TODO: hebrew keyboard mapping: %i", mode); - break; - case 36: - handled = 1; - DBG("TODO: hebrew encoding mode: %i", mode); - break; -// else if (arg == 24) -// { -// ERR("unhandled #24 arg %i", arg); -// // ??? -// } - default: - handled = 1; - ERR("Unhandled ANSI Reset Mode arg %i", arg); - } - } - } - } - if (!handled) goto unhandled; - } + _handle_esc_csi_reset_mode(ty, *cc, b); break; case 'r': arg = _csi_arg_get(&b); --
