win32: Ensure we always send a configure event when changing size/pos

There are some cases where we don't get a WINDOWPOSCHANGE such that
we generate a configure event, even if we called gdk_window_move_resize()
or similar. For instance:
* The window is fullscreen
* The window is maximized
* The specified pos/size is the same as the current one

However, as per X11 ConfigureNotify semantics we *always* want one, or
we could run into issue like e.g. bug #537296 where we're waiting for
the CONFIGURE to call gdk_window_thaw_toplevel_updates_libgtk_only().
This commit is contained in:
Alexander Larsson
2011-10-26 21:46:19 +02:00
parent 4c061a5270
commit 2dbc05f756
3 changed files with 50 additions and 9 deletions

View File

@ -1066,7 +1066,10 @@ gdk_win32_window_move (GdkWindow *window,
impl = GDK_WINDOW_IMPL_WIN32 (window->impl);
if (window->state & GDK_WINDOW_STATE_FULLSCREEN)
return;
{
_gdk_win32_emit_configure_event (window);
return;
}
/* Don't check GDK_WINDOW_TYPE (window) == GDK_WINDOW_CHILD.
* Foreign windows (another app's windows) might be children of our
@ -1079,6 +1082,7 @@ gdk_win32_window_move (GdkWindow *window,
else
{
RECT outer_rect;
RECT current_rect;
get_outer_rect (window, window->width, window->height, &outer_rect);
@ -1092,6 +1096,14 @@ gdk_win32_window_move (GdkWindow *window,
API_CALL (SetWindowPos, (GDK_WINDOW_HWND (window), NULL,
x - _gdk_offset_x, y - _gdk_offset_y, 0, 0,
SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER));
/* Ensure we always send a configure event, and SetWindowPos doesn't if the window
is maximized, or the position/size doesn't change */
GetWindowRect (GDK_WINDOW_HWND (window), &current_rect);
if (IsZoomed (GDK_WINDOW_HWND (window)) ||
(current_rect.left == x - _gdk_offset_x &&
current_rect.top == y - _gdk_offset_y))
_gdk_win32_emit_configure_event (window);
}
}
@ -1117,7 +1129,10 @@ gdk_win32_window_resize (GdkWindow *window,
impl = GDK_WINDOW_IMPL_WIN32 (window->impl);
if (window->state & GDK_WINDOW_STATE_FULLSCREEN)
return;
{
_gdk_win32_emit_configure_event (window);
return;
}
if (GetAncestor (GDK_WINDOW_HWND (window), GA_PARENT) != GetDesktopWindow ())
{
@ -1126,6 +1141,7 @@ gdk_win32_window_resize (GdkWindow *window,
else
{
RECT outer_rect;
RECT current_rect;
get_outer_rect (window, width, height, &outer_rect);
@ -1141,6 +1157,14 @@ gdk_win32_window_resize (GdkWindow *window,
outer_rect.bottom - outer_rect.top,
SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER));
window->resize_count += 1;
/* Ensure we always send a configure event, and SetWindowPos doesn't if the window
is maximized, or the position/size doesn't change */
GetWindowRect (GDK_WINDOW_HWND (window), &current_rect);
if (IsZoomed (GDK_WINDOW_HWND (window)) ||
(current_rect.right - current_rect.left == outer_rect.right - outer_rect.left &&
current_rect.bottom - current_rect.top == outer_rect.bottom - outer_rect.top))
_gdk_win32_emit_configure_event (window);
}
}
@ -1166,7 +1190,10 @@ gdk_win32_window_move_resize_internal (GdkWindow *window,
impl = GDK_WINDOW_IMPL_WIN32 (window->impl);
if (window->state & GDK_WINDOW_STATE_FULLSCREEN)
return;
{
_gdk_win32_emit_configure_event (window);
return;
}
GDK_NOTE (MISC, g_print ("gdk_win32_window_move_resize: %p: %dx%d@%+d%+d\n",
GDK_WINDOW_HWND (window),
@ -1179,6 +1206,7 @@ gdk_win32_window_move_resize_internal (GdkWindow *window,
else
{
RECT outer_rect;
RECT current_rect;
get_outer_rect (window, width, height, &outer_rect);
@ -1196,6 +1224,16 @@ gdk_win32_window_move_resize_internal (GdkWindow *window,
outer_rect.right - outer_rect.left,
outer_rect.bottom - outer_rect.top,
SWP_NOACTIVATE | SWP_NOZORDER));
/* Ensure we always send a configure event, and SetWindowPos doesn't if the window
is maximized, or the position/size doesn't change */
GetWindowRect (GDK_WINDOW_HWND (window), &current_rect);
if (IsZoomed (GDK_WINDOW_HWND (window)) ||
(current_rect.left == x - _gdk_offset_x &&
current_rect.top == y - _gdk_offset_y &&
current_rect.right - current_rect.left == outer_rect.right - outer_rect.left &&
current_rect.bottom - current_rect.top == outer_rect.bottom - outer_rect.top))
_gdk_win32_emit_configure_event (window);
}
}