From fe3fa5ef382d3475b1a2f62eac85f5b5847b9b5d Mon Sep 17 00:00:00 2001
From: Mihai Moldovan <ïonic@ionic.de>
Date: Sat, 9 Apr 2016 19:38:12 +0000
Subject: 
 nx-X11/programs/Xserver/{dix/{colormap.c,window.c},hw/nxagent/NXwindow.c,include/{colormap,window{,str}}.h}:
 backport features needed for Composite 0.4.

---
 nx-X11/programs/Xserver/dix/colormap.c        | 77 +++++++++++++++++++++++++++
 nx-X11/programs/Xserver/dix/window.c          | 12 +++++
 nx-X11/programs/Xserver/hw/nxagent/NXwindow.c |  8 +++
 nx-X11/programs/Xserver/include/colormap.h    |  4 ++
 nx-X11/programs/Xserver/include/window.h      |  4 ++
 nx-X11/programs/Xserver/include/windowstr.h   | 29 +++++++++-
 6 files changed, 133 insertions(+), 1 deletion(-)

diff --git a/nx-X11/programs/Xserver/dix/colormap.c b/nx-X11/programs/Xserver/dix/colormap.c
index 11a353f84..cd5e1dc49 100644
--- a/nx-X11/programs/Xserver/dix/colormap.c
+++ b/nx-X11/programs/Xserver/dix/colormap.c
@@ -2791,3 +2791,80 @@ IsMapInstalled(Colormap map, WindowPtr pWin)
     DEALLOCATE_LOCAL(pmaps);
     return (found);
 }
+
+struct colormap_lookup_data {
+    ScreenPtr pScreen;
+    VisualPtr visuals;
+};
+
+static void
+_colormap_find_resource(void *value, XID id, void *cdata)
+{
+    struct colormap_lookup_data *cmap_data = cdata;
+    VisualPtr visuals = cmap_data->visuals;
+    ScreenPtr pScreen = cmap_data->pScreen;
+    ColormapPtr cmap = value;
+    int j;
+
+    if (pScreen != cmap->pScreen)
+        return;
+
+    j = cmap->pVisual - pScreen->visuals;
+    cmap->pVisual = &visuals[j];
+}
+
+/* something has realloced the visuals, instead of breaking
+   ABI fix it up here - glx and compsite did this wrong */
+Bool
+ResizeVisualArray(ScreenPtr pScreen, int new_visual_count, DepthPtr depth)
+{
+    struct colormap_lookup_data cdata;
+    int numVisuals;
+    VisualPtr visuals;
+    XID *vids, vid;
+    int first_new_vid, first_new_visual, i;
+
+    first_new_vid = depth->numVids;
+    first_new_visual = pScreen->numVisuals;
+
+#if 0 /* !defined(NXAGENT_SERVER) */
+    vids = reallocarray(depth->vids, depth->numVids + new_visual_count,
+                        sizeof(XID));
+#else
+    vids = xrealloc(depth->vids, sizeof(XID) *
+                    (depth->numVids + new_visual_count));
+#endif
+    if (!vids)
+        return FALSE;
+
+    /* its realloced now no going back if we fail the next one */
+    depth->vids = vids;
+
+    numVisuals = pScreen->numVisuals + new_visual_count;
+#if 0 /* !defined(NXAGENT_SERVER) */
+    visuals = reallocarray(pScreen->visuals, numVisuals, sizeof(VisualRec));
+#else
+    visuals = xrealloc(pScreen->visuals, sizeof(VisualRec) * numVisuals);
+#endif
+    if (!visuals) {
+        return FALSE;
+    }
+
+    cdata.visuals = visuals;
+    cdata.pScreen = pScreen;
+    FindClientResourcesByType(serverClient, RT_COLORMAP,
+                              _colormap_find_resource, &cdata);
+
+    pScreen->visuals = visuals;
+
+    for (i = 0; i < new_visual_count; i++) {
+        vid = FakeClientID(0);
+        pScreen->visuals[first_new_visual + i].vid = vid;
+        vids[first_new_vid + i] = vid;
+    }
+
+    depth->numVids += new_visual_count;
+    pScreen->numVisuals += new_visual_count;
+
+    return TRUE;
+}
diff --git a/nx-X11/programs/Xserver/dix/window.c b/nx-X11/programs/Xserver/dix/window.c
index 916d7e276..c3d901fb9 100644
--- a/nx-X11/programs/Xserver/dix/window.c
+++ b/nx-X11/programs/Xserver/dix/window.c
@@ -535,9 +535,21 @@ ClippedRegionFromBox(register WindowPtr pWin, RegionPtr Rgn,
     RegionIntersect(Rgn, Rgn, &pWin->winSize);
 }
 
+static RealChildHeadProc realChildHeadProc = NULL;
+
+void
+RegisterRealChildHeadProc (RealChildHeadProc proc)
+{
+    realChildHeadProc = proc;
+}
+
 WindowPtr
 RealChildHead(register WindowPtr pWin)
 {
+    if (realChildHeadProc) {
+        return realChildHeadProc (pWin);
+    }
+
     if (!pWin->parent &&
 	(screenIsSaved == SCREEN_SAVER_ON) &&
 	(HasSaverWindow (pWin->drawable.pScreen->myNum)))
diff --git a/nx-X11/programs/Xserver/hw/nxagent/NXwindow.c b/nx-X11/programs/Xserver/hw/nxagent/NXwindow.c
index b2da4e97c..70c378b9e 100644
--- a/nx-X11/programs/Xserver/hw/nxagent/NXwindow.c
+++ b/nx-X11/programs/Xserver/hw/nxagent/NXwindow.c
@@ -717,6 +717,14 @@ ClippedRegionFromBox(register WindowPtr pWin, RegionPtr Rgn,
     RegionIntersect(Rgn, Rgn, &pWin->winSize);
 }
 
+static RealChildHeadProc realChildHeadProc = NULL;
+
+void
+RegisterRealChildHeadProc (RealChildHeadProc proc)
+{
+    realChildHeadProc = proc;
+}
+
 WindowPtr
 RealChildHead(register WindowPtr pWin)
 {
diff --git a/nx-X11/programs/Xserver/include/colormap.h b/nx-X11/programs/Xserver/include/colormap.h
index 67f44193d..bfc6667db 100644
--- a/nx-X11/programs/Xserver/include/colormap.h
+++ b/nx-X11/programs/Xserver/include/colormap.h
@@ -181,4 +181,8 @@ extern int IsMapInstalled(
     Colormap /*map*/,
     WindowPtr /*pWin*/);
 
+extern Bool ResizeVisualArray(ScreenPtr /* pScreen */ ,
+                              int /* new_vis_count */ ,
+                              DepthPtr /* depth */ );
+
 #endif /* CMAP_H */
diff --git a/nx-X11/programs/Xserver/include/window.h b/nx-X11/programs/Xserver/include/window.h
index 571115365..9e670995d 100644
--- a/nx-X11/programs/Xserver/include/window.h
+++ b/nx-X11/programs/Xserver/include/window.h
@@ -102,6 +102,10 @@ extern void ClippedRegionFromBox(
     int /*w*/,
     int /*h*/);
 
+typedef WindowPtr (* RealChildHeadProc) (WindowPtr pWin);
+
+void RegisterRealChildHeadProc (RealChildHeadProc proc);
+
 extern WindowPtr RealChildHead(
     WindowPtr /*pWin*/);
 
diff --git a/nx-X11/programs/Xserver/include/windowstr.h b/nx-X11/programs/Xserver/include/windowstr.h
index 5c181bc51..c32842fe3 100644
--- a/nx-X11/programs/Xserver/include/windowstr.h
+++ b/nx-X11/programs/Xserver/include/windowstr.h
@@ -96,6 +96,33 @@ typedef struct _WindowOpt {
 #define BackgroundPixel	    2L
 #define BackgroundPixmap    3L
 
+/*
+ * The redirectDraw field can have one of three values:
+ *
+ *  RedirectDrawNone
+ *	A normal window; painted into the same pixmap as the parent
+ *	and clipping parent and siblings to its geometry. These
+ *	windows get a clip list equal to the intersection of their
+ *	geometry with the parent geometry, minus the geometry
+ *	of overlapping None and Clipped siblings.
+ *  RedirectDrawAutomatic
+ *	A redirected window which clips parent and sibling drawing.
+ *	Contents for these windows are manage inside the server.
+ *	These windows get an internal clip list equal to their
+ *	geometry.
+ *  RedirectDrawManual
+ *	A redirected window which does not clip parent and sibling
+ *	drawing; the window must be represented within the parent
+ *	geometry by the client performing the redirection management.
+ *	Contents for these windows are managed outside the server.
+ *	These windows get an internal clip list equal to their
+ *	geometry.
+ */
+
+#define RedirectDrawNone	0
+#define RedirectDrawAutomatic	1
+#define RedirectDrawManual	2
+
 typedef struct _Window {
     DrawableRec		drawable;
     WindowPtr		parent;		/* ancestor chain */
@@ -138,7 +165,7 @@ typedef struct _Window {
     unsigned		srcBuffer:1;	/* source buffer for rendering */
 #endif
 #ifdef COMPOSITE
-    unsigned		redirectDraw:1;	/* rendering is redirected from here */
+    unsigned		redirectDraw:2;	/* rendering is redirected from here */
 #endif
     DevUnion		*devPrivates;
 } WindowRec;
-- 
cgit v1.2.3