]> 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:12:23 +0000 (13:12 +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.

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 "";