winex11: Use the stored coordinates to convert back from X11 to window rectangle.
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
341192289b
commit
d7cd441373
|
@ -1077,17 +1077,13 @@ static BOOL X11DRV_ConfigureNotify( HWND hwnd, XEvent *xev )
|
|||
}
|
||||
else pos = root_to_virtual_screen( x, y );
|
||||
|
||||
rect.left = pos.x;
|
||||
rect.top = pos.y;
|
||||
rect.right = pos.x + event->width;
|
||||
rect.bottom = pos.y + event->height;
|
||||
X11DRV_X_to_window_rect( data, &rect, pos.x, pos.y, event->width, event->height );
|
||||
if (root_coords) MapWindowPoints( 0, parent, (POINT *)&rect, 2 );
|
||||
|
||||
TRACE( "win %p/%lx new X rect %d,%d,%dx%d (event %d,%d,%dx%d)\n",
|
||||
hwnd, data->whole_window, rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top,
|
||||
event->x, event->y, event->width, event->height );
|
||||
|
||||
X11DRV_X_to_window_rect( data, &rect );
|
||||
if (root_coords) MapWindowPoints( 0, parent, (POINT *)&rect, 2 );
|
||||
|
||||
/* Compare what has changed */
|
||||
|
||||
x = rect.left;
|
||||
|
@ -1155,7 +1151,8 @@ static BOOL X11DRV_GravityNotify( HWND hwnd, XEvent *xev )
|
|||
{
|
||||
XGravityEvent *event = &xev->xgravity;
|
||||
struct x11drv_win_data *data = get_win_data( hwnd );
|
||||
RECT rect, window_rect;
|
||||
RECT window_rect;
|
||||
int x, y;
|
||||
|
||||
if (!data) return FALSE;
|
||||
|
||||
|
@ -1165,22 +1162,18 @@ static BOOL X11DRV_GravityNotify( HWND hwnd, XEvent *xev )
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
rect.left = event->x;
|
||||
rect.top = event->y;
|
||||
rect.right = rect.left + data->whole_rect.right - data->whole_rect.left;
|
||||
rect.bottom = rect.top + data->whole_rect.bottom - data->whole_rect.top;
|
||||
x = event->x + data->window_rect.left - data->whole_rect.left;
|
||||
y = event->y + data->window_rect.top - data->whole_rect.top;
|
||||
|
||||
TRACE( "win %p/%lx new X rect %d,%d,%dx%d (event %d,%d)\n",
|
||||
hwnd, data->whole_window, rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top,
|
||||
event->x, event->y );
|
||||
TRACE( "win %p/%lx new X pos %d,%d (event %d,%d)\n",
|
||||
hwnd, data->whole_window, x, y, event->x, event->y );
|
||||
|
||||
X11DRV_X_to_window_rect( data, &rect );
|
||||
window_rect = data->window_rect;
|
||||
release_win_data( data );
|
||||
|
||||
if (window_rect.left != rect.left || window_rect.top != rect.top)
|
||||
SetWindowPos( hwnd, 0, rect.left, rect.top, 0, 0,
|
||||
SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOCOPYBITS );
|
||||
if (window_rect.left != x || window_rect.top != y)
|
||||
SetWindowPos( hwnd, 0, x, y, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOCOPYBITS );
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
|
@ -305,33 +305,6 @@ static unsigned long get_mwm_decorations( struct x11drv_win_data *data,
|
|||
}
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* get_x11_rect_offset
|
||||
*
|
||||
* Helper for X11DRV_window_to_X_rect and X11DRV_X_to_window_rect.
|
||||
*/
|
||||
static void get_x11_rect_offset( struct x11drv_win_data *data, RECT *rect )
|
||||
{
|
||||
DWORD style, ex_style, style_mask = 0, ex_style_mask = 0;
|
||||
unsigned long decor;
|
||||
|
||||
rect->top = rect->bottom = rect->left = rect->right = 0;
|
||||
|
||||
style = GetWindowLongW( data->hwnd, GWL_STYLE );
|
||||
ex_style = GetWindowLongW( data->hwnd, GWL_EXSTYLE );
|
||||
decor = get_mwm_decorations( data, style, ex_style );
|
||||
|
||||
if (decor & MWM_DECOR_TITLE) style_mask |= WS_CAPTION;
|
||||
if (decor & MWM_DECOR_BORDER)
|
||||
{
|
||||
style_mask |= WS_DLGFRAME | WS_THICKFRAME;
|
||||
ex_style_mask |= WS_EX_DLGMODALFRAME;
|
||||
}
|
||||
|
||||
AdjustWindowRectEx( rect, style & style_mask, FALSE, ex_style & ex_style_mask );
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* get_window_attributes
|
||||
*
|
||||
|
@ -1185,12 +1158,26 @@ void make_window_embedded( struct x11drv_win_data *data )
|
|||
*/
|
||||
static void X11DRV_window_to_X_rect( struct x11drv_win_data *data, RECT *rect )
|
||||
{
|
||||
DWORD style, ex_style, style_mask = 0, ex_style_mask = 0;
|
||||
unsigned long decor;
|
||||
RECT rc;
|
||||
|
||||
if (!data->managed) return;
|
||||
if (IsRectEmpty( rect )) return;
|
||||
|
||||
get_x11_rect_offset( data, &rc );
|
||||
style = GetWindowLongW( data->hwnd, GWL_STYLE );
|
||||
ex_style = GetWindowLongW( data->hwnd, GWL_EXSTYLE );
|
||||
decor = get_mwm_decorations( data, style, ex_style );
|
||||
|
||||
if (decor & MWM_DECOR_TITLE) style_mask |= WS_CAPTION;
|
||||
if (decor & MWM_DECOR_BORDER)
|
||||
{
|
||||
style_mask |= WS_DLGFRAME | WS_THICKFRAME;
|
||||
ex_style_mask |= WS_EX_DLGMODALFRAME;
|
||||
}
|
||||
|
||||
SetRectEmpty( &rc );
|
||||
AdjustWindowRectEx( &rc, style & style_mask, FALSE, ex_style & ex_style_mask );
|
||||
|
||||
rect->left -= rc.left;
|
||||
rect->right -= rc.right;
|
||||
|
@ -1206,21 +1193,15 @@ static void X11DRV_window_to_X_rect( struct x11drv_win_data *data, RECT *rect )
|
|||
*
|
||||
* Opposite of X11DRV_window_to_X_rect
|
||||
*/
|
||||
void X11DRV_X_to_window_rect( struct x11drv_win_data *data, RECT *rect )
|
||||
void X11DRV_X_to_window_rect( struct x11drv_win_data *data, RECT *rect, int x, int y, int cx, int cy )
|
||||
{
|
||||
RECT rc;
|
||||
|
||||
if (!data->managed) return;
|
||||
if (IsRectEmpty( rect )) return;
|
||||
|
||||
get_x11_rect_offset( data, &rc );
|
||||
|
||||
rect->left += rc.left;
|
||||
rect->right += rc.right;
|
||||
rect->top += rc.top;
|
||||
rect->bottom += rc.bottom;
|
||||
if (rect->top >= rect->bottom) rect->bottom = rect->top + 1;
|
||||
if (rect->left >= rect->right) rect->right = rect->left + 1;
|
||||
x += data->window_rect.left - data->whole_rect.left;
|
||||
y += data->window_rect.top - data->whole_rect.top;
|
||||
cx += (data->window_rect.right - data->window_rect.left) -
|
||||
(data->whole_rect.right - data->whole_rect.left);
|
||||
cy += (data->window_rect.bottom - data->window_rect.top) -
|
||||
(data->whole_rect.bottom - data->whole_rect.top);
|
||||
SetRect( rect, x, y, x + cx, y + cy );
|
||||
}
|
||||
|
||||
|
||||
|
@ -1531,8 +1512,6 @@ static void create_whole_window( struct x11drv_win_data *data )
|
|||
|
||||
mask = get_window_attributes( data, &attr );
|
||||
|
||||
data->whole_rect = data->window_rect;
|
||||
X11DRV_window_to_X_rect( data, &data->whole_rect );
|
||||
if (!(cx = data->whole_rect.right - data->whole_rect.left)) cx = 1;
|
||||
else if (cx > 65535) cx = 65535;
|
||||
if (!(cy = data->whole_rect.bottom - data->whole_rect.top)) cy = 1;
|
||||
|
@ -2517,11 +2496,7 @@ UINT CDECL X11DRV_ShowWindow( HWND hwnd, INT cmd, RECT *rect, UINT swp )
|
|||
&root, &x, &y, &width, &height, &border, &depth );
|
||||
XTranslateCoordinates( thread_data->display, data->whole_window, root, 0, 0, &x, &y, &top );
|
||||
pos = root_to_virtual_screen( x, y );
|
||||
rect->left = pos.x;
|
||||
rect->top = pos.y;
|
||||
rect->right = pos.x + width;
|
||||
rect->bottom = pos.y + height;
|
||||
X11DRV_X_to_window_rect( data, rect );
|
||||
X11DRV_X_to_window_rect( data, rect, pos.x, pos.y, width, height );
|
||||
swp &= ~(SWP_NOMOVE | SWP_NOCLIENTMOVE | SWP_NOSIZE | SWP_NOCLIENTSIZE);
|
||||
|
||||
done:
|
||||
|
|
|
@ -633,7 +633,7 @@ typedef int (*x11drv_error_callback)( Display *display, XErrorEvent *event, void
|
|||
|
||||
extern void X11DRV_expect_error( Display *display, x11drv_error_callback callback, void *arg ) DECLSPEC_HIDDEN;
|
||||
extern int X11DRV_check_error(void) DECLSPEC_HIDDEN;
|
||||
extern void X11DRV_X_to_window_rect( struct x11drv_win_data *data, RECT *rect ) DECLSPEC_HIDDEN;
|
||||
extern void X11DRV_X_to_window_rect( struct x11drv_win_data *data, RECT *rect, int x, int y, int cx, int cy ) DECLSPEC_HIDDEN;
|
||||
extern POINT virtual_screen_to_root( INT x, INT y ) DECLSPEC_HIDDEN;
|
||||
extern POINT root_to_virtual_screen( INT x, INT y ) DECLSPEC_HIDDEN;
|
||||
extern RECT get_virtual_screen_rect(void) DECLSPEC_HIDDEN;
|
||||
|
|
Loading…
Reference in New Issue