From 3b21507274aa4f98644382903ae529c1fc2c7bd4 Mon Sep 17 00:00:00 2001 From: inmarket Date: Wed, 20 Aug 2014 01:36:33 +1000 Subject: GL3D GWIN window + demo --- 3rdparty/tinygl-0.4-ugfx/examples/x11.c | 139 ++++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 3rdparty/tinygl-0.4-ugfx/examples/x11.c (limited to '3rdparty/tinygl-0.4-ugfx/examples/x11.c') diff --git a/3rdparty/tinygl-0.4-ugfx/examples/x11.c b/3rdparty/tinygl-0.4-ugfx/examples/x11.c new file mode 100644 index 00000000..13913f51 --- /dev/null +++ b/3rdparty/tinygl-0.4-ugfx/examples/x11.c @@ -0,0 +1,139 @@ +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include "ui.h" + + +#ifndef M_PI +# define M_PI 3.14159265 +#endif + +static int attributeList[] = { GLX_RGBA, GLX_DOUBLEBUFFER, None }; + +static Bool WaitForNotify(Display *d, XEvent *e, char *arg) +{ + return (e->type == MapNotify) && (e->xmap.window == (Window)arg); +} + +Display *dpy; +Window win; + +void tkSwapBuffers(void) +{ + glXSwapBuffers(dpy,win); +} + +int ui_loop(int argc, char **argv, const char *name) +{ + XVisualInfo *vi; + Colormap cmap; + XSetWindowAttributes swa; + XSizeHints hint; + GLXContext cx; + XEvent event; + int k, width, height; + char buf[80]; + XEvent xev; + KeySym keysym; + XComposeStatus status; + + /* get a connection */ + dpy = XOpenDisplay(NULL); + if (dpy == NULL) { + fprintf(stderr,"Could not open X display\n"); + exit(1); + } + + /* get an appropriate visual */ + vi = glXChooseVisual(dpy, DefaultScreen(dpy), attributeList); + if (vi == NULL) { + fprintf(stderr, "No suitable visual for glx\n"); + exit(1); + } + + /* create a GLX context */ + cx = glXCreateContext(dpy, vi, 0, GL_TRUE); + + /* create a color map */ + cmap = XCreateColormap(dpy, RootWindow(dpy, vi->screen), + vi->visual, AllocNone); + + /* create a window */ + width = 400; + height = 300; + hint.x = 0; + hint.y = 0; + hint.width = width; + hint.height = height; + hint.flags = PPosition | PSize; + swa.colormap = cmap; + swa.border_pixel = 0; + swa.event_mask = StructureNotifyMask; + win = XCreateWindow(dpy, RootWindow(dpy, vi->screen), 0, 0, width, height, + 0, vi->depth, InputOutput, vi->visual, + CWBorderPixel|CWColormap|CWEventMask, &swa); + XSetStandardProperties (dpy, win, name, name, None, NULL, 0, &hint); + + XMapWindow(dpy, win); + XIfEvent(dpy, &event, WaitForNotify, (char*)win); + XSelectInput(dpy, win, KeyPressMask | StructureNotifyMask | ExposureMask); + + /* connect the context to the window */ + glXMakeCurrent(dpy, win, cx); + + init(); + reshape(width, height); + + while (1) { + if (XPending(dpy) > 0) { + XNextEvent(dpy,&xev); + switch(xev.type) { + case KeyPress: + XLookupString((XKeyEvent *)&xev,buf,80,&keysym,&status); + switch(keysym) { + case XK_Up: + k = KEY_UP; + break; + case XK_Down: + k = KEY_DOWN; + break; + case XK_Left: + k = KEY_LEFT; + break; + case XK_Right: + k = KEY_RIGHT; + break; + case XK_Escape: + k = KEY_ESCAPE; + break; + default: + k = keysym; + } + key(k, 0); + break; + case ConfigureNotify: + { + int width,height; + width = xev.xconfigure.width; + height = xev.xconfigure.height; + glXWaitX(); + reshape(width, height); + } + break; + } + } else { + idle(); + } + } + return 0; +} + + -- cgit v1.2.3