#include #include #include #include #include #include #include #include static XVisualInfo * get_visual_info (Display *xdisplay, EGLDisplay *edisplay, EGLConfig egl_config) { XVisualInfo visinfo_template; int template_mask = 0; XVisualInfo *visinfo = NULL; int visinfos_count; EGLint visualid; eglGetConfigAttrib(edisplay, egl_config, EGL_NATIVE_VISUAL_ID, &visualid); assert(visualid != 0); visinfo_template.visualid = visualid; template_mask |= VisualIDMask; visinfo = XGetVisualInfo(xdisplay, template_mask, &visinfo_template, &visinfos_count); return visinfo; } int main(int argc, char **argv) { Display *xdisplay; EGLDisplay edisplay; EGLint ver_major, ver_minor; EGLint cfg_attributes[] = { EGL_RED_SIZE, 1, EGL_GREEN_SIZE, 1, EGL_BLUE_SIZE, 1, EGL_ALPHA_SIZE, EGL_DONT_CARE, EGL_DEPTH_SIZE, 1, EGL_BUFFER_SIZE, EGL_DONT_CARE, EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT, EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_NONE }; EGLint context_attributes[] = { EGL_NONE }; EGLConfig config; EGLContext context; EGLint n_configs; XVisualInfo *xvisual; Window win1, win2; EGLSurface surf1, surf2; XSetWindowAttributes attrs; XEvent xevent; Atom xdelete, xprotocols; xdisplay = XOpenDisplay(NULL); edisplay = eglGetDisplay(xdisplay); eglInitialize(edisplay, &ver_major, &ver_minor); eglBindAPI(EGL_OPENGL_API); n_configs = 0; eglChooseConfig(edisplay, cfg_attributes, &config, 1, &n_configs); assert(n_configs == 1); context = eglCreateContext(edisplay, config, EGL_NO_CONTEXT, context_attributes); assert(context != EGL_NO_CONTEXT); xvisual = get_visual_info(xdisplay, edisplay, config); attrs.override_redirect = True; attrs.colormap = XCreateColormap(xdisplay, DefaultRootWindow(xdisplay), xvisual->visual, AllocNone); attrs.border_pixel = 0; win1 = XCreateWindow(xdisplay, DefaultRootWindow(xdisplay), -100, -100, 1, 1, 0, xvisual->depth, InputOutput, xvisual->visual, CWOverrideRedirect|CWColormap|CWBorderPixel, &attrs); surf1 = eglCreateWindowSurface(edisplay, config, (NativeWindowType)win1, NULL); eglMakeCurrent(edisplay, surf1, surf1, context); attrs.background_pixel = WhitePixel(xdisplay, DefaultScreen(xdisplay)); attrs.border_pixel = 0; win2 = XCreateWindow(xdisplay, DefaultRootWindow(xdisplay), 0, 0, 640, 480, 0, xvisual->depth, InputOutput, xvisual->visual, CWBorderPixel|CWColormap|CWBackPixel, &attrs); surf2 = eglCreateWindowSurface(edisplay, config, (NativeWindowType)win2, NULL); XFree(xvisual); xdelete = XInternAtom(xdisplay, "WM_DELETE_WINDOW", False); xprotocols = XInternAtom(xdisplay, "WM_PROTOCOLS", False); XSetWMProtocols(xdisplay, win2, &xdelete, 1); XMapWindow(xdisplay, win2); eglMakeCurrent(edisplay, surf2, surf2, context); glViewport(0, 0, 640, 480); glClearColor(1, 0, 1, 1); glClear(GL_COLOR_BUFFER_BIT); eglSwapBuffers(edisplay, surf2); for (;;) { XNextEvent(xdisplay, &xevent); if (xevent.type == ClientMessage && xevent.xclient.message_type == xprotocols && xevent.xclient.format == 32 && xevent.xclient.data.l[0] == xdelete) return 0; } }