21 #include "../../SDL_internal.h"
23 #if SDL_VIDEO_DRIVER_X11
29 #ifndef NO_SHARED_MEMORY
33 static int (*X_handler)(Display *, XErrorEvent *) =
NULL;
34 static int shm_errhandler(Display *
d, XErrorEvent *
e)
36 if ( e->error_code == BadAccess ) {
40 return(X_handler(d,e));
48 return SDL_X11_HAVE_SHM;
57 void **
pixels,
int *pitch)
68 gcv.graphics_exposures = False;
69 data->
gc = X11_XCreateGC(display, data->
xwindow, GCGraphicsExposures, &gcv);
76 return SDL_SetError(
"Couldn't get window visual information");
88 #ifndef NO_SHARED_MEMORY
90 XShmSegmentInfo *shminfo = &data->
shminfo;
92 shminfo->shmid = shmget(IPC_PRIVATE, window->
h*(*pitch), IPC_CREAT | 0777);
93 if ( shminfo->shmid >= 0 ) {
94 shminfo->shmaddr = (
char *)shmat(shminfo->shmid, 0, 0);
95 shminfo->readOnly = False;
96 if ( shminfo->shmaddr != (
char *)-1 ) {
98 X_handler = X11_XSetErrorHandler(shm_errhandler);
99 X11_XShmAttach(display, shminfo);
100 X11_XSync(display, False);
101 X11_XSetErrorHandler(X_handler);
103 shmdt(shminfo->shmaddr);
107 shmctl(shminfo->shmid, IPC_RMID,
NULL);
112 data->
ximage = X11_XShmCreateImage(display, data->
visual,
113 vinfo.depth, ZPixmap,
114 shminfo->shmaddr, shminfo,
115 window->
w, window->
h);
117 X11_XShmDetach(display, shminfo);
118 X11_XSync(display, False);
119 shmdt(shminfo->shmaddr);
123 *pixels = shminfo->shmaddr;
131 if (*pixels ==
NULL) {
136 vinfo.depth, ZPixmap, 0, (
char *)(*pixels),
137 window->
w, window->
h, 32, 0);
153 #ifndef NO_SHARED_MEMORY
155 for (
i = 0;
i < numrects; ++
i) {
161 if (
w <= 0 ||
h <= 0 || (x +
w) <= 0 || (
y +
h) <= 0) {
175 if (x +
w > window->
w)
177 if (
y +
h > window->
h)
181 x,
y, x,
y,
w,
h, False);
187 for (
i = 0;
i < numrects; ++
i) {
193 if (
w <= 0 ||
h <= 0 || (x +
w) <= 0 || (
y +
h) <= 0) {
207 if (x +
w > window->
w)
209 if (
y +
h > window->
h)
217 X11_XSync(display, False);
236 XDestroyImage(data->
ximage);
238 #ifndef NO_SHARED_MEMORY
240 X11_XShmDetach(display, &data->
shminfo);
241 X11_XSync(display, False);
250 X11_XFreeGC(display, data->
gc);