]> source.dussan.org Git - tigervnc.git/commitdiff
Added the autoScaling mode implementation to the vncviewer.
authorgeorge82 <george82@3789f03b-4d11-0410-bbf8-ca57d06f2519>
Tue, 5 Sep 2006 06:51:41 +0000 (06:51 +0000)
committergeorge82 <george82@3789f03b-4d11-0410-bbf8-ca57d06f2519>
Tue, 5 Sep 2006 06:51:41 +0000 (06:51 +0000)
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@645 3789f03b-4d11-0410-bbf8-ca57d06f2519

win/vncviewer/CConn.cxx
win/vncviewer/DesktopWindow.cxx
win/vncviewer/DesktopWindow.h

index 9f597ed0698534ebd92280b8f16ba9153a15d9c6..2fb8d2d3825e7260b6861621e15e9057b276dae6 100644 (file)
@@ -150,7 +150,12 @@ CConn::applyOptions(CConnOptions& opt) {
     window->setMenuKey(options.menuKey);
     window->setDisableWinKeys(options.disableWinKeys);
     window->setShowToolbar(options.showToolbar);
-    window->setDesktopScale(options.scale);
+    if (options.autoScaling) {
+      window->setAutoScaling(true);
+    } else {
+      window->setAutoScaling(false);
+      window->setDesktopScale(options.scale);
+    }
     if (!options.useLocalCursor)
       window->setCursor(0, 0, Point(), 0, 0);
   }
@@ -611,9 +616,9 @@ void CConn::serverInit() {
 
   // Show the window
   window = new DesktopWindow(this);
-  applyOptions(options);
   window->setName(cp.name());
   window->setSize(cp.width, cp.height);
+  applyOptions(options);
 
   // Save the server's current format
   serverDefaultPF = cp.pf();
index babcd45b16407c79c2df3d339c157bc46198f0d2..00f4c10f36175dec2daaac851b0406dc8d2e7eef 100644 (file)
@@ -181,7 +181,7 @@ FrameClass frameClass;
 
 DesktopWindow::DesktopWindow(Callback* cb) 
   : buffer(0),
-    showToolbar(false),
+    showToolbar(false), autoScaling(false),
     client_size(0, 0, 16, 16), window_size(0, 0, 32, 32),
     cursorVisible(false), cursorAvailable(false), cursorInBuffer(false),
     systemCursorVisible(true), trackingMouseLeave(false),
@@ -406,7 +406,7 @@ DesktopWindow::processMessage(UINT msg, WPARAM wParam, LPARAM lParam) {
   case WM_WINDOWPOSCHANGING:
     {
       WINDOWPOS* wpos = (WINDOWPOS*)lParam;
-      if (wpos->flags & SWP_NOSIZE)
+      if ((wpos->flags & SWP_NOSIZE) || isAutoScaling())
         break;
 
       // Work out how big the window should ideally be
@@ -469,11 +469,16 @@ DesktopWindow::processMessage(UINT msg, WPARAM wParam, LPARAM lParam) {
       GetClientRect(frameHandle, &r);
       client_size = Rect(r.left, r.top, r.right, r.bottom);
 
-      // Determine whether scrollbars are required
-      calculateScrollBars();
+      // Perform the AutoScaling operation
+      if (isAutoScaling()) {
+        fitBufferToWindow(false);
+      } else {
+        // Determine whether scrollbars are required
+        calculateScrollBars();
+      }
 
       // Redraw if required
-      if ((!old_offset.equals(desktopToClient(Point(0, 0)))))
+      if ((!old_offset.equals(desktopToClient(Point(0, 0)))) || isAutoScaling())
         InvalidateRect(frameHandle, 0, TRUE);
     }
     break;
@@ -791,8 +796,8 @@ DesktopWindow::processFrameMessage(UINT msg, WPARAM wParam, LPARAM lParam) {
         // Send a pointer event to the server
         oldpos = p;
         if (buffer->isScaling()) {
-          p.x /= double(buffer->getScale()) / 100.0;
-          p.y /= double(buffer->getScale()) / 100.0;
+          p.x /= buffer->getScaleRatio();
+          p.y /= buffer->getScaleRatio();
         }
         ptr.pointerEvent(callback, p, mask);
 #ifdef WM_MOUSEWHEEL
@@ -917,6 +922,10 @@ DesktopWindow::setSize(int w, int h) {
   // Resize the backing buffer
   buffer->setSize(w, h);
 
+  // Calculate the pixel buffer aspect correlation. It's used
+  // for the autoScaling operation.
+  aspect_corr = (double)w / h;
+
   // If the window is not maximised or full-screen then resize it
   if (!(GetWindowLong(handle, GWL_STYLE) & WS_MAXIMIZE) && !fullscreenActive) {
     // Resize the window to the required size
index f0db427518eaeb85f8a852f4203cad0698ef1f68..c24b0ced3b58a808bf0784876e63b970a00e3fb6 100644 (file)
@@ -82,6 +82,11 @@ namespace rfb {
       PixelFormat getPF() const { return buffer->getPF(); }
       void setSize(int w, int h);
       void setColour(int i, int r, int g, int b) {buffer->setColour(i, r, g, b);}
+      void setAutoScaling(bool as) { 
+        autoScaling = as;
+        if (as) fitBufferToWindow();
+      }
+      bool isAutoScaling() const { return autoScaling; }
       void setDesktopScale(int scale);
       void fitBufferToWindow(bool repaint = true);
 
@@ -239,6 +244,7 @@ namespace rfb {
       win32::ScaledDIBSectionBuffer* buffer;
       double aspect_corr;
       bool has_focus;
+      bool autoScaling;
       Rect window_size;
       Rect client_size;
       Point scrolloffset;