browser - work around focus restore errors by explicitly focusing win

browser hides and rage relied on elm auto-focusing what was left after
hiding/deletion of the browser input button... but this broke ... work
around it and be explicit in focusing win content again.
This commit is contained in:
Carsten Haitzler 2017-10-16 08:40:11 +09:00
parent d82c1877ec
commit 62bbf25fd2
3 changed files with 24 additions and 2 deletions

View File

@ -56,6 +56,7 @@ static Evas_Object *sc, *bt;
static Ecore_Thread *fill_thread = NULL; static Ecore_Thread *fill_thread = NULL;
static Entry *dir_entry = NULL; static Entry *dir_entry = NULL;
static Eina_List *entries = NULL; static Eina_List *entries = NULL;
static Ecore_Timer *_browser_hide_focus_restore_timer = NULL;
static Eina_Semaphore step_sema; static Eina_Semaphore step_sema;
static void _sel_go(Evas_Object *win EINA_UNUSED, Entry *base_entry, int x, int y); static void _sel_go(Evas_Object *win EINA_UNUSED, Entry *base_entry, int x, int y);
@ -893,7 +894,6 @@ _cb_key_down(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, v
Evas_Event_Key_Down *ev = event_info; Evas_Event_Key_Down *ev = event_info;
Evas_Object *win = data; Evas_Object *win = data;
printf("brow %s\n", ev->key);
if ((!strcmp(ev->key, "Left")) || if ((!strcmp(ev->key, "Left")) ||
(!strcmp(ev->key, "bracketleft"))) (!strcmp(ev->key, "bracketleft")))
{ {
@ -963,6 +963,8 @@ browser_show(Evas_Object *win)
{ {
Inf *inf = evas_object_data_get(win, "inf"); Inf *inf = evas_object_data_get(win, "inf");
if (_browser_hide_focus_restore_timer) ecore_timer_del(_browser_hide_focus_restore_timer);
_browser_hide_focus_restore_timer = NULL;
if (!bx) if (!bx)
{ {
bx = elm_box_add(win); bx = elm_box_add(win);
@ -1020,6 +1022,14 @@ _cb_hidden(void *data, Evas_Object *obj, const char *sig EINA_UNUSED, const char
elm_object_focus_next(data, ELM_FOCUS_PREVIOUS); elm_object_focus_next(data, ELM_FOCUS_PREVIOUS);
} }
static Eina_Bool
_browser_hide_focus_restore_cb(void *data)
{
win_focus(data);
_browser_hide_focus_restore_timer = NULL;
return EINA_FALSE;
}
void void
browser_hide(Evas_Object *win) browser_hide(Evas_Object *win)
{ {
@ -1031,6 +1041,8 @@ browser_hide(Evas_Object *win)
elm_layout_signal_callback_add(inf->lay, "browser,state,hidden,finished", "rage", elm_layout_signal_callback_add(inf->lay, "browser,state,hidden,finished", "rage",
_cb_hidden, win); _cb_hidden, win);
elm_layout_signal_emit(inf->lay, "browser,state,hidden", "rage"); elm_layout_signal_emit(inf->lay, "browser,state,hidden", "rage");
if (_browser_hide_focus_restore_timer) ecore_timer_del(_browser_hide_focus_restore_timer);
_browser_hide_focus_restore_timer = ecore_timer_add(0.2, _browser_hide_focus_restore_cb, win);
} }
void void

View File

@ -628,6 +628,7 @@ win_add(void)
// a dummy button to collect key events and have focus // a dummy button to collect key events and have focus
o = elm_button_add(win); o = elm_button_add(win);
inf->focus = o;
elm_object_focus_highlight_style_set(o, "blank"); elm_object_focus_highlight_style_set(o, "blank");
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
elm_win_resize_object_add(win, o); elm_win_resize_object_add(win, o);
@ -639,6 +640,14 @@ win_add(void)
return win; return win;
} }
void
win_focus(Evas_Object *win)
{
Inf *inf = evas_object_data_get(win, "inf");
elm_object_focus_set(inf->focus, EINA_TRUE);
}
void void
win_title_update(Evas_Object *win) win_title_update(Evas_Object *win)
{ {

View File

@ -5,7 +5,7 @@ typedef struct _Inf Inf;
struct _Inf struct _Inf
{ {
Evas_Object *vid, *lay, *event, *event2, *glayer, *vidthumb, *artimg; Evas_Object *vid, *lay, *event, *event2, *glayer, *vidthumb, *artimg, *focus;
Eina_List *file_list, *file_cur; Eina_List *file_list, *file_cur;
Ecore_Job *next_job; Ecore_Job *next_job;
Ecore_Timer *show_timeout; Ecore_Timer *show_timeout;
@ -46,6 +46,7 @@ void win_video_delete(Evas_Object *win);
Eina_Bool win_video_have_next(Evas_Object *win); Eina_Bool win_video_have_next(Evas_Object *win);
Eina_Bool win_video_have_prev(Evas_Object *win); Eina_Bool win_video_have_prev(Evas_Object *win);
Evas_Object *win_add(void); Evas_Object *win_add(void);
void win_focus(Evas_Object *win);
void win_title_update(Evas_Object *win); void win_title_update(Evas_Object *win);
void win_show(Evas_Object *win, int w, int h); void win_show(Evas_Object *win, int w, int h);
void win_art(Evas_Object *win, const char *path); void win_art(Evas_Object *win, const char *path);