forked from enlightenment/terminology
Party time! be able to set foreground color
Reset is not yet implemented for that… Idea is from http://www.reddit.com/r/linux/comments/2ds0he/xterm_party/
This commit is contained in:
parent
93e2d73a87
commit
6c50375f26
|
@ -1,5 +1,6 @@
|
||||||
#include "private.h"
|
#include "private.h"
|
||||||
#include <Elementary.h>
|
#include <Elementary.h>
|
||||||
|
#include "termio.h"
|
||||||
#include "termpty.h"
|
#include "termpty.h"
|
||||||
#include "termptydbl.h"
|
#include "termptydbl.h"
|
||||||
#include "termptyesc.h"
|
#include "termptyesc.h"
|
||||||
|
@ -1063,52 +1064,126 @@ _xterm_arg_get(Eina_Unicode **ptr)
|
||||||
return sum;
|
return sum;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
_eina_unicode_to_hex(Eina_Unicode u)
|
||||||
|
{
|
||||||
|
if (u >= '0' && u <= '9')
|
||||||
|
return u - '0';
|
||||||
|
if (u >= 'a' && u <= 'f')
|
||||||
|
return 10 + u - 'a';
|
||||||
|
if (u >= 'A' && u <= 'F')
|
||||||
|
return 10 + u - 'A';
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
_xterm_parse_color(Eina_Unicode **ptr, unsigned char *r, unsigned char *g,
|
||||||
|
unsigned char *b, int len)
|
||||||
|
{
|
||||||
|
Eina_Unicode *p = *ptr;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (*p != '#')
|
||||||
|
{
|
||||||
|
ERR("unsupported xterm color");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
p++;
|
||||||
|
len--;
|
||||||
|
if (len == 7)
|
||||||
|
{
|
||||||
|
i = _eina_unicode_to_hex(p[0]);
|
||||||
|
if (i < 0) goto err;
|
||||||
|
*r = i;
|
||||||
|
i = _eina_unicode_to_hex(p[1]);
|
||||||
|
if (i < 0) goto err;
|
||||||
|
*r = *r * 16 + i;
|
||||||
|
|
||||||
|
i = _eina_unicode_to_hex(p[2]);
|
||||||
|
if (i < 0) goto err;
|
||||||
|
*g = i;
|
||||||
|
i = _eina_unicode_to_hex(p[3]);
|
||||||
|
if (i < 0) goto err;
|
||||||
|
*g = *g * 16 + i;
|
||||||
|
|
||||||
|
i = _eina_unicode_to_hex(p[4]);
|
||||||
|
if (i < 0) goto err;
|
||||||
|
*b = i;
|
||||||
|
i = _eina_unicode_to_hex(p[5]);
|
||||||
|
if (i < 0) goto err;
|
||||||
|
*b = *b * 16 + i;
|
||||||
|
}
|
||||||
|
else if (len == 4)
|
||||||
|
{
|
||||||
|
i = _eina_unicode_to_hex(p[0]);
|
||||||
|
if (i < 0) goto err;
|
||||||
|
*r = i;
|
||||||
|
i = _eina_unicode_to_hex(p[1]);
|
||||||
|
if (i < 0) goto err;
|
||||||
|
*g = i;
|
||||||
|
i = _eina_unicode_to_hex(p[2]);
|
||||||
|
if (i < 0) goto err;
|
||||||
|
*b = i;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
err:
|
||||||
|
ERR("invalid xterm color");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
_handle_esc_xterm(Termpty *ty, const Eina_Unicode *c, Eina_Unicode *ce)
|
_handle_esc_xterm(Termpty *ty, const Eina_Unicode *c, Eina_Unicode *ce)
|
||||||
{
|
{
|
||||||
const Eina_Unicode *cc, *be;
|
const Eina_Unicode *cc, *be;
|
||||||
Eina_Unicode buf[4096], *b;
|
Eina_Unicode buf[4096], *p;
|
||||||
char *s;
|
char *s;
|
||||||
int len = 0;
|
int len = 0;
|
||||||
int arg;
|
int arg;
|
||||||
|
|
||||||
cc = c;
|
cc = c;
|
||||||
b = buf;
|
p = buf;
|
||||||
be = buf + sizeof(buf) / sizeof(buf[0]);
|
be = buf + sizeof(buf) / sizeof(buf[0]);
|
||||||
while ((cc < ce) && (*cc != ST) && (*cc != BEL) && (b < be))
|
while ((cc < ce) && (*cc != ST) && (*cc != BEL) && (p < be))
|
||||||
{
|
{
|
||||||
if ((cc < ce - 1) && (*cc == ESC) && (*(cc + 1) == '\\'))
|
if ((cc < ce - 1) && (*cc == ESC) && (*(cc + 1) == '\\'))
|
||||||
{
|
{
|
||||||
cc++;
|
cc++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
*b = *cc;
|
*p = *cc;
|
||||||
b++;
|
p++;
|
||||||
cc++;
|
cc++;
|
||||||
}
|
}
|
||||||
if (b == be)
|
if (p == be)
|
||||||
{
|
{
|
||||||
ERR("xterm parsing overflowed, skipping the whole buffer (binary data?)");
|
ERR("xterm parsing overflowed, skipping the whole buffer (binary data?)");
|
||||||
return cc - c;
|
return cc - c;
|
||||||
}
|
}
|
||||||
*b = 0;
|
*p = 0;
|
||||||
b = buf;
|
p = buf;
|
||||||
if ((*cc == ST) || (*cc == BEL) || (*cc == '\\')) cc++;
|
if ((*cc == ST) || (*cc == BEL) || (*cc == '\\')) cc++;
|
||||||
else return 0;
|
else return 0;
|
||||||
|
|
||||||
#define TERMPTY_WRITE_STR(_S) \
|
#define TERMPTY_WRITE_STR(_S) \
|
||||||
termpty_write(ty, _S, strlen(_S))
|
termpty_write(ty, _S, strlen(_S))
|
||||||
|
|
||||||
arg = _xterm_arg_get(&b);
|
arg = _xterm_arg_get(&p);
|
||||||
switch (arg)
|
switch (arg)
|
||||||
{
|
{
|
||||||
case -1:
|
case -1:
|
||||||
goto err;
|
goto err;
|
||||||
case 0:
|
case 0:
|
||||||
// XXX: title + name - callback
|
// XXX: title + name - callback
|
||||||
if (!*b)
|
if (!*p)
|
||||||
goto err;
|
goto err;
|
||||||
if (*b == '?')
|
if (*p == '?')
|
||||||
{
|
{
|
||||||
TERMPTY_WRITE_STR("\033]0;");
|
TERMPTY_WRITE_STR("\033]0;");
|
||||||
if (ty->prop.title)
|
if (ty->prop.title)
|
||||||
|
@ -1119,7 +1194,7 @@ _handle_esc_xterm(Termpty *ty, const Eina_Unicode *c, Eina_Unicode *ce)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
s = eina_unicode_unicode_to_utf8(b, &len);
|
s = eina_unicode_unicode_to_utf8(p, &len);
|
||||||
if (ty->prop.title) eina_stringshare_del(ty->prop.title);
|
if (ty->prop.title) eina_stringshare_del(ty->prop.title);
|
||||||
if (ty->prop.icon) eina_stringshare_del(ty->prop.icon);
|
if (ty->prop.icon) eina_stringshare_del(ty->prop.icon);
|
||||||
if (s)
|
if (s)
|
||||||
|
@ -1139,9 +1214,9 @@ _handle_esc_xterm(Termpty *ty, const Eina_Unicode *c, Eina_Unicode *ce)
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
// XXX: icon name - callback
|
// XXX: icon name - callback
|
||||||
if (!*b)
|
if (!*p)
|
||||||
goto err;
|
goto err;
|
||||||
if (*b == '?')
|
if (*p == '?')
|
||||||
{
|
{
|
||||||
TERMPTY_WRITE_STR("\033]0;");
|
TERMPTY_WRITE_STR("\033]0;");
|
||||||
if (ty->prop.icon)
|
if (ty->prop.icon)
|
||||||
|
@ -1152,7 +1227,7 @@ _handle_esc_xterm(Termpty *ty, const Eina_Unicode *c, Eina_Unicode *ce)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
s = eina_unicode_unicode_to_utf8(b, &len);
|
s = eina_unicode_unicode_to_utf8(p, &len);
|
||||||
if (ty->prop.icon) eina_stringshare_del(ty->prop.icon);
|
if (ty->prop.icon) eina_stringshare_del(ty->prop.icon);
|
||||||
if (s)
|
if (s)
|
||||||
{
|
{
|
||||||
|
@ -1168,9 +1243,9 @@ _handle_esc_xterm(Termpty *ty, const Eina_Unicode *c, Eina_Unicode *ce)
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
// XXX: title - callback
|
// XXX: title - callback
|
||||||
if (!*b)
|
if (!*p)
|
||||||
goto err;
|
goto err;
|
||||||
if (*b == '?')
|
if (*p == '?')
|
||||||
{
|
{
|
||||||
TERMPTY_WRITE_STR("\033]0;");
|
TERMPTY_WRITE_STR("\033]0;");
|
||||||
if (ty->prop.title)
|
if (ty->prop.title)
|
||||||
|
@ -1181,7 +1256,7 @@ _handle_esc_xterm(Termpty *ty, const Eina_Unicode *c, Eina_Unicode *ce)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
s = eina_unicode_unicode_to_utf8(b, &len);
|
s = eina_unicode_unicode_to_utf8(p, &len);
|
||||||
if (ty->prop.title) eina_stringshare_del(ty->prop.title);
|
if (ty->prop.title) eina_stringshare_del(ty->prop.title);
|
||||||
if (s)
|
if (s)
|
||||||
{
|
{
|
||||||
|
@ -1196,12 +1271,39 @@ _handle_esc_xterm(Termpty *ty, const Eina_Unicode *c, Eina_Unicode *ce)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
if (!*b)
|
if (!*p)
|
||||||
goto err;
|
goto err;
|
||||||
// XXX: set palette entry. not supported.
|
// XXX: set palette entry. not supported.
|
||||||
WRN("set palette, not supported");
|
WRN("set palette, not supported");
|
||||||
if ((cc - c) < 3) return 0;
|
if ((cc - c) < 3) return 0;
|
||||||
break;
|
break;
|
||||||
|
case 10:
|
||||||
|
if (!*p)
|
||||||
|
goto err;
|
||||||
|
if (*p == '?')
|
||||||
|
{
|
||||||
|
char bf[6];
|
||||||
|
Config *config = termio_config_get(ty->obj);
|
||||||
|
TERMPTY_WRITE_STR("\033]10;#");
|
||||||
|
snprintf(bf, sizeof(bf), "%.2X%.2X%.2X",
|
||||||
|
config->colors[0].r,
|
||||||
|
config->colors[0].g,
|
||||||
|
config->colors[0].b);
|
||||||
|
termpty_write(ty, bf, 6);
|
||||||
|
TERMPTY_WRITE_STR("\007");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
unsigned char r, g, b;
|
||||||
|
len = cc - c - (p - buf);
|
||||||
|
if (_xterm_parse_color(&p, &r, &g, &b, len) < 0)
|
||||||
|
goto err;
|
||||||
|
evas_object_textgrid_palette_set(
|
||||||
|
termio_textgrid_get(ty->obj),
|
||||||
|
EVAS_TEXTGRID_PALETTE_STANDARD, 0,
|
||||||
|
r, g, b, 0xff);
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
// many others
|
// many others
|
||||||
ERR("unhandled xterm esc %d", arg);
|
ERR("unhandled xterm esc %d", arg);
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
#!/usr/bin/env perl
|
||||||
|
use Time::HiRes qw(sleep);
|
||||||
|
$|++;
|
||||||
|
$A=0;
|
||||||
|
$F=0.1;
|
||||||
|
while (1) {
|
||||||
|
$A == 628318 ? $A=0 : ++$A;
|
||||||
|
($R, $B, $G) = map { sin($F*$A + $_) * 127 + 128 } qw(0 2 4);
|
||||||
|
printf "\033]10;#%02x%02x%02x\007", $R, $B, $G;
|
||||||
|
sleep 0.01;
|
||||||
|
}
|
Loading…
Reference in New Issue