📄 xf86dga2.c
字号:
LockDisplay(dpy); GetReq(XDGASelectInput, req); req->reqType = info->codes->major_opcode; req->dgaReqType = X_XDGASelectInput; req->screen = screen; req->mask = mask; UnlockDisplay(dpy); SyncHandle();}void SDL_NAME(XDGAFillRectangle)( Display *dpy, int screen, int x, int y, unsigned int width, unsigned int height, unsigned long color){ XExtDisplayInfo *info = SDL_NAME(xdga_find_display) (dpy); xXDGAFillRectangleReq *req; XextSimpleCheckExtension (dpy, info, SDL_NAME(xdga_extension_name)); LockDisplay(dpy); GetReq(XDGAFillRectangle, req); req->reqType = info->codes->major_opcode; req->dgaReqType = X_XDGAFillRectangle; req->screen = screen; req->x = x; req->y = y; req->width = width; req->height = height; req->color = color; UnlockDisplay(dpy); SyncHandle();}void SDL_NAME(XDGACopyArea)( Display *dpy, int screen, int srcx, int srcy, unsigned int width, unsigned int height, int dstx, int dsty){ XExtDisplayInfo *info = SDL_NAME(xdga_find_display) (dpy); xXDGACopyAreaReq *req; XextSimpleCheckExtension (dpy, info, SDL_NAME(xdga_extension_name)); LockDisplay(dpy); GetReq(XDGACopyArea, req); req->reqType = info->codes->major_opcode; req->dgaReqType = X_XDGACopyArea; req->screen = screen; req->srcx = srcx; req->srcy = srcy; req->width = width; req->height = height; req->dstx = dstx; req->dsty = dsty; UnlockDisplay(dpy); SyncHandle();}void SDL_NAME(XDGACopyTransparentArea)( Display *dpy, int screen, int srcx, int srcy, unsigned int width, unsigned int height, int dstx, int dsty, unsigned long key){ XExtDisplayInfo *info = SDL_NAME(xdga_find_display) (dpy); xXDGACopyTransparentAreaReq *req; XextSimpleCheckExtension (dpy, info, SDL_NAME(xdga_extension_name)); LockDisplay(dpy); GetReq(XDGACopyTransparentArea, req); req->reqType = info->codes->major_opcode; req->dgaReqType = X_XDGACopyTransparentArea; req->screen = screen; req->srcx = srcx; req->srcy = srcy; req->width = width; req->height = height; req->dstx = dstx; req->dsty = dsty; req->key = key; UnlockDisplay(dpy); SyncHandle();}int SDL_NAME(XDGAGetViewportStatus)( Display *dpy, int screen ){ XExtDisplayInfo *info = SDL_NAME(xdga_find_display) (dpy); xXDGAGetViewportStatusReply rep; xXDGAGetViewportStatusReq *req; int status = 0; XDGACheckExtension (dpy, info, 0); LockDisplay(dpy); GetReq(XDGAGetViewportStatus, req); req->reqType = info->codes->major_opcode; req->dgaReqType = X_XDGAGetViewportStatus; req->screen = screen; if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) status = rep.status; UnlockDisplay(dpy); SyncHandle(); return status;}void SDL_NAME(XDGASync)( Display *dpy, int screen ){ XExtDisplayInfo *info = SDL_NAME(xdga_find_display) (dpy); xXDGASyncReply rep; xXDGASyncReq *req; XextSimpleCheckExtension (dpy, info, SDL_NAME(xdga_extension_name)); LockDisplay(dpy); GetReq(XDGASync, req); req->reqType = info->codes->major_opcode; req->dgaReqType = X_XDGASync; req->screen = screen; _XReply(dpy, (xReply *)&rep, 0, xFalse); UnlockDisplay(dpy); SyncHandle();}void SDL_NAME(XDGAChangePixmapMode)( Display *dpy, int screen, int *x, int *y, int mode ){ XExtDisplayInfo *info = SDL_NAME(xdga_find_display) (dpy); xXDGAChangePixmapModeReq *req; xXDGAChangePixmapModeReply rep; XextSimpleCheckExtension (dpy, info, SDL_NAME(xdga_extension_name)); LockDisplay(dpy); GetReq(XDGAChangePixmapMode, req); req->reqType = info->codes->major_opcode; req->dgaReqType = X_XDGAChangePixmapMode; req->screen = screen; req->x = *x; req->y = *y; req->flags = mode; _XReply(dpy, (xReply *)&rep, 0, xFalse); *x = rep.x; *y = rep.y; UnlockDisplay(dpy); SyncHandle();}Colormap SDL_NAME(XDGACreateColormap)( Display *dpy, int screen, SDL_NAME(XDGADevice) *dev, int alloc){ XExtDisplayInfo *info = SDL_NAME(xdga_find_display) (dpy); xXDGACreateColormapReq *req; Colormap cid; XDGACheckExtension (dpy, info, -1); LockDisplay(dpy); GetReq(XDGACreateColormap, req); req->reqType = info->codes->major_opcode; req->dgaReqType = X_XDGACreateColormap; req->screen = screen; req->mode = dev->mode.num; req->alloc = alloc; cid = req->id = XAllocID(dpy); UnlockDisplay(dpy); SyncHandle(); return cid;}void SDL_NAME(XDGAKeyEventToXKeyEvent)( SDL_NAME(XDGAKeyEvent)* dk, XKeyEvent* xk){ xk->type = dk->type; xk->serial = dk->serial; xk->send_event = False; xk->display = dk->display; xk->window = RootWindow(dk->display, dk->screen); xk->root = xk->window; xk->subwindow = None; xk->time = dk->time; xk->x = xk->y = xk->x_root = xk->y_root = 0; xk->state = dk->state; xk->keycode = dk->keycode; xk->same_screen = True;}#include <X11/Xmd.h>#include <stdlib.h>#include <stdio.h>#include <fcntl.h>#if defined(ISC) # define HAS_SVR3_MMAP# include <sys/types.h># include <errno.h># include <sys/at_ansi.h># include <sys/kd.h># include <sys/sysmacros.h># include <sys/immu.h># include <sys/region.h># include <sys/mmap.h>#else# if !defined(Lynx)# if !defined(__EMX__)# include <sys/mman.h># endif# else# include <sys/types.h># include <errno.h># include <smem.h># endif#endif#include <sys/wait.h>#include <signal.h>#include <unistd.h>#if defined(SVR4) && !defined(sun) && !defined(SCO325)#define DEV_MEM "/dev/pmem"#elif defined(SVR4) && defined(sun)#define DEV_MEM "/dev/xsvc"#else#define DEV_MEM "/dev/mem"#endiftypedef struct _DGAMapRec{ unsigned char *physical; unsigned char *virtual; CARD32 size; int fd; int screen; struct _DGAMapRec *next;} DGAMapRec, *DGAMapPtr;static BoolDGAMapPhysical(int, char*, unsigned char*, CARD32, CARD32, CARD32, DGAMapPtr); static void DGAUnmapPhysical(DGAMapPtr);static DGAMapPtr _Maps = NULL;unsigned char*SDL_NAME(XDGAGetMappedMemory)(int screen){ DGAMapPtr pMap = _Maps; unsigned char *pntr = NULL; while(pMap != NULL) { if(pMap->screen == screen) { pntr = pMap->virtual; break; } pMap = pMap->next; } return pntr;}BoolSDL_NAME(XDGAMapFramebuffer)( int screen, char *name, /* optional device name */ unsigned char* base, /* physical memory */ CARD32 size, /* size */ CARD32 offset, /* optional offset */ CARD32 extra /* optional extra data */){ DGAMapPtr pMap = _Maps; Bool result; /* is it already mapped ? */ while(pMap != NULL) { if(pMap->screen == screen) return True; pMap = pMap->next; } if(extra & XDGANeedRoot) { /* we should probably check if we have root permissions and return False here */ } pMap = (DGAMapPtr)Xmalloc(sizeof(DGAMapRec)); result = DGAMapPhysical(screen, name, base, size, offset, extra, pMap); if(result) { pMap->next = _Maps; _Maps = pMap; } else Xfree(pMap); return result;}voidSDL_NAME(XDGAUnmapFramebuffer)(int screen){ DGAMapPtr pMap = _Maps; DGAMapPtr pPrev = NULL; /* is it already mapped */ while(pMap != NULL) { if(pMap->screen == screen) break; pPrev = pMap; pMap = pMap->next; } if(!pMap) return; DGAUnmapPhysical(pMap); if(!pPrev) _Maps = pMap->next; else pPrev->next = pMap->next; Xfree(pMap);}static BoolDGAMapPhysical( int screen, char *name, /* optional device name */ unsigned char* base, /* physical memory */ CARD32 size, /* size */ CARD32 offset, /* optional offset */ CARD32 extra, /* optional extra data */ DGAMapPtr pMap) {#if defined(ISC) && defined(HAS_SVR3_MMAP) struct kd_memloc mloc;#elif defined(__EMX__) APIRET rc; ULONG action; HFILE hfd;#endif base += offset; pMap->screen = screen; pMap->physical = base; pMap->size = size;#if defined(ISC) && defined(HAS_SVR3_MMAP) if ((pMap->fd = open("/dev/mmap", O_RDWR)) < 0) return False; mloc.vaddr = (char *)0; mloc.physaddr = (char *)base; mloc.length = size; mloc.ioflg=1; if ((pMap->virtual = (void *)ioctl(pMap->fd, MAP, &mloc)) == (void *)-1) return False;#elif defined (__EMX__) /* * Dragon warning here! /dev/pmap$ is never closed, except on progam exit. * Consecutive calling of this routine will make PMAP$ driver run out * of memory handles. Some umap/close mechanism should be provided */ rc = DosOpen("/dev/pmap$", &hfd, &action, 0, FILE_NORMAL, FILE_OPEN, OPEN_ACCESS_READWRITE | OPEN_SHARE_DENYNONE, (PEAOP2)NULL); if (rc != 0) return False; { struct map_ioctl { union { ULONG phys; void* user; } a; ULONG size; } pmap,dmap; ULONG plen,dlen;#define XFREE86_PMAP 0x76#define PMAP_MAP 0x44 pmap.a.phys = base; pmap.size = size; rc = DosDevIOCtl(hfd, XFREE86_PMAP, PMAP_MAP, (PULONG)&pmap, sizeof(pmap), &plen, (PULONG)&dmap, sizeof(dmap), &dlen); if (rc == 0) { pMap->virtual = dmap.a.user; } } if (rc != 0) return False;#elif defined (Lynx) pMap->virtual = smem_create("XF86DGA", (char*)base, size, SM_READ|SM_WRITE);#else#ifndef MAP_FILE#define MAP_FILE 0#endif if (!name) name = DEV_MEM; if ((pMap->fd = open(name, O_RDWR)) < 0)#if defined(linux) { /* /dev/fb0 fallback added by Sam Lantinga <hercules@lokigames.com> */ /* Try to fall back to /dev/fb on Linux - FIXME: verify the device */ struct fb_fix_screeninfo finfo; if ((pMap->fd = open("/dev/fb0", O_RDWR)) < 0) { return False; } /* The useable framebuffer console memory may not be the whole framebuffer that X has access to. :-( */ if ( ioctl(pMap->fd, FBIOGET_FSCREENINFO, &finfo) < 0 ) { close(pMap->fd); return False; } /* Warning: On PPC, the size and virtual need to be offset by: (((long)finfo.smem_start) - (((long)finfo.smem_start)&~(PAGE_SIZE-1))) */ base = 0; size = finfo.smem_len; }#else return False;#endif pMap->virtual = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_FILE | MAP_SHARED, pMap->fd, (off_t)base); if (pMap->virtual == (void *)-1) return False;#endif#if !defined(ISC) && !defined(HAS_SVR3_MMAP) && !defined(Lynx) \ && !defined(__EMX__) mprotect(pMap->virtual, size, PROT_READ | PROT_WRITE);#endif return True;}static voidDGAUnmapPhysical(DGAMapPtr pMap){#if !defined(ISC) && !defined(HAS_SVR3_MMAP) && !defined(Lynx) \ && !defined(__EMX__) mprotect(pMap->virtual,pMap->size, PROT_READ);#elif defined(Lynx) /* XXX this doesn't allow enable after disable */ smem_create(NULL, pMap->virtual, pMap->size, SM_DETACH); smem_remove("XF86DGA");#endif /* We need to unmap and close too !!!!!!!!!!*/}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -