mirror of
https://gitlab.winehq.org/wine/wine.git
synced 2024-11-19 17:06:04 -07:00
winex11: Introduce a new window_update_client_config helper.
This commit is contained in:
parent
d9cf4678a1
commit
ae6366b33c
Notes:
Alexandre Julliard
2024-11-15 22:25:39 +01:00
Approved-by: Alexandre Julliard (@julliard) Merge-Request: https://gitlab.winehq.org/wine/wine/merge_requests/6820
3 changed files with 43 additions and 64 deletions
|
@ -1104,8 +1104,7 @@ static BOOL X11DRV_ConfigureNotify( HWND hwnd, XEvent *xev )
|
||||||
struct x11drv_win_data *data;
|
struct x11drv_win_data *data;
|
||||||
RECT rect;
|
RECT rect;
|
||||||
POINT pos = {event->x, event->y};
|
POINT pos = {event->x, event->y};
|
||||||
UINT style, flags = 0, config_cmd = 0;
|
UINT config_cmd;
|
||||||
int cx, cy, x, y;
|
|
||||||
|
|
||||||
if (!hwnd) return FALSE;
|
if (!hwnd) return FALSE;
|
||||||
if (!(data = get_win_data( hwnd ))) return FALSE;
|
if (!(data = get_win_data( hwnd ))) return FALSE;
|
||||||
|
@ -1124,68 +1123,8 @@ static BOOL X11DRV_ConfigureNotify( HWND hwnd, XEvent *xev )
|
||||||
SetRect( &rect, pos.x, pos.y, pos.x + event->width, pos.y + event->height );
|
SetRect( &rect, pos.x, pos.y, pos.x + event->width, pos.y + event->height );
|
||||||
window_configure_notify( data, event->serial, &rect );
|
window_configure_notify( data, event->serial, &rect );
|
||||||
|
|
||||||
if (!data->mapped || data->iconic) goto done;
|
config_cmd = window_update_client_config( data );
|
||||||
if (!data->whole_window || !data->managed) goto done;
|
rect = window_rect_from_visible( &data->rects, data->current_state.rect );
|
||||||
if (data->configure_serial && (long)(data->configure_serial - event->serial) > 0)
|
|
||||||
{
|
|
||||||
TRACE( "win %p/%lx event %d,%d,%dx%d ignoring old serial %lu/%lu\n",
|
|
||||||
hwnd, data->whole_window, event->x, event->y, event->width, event->height,
|
|
||||||
event->serial, data->configure_serial );
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
rect = window_rect_from_visible( &data->rects, rect );
|
|
||||||
|
|
||||||
TRACE( "win %p/%lx new X rect %d,%d,%dx%d (event %d,%d,%dx%d)\n",
|
|
||||||
hwnd, data->whole_window, (int)rect.left, (int)rect.top,
|
|
||||||
(int)(rect.right-rect.left), (int)(rect.bottom-rect.top),
|
|
||||||
event->x, event->y, event->width, event->height );
|
|
||||||
|
|
||||||
/* Compare what has changed */
|
|
||||||
|
|
||||||
x = rect.left;
|
|
||||||
y = rect.top;
|
|
||||||
cx = rect.right - rect.left;
|
|
||||||
cy = rect.bottom - rect.top;
|
|
||||||
flags = SWP_NOACTIVATE | SWP_NOZORDER;
|
|
||||||
|
|
||||||
if (!data->whole_window) flags |= SWP_NOCOPYBITS; /* we can't copy bits of foreign windows */
|
|
||||||
|
|
||||||
if (data->rects.window.left == x && data->rects.window.top == y) flags |= SWP_NOMOVE;
|
|
||||||
else
|
|
||||||
TRACE( "%p moving from (%d,%d) to (%d,%d)\n",
|
|
||||||
hwnd, (int)data->rects.window.left, (int)data->rects.window.top, x, y );
|
|
||||||
|
|
||||||
if ((data->rects.window.right - data->rects.window.left == cx &&
|
|
||||||
data->rects.window.bottom - data->rects.window.top == cy) ||
|
|
||||||
IsRectEmpty( &data->rects.window ))
|
|
||||||
flags |= SWP_NOSIZE;
|
|
||||||
else
|
|
||||||
TRACE( "%p resizing from (%dx%d) to (%dx%d)\n",
|
|
||||||
hwnd, (int)(data->rects.window.right - data->rects.window.left),
|
|
||||||
(int)(data->rects.window.bottom - data->rects.window.top), cx, cy );
|
|
||||||
|
|
||||||
style = NtUserGetWindowLongW( data->hwnd, GWL_STYLE );
|
|
||||||
if ((style & WS_CAPTION) == WS_CAPTION || !data->is_fullscreen)
|
|
||||||
{
|
|
||||||
if ((data->current_state.net_wm_state & (1 << NET_WM_STATE_MAXIMIZED)) && !(style & WS_MAXIMIZE))
|
|
||||||
{
|
|
||||||
TRACE( "window %p/%lx is maximized\n", data->hwnd, data->whole_window );
|
|
||||||
config_cmd = SC_MAXIMIZE;
|
|
||||||
}
|
|
||||||
else if (!(data->current_state.net_wm_state & (1 << NET_WM_STATE_MAXIMIZED)) && (style & WS_MAXIMIZE))
|
|
||||||
{
|
|
||||||
TRACE( "window %p/%lx is no longer maximized\n", data->hwnd, data->whole_window );
|
|
||||||
config_cmd = SC_RESTORE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!config_cmd && (flags & (SWP_NOSIZE | SWP_NOMOVE)) != (SWP_NOSIZE | SWP_NOMOVE))
|
|
||||||
{
|
|
||||||
TRACE( "window %p/%lx config changed %s -> %s, flags %#x\n", data->hwnd, data->whole_window,
|
|
||||||
wine_dbgstr_rect(&data->rects.window), wine_dbgstr_rect(&rect), flags );
|
|
||||||
config_cmd = MAKELONG(SC_MOVE, flags);
|
|
||||||
}
|
|
||||||
done:
|
|
||||||
release_win_data( data );
|
release_win_data( data );
|
||||||
|
|
||||||
if (config_cmd)
|
if (config_cmd)
|
||||||
|
|
|
@ -1531,6 +1531,45 @@ UINT window_update_client_state( struct x11drv_win_data *data )
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UINT window_update_client_config( struct x11drv_win_data *data )
|
||||||
|
{
|
||||||
|
UINT old_style = NtUserGetWindowLongW( data->hwnd, GWL_STYLE ), flags;
|
||||||
|
RECT rect, old_rect = data->rects.window, new_rect;
|
||||||
|
|
||||||
|
if (!data->managed) return 0; /* unmanaged windows are managed by the Win32 side */
|
||||||
|
if (!data->mapped) return 0; /* ignore config changes on invisible windows */
|
||||||
|
if (data->iconic) return 0; /* ignore config changes on minimized windows */
|
||||||
|
|
||||||
|
if (data->configure_serial) return 0; /* another config update is pending, wait for it to complete */
|
||||||
|
|
||||||
|
if ((old_style & WS_CAPTION) == WS_CAPTION || !data->is_fullscreen)
|
||||||
|
{
|
||||||
|
if ((data->current_state.net_wm_state & (1 << NET_WM_STATE_MAXIMIZED)) && !(old_style & WS_MAXIMIZE))
|
||||||
|
{
|
||||||
|
TRACE( "window %p/%lx is maximized\n", data->hwnd, data->whole_window );
|
||||||
|
return SC_MAXIMIZE;
|
||||||
|
}
|
||||||
|
if (!(data->current_state.net_wm_state & (1 << NET_WM_STATE_MAXIMIZED)) && (old_style & WS_MAXIMIZE))
|
||||||
|
{
|
||||||
|
TRACE( "window %p/%lx is no longer maximized\n", data->hwnd, data->whole_window );
|
||||||
|
return SC_RESTORE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
flags = SWP_NOACTIVATE | SWP_NOZORDER;
|
||||||
|
rect = new_rect = window_rect_from_visible( &data->rects, data->current_state.rect );
|
||||||
|
if (new_rect.left == old_rect.left && new_rect.top == old_rect.top) flags |= SWP_NOMOVE;
|
||||||
|
else OffsetRect( &rect, old_rect.left - new_rect.left, old_rect.top - new_rect.top );
|
||||||
|
if (rect.right == old_rect.right && rect.bottom == old_rect.bottom) flags |= SWP_NOSIZE;
|
||||||
|
else if (IsRectEmpty( &rect )) flags |= SWP_NOSIZE;
|
||||||
|
|
||||||
|
if ((flags & (SWP_NOSIZE | SWP_NOMOVE)) == (SWP_NOSIZE | SWP_NOMOVE)) return 0;
|
||||||
|
|
||||||
|
TRACE( "window %p/%lx config changed %s -> %s, flags %#x\n", data->hwnd, data->whole_window,
|
||||||
|
wine_dbgstr_rect(&old_rect), wine_dbgstr_rect(&new_rect), flags );
|
||||||
|
return MAKELONG(SC_MOVE, flags);
|
||||||
|
}
|
||||||
|
|
||||||
void window_wm_state_notify( struct x11drv_win_data *data, unsigned long serial, UINT value )
|
void window_wm_state_notify( struct x11drv_win_data *data, unsigned long serial, UINT value )
|
||||||
{
|
{
|
||||||
UINT *pending = &data->pending_state.wm_state, *current = &data->current_state.wm_state;
|
UINT *pending = &data->pending_state.wm_state, *current = &data->current_state.wm_state;
|
||||||
|
|
|
@ -663,6 +663,7 @@ extern void window_wm_state_notify( struct x11drv_win_data *data, unsigned long
|
||||||
extern void window_net_wm_state_notify( struct x11drv_win_data *data, unsigned long serial, UINT value );
|
extern void window_net_wm_state_notify( struct x11drv_win_data *data, unsigned long serial, UINT value );
|
||||||
extern void window_configure_notify( struct x11drv_win_data *data, unsigned long serial, const RECT *rect );
|
extern void window_configure_notify( struct x11drv_win_data *data, unsigned long serial, const RECT *rect );
|
||||||
extern UINT window_update_client_state( struct x11drv_win_data *data );
|
extern UINT window_update_client_state( struct x11drv_win_data *data );
|
||||||
|
extern UINT window_update_client_config( struct x11drv_win_data *data );
|
||||||
|
|
||||||
extern void wait_for_withdrawn_state( HWND hwnd, BOOL set );
|
extern void wait_for_withdrawn_state( HWND hwnd, BOOL set );
|
||||||
extern Window init_clip_window(void);
|
extern Window init_clip_window(void);
|
||||||
|
|
Loading…
Reference in a new issue