summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcel Hollerbach <marcel-hollerbach@t-online.de>2016-09-24 19:01:37 +0200
committerMarcel Hollerbach <marcel-hollerbach@t-online.de>2016-09-24 19:18:21 +0200
commitd8e6fb78207e3373f26db06fe7e9f3cc49f49a13 (patch)
tree5b7c9eddd64fefbd4cb9c738dbf5f638fa205ced
parentfcfc9959c2356bdd93e3fecb357bb4d5fe82ea36 (diff)
downloadefl-d8e6fb78207e3373f26db06fe7e9f3cc49f49a13.tar.gz
ecore_wl2: utilize the event window_ids
if a dnd operation enters a surface the window_id is clear, so a offer is always specific to a window. If we have a source we try to fetch the id from the focus/prevfocus or keyboardfocus. This fixes dropping into a efl app which never got focus before.
-rw-r--r--src/lib/ecore_wl2/ecore_wl2_dnd.c61
1 files changed, 28 insertions, 33 deletions
diff --git a/src/lib/ecore_wl2/ecore_wl2_dnd.c b/src/lib/ecore_wl2/ecore_wl2_dnd.c
index 31669a73e7..de61fdf4f7 100644
--- a/src/lib/ecore_wl2/ecore_wl2_dnd.c
+++ b/src/lib/ecore_wl2/ecore_wl2_dnd.c
@@ -53,8 +53,27 @@ struct _Ecore_Wl2_Offer
uint32_t serial;
Ecore_Fd_Handler *read;
int ref;
+ unsigned int window_id;
};
+static int
+_win_id_get(Ecore_Wl2_Input *input)
+{
+ int win = 0;
+
+ if (input->focus.pointer)
+ win = input->focus.pointer->id;
+ else if (input->focus.prev_pointer)
+ win = input->focus.prev_pointer->id;
+ else if (input->focus.keyboard)
+ win = input->focus.keyboard->id;
+
+ if (win == 0)
+ ERR("Failed to fetch window id");
+
+ return win;
+}
+
static void
data_source_target_free(void *data EINA_UNUSED, void *event)
{
@@ -124,15 +143,10 @@ data_source_event_emit(Ecore_Wl2_Input *input, int event)
ev = calloc(1, sizeof(Ecore_Wl2_Event_Data_Source_End));
if (!ev) return;
- if (input->focus.pointer)
- ev->win = input->focus.pointer->id;
- else if (input->focus.prev_pointer)
- ev->win = input->focus.prev_pointer->id;
if (input->focus.keyboard)
ev->source = input->focus.keyboard->id;
- if (!ev->win) ev->win = ev->source;
-
+ ev->win = _win_id_get(input);
ev->action = input->data.action;
ecore_event_add(event, ev, NULL, NULL);
@@ -216,6 +230,7 @@ _ecore_wl2_dnd_enter(Ecore_Wl2_Input *input, struct wl_data_offer *offer, struct
}
input->drag->serial = serial;
+ input->drag->window_id = window->id;
if (input->display->wl.data_device_manager_version >=
WL_DATA_OFFER_SET_ACTIONS_SINCE_VERSION)
@@ -234,13 +249,10 @@ emit:
ev = calloc(1, sizeof(Ecore_Wl2_Event_Dnd_Enter));
if (!ev) return;
- ev->win = window->id;
-
if (input->focus.keyboard)
ev->source = input->focus.keyboard->id;
- if (!ev->win) ev->win = ev->source;
-
+ ev->win = input->drag->window_id;
ev->x = x;
ev->y = y;
ev->offer = input->drag;
@@ -267,18 +279,14 @@ _ecore_wl2_dnd_leave(Ecore_Wl2_Input *input)
ev = calloc(1, sizeof(Ecore_Wl2_Event_Dnd_Leave));
if (!ev) return;
- if (input->focus.pointer)
- ev->win = input->focus.pointer->id;
- else if (input->focus.prev_pointer)
- ev->win = input->focus.prev_pointer->id;
if (input->focus.keyboard)
ev->source = input->focus.keyboard->id;
- if (!ev->win) ev->win = ev->source;
-
+ ev->win = input->drag->window_id;
ev->offer = input->drag;
ev->offer->ref++;
+ input->drag->window_id = 0;
ecore_event_add(ECORE_WL2_EVENT_DND_LEAVE, ev, _delay_offer_destroy, ev->offer);
input->drag = NULL;
}
@@ -296,15 +304,10 @@ _ecore_wl2_dnd_motion(Ecore_Wl2_Input *input, int x, int y, uint32_t serial)
input->drag->serial = serial;
- if (input->focus.pointer)
- ev->win = input->focus.pointer->id;
- else if (input->focus.prev_pointer)
- ev->win = input->focus.prev_pointer->id;
if (input->focus.keyboard)
ev->source = input->focus.keyboard->id;
- if (!ev->win) ev->win = ev->source;
-
+ ev->win = input->drag->window_id;
ev->x = x;
ev->y = y;
ev->offer = input->drag;
@@ -320,15 +323,10 @@ _ecore_wl2_dnd_drop(Ecore_Wl2_Input *input)
ev = calloc(1, sizeof(Ecore_Wl2_Event_Dnd_Drop));
if (!ev) return;
- if (input->focus.pointer)
- ev->win = input->focus.pointer->id;
- else if (input->focus.prev_pointer)
- ev->win = input->focus.prev_pointer->id;
if (input->focus.keyboard)
ev->source = input->focus.keyboard->id;
- if (!ev->win) ev->win = ev->source;
-
+ ev->win = input->drag->window_id;
ev->x = input->pointer.sx;
ev->y = input->pointer.sy;
ev->offer = input->drag;
@@ -459,14 +457,11 @@ ecore_wl2_dnd_drag_end(Ecore_Wl2_Input *input)
ev = calloc(1, sizeof(Ecore_Wl2_Event_Dnd_End));
if (!ev) return;
- if (input->focus.pointer)
- ev->win = input->focus.pointer->id;
- else if (input->focus.prev_pointer)
- ev->win = input->focus.prev_pointer->id;
if (input->focus.keyboard)
ev->source = input->focus.keyboard->id;
- if (!ev->win) ev->win = ev->source;
+
+ ev->win = _win_id_get(input);
ecore_event_add(ECORE_WL2_EVENT_DND_END, ev, NULL, NULL);
}