changeset 1470:a317c2ec1d4c

On GTK2 gtk_window_move() needs to be called after mapping the window... but before calling gdk_window_get_frame_extents() so do it in another step. Also a couple minor code fixes on GTK2 and GTK3.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Tue, 20 Dec 2011 14:30:10 +0000
parents b9efb744cfbd
children 26dbd11399d6
files gtk/dw.c gtk3/dw.c
diffstat 2 files changed, 36 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/gtk/dw.c	Tue Dec 20 12:44:41 2011 +0000
+++ b/gtk/dw.c	Tue Dec 20 14:30:10 2011 +0000
@@ -2660,6 +2660,7 @@
 {
    int _locked_by_me = FALSE;
    GtkWidget *defaultitem;
+   int x = 0, y = 0;
 #if GTK_MAJOR_VERSION > 1
    GtkWidget *mdi;
 #endif
@@ -2668,6 +2669,12 @@
       return 0;
 
    DW_MUTEX_LOCK;
+   /* GTK 2 needs extra help moving the window after being mapped */
+   if(!GTK_WIDGET_MAPPED(handle))
+   {
+      x = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(handle), "_dw_absolutex"));
+      y = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(handle), "_dw_absolutey"));
+   }
    gtk_widget_show(handle);
 #if GTK_MAJOR_VERSION > 1
    if ((mdi = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(handle), "_dw_mdi")) && GTK_IS_MDI(mdi))
@@ -2676,7 +2683,19 @@
    }
    else
 #endif
-   {
+   if(GTK_IS_WINDOW(handle))
+   {
+      /* Move the window to where it should be so gdk_window_get_frame_extents()
+       * called from dw_window_set_pos() and dw_window_set_size() don't make the 
+       * window appear in a bad location on the screen.
+       */
+      if(x || y)
+      {
+         gtk_window_move(GTK_WINDOW(handle), x, y);
+         /* Clear out the data so we don't do it again */
+         gtk_object_set_data(GTK_OBJECT(handle), "_dw_absolutex", NULL);
+         gtk_object_set_data(GTK_OBJECT(handle), "_dw_absolutey", NULL);
+      }
       if (GTK_WIDGET(handle)->window)
       {
          int width = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(handle), "_dw_width"));
@@ -2695,8 +2714,8 @@
          /* If we had a position request before shown */
          if (gtk_object_get_data(GTK_OBJECT(handle), "_dw_pos"))
          {
-            int x = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(handle), "_dw_x"));
-            int y = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(handle), "_dw_y"));
+            x = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(handle), "_dw_x"));
+            y = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(handle), "_dw_y"));
             
             /* Call the position function again now that we are realized */
             dw_window_set_pos(handle, x, y);
@@ -10387,7 +10406,7 @@
             /* Check to see if there is a pending size request too */
             width = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(handle), "_dw_width"));
             height = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(handle), "_dw_height"));
-            if(width | height)
+            if(!width || !height)
             {
                /* Ask what GTK is planning on suggesting for the window size */
                gtk_window_get_size(GTK_WINDOW(handle), !width ? &width : NULL, !height ? &height : NULL);
@@ -10411,8 +10430,16 @@
             else if((vert & 0xf) == DW_GRAV_BOTTOM)
                newy = gdk_screen_height() - height - x;
          }            
-         /* Finally move the window into place */
-         gtk_window_move(GTK_WINDOW(handle), newx, newy);
+         if(GTK_WIDGET_MAPPED(handle))
+         {
+            /* Finally move the window into place */
+            gtk_window_move(GTK_WINDOW(handle), newx, newy);
+         }
+         else
+         {
+            gtk_object_set_data(GTK_OBJECT(handle), "_dw_absolutex", GINT_TO_POINTER(newx));
+            gtk_object_set_data(GTK_OBJECT(handle), "_dw_absolutey", GINT_TO_POINTER(newy));
+         }
 #else
          gtk_widget_set_uposition(handle, x, y);
 #endif
@@ -10471,7 +10498,7 @@
          /* If it is a toplevel window */
          if(GTK_IS_WINDOW(handle))
          {
-            if(handle->window && gdk_window_is_visible(handle->window))
+            if(handle->window && GTK_WIDGET_MAPPED(handle))
             {
                GdkRectangle frame;
 
--- a/gtk3/dw.c	Tue Dec 20 12:44:41 2011 +0000
+++ b/gtk3/dw.c	Tue Dec 20 14:30:10 2011 +0000
@@ -8759,7 +8759,7 @@
                gdk_window_get_frame_extents(window, &frame);
                width = frame.width;
                height = frame.height;
-            }            
+            }
          }
          else
          {
@@ -8784,7 +8784,7 @@
             /* Check to see if there is a pending size request too */
             width = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(handle), "_dw_width"));
             height = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(handle), "_dw_height"));
-            if(width | height)
+            if(!width || !height)
             {
                /* Ask what GTK is planning on suggesting for the window size */
                gtk_window_get_size(GTK_WINDOW(handle), !width ? &width : NULL, !height ? &height : NULL);