On 04/27/13 02:35, Sandro Mani wrote: > Hello, > > I have a GtkDrawingArea inside a GtkViewport, and I have a callback > connected to the "size-allocate" signal of the GtkViewport which resizes > the GtkDrawingArea by calling gtk_widget_set_size_request on the latter, > see sample source code below. > > I however notice that the GtkDrawingArea allocates the requested size > only the _next_ time the allocation of the GtkViewport changes, and > hence the allocation of the GtkDrawingArea is the one requested for the > previous allocation of the GtkViewport. > > The issue is best visible when maximizing and unmaximizing the window: > when maximizing, the size of the GtkDrawingArea is still the one for the > unmaximized state, and when unmaximizing again, the size of the > GtkDrawingArea is the one for the maximized state. > > Question: Is this a mistake in my code or a Gtk bug? I'm using > gtk3-3.8.1-1.fc20.x86_64
Seems you could fix it by setting GTK_RESIZE_IMMEDIATE as resize mode on the viewport, although it seems to be deprecated. I'm not sure what's the proper/recommended way to go it instead, but instead of calling gtk_widget_queue_resize() and the gtk_main_iteration() loop in resize_drawarea() you could call gtk_container_resize_children() (on the viewport). Although, since it triggers a new size-allocate, it might be a good idea to block your handler to avoid it getting triggered again. -j > Thanks for any inputs. > > Sandro > > ------ Sample code: ------ > // gcc alloc.c -o alloc $(pkg-config --cflags --libs gtk+-3.0) > #include <gtk/gtk.h> > #include <stdio.h> > > void resize_drawarea (GtkWidget* viewport, GdkRectangle* rect, gpointer > data) > { > gtk_widget_set_size_request (GTK_WIDGET (data), rect->width / 2, > rect->height / 2); > gtk_widget_queue_resize (GTK_WIDGET (data)); > printf("set_size_request(%d, %d)\n", rect->width /2, rect->height / 2); > // Wait for size_request > while (gtk_events_pending ()) { > gtk_main_iteration (); > } > int w = gtk_widget_get_allocated_width (GTK_WIDGET (data)); > int h = gtk_widget_get_allocated_height (GTK_WIDGET (data)); > printf("allocation = %d x %d\n\n", w, h); > } > > int main(int argc, char* argv[]) > { > gtk_init (&argc, &argv); > GtkWidget* window = gtk_window_new (GTK_WINDOW_TOPLEVEL); > GtkWidget* viewport = gtk_viewport_new (NULL, NULL); > GtkWidget* drawarea = gtk_drawing_area_new (); > > gtk_container_add (GTK_CONTAINER (window), viewport); > gtk_container_add (GTK_CONTAINER (viewport), drawarea); > > gtk_widget_set_halign (drawarea, GTK_ALIGN_CENTER); > gtk_widget_set_valign (drawarea, GTK_ALIGN_CENTER); > GdkRGBA black = {0., 0., 0., 1.}; > gtk_widget_override_background_color (drawarea, GTK_STATE_FLAG_NORMAL, > &black); > gtk_window_set_default_size (GTK_WINDOW (window), 640, 480); > > g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); > g_signal_connect (viewport, "size-allocate", G_CALLBACK > (resize_drawarea), drawarea); > > gtk_widget_show_all (window); > gtk_main (); > return 0; > } > > _______________________________________________ > gtk-app-devel-list mailing list > gtk-app-devel-list@gnome.org > https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list _______________________________________________ gtk-app-devel-list mailing list gtk-app-devel-list@gnome.org https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list