xfreerdp: partial multimonitor patch from Hans-Peter Jansen

This commit is contained in:
Marc-André Moreau
2013-04-28 16:27:23 -04:00
parent 3d285f06a9
commit 1cfda17da9
5 changed files with 90 additions and 48 deletions

View File

@@ -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;

View File

@@ -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);

View File

@@ -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 */

View File

@@ -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;

View File

@@ -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 |