xfreerdp: add support for selecting individual monitors
This commit is contained in:
parent
24573ef08d
commit
12ec6c60db
@ -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;
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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, "<title>", 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;
|
||||
|
@ -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 */
|
||||
|
Loading…
Reference in New Issue
Block a user