win32: remove _gdk_root global variable

This commit is contained in:
Paolo Borelli
2015-12-18 00:36:57 +01:00
committed by Ignacio Casal Quinteiro
parent e44b420617
commit 3cd79c11fc
11 changed files with 124 additions and 101 deletions

View File

@ -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);

View File

@ -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)
{

View File

@ -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;

View File

@ -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";

View File

@ -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;

View File

@ -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;

View File

@ -29,7 +29,6 @@
GdkDisplay *_gdk_display = NULL;
GdkScreen *_gdk_screen = NULL;
GdkWindow *_gdk_root = NULL;
gint _gdk_num_monitors;
GdkWin32Monitor *_gdk_monitors = NULL;

View File

@ -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);

View File

@ -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);

View File

@ -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

View File

@ -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;