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));
46 return X11_XShmQueryExtension(
dpy) ? SDL_X11_HAVE_SHM :
SDL_FALSE;
53 void **
pixels,
int *pitch)
64 gcv.graphics_exposures = False;
65 data->gc = X11_XCreateGC(display,
data->xwindow, GCGraphicsExposures, &gcv);
72 return SDL_SetError(
"Couldn't get window visual information");
84 #ifndef NO_SHARED_MEMORY
85 if (have_mitshm(display)) {
86 XShmSegmentInfo *shminfo = &
data->shminfo;
88 shminfo->shmid = shmget(IPC_PRIVATE,
window->h*(*pitch), IPC_CREAT | 0777);
89 if ( shminfo->shmid >= 0 ) {
90 shminfo->shmaddr = (
char *)shmat(shminfo->shmid, 0, 0);
91 shminfo->readOnly = False;
92 if ( shminfo->shmaddr != (
char *)-1 ) {
94 X_handler = X11_XSetErrorHandler(shm_errhandler);
95 X11_XShmAttach(display, shminfo);
96 X11_XSync(display, False);
97 X11_XSetErrorHandler(X_handler);
99 shmdt(shminfo->shmaddr);
103 shmctl(shminfo->shmid, IPC_RMID,
NULL);
108 data->ximage = X11_XShmCreateImage(display,
data->visual,
109 vinfo.depth, ZPixmap,
110 shminfo->shmaddr, shminfo,
113 X11_XShmDetach(display, shminfo);
114 X11_XSync(display, False);
115 shmdt(shminfo->shmaddr);
119 *
pixels = shminfo->shmaddr;
131 data->ximage = X11_XCreateImage(display,
data->visual,
132 vinfo.depth, ZPixmap, 0, (
char *)(*
pixels),
149 #ifndef NO_SHARED_MEMORY
151 for (
i = 0;
i < numrects; ++
i) {
157 if (
w <= 0 ||
h <= 0 || (
x +
w) <= 0 || (
y +
h) <= 0) {
176 X11_XShmPutImage(display,
data->xwindow,
data->gc,
data->ximage,
183 for (
i = 0;
i < numrects; ++
i) {
189 if (
w <= 0 ||
h <= 0 || (
x +
w) <= 0 || (
y +
h) <= 0) {
208 X11_XPutImage(display,
data->xwindow,
data->gc,
data->ximage,
213 X11_XSync(display, False);
229 display =
data->videodata->display;
232 XDestroyImage(
data->ximage);
234 #ifndef NO_SHARED_MEMORY
235 if (
data->use_mitshm) {
236 X11_XShmDetach(display, &
data->shminfo);
237 X11_XSync(display, False);
238 shmdt(
data->shminfo.shmaddr);
246 X11_XFreeGC(display,
data->gc);