group input: handle only_visible or all terms

This commit is contained in:
Boris Faure 2018-02-11 11:48:06 +01:00
parent 26b19dc31d
commit 19cca3e2f2
3 changed files with 69 additions and 9 deletions

View File

@ -60,6 +60,7 @@ struct _Term_Container {
void (*bell)(Term_Container *tc, Term_Container *child); void (*bell)(Term_Container *tc, Term_Container *child);
void (*close)(Term_Container *container, Term_Container *child); void (*close)(Term_Container *container, Term_Container *child);
void (*update)(Term_Container *tc); void (*update)(Term_Container *tc);
Eina_Bool (*is_visible)(Term_Container *tc, Term_Container *child);
}; };
#endif #endif

View File

@ -483,6 +483,13 @@ _solo_update(Term_Container *tc)
assert (tc->type == TERM_CONTAINER_TYPE_SOLO); assert (tc->type == TERM_CONTAINER_TYPE_SOLO);
} }
static Eina_Bool
_solo_is_visible(Term_Container *tc, Term_Container *_child EINA_UNUSED)
{
assert (tc->type == TERM_CONTAINER_TYPE_SOLO);
return tc->parent->is_visible(tc->parent, tc);
}
static Term_Container * static Term_Container *
_solo_new(Term *term, Win *wn) _solo_new(Term *term, Win *wn)
{ {
@ -517,6 +524,7 @@ _solo_new(Term *term, Win *wn)
tc->close = _solo_close; tc->close = _solo_close;
tc->update = _solo_update; tc->update = _solo_update;
tc->title = eina_stringshare_add("Terminology"); tc->title = eina_stringshare_add("Terminology");
tc->is_visible = _solo_is_visible;
tc->type = TERM_CONTAINER_TYPE_SOLO; tc->type = TERM_CONTAINER_TYPE_SOLO;
tc->parent = NULL; tc->parent = NULL;
@ -1169,6 +1177,11 @@ _cb_win_key_up(void *data,
keyin_handle_up(&wn->khdl, ev); keyin_handle_up(&wn->khdl, ev);
} }
#define GROUPED_INPUT_TERM_FOREACH(_wn, _list, _term) \
EINA_LIST_FOREACH(_wn->terms, _list, _term) \
if (!_wn->group_only_visible || term_is_visible(_term))
const char * const char *
term_preedit_str_get(Term *term) term_preedit_str_get(Term *term)
{ {
@ -1217,7 +1230,7 @@ _imf_event_commit_cb(void *data,
len = strlen(str); len = strlen(str);
if (wn->group_input) if (wn->group_input)
{ {
EINA_LIST_FOREACH(wn->terms, l, term) GROUPED_INPUT_TERM_FOREACH(wn, l, term)
{ {
ty = termio_pty_get(term->termio); ty = termio_pty_get(term->termio);
if (ty) if (ty)
@ -1309,7 +1322,7 @@ _cb_win_key_down(void *data,
/* 1st/ Miniview */ /* 1st/ Miniview */
if (wn->group_input) if (wn->group_input)
{ {
EINA_LIST_FOREACH(wn->terms, l, term) GROUPED_INPUT_TERM_FOREACH(wn, l, term)
{ {
done = miniview_handle_key(term_miniview_get(term), ev); done = miniview_handle_key(term_miniview_get(term), ev);
if (!wn->group_input) if (!wn->group_input)
@ -1336,7 +1349,7 @@ _cb_win_key_down(void *data,
done = EINA_FALSE; done = EINA_FALSE;
if (wn->group_input) if (wn->group_input)
{ {
EINA_LIST_FOREACH(wn->terms, l, term) GROUPED_INPUT_TERM_FOREACH(wn, l, term)
{ {
if (term_has_popmedia(term) && !strcmp(ev->key, "Escape")) if (term_has_popmedia(term) && !strcmp(ev->key, "Escape"))
{ {
@ -1369,7 +1382,7 @@ _cb_win_key_down(void *data,
if (wn->group_input) if (wn->group_input)
{ {
wn->group_once_handled = EINA_FALSE; wn->group_once_handled = EINA_FALSE;
EINA_LIST_FOREACH(wn->terms, l, term) GROUPED_INPUT_TERM_FOREACH(wn, l, term)
{ {
done = keyin_handle_key_binding(term->termio, ev, ctrl, alt, done = keyin_handle_key_binding(term->termio, ev, ctrl, alt,
shift, win, meta, hyper); shift, win, meta, hyper);
@ -1453,7 +1466,7 @@ _cb_win_key_down(void *data,
int len = strlen(compres); int len = strlen(compres);
if (wn->group_input) if (wn->group_input)
{ {
EINA_LIST_FOREACH(wn->terms, l, term) GROUPED_INPUT_TERM_FOREACH(wn, l, term)
{ {
ty = termio_pty_get(term->termio); ty = termio_pty_get(term->termio);
if (ty && termpty_can_handle_key(ty, &wn->khdl, ev)) if (ty && termpty_can_handle_key(ty, &wn->khdl, ev))
@ -1478,7 +1491,7 @@ _cb_win_key_down(void *data,
/* 5th/ send key to pty */ /* 5th/ send key to pty */
if (wn->group_input) if (wn->group_input)
{ {
EINA_LIST_FOREACH(wn->terms, l, term) GROUPED_INPUT_TERM_FOREACH(wn, l, term)
{ {
ty = termio_pty_get(term->termio); ty = termio_pty_get(term->termio);
if (ty && termpty_can_handle_key(ty, &wn->khdl, ev)) if (ty && termpty_can_handle_key(ty, &wn->khdl, ev))
@ -1496,7 +1509,7 @@ _cb_win_key_down(void *data,
end: end:
if (wn->group_input) if (wn->group_input)
{ {
EINA_LIST_FOREACH(wn->terms, l, term) GROUPED_INPUT_TERM_FOREACH(wn, l, term)
{ {
if (term) if (term)
termio_key_down(term->termio, ev); termio_key_down(term->termio, ev);
@ -1575,6 +1588,12 @@ _cb_win_mouse_move(void *data,
tc_child->focus(tc_child, tc); tc_child->focus(tc_child, tc);
} }
static Eina_Bool
_win_is_visible(Term_Container *tc, Term_Container *_child EINA_UNUSED)
{
assert (tc->type == TERM_CONTAINER_TYPE_WIN);
return EINA_TRUE;
}
Win * Win *
win_new(const char *name, const char *role, const char *title, win_new(const char *name, const char *role, const char *title,
@ -1618,6 +1637,7 @@ win_new(const char *name, const char *role, const char *title,
tc->bell = _win_bell; tc->bell = _win_bell;
tc->close = _win_close; tc->close = _win_close;
tc->update = _win_update; tc->update = _win_update;
tc->is_visible = _win_is_visible;
tc->title = eina_stringshare_add(title? title : "Terminology"); tc->title = eina_stringshare_add(title? title : "Terminology");
tc->type = TERM_CONTAINER_TYPE_WIN; tc->type = TERM_CONTAINER_TYPE_WIN;
tc->wn = wn; tc->wn = wn;
@ -1797,7 +1817,7 @@ _win_toggle_group(Win *wn)
DBG("WIN TOGGLE"); DBG("WIN TOGGLE");
if (!wn->group_input) if (!wn->group_input)
{ {
EINA_LIST_FOREACH(wn->terms, l, term) GROUPED_INPUT_TERM_FOREACH(wn, l, term)
{ {
edje_object_signal_emit(term->bg, "focus,in", "terminology"); edje_object_signal_emit(term->bg, "focus,in", "terminology");
termio_event_feed_mouse_in(term->termio); termio_event_feed_mouse_in(term->termio);
@ -1810,7 +1830,7 @@ _win_toggle_group(Win *wn)
{ {
wn->group_input = EINA_FALSE; wn->group_input = EINA_FALSE;
DBG("GROUP INPUT is now FALSE"); DBG("GROUP INPUT is now FALSE");
EINA_LIST_FOREACH(wn->terms, l, term) GROUPED_INPUT_TERM_FOREACH(wn, l, term)
{ {
edje_object_signal_emit(term->bg, "focus,out", "terminology"); edje_object_signal_emit(term->bg, "focus,out", "terminology");
termio_focus_out(term->termio); termio_focus_out(term->termio);
@ -2280,6 +2300,15 @@ _split_split(Term_Container *tc, Term_Container *child,
evas_object_show(obj_split); evas_object_show(obj_split);
} }
static Eina_Bool
_split_is_visible(Term_Container *tc, Term_Container *_child EINA_UNUSED)
{
assert (tc->type == TERM_CONTAINER_TYPE_SPLIT);
/* Could return True with the current design because splits are at a higher
* level than tabs */
return tc->parent->is_visible(tc->parent, tc);
}
static Term_Container * static Term_Container *
_split_new(Term_Container *tc1, Term_Container *tc2, _split_new(Term_Container *tc1, Term_Container *tc2,
Eina_Bool is_horizontal) Eina_Bool is_horizontal)
@ -2315,6 +2344,7 @@ _split_new(Term_Container *tc1, Term_Container *tc2,
tc->bell = _split_bell; tc->bell = _split_bell;
tc->close = _split_close; tc->close = _split_close;
tc->update = _split_update; tc->update = _split_update;
tc->is_visible = _split_is_visible;
tc->title = eina_stringshare_add("Terminology"); tc->title = eina_stringshare_add("Terminology");
tc->type = TERM_CONTAINER_TYPE_SPLIT; tc->type = TERM_CONTAINER_TYPE_SPLIT;
@ -3575,6 +3605,16 @@ _tabs_split(Term_Container *tc,
tc->parent->split(tc->parent, tc, from, cmd, is_horizontal); tc->parent->split(tc->parent, tc, from, cmd, is_horizontal);
} }
static Eina_Bool
_tabs_is_visible(Term_Container *tc, Term_Container *child)
{
Tabs *tabs;
assert (tc->type == TERM_CONTAINER_TYPE_TABS);
tabs = (Tabs*) tc;
return child == tabs->current->tc;
}
static Term_Container * static Term_Container *
_tabs_new(Term_Container *child, Term_Container *parent) _tabs_new(Term_Container *child, Term_Container *parent)
{ {
@ -3613,6 +3653,7 @@ _tabs_new(Term_Container *child, Term_Container *parent)
tc->bell = _tabs_bell; tc->bell = _tabs_bell;
tc->close = _tabs_close; tc->close = _tabs_close;
tc->update = _tabs_update; tc->update = _tabs_update;
tc->is_visible = _tabs_is_visible;
tc->title = eina_stringshare_add("Terminology"); tc->title = eina_stringshare_add("Terminology");
tc->type = TERM_CONTAINER_TYPE_TABS; tc->type = TERM_CONTAINER_TYPE_TABS;
@ -3635,6 +3676,22 @@ _tabs_new(Term_Container *child, Term_Container *parent)
/* }}} */ /* }}} */
/* {{{ Term */ /* {{{ Term */
Eina_Bool
term_is_visible(Term *term)
{
/* TODO: boris */
Term_Container *tc;
if (!term)
return EINA_FALSE;
tc = term->container;
if (!tc)
return EINA_FALSE;
return tc->is_visible(tc, tc);
}
void void
background_set_shine(Config *config, Evas_Object *bg) background_set_shine(Config *config, Evas_Object *bg)
{ {

View File

@ -71,6 +71,8 @@ term_preedit_str_get(Term *term);
Ecore_IMF_Context * Ecore_IMF_Context *
term_imf_context_get(Term *term); term_imf_context_get(Term *term);
Eina_Bool term_is_visible(Term *term);
void win_font_size_set(Win *wn, int new_size); void win_font_size_set(Win *wn, int new_size);
void win_font_update(Term *term); void win_font_update(Term *term);