ecore_wl2: utilize the event window_ids
authorMarcel Hollerbach <marcel-hollerbach@t-online.de>
Sat, 24 Sep 2016 17:01:37 +0000 (19:01 +0200)
committerMarcel Hollerbach <marcel-hollerbach@t-online.de>
Sat, 24 Sep 2016 17:18:21 +0000 (19:18 +0200)
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.

src/lib/ecore_wl2/ecore_wl2_dnd.c

index 31669a7..de61fdf 100644 (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);
 }