From 14d799d63ecb85f374b6f2b9d7344916029e6347 Mon Sep 17 00:00:00 2001 From: Boris Faure Date: Sun, 7 Jul 2019 16:26:32 +0200 Subject: [PATCH] tab_selector: fix focus issue --- src/bin/sel.c | 48 +++++++++++++++++++++++++------------------ src/bin/sel.h | 1 + src/bin/win.c | 57 ++++++++++++++++++++++++++++++++++++--------------- 3 files changed, 70 insertions(+), 36 deletions(-) diff --git a/src/bin/sel.c b/src/bin/sel.c index 5df50edd..52506668 100644 --- a/src/bin/sel.c +++ b/src/bin/sel.c @@ -182,18 +182,18 @@ _autozoom(Evas_Object *obj) sd->autozoom_timeout = ecore_timer_add(0.5, _autozoom_reset, obj); } + void -_key_down_cb(void *data, - Evas *_e EINA_UNUSED, - Evas_Object *obj, - void *event) +sel_key_down(Evas_Object *obj, + Evas_Event_Key_Down *event) { Evas_Event_Key_Down *ev = event; - Sel *sd = evas_object_smart_data_get(data); + Sel *sd = evas_object_smart_data_get(obj); Eina_List *l; Entry *en; - if (!sd) return; + EINA_SAFETY_ON_NULL_RETURN(sd); + if ((!strcmp(ev->key, "Next")) || (!strcmp(ev->key, "Right"))) { @@ -207,11 +207,14 @@ _key_down_cb(void *data, sel_entry_selected_set(obj, en->obj, EINA_FALSE); break; } - else return; + else + { + return; + } } } sd->exit_now = EINA_FALSE; - _autozoom(data); + _autozoom(obj); } else if ((!strcmp(ev->key, "Prior")) || (!strcmp(ev->key, "Left"))) @@ -226,11 +229,14 @@ _key_down_cb(void *data, sel_entry_selected_set(obj, en->obj, EINA_FALSE); break; } - else return; + else + { + return; + } } } sd->exit_now = EINA_FALSE; - _autozoom(data); + _autozoom(obj); } else if (!strcmp(ev->key, "Up")) { @@ -255,12 +261,14 @@ _key_down_cb(void *data, } } if (found == EINA_FALSE) - return; + { + return; + } break; } } sd->exit_now = EINA_FALSE; - _autozoom(data); + _autozoom(obj); } else if (!strcmp(ev->key, "Down")) { @@ -285,12 +293,14 @@ _key_down_cb(void *data, } } if (found == EINA_FALSE) - return; + { + return; + } break; } } sd->exit_now = EINA_FALSE; - _autozoom(data); + _autozoom(obj); } else if ((!strcmp(ev->key, "Return")) || (!strcmp(ev->key, "KP_Enter")) || @@ -303,8 +313,8 @@ _key_down_cb(void *data, ecore_timer_del(sd->autozoom_timeout); sd->autozoom_timeout = NULL; } - evas_object_smart_callback_call(data, "ending", NULL); - sel_zoom(data, 1.0); + evas_object_smart_callback_call(obj, "ending", NULL); + sel_zoom(obj, 1.0); } else if (!strcmp(ev->key, "Escape")) { @@ -322,8 +332,8 @@ _key_down_cb(void *data, ecore_timer_del(sd->autozoom_timeout); sd->autozoom_timeout = NULL; } - evas_object_smart_callback_call(data, "ending", NULL); - sel_zoom(data, 1.0); + evas_object_smart_callback_call(obj, "ending", NULL); + sel_zoom(obj, 1.0); } } @@ -670,8 +680,6 @@ sel_add(Evas_Object *parent) _mouse_up_cb, obj); evas_object_event_callback_add(sd->o_event, EVAS_CALLBACK_MOUSE_MOVE, _mouse_move_cb, obj); - evas_object_event_callback_add(obj, EVAS_CALLBACK_KEY_DOWN, - _key_down_cb, obj); sd->zoom = 1.0; return obj; diff --git a/src/bin/sel.h b/src/bin/sel.h index f01f5453..0dcd12ac 100644 --- a/src/bin/sel.h +++ b/src/bin/sel.h @@ -13,5 +13,6 @@ void sel_entry_selected_set(Evas_Object *obj, Evas_Object *entry, Eina_Bool keep void sel_zoom(Evas_Object *obj, double zoom); void sel_orig_zoom_set(Evas_Object *obj, double zoom); void sel_exit(Evas_Object *obj); +void sel_key_down(Evas_Object *obj, Evas_Event_Key_Down *event); #endif diff --git a/src/bin/win.c b/src/bin/win.c index dd0466e1..021bb6e0 100644 --- a/src/bin/win.c +++ b/src/bin/win.c @@ -1303,7 +1303,30 @@ _cb_win_key_down(void *data, DBG("ctrl:%d alt:%d shift:%d win:%d meta:%d hyper:%d", ctrl, alt, shift, win, meta, hyper); - /* 1st/ Miniview */ + /* 1st/ Tab selector */ + { + Term_Container *tc = (Term_Container*) wn; + + term = tc->focused_term_get(tc); + if (term) + { + Term_Container *tc = term->container; + Term_Container *tc_parent = tc->parent; + + if (tc_parent->type == TERM_CONTAINER_TYPE_TABS) + { + Tabs *tabs = (Tabs*) tc_parent; + + if (tabs->selector != NULL) + { + sel_key_down(tabs->selector, ev); + return; + } + } + } + } + + /* 2nd/ Miniview */ if (wn->group_input) { GROUPED_INPUT_TERM_FOREACH(wn, l, term) @@ -1329,7 +1352,7 @@ _cb_win_key_down(void *data, } - /* 2nd/ PopMedia */ + /* 3rd/ PopMedia */ done = EINA_FALSE; if (wn->group_input) { @@ -1361,7 +1384,7 @@ _cb_win_key_down(void *data, goto end; } - /* 3rd/ Handle key bindings */ + /* 4th/ Handle key bindings */ done = EINA_FALSE; if (wn->group_input) { @@ -1391,7 +1414,7 @@ _cb_win_key_down(void *data, } done = EINA_FALSE; - /* 4th/ Composing */ + /* 5th/ Composing */ /* composing */ if (wn->khdl.imf) { @@ -1472,7 +1495,7 @@ _cb_win_key_down(void *data, goto end; } - /* 5th/ send key to pty */ + /* 6th/ send key to pty */ if (wn->group_input) { GROUPED_INPUT_TERM_FOREACH(wn, l, term) @@ -1489,7 +1512,7 @@ _cb_win_key_down(void *data, keyin_handle_key_to_pty(ty, ev, alt, shift, ctrl); } - /* 6th: specifics: jump on keypress / flicker on key */ + /* 7th: specifics: jump on keypress / flicker on key */ end: if (wn->group_input) { @@ -2719,6 +2742,8 @@ _tabs_restore(Tabs *tabs) Term *term; Solo *solo; Win *wn = tc->wn; + Evas_Object *selector = tabs->selector; + Evas_Object *selector_bg = tabs->selector_bg; if (!tabs->selector) return; @@ -2741,19 +2766,17 @@ _tabs_restore(Tabs *tabs) tab_item->tc->unfocus(tab_item->tc, tc); } - evas_object_smart_callback_del_full(tabs->selector, "selected", + evas_object_smart_callback_del_full(selector, "selected", _tabs_selector_cb_selected, tabs); - evas_object_smart_callback_del_full(tabs->selector, "exit", + evas_object_smart_callback_del_full(selector, "exit", _tabs_selector_cb_exit, tabs); - evas_object_smart_callback_del_full(tabs->selector, "ending", + evas_object_smart_callback_del_full(selector, "ending", _tabs_selector_cb_ending, tabs); - evas_object_del(tabs->selector); - evas_object_del(tabs->selector_bg); + + tabs->selector = NULL; tabs->selector_bg = NULL; - wn->on_popover = EINA_FALSE; - /* XXX: reswallow in parent */ tc->parent->swallow(tc->parent, tc, tc); solo = (Solo*)tabs->current->tc; @@ -2763,6 +2786,11 @@ _tabs_restore(Tabs *tabs) _tabs_refresh(tabs); tabs->current->tc->unfocus(tabs->current->tc, tabs->current->tc); tabs->current->tc->focus(tabs->current->tc, tabs->current->tc); + + elm_object_focus_set(selector, EINA_FALSE); + + evas_object_del(selector); + evas_object_del(selector_bg); } static void @@ -2822,8 +2850,6 @@ _cb_tab_selector_show(Tabs *tabs, Tab_Item *to_item) if (tabs->selector_bg) return; - wn->on_popover = EINA_TRUE; - o = tc->get_evas_object(tc); evas_object_geometry_get(o, &x, &y, &w, &h); @@ -2899,7 +2925,6 @@ _cb_tab_selector_show(Tabs *tabs, Tab_Item *to_item) EINA_TRUE); sel_exit(tabs->selector); } - elm_object_focus_set(tabs->selector, EINA_TRUE); } static void