mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-11-05 16:20:10 +00:00
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:
parent
4f9e1dd414
commit
f44c6d66bf
@ -1636,22 +1636,24 @@ doesnt_want_char (gint mask,
|
||||
return !(mask & (GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK));
|
||||
}
|
||||
|
||||
static void
|
||||
handle_configure_event (MSG *msg,
|
||||
GdkWindow *window)
|
||||
void
|
||||
_gdk_win32_emit_configure_event (GdkWindow *window)
|
||||
{
|
||||
RECT client_rect;
|
||||
POINT point;
|
||||
GdkWindowObject *window_object;
|
||||
HWND hwnd;
|
||||
|
||||
GetClientRect (msg->hwnd, &client_rect);
|
||||
hwnd = GDK_WINDOW_HWND (window);
|
||||
|
||||
GetClientRect (hwnd, &client_rect);
|
||||
point.x = client_rect.left; /* always 0 */
|
||||
point.y = client_rect.top;
|
||||
|
||||
/* top level windows need screen coords */
|
||||
if (gdk_window_get_parent (window) == _gdk_root)
|
||||
{
|
||||
ClientToScreen (msg->hwnd, &point);
|
||||
ClientToScreen (hwnd, &point);
|
||||
point.x += _gdk_offset_x;
|
||||
point.y += _gdk_offset_y;
|
||||
}
|
||||
@ -2985,7 +2987,7 @@ gdk_event_translate (MSG *msg,
|
||||
if (GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD &&
|
||||
!IsIconic (msg->hwnd) &&
|
||||
!GDK_WINDOW_DESTROYED (window))
|
||||
handle_configure_event (msg, window);
|
||||
_gdk_win32_emit_configure_event (window);
|
||||
|
||||
if (((GdkWindowObject *) window)->extension_events != 0)
|
||||
_gdk_input_configure_event (window);
|
||||
|
@ -493,6 +493,7 @@ HICON _gdk_win32_pixbuf_to_hcursor (GdkPixbuf *pixbuf,
|
||||
gboolean _gdk_win32_pixbuf_to_hicon_supports_alpha (void);
|
||||
|
||||
void _gdk_win32_append_event (GdkEvent *event);
|
||||
void _gdk_win32_emit_configure_event (GdkWindow *window);
|
||||
|
||||
|
||||
/* Initialization */
|
||||
|
@ -1170,7 +1170,10 @@ gdk_win32_window_move (GdkWindow *window,
|
||||
impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
|
||||
|
||||
if (private->state & GDK_WINDOW_STATE_FULLSCREEN)
|
||||
return;
|
||||
{
|
||||
_gdk_win32_emit_configure_event (window);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Don't check GDK_WINDOW_TYPE (private) == GDK_WINDOW_CHILD.
|
||||
* Foreign windows (another app's windows) might be children of our
|
||||
@ -1183,6 +1186,7 @@ gdk_win32_window_move (GdkWindow *window,
|
||||
else
|
||||
{
|
||||
RECT outer_rect;
|
||||
RECT current_rect;
|
||||
|
||||
get_outer_rect (window, private->width, private->height, &outer_rect);
|
||||
|
||||
@ -1196,6 +1200,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), ¤t_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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1222,7 +1234,10 @@ gdk_win32_window_resize (GdkWindow *window,
|
||||
impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
|
||||
|
||||
if (private->state & GDK_WINDOW_STATE_FULLSCREEN)
|
||||
return;
|
||||
{
|
||||
_gdk_win32_emit_configure_event (window);
|
||||
return;
|
||||
}
|
||||
|
||||
if (GetAncestor (GDK_WINDOW_HWND (window), GA_PARENT) != GetDesktopWindow ())
|
||||
{
|
||||
@ -1231,6 +1246,7 @@ gdk_win32_window_resize (GdkWindow *window,
|
||||
else
|
||||
{
|
||||
RECT outer_rect;
|
||||
RECT current_rect;
|
||||
|
||||
get_outer_rect (window, width, height, &outer_rect);
|
||||
|
||||
@ -1246,6 +1262,14 @@ gdk_win32_window_resize (GdkWindow *window,
|
||||
outer_rect.bottom - outer_rect.top,
|
||||
SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER));
|
||||
private->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), ¤t_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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1273,7 +1297,10 @@ gdk_win32_window_move_resize_internal (GdkWindow *window,
|
||||
impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
|
||||
|
||||
if (private->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),
|
||||
@ -1286,6 +1313,7 @@ gdk_win32_window_move_resize_internal (GdkWindow *window,
|
||||
else
|
||||
{
|
||||
RECT outer_rect;
|
||||
RECT current_rect;
|
||||
|
||||
get_outer_rect (window, width, height, &outer_rect);
|
||||
|
||||
@ -1303,6 +1331,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), ¤t_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);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user