summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdk/wayland/gdkdevice-wayland.c61
-rw-r--r--gdk/wayland/gdkdnd-wayland.c53
-rw-r--r--gdk/wayland/gdkprivate-wayland.h4
-rw-r--r--gdk/wayland/gdkselection-wayland.c4
4 files changed, 59 insertions, 63 deletions
diff --git a/gdk/wayland/gdkdevice-wayland.c b/gdk/wayland/gdkdevice-wayland.c
index 23197ad54c..9ef8968b75 100644
--- a/gdk/wayland/gdkdevice-wayland.c
+++ b/gdk/wayland/gdkdevice-wayland.c
@@ -707,12 +707,7 @@ data_device_drop (void *data,
local_dnd_owner = gdk_selection_owner_get_for_display (device->display, gdk_drag_get_selection (device->drop_context));
if (local_dnd_owner)
- {
- GdkDragContext *source_context;
-
- source_context = gdk_wayland_drag_context_lookup_by_source_window (local_dnd_owner);
- gdk_wayland_drag_context_undo_grab (source_context);
- }
+ gdk_wayland_device_unset_grab (device->pointer);
_gdk_wayland_drag_context_emit_event (device->drop_context,
GDK_DROP_START, GDK_CURRENT_TIME);
@@ -2103,3 +2098,57 @@ gdk_wayland_device_set_selection (GdkDevice *gdk_device,
wl_data_device_set_selection (device->data_device, source,
_gdk_wayland_display_get_serial (display_wayland));
}
+
+void
+gdk_wayland_device_unset_grab (GdkDevice *gdk_device)
+{
+ GdkWaylandDeviceData *device;
+ GdkEventSequence *sequence;
+ GdkModifierType state;
+ GdkEvent *event;
+ guint button;
+ gdouble x, y;
+
+ device = GDK_WAYLAND_DEVICE (gdk_device)->device;
+ _gdk_wayland_device_get_last_implicit_grab_serial (GDK_WAYLAND_DEVICE (gdk_device), &sequence);
+ gdk_window_get_device_position_double (device->pointer_grab_window,
+ gdk_device, &x, &y, &state);
+
+ if (sequence)
+ {
+ event = gdk_event_new (GDK_TOUCH_END);
+ event->touch.window = g_object_ref (device->pointer_grab_window);
+ event->touch.send_event = TRUE;
+ event->touch.sequence = sequence;
+ event->touch.time = GDK_CURRENT_TIME;
+ event->touch.x = event->touch.x_root = x;
+ event->touch.y = event->touch.y_root = y;
+ }
+ else if (state & (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK | GDK_BUTTON3_MASK))
+ {
+ if (state & GDK_BUTTON1_MASK)
+ button = 1;
+ else if (state & GDK_BUTTON2_MASK)
+ button = 2;
+ else if (state & GDK_BUTTON3_MASK)
+ button = 3;
+ else
+ return;
+
+ event = gdk_event_new (GDK_BUTTON_RELEASE);
+ event->button.window = g_object_ref (device->pointer_grab_window);
+ event->button.send_event = TRUE;
+ event->button.button = button;
+ event->button.time = GDK_CURRENT_TIME;
+ event->button.x = event->button.x_root = x;
+ event->button.y = event->button.y_root = y;
+ }
+ else
+ return;
+
+ device->button_modifiers = 0;
+ gdk_event_set_device (event, gdk_device);
+ gdk_event_set_source_device (event, gdk_device);
+
+ _gdk_wayland_display_deliver_event (gdk_device_get_display (gdk_device), event);
+}
diff --git a/gdk/wayland/gdkdnd-wayland.c b/gdk/wayland/gdkdnd-wayland.c
index 9936e54c49..fea4480c06 100644
--- a/gdk/wayland/gdkdnd-wayland.c
+++ b/gdk/wayland/gdkdnd-wayland.c
@@ -463,59 +463,6 @@ gdk_wayland_drag_context_get_data_source (GdkDragContext *context)
return GDK_WAYLAND_DRAG_CONTEXT (context)->data_source;
}
-void
-gdk_wayland_drag_context_undo_grab (GdkDragContext *context)
-{
- GdkEventSequence *sequence;
- GdkModifierType state;
- GdkDevice *device;
- GdkEvent *event;
- guint button;
- gdouble x, y;
-
- device = gdk_drag_context_get_device (context);
- _gdk_wayland_device_get_last_implicit_grab_serial (GDK_WAYLAND_DEVICE (device), &sequence);
- gdk_window_get_device_position_double (gdk_drag_context_get_source_window (context),
- device, &x, &y, &state);
-
- if (sequence)
- {
- event = gdk_event_new (GDK_TOUCH_END);
- event->touch.window = g_object_ref (gdk_drag_context_get_source_window (context));
- event->touch.send_event = TRUE;
- event->touch.sequence = sequence;
- event->touch.time = GDK_CURRENT_TIME;
- event->touch.x = event->touch.x_root = x;
- event->touch.y = event->touch.y_root = y;
- }
- else if (state & (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK | GDK_BUTTON3_MASK))
- {
- if (state & GDK_BUTTON1_MASK)
- button = 1;
- else if (state & GDK_BUTTON2_MASK)
- button = 2;
- else if (state & GDK_BUTTON3_MASK)
- button = 3;
- else
- return;
-
- event = gdk_event_new (GDK_BUTTON_RELEASE);
- event->button.window = g_object_ref (gdk_drag_context_get_source_window (context));
- event->button.send_event = TRUE;
- event->button.button = button;
- event->button.time = GDK_CURRENT_TIME;
- event->button.x = event->button.x_root = x;
- event->button.y = event->button.y_root = y;
- }
- else
- return;
-
- gdk_event_set_device (event, device);
- gdk_event_set_source_device (event, device);
-
- _gdk_wayland_display_deliver_event (gdk_device_get_display (device), event);
-}
-
GdkWindow *
gdk_wayland_drag_context_get_dnd_window (GdkDragContext *context)
{
diff --git a/gdk/wayland/gdkprivate-wayland.h b/gdk/wayland/gdkprivate-wayland.h
index cd2e171980..beb489a8c0 100644
--- a/gdk/wayland/gdkprivate-wayland.h
+++ b/gdk/wayland/gdkprivate-wayland.h
@@ -125,8 +125,6 @@ GdkDragContext * gdk_wayland_drag_context_lookup_by_data_source (struct wl_dat
GdkDragContext * gdk_wayland_drag_context_lookup_by_source_window (GdkWindow *window);
struct wl_data_source * gdk_wayland_drag_context_get_data_source (GdkDragContext *context);
-void gdk_wayland_drag_context_undo_grab (GdkDragContext *context);
-
void gdk_wayland_drop_context_update_targets (GdkDragContext *context);
void _gdk_wayland_display_create_window_impl (GdkDisplay *display,
@@ -187,6 +185,8 @@ struct wl_data_device * gdk_wayland_device_get_data_device (GdkDevice *gdk_devic
void gdk_wayland_device_set_selection (GdkDevice *gdk_device,
struct wl_data_source *source);
+void gdk_wayland_device_unset_grab (GdkDevice *device);
+
void gdk_wayland_device_unset_touch_grab (GdkDevice *device,
GdkEventSequence *sequence);
diff --git a/gdk/wayland/gdkselection-wayland.c b/gdk/wayland/gdkselection-wayland.c
index 5fc2c210fb..a2b83ba40c 100644
--- a/gdk/wayland/gdkselection-wayland.c
+++ b/gdk/wayland/gdkselection-wayland.c
@@ -651,7 +651,7 @@ data_source_send (void *data,
if (context)
{
- gdk_wayland_drag_context_undo_grab (context);
+ gdk_wayland_device_unset_grab (gdk_drag_context_get_device (context));
_gdk_wayland_drag_context_emit_event (context, GDK_DROP_FINISHED,
GDK_CURRENT_TIME);
}
@@ -679,7 +679,7 @@ data_source_cancelled (void *data,
context = gdk_wayland_drag_context_lookup_by_data_source (source);
if (context)
- gdk_wayland_drag_context_undo_grab (context);
+ gdk_wayland_device_unset_grab (gdk_drag_context_get_device (context));
}
else if (source == wayland_selection->clipboard_source)
gdk_wayland_selection_unset_data_source (display, atoms[ATOM_CLIPBOARD]);