forked from enlightenment/terminology
handle DECSCUSR (changing cursor shape). Closes T6338
This commit is contained in:
parent
71c1b37675
commit
740e96da66
|
@ -44,6 +44,7 @@ struct _Termio
|
||||||
struct {
|
struct {
|
||||||
Evas_Object *obj;
|
Evas_Object *obj;
|
||||||
int x, y;
|
int x, y;
|
||||||
|
Cursor_Shape shape;
|
||||||
} cursor;
|
} cursor;
|
||||||
struct {
|
struct {
|
||||||
int cx, cy;
|
int cx, cy;
|
||||||
|
@ -626,15 +627,6 @@ termio_config_update(Evas_Object *obj)
|
||||||
termpty_backlog_size_set(sd->pty, sd->config->scrollback);
|
termpty_backlog_size_set(sd->pty, sd->config->scrollback);
|
||||||
sd->scroll = 0;
|
sd->scroll = 0;
|
||||||
|
|
||||||
if (evas_object_focus_get(obj))
|
|
||||||
{
|
|
||||||
edje_object_signal_emit(sd->cursor.obj, "focus,out", "terminology");
|
|
||||||
if (sd->config->disable_cursor_blink)
|
|
||||||
edje_object_signal_emit(sd->cursor.obj, "focus,in,noblink", "terminology");
|
|
||||||
else
|
|
||||||
edje_object_signal_emit(sd->cursor.obj, "focus,in", "terminology");
|
|
||||||
}
|
|
||||||
|
|
||||||
colors_term_init(sd->grid.obj, sd->theme, sd->config);
|
colors_term_init(sd->grid.obj, sd->theme, sd->config);
|
||||||
|
|
||||||
evas_object_scale_set(sd->grid.obj, elm_config_scale_get());
|
evas_object_scale_set(sd->grid.obj, elm_config_scale_get());
|
||||||
|
@ -647,6 +639,7 @@ termio_config_update(Evas_Object *obj)
|
||||||
sd->font.chh = h;
|
sd->font.chh = h;
|
||||||
|
|
||||||
evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
|
evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
|
||||||
|
termio_set_cursor_shape(obj, sd->config->cursor_shape);
|
||||||
_smart_size(obj, ow / w, oh / h, EINA_TRUE);
|
_smart_size(obj, ow / w, oh / h, EINA_TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -693,10 +686,7 @@ termio_config_set(Evas_Object *obj, Config *config)
|
||||||
sd->font.chw = w;
|
sd->font.chw = w;
|
||||||
sd->font.chh = h;
|
sd->font.chh = h;
|
||||||
|
|
||||||
theme_apply(sd->cursor.obj, config, "terminology/cursor");
|
termio_set_cursor_shape(obj, sd->cursor.shape);
|
||||||
theme_auto_reload_enable(sd->cursor.obj);
|
|
||||||
evas_object_resize(sd->cursor.obj, sd->font.chw, sd->font.chh);
|
|
||||||
evas_object_show(sd->cursor.obj);
|
|
||||||
|
|
||||||
theme_apply(sd->sel.theme, config, "terminology/selection");
|
theme_apply(sd->sel.theme, config, "terminology/selection");
|
||||||
theme_auto_reload_enable(sd->sel.theme);
|
theme_auto_reload_enable(sd->sel.theme);
|
||||||
|
@ -704,6 +694,43 @@ termio_config_set(Evas_Object *obj, Config *config)
|
||||||
edje_object_part_swallow(sd->sel.theme, "terminology.bottom_right", sd->sel.bottom);
|
edje_object_part_swallow(sd->sel.theme, "terminology.bottom_right", sd->sel.bottom);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const char *
|
||||||
|
_cursor_shape_to_group_name(Cursor_Shape shape)
|
||||||
|
{
|
||||||
|
switch (shape)
|
||||||
|
{
|
||||||
|
case CURSOR_SHAPE_BLOCK: return "terminology/cursor";
|
||||||
|
case CURSOR_SHAPE_BAR: return "terminology/cursor_bar";
|
||||||
|
case CURSOR_SHAPE_UNDERLINE: return "terminology/cursor_underline";
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
termio_set_cursor_shape(Evas_Object *obj, Cursor_Shape shape)
|
||||||
|
{
|
||||||
|
Termio *sd = evas_object_smart_data_get(obj);
|
||||||
|
Config *config;
|
||||||
|
|
||||||
|
EINA_SAFETY_ON_NULL_RETURN(sd);
|
||||||
|
|
||||||
|
config = sd->config;
|
||||||
|
theme_apply(sd->cursor.obj, config, _cursor_shape_to_group_name(shape));
|
||||||
|
theme_auto_reload_enable(sd->cursor.obj);
|
||||||
|
evas_object_resize(sd->cursor.obj, sd->font.chw, sd->font.chh);
|
||||||
|
evas_object_show(sd->cursor.obj);
|
||||||
|
sd->cursor.shape = shape;
|
||||||
|
|
||||||
|
if (evas_object_focus_get(obj))
|
||||||
|
{
|
||||||
|
edje_object_signal_emit(sd->cursor.obj, "focus,out", "terminology");
|
||||||
|
if (sd->config->disable_cursor_blink)
|
||||||
|
edje_object_signal_emit(sd->cursor.obj, "focus,in,noblink", "terminology");
|
||||||
|
else
|
||||||
|
edje_object_signal_emit(sd->cursor.obj, "focus,in", "terminology");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* }}} */
|
/* }}} */
|
||||||
/* {{{ Links */
|
/* {{{ Links */
|
||||||
|
|
||||||
|
@ -6020,6 +6047,7 @@ termio_add(Evas_Object *win, Config *config,
|
||||||
(config->vidmod < (int)EINA_C_ARRAY_LENGTH(modules)))
|
(config->vidmod < (int)EINA_C_ARRAY_LENGTH(modules)))
|
||||||
mod = modules[config->vidmod];
|
mod = modules[config->vidmod];
|
||||||
|
|
||||||
|
sd->cursor.shape = config->cursor_shape;
|
||||||
termio_config_set(obj, config);
|
termio_config_set(obj, config);
|
||||||
sd->term = term;
|
sd->term = term;
|
||||||
sd->win = win;
|
sd->win = win;
|
||||||
|
|
|
@ -44,6 +44,7 @@ const char *termio_icon_name_get(const Evas_Object *obj);
|
||||||
void termio_media_mute_set(Evas_Object *obj, Eina_Bool mute);
|
void termio_media_mute_set(Evas_Object *obj, Eina_Bool mute);
|
||||||
void termio_media_visualize_set(Evas_Object *obj, Eina_Bool visualize);
|
void termio_media_visualize_set(Evas_Object *obj, Eina_Bool visualize);
|
||||||
void termio_config_set(Evas_Object *obj, Config *config);
|
void termio_config_set(Evas_Object *obj, Config *config);
|
||||||
|
void termio_set_cursor_shape(Evas_Object *obj, Cursor_Shape shape);
|
||||||
Config *termio_config_get(const Evas_Object *obj);
|
Config *termio_config_get(const Evas_Object *obj);
|
||||||
Eina_Bool termio_file_send_ok(const Evas_Object *obj, const char *file);
|
Eina_Bool termio_file_send_ok(const Evas_Object *obj, const char *file);
|
||||||
void termio_file_send_cancel(const Evas_Object *obj);
|
void termio_file_send_cancel(const Evas_Object *obj);
|
||||||
|
|
|
@ -1193,6 +1193,41 @@ _handle_esc_csi_cursor_pos_set(Termpty *ty, Eina_Unicode **b,
|
||||||
ty->cursor_state.cy = cy;
|
ty->cursor_state.cy = cy;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_handle_esc_csi_decscusr(Termpty *ty, Eina_Unicode **b)
|
||||||
|
{
|
||||||
|
int arg = _csi_arg_get(b);
|
||||||
|
Cursor_Shape shape = CURSOR_SHAPE_BLOCK;
|
||||||
|
|
||||||
|
DBG("DECSCUSR (%d) Set Cursor Shape", arg);
|
||||||
|
|
||||||
|
switch (arg)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
EINA_FALLTHROUGH;
|
||||||
|
case 1:
|
||||||
|
EINA_FALLTHROUGH;
|
||||||
|
case 2:
|
||||||
|
shape = CURSOR_SHAPE_BLOCK;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
EINA_FALLTHROUGH;
|
||||||
|
case 4:
|
||||||
|
shape = CURSOR_SHAPE_UNDERLINE;
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
EINA_FALLTHROUGH;
|
||||||
|
case 6:
|
||||||
|
shape = CURSOR_SHAPE_BAR;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
WRN("Invalid DECSCUSR %d", shape);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
termio_set_cursor_shape(ty->obj, shape);
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
_handle_esc_csi(Termpty *ty, const Eina_Unicode *c, const Eina_Unicode *ce)
|
_handle_esc_csi(Termpty *ty, const Eina_Unicode *c, const Eina_Unicode *ce)
|
||||||
{
|
{
|
||||||
|
@ -1575,6 +1610,18 @@ HVP:
|
||||||
goto unhandled;
|
goto unhandled;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case 'q':
|
||||||
|
if (*(cc-1) == ' ')
|
||||||
|
_handle_esc_csi_decscusr(ty, &b);
|
||||||
|
else if (*(cc-1) == '"')
|
||||||
|
{
|
||||||
|
WRN("TODO: select character protection attribute (DECSCA)");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
WRN("TODO: Load LEDs (DECLL)");
|
||||||
|
}
|
||||||
|
break;
|
||||||
case 'r':
|
case 'r':
|
||||||
_handle_esc_csi_decstbm(ty, &b);
|
_handle_esc_csi_decstbm(ty, &b);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -427,6 +427,10 @@ void
|
||||||
termpty_reset_state(Termpty *ty)
|
termpty_reset_state(Termpty *ty)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
Config *config = NULL;
|
||||||
|
|
||||||
|
if (ty->obj)
|
||||||
|
config = termio_config_get(ty->obj);
|
||||||
|
|
||||||
ty->cursor_state.cx = 0;
|
ty->cursor_state.cx = 0;
|
||||||
ty->cursor_state.cy = 0;
|
ty->cursor_state.cy = 0;
|
||||||
|
@ -467,6 +471,8 @@ termpty_reset_state(Termpty *ty)
|
||||||
{
|
{
|
||||||
TAB_SET(ty, i);
|
TAB_SET(ty, i);
|
||||||
}
|
}
|
||||||
|
if (config && ty->obj)
|
||||||
|
termio_set_cursor_shape(ty->obj, config->cursor_shape);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
Loading…
Reference in New Issue