[Spice-devel] [PATCH win-agent 9/9] Resize to arbitrary resolution

Marc-André Lureau marcandre.lureau at gmail.com
Fri May 11 09:39:18 PDT 2012


Use QXL_ESCAPE_SET_CUSTOM_DISPLAY to update custom mode,
and switch to it.
---
 vdagent/desktop_layout.cpp |   26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/vdagent/desktop_layout.cpp b/vdagent/desktop_layout.cpp
index 6e255fc..7564cf6 100644
--- a/vdagent/desktop_layout.cpp
+++ b/vdagent/desktop_layout.cpp
@@ -15,6 +15,7 @@
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
+#include <spice/qxl_windows.h>
 #include "desktop_layout.h"
 #include "vdlog.h"
 
@@ -240,6 +241,8 @@ bool DesktopLayout::init_dev_mode(LPCTSTR dev_name, DEVMODE* dev_mode, DisplayMo
 {
     DWORD closest_diff = -1;
     DWORD best = -1;
+    QXLEscapeSetCustomDisplay custom;
+    HDC hdc = NULL;
 
     ZeroMemory(dev_mode, sizeof(DEVMODE));
     dev_mode->dmSize = sizeof(DEVMODE);
@@ -248,6 +251,29 @@ bool DesktopLayout::init_dev_mode(LPCTSTR dev_name, DEVMODE* dev_mode, DisplayMo
         dev_mode->dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_POSITION;
         return true;
     }
+
+    // Update custom resolution
+    custom.xres = mode->_width;
+    custom.yres = mode->_height;
+    custom.bpp = mode->_depth;
+    hdc = CreateDC(dev_name, NULL, NULL, NULL);
+    if (!hdc) {
+        vd_printf("failed to create DC: %s", dev_name);
+    } else {
+        int err = ExtEscape(hdc, QXL_ESCAPE_SET_CUSTOM_DISPLAY,
+                            sizeof(QXLEscapeSetCustomDisplay), (LPCSTR)&custom, 0, NULL);
+        if (err <= 0) {
+            vd_printf("can't set custom display, perhaps an old driver");
+        }
+        DeleteDC(hdc);
+    }
+
+    // force refresh mode table
+    DEVMODE tempDevMode;
+    ZeroMemory(&tempDevMode, sizeof (tempDevMode));
+    tempDevMode.dmSize = sizeof(DEVMODE);
+    EnumDisplaySettings(dev_name, 0xffffff, &tempDevMode);
+
     //Find the closest size which will fit within the monitor
     for (DWORD i = 0; EnumDisplaySettings(dev_name, i, dev_mode); i++) {
         if (dev_mode->dmPelsWidth > mode->_width ||
-- 
1.7.10.1



More information about the Spice-devel mailing list