termptyesc: handle window manipulations that resizes the terminal

only for testing purpose
This commit is contained in:
Boris Faure 2019-02-27 23:46:04 +01:00
parent 4d89080d71
commit 1c9c2a19ed
2 changed files with 69 additions and 17 deletions

View File

@ -3011,10 +3011,75 @@ _handle_esc_csi_decswbv(Termpty *ty, Eina_Unicode **ptr)
}
}
static void
_handle_resize_by_chars(Termpty *ty, Eina_Unicode **ptr)
{
Eina_Unicode *b = *ptr;
int w, h;
w = _csi_arg_get(ty, &b);
h = _csi_arg_get(ty, &b);
if ((w == -CSI_ARG_ERROR) || (h == -CSI_ARG_ERROR))
return;
if (w == -CSI_ARG_NO_VALUE)
{
w = ty->w;
}
if (h == -CSI_ARG_NO_VALUE)
{
h = ty->h;
}
if ((w == ty->w) && (h == ty->h))
{
return;
}
DBG("Window manipulation: resize to %dx%d", w, h);
/* ONLY FOR TESTING PURPOSE FTM */
#if defined(ENABLE_TESTS) || defined(ENABLE_TEST_UI)
{
#if defined(ENABLE_TEST_UI)
Evas_Object *wn;
int step_w = 0, step_h = 0, base_w = 0, base_h = 0;
wn = termio_win_get(ty->obj);
elm_win_size_base_get(wn, &base_w, &base_h);
elm_win_size_step_get(wn, &step_w, &step_h);
evas_object_resize(wn,
base_w + step_w * w,
base_h + step_h * h);
#endif
termpty_resize(ty, w, h);
}
#endif
}
static void
_handle_window_manipulation(Termpty *ty, Eina_Unicode **ptr)
{
Eina_Unicode *b = *ptr;
int arg = _csi_arg_get(ty, &b);
if (arg == -CSI_ARG_ERROR)
return;
DBG("Window manipulation: %d", arg);
switch (arg)
{
case 8:
_handle_resize_by_chars(ty, &b);
break;
default:
// many others
WRN("unhandled window manipulation %d", arg);
ty->decoding_error = EINA_TRUE;
break;
}
}
static int
_handle_esc_csi(Termpty *ty, const Eina_Unicode *c, const Eina_Unicode *ce)
{
int arg;
const Eina_Unicode *cc, *be;
Eina_Unicode buf[4096], *b;
@ -3218,11 +3283,7 @@ _handle_esc_csi(Termpty *ty, const Eina_Unicode *c, const Eina_Unicode *ce)
}
else
{
arg = _csi_arg_get(ty, &b);
if (arg == -CSI_ARG_ERROR)
goto error;
WRN("TODO: window operation %d not supported", arg);
ty->decoding_error = EINA_TRUE;
_handle_window_manipulation(ty, &b);
}
break;
case 'u': // restore cursor pos
@ -3282,7 +3343,6 @@ _handle_esc_csi(Termpty *ty, const Eina_Unicode *c, const Eina_Unicode *ce)
cc++;
return cc - c;
unhandled:
error:
#if !defined(ENABLE_FUZZING) && !defined(ENABLE_TESTS)
if (eina_log_domain_level_check(_termpty_log_dom, EINA_LOG_LEVEL_WARN))
{

View File

@ -19,14 +19,6 @@
#define INF(...) EINA_LOG_DOM_INFO(_termpty_log_dom, __VA_ARGS__)
#define DBG(...) EINA_LOG_DOM_DBG(_termpty_log_dom, __VA_ARGS__)
#if defined(ENABLE_TESTS)
#define WITH_TESTS 1
#else
#define WITH_TESTS 0
#endif
// Uncomment following to enable testing escape codes within terminology
//#define WITH_TESTS 1
//// extended terminology escape handling goes in here
//
// this is where escapes get handled *IF* the termpty layer needs to interpret
@ -59,7 +51,7 @@ _handle_op_a(Termpty *_ty EINA_UNUSED,
return EINA_FALSE;
}
#if WITH_TESTS
#if defined(ENABLE_TESTS) || defined(ENABLE_TEST_UI)
static int
_tytest_arg_get(const Eina_Unicode *buf, int *value)
@ -377,7 +369,7 @@ termpty_ext_handle(Termpty *ty,
return _handle_op_a(ty, buf + 1, blen - 1);
break;
// room here for more major opcode chars like 'b', 'c' etc.
#if WITH_TESTS
#if defined(ENABLE_TESTS) || defined(ENABLE_TEST_UI)
case 't':
tytest_handle_escape_codes(ty, buf + 1);
return EINA_TRUE;