Commit 9f1f29cc authored by Alexandre Julliard's avatar Alexandre Julliard

winex11: Add a helper function to return the virtual screen rectangle.

parent 0b71e0bf
...@@ -171,6 +171,7 @@ struct desktop_resize_data ...@@ -171,6 +171,7 @@ struct desktop_resize_data
{ {
RECT old_screen_rect; RECT old_screen_rect;
RECT old_virtual_rect; RECT old_virtual_rect;
RECT new_virtual_rect;
}; };
static BOOL CALLBACK update_windows_on_desktop_resize( HWND hwnd, LPARAM lparam ) static BOOL CALLBACK update_windows_on_desktop_resize( HWND hwnd, LPARAM lparam )
...@@ -184,8 +185,8 @@ static BOOL CALLBACK update_windows_on_desktop_resize( HWND hwnd, LPARAM lparam ...@@ -184,8 +185,8 @@ static BOOL CALLBACK update_windows_on_desktop_resize( HWND hwnd, LPARAM lparam
/* update the full screen state */ /* update the full screen state */
update_net_wm_states( data ); update_net_wm_states( data );
if (resize_data->old_virtual_rect.left != virtual_screen_rect.left) mask |= CWX; if (resize_data->old_virtual_rect.left != resize_data->new_virtual_rect.left) mask |= CWX;
if (resize_data->old_virtual_rect.top != virtual_screen_rect.top) mask |= CWY; if (resize_data->old_virtual_rect.top != resize_data->new_virtual_rect.top) mask |= CWY;
if (mask && data->whole_window) if (mask && data->whole_window)
{ {
POINT pos = virtual_screen_to_root( data->whole_rect.left, data->whole_rect.top ); POINT pos = virtual_screen_to_root( data->whole_rect.left, data->whole_rect.top );
...@@ -246,9 +247,10 @@ void X11DRV_resize_desktop( unsigned int width, unsigned int height ) ...@@ -246,9 +247,10 @@ void X11DRV_resize_desktop( unsigned int width, unsigned int height )
struct desktop_resize_data resize_data; struct desktop_resize_data resize_data;
SetRect( &resize_data.old_screen_rect, 0, 0, screen_width, screen_height ); SetRect( &resize_data.old_screen_rect, 0, 0, screen_width, screen_height );
resize_data.old_virtual_rect = virtual_screen_rect; resize_data.old_virtual_rect = get_virtual_screen_rect();
xinerama_init( width, height ); xinerama_init( width, height );
resize_data.new_virtual_rect = get_virtual_screen_rect();
if (GetWindowThreadProcessId( hwnd, NULL ) != GetCurrentThreadId()) if (GetWindowThreadProcessId( hwnd, NULL ) != GetCurrentThreadId())
{ {
...@@ -258,9 +260,9 @@ void X11DRV_resize_desktop( unsigned int width, unsigned int height ) ...@@ -258,9 +260,9 @@ void X11DRV_resize_desktop( unsigned int width, unsigned int height )
{ {
TRACE( "desktop %p change to (%dx%d)\n", hwnd, width, height ); TRACE( "desktop %p change to (%dx%d)\n", hwnd, width, height );
update_desktop_fullscreen( width, height ); update_desktop_fullscreen( width, height );
SetWindowPos( hwnd, 0, virtual_screen_rect.left, virtual_screen_rect.top, SetWindowPos( hwnd, 0, resize_data.new_virtual_rect.left, resize_data.new_virtual_rect.top,
virtual_screen_rect.right - virtual_screen_rect.left, resize_data.new_virtual_rect.right - resize_data.new_virtual_rect.left,
virtual_screen_rect.bottom - virtual_screen_rect.top, resize_data.new_virtual_rect.bottom - resize_data.new_virtual_rect.top,
SWP_NOZORDER | SWP_NOACTIVATE | SWP_DEFERERASE ); SWP_NOZORDER | SWP_NOACTIVATE | SWP_DEFERERASE );
ungrab_clipping_window(); ungrab_clipping_window();
SendMessageTimeoutW( HWND_BROADCAST, WM_DISPLAYCHANGE, screen_bpp, SendMessageTimeoutW( HWND_BROADCAST, WM_DISPLAYCHANGE, screen_bpp,
......
...@@ -128,8 +128,8 @@ static BOOL X11DRV_CreateDC( PHYSDEV *pdev, LPCWSTR driver, LPCWSTR device, ...@@ -128,8 +128,8 @@ static BOOL X11DRV_CreateDC( PHYSDEV *pdev, LPCWSTR driver, LPCWSTR device,
physDev->depth = default_visual.depth; physDev->depth = default_visual.depth;
physDev->color_shifts = &X11DRV_PALETTE_default_shifts; physDev->color_shifts = &X11DRV_PALETTE_default_shifts;
SetRect( &physDev->dc_rect, 0, 0, virtual_screen_rect.right - virtual_screen_rect.left, physDev->dc_rect = get_virtual_screen_rect();
virtual_screen_rect.bottom - virtual_screen_rect.top ); OffsetRect( &physDev->dc_rect, -physDev->dc_rect.left, -physDev->dc_rect.top );
push_dc_driver( pdev, &physDev->dev, &x11drv_funcs ); push_dc_driver( pdev, &physDev->dev, &x11drv_funcs );
if (xrender_funcs && !xrender_funcs->pCreateDC( pdev, driver, device, output, initData )) return FALSE; if (xrender_funcs && !xrender_funcs->pCreateDC( pdev, driver, device, output, initData )) return FALSE;
return TRUE; return TRUE;
...@@ -212,9 +212,15 @@ static INT X11DRV_GetDeviceCaps( PHYSDEV dev, INT cap ) ...@@ -212,9 +212,15 @@ static INT X11DRV_GetDeviceCaps( PHYSDEV dev, INT cap )
case VERTRES: case VERTRES:
return screen_height; return screen_height;
case DESKTOPHORZRES: case DESKTOPHORZRES:
return virtual_screen_rect.right - virtual_screen_rect.left; {
RECT virtual_rect = get_virtual_screen_rect();
return virtual_rect.right - virtual_rect.left;
}
case DESKTOPVERTRES: case DESKTOPVERTRES:
return virtual_screen_rect.bottom - virtual_screen_rect.top; {
RECT virtual_rect = get_virtual_screen_rect();
return virtual_rect.bottom - virtual_rect.top;
}
case BITSPIXEL: case BITSPIXEL:
return screen_bpp; return screen_bpp;
case PLANES: case PLANES:
......
...@@ -473,11 +473,11 @@ LRESULT clip_cursor_notify( HWND hwnd, HWND new_clip_hwnd ) ...@@ -473,11 +473,11 @@ LRESULT clip_cursor_notify( HWND hwnd, HWND new_clip_hwnd )
} }
else if (hwnd == GetForegroundWindow()) /* request to clip */ else if (hwnd == GetForegroundWindow()) /* request to clip */
{ {
RECT clip; RECT clip, virtual_rect = get_virtual_screen_rect();
GetClipCursor( &clip ); GetClipCursor( &clip );
if (clip.left > virtual_screen_rect.left || clip.right < virtual_screen_rect.right || if (clip.left > virtual_rect.left || clip.right < virtual_rect.right ||
clip.top > virtual_screen_rect.top || clip.bottom < virtual_screen_rect.bottom) clip.top > virtual_rect.top || clip.bottom < virtual_rect.bottom)
return grab_clipping_window( &clip ); return grab_clipping_window( &clip );
} }
return 0; return 0;
...@@ -512,7 +512,8 @@ BOOL clip_fullscreen_window( HWND hwnd, BOOL reset ) ...@@ -512,7 +512,8 @@ BOOL clip_fullscreen_window( HWND hwnd, BOOL reset )
SetRect( &rect, 0, 0, screen_width, screen_height ); SetRect( &rect, 0, 0, screen_width, screen_height );
if (!grab_fullscreen) if (!grab_fullscreen)
{ {
if (!EqualRect( &rect, &virtual_screen_rect )) return FALSE; RECT virtual_rect = get_virtual_screen_rect();
if (!EqualRect( &rect, &virtual_rect )) return FALSE;
if (root_window != DefaultRootWindow( gdi_display )) return FALSE; if (root_window != DefaultRootWindow( gdi_display )) return FALSE;
} }
TRACE( "win %p clipping fullscreen\n", hwnd ); TRACE( "win %p clipping fullscreen\n", hwnd );
...@@ -1382,15 +1383,17 @@ BOOL CDECL X11DRV_GetCursorPos(LPPOINT pos) ...@@ -1382,15 +1383,17 @@ BOOL CDECL X11DRV_GetCursorPos(LPPOINT pos)
*/ */
BOOL CDECL X11DRV_ClipCursor( LPCRECT clip ) BOOL CDECL X11DRV_ClipCursor( LPCRECT clip )
{ {
if (!clip) clip = &virtual_screen_rect; RECT virtual_rect = get_virtual_screen_rect();
if (!clip) clip = &virtual_rect;
if (grab_pointer) if (grab_pointer)
{ {
HWND foreground = GetForegroundWindow(); HWND foreground = GetForegroundWindow();
/* we are clipping if the clip rectangle is smaller than the screen */ /* we are clipping if the clip rectangle is smaller than the screen */
if (clip->left > virtual_screen_rect.left || clip->right < virtual_screen_rect.right || if (clip->left > virtual_rect.left || clip->right < virtual_rect.right ||
clip->top > virtual_screen_rect.top || clip->bottom < virtual_screen_rect.bottom) clip->top > virtual_rect.top || clip->bottom < virtual_rect.bottom)
{ {
DWORD tid, pid; DWORD tid, pid;
...@@ -1616,6 +1619,7 @@ static void X11DRV_RawMotion( XGenericEventCookie *xev ) ...@@ -1616,6 +1619,7 @@ static void X11DRV_RawMotion( XGenericEventCookie *xev )
{ {
XIRawEvent *event = xev->data; XIRawEvent *event = xev->data;
const double *values = event->valuators.values; const double *values = event->valuators.values;
RECT virtual_rect;
INPUT input; INPUT input;
int i, j; int i, j;
double dx = 0, dy = 0; double dx = 0, dy = 0;
...@@ -1632,6 +1636,7 @@ static void X11DRV_RawMotion( XGenericEventCookie *xev ) ...@@ -1632,6 +1636,7 @@ static void X11DRV_RawMotion( XGenericEventCookie *xev )
input.u.mi.dx = 0; input.u.mi.dx = 0;
input.u.mi.dy = 0; input.u.mi.dy = 0;
virtual_rect = get_virtual_screen_rect();
for (i = 0; i < thread_data->xi2_device_count; ++i) for (i = 0; i < thread_data->xi2_device_count; ++i)
{ {
if (devices[i].deviceid != event->deviceid) continue; if (devices[i].deviceid != event->deviceid) continue;
...@@ -1648,7 +1653,7 @@ static void X11DRV_RawMotion( XGenericEventCookie *xev ) ...@@ -1648,7 +1653,7 @@ static void X11DRV_RawMotion( XGenericEventCookie *xev )
{ {
input.u.mi.dx = dx = val; input.u.mi.dx = dx = val;
if (class->min < class->max) if (class->min < class->max)
input.u.mi.dx = val * (virtual_screen_rect.right - virtual_screen_rect.left) input.u.mi.dx = val * (virtual_rect.right - virtual_rect.left)
/ (class->max - class->min); / (class->max - class->min);
} }
else if (class->label == x11drv_atom( Rel_Y ) || else if (class->label == x11drv_atom( Rel_Y ) ||
...@@ -1656,7 +1661,7 @@ static void X11DRV_RawMotion( XGenericEventCookie *xev ) ...@@ -1656,7 +1661,7 @@ static void X11DRV_RawMotion( XGenericEventCookie *xev )
{ {
input.u.mi.dy = dy = val; input.u.mi.dy = dy = val;
if (class->min < class->max) if (class->min < class->max)
input.u.mi.dy = val * (virtual_screen_rect.bottom - virtual_screen_rect.top) input.u.mi.dy = val * (virtual_rect.bottom - virtual_rect.top)
/ (class->max - class->min); / (class->max - class->min);
} }
} }
......
...@@ -1684,15 +1684,17 @@ BOOL CDECL X11DRV_CreateDesktopWindow( HWND hwnd ) ...@@ -1684,15 +1684,17 @@ BOOL CDECL X11DRV_CreateDesktopWindow( HWND hwnd )
if (!width && !height) /* not initialized yet */ if (!width && !height) /* not initialized yet */
{ {
RECT rect = get_virtual_screen_rect();
SERVER_START_REQ( set_window_pos ) SERVER_START_REQ( set_window_pos )
{ {
req->handle = wine_server_user_handle( hwnd ); req->handle = wine_server_user_handle( hwnd );
req->previous = 0; req->previous = 0;
req->swp_flags = SWP_NOZORDER; req->swp_flags = SWP_NOZORDER;
req->window.left = virtual_screen_rect.left; req->window.left = rect.left;
req->window.top = virtual_screen_rect.top; req->window.top = rect.top;
req->window.right = virtual_screen_rect.right; req->window.right = rect.right;
req->window.bottom = virtual_screen_rect.bottom; req->window.bottom = rect.bottom;
req->client = req->window; req->client = req->window;
wine_server_call( req ); wine_server_call( req );
} }
...@@ -2016,9 +2018,8 @@ void CDECL X11DRV_ReleaseDC( HWND hwnd, HDC hdc ) ...@@ -2016,9 +2018,8 @@ void CDECL X11DRV_ReleaseDC( HWND hwnd, HDC hdc )
escape.hwnd = GetDesktopWindow(); escape.hwnd = GetDesktopWindow();
escape.drawable = root_window; escape.drawable = root_window;
escape.mode = IncludeInferiors; escape.mode = IncludeInferiors;
SetRect( &escape.dc_rect, 0, 0, virtual_screen_rect.right - virtual_screen_rect.left, escape.dc_rect = get_virtual_screen_rect();
virtual_screen_rect.bottom - virtual_screen_rect.top ); OffsetRect( &escape.dc_rect, -2 * escape.dc_rect.left, -2 * escape.dc_rect.top );
OffsetRect( &escape.dc_rect, -virtual_screen_rect.left, -virtual_screen_rect.top );
escape.fbconfig_id = 0; escape.fbconfig_id = 0;
ExtEscape( hdc, X11DRV_ESCAPE, sizeof(escape), (LPSTR)&escape, 0, NULL ); ExtEscape( hdc, X11DRV_ESCAPE, sizeof(escape), (LPSTR)&escape, 0, NULL );
} }
...@@ -2123,9 +2124,9 @@ done: ...@@ -2123,9 +2124,9 @@ done:
static inline RECT get_surface_rect( const RECT *visible_rect ) static inline RECT get_surface_rect( const RECT *visible_rect )
{ {
RECT rect; RECT rect = get_virtual_screen_rect();
IntersectRect( &rect, visible_rect, &virtual_screen_rect ); IntersectRect( &rect, &rect, visible_rect );
OffsetRect( &rect, -visible_rect->left, -visible_rect->top ); OffsetRect( &rect, -visible_rect->left, -visible_rect->top );
rect.left &= ~31; rect.left &= ~31;
rect.top &= ~31; rect.top &= ~31;
......
...@@ -367,7 +367,6 @@ extern int clipping_cursor DECLSPEC_HIDDEN; ...@@ -367,7 +367,6 @@ extern int clipping_cursor DECLSPEC_HIDDEN;
extern unsigned int screen_width DECLSPEC_HIDDEN; extern unsigned int screen_width DECLSPEC_HIDDEN;
extern unsigned int screen_height DECLSPEC_HIDDEN; extern unsigned int screen_height DECLSPEC_HIDDEN;
extern unsigned int screen_bpp DECLSPEC_HIDDEN; extern unsigned int screen_bpp DECLSPEC_HIDDEN;
extern RECT virtual_screen_rect DECLSPEC_HIDDEN;
extern int use_xkb DECLSPEC_HIDDEN; extern int use_xkb DECLSPEC_HIDDEN;
extern int usexrandr DECLSPEC_HIDDEN; extern int usexrandr DECLSPEC_HIDDEN;
extern int usexvidmode DECLSPEC_HIDDEN; extern int usexvidmode DECLSPEC_HIDDEN;
...@@ -599,20 +598,6 @@ static inline void mirror_rect( const RECT *window_rect, RECT *rect ) ...@@ -599,20 +598,6 @@ static inline void mirror_rect( const RECT *window_rect, RECT *rect )
rect->right = width - tmp; rect->right = width - tmp;
} }
static inline BOOL is_window_rect_mapped( const RECT *rect )
{
return (rect->left < virtual_screen_rect.right &&
rect->top < virtual_screen_rect.bottom &&
max( rect->right, rect->left + 1 ) > virtual_screen_rect.left &&
max( rect->bottom, rect->top + 1 ) > virtual_screen_rect.top);
}
static inline BOOL is_window_rect_fullscreen( const RECT *rect )
{
return (rect->left <= 0 && rect->right >= screen_width &&
rect->top <= 0 && rect->bottom >= screen_height);
}
/* X context to associate a hwnd to an X window */ /* X context to associate a hwnd to an X window */
extern XContext winContext DECLSPEC_HIDDEN; extern XContext winContext DECLSPEC_HIDDEN;
/* X context to associate a struct x11drv_win_data to an hwnd */ /* X context to associate a struct x11drv_win_data to an hwnd */
...@@ -642,6 +627,7 @@ extern int X11DRV_check_error(void) DECLSPEC_HIDDEN; ...@@ -642,6 +627,7 @@ 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 ) DECLSPEC_HIDDEN;
extern POINT virtual_screen_to_root( INT x, INT y ) 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 POINT root_to_virtual_screen( INT x, INT y ) DECLSPEC_HIDDEN;
extern RECT get_virtual_screen_rect(void) DECLSPEC_HIDDEN;
extern void xinerama_init( unsigned int width, unsigned int height ) DECLSPEC_HIDDEN; extern void xinerama_init( unsigned int width, unsigned int height ) DECLSPEC_HIDDEN;
struct x11drv_mode_info struct x11drv_mode_info
...@@ -678,4 +664,19 @@ extern void X11DRV_SetPreeditState(HWND hwnd, BOOL fOpen) DECLSPEC_HIDDEN; ...@@ -678,4 +664,19 @@ extern void X11DRV_SetPreeditState(HWND hwnd, BOOL fOpen) DECLSPEC_HIDDEN;
#define XEMBED_MAPPED (1 << 0) #define XEMBED_MAPPED (1 << 0)
static inline BOOL is_window_rect_mapped( const RECT *rect )
{
RECT virtual_rect = get_virtual_screen_rect();
return (rect->left < virtual_rect.right &&
rect->top < virtual_rect.bottom &&
max( rect->right, rect->left + 1 ) > virtual_rect.left &&
max( rect->bottom, rect->top + 1 ) > virtual_rect.top);
}
static inline BOOL is_window_rect_fullscreen( const RECT *rect )
{
return (rect->left <= 0 && rect->right >= screen_width &&
rect->top <= 0 && rect->bottom >= screen_height);
}
#endif /* __WINE_X11DRV_H */ #endif /* __WINE_X11DRV_H */
...@@ -63,7 +63,6 @@ XPixmapFormatValues **pixmap_formats; ...@@ -63,7 +63,6 @@ XPixmapFormatValues **pixmap_formats;
unsigned int screen_width; unsigned int screen_width;
unsigned int screen_height; unsigned int screen_height;
unsigned int screen_bpp; unsigned int screen_bpp;
RECT virtual_screen_rect;
Window root_window; Window root_window;
int usexvidmode = 1; int usexvidmode = 1;
int usexrandr = 1; int usexrandr = 1;
......
...@@ -33,6 +33,8 @@ ...@@ -33,6 +33,8 @@
WINE_DEFAULT_DEBUG_CHANNEL(x11drv); WINE_DEFAULT_DEBUG_CHANNEL(x11drv);
static RECT virtual_screen_rect;
static MONITORINFOEXW default_monitor = static MONITORINFOEXW default_monitor =
{ {
sizeof(default_monitor), /* cbSize */ sizeof(default_monitor), /* cbSize */
...@@ -173,6 +175,11 @@ POINT root_to_virtual_screen( INT x, INT y ) ...@@ -173,6 +175,11 @@ POINT root_to_virtual_screen( INT x, INT y )
return pt; return pt;
} }
RECT get_virtual_screen_rect(void)
{
return virtual_screen_rect;
}
void xinerama_init( unsigned int width, unsigned int height ) void xinerama_init( unsigned int width, unsigned int height )
{ {
MONITORINFOEXW *primary; MONITORINFOEXW *primary;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment