forked from enlightenment/terminology
parent
ba1b55fc85
commit
b99a543304
2
TODO
2
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
|
||||
|
|
|
@ -7,6 +7,8 @@
|
|||
#include <stdlib.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
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
|
||||
|
|
Loading…
Reference in New Issue