[gtk+/wip/attachment-rectangle] x11: set position on map



commit a10a53a369be23102bcebac820f37eb8f307f5c4
Author: William Hua <william hua canonical com>
Date:   Wed Aug 26 13:23:57 2015 +0100

    x11: set position on map
    
    If the attachment rectangle is set before the window is mapped, the
    window's position isn't updated correctly. To fix it, we queue the
    details of the request and set it when the window is mapped.

 gdk/x11/gdkdisplay-x11.c |   16 ++++++++++++++--
 gdk/x11/gdkwindow-x11.c  |   10 +++++++++-
 gdk/x11/gdkwindow-x11.h  |    4 ++++
 3 files changed, 27 insertions(+), 3 deletions(-)
---
diff --git a/gdk/x11/gdkdisplay-x11.c b/gdk/x11/gdkdisplay-x11.c
index f2824b6..df35c5f 100644
--- a/gdk/x11/gdkdisplay-x11.c
+++ b/gdk/x11/gdkdisplay-x11.c
@@ -705,7 +705,10 @@ gdk_x11_display_translate_event (GdkEventTranslator *translator,
             }
 
          if (toplevel)
-            gdk_window_freeze_toplevel_updates (window);
+            {
+              gdk_window_freeze_toplevel_updates (window);
+              toplevel->actually_mapped = FALSE;
+            }
 
           _gdk_x11_window_grab_check_unmap (window, xevent->xany.serial);
         }
@@ -729,7 +732,16 @@ gdk_x11_display_translate_event (GdkEventTranslator *translator,
                                         0);
 
          if (toplevel)
-           gdk_window_thaw_toplevel_updates (window);
+           {
+             if (toplevel->move_on_map)
+               {
+                 gdk_window_move (window, toplevel->initial_position.x, toplevel->initial_position.y);
+                 toplevel->move_on_map = FALSE;
+               }
+
+             toplevel->actually_mapped = TRUE;
+             gdk_window_thaw_toplevel_updates (window);
+           }
        }
 
       break;
diff --git a/gdk/x11/gdkwindow-x11.c b/gdk/x11/gdkwindow-x11.c
index 30750e1..9018185 100644
--- a/gdk/x11/gdkwindow-x11.c
+++ b/gdk/x11/gdkwindow-x11.c
@@ -5687,6 +5687,7 @@ gdk_x11_window_set_attachment_rectangle (GdkWindow            *window,
                                          const GdkRectangle   *rect,
                                          GdkAttachmentOptions  options)
 {
+  GdkWindowImplX11 *impl = GDK_WINDOW_IMPL_X11 (window->impl);
   gint x;
   gint y;
 
@@ -5719,7 +5720,14 @@ gdk_x11_window_set_attachment_rectangle (GdkWindow            *window,
       y += origin->y;
     }
 
-  gdk_window_move (window, x, y);
+  if (impl->toplevel && !impl->toplevel->actually_mapped)
+    {
+      impl->toplevel->initial_position.x = x;
+      impl->toplevel->initial_position.y = y;
+      impl->toplevel->move_on_map = TRUE;
+    }
+  else
+    gdk_window_move (window, x, y);
 }
 
 static void
diff --git a/gdk/x11/gdkwindow-x11.h b/gdk/x11/gdkwindow-x11.h
index 2bc2417..da94d69 100644
--- a/gdk/x11/gdkwindow-x11.h
+++ b/gdk/x11/gdkwindow-x11.h
@@ -147,6 +147,10 @@ struct _GdkToplevelX11
   guint pending_counter_value_is_extended : 1;
   guint configure_counter_value_is_extended : 1;
 
+  guint actually_mapped : 1;
+  guint move_on_map : 1;
+  GdkPoint initial_position;
+
   gulong map_serial;   /* Serial of last transition from unmapped */
   
   cairo_surface_t *icon_pixmap;


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