GDK W32: Don't use SetWindowLong() to set/unset WS_EX_TOPMOST

While searching for the cause of bug 746745 it was discovered that one could
not set WS_EX_TOPMOST extended window style with SetWindowLong(),
but must use SetWindowPos() for that purpose.

This was never a problem most likely because it is highly unlikely for windows
to acquire/lose WS_EX_TOPMOST after they are created, by means other
than SetWindowPos() (which GTK does use to raise/lower windows and
set/remove keep_above), and because trying to set/unset WS_EX_TOPMOST with
SetWindowLong() results in WS_EX_TOPMOST merely not being set/unset (that is,
other styles are still set/unset within the same call and no error is
signalled).

https://bugzilla.gnome.org/show_bug.cgi?id=758483
This commit is contained in:
Руслан Ижбулатов 2015-11-21 03:48:55 +00:00
parent 1e11b55606
commit db1b24233e

View File

@ -2402,6 +2402,10 @@ update_style_bits (GdkWindow *window)
LONG old_style, new_style, old_exstyle, new_exstyle; LONG old_style, new_style, old_exstyle, new_exstyle;
gboolean all; gboolean all;
RECT rect, before, after; RECT rect, before, after;
gboolean was_topmost;
gboolean will_be_topmost;
HWND insert_after;
UINT flags;
if (window->state & GDK_WINDOW_STATE_FULLSCREEN) if (window->state & GDK_WINDOW_STATE_FULLSCREEN)
return; return;
@ -2413,15 +2417,27 @@ update_style_bits (GdkWindow *window)
after = before; after = before;
AdjustWindowRectEx (&before, old_style, FALSE, old_exstyle); AdjustWindowRectEx (&before, old_style, FALSE, old_exstyle);
was_topmost = (old_exstyle & WS_EX_TOPMOST) ? TRUE : FALSE;
will_be_topmost = was_topmost;
old_exstyle &= ~WS_EX_TOPMOST;
new_style = old_style; new_style = old_style;
new_exstyle = old_exstyle; new_exstyle = old_exstyle;
if (window->window_type == GDK_WINDOW_TEMP) if (window->window_type == GDK_WINDOW_TEMP)
new_exstyle |= WS_EX_TOOLWINDOW | WS_EX_TOPMOST; {
new_exstyle |= WS_EX_TOOLWINDOW;
will_be_topmost = TRUE;
}
else if (impl->type_hint == GDK_WINDOW_TYPE_HINT_UTILITY) else if (impl->type_hint == GDK_WINDOW_TYPE_HINT_UTILITY)
new_exstyle |= WS_EX_TOOLWINDOW ; {
new_exstyle |= WS_EX_TOOLWINDOW;
}
else else
new_exstyle &= ~WS_EX_TOOLWINDOW; {
new_exstyle &= ~WS_EX_TOOLWINDOW;
}
if (get_effective_window_decorations (window, &decorations)) if (get_effective_window_decorations (window, &decorations))
{ {
@ -2469,12 +2485,26 @@ update_style_bits (GdkWindow *window)
rect.right += after.right - before.right; rect.right += after.right - before.right;
rect.bottom += after.bottom - before.bottom; rect.bottom += after.bottom - before.bottom;
SetWindowPos (GDK_WINDOW_HWND (window), NULL, flags = SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOREPOSITION;
rect.left, rect.top,
rect.right - rect.left, rect.bottom - rect.top,
SWP_FRAMECHANGED | SWP_NOACTIVATE |
SWP_NOREPOSITION | SWP_NOZORDER);
if (will_be_topmost && !was_topmost)
{
insert_after = HWND_TOPMOST;
}
else if (was_topmost && !will_be_topmost)
{
insert_after = HWND_NOTOPMOST;
}
else
{
flags |= SWP_NOZORDER;
insert_after = NULL;
}
SetWindowPos (GDK_WINDOW_HWND (window), insert_after,
0, 0,
rect.right - rect.left, rect.bottom - rect.top,
flags);
} }
static void static void