diff options
author | Marcel Hollerbach <marcel-hollerbach@t-online.de> | 2016-09-24 19:01:37 +0200 |
---|---|---|
committer | Marcel Hollerbach <marcel-hollerbach@t-online.de> | 2016-09-24 19:18:21 +0200 |
commit | d8e6fb78207e3373f26db06fe7e9f3cc49f49a13 (patch) | |
tree | 5b7c9eddd64fefbd4cb9c738dbf5f638fa205ced | |
parent | fcfc9959c2356bdd93e3fecb357bb4d5fe82ea36 (diff) | |
download | efl-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.c | 61 |
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); } |