forked from enlightenment/efl
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:
parent
fcfc9959c2
commit
d8e6fb7820
|
@ -53,8 +53,27 @@ struct _Ecore_Wl2_Offer
|
||||||
uint32_t serial;
|
uint32_t serial;
|
||||||
Ecore_Fd_Handler *read;
|
Ecore_Fd_Handler *read;
|
||||||
int ref;
|
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
|
static void
|
||||||
data_source_target_free(void *data EINA_UNUSED, void *event)
|
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));
|
ev = calloc(1, sizeof(Ecore_Wl2_Event_Data_Source_End));
|
||||||
if (!ev) return;
|
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)
|
if (input->focus.keyboard)
|
||||||
ev->source = input->focus.keyboard->id;
|
ev->source = input->focus.keyboard->id;
|
||||||
|
|
||||||
if (!ev->win) ev->win = ev->source;
|
ev->win = _win_id_get(input);
|
||||||
|
|
||||||
ev->action = input->data.action;
|
ev->action = input->data.action;
|
||||||
|
|
||||||
ecore_event_add(event, ev, NULL, NULL);
|
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->serial = serial;
|
||||||
|
input->drag->window_id = window->id;
|
||||||
|
|
||||||
if (input->display->wl.data_device_manager_version >=
|
if (input->display->wl.data_device_manager_version >=
|
||||||
WL_DATA_OFFER_SET_ACTIONS_SINCE_VERSION)
|
WL_DATA_OFFER_SET_ACTIONS_SINCE_VERSION)
|
||||||
|
@ -234,13 +249,10 @@ emit:
|
||||||
ev = calloc(1, sizeof(Ecore_Wl2_Event_Dnd_Enter));
|
ev = calloc(1, sizeof(Ecore_Wl2_Event_Dnd_Enter));
|
||||||
if (!ev) return;
|
if (!ev) return;
|
||||||
|
|
||||||
ev->win = window->id;
|
|
||||||
|
|
||||||
if (input->focus.keyboard)
|
if (input->focus.keyboard)
|
||||||
ev->source = input->focus.keyboard->id;
|
ev->source = input->focus.keyboard->id;
|
||||||
|
|
||||||
if (!ev->win) ev->win = ev->source;
|
ev->win = input->drag->window_id;
|
||||||
|
|
||||||
ev->x = x;
|
ev->x = x;
|
||||||
ev->y = y;
|
ev->y = y;
|
||||||
ev->offer = input->drag;
|
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));
|
ev = calloc(1, sizeof(Ecore_Wl2_Event_Dnd_Leave));
|
||||||
if (!ev) return;
|
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)
|
if (input->focus.keyboard)
|
||||||
ev->source = input->focus.keyboard->id;
|
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 = input->drag;
|
||||||
ev->offer->ref++;
|
ev->offer->ref++;
|
||||||
|
|
||||||
|
input->drag->window_id = 0;
|
||||||
ecore_event_add(ECORE_WL2_EVENT_DND_LEAVE, ev, _delay_offer_destroy, ev->offer);
|
ecore_event_add(ECORE_WL2_EVENT_DND_LEAVE, ev, _delay_offer_destroy, ev->offer);
|
||||||
input->drag = NULL;
|
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;
|
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)
|
if (input->focus.keyboard)
|
||||||
ev->source = input->focus.keyboard->id;
|
ev->source = input->focus.keyboard->id;
|
||||||
|
|
||||||
if (!ev->win) ev->win = ev->source;
|
ev->win = input->drag->window_id;
|
||||||
|
|
||||||
ev->x = x;
|
ev->x = x;
|
||||||
ev->y = y;
|
ev->y = y;
|
||||||
ev->offer = input->drag;
|
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));
|
ev = calloc(1, sizeof(Ecore_Wl2_Event_Dnd_Drop));
|
||||||
if (!ev) return;
|
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)
|
if (input->focus.keyboard)
|
||||||
ev->source = input->focus.keyboard->id;
|
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->x = input->pointer.sx;
|
||||||
ev->y = input->pointer.sy;
|
ev->y = input->pointer.sy;
|
||||||
ev->offer = input->drag;
|
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));
|
ev = calloc(1, sizeof(Ecore_Wl2_Event_Dnd_End));
|
||||||
if (!ev) return;
|
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)
|
if (input->focus.keyboard)
|
||||||
ev->source = input->focus.keyboard->id;
|
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);
|
ecore_event_add(ECORE_WL2_EVENT_DND_END, ev, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue