billiob pushed a commit to branch master.

http://git.enlightenment.org/apps/terminology.git/commit/?id=231ff2514a0369cffd7bee0f7a35ca66c732639a

commit 231ff2514a0369cffd7bee0f7a35ca66c732639a
Author: Boris Faure <bill...@gmail.com>
Date:   Sun May 31 17:38:02 2015 +0200

    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 44a9015..b911526 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 9a10b39..ec0b01e 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 91a5b8b..9ad21da 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);

-- 


Reply via email to