win32: Fix up window_show

We don't pass in raise anymore, but already_mapped.
Also, already_mapped must be used rather than MAPPED, as we already
synthesize the MAPPED in the generic code (and thus we don't have
to synthesize it again).
This commit is contained in:
Alexander Larsson 2011-10-25 14:26:22 +02:00
parent af00c68dd0
commit 66f7e5d163

View File

@ -889,31 +889,30 @@ adjust_for_gravity_hints (GdkWindow *window,
static void static void
show_window_internal (GdkWindow *window, show_window_internal (GdkWindow *window,
gboolean raise, gboolean already_mapped,
gboolean deiconify) gboolean deiconify)
{ {
HWND old_active_window; HWND old_active_window;
gboolean focus_on_map = TRUE; gboolean focus_on_map = FALSE;
DWORD exstyle; DWORD exstyle;
HWND top; HWND top;
if (window->destroyed) if (window->destroyed)
return; return;
GDK_NOTE (MISC, g_print ("show_window_internal: %p: %s%s%s\n", GDK_NOTE (MISC, g_print ("show_window_internal: %p: %s%s\n",
GDK_WINDOW_HWND (window), GDK_WINDOW_HWND (window),
_gdk_win32_window_state_to_string (window->state), _gdk_win32_window_state_to_string (window->state),
(raise ? " raise" : ""),
(deiconify ? " deiconify" : ""))); (deiconify ? " deiconify" : "")));
/* If asked to show (not deiconify) an withdrawn and iconified /* If asked to show (not deiconify) an withdrawn and iconified
* window, do that. * window, do that.
*/ */
if (!deiconify && if (!deiconify &&
!GDK_WINDOW_IS_MAPPED (window) && !already_mapped &&
(window->state & GDK_WINDOW_STATE_ICONIFIED)) (window->state & GDK_WINDOW_STATE_ICONIFIED))
{ {
ShowWindow (GDK_WINDOW_HWND (window), SW_MINIMIZE); ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWMINNOACTIVE);
return; return;
} }
@ -931,18 +930,13 @@ show_window_internal (GdkWindow *window,
/* If asked to show (but not raise) a window that is already /* If asked to show (but not raise) a window that is already
* visible, do nothing. * visible, do nothing.
*/ */
if (!deiconify && !raise && IsWindowVisible (GDK_WINDOW_HWND (window))) if (!deiconify && !already_mapped && IsWindowVisible (GDK_WINDOW_HWND (window)))
return; return;
/* Other cases */ /* Other cases */
if (!GDK_WINDOW_IS_MAPPED (window)) if (!already_mapped)
{
gdk_synthesize_window_state (window,
GDK_WINDOW_STATE_WITHDRAWN,
0);
focus_on_map = window->focus_on_map; focus_on_map = window->focus_on_map;
}
exstyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE); exstyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
@ -962,11 +956,9 @@ show_window_internal (GdkWindow *window,
*/ */
if (exstyle & WS_EX_TRANSPARENT) if (exstyle & WS_EX_TRANSPARENT)
{ {
UINT flags = SWP_SHOWWINDOW | SWP_NOREDRAW | SWP_NOMOVE | SWP_NOSIZE; UINT flags = SWP_SHOWWINDOW | SWP_NOREDRAW | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER;
if (!raise) if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TEMP || !focus_on_map)
flags |= SWP_NOZORDER;
if (!raise || GDK_WINDOW_TYPE (window) == GDK_WINDOW_TEMP || !focus_on_map)
flags |= SWP_NOACTIVATE; flags |= SWP_NOACTIVATE;
SetWindowPos (GDK_WINDOW_HWND (window), top, 0, 0, 0, 0, flags); SetWindowPos (GDK_WINDOW_HWND (window), top, 0, 0, 0, 0, flags);
@ -974,8 +966,6 @@ show_window_internal (GdkWindow *window,
return; return;
} }
old_active_window = GetActiveWindow ();
if (window->state & GDK_WINDOW_STATE_FULLSCREEN) if (window->state & GDK_WINDOW_STATE_FULLSCREEN)
{ {
gdk_window_fullscreen (window); gdk_window_fullscreen (window);
@ -986,7 +976,10 @@ show_window_internal (GdkWindow *window,
} }
else if (window->state & GDK_WINDOW_STATE_ICONIFIED) else if (window->state & GDK_WINDOW_STATE_ICONIFIED)
{ {
if (focus_on_map)
ShowWindow (GDK_WINDOW_HWND (window), SW_RESTORE); ShowWindow (GDK_WINDOW_HWND (window), SW_RESTORE);
else
ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWNOACTIVATE);
} }
else if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TEMP || !focus_on_map) else if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TEMP || !focus_on_map)
{ {
@ -996,39 +989,6 @@ show_window_internal (GdkWindow *window,
{ {
ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWNORMAL); ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWNORMAL);
} }
if (raise)
{
if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TEMP)
SetWindowPos (GDK_WINDOW_HWND (window), HWND_TOPMOST,
0, 0, 0, 0,
SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
else if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TOPLEVEL)
{
if (focus_on_map && window->accept_focus)
{
SetForegroundWindow (GDK_WINDOW_HWND (window));
if (top == HWND_TOPMOST)
SetWindowPos (GDK_WINDOW_HWND (window), top,
0, 0, 0, 0,
SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
}
else
{
SetWindowPos (GDK_WINDOW_HWND (window), top,
0, 0, 0, 0,
SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
}
}
else
{
BringWindowToTop (GDK_WINDOW_HWND (window));
}
}
else if (old_active_window != GDK_WINDOW_HWND (window))
{
SetActiveWindow (old_active_window);
}
} }
static void static void
@ -2634,7 +2594,7 @@ gdk_win32_window_deiconify (GdkWindow *window)
if (GDK_WINDOW_IS_MAPPED (window)) if (GDK_WINDOW_IS_MAPPED (window))
{ {
show_window_internal (window, FALSE, TRUE); show_window_internal (window, GDK_WINDOW_IS_MAPPED (window), TRUE);
} }
else else
{ {