diff options
author | Ivan Molodetskikh <yalterz@gmail.com> | 2023-03-05 10:20:31 -0800 |
---|---|---|
committer | Ivan Molodetskikh <yalterz@gmail.com> | 2023-03-14 19:41:44 -0700 |
commit | e041646bfca044f79b0d498a4df59dde4dc66c50 (patch) | |
tree | 27f4758d15adecc8317d14e28d7352943311f2ab /gtk | |
parent | c3dde05d338d78b0f6f1c3d3fb16e47513af4351 (diff) | |
download | gtk+-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.c | 13 |
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); } } |