summaryrefslogtreecommitdiff
path: root/gtk/gtkdnd.c
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2005-05-18 05:23:59 +0000
committerMatthias Clasen <matthiasc@src.gnome.org>2005-05-18 05:23:59 +0000
commit77f3189adc4cc609946715abd129ab24d89526d6 (patch)
treef3aca89e9bd5e993b7c07f7738c4ab07e1179e61 /gtk/gtkdnd.c
parentdf1cc88424520f77a2f7ebcd94722cb14b33e0cd (diff)
downloadgtk+-77f3189adc4cc609946715abd129ab24d89526d6.tar.gz
New functions to support themed drag icons. (#116577, Christian Neumair)
2005-05-18 Matthias Clasen <mclasen@redhat.com> * gtk/gtk.symbols: * gtk/gtkdnd.h: * gtk/gtkdnd.c (gtk_drag_source_set_icon_name) (gtk_drag_set_icon_name): New functions to support themed drag icons. (#116577, Christian Neumair)
Diffstat (limited to 'gtk/gtkdnd.c')
-rw-r--r--gtk/gtkdnd.c89
1 files changed, 89 insertions, 0 deletions
diff --git a/gtk/gtkdnd.c b/gtk/gtkdnd.c
index dec51ecff4..db9ccca27f 100644
--- a/gtk/gtkdnd.c
+++ b/gtk/gtkdnd.c
@@ -30,6 +30,8 @@
#include "gdk/gdkkeysyms.h"
#include "gtkdnd.h"
+#include "gtkiconfactory.h"
+#include "gtkicontheme.h"
#include "gtkimage.h"
#include "gtkinvisible.h"
#include "gtkmain.h"
@@ -68,6 +70,7 @@ struct _GtkDragSourceSite
GtkImagePixmapData pixmap;
GtkImagePixbufData pixbuf;
GtkImageStockData stock;
+ GtkImageIconNameData name;
} icon_data;
GdkBitmap *icon_mask;
@@ -2046,6 +2049,11 @@ gtk_drag_begin_internal (GtkWidget *widget,
site->icon_data.stock.stock_id,
-2, -2);
break;
+ case GTK_IMAGE_ICON_NAME:
+ gtk_drag_set_icon_name (context,
+ site->icon_data.name.icon_name,
+ -2, -2);
+ break;
case GTK_IMAGE_EMPTY:
default:
g_assert_not_reached();
@@ -2355,6 +2363,9 @@ gtk_drag_source_unset_icon (GtkDragSourceSite *site)
case GTK_IMAGE_STOCK:
g_free (site->icon_data.stock.stock_id);
break;
+ case GTK_IMAGE_ICON_NAME:
+ g_free (site->icon_data.name.icon_name);
+ break;
default:
g_assert_not_reached();
break;
@@ -2462,6 +2473,34 @@ gtk_drag_source_set_icon_stock (GtkWidget *widget,
site->icon_data.stock.stock_id = g_strdup (stock_id);
}
+/**
+ * gtk_drag_source_set_icon_name:
+ * @widget: a #GtkWidget
+ * @icon_name: name of icon to use
+ *
+ * Sets the icon that will be used for drags from a particular source
+ * to a themed icon. See the docs for #GtkIconTheme for more details.
+ *
+ * Since: 2.8
+ **/
+void
+gtk_drag_source_set_icon_name (GtkWidget *widget,
+ const gchar *icon_name)
+{
+ GtkDragSourceSite *site;
+
+ g_return_if_fail (GTK_IS_WIDGET (widget));
+ g_return_if_fail (icon_name != NULL);
+
+ site = g_object_get_data (G_OBJECT (widget), "gtk-site-data");
+ g_return_if_fail (site != NULL);
+
+ gtk_drag_source_unset_icon (site);
+
+ site->icon_type = GTK_IMAGE_ICON_NAME;
+ site->icon_data.name.icon_name = g_strdup (icon_name);
+}
+
static void
gtk_drag_get_icon (GtkDragSourceInfo *info,
GtkWidget **icon_window,
@@ -2783,6 +2822,56 @@ gtk_drag_set_icon_pixmap (GdkDragContext *context,
}
/**
+ * gtk_drag_set_icon_name:
+ * @context: the context for a drag. (This must be called
+ * with a context for the source side of a drag)
+ * @icon_name: name of icon to use
+ * @hot_x: the X offset of the hotspot within the icon
+ * @hot_y: the Y offset of the hotspot within the icon
+ *
+ * Sets the icon for the window from a named themed icon. See
+ * the docs for #GtkIconTheme for more details. Note that the
+ * size of the icon depends on the icon theme (the icon is
+ * loaded at the symbolic size #GTK_ICON_SIZE_DND), thus
+ * @hot_x and @hot_y have to be used with care.
+ *
+ * Since: 2.8
+ **/
+void
+gtk_drag_set_icon_name (GdkDragContext *context,
+ const gchar *icon_name,
+ gint hot_x,
+ gint hot_y)
+{
+ GdkScreen *screen;
+ GtkSettings *settings;
+ GtkIconTheme *icon_theme;
+ GdkPixbuf *pixbuf;
+ gint width, height, icon_size;
+
+ g_return_if_fail (GDK_IS_DRAG_CONTEXT (context));
+ g_return_if_fail (context->is_source);
+ g_return_if_fail (icon_name != NULL);
+
+ screen = gdk_drawable_get_screen (context->source_window);
+ g_return_if_fail (screen != NULL);
+
+ settings = gtk_settings_get_for_screen (screen);
+ if (gtk_icon_size_lookup_for_settings (settings,
+ GTK_ICON_SIZE_DND,
+ &width, &height))
+ icon_size = MAX (width, height);
+ else
+ icon_size = 32; /* default value for GTK_ICON_SIZE_DND */
+
+ icon_theme = gtk_icon_theme_get_for_screen (screen);
+
+ pixbuf = gtk_icon_theme_load_icon (icon_theme, icon_name,
+ icon_size, 0, NULL);
+ set_icon_stock_pixbuf (context, NULL, pixbuf, hot_x, hot_y);
+}
+
+/**
* gtk_drag_set_icon_default:
* @context: the context for a drag. (This must be called
with a context for the source side of a drag)