billiob pushed a commit to branch master.

http://git.enlightenment.org/apps/terminology.git/commit/?id=2f58445033a9b675b5a34ca0d8d452904dc13477

commit 2f58445033a9b675b5a34ca0d8d452904dc13477
Author: Boris Faure <[email protected]>
Date:   Sun Aug 3 17:24:23 2014 +0200

    fix focus issue due to "mouse_over_focus" conflict. Closes T1380
---
 src/bin/main.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 47 insertions(+), 6 deletions(-)

diff --git a/src/bin/main.c b/src/bin/main.c
index fd0fcc9..3bbe043 100644
--- a/src/bin/main.c
+++ b/src/bin/main.c
@@ -751,18 +751,57 @@ _cb_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj 
EINA_UNUSED, void *eve
    main_win_free(wn);
 }
 
+static Term *
+_find_term_under_mouse(Win *wn)
+{
+   Evas_Coord mx, my;
+   const Eina_List *l;
+   Term *term;
+
+   evas_pointer_canvas_xy_get(evas_object_evas_get(wn->win), &mx, &my);
+
+   EINA_LIST_FOREACH(wn->terms, l, term)
+     {
+        Evas_Coord ox, oy, ow, oh;
+
+        evas_object_geometry_get(term->bg, &ox, &oy, &ow, &oh);
+        if (ELM_RECTS_INTERSECT(ox, oy, ow, oh, mx, my, 1, 1))
+          return term;
+     }
+   return NULL;
+}
+
 static void
-_cb_focus_in(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
+_cb_win_focus_in(void *data, Evas_Object *obj EINA_UNUSED, void *event 
EINA_UNUSED)
 {
    Win *wn = data;
    Term *term;
    Split *sp;
-   
+
    if (!wn->focused) elm_win_urgent_set(wn->win, EINA_FALSE);
    wn->focused = EINA_TRUE;
    if ((wn->cmdbox_up) && (wn->cmdbox))
      elm_object_focus_set(wn->cmdbox, EINA_TRUE);
+
    term = main_win_focused_term_get(wn);
+
+   if ( wn->config->mouse_over_focus )
+     {
+        Term *term_mouse;
+
+        term_mouse = _find_term_under_mouse(wn);
+        if ((term_mouse) && (term_mouse != term))
+          {
+             if (term)
+               {
+                  edje_object_signal_emit(term->bg, "focus,out", 
"terminology");
+                  edje_object_signal_emit(term->base, "focus,out", 
"terminology");
+                  if (!wn->cmdbox_up) elm_object_focus_set(term->term, 
EINA_FALSE);
+               }
+             term = term_mouse;
+          }
+     }
+
    if (!term) return;
    sp = _split_find(wn->win, term->term, NULL);
    if (sp->sel)
@@ -778,11 +817,12 @@ _cb_focus_in(void *data, Evas_Object *obj EINA_UNUSED, 
void *event EINA_UNUSED)
 }
 
 static void
-_cb_focus_out(void *data, Evas_Object *obj EINA_UNUSED, void *event 
EINA_UNUSED)
+_cb_win_focus_out(void *data, Evas_Object *obj EINA_UNUSED,
+                  void *event EINA_UNUSED)
 {
    Win *wn = data;
    Term *term;
-   
+
    wn->focused = EINA_FALSE;
    if ((wn->cmdbox_up) && (wn->cmdbox))
      elm_object_focus_set(wn->cmdbox, EINA_FALSE);
@@ -805,6 +845,7 @@ _cb_term_mouse_in(void *data, Evas *e EINA_UNUSED,
    config = termio_config_get(term->term);
 
    if ((!config) || (!config->mouse_over_focus)) return;
+   if ((!term->wn) || (!term->wn->focused)) return;
 
    term->focused = EINA_TRUE;
 
@@ -2023,8 +2064,8 @@ main_win_new(const char *name, const char *role, const 
char *title,
    elm_object_content_set(wn->conform, o);
    evas_object_show(o);
 
-   evas_object_smart_callback_add(wn->win, "focus,in", _cb_focus_in, wn);
-   evas_object_smart_callback_add(wn->win, "focus,out", _cb_focus_out, wn);
+   evas_object_smart_callback_add(wn->win, "focus,in", _cb_win_focus_in, wn);
+   evas_object_smart_callback_add(wn->win, "focus,out", _cb_win_focus_out, wn);
 
    wins = eina_list_append(wins, wn);
    return wn;

-- 


Reply via email to