From be435df6958f74ea8a29d977ab917d9c4ed1e92a Mon Sep 17 00:00:00 2001 From: Vincent Povirk Date: Tue, 16 Dec 2008 18:13:11 -0600 Subject: [PATCH] winex11: update the workarea when _NET_WORKAREA changes --- dlls/winex11.drv/event.c | 3 +++ dlls/winex11.drv/x11drv.h | 1 + dlls/winex11.drv/x11drv_main.c | 2 ++ dlls/winex11.drv/xinerama.c | 36 ++++++++++++++++++++++++++++++++++++ 4 files changed, 42 insertions(+), 0 deletions(-) diff --git a/dlls/winex11.drv/event.c b/dlls/winex11.drv/event.c index f0aea44..e120179 100644 --- a/dlls/winex11.drv/event.c +++ b/dlls/winex11.drv/event.c @@ -965,6 +965,9 @@ static void X11DRV_PropertyNotify( HWND hwnd, XEvent *xev ) XPropertyEvent *event = &xev->xproperty; struct x11drv_win_data *data; + if (hwnd == GetDesktopWindow() && event->window == root_window) + X11DRV_invalidate_workareas(); + if (!hwnd) return; if (!(data = X11DRV_get_win_data( hwnd ))) return; diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index 9588a73..62d7494 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -756,6 +756,7 @@ extern int X11DRV_check_error(void); extern void X11DRV_window_to_X_rect( struct x11drv_win_data *data, RECT *rect ); extern void X11DRV_X_to_window_rect( struct x11drv_win_data *data, RECT *rect ); extern void xinerama_init( unsigned int width, unsigned int height ); +extern void X11DRV_invalidate_workareas(void); extern void X11DRV_init_desktop( Window win, unsigned int width, unsigned int height ); extern void X11DRV_resize_desktop(unsigned int width, unsigned int height); diff --git a/dlls/winex11.drv/x11drv_main.c b/dlls/winex11.drv/x11drv_main.c index 6b0e95c..09bab35 100644 --- a/dlls/winex11.drv/x11drv_main.c +++ b/dlls/winex11.drv/x11drv_main.c @@ -641,6 +641,8 @@ struct x11drv_thread_data *x11drv_init_thread_data(void) ExitProcess(1); } + XSelectInput( data->display, DefaultRootWindow( data->display ), PropertyChangeMask ); + fcntl( ConnectionNumber(data->display), F_SETFD, 1 ); /* set close on exec flag */ #ifdef HAVE_XKB diff --git a/dlls/winex11.drv/xinerama.c b/dlls/winex11.drv/xinerama.c index ad5d496..01f045e 100644 --- a/dlls/winex11.drv/xinerama.c +++ b/dlls/winex11.drv/xinerama.c @@ -45,6 +45,8 @@ static MONITORINFOEXW default_monitor = static MONITORINFOEXW *monitors; static int nb_monitors; +static BOOL valid_workarea = FALSE; + static inline MONITORINFOEXW *get_primary(void) { /* default to 0 if specified primary is invalid */ @@ -85,6 +87,35 @@ static void query_work_area( RECT *rc_work ) } } +void update_workareas() +{ + int i; + RECT rcWork = {0, 0, 0, 0}; + + wine_tsx11_lock(); + + query_work_area( &rcWork ); + + OffsetRect( &rcWork, virtual_screen_rect.left, virtual_screen_rect.top ); + + TRACE( "updating work area to %s\n", wine_dbgstr_rect(&rcWork) ); + + for (i=0; i < nb_monitors; i++) + { + if (!IntersectRect( &monitors[i].rcWork, &rcWork, &monitors[i].rcMonitor )) + monitors[i].rcWork = monitors[i].rcMonitor; + } + + valid_workarea = TRUE; + + wine_tsx11_unlock(); +} + +void X11DRV_invalidate_workareas() +{ + valid_workarea = FALSE; +} + #ifdef SONAME_LIBXINERAMA #define MAKE_FUNCPTR(f) static typeof(f) * p##f @@ -196,6 +227,8 @@ void xinerama_init( unsigned int width, unsigned int height ) TRACE( "virtual size: %s primary size: %dx%d\n", wine_dbgstr_rect(&rect), screen_width, screen_height ); + valid_workarea = TRUE; + wine_tsx11_unlock(); ClipCursor( NULL ); /* reset the cursor clip rectangle */ } @@ -213,6 +246,9 @@ BOOL X11DRV_GetMonitorInfo( HMONITOR handle, LPMONITORINFO info ) SetLastError( ERROR_INVALID_HANDLE ); return FALSE; } + + if (!valid_workarea) update_workareas(); + info->rcMonitor = monitors[i].rcMonitor; info->rcWork = monitors[i].rcWork; info->dwFlags = monitors[i].dwFlags; -- 1.5.6.3