On 04/02/13 18:36, HMRG software wrote:
> 
> Hi all,
> 
> Following is demo code for the 3.8 toplevel window resize bug I described
> in the previous message on this thread. If anyone sees any errors on my
> part, please let me know. I will otherwise file a bug report on this shortly.

I believe there's already one:
https://bugzilla.gnome.org/show_bug.cgi?id=696882
I've also proposed a patch there, which should fix the issue.

-j

> 
> The code displays a small main window with one button. Click it. This
> causes a second small window to appear, also with one button. Click that to
> hide the second window (or click the latter's titlebar window manager window
> delete button if any). Then re-click the button in the first window to
> re-show the second window. The latter reappears, but at a munged size.
> Absolutely nothing was done within my code here to the second window or
> its children between the hide and the re-show. My test platform is 64-bit
> CentOS 6.4, using all the latest/greatest gtk-related packages other than
> pango (still at 1.32.4 because later versions do not build for me ;-(   ).
> The munged resize demonstrated here does not occur under 3.6.2.
> 
> Thanks!
> 
> Roger Davis
> Univ. of Hawaii
> 
> /********** begin code ************/
> #include <stdio.h>
> #include <stdlib.h>
> #include <gtk/gtk.h>
> 
> GtkWidget *mainwin, *rszwin;
> 
> void
> errexit(char *msg)
> {
>       (void) fprintf(stderr, "%s\n", msg);
>       exit(-1);
> }
> 
> gboolean
> windelproc(GtkWidget *w, GdkEvent *evt, gpointer gp)
> {
>       if (w == mainwin) {
>               exit(0);
>               return TRUE;
>       }
>       else if (w == rszwin) {
>               gtk_widget_hide(rszwin);
>               return TRUE;
>       }
> 
>       return FALSE;
> }
> 
> void
> mainopenproc(GtkWidget *w, gpointer gp)
> {
>       gtk_widget_show(rszwin);
> 
>       return;
> }
> 
> void
> rszcloseproc(GtkWidget *w, gpointer gp)
> {
>       gtk_widget_hide(rszwin);
> 
>       return;
> }
> 
> void
> mktoplevelwin(GtkWidget **tlwin, GtkWidget **scrwin, GtkWidget **layout)
> {
>       GtkRequisition grq;
> 
>       *tlwin= *scrwin= *layout= (GtkWidget *) 0;
>       if ((*tlwin= gtk_window_new(GTK_WINDOW_TOPLEVEL)) == (GtkWidget *) 0)
>               errexit("Toplevel window creation error.");
>       if ((*scrwin= gtk_scrolled_window_new(NULL, NULL)) == (GtkWidget *) 0)
>               errexit("Scrolled window window creation error.");
>       gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(*scrwin), 
> GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
>       gtk_container_add(GTK_CONTAINER(*tlwin), *scrwin);
>       if ((*layout= gtk_layout_new((GtkAdjustment *) NULL, (GtkAdjustment *) 
> NULL)) == (GtkWidget *) 0)
>               errexit("Layout creation error.");
>       gtk_container_add(GTK_CONTAINER(*scrwin), *layout);
> 
>       return;
> }
> 
> void
> mkbutton(GtkWidget **b, GtkRequisition *gr, GtkWidget *parent, gint x, gint 
> y, char *label, void (*proc)())
> {
>       *b= (GtkWidget *) 0;
>       if ((*b= gtk_button_new_with_label(label)) == (GtkWidget *) 0)
>               errexit("Button creation error.");
>       g_signal_connect(*b, "clicked", G_CALLBACK(proc), *b);
>       gtk_layout_put(GTK_LAYOUT(parent), *b, x, y);
>       gtk_widget_show_all(*b);
>       gtk_widget_get_preferred_size(*b, gr, NULL);
> 
>       return;
> }
> 
> gint
> main(gint argc, gchar *argv[])
> {
>       GtkWidget *sw, *lo, *b;
>       gint w, h;
>       GtkRequisition grq;
>       GdkGeometry geom;
> 
>       if (gtk_init_check(&argc, &argv) == FALSE)
>               errexit("GTK+ initialization error.");
> 
>       mktoplevelwin(&mainwin, &sw, &lo);
>       g_signal_connect(mainwin, "delete-event", G_CALLBACK(windelproc), 
> (gpointer) mainwin);
>       mkbutton(&b, &grq, lo, 100, 100, "Open Resize Test Window", 
> mainopenproc);
>       w= 100+grq.width+100;
>       h= 100+grq.height+100;
>       gtk_window_set_default_size(GTK_WINDOW(mainwin), w, h);
>       gtk_layout_set_size(GTK_LAYOUT(lo), w, h);
>       geom.max_width= w;
>       geom.max_height= h;
>       gtk_window_set_geometry_hints(GTK_WINDOW(mainwin), NULL, &geom, 
> GDK_HINT_MAX_SIZE);
>       gtk_widget_show_all(sw);
> 
>       mktoplevelwin(&rszwin, &sw, &lo);
>       g_signal_connect(rszwin, "delete-event", G_CALLBACK(windelproc), 
> (gpointer) rszwin);
>       mkbutton(&b, &grq, lo, 100, 100, "Close This Window", rszcloseproc);
>       w= 100+grq.width+100;
>       h= 100+grq.height+100;
>       gtk_window_set_default_size(GTK_WINDOW(rszwin), w, h);
>       gtk_layout_set_size(GTK_LAYOUT(lo), w, h);
>       geom.max_width= w;
>       geom.max_height= h;
>       gtk_window_set_geometry_hints(GTK_WINDOW(rszwin), NULL, &geom, 
> GDK_HINT_MAX_SIZE);
>       gtk_widget_show_all(sw);
>       
>       gtk_widget_show(mainwin);
> 
>       gtk_main();
>       
>       return 0;
> }
> /********** end code ************/
> _______________________________________________
> 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

Reply via email to