From eee70b8153e0129cc885abbf6172a274fb6cb97d Mon Sep 17 00:00:00 2001 From: Tor Lillqvist Date: Sat, 21 Dec 2002 23:32:20 +0000 Subject: [PATCH] Move the code that sets the window style and extended window style, and 2002-12-21 Tor Lillqvist * gdk/win32/gdkwindow-win32.c (gdk_window_new): Move the code that sets the window style and extended window style, and adjusts the width and height to take the window decorations into account earlier. The adjusted width and height used to be ignored. Remove the local x, y, width and height variables, no need to further confuse the code by having local copies. (Partial fix, I hope, for #101588) (gdk_window_move): When moving top-level windows, take title bar and border width into account, offsetting the coordinates before calling SetWindowPos(). (gdk_window_set_decorations, gdk_window_set_functions): Reimplement, taking into account the peculiar semantics of GDK_DECOR_ALL and GDK_FUNC_ALL. (#79036) (gdk_window_get_decorations): Implement. (#98981) (gdk_window_set_type_hint): When setting GDK_WINDOW_TYPE_HINT_MENU, call gdk_window_set_decorations(). (#79036) * gdk/gdk.def: Add gdk_window_get_decorations. (#98981) --- ChangeLog | 26 ++++ ChangeLog.pre-2-10 | 26 ++++ ChangeLog.pre-2-2 | 26 ++++ ChangeLog.pre-2-4 | 26 ++++ ChangeLog.pre-2-6 | 26 ++++ ChangeLog.pre-2-8 | 26 ++++ gdk/gdk.def | 1 + gdk/win32/gdkwindow-win32.c | 231 +++++++++++++++++++++--------------- 8 files changed, 291 insertions(+), 97 deletions(-) diff --git a/ChangeLog b/ChangeLog index 827fd3542f..4d81341c85 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,29 @@ +2002-12-21 Tor Lillqvist + + * gdk/win32/gdkwindow-win32.c (gdk_window_new): Move the code that + sets the window style and extended window style, and adjusts the + width and height to take the window decorations into account + earlier. The adjusted width and height used to be ignored. Remove + the local x, y, width and height variables, no need to further + confuse the code by having local copies. (Partial fix, I hope, for + #101588) + + (gdk_window_move): When moving top-level windows, take title bar + and border width into account, offsetting the coordinates before + calling SetWindowPos(). + + (gdk_window_set_decorations, gdk_window_set_functions): + Reimplement, taking into account the peculiar semantics of + GDK_DECOR_ALL and GDK_FUNC_ALL. (#79036) + + (gdk_window_get_decorations): Implement. (#98981) + + (gdk_window_set_type_hint): When setting + GDK_WINDOW_TYPE_HINT_MENU, call gdk_window_set_decorations(). + (#79036) + + * gdk/gdk.def: Add gdk_window_get_decorations. (#98981) + 2002-12-21 Matthias Clasen * gtk/gtktextview.c (gtk_text_view_set_background): New static diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 827fd3542f..4d81341c85 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,29 @@ +2002-12-21 Tor Lillqvist + + * gdk/win32/gdkwindow-win32.c (gdk_window_new): Move the code that + sets the window style and extended window style, and adjusts the + width and height to take the window decorations into account + earlier. The adjusted width and height used to be ignored. Remove + the local x, y, width and height variables, no need to further + confuse the code by having local copies. (Partial fix, I hope, for + #101588) + + (gdk_window_move): When moving top-level windows, take title bar + and border width into account, offsetting the coordinates before + calling SetWindowPos(). + + (gdk_window_set_decorations, gdk_window_set_functions): + Reimplement, taking into account the peculiar semantics of + GDK_DECOR_ALL and GDK_FUNC_ALL. (#79036) + + (gdk_window_get_decorations): Implement. (#98981) + + (gdk_window_set_type_hint): When setting + GDK_WINDOW_TYPE_HINT_MENU, call gdk_window_set_decorations(). + (#79036) + + * gdk/gdk.def: Add gdk_window_get_decorations. (#98981) + 2002-12-21 Matthias Clasen * gtk/gtktextview.c (gtk_text_view_set_background): New static diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index 827fd3542f..4d81341c85 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,29 @@ +2002-12-21 Tor Lillqvist + + * gdk/win32/gdkwindow-win32.c (gdk_window_new): Move the code that + sets the window style and extended window style, and adjusts the + width and height to take the window decorations into account + earlier. The adjusted width and height used to be ignored. Remove + the local x, y, width and height variables, no need to further + confuse the code by having local copies. (Partial fix, I hope, for + #101588) + + (gdk_window_move): When moving top-level windows, take title bar + and border width into account, offsetting the coordinates before + calling SetWindowPos(). + + (gdk_window_set_decorations, gdk_window_set_functions): + Reimplement, taking into account the peculiar semantics of + GDK_DECOR_ALL and GDK_FUNC_ALL. (#79036) + + (gdk_window_get_decorations): Implement. (#98981) + + (gdk_window_set_type_hint): When setting + GDK_WINDOW_TYPE_HINT_MENU, call gdk_window_set_decorations(). + (#79036) + + * gdk/gdk.def: Add gdk_window_get_decorations. (#98981) + 2002-12-21 Matthias Clasen * gtk/gtktextview.c (gtk_text_view_set_background): New static diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 827fd3542f..4d81341c85 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,29 @@ +2002-12-21 Tor Lillqvist + + * gdk/win32/gdkwindow-win32.c (gdk_window_new): Move the code that + sets the window style and extended window style, and adjusts the + width and height to take the window decorations into account + earlier. The adjusted width and height used to be ignored. Remove + the local x, y, width and height variables, no need to further + confuse the code by having local copies. (Partial fix, I hope, for + #101588) + + (gdk_window_move): When moving top-level windows, take title bar + and border width into account, offsetting the coordinates before + calling SetWindowPos(). + + (gdk_window_set_decorations, gdk_window_set_functions): + Reimplement, taking into account the peculiar semantics of + GDK_DECOR_ALL and GDK_FUNC_ALL. (#79036) + + (gdk_window_get_decorations): Implement. (#98981) + + (gdk_window_set_type_hint): When setting + GDK_WINDOW_TYPE_HINT_MENU, call gdk_window_set_decorations(). + (#79036) + + * gdk/gdk.def: Add gdk_window_get_decorations. (#98981) + 2002-12-21 Matthias Clasen * gtk/gtktextview.c (gtk_text_view_set_background): New static diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 827fd3542f..4d81341c85 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,29 @@ +2002-12-21 Tor Lillqvist + + * gdk/win32/gdkwindow-win32.c (gdk_window_new): Move the code that + sets the window style and extended window style, and adjusts the + width and height to take the window decorations into account + earlier. The adjusted width and height used to be ignored. Remove + the local x, y, width and height variables, no need to further + confuse the code by having local copies. (Partial fix, I hope, for + #101588) + + (gdk_window_move): When moving top-level windows, take title bar + and border width into account, offsetting the coordinates before + calling SetWindowPos(). + + (gdk_window_set_decorations, gdk_window_set_functions): + Reimplement, taking into account the peculiar semantics of + GDK_DECOR_ALL and GDK_FUNC_ALL. (#79036) + + (gdk_window_get_decorations): Implement. (#98981) + + (gdk_window_set_type_hint): When setting + GDK_WINDOW_TYPE_HINT_MENU, call gdk_window_set_decorations(). + (#79036) + + * gdk/gdk.def: Add gdk_window_get_decorations. (#98981) + 2002-12-21 Matthias Clasen * gtk/gtktextview.c (gtk_text_view_set_background): New static diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 827fd3542f..4d81341c85 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,29 @@ +2002-12-21 Tor Lillqvist + + * gdk/win32/gdkwindow-win32.c (gdk_window_new): Move the code that + sets the window style and extended window style, and adjusts the + width and height to take the window decorations into account + earlier. The adjusted width and height used to be ignored. Remove + the local x, y, width and height variables, no need to further + confuse the code by having local copies. (Partial fix, I hope, for + #101588) + + (gdk_window_move): When moving top-level windows, take title bar + and border width into account, offsetting the coordinates before + calling SetWindowPos(). + + (gdk_window_set_decorations, gdk_window_set_functions): + Reimplement, taking into account the peculiar semantics of + GDK_DECOR_ALL and GDK_FUNC_ALL. (#79036) + + (gdk_window_get_decorations): Implement. (#98981) + + (gdk_window_set_type_hint): When setting + GDK_WINDOW_TYPE_HINT_MENU, call gdk_window_set_decorations(). + (#79036) + + * gdk/gdk.def: Add gdk_window_get_decorations. (#98981) + 2002-12-21 Matthias Clasen * gtk/gtktextview.c (gtk_text_view_set_background): New static diff --git a/gdk/gdk.def b/gdk/gdk.def index dc4aeccb8c..db807b515d 100644 --- a/gdk/gdk.def +++ b/gdk/gdk.def @@ -439,6 +439,7 @@ EXPORTS gdk_window_freeze_updates gdk_window_fullscreen gdk_window_get_children + gdk_window_get_decorations gdk_window_get_deskrelative_origin gdk_window_get_events gdk_window_get_frame_extents diff --git a/gdk/win32/gdkwindow-win32.c b/gdk/win32/gdkwindow-win32.c index 30728f93c2..ba803baa56 100644 --- a/gdk/win32/gdkwindow-win32.c +++ b/gdk/win32/gdkwindow-win32.c @@ -414,16 +414,14 @@ gdk_window_new (GdkWindow *parent, { HANDLE hparent; ATOM klass = 0; - DWORD dwStyle, dwExStyle; + DWORD dwStyle = 0, dwExStyle; RECT rect; GdkWindow *window; GdkWindowObject *private; GdkWindowImplWin32 *impl; GdkDrawableImplWin32 *draw_impl; GdkVisual *visual; - int width, height; - int x, y; - char *title; + const gchar *title; char *mbtitle; g_return_val_if_fail (attributes != NULL, NULL); @@ -461,46 +459,26 @@ gdk_window_new (GdkWindow *parent, private->parent = (GdkWindowObject *)parent; if (attributes_mask & GDK_WA_X) - x = attributes->x; + private->x = attributes->x; else - x = CW_USEDEFAULT; + private->x = 0; if (attributes_mask & GDK_WA_Y) - y = attributes->y; + private->y = attributes->y; else if (attributes_mask & GDK_WA_X) - y = 100; /* ??? We must put it somewhere... */ + private->y = 100; /* ??? We must put it somewhere... */ else - y = 0; /* x is CW_USEDEFAULT, y doesn't matter then */ + private->y = 0; - private->x = x; - private->y = y; - impl->width = (attributes->width > 1) ? (attributes->width) : (1); - impl->height = (attributes->height > 1) ? (attributes->height) : (1); - impl->extension_events_selected = FALSE; - private->window_type = attributes->window_type; - - _gdk_window_init_position (GDK_WINDOW (private)); - if (impl->position_info.big) - private->guffaw_gravity = TRUE; - if (attributes_mask & GDK_WA_VISUAL) visual = attributes->visual; else visual = gdk_visual_get_system (); - if (attributes_mask & GDK_WA_TITLE) - title = attributes->title; - else - title = get_default_title (); - if (!title || !*title) - title = "GDK client window"; - - private->event_mask = GDK_STRUCTURE_MASK | attributes->event_mask; - - if (private->parent && private->parent->guffaw_gravity) - { - /* XXX ??? */ - } + impl->width = (attributes->width > 1) ? (attributes->width) : (1); + impl->height = (attributes->height > 1) ? (attributes->height) : (1); + impl->extension_events_selected = FALSE; + private->window_type = attributes->window_type; if (attributes->wclass == GDK_INPUT_OUTPUT) { @@ -529,9 +507,6 @@ gdk_window_new (GdkWindow *parent, GDK_NOTE (MISC, g_print ("...GDK_INPUT_ONLY, system colormap\n")); } - if (private->parent) - private->parent->children = g_list_prepend (private->parent->children, window); - switch (private->window_type) { case GDK_WINDOW_TOPLEVEL: @@ -561,55 +536,66 @@ gdk_window_new (GdkWindow *parent, case GDK_WINDOW_ROOT: g_error ("cannot make windows of type GDK_WINDOW_ROOT"); break; - } - klass = RegisterGdkClass (private->window_type); + default: + g_assert_not_reached (); + } if (private->window_type != GDK_WINDOW_CHILD) { - if (x == CW_USEDEFAULT) - { - rect.left = 100; - rect.top = 100; - } - else - { - rect.left = x; - rect.top = y; - } - + rect.left = private->x; + rect.top = private->y; rect.right = rect.left + impl->width; rect.bottom = rect.top + impl->height; SafeAdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle); - if (x != CW_USEDEFAULT) - { - x = rect.left; - y = rect.top; - } - width = rect.right - rect.left; - height = rect.bottom - rect.top; + private->x = rect.left; + private->y = rect.top; + impl->width = rect.right - rect.left; + impl->height = rect.bottom - rect.top; } + + _gdk_window_init_position (GDK_WINDOW (private)); + + if (impl->position_info.big) + private->guffaw_gravity = TRUE; + + if (attributes_mask & GDK_WA_TITLE) + title = attributes->title; else + title = get_default_title (); + if (!title || !*title) + title = "GDK client window"; + + private->event_mask = GDK_STRUCTURE_MASK | attributes->event_mask; + + if (private->parent && private->parent->guffaw_gravity) { - width = impl->width; - height = impl->height; + /* XXX ??? */ } + if (private->parent) + private->parent->children = g_list_prepend (private->parent->children, window); + + klass = RegisterGdkClass (private->window_type); + mbtitle = g_locale_from_utf8 (title, -1, NULL, NULL, NULL); #ifdef WITHOUT_WM_CREATE - draw_impl->handle = CreateWindowEx (dwExStyle, - MAKEINTRESOURCE(klass), - mbtitle, - dwStyle, - impl->position_info.x, impl->position_info.y, - impl->position_info.width, impl->position_info.height, - hparent, - NULL, - _gdk_app_hmodule, - NULL); + draw_impl->handle = + CreateWindowEx (dwExStyle, + MAKEINTRESOURCE(klass), + mbtitle, + dwStyle, + ((attributes_mask & GDK_WA_X) ? + impl->position_info.x : CW_USEDEFAULT), + impl->position_info.y, + impl->position_info.width, impl->position_info.height, + hparent, + NULL, + _gdk_app_hmodule, + NULL); #else { HWND hwndNew = @@ -617,7 +603,9 @@ gdk_window_new (GdkWindow *parent, MAKEINTRESOURCE(klass), mbtitle, dwStyle, - impl->position_info.x, impl->position_info.y, + ((attributes_mask & GDK_WA_X) ? + impl->position_info.x : CW_USEDEFAULT), + impl->position_info.y, impl->position_info.width, impl->position_info.height, hparent, NULL, @@ -652,7 +640,10 @@ gdk_window_new (GdkWindow *parent, GDK_NOTE (MISC, g_print ("... \"%s\" %dx%d@+%d+%d %p = %p\n", mbtitle, - width, height, (x == CW_USEDEFAULT ? -9999 : x), y, + impl->position_info.width, impl->position_info.height, + ((attributes_mask & GDK_WA_X) ? + impl->position_info.x : CW_USEDEFAULT), + impl->position_info.y, hparent, GDK_WINDOW_HWND (window))); @@ -962,6 +953,8 @@ gdk_window_move (GdkWindow *window, { GdkWindowObject *private = (GdkWindowObject *)window; GdkWindowImplWin32 *impl; + RECT rect; + LONG style, extended_style; g_return_if_fail (window != NULL); g_return_if_fail (GDK_IS_WINDOW (window)); @@ -975,8 +968,16 @@ gdk_window_move (GdkWindow *window, impl->width, impl->height); else { + /* SetWindowPos uses non-client coordinates, we have client + * coordinates. Thus offset them. + */ + style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE); + extended_style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE); + GetClientRect (GDK_WINDOW_HWND (window), &rect); + AdjustWindowRectEx (&rect, style, FALSE, extended_style); + if (!SetWindowPos (GDK_WINDOW_HWND (window), NULL, - x, y, impl->width, impl->height, + x + rect.left, y + rect.top, 0, 0, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER)) WIN32_API_FAILED ("SetWindowPos"); } @@ -2153,7 +2154,8 @@ void gdk_window_set_decorations (GdkWindow *window, GdkWMDecoration decorations) { - LONG style; + LONG style, bits; + const LONG settable_bits = WS_BORDER|WS_THICKFRAME|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|WS_MAXIMIZEBOX; g_return_if_fail (window != NULL); g_return_if_fail (GDK_IS_WINDOW (window)); @@ -2170,23 +2172,25 @@ gdk_window_set_decorations (GdkWindow *window, style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE); - style &= (WS_OVERLAPPED|WS_POPUP|WS_CHILD|WS_MINIMIZE|WS_VISIBLE|WS_DISABLED - |WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_MAXIMIZE); + bits = 0; + + if (decorations & GDK_DECOR_BORDER) + bits |= WS_BORDER; + if (decorations & GDK_DECOR_RESIZEH) + bits |= WS_THICKFRAME; + if (decorations & GDK_DECOR_TITLE) + bits |= WS_CAPTION; + if (decorations & GDK_DECOR_MENU) + bits |= WS_SYSMENU; + if (decorations & GDK_DECOR_MINIMIZE) + bits |= WS_MINIMIZEBOX; + if (decorations & GDK_DECOR_MAXIMIZE) + bits |= WS_MAXIMIZEBOX; if (decorations & GDK_DECOR_ALL) - style |= (WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX); - if (decorations & GDK_DECOR_BORDER) - style |= (WS_BORDER); - if (decorations & GDK_DECOR_RESIZEH) - style |= (WS_THICKFRAME); - if (decorations & GDK_DECOR_TITLE) - style |= (WS_CAPTION); - if (decorations & GDK_DECOR_MENU) - style |= (WS_SYSMENU); - if (decorations & GDK_DECOR_MINIMIZE) - style |= (WS_MINIMIZEBOX); - if (decorations & GDK_DECOR_MAXIMIZE) - style |= (WS_MAXIMIZEBOX); + style |= settable_bits, style &= ~bits; + else + style &= ~settable_bits, style |= bits; SetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE, style); SetWindowPos (GDK_WINDOW_HWND (window), NULL, 0, 0, 0, 0, @@ -2194,11 +2198,36 @@ gdk_window_set_decorations (GdkWindow *window, SWP_NOREPOSITION | SWP_NOSIZE | SWP_NOZORDER); } +gboolean +gdk_window_get_decorations(GdkWindow *window, + GdkWMDecoration *decorations) +{ + LONG style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE); + + *decorations = 0; + + if (style & WS_BORDER) + *decorations |= GDK_DECOR_BORDER; + if (style & WS_THICKFRAME) + *decorations |= GDK_DECOR_RESIZEH; + if (style & WS_CAPTION) + *decorations |= GDK_DECOR_TITLE; + if (style & WS_SYSMENU) + *decorations |= GDK_DECOR_MENU; + if (style & WS_MINIMIZEBOX) + *decorations |= GDK_DECOR_MINIMIZE; + if (style & WS_MAXIMIZEBOX) + *decorations |= GDK_DECOR_MAXIMIZE; + + return *decorations != 0; +} + void gdk_window_set_functions (GdkWindow *window, GdkWMFunction functions) { - LONG style; + LONG style, bits; + const LONG settable_bits = (WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_SYSMENU); g_return_if_fail (window != NULL); g_return_if_fail (GDK_IS_WINDOW (window)); @@ -2214,20 +2243,23 @@ gdk_window_set_functions (GdkWindow *window, style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE); - style &= (WS_OVERLAPPED|WS_POPUP|WS_CHILD|WS_MINIMIZE|WS_VISIBLE|WS_DISABLED - |WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_MAXIMIZE|WS_CAPTION|WS_BORDER - |WS_SYSMENU); + bits = 0; - if (functions & GDK_FUNC_ALL) - style |= (WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX); if (functions & GDK_FUNC_RESIZE) - style |= (WS_THICKFRAME); + bits |= WS_THICKFRAME; if (functions & GDK_FUNC_MOVE) - style |= (WS_THICKFRAME); + bits |= (WS_THICKFRAME|WS_SYSMENU); if (functions & GDK_FUNC_MINIMIZE) - style |= (WS_MINIMIZEBOX); + bits |= WS_MINIMIZEBOX; if (functions & GDK_FUNC_MAXIMIZE) - style |= (WS_MAXIMIZEBOX); + bits |= WS_MAXIMIZEBOX; + if (functions & GDK_FUNC_CLOSE) + bits |= WS_SYSMENU; + + if (functions & GDK_FUNC_ALL) + style |= settable_bits, style &= ~bits; + else + style &= ~settable_bits, style |= bits; SetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE, style); SetWindowPos (GDK_WINDOW_HWND (window), NULL, 0, 0, 0, 0, @@ -2552,6 +2584,11 @@ gdk_window_set_type_hint (GdkWindow *window, case GDK_WINDOW_TYPE_HINT_DIALOG: break; case GDK_WINDOW_TYPE_HINT_MENU: + gdk_window_set_decorations (window, + GDK_DECOR_ALL | + GDK_DECOR_RESIZEH | + GDK_DECOR_MINIMIZE | + GDK_DECOR_MAXIMIZE); break; case GDK_WINDOW_TYPE_HINT_TOOLBAR: break;