summaryrefslogtreecommitdiff
path: root/gtk/gtkdnd.c
diff options
context:
space:
mode:
authorOwen Taylor <otaylor@redhat.com>2003-07-06 16:13:11 +0000
committerOwen Taylor <otaylor@src.gnome.org>2003-07-06 16:13:11 +0000
commitd7226f50e6d0babb2490400993a58d35d84d8b9b (patch)
treeaf90bc663c6f26d282c4df8f65d43ef832913036 /gtk/gtkdnd.c
parente9b612a8a113b034afaa32cb1eb2f42151d03778 (diff)
downloadgtk+-d7226f50e6d0babb2490400993a58d35d84d8b9b.tar.gz
Move default icon creation here, so that we have an icon at the start of
Sun Jul 6 11:56:48 2003 Owen Taylor <otaylor@redhat.com> * gtk/gtkdnd.c (gtk_drag_begin_internal): Move default icon creation here, so that we have an icon at the start of the drag (e.g., when retrieving the window cache information.)
Diffstat (limited to 'gtk/gtkdnd.c')
-rw-r--r--gtk/gtkdnd.c139
1 files changed, 80 insertions, 59 deletions
diff --git a/gtk/gtkdnd.c b/gtk/gtkdnd.c
index f9594847ac..2d6bb1ced9 100644
--- a/gtk/gtkdnd.c
+++ b/gtk/gtkdnd.c
@@ -1812,24 +1812,16 @@ gtk_drag_dest_drop (GtkWidget *widget,
* Source side *
***************/
-/*************************************************************
- * gtk_drag_begin: Start a drag operation
- *
- * arguments:
- * widget: Widget from which drag starts
- * handlers: List of handlers to supply the data for the drag
- * button: Button user used to start drag
- * time: Time of event starting drag
- *
- * results:
- *************************************************************/
-
-GdkDragContext *
-gtk_drag_begin (GtkWidget *widget,
- GtkTargetList *target_list,
- GdkDragAction actions,
- gint button,
- GdkEvent *event)
+/* Like GtkDragBegin, but also takes a GtkDragSourceSite,
+ * so that we can set the icon from the source site information
+ */
+static GdkDragContext *
+gtk_drag_begin_internal (GtkWidget *widget,
+ GtkDragSourceSite *site,
+ GtkTargetList *target_list,
+ GdkDragAction actions,
+ gint button,
+ GdkEvent *event)
{
GtkDragSourceInfo *info;
GList *targets = NULL;
@@ -1840,10 +1832,6 @@ gtk_drag_begin (GtkWidget *widget,
GtkWidget *ipc_widget;
GdkCursor *cursor;
- g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
- g_return_val_if_fail (GTK_WIDGET_REALIZED (widget), NULL);
- g_return_val_if_fail (target_list != NULL, NULL);
-
ipc_widget = gtk_drag_get_ipc_widget (gtk_widget_get_screen (widget));
gtk_drag_get_event_actions (event, button, actions,
@@ -1925,7 +1913,42 @@ gtk_drag_begin (GtkWidget *widget,
g_signal_emit_by_name (widget, "drag_begin",
info->context);
-
+
+ /* Ensure that we have an icon before we start the drag; the
+ * application may have set one in ::drag_begin, or it may
+ * not have set one.
+ */
+ if (!info->icon_window)
+ {
+ if (!site || site->icon_type == GTK_IMAGE_EMPTY)
+ gtk_drag_set_icon_default (context);
+ else
+ switch (site->icon_type)
+ {
+ case GTK_IMAGE_PIXMAP:
+ gtk_drag_set_icon_pixmap (context,
+ site->colormap,
+ site->icon_data.pixmap.pixmap,
+ site->icon_mask,
+ -2, -2);
+ break;
+ case GTK_IMAGE_PIXBUF:
+ gtk_drag_set_icon_pixbuf (context,
+ site->icon_data.pixbuf.pixbuf,
+ -2, -2);
+ break;
+ case GTK_IMAGE_STOCK:
+ gtk_drag_set_icon_stock (context,
+ site->icon_data.stock.stock_id,
+ -2, -2);
+ break;
+ case GTK_IMAGE_EMPTY:
+ default:
+ g_assert_not_reached();
+ break;
+ }
+ }
+
if (event && event->type == GDK_MOTION_NOTIFY)
gtk_drag_motion_cb (info->ipc_widget, (GdkEventMotion *)event, info);
@@ -1949,6 +1972,37 @@ gtk_drag_begin (GtkWidget *widget,
return info->context;
}
+/**
+ * gtk_drag_begin:
+ * @widget: the source widget.
+ * @target_list: The targets (data formats) in which the
+ * source can provide the data.
+ * @actions: A bitmask of the allowed drag actions for this drag.
+ * @button: The button the user clicked to start the drag.
+ * @event: The event that triggered the start of the drag.
+ *
+ * Initiates a drag on the source side. The function
+ * only needs to be used when the application is
+ * starting drags itself, and is not needed when
+ * gtk_drag_source_set() is used.
+ *
+ * Return value: the context for this drag.
+ **/
+GdkDragContext *
+gtk_drag_begin (GtkWidget *widget,
+ GtkTargetList *target_list,
+ GdkDragAction actions,
+ gint button,
+ GdkEvent *event)
+{
+ g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
+ g_return_val_if_fail (GTK_WIDGET_REALIZED (widget), NULL);
+ g_return_val_if_fail (target_list != NULL, NULL);
+
+ return gtk_drag_begin_internal (widget, NULL, target_list,
+ actions, button, event);
+}
+
/*************************************************************
* gtk_drag_source_set:
* Register a drop site, and possibly add default behaviors.
@@ -2888,45 +2942,12 @@ gtk_drag_source_event_cb (GtkWidget *widget,
if (gtk_drag_check_threshold (widget, site->x, site->y,
event->motion.x, event->motion.y))
{
- GtkDragSourceInfo *info;
GdkDragContext *context;
site->state = 0;
- context = gtk_drag_begin (widget, site->target_list,
- site->actions,
- i, event);
-
- info = gtk_drag_get_source_info (context, FALSE);
-
- if (!info->icon_window)
- {
- switch (site->icon_type)
- {
- case GTK_IMAGE_EMPTY:
- gtk_drag_set_icon_default (context);
- break;
- case GTK_IMAGE_PIXMAP:
- gtk_drag_set_icon_pixmap (context,
- site->colormap,
- site->icon_data.pixmap.pixmap,
- site->icon_mask,
- -2, -2);
- break;
- case GTK_IMAGE_PIXBUF:
- gtk_drag_set_icon_pixbuf (context,
- site->icon_data.pixbuf.pixbuf,
- -2, -2);
- break;
- case GTK_IMAGE_STOCK:
- gtk_drag_set_icon_stock (context,
- site->icon_data.stock.stock_id,
- -2, -2);
- break;
- default:
- g_assert_not_reached();
- break;
- }
- }
+ context = gtk_drag_begin_internal (widget, site, site->target_list,
+ site->actions,
+ i, event);
retval = TRUE;
}