forked from AuroraMiddleware/gtk
GDK W32: Refactor restacking functions a bit
This commit is contained in:
parent
9ba94849e8
commit
6b7951b219
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user