From cceadf4cd4f1fa7e7f12b3765bba31bfcef6b1e0 Mon Sep 17 00:00:00 2001 From: notaz Date: Fri, 8 Feb 2013 01:44:00 +0200 Subject: [PATCH] gl_platform: avoid direct xlib dependency some people want to run this without X --- gl_platform.c | 38 +++++++++++++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/gl_platform.c b/gl_platform.c index 74eea8f..d5f0c20 100644 --- a/gl_platform.c +++ b/gl_platform.c @@ -15,12 +15,19 @@ */ #include #include +#include static Display *x11display; static Window x11window; static DISPMANX_DISPLAY_HANDLE_T m_dispmanDisplay; static EGL_DISPMANX_WINDOW_T m_nativeWindow; +static void *x11lib; +#define FPTR(f) typeof(f) * p##f +static FPTR(XGetGeometry); +static FPTR(XGetWindowAttributes); +static FPTR(XTranslateCoordinates); + static void get_window_rect(VC_RECT_T *rect) { XWindowAttributes xattrs_root; @@ -41,14 +48,14 @@ static void get_window_rect(VC_RECT_T *rect) if (x11display == NULL || x11window == 0) return; // use fullscreen - XGetGeometry(x11display, x11window, &root, &dx, &dy, &dw, &dh, + pXGetGeometry(x11display, x11window, &root, &dx, &dy, &dw, &dh, &dummy, &dummy); - XGetWindowAttributes(x11display, root, &xattrs_root); + pXGetWindowAttributes(x11display, root, &xattrs_root); if (dw == xattrs_root.width && dh == xattrs_root.height) return; // use fullscreen - XTranslateCoordinates(x11display, x11window, root, + pXTranslateCoordinates(x11display, x11window, root, dx, dy, &dx, &dy, &dummyw); // how to deal with that weird centering thing? @@ -87,8 +94,21 @@ static void submit_rect(void) int gl_platform_init(void **display, void **window, int *quirks) { - x11display = *display; - x11window = (Window)*window; + x11display = NULL; + x11window = 0; + + x11lib = dlopen("libX11.so.6", RTLD_LAZY); + if (x11lib != NULL) { + pXGetGeometry = dlsym(x11lib, "XGetGeometry"); + pXGetWindowAttributes = dlsym(x11lib, "XGetWindowAttributes"); + pXTranslateCoordinates = dlsym(x11lib, "XTranslateCoordinates"); + if (pXGetGeometry != NULL && pXGetWindowAttributes != NULL + && pXTranslateCoordinates != NULL) + { + x11display = *display; + x11window = (Window)*window; + } + } bcm_host_init(); submit_rect(); @@ -104,6 +124,14 @@ void gl_platform_finish(void) { vc_dispmanx_display_close(m_dispmanDisplay); bcm_host_deinit(); + + if (x11lib) { + dlclose(x11lib); + x11lib = NULL; + } + + x11display = NULL; + x11window = 0; } #else -- 2.39.2