]> git.sesse.net Git - rdpsrv/blobdiff - Xserver/programs/Xserver/dix/privates.c
Import X server from vnc-3.3.7.
[rdpsrv] / Xserver / programs / Xserver / dix / privates.c
diff --git a/Xserver/programs/Xserver/dix/privates.c b/Xserver/programs/Xserver/dix/privates.c
new file mode 100644 (file)
index 0000000..9a1a156
--- /dev/null
@@ -0,0 +1,355 @@
+/* $XConsortium: privates.c /main/5 1996/06/17 10:56:22 mor $ */
+/* $XFree86: xc/programs/Xserver/dix/privates.c,v 3.2 1997/01/23 10:57:19 dawes Exp $ */
+/*
+
+Copyright (c) 1993  X Consortium
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of the X Consortium shall
+not be used in advertising or otherwise to promote the sale, use or
+other dealings in this Software without prior written authorization
+from the X Consortium.
+
+*/
+
+#include "X.h"
+#include "scrnintstr.h"
+#include "misc.h"
+#include "os.h"
+#include "windowstr.h"
+#include "resource.h"
+#include "dixstruct.h"
+#include "gcstruct.h"
+#include "colormapst.h"
+#include "servermd.h"
+#include "site.h"
+
+/*
+ *  See the Wrappers and devPrivates section in "Definition of the
+ *  Porting Layer for the X v11 Sample Server" (doc/Server/ddx.tbl.ms)
+ *  for information on how to use devPrivates.
+ */
+
+/*
+ *  client private machinery
+ */
+
+static int  clientPrivateCount;
+int clientPrivateLen;
+unsigned *clientPrivateSizes;
+unsigned totalClientSize;
+
+void
+ResetClientPrivates()
+{
+    clientPrivateCount = 0;
+    clientPrivateLen = 0;
+    xfree(clientPrivateSizes);
+    clientPrivateSizes = (unsigned *)NULL;
+    totalClientSize = sizeof(ClientRec);
+
+}
+
+int
+AllocateClientPrivateIndex()
+{
+    return clientPrivateCount++;
+}
+
+Bool
+AllocateClientPrivate(index2, amount)
+    int index2;
+    unsigned amount;
+{
+    unsigned oldamount;
+
+    if (index2 >= clientPrivateLen)
+    {
+       unsigned *nsizes;
+       nsizes = (unsigned *)xrealloc(clientPrivateSizes,
+                                     (index2 + 1) * sizeof(unsigned));
+       if (!nsizes)
+           return FALSE;
+       while (clientPrivateLen <= index2)
+       {
+           nsizes[clientPrivateLen++] = 0;
+           totalClientSize += sizeof(DevUnion);
+       }
+       clientPrivateSizes = nsizes;
+    }
+    oldamount = clientPrivateSizes[index2];
+    if (amount > oldamount)
+    {
+       clientPrivateSizes[index2] = amount;
+       totalClientSize += (amount - oldamount);
+    }
+    return TRUE;
+}
+
+/*
+ *  screen private machinery
+ */
+
+int  screenPrivateCount;
+
+void
+ResetScreenPrivates()
+{
+    screenPrivateCount = 0;
+}
+
+/* this can be called after some screens have been created,
+ * so we have to worry about resizing existing devPrivates
+ */
+int
+AllocateScreenPrivateIndex()
+{
+    int                index2;
+    int                i;
+    ScreenPtr  pScreen;
+    DevUnion   *nprivs;
+
+    index2 = screenPrivateCount++;
+    for (i = 0; i < screenInfo.numScreens; i++)
+    {
+       pScreen = screenInfo.screens[i];
+       nprivs = (DevUnion *)xrealloc(pScreen->devPrivates,
+                                     screenPrivateCount * sizeof(DevUnion));
+       if (!nprivs)
+       {
+           screenPrivateCount--;
+           return -1;
+       }
+       pScreen->devPrivates = nprivs;
+    }
+    return index2;
+}
+
+
+/*
+ *  window private machinery
+ */
+
+static int  windowPrivateCount;
+
+void
+ResetWindowPrivates()
+{
+    windowPrivateCount = 0;
+}
+
+int
+AllocateWindowPrivateIndex()
+{
+    return windowPrivateCount++;
+}
+
+Bool
+AllocateWindowPrivate(pScreen, index2, amount)
+    register ScreenPtr pScreen;
+    int index2;
+    unsigned amount;
+{
+    unsigned oldamount;
+
+    if (index2 >= pScreen->WindowPrivateLen)
+    {
+       unsigned *nsizes;
+       nsizes = (unsigned *)xrealloc(pScreen->WindowPrivateSizes,
+                                     (index2 + 1) * sizeof(unsigned));
+       if (!nsizes)
+           return FALSE;
+       while (pScreen->WindowPrivateLen <= index2)
+       {
+           nsizes[pScreen->WindowPrivateLen++] = 0;
+           pScreen->totalWindowSize += sizeof(DevUnion);
+       }
+       pScreen->WindowPrivateSizes = nsizes;
+    }
+    oldamount = pScreen->WindowPrivateSizes[index2];
+    if (amount > oldamount)
+    {
+       pScreen->WindowPrivateSizes[index2] = amount;
+       pScreen->totalWindowSize += (amount - oldamount);
+    }
+    return TRUE;
+}
+
+
+/*
+ *  gc private machinery 
+ */
+
+static int  gcPrivateCount;
+
+void
+ResetGCPrivates()
+{
+    gcPrivateCount = 0;
+}
+
+int
+AllocateGCPrivateIndex()
+{
+    return gcPrivateCount++;
+}
+
+Bool
+AllocateGCPrivate(pScreen, index2, amount)
+    register ScreenPtr pScreen;
+    int index2;
+    unsigned amount;
+{
+    unsigned oldamount;
+
+    if (index2 >= pScreen->GCPrivateLen)
+    {
+       unsigned *nsizes;
+       nsizes = (unsigned *)xrealloc(pScreen->GCPrivateSizes,
+                                     (index2 + 1) * sizeof(unsigned));
+       if (!nsizes)
+           return FALSE;
+       while (pScreen->GCPrivateLen <= index2)
+       {
+           nsizes[pScreen->GCPrivateLen++] = 0;
+           pScreen->totalGCSize += sizeof(DevUnion);
+       }
+       pScreen->GCPrivateSizes = nsizes;
+    }
+    oldamount = pScreen->GCPrivateSizes[index2];
+    if (amount > oldamount)
+    {
+       pScreen->GCPrivateSizes[index2] = amount;
+       pScreen->totalGCSize += (amount - oldamount);
+    }
+    return TRUE;
+}
+
+
+/*
+ *  pixmap private machinery
+ */
+#ifdef PIXPRIV
+static int  pixmapPrivateCount;
+
+void
+ResetPixmapPrivates()
+{
+    pixmapPrivateCount = 0;
+}
+
+int
+AllocatePixmapPrivateIndex()
+{
+    return pixmapPrivateCount++;
+}
+
+Bool
+AllocatePixmapPrivate(pScreen, index2, amount)
+    register ScreenPtr pScreen;
+    int index2;
+    unsigned amount;
+{
+    unsigned oldamount;
+
+    if (index2 >= pScreen->PixmapPrivateLen)
+    {
+       unsigned *nsizes;
+       nsizes = (unsigned *)xrealloc(pScreen->PixmapPrivateSizes,
+                                     (index2 + 1) * sizeof(unsigned));
+       if (!nsizes)
+           return FALSE;
+       while (pScreen->PixmapPrivateLen <= index2)
+       {
+           nsizes[pScreen->PixmapPrivateLen++] = 0;
+           pScreen->totalPixmapSize += sizeof(DevUnion);
+       }
+       pScreen->PixmapPrivateSizes = nsizes;
+    }
+    oldamount = pScreen->PixmapPrivateSizes[index2];
+    if (amount > oldamount)
+    {
+       pScreen->PixmapPrivateSizes[index2] = amount;
+       pScreen->totalPixmapSize += (amount - oldamount);
+    }
+    pScreen->totalPixmapSize = BitmapBytePad(pScreen->totalPixmapSize * 8);
+    return TRUE;
+}
+#endif
+
+
+/*
+ *  colormap private machinery
+ */
+
+int  colormapPrivateCount;
+
+void
+ResetColormapPrivates()
+{
+    colormapPrivateCount = 0;
+}
+
+
+int
+AllocateColormapPrivateIndex (initPrivFunc)
+
+InitCmapPrivFunc initPrivFunc;
+
+{
+    int                index;
+    int                i;
+    ColormapPtr        pColormap;
+    DevUnion   *privs;
+
+    index = colormapPrivateCount++;
+
+    for (i = 0; i < screenInfo.numScreens; i++)
+    {
+       /*
+        * AllocateColormapPrivateIndex may be called after the
+        * default colormap has been created on each screen!
+        *
+        * We must resize the devPrivates array for the default
+        * colormap on each screen, making room for this new private.
+        * We also call the initialization function 'initPrivFunc' on
+        * the new private allocated for each default colormap.
+        */
+
+       ScreenPtr pScreen = screenInfo.screens[i];
+
+       pColormap = (ColormapPtr) LookupIDByType (
+           pScreen->defColormap, RT_COLORMAP);
+
+       privs = (DevUnion *) xrealloc (pColormap->devPrivates,
+           colormapPrivateCount * sizeof(DevUnion));
+
+       pColormap->devPrivates = privs;
+
+       if (!privs || !(*initPrivFunc)(pColormap))
+       {
+           colormapPrivateCount--;
+           return -1;
+       }
+    }
+
+    return index;
+}