diff --git a/client/X11/xf_monitor.c b/client/X11/xf_monitor.c index 1d978bc65..b41c8d357 100644 --- a/client/X11/xf_monitor.c +++ b/client/X11/xf_monitor.c @@ -83,9 +83,10 @@ int xf_list_monitors(xfInfo* xfi) BOOL xf_detect_monitors(xfInfo* xfi, rdpSettings* settings) { - int i; + int i, j; int nmonitors; int primaryMonitor; + int vWidth, vHeight; int maxWidth, maxHeight; VIRTUAL_SCREEN* vscreen; @@ -169,19 +170,24 @@ BOOL xf_detect_monitors(xfInfo* xfi, rdpSettings* settings) 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++) { - 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; + if (settings->NumMonitorIds) + { + BOOL found = FALSE; - settings->MonitorDefArray[nmonitors].x = vscreen->monitors[i].area.left - settings->DesktopPosX; - settings->MonitorDefArray[nmonitors].y = vscreen->monitors[i].area.top - settings->DesktopPosY; + for (j = 0; j < settings->NumMonitorIds; j++) + { + if (settings->MonitorIds[j] == i) + found = TRUE; + } + + if (!found) + continue; + } + + settings->MonitorDefArray[nmonitors].x = vscreen->monitors[i].area.left; + settings->MonitorDefArray[nmonitors].y = vscreen->monitors[i].area.top; 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; @@ -192,6 +198,24 @@ BOOL xf_detect_monitors(xfInfo* xfi, rdpSettings* settings) settings->MonitorCount = nmonitors; + vWidth = vHeight = 0; + settings->DesktopPosX = maxWidth - 1; + settings->DesktopPosY = maxHeight - 1; + + for (i = 0; i < settings->MonitorCount; i++) + { + settings->DesktopPosX = MIN(settings->DesktopPosX, settings->MonitorDefArray[i].x); + settings->DesktopPosY = MIN(settings->DesktopPosY, settings->MonitorDefArray[i].y); + + vWidth += settings->MonitorDefArray[i].width; + vHeight = MAX(vHeight, settings->MonitorDefArray[i].height); + } + + vscreen->area.left = 0; + vscreen->area.right = vWidth - 1; + vscreen->area.top = 0; + vscreen->area.bottom = vHeight - 1; + if (nmonitors && !primaryMonitor) settings->MonitorDefArray[0].is_primary = TRUE; diff --git a/client/X11/xf_window.c b/client/X11/xf_window.c index d09f78546..bb9e1c95b 100644 --- a/client/X11/xf_window.c +++ b/client/X11/xf_window.c @@ -140,9 +140,11 @@ void xf_SetWindowFullscreen(xfInfo* xfi, xfWindow* window, BOOL fullscreen) { if (fullscreen) { + rdpSettings* settings = xfi->instance->settings; + xf_SetWindowDecorations(xfi, window, FALSE); - XMoveResizeWindow(xfi->display, window->handle, 0, 0, window->width, window->height); + XMoveResizeWindow(xfi->display, window->handle, settings->DesktopPosX, settings->DesktopPosY, window->width, window->height); XMapRaised(xfi->display, window->handle); window->fullscreen = TRUE; @@ -495,9 +497,13 @@ 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/client/common/cmdline.c b/client/common/cmdline.c index c4dd9dfd8..b3b900153 100644 --- a/client/common/cmdline.c +++ b/client/common/cmdline.c @@ -50,6 +50,7 @@ COMMAND_LINE_ARGUMENT_A args[] = { "admin", COMMAND_LINE_VALUE_FLAG, NULL, NULL, NULL, -1, "console", "Admin (or console) session" }, { "multimon", COMMAND_LINE_VALUE_OPTIONAL, NULL, NULL, NULL, -1, NULL, "Use multiple monitors" }, { "workarea", COMMAND_LINE_VALUE_FLAG, NULL, NULL, NULL, -1, NULL, "Use available work area" }, + { "monitors", COMMAND_LINE_VALUE_REQUIRED, "<0,1,2...>", NULL, NULL, -1, NULL, "Select monitors to use" }, { "monitor-list", COMMAND_LINE_VALUE_FLAG | COMMAND_LINE_PRINT, NULL, NULL, NULL, -1, NULL, "List detected monitors" }, { "t", COMMAND_LINE_VALUE_REQUIRED, "", NULL, NULL, -1, "title", "Window title" }, { "decorations", COMMAND_LINE_VALUE_BOOL, NULL, NULL, BoolValueTrue, -1, NULL, "Window decorations" }, @@ -1092,6 +1093,24 @@ int freerdp_client_parse_command_line_arguments(int argc, char** argv, rdpSettin { settings->Workarea = TRUE; } + CommandLineSwitchCase(arg, "monitors") + { + if (arg->Flags & COMMAND_LINE_VALUE_PRESENT) + { + char** p; + int i, count = 0; + + p = freerdp_command_line_parse_comma_separated_values(arg->Value, &count); + + settings->NumMonitorIds = count; + settings->MonitorIds = (UINT32*) malloc(sizeof(UINT32) * settings->NumMonitorIds); + + for (i = 0; i < settings->NumMonitorIds; i++) + { + settings->MonitorIds[i] = atoi(p[i]); + } + } + } CommandLineSwitchCase(arg, "monitor-list") { settings->ListMonitors = TRUE; diff --git a/include/freerdp/settings.h b/include/freerdp/settings.h index cd31e5997..6c76735b2 100644 --- a/include/freerdp/settings.h +++ b/include/freerdp/settings.h @@ -812,7 +812,9 @@ struct rdp_settings ALIGN64 UINT32 DesktopPosX; /* 390 */ ALIGN64 UINT32 DesktopPosY; /* 391 */ ALIGN64 BOOL ListMonitors; /* 392 */ - UINT64 padding0448[448 - 393]; /* 393 */ + ALIGN64 UINT32* MonitorIds; /* 393 */ + ALIGN64 UINT32 NumMonitorIds; /* 394 */ + UINT64 padding0448[448 - 395]; /* 395 */ /* Client Message Channel Data */ UINT64 padding0512[512 - 448]; /* 448 */