Index: remoting/host/desktop_resizer_linux.cc |
diff --git a/remoting/host/desktop_resizer_linux.cc b/remoting/host/desktop_resizer_linux.cc |
index 3c7d326f94124e18c43fc7163f6a82506b6634d9..f70817107b6d5b197babfa943ef19219f08b8341 100644 |
--- a/remoting/host/desktop_resizer_linux.cc |
+++ b/remoting/host/desktop_resizer_linux.cc |
@@ -12,35 +12,36 @@ |
#include "base/command_line.h" |
#include "base/logging.h" |
-// On Linux, we use the xrandr extension to change the desktop size. For now, |
-// we only support resize-to-client for Xvfb-based servers that can match the |
-// client size exactly. To support best-size matching, it would be necessary |
-// to implement |GetSupportedSizes|, but it's not considered a priority now. |
+// On Linux, we use the xrandr extension to change the desktop resolution. For |
+// now, we only support resize-to-client for Xvfb-based servers that can match |
+// the client resolution exactly. To support best-resolution matching, it would |
+// be necessary to implement |GetSupportedResolutions|, but it's not considered |
+// a priority now. |
// |
// Xrandr has a number of restrictions that make this code more complex: |
// |
-// 1. It's not possible to change the size of an existing mode. Instead, the |
-// mode must be deleted and recreated. |
+// 1. It's not possible to change the resolution of an existing mode. Instead, |
+// the mode must be deleted and recreated. |
// 2. It's not possible to delete a mode that's in use. |
// 3. Errors are communicated via Xlib's spectacularly unhelpful mechanism |
// of terminating the process unless you install an error handler. |
// |
// The basic approach is as follows: |
// |
-// 1. Create a new mode with the correct size; |
+// 1. Create a new mode with the correct resolution; |
// 2. Switch to the new mode; |
// 3. Delete the old mode. |
// |
// Since the new mode must have a different name, and we want the current mode |
// name to be consistent, we then additionally: |
// |
-// 4. Recreate the old mode at the new size; |
+// 4. Recreate the old mode at the new resolution; |
// 5. Switch to the old mode; |
// 6. Delete the temporary mode. |
// |
// Name consistency will allow a future CL to disable resize-to-client if the |
// user has changed the mode to something other than "Chrome Remote Desktop |
-// client size". It doesn't make the code significantly more complex. |
+// client resolution". It doesn't make the code significantly more complex. |
namespace { |
@@ -55,6 +56,9 @@ int PixelsToMillimeters(int pixels, int dpi) { |
return static_cast<int>(kMillimetersPerInch * pixels / dpi); |
} |
+// TODO(jamiewalch): Use the correct DPI for the mode: http://crbug.com/172405. |
+const int kDPI = 96; |
+ |
} // namespace |
namespace remoting { |
@@ -123,11 +127,11 @@ class DesktopResizerLinux : public DesktopResizer { |
virtual ~DesktopResizerLinux(); |
// DesktopResizer interface |
- virtual SkISize GetCurrentSize() OVERRIDE; |
- virtual std::list<SkISize> GetSupportedSizes( |
- const SkISize& preferred) OVERRIDE; |
- virtual void SetSize(const SkISize& size) OVERRIDE; |
- virtual void RestoreSize(const SkISize& original) OVERRIDE; |
+ virtual ScreenResolution GetCurrentResolution() OVERRIDE; |
+ virtual std::list<ScreenResolution> GetSupportedResolutions( |
+ const ScreenResolution& preferred) OVERRIDE; |
+ virtual void SetResolution(const ScreenResolution& resolution) OVERRIDE; |
+ virtual void RestoreResolution(const ScreenResolution& original) OVERRIDE; |
private: |
// Create a mode, and attach it to the primary output. If the mode already |
@@ -140,7 +144,7 @@ class DesktopResizerLinux : public DesktopResizer { |
// Switch the primary output to the specified mode. If name is NULL, the |
// primary output is disabled instead, which is required before changing |
- // its size. |
+ // its resolution. |
void SwitchToMode(const char* name); |
Display* display_; |
@@ -165,11 +169,11 @@ DesktopResizerLinux::~DesktopResizerLinux() { |
XCloseDisplay(display_); |
} |
-SkISize DesktopResizerLinux::GetCurrentSize() { |
+ScreenResolution DesktopResizerLinux::GetCurrentResolution() { |
if (!exact_resize_) { |
// TODO(jamiewalch): Remove this early return if we decide to support |
// non-Xvfb servers. |
- return SkISize::Make(0, 0); |
+ return ScreenResolution(); |
} |
// TODO(lambroslambrou): Xrandr requires that we process RRScreenChangeNotify |
@@ -187,35 +191,41 @@ SkISize DesktopResizerLinux::GetCurrentSize() { |
XRRUpdateConfiguration(&event); |
} |
- SkISize result = SkISize::Make( |
- DisplayWidth (display_, DefaultScreen(display_)), |
- DisplayHeight(display_, DefaultScreen(display_))); |
+ ScreenResolution result( |
+ webrtc::DesktopSize( |
+ DisplayWidth(display_, DefaultScreen(display_)), |
+ DisplayHeight(display_, DefaultScreen(display_))), |
+ webrtc::DesktopVector(kDPI, kDPI)); |
return result; |
} |
-std::list<SkISize> DesktopResizerLinux::GetSupportedSizes( |
- const SkISize& preferred) { |
- std::list<SkISize> result; |
+std::list<ScreenResolution> DesktopResizerLinux::GetSupportedResolutions( |
+ const ScreenResolution& preferred) { |
+ std::list<ScreenResolution> result; |
if (exact_resize_) { |
// Clamp the specified size to something valid for the X server. |
int min_width = 0, min_height = 0, max_width = 0, max_height = 0; |
XRRGetScreenSizeRange(display_, root_, |
&min_width, &min_height, |
&max_width, &max_height); |
- int width = std::min(std::max(preferred.width(), min_width), max_width); |
- int height = std::min(std::max(preferred.height(), min_height), max_height); |
+ int width = std::min(std::max(preferred.dimensions().width(), min_width), |
+ max_width); |
+ int height = std::min(std::max(preferred.dimensions().height(), min_height), |
+ max_height); |
// Additionally impose a minimum size of 640x480, since anything smaller |
// doesn't seem very useful. |
- SkISize actual = SkISize::Make(std::max(640, width), std::max(480, height)); |
+ ScreenResolution actual( |
+ webrtc::DesktopSize(std::max(640, width), std::max(480, height)), |
+ webrtc::DesktopVector(kDPI, kDPI)); |
result.push_back(actual); |
} else { |
- // TODO(jamiewalch): Return the list of supported sizes if we can't support |
- // exact-size matching. |
+ // TODO(jamiewalch): Return the list of supported resolutions if we can't |
+ // support exact-size matching. |
} |
return result; |
} |
-void DesktopResizerLinux::SetSize(const SkISize& size) { |
+void DesktopResizerLinux::SetResolution(const ScreenResolution& resolution) { |
if (!exact_resize_) { |
// TODO(jamiewalch): Remove this early return if we decide to support |
// non-Xvfb servers. |
@@ -224,47 +234,49 @@ void DesktopResizerLinux::SetSize(const SkISize& size) { |
// Ignore X errors encountered while resizing the display. We might hit an |
// error, for example if xrandr has been used to add a mode with the same |
- // name as our temporary mode, or to remove the "client size" mode. We don't |
- // want to terminate the process if this happens. |
+ // name as our temporary mode, or to remove the "client resolution" mode. We |
+ // don't want to terminate the process if this happens. |
ScopedXErrorHandler handler(ScopedXErrorHandler::Ignore()); |
- // Grab the X server while we're changing the display size. This ensures |
+ // Grab the X server while we're changing the display resolution. This ensures |
// that the display configuration doesn't change under our feet. |
ScopedXGrabServer grabber(display_); |
- // The name of the mode representing the current client view size and the |
- // temporary mode used for the reasons described at the top of this file. |
+ // The name of the mode representing the current client view resolution and |
+ // the temporary mode used for the reasons described at the top of this file. |
// The former should be localized if it's user-visible; the latter only |
// exists briefly and does not need to localized. |
- const char* kModeName = "Chrome Remote Desktop client size"; |
+ const char* kModeName = "Chrome Remote Desktop client resolution"; |
const char* kTempModeName = "Chrome Remote Desktop temporary mode"; |
// Actually do the resize operation, preserving the current mode name. Note |
// that we have to detach the output from any mode in order to resize it |
// (strictly speaking, this is only required when reducing the size, but it |
// seems safe to do it regardless). |
- LOG(INFO) << "Changing desktop size to " << size.width() |
- << "x" << size.height(); |
+ LOG(INFO) << "Changing desktop size to " << resolution.dimensions().width() |
+ << "x" << resolution.dimensions().height(); |
// TODO(lambroslambrou): Use the DPI from client size information. |
- const int kDPI = 96; |
- int width_mm = PixelsToMillimeters(size.width(), kDPI); |
- int height_mm = PixelsToMillimeters(size.height(), kDPI); |
- CreateMode(kTempModeName, size.width(), size.height()); |
+ int width_mm = PixelsToMillimeters(resolution.dimensions().width(), kDPI); |
+ int height_mm = PixelsToMillimeters(resolution.dimensions().height(), kDPI); |
+ CreateMode(kTempModeName, resolution.dimensions().width(), |
+ resolution.dimensions().height()); |
SwitchToMode(NULL); |
- XRRSetScreenSize(display_, root_, size.width(), size.height(), width_mm, |
- height_mm); |
+ XRRSetScreenSize(display_, root_, resolution.dimensions().width(), |
+ resolution.dimensions().height(), width_mm, height_mm); |
SwitchToMode(kTempModeName); |
DeleteMode(kModeName); |
- CreateMode(kModeName, size.width(), size.height()); |
+ CreateMode(kModeName, resolution.dimensions().width(), |
+ resolution.dimensions().height()); |
SwitchToMode(kModeName); |
DeleteMode(kTempModeName); |
} |
-void DesktopResizerLinux::RestoreSize(const SkISize& original) { |
+void DesktopResizerLinux::RestoreResolution(const ScreenResolution& original) { |
// Since the desktop is only visible via a remote connection, the original |
- // size of the desktop will never been seen and there's no point restoring |
- // it; if we did, we'd just risk messing up the user's window layout. |
+ // resolution of the desktop will never been seen and there's no point |
+ // restoring it; if we did, we'd just risk messing up the user's window |
+ // layout. |
} |
void DesktopResizerLinux::CreateMode(const char* name, int width, int height) { |