Re: 3.8 toplevel resize bug?

2013-04-03 Thread HMRG software

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.

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


Re: 3.8 toplevel resize bug?

2013-04-03 Thread jjacky

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