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 (*close)(Term_Container *container, Term_Container *child);
void (*update)(Term_Container *tc);
Eina_Bool (*is_visible)(Term_Container *tc, Term_Container *child);
};
#endif

View File

@ -483,6 +483,13 @@ _solo_update(Term_Container *tc)
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 *
_solo_new(Term *term, Win *wn)
{
@ -517,6 +524,7 @@ _solo_new(Term *term, Win *wn)
tc->close = _solo_close;
tc->update = _solo_update;
tc->title = eina_stringshare_add("Terminology");
tc->is_visible = _solo_is_visible;
tc->type = TERM_CONTAINER_TYPE_SOLO;
tc->parent = NULL;
@ -1169,6 +1177,11 @@ _cb_win_key_up(void *data,
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 *
term_preedit_str_get(Term *term)
{
@ -1217,7 +1230,7 @@ _imf_event_commit_cb(void *data,
len = strlen(str);
if (wn->group_input)
{
EINA_LIST_FOREACH(wn->terms, l, term)
GROUPED_INPUT_TERM_FOREACH(wn, l, term)
{
ty = termio_pty_get(term->termio);
if (ty)
@ -1309,7 +1322,7 @@ _cb_win_key_down(void *data,
/* 1st/ Miniview */
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);
if (!wn->group_input)
@ -1336,7 +1349,7 @@ _cb_win_key_down(void *data,
done = EINA_FALSE;
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"))
{
@ -1369,7 +1382,7 @@ _cb_win_key_down(void *data,
if (wn->group_input)
{
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,
shift, win, meta, hyper);
@ -1453,7 +1466,7 @@ _cb_win_key_down(void *data,
int len = strlen(compres);
if (wn->group_input)
{
EINA_LIST_FOREACH(wn->terms, l, term)
GROUPED_INPUT_TERM_FOREACH(wn, l, term)
{
ty = termio_pty_get(term->termio);
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 */
if (wn->group_input)
{
EINA_LIST_FOREACH(wn->terms, l, term)
GROUPED_INPUT_TERM_FOREACH(wn, l, term)
{
ty = termio_pty_get(term->termio);
if (ty && termpty_can_handle_key(ty, &wn->khdl, ev))
@ -1496,7 +1509,7 @@ _cb_win_key_down(void *data,
end:
if (wn->group_input)
{
EINA_LIST_FOREACH(wn->terms, l, term)
GROUPED_INPUT_TERM_FOREACH(wn, l, term)
{
if (term)
termio_key_down(term->termio, ev);
@ -1575,6 +1588,12 @@ _cb_win_mouse_move(void *data,
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_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->close = _win_close;
tc->update = _win_update;
tc->is_visible = _win_is_visible;
tc->title = eina_stringshare_add(title? title : "Terminology");
tc->type = TERM_CONTAINER_TYPE_WIN;
tc->wn = wn;
@ -1797,7 +1817,7 @@ _win_toggle_group(Win *wn)
DBG("WIN TOGGLE");
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");
termio_event_feed_mouse_in(term->termio);
@ -1810,7 +1830,7 @@ _win_toggle_group(Win *wn)
{
wn->group_input = EINA_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");
termio_focus_out(term->termio);
@ -2280,6 +2300,15 @@ _split_split(Term_Container *tc, Term_Container *child,
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 *
_split_new(Term_Container *tc1, Term_Container *tc2,
Eina_Bool is_horizontal)
@ -2315,6 +2344,7 @@ _split_new(Term_Container *tc1, Term_Container *tc2,
tc->bell = _split_bell;
tc->close = _split_close;
tc->update = _split_update;
tc->is_visible = _split_is_visible;
tc->title = eina_stringshare_add("Terminology");
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);
}
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 *
_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->close = _tabs_close;
tc->update = _tabs_update;
tc->is_visible = _tabs_is_visible;
tc->title = eina_stringshare_add("Terminology");
tc->type = TERM_CONTAINER_TYPE_TABS;
@ -3635,6 +3676,22 @@ _tabs_new(Term_Container *child, Term_Container *parent)
/* }}} */
/* {{{ 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
background_set_shine(Config *config, Evas_Object *bg)
{

View File

@ -71,6 +71,8 @@ term_preedit_str_get(Term *term);
Ecore_IMF_Context *
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_update(Term *term);