winex11.drv: Add support for _NET_WORKAREA.
Dmitry Timoshkov
dmitry at codeweavers.com
Wed Sep 10 23:39:37 CDT 2008
---
dlls/winex11.drv/x11drv.h | 1 +
dlls/winex11.drv/x11drv_main.c | 1 +
dlls/winex11.drv/xinerama.c | 32 ++++++++++++++++++++++++++------
3 files changed, 28 insertions(+), 6 deletions(-)
diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h
index 7ed91b3..6abd8c0 100644
--- a/dlls/winex11.drv/x11drv.h
+++ b/dlls/winex11.drv/x11drv.h
@@ -613,6 +613,7 @@ enum x11drv_atoms
XATOM__NET_WM_WINDOW_TYPE_DIALOG,
XATOM__NET_WM_WINDOW_TYPE_NORMAL,
XATOM__NET_WM_WINDOW_TYPE_UTILITY,
+ XATOM__NET_WORKAREA,
XATOM__XEMBED_INFO,
XATOM_XdndAware,
XATOM_XdndEnter,
diff --git a/dlls/winex11.drv/x11drv_main.c b/dlls/winex11.drv/x11drv_main.c
index 2e19913..f87e3c7 100644
--- a/dlls/winex11.drv/x11drv_main.c
+++ b/dlls/winex11.drv/x11drv_main.c
@@ -149,6 +149,7 @@ static const char * const atom_names[NB_XATOMS - FIRST_XATOM] =
"_NET_WM_WINDOW_TYPE_DIALOG",
"_NET_WM_WINDOW_TYPE_NORMAL",
"_NET_WM_WINDOW_TYPE_UTILITY",
+ "_NET_WORKAREA",
"_XEMBED_INFO",
"XdndAware",
"XdndEnter",
diff --git a/dlls/winex11.drv/xinerama.c b/dlls/winex11.drv/xinerama.c
index f68cf2a..8e7435e 100644
--- a/dlls/winex11.drv/xinerama.c
+++ b/dlls/winex11.drv/xinerama.c
@@ -88,7 +88,7 @@ static void load_xinerama(void)
if (!pXineramaQueryScreens) WARN( "XineramaQueryScreens not found\n" );
}
-static int query_screens(void)
+static int query_screens( const RECT *rc_work )
{
int i, count, event_base, error_base;
XineramaScreenInfo *screens;
@@ -111,7 +111,8 @@ static int query_screens(void)
monitors[i].rcMonitor.top = screens[i].y_org;
monitors[i].rcMonitor.right = screens[i].x_org + screens[i].width;
monitors[i].rcMonitor.bottom = screens[i].y_org + screens[i].height;
- monitors[i].rcWork = monitors[i].rcMonitor;
+ monitors[i].rcWork = *rc_work;
+ OffsetRect( &monitors[i].rcWork, monitors[i].rcMonitor.left, monitors[i].rcMonitor.top );
monitors[i].dwFlags = 0;
/* FIXME: using the same device name for all monitors for now */
lstrcpyW( monitors[i].szDevice, default_monitor.szDevice );
@@ -136,17 +137,35 @@ static inline int query_screens(void)
void xinerama_init( unsigned int width, unsigned int height )
{
+ Atom type;
+ int format;
+ unsigned long count, remaining;
+ CARD32 *work_area;
MONITORINFOEXW *primary;
int i;
- RECT rect;
+ RECT rect, rc_work;
wine_tsx11_lock();
SetRect( &rect, 0, 0, width, height );
+ rc_work = rect;
- if (root_window != DefaultRootWindow( gdi_display ) || !query_screens())
+ if (!XGetWindowProperty( gdi_display, DefaultRootWindow(gdi_display), x11drv_atom(_NET_WORKAREA), 0,
+ ~0, False, XA_CARDINAL, &type, &format, &count,
+ &remaining, (unsigned char **)&work_area ))
{
- default_monitor.rcWork = default_monitor.rcMonitor = rect;
+ if (type == XA_CARDINAL && format == 32 && count >= 4)
+ {
+ SetRect( &rc_work, work_area[0], work_area[1],
+ work_area[0] + work_area[2], work_area[1] + work_area[3] );
+ }
+ XFree( work_area );
+ }
+
+ if (root_window != DefaultRootWindow( gdi_display ) || !query_screens( &rc_work ))
+ {
+ default_monitor.rcMonitor = rect;
+ default_monitor.rcWork = rc_work;
nb_monitors = 1;
monitors = &default_monitor;
}
@@ -159,8 +178,9 @@ void xinerama_init( unsigned int width, unsigned int height )
{
OffsetRect( &monitors[i].rcMonitor, rect.left, rect.top );
OffsetRect( &monitors[i].rcWork, rect.left, rect.top );
- TRACE( "monitor %p: %s%s\n",
+ TRACE( "monitor %p: %s work %s%s\n",
index_to_monitor(i), wine_dbgstr_rect(&monitors[i].rcMonitor),
+ wine_dbgstr_rect(&monitors[i].rcWork),
(monitors[i].dwFlags & MONITORINFOF_PRIMARY) ? " (primary)" : "" );
}
--
1.6.0.1
More information about the wine-patches
mailing list