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.
This commit is contained in:
Marcel Hollerbach 2016-09-24 19:01:37 +02:00
parent fcfc9959c2
commit d8e6fb7820
1 changed files with 28 additions and 33 deletions

View File

@ -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);
}