diff --git a/gtk/gtk.h b/gtk/gtk.h index bc401dce40..f6f2030833 100644 --- a/gtk/gtk.h +++ b/gtk/gtk.h @@ -91,6 +91,7 @@ #include #include #include +#include #include #include #include diff --git a/gtk/gtkdragicon.c b/gtk/gtkdragicon.c index 8b6edbbf97..48ac83d3a1 100644 --- a/gtk/gtkdragicon.c +++ b/gtk/gtkdragicon.c @@ -23,6 +23,8 @@ #include "gtkintl.h" #include "gtkwidgetprivate.h" #include "gtkcssnodeprivate.h" +#include "gtknativeprivate.h" +#include "gtkpicture.h" struct _GtkDragIcon @@ -374,6 +376,44 @@ gtk_drag_icon_new (void) return g_object_new (GTK_TYPE_DRAG_ICON, NULL); } +GtkWidget * +gtk_drag_icon_new_for_drag (GdkDrag *drag) +{ + GtkWidget *icon; + + g_return_val_if_fail (GDK_IS_DRAG (drag), NULL); + + icon = g_object_new (GTK_TYPE_DRAG_ICON, NULL); + + gtk_drag_icon_set_surface (GTK_DRAG_ICON (icon), gdk_drag_get_drag_surface (drag)); + + return icon; +} + +void +gtk_drag_icon_set_from_paintable (GdkDrag *drag, + GdkPaintable *paintable, + int hot_x, + int hot_y) +{ + GtkWidget *icon; + GtkWidget *picture; + + gdk_drag_set_hotspot (drag, hot_x, hot_y); + + icon = gtk_drag_icon_new_for_drag (drag); + + picture = gtk_picture_new_for_paintable (paintable); + gtk_picture_set_can_shrink (GTK_PICTURE (picture), FALSE); + gtk_container_add (GTK_CONTAINER (icon), picture); + + g_object_set_data_full (G_OBJECT (drag), + "icon", + g_object_ref_sink (icon), + (GDestroyNotify)gtk_widget_destroy); + gtk_widget_show (icon); +} + void gtk_drag_icon_set_surface (GtkDragIcon *icon, GdkSurface *surface) diff --git a/gtk/gtkdragicon.h b/gtk/gtkdragicon.h new file mode 100644 index 0000000000..416dcd1775 --- /dev/null +++ b/gtk/gtkdragicon.h @@ -0,0 +1,50 @@ +/* + * Copyright © 2020 Matthias Clasen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + * Authors: Benjamin Otte + */ + +#ifndef __GTK_DRAG_ICON_H__ +#define __GTK_DRAG_ICON_H__ + + +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#error "Only can be included directly." +#endif + +#include +#include +#include + + +G_BEGIN_DECLS + +#define GTK_TYPE_DRAG_ICON (gtk_drag_icon_get_type ()) + +G_DECLARE_FINAL_TYPE (GtkDragIcon, gtk_drag_icon, GTK, DRAG_ICON, GtkContainer) + +GDK_AVAILABLE_IN_ALL +GtkWidget * gtk_drag_icon_new_for_drag (GdkDrag *drag); +GDK_AVAILABLE_IN_ALL +void gtk_drag_icon_set_from_paintable (GdkDrag *drag, + GdkPaintable *paintable, + int hot_x, + int hot_y); + +G_END_DECLS + + +#endif /* __GTK_DRAG_ICON_H__ */ diff --git a/gtk/gtkdragiconprivate.h b/gtk/gtkdragiconprivate.h index 507ac908ea..c0fd36a672 100644 --- a/gtk/gtkdragiconprivate.h +++ b/gtk/gtkdragiconprivate.h @@ -26,14 +26,10 @@ #define __GTK_DRAG_ICON_PRIVATE_H__ #include -#include +#include G_BEGIN_DECLS -#define GTK_TYPE_DRAG_ICON (gtk_drag_icon_get_type ()) - -G_DECLARE_FINAL_TYPE (GtkDragIcon, gtk_drag_icon, GTK, DRAG_ICON, GtkContainer) - GtkWidget * gtk_drag_icon_new (void); void gtk_drag_icon_set_surface (GtkDragIcon *icon,