]> git.cworth.org Git - fips/commitdiff
util-x11: Rework init_window interface to accept XVisualInfo
authorCarl Worth <cworth@cworth.org>
Mon, 1 Jul 2013 18:22:17 +0000 (11:22 -0700)
committerCarl Worth <cworth@cworth.org>
Tue, 2 Jul 2013 21:19:33 +0000 (14:19 -0700)
This is a much more correct way of doing things. Previously, we would select
a visual when creating the OpenGL context, but then use a default visual when
creating a window. This was fragile and would fail if the default visual was
not identical to what we had created.

Now, instead, we pass the selected XVisualInfo to our init_window interface
and call XCreateWindow instead of XCreateSimpleWindow. This guarantees that
the visuals match as required.

test/glx-dlopen-dlsym.c
test/glx-dlopen-gpa.c
test/glx-dlopen-gpaa.c
test/glx-link-call.c
test/glx-link-gpa.c
test/glx-link-gpaa.c
test/handle-events.c
test/util-x11.c
test/util-x11.h

index 2ac98ac42996b933721dba1fb74131db20b2ab7e..a9677987a4ed0e2f8a4904b4f54228966ece4b75 100644 (file)
@@ -149,14 +149,18 @@ main (void)
 {
         Display *dpy;
         Window window;
+       GLXContext ctx;
+       XVisualInfo *visual_info;
 
-       util_x11_init_display (&dpy);
+       resolve_symbols ();
 
-       util_x11_init_window (dpy, &window);
+       dpy = util_x11_init_display ();
 
-       resolve_symbols ();
+       create_context (dpy, &ctx, &visual_info);
+
+       window = util_x11_init_window (dpy, visual_info);
 
-        handle_events (dpy, window);
+        handle_events (dpy, ctx, window);
 
        util_x11_fini_window (dpy, window);
 
index 24238b24adee1425cf7112d489e14027d714ae5a..49717944c8553d23606482c95900b899640d1a8a 100644 (file)
@@ -146,14 +146,18 @@ main (void)
 {
         Display *dpy;
         Window window;
+       GLXContext ctx;
+       XVisualInfo *visual_info;
 
-       util_x11_init_display (&dpy);
+       resolve_symbols ();
 
-       util_x11_init_window (dpy, &window);
+       dpy = util_x11_init_display ();
 
-       resolve_symbols ();
+       create_context (dpy, &ctx, &visual_info);
+
+       window = util_x11_init_window (dpy, visual_info);
 
-        handle_events (dpy, window);
+        handle_events (dpy, ctx, window);
 
        util_x11_fini_window (dpy, window);
 
index 1189c3c00d96bcf7e9948686b6b4dc78ea5e1b43..cd0734bea109a8ec35adf724789e8d125880ce74 100644 (file)
@@ -146,14 +146,18 @@ main (void)
 {
         Display *dpy;
         Window window;
+       GLXContext ctx;
+       XVisualInfo *visual_info;
 
-       util_x11_init_display (&dpy);
+       resolve_symbols ();
 
-       util_x11_init_window (dpy, &window);
+       dpy = util_x11_init_display ();
 
-       resolve_symbols ();
+       create_context (dpy, &ctx, &visual_info);
+
+       window = util_x11_init_window (dpy, visual_info);
 
-        handle_events (dpy, window);
+        handle_events (dpy, ctx, window);
 
        util_x11_fini_window (dpy, window);
 
index f685246e4315e667cc296e5b2f586ae9640f9ab5..46cb563ce47ad681d40eb2d26da0e34186ad0d84 100644 (file)
@@ -40,12 +40,16 @@ main (void)
 {
         Display *dpy;
         Window window;
+       GLXContext ctx;
+       XVisualInfo *visual_info;
 
-       util_x11_init_display (&dpy);
+       dpy = util_x11_init_display ();
 
-       util_x11_init_window (dpy, &window);
+       create_context (dpy, &ctx, &visual_info);
 
-        handle_events (dpy, window);
+       window = util_x11_init_window (dpy, visual_info);
+
+        handle_events (dpy, ctx, window);
 
        util_x11_fini_window (dpy, window);
 
index 67338fbd1e85eb3ee04415319c3d09354f7a9170..8db80093300f8a024b1a9783e95d51e05f7bfec5 100644 (file)
@@ -150,14 +150,18 @@ main (void)
 {
         Display *dpy;
         Window window;
+       GLXContext ctx;
+       XVisualInfo *visual_info;
 
-       util_x11_init_display (&dpy);
+       resolve_symbols ();
 
-       util_x11_init_window (dpy, &window);
+       dpy = util_x11_init_display ();
 
-       resolve_symbols ();
+       create_context (dpy, &ctx, &visual_info);
+
+       window = util_x11_init_window (dpy, visual_info);
 
-        handle_events (dpy, window);
+        handle_events (dpy, ctx, window);
 
        util_x11_fini_window (dpy, window);
 
index 7def0d821bd27f8643a93654b2f18254b18c2071..682ee9304817dc170f39c38c087e4185209b3b67 100644 (file)
@@ -150,14 +150,18 @@ main (void)
 {
         Display *dpy;
         Window window;
+       GLXContext ctx;
+       XVisualInfo *visual_info;
 
-       util_x11_init_display (&dpy);
+       resolve_symbols ();
 
-       util_x11_init_window (dpy, &window);
+       dpy = util_x11_init_display ();
 
-       resolve_symbols ();
+       create_context (dpy, &ctx, &visual_info);
+
+       window = util_x11_init_window (dpy, visual_info);
 
-        handle_events (dpy, window);
+        handle_events (dpy, ctx, window);
 
        util_x11_fini_window (dpy, window);
 
index 3939c04f5d7afa7a9edbfee39ce4f590f1d2ca6b..a28e1e653e443126457718e658485730ad1aa254 100644 (file)
@@ -62,9 +62,8 @@ paint_rgb_using_clear (double r, double g, double b)
 }
 
 static void
-draw (Display *dpy, Window window, int width, int height)
+create_context (Display *dpy, GLXContext *ctx_ret, XVisualInfo **visual_info_ret)
 {
-       int i;
         int visual_attr[] = {
                 GLX_RGBA,
                 GLX_RED_SIZE,          8,
@@ -79,8 +78,14 @@ draw (Display *dpy, Window window, int width, int height)
         };
 
        /* Window and context setup. */
-        XVisualInfo *visual_info = _(glXChooseVisual) (dpy, 0, visual_attr);
-        GLXContext ctx = _(glXCreateContext) (dpy, visual_info, NULL, True);
+        *visual_info_ret = _(glXChooseVisual) (dpy, 0, visual_attr);
+        *ctx_ret = _(glXCreateContext) (dpy, *visual_info_ret, NULL, True);
+}
+
+static void
+draw (Display *dpy, GLXContext ctx, Window window, int width, int height)
+{
+       int i;
         _(glXMakeCurrent) (dpy, window, ctx);
 
         _(glViewport) (0, 0, width, height);
@@ -113,7 +118,7 @@ draw (Display *dpy, Window window, int width, int height)
 }
 
 static void
-handle_events(Display *dpy, Window window)
+handle_events(Display *dpy, GLXContext ctx, Window window)
 {
         XEvent xev;
        int width = 0;
@@ -130,7 +135,7 @@ handle_events(Display *dpy, Window window)
                         break;
                 case Expose:
                         if (xev.xexpose.count == 0) {
-                                draw (dpy, window, width, height);
+                                draw (dpy, ctx, window, width, height);
                                 return;
                         }
                         break;
index 7ab6ebc894fffa298b532621e1e6e5cfe0c37f0d..e3b35572d726a531b565ce70a00967c8019d804f 100644 (file)
 
 #include "util-x11.h"
 
-void
-util_x11_init_display (Display **dpy)
+Display *
+util_x11_init_display (void)
 {
-        *dpy = XOpenDisplay (NULL);
+       Display *dpy;
+
+        dpy = XOpenDisplay (NULL);
 
-        if (*dpy == NULL) {
+        if (dpy == NULL) {
                 fprintf(stderr, "Failed to open display %s\n",
                         XDisplayName(NULL));
                 exit (1);
         }
+
+       return dpy;
 }
 
 void
@@ -42,24 +46,38 @@ util_x11_fini_display (Display *dpy)
         XCloseDisplay (dpy);
 }
 
-void
-util_x11_init_window (Display *dpy, Window *window)
+Window
+util_x11_init_window (Display *dpy, XVisualInfo *visual_info)
 {
        int width = 64;
        int height = 64;
+       Window root, window;
+       XSetWindowAttributes window_attr;
+       Colormap colormap;
+       unsigned long window_mask, event_mask;
+       unsigned long black;
 
+       root = DefaultRootWindow (dpy);
+       black = BlackPixel (dpy, DefaultScreen (dpy));
+       colormap = XCreateColormap (dpy, root, visual_info->visual, AllocNone);
+       event_mask = KeyPressMask | StructureNotifyMask | ExposureMask;
 
+       window_mask = 0;
+       window_mask |= CWBackPixel;     window_attr.background_pixel = black;
+       window_mask |= CWBorderPixel;   window_attr.border_pixel = black;
+       window_mask |= CWColormap;      window_attr.colormap = colormap;
+       window_mask |= CWEventMask;     window_attr.event_mask = event_mask;
 
-        *window = XCreateSimpleWindow(dpy, DefaultRootWindow (dpy),
-                                     0, 0, width, height, 0,
-                                     BlackPixel (dpy, DefaultScreen (dpy)),
-                                     BlackPixel (dpy, DefaultScreen (dpy)));
+        window = XCreateWindow(dpy, root, 0, 0, width, height, 0,
+                              visual_info->depth, InputOutput,
+                              visual_info->visual,
+                              window_mask, &window_attr);
 
-        XSelectInput(dpy, *window,
-                     KeyPressMask | StructureNotifyMask | ExposureMask);
+        XMapWindow (dpy, window);
 
-        XMapWindow (dpy, *window);
+       XFreeColormap (dpy, colormap);
 
+       return window;
 }
 
 void
index 398b263d876bfc525e3af811a2c19121f20c6c9c..7ae0c599583344a22684364b69a1a5b217ecab71 100644 (file)
 #define UTIL_X11_H
 
 #include <X11/Xlib.h>
+#include <X11/Xutil.h>
 
-void
-util_x11_init_display (Display **dpy);
+Display *
+util_x11_init_display (void);
 
 void
 util_x11_fini_display (Display *dpy);
 
-void
-util_x11_init_window (Display *dpy, Window *window);
+Window
+util_x11_init_window (Display *dpy, XVisualInfo *visual_info);
 
 void
 util_x11_fini_window (Display *dpy, Window window);