diff options
author | Chris Michael <cp.michael@samsung.com> | 2015-01-05 12:05:50 -0500 |
---|---|---|
committer | Chris Michael <cp.michael@samsung.com> | 2015-01-05 12:05:50 -0500 |
commit | 9c5be418e5d20cd408a7eeca9ce068eab3099e53 (patch) | |
tree | 476ab2438fa69b0b42f99cd84a777258860f9d05 | |
parent | 527e6468887e92e539c048dd7b9a42f5af871076 (diff) | |
download | elementary-9c5be418e5d20cd408a7eeca9ce068eab3099e53.tar.gz |
elementary: Fix DnD to work again in wayland
Summary: In order for ecore_wl to start a drag, we need to send the
parent window of the object being dragged. Previous code was not
getting the parent window properly.
NB: This patch also fixes an issue where the data being sent to the
drop callback was being incorrectly sent.
@fix
Signed-off-by: Chris Michael <cp.michael@samsung.com>
-rw-r--r-- | src/lib/elm_cnp.c | 51 |
1 files changed, 25 insertions, 26 deletions
diff --git a/src/lib/elm_cnp.c b/src/lib/elm_cnp.c index 4a9eff8a3..4ef30e839 100644 --- a/src/lib/elm_cnp.c +++ b/src/lib/elm_cnp.c @@ -2901,6 +2901,7 @@ _wl_elm_drag_start(Evas_Object *obj, Elm_Sel_Format format EINA_UNUSED, const ch Evas_Object *icon = NULL; int x, y, x2 = 0, y2 = 0, x3, y3, w = 0, h = 0; const char *types[2] = { "text/uri-list", NULL }; + Ecore_Wl_Window *parent = NULL; _wl_elm_dnd_init(); @@ -2974,8 +2975,28 @@ _wl_elm_drag_start(Evas_Object *obj, Elm_Sel_Format format EINA_UNUSED, const ch _dragx = x3 - x2; _dragy = y3 - y2; - ecore_wl_dnd_drag_start(ecore_wl_input_get(), - elm_win_wl_window_get(obj), + if (elm_widget_is(obj)) + { + Evas_Object *top; + + top = elm_widget_top_get(obj); + if (!top) top = elm_widget_top_get(elm_widget_parent_widget_get(obj)); + if (top && (eo_isa(top, ELM_WIN_CLASS))) + parent = elm_win_wl_window_get(top); + } + if (!parent) + { + Evas *evas; + + if (!(evas = evas_object_evas_get(obj))) + return 0; + if (!(ee = ecore_evas_ecore_evas_get(evas))) + return 0; + + parent = ecore_evas_wayland_window_get(ee); + } + + ecore_wl_dnd_drag_start(ecore_wl_input_get(), parent, elm_win_wl_window_get(dragwin), x3, y3, w, h); @@ -3262,7 +3283,6 @@ _wl_dropable_data_handle(Wl_Cnp_Selection *sel, char *data) { Dropable *drop; unsigned int win = 0; - char *p, *s = NULL, *entrytag; Elm_Selection_Data sdata; static const char *tagstring = "<item absize=240x180 href=file://%s></item>"; @@ -3270,26 +3290,10 @@ _wl_dropable_data_handle(Wl_Cnp_Selection *sel, char *data) win = _wl_elm_widget_window_get(sel->requestwidget); drop = _wl_dropable_find_geom(win, savedtypes.x, savedtypes.y); - p = data; - if ((!strncmp(p, "file:/", 6)) || (p[0] == '/')) - { - int len = 0; - - len = sel->buflen; - if (!strncmp(p, "file:/", 6)) - { - p += 5; - len -= 5; - } - if (!(s = malloc(len + 1))) return; - memcpy(s, p, len); - s[len] = 0; - } - if (savedtypes.textreq) { savedtypes.textreq = 0; - savedtypes.imgfile = s; + savedtypes.imgfile = data; } sdata.x = savedtypes.x; @@ -3305,13 +3309,8 @@ _wl_dropable_data_handle(Wl_Cnp_Selection *sel, char *data) if ((cbs->types & ELM_SEL_FORMAT_MARKUP) && (cbs->types & ELM_SEL_FORMAT_IMAGE)) { - int l = 0; - sdata.format = ELM_SEL_FORMAT_MARKUP; - l = strlen(tagstring) + strlen(savedtypes.imgfile); - entrytag = alloca(l + 1); - snprintf(entrytag, l + 1, tagstring, savedtypes.imgfile); - sdata.data = entrytag; + sdata.data = (char *)savedtypes.imgfile; if (cbs->dropcb) cbs->dropcb(cbs->dropdata, drop->obj, &sdata); ecore_wl_dnd_drag_end(ecore_wl_input_get()); } |