diff --git a/TODO b/TODO index 8654f391..57b91d12 100644 --- a/TODO +++ b/TODO @@ -10,7 +10,7 @@ make it a first-class terminal: many are commented out and unhandled) [ ] copy & paste support for clipboard not just primary (like xterm) [ ] dnd text (to/from terminal) -[ ] ecore-imf support +[X] ecore-imf support [ ] handle multibyte displays better (does handle utf8 only atm and then maybe not according to convention) [ ] general input mode handling improvements (keypad, other key diff --git a/src/bin/termpty.c b/src/bin/termpty.c index 3154e9d2..2184b6cd 100644 --- a/src/bin/termpty.c +++ b/src/bin/termpty.c @@ -7,6 +7,8 @@ #include #include #include +#include +#include static void _text_clear(Termpty *ty, Termcell *cells, int count, int val, Eina_Bool inherit_att) @@ -79,7 +81,7 @@ _text_scroll(Termpty *ty) if (ty->cb.cancel_sel.func) ty->cb.cancel_sel.func(ty->cb.cancel_sel.data); } - DBG("... scroll!!!!! [%i->%i]\n", start_y, end_y); + DBG("... scroll!!!!! [%i->%i]", start_y, end_y); cells2 = &(ty->screen[end_y * ty->w]); for (y = start_y; y < end_y; y++) { @@ -101,7 +103,7 @@ _text_scroll_rev(Termpty *ty) start_y = ty->state.scroll_y1; end_y = ty->state.scroll_y2 - 1; } - DBG("... scroll rev!!!!! [%i->%i]\n", start_y, end_y); + DBG("... scroll rev!!!!! [%i->%i]", start_y, end_y); cells = &(ty->screen[end_y * ty->w]); for (y = end_y; y > start_y; y--) { @@ -212,7 +214,7 @@ _text_append(Termpty *ty, const int *glyphs, int len) static void _term_write(Termpty *ty, const char *txt, int size) { - if (write(ty->fd, txt, size) < 0) perror("write"); + if (write(ty->fd, txt, size) < 0) ERR("write: %s", strerror(errno)); } #define _term_txt_write(ty, txt) _term_write(ty, txt, sizeof(txt) - 1) @@ -386,7 +388,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'\n", *cc, buf); + DBG(" CSI: '%c' args '%s'", *cc, buf); switch (*cc) { case 'm': // color set @@ -470,12 +472,12 @@ _handle_esc_csi(Termpty *ty, const int *c, int *ce) case 38: // xterm 256 fg color ??? // now check if next arg is 5 arg = _csi_arg_get(&b); - if (arg != 5) ERR("Failed xterm 256 color fg esc 5\n"); + if (arg != 5) ERR("Failed xterm 256 color fg esc 5"); else { // then get next arg - should be color index 0-255 arg = _csi_arg_get(&b); - if (!b) ERR("Failed xterm 256 color fg esc val\n"); + if (!b) ERR("Failed xterm 256 color fg esc val"); else { ty->state.att.fg256 = 1; @@ -504,12 +506,12 @@ _handle_esc_csi(Termpty *ty, const int *c, int *ce) case 48: // xterm 256 bg color ??? // now check if next arg is 5 arg = _csi_arg_get(&b); - if (arg != 5) ERR("Failed xterm 256 color bg esc 5\n"); + if (arg != 5) ERR("Failed xterm 256 color bg esc 5"); else { // then get next arg - should be color index 0-255 arg = _csi_arg_get(&b); - if (!b) ERR("Failed xterm 256 color bg esc val\n"); + if (!b) ERR("Failed xterm 256 color bg esc val"); else { ty->state.att.bg256 = 1; @@ -538,12 +540,12 @@ _handle_esc_csi(Termpty *ty, const int *c, int *ce) case 98: // xterm 256 fg color ??? // now check if next arg is 5 arg = _csi_arg_get(&b); - if (arg != 5) ERR("Failed xterm 256 color fg esc 5\n"); + if (arg != 5) ERR("Failed xterm 256 color fg esc 5"); else { // then get next arg - should be color index 0-255 arg = _csi_arg_get(&b); - if (!b) ERR("Failed xterm 256 color fg esc val\n"); + if (!b) ERR("Failed xterm 256 color fg esc val"); else { ty->state.att.fg256 = 1; @@ -572,12 +574,12 @@ _handle_esc_csi(Termpty *ty, const int *c, int *ce) case 108: // xterm 256 bg color ??? // now check if next arg is 5 arg = _csi_arg_get(&b); - if (arg != 5) ERR("Failed xterm 256 color bg esc 5\n"); + if (arg != 5) ERR("Failed xterm 256 color bg esc 5"); else { // then get next arg - should be color index 0-255 arg = _csi_arg_get(&b); - if (!b) ERR("Failed xterm 256 color bg esc val\n"); + if (!b) ERR("Failed xterm 256 color bg esc val"); else { ty->state.att.bg256 = 1; @@ -592,7 +594,7 @@ _handle_esc_csi(Termpty *ty, const int *c, int *ce) ty->state.att.bgintense = 1; break; default: // not handled??? - ERR(" color cmd [%i] not handled\n", arg); + ERR(" color cmd [%i] not handled", arg); break; } } @@ -800,7 +802,7 @@ _handle_esc_csi(Termpty *ty, const int *c, int *ce) if ((arg >= CLR_END) && (arg <= CLR_ALL)) _clear_screen(ty, arg); else - ERR("invalid clr scr %i\n", arg); + ERR("invalid clr scr %i", arg); } else _clear_screen(ty, CLR_END); break; @@ -811,7 +813,7 @@ _handle_esc_csi(Termpty *ty, const int *c, int *ce) if ((arg >= CLR_END) && (arg <= CLR_ALL)) _clear_line(ty, arg, ty->w); else - ERR("invalid clr lin %i\n", arg); + ERR("invalid clr lin %i", arg); } else _clear_line(ty, CLR_END, ty->w); break; @@ -847,7 +849,7 @@ _handle_esc_csi(Termpty *ty, const int *c, int *ce) break; case 7: handled = 1; - DBG("DDD: set wrap mode to %i\n", mode); + DBG("DDD: set wrap mode to %i", mode); ty->state.wrap = mode; break; case 20: @@ -855,7 +857,7 @@ _handle_esc_csi(Termpty *ty, const int *c, int *ce) break; case 12: handled = 1; -// DBG("XXX: set blinking cursor to (stop?) %i\n", mode); +// DBG("XXX: set blinking cursor to (stop?) %i", mode); break; case 25: handled = 1; @@ -863,13 +865,13 @@ _handle_esc_csi(Termpty *ty, const int *c, int *ce) break; case 1000: handled = 1; - INF("XXX: set x11 mouse reporting to %i\n", mode); + INF("XXX: set x11 mouse reporting to %i", mode); break; case 1049: case 47: case 1047: handled = 1; - DBG("DDD: switch buf\n"); + DBG("DDD: switch buf"); if (ty->altbuf) { // if we are looking at alt buf now, @@ -914,7 +916,7 @@ _handle_esc_csi(Termpty *ty, const int *c, int *ce) DBG("Ignored screen mode %i", arg); break; default: - ERR("unhandled screen mode arg %i\n", arg); + ERR("unhandled screen mode arg %i", arg); break; } } @@ -935,27 +937,27 @@ _handle_esc_csi(Termpty *ty, const int *c, int *ce) else if (arg == 4) { handled = 1; - DBG("DDD: set insert mode to %i\n", mode); + DBG("DDD: set insert mode to %i", mode); ty->state.insert = mode; } // else if (arg == 24) // { -// ERR("unhandled #24 arg %i\n", arg); +// ERR("unhandled #24 arg %i", arg); // // ??? // } else - ERR("unhandled screen non-priv mode arg %i, mode %i, ch '%c'\n", arg, mode, *cc); + ERR("unhandled screen non-priv mode arg %i, mode %i, ch '%c'", arg, mode, *cc); } } } - if (!handled) ERR("unhandled '%c' : '%s'\n", *cc, buf); + if (!handled) ERR("unhandled '%c' : '%s'", *cc, buf); } break; case 'r': arg = _csi_arg_get(&b); if (!b) { - INF("no region args reset region\n"); + INF("no region args reset region"); ty->state.scroll_y1 = 0; ty->state.scroll_y2 = 0; } @@ -966,7 +968,7 @@ _handle_esc_csi(Termpty *ty, const int *c, int *ce) arg2 = _csi_arg_get(&b); if (!b) { - INF("failed to give 2 region args reset region\n"); + INF("failed to give 2 region args reset region"); ty->state.scroll_y1 = 0; ty->state.scroll_y2 = 0; } @@ -974,13 +976,13 @@ _handle_esc_csi(Termpty *ty, const int *c, int *ce) { if (arg >= arg2) { - ERR("scroll region beginning >= end [%i %i]\n", arg, arg2); + ERR("scroll region beginning >= end [%i %i]", arg, arg2); ty->state.scroll_y1 = 0; ty->state.scroll_y2 = 0; } else { - INF("2 region args: %i %i\n", arg, arg2); + INF("2 region args: %i %i", arg, arg2); if (arg >= ty->h) arg = ty->h - 1; if (arg2 > ty->h) arg2 = ty->h; arg2++; @@ -1019,7 +1021,7 @@ _handle_esc_csi(Termpty *ty, const int *c, int *ce) break; */ default: - ERR("unhandled CSI '%c' (0x%02x), buf='%s'\n", *cc, *cc, buf); + ERR("unhandled CSI '%c' (0x%02x), buf='%s'", *cc, *cc, buf); break; } cc++; @@ -1075,7 +1077,7 @@ _handle_esc_xterm(Termpty *ty, const int *c, int *ce) break; default: // many others - ERR("unhandled xterm esc '%c' -> '%s'\n", buf[0], buf); + ERR("unhandled xterm esc '%c' -> '%s'", buf[0], buf); break; } return cc - c; @@ -1085,7 +1087,7 @@ static int _handle_esc(Termpty *ty, const int *c, int *ce) { if ((ce - c) < 2) return 0; - DBG("ESC: '%c'\n", c[1]); + DBG("ESC: '%c'", c[1]); switch (c[1]) { case '[': @@ -1118,7 +1120,7 @@ _handle_esc(Termpty *ty, const int *c, int *ce) _term_txt_write(ty, "\033[?1;2C"); return 2; case 'c': // reset terminal to initial state - DBG("reset to init mode and clear\n"); + DBG("reset to init mode and clear"); _reset_state(ty); _clear_screen(ty, CLR_ALL); if (ty->cb.cancel_sel.func) @@ -1150,7 +1152,7 @@ _handle_esc(Termpty *ty, const int *c, int *ce) int i, size; Termcell *cells; - DBG("reset to init mode and clear then fill with E\n"); + DBG("reset to init mode and clear then fill with E"); _reset_state(ty); ty->save = ty->state; ty->swap = ty->state; @@ -1184,7 +1186,7 @@ _handle_esc(Termpty *ty, const int *c, int *ce) return 2; */ default: - ERR("eek - esc unhandled '%c' (0x%02x)\n", c[1], c[1]); + ERR("eek - esc unhandled '%c' (0x%02x)", c[1], c[1]); break; } return 1; @@ -1220,18 +1222,18 @@ _handle_seq(Termpty *ty, const int *c, int *ce) return 1; */ case 0x07: // BEL '\a' (bell) - INF("BEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEP\n"); + INF("BEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEP"); ty->state.had_cr = 0; return 1; case 0x08: // BS '\b' (backspace) - DBG("->BS\n"); + DBG("->BS"); ty->state.wrapnext = 0; ty->state.cx--; if (ty->state.cx < 0) ty->state.cx = 0; ty->state.had_cr = 0; return 1; case 0x09: // HT '\t' (horizontal tab) - DBG("->HT\n"); + DBG("->HT"); ty->screen[ty->state.cx + (ty->state.cy * ty->w)].att.tab = 1; ty->state.wrapnext = 0; ty->state.cx += 8; @@ -1243,7 +1245,7 @@ _handle_seq(Termpty *ty, const int *c, int *ce) case 0x0a: // LF '\n' (new line) case 0x0b: // VT '\v' (vertical tab) case 0x0c: // FF '\f' (form feed) - DBG("->LF\n"); + DBG("->LF"); if (ty->state.had_cr) ty->screen[ty->state.had_cr_x + (ty->state.had_cr_y * ty->w)].att.newline = 1; ty->state.wrapnext = 0; @@ -1253,7 +1255,7 @@ _handle_seq(Termpty *ty, const int *c, int *ce) ty->state.had_cr = 0; return 1; case 0x0d: // CR '\r' (carriage ret) - DBG("->CR\n"); + DBG("->CR"); if (ty->state.cx != 0) { ty->state.had_cr_x = ty->state.cx; @@ -1310,14 +1312,14 @@ _handle_seq(Termpty *ty, const int *c, int *ce) return 1; */ default: - ERR("unhandled char 0x%02x\n", c[0]); + ERR("unhandled char 0x%02x", c[0]); ty->state.had_cr = 0; return 1; } } else if (c[0] == 0xf7) // DEL { - ERR("unhandled char 0x%02x [DEL]\n", c[0]); + ERR("unhandled char 0x%02x [DEL]", c[0]); ty->state.had_cr = 0; return 1; } @@ -1330,7 +1332,7 @@ _handle_seq(Termpty *ty, const int *c, int *ce) cc++; len++; } - DBG("]\n"); + DBG("]"); _text_append(ty, c, len); ty->state.had_cr = 0; return len; @@ -1350,9 +1352,9 @@ _handle_buf(Termpty *ty, const int *glyphs, int len) b = realloc(ty->buf, bytes); if (!b) { - ERR("memerr\n"); + ERR("memerr"); } - INF("realloc add %i + %i\n", (int)(ty->buflen * sizeof(int)), (int)(len * sizeof(int))); + INF("realloc add %i + %i", (int)(ty->buflen * sizeof(int)), (int)(len * sizeof(int))); bytes = len * sizeof(int); memcpy(&(b[ty->buflen]), glyphs, bytes); ty->buf = b; @@ -1369,11 +1371,11 @@ _handle_buf(Termpty *ty, const int *glyphs, int len) ty->buf = NULL; ty->buflen = 0; bytes = ((char *)ce - (char *)c) + sizeof(int); - INF("malloc til %i\n", (int)(bytes - sizeof(int))); + INF("malloc til %i", (int)(bytes - sizeof(int))); ty->buf = malloc(bytes); if (!ty->buf) { - ERR("memerr\n"); + ERR("memerr"); } bytes = (char *)ce - (char *)c; memcpy(ty->buf, c, bytes); @@ -1403,10 +1405,10 @@ _handle_buf(Termpty *ty, const int *glyphs, int len) { bytes = ((char *)ce - (char *)c) + sizeof(int); ty->buf = malloc(bytes); - INF("malloc %i\n", (int)(bytes - sizeof(int))); + INF("malloc %i", (int)(bytes - sizeof(int))); if (!ty->buf) { - ERR("memerr\n"); + ERR("memerr"); } bytes = (char *)ce - (char *)c; memcpy(ty->buf, c, bytes); @@ -1428,7 +1430,8 @@ _pty_size(Termpty *ty) sz.ws_row = ty->h; sz.ws_xpixel = 0; sz.ws_ypixel = 0; - if (ioctl(ty->fd, TIOCSWINSZ, &sz) < 0) perror("Size set ioctl failed\n"); + if (ioctl(ty->fd, TIOCSWINSZ, &sz) < 0) + ERR("Size set ioctl failed: %s", strerror(errno)); } static Eina_Bool @@ -1467,11 +1470,11 @@ _cb_fd_read(void *data, Ecore_Fd_Handler *fd_handler __UNUSED__) { i = evas_string_char_next_get(buf, i, &g); if (i < 0) break; -// DBG("(%i) %02x '%c'\n", j, g, g); +// DBG("(%i) %02x '%c'", j, g, g); } else { - ERR("ZERO GLYPH!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); + ERR("ZERO GLYPH!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); g = 0; i++; } @@ -1479,7 +1482,7 @@ _cb_fd_read(void *data, Ecore_Fd_Handler *fd_handler __UNUSED__) j++; } glyph[j] = 0; -// DBG("---------------- handle buf %i\n", j); +// DBG("---------------- handle buf %i", j); _handle_buf(ty, glyph, j); } if (ty->cb.change.func) ty->cb.change.func(ty->cb.change.data); @@ -1654,7 +1657,7 @@ termpty_cellrow_get(Termpty *ty, int y, int *wret) void termpty_write(Termpty *ty, const char *input, int len) { - if (write(ty->fd, input, len) < 0) perror("write"); + if (write(ty->fd, input, len) < 0) ERR("write %s", strerror(errno)); } void