Re: 3.8 toplevel resize bug?




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



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]