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
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