Re: [PATCH win-agent] Try harder to enable monitors

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



ack. although the temp res change, it's still much better instead of the quick&dirty patch i posted for 910634.

On 04/23/2013 12:08 AM, Marc-André Lureau wrote:
0ba6e2936 was trying to fix CreateDC() failing when the monitor is
disabled, unfortunately, enabling monitor with an arbitrary resolution
may still fail (the previous resolution, or the current one).

This patch address the issue by first trying the current resolution, and
falling back to a well-known resolution. This causes a temporary client
resolution change (bad), which is immediately adjusted to the arbitrary
resolution.

We may want to improve agent->driver communication of arbitrary
resolution before the driver is loaded, perhaps using registry or via
the spice server. Any of these solution will unfortunately take some more
time which we are missing.

https://bugzilla.redhat.com/show_bug.cgi?id=922394

(seem to solve related bugs, like mouse offset, or flashing monitors)
---
  vdagent/desktop_layout.cpp | 35 ++++++++++++++++++++++++++---------
  1 file changed, 26 insertions(+), 9 deletions(-)

diff --git a/vdagent/desktop_layout.cpp b/vdagent/desktop_layout.cpp
index bce9ac0..c474edb 100644
--- a/vdagent/desktop_layout.cpp
+++ b/vdagent/desktop_layout.cpp
@@ -253,19 +253,36 @@ bool DesktopLayout::init_dev_mode(LPCTSTR dev_name, DEVMODE* dev_mode, DisplayMo
          return true;
      }
- // attach
-    EnumDisplaySettings(dev_name, ENUM_CURRENT_SETTINGS, dev_mode);
-    ret = ChangeDisplaySettingsEx(dev_name, dev_mode, NULL, CDS_UPDATEREGISTRY, NULL);
-    vd_printf("attach %d", ret);
-
-    // Update custom resolution
-    custom.xres = mode->_width;
-    custom.yres = mode->_height;
-    custom.bpp = mode->_depth;
      hdc = CreateDC(dev_name, NULL, NULL, NULL);
      if (!hdc) {
+        // for some reason, windows want those 3 flags to enable monitor
+        dev_mode->dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_POSITION;
+        dev_mode->dmPelsWidth = mode->_width;
+        dev_mode->dmPelsHeight = mode->_height;
+        ret = ChangeDisplaySettingsEx(dev_name, dev_mode, NULL, CDS_UPDATEREGISTRY, NULL);
+        if (ret == DISP_CHANGE_BADMODE) {
+            // custom resolution might not be set yet, use known resolution
+            // FIXME: this causes client temporary resize... a
+            // solution would involve passing custom resolution before
+            // driver initialization, perhaps through registry
+            dev_mode->dmPelsWidth = 640;
+            dev_mode->dmPelsHeight = 480;
+            ret = ChangeDisplaySettingsEx(dev_name, dev_mode, NULL, CDS_UPDATEREGISTRY, NULL);
+        }, and replace it
+
+        vd_printf("attach %d", ret);
+        hdc = CreateDC(dev_name, NULL, NULL, NULL);
+    }
+
+    if (!hdc) {
          vd_printf("failed to create DC");
+        return false;
      } else {
+        // Update custom resolution
+        custom.xres = mode->_width;
+        custom.yres = mode->_height;
+        custom.bpp = mode->_depth;
+
          int err = ExtEscape(hdc, QXL_ESCAPE_SET_CUSTOM_DISPLAY,
                              sizeof(QXLEscapeSetCustomDisplay), (LPCSTR)&custom, 0, NULL);
          if (err <= 0) {

_______________________________________________
Spice-devel mailing list
Spice-devel@xxxxxxxxxxxxxxxxxxxxx
http://lists.freedesktop.org/mailman/listinfo/spice-devel





[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]     [Monitors]