]> source.dussan.org Git - tigervnc.git/commitdiff
Avoid touching PixelFormat internals.
authorPierre Ossman <ossman@cendio.se>
Fri, 3 Apr 2009 12:40:01 +0000 (12:40 +0000)
committerPierre Ossman <ossman@cendio.se>
Fri, 3 Apr 2009 12:40:01 +0000 (12:40 +0000)
We forgot to update the internal variables with the previous version which
caused problems with some clients (first noticed with gtk-vnc).

git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@3746 3789f03b-4d11-0410-bbf8-ca57d06f2519

unix/xserver/hw/vnc/XserverDesktop.cc
unix/xserver/hw/vnc/XserverDesktop.h
unix/xserver/hw/vnc/vncExtInit.cc

index d4965d850a189a016a7d4be84c1600cac17ff22a..9ad283b8e10f4e259280a90cdd5da15bb79840fe 100644 (file)
@@ -172,7 +172,8 @@ public:
 XserverDesktop::XserverDesktop(ScreenPtr pScreen_,
                                network::TcpListener* listener_,
                                network::TcpListener* httpListener_,
-                               const char* name, void* fbptr, int stride)
+                               const char* name, const rfb::PixelFormat &pf,
+                               void* fbptr, int stride)
   : pScreen(pScreen_), deferredUpdateTimer(0), dummyTimer(0),
     server(0), httpServer(0),
     listener(listener_), httpListener(httpListener_),
@@ -181,41 +182,7 @@ XserverDesktop::XserverDesktop(ScreenPtr pScreen_,
     oldButtonMask(0),
     queryConnectId(0)
 {
-  int i;
-  format.depth = pScreen->rootDepth;
-  for (i = 0; i < screenInfo.numPixmapFormats; i++) {
-    if (screenInfo.formats[i].depth == format.depth) {
-      format.bpp = screenInfo.formats[i].bitsPerPixel;
-      break;
-    }
-  }
-  if (i == screenInfo.numPixmapFormats) {
-    fprintf(stderr,"no pixmap format for root depth???\n");
-    abort();
-  }
-  format.bigEndian = (screenInfo.imageByteOrder == MSBFirst);
-
-  VisualPtr vis = NULL;
-  for (i = 0; i < pScreen->numVisuals; i++) {
-    if (pScreen->visuals[i].vid == pScreen->rootVisual) {
-      vis = &pScreen->visuals[i];
-      break;
-    }
-  }
-  if (i == pScreen->numVisuals) {
-    fprintf(stderr,"no visual rec for root visual???\n");
-    abort();
-  }
-  format.trueColour = (vis->c_class == TrueColor);
-  if (!format.trueColour && format.bpp != 8)
-    throw rfb::Exception("X server uses unsupported visual");
-  format.redShift   = ffs(vis->redMask) - 1;
-  format.greenShift = ffs(vis->greenMask) - 1;
-  format.blueShift  = ffs(vis->blueMask) - 1;
-  format.redMax     = vis->redMask   >> format.redShift;
-  format.greenMax   = vis->greenMask >> format.greenShift;
-  format.blueMax    = vis->blueMask  >> format.blueShift;
-
+  format = pf;
   colourmap = this;
 
   serverReset(pScreen);
index 8eecb6b392b8f3596d586bb1392ddaea0f503e87..6777f092ed67ce3bf560d4649a6c9474b1a3e2bd 100644 (file)
@@ -62,7 +62,8 @@ public:
 
   XserverDesktop(ScreenPtr pScreen, network::TcpListener* listener,
                  network::TcpListener* httpListener_,
-                 const char* name, void* fbptr, int stride);
+                 const char* name, const rfb::PixelFormat &pf,
+                 void* fbptr, int stride);
   virtual ~XserverDesktop();
 
   // methods called from X server code
index 54e92f9a380d3415a6db448aed455ddb42aac175..a15a77b40aab90ed28d626a6d533ca191be57534 100644 (file)
@@ -121,6 +121,61 @@ rfb::BoolParameter localhostOnly("localhost",
                                  "Only allow connections from localhost",
                                  false);
 
+static PixelFormat vncGetPixelFormat(ScreenPtr pScreen)
+{
+  int depth, bpp;
+  int trueColour, bigEndian;
+  int redShift, greenShift, blueShift;
+  int redMax, greenMax, blueMax;
+
+  int i;
+  VisualPtr vis = NULL;
+
+  depth = pScreen->rootDepth;
+
+  for (i = 0; i < screenInfo.numPixmapFormats; i++) {
+    if (screenInfo.formats[i].depth == depth) {
+      bpp = screenInfo.formats[i].bitsPerPixel;
+      break;
+    }
+  }
+
+  if (i == screenInfo.numPixmapFormats) {
+    fprintf(stderr,"no pixmap format for root depth???\n");
+    abort();
+  }
+
+  bigEndian = (screenInfo.imageByteOrder == MSBFirst);
+
+  for (i = 0; i < pScreen->numVisuals; i++) {
+    if (pScreen->visuals[i].vid == pScreen->rootVisual) {
+      vis = &pScreen->visuals[i];
+      break;
+    }
+  }
+
+  if (i == pScreen->numVisuals) {
+    fprintf(stderr,"no visual rec for root visual???\n");
+    abort();
+  }
+
+  trueColour = (vis->c_class == TrueColor);
+
+  if (!trueColour && bpp != 8)
+    throw rfb::Exception("X server uses unsupported visual");
+
+  redShift   = ffs(vis->redMask) - 1;
+  greenShift = ffs(vis->greenMask) - 1;
+  blueShift  = ffs(vis->blueMask) - 1;
+  redMax     = vis->redMask   >> redShift;
+  greenMax   = vis->greenMask >> greenShift;
+  blueMax    = vis->blueMask  >> blueShift;
+
+  return PixelFormat(bpp, depth, bigEndian, trueColour,
+                     redMax, greenMax, blueMax,
+                     redShift, greenShift, blueShift);
+}
+
 void vncExtensionInit()
 {
   if (vncExtGeneration == serverGeneration) {
@@ -186,9 +241,13 @@ void vncExtensionInit()
         }
 
         CharArray desktopNameStr(desktopName.getData());
-        desktop[scr] = new XserverDesktop(screenInfo.screens[scr], listener,
+        PixelFormat pf = vncGetPixelFormat(screenInfo.screens[scr]);
+
+        desktop[scr] = new XserverDesktop(screenInfo.screens[scr],
+                                          listener,
                                           httpListener,
                                           desktopNameStr.buf,
+                                          pf,
                                           vncFbptr[scr],
                                           vncFbstride[scr]);
         vlog.info("created VNC server for screen %d", scr);