diff options
author | Руслан Ижбулатов <lrn1986@gmail.com> | 2020-04-26 19:16:02 +0000 |
---|---|---|
committer | Руслан Ижбулатов <lrn1986@gmail.com> | 2020-04-26 19:16:02 +0000 |
commit | 00f06f2480e162edd4213cae5c7a28413ca4cabc (patch) | |
tree | cfef8ab7c170f32570cac8edb3d09b2b5d6257b3 | |
parent | 83ebdbdbf4c0f68513967bb7f65a08cb6a9c7bd2 (diff) | |
download | gtk+-00f06f2480e162edd4213cae5c7a28413ca4cabc.tar.gz |
GDK W32: Remove stacking functions
Stacking functions enforce non-native stacking behaviour that is
mostly unneeded, and doing so introduces bugs and complicates things.
-rw-r--r-- | gdk/win32/gdkevents-win32.c | 207 |
1 files changed, 0 insertions, 207 deletions
diff --git a/gdk/win32/gdkevents-win32.c b/gdk/win32/gdkevents-win32.c index a695f5b0f7..3699083570 100644 --- a/gdk/win32/gdkevents-win32.c +++ b/gdk/win32/gdkevents-win32.c @@ -1863,202 +1863,6 @@ generate_button_event (GdkEventType type, _gdk_win32_append_event (event); } -/* - * Used by the stacking functions to see if a window - * should be always on top. - * Restacking is only done if both windows are either ontop - * or not ontop. - */ -static gboolean -should_window_be_always_on_top (GdkWindow *window) -{ - DWORD exstyle; - - if ((GDK_WINDOW_TYPE (window) == GDK_WINDOW_TEMP) || - (window->state & GDK_WINDOW_STATE_ABOVE)) - return TRUE; - - exstyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE); - - if (exstyle & WS_EX_TOPMOST) - return TRUE; - - return FALSE; -} - -static void -ensure_stacking_on_unminimize (MSG *msg) -{ - HWND rover; - HWND lowest_transient = NULL; - GdkWindow *msg_window; - gboolean window_ontop = FALSE; - - msg_window = gdk_win32_handle_table_lookup (msg->hwnd); - - if (msg_window) - window_ontop = should_window_be_always_on_top (msg_window); - - for (rover = GetNextWindow (msg->hwnd, GW_HWNDNEXT); - rover; - rover = GetNextWindow (rover, GW_HWNDNEXT)) - { - GdkWindow *rover_gdkw = gdk_win32_handle_table_lookup (rover); - GdkWindowImplWin32 *rover_impl; - gboolean rover_ontop; - - /* Checking window group not implemented yet */ - if (rover_gdkw == NULL) - continue; - - rover_ontop = should_window_be_always_on_top (rover_gdkw); - rover_impl = GDK_WINDOW_IMPL_WIN32 (rover_gdkw->impl); - - if (GDK_WINDOW_IS_MAPPED (rover_gdkw) && - (rover_impl->type_hint == GDK_WINDOW_TYPE_HINT_UTILITY || - rover_impl->type_hint == GDK_WINDOW_TYPE_HINT_DIALOG || - rover_impl->transient_owner != NULL) && - ((window_ontop && rover_ontop) || (!window_ontop && !rover_ontop))) - { - lowest_transient = rover; - } - } - - if (lowest_transient != NULL) - { - GDK_NOTE (EVENTS, - g_print (" restacking %p above %p", - msg->hwnd, lowest_transient)); - SetWindowPos (msg->hwnd, lowest_transient, 0, 0, 0, 0, - SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE); - } -} - -static gboolean -ensure_stacking_on_window_pos_changing (MSG *msg, - GdkWindow *window) -{ - GdkWindowImplWin32 *impl = GDK_WINDOW_IMPL_WIN32 (window->impl); - WINDOWPOS *windowpos = (WINDOWPOS *) msg->lParam; - HWND rover; - gboolean restacking; - gboolean window_ontop; - - if (GetActiveWindow () != msg->hwnd || - impl->type_hint == GDK_WINDOW_TYPE_HINT_UTILITY || - impl->type_hint == GDK_WINDOW_TYPE_HINT_DIALOG || - impl->transient_owner != NULL) - return FALSE; - - /* Make sure the window stays behind any transient-type windows - * of the same window group. - * - * If the window is not active and being activated, we let - * Windows bring it to the top and rely on the WM_ACTIVATEAPP - * handling to bring any utility windows on top of it. - */ - - window_ontop = should_window_be_always_on_top (window); - - for (rover = windowpos->hwndInsertAfter, restacking = FALSE; - rover; - rover = GetNextWindow (rover, GW_HWNDNEXT)) - { - GdkWindow *rover_gdkw = gdk_win32_handle_table_lookup (rover); - GdkWindowImplWin32 *rover_impl; - gboolean rover_ontop; - - /* Checking window group not implemented yet */ - - if (rover_gdkw == NULL) - continue; - - rover_ontop = should_window_be_always_on_top (rover_gdkw); - rover_impl = GDK_WINDOW_IMPL_WIN32 (rover_gdkw->impl); - - if (GDK_WINDOW_IS_MAPPED (rover_gdkw) && - (rover_impl->type_hint == GDK_WINDOW_TYPE_HINT_UTILITY || - rover_impl->type_hint == GDK_WINDOW_TYPE_HINT_DIALOG || - rover_impl->transient_owner != NULL) && - ((window_ontop && rover_ontop) || (!window_ontop && !rover_ontop))) - { - restacking = TRUE; - windowpos->hwndInsertAfter = rover; - } - } - - if (restacking) - { - GDK_NOTE (EVENTS, - g_print (" letting Windows restack %p above %p", - msg->hwnd, windowpos->hwndInsertAfter)); - return TRUE; - } - - return FALSE; -} - -static void -ensure_stacking_on_activate_app (MSG *msg, - GdkWindow *window) -{ - GdkWindowImplWin32 *impl = GDK_WINDOW_IMPL_WIN32 (window->impl); - HWND rover; - gboolean window_ontop; - - if (impl->type_hint == GDK_WINDOW_TYPE_HINT_UTILITY || - impl->type_hint == GDK_WINDOW_TYPE_HINT_DIALOG || - impl->transient_owner != NULL) - { - SetWindowPos (msg->hwnd, HWND_TOP, 0, 0, 0, 0, - SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE); - return; - } - - if (!IsWindowVisible (msg->hwnd) || - msg->hwnd != GetActiveWindow ()) - return; - - - /* This window is not a transient-type window and it is the - * activated window. Make sure this window is as visible as - * possible, just below the lowest transient-type window of this - * app. - */ - - window_ontop = should_window_be_always_on_top (window); - - for (rover = GetNextWindow (msg->hwnd, GW_HWNDPREV); - rover; - rover = GetNextWindow (rover, GW_HWNDPREV)) - { - GdkWindow *rover_gdkw = gdk_win32_handle_table_lookup (rover); - GdkWindowImplWin32 *rover_impl; - gboolean rover_ontop; - - /* Checking window group not implemented yet */ - if (rover_gdkw == NULL) - continue; - - rover_ontop = should_window_be_always_on_top (rover_gdkw); - rover_impl = GDK_WINDOW_IMPL_WIN32 (rover_gdkw->impl); - - if (GDK_WINDOW_IS_MAPPED (rover_gdkw) && - (rover_impl->type_hint == GDK_WINDOW_TYPE_HINT_UTILITY || - rover_impl->type_hint == GDK_WINDOW_TYPE_HINT_DIALOG || - rover_impl->transient_owner != NULL) && - ((window_ontop && rover_ontop) || (!window_ontop && !rover_ontop))) - { - GDK_NOTE (EVENTS, - g_print (" restacking %p above %p", - msg->hwnd, rover)); - SetWindowPos (msg->hwnd, rover, 0, 0, 0, 0, - SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE); - break; - } - } -} - static gboolean handle_wm_sysmenu (GdkWindow *window, MSG *msg, gint *ret_valp) { @@ -3389,8 +3193,6 @@ gdk_event_translate (MSG *msg, if (GDK_WINDOW_IS_MAPPED (window)) { - return_val = ensure_stacking_on_window_pos_changing (msg, window); - impl = GDK_WINDOW_IMPL_WIN32 (window->impl); if (impl->maximizing) @@ -3480,13 +3282,6 @@ gdk_event_translate (MSG *msg, if ((old_state & GDK_WINDOW_STATE_ICONIFIED) != (new_state & GDK_WINDOW_STATE_ICONIFIED)) do_show_window (window, (new_state & GDK_WINDOW_STATE_ICONIFIED)); - - - /* When un-minimizing, make sure we're stacked under any - transient-type windows. */ - if (!(old_state & GDK_WINDOW_STATE_ICONIFIED) && - (new_state & GDK_WINDOW_STATE_ICONIFIED)) - ensure_stacking_on_unminimize (msg); } /* Show, New size or position => configure event */ @@ -3968,8 +3763,6 @@ gdk_event_translate (MSG *msg, GDK_NOTE (EVENTS, g_print (" %s thread: %" G_GINT64_FORMAT, msg->wParam ? "YES" : "NO", (gint64) msg->lParam)); - if (msg->wParam && GDK_WINDOW_IS_MAPPED (window)) - ensure_stacking_on_activate_app (msg, window); break; case WM_NCHITTEST: /* TODO: pass all messages to DwmDefWindowProc() first! */ |