summaryrefslogtreecommitdiff
path: root/gtk
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
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')
-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);
}
}