forked from enlightenment/terminology
win: add _focus_validator() to help debug focus issues
This commit is contained in:
parent
81d9063d65
commit
1ca9c13ace
151
src/bin/win.c
151
src/bin/win.c
|
@ -231,6 +231,57 @@ static void _term_tabregion_free(Term *term);
|
||||||
static void _set_trans(Config *config, Evas_Object *bg, Evas_Object *base);
|
static void _set_trans(Config *config, Evas_Object *bg, Evas_Object *base);
|
||||||
static void _imf_event_commit_cb(void *data, Ecore_IMF_Context *_ctx EINA_UNUSED, void *event);
|
static void _imf_event_commit_cb(void *data, Ecore_IMF_Context *_ctx EINA_UNUSED, void *event);
|
||||||
|
|
||||||
|
/* }}} */
|
||||||
|
/* {{{ Utils */
|
||||||
|
#ifndef NDEBUG
|
||||||
|
static void
|
||||||
|
_focus_validator(void)
|
||||||
|
{
|
||||||
|
Win *wn;
|
||||||
|
Term *term;
|
||||||
|
Eina_List *l, *ll;
|
||||||
|
|
||||||
|
EINA_LIST_FOREACH(wins, l, wn)
|
||||||
|
{
|
||||||
|
Eina_Bool focused_found = EINA_FALSE;
|
||||||
|
|
||||||
|
if (wn->group_input)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
EINA_LIST_FOREACH(wn->terms, ll, term)
|
||||||
|
{
|
||||||
|
Term_Container *tc = term->container;
|
||||||
|
|
||||||
|
if (focused_found)
|
||||||
|
{
|
||||||
|
assert(!tc->is_focused);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (tc->is_focused)
|
||||||
|
{
|
||||||
|
Term *term_focused;
|
||||||
|
|
||||||
|
focused_found = EINA_TRUE;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
assert (tc->is_focused);
|
||||||
|
tc = tc->parent;
|
||||||
|
}
|
||||||
|
while (tc->type != TERM_CONTAINER_TYPE_WIN);
|
||||||
|
assert (tc->is_focused);
|
||||||
|
term_focused = tc->focused_term_get(tc);
|
||||||
|
assert(term_focused == term);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static void
|
||||||
|
_focus_validator(void)
|
||||||
|
{}
|
||||||
|
#endif
|
||||||
/* }}} */
|
/* }}} */
|
||||||
/* {{{ Scale */
|
/* {{{ Scale */
|
||||||
static void
|
static void
|
||||||
|
@ -390,13 +441,18 @@ _solo_get_evas_object(const Term_Container *tc)
|
||||||
}
|
}
|
||||||
|
|
||||||
static Term *
|
static Term *
|
||||||
_solo_focused_term_get(const Term_Container *container)
|
_solo_focused_term_get(const Term_Container *tc)
|
||||||
{
|
{
|
||||||
Solo *solo;
|
Solo *solo;
|
||||||
assert (container->type == TERM_CONTAINER_TYPE_SOLO);
|
Term *term = NULL;
|
||||||
solo = (Solo*)container;
|
|
||||||
|
|
||||||
return container->is_focused ? solo->term : NULL;
|
assert (tc->type == TERM_CONTAINER_TYPE_SOLO);
|
||||||
|
solo = (Solo*)tc;
|
||||||
|
|
||||||
|
if (tc->is_focused)
|
||||||
|
term = solo->term;
|
||||||
|
DBG("%p term focused:%p", tc, term);
|
||||||
|
return term;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Term *
|
static Term *
|
||||||
|
@ -695,7 +751,7 @@ _solo_is_visible(Term_Container *tc, Term_Container *_child EINA_UNUSED)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_solo_title_show(Term_Container *tc)
|
_solo_tab_show(Term_Container *tc)
|
||||||
{
|
{
|
||||||
Solo *solo;
|
Solo *solo;
|
||||||
Term *term;
|
Term *term;
|
||||||
|
@ -703,6 +759,7 @@ _solo_title_show(Term_Container *tc)
|
||||||
assert (tc->type == TERM_CONTAINER_TYPE_SOLO);
|
assert (tc->type == TERM_CONTAINER_TYPE_SOLO);
|
||||||
solo = (Solo*) tc;
|
solo = (Solo*) tc;
|
||||||
term = solo->term;
|
term = solo->term;
|
||||||
|
DBG("tab show tc:%p", tc);
|
||||||
|
|
||||||
if (!term->tab_spacer)
|
if (!term->tab_spacer)
|
||||||
{
|
{
|
||||||
|
@ -732,11 +789,12 @@ _solo_title_show(Term_Container *tc)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_solo_title_hide(Term_Container *tc)
|
_solo_tab_hide(Term_Container *tc)
|
||||||
{
|
{
|
||||||
Solo *solo;
|
Solo *solo;
|
||||||
Term *term;
|
Term *term;
|
||||||
|
|
||||||
|
DBG("title hide tc:%p", tc);
|
||||||
assert (tc->type == TERM_CONTAINER_TYPE_SOLO);
|
assert (tc->type == TERM_CONTAINER_TYPE_SOLO);
|
||||||
solo = (Solo*) tc;
|
solo = (Solo*) tc;
|
||||||
term = solo->term;
|
term = solo->term;
|
||||||
|
@ -765,9 +823,9 @@ _solo_update(Term_Container *tc)
|
||||||
if (tc_parent->type == TERM_CONTAINER_TYPE_SPLIT)
|
if (tc_parent->type == TERM_CONTAINER_TYPE_SPLIT)
|
||||||
{
|
{
|
||||||
if (term->config->show_tabs)
|
if (term->config->show_tabs)
|
||||||
_solo_title_show(tc);
|
_solo_tab_show(tc);
|
||||||
else
|
else
|
||||||
_solo_title_hide(tc);
|
_solo_tab_hide(tc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1186,11 +1244,16 @@ static Term *
|
||||||
_win_focused_term_get(const Term_Container *tc)
|
_win_focused_term_get(const Term_Container *tc)
|
||||||
{
|
{
|
||||||
Win *wn;
|
Win *wn;
|
||||||
|
Term *term = NULL;
|
||||||
|
|
||||||
assert (tc->type == TERM_CONTAINER_TYPE_WIN);
|
assert (tc->type == TERM_CONTAINER_TYPE_WIN);
|
||||||
|
|
||||||
wn = (Win*) tc;
|
wn = (Win*) tc;
|
||||||
|
|
||||||
return tc->is_focused ? wn->child->focused_term_get(wn->child) : NULL;
|
if (tc->is_focused)
|
||||||
|
term = wn->child->focused_term_get(wn->child);
|
||||||
|
DBG("%p term focused:%p", tc, term);
|
||||||
|
return term;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Term *
|
static Term *
|
||||||
|
@ -1240,8 +1303,10 @@ _win_swallow(Term_Container *tc, Term_Container *orig,
|
||||||
if ((new_child->type == TERM_CONTAINER_TYPE_SOLO)
|
if ((new_child->type == TERM_CONTAINER_TYPE_SOLO)
|
||||||
&& (wn->config->show_tabs))
|
&& (wn->config->show_tabs))
|
||||||
{
|
{
|
||||||
/* TODO: boris show tab tab_drag */
|
if (_tab_drag && _tab_drag->term && (_tab_drag->term->wn == wn))
|
||||||
_solo_title_hide(new_child);
|
_solo_tab_show(new_child);
|
||||||
|
else
|
||||||
|
_solo_tab_hide(new_child);
|
||||||
}
|
}
|
||||||
|
|
||||||
evas_object_show(o);
|
evas_object_show(o);
|
||||||
|
@ -1434,9 +1499,9 @@ _win_split(Term_Container *tc, Term_Container *child,
|
||||||
{
|
{
|
||||||
if (child->type == TERM_CONTAINER_TYPE_SOLO)
|
if (child->type == TERM_CONTAINER_TYPE_SOLO)
|
||||||
{
|
{
|
||||||
_solo_title_show(child);
|
_solo_tab_show(child);
|
||||||
}
|
}
|
||||||
_solo_title_show(tc_solo_new);
|
_solo_tab_show(tc_solo_new);
|
||||||
}
|
}
|
||||||
|
|
||||||
child->unfocus(child, tc_split);
|
child->unfocus(child, tc_split);
|
||||||
|
@ -1489,9 +1554,9 @@ _win_split_direction(Term_Container *tc,
|
||||||
{
|
{
|
||||||
if (child_orig->type == TERM_CONTAINER_TYPE_SOLO)
|
if (child_orig->type == TERM_CONTAINER_TYPE_SOLO)
|
||||||
{
|
{
|
||||||
_solo_title_show(child_orig);
|
_solo_tab_show(child_orig);
|
||||||
}
|
}
|
||||||
_solo_title_show(child_new);
|
_solo_tab_show(child_new);
|
||||||
}
|
}
|
||||||
|
|
||||||
tc_split->is_focused = tc->is_focused;
|
tc_split->is_focused = tc->is_focused;
|
||||||
|
@ -1651,7 +1716,7 @@ _cb_win_key_down(void *data,
|
||||||
|
|
||||||
DBG("GROUP key down (%p) (ctrl:%d)",
|
DBG("GROUP key down (%p) (ctrl:%d)",
|
||||||
wn, evas_key_modifier_is_set(ev->modifiers, "Control"));
|
wn, evas_key_modifier_is_set(ev->modifiers, "Control"));
|
||||||
|
_focus_validator();
|
||||||
if ((wn->on_popover) || (wn->cmdbox_up)) return;
|
if ((wn->on_popover) || (wn->cmdbox_up)) return;
|
||||||
|
|
||||||
ctrl = evas_key_modifier_is_set(ev->modifiers, "Control");
|
ctrl = evas_key_modifier_is_set(ev->modifiers, "Control");
|
||||||
|
@ -1666,6 +1731,7 @@ _cb_win_key_down(void *data,
|
||||||
ctrl, alt, shift, win, meta, hyper);
|
ctrl, alt, shift, win, meta, hyper);
|
||||||
|
|
||||||
/* 1st/ Tab selector */
|
/* 1st/ Tab selector */
|
||||||
|
DBG("1> tab selector");
|
||||||
{
|
{
|
||||||
Term_Container *tc = (Term_Container*) wn;
|
Term_Container *tc = (Term_Container*) wn;
|
||||||
|
|
||||||
|
@ -1691,6 +1757,7 @@ _cb_win_key_down(void *data,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 2nd/ Miniview */
|
/* 2nd/ Miniview */
|
||||||
|
DBG("2> miniview");
|
||||||
if (wn->group_input)
|
if (wn->group_input)
|
||||||
{
|
{
|
||||||
GROUPED_INPUT_TERM_FOREACH(wn, l, term)
|
GROUPED_INPUT_TERM_FOREACH(wn, l, term)
|
||||||
|
@ -1706,7 +1773,10 @@ _cb_win_key_down(void *data,
|
||||||
|
|
||||||
term = tc->focused_term_get(tc);
|
term = tc->focused_term_get(tc);
|
||||||
if (!term)
|
if (!term)
|
||||||
return;
|
{
|
||||||
|
DBG("no focused term");
|
||||||
|
return;
|
||||||
|
}
|
||||||
done = miniview_handle_key(term_miniview_get(term), ev);
|
done = miniview_handle_key(term_miniview_get(term), ev);
|
||||||
}
|
}
|
||||||
if (done)
|
if (done)
|
||||||
|
@ -1717,6 +1787,7 @@ _cb_win_key_down(void *data,
|
||||||
|
|
||||||
|
|
||||||
/* 3rd/ PopMedia */
|
/* 3rd/ PopMedia */
|
||||||
|
DBG("3> popmedia");
|
||||||
done = EINA_FALSE;
|
done = EINA_FALSE;
|
||||||
if (wn->group_input)
|
if (wn->group_input)
|
||||||
{
|
{
|
||||||
|
@ -1735,7 +1806,10 @@ _cb_win_key_down(void *data,
|
||||||
|
|
||||||
term = tc->focused_term_get(tc);
|
term = tc->focused_term_get(tc);
|
||||||
if (!term)
|
if (!term)
|
||||||
return;
|
{
|
||||||
|
DBG("no focused term");
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (term_has_popmedia(term) && !strcmp(ev->key, "Escape"))
|
if (term_has_popmedia(term) && !strcmp(ev->key, "Escape"))
|
||||||
{
|
{
|
||||||
term_popmedia_close(term);
|
term_popmedia_close(term);
|
||||||
|
@ -1749,6 +1823,7 @@ _cb_win_key_down(void *data,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 4th/ Handle key bindings */
|
/* 4th/ Handle key bindings */
|
||||||
|
DBG("4> key binding");
|
||||||
done = EINA_FALSE;
|
done = EINA_FALSE;
|
||||||
if (wn->group_input)
|
if (wn->group_input)
|
||||||
{
|
{
|
||||||
|
@ -1780,6 +1855,7 @@ _cb_win_key_down(void *data,
|
||||||
|
|
||||||
/* 5th/ Composing */
|
/* 5th/ Composing */
|
||||||
/* composing */
|
/* composing */
|
||||||
|
DBG("5> composing");
|
||||||
if (wn->khdl.imf)
|
if (wn->khdl.imf)
|
||||||
{
|
{
|
||||||
// EXCEPTION. Don't filter modifiers alt+shift -> breaks emacs
|
// EXCEPTION. Don't filter modifiers alt+shift -> breaks emacs
|
||||||
|
@ -1860,6 +1936,7 @@ _cb_win_key_down(void *data,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 6th/ send key to pty */
|
/* 6th/ send key to pty */
|
||||||
|
DBG("6> to pty");
|
||||||
if (wn->group_input)
|
if (wn->group_input)
|
||||||
{
|
{
|
||||||
GROUPED_INPUT_TERM_FOREACH(wn, l, term)
|
GROUPED_INPUT_TERM_FOREACH(wn, l, term)
|
||||||
|
@ -1872,12 +1949,15 @@ _cb_win_key_down(void *data,
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ty = termio_pty_get(term->termio);
|
ty = termio_pty_get(term->termio);
|
||||||
|
DBG("ty:%p", ty);
|
||||||
if (ty && termpty_can_handle_key(ty, &wn->khdl, ev))
|
if (ty && termpty_can_handle_key(ty, &wn->khdl, ev))
|
||||||
keyin_handle_key_to_pty(ty, ev, alt, shift, ctrl);
|
keyin_handle_key_to_pty(ty, ev, alt, shift, ctrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 7th: specifics: jump on keypress / flicker on key */
|
/* 7th: specifics: jump on keypress / flicker on key */
|
||||||
|
DBG("7> specifics");
|
||||||
end:
|
end:
|
||||||
|
DBG("term:%p", term);
|
||||||
if (wn->group_input)
|
if (wn->group_input)
|
||||||
{
|
{
|
||||||
GROUPED_INPUT_TERM_FOREACH(wn, l, term)
|
GROUPED_INPUT_TERM_FOREACH(wn, l, term)
|
||||||
|
@ -2530,13 +2610,15 @@ static Term *
|
||||||
_split_focused_term_get(const Term_Container *tc)
|
_split_focused_term_get(const Term_Container *tc)
|
||||||
{
|
{
|
||||||
Split *split;
|
Split *split;
|
||||||
|
Term *term = NULL;
|
||||||
|
|
||||||
assert (tc->type == TERM_CONTAINER_TYPE_SPLIT);
|
assert (tc->type == TERM_CONTAINER_TYPE_SPLIT);
|
||||||
split = (Split*) tc;
|
split = (Split*) tc;
|
||||||
|
|
||||||
return tc->is_focused ?
|
if (tc->is_focused)
|
||||||
split->last_focus->focused_term_get(split->last_focus)
|
term = split->last_focus->focused_term_get(split->last_focus);
|
||||||
: NULL;
|
DBG("%p term focused:%p", tc, term);
|
||||||
|
return term;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Term *
|
static Term *
|
||||||
|
@ -2735,20 +2817,22 @@ _split_split(Term_Container *tc, Term_Container *child,
|
||||||
else
|
else
|
||||||
elm_object_part_content_unset(split->panes, PANES_BOTTOM);
|
elm_object_part_content_unset(split->panes, PANES_BOTTOM);
|
||||||
|
|
||||||
|
child->unfocus(child, tc);
|
||||||
tc_split = _split_new(child, tc_solo_new, is_horizontal);
|
tc_split = _split_new(child, tc_solo_new, is_horizontal);
|
||||||
|
|
||||||
obj_split = tc_split->get_evas_object(tc_split);
|
obj_split = tc_split->get_evas_object(tc_split);
|
||||||
|
|
||||||
tc_split->focus(tc_split, tc_solo_new);
|
|
||||||
tc_split->is_focused = tc->is_focused;
|
tc_split->is_focused = tc->is_focused;
|
||||||
tc->swallow(tc, child, tc_split);
|
tc->swallow(tc, child, tc_split);
|
||||||
|
tc_solo_new->focus(tc_solo_new, tc_split);
|
||||||
|
|
||||||
if (wn->config->show_tabs)
|
if (wn->config->show_tabs)
|
||||||
{
|
{
|
||||||
_solo_title_show(tc_solo_new);
|
_solo_tab_show(tc_solo_new);
|
||||||
}
|
}
|
||||||
|
|
||||||
evas_object_show(obj_split);
|
evas_object_show(obj_split);
|
||||||
|
_focus_validator();
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -2797,9 +2881,9 @@ _split_split_direction(Term_Container *tc,
|
||||||
{
|
{
|
||||||
if (child_orig->type == TERM_CONTAINER_TYPE_SOLO)
|
if (child_orig->type == TERM_CONTAINER_TYPE_SOLO)
|
||||||
{
|
{
|
||||||
_solo_title_show(child_orig);
|
_solo_tab_show(child_orig);
|
||||||
}
|
}
|
||||||
_solo_title_show(child_new);
|
_solo_tab_show(child_new);
|
||||||
}
|
}
|
||||||
|
|
||||||
tc_split->is_focused = tc->is_focused;
|
tc_split->is_focused = tc->is_focused;
|
||||||
|
@ -2823,11 +2907,15 @@ _split_is_visible(Term_Container *tc, Term_Container *_child EINA_UNUSED)
|
||||||
static void
|
static void
|
||||||
_split_detach(Term_Container *tc, Term_Container *solo_child)
|
_split_detach(Term_Container *tc, Term_Container *solo_child)
|
||||||
{
|
{
|
||||||
|
Evas_Object *o;
|
||||||
assert (tc->type == TERM_CONTAINER_TYPE_SPLIT);
|
assert (tc->type == TERM_CONTAINER_TYPE_SPLIT);
|
||||||
assert (solo_child->type == TERM_CONTAINER_TYPE_SOLO);
|
assert (solo_child->type == TERM_CONTAINER_TYPE_SOLO);
|
||||||
|
|
||||||
_split_close(tc, solo_child);
|
_split_close(tc, solo_child);
|
||||||
solo_child->is_focused = EINA_FALSE;
|
solo_child->is_focused = EINA_FALSE;
|
||||||
|
|
||||||
|
o = solo_child->get_evas_object(solo_child);
|
||||||
|
evas_object_hide(o);
|
||||||
}
|
}
|
||||||
|
|
||||||
static Term_Container *
|
static Term_Container *
|
||||||
|
@ -2844,6 +2932,8 @@ _split_new(Term_Container *tc1, Term_Container *tc2,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DBG("split new %p 1:%p 2:%p", split, tc1, tc2);
|
||||||
|
|
||||||
tc = (Term_Container*)split;
|
tc = (Term_Container*)split;
|
||||||
tc->term_next = _split_term_next;
|
tc->term_next = _split_term_next;
|
||||||
tc->term_prev = _split_term_prev;
|
tc->term_prev = _split_term_prev;
|
||||||
|
@ -2879,7 +2969,7 @@ _split_new(Term_Container *tc1, Term_Container *tc2,
|
||||||
|
|
||||||
split->tc1 = tc1;
|
split->tc1 = tc1;
|
||||||
split->tc2 = tc2;
|
split->tc2 = tc2;
|
||||||
split->last_focus = tc1;
|
split->last_focus = tc2;
|
||||||
|
|
||||||
o = split->panes = elm_panes_add(tc1->wn->win);
|
o = split->panes = elm_panes_add(tc1->wn->win);
|
||||||
elm_object_style_set(o, "flush");
|
elm_object_style_set(o, "flush");
|
||||||
|
@ -4393,6 +4483,8 @@ _tabs_close(Term_Container *tc, Term_Container *child)
|
||||||
assert (next_child->type == TERM_CONTAINER_TYPE_SOLO);
|
assert (next_child->type == TERM_CONTAINER_TYPE_SOLO);
|
||||||
next_solo = (Solo*)next_child;
|
next_solo = (Solo*)next_child;
|
||||||
next_term = next_solo->term;
|
next_term = next_solo->term;
|
||||||
|
assert(next_term != term);
|
||||||
|
assert(tc != next_child);
|
||||||
config = next_term->config;
|
config = next_term->config;
|
||||||
|
|
||||||
_tabbar_clear(term);
|
_tabbar_clear(term);
|
||||||
|
@ -4413,7 +4505,7 @@ _tabs_close(Term_Container *tc, Term_Container *child)
|
||||||
_tabs_restore(tabs);
|
_tabs_restore(tabs);
|
||||||
|
|
||||||
if (config->show_tabs)
|
if (config->show_tabs)
|
||||||
_solo_title_show(next_child);
|
_solo_tab_show(next_child);
|
||||||
|
|
||||||
eina_stringshare_del(tc->title);
|
eina_stringshare_del(tc->title);
|
||||||
|
|
||||||
|
@ -4425,6 +4517,7 @@ _tabs_close(Term_Container *tc, Term_Container *child)
|
||||||
&& (_tab_drag->tabs_child == tc))
|
&& (_tab_drag->tabs_child == tc))
|
||||||
{
|
{
|
||||||
_tab_drag->tabs_child = next_child;
|
_tab_drag->tabs_child = next_child;
|
||||||
|
_solo_tab_show(next_child);
|
||||||
}
|
}
|
||||||
|
|
||||||
_tab_item_free(item);
|
_tab_item_free(item);
|
||||||
|
@ -5104,11 +5197,15 @@ _tabs_is_visible(Term_Container *tc, Term_Container *child)
|
||||||
static void
|
static void
|
||||||
_tabs_detach(Term_Container *tc, Term_Container *solo_child)
|
_tabs_detach(Term_Container *tc, Term_Container *solo_child)
|
||||||
{
|
{
|
||||||
|
Evas_Object *o;
|
||||||
assert (tc->type == TERM_CONTAINER_TYPE_TABS);
|
assert (tc->type == TERM_CONTAINER_TYPE_TABS);
|
||||||
assert (solo_child->type == TERM_CONTAINER_TYPE_SOLO);
|
assert (solo_child->type == TERM_CONTAINER_TYPE_SOLO);
|
||||||
|
|
||||||
_tabs_close(tc, solo_child);
|
_tabs_close(tc, solo_child);
|
||||||
solo_child->is_focused = EINA_FALSE;
|
solo_child->is_focused = EINA_FALSE;
|
||||||
|
|
||||||
|
o = solo_child->get_evas_object(solo_child);
|
||||||
|
evas_object_hide(o);
|
||||||
}
|
}
|
||||||
|
|
||||||
static Term_Container *
|
static Term_Container *
|
||||||
|
|
Loading…
Reference in New Issue