GDK W32: Refactor restacking functions a bit

This commit is contained in:
Руслан Ижбулатов 2015-11-21 03:37:40 +00:00
parent 9ba94849e8
commit 6b7951b219

View File

@ -1685,29 +1685,33 @@ ensure_stacking_on_unminimize (MSG *msg)
HWND rover; HWND rover;
HWND lowest_transient = NULL; HWND lowest_transient = NULL;
rover = msg->hwnd; for (rover = GetNextWindow (msg->hwnd, GW_HWNDNEXT);
while ((rover = GetNextWindow (rover, GW_HWNDNEXT))) rover;
rover = GetNextWindow (rover, GW_HWNDNEXT))
{ {
GdkWindow *rover_gdkw = gdk_win32_handle_table_lookup (rover); GdkWindow *rover_gdkw = gdk_win32_handle_table_lookup (rover);
GdkWindowImplWin32 *rover_impl;
/* Checking window group not implemented yet */ /* Checking window group not implemented yet */
if (rover_gdkw) if (rover_gdkw == NULL)
{ continue;
GdkWindowImplWin32 *rover_impl =
GDK_WINDOW_IMPL_WIN32 (rover_gdkw->impl);
if (GDK_WINDOW_IS_MAPPED (rover_gdkw) && rover_impl = GDK_WINDOW_IMPL_WIN32 (rover_gdkw->impl);
(rover_impl->type_hint == GDK_WINDOW_TYPE_HINT_UTILITY ||
rover_impl->type_hint == GDK_WINDOW_TYPE_HINT_DIALOG || if (GDK_WINDOW_IS_MAPPED (rover_gdkw) &&
rover_impl->transient_owner != NULL)) (rover_impl->type_hint == GDK_WINDOW_TYPE_HINT_UTILITY ||
{ rover_impl->type_hint == GDK_WINDOW_TYPE_HINT_DIALOG ||
lowest_transient = rover; rover_impl->transient_owner != NULL))
} {
} lowest_transient = rover;
}
} }
if (lowest_transient != NULL) 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, SetWindowPos (msg->hwnd, lowest_transient, 0, 0, 0, 0,
SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE); SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
} }
@ -1719,52 +1723,55 @@ ensure_stacking_on_window_pos_changing (MSG *msg,
{ {
GdkWindowImplWin32 *impl = GDK_WINDOW_IMPL_WIN32 (window->impl); GdkWindowImplWin32 *impl = GDK_WINDOW_IMPL_WIN32 (window->impl);
WINDOWPOS *windowpos = (WINDOWPOS *) msg->lParam; WINDOWPOS *windowpos = (WINDOWPOS *) msg->lParam;
HWND rover;
gboolean restacking;
if (GetActiveWindow () == msg->hwnd && if (GetActiveWindow () != msg->hwnd ||
impl->type_hint != GDK_WINDOW_TYPE_HINT_UTILITY && impl->type_hint == GDK_WINDOW_TYPE_HINT_UTILITY ||
impl->type_hint != GDK_WINDOW_TYPE_HINT_DIALOG && impl->type_hint == GDK_WINDOW_TYPE_HINT_DIALOG ||
impl->transient_owner == NULL) 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.
*/
for (rover = windowpos->hwndInsertAfter, restacking = FALSE;
rover;
rover = GetNextWindow (rover, GW_HWNDNEXT))
{ {
/* Make sure the window stays behind any transient-type windows GdkWindow *rover_gdkw = gdk_win32_handle_table_lookup (rover);
* of the same window group. GdkWindowImplWin32 *rover_impl;
*
* 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.
*/
HWND rover;
gboolean restacking;
rover = windowpos->hwndInsertAfter; /* Checking window group not implemented yet */
restacking = FALSE;
while (rover)
{
GdkWindow *rover_gdkw = gdk_win32_handle_table_lookup (rover);
/* Checking window group not implemented yet */ if (rover_gdkw == NULL)
if (rover_gdkw) continue;
{
GdkWindowImplWin32 *rover_impl =
GDK_WINDOW_IMPL_WIN32 (rover_gdkw->impl);
if (GDK_WINDOW_IS_MAPPED (rover_gdkw) && rover_impl = GDK_WINDOW_IMPL_WIN32 (rover_gdkw->impl);
(rover_impl->type_hint == GDK_WINDOW_TYPE_HINT_UTILITY ||
rover_impl->type_hint == GDK_WINDOW_TYPE_HINT_DIALOG ||
rover_impl->transient_owner != NULL))
{
restacking = TRUE;
windowpos->hwndInsertAfter = rover;
}
}
rover = GetNextWindow (rover, GW_HWNDNEXT);
}
if (restacking) if (GDK_WINDOW_IS_MAPPED (rover_gdkw) &&
{ (rover_impl->type_hint == GDK_WINDOW_TYPE_HINT_UTILITY ||
GDK_NOTE (EVENTS, g_print (" restacking: %p", windowpos->hwndInsertAfter)); rover_impl->type_hint == GDK_WINDOW_TYPE_HINT_DIALOG ||
return TRUE; rover_impl->transient_owner != NULL))
} {
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; return FALSE;
} }
@ -1773,6 +1780,7 @@ ensure_stacking_on_activate_app (MSG *msg,
GdkWindow *window) GdkWindow *window)
{ {
GdkWindowImplWin32 *impl = GDK_WINDOW_IMPL_WIN32 (window->impl); GdkWindowImplWin32 *impl = GDK_WINDOW_IMPL_WIN32 (window->impl);
HWND rover;
if (impl->type_hint == GDK_WINDOW_TYPE_HINT_UTILITY || if (impl->type_hint == GDK_WINDOW_TYPE_HINT_UTILITY ||
impl->type_hint == GDK_WINDOW_TYPE_HINT_DIALOG || impl->type_hint == GDK_WINDOW_TYPE_HINT_DIALOG ||
@ -1783,38 +1791,43 @@ ensure_stacking_on_activate_app (MSG *msg,
return; return;
} }
if (IsWindowVisible (msg->hwnd) && if (!IsWindowVisible (msg->hwnd) ||
msg->hwnd == GetActiveWindow ()) 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.
*/
for (rover = GetNextWindow (msg->hwnd, GW_HWNDPREV);
rover;
rover = GetNextWindow (rover, GW_HWNDPREV))
{ {
/* This window is not a transient-type window and it is the GdkWindow *rover_gdkw = gdk_win32_handle_table_lookup (rover);
* activated window. Make sure this window is as visible as GdkWindowImplWin32 *rover_impl;
* possible, just below the lowest transient-type window of this gboolean rover_ontop;
* app.
*/
HWND rover;
rover = msg->hwnd; /* Checking window group not implemented yet */
while ((rover = GetNextWindow (rover, GW_HWNDPREV))) if (rover_gdkw == NULL)
{ continue;
GdkWindow *rover_gdkw = gdk_win32_handle_table_lookup (rover);
/* Checking window group not implemented yet */ rover_ontop = should_window_be_always_on_top (rover_gdkw);
if (rover_gdkw) rover_impl = GDK_WINDOW_IMPL_WIN32 (rover_gdkw->impl);
{
GdkWindowImplWin32 *rover_impl =
GDK_WINDOW_IMPL_WIN32 (rover_gdkw->impl);
if (GDK_WINDOW_IS_MAPPED (rover_gdkw) && if (GDK_WINDOW_IS_MAPPED (rover_gdkw) &&
(rover_impl->type_hint == GDK_WINDOW_TYPE_HINT_UTILITY || (rover_impl->type_hint == GDK_WINDOW_TYPE_HINT_UTILITY ||
rover_impl->type_hint == GDK_WINDOW_TYPE_HINT_DIALOG || rover_impl->type_hint == GDK_WINDOW_TYPE_HINT_DIALOG ||
rover_impl->transient_owner != NULL)) rover_impl->transient_owner != NULL))
{ {
GDK_NOTE (EVENTS, g_print (" restacking: %p", rover)); GDK_NOTE (EVENTS,
SetWindowPos (msg->hwnd, rover, 0, 0, 0, 0, g_print (" restacking %p above %p",
SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE); msg->hwnd, rover));
break; SetWindowPos (msg->hwnd, rover, 0, 0, 0, 0,
} SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
} break;
} }
} }
} }