[gtk+] win32: remove _gdk_root global variable



commit 3cd79c11fcd14daf1058077e58a5ff154e09b06c
Author: Paolo Borelli <pborelli gnome org>
Date:   Fri Dec 18 00:36:57 2015 +0100

    win32: remove _gdk_root global variable

 gdk/win32/gdkdevice-win32.c        |   15 +++---
 gdk/win32/gdkdevice-wintab.c       |   11 ++---
 gdk/win32/gdkdevicemanager-win32.c |    7 +--
 gdk/win32/gdkdisplay-win32.c       |    8 +--
 gdk/win32/gdkdnd-win32.c           |    4 +-
 gdk/win32/gdkevents-win32.c        |    4 +-
 gdk/win32/gdkglobals-win32.c       |    1 -
 gdk/win32/gdkprivate-win32.h       |    7 +--
 gdk/win32/gdkproperty-win32.c      |    7 ++-
 gdk/win32/gdkscreen-win32.c        |   66 +++++++++++++++++++++++--
 gdk/win32/gdkwindow-win32.c        |   95 ++++++++++++-----------------------
 11 files changed, 124 insertions(+), 101 deletions(-)
---
diff --git a/gdk/win32/gdkdevice-win32.c b/gdk/win32/gdkdevice-win32.c
index d27034c..167ad4a 100644
--- a/gdk/win32/gdkdevice-win32.c
+++ b/gdk/win32/gdkdevice-win32.c
@@ -175,9 +175,12 @@ gdk_device_win32_query_state (GdkDevice        *device,
                               gdouble          *win_y,
                               GdkModifierType  *mask)
 {
+  GdkScreen *screen;
   POINT point;
   HWND hwnd, hwndc;
 
+  screen = gdk_window_get_screen (window);
+
   hwnd = GDK_WINDOW_HWND (window);
   GetCursorPos (&point);
 
@@ -195,7 +198,7 @@ gdk_device_win32_query_state (GdkDevice        *device,
   if (win_y)
     *win_y = point.y;
 
-  if (window == _gdk_root)
+  if (window == gdk_screen_get_root_window (screen))
     {
       if (win_x)
         *win_x += _gdk_offset_x;
@@ -221,12 +224,7 @@ gdk_device_win32_query_state (GdkDevice        *device,
     }
 
   if (root_window)
-    {
-      GdkScreen *screen;
-
-      screen = gdk_window_get_screen (window);
-      *root_window = gdk_screen_get_root_window (screen);
-    }
+    *root_window = gdk_screen_get_root_window (screen);
 
   if (mask)
     *mask = get_current_mask ();
@@ -322,7 +320,8 @@ _gdk_device_win32_window_at_position (GdkDevice       *device,
             *win_x = screen_pt.x + _gdk_offset_x;
           if (win_y)
             *win_y = screen_pt.y + _gdk_offset_y;
-          return _gdk_root;
+
+          return gdk_get_default_root_window ();
         }
 
       window = gdk_win32_handle_table_lookup (hwnd);
diff --git a/gdk/win32/gdkdevice-wintab.c b/gdk/win32/gdkdevice-wintab.c
index e411bfd..585a6f1 100644
--- a/gdk/win32/gdkdevice-wintab.c
+++ b/gdk/win32/gdkdevice-wintab.c
@@ -184,10 +184,12 @@ gdk_device_wintab_query_state (GdkDevice        *device,
                                GdkModifierType  *mask)
 {
   GdkDeviceWintab *device_wintab;
+  GdkScreen *screen;
   POINT point;
   HWND hwnd, hwndc;
 
   device_wintab = GDK_DEVICE_WINTAB (device);
+  screen = gdk_window_get_screen (window);
 
   hwnd = GDK_WINDOW_HWND (window);
   GetCursorPos (&point);
@@ -206,7 +208,7 @@ gdk_device_wintab_query_state (GdkDevice        *device,
   if (win_y)
     *win_y = point.y;
 
-  if (window == _gdk_root)
+  if (window == gdk_get_default_root_window ())
     {
       if (win_x)
         *win_x += _gdk_offset_x;
@@ -226,12 +228,7 @@ gdk_device_wintab_query_state (GdkDevice        *device,
     }
 
   if (root_window)
-    {
-      GdkScreen *screen;
-
-      screen = gdk_window_get_screen (window);
-      *root_window = gdk_screen_get_root_window (screen);
-    }
+    *root_window = gdk_screen_get_root_window (screen);
 
   if (mask)
     {
diff --git a/gdk/win32/gdkdevicemanager-win32.c b/gdk/win32/gdkdevicemanager-win32.c
index e6a239c..8f38d51 100644
--- a/gdk/win32/gdkdevicemanager-win32.c
+++ b/gdk/win32/gdkdevicemanager-win32.c
@@ -919,7 +919,7 @@ _gdk_input_other_event (GdkEvent  *event,
   device_manager = GDK_DEVICE_MANAGER_WIN32 (gdk_display_get_device_manager (_gdk_display));
   window = gdk_device_get_window_at_position (device_manager->core_pointer, &x, &y);
   if (window == NULL)
-    window = _gdk_root;
+    window = gdk_get_default_root_window ();
 
   g_object_ref (window);
 
@@ -961,7 +961,7 @@ _gdk_input_other_event (GdkEvent  *event,
           window = g_object_ref (last_grab->window);
         }
 
-      if (window == _gdk_root)
+      if (window == gdk_get_default_root_window ())
         {
           GDK_NOTE (EVENTS_OR_INPUT, g_print ("... is root\n"));
           return FALSE;
@@ -1038,8 +1038,7 @@ _gdk_input_other_event (GdkEvent  *event,
         {
           GDK_NOTE (EVENTS_OR_INPUT, g_print ("... not selected\n"));
 
-          if (window->parent == GDK_WINDOW (_gdk_root) ||
-             window->parent == NULL)
+          if (window->parent == gdk_get_default_root_window () || window->parent == NULL)
             return FALSE;
 
           pt.x = x;
diff --git a/gdk/win32/gdkdisplay-win32.c b/gdk/win32/gdkdisplay-win32.c
index c963b52..29d6e60 100644
--- a/gdk/win32/gdkdisplay-win32.c
+++ b/gdk/win32/gdkdisplay-win32.c
@@ -260,7 +260,7 @@ inner_display_change_window_procedure (HWND   hwnd,
     case WM_DISPLAYCHANGE:
       {
         _gdk_monitor_init ();
-        _gdk_root_window_size_init ();
+        _gdk_screen_init_root_window_size (GDK_WIN32_SCREEN (_gdk_screen));
         g_signal_emit_by_name (_gdk_screen, "size_changed");
 
         return 0;
@@ -345,7 +345,7 @@ _gdk_win32_display_open (const gchar *display_name)
 
   _gdk_monitor_init ();
   _gdk_visual_init (_gdk_screen);
-  _gdk_windowing_window_init (_gdk_screen);
+  _gdk_screen_init_root_window (GDK_WIN32_SCREEN (_gdk_screen));
   _gdk_events_init ();
   _gdk_input_init (_gdk_display);
   _gdk_dnd_init ();
@@ -520,9 +520,8 @@ inner_clipboard_window_procedure (HWND   hwnd,
 
         GDK_NOTE (DND, g_print (" \n"));
 
-
         event = gdk_event_new (GDK_OWNER_CHANGE);
-        event->owner_change.window = _gdk_root;
+        event->owner_change.window = gdk_get_default_root_window ();
         event->owner_change.owner = owner;
         event->owner_change.reason = GDK_OWNER_CHANGE_NEW_OWNER;
         event->owner_change.selection = GDK_SELECTION_CLIPBOARD;
@@ -575,7 +574,6 @@ register_clipboard_notification (GdkDisplay *display)
 {
   GdkWin32Display *display_win32 = GDK_WIN32_DISPLAY (display);
   WNDCLASS wclass = { 0, };
-  HWND hwnd;
   ATOM klass;
 
   wclass.lpszClassName = "GdkClipboardNotification";
diff --git a/gdk/win32/gdkdnd-win32.c b/gdk/win32/gdkdnd-win32.c
index 376ea0f..379c80d 100644
--- a/gdk/win32/gdkdnd-win32.c
+++ b/gdk/win32/gdkdnd-win32.c
@@ -728,7 +728,7 @@ idropsource_givefeedback (LPDROPSOURCE This,
   else
     {
       if (ctx->context->dest_window == NULL)
-       ctx->context->dest_window = g_object_ref (_gdk_root);
+        ctx->context->dest_window = g_object_ref (gdk_get_default_root_window ());
     }
 
   return DRAGDROP_S_USEDEFAULTCURSORS;
@@ -1445,7 +1445,7 @@ gdk_dropfiles_filter (GdkXEvent *xev,
       device = gdk_device_manager_get_client_pointer (device_manager);
       gdk_drag_context_set_device (context, device);
 
-      context->source_window = _gdk_root;
+      context->source_window = gdk_get_default_root_window ();
       g_object_ref (context->source_window);
 
       context->dest_window = event->any.window;
diff --git a/gdk/win32/gdkevents-win32.c b/gdk/win32/gdkevents-win32.c
index 77241ad..bb2a2de 100644
--- a/gdk/win32/gdkevents-win32.c
+++ b/gdk/win32/gdkevents-win32.c
@@ -1357,7 +1357,7 @@ propagate (GdkWindow  **window,
        {
          /* Owner doesn't want it, propagate to parent. */
          GdkWindow *parent = gdk_window_get_parent (*window);
-         if (parent == _gdk_root || parent == NULL)
+         if (parent == gdk_get_default_root_window () || parent == NULL)
            {
              /* No parent; check if grabbed */
              if (grab_window != NULL)
@@ -1431,7 +1431,7 @@ _gdk_win32_emit_configure_event (GdkWindow *window)
   point.y = client_rect.top;
 
   /* top level windows need screen coords */
-  if (gdk_window_get_parent (window) == _gdk_root)
+  if (gdk_window_get_parent (window) == gdk_get_default_root_window ())
     {
       ClientToScreen (hwnd, &point);
       point.x += _gdk_offset_x;
diff --git a/gdk/win32/gdkglobals-win32.c b/gdk/win32/gdkglobals-win32.c
index d678e35..c03a230 100644
--- a/gdk/win32/gdkglobals-win32.c
+++ b/gdk/win32/gdkglobals-win32.c
@@ -29,7 +29,6 @@
 
 GdkDisplay      *_gdk_display = NULL;
 GdkScreen       *_gdk_screen = NULL;
-GdkWindow       *_gdk_root = NULL;
 
 gint             _gdk_num_monitors;
 GdkWin32Monitor  *_gdk_monitors = NULL;
diff --git a/gdk/win32/gdkprivate-win32.h b/gdk/win32/gdkprivate-win32.h
index f216d38..a4e6809 100644
--- a/gdk/win32/gdkprivate-win32.h
+++ b/gdk/win32/gdkprivate-win32.h
@@ -38,6 +38,7 @@
 #include <gdk/gdkcursorprivate.h>
 #include <gdk/win32/gdkwindow-win32.h>
 #include <gdk/win32/gdkwin32display.h>
+#include <gdk/win32/gdkwin32screen.h>
 
 #include "gdkinternals.h"
 
@@ -254,8 +255,6 @@ void    _gdk_other_api_failed        (const gchar *where,
 
 extern LRESULT CALLBACK _gdk_win32_window_procedure (HWND, UINT, WPARAM, LPARAM);
 
-extern GdkWindow        *_gdk_root;
-
 extern GdkDisplay       *_gdk_display;
 extern GdkScreen        *_gdk_screen;
 
@@ -545,8 +544,8 @@ void _gdk_win32_emit_configure_event (GdkWindow *window);
 
 /* Initialization */
 void _gdk_win32_windowing_init (void);
-void _gdk_windowing_window_init (GdkScreen *screen);
-void _gdk_root_window_size_init (void);
+void _gdk_screen_init_root_window (GdkWin32Screen *screen_win32);
+void _gdk_screen_init_root_window_size (GdkWin32Screen *screen);
 void _gdk_monitor_init(void);
 void _gdk_visual_init (GdkScreen *screen);
 void _gdk_dnd_init    (void);
diff --git a/gdk/win32/gdkproperty-win32.c b/gdk/win32/gdkproperty-win32.c
index dd98bc8..a393699 100644
--- a/gdk/win32/gdkproperty-win32.c
+++ b/gdk/win32/gdkproperty-win32.c
@@ -293,7 +293,12 @@ _gdk_win32_window_delete_property (GdkWindow *window,
   if (property == _gdk_selection)
     _gdk_selection_property_delete (window);
   else if (property == _wm_transient_for)
-    gdk_window_set_transient_for (window, _gdk_root);
+    {
+      GdkScreen *screen;
+
+      screen = gdk_window_get_screen (window);
+      gdk_window_set_transient_for (window, gdk_screen_get_root_window (screen));
+    }
   else
     {
       prop_name = gdk_atom_name (property);
diff --git a/gdk/win32/gdkscreen-win32.c b/gdk/win32/gdkscreen-win32.c
index c637b95..efbbce0 100644
--- a/gdk/win32/gdkscreen-win32.c
+++ b/gdk/win32/gdkscreen-win32.c
@@ -20,12 +20,16 @@
 #include "gdkprivate-win32.h"
 #include "gdkscreenprivate.h"
 #include "gdkwin32screen.h"
+#include "gdkdisplayprivate.h"
+#include "gdkvisualprivate.h"
 
 #include <dwmapi.h>
 
 struct _GdkWin32Screen
 {
   GdkScreen parent_instance;
+
+  GdkWindow *root_window;
 };
 
 struct _GdkWin32ScreenClass
@@ -36,9 +40,9 @@ struct _GdkWin32ScreenClass
 G_DEFINE_TYPE (GdkWin32Screen, gdk_win32_screen, GDK_TYPE_SCREEN)
 
 static void
-gdk_win32_screen_init (GdkWin32Screen *display)
+gdk_win32_screen_init (GdkWin32Screen *win32_screen)
 {
-  GdkScreen *screen = GDK_SCREEN (display);
+  GdkScreen *screen = GDK_SCREEN (win32_screen);
   HDC screen_dc;
   int logpixelsx = -1;
   const gchar *font_resolution;
@@ -63,6 +67,58 @@ gdk_win32_screen_init (GdkWin32Screen *display)
     _gdk_screen_set_resolution (screen, logpixelsx);
 }
 
+void
+_gdk_screen_init_root_window_size (GdkWin32Screen *screen)
+{
+  GdkRectangle rect;
+  int i;
+
+  rect = _gdk_monitors[0].rect;
+  for (i = 1; i < _gdk_num_monitors; i++)
+    gdk_rectangle_union (&rect, &_gdk_monitors[i].rect, &rect);
+
+  screen->root_window->width = rect.width;
+  screen->root_window->height = rect.height;
+}
+
+void
+_gdk_screen_init_root_window (GdkWin32Screen *screen_win32)
+{
+  GdkScreen *screen;
+  GdkWindow *window;
+  GdkWindowImplWin32 *impl_win32;
+
+  screen = GDK_SCREEN (screen_win32);
+
+  g_assert (screen_win32->root_window == NULL);
+
+  window = _gdk_display_create_window (_gdk_display);
+  window->impl = g_object_new (GDK_TYPE_WINDOW_IMPL_WIN32, NULL);
+  impl_win32 = GDK_WINDOW_IMPL_WIN32 (window->impl);
+  impl_win32->wrapper = window;
+
+  window->impl_window = window;
+  window->visual = gdk_screen_get_system_visual (screen);
+
+  window->window_type = GDK_WINDOW_ROOT;
+  window->depth = window->visual->depth;
+
+  screen_win32->root_window = window;
+
+  _gdk_screen_init_root_window_size (screen_win32);
+
+  window->x = 0;
+  window->y = 0;
+  window->abs_x = 0;
+  window->abs_y = 0;
+  /* width and height already initialised in _gdk_screen_init_root_window_size() */
+  window->viewable = TRUE;
+
+  gdk_win32_handle_table_insert ((HANDLE *) &impl_win32->handle, window);
+
+  GDK_NOTE (MISC, g_print ("screen->root_window=%p\n", window));
+}
+
 static GdkDisplay *
 gdk_win32_screen_get_display (GdkScreen *screen)
 {
@@ -72,13 +128,13 @@ gdk_win32_screen_get_display (GdkScreen *screen)
 static gint
 gdk_win32_screen_get_width (GdkScreen *screen)
 {
-  return GDK_WINDOW (_gdk_root)->width;
+  return GDK_WIN32_SCREEN (screen)->root_window->width;
 }
 
 static gint
 gdk_win32_screen_get_height (GdkScreen *screen)
 {
-  return GDK_WINDOW (_gdk_root)->height;
+  return GDK_WIN32_SCREEN (screen)->root_window->height;
 }
 
 static gint
@@ -96,7 +152,7 @@ gdk_win32_screen_get_height_mm (GdkScreen *screen)
 static GdkWindow *
 gdk_win32_screen_get_root_window (GdkScreen *screen)
 {
-  return _gdk_root;
+  return GDK_WIN32_SCREEN (screen)->root_window;
 }
 
 static gint
diff --git a/gdk/win32/gdkwindow-win32.c b/gdk/win32/gdkwindow-win32.c
index b3ee422..83ab48b 100644
--- a/gdk/win32/gdkwindow-win32.c
+++ b/gdk/win32/gdkwindow-win32.c
@@ -195,60 +195,10 @@ _gdk_win32_adjust_client_rect (GdkWindow *window,
   API_CALL (AdjustWindowRectEx, (rect, style, FALSE, exstyle));
 }
 
-void
-_gdk_root_window_size_init (void)
-{
-  GdkWindow *window;
-  GdkRectangle rect;
-  int i;
-
-  window = GDK_WINDOW (_gdk_root);
-  rect = _gdk_monitors[0].rect;
-  for (i = 1; i < _gdk_num_monitors; i++)
-    gdk_rectangle_union (&rect, &_gdk_monitors[i].rect, &rect);
-
-  window->width = rect.width;
-  window->height = rect.height;
-}
-
-void
-_gdk_windowing_window_init (GdkScreen *screen)
-{
-  GdkWindow *window;
-  GdkWindowImplWin32 *impl_win32;
-
-  g_assert (_gdk_root == NULL);
-
-  _gdk_root = _gdk_display_create_window (_gdk_display);
-
-  window = (GdkWindow *)_gdk_root;
-  window->impl = g_object_new (GDK_TYPE_WINDOW_IMPL_WIN32, NULL);
-  impl_win32 = GDK_WINDOW_IMPL_WIN32 (window->impl);
-  impl_win32->wrapper = window;
-
-  window->impl_window = window;
-  window->visual = gdk_screen_get_system_visual (screen);
-
-  window->window_type = GDK_WINDOW_ROOT;
-  window->depth = window->visual->depth;
-
-  _gdk_root_window_size_init ();
-
-  window->x = 0;
-  window->y = 0;
-  window->abs_x = 0;
-  window->abs_y = 0;
-  /* width and height already initialised in _gdk_root_window_size_init() */
-  window->viewable = TRUE;
-
-  gdk_win32_handle_table_insert ((HANDLE *) &impl_win32->handle, _gdk_root);
-
-  GDK_NOTE (MISC, g_print ("_gdk_root=%p\n", GDK_WINDOW_HWND (_gdk_root)));
-}
-
 gboolean
 _gdk_win32_window_enable_transparency (GdkWindow *window)
 {
+  GdkScreen *screen;
   DWM_BLURBEHIND blur_behind;
   HRGN empty_region;
   HRESULT call_result;
@@ -257,10 +207,12 @@ _gdk_win32_window_enable_transparency (GdkWindow *window)
   if (window == NULL || GDK_WINDOW_HWND (window) == NULL)
     return FALSE;
 
-  if (!gdk_screen_is_composited (gdk_window_get_screen (window)))
+  screen = gdk_window_get_screen (window);
+
+  if (!gdk_screen_is_composited (screen))
     return FALSE;
 
-  if (window == _gdk_root)
+  if (window == gdk_screen_get_root_window (screen))
     return FALSE;
 
   thiswindow = GDK_WINDOW_HWND (window);
@@ -591,7 +543,7 @@ _gdk_win32_display_create_window_impl (GdkDisplay    *display,
 
     case GDK_WINDOW_TEMP:
       /* A temp window is not necessarily a top level window */
-      dwStyle = (_gdk_root == real_parent ? WS_POPUP : WS_CHILDWINDOW);
+      dwStyle = (gdk_screen_get_root_window (screen) == real_parent ? WS_POPUP : WS_CHILDWINDOW);
       dwStyle |= WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
       dwExStyle |= WS_EX_TOOLWINDOW | WS_EX_TOPMOST;
       offset_x = _gdk_offset_x;
@@ -766,7 +718,7 @@ gdk_win32_window_foreign_new_for_display (GdkDisplay      *display,
 
   window->parent = gdk_win32_handle_table_lookup (parent);
   if (!window->parent || GDK_WINDOW_TYPE (window->parent) == GDK_WINDOW_FOREIGN)
-    window->parent = _gdk_root;
+    window->parent = gdk_get_default_root_window ();
 
   window->parent->children = g_list_concat (&window->children_list_node, window->parent->children);
   window->parent->impl_window->native_children =
@@ -1445,14 +1397,23 @@ gdk_win32_window_reparent (GdkWindow *window,
                           gint       x,
                           gint       y)
 {
+  GdkScreen *screen;
   GdkWindow *parent;
   GdkWindow *old_parent;
   GdkWindowImplWin32 *impl;
+  gboolean new_parent_is_root;
   gboolean was_toplevel;
   LONG style;
 
+  screen = gdk_window_get_screen (window);
+
   if (!new_parent)
-    new_parent = _gdk_root;
+    {
+      new_parent = gdk_screen_get_root_window (screen);
+      new_parent_is_root = TRUE;
+    }
+  else
+     new_parent_is_root = (gdk_screen_get_root_window (screen) == new_parent);
 
   old_parent = window->parent;
   parent = new_parent;
@@ -1465,7 +1426,7 @@ gdk_win32_window_reparent (GdkWindow *window,
   style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
 
   was_toplevel = GetAncestor (GDK_WINDOW_HWND (window), GA_PARENT) == GetDesktopWindow ();
-  if (was_toplevel && new_parent != _gdk_root)
+  if (was_toplevel && !new_parent_is_root)
     {
       /* Reparenting from top-level (child of desktop). Clear out
        * decorations.
@@ -1474,7 +1435,7 @@ gdk_win32_window_reparent (GdkWindow *window,
       style |= WS_CHILD;
       SetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE, style);
     }
-  else if (new_parent == _gdk_root)
+  else if (new_parent_is_root)
     {
       /* Reparenting to top-level. Add decorations. */
       style &= ~(WS_CHILD);
@@ -1492,7 +1453,7 @@ gdk_win32_window_reparent (GdkWindow *window,
    * the root window
    */
   if (GDK_WINDOW_TYPE (new_parent) == GDK_WINDOW_FOREIGN)
-    new_parent = _gdk_root;
+    new_parent = gdk_screen_get_root_window (screen);
 
   window->parent = new_parent;
 
@@ -2005,8 +1966,18 @@ gdk_win32_window_get_geometry (GdkWindow *window,
                               gint      *width,
                               gint      *height)
 {
+  GdkScreen *screen;
+  gboolean window_is_root;
+
+  screen = gdk_window_get_screen (window);
+
   if (!window)
-    window = _gdk_root;
+    {
+      window = gdk_screen_get_root_window (screen);
+      window_is_root = TRUE;
+    }
+  else
+    window_is_root = (gdk_screen_get_root_window (screen) == window);
 
   if (!GDK_WINDOW_DESTROYED (window))
     {
@@ -2014,7 +1985,7 @@ gdk_win32_window_get_geometry (GdkWindow *window,
 
       API_CALL (GetClientRect, (GDK_WINDOW_HWND (window), &rect));
 
-      if (window != _gdk_root)
+      if (!window_is_root)
        {
          POINT pt;
          GdkWindow *parent = gdk_window_get_parent (window);
@@ -2033,7 +2004,7 @@ gdk_win32_window_get_geometry (GdkWindow *window,
          rect.right = pt.x;
          rect.bottom = pt.y;
 
-         if (parent == _gdk_root)
+         if (gdk_screen_get_root_window (screen) == parent)
            {
              rect.left += _gdk_offset_x;
              rect.top += _gdk_offset_y;


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