From 1cfda17da9989ac85a62eb933abeb93afdf25719 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Sun, 28 Apr 2013 16:27:23 -0400 Subject: [PATCH] xfreerdp: partial multimonitor patch from Hans-Peter Jansen --- client/X11/xf_monitor.c | 109 ++++++++++++++++++++--------------- client/X11/xf_window.c | 5 +- include/freerdp/settings.h | 6 +- libfreerdp/common/settings.c | 16 +++++ libfreerdp/core/settings.c | 2 + 5 files changed, 90 insertions(+), 48 deletions(-) diff --git a/client/X11/xf_monitor.c b/client/X11/xf_monitor.c index aad52dd12..6ce66da8b 100644 --- a/client/X11/xf_monitor.c +++ b/client/X11/xf_monitor.c @@ -40,6 +40,9 @@ BOOL xf_detect_monitors(xfInfo* xfi, rdpSettings* settings) { int i; + int nmonitors; + int primaryMonitor; + int maxWidth, maxHeight; VIRTUAL_SCREEN* vscreen; #ifdef WITH_XINERAMA @@ -49,33 +52,6 @@ BOOL xf_detect_monitors(xfInfo* xfi, rdpSettings* settings) vscreen = &xfi->vscreen; - if (xf_GetWorkArea(xfi) != TRUE) - { - xfi->workArea.x = 0; - xfi->workArea.y = 0; - xfi->workArea.width = WidthOfScreen(xfi->screen); - xfi->workArea.height = HeightOfScreen(xfi->screen); - } - - if (settings->Fullscreen) - { - settings->DesktopWidth = WidthOfScreen(xfi->screen); - settings->DesktopHeight = HeightOfScreen(xfi->screen); - } - else if (settings->Workarea) - { - settings->DesktopWidth = xfi->workArea.width; - settings->DesktopHeight = xfi->workArea.height; - } - else if (settings->PercentScreen) - { - settings->DesktopWidth = (xfi->workArea.width * settings->PercentScreen) / 100; - settings->DesktopHeight = (xfi->workArea.height * settings->PercentScreen) / 100; - } - - if (settings->Fullscreen != TRUE && settings->Workarea != TRUE) - return TRUE; - #ifdef WITH_XINERAMA if (XineramaQueryExtension(xfi->display, &ignored, &ignored2)) { @@ -108,32 +84,73 @@ BOOL xf_detect_monitors(xfInfo* xfi, rdpSettings* settings) } #endif - settings->MonitorCount = vscreen->nmonitors; + if (!xf_GetWorkArea(xfi)) + { + xfi->workArea.x = 0; + xfi->workArea.y = 0; + xfi->workArea.width = WidthOfScreen(xfi->screen); + xfi->workArea.height = HeightOfScreen(xfi->screen); + } + + if (settings->Fullscreen) + { + settings->DesktopWidth = WidthOfScreen(xfi->screen); + settings->DesktopHeight = HeightOfScreen(xfi->screen); + maxWidth = settings->DesktopWidth; + maxHeight = settings->DesktopHeight; + } + else if (settings->Workarea) + { + settings->DesktopWidth = xfi->workArea.width; + settings->DesktopHeight = xfi->workArea.height; + maxWidth = settings->DesktopWidth; + maxHeight = settings->DesktopHeight; + } + else if (settings->PercentScreen) + { + settings->DesktopWidth = (xfi->workArea.width * settings->PercentScreen) / 100; + settings->DesktopHeight = (xfi->workArea.height * settings->PercentScreen) / 100; + maxWidth = settings->DesktopWidth; + maxHeight = settings->DesktopHeight; + } + else + { + maxWidth = WidthOfScreen(xfi->screen); + maxHeight = HeightOfScreen(xfi->screen); + } + + if (!settings->Fullscreen && !settings->Workarea && !settings->UseMultimon) + return TRUE; + + nmonitors = 0; + primaryMonitor = 0; + + vscreen->area.left = settings->DesktopPosX; + vscreen->area.right = MIN(settings->DesktopPosX + settings->DesktopWidth - 1, maxWidth); + vscreen->area.top = settings->DesktopPosY; + vscreen->area.bottom = MIN(settings->DesktopPosY + settings->DesktopHeight - 1, maxHeight); for (i = 0; i < vscreen->nmonitors; i++) { - settings->MonitorDefArray[i].x = vscreen->monitors[i].area.left; - settings->MonitorDefArray[i].y = vscreen->monitors[i].area.top; - settings->MonitorDefArray[i].width = vscreen->monitors[i].area.right - vscreen->monitors[i].area.left + 1; - settings->MonitorDefArray[i].height = vscreen->monitors[i].area.bottom - vscreen->monitors[i].area.top + 1; - settings->MonitorDefArray[i].is_primary = vscreen->monitors[i].primary; + if ((vscreen->monitors[i].area.left > vscreen->area.right) || (vscreen->monitors[i].area.right < vscreen->area.left) || + (vscreen->monitors[i].area.top > vscreen->area.bottom) || (vscreen->monitors[i].area.bottom < vscreen->area.top)) + continue; - vscreen->area.left = MIN(vscreen->monitors[i].area.left, vscreen->area.left); - vscreen->area.right = MAX(vscreen->monitors[i].area.right, vscreen->area.right); - vscreen->area.top = MIN(vscreen->monitors[i].area.top, vscreen->area.top); - vscreen->area.bottom = MAX(vscreen->monitors[i].area.bottom, vscreen->area.bottom); + settings->MonitorDefArray[nmonitors].x = vscreen->monitors[i].area.left - settings->DesktopPosX; + settings->MonitorDefArray[nmonitors].y = vscreen->monitors[i].area.top - settings->DesktopPosY; + settings->MonitorDefArray[nmonitors].width = MIN(vscreen->monitors[i].area.right - vscreen->monitors[i].area.left + 1, settings->DesktopWidth); + settings->MonitorDefArray[nmonitors].height = MIN(vscreen->monitors[i].area.bottom - vscreen->monitors[i].area.top + 1, settings->DesktopHeight); + settings->MonitorDefArray[nmonitors].is_primary = vscreen->monitors[i].primary; + + primaryMonitor |= vscreen->monitors[i].primary; + nmonitors++; } - /* if no monitor information is present then make sure variables are set accordingly */ - if (settings->MonitorCount == 0) - { - vscreen->area.left = 0; - vscreen->area.right = settings->DesktopWidth -1; - vscreen->area.top = 0; - vscreen->area.bottom = settings->DesktopHeight - 1; - } + settings->MonitorCount = nmonitors; + + if (nmonitors && !primaryMonitor) + settings->MonitorDefArray[0].is_primary = TRUE; - if (settings->MonitorCount) { settings->DesktopWidth = vscreen->area.right - vscreen->area.left + 1; diff --git a/client/X11/xf_window.c b/client/X11/xf_window.c index 46f5507af..d09f78546 100644 --- a/client/X11/xf_window.c +++ b/client/X11/xf_window.c @@ -394,9 +394,11 @@ xfWindow* xf_CreateDesktopWindow(xfInfo* xfi, char* name, int width, int height, { xfWindow* window; XEvent xevent; + rdpSettings* settings; window = (xfWindow*) malloc(sizeof(xfWindow)); ZeroMemory(window, sizeof(xfWindow)); + settings = xfi->instance->settings; if (window) { @@ -494,7 +496,8 @@ xfWindow* xf_CreateDesktopWindow(xfInfo* xfi, char* name, int width, int height, if (xfi->instance->settings->RemoteApplicationMode) XMoveWindow(xfi->display, window->handle, 0, 0); - + else if (settings->DesktopPosX || settings->DesktopPosY) + XMoveWindow(xfi->display, window->handle, settings->DesktopPosX, settings->DesktopPosY); } xf_SetWindowText(xfi, window, name); diff --git a/include/freerdp/settings.h b/include/freerdp/settings.h index 0a078c280..8b71045a7 100644 --- a/include/freerdp/settings.h +++ b/include/freerdp/settings.h @@ -511,6 +511,8 @@ typedef struct _RDPDR_PARALLEL RDPDR_PARALLEL; #define FreeRDP_SpanMonitors 387 #define FreeRDP_UseMultimon 388 #define FreeRDP_ForceMultimon 389 +#define FreeRDP_DesktopPosX 390 +#define FreeRDP_DesktopPosY 391 #define FreeRDP_MultitransportFlags 512 #define FreeRDP_AlternateShell 640 #define FreeRDP_ShellWorkingDirectory 641 @@ -807,7 +809,9 @@ struct rdp_settings ALIGN64 BOOL SpanMonitors; /* 387 */ ALIGN64 BOOL UseMultimon; /* 388 */ ALIGN64 BOOL ForceMultimon; /* 389 */ - UINT64 padding0448[448 - 390]; /* 390 */ + ALIGN64 UINT32 DesktopPosX; /* 390 */ + ALIGN64 UINT32 DesktopPosY; /* 391 */ + UINT64 padding0448[448 - 392]; /* 392 */ /* Client Message Channel Data */ UINT64 padding0512[512 - 448]; /* 448 */ diff --git a/libfreerdp/common/settings.c b/libfreerdp/common/settings.c index c8a82cde8..421d9af44 100644 --- a/libfreerdp/common/settings.c +++ b/libfreerdp/common/settings.c @@ -1245,6 +1245,14 @@ UINT32 freerdp_get_param_uint32(rdpSettings* settings, int id) return settings->MonitorDefArraySize; break; + case FreeRDP_DesktopPosX: + return settings->DesktopPosX; + break; + + case FreeRDP_DesktopPosY: + return settings->DesktopPosY; + break; + case FreeRDP_MultitransportFlags: return settings->MultitransportFlags; break; @@ -1553,6 +1561,14 @@ int freerdp_set_param_uint32(rdpSettings* settings, int id, UINT32 param) settings->MonitorDefArraySize = param; break; + case FreeRDP_DesktopPosX: + settings->DesktopPosX = param; + break; + + case FreeRDP_DesktopPosY: + settings->DesktopPosY = param; + break; + case FreeRDP_MultitransportFlags: settings->MultitransportFlags = param; break; diff --git a/libfreerdp/core/settings.c b/libfreerdp/core/settings.c index 8411b4b88..8f22cc336 100644 --- a/libfreerdp/core/settings.c +++ b/libfreerdp/core/settings.c @@ -240,6 +240,8 @@ rdpSettings* freerdp_settings_new(void* instance) settings->ServerPort = 3389; settings->DesktopResize = TRUE; settings->ToggleFullscreen = TRUE; + settings->DesktopPosX = 0; + settings->DesktopPosY = 0; settings->PerformanceFlags = PERF_DISABLE_FULLWINDOWDRAG |