summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
64cf6f7)
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.
{
Display *dpy;
Window window;
{
Display *dpy;
Window window;
+ GLXContext ctx;
+ XVisualInfo *visual_info;
- util_x11_init_display (&dpy);
- util_x11_init_window (dpy, &window);
+ dpy = util_x11_init_display ();
+ 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);
util_x11_fini_window (dpy, window);
{
Display *dpy;
Window window;
{
Display *dpy;
Window window;
+ GLXContext ctx;
+ XVisualInfo *visual_info;
- util_x11_init_display (&dpy);
- util_x11_init_window (dpy, &window);
+ dpy = util_x11_init_display ();
+ 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);
util_x11_fini_window (dpy, window);
{
Display *dpy;
Window window;
{
Display *dpy;
Window window;
+ GLXContext ctx;
+ XVisualInfo *visual_info;
- util_x11_init_display (&dpy);
- util_x11_init_window (dpy, &window);
+ dpy = util_x11_init_display ();
+ 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);
util_x11_fini_window (dpy, window);
{
Display *dpy;
Window window;
{
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);
util_x11_fini_window (dpy, window);
{
Display *dpy;
Window window;
{
Display *dpy;
Window window;
+ GLXContext ctx;
+ XVisualInfo *visual_info;
- util_x11_init_display (&dpy);
- util_x11_init_window (dpy, &window);
+ dpy = util_x11_init_display ();
+ 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);
util_x11_fini_window (dpy, window);
{
Display *dpy;
Window window;
{
Display *dpy;
Window window;
+ GLXContext ctx;
+ XVisualInfo *visual_info;
- util_x11_init_display (&dpy);
- util_x11_init_window (dpy, &window);
+ dpy = util_x11_init_display ();
+ 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);
util_x11_fini_window (dpy, window);
-draw (Display *dpy, Window window, int width, int height)
+create_context (Display *dpy, GLXContext *ctx_ret, XVisualInfo **visual_info_ret)
int visual_attr[] = {
GLX_RGBA,
GLX_RED_SIZE, 8,
int visual_attr[] = {
GLX_RGBA,
GLX_RED_SIZE, 8,
};
/* Window and context setup. */
};
/* 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);
_(glXMakeCurrent) (dpy, window, ctx);
_(glViewport) (0, 0, width, height);
-handle_events(Display *dpy, Window window)
+handle_events(Display *dpy, GLXContext ctx, Window window)
{
XEvent xev;
int width = 0;
{
XEvent xev;
int width = 0;
break;
case Expose:
if (xev.xexpose.count == 0) {
break;
case Expose:
if (xev.xexpose.count == 0) {
- draw (dpy, window, width, height);
+ draw (dpy, ctx, window, width, height);
-void
-util_x11_init_display (Display **dpy)
+Display *
+util_x11_init_display (void)
- *dpy = XOpenDisplay (NULL);
+ Display *dpy;
+
+ dpy = XOpenDisplay (NULL);
fprintf(stderr, "Failed to open display %s\n",
XDisplayName(NULL));
exit (1);
}
fprintf(stderr, "Failed to open display %s\n",
XDisplayName(NULL));
exit (1);
}
-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;
{
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);
#define UTIL_X11_H
#include <X11/Xlib.h>
#define UTIL_X11_H
#include <X11/Xlib.h>
-void
-util_x11_init_display (Display **dpy);
+Display *
+util_x11_init_display (void);
void
util_x11_fini_display (Display *dpy);
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);
void
util_x11_fini_window (Display *dpy, Window window);