GDK W32: Refactor restacking functions a bit
This commit is contained in:
		@ -1685,16 +1685,18 @@ ensure_stacking_on_unminimize (MSG *msg)
 | 
			
		||||
  HWND rover;
 | 
			
		||||
  HWND lowest_transient = NULL;
 | 
			
		||||
 | 
			
		||||
  rover = msg->hwnd;
 | 
			
		||||
  while ((rover = GetNextWindow (rover, GW_HWNDNEXT)))
 | 
			
		||||
  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;
 | 
			
		||||
 | 
			
		||||
      /* Checking window group not implemented yet */
 | 
			
		||||
      if (rover_gdkw)
 | 
			
		||||
	{
 | 
			
		||||
	  GdkWindowImplWin32 *rover_impl =
 | 
			
		||||
	    GDK_WINDOW_IMPL_WIN32 (rover_gdkw->impl);
 | 
			
		||||
      if (rover_gdkw == NULL)
 | 
			
		||||
        continue;
 | 
			
		||||
 | 
			
		||||
      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 ||
 | 
			
		||||
@ -1704,10 +1706,12 @@ ensure_stacking_on_unminimize (MSG *msg)
 | 
			
		||||
          lowest_transient = rover;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (lowest_transient != NULL)
 | 
			
		||||
    {
 | 
			
		||||
      GDK_NOTE (EVENTS, g_print (" restacking: %p", lowest_transient));
 | 
			
		||||
      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);
 | 
			
		||||
    }
 | 
			
		||||
@ -1719,12 +1723,15 @@ ensure_stacking_on_window_pos_changing (MSG       *msg,
 | 
			
		||||
{
 | 
			
		||||
  GdkWindowImplWin32 *impl = GDK_WINDOW_IMPL_WIN32 (window->impl);
 | 
			
		||||
  WINDOWPOS *windowpos = (WINDOWPOS *) msg->lParam;
 | 
			
		||||
  HWND rover;
 | 
			
		||||
  gboolean restacking;
 | 
			
		||||
 | 
			
		||||
  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;
 | 
			
		||||
 | 
			
		||||
  if (GetActiveWindow () == msg->hwnd &&
 | 
			
		||||
      impl->type_hint != GDK_WINDOW_TYPE_HINT_UTILITY &&
 | 
			
		||||
      impl->type_hint != GDK_WINDOW_TYPE_HINT_DIALOG &&
 | 
			
		||||
      impl->transient_owner == NULL)
 | 
			
		||||
    {
 | 
			
		||||
  /* Make sure the window stays behind any transient-type windows
 | 
			
		||||
   * of the same window group.
 | 
			
		||||
   *
 | 
			
		||||
@ -1732,20 +1739,20 @@ ensure_stacking_on_window_pos_changing (MSG       *msg,
 | 
			
		||||
   * Windows bring it to the top and rely on the WM_ACTIVATEAPP
 | 
			
		||||
   * handling to bring any utility windows on top of it.
 | 
			
		||||
   */
 | 
			
		||||
      HWND rover;
 | 
			
		||||
      gboolean restacking;
 | 
			
		||||
 | 
			
		||||
      rover = windowpos->hwndInsertAfter;
 | 
			
		||||
      restacking = FALSE;
 | 
			
		||||
      while (rover)
 | 
			
		||||
  for (rover = windowpos->hwndInsertAfter, restacking = FALSE;
 | 
			
		||||
       rover;
 | 
			
		||||
       rover = GetNextWindow (rover, GW_HWNDNEXT))
 | 
			
		||||
    {
 | 
			
		||||
      GdkWindow *rover_gdkw = gdk_win32_handle_table_lookup (rover);
 | 
			
		||||
      GdkWindowImplWin32 *rover_impl;
 | 
			
		||||
 | 
			
		||||
      /* Checking window group not implemented yet */
 | 
			
		||||
	  if (rover_gdkw)
 | 
			
		||||
	    {
 | 
			
		||||
	      GdkWindowImplWin32 *rover_impl =
 | 
			
		||||
		GDK_WINDOW_IMPL_WIN32 (rover_gdkw->impl);
 | 
			
		||||
 | 
			
		||||
      if (rover_gdkw == NULL)
 | 
			
		||||
	continue;
 | 
			
		||||
 | 
			
		||||
      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 ||
 | 
			
		||||
@ -1756,15 +1763,15 @@ ensure_stacking_on_window_pos_changing (MSG       *msg,
 | 
			
		||||
          windowpos->hwndInsertAfter = rover;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
	  rover = GetNextWindow (rover, GW_HWNDNEXT);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
  if (restacking)
 | 
			
		||||
    {
 | 
			
		||||
	  GDK_NOTE (EVENTS, g_print (" restacking: %p", windowpos->hwndInsertAfter));
 | 
			
		||||
      GDK_NOTE (EVENTS,
 | 
			
		||||
		g_print (" letting Windows restack %p above %p",
 | 
			
		||||
			 msg->hwnd, windowpos->hwndInsertAfter));
 | 
			
		||||
      return TRUE;
 | 
			
		||||
    }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return FALSE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1773,6 +1780,7 @@ ensure_stacking_on_activate_app (MSG       *msg,
 | 
			
		||||
				 GdkWindow *window)
 | 
			
		||||
{
 | 
			
		||||
  GdkWindowImplWin32 *impl = GDK_WINDOW_IMPL_WIN32 (window->impl);
 | 
			
		||||
  HWND rover;
 | 
			
		||||
 | 
			
		||||
  if (impl->type_hint == GDK_WINDOW_TYPE_HINT_UTILITY ||
 | 
			
		||||
      impl->type_hint == GDK_WINDOW_TYPE_HINT_DIALOG ||
 | 
			
		||||
@ -1783,41 +1791,46 @@ ensure_stacking_on_activate_app (MSG       *msg,
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (IsWindowVisible (msg->hwnd) &&
 | 
			
		||||
      msg->hwnd == GetActiveWindow ())
 | 
			
		||||
    {
 | 
			
		||||
  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.
 | 
			
		||||
   */
 | 
			
		||||
      HWND rover;
 | 
			
		||||
 | 
			
		||||
      rover = msg->hwnd;
 | 
			
		||||
      while ((rover = GetNextWindow (rover, GW_HWNDPREV)))
 | 
			
		||||
  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)
 | 
			
		||||
	    {
 | 
			
		||||
	      GdkWindowImplWin32 *rover_impl =
 | 
			
		||||
		GDK_WINDOW_IMPL_WIN32 (rover_gdkw->impl);
 | 
			
		||||
      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))
 | 
			
		||||
        {
 | 
			
		||||
		  GDK_NOTE (EVENTS, g_print (" restacking: %p", rover));
 | 
			
		||||
	  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;
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define GDK_ANY_BUTTON_MASK (GDK_BUTTON1_MASK | \
 | 
			
		||||
			     GDK_BUTTON2_MASK | \
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user