discomfitor pushed a commit to branch master.

commit b23fbc392b57771be5b9997624854375edd40f89
Author: Mike Blumenkrantz <[email protected]>
Date:   Wed Jun 19 08:03:53 2013 +0100

    more accurate link mouse-out detection, fix teamwork signals, update 
teamwork to new api
---
 src/bin/dbus.c   | 44 ++++++++++++++++++--------------------------
 src/bin/dbus.h   |  5 +++--
 src/bin/termio.c | 49 ++++++++++++++++++++++++++++++-------------------
 3 files changed, 51 insertions(+), 47 deletions(-)

diff --git a/src/bin/dbus.c b/src/bin/dbus.c
index f8d91a2..31a8820 100644
--- a/src/bin/dbus.c
+++ b/src/bin/dbus.c
@@ -9,7 +9,7 @@ static Eldbus_Object *ty_e_object = NULL;
 static Eina_Stringshare *_current_url = NULL;
 
 void
-_cleanup_current_url(void)
+ty_dbus_link_hide(void)
 {
    Eldbus_Message *msg;
 
@@ -18,62 +18,54 @@ _cleanup_current_url(void)
    msg = eldbus_message_method_call_new("org.enlightenment.wm.service",
                                         "/org/enlightenment/wm/RemoteObject",
                                         "org.enlightenment.wm.Teamwork",
-                                        "LinkMouseOut");
+                                        "LinkHide");
 
-   eldbus_message_arguments_append(msg, "suii",
-                                   _current_url, time(NULL), 0, 0);
+   eldbus_message_arguments_append(msg, "s", _current_url);
    eldbus_object_send(ty_e_object, msg, NULL, NULL, -1);
 
-   eina_stringshare_del(_current_url);
-   _current_url = NULL;
+   eina_stringshare_replace(&_current_url, NULL);
 }
 
 void
-ty_dbus_link_mouseout(const char *url, int x, int y)
+ty_dbus_link_mouseout(int64_t win, const char *url, int x, int y)
 {
    Eldbus_Message *msg;
 
    if (!ty_e_object) return;
 
-   if ((!url) ||
-       ((_current_url) && (!strcmp(url, _current_url))))
-     {
-        _cleanup_current_url();
-        return;
-     }
-
-   _cleanup_current_url();
-
    msg = eldbus_message_method_call_new("org.enlightenment.wm.service",
                                         "/org/enlightenment/wm/RemoteObject",
                                         "org.enlightenment.wm.Teamwork",
                                         "LinkMouseOut");
 
-   eldbus_message_arguments_append(msg, "suii", url, time(NULL), x, y);
+   eldbus_message_arguments_append(msg, "suxii", url, time(NULL), win, x, y);
    eldbus_object_send(ty_e_object, msg, NULL, NULL, -1);
+   eina_stringshare_replace(&_current_url, NULL);
 }
 
 
 void
-ty_dbus_link_mousein(const char *url, int x, int y)
+ty_dbus_link_mousein(int64_t win, const char *url, int x, int y)
 {
    Eldbus_Message *msg;
+   Eina_Stringshare *u;
 
    if (!ty_e_object) return;
 
-   if ((_current_url) && (!strcmp(url, _current_url))) return;
+   u = eina_stringshare_add(url);
+   /* if previous link exists, do MouseOut now */
+   if (_current_url && (u != _current_url))
+     ty_dbus_link_mouseout(win, _current_url, x, y);
+   eina_stringshare_del(_current_url);
+   _current_url = u;
 
    msg = eldbus_message_method_call_new("org.enlightenment.wm.service",
                                         "/org/enlightenment/wm/RemoteObject",
                                         "org.enlightenment.wm.Teamwork",
                                         "LinkMouseIn");
 
-   _cleanup_current_url();
-
-   _current_url = eina_stringshare_add(url);
-
-   eldbus_message_arguments_append(msg, "suii",
-                                   _current_url, time(NULL), x, y);
+   eldbus_message_arguments_append(msg, "suxii",
+                                   _current_url, time(NULL), win, x, y);
    eldbus_object_send(ty_e_object, msg, NULL, NULL, -1);
 }
 
@@ -93,7 +85,7 @@ ty_dbus_init(void)
 void
 ty_dbus_shutdown(void)
 {
-   _cleanup_current_url();
+   ty_dbus_link_hide();
    if (ty_dbus_conn) eldbus_connection_unref(ty_dbus_conn);
    ty_dbus_conn = NULL;
    ty_e_object = NULL;
diff --git a/src/bin/dbus.h b/src/bin/dbus.h
index 811163b..614c9b1 100644
--- a/src/bin/dbus.h
+++ b/src/bin/dbus.h
@@ -1,8 +1,9 @@
 #ifndef _DBUS_H__
 #define _DBUS_H__ 1
 
-void ty_dbus_link_mousein(const char *url, int x, int y);
-void ty_dbus_link_mouseout(const char *url, int x, int y);
+void ty_dbus_link_hide(void);
+void ty_dbus_link_mousein(int64_t win, const char *url, int x, int y);
+void ty_dbus_link_mouseout(int64_t win, const char *url, int x, int y);
 void ty_dbus_init(void);
 void ty_dbus_shutdown(void);
 
diff --git a/src/bin/termio.c b/src/bin/termio.c
index 3b4c985..d7fb7f8 100644
--- a/src/bin/termio.c
+++ b/src/bin/termio.c
@@ -467,6 +467,18 @@ _update_link(Evas_Object *obj, Eina_Bool same_link, 
Eina_Bool same_geom)
                }
              if (sd->link.string)
                {
+                  if ((sd->link.string[0] == '/') || 
(link_is_url(sd->link.string)))
+                    {
+                       Evas_Coord ox, oy;
+                       Ecore_X_Window xwin;
+
+                       evas_object_geometry_get(obj, &ox, &oy, NULL, NULL);
+
+                       ox += sd->mouse.cx * sd->font.chw;
+                       oy += sd->mouse.cy * sd->font.chh;
+                       xwin = elm_win_xwindow_get(sd->win);
+                       ty_dbus_link_mousein(xwin, sd->link.string, ox, oy);
+                    }
                   for (y = sd->link.y1; y <= sd->link.y2; y++)
                     {
                        o = edje_object_add(evas_object_evas_get(obj));
@@ -533,14 +545,14 @@ _smart_mouseover_apply(Evas_Object *obj)
              if ((sd->link.string[0] == '/') || (link_is_url(sd->link.string)))
                {
                   Evas_Coord ox, oy;
-                  int x, y;
+                  Ecore_Window xwin;
 
                   evas_object_geometry_get(obj, &ox, &oy, NULL, NULL);
 
-                  elm_win_screen_position_get(sd->win, &x, &y);
-                  x += ox + sd->mouse.cx * sd->font.chw;
-                  y += ox + sd->mouse.cy * sd->font.chh;
-                  ty_dbus_link_mouseout(sd->link.string, x, y);
+                  ox += sd->mouse.cx * sd->font.chw;
+                  oy += sd->mouse.cy * sd->font.chh;
+                  xwin = elm_win_xwindow_get(sd->win);
+                  ty_dbus_link_mouseout(xwin, sd->link.string, ox, oy);
                }
              free(sd->link.string);
              sd->link.string = NULL;
@@ -558,19 +570,6 @@ _smart_mouseover_apply(Evas_Object *obj)
    if (sd->link.string) free(sd->link.string);
    sd->link.string = s;
 
-   if ((!same_link) && ((s[0] == '/') || (link_is_url(s))))
-     {
-        Evas_Coord ox, oy;
-        int x, y;
-
-        evas_object_geometry_get(obj, &ox, &oy, NULL, NULL);
-
-        elm_win_screen_position_get(sd->win, &x, &y);
-        x += ox + sd->mouse.cx * sd->font.chw;
-        y += ox + sd->mouse.cy * sd->font.chh;
-        ty_dbus_link_mousein(s, x, y);
-     }
-
    if ((x1 == sd->link.x1) && (y1 == sd->link.y1) &&
        (x2 == sd->link.x2) && (y2 == sd->link.y2))
      same_geom = EINA_TRUE;
@@ -3058,8 +3057,20 @@ _smart_cb_mouse_in(void *data, Evas *e __UNUSED__, 
Evas_Object *obj __UNUSED__,
 }
 
 static void
-_smart_cb_mouse_out(void *data, Evas *e __UNUSED__, Evas_Object *obj 
__UNUSED__, void *event __UNUSED__)
+_smart_cb_mouse_out(void *data, Evas *e __UNUSED__, Evas_Object *obj 
__UNUSED__, void *event)
 {
+   Evas_Object *o;
+   Evas_Event_Mouse_Out *ev = event;
+   Termio *sd;
+
+   sd = evas_object_smart_data_get(data);
+   if (!sd) return;
+   if (!sd->link.down.dnd)
+     {
+        EINA_LIST_FREE(sd->link.objs, o)
+          evas_object_del(o);
+     }
+   ty_dbus_link_hide();
    termio_mouseover_suspend_pushpop(data, 1);
 }
 

-- 

------------------------------------------------------------------------------
This SF.net email is sponsored by Windows:

Build for Windows Store.

http://p.sf.net/sfu/windows-dev2dev

Reply via email to