GUAC-552: If resolution is above 96 DPI, try to find a reasonable screen size at 96 DPI or 120 DPI, using native resolution as a last resort.
This commit is contained in:
parent
60d4e90c4b
commit
d1a66f5616
@ -426,6 +426,30 @@ void __guac_rdp_client_load_keymap(guac_client* client,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reduces the resolution of the client to the given resolution in DPI if
|
||||||
|
* doing so is reasonable. This function returns non-zero if the resolution
|
||||||
|
* was successfully reduced to the given DPI, and zero if reduction failed.
|
||||||
|
*/
|
||||||
|
static int __guac_rdp_reduce_resolution(guac_client* client, int resolution) {
|
||||||
|
|
||||||
|
int width = client->info.optimal_width * resolution / client->info.optimal_resolution;
|
||||||
|
int height = client->info.optimal_height * resolution / client->info.optimal_resolution;
|
||||||
|
|
||||||
|
/* Reduced resolution if result is reasonably sized */
|
||||||
|
if (width*height >= GUAC_RDP_REASONABLE_AREA) {
|
||||||
|
client->info.optimal_width = width;
|
||||||
|
client->info.optimal_height = height;
|
||||||
|
client->info.optimal_resolution = resolution;
|
||||||
|
guac_client_log_info(client, "Reducing resolution to %ix%i at %i DPI", width, height, resolution);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* No reduction performed */
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
int guac_client_init(guac_client* client, int argc, char** argv) {
|
int guac_client_init(guac_client* client, int argc, char** argv) {
|
||||||
|
|
||||||
rdp_guac_client_data* guac_client_data;
|
rdp_guac_client_data* guac_client_data;
|
||||||
@ -513,8 +537,19 @@ int guac_client_init(guac_client* client, int argc, char** argv) {
|
|||||||
if (argv[IDX_PORT][0] != '\0')
|
if (argv[IDX_PORT][0] != '\0')
|
||||||
settings->port = atoi(argv[IDX_PORT]);
|
settings->port = atoi(argv[IDX_PORT]);
|
||||||
|
|
||||||
|
guac_client_log_info(client, "Client resolution is %ix%i at %i DPI",
|
||||||
|
client->info.optimal_width,
|
||||||
|
client->info.optimal_height,
|
||||||
|
client->info.optimal_resolution);
|
||||||
|
|
||||||
|
/* Attempt to reduce resolution for high DPI */
|
||||||
|
if (client->info.optimal_resolution > GUAC_RDP_NATIVE_RESOLUTION
|
||||||
|
&& !__guac_rdp_reduce_resolution(client, GUAC_RDP_NATIVE_RESOLUTION)
|
||||||
|
&& !__guac_rdp_reduce_resolution(client, GUAC_RDP_HIGH_RESOLUTION))
|
||||||
|
guac_client_log_info(client, "No reasonable lower resolution");
|
||||||
|
|
||||||
/* Use optimal width unless overridden */
|
/* Use optimal width unless overridden */
|
||||||
settings->width = client->info.optimal_width * 96 / client->info.optimal_resolution;
|
settings->width = client->info.optimal_width;
|
||||||
if (argv[IDX_WIDTH][0] != '\0')
|
if (argv[IDX_WIDTH][0] != '\0')
|
||||||
settings->width = atoi(argv[IDX_WIDTH]);
|
settings->width = atoi(argv[IDX_WIDTH]);
|
||||||
|
|
||||||
@ -530,7 +565,7 @@ int guac_client_init(guac_client* client, int argc, char** argv) {
|
|||||||
settings->width = settings->width & ~0x3;
|
settings->width = settings->width & ~0x3;
|
||||||
|
|
||||||
/* Use optimal height unless overridden */
|
/* Use optimal height unless overridden */
|
||||||
settings->height = client->info.optimal_height * 96 / client->info.optimal_resolution;
|
settings->height = client->info.optimal_height;
|
||||||
if (argv[IDX_HEIGHT][0] != '\0')
|
if (argv[IDX_HEIGHT][0] != '\0')
|
||||||
settings->height = atoi(argv[IDX_HEIGHT]);
|
settings->height = atoi(argv[IDX_HEIGHT]);
|
||||||
|
|
||||||
|
@ -51,6 +51,25 @@
|
|||||||
*/
|
*/
|
||||||
#define GUAC_RDP_FRAME_TIMEOUT 0
|
#define GUAC_RDP_FRAME_TIMEOUT 0
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The native resolution of most RDP connections. As Windows and other systems
|
||||||
|
* rely heavily on forced 96 DPI, we must assume 96 DPI.
|
||||||
|
*/
|
||||||
|
#define GUAC_RDP_NATIVE_RESOLUTION 96
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The resolution of an RDP connection that would be considered high, but is
|
||||||
|
* tolerable in the case that the client display would be unreasonably small
|
||||||
|
* otherwise.
|
||||||
|
*/
|
||||||
|
#define GUAC_RDP_HIGH_RESOLUTION 120
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The smallest area, in pixels^2, that would be considered reasonable large
|
||||||
|
* screen DPI needs to be adjusted.
|
||||||
|
*/
|
||||||
|
#define GUAC_RDP_REASONABLE_AREA (800*600)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Client data that will remain accessible through the guac_client.
|
* Client data that will remain accessible through the guac_client.
|
||||||
* This should generally include data commonly used by Guacamole handlers.
|
* This should generally include data commonly used by Guacamole handlers.
|
||||||
|
Loading…
Reference in New Issue
Block a user