diff options
-rw-r--r-- | include/GL/miniglx.h | 137 | ||||
-rw-r--r-- | src/glx/mini/miniglx.c | 132 |
2 files changed, 176 insertions, 93 deletions
diff --git a/include/GL/miniglx.h b/include/GL/miniglx.h index 4af7ec1141e..8c6180be60b 100644 --- a/include/GL/miniglx.h +++ b/include/GL/miniglx.h @@ -52,14 +52,20 @@ extern "C" { * * It can have the values #True or #False. */ +#ifndef MINIGLX_NO_XTYPES typedef int Bool; +#endif +typedef int MINI_Bool; /** * \brief Color map. * * Alias for private ::MiniGLXColormapRec structure. */ +typedef struct MiniGLXColormapRec *MINI_Colormap; +#ifndef MINIGLX_NO_XTYPES typedef struct MiniGLXColormapRec *Colormap; +#endif /** * \brief Window attributes. @@ -67,7 +73,7 @@ typedef struct MiniGLXColormapRec *Colormap; typedef struct MiniGLXSetWindowAttributesRec { int background_pixel; /**< \brief background pixel */ int border_pixel; /**< \brief border pixel value */ - Colormap colormap; /**< \brief color map to be associated with window */ + MINI_Colormap colormap; /**< \brief color map to be associated with window */ int event_mask; /**< \brief set of events that should be saved */ } XSetWindowAttributes; @@ -85,10 +91,13 @@ typedef struct MiniGLXVisualRec Visual; * * \sa \ref datatypes. */ -typedef unsigned int VisualID; +#ifndef MINIGLX_NO_XTYPES +typedef unsigned long VisualID; +#endif +typedef unsigned long MINI_VisualID; typedef struct MiniGLXXVisualInfoRec { Visual *visual; /**< \brief pointer to the GLX Visual */ - VisualID visualid; /**< \brief visual ID */ + MINI_VisualID visualid; /**< \brief visual ID */ int screen; /**< \brief screen number */ int depth; /**< \brief bit depth */ #if defined(__cplusplus) || defined(c_plusplus) @@ -115,7 +124,10 @@ typedef struct MiniGLXFBConfigRec { * * \sa \ref datatypes. */ +#ifndef MINIGLX_NO_XTYPES typedef struct MiniGLXDisplayRec Display; +#endif +typedef struct MiniGLXDisplayRec MINI_Display; /** * \brief Window handle. @@ -124,7 +136,10 @@ typedef struct MiniGLXDisplayRec Display; * * \sa \ref datatypes. */ +#ifndef MINIGLX_NO_XTYPES typedef struct MiniGLXWindowRec *Window; +#endif +typedef struct MiniGLXWindowRec *MINI_Window; /** * \brief Drawable. @@ -136,7 +151,10 @@ typedef struct MiniGLXWindowRec *Window; * * \sa \ref datatypes. */ +#ifndef MINIGLX_NO_XTYPES typedef struct MiniGLXWindowRec *Drawable; +#endif +typedef struct MiniGLXWindowRec *MINI_Drawable; /** * \brief GLX drawable. @@ -174,9 +192,9 @@ typedef struct MiniGLXContextRec *GLXContext; typedef struct { int type; unsigned long serial; /* # of last request processed by server */ - Bool send_event; /* true if this came from a SendEvent request */ - Display *display; /* Display the event was read from */ - Window window; + MINI_Bool send_event; /* true if this came from a SendEvent request */ + MINI_Display *display; /* Display the event was read from */ + MINI_Window window; int x, y; int width, height; int count; /* if non-zero, at least this many more */ @@ -185,53 +203,53 @@ typedef struct { typedef struct { int type; unsigned long serial; /* # of last request processed by server */ - Bool send_event; /* true if this came from a SendEvent request */ - Display *display; /* Display the event was read from */ - Window parent; /* parent of the window */ - Window window; /* window id of window created */ + MINI_Bool send_event; /* true if this came from a SendEvent request */ + MINI_Display *display; /* Display the event was read from */ + MINI_Window parent; /* parent of the window */ + MINI_Window window; /* window id of window created */ int x, y; /* window location */ int width, height; /* size of window */ int border_width; /* border width */ - Bool override_redirect; /* creation should be overridden */ + MINI_Bool override_redirect; /* creation should be overridden */ } XCreateWindowEvent; typedef struct { int type; unsigned long serial; /* # of last request processed by server */ - Bool send_event; /* true if this came from a SendEvent request */ - Display *display; /* Display the event was read from */ - Window event; - Window window; + MINI_Bool send_event; /* true if this came from a SendEvent request */ + MINI_Display *display; /* Display the event was read from */ + MINI_Window event; + MINI_Window window; } XDestroyWindowEvent; typedef struct { int type; unsigned long serial; /* # of last request processed by server */ - Bool send_event; /* true if this came from a SendEvent request */ - Display *display; /* Display the event was read from */ - Window event; - Window window; - Bool from_configure; + MINI_Bool send_event; /* true if this came from a SendEvent request */ + MINI_Display *display; /* Display the event was read from */ + MINI_Window event; + MINI_Window window; + MINI_Bool from_configure; } XUnmapEvent; typedef struct { int type; unsigned long serial; /* # of last request processed by server */ - Bool send_event; /* true if this came from a SendEvent request */ - Display *display; /* Display the event was read from */ - Window event; - Window window; - Bool override_redirect; /* boolean, is override set... */ + MINI_Bool send_event; /* true if this came from a SendEvent request */ + MINI_Display *display; /* Display the event was read from */ + MINI_Window event; + MINI_Window window; + MINI_Bool override_redirect; /* boolean, is override set... */ } XMapEvent; typedef struct { int type; unsigned long serial; /* # of last request processed by server */ - Bool send_event; /* true if this came from a SendEvent request */ - Display *display; /* Display the event was read from */ - Window parent; - Window window; + MINI_Bool send_event; /* true if this came from a SendEvent request */ + MINI_Display *display; /* Display the event was read from */ + MINI_Window parent; + MINI_Window window; } XMapRequestEvent; typedef union _XEvent { @@ -263,6 +281,7 @@ typedef union _XEvent { #define CWColormap (1L<<13) #define PseudoColor 3 #define TrueColor 4 +#define VisualIDMask 0x1 #define VisualScreenMask 0x2 #define Expose 12 #define CreateNotify 16 @@ -318,11 +337,11 @@ typedef union _XEvent { /** * \name Server-specific functions */ -extern Display * +extern MINI_Display * __miniglx_StartServer( const char *display_name ); extern int -__miniglx_Select( Display *dpy, int maxfd, +__miniglx_Select( MINI_Display *dpy, int maxfd, fd_set *rfds, fd_set *wfds, fd_set *xfds, struct timeval *tv ); @@ -331,25 +350,25 @@ __miniglx_Select( Display *dpy, int maxfd, * \name Simulated Xlib functions */ /*@{*/ -extern Display * +extern MINI_Display * XOpenDisplay( const char *dpy_name ); extern void -XCloseDisplay( Display *display ); +XCloseDisplay( MINI_Display *display ); -extern Window -XCreateWindow( Display *display, Window parent, int x, int y, +extern MINI_Window +XCreateWindow( MINI_Display *display, MINI_Window parent, int x, int y, unsigned int width, unsigned int height, unsigned int border_width, int depth, unsigned int winclass, Visual *visual, unsigned long valuemask, XSetWindowAttributes *attributes ); extern int -XNextEvent(Display *display, XEvent *event_return); +XNextEvent(MINI_Display *display, XEvent *event_return); -extern Bool -XCheckMaskEvent( Display *dpy, long event_mask, XEvent *event_return ); +extern MINI_Bool +XCheckMaskEvent( MINI_Display *dpy, long event_mask, XEvent *event_return ); /** * \brief Return the root window. @@ -365,27 +384,27 @@ XCheckMaskEvent( Display *dpy, long event_mask, XEvent *event_return ); #define DefaultScreen(dpy) 0 extern void -XDestroyWindow( Display *display, Window w ); +XDestroyWindow( MINI_Display *display, MINI_Window w ); extern void -XMapWindow( Display *display, Window w ); +XMapWindow( MINI_Display *display, MINI_Window w ); /* Should clients have access to this? */ extern void -XUnmapWindow( Display *display, Window w ); +XUnmapWindow( MINI_Display *display, MINI_Window w ); -extern Colormap -XCreateColormap( Display *display, Window w, Visual *visual, int alloc ); +extern MINI_Colormap +XCreateColormap( MINI_Display *display, MINI_Window w, Visual *visual, int alloc ); extern void -XFreeColormap( Display *display, Colormap cmap ); +XFreeColormap( MINI_Display *display, MINI_Colormap cmap ); extern void XFree( void *data ); extern XVisualInfo * -XGetVisualInfo( Display *display, long vinfo_mask, +XGetVisualInfo( MINI_Display *display, long vinfo_mask, XVisualInfo *vinfo_template, int *nitems_return ); /*@}*/ @@ -396,23 +415,23 @@ XGetVisualInfo( Display *display, long vinfo_mask, */ /*@{*/ extern XVisualInfo* -glXChooseVisual( Display *dpy, int screen, int *attribList ); +glXChooseVisual( MINI_Display *dpy, int screen, int *attribList ); extern int -glXGetConfig( Display *dpy, XVisualInfo *vis, int attrib, int *value ); +glXGetConfig( MINI_Display *dpy, XVisualInfo *vis, int attrib, int *value ); extern GLXContext -glXCreateContext( Display *dpy, XVisualInfo *vis, - GLXContext shareList, Bool direct ); +glXCreateContext( MINI_Display *dpy, XVisualInfo *vis, + GLXContext shareList, MINI_Bool direct ); extern void -glXDestroyContext( Display *dpy, GLXContext ctx ); +glXDestroyContext( MINI_Display *dpy, GLXContext ctx ); -extern Bool -glXMakeCurrent( Display *dpy, GLXDrawable drawable, GLXContext ctx); +extern MINI_Bool +glXMakeCurrent( MINI_Display *dpy, GLXDrawable drawable, GLXContext ctx); extern void -glXSwapBuffers( Display *dpy, GLXDrawable drawable ); +glXSwapBuffers( MINI_Display *dpy, GLXDrawable drawable ); extern GLXContext glXGetCurrentContext( void ); @@ -423,22 +442,22 @@ glXGetCurrentDrawable( void ); extern void (*glXGetProcAddress(const GLubyte *procname))( void ); -extern Bool -glXQueryVersion( Display *dpy, int *major, int *minor ); +extern MINI_Bool +glXQueryVersion( MINI_Display *dpy, int *major, int *minor ); /* Added in MiniGLX 1.1 */ extern GLXPbuffer -glXCreatePbuffer( Display *dpy, GLXFBConfig config, const int *attribList ); +glXCreatePbuffer( MINI_Display *dpy, GLXFBConfig config, const int *attribList ); extern void -glXDestroyPbuffer( Display *dpy, GLXPbuffer pbuf ); +glXDestroyPbuffer( MINI_Display *dpy, GLXPbuffer pbuf ); extern GLXFBConfig * -glXChooseFBConfig( Display *dpy, int screen, const int *attribList, +glXChooseFBConfig( MINI_Display *dpy, int screen, const int *attribList, int *nitems ); extern XVisualInfo * -glXGetVisualFromFBConfig( Display *dpy, GLXFBConfig config ); +glXGetVisualFromFBConfig( MINI_Display *dpy, GLXFBConfig config ); extern void *glXAllocateMemoryMESA(Display *dpy, int scrn, size_t size, float readFreq, diff --git a/src/glx/mini/miniglx.c b/src/glx/mini/miniglx.c index 5cd5eea9c7d..bb76ef87865 100644 --- a/src/glx/mini/miniglx.c +++ b/src/glx/mini/miniglx.c @@ -1215,8 +1215,20 @@ CallCreateNewScreen(Display *dpy, int scrn, __DRIscreen *psc) fd, (get_ver != NULL) ? (*get_ver)() : 20040602, (__GLcontextModes **) &dpy->driver_modes); - } + /* fill in dummy visual ids */ + { + __GLcontextModes *temp; + temp = (__GLcontextModes *)dpy->driver_modes; + i = 1; + while (temp) + { + temp->visualID = i++; + temp=temp->next; + } + } + } + done: if ( psp == NULL ) { if ( pSAREA != MAP_FAILED ) { @@ -1631,50 +1643,102 @@ XGetVisualInfo( Display *dpy, long vinfo_mask, XVisualInfo *vinfo_template, int const __GLcontextModes *mode; XVisualInfo *results; Visual *visResults; - int i, n; + int i, n=0; - ASSERT(vinfo_mask == VisualScreenMask); + // ASSERT(vinfo_mask == VisualScreenMask); ASSERT(vinfo_template.screen == 0); - n = 0; - for ( mode = dpy->driver_modes ; mode != NULL ; mode = mode->next ) - n++; + if (vinfo_mask == VisualIDMask) + { + for ( mode = dpy->driver_modes ; mode != NULL ; mode= mode->next ) + if (mode->visualID == vinfo_template->visualid) + n=1; - results = (XVisualInfo *)calloc(1, n * sizeof(XVisualInfo)); - if (!results) { - *nitens_return = 0; - return NULL; - } + if (n==0) + return NULL; + + results = (XVisualInfo *)calloc(1, n * sizeof(XVisualInfo)); + if (!results) { + *nitens_return = 0; + return NULL; + } + + visResults = (Visual *)calloc(1, n * sizeof(Visual)); + if (!results) { + free(results); + *nitens_return = 0; + return NULL; + } - visResults = (Visual *)calloc(1, n * sizeof(Visual)); - if (!results) { - free(results); - *nitens_return = 0; - return NULL; + for ( mode = dpy->driver_modes ; mode != NULL ; mode= mode->next ) + if (mode->visualID == vinfo_template->visualid) + { + visResults[0].mode=mode; + visResults[0].visInfo = results; + visResults[0].dpy = dpy; + if (dpy->driverContext.bpp == 32) + visResults[0].pixelFormat = PF_B8G8R8A8; /* XXX: FIX ME */ + else + visResults[0].pixelFormat = PF_B5G6R5; /* XXX: FIX ME */ + + results[0].visual = visResults; + results[0].visualid = mode->visualID; +#if defined(__cplusplus) || defined(c_plusplus) + results[0].c_class = TrueColor; +#else + results[0].class = TrueColor; +#endif + results[0].depth = mode->redBits + + mode->redBits + + mode->redBits + + mode->redBits; + results[0].bits_per_rgb = dpy->driverContext.bpp; + + } + } - - for ( mode = dpy->driver_modes, i = 0 ; mode != NULL ; mode = mode->next, i++ ) { - visResults[i].mode = mode; - visResults[i].visInfo = results + i; - visResults[i].dpy = dpy; - - if (dpy->driverContext.bpp == 32) + else // if (vinfo_mask == VisualScreenMask) + { + n = 0; + for ( mode = dpy->driver_modes ; mode != NULL ; mode = mode->next ) + n++; + + results = (XVisualInfo *)calloc(1, n * sizeof(XVisualInfo)); + if (!results) { + *nitens_return = 0; + return NULL; + } + + visResults = (Visual *)calloc(1, n * sizeof(Visual)); + if (!results) { + free(results); + *nitens_return = 0; + return NULL; + } + + for ( mode = dpy->driver_modes, i = 0 ; mode != NULL ; mode = mode->next, i++ ) { + visResults[i].mode = mode; + visResults[i].visInfo = results + i; + visResults[i].dpy = dpy; + + if (dpy->driverContext.bpp == 32) visResults[i].pixelFormat = PF_B8G8R8A8; /* XXX: FIX ME */ - else + else visResults[i].pixelFormat = PF_B5G6R5; /* XXX: FIX ME */ - - results[i].visual = visResults + i; - results[i].visualid = i; + + results[i].visual = visResults + i; + results[i].visualid = mode->visualID; #if defined(__cplusplus) || defined(c_plusplus) - results[i].c_class = TrueColor; + results[i].c_class = TrueColor; #else - results[i].class = TrueColor; + results[i].class = TrueColor; #endif - results[i].depth = mode->redBits + - mode->redBits + - mode->redBits + - mode->redBits; - results[i].bits_per_rgb = dpy->driverContext.bpp; + results[i].depth = mode->redBits + + mode->redBits + + mode->redBits + + mode->redBits; + results[i].bits_per_rgb = dpy->driverContext.bpp; + } } *nitens_return = n; return results; |