summaryrefslogtreecommitdiff
path: root/gtk/gtkdragicon.c
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2023-03-05 10:20:31 -0800
committerIvan Molodetskikh <yalterz@gmail.com>2023-03-14 19:41:44 -0700
commite041646bfca044f79b0d498a4df59dde4dc66c50 (patch)
tree27f4758d15adecc8317d14e28d7352943311f2ab /gtk/gtkdragicon.c
parentc3dde05d338d78b0f6f1c3d3fb16e47513af4351 (diff)
downloadgtk+-e041646bfca044f79b0d498a4df59dde4dc66c50.tar.gz
dragicon: Handle compute-size
Compute our size when requested by the backend. This makes GtkDragIcons actually recompute their size when it changes, instead of getting stuck with the first size and potentially underallocating.
Diffstat (limited to 'gtk/gtkdragicon.c')
-rw-r--r--gtk/gtkdragicon.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/gtk/gtkdragicon.c b/gtk/gtkdragicon.c
index 3d684ecfbc..4035725e25 100644
--- a/gtk/gtkdragicon.c
+++ b/gtk/gtkdragicon.c
@@ -28,6 +28,7 @@
#include "gtkcssnumbervalueprivate.h"
#include "gdk/gdksurfaceprivate.h"
+#include "gdk/gdkdragsurfacesize.h"
/* for the drag icons */
#include "gtkcolorswatchprivate.h"
@@ -184,6 +185,16 @@ surface_render (GdkSurface *surface,
}
static void
+surface_compute_size (GdkDragSurface *surface,
+ GdkDragSurfaceSize *size,
+ GtkWidget *widget)
+{
+ GtkRequisition nat_size;
+ gtk_widget_get_preferred_size (widget, NULL, &nat_size);
+ gdk_drag_surface_size_set_size (size, nat_size.width, nat_size.height);
+}
+
+static void
gtk_drag_icon_realize (GtkWidget *widget)
{
GtkDragIcon *icon = GTK_DRAG_ICON (widget);
@@ -193,6 +204,7 @@ gtk_drag_icon_realize (GtkWidget *widget)
gdk_surface_set_widget (icon->surface, widget);
g_signal_connect (icon->surface, "render", G_CALLBACK (surface_render), widget);
+ g_signal_connect (icon->surface, "compute-size", G_CALLBACK (surface_compute_size), widget);
GTK_WIDGET_CLASS (gtk_drag_icon_parent_class)->realize (widget);
@@ -216,6 +228,7 @@ gtk_drag_icon_unrealize (GtkWidget *widget)
if (icon->surface)
{
g_signal_handlers_disconnect_by_func (icon->surface, surface_render, widget);
+ g_signal_handlers_disconnect_by_func (icon->surface, surface_compute_size, widget);
gdk_surface_set_widget (icon->surface, NULL);
}
}