From 231ff2514a0369cffd7bee0f7a35ca66c732639a Mon Sep 17 00:00:00 2001 From: Boris Faure Date: Sun, 31 May 2015 17:38:02 +0200 Subject: [PATCH] fix focus issue with ctxpopup. Closes T2455 --- src/bin/termio.c | 23 +++++++++++++++++++---- src/bin/win.c | 13 +++++++++++++ src/bin/win.h | 2 +- 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/src/bin/termio.c b/src/bin/termio.c index 44a90150..b9115263 100644 --- a/src/bin/termio.c +++ b/src/bin/termio.c @@ -881,13 +881,15 @@ _cb_ctxp_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, Termio *sd = data; EINA_SAFETY_ON_NULL_RETURN(sd); sd->ctxpopup = NULL; - elm_object_focus_set(sd->self, EINA_TRUE); } static void _cb_ctxp_dismissed(void *data EINA_UNUSED, Evas_Object *obj, void *event EINA_UNUSED) { + Termio *sd = data; + EINA_SAFETY_ON_NULL_RETURN(sd); + sd->ctxpopup = NULL; evas_object_del(obj); } @@ -895,7 +897,12 @@ static void _cb_ctxp_link_preview(void *data, Evas_Object *obj, void *event EINA_UNUSED) { Evas_Object *term = data; + Termio *sd = evas_object_smart_data_get(term); + EINA_SAFETY_ON_NULL_RETURN(sd); + _activate_link(term, EINA_TRUE); + + sd->ctxpopup = NULL; evas_object_del(obj); } @@ -903,7 +910,11 @@ static void _cb_ctxp_link_open(void *data, Evas_Object *obj, void *event EINA_UNUSED) { Evas_Object *term = data; + Termio *sd = evas_object_smart_data_get(term); + EINA_SAFETY_ON_NULL_RETURN(sd); _activate_link(term, EINA_FALSE); + + sd->ctxpopup = NULL; evas_object_del(obj); } @@ -915,6 +926,8 @@ _cb_ctxp_link_copy(void *data, Evas_Object *obj, void *event EINA_UNUSED) EINA_SAFETY_ON_NULL_RETURN(sd); EINA_SAFETY_ON_NULL_RETURN(sd->link.string); _take_selection_text(sd, ELM_SEL_TYPE_CLIPBOARD, sd->link.string); + + sd->ctxpopup = NULL; evas_object_del(obj); } @@ -3398,8 +3411,6 @@ _smart_cb_focus_out(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, Termio *sd = evas_object_smart_data_get(data); EINA_SAFETY_ON_NULL_RETURN(sd); - if (sd->ctxpopup) return; /* ctxp triggers focus out we should ignore */ - edje_object_signal_emit(sd->cursor.obj, "focus,out", "terminology"); if (!sd->win) return; sd->pty->selection.last_click = 0; @@ -3412,6 +3423,7 @@ _smart_cb_focus_out(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, ecore_imf_context_input_panel_hide(sd->khdl.imf); } _remove_links(sd, obj); + term_unfocus(sd->term); } static void @@ -3921,7 +3933,11 @@ _handle_mouse_down_single_click(Termio *sd, static void _cb_ctxp_sel_copy(void *data, Evas_Object *obj, void *event EINA_UNUSED) { + Evas_Object *term = data; + Termio *sd = evas_object_smart_data_get(term); + termio_take_selection(data, ELM_SEL_TYPE_CLIPBOARD); + sd->ctxpopup = NULL; evas_object_del(obj); } @@ -3929,7 +3945,6 @@ static void _handle_right_click(Evas_Object *obj, Evas_Event_Mouse_Down *ev, Termio *sd, int cx, int cy) { - elm_object_focus_set(obj, EINA_TRUE); if (_mouse_in_selection(sd, cx, cy)) { Evas_Object *ctxp; diff --git a/src/bin/win.c b/src/bin/win.c index 9a10b390..ec0b01e1 100644 --- a/src/bin/win.c +++ b/src/bin/win.c @@ -459,6 +459,7 @@ static Eina_Bool _win_is_focused(Win *wn) { Term_Container *tc; + if (!wn) return EINA_FALSE; @@ -2671,6 +2672,18 @@ _term_focus(Term *term) tc->focus(tc, tc); } +void +term_unfocus(Term *term) +{ + Term_Container *tc; + + if (!_term_is_focused(term)) + return; + + tc = term->container; + tc->unfocus(tc, tc); +} + Term * term_prev_get(Term *term) { diff --git a/src/bin/win.h b/src/bin/win.h index 91a5b8b3..9ad21da3 100644 --- a/src/bin/win.h +++ b/src/bin/win.h @@ -9,7 +9,7 @@ typedef struct _Term Term; Eina_Bool main_term_popup_exists(const Term *term); -void main_term_focus(Term *term); +void term_unfocus(Term *term); Evas_Object *main_term_evas_object_get(Term *term); Evas_Object *term_miniview_get(Term *term);