]> source.dussan.org Git - tigervnc.git/commitdiff
Make vncRandRGetOutputDimensions tolerant for disabled outputs
authorPeter Åstrand (astrand) <astrand@cendio.se>
Mon, 19 Mar 2018 09:47:40 +0000 (10:47 +0100)
committerPeter Åstrand (astrand) <astrand@cendio.se>
Mon, 9 Apr 2018 09:03:57 +0000 (11:03 +0200)
Return error if no CRTC.

unix/common/RandrGlue.h
unix/common/randr.cxx
unix/xserver/hw/vnc/RandrGlue.c

index 48ce327347e75ffa3e50ff869d4e66f3a1d8836a..43c9b68540f741eabf6c5e75ac6a3d29b0df13d8 100644 (file)
@@ -51,7 +51,7 @@ int vncRandRReconfigureOutput(int outputIdx, int x, int y,
                               int width, int height);
 
 unsigned int vncRandRGetOutputId(int outputIdx);
-void vncRandRGetOutputDimensions(int outputIdx,
+int vncRandRGetOutputDimensions(int outputIdx,
                                  int *x, int *y, int *width, int *height);
 
 int vncRandRCreateOutputs(int extraOutputs);
index 858199165b3e6a9815eefac9c785b71ce9ecd82e..b0adc3fdcc017a7547b487b0d1028b8be1b43231 100644 (file)
@@ -65,9 +65,9 @@ rfb::ScreenSet computeScreenLayout(OutputIdMap *outputIdMap)
       newIdMap[outputId] = id;
     }
 
-    vncRandRGetOutputDimensions(i, &x, &y, &width, &height);
-
-    layout.add_screen(rfb::Screen(newIdMap[outputId], x, y, width, height, 0));
+    if (vncRandRGetOutputDimensions(i, &x, &y, &width, &height) == 0) {
+      layout.add_screen(rfb::Screen(newIdMap[outputId], x, y, width, height, 0));
+    }
   }
 
   /* Only keep the entries that are currently active */
index 86ec8bcc779720def329648e69dce535d2586b30..ddf671e0ecd1e46b0e0ec76c3355f4e1c82eae16 100644 (file)
@@ -191,18 +191,24 @@ unsigned int vncRandRGetOutputId(int outputIdx)
   return rp->outputs[outputIdx]->id;
 }
 
-void vncRandRGetOutputDimensions(int outputIdx,
+int vncRandRGetOutputDimensions(int outputIdx,
                             int *x, int *y, int *width, int *height)
 {
   rrScrPrivPtr rp = rrGetScrPriv(screenInfo.screens[scrIdx]);
+  RRCrtcPtr crtc;
   int swap;
+  *x = *y = *width = *height = 0;
 
-  *x = rp->outputs[outputIdx]->crtc->x;
-  *y = rp->outputs[outputIdx]->crtc->y;
-  *width = rp->outputs[outputIdx]->crtc->mode->mode.width;
-  *height = rp->outputs[outputIdx]->crtc->mode->mode.height;
+  crtc = rp->outputs[outputIdx]->crtc;
+  if (crtc == NULL || !crtc->mode)
+    return 1;
 
-  switch (rp->outputs[outputIdx]->crtc->rotation & 0xf) {
+  *x = crtc->x;
+  *y = crtc->y;
+  *width = crtc->mode->mode.width;
+  *height = crtc->mode->mode.height;
+
+  switch (crtc->rotation & 0xf) {
   case RR_Rotate_90:
   case RR_Rotate_270:
     swap = *width;
@@ -210,6 +216,7 @@ void vncRandRGetOutputDimensions(int outputIdx,
     *height = swap;
     break;
   }
+  return 0;
 }
 
 int vncRandRReconfigureOutput(int outputIdx, int x, int y,