| Index: remoting/webapp/crd/js/client_session.js
|
| diff --git a/remoting/webapp/crd/js/client_session.js b/remoting/webapp/crd/js/client_session.js
|
| index 5dbf13c8ff66b5cf3d23021d07303ff0ca039ab1..09215cbf6f9b2a359bdbfd910e51aadf07db3e20 100644
|
| --- a/remoting/webapp/crd/js/client_session.js
|
| +++ b/remoting/webapp/crd/js/client_session.js
|
| @@ -138,6 +138,8 @@ remoting.ClientSession = function(signalStrategy, container, hostDisplayName,
|
| /** @private */
|
| this.resizeToClient_ = true;
|
| /** @private */
|
| + this.desktopScale_ = 1.0;
|
| + /** @private */
|
| this.remapKeys_ = '';
|
| /** @private */
|
| this.hasReceivedFrame_ = false;
|
| @@ -386,6 +388,7 @@ remoting.ClientSession.STATS_KEY_ROUNDTRIP_LATENCY = 'roundtripLatency';
|
| remoting.ClientSession.KEY_REMAP_KEYS = 'remapKeys';
|
| remoting.ClientSession.KEY_RESIZE_TO_CLIENT = 'resizeToClient';
|
| remoting.ClientSession.KEY_SHRINK_TO_FIT = 'shrinkToFit';
|
| +remoting.ClientSession.KEY_DESKTOP_SCALE = 'desktopScale';
|
|
|
| /**
|
| * Set of capabilities for which hasCapability_() can be used to test.
|
| @@ -506,6 +509,12 @@ remoting.ClientSession.prototype.onHostSettingsLoaded_ = function(options) {
|
| this.shrinkToFit_ = /** @type {boolean} */
|
| options[remoting.ClientSession.KEY_SHRINK_TO_FIT];
|
| }
|
| + if (remoting.ClientSession.KEY_DESKTOP_SCALE in options &&
|
| + typeof(options[remoting.ClientSession.KEY_DESKTOP_SCALE]) ==
|
| + 'number') {
|
| + this.desktopScale_ = /** @type {number} */
|
| + options[remoting.ClientSession.KEY_DESKTOP_SCALE];
|
| + }
|
|
|
| /** @param {boolean} result */
|
| this.plugin_.initialize(this.onPluginInitialized_.bind(this));
|
| @@ -774,6 +783,26 @@ remoting.ClientSession.prototype.sendPrintScreen = function() {
|
| }
|
|
|
| /**
|
| + * Sets and stores the scale factor to apply to host sizing requests.
|
| + * The desktopScale applies to the dimensions reported to the host, not
|
| + * to the client DPI reported to it.
|
| + *
|
| + * @param {number} desktopScale Scale factor to apply.
|
| + */
|
| +remoting.ClientSession.prototype.setDesktopScale = function(desktopScale) {
|
| + this.desktopScale_ = desktopScale;
|
| +
|
| + // onResize() will update the plugin size and scrollbars for the new
|
| + // scaled plugin dimensions, and send a client resolution notification.
|
| + this.onResize();
|
| +
|
| + // Save the new desktop scale setting.
|
| + var options = {};
|
| + options[remoting.ClientSession.KEY_DESKTOP_SCALE] = this.desktopScale_;
|
| + remoting.HostSettings.save(this.hostId_, options);
|
| +}
|
| +
|
| +/**
|
| * Sets and stores the key remapping setting for the current host.
|
| *
|
| * @param {string} remappings Comma separated list of key remappings.
|
| @@ -844,10 +873,7 @@ remoting.ClientSession.prototype.applyRemapKeys_ = function(apply) {
|
| remoting.ClientSession.prototype.setScreenMode =
|
| function(shrinkToFit, resizeToClient) {
|
| if (resizeToClient && !this.resizeToClient_) {
|
| - var clientArea = this.getClientArea_();
|
| - this.plugin_.notifyClientResolution(clientArea.width,
|
| - clientArea.height,
|
| - window.devicePixelRatio);
|
| + this.notifyClientResolution_();
|
| }
|
|
|
| // If enabling shrink, reset bump-scroll offsets.
|
| @@ -1010,10 +1036,7 @@ remoting.ClientSession.prototype.onConnectionStatusUpdate_ =
|
| this.setFocusHandlers_();
|
| this.onDesktopSizeChanged_();
|
| if (this.resizeToClient_) {
|
| - var clientArea = this.getClientArea_();
|
| - this.plugin_.notifyClientResolution(clientArea.width,
|
| - clientArea.height,
|
| - window.devicePixelRatio);
|
| + this.notifyClientResolution_();
|
| }
|
| // Activate full-screen related UX.
|
| remoting.fullscreen.addListener(this.callOnFullScreenChanged_);
|
| @@ -1106,10 +1129,7 @@ remoting.ClientSession.prototype.onSetCapabilities_ = function(capabilities) {
|
| this.capabilities_ = capabilities;
|
| if (this.hasCapability_(
|
| remoting.ClientSession.Capability.SEND_INITIAL_RESOLUTION)) {
|
| - var clientArea = this.getClientArea_();
|
| - this.plugin_.notifyClientResolution(clientArea.width,
|
| - clientArea.height,
|
| - window.devicePixelRatio);
|
| + this.notifyClientResolution_();
|
| }
|
| if (this.hasCapability_(remoting.ClientSession.Capability.GOOGLE_DRIVE)) {
|
| this.sendGoogleDriveAccessToken_();
|
| @@ -1178,10 +1198,7 @@ remoting.ClientSession.prototype.onResize = function() {
|
| }
|
| var clientArea = this.getClientArea_();
|
| this.notifyClientResolutionTimer_ = window.setTimeout(
|
| - this.plugin_.notifyClientResolution.bind(this.plugin_,
|
| - clientArea.width,
|
| - clientArea.height,
|
| - window.devicePixelRatio),
|
| + this.notifyClientResolution_.bind(this),
|
| kResizeRateLimitMs);
|
| }
|
|
|
| @@ -1289,6 +1306,10 @@ remoting.ClientSession.prototype.updateDimensions = function() {
|
| var hostPixelRatioY = Math.ceil(this.plugin_.getDesktopYDpi() / 96);
|
| var hostPixelRatio = Math.min(hostPixelRatioX, hostPixelRatioY);
|
|
|
| + // Include the desktopScale in the hostPixelRatio before comparing it with
|
| + // the client devicePixelRatio to determine the "natural" scale to use.
|
| + hostPixelRatio *= this.desktopScale_;
|
| +
|
| // Down-scale by the smaller of the client and host ratios.
|
| var scale = 1.0 / Math.min(window.devicePixelRatio, hostPixelRatio);
|
|
|
| @@ -1635,6 +1656,18 @@ remoting.ClientSession.prototype.getClientArea_ = function() {
|
| };
|
|
|
| /**
|
| + * Notifies the host of the client's current dimensions and DPI.
|
| + * Also takes into account per-host scaling factor, if configured.
|
| + * @private
|
| + */
|
| +remoting.ClientSession.prototype.notifyClientResolution_ = function() {
|
| + var clientArea = this.getClientArea_();
|
| + this.plugin_.notifyClientResolution(clientArea.width * this.desktopScale_,
|
| + clientArea.height * this.desktopScale_,
|
| + window.devicePixelRatio);
|
| +}
|
| +
|
| +/**
|
| * @param {string} url
|
| * @param {number} hotspotX
|
| * @param {number} hotspotY
|
|
|