[gtk/gtk-3-24: 2/3] GDK W32: Remove stacking functions




commit 00f06f2480e162edd4213cae5c7a28413ca4cabc
Author: Руслан Ижбулатов <lrn1986 gmail com>
Date:   Sun Apr 26 19:16:02 2020 +0000

    GDK W32: Remove stacking functions
    
    Stacking functions enforce non-native stacking behaviour that is
    mostly unneeded, and doing so introduces bugs and complicates things.

 gdk/win32/gdkevents-win32.c | 207 --------------------------------------------
 1 file changed, 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! */


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