forked from enlightenment/terminology
termptyesc: add title/icon stack + tests
This commit is contained in:
parent
a5aaeefc18
commit
992936d156
|
@ -13,6 +13,7 @@ typedef struct _Termblock Termblock;
|
||||||
typedef struct _Termexp Termexp;
|
typedef struct _Termexp Termexp;
|
||||||
typedef struct _Termpty Termpty;
|
typedef struct _Termpty Termpty;
|
||||||
typedef struct _Termlink Term_Link;
|
typedef struct _Termlink Term_Link;
|
||||||
|
typedef struct _TitleIconElem TitleIconElem;
|
||||||
|
|
||||||
#define COL_DEF 0
|
#define COL_DEF 0
|
||||||
#define COL_BLACK 1
|
#define COL_BLACK 1
|
||||||
|
@ -212,6 +213,7 @@ struct _Termpty
|
||||||
uint8_t *bitmap;
|
uint8_t *bitmap;
|
||||||
uint32_t size;
|
uint32_t size;
|
||||||
} hl;
|
} hl;
|
||||||
|
TitleIconElem *title_icon_stack;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _Termcell
|
struct _Termcell
|
||||||
|
|
|
@ -3075,6 +3075,100 @@ _handle_resize_by_chars(Termpty *ty, Eina_Unicode **ptr)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct _TitleIconElem {
|
||||||
|
const char *title;
|
||||||
|
const char *icon;
|
||||||
|
struct _TitleIconElem *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
_title_icon_stack_push(Termpty *ty, Eina_Unicode **p)
|
||||||
|
{
|
||||||
|
int arg = _csi_arg_get(ty, p);
|
||||||
|
TitleIconElem *elem = calloc(sizeof(*elem), 1);
|
||||||
|
|
||||||
|
if (!elem)
|
||||||
|
return;
|
||||||
|
|
||||||
|
|
||||||
|
switch (arg)
|
||||||
|
{
|
||||||
|
case -ESC_ARG_ERROR:
|
||||||
|
free(elem);
|
||||||
|
return;
|
||||||
|
case -ESC_ARG_NO_VALUE:
|
||||||
|
EINA_FALLTHROUGH;
|
||||||
|
case 0:
|
||||||
|
elem->title = eina_stringshare_ref(ty->prop.title);
|
||||||
|
elem->icon = eina_stringshare_ref(ty->prop.icon);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
elem->icon = eina_stringshare_ref(ty->prop.icon);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
elem->title = eina_stringshare_ref(ty->prop.title);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!elem->title)
|
||||||
|
elem->title = ty->title_icon_stack ?
|
||||||
|
eina_stringshare_ref(ty->title_icon_stack->title) :
|
||||||
|
eina_stringshare_ref(ty->prop.title);
|
||||||
|
if (!elem->icon)
|
||||||
|
elem->icon = ty->title_icon_stack ?
|
||||||
|
eina_stringshare_ref(ty->title_icon_stack->icon) :
|
||||||
|
eina_stringshare_ref(ty->prop.icon);
|
||||||
|
elem->next = ty->title_icon_stack;
|
||||||
|
ty->title_icon_stack = elem;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_title_icon_stack_pop(Termpty *ty, Eina_Unicode **p)
|
||||||
|
{
|
||||||
|
int arg = _csi_arg_get(ty, p);
|
||||||
|
TitleIconElem *elem = ty->title_icon_stack;
|
||||||
|
|
||||||
|
if (!elem)
|
||||||
|
return;
|
||||||
|
|
||||||
|
switch (arg)
|
||||||
|
{
|
||||||
|
case -ESC_ARG_ERROR:
|
||||||
|
return;
|
||||||
|
case -ESC_ARG_NO_VALUE:
|
||||||
|
EINA_FALLTHROUGH;
|
||||||
|
case 0:
|
||||||
|
eina_stringshare_del(ty->prop.icon);
|
||||||
|
ty->prop.icon = eina_stringshare_ref(elem->icon);
|
||||||
|
if (ty->cb.set_icon.func)
|
||||||
|
ty->cb.set_icon.func(ty->cb.set_icon.data);
|
||||||
|
eina_stringshare_del(ty->prop.title);
|
||||||
|
ty->prop.title = eina_stringshare_ref(elem->title);
|
||||||
|
if (ty->cb.set_title.func)
|
||||||
|
ty->cb.set_title.func(ty->cb.set_title.data);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
eina_stringshare_del(ty->prop.icon);
|
||||||
|
ty->prop.icon = eina_stringshare_ref(elem->icon);
|
||||||
|
if (ty->cb.set_icon.func)
|
||||||
|
ty->cb.set_icon.func(ty->cb.set_icon.data);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
eina_stringshare_del(ty->prop.title);
|
||||||
|
ty->prop.title = eina_stringshare_ref(elem->title);
|
||||||
|
if (ty->cb.set_title.func)
|
||||||
|
ty->cb.set_title.func(ty->cb.set_title.data);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
eina_stringshare_del(elem->icon);
|
||||||
|
eina_stringshare_del(elem->title);
|
||||||
|
ty->title_icon_stack = elem->next;
|
||||||
|
free(elem);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_handle_window_manipulation(Termpty *ty, Eina_Unicode **ptr)
|
_handle_window_manipulation(Termpty *ty, Eina_Unicode **ptr)
|
||||||
{
|
{
|
||||||
|
@ -3089,6 +3183,12 @@ _handle_window_manipulation(Termpty *ty, Eina_Unicode **ptr)
|
||||||
case 8:
|
case 8:
|
||||||
_handle_resize_by_chars(ty, &b);
|
_handle_resize_by_chars(ty, &b);
|
||||||
break;
|
break;
|
||||||
|
case 22:
|
||||||
|
_title_icon_stack_push(ty, &b);
|
||||||
|
break;
|
||||||
|
case 23:
|
||||||
|
_title_icon_stack_pop(ty, &b);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
// many others
|
// many others
|
||||||
WRN("unhandled window manipulation %d", arg);
|
WRN("unhandled window manipulation %d", arg);
|
||||||
|
|
|
@ -123,3 +123,6 @@ link_detection.sh bbe87a849586e8b922f26ad5d88146dc
|
||||||
selection_with_tabs.sh 23557497a8f28ca246048bb2443b3dab
|
selection_with_tabs.sh 23557497a8f28ca246048bb2443b3dab
|
||||||
selection_empty_lines.sh 7a90d9bfde9e9fb7f067f6c08eac57ff
|
selection_empty_lines.sh 7a90d9bfde9e9fb7f067f6c08eac57ff
|
||||||
osc-invalid.sh 0acecbe16bb3b257745787c40affdb90
|
osc-invalid.sh 0acecbe16bb3b257745787c40affdb90
|
||||||
|
title_icon_stack_simple.sh 9231de4459dbb52d0ffab6f33fc386a0
|
||||||
|
title_icon_stack_unset.sh d2ebe2295eb036d9612209490f8aa7f9
|
||||||
|
title_icon_stack_default.sh d2ebe2295eb036d9612209490f8aa7f9
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# fill space with E
|
||||||
|
printf '\033#8'
|
||||||
|
#set color
|
||||||
|
printf '\033[46;31;3m'
|
||||||
|
|
||||||
|
#pop none
|
||||||
|
printf '\033[23;0t'
|
||||||
|
|
||||||
|
# set title + icon
|
||||||
|
printf '\033]0;alpha\007'
|
||||||
|
|
||||||
|
# save both (default case)
|
||||||
|
printf '\033[22t'
|
||||||
|
|
||||||
|
# restack last elem
|
||||||
|
printf '\033[22;3t'
|
||||||
|
|
||||||
|
# set again title + icon
|
||||||
|
printf '\033]0;bravo\007'
|
||||||
|
|
||||||
|
# pop both (default case)
|
||||||
|
printf '\033[23t'
|
||||||
|
|
||||||
|
# set again title + icon
|
||||||
|
printf '\033]0;charlie\007'
|
||||||
|
|
||||||
|
|
||||||
|
# pop both (default case)
|
||||||
|
printf '\033[23t'
|
||||||
|
|
||||||
|
# pop none (default case)
|
||||||
|
printf '\033[23t'
|
|
@ -0,0 +1,30 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# fill space with E
|
||||||
|
printf '\033#8'
|
||||||
|
#set color
|
||||||
|
printf '\033[46;31;3m'
|
||||||
|
|
||||||
|
# set title + icon
|
||||||
|
printf '\033]0;alpha\007'
|
||||||
|
|
||||||
|
# save both
|
||||||
|
printf '\033[22;0t'
|
||||||
|
|
||||||
|
# set again title + icon
|
||||||
|
printf '\033]0;bravo\007'
|
||||||
|
|
||||||
|
# save both
|
||||||
|
printf '\033[22;0t'
|
||||||
|
|
||||||
|
# set again title + icon
|
||||||
|
printf '\033]0;charlie\007'
|
||||||
|
|
||||||
|
# pop title (bravo)
|
||||||
|
printf '\033[23;2t'
|
||||||
|
|
||||||
|
# set again icon
|
||||||
|
printf '\033]1;delta\007'
|
||||||
|
|
||||||
|
# pop icon (alpha)
|
||||||
|
printf '\033[23;1t'
|
|
@ -0,0 +1,30 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# fill space with E
|
||||||
|
printf '\033#8'
|
||||||
|
#set color
|
||||||
|
printf '\033[46;31;3m'
|
||||||
|
|
||||||
|
# set title + icon
|
||||||
|
printf '\033]0;alpha\007'
|
||||||
|
|
||||||
|
# save title
|
||||||
|
printf '\033[22;2t'
|
||||||
|
|
||||||
|
# set again title + icon
|
||||||
|
printf '\033]0;bravo\007'
|
||||||
|
|
||||||
|
# save icon
|
||||||
|
printf '\033[22;1t'
|
||||||
|
|
||||||
|
# set again title + icon
|
||||||
|
printf '\033]0;charlie\007'
|
||||||
|
|
||||||
|
# pop title
|
||||||
|
printf '\033[23;2t'
|
||||||
|
|
||||||
|
# set again icon
|
||||||
|
printf '\033]1;delta\007'
|
||||||
|
|
||||||
|
# pop icon
|
||||||
|
printf '\033[23;1t'
|
Loading…
Reference in New Issue