@@ -50,8 +50,8 @@ in this Software without prior written authorization from The Open Group.
5050#include "gcstruct.h"
5151#include "extnsionst.h"
5252#include "servermd.h"
53+ #include "shmint.h"
5354#define _XSHM_SERVER_
54- #include <X11/extensions/shmstr.h>
5555#include <nx-X11/Xfuncproto.h>
5656
5757#include "protocol-versions.h"
@@ -61,14 +61,11 @@ in this Software without prior written authorization from The Open Group.
6161#include "panoramiXsrv.h"
6262#endif
6363
64- typedef struct _ShmDesc {
65- struct _ShmDesc * next ;
66- int shmid ;
67- int refcnt ;
68- char * addr ;
69- Bool writable ;
70- unsigned long size ;
71- } ShmDescRec , * ShmDescPtr ;
64+ typedef struct _ShmScrPrivateRec {
65+ CloseScreenProcPtr CloseScreen ;
66+ ShmFuncsPtr shmFuncs ;
67+ DestroyPixmapProcPtr destroyPixmap ;
68+ } ShmScrPrivateRec ;
7269
7370static void miShmPutImage (XSHM_PUT_IMAGE_ARGS );
7471static void fbShmPutImage (XSHM_PUT_IMAGE_ARGS );
@@ -108,15 +105,16 @@ int BadShmSegCode;
108105RESTYPE ShmSegType ;
109106static ShmDescPtr Shmsegs ;
110107static Bool sharedPixmaps ;
111- static int pixmapFormat ;
112- static int shmPixFormat [MAXSCREENS ];
113- static ShmFuncsPtr shmFuncs [MAXSCREENS ];
114- static DestroyPixmapProcPtr destroyPixmap [MAXSCREENS ];
115- #ifdef PIXPRIV
116- static int shmPixmapPrivate ;
117- #endif
118- static ShmFuncs miFuncs = {NULL , miShmPutImage };
119- static ShmFuncs fbFuncs = {fbShmCreatePixmap , fbShmPutImage };
108+ static DevPrivateKeyRec shmScrPrivateKeyRec ;
109+
110+ #define shmScrPrivateKey (&shmScrPrivateKeyRec)
111+ static DevPrivateKeyRec shmPixmapPrivateKeyRec ;
112+
113+ #define shmPixmapPrivateKey (&shmPixmapPrivateKeyRec)
114+ static ShmFuncs miFuncs = { NULL , miShmPutImage };
115+ static ShmFuncs fbFuncs = { fbShmCreatePixmap , fbShmPutImage };
116+
117+ #define ShmGetScreenPriv (s ) ((ShmScrPrivateRec *)dixLookupPrivate(&(s)->devPrivates, shmScrPrivateKey))
120118
121119#define VERIFY_SHMSEG (shmseg ,shmdesc ,client ) \
122120{ \
@@ -204,42 +202,28 @@ ShmExtensionInit(void)
204202 }
205203#endif
206204
205+ if (!ShmRegisterPrivates ())
206+ return ;
207+
207208 sharedPixmaps = xFalse ;
208- pixmapFormat = 0 ;
209209 {
210- sharedPixmaps = xTrue ;
211- pixmapFormat = shmPixFormat [0 ];
212- for (i = 0 ; i < screenInfo .numScreens ; i ++ )
213- {
214- if (!shmFuncs [i ])
215- shmFuncs [i ] = & miFuncs ;
216- if (!shmFuncs [i ]-> CreatePixmap )
217- sharedPixmaps = xFalse ;
218- if (shmPixFormat [i ] && (shmPixFormat [i ] != pixmapFormat ))
219- {
220- sharedPixmaps = xFalse ;
221- pixmapFormat = 0 ;
210+ sharedPixmaps = xTrue ;
211+ for (i = 0 ; i < screenInfo .numScreens ; i ++ ) {
212+ ShmScrPrivateRec * screen_priv =
213+ ShmInitScreenPriv (screenInfo .screens [i ]);
214+ if (!screen_priv -> shmFuncs )
215+ screen_priv -> shmFuncs = & miFuncs ;
216+ if (!screen_priv -> shmFuncs -> CreatePixmap )
217+ sharedPixmaps = xFalse ;
222218 }
223- }
224- if (!pixmapFormat )
225- pixmapFormat = ZPixmap ;
226- if (sharedPixmaps )
227- {
228- for (i = 0 ; i < screenInfo .numScreens ; i ++ )
229- {
230- destroyPixmap [i ] = screenInfo .screens [i ]-> DestroyPixmap ;
231- screenInfo .screens [i ]-> DestroyPixmap = ShmDestroyPixmap ;
232- }
233- #ifdef PIXPRIV
234- shmPixmapPrivate = AllocatePixmapPrivateIndex ();
235- for (i = 0 ; i < screenInfo .numScreens ; i ++ )
236- {
237- if (!AllocatePixmapPrivate (screenInfo .screens [i ],
238- shmPixmapPrivate , 0 ))
239- return ;
240- }
241- #endif
242- }
219+ if (sharedPixmaps )
220+ for (i = 0 ; i < screenInfo .numScreens ; i ++ ) {
221+ ShmScrPrivateRec * screen_priv =
222+ ShmGetScreenPriv (screenInfo .screens [i ]);
223+ screen_priv -> destroyPixmap =
224+ screenInfo .screens [i ]-> DestroyPixmap ;
225+ screenInfo .screens [i ]-> DestroyPixmap = ShmDestroyPixmap ;
226+ }
243227 }
244228 ShmSegType = CreateNewResourceType (ShmDetachSegment );
245229 if (ShmSegType &&
@@ -255,76 +239,87 @@ ShmExtensionInit(void)
255239}
256240#endif /* NXAGENT_SERVER */
257241
258- /*ARGSUSED*/
259- static void
260- ShmResetProc (extEntry )
261- ExtensionEntry * extEntry ;
242+ static Bool
243+ ShmCloseScreen (ScreenPtr pScreen )
262244{
263- int i ;
245+ ShmScrPrivateRec * screen_priv = ShmGetScreenPriv ( pScreen ) ;
264246
265- for (i = 0 ; i < MAXSCREENS ; i ++ )
266- {
267- shmFuncs [i ] = (ShmFuncsPtr )NULL ;
268- shmPixFormat [i ] = 0 ;
247+ pScreen -> CloseScreen = screen_priv -> CloseScreen ;
248+ dixSetPrivate (& pScreen -> devPrivates , shmScrPrivateKey , NULL );
249+ free (screen_priv );
250+ return (* pScreen -> CloseScreen ) (pScreen );
251+ }
252+
253+ static ShmScrPrivateRec *
254+ ShmInitScreenPriv (ScreenPtr pScreen )
255+ {
256+ ShmScrPrivateRec * screen_priv = ShmGetScreenPriv (pScreen );
257+
258+ if (!screen_priv ) {
259+ screen_priv = calloc (1 , sizeof (ShmScrPrivateRec ));
260+ screen_priv -> CloseScreen = pScreen -> CloseScreen ;
261+ dixSetPrivate (& pScreen -> devPrivates , shmScrPrivateKey , screen_priv );
262+ pScreen -> CloseScreen = ShmCloseScreen ;
269263 }
264+ return screen_priv ;
270265}
271266
272- void
273- ShmRegisterFuncs (
274- ScreenPtr pScreen ,
275- ShmFuncsPtr funcs )
267+ static Bool
268+ ShmRegisterPrivates (void )
276269{
277- shmFuncs [pScreen -> myNum ] = funcs ;
270+ if (!dixRegisterPrivateKey (& shmScrPrivateKeyRec , PRIVATE_SCREEN , 0 ))
271+ return FALSE;
272+ if (!dixRegisterPrivateKey (& shmPixmapPrivateKeyRec , PRIVATE_PIXMAP , 0 ))
273+ return FALSE;
274+ return TRUE;
275+ }
276+
277+ /*ARGSUSED*/ static void
278+ ShmResetProc (ExtensionEntry * extEntry )
279+ {
280+ int i ;
281+
282+ for (i = 0 ; i < screenInfo .numScreens ; i ++ )
283+ ShmRegisterFuncs (screenInfo .screens [i ], NULL );
278284}
279285
280286void
281- ShmSetPixmapFormat (
287+ ShmRegisterFuncs (
282288 ScreenPtr pScreen ,
283- int format )
289+ ShmFuncsPtr funcs )
284290{
285- shmPixFormat [pScreen -> myNum ] = format ;
291+ if (!ShmRegisterPrivates ())
292+ return ;
293+ ShmInitScreenPriv (pScreen )-> shmFuncs = funcs ;
286294}
287295
288296static Bool
289297ShmDestroyPixmap (PixmapPtr pPixmap )
290298{
291299 ScreenPtr pScreen = pPixmap -> drawable .pScreen ;
300+ ShmScrPrivateRec * screen_priv = ShmGetScreenPriv (pScreen );
301+ void * shmdesc = NULL ;
292302 Bool ret ;
303+
293304 if (pPixmap -> refcnt == 1 )
294- {
295- ShmDescPtr shmdesc ;
296- #ifdef PIXPRIV
297- shmdesc = (ShmDescPtr ) pPixmap -> devPrivates [shmPixmapPrivate ].ptr ;
298- #else
299- char * base = (char * ) pPixmap -> devPrivate .ptr ;
300-
301- if (base != (void * ) (pPixmap + 1 ))
302- {
303- for (shmdesc = Shmsegs ; shmdesc ; shmdesc = shmdesc -> next )
304- {
305- if (shmdesc -> addr <= base && base <= shmdesc -> addr + shmdesc -> size )
306- break ;
307- }
308- }
309- else
310- shmdesc = 0 ;
311- #endif
312- if (shmdesc )
313- ShmDetachSegment ((void * ) shmdesc , pPixmap -> drawable .id );
314- }
315-
316- pScreen -> DestroyPixmap = destroyPixmap [pScreen -> myNum ];
305+ shmdesc = dixLookupPrivate (& pPixmap -> devPrivates , shmPixmapPrivateKey );
306+
307+ pScreen -> DestroyPixmap = screen_priv -> destroyPixmap ;
317308 ret = (* pScreen -> DestroyPixmap ) (pPixmap );
318- destroyPixmap [ pScreen -> myNum ] = pScreen -> DestroyPixmap ;
309+ screen_priv -> destroyPixmap = pScreen -> DestroyPixmap ;
319310 pScreen -> DestroyPixmap = ShmDestroyPixmap ;
311+
312+ if (shmdesc )
313+ ShmDetachSegment ((void * ) shmdesc , pPixmap -> drawable .id );
314+
320315 return ret ;
321316}
322317
323318void
324319ShmRegisterFbFuncs (pScreen )
325320 ScreenPtr pScreen ;
326321{
327- shmFuncs [ pScreen -> myNum ] = & fbFuncs ;
322+ ShmRegisterFuncs ( pScreen , & fbFuncs ) ;
328323}
329324
330325static int
@@ -339,7 +334,6 @@ ProcShmQueryVersion(client)
339334 rep .length = 0 ;
340335 rep .sequenceNumber = client -> sequence ;
341336 rep .sharedPixmaps = sharedPixmaps ;
342- rep .pixmapFormat = pixmapFormat ;
343337 rep .majorVersion = SERVER_SHM_MAJOR_VERSION ;
344338 rep .minorVersion = SERVER_SHM_MINOR_VERSION ;
345339 rep .uid = geteuid ();
@@ -777,16 +771,17 @@ ProcPanoramiXShmCreatePixmap(
777771 result = (client -> noClientException );
778772
779773 FOR_NSCREENS (j ) {
774+ ShmScrPrivateRec * screen_priv ;
775+
780776 pScreen = screenInfo .screens [j ];
781777
782- pMap = (* shmFuncs [j ]-> CreatePixmap )(pScreen ,
778+ screen_priv = ShmGetScreenPriv (pScreen );
779+ pMap = (* screen_priv -> shmFuncs -> CreatePixmap )(pScreen ,
783780 stuff -> width , stuff -> height , stuff -> depth ,
784781 shmdesc -> addr + stuff -> offset );
785782
786783 if (pMap ) {
787- #ifdef PIXPRIV
788- pMap -> devPrivates [shmPixmapPrivate ].ptr = (void * ) shmdesc ;
789- #endif
784+ dixSetPrivate (& pMap -> devPrivates , shmPixmapPrivateKey , shmdesc );
790785 shmdesc -> refcnt ++ ;
791786 pMap -> drawable .serialNumber = NEXT_SERIAL_NUMBER ;
792787 pMap -> drawable .id = newPix -> info [j ].id ;
@@ -824,8 +819,9 @@ ProcShmPutImage(client)
824819 register DrawablePtr pDraw ;
825820 long length ;
826821 ShmDescPtr shmdesc ;
827- REQUEST ( xShmPutImageReq ) ;
822+ ShmScrPrivateRec * screen_priv ;
828823
824+ REQUEST (xShmPutImageReq );
829825 REQUEST_SIZE_MATCH (xShmPutImageReq );
830826 VALIDATE_DRAWABLE_AND_GC (stuff -> drawable , pDraw , pGC , client );
831827 VERIFY_SHMPTR (stuff -> shmseg , stuff -> offset , FALSE, shmdesc , client );
@@ -902,7 +898,8 @@ ProcShmPutImage(client)
902898 shmdesc -> addr + stuff -> offset +
903899 (stuff -> srcY * length ));
904900 else
905- (* shmFuncs [pDraw -> pScreen -> myNum ]-> PutImage )(
901+ screen_priv = ShmGetScreenPriv (pDraw -> pScreen );
902+ (* screen_priv -> shmFuncs -> PutImage )(
906903 pDraw , pGC , stuff -> depth , stuff -> format ,
907904 stuff -> totalWidth , stuff -> totalHeight ,
908905 stuff -> srcX , stuff -> srcY ,
@@ -1074,6 +1071,8 @@ ProcShmCreatePixmap(client)
10741071 DepthPtr pDepth ;
10751072 register int i ;
10761073 ShmDescPtr shmdesc ;
1074+ ShmScrPrivateRec * screen_priv ;
1075+
10771076 REQUEST (xShmCreatePixmapReq );
10781077 unsigned int width , height , depth ;
10791078 unsigned long size ;
@@ -1118,15 +1117,14 @@ ProcShmCreatePixmap(client)
11181117 }
11191118
11201119 VERIFY_SHMSIZE (shmdesc , stuff -> offset , size , client );
1121- pMap = (* shmFuncs [pDraw -> pScreen -> myNum ]-> CreatePixmap )(
1120+ screen_priv = ShmGetScreenPriv (pDraw -> pScreen );
1121+ pMap = (* screen_priv -> shmFuncs -> CreatePixmap )(
11221122 pDraw -> pScreen , stuff -> width ,
11231123 stuff -> height , stuff -> depth ,
11241124 shmdesc -> addr + stuff -> offset );
11251125 if (pMap )
11261126 {
1127- #ifdef PIXPRIV
1128- pMap -> devPrivates [shmPixmapPrivate ].ptr = (void * ) shmdesc ;
1129- #endif
1127+ dixSetPrivate (& pMap -> devPrivates , shmPixmapPrivateKey , shmdesc );
11301128 shmdesc -> refcnt ++ ;
11311129 pMap -> drawable .serialNumber = NEXT_SERIAL_NUMBER ;
11321130 pMap -> drawable .id = stuff -> pid ;
0 commit comments