forked from AuroraMiddleware/gtk
dragdest: Clean up internals
Remove the no-longer needed GtkDragDest struct and just attach the GtkDropTarget directly.
This commit is contained in:
parent
58106af54d
commit
e1f74c8f69
48
gtk/gtkdnd.c
48
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);
|
||||
}
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user