diff --git a/hw/dmx/dmxextension.c b/hw/dmx/dmxextension.c index cc13a9593..f3cdef4b0 100644 --- a/hw/dmx/dmxextension.c +++ b/hw/dmx/dmxextension.c @@ -1886,13 +1886,13 @@ dmxAttachScreen (int idx, } #ifdef MITSHM - dmxScreen->beShm = FALSE; - - XLIB_PROLOGUE (dmxScreen); - dmxScreen->beShm = XShmQueryExtension (dmxScreen->beDisplay); + dmxScreen->beShm = dmxShmInit (pScreen); if (dmxScreen->beShm) - dmxScreen->beShmEventBase = XShmGetEventBase (dmxScreen->beDisplay); - XLIB_EPILOGUE (dmxScreen); + { + dmxScreen->beShmEventBase = + XShmGetEventBase (dmxScreen->beDisplay); + dmxLogOutput (dmxScreen, "Using MIT-SHM extension\n"); + } #endif #ifdef RANDR diff --git a/hw/dmx/dmxscrinit.c b/hw/dmx/dmxscrinit.c index 7cdf9be94..605b7f9dc 100644 --- a/hw/dmx/dmxscrinit.c +++ b/hw/dmx/dmxscrinit.c @@ -1045,14 +1045,12 @@ Bool dmxScreenInit(int idx, ScreenPtr pScreen, int argc, char *argv[]) #ifdef MITSHM ShmRegisterDmxFuncs (pScreen); - if (dmxScreen->beDisplay) + dmxScreen->beShm = dmxShmInit (pScreen); + if (dmxScreen->beShm) { - XLIB_PROLOGUE (dmxScreen); - dmxScreen->beShm = XShmQueryExtension (dmxScreen->beDisplay); - if (dmxScreen->beShm) - dmxScreen->beShmEventBase = - XShmGetEventBase (dmxScreen->beDisplay); - XLIB_EPILOGUE (dmxScreen); + dmxScreen->beShmEventBase = + XShmGetEventBase (dmxScreen->beDisplay); + dmxLogOutput (dmxScreen, "Using MIT-SHM extension\n"); } #endif diff --git a/hw/dmx/dmxshm.c b/hw/dmx/dmxshm.c index 085d63e82..fe4166a76 100644 --- a/hw/dmx/dmxshm.c +++ b/hw/dmx/dmxshm.c @@ -604,6 +604,50 @@ dmxProcShmPutImage (ClientPtr client) return (client->noClientException); } +Bool +dmxShmInit (ScreenPtr pScreen) +{ + DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum]; + xcb_generic_error_t *error; + xcb_shm_seg_t shmseg; + uint32_t shmid; + char *shmaddr; + + if (!dmxScreen->beDisplay) + return FALSE; + + shmid = shmget (IPC_PRIVATE, 32, IPC_CREAT | 0600); + if (shmid == -1) + return FALSE; + + shmaddr = shmat (shmid, NULL, 0); + if (shmaddr == (char *) -1) + { + shmctl (shmid, IPC_RMID, NULL); + return FALSE; + } + + shmseg = xcb_generate_id (dmxScreen->connection); + error = xcb_request_check (dmxScreen->connection, + xcb_shm_attach_checked (dmxScreen->connection, + shmseg, + shmid, + FALSE)); + if (error) + { + free (error); + shmdt (shmaddr); + shmctl (shmid, IPC_RMID, NULL); + return FALSE; + } + + xcb_shm_detach (dmxScreen->connection, shmseg); + shmdt (shmaddr); + shmctl (shmid, IPC_RMID, NULL); + + return TRUE; +} + void dmxInitShm (void) { int i; diff --git a/hw/dmx/dmxshm.h b/hw/dmx/dmxshm.h index 167b324a5..611b1eddd 100644 --- a/hw/dmx/dmxshm.h +++ b/hw/dmx/dmxshm.h @@ -53,6 +53,8 @@ extern void dmxBEDetachShmSeg (DMXScreenInfo *dmxScreen, extern Bool dmxScreenEventCheckShm (ScreenPtr pScreen, xcb_generic_event_t *event); +extern Bool dmxShmInit (ScreenPtr pScreen); + extern void dmxInitShm (void); extern void dmxResetShm (void); #endif