Monitor coordinates are exclusive (#7145)

* Monitor coordinates are exclusive

* Remove force override of shadow resolution.

The client might ignore the server requested values, in that case
retry
This commit is contained in:
akallabeth 2021-07-07 11:54:01 +02:00 committed by GitHub
parent 9d031012be
commit 7dfdd248ee
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 42 additions and 49 deletions

View File

@ -1233,7 +1233,7 @@ static UINT rdpgfx_recv_surface_to_surface_pdu(RDPGFX_CHANNEL_CALLBACK* callback
Stream_Read_UINT16(s, pdu.destPtsCount); /* destPtsCount (2 bytes) */
if (Stream_GetRemainingLength(s) < (size_t)(pdu.destPtsCount * 4))
if (Stream_GetRemainingLength(s) / 4ULL < pdu.destPtsCount)
{
WLog_Print(gfx->log, WLOG_ERROR, "not enough data!");
return ERROR_INVALID_DATA;

View File

@ -707,7 +707,6 @@ static int x11_shadow_blend_cursor(x11ShadowSubsystem* subsystem)
static BOOL x11_shadow_check_resize(x11ShadowSubsystem* subsystem)
{
MONITOR_DEF* virtualScreen;
XWindowAttributes attr;
XLockDisplay(subsystem->display);
XGetWindowAttributes(subsystem->display, subsystem->root_window, &attr);
@ -715,16 +714,18 @@ static BOOL x11_shadow_check_resize(x11ShadowSubsystem* subsystem)
if (attr.width != (INT64)subsystem->width || attr.height != (INT64)subsystem->height)
{
MONITOR_DEF* virtualScreen = &(subsystem->common.virtualScreen);
/* Screen size changed. Refresh monitor definitions and trigger screen resize */
subsystem->common.numMonitors = x11_shadow_enum_monitors(subsystem->common.monitors, 16);
shadow_screen_resize(subsystem->common.server->screen);
subsystem->width = attr.width;
subsystem->height = attr.height;
virtualScreen = &(subsystem->common.virtualScreen);
virtualScreen->left = 0;
virtualScreen->top = 0;
virtualScreen->right = subsystem->width;
virtualScreen->bottom = subsystem->height;
virtualScreen->right = subsystem->width - 1;
virtualScreen->bottom = subsystem->height - 1;
virtualScreen->flags = 1;
return TRUE;
}
@ -1156,12 +1157,10 @@ static int x11_shadow_xshm_init(x11ShadowSubsystem* subsystem)
UINT32 x11_shadow_enum_monitors(MONITOR_DEF* monitors, UINT32 maxMonitors)
{
int index;
Display* display;
int displayWidth;
int displayHeight;
int numMonitors = 0;
MONITOR_DEF* monitor;
if (!getenv("DISPLAY"))
setenv("DISPLAY", ":0", 1);
@ -1181,7 +1180,6 @@ UINT32 x11_shadow_enum_monitors(MONITOR_DEF* monitors, UINT32 maxMonitors)
int major, minor;
int xinerama_event;
int xinerama_error;
XineramaScreenInfo* screen;
XineramaScreenInfo* screens;
if (XineramaQueryExtension(display, &xinerama_event, &xinerama_error) &&
@ -1194,14 +1192,16 @@ UINT32 x11_shadow_enum_monitors(MONITOR_DEF* monitors, UINT32 maxMonitors)
if (screens && (numMonitors > 0))
{
UINT32 index;
for (index = 0; index < numMonitors; index++)
{
screen = &screens[index];
monitor = &monitors[index];
MONITOR_DEF* monitor = &monitors[index];
const XineramaScreenInfo* screen = &screens[index];
monitor->left = screen->x_org;
monitor->top = screen->y_org;
monitor->right = monitor->left + screen->width;
monitor->bottom = monitor->top + screen->height;
monitor->right = monitor->left + screen->width - 1;
monitor->bottom = monitor->top + screen->height - 1;
monitor->flags = (index == 0) ? 1 : 0;
}
}
@ -1214,13 +1214,13 @@ UINT32 x11_shadow_enum_monitors(MONITOR_DEF* monitors, UINT32 maxMonitors)
if (numMonitors < 1)
{
index = 0;
MONITOR_DEF* monitor = &monitors[0];
numMonitors = 1;
monitor = &monitors[index];
monitor->left = 0;
monitor->top = 0;
monitor->right = displayWidth;
monitor->bottom = displayHeight;
monitor->right = displayWidth - 1;
monitor->bottom = displayHeight - 1;
monitor->flags = 1;
}
@ -1240,7 +1240,7 @@ static int x11_shadow_subsystem_init(rdpShadowSubsystem* sub)
XVisualInfo template;
XPixmapFormatValues* pf;
XPixmapFormatValues* pfs;
MONITOR_DEF* virtualScreen;
x11ShadowSubsystem* subsystem = (x11ShadowSubsystem*)sub;
if (!subsystem)
@ -1355,19 +1355,21 @@ static int x11_shadow_subsystem_init(rdpShadowSubsystem* sub)
CreateFileDescriptorEvent(NULL, FALSE, FALSE, subsystem->xfds, WINPR_FD_READ)))
return -1;
virtualScreen = &(subsystem->common.virtualScreen);
virtualScreen->left = 0;
virtualScreen->top = 0;
WINPR_ASSERT(subsystem->width <= INT32_MAX);
WINPR_ASSERT(subsystem->height <= INT32_MAX);
virtualScreen->right = (INT32)subsystem->width;
virtualScreen->bottom = (INT32)subsystem->height;
virtualScreen->flags = 1;
WLog_INFO(TAG,
"X11 Extensions: XFixes: %" PRId32 " Xinerama: %" PRId32 " XDamage: %" PRId32
" XShm: %" PRId32 "",
subsystem->use_xfixes, subsystem->use_xinerama, subsystem->use_xdamage,
subsystem->use_xshm);
{
MONITOR_DEF* virtualScreen = &(subsystem->common.virtualScreen);
virtualScreen->left = 0;
virtualScreen->top = 0;
WINPR_ASSERT(subsystem->width <= INT32_MAX);
WINPR_ASSERT(subsystem->height <= INT32_MAX);
virtualScreen->right = (INT32)subsystem->width - 1;
virtualScreen->bottom = (INT32)subsystem->height - 1;
virtualScreen->flags = 1;
WLog_INFO(TAG,
"X11 Extensions: XFixes: %" PRId32 " Xinerama: %" PRId32 " XDamage: %" PRId32
" XShm: %" PRId32 "",
subsystem->use_xfixes, subsystem->use_xinerama, subsystem->use_xdamage,
subsystem->use_xshm);
}
return 1;
}

View File

@ -361,11 +361,7 @@ static INLINE BOOL shadow_client_recalc_desktop_size(rdpShadowClient* client)
WINPR_ASSERT(height >= 0);
WINPR_ASSERT(height <= UINT16_MAX);
if (settings->DesktopWidth != (UINT32)width || settings->DesktopHeight != (UINT32)height)
{
settings->DesktopWidth = (UINT16)width;
settings->DesktopHeight = (UINT16)height;
return TRUE;
}
return FALSE;
}
@ -390,9 +386,6 @@ static BOOL shadow_client_capabilities(freerdp_peer* peer)
if (!ret)
WLog_WARN(TAG, "subsystem->ClientCapabilities failed");
/* Recalculate desktop size regardless whether previous call fail
* or not. Make sure we send correct width/height to client */
(void)shadow_client_recalc_desktop_size(client);
return ret;
}

View File

@ -51,12 +51,13 @@ rdpShadowScreen* shadow_screen_new(rdpShadowServer* server)
region16_init(&(screen->invalidRegion));
WINPR_ASSERT(subsystem->selectedMonitor < ARRAYSIZE(subsystem->monitors));
primary = &(subsystem->monitors[subsystem->selectedMonitor]);
x = primary->left;
y = primary->top;
width = primary->right - primary->left;
height = primary->bottom - primary->top;
width = primary->right - primary->left + 1;
height = primary->bottom - primary->top + 1;
WINPR_ASSERT(x >= 0);
WINPR_ASSERT(x <= UINT16_MAX);
@ -140,8 +141,8 @@ BOOL shadow_screen_resize(rdpShadowScreen* screen)
x = primary->left;
y = primary->top;
width = primary->right - primary->left;
height = primary->bottom - primary->top;
width = primary->right - primary->left + 1;
height = primary->bottom - primary->top + 1;
WINPR_ASSERT(x >= 0);
WINPR_ASSERT(x <= UINT16_MAX);

View File

@ -407,7 +407,7 @@ int shadow_server_parse_command_line(rdpShadowServer* server, int argc, char** a
{
UINT32 index;
UINT32 numMonitors;
MONITOR_DEF monitors[16];
MONITOR_DEF monitors[16] = { 0 };
numMonitors = shadow_enum_monitors(monitors, 16);
if (arg->Flags & COMMAND_LINE_VALUE_PRESENT)
@ -422,17 +422,14 @@ int shadow_server_parse_command_line(rdpShadowServer* server, int argc, char** a
}
else
{
int width, height;
MONITOR_DEF* monitor;
/* List monitors */
for (index = 0; index < numMonitors; index++)
{
monitor = &monitors[index];
width = monitor->right - monitor->left;
height = monitor->bottom - monitor->top;
WLog_INFO(TAG, " %s [%d] %dx%d\t+%" PRId32 "+%" PRId32 "",
const MONITOR_DEF* monitor = &monitors[index];
const INT64 width = monitor->right - monitor->left + 1;
const INT64 height = monitor->bottom - monitor->top + 1;
WLog_INFO(TAG, " %s [%d] %" PRId64 "x%" PRId64 "\t+%" PRId32 "+%" PRId32 "",
(monitor->flags == 1) ? "*" : " ", index, width, height, monitor->left,
monitor->top);
}