]> source.dussan.org Git - tigervnc.git/commitdiff
Implemented Composite hook. This solves the problem with menu text in OpenOffice...
authorPeter Åstrand <astrand@cendio.se>
Thu, 10 Mar 2005 13:28:04 +0000 (13:28 +0000)
committerPeter Åstrand <astrand@cendio.se>
Thu, 10 Mar 2005 13:28:04 +0000 (13:28 +0000)
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@237 3789f03b-4d11-0410-bbf8-ca57d06f2519

xc/programs/Xserver/vnc/Imakefile
xc/programs/Xserver/vnc/module/Imakefile
xc/programs/Xserver/vnc/vncHooks.cc

index 7e6187016eb040912da23ea4c911787cbf876e2f..1c8132d906eb26425a61a15ff796cdf986ec0498 100644 (file)
@@ -18,7 +18,7 @@ XCOMM CXXDEBUGFLAGS = -g
          SRCS = vncExtInit.cc vncHooks.cc XserverDesktop.cc
          OBJS = vncExtInit.o vncHooks.o XserverDesktop.o
      INCLUDES = -I../include -I$(EXTINCSRC) -I$(XINCLUDESRC) -I$(FONTINCSRC) \
-                -I../mfb -I../mi $(VNCINCLUDE)
+                -I../render $(VNCINCLUDE)
 #if defined(XFree86Version) && XFree86Version >= 4000
    VNCDEFINES = -DGC_HAS_COMPOSITE_CLIP
 #endif
index 6011781473182d03d5e2afb93e5a1c29bfb23237..7b317438be92d1ff1515c5f46bab890fa4e682ec 100644 (file)
@@ -12,7 +12,7 @@
     OBJS = vncExtInit.o vncHooks.o xf86vncModule.o XserverDesktop.o
 INCLUDES = -I.. -I../../include -I$(EXTINCSRC) -I$(XINCLUDESRC) \
            -I$(FONTINCSRC) -I$(XF86COMSRC) \
-           $(VNCINCLUDE)
+           -I../../render $(VNCINCLUDE)
  DEFINES = $(STD_DEFINES) -DGC_HAS_COMPOSITE_CLIP -DXFree86LOADER
 
 LinkSourceFile(vncExtInit.cc,..)
index d52a497107c36e9751daa0952eb35e3759b04eb0..1321bf32812b5eeba083c33ecd048ac80ca470fa 100644 (file)
@@ -29,6 +29,9 @@ extern "C" {
 #include "regionstr.h"
 #include "dixfontstr.h"
 #include "colormapst.h"
+#ifdef RENDER
+#include "picturestr.h"
+#endif
 
 #ifdef GC_HAS_COMPOSITE_CLIP
 #define COMPOSITE_CLIP(gc) ((gc)->pCompositeClip)
@@ -74,6 +77,9 @@ typedef struct {
   StoreColorsProcPtr           StoreColors;
   DisplayCursorProcPtr         DisplayCursor;
   ScreenBlockHandlerProcPtr    BlockHandler;
+#ifdef RENDER
+  CompositeProcPtr             Composite;
+#endif
 } vncHooksScreenRec, *vncHooksScreenPtr;
 
 typedef struct {
@@ -104,6 +110,11 @@ static void vncHooksStoreColors(ColormapPtr pColormap, int ndef,
 static Bool vncHooksDisplayCursor(ScreenPtr pScreen, CursorPtr cursor);
 static void vncHooksBlockHandler(int i, pointer blockData, pointer pTimeout,
                                  pointer pReadmask);
+#ifdef RENDER
+static void vncHooksComposite(CARD8 op, PicturePtr pSrc, PicturePtr pMask, 
+                             PicturePtr pDst, INT16 xSrc, INT16 ySrc, INT16 xMask, 
+                             INT16 yMask, INT16 xDst, INT16 yDst, CARD16 width, CARD16 height);
+#endif
 
 // GC "funcs"
 
@@ -229,6 +240,13 @@ Bool vncHooksInit(ScreenPtr pScreen, XserverDesktop* desktop)
   vncHooksScreen->StoreColors = pScreen->StoreColors;
   vncHooksScreen->DisplayCursor = pScreen->DisplayCursor;
   vncHooksScreen->BlockHandler = pScreen->BlockHandler;
+#ifdef RENDER
+  PictureScreenPtr ps;
+  ps = GetPictureScreenIfSet(pScreen);
+  if (ps) {
+    vncHooksScreen->Composite = ps->Composite;
+  }
+#endif
 
   pScreen->CloseScreen = vncHooksCloseScreen;
   pScreen->CreateGC = vncHooksCreateGC;
@@ -241,6 +259,11 @@ Bool vncHooksInit(ScreenPtr pScreen, XserverDesktop* desktop)
   pScreen->StoreColors = vncHooksStoreColors;
   pScreen->DisplayCursor = vncHooksDisplayCursor;
   pScreen->BlockHandler = vncHooksBlockHandler;
+#ifdef RENDER
+  if (ps) {
+    ps->Composite = vncHooksComposite;
+  }
+#endif
 
   return TRUE;
 }
@@ -470,6 +493,33 @@ static void vncHooksBlockHandler(int i, pointer blockData, pointer pTimeout,
   SCREEN_REWRAP(BlockHandler);
 }
 
+// Composite - needed for RENDER
+
+#ifdef RENDER
+void vncHooksComposite(CARD8 op, PicturePtr pSrc, PicturePtr pMask, 
+                      PicturePtr pDst, INT16 xSrc, INT16 ySrc, INT16 xMask, 
+                      INT16 yMask, INT16 xDst, INT16 yDst, CARD16 width, CARD16 height)
+{
+  ScreenPtr pScreen = pDst->pDrawable->pScreen;
+  vncHooksScreenPtr vncHooksScreen = ((vncHooksScreenPtr)pScreen->devPrivates[vncHooksScreenIndex].ptr); 
+  BoxRec box;
+  PictureScreenPtr ps = GetPictureScreen(pScreen);
+
+  box.x1 = pDst->pDrawable->x + xDst;
+  box.y1 = pDst->pDrawable->y + yDst;
+  box.x2 = box.x1 + width;
+  box.y2 = box.y1 + height;
+
+  RegionHelper changed(pScreen, &box, 0);
+  vncHooksScreen->desktop->add_changed(changed.reg);
+
+  ps->Composite = vncHooksScreen->Composite;
+  (*ps->Composite)(op, pSrc, pMask, pDst, xSrc, ySrc,
+                  xMask, yMask, xDst, yDst, width, height);
+  ps->Composite = vncHooksComposite;
+}
+
+#endif /* RENDER */
 
 
 /////////////////////////////////////////////////////////////////////////////