diff options
author | Matthias Clasen <mclasen@redhat.com> | 2018-07-03 01:16:47 +0200 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2018-07-12 13:02:42 +0200 |
commit | db0b9f61ae542fe0087c3df48f89b5367e708e5d (patch) | |
tree | 4a4d37d62a5b483157b9d07c987c5f4e65403ef9 /gdk | |
parent | 63ab52314674c32f3aec228d97fd3c511e1bd448 (diff) | |
download | gtk+-db0b9f61ae542fe0087c3df48f89b5367e708e5d.tar.gz |
dnd: Add a GdkDrag::action property
This lets us drop the ::action-changed signal for the
property change notification. But, can just as well move
the signal class handers which just update the cursor
to the ::action setter. No need to do this in the backends.
Diffstat (limited to 'gdk')
-rw-r--r-- | gdk/gdkdrag.c | 56 | ||||
-rw-r--r-- | gdk/gdkdragprivate.h | 4 | ||||
-rw-r--r-- | gdk/wayland/gdkdnd-wayland.c | 19 | ||||
-rw-r--r-- | gdk/win32/gdkdrag-win32.c | 2 | ||||
-rw-r--r-- | gdk/x11/gdkdnd-x11.c | 48 |
5 files changed, 55 insertions, 74 deletions
diff --git a/gdk/gdkdrag.c b/gdk/gdkdrag.c index 2e8efb8e71..ce8f7cfdc2 100644 --- a/gdk/gdkdrag.c +++ b/gdk/gdkdrag.c @@ -64,6 +64,7 @@ enum { PROP_DEVICE, PROP_DISPLAY, PROP_FORMATS, + PROP_ACTION, N_PROPERTIES }; @@ -71,7 +72,6 @@ enum { CANCEL, DROP_PERFORMED, DND_FINISHED, - ACTION_CHANGED, N_SIGNALS }; @@ -260,6 +260,13 @@ gdk_drag_set_property (GObject *gobject, } break; + case PROP_ACTION: + { + GdkDragAction action = g_value_get_flags (value); + gdk_drag_set_action (drag, action); + } + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); break; @@ -293,6 +300,10 @@ gdk_drag_get_property (GObject *gobject, g_value_set_boxed (value, priv->formats); break; + case PROP_ACTION: + g_value_set_flags (value, drag->action); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); break; @@ -384,6 +395,16 @@ gdk_drag_class_init (GdkDragClass *klass) G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + properties[PROP_ACTION] = + g_param_spec_flags ("action", + "Action", + "The currently selected action", + GDK_TYPE_DRAG_ACTION, + 0, + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS | + G_PARAM_EXPLICIT_NOTIFY); + /** * GdkDrag::cancel: * @drag: The object on which the signal is emitted @@ -432,22 +453,6 @@ gdk_drag_class_init (GdkDragClass *klass) g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); - /** - * GdkDrag::action-changed: - * @drag: The object on which the signal is emitted - * @action: The action currently chosen - * - * A new action is being chosen for the drag operation. - */ - signals[ACTION_CHANGED] = - g_signal_new (g_intern_static_string ("action-changed"), - G_TYPE_FROM_CLASS (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (GdkDragClass, action_changed), - NULL, NULL, - g_cclosure_marshal_VOID__FLAGS, - G_TYPE_NONE, 1, GDK_TYPE_DRAG_ACTION); - g_object_class_install_properties (object_class, N_PROPERTIES, properties); } @@ -617,6 +622,23 @@ gdk_drag_set_actions (GdkDrag *drag, priv->suggested_action = suggested_action; } +void +gdk_drag_set_action (GdkDrag *drag, + GdkDragAction action) +{ + GdkCursor *cursor; + + if (drag->action == action) + return; + + drag->action = action; + + cursor = gdk_drag_get_cursor (drag, action); + gdk_drag_set_cursor (drag, cursor); + + g_object_notify_by_pspec (G_OBJECT (drag), properties[PROP_ACTION]); +} + /** * gdk_drag_get_drag_surface: * @drag: a #GdkDrag diff --git a/gdk/gdkdragprivate.h b/gdk/gdkdragprivate.h index 01a87ef632..ddfac14d38 100644 --- a/gdk/gdkdragprivate.h +++ b/gdk/gdkdragprivate.h @@ -54,8 +54,6 @@ struct _GdkDragClass { gboolean (*handle_event) (GdkDrag *drag, const GdkEvent *event); - void (*action_changed) (GdkDrag *drag, - GdkDragAction action); }; struct _GdkDrag { @@ -76,6 +74,8 @@ void gdk_drag_set_cursor (GdkDrag *drag, void gdk_drag_set_actions (GdkDrag *drag, GdkDragAction actions, GdkDragAction suggested_action); +void gdk_drag_set_action (GdkDrag *drag, + GdkDragAction action); void gdk_drag_cancel (GdkDrag *drag, GdkDragCancelReason reason); diff --git a/gdk/wayland/gdkdnd-wayland.c b/gdk/wayland/gdkdnd-wayland.c index 2339096810..c889e9ee40 100644 --- a/gdk/wayland/gdkdnd-wayland.c +++ b/gdk/wayland/gdkdnd-wayland.c @@ -124,7 +124,7 @@ gdk_wayland_drag_init (GdkWaylandDrag *drag_wayland) drag = GDK_DRAG (drag_wayland); drags = g_list_prepend (drags, drag); - drag->action = GDK_ACTION_COPY; + gdk_drag_set_action (drag, GDK_ACTION_COPY); } static GdkSurface * @@ -160,17 +160,8 @@ gdk_wayland_drag_set_cursor (GdkDrag *drag, { GdkDevice *device = gdk_drag_get_device (drag); - gdk_wayland_seat_set_global_cursor (gdk_device_get_seat (device), cursor); -} - -static void -gdk_wayland_drag_action_changed (GdkDrag *drag, - GdkDragAction action) -{ - GdkCursor *cursor; - - cursor = gdk_drag_get_cursor (drag, action); - gdk_drag_set_cursor (drag, cursor); + if (device != NULL) + gdk_wayland_seat_set_global_cursor (gdk_device_get_seat (device), cursor); } static void @@ -217,7 +208,6 @@ gdk_wayland_drag_class_init (GdkWaylandDragClass *klass) drag_class->set_hotspot = gdk_wayland_drag_set_hotspot; drag_class->drop_done = gdk_wayland_drag_drop_done; drag_class->set_cursor = gdk_wayland_drag_set_cursor; - drag_class->action_changed = gdk_wayland_drag_action_changed; drag_class->drop_performed = gdk_wayland_drag_drop_performed; drag_class->cancel = gdk_wayland_drag_cancel; } @@ -345,8 +335,7 @@ data_source_action (void *data, g_message ("data source action, source = %p action=%x", source, action)); - drag->action = _wl_to_gdk_actions (action); - g_signal_emit_by_name (drag, "action-changed", drag->action); + gdk_drag_set_action (drag, _wl_to_gdk_actions (action)); } static const struct wl_data_source_listener data_source_listener = { diff --git a/gdk/win32/gdkdrag-win32.c b/gdk/win32/gdkdrag-win32.c index 347e0f6f19..ed9c927d25 100644 --- a/gdk/win32/gdkdrag-win32.c +++ b/gdk/win32/gdkdrag-win32.c @@ -1072,7 +1072,7 @@ maybe_emit_action_changed (GdkWin32Drag *drag_win32, if (actions != drag_win32->current_action) { drag_win32->current_action = actions; - g_signal_emit_by_name (GDK_DRAG (drag_win32), "action-changed", actions); + gdk_drag_set_action (GDK_DRAG (drag_win32), actions); } } diff --git a/gdk/x11/gdkdnd-x11.c b/gdk/x11/gdkdnd-x11.c index 383cc09e47..9dd2a442b6 100644 --- a/gdk/x11/gdkdnd-x11.c +++ b/gdk/x11/gdkdnd-x11.c @@ -170,8 +170,6 @@ static void gdk_surface_cache_unref (GdkSurfaceCache *cache); gboolean gdk_x11_drag_handle_event (GdkDrag *drag, const GdkEvent *event); -void gdk_x11_drag_action_changed (GdkDrag *drag, - GdkDragAction action); static GList *drags; static GSList *window_caches; @@ -232,7 +230,6 @@ gdk_x11_drag_class_init (GdkX11DragClass *klass) drag_class->cancel = gdk_x11_drag_cancel; drag_class->drop_performed = gdk_x11_drag_drop_performed; drag_class->handle_event = gdk_x11_drag_handle_event; - drag_class->action_changed = gdk_x11_drag_action_changed; } static void @@ -882,13 +879,8 @@ gdk_x11_drag_handle_status (GdkDisplay *display, action = 0; } - drag->action = xdnd_action_from_atom (display, action); - - if (drag->action != drag_x11->current_action) - { - drag_x11->current_action = drag->action; - g_signal_emit_by_name (drag, "action-changed", drag->action); - } + gdk_drag_set_action (drag, xdnd_action_from_atom (display, action)); + drag_x11->current_action = action; } } @@ -1010,12 +1002,8 @@ send_client_message_async_cb (Window window, window == drag_x11->proxy_xid) { drag_x11->proxy_xid = None; - drag->action = 0; - if (drag->action != drag_x11->current_action) - { - drag_x11->current_action = 0; - g_signal_emit_by_name (drag, "action-changed", 0); - } + gdk_drag_set_action (drag, 0); + drag_x11->current_action = 0; drag_x11->drag_status = GDK_DRAG_STATUS_DRAG; } @@ -1558,17 +1546,13 @@ gdk_x11_drag_drag_motion (GdkDrag *drag, { drag_x11->proxy_xid = None; drag_x11->drop_xid = None; - drag->action = 0; + gdk_drag_set_action (drag, 0); } /* Push a status event, to let the client know that * the drag changed */ - if (drag->action != drag_x11->current_action) - { - drag_x11->current_action = drag->action; - g_signal_emit_by_name (drag, "action-changed", drag->action); - } + drag_x11->current_action = gdk_drag_get_selected_action (drag); } /* Send a drag-motion event */ @@ -1597,15 +1581,11 @@ gdk_x11_drag_drag_motion (GdkDrag *drag, */ if (gdk_content_formats_contain_mime_type (formats, "application/x-rootwindow-drop") || gdk_content_formats_contain_mime_type (formats, "application/x-rootwin-drop")) - drag->action = gdk_drag_get_suggested_action (drag); + gdk_drag_set_action (drag, gdk_drag_get_suggested_action (drag)); else - drag->action = 0; + gdk_drag_set_action (drag, 0); - if (drag->action != drag_x11->current_action) - { - drag_x11->current_action = drag->action; - g_signal_emit_by_name (drag, "action-changed", drag->action); - } + drag_x11->current_action = gdk_drag_get_selected_action (drag); } break; case GDK_DRAG_PROTO_NONE: @@ -2448,13 +2428,3 @@ gdk_x11_drag_handle_event (GdkDrag *drag, return FALSE; } - -void -gdk_x11_drag_action_changed (GdkDrag *drag, - GdkDragAction action) -{ - GdkCursor *cursor; - - cursor = gdk_drag_get_cursor (drag, action); - gdk_drag_set_cursor (drag, cursor); -} |