]> source.dussan.org Git - tigervnc.git/commitdiff
Give all monitor names when mirrored
authorPierre Ossman <ossman@cendio.se>
Thu, 9 Sep 2021 10:24:50 +0000 (12:24 +0200)
committerPierre Ossman <ossman@cendio.se>
Thu, 9 Sep 2021 11:20:14 +0000 (13:20 +0200)
If a monitor is part of a set of mirrored monitors, then give the name
of all used monitors as we don't know which one the user will most
strongly associate with what they see.

(cherry picked from commit 39086068b97217e76ca3ed0fcae01fabd04b4499)

vncviewer/MonitorArrangement.cxx

index 2a86417592f59a7f127dd55c3f9a90a429319476..e075d17331fd20171664d96664787111f89ea8d1 100644 (file)
@@ -372,6 +372,7 @@ std::string MonitorArrangement::get_monitor_name(int m)
   for (iter = sys_monitors.begin(); iter != sys_monitors.end(); ++iter) {
     MONITORINFOEX info;
     DISPLAY_DEVICE dev;
+    std::string name;
 
     info.cbSize = sizeof(info);
     GetMonitorInfo(*iter, (LPMONITORINFO)&info);
@@ -385,10 +386,20 @@ std::string MonitorArrangement::get_monitor_name(int m)
     if ((info.rcMonitor.bottom - info.rcMonitor.top) != h)
       continue;
 
-    dev.cb = sizeof(dev);
-    EnumDisplayDevices(info.szDevice, 0, &dev, 0);
+    for (int i = 0; ; i++) {
+      dev.cb = sizeof(dev);
+      if (!EnumDisplayDevices(info.szDevice, i, &dev, 0))
+        break;
+
+      if (!(dev.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP))
+        continue;
 
-    return dev.DeviceString;
+      if (!name.empty())
+        name += " / ";
+      name += dev.DeviceString;
+    }
+
+    return name;
   }
 
   return "";
@@ -457,6 +468,7 @@ std::string MonitorArrangement::get_monitor_name(int m)
 #if defined (HAVE_XRANDR)
   int x, y, w, h;
   int ev, err, xi_major;
+  std::string name;
 
   fl_open_display();
   assert(fl_display != NULL);
@@ -481,25 +493,26 @@ std::string MonitorArrangement::get_monitor_name(int m)
       continue;
     }
 
+    if ((crtc->x != x) || (crtc->y != y) ||
+        ((int)crtc->width != w) || ((int)crtc->height != h))
+      continue;
+
     for (int j = 0; j < crtc->noutput; j++) {
-      bool monitor_found = (crtc->x == x) &&
-          (crtc->y == y) &&
-          (crtc->width == ((unsigned int) w)) &&
-          (crtc->height == ((unsigned int) h));
-
-      if (monitor_found) {
-        XRROutputInfo *output = XRRGetOutputInfo(fl_display, res, crtc->outputs[j]);
-        if (!output) {
-          vlog.error(_("Failed to get information about output %d for CRTC %d"), j, i);
-          continue;
-        }
+      XRROutputInfo *output;
 
-        return output->name;
+      output = XRRGetOutputInfo(fl_display, res, crtc->outputs[j]);
+      if (!output) {
+        vlog.error(_("Failed to get information about output %d for CRTC %d"), j, i);
+        continue;
       }
+
+      if (!name.empty())
+        name += " / ";
+      name += output->name;
     }
   }
 
-  return "";
+  return name;
 
 #endif // !HAVE_XRANDR
   return "";