tab_selector: fix focus issue

This commit is contained in:
Boris Faure 2019-07-07 16:26:32 +02:00
parent 0f462611c3
commit 14d799d63e
3 changed files with 70 additions and 36 deletions

View File

@ -182,18 +182,18 @@ _autozoom(Evas_Object *obj)
sd->autozoom_timeout = ecore_timer_add(0.5, _autozoom_reset, obj); sd->autozoom_timeout = ecore_timer_add(0.5, _autozoom_reset, obj);
} }
void void
_key_down_cb(void *data, sel_key_down(Evas_Object *obj,
Evas *_e EINA_UNUSED, Evas_Event_Key_Down *event)
Evas_Object *obj,
void *event)
{ {
Evas_Event_Key_Down *ev = 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; Eina_List *l;
Entry *en; Entry *en;
if (!sd) return; EINA_SAFETY_ON_NULL_RETURN(sd);
if ((!strcmp(ev->key, "Next")) || if ((!strcmp(ev->key, "Next")) ||
(!strcmp(ev->key, "Right"))) (!strcmp(ev->key, "Right")))
{ {
@ -207,11 +207,14 @@ _key_down_cb(void *data,
sel_entry_selected_set(obj, en->obj, EINA_FALSE); sel_entry_selected_set(obj, en->obj, EINA_FALSE);
break; break;
} }
else return; else
{
return;
}
} }
} }
sd->exit_now = EINA_FALSE; sd->exit_now = EINA_FALSE;
_autozoom(data); _autozoom(obj);
} }
else if ((!strcmp(ev->key, "Prior")) || else if ((!strcmp(ev->key, "Prior")) ||
(!strcmp(ev->key, "Left"))) (!strcmp(ev->key, "Left")))
@ -226,11 +229,14 @@ _key_down_cb(void *data,
sel_entry_selected_set(obj, en->obj, EINA_FALSE); sel_entry_selected_set(obj, en->obj, EINA_FALSE);
break; break;
} }
else return; else
{
return;
}
} }
} }
sd->exit_now = EINA_FALSE; sd->exit_now = EINA_FALSE;
_autozoom(data); _autozoom(obj);
} }
else if (!strcmp(ev->key, "Up")) else if (!strcmp(ev->key, "Up"))
{ {
@ -255,12 +261,14 @@ _key_down_cb(void *data,
} }
} }
if (found == EINA_FALSE) if (found == EINA_FALSE)
return; {
return;
}
break; break;
} }
} }
sd->exit_now = EINA_FALSE; sd->exit_now = EINA_FALSE;
_autozoom(data); _autozoom(obj);
} }
else if (!strcmp(ev->key, "Down")) else if (!strcmp(ev->key, "Down"))
{ {
@ -285,12 +293,14 @@ _key_down_cb(void *data,
} }
} }
if (found == EINA_FALSE) if (found == EINA_FALSE)
return; {
return;
}
break; break;
} }
} }
sd->exit_now = EINA_FALSE; sd->exit_now = EINA_FALSE;
_autozoom(data); _autozoom(obj);
} }
else if ((!strcmp(ev->key, "Return")) || else if ((!strcmp(ev->key, "Return")) ||
(!strcmp(ev->key, "KP_Enter")) || (!strcmp(ev->key, "KP_Enter")) ||
@ -303,8 +313,8 @@ _key_down_cb(void *data,
ecore_timer_del(sd->autozoom_timeout); ecore_timer_del(sd->autozoom_timeout);
sd->autozoom_timeout = NULL; sd->autozoom_timeout = NULL;
} }
evas_object_smart_callback_call(data, "ending", NULL); evas_object_smart_callback_call(obj, "ending", NULL);
sel_zoom(data, 1.0); sel_zoom(obj, 1.0);
} }
else if (!strcmp(ev->key, "Escape")) else if (!strcmp(ev->key, "Escape"))
{ {
@ -322,8 +332,8 @@ _key_down_cb(void *data,
ecore_timer_del(sd->autozoom_timeout); ecore_timer_del(sd->autozoom_timeout);
sd->autozoom_timeout = NULL; sd->autozoom_timeout = NULL;
} }
evas_object_smart_callback_call(data, "ending", NULL); evas_object_smart_callback_call(obj, "ending", NULL);
sel_zoom(data, 1.0); sel_zoom(obj, 1.0);
} }
} }
@ -670,8 +680,6 @@ sel_add(Evas_Object *parent)
_mouse_up_cb, obj); _mouse_up_cb, obj);
evas_object_event_callback_add(sd->o_event, EVAS_CALLBACK_MOUSE_MOVE, evas_object_event_callback_add(sd->o_event, EVAS_CALLBACK_MOUSE_MOVE,
_mouse_move_cb, obj); _mouse_move_cb, obj);
evas_object_event_callback_add(obj, EVAS_CALLBACK_KEY_DOWN,
_key_down_cb, obj);
sd->zoom = 1.0; sd->zoom = 1.0;
return obj; return obj;

View File

@ -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_zoom(Evas_Object *obj, double zoom);
void sel_orig_zoom_set(Evas_Object *obj, double zoom); void sel_orig_zoom_set(Evas_Object *obj, double zoom);
void sel_exit(Evas_Object *obj); void sel_exit(Evas_Object *obj);
void sel_key_down(Evas_Object *obj, Evas_Event_Key_Down *event);
#endif #endif

View File

@ -1303,7 +1303,30 @@ _cb_win_key_down(void *data,
DBG("ctrl:%d alt:%d shift:%d win:%d meta:%d hyper:%d", DBG("ctrl:%d alt:%d shift:%d win:%d meta:%d hyper:%d",
ctrl, alt, shift, win, meta, hyper); 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) if (wn->group_input)
{ {
GROUPED_INPUT_TERM_FOREACH(wn, l, term) GROUPED_INPUT_TERM_FOREACH(wn, l, term)
@ -1329,7 +1352,7 @@ _cb_win_key_down(void *data,
} }
/* 2nd/ PopMedia */ /* 3rd/ PopMedia */
done = EINA_FALSE; done = EINA_FALSE;
if (wn->group_input) if (wn->group_input)
{ {
@ -1361,7 +1384,7 @@ _cb_win_key_down(void *data,
goto end; goto end;
} }
/* 3rd/ Handle key bindings */ /* 4th/ Handle key bindings */
done = EINA_FALSE; done = EINA_FALSE;
if (wn->group_input) if (wn->group_input)
{ {
@ -1391,7 +1414,7 @@ _cb_win_key_down(void *data,
} }
done = EINA_FALSE; done = EINA_FALSE;
/* 4th/ Composing */ /* 5th/ Composing */
/* composing */ /* composing */
if (wn->khdl.imf) if (wn->khdl.imf)
{ {
@ -1472,7 +1495,7 @@ _cb_win_key_down(void *data,
goto end; goto end;
} }
/* 5th/ send key to pty */ /* 6th/ send key to pty */
if (wn->group_input) if (wn->group_input)
{ {
GROUPED_INPUT_TERM_FOREACH(wn, l, term) 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); 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: end:
if (wn->group_input) if (wn->group_input)
{ {
@ -2719,6 +2742,8 @@ _tabs_restore(Tabs *tabs)
Term *term; Term *term;
Solo *solo; Solo *solo;
Win *wn = tc->wn; Win *wn = tc->wn;
Evas_Object *selector = tabs->selector;
Evas_Object *selector_bg = tabs->selector_bg;
if (!tabs->selector) if (!tabs->selector)
return; return;
@ -2741,19 +2766,17 @@ _tabs_restore(Tabs *tabs)
tab_item->tc->unfocus(tab_item->tc, tc); 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); _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); _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); _tabs_selector_cb_ending, tabs);
evas_object_del(tabs->selector);
evas_object_del(tabs->selector_bg);
tabs->selector = NULL; tabs->selector = NULL;
tabs->selector_bg = NULL; tabs->selector_bg = NULL;
wn->on_popover = EINA_FALSE;
/* XXX: reswallow in parent */ /* XXX: reswallow in parent */
tc->parent->swallow(tc->parent, tc, tc); tc->parent->swallow(tc->parent, tc, tc);
solo = (Solo*)tabs->current->tc; solo = (Solo*)tabs->current->tc;
@ -2763,6 +2786,11 @@ _tabs_restore(Tabs *tabs)
_tabs_refresh(tabs); _tabs_refresh(tabs);
tabs->current->tc->unfocus(tabs->current->tc, tabs->current->tc); tabs->current->tc->unfocus(tabs->current->tc, tabs->current->tc);
tabs->current->tc->focus(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 static void
@ -2822,8 +2850,6 @@ _cb_tab_selector_show(Tabs *tabs, Tab_Item *to_item)
if (tabs->selector_bg) if (tabs->selector_bg)
return; return;
wn->on_popover = EINA_TRUE;
o = tc->get_evas_object(tc); o = tc->get_evas_object(tc);
evas_object_geometry_get(o, &x, &y, &w, &h); 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); EINA_TRUE);
sel_exit(tabs->selector); sel_exit(tabs->selector);
} }
elm_object_focus_set(tabs->selector, EINA_TRUE);
} }
static void static void