From e1f74c8f69a52452882f2bd5488fc7564332a7c1 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 5 Jan 2020 09:18:47 -0500 Subject: [PATCH] dragdest: Clean up internals Remove the no-longer needed GtkDragDest struct and just attach the GtkDropTarget directly. --- gtk/gtkdnd.c | 48 +++++++------- gtk/gtkdndprivate.h | 10 --- gtk/gtkdragdest.c | 136 +++++++++++++++++---------------------- gtk/gtkdragdestprivate.h | 5 ++ 4 files changed, 88 insertions(+), 111 deletions(-) diff --git a/gtk/gtkdnd.c b/gtk/gtkdnd.c index 788e46513d..71ae8405b5 100644 --- a/gtk/gtkdnd.c +++ b/gtk/gtkdnd.c @@ -345,23 +345,25 @@ gtk_drag_dest_leave (GtkWidget *widget, GdkDrop *drop, guint time) { - GtkDragDestSite *site; + GtkDropTarget *dest; GtkDestDefaults flags; gboolean track_motion; + gboolean armed; - site = g_object_get_data (G_OBJECT (widget), "gtk-drag-dest"); - g_return_if_fail (site != NULL); + dest = gtk_drop_target_get (widget); + g_return_if_fail (dest != NULL); - flags = gtk_drop_target_get_defaults (site->dest); - track_motion = gtk_drop_target_get_track_motion (site->dest); + flags = gtk_drop_target_get_defaults (dest); + track_motion = gtk_drop_target_get_track_motion (dest); + armed = gtk_drop_target_get_armed (dest); - if ((flags & GTK_DEST_DEFAULT_HIGHLIGHT) && site->have_drag) + if ((flags & GTK_DEST_DEFAULT_HIGHLIGHT) && armed) gtk_drag_unhighlight (widget); - if (!(flags & GTK_DEST_DEFAULT_MOTION) || site->have_drag || track_motion) - gtk_drop_target_emit_drag_leave (site->dest, drop, time); + if (!(flags & GTK_DEST_DEFAULT_MOTION) || armed || track_motion) + gtk_drop_target_emit_drag_leave (dest, drop, time); - site->have_drag = FALSE; + gtk_drop_target_set_armed (dest, FALSE); } static gboolean @@ -371,18 +373,18 @@ gtk_drag_dest_motion (GtkWidget *widget, gint y, guint time) { - GtkDragDestSite *site; + GtkDropTarget *dest; GdkDragAction dest_actions; GtkDestDefaults flags; gboolean track_motion; gboolean retval; - site = g_object_get_data (G_OBJECT (widget), "gtk-drag-dest"); - g_return_val_if_fail (site != NULL, FALSE); + dest = gtk_drop_target_get (widget); + g_return_val_if_fail (dest != NULL, FALSE); - dest_actions = gtk_drop_target_get_actions (site->dest); - flags = gtk_drop_target_get_defaults (site->dest); - track_motion = gtk_drop_target_get_track_motion (site->dest); + dest_actions = gtk_drop_target_get_actions (dest); + flags = gtk_drop_target_get_defaults (dest); + track_motion = gtk_drop_target_get_track_motion (dest); if (track_motion || flags & GTK_DEST_DEFAULT_MOTION) { @@ -394,13 +396,13 @@ gtk_drag_dest_motion (GtkWidget *widget, if ((dest_actions & actions) == 0) actions = 0; - target = gtk_drop_target_match (site->dest, drop); + target = gtk_drop_target_match (dest, drop); if (actions && target) { - if (!site->have_drag) + if (!gtk_drop_target_get_armed (dest)) { - site->have_drag = TRUE; + gtk_drop_target_set_armed (dest, TRUE); if (flags & GTK_DEST_DEFAULT_HIGHLIGHT) gtk_drag_highlight (widget); } @@ -415,7 +417,7 @@ gtk_drag_dest_motion (GtkWidget *widget, } } - retval = gtk_drop_target_emit_drag_motion (site->dest, drop, x, y); + retval = gtk_drop_target_emit_drag_motion (dest, drop, x, y); return (flags & GTK_DEST_DEFAULT_MOTION) ? TRUE : retval; } @@ -427,14 +429,14 @@ gtk_drag_dest_drop (GtkWidget *widget, gint y, guint time) { - GtkDragDestSite *site; + GtkDropTarget *dest; GtkDragDestInfo *info; - site = g_object_get_data (G_OBJECT (widget), "gtk-drag-dest"); - g_return_val_if_fail (site != NULL, FALSE); + dest = gtk_drop_target_get (widget); + g_return_val_if_fail (dest != NULL, FALSE); info = gtk_drag_get_dest_info (drop, FALSE); g_return_val_if_fail (info != NULL, FALSE); - return gtk_drop_target_emit_drag_drop (site->dest, drop, x, y); + return gtk_drop_target_emit_drag_drop (dest, drop, x, y); } diff --git a/gtk/gtkdndprivate.h b/gtk/gtkdndprivate.h index 54826d7b0c..ad829e05b7 100644 --- a/gtk/gtkdndprivate.h +++ b/gtk/gtkdndprivate.h @@ -19,18 +19,8 @@ #ifndef __GTK_DND_PRIVATE_H__ #define __GTK_DND_PRIVATE_H__ -#include "gtkdragdest.h" -#include "gtkimagedefinitionprivate.h" -#include "gtkselection.h" #include "gtkwidget.h" -typedef struct _GtkDragDestSite GtkDragDestSite; -struct _GtkDragDestSite -{ - GtkDropTarget *dest; - GtkDestDefaults flags; - guint have_drag : 1; -}; G_BEGIN_DECLS diff --git a/gtk/gtkdragdest.c b/gtk/gtkdragdest.c index 5a4728f117..b8d66334a0 100644 --- a/gtk/gtkdragdest.c +++ b/gtk/gtkdragdest.c @@ -36,77 +36,6 @@ #include "gtkselectionprivate.h" -static void -gtk_drag_dest_realized (GtkWidget *widget) -{ - GtkNative *native = gtk_widget_get_native (widget); - - gdk_surface_register_dnd (gtk_native_get_surface (native)); -} - -static void -gtk_drag_dest_hierarchy_changed (GtkWidget *widget, - GParamSpec *pspec, - gpointer data) -{ - GtkNative *native = gtk_widget_get_native (widget); - - if (native && gtk_widget_get_realized (GTK_WIDGET (native))) - gdk_surface_register_dnd (gtk_native_get_surface (native)); -} - -static void -gtk_drag_dest_site_destroy (gpointer data) -{ - GtkDragDestSite *site = data; - - g_clear_object (&site->dest); - - g_slice_free (GtkDragDestSite, site); -} - -static void -gtk_drag_dest_set_internal (GtkWidget *widget, - GtkDragDestSite *site) -{ - GtkDragDestSite *old_site; - - old_site = g_object_get_data (G_OBJECT (widget), I_("gtk-drag-dest")); - if (old_site) - { - g_signal_handlers_disconnect_by_func (widget, gtk_drag_dest_realized, old_site); - g_signal_handlers_disconnect_by_func (widget, gtk_drag_dest_hierarchy_changed, old_site); - gtk_drop_target_set_track_motion (site->dest, gtk_drop_target_get_track_motion (old_site->dest)); - } - - if (gtk_widget_get_realized (widget)) - gtk_drag_dest_realized (widget); - - g_signal_connect (widget, "realize", G_CALLBACK (gtk_drag_dest_realized), site); - g_signal_connect (widget, "notify::root", G_CALLBACK (gtk_drag_dest_hierarchy_changed), site); - - g_object_set_data_full (G_OBJECT (widget), I_("gtk-drag-dest"), - site, gtk_drag_dest_site_destroy); -} - -static void -gtk_drag_dest_unset (GtkWidget *widget) -{ - GtkDragDestSite *old_site; - - g_return_if_fail (GTK_IS_WIDGET (widget)); - - old_site = g_object_get_data (G_OBJECT (widget), I_("gtk-drag-dest")); - if (old_site) - { - g_signal_handlers_disconnect_by_func (widget, gtk_drag_dest_realized, old_site); - g_signal_handlers_disconnect_by_func (widget, gtk_drag_dest_hierarchy_changed, old_site); - } - - g_object_set_data (G_OBJECT (widget), I_("gtk-drag-dest"), NULL); -} - - /** * SECTION:gtkdroptarget * @Short_description: An object to receive DND drops @@ -131,6 +60,7 @@ struct _GtkDropTarget GtkWidget *widget; GdkDrop *drop; + gboolean armed; }; struct _GtkDropTargetClass @@ -573,6 +503,31 @@ gtk_drop_target_get_track_motion (GtkDropTarget *dest) return dest->track_motion; } +static void +gtk_drag_dest_realized (GtkWidget *widget) +{ + GtkNative *native = gtk_widget_get_native (widget); + + gdk_surface_register_dnd (gtk_native_get_surface (native)); +} + +static void +gtk_drag_dest_hierarchy_changed (GtkWidget *widget, + GParamSpec *pspec, + gpointer data) +{ + GtkNative *native = gtk_widget_get_native (widget); + + if (native && gtk_widget_get_realized (GTK_WIDGET (native))) + gdk_surface_register_dnd (gtk_native_get_surface (native)); +} + +GtkDropTarget * +gtk_drop_target_get (GtkWidget *widget) +{ + return g_object_get_data (G_OBJECT (widget), I_("gtk-drag-dest")); +} + /** * gtk_drop_target_attach: * @dest: (transfer full): a #GtkDropTarget @@ -587,20 +542,28 @@ void gtk_drop_target_attach (GtkDropTarget *dest, GtkWidget *widget) { - GtkDragDestSite *site; + GtkDropTarget *old_dest; g_return_if_fail (GTK_IS_DROP_TARGET (dest)); g_return_if_fail (dest->widget == NULL); g_return_if_fail (GTK_IS_WIDGET (widget)); + old_dest = g_object_get_data (G_OBJECT (widget), I_("gtk-drag-dest")); + if (old_dest) + { + g_signal_handlers_disconnect_by_func (widget, gtk_drag_dest_realized, old_dest); + g_signal_handlers_disconnect_by_func (widget, gtk_drag_dest_hierarchy_changed, old_dest); + } + + if (gtk_widget_get_realized (widget)) + gtk_drag_dest_realized (widget); + dest->widget = widget; - site = g_slice_new0 (GtkDragDestSite); + g_signal_connect (widget, "realize", G_CALLBACK (gtk_drag_dest_realized), dest); + g_signal_connect (widget, "notify::root", G_CALLBACK (gtk_drag_dest_hierarchy_changed), dest); - site->dest = dest; - site->have_drag = FALSE; - - gtk_drag_dest_set_internal (widget, site); + g_object_set_data_full (G_OBJECT (widget), I_("gtk-drag-dest"), dest, g_object_unref); } /** @@ -616,7 +579,11 @@ gtk_drop_target_detach (GtkDropTarget *dest) if (dest->widget) { - gtk_drag_dest_unset (dest->widget); + g_signal_handlers_disconnect_by_func (dest->widget, gtk_drag_dest_realized, dest); + g_signal_handlers_disconnect_by_func (dest->widget, gtk_drag_dest_hierarchy_changed, dest); + + g_object_set_data (G_OBJECT (dest->widget), I_("gtk-drag-dest"), NULL); + dest->widget = NULL; } } @@ -742,6 +709,19 @@ gtk_drop_target_emit_drag_drop (GtkDropTarget *dest, return result; } +void +gtk_drop_target_set_armed (GtkDropTarget *target, + gboolean armed) +{ + target->armed = armed; +} + +gboolean +gtk_drop_target_get_armed (GtkDropTarget *target) +{ + return target->armed; +} + /** * gtk_drag_highlight: (method) * @widget: a widget to highlight diff --git a/gtk/gtkdragdestprivate.h b/gtk/gtkdragdestprivate.h index deb772763f..6341ac579a 100644 --- a/gtk/gtkdragdestprivate.h +++ b/gtk/gtkdragdestprivate.h @@ -40,6 +40,11 @@ gboolean gtk_drop_target_emit_drag_drop (GtkDropTarget *dest, const char * gtk_drop_target_match (GtkDropTarget *dest, GdkDrop *drop); +void gtk_drop_target_set_armed (GtkDropTarget *dest, + gboolean armed); +gboolean gtk_drop_target_get_armed (GtkDropTarget *dest); + +GtkDropTarget *gtk_drop_target_get (GtkWidget *widget); G_END_DECLS