Mercurial > sdl-ios-xcode
comparison src/video/Xext/Xxf86dga/XF86DGA2.c @ 1168:045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
This allows you to run an SDL program on a system without Xlib, since it'll
just report the x11 target unavailable at runtime.
author | Ryan C. Gordon <icculus@icculus.org> |
---|---|
date | Sat, 05 Nov 2005 19:53:37 +0000 |
parents | f1b029d3b301 |
children | dd2a8deeb26d |
comparison
equal
deleted
inserted
replaced
1167:435c2e481299 | 1168:045f186426e1 |
---|---|
25 | 25 |
26 #if defined(ENABLE_FBCON) /* Needed for framebuffer console support */ | 26 #if defined(ENABLE_FBCON) /* Needed for framebuffer console support */ |
27 #include <sys/ioctl.h> | 27 #include <sys/ioctl.h> |
28 #include <linux/fb.h> | 28 #include <linux/fb.h> |
29 #endif | 29 #endif |
30 | |
31 #include "../../x11/SDL_x11dyn.h" | |
32 | |
33 /* Workaround code in headers... */ | |
34 #define _XFlush p_XFlush | |
35 #define _XFlushGCCache p_XFlushGCCache | |
36 #define _XReply p_XReply | |
37 #define _XSend p_XSend | |
30 | 38 |
31 /* If you change this, change the Bases[] array below as well */ | 39 /* If you change this, change the Bases[] array below as well */ |
32 #define MAX_HEADS 16 | 40 #define MAX_HEADS 16 |
33 | 41 |
34 char *SDL_NAME(xdga_extension_name) = XF86DGANAME; | 42 char *SDL_NAME(xdga_extension_name) = XF86DGANAME; |
102 | 110 |
103 switch((wire->u.u.type & 0x7f) - info->codes->first_event) { | 111 switch((wire->u.u.type & 0x7f) - info->codes->first_event) { |
104 case MotionNotify: | 112 case MotionNotify: |
105 mevent = (SDL_NAME(XDGAMotionEvent)*)event; | 113 mevent = (SDL_NAME(XDGAMotionEvent)*)event; |
106 mevent->type = wire->u.u.type & 0x7F; | 114 mevent->type = wire->u.u.type & 0x7F; |
107 mevent->serial = _XSetLastRequestRead(dpy, (xGenericReply *)wire); | 115 mevent->serial = p_XSetLastRequestRead(dpy, (xGenericReply *)wire); |
108 mevent->display = dpy; | 116 mevent->display = dpy; |
109 mevent->screen = wire->u.event.screen; | 117 mevent->screen = wire->u.event.screen; |
110 mevent->time = wire->u.event.time; | 118 mevent->time = wire->u.event.time; |
111 mevent->state = wire->u.event.state; | 119 mevent->state = wire->u.event.state; |
112 mevent->dx = wire->u.event.dx; | 120 mevent->dx = wire->u.event.dx; |
114 return True; | 122 return True; |
115 case ButtonPress: | 123 case ButtonPress: |
116 case ButtonRelease: | 124 case ButtonRelease: |
117 bevent = (SDL_NAME(XDGAButtonEvent)*)event; | 125 bevent = (SDL_NAME(XDGAButtonEvent)*)event; |
118 bevent->type = wire->u.u.type & 0x7F; | 126 bevent->type = wire->u.u.type & 0x7F; |
119 bevent->serial = _XSetLastRequestRead(dpy, (xGenericReply *)wire); | 127 bevent->serial = p_XSetLastRequestRead(dpy, (xGenericReply *)wire); |
120 bevent->display = dpy; | 128 bevent->display = dpy; |
121 bevent->screen = wire->u.event.screen; | 129 bevent->screen = wire->u.event.screen; |
122 bevent->time = wire->u.event.time; | 130 bevent->time = wire->u.event.time; |
123 bevent->state = wire->u.event.state; | 131 bevent->state = wire->u.event.state; |
124 bevent->button = wire->u.u.detail; | 132 bevent->button = wire->u.u.detail; |
125 return True; | 133 return True; |
126 case KeyPress: | 134 case KeyPress: |
127 case KeyRelease: | 135 case KeyRelease: |
128 kevent = (SDL_NAME(XDGAKeyEvent)*)event; | 136 kevent = (SDL_NAME(XDGAKeyEvent)*)event; |
129 kevent->type = wire->u.u.type & 0x7F; | 137 kevent->type = wire->u.u.type & 0x7F; |
130 kevent->serial = _XSetLastRequestRead(dpy, (xGenericReply *)wire); | 138 kevent->serial = p_XSetLastRequestRead(dpy, (xGenericReply *)wire); |
131 kevent->display = dpy; | 139 kevent->display = dpy; |
132 kevent->screen = wire->u.event.screen; | 140 kevent->screen = wire->u.event.screen; |
133 kevent->time = wire->u.event.time; | 141 kevent->time = wire->u.event.time; |
134 kevent->state = wire->u.event.state; | 142 kevent->state = wire->u.event.state; |
135 kevent->keycode = wire->u.u.detail; | 143 kevent->keycode = wire->u.u.detail; |
170 | 178 |
171 LockDisplay(dpy); | 179 LockDisplay(dpy); |
172 GetReq(XDGAQueryVersion, req); | 180 GetReq(XDGAQueryVersion, req); |
173 req->reqType = info->codes->major_opcode; | 181 req->reqType = info->codes->major_opcode; |
174 req->dgaReqType = X_XDGAQueryVersion; | 182 req->dgaReqType = X_XDGAQueryVersion; |
175 if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) { | 183 if (!p_XReply(dpy, (xReply *)&rep, 0, xFalse)) { |
176 UnlockDisplay(dpy); | 184 UnlockDisplay(dpy); |
177 SyncHandle(); | 185 SyncHandle(); |
178 return False; | 186 return False; |
179 } | 187 } |
180 *majorVersion = rep.majorVersion; | 188 *majorVersion = rep.majorVersion; |
187 | 195 |
188 for (i = 0, j = info->codes->first_event; | 196 for (i = 0, j = info->codes->first_event; |
189 i < XF86DGANumberEvents; | 197 i < XF86DGANumberEvents; |
190 i++, j++) | 198 i++, j++) |
191 { | 199 { |
192 XESetWireToEvent (dpy, j, xdga_wire_to_event); | 200 pXESetWireToEvent(dpy, j, xdga_wire_to_event); |
193 XESetEventToWire (dpy, j, xdga_event_to_wire); | 201 pXESetEventToWire(dpy, j, xdga_event_to_wire); |
194 } | 202 } |
195 SDL_NAME(XDGASetClientVersion)(dpy); | 203 SDL_NAME(XDGASetClientVersion)(dpy); |
196 } | 204 } |
197 return True; | 205 return True; |
198 } | 206 } |
231 LockDisplay(dpy); | 239 LockDisplay(dpy); |
232 GetReq(XDGAOpenFramebuffer, req); | 240 GetReq(XDGAOpenFramebuffer, req); |
233 req->reqType = info->codes->major_opcode; | 241 req->reqType = info->codes->major_opcode; |
234 req->dgaReqType = X_XDGAOpenFramebuffer; | 242 req->dgaReqType = X_XDGAOpenFramebuffer; |
235 req->screen = screen; | 243 req->screen = screen; |
236 if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) { | 244 if (!p_XReply(dpy, (xReply *)&rep, 0, xFalse)) { |
237 UnlockDisplay(dpy); | 245 UnlockDisplay(dpy); |
238 SyncHandle(); | 246 SyncHandle(); |
239 return False; | 247 return False; |
240 } | 248 } |
241 | 249 |
242 if(rep.length) { | 250 if(rep.length) { |
243 deviceName = Xmalloc(rep.length << 2); | 251 deviceName = Xmalloc(rep.length << 2); |
244 _XRead(dpy, deviceName, rep.length << 2); | 252 p_XRead(dpy, deviceName, rep.length << 2); |
245 } | 253 } |
246 | 254 |
247 ret = SDL_NAME(XDGAMapFramebuffer)(screen, deviceName, | 255 ret = SDL_NAME(XDGAMapFramebuffer)(screen, deviceName, |
248 (unsigned char*)(long)rep.mem1, | 256 (unsigned char*)(long)rep.mem1, |
249 rep.size, rep.offset, rep.extra); | 257 rep.size, rep.offset, rep.extra); |
296 GetReq(XDGAQueryModes, req); | 304 GetReq(XDGAQueryModes, req); |
297 req->reqType = dinfo->codes->major_opcode; | 305 req->reqType = dinfo->codes->major_opcode; |
298 req->dgaReqType = X_XDGAQueryModes; | 306 req->dgaReqType = X_XDGAQueryModes; |
299 req->screen = screen; | 307 req->screen = screen; |
300 | 308 |
301 if (_XReply(dpy, (xReply *)&rep, 0, xFalse)) { | 309 if (p_XReply(dpy, (xReply *)&rep, 0, xFalse)) { |
302 if(rep.length) { | 310 if(rep.length) { |
303 xXDGAModeInfo info; | 311 xXDGAModeInfo info; |
304 int i, size; | 312 int i, size; |
305 char *offset; | 313 char *offset; |
306 | 314 |
310 offset = (char*)(&modes[rep.number]); /* start of text */ | 318 offset = (char*)(&modes[rep.number]); /* start of text */ |
311 | 319 |
312 | 320 |
313 if(modes) { | 321 if(modes) { |
314 for(i = 0; i < rep.number; i++) { | 322 for(i = 0; i < rep.number; i++) { |
315 _XRead(dpy, (char*)(&info), sz_xXDGAModeInfo); | 323 p_XRead(dpy, (char*)(&info), sz_xXDGAModeInfo); |
316 | 324 |
317 modes[i].num = info.num; | 325 modes[i].num = info.num; |
318 modes[i].verticalRefresh = | 326 modes[i].verticalRefresh = |
319 (float)info.vsync_num / (float)info.vsync_den; | 327 (float)info.vsync_num / (float)info.vsync_den; |
320 modes[i].flags = info.flags; | 328 modes[i].flags = info.flags; |
338 modes[i].maxViewportY = info.viewport_ymax; | 346 modes[i].maxViewportY = info.viewport_ymax; |
339 modes[i].viewportFlags = info.viewport_flags; | 347 modes[i].viewportFlags = info.viewport_flags; |
340 modes[i].reserved1 = info.reserved1; | 348 modes[i].reserved1 = info.reserved1; |
341 modes[i].reserved2 = info.reserved2; | 349 modes[i].reserved2 = info.reserved2; |
342 | 350 |
343 _XRead(dpy, offset, info.name_size); | 351 p_XRead(dpy, offset, info.name_size); |
344 modes[i].name = offset; | 352 modes[i].name = offset; |
345 offset += info.name_size; | 353 offset += info.name_size; |
346 } | 354 } |
347 *num = rep.number; | 355 *num = rep.number; |
348 } else | 356 } else |
349 _XEatData(dpy, rep.length << 2); | 357 p_XEatData(dpy, rep.length << 2); |
350 } | 358 } |
351 } | 359 } |
352 | 360 |
353 UnlockDisplay(dpy); | 361 UnlockDisplay(dpy); |
354 SyncHandle(); | 362 SyncHandle(); |
377 req->dgaReqType = X_XDGASetMode; | 385 req->dgaReqType = X_XDGASetMode; |
378 req->screen = screen; | 386 req->screen = screen; |
379 req->mode = mode; | 387 req->mode = mode; |
380 req->pid = pid = XAllocID(dpy); | 388 req->pid = pid = XAllocID(dpy); |
381 | 389 |
382 if (_XReply(dpy, (xReply *)&rep, 0, xFalse)) { | 390 if (p_XReply(dpy, (xReply *)&rep, 0, xFalse)) { |
383 if(rep.length) { | 391 if(rep.length) { |
384 xXDGAModeInfo info; | 392 xXDGAModeInfo info; |
385 int size; | 393 int size; |
386 | 394 |
387 size = rep.length << 2; | 395 size = rep.length << 2; |
388 size -= sz_xXDGAModeInfo; /* get text size */ | 396 size -= sz_xXDGAModeInfo; /* get text size */ |
389 | 397 |
390 dev = (SDL_NAME(XDGADevice)*)Xmalloc(sizeof(SDL_NAME(XDGADevice)) + size); | 398 dev = (SDL_NAME(XDGADevice)*)Xmalloc(sizeof(SDL_NAME(XDGADevice)) + size); |
391 | 399 |
392 if(dev) { | 400 if(dev) { |
393 _XRead(dpy, (char*)(&info), sz_xXDGAModeInfo); | 401 p_XRead(dpy, (char*)(&info), sz_xXDGAModeInfo); |
394 | 402 |
395 dev->mode.num = info.num; | 403 dev->mode.num = info.num; |
396 dev->mode.verticalRefresh = | 404 dev->mode.verticalRefresh = |
397 (float)info.vsync_num / (float)info.vsync_den; | 405 (float)info.vsync_num / (float)info.vsync_den; |
398 dev->mode.flags = info.flags; | 406 dev->mode.flags = info.flags; |
417 dev->mode.viewportFlags = info.viewport_flags; | 425 dev->mode.viewportFlags = info.viewport_flags; |
418 dev->mode.reserved1 = info.reserved1; | 426 dev->mode.reserved1 = info.reserved1; |
419 dev->mode.reserved2 = info.reserved2; | 427 dev->mode.reserved2 = info.reserved2; |
420 | 428 |
421 dev->mode.name = (char*)(&dev[1]); | 429 dev->mode.name = (char*)(&dev[1]); |
422 _XRead(dpy, dev->mode.name, info.name_size); | 430 p_XRead(dpy, dev->mode.name, info.name_size); |
423 | 431 |
424 dev->pixmap = (rep.flags & XDGAPixmap) ? pid : 0; | 432 dev->pixmap = (rep.flags & XDGAPixmap) ? pid : 0; |
425 dev->data = SDL_NAME(XDGAGetMappedMemory)(screen); | 433 dev->data = SDL_NAME(XDGAGetMappedMemory)(screen); |
426 | 434 |
427 if(dev->data) | 435 if(dev->data) |
608 LockDisplay(dpy); | 616 LockDisplay(dpy); |
609 GetReq(XDGAGetViewportStatus, req); | 617 GetReq(XDGAGetViewportStatus, req); |
610 req->reqType = info->codes->major_opcode; | 618 req->reqType = info->codes->major_opcode; |
611 req->dgaReqType = X_XDGAGetViewportStatus; | 619 req->dgaReqType = X_XDGAGetViewportStatus; |
612 req->screen = screen; | 620 req->screen = screen; |
613 if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) | 621 if (!p_XReply(dpy, (xReply *)&rep, 0, xFalse)) |
614 status = rep.status; | 622 status = rep.status; |
615 UnlockDisplay(dpy); | 623 UnlockDisplay(dpy); |
616 SyncHandle(); | 624 SyncHandle(); |
617 return status; | 625 return status; |
618 } | 626 } |
630 LockDisplay(dpy); | 638 LockDisplay(dpy); |
631 GetReq(XDGASync, req); | 639 GetReq(XDGASync, req); |
632 req->reqType = info->codes->major_opcode; | 640 req->reqType = info->codes->major_opcode; |
633 req->dgaReqType = X_XDGASync; | 641 req->dgaReqType = X_XDGASync; |
634 req->screen = screen; | 642 req->screen = screen; |
635 _XReply(dpy, (xReply *)&rep, 0, xFalse); | 643 p_XReply(dpy, (xReply *)&rep, 0, xFalse); |
636 UnlockDisplay(dpy); | 644 UnlockDisplay(dpy); |
637 SyncHandle(); | 645 SyncHandle(); |
638 } | 646 } |
639 | 647 |
640 | 648 |
657 req->dgaReqType = X_XDGAChangePixmapMode; | 665 req->dgaReqType = X_XDGAChangePixmapMode; |
658 req->screen = screen; | 666 req->screen = screen; |
659 req->x = *x; | 667 req->x = *x; |
660 req->y = *y; | 668 req->y = *y; |
661 req->flags = mode; | 669 req->flags = mode; |
662 _XReply(dpy, (xReply *)&rep, 0, xFalse); | 670 p_XReply(dpy, (xReply *)&rep, 0, xFalse); |
663 *x = rep.x; | 671 *x = rep.x; |
664 *y = rep.y; | 672 *y = rep.y; |
665 UnlockDisplay(dpy); | 673 UnlockDisplay(dpy); |
666 SyncHandle(); | 674 SyncHandle(); |
667 } | 675 } |