diff options
author | Owen Taylor <otaylor@redhat.com> | 2003-07-06 16:13:11 +0000 |
---|---|---|
committer | Owen Taylor <otaylor@src.gnome.org> | 2003-07-06 16:13:11 +0000 |
commit | d7226f50e6d0babb2490400993a58d35d84d8b9b (patch) | |
tree | af90bc663c6f26d282c4df8f65d43ef832913036 /gtk/gtkdnd.c | |
parent | e9b612a8a113b034afaa32cb1eb2f42151d03778 (diff) | |
download | gdk-pixbuf-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.c | 139 |
1 files changed, 80 insertions, 59 deletions
diff --git a/gtk/gtkdnd.c b/gtk/gtkdnd.c index f9594847a..2d6bb1ced 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; } |