]> Pileus Git - ~andy/gtk/commitdiff
Update position of toplevels after display reconfiguration
authorKristian Rietveld <kris@gtk.org>
Mon, 26 Oct 2009 08:20:28 +0000 (09:20 +0100)
committerKristian Rietveld <kris@gtk.org>
Mon, 26 Oct 2009 08:52:54 +0000 (09:52 +0100)
We have to do this, especially after the screen containing the menubar
has changed.  Such more larger changes in monitor geometry will cause
changes to how monitors are laid out in the root window.  The position
coordinates of the windows will have to be updated to reflect their
position in the new layout.

gdk/quartz/GdkQuartzWindow.c
gdk/quartz/gdkprivate-quartz.h
gdk/quartz/gdkscreen-quartz.c
gdk/quartz/gdkwindow-quartz.c

index d38fe22a148a01d07fbfa8a073f97a3017ed06f6..b43a2beaa4a17c8a3c4e0f9f550f134573c79d4d 100644 (file)
 
 -(void)windowDidMove:(NSNotification *)aNotification
 {
-  NSRect content_rect = [self contentRectForFrameRect:[self frame]];
   GdkWindow *window = [[self contentView] gdkWindow];
   GdkWindowObject *private = (GdkWindowObject *)window;
   GdkEvent *event;
 
-  _gdk_quartz_window_xy_to_gdk_xy (content_rect.origin.x,
-                                   content_rect.origin.y + content_rect.size.height,
-                                   &private->x, &private->y);
+  _gdk_quartz_window_update_position (window);
 
   /* Synthesize a configure event */
   event = gdk_event_new (GDK_CONFIGURE);
index dadec3f54952a42cc66b8a8031eaedb5d2397f95..d7196b251ae4423b9ac2496ded15e740a3ccba0b 100644 (file)
@@ -105,7 +105,7 @@ extern GdkDragContext *_gdk_quartz_drag_source_context;
 #define GDK_WINDOW_IS_QUARTZ(win)        (GDK_IS_WINDOW_IMPL_QUARTZ (((GdkWindowObject *)win)->impl))
 
 /* Initialization */
-void _gdk_windowing_update_root_window_size (GdkScreen *screen);
+void _gdk_windowing_update_window_sizes     (GdkScreen *screen);
 void _gdk_windowing_window_init             (void);
 void _gdk_events_init                       (void);
 void _gdk_visual_init                       (void);
@@ -163,6 +163,8 @@ void       _gdk_quartz_window_debug_highlight       (GdkWindow *window,
 void       _gdk_quartz_window_set_needs_display_in_rect (GdkWindow    *window,
                                                          GdkRectangle *rect);
 
+void       _gdk_quartz_window_update_position           (GdkWindow    *window);
+
 /* Events */
 typedef enum {
   GDK_QUARTZ_EVENT_SUBTYPE_EVENTLOOP
index 5c3db27586f75803f5423cd09e2b24d13bae0704..e6579c7cc4c13546bf8a6072e8e0fc9815cc392e 100644 (file)
@@ -177,7 +177,7 @@ process_display_reconfiguration (GdkScreenQuartz *screen)
 
   gdk_screen_quartz_calculate_layout (GDK_SCREEN_QUARTZ (screen));
 
-  _gdk_windowing_update_root_window_size (GDK_SCREEN (screen));
+  _gdk_windowing_update_window_sizes (GDK_SCREEN (screen));
 
   if (screen->emit_monitors_changed)
     {
index a97e3b4f75c86c6c48da21b4727df7212f407bdf..0a851e8475b7298c7eda459dc4048e7b128467a2 100644 (file)
@@ -1089,8 +1089,30 @@ _gdk_window_impl_new (GdkWindow     *window,
 }
 
 void
-_gdk_windowing_update_root_window_size (GdkScreen *screen)
+_gdk_quartz_window_update_position (GdkWindow *window)
 {
+  NSRect frame_rect;
+  NSRect content_rect;
+  GdkWindowObject *private = (GdkWindowObject *)window;
+  GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
+
+  GDK_QUARTZ_ALLOC_POOL;
+
+  frame_rect = [impl->toplevel frame];
+  content_rect = [impl->toplevel contentRectForFrameRect:frame_rect];
+
+  _gdk_quartz_window_xy_to_gdk_xy (content_rect.origin.x,
+                                   content_rect.origin.y + content_rect.size.height,
+                                   &private->x, &private->y);
+
+
+  GDK_QUARTZ_RELEASE_POOL;
+}
+
+void
+_gdk_windowing_update_window_sizes (GdkScreen *screen)
+{
+  GList *windows, *list;
   GdkWindowObject *private = (GdkWindowObject *)_gdk_root;
 
   /* The size of the root window is so that it can contain all
@@ -1106,6 +1128,13 @@ _gdk_windowing_update_root_window_size (GdkScreen *screen)
   private->abs_y = 0;
   private->width = gdk_screen_get_width (screen);
   private->height = gdk_screen_get_height (screen);
+
+  windows = gdk_screen_get_toplevel_windows (screen);
+
+  for (list = windows; list; list = list->next)
+    _gdk_quartz_window_update_position (list->data);
+
+  g_list_free (windows);
 }
 
 void
@@ -1125,7 +1154,7 @@ _gdk_windowing_window_init (void)
 
   impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (_gdk_root)->impl);
 
-  _gdk_windowing_update_root_window_size (_gdk_screen);
+  _gdk_windowing_update_window_sizes (_gdk_screen);
 
   private->state = 0; /* We don't want GDK_WINDOW_STATE_WITHDRAWN here */
   private->window_type = GDK_WINDOW_ROOT;