From c563765574fea4e3afe2101f8c005f8b57dc2f66 Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Wed, 2 Nov 2011 12:15:53 +0100 Subject: [PATCH] win32: Fix placement at initial position Positioning windows at 0,0 post creation failed, because it was mapped with CW_USEDFAULT, but private->x/y still said 0, so moving it to 0,0 did nothing. We now always position the window at the right place, even when not mapped, but we create it at CW_USEDEFAULT initially and store that position before moving it to the right place. This fixes the window sizing test in testgtk and the inital position for the gimp toolbar. --- gdk/win32/gdkwindow-win32.c | 37 +++++++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/gdk/win32/gdkwindow-win32.c b/gdk/win32/gdkwindow-win32.c index 6e39c981ce..f2154abf2f 100644 --- a/gdk/win32/gdkwindow-win32.c +++ b/gdk/win32/gdkwindow-win32.c @@ -445,7 +445,7 @@ _gdk_win32_display_create_window_impl (GdkDisplay *display, gboolean override_redirect; gint window_width, window_height; gint offset_x = 0, offset_y = 0; - gint x, y; + gint x, y, real_x = 0, real_y = 0; /* check consistency of redundant information */ guint remaining_mask = attributes_mask; @@ -562,8 +562,21 @@ _gdk_win32_display_create_window_impl (GdkDisplay *display, AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle); - /* non child windows are placed by the OS/window manager */ - x = y = CW_USEDEFAULT; + real_x = window->x - offset_x; + real_y = window->y - offset_y; + + if (window->window_type == GDK_WINDOW_TOPLEVEL) + { + /* We initially place it at default so that we can get the + default window positioning if we want */ + x = y = CW_USEDEFAULT; + } + else + { + /* TEMP, FOREIGN: Put these where requested */ + x = real_x; + y = real_y; + } window_width = rect.right - rect.left; window_height = rect.bottom - rect.top; @@ -629,9 +642,21 @@ _gdk_win32_display_create_window_impl (GdkDisplay *display, # endif } - GetWindowRect (GDK_WINDOW_HWND (window), &rect); - impl->initial_x = rect.left; - impl->initial_y = rect.top; + + if (window->window_type != GDK_WINDOW_CHILD) + { + GetWindowRect (GDK_WINDOW_HWND (window), &rect); + impl->initial_x = rect.left; + impl->initial_y = rect.top; + + /* Now we know the initial position, move to actually specified position */ + if (real_x != x || real_y != y) + { + API_CALL (SetWindowPos, (GDK_WINDOW_HWND (window), NULL, + real_x, real_y, 0, 0, + SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER)); + } + } g_object_ref (window); gdk_win32_handle_table_insert (&GDK_WINDOW_HWND (window), window);