diff --git a/data/themes/default.edc b/data/themes/default.edc index 90ef709c..512e045f 100644 --- a/data/themes/default.edc +++ b/data/themes/default.edc @@ -322,10 +322,6 @@ collections { //////////////////////////////////////////////////////////////////// // overlayed options and controls - part { name: "terminology.dismiss"; type: SWALLOW; - description { state: "default" 0.0; - } - } part { name: "terminology.about"; type: SWALLOW; scale: 1; description { state: "default" 0.0; @@ -360,6 +356,13 @@ collections { target: "terminology.about"; } + //////////////////////////////////////////////////////////////////// + // swallow to hold invisile rect to click on to dismiss things + part { name: "terminology.dismiss"; type: SWALLOW; + description { state: "default" 0.0; + } + } + //////////////////////////////////////////////////////////////////// // overlayed options and controls part { name: "terminology.options"; type: SWALLOW; @@ -893,9 +896,20 @@ collections { } } programs { + program { name: "begin"; + signal: "begin"; + source: "terminology"; + action: ACTION_STOP; + target: "show"; + target: "show2"; + after: "begin2"; + } + program { name: "begin2"; + action: STATE_SET "default" 0.0; + target: "terminology.text"; + after: "show"; + } program { name: "show"; - signal: "show"; - source: ""; action: STATE_SET "up" 0.0; transition: LINEAR 45.0; target: "terminology.text"; diff --git a/src/bin/about.c b/src/bin/about.c index 3c413a62..411934ef 100644 --- a/src/bin/about.c +++ b/src/bin/about.c @@ -97,6 +97,7 @@ about_toggle(Evas_Object *win, Evas_Object *bg, Evas_Object *term) _cb_mouse_down, term); edje_object_signal_emit(bg, "about,show", "terminology"); + elm_object_signal_emit(ab_layout, "begin" ,"terminology"); ab_out = EINA_TRUE; elm_object_focus_set(ab_layout, EINA_TRUE); if (ab_del_timer) diff --git a/src/bin/keyin.c b/src/bin/keyin.c index 46d24a70..ae0961ea 100644 --- a/src/bin/keyin.c +++ b/src/bin/keyin.c @@ -34,8 +34,11 @@ static const Keyout appcur_keyout[] = KEY("Right", "\033OC"), KEY("Up", "\033OA"), KEY("Down", "\033OB"), - KEY("Home", "\033[7~"), - KEY("End", "\033[8~"), + KEY("Home", "\033OH"), + KEY("End", "\033OF"), +//// why did i change these? +// KEY("Home", "\033[7~"), +// KEY("End", "\033[8~"), KEY("F1", "\033OP"), KEY("F2", "\033OQ"), KEY("F3", "\033OR"), @@ -266,6 +269,7 @@ keyin_handle(Termpty *ty, Evas_Event_Key_Down *ev) if (ty->state.appcursor) { + printf("appcur...\n"); if (_key_try(ty, appcur_keyout, ev)) return; } diff --git a/src/bin/termio.c b/src/bin/termio.c index d529097d..17309b89 100644 --- a/src/bin/termio.c +++ b/src/bin/termio.c @@ -1614,6 +1614,16 @@ _smart_pty_bell(void *data) evas_object_smart_callback_call(data, "bell", NULL); } +static void +_smart_pty_command(void *data) +{ + Evas_Object *obj = data; + Termio *sd; + sd = evas_object_smart_data_get(obj); + if (!sd) return; + printf("COMMAND: '%s'\n", sd->pty->cur_cmd); +} + Evas_Object * termio_add(Evas_Object *parent, Config *config, const char *cmd, int w, int h) { @@ -1649,6 +1659,8 @@ termio_add(Evas_Object *parent, Config *config, const char *cmd, int w, int h) sd->pty->cb.exited.data = obj; sd->pty->cb.bell.func = _smart_pty_bell; sd->pty->cb.bell.data = obj; + sd->pty->cb.command.func = _smart_pty_command; + sd->pty->cb.command.data = obj; _smart_size(obj, w, h, EINA_FALSE); return obj; } diff --git a/src/bin/termpty.c b/src/bin/termpty.c index 445c4d01..561b77f2 100644 --- a/src/bin/termpty.c +++ b/src/bin/termpty.c @@ -649,9 +649,9 @@ _cursor_copy(Termstate *state, Termstate *dest) } static int -_csi_arg_get(char **ptr) +_csi_arg_get(Eina_Unicode **ptr) { - char *b = *ptr; + Eina_Unicode *b = *ptr; int octal = 0; int sum = 0; @@ -674,12 +674,13 @@ _csi_arg_get(char **ptr) } static int -_handle_esc_csi(Termpty *ty, const int *c, int *ce) +_handle_esc_csi(Termpty *ty, const Eina_Unicode *c, Eina_Unicode *ce) { - int *cc, arg, first = 1, i; - char buf[4096], *b; + Eina_Unicode *cc; + int arg, first = 1, i; + Eina_Unicode buf[4096], *b; - cc = (int *)c; + cc = (Eina_Unicode *)c; b = buf; while ((cc < ce) && (*cc >= '0') && (*cc <= '?')) { @@ -693,7 +694,7 @@ _handle_esc_csi(Termpty *ty, const int *c, int *ce) if (cc == ce) return -2; *b = 0; b = buf; - DBG(" CSI: '%c' args '%s'", *cc, buf); +// DBG(" CSI: '%c' args '%s'", *cc, buf); switch (*cc) { case 'm': // color set @@ -1383,7 +1384,7 @@ _handle_esc_csi(Termpty *ty, const int *c, int *ce) } } } - if (!handled) ERR("unhandled '%c' : '%s'", *cc, buf); + if (!handled) ERR("unhandled '%c'", *cc); } break; case 'r': @@ -1454,7 +1455,7 @@ _handle_esc_csi(Termpty *ty, const int *c, int *ce) break; */ default: - ERR("unhandled CSI '%c' (0x%02x), buf='%s'", *cc, *cc, buf); + ERR("unhandled CSI '%c' (0x%02x)", *cc, *cc); break; } cc++; @@ -1462,12 +1463,14 @@ _handle_esc_csi(Termpty *ty, const int *c, int *ce) } static int -_handle_esc_xterm(Termpty *ty, const int *c, int *ce) +_handle_esc_xterm(Termpty *ty, const Eina_Unicode *c, Eina_Unicode *ce) { - int *cc; - char buf[4096], *b; - - cc = (int *)c; + Eina_Unicode *cc; + Eina_Unicode buf[4096], *b; + char *s; + int len = 0; + + cc = (Eina_Unicode *)c; b = buf; while ((cc < ce) && (*cc >= ' ') && (*cc < 0x7f)) { @@ -1482,26 +1485,51 @@ _handle_esc_xterm(Termpty *ty, const int *c, int *ce) { case '0': // XXX: title + name - callback - b = &(buf[2]); + s = eina_unicode_unicode_to_utf8(&(buf[2]), &len); if (ty->prop.title) eina_stringshare_del(ty->prop.title); if (ty->prop.icon) eina_stringshare_del(ty->prop.icon); - ty->prop.title = eina_stringshare_add(b); - ty->prop.icon = eina_stringshare_add(b); + if (b) + { + ty->prop.title = eina_stringshare_add(s); + ty->prop.icon = eina_stringshare_add(s); + free(s); + } + else + { + ty->prop.title = NULL; + ty->prop.icon = NULL; + } if (ty->cb.set_title.func) ty->cb.set_title.func(ty->cb.set_title.data); if (ty->cb.set_icon.func) ty->cb.set_title.func(ty->cb.set_icon.data); break; case '1': // XXX: icon name - callback - b = &(buf[2]); + s = eina_unicode_unicode_to_utf8(&(buf[2]), &len); if (ty->prop.icon) eina_stringshare_del(ty->prop.icon); - ty->prop.icon = eina_stringshare_add(b); + if (s) + { + ty->prop.icon = eina_stringshare_add(s); + free(s); + } + else + { + ty->prop.icon = NULL; + } if (ty->cb.set_icon.func) ty->cb.set_title.func(ty->cb.set_icon.data); break; case '2': // XXX: title - callback - b = &(buf[2]); + s = eina_unicode_unicode_to_utf8(&(buf[2]), &len); if (ty->prop.title) eina_stringshare_del(ty->prop.title); - ty->prop.title = eina_stringshare_add(b); + if (s) + { + ty->prop.title = eina_stringshare_add(s); + free(s); + } + else + { + ty->prop.title = NULL; + } if (ty->cb.set_title.func) ty->cb.set_title.func(ty->cb.set_title.data); break; case '4': @@ -1510,14 +1538,42 @@ _handle_esc_xterm(Termpty *ty, const int *c, int *ce) break; default: // many others - ERR("unhandled xterm esc '%c' -> '%s'", buf[0], buf); + ERR("unhandled xterm esc '%c'", buf[0]); break; } return cc - c; } static int -_handle_esc(Termpty *ty, const int *c, int *ce) +_handle_esc_terminology(Termpty *ty, const Eina_Unicode *c, Eina_Unicode *ce) +{ + Eina_Unicode *cc; + Eina_Unicode buf[4096], *b; + char *s; + int slen = 0; + + cc = (Eina_Unicode *)c; + b = buf; + while ((cc < ce) && (*cc != 0x0)) + { + *b = *cc; + b++; + cc++; + } + *b = 0; + if (*cc == 0x0) cc++; + else return -2; + // commands are stored in the buffer, 0 bytes not allowd (end marker) + s = eina_unicode_unicode_to_utf8(buf, &slen); + ty->cur_cmd = s; + if (ty->cb.command.func) ty->cb.command.func(ty->cb.command.data); + ty->cur_cmd = NULL; + if (s) free(s); + return cc - c; +} + +static int +_handle_esc(Termpty *ty, const Eina_Unicode *c, Eina_Unicode *ce) { if ((ce - c) < 2) return 0; DBG("ESC: '%c'", c[1]); @@ -1527,6 +1583,8 @@ _handle_esc(Termpty *ty, const int *c, int *ce) return 2 + _handle_esc_csi(ty, c + 2, ce); case ']': return 2 + _handle_esc_xterm(ty, c + 2, ce); + case '}': + return 2 + _handle_esc_terminology(ty, c + 2, ce); case '=': // set alternate keypad mode ty->state.alt_kp = 1; return 2; @@ -1626,9 +1684,10 @@ _handle_esc(Termpty *ty, const int *c, int *ce) } static int -_handle_seq(Termpty *ty, const int *c, int *ce) +_handle_seq(Termpty *ty, Eina_Unicode *c, Eina_Unicode *ce) { - int *cc, len = 0; + Eina_Unicode *cc; + int len = 0; /* printf(" B: "); @@ -1794,9 +1853,10 @@ _handle_seq(Termpty *ty, const int *c, int *ce) } static void -_handle_buf(Termpty *ty, const int *codepoints, int len) +_handle_buf(Termpty *ty, const Eina_Unicode *codepoints, int len) { - int *c, *ce, n, *b, bytes; + Eina_Unicode *c, *ce, *b; + int n, bytes; c = (int *)codepoints; ce = &(c[len]); @@ -1810,7 +1870,7 @@ _handle_buf(Termpty *ty, const int *codepoints, int len) ERR("memerr"); } INF("realloc add %i + %i", (int)(ty->buflen * sizeof(int)), (int)(len * sizeof(int))); - bytes = len * sizeof(int); + bytes = len * sizeof(Eina_Unicode); memcpy(&(b[ty->buflen]), codepoints, bytes); ty->buf = b; ty->buflen += len; @@ -1822,11 +1882,11 @@ _handle_buf(Termpty *ty, const int *codepoints, int len) n = _handle_seq(ty, c, ce); if (n == 0) { - int *tmp = ty->buf; + Eina_Unicode *tmp = ty->buf; ty->buf = NULL; ty->buflen = 0; - bytes = ((char *)ce - (char *)c) + sizeof(int); - INF("malloc til %i", (int)(bytes - sizeof(int))); + bytes = ((char *)ce - (char *)c) + sizeof(Eina_Unicode); + INF("malloc til %i", (int)(bytes - sizeof(Eina_Unicode))); ty->buf = malloc(bytes); if (!ty->buf) { @@ -1834,7 +1894,7 @@ _handle_buf(Termpty *ty, const int *codepoints, int len) } bytes = (char *)ce - (char *)c; memcpy(ty->buf, c, bytes); - ty->buflen = bytes / sizeof(int); + ty->buflen = bytes / sizeof(Eina_Unicode); ty->buf[ty->buflen] = 0; free(tmp); break; @@ -1858,16 +1918,16 @@ _handle_buf(Termpty *ty, const int *codepoints, int len) n = _handle_seq(ty, c, ce); if (n == 0) { - bytes = ((char *)ce - (char *)c) + sizeof(int); + bytes = ((char *)ce - (char *)c) + sizeof(Eina_Unicode); ty->buf = malloc(bytes); - INF("malloc %i", (int)(bytes - sizeof(int))); + INF("malloc %i", (int)(bytes - sizeof(Eina_Unicode))); if (!ty->buf) { ERR("memerr"); } bytes = (char *)ce - (char *)c; memcpy(ty->buf, c, bytes); - ty->buflen = bytes / sizeof(int); + ty->buflen = bytes / sizeof(Eina_Unicode); ty->buf[ty->buflen] = 0; break; } @@ -1906,7 +1966,7 @@ _cb_fd_read(void *data, Ecore_Fd_Handler *fd_handler __UNUSED__) { Termpty *ty = data; char buf[4097]; - int codepoint[4097]; + Eina_Unicode codepoint[4097]; int len, i, j, reads; // read up to 64 * 4096 bytes diff --git a/src/bin/termpty.h b/src/bin/termpty.h index 05f4995d..e531dccf 100644 --- a/src/bin/termpty.h +++ b/src/bin/termpty.h @@ -90,7 +90,7 @@ struct _Termpty struct { void (*func) (void *data); void *data; - } change, scroll, set_title, set_icon, cancel_sel, exited, bell; + } change, scroll, set_title, set_icon, cancel_sel, exited, bell, command; } cb; struct { const char *title; @@ -99,6 +99,7 @@ struct _Termpty int w, h; int fd, slavefd; pid_t pid; + const char *cur_cmd; Termcell *screen, *screen2; Termsave **back; int backmax, backpos;