jackdanielz pushed a commit to branch master.

http://git.enlightenment.org/core/elementary.git/commit/?id=0363553dfced5eb0a8000c3493bf2fb53407f589

commit 0363553dfced5eb0a8000c3493bf2fb53407f589
Author: Thiep Ha <thiep...@gmail.com>
Date:   Fri Sep 18 11:30:23 2015 +0300

    dnd/x11: correct coordinates in pos callback
    
    Summary:
    The x, y coordinates in pos callback should be relative to
    the top-left of the object.
    This patch corrects the x,y coordinates and adds poscb to elementary test
    to clearly show the bug case.
    
    Test:
          Run Genlist Dnd Dflt Anim with the change in this patch.
          Drag an item to other genlist and see the printed out item, x, y.
    
    @fix
    
    Reviewers: JackDanielZ
    
    Subscribers: seoz
    
    Differential Revision: https://phab.enlightenment.org/D3063
---
 src/bin/test_dnd.c | 30 ++++++++++++++++++++++++++----
 src/lib/elm_cnp.c  | 11 +++++++++--
 2 files changed, 35 insertions(+), 6 deletions(-)

diff --git a/src/bin/test_dnd.c b/src/bin/test_dnd.c
index 4b6124a..dd24585 100644
--- a/src/bin/test_dnd.c
+++ b/src/bin/test_dnd.c
@@ -217,6 +217,14 @@ _strndup(const char *str, size_t len)
    return ret;
 }
 
+static void
+_gl_poscb(void *data EINA_UNUSED, Evas_Object *obj, Elm_Object_Item *it, 
Evas_Coord x, Evas_Coord y, int xposret, int yposret, Elm_Xdnd_Action action 
EINA_UNUSED)
+{
+   printf("<%s> <%d> obj: %p, item: %p <%s>, x y: %d %d, posret: %d %d\n",
+          __func__, __LINE__, obj, it, elm_object_item_text_get(it),
+          x, y, xposret, yposret);
+}
+
 static Eina_Bool
 _gl_dropcb(void *data EINA_UNUSED, Evas_Object *obj, Elm_Object_Item *it, 
Elm_Selection_Data *ev, int xposret EINA_UNUSED, int yposret)
 {  /* This function is called when data is dropped on the genlist */
@@ -761,18 +769,32 @@ void
 test_dnd_genlist_default_anim(void *data EINA_UNUSED, Evas_Object *obj 
EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    char buf[PATH_MAX];
-   Evas_Object *win, *gl, *bxx;
+   Evas_Object *win, *gl, *bxx, *bx2, *lb;
    int i, j;
 
    win = elm_win_util_standard_add("dnd-genlist-default-anim", 
"DnD-Genlist-Default-Anim");
    elm_win_autodel_set(win, EINA_TRUE);
 
    bxx = elm_box_add(win);
-   elm_box_horizontal_set(bxx, EINA_TRUE);
+   elm_box_horizontal_set(bxx, EINA_FALSE);
    evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    elm_win_resize_object_add(win, bxx);
    evas_object_show(bxx);
 
+   lb = elm_label_add(win);
+   elm_object_text_set(lb, "Drag and drop between genlists with default 
anim.");
+   evas_object_size_hint_min_set(lb, 0, 50);
+   evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, 0.5);
+   evas_object_show(lb);
+   elm_box_pack_end(bxx, lb);
+
+   bx2 = elm_box_add(win);
+   elm_box_horizontal_set(bx2, EINA_TRUE);
+   evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   evas_object_show(bx2);
+   elm_box_pack_end(bxx, bx2);
+
    itc1 = elm_genlist_item_class_new();
    itc1->item_style     = "default";
    itc1->func.text_get = gl_text_get;
@@ -791,7 +813,7 @@ test_dnd_genlist_default_anim(void *data EINA_UNUSED, 
Evas_Object *obj EINA_UNUS
               _gl_item_getcb,
               NULL, NULL,
               NULL, NULL,
-              NULL, NULL,
+              _gl_poscb, NULL,
               _gl_dropcb, NULL);
 
         elm_drag_item_container_add(gl, ANIM_TIME, DRAG_TIMEOUT,
@@ -802,7 +824,7 @@ test_dnd_genlist_default_anim(void *data EINA_UNUSED, 
Evas_Object *obj EINA_UNUS
         //elm_genlist_mode_set(gl, ELM_LIST_LIMIT);
         evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, 
EVAS_HINT_EXPAND);
         evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
-        elm_box_pack_end(bxx, gl);
+        elm_box_pack_end(bx2, gl);
         evas_object_show(gl);
 
         for (i = 0; i < 20; i++)
diff --git a/src/lib/elm_cnp.c b/src/lib/elm_cnp.c
index d9e6c51..00d5aa5 100644
--- a/src/lib/elm_cnp.c
+++ b/src/lib/elm_cnp.c
@@ -1331,10 +1331,13 @@ _x11_dnd_dropable_handle(Dropable *dropable, Evas_Coord 
x, Evas_Coord y, Elm_Xdn
      {
         if (last_dropable == dropable) // same
           {
+             Evas_Coord ox, oy;
+
              cnp_debug("same obj dropable %p\n", dropable->obj);
+             evas_object_geometry_get(dropable->obj, &ox, &oy, NULL, NULL);
              EINA_INLIST_FOREACH_SAFE(dropable->cbs_list, itr, cbs)
                 if ((cbs->types & dropable->last.format) && cbs->poscb)
-                  cbs->poscb(cbs->posdata, dropable->obj, x, y, action);
+                  cbs->poscb(cbs->posdata, dropable->obj, x - ox, y - oy, 
action);
           }
         else
           {
@@ -1367,7 +1370,10 @@ _x11_dnd_dropable_handle(Dropable *dropable, Evas_Coord 
x, Evas_Coord y, Elm_Xdn
      {
         if (dropable) // enter new obj
           {
+             Evas_Coord ox, oy;
+
              cnp_debug("enter %p\n", dropable->obj);
+             evas_object_geometry_get(dropable->obj, &ox, &oy, NULL, NULL);
              dropable->last.in = EINA_TRUE;
              EINA_INLIST_FOREACH_SAFE(dropable->cbs_list, itr, cbs)
                {
@@ -1376,7 +1382,8 @@ _x11_dnd_dropable_handle(Dropable *dropable, Evas_Coord 
x, Evas_Coord y, Elm_Xdn
                        if (cbs->entercb)
                           cbs->entercb(cbs->enterdata, dropable->obj);
                        if (cbs->poscb)
-                          cbs->poscb(cbs->posdata, dropable->obj, x, y, 
action);
+                          cbs->poscb(cbs->posdata, dropable->obj,
+                                     x - ox, y - oy, action);
                     }
                }
           }

-- 


Reply via email to