blob: 7b26917460ab3e034fa43c5ee780e0cfa133107c [file] [log] [blame]
#include <stdlib.h>
#include <sys/time.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include "segl.h"
static Window
x11_create_window(struct segl_winsys *winsys, const char *name,
EGLint width, EGLint height, EGLint visual)
{
XVisualInfo vinfo_template, *vinfo = NULL;
EGLint val, num_vinfo;
Window root, win;
XSetWindowAttributes attrs;
unsigned long mask;
EGLint x = 0, y = 0;
vinfo_template.visualid = (VisualID) val;
vinfo = XGetVisualInfo(winsys->dpy, VisualIDMask, &vinfo_template, &num_vinfo);
if (!num_vinfo) {
if (vinfo)
XFree(vinfo);
return None;
}
root = DefaultRootWindow(winsys->dpy);
/* window attributes */
attrs.background_pixel = 0;
attrs.border_pixel = 0;
attrs.colormap = XCreateColormap(winsys->dpy, root, vinfo->visual, AllocNone);
attrs.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask;
attrs.override_redirect = False;
mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask | CWOverrideRedirect;
win = XCreateWindow(winsys->dpy, root, x, y, width, height, 0,
vinfo->depth, InputOutput, vinfo->visual, mask, &attrs);
XFree(vinfo);
if (!win)
return None;
/* set hints and properties */
{
XSizeHints sizehints;
sizehints.x = x;
sizehints.y = y;
sizehints.width = width;
sizehints.height = height;
sizehints.flags = USSize | USPosition;
XSetNormalHints(winsys->dpy, win, &sizehints);
XSetStandardProperties(winsys->dpy, win, name, name,
None, (char **)NULL, 0, &sizehints);
}
XMapWindow(winsys->dpy, win);
return win;
}
static void
x11_destroy_window(struct segl_winsys *winsys, Window win)
{
if (win)
XDestroyWindow(winsys->dpy, win);
}
static Pixmap
x11_create_pixmap(struct segl_winsys *winsys, EGLint width, EGLint height,
EGLint depth)
{
Window root = DefaultRootWindow(winsys->dpy);
Pixmap pix;
pix = XCreatePixmap(winsys->dpy, (Drawable) root, width, height, depth);
return pix;
}
static void
x11_destroy_pixmap(struct segl_winsys *winsys, Pixmap pix)
{
if (pix)
XFreePixmap(winsys->dpy, pix);
}
static double
x11_now(struct segl_winsys *winsys)
{
struct timeval tv;
gettimeofday(&tv, NULL);
return (double) tv.tv_sec + tv.tv_usec / 1000000.0;
}
struct segl_winsys *
segl_get_winsys(EGLNativeDisplayType dpy)
{
struct segl_winsys *winsys;
winsys = calloc(1, sizeof(*winsys));
if (winsys) {
winsys->dpy = dpy;
winsys->create_window = x11_create_window;
winsys->destroy_window = x11_destroy_window;
winsys->create_pixmap = x11_create_pixmap;
winsys->destroy_pixmap = x11_destroy_pixmap;
winsys->now = x11_now;
}
return winsys;
}