]> source.dussan.org Git - tigervnc.git/commitdiff
Added DesktopWindow::resizeDesktopWindowToBuffer() method.
authorgeorge82 <george82@3789f03b-4d11-0410-bbf8-ca57d06f2519>
Sat, 27 Jan 2007 15:32:27 +0000 (15:32 +0000)
committergeorge82 <george82@3789f03b-4d11-0410-bbf8-ca57d06f2519>
Sat, 27 Jan 2007 15:32:27 +0000 (15:32 +0000)
Now the Desktop Window resizes against the pixel buffer size
when the scale ratio changed.
This update fixes the bug with zero size of the desktop
window when it restore from minimized position.

git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@2221 3789f03b-4d11-0410-bbf8-ca57d06f2519

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

index ee941fd188db6c18031554849093e0e834b96963..826572337ed5699682930686b3b2529c21e0ad76 100644 (file)
@@ -475,8 +475,7 @@ DesktopWindow::processMessage(UINT msg, WPARAM wParam, LPARAM lParam) {
       // Resize child windows
       GetClientRect(handle, &r);
       if (tb.isVisible()) {
-        MoveWindow(frameHandle, 0, tb.getHeight(),
-                   r.right, r.bottom - tb.getHeight(), TRUE);
+        MoveWindow(frameHandle, 0, tb.getHeight(), r.right, r.bottom - tb.getHeight(), TRUE);
       } else {
         MoveWindow(frameHandle, 0, 0, r.right, r.bottom, TRUE);
       }
@@ -985,13 +984,13 @@ void DesktopWindow::setAutoScaling(bool as) {
 
 void DesktopWindow::setDesktopScaleRatio(double scale_ratio) {
   buffer->setScaleRatio(scale_ratio);
-  InvalidateRect(frameHandle, 0, FALSE);
-  if (!isAutoScaling()) calculateScrollBars();
+  if (!isAutoScaling()) resizeDesktopWindowToBuffer();
   if (isToolbarEnabled()) refreshToolbarButtons();
   char *newTitle = new char[strlen(desktopName)+20];
   sprintf(newTitle, "%s @ %i%%", desktopName, getDesktopScale());
   SetWindowText(handle, TStr(newTitle));
   delete [] newTitle;
+  InvalidateRect(frameHandle, 0, FALSE);
 }
 
 void DesktopWindow::fitBufferToWindow(bool repaint) {
@@ -1139,6 +1138,28 @@ void DesktopWindow::calculateScrollBars() {
   client_size = Rect(r.left, r.top, r.right, r.bottom);
 }
 
+void DesktopWindow::resizeDesktopWindowToBuffer() {
+  RECT r;
+  DWORD style = GetWindowLong(frameHandle, GWL_STYLE) & ~(WS_VSCROLL | WS_HSCROLL);
+  DWORD style_ex = GetWindowLong(frameHandle, GWL_EXSTYLE);
+
+  // Calculate the required size of the desktop window
+  SetRect(&r, 0, 0, buffer->width(), buffer->height());
+  AdjustWindowRectEx(&r, style, FALSE, style_ex);
+  if (isToolbarEnabled())
+    r.bottom += tb.getHeight();
+  AdjustWindowRect(&r, GetWindowLong(handle, GWL_STYLE), FALSE);
+
+  // Set the required size, center the main window and clip to the current monitor
+  SetWindowPos(handle, 0, 0, 0, r.right-r.left, r.bottom-r.top, SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOZORDER | SWP_NOMOVE);
+  centerWindow(handle, NULL);
+  MonitorInfo mi(getMonitor());
+  mi.clipTo(handle);
+
+  // Enable/disable scrollbars as appropriate
+  calculateScrollBars();      
+}
+
 
 void
 DesktopWindow::setName(const char* name) {
index 11b667031247afc6811129c851f818a971bffb87..bce7cf72e044e4f2958873d85a3960adef5404de 100644 (file)
@@ -214,6 +214,9 @@ namespace rfb {
       // window style accordingly
       void calculateScrollBars();
 
+      // Resizes the main window against the pixel buffer size
+      void resizeDesktopWindowToBuffer();
+
       // Win32-specific input handling
       rfb::win32::CPointer ptr;
       Point oldpos;