Dynamic loading support for Wayland
authorGabriel Jacobo <gabomdq@gmail.com>
Thu, 09 Jan 2014 13:56:21 -0300
changeset 8104 2e4f1bd21196
parent 8103 d4a88c49247e
child 8105 f74bf1bbe472
Dynamic loading support for Wayland
configure
configure.in
include/SDL_config.h.in
src/video/wayland/SDL_waylanddyn.c
src/video/wayland/SDL_waylanddyn.h
src/video/wayland/SDL_waylandevents.c
src/video/wayland/SDL_waylandevents_c.h
src/video/wayland/SDL_waylandmouse.c
src/video/wayland/SDL_waylandmouse.h
src/video/wayland/SDL_waylandopengles.c
src/video/wayland/SDL_waylandopengles.h
src/video/wayland/SDL_waylandsym.h
src/video/wayland/SDL_waylandtouch.c
src/video/wayland/SDL_waylandtouch.h
src/video/wayland/SDL_waylandvideo.c
src/video/wayland/SDL_waylandvideo.h
src/video/wayland/SDL_waylandwindow.c
src/video/wayland/SDL_waylandwindow.h
--- a/configure	Wed Jan 08 14:53:08 2014 -0500
+++ b/configure	Thu Jan 09 13:56:21 2014 -0300
@@ -819,6 +819,7 @@
 enable_dummyaudio
 enable_video_wayland
 enable_video_wayland_qt_touch
+enable_wayland_shared
 enable_video_x11
 with_x
 enable_x11_shared
@@ -1538,6 +1539,7 @@
   --enable-video-wayland-qt-touch
                           QtWayland server support for Wayland video driver
                           [[default=yes]]
+  --enable-wayland-shared dynamically load Wayland support [[default=maybe]]
   --enable-video-x11      use X11 video driver [[default=yes]]
   --enable-x11-shared     dynamically load X11 support [[default=maybe]]
   --enable-video-x11-xcursor
@@ -18705,8 +18707,8 @@
         video_wayland=no
         if test x$PKG_CONFIG != xno; then
             if $PKG_CONFIG --exists wayland-client wayland-egl wayland-cursor egl xkbcommon ; then
-                WAYLAND_CFLAGS=`$PKG_CONFIG --cflags wayland-client wayland-egl wayland-cursor egl xkbcommon`
-                WAYLAND_LIBS=`$PKG_CONFIG --libs wayland-client wayland-egl wayland-cursor egl xkbcommon`
+                WAYLAND_CFLAGS=`$PKG_CONFIG --cflags wayland-client wayland-egl wayland-cursor xkbcommon`
+                WAYLAND_LIBS=`$PKG_CONFIG --libs wayland-client wayland-egl wayland-cursor xkbcommon`
                 video_wayland=yes
             fi
         fi
@@ -18724,7 +18726,69 @@
             fi
             SOURCES="$SOURCES $srcdir/src/video/wayland/*.c"
             EXTRA_CFLAGS="$EXTRA_CFLAGS $WAYLAND_CFLAGS"
-                        EXTRA_LDFLAGS="$EXTRA_LDFLAGS $WAYLAND_LIBS"
+            # Check whether --enable-wayland-shared was given.
+if test "${enable_wayland_shared+set}" = set; then :
+  enableval=$enable_wayland_shared;
+else
+  enable_wayland_shared=maybe
+fi
+
+
+                        case "$host" in
+                *)
+                    wayland_client_lib=`find_lib "libwayland-client.so.*" "$WAYLAND_LIBS" | sed 's/.*\/\(.*\)/\1/; q'`
+                    wayland_egl_lib=`find_lib "libwayland-egl.so.*" "$WAYLAND_LIBS" | sed 's/.*\/\(.*\)/\1/; q'`
+                    if test x$wayland_egl_lib = x; then
+                                                wayland_egl_lib=`find_lib "mesa-egl/libwayland-egl.so.*" "$WAYLAND_LIBS" | sed 's/.*\/\(.*\)/\1/; q'`
+                    fi
+                    wayland_cursor_lib=`find_lib "libwayland-cursor.so.*" "$WAYLAND_LIBS" | sed 's/.*\/\(.*\)/\1/; q'`
+                    xkbcommon_lib=`find_lib "libxkbcommon.so.*" "$WAYLAND_LIBS" | sed 's/.*\/\(.*\)/\1/; q'`
+                    ;;
+            esac
+
+            if test x$enable_wayland_shared = xmaybe; then
+                enable_wayland_shared=yes
+            fi
+            if test x$have_loadso != xyes && \
+               test x$enable_wayland_shared = xyes; then
+                { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You must have SDL_LoadObject() support for dynamic WAYLAND loading" >&5
+$as_echo "$as_me: WARNING: You must have SDL_LoadObject() support for dynamic WAYLAND loading" >&2;}
+                enable_wayland_shared=no
+            fi
+            if test x$have_loadso = xyes && \
+               test x$enable_wayland_shared = xyes && \
+               test x$wayland_client_lib != x && \
+               test x$wayland_egl_lib != x && \
+               test x$wayland_cursor_lib != x && \
+               test x$xkbcommon_lib != x; then
+                echo "-- dynamic libwayland-client -> $wayland_client_lib"
+                echo "-- dynamic libwayland-egl -> $wayland_egl_lib"
+                echo "-- dynamic libwayland-cursor -> $wayland_cursor_lib"
+                echo "-- dynamic xkbcommon -> $xkbcommon_lib"
+
+cat >>confdefs.h <<_ACEOF
+#define SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC "$wayland_client_lib"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_EGL "$wayland_egl_lib"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_CURSOR "$wayland_cursor_lib"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_XKBCOMMON "$xkbcommon_lib"
+_ACEOF
+
+            else
+                enable_wayland_shared=no
+                EXTRA_LDFLAGS="$EXTRA_LDFLAGS $WAYLAND_LIBS"
+            fi
             have_video=yes
         fi
     fi
--- a/configure.in	Wed Jan 08 14:53:08 2014 -0500
+++ b/configure.in	Thu Jan 09 13:56:21 2014 -0300
@@ -1133,8 +1133,8 @@
         video_wayland=no
         if test x$PKG_CONFIG != xno; then
             if $PKG_CONFIG --exists wayland-client wayland-egl wayland-cursor egl xkbcommon ; then
-                WAYLAND_CFLAGS=`$PKG_CONFIG --cflags wayland-client wayland-egl wayland-cursor egl xkbcommon`
-                WAYLAND_LIBS=`$PKG_CONFIG --libs wayland-client wayland-egl wayland-cursor egl xkbcommon`
+                WAYLAND_CFLAGS=`$PKG_CONFIG --cflags wayland-client wayland-egl wayland-cursor xkbcommon`
+                WAYLAND_LIBS=`$PKG_CONFIG --libs wayland-client wayland-egl wayland-cursor xkbcommon`
                 video_wayland=yes
             fi
         fi
@@ -1147,8 +1147,50 @@
             fi
             SOURCES="$SOURCES $srcdir/src/video/wayland/*.c"
             EXTRA_CFLAGS="$EXTRA_CFLAGS $WAYLAND_CFLAGS"
-            dnl FIXME do dynamic loading code here.
-            EXTRA_LDFLAGS="$EXTRA_LDFLAGS $WAYLAND_LIBS"
+            AC_ARG_ENABLE(wayland-shared,
+AC_HELP_STRING([--enable-wayland-shared], [dynamically load Wayland support [[default=maybe]]]),
+                          , enable_wayland_shared=maybe)
+
+            dnl FIXME: Do BSD and OS X need special cases?
+            case "$host" in
+                *)
+                    wayland_client_lib=[`find_lib "libwayland-client.so.*" "$WAYLAND_LIBS" | sed 's/.*\/\(.*\)/\1/; q'`]
+                    wayland_egl_lib=[`find_lib "libwayland-egl.so.*" "$WAYLAND_LIBS" | sed 's/.*\/\(.*\)/\1/; q'`]
+                    if test x$wayland_egl_lib = x; then
+                        dnl This works in Ubuntu 13.10, maybe others
+                        wayland_egl_lib=[`find_lib "mesa-egl/libwayland-egl.so.*" "$WAYLAND_LIBS" | sed 's/.*\/\(.*\)/\1/; q'`]
+                    fi
+                    wayland_cursor_lib=[`find_lib "libwayland-cursor.so.*" "$WAYLAND_LIBS" | sed 's/.*\/\(.*\)/\1/; q'`]
+                    xkbcommon_lib=[`find_lib "libxkbcommon.so.*" "$WAYLAND_LIBS" | sed 's/.*\/\(.*\)/\1/; q'`]
+                    ;;
+            esac
+
+            if test x$enable_wayland_shared = xmaybe; then
+                enable_wayland_shared=yes
+            fi
+            if test x$have_loadso != xyes && \
+               test x$enable_wayland_shared = xyes; then
+                AC_MSG_WARN([You must have SDL_LoadObject() support for dynamic WAYLAND loading])
+                enable_wayland_shared=no
+            fi
+            if test x$have_loadso = xyes && \
+               test x$enable_wayland_shared = xyes && \
+               test x$wayland_client_lib != x && \
+               test x$wayland_egl_lib != x && \
+               test x$wayland_cursor_lib != x && \
+               test x$xkbcommon_lib != x; then
+                echo "-- dynamic libwayland-client -> $wayland_client_lib"
+                echo "-- dynamic libwayland-egl -> $wayland_egl_lib"
+                echo "-- dynamic libwayland-cursor -> $wayland_cursor_lib"
+                echo "-- dynamic xkbcommon -> $xkbcommon_lib"
+                AC_DEFINE_UNQUOTED(SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC, "$wayland_client_lib", [ ])
+                AC_DEFINE_UNQUOTED(SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_EGL, "$wayland_egl_lib", [ ])
+                AC_DEFINE_UNQUOTED(SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_CURSOR, "$wayland_cursor_lib", [ ])
+                AC_DEFINE_UNQUOTED(SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_XKBCOMMON, "$xkbcommon_lib", [ ])
+            else
+                enable_wayland_shared=no
+                EXTRA_LDFLAGS="$EXTRA_LDFLAGS $WAYLAND_LIBS"
+            fi
             have_video=yes
         fi
     fi
--- a/include/SDL_config.h.in	Wed Jan 08 14:53:08 2014 -0500
+++ b/include/SDL_config.h.in	Thu Jan 09 13:56:21 2014 -0300
@@ -263,6 +263,10 @@
 #undef SDL_VIDEO_DRIVER_WINDOWS
 #undef SDL_VIDEO_DRIVER_WAYLAND
 #undef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH
+#undef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC
+#undef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_EGL
+#undef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_CURSOR
+#undef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_XKBCOMMON
 #undef SDL_VIDEO_DRIVER_X11
 #undef SDL_VIDEO_DRIVER_RPI
 #undef SDL_VIDEO_DRIVER_X11_DYNAMIC
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/video/wayland/SDL_waylanddyn.c	Thu Jan 09 13:56:21 2014 -0300
@@ -0,0 +1,195 @@
+/*
+  Simple DirectMedia Layer
+  Copyright (C) 1997-2013 Sam Lantinga <slouken@libsdl.org>
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
+  3. This notice may not be removed or altered from any source distribution.
+*/
+#include "../../SDL_internal.h"
+
+#if SDL_VIDEO_DRIVER_WAYLAND
+
+#define DEBUG_DYNAMIC_WAYLAND 0
+
+#include "SDL_waylanddyn.h"
+
+#if DEBUG_DYNAMIC_WAYLAND
+#include "SDL_log.h"
+#endif
+
+#ifdef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC
+
+#include "SDL_name.h"
+#include "SDL_loadso.h"
+
+typedef struct
+{
+    void *lib;
+    const char *libname;
+} waylanddynlib;
+
+#ifndef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC
+#define SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC NULL
+#endif
+#ifndef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_EGL
+#define SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_EGL NULL
+#endif
+#ifndef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_CURSOR
+#define SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_CURSOR NULL
+#endif
+#ifndef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_XKBCOMMON
+#define SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_XKBCOMMON NULL
+#endif
+
+static waylanddynlib waylandlibs[] = {
+    {NULL, SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC},
+    {NULL, SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_EGL},
+    {NULL, SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_CURSOR},
+    {NULL, SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_XKBCOMMON}
+};
+
+static void *
+WAYLAND_GetSym(const char *fnname, int *pHasModule)
+{
+    int i;
+    void *fn = NULL;
+    for (i = 0; i < SDL_TABLESIZE(waylandlibs); i++) {
+        if (waylandlibs[i].lib != NULL) {
+            fn = SDL_LoadFunction(waylandlibs[i].lib, fnname);
+            if (fn != NULL)
+                break;
+        }
+    }
+
+#if DEBUG_DYNAMIC_WAYLAND
+    if (fn != NULL)
+        SDL_Log("WAYLAND: Found '%s' in %s (%p)\n", fnname, waylandlibs[i].libname, fn);
+    else
+        SDL_Log("WAYLAND: Symbol '%s' NOT FOUND!\n", fnname);
+#endif
+
+    if (fn == NULL)
+        *pHasModule = 0;  /* kill this module. */
+
+    return fn;
+}
+
+#endif /* SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC */
+
+/* Define all the function pointers and wrappers... */
+#define SDL_WAYLAND_MODULE(modname) int SDL_WAYLAND_HAVE_##modname = 0;
+#define SDL_WAYLAND_SYM(rc,fn,params) SDL_DYNWAYLANDFN_##fn WAYLAND_##fn = NULL;
+#define SDL_WAYLAND_INTERFACE(iface) const struct wl_interface *WAYLAND_##iface = NULL;
+#include "SDL_waylandsym.h"
+#undef SDL_WAYLAND_MODULE
+#undef SDL_WAYLAND_SYM
+#undef SDL_WAYLAND_INTERFACE
+
+static int wayland_load_refcount = 0;
+
+void
+SDL_WAYLAND_UnloadSymbols(void)
+{
+    /* Don't actually unload if more than one module is using the libs... */
+    if (wayland_load_refcount > 0) {
+        if (--wayland_load_refcount == 0) {
+#ifdef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC            
+            int i;
+#endif
+            
+            /* set all the function pointers to NULL. */
+#define SDL_WAYLAND_MODULE(modname) SDL_WAYLAND_HAVE_##modname = 0;
+#define SDL_WAYLAND_SYM(rc,fn,params) WAYLAND_##fn = NULL;
+#define SDL_WAYLAND_INTERFACE(iface) WAYLAND_##iface = NULL;
+#include "SDL_waylandsym.h"
+#undef SDL_WAYLAND_MODULE
+#undef SDL_WAYLAND_SYM
+#undef SDL_WAYLAND_INTERFACE
+
+
+#ifdef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC
+            for (i = 0; i < SDL_TABLESIZE(waylandlibs); i++) {
+                if (waylandlibs[i].lib != NULL) {
+                    SDL_UnloadObject(waylandlibs[i].lib);
+                    waylandlibs[i].lib = NULL;
+                }
+            }
+#endif
+        }
+    }
+}
+
+/* returns non-zero if all needed symbols were loaded. */
+int
+SDL_WAYLAND_LoadSymbols(void)
+{
+    int rc = 1;                 /* always succeed if not using Dynamic WAYLAND stuff. */
+
+    /* deal with multiple modules (dga, wayland, etc) needing these symbols... */
+    if (wayland_load_refcount++ == 0) {
+#ifdef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC
+        int i;
+        int *thismod = NULL;
+        for (i = 0; i < SDL_TABLESIZE(waylandlibs); i++) {
+            if (waylandlibs[i].libname != NULL) {
+                waylandlibs[i].lib = SDL_LoadObject(waylandlibs[i].libname);
+            }
+        }
+
+#define SDL_WAYLAND_MODULE(modname) SDL_WAYLAND_HAVE_##modname = 1; /* default yes */
+#define SDL_WAYLAND_SYM(rc,fn,params)
+#define SDL_WAYLAND_INTERFACE(iface)
+#include "SDL_waylandsym.h"
+#undef SDL_WAYLAND_MODULE
+#undef SDL_WAYLAND_SYM
+#undef SDL_WAYLAND_INTERFACE
+
+#define SDL_WAYLAND_MODULE(modname) thismod = &SDL_WAYLAND_HAVE_##modname;
+#define SDL_WAYLAND_SYM(rc,fn,params) WAYLAND_##fn = (SDL_DYNWAYLANDFN_##fn) WAYLAND_GetSym(#fn,thismod);
+#define SDL_WAYLAND_INTERFACE(iface) WAYLAND_##iface = (struct wl_interface *) WAYLAND_GetSym(#iface,thismod);
+#include "SDL_waylandsym.h"
+#undef SDL_WAYLAND_MODULE
+#undef SDL_WAYLAND_SYM
+#undef SDL_WAYLAND_INTERFACE
+
+        if (SDL_WAYLAND_HAVE_WAYLAND_CLIENT) {
+            /* all required symbols loaded. */
+            SDL_ClearError();
+        } else {
+            /* in case something got loaded... */
+            SDL_WAYLAND_UnloadSymbols();
+            rc = 0;
+        }
+
+#else  /* no dynamic WAYLAND */
+
+#define SDL_WAYLAND_MODULE(modname) SDL_WAYLAND_HAVE_##modname = 1; /* default yes */
+#define SDL_WAYLAND_SYM(rc,fn,params) WAYLAND_##fn = fn;
+#define SDL_WAYLAND_INTERFACE(iface) WAYLAND_##iface = &iface;
+#include "SDL_waylandsym.h"
+#undef SDL_WAYLAND_MODULE
+#undef SDL_WAYLAND_SYM
+#undef SDL_WAYLAND_INTERFACE
+
+#endif
+    }
+
+    return rc;
+}
+
+#endif /* SDL_VIDEO_DRIVER_WAYLAND */
+
+/* vi: set ts=4 sw=4 expandtab: */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/video/wayland/SDL_waylanddyn.h	Thu Jan 09 13:56:21 2014 -0300
@@ -0,0 +1,103 @@
+/*
+  Simple DirectMedia Layer
+  Copyright (C) 1997-2013 Sam Lantinga <slouken@libsdl.org>
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
+  3. This notice may not be removed or altered from any source distribution.
+*/
+
+#ifndef _SDL_waylanddyn_h
+#define _SDL_waylanddyn_h
+
+#include "../../SDL_internal.h"
+
+/* We can't include wayland-client.h here 
+ * but we need some structs from it
+ */
+struct wl_interface;
+struct wl_proxy;
+struct wl_event_queue;
+struct wl_display;
+struct wl_surface;
+struct wl_shm;
+
+#include <stdint.h>
+#include "wayland-cursor.h"
+#include "wayland-util.h"
+#include "xkbcommon/xkbcommon.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+int SDL_WAYLAND_LoadSymbols(void);
+void SDL_WAYLAND_UnloadSymbols(void);
+
+#define SDL_WAYLAND_MODULE(modname) extern int SDL_WAYLAND_HAVE_##modname;
+#define SDL_WAYLAND_SYM(rc,fn,params) \
+    typedef rc (*SDL_DYNWAYLANDFN_##fn) params; \
+    extern SDL_DYNWAYLANDFN_##fn WAYLAND_##fn;
+#define SDL_WAYLAND_INTERFACE(iface) extern const struct wl_interface *WAYLAND_##iface;
+#include "SDL_waylandsym.h"
+#undef SDL_WAYLAND_MODULE
+#undef SDL_WAYLAND_SYM
+#undef SDL_WAYLAND_INTERFACE
+ 
+
+#ifdef __cplusplus
+}
+#endif
+
+#ifdef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC
+
+#ifdef _WAYLAND_CLIENT_H
+#error Do not include wayland-client ahead of SDL_waylanddyn.h in dynamic loading mode
+#endif
+
+/* wayland-client-protocol.h included from wayland-client.h
+ * has inline functions that require these to be defined in dynamic loading mode
+ */
+
+#define wl_proxy_create (*WAYLAND_wl_proxy_create)
+#define wl_proxy_destroy (*WAYLAND_wl_proxy_destroy)
+#define wl_proxy_marshal (*WAYLAND_wl_proxy_marshal)
+#define wl_proxy_set_user_data (*WAYLAND_wl_proxy_set_user_data)
+#define wl_proxy_get_user_data (*WAYLAND_wl_proxy_get_user_data)
+#define wl_proxy_add_listener (*WAYLAND_wl_proxy_add_listener)
+
+#define wl_seat_interface (*WAYLAND_wl_seat_interface)
+#define wl_surface_interface (*WAYLAND_wl_surface_interface)
+#define wl_shm_pool_interface (*WAYLAND_wl_shm_pool_interface)
+#define wl_buffer_interface (*WAYLAND_wl_buffer_interface)
+#define wl_registry_interface (*WAYLAND_wl_registry_interface)
+#define wl_shell_surface_interface (*WAYLAND_wl_shell_surface_interface)
+#define wl_region_interface (*WAYLAND_wl_region_interface)
+#define wl_pointer_interface (*WAYLAND_wl_pointer_interface)
+#define wl_keyboard_interface (*WAYLAND_wl_keyboard_interface)
+#define wl_compositor_interface (*WAYLAND_wl_compositor_interface)
+#define wl_output_interface (*WAYLAND_wl_output_interface)
+#define wl_shell_interface (*WAYLAND_wl_shell_interface)
+#define wl_shm_interface (*WAYLAND_wl_shm_interface)
+
+#endif /* SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC */
+
+#include "wayland-client.h"
+#include "wayland-egl.h"
+
+#endif /* !defined _SDL_waylanddyn_h */
+
+/* vi: set ts=4 sw=4 expandtab: */
--- a/src/video/wayland/SDL_waylandevents.c	Wed Jan 08 14:53:08 2014 -0500
+++ b/src/video/wayland/SDL_waylandevents.c	Thu Jan 09 13:56:21 2014 -0300
@@ -19,7 +19,7 @@
   3. This notice may not be removed or altered from any source distribution.
 */
 
-#include "SDL_config.h"
+#include "../../SDL_internal.h"
 
 #include "SDL_stdinc.h"
 #include "SDL_assert.h"
@@ -32,6 +32,8 @@
 #include "SDL_waylandevents_c.h"
 #include "SDL_waylandwindow.h"
 
+#include "SDL_waylanddyn.h"
+
 #include <linux/input.h>
 #include <sys/select.h>
 #include <sys/mman.h>
@@ -60,14 +62,14 @@
     SDL_VideoData *d = _this->driverdata;
     struct pollfd pfd[1];
 
-    pfd[0].fd = wl_display_get_fd(d->display);
+    pfd[0].fd = WAYLAND_wl_display_get_fd(d->display);
     pfd[0].events = POLLIN;
     poll(pfd, 1, 0);
 
     if (pfd[0].revents & POLLIN)
-        wl_display_dispatch(d->display);
+        WAYLAND_wl_display_dispatch(d->display);
     else
-        wl_display_dispatch_pending(d->display);
+        WAYLAND_wl_display_dispatch_pending(d->display);
 }
 
 static void
@@ -199,7 +201,7 @@
         return;
     }
 
-    input->xkb.keymap = xkb_map_new_from_string(input->display->xkb_context,
+    input->xkb.keymap = WAYLAND_xkb_keymap_new_from_string(input->display->xkb_context,
                                                 map_str,
                                                 XKB_KEYMAP_FORMAT_TEXT_V1,
                                                 0);
@@ -211,10 +213,10 @@
         return;
     }
 
-    input->xkb.state = xkb_state_new(input->xkb.keymap);
+    input->xkb.state = WAYLAND_xkb_state_new(input->xkb.keymap);
     if (!input->xkb.state) {
         fprintf(stderr, "failed to create XKB state\n");
-        xkb_map_unref(input->xkb.keymap);
+        WAYLAND_xkb_keymap_unref(input->xkb.keymap);
         input->xkb.keymap = NULL;
         return;
     }
@@ -266,11 +268,11 @@
         return;
 
     // TODO can this happen?
-    if (xkb_key_get_syms(input->xkb.state, key + 8, &syms) != 1)
+    if (WAYLAND_xkb_state_key_get_syms(input->xkb.state, key + 8, &syms) != 1)
         return;
 
     if (state) {
-        size = xkb_keysym_to_utf8(syms[0], text, sizeof text);
+        size = WAYLAND_xkb_keysym_to_utf8(syms[0], text, sizeof text);
 
         if (size > 0) {
             text[size] = 0;
@@ -287,7 +289,7 @@
 {
     struct SDL_WaylandInput *input = data;
 
-    xkb_state_update_mask(input->xkb.state, mods_depressed, mods_latched,
+    WAYLAND_xkb_state_update_mask(input->xkb.state, mods_depressed, mods_latched,
                           mods_locked, 0, 0, group);
 }
 
@@ -349,7 +351,7 @@
     wl_seat_add_listener(input->seat, &seat_listener, input);
     wl_seat_set_user_data(input->seat, input);
 
-    wayland_schedule_write(d);
+    WAYLAND_wl_display_flush(d->display);
 }
 
 void Wayland_display_destroy_input(SDL_VideoData *d)
@@ -369,10 +371,10 @@
         wl_seat_destroy(input->seat);
 
     if (input->xkb.state)
-        xkb_state_unref(input->xkb.state);
+        WAYLAND_xkb_state_unref(input->xkb.state);
 
     if (input->xkb.keymap)
-        xkb_map_unref(input->xkb.keymap);
+        WAYLAND_xkb_keymap_unref(input->xkb.keymap);
 
     free(input);
     d->input = NULL;
--- a/src/video/wayland/SDL_waylandevents_c.h	Wed Jan 08 14:53:08 2014 -0500
+++ b/src/video/wayland/SDL_waylandevents_c.h	Thu Jan 09 13:56:21 2014 -0300
@@ -19,7 +19,7 @@
   3. This notice may not be removed or altered from any source distribution.
 */
 
-#include "SDL_config.h"
+#include "../../SDL_internal.h"
 
 #ifndef _SDL_waylandevents_h
 #define _SDL_waylandevents_h
--- a/src/video/wayland/SDL_waylandmouse.c	Wed Jan 08 14:53:08 2014 -0500
+++ b/src/video/wayland/SDL_waylandmouse.c	Thu Jan 09 13:56:21 2014 -0300
@@ -31,14 +31,17 @@
 #include <stdlib.h>
 #include <limits.h>
 
+#include "../../SDL_internal.h"
 #include "../SDL_sysvideo.h"
 
-#include "SDL_config.h"
 #include "SDL_mouse.h"
 #include "../../events/SDL_mouse_c.h"
 #include "SDL_waylandvideo.h"
 #include "SDL_waylandevents_c.h"
 
+#include "SDL_waylanddyn.h"
+#include "wayland-cursor.h"
+
 #include "SDL_assert.h"
 
 #if SDL_VIDEO_DRIVER_WAYLAND
@@ -210,7 +213,7 @@
         data->buffer = NULL;
         data->surface = wl_compositor_create_surface(d->compositor);
         wl_surface_attach(data->surface,
-                          wl_cursor_image_get_buffer(wlcursor->images[0]),
+                          WAYLAND_wl_cursor_image_get_buffer(wlcursor->images[0]),
                           0,
                           0);
         wl_surface_damage(data->surface,
@@ -236,7 +239,7 @@
     SDL_VideoData *data = device->driverdata;
 
     return CreateCursorFromWlCursor (data,
-                                     wl_cursor_theme_get_cursor(data->cursor_theme,
+                                     WAYLAND_wl_cursor_theme_get_cursor(data->cursor_theme,
                                                                 "left_ptr"));
 }
 
@@ -254,40 +257,40 @@
         SDL_assert(0);
         return NULL;
     case SDL_SYSTEM_CURSOR_ARROW:
-        cursor = wl_cursor_theme_get_cursor(d->cursor_theme, "left_ptr");
+        cursor = WAYLAND_wl_cursor_theme_get_cursor(d->cursor_theme, "left_ptr");
         break;
     case SDL_SYSTEM_CURSOR_IBEAM:
-        cursor = wl_cursor_theme_get_cursor(d->cursor_theme, "xterm");
+        cursor = WAYLAND_wl_cursor_theme_get_cursor(d->cursor_theme, "xterm");
         break;
     case SDL_SYSTEM_CURSOR_WAIT:
-        cursor = wl_cursor_theme_get_cursor(d->cursor_theme, "wait");
+        cursor = WAYLAND_wl_cursor_theme_get_cursor(d->cursor_theme, "wait");
         break;
     case SDL_SYSTEM_CURSOR_CROSSHAIR:
-        cursor = wl_cursor_theme_get_cursor(d->cursor_theme, "hand1");
+        cursor = WAYLAND_wl_cursor_theme_get_cursor(d->cursor_theme, "hand1");
         break;
     case SDL_SYSTEM_CURSOR_WAITARROW:
-        cursor = wl_cursor_theme_get_cursor(d->cursor_theme, "wait");
+        cursor = WAYLAND_wl_cursor_theme_get_cursor(d->cursor_theme, "wait");
         break;
     case SDL_SYSTEM_CURSOR_SIZENWSE:
-        cursor = wl_cursor_theme_get_cursor(d->cursor_theme, "hand1");
+        cursor = WAYLAND_wl_cursor_theme_get_cursor(d->cursor_theme, "hand1");
         break;
     case SDL_SYSTEM_CURSOR_SIZENESW:
-        cursor = wl_cursor_theme_get_cursor(d->cursor_theme, "hand1");
+        cursor = WAYLAND_wl_cursor_theme_get_cursor(d->cursor_theme, "hand1");
         break;
     case SDL_SYSTEM_CURSOR_SIZEWE:
-        cursor = wl_cursor_theme_get_cursor(d->cursor_theme, "hand1");
+        cursor = WAYLAND_wl_cursor_theme_get_cursor(d->cursor_theme, "hand1");
         break;
     case SDL_SYSTEM_CURSOR_SIZENS:
-        cursor = wl_cursor_theme_get_cursor(d->cursor_theme, "hand1");
+        cursor = WAYLAND_wl_cursor_theme_get_cursor(d->cursor_theme, "hand1");
         break;
     case SDL_SYSTEM_CURSOR_SIZEALL:
-        cursor = wl_cursor_theme_get_cursor(d->cursor_theme, "hand1");
+        cursor = WAYLAND_wl_cursor_theme_get_cursor(d->cursor_theme, "hand1");
         break;
     case SDL_SYSTEM_CURSOR_NO:
-        cursor = wl_cursor_theme_get_cursor(d->cursor_theme, "xterm");
+        cursor = WAYLAND_wl_cursor_theme_get_cursor(d->cursor_theme, "xterm");
         break;
     case SDL_SYSTEM_CURSOR_HAND:
-        cursor = wl_cursor_theme_get_cursor(d->cursor_theme, "hand1");
+        cursor = WAYLAND_wl_cursor_theme_get_cursor(d->cursor_theme, "hand1");
         break;
     }
 
--- a/src/video/wayland/SDL_waylandmouse.h	Wed Jan 08 14:53:08 2014 -0500
+++ b/src/video/wayland/SDL_waylandmouse.h	Thu Jan 09 13:56:21 2014 -0300
@@ -19,7 +19,7 @@
   3. This notice may not be removed or altered from any source distribution.
 */
 
-#include "SDL_config.h"
+#include "../../SDL_internal.h"
 #include "SDL_mouse.h"
 #include "SDL_waylandvideo.h"
 
--- a/src/video/wayland/SDL_waylandopengles.c	Wed Jan 08 14:53:08 2014 -0500
+++ b/src/video/wayland/SDL_waylandopengles.c	Thu Jan 09 13:56:21 2014 -0300
@@ -18,7 +18,7 @@
      misrepresented as being the original software.
   3. This notice may not be removed or altered from any source distribution.
 */
-#include "SDL_config.h"
+#include "../../SDL_internal.h"
 
 #if SDL_VIDEO_DRIVER_WAYLAND && SDL_VIDEO_OPENGL_EGL
 
@@ -26,6 +26,7 @@
 #include "SDL_waylandopengles.h"
 #include "SDL_waylandwindow.h"
 #include "SDL_waylandevents_c.h"
+#include "SDL_waylanddyn.h"
 
 /* EGL implementation of SDL OpenGL ES support */
 
@@ -37,7 +38,7 @@
     ret = SDL_EGL_LoadLibrary(_this, path, (NativeDisplayType) data->display);
 
     Wayland_PumpEvents(_this);
-    wayland_schedule_write(data);
+    WAYLAND_wl_display_flush(data->display);
     
     return ret;
 }
@@ -48,7 +49,7 @@
 {
     SDL_GLContext context;
     context = SDL_EGL_CreateContext(_this, ((SDL_WindowData *) window->driverdata)->egl_surface);
-    wayland_schedule_write(_this->driverdata);
+    WAYLAND_wl_display_flush( ((SDL_VideoData*)_this->driverdata)->display );
     
     return context;
 }
@@ -57,7 +58,7 @@
 Wayland_GLES_SwapWindow(_THIS, SDL_Window *window)
 {
     SDL_EGL_SwapBuffers(_this, ((SDL_WindowData *) window->driverdata)->egl_surface);
-    wayland_schedule_write(_this->driverdata);
+    WAYLAND_wl_display_flush( ((SDL_VideoData*)_this->driverdata)->display );
 }
 
 
@@ -73,7 +74,7 @@
         ret = SDL_EGL_MakeCurrent(_this, NULL, NULL);
     }
     
-    wayland_schedule_write(_this->driverdata);
+    WAYLAND_wl_display_flush( ((SDL_VideoData*)_this->driverdata)->display );
     
     return ret;
 }
@@ -82,7 +83,7 @@
 Wayland_GLES_DeleteContext(_THIS, SDL_GLContext context)
 {
     SDL_EGL_DeleteContext(_this, context);
-    wayland_schedule_write(_this->driverdata);
+    WAYLAND_wl_display_flush( ((SDL_VideoData*)_this->driverdata)->display );
 }
 
 #endif /* SDL_VIDEO_DRIVER_WAYLAND && SDL_VIDEO_OPENGL_EGL */
--- a/src/video/wayland/SDL_waylandopengles.h	Wed Jan 08 14:53:08 2014 -0500
+++ b/src/video/wayland/SDL_waylandopengles.h	Thu Jan 09 13:56:21 2014 -0300
@@ -18,7 +18,7 @@
      misrepresented as being the original software.
   3. This notice may not be removed or altered from any source distribution.
 */
-#include "SDL_config.h"
+#include "../../SDL_internal.h"
 
 #ifndef _SDL_waylandopengles_h
 #define _SDL_waylandopengles_h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/video/wayland/SDL_waylandsym.h	Thu Jan 09 13:56:21 2014 -0300
@@ -0,0 +1,102 @@
+/*
+  Simple DirectMedia Layer
+  Copyright (C) 1997-2013 Sam Lantinga <slouken@libsdl.org>
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
+  3. This notice may not be removed or altered from any source distribution.
+*/
+
+/* *INDENT-OFF* */
+
+SDL_WAYLAND_MODULE(WAYLAND_CLIENT)
+SDL_WAYLAND_SYM(void, wl_proxy_marshal, (struct wl_proxy *, uint32_t, ...))
+SDL_WAYLAND_SYM(struct wl_proxy *, wl_proxy_create, (struct wl_proxy *, const struct wl_interface *))
+SDL_WAYLAND_SYM(void, wl_proxy_destroy, (struct wl_proxy *))
+SDL_WAYLAND_SYM(int, wl_proxy_add_listener, (struct wl_proxy *, void (**)(void), void *))
+SDL_WAYLAND_SYM(void, wl_proxy_set_user_data, (struct wl_proxy *, void *))
+SDL_WAYLAND_SYM(void *, wl_proxy_get_user_data, (struct wl_proxy *))
+SDL_WAYLAND_SYM(uint32_t, wl_proxy_get_id, (struct wl_proxy *))
+SDL_WAYLAND_SYM(const char *, wl_proxy_get_class, (struct wl_proxy *))
+SDL_WAYLAND_SYM(void, wl_proxy_set_queue, (struct wl_proxy *, struct wl_event_queue *))
+SDL_WAYLAND_SYM(struct wl_display *, wl_display_connect, (const char *))
+SDL_WAYLAND_SYM(struct wl_display *, wl_display_connect_to_fd, (int))
+SDL_WAYLAND_SYM(void, wl_display_disconnect, (struct wl_display *))
+SDL_WAYLAND_SYM(int, wl_display_get_fd, (struct wl_display *))
+SDL_WAYLAND_SYM(int, wl_display_dispatch, (struct wl_display *))
+SDL_WAYLAND_SYM(int, wl_display_dispatch_queue, (struct wl_display *, struct wl_event_queue *))
+SDL_WAYLAND_SYM(int, wl_display_dispatch_queue_pending, (struct wl_display *, struct wl_event_queue *))
+SDL_WAYLAND_SYM(int, wl_display_dispatch_pending, (struct wl_display *))
+SDL_WAYLAND_SYM(int, wl_display_get_error, (struct wl_display *))
+SDL_WAYLAND_SYM(int, wl_display_flush, (struct wl_display *))
+SDL_WAYLAND_SYM(int, wl_display_roundtrip, (struct wl_display *))
+SDL_WAYLAND_SYM(struct wl_event_queue *, wl_display_create_queue, (struct wl_display *))
+SDL_WAYLAND_SYM(void, wl_log_set_handler_client, (wl_log_func_t))
+SDL_WAYLAND_SYM(void, wl_list_init, (struct wl_list *))
+SDL_WAYLAND_SYM(void, wl_list_insert, (struct wl_list *, struct wl_list *) )
+SDL_WAYLAND_SYM(void, wl_list_remove, (struct wl_list *))
+SDL_WAYLAND_SYM(int, wl_list_length, (const struct wl_list *))
+SDL_WAYLAND_SYM(int, wl_list_empty, (const struct wl_list *))
+SDL_WAYLAND_SYM(void, wl_list_insert_list, (struct wl_list *, struct wl_list *))
+
+SDL_WAYLAND_INTERFACE(wl_seat_interface)
+SDL_WAYLAND_INTERFACE(wl_surface_interface)
+SDL_WAYLAND_INTERFACE(wl_shm_pool_interface)
+SDL_WAYLAND_INTERFACE(wl_buffer_interface)
+SDL_WAYLAND_INTERFACE(wl_registry_interface)
+SDL_WAYLAND_INTERFACE(wl_shell_surface_interface)
+SDL_WAYLAND_INTERFACE(wl_region_interface)
+SDL_WAYLAND_INTERFACE(wl_pointer_interface)
+SDL_WAYLAND_INTERFACE(wl_keyboard_interface)
+SDL_WAYLAND_INTERFACE(wl_compositor_interface)
+SDL_WAYLAND_INTERFACE(wl_output_interface)
+SDL_WAYLAND_INTERFACE(wl_shell_interface)
+SDL_WAYLAND_INTERFACE(wl_shm_interface)
+
+SDL_WAYLAND_MODULE(WAYLAND_EGL)
+SDL_WAYLAND_SYM(struct wl_egl_window *, wl_egl_window_create, (struct wl_surface *, int, int))
+SDL_WAYLAND_SYM(void, wl_egl_window_destroy, (struct wl_egl_window *))
+SDL_WAYLAND_SYM(void, wl_egl_window_resize, (struct wl_egl_window *, int, int, int, int))
+SDL_WAYLAND_SYM(void, wl_egl_window_get_attached_size, (struct wl_egl_window *, int *, int *))
+
+SDL_WAYLAND_MODULE(WAYLAND_CURSOR)
+SDL_WAYLAND_SYM(struct wl_cursor_theme *, wl_cursor_theme_load, (const char *, int , struct wl_shm *))
+SDL_WAYLAND_SYM(void, wl_cursor_theme_destroy, (struct wl_cursor_theme *))
+SDL_WAYLAND_SYM(struct wl_cursor *, wl_cursor_theme_get_cursor, (struct wl_cursor_theme *, const char *))
+SDL_WAYLAND_SYM(struct wl_buffer *, wl_cursor_image_get_buffer, (struct wl_cursor_image *))
+SDL_WAYLAND_SYM(int, wl_cursor_frame, (struct wl_cursor *, uint32_t))
+
+SDL_WAYLAND_MODULE(WAYLAND_XKB)
+SDL_WAYLAND_SYM(int, xkb_state_key_get_syms, (struct xkb_state *, xkb_keycode_t, const xkb_keysym_t **))
+SDL_WAYLAND_SYM(int, xkb_keysym_to_utf8, (xkb_keysym_t, char *, size_t) )
+SDL_WAYLAND_SYM(struct xkb_keymap *, xkb_keymap_new_from_string, (struct xkb_context *, const char *, enum xkb_keymap_format, enum xkb_keymap_compile_flags))
+SDL_WAYLAND_SYM(struct xkb_state *, xkb_state_new, (struct xkb_keymap *) )
+SDL_WAYLAND_SYM(void, xkb_keymap_unref, (struct xkb_keymap *) )
+SDL_WAYLAND_SYM(void, xkb_state_unref, (struct xkb_state *) )
+SDL_WAYLAND_SYM(void, xkb_context_unref, (struct xkb_context *) )
+SDL_WAYLAND_SYM(struct xkb_context *, xkb_context_new, (enum xkb_context_flags flags) )
+SDL_WAYLAND_SYM(enum xkb_state_component, xkb_state_update_mask, (struct xkb_state *state,\
+                      xkb_mod_mask_t depressed_mods,\
+                      xkb_mod_mask_t latched_mods,\
+                      xkb_mod_mask_t locked_mods,\
+                      xkb_layout_index_t depressed_layout,\
+                      xkb_layout_index_t latched_layout,\
+                      xkb_layout_index_t locked_layout) )
+
+
+/* *INDENT-ON* */
+
+/* vi: set ts=4 sw=4 expandtab: */
+//SDL_WAYLAND_SYM(ret, fn, params)
\ No newline at end of file
--- a/src/video/wayland/SDL_waylandtouch.c	Wed Jan 08 14:53:08 2014 -0500
+++ b/src/video/wayland/SDL_waylandtouch.c	Thu Jan 09 13:56:21 2014 -0300
@@ -21,7 +21,7 @@
 
 /* Contributed by Thomas Perl <thomas.perl@jollamobile.com> */
 
-#include "SDL_config.h"
+#include "../../SDL_internal.h"
 
 #ifdef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH
 
@@ -118,6 +118,7 @@
 {
 }
 
+
 /* wayland-qt-touch-extension.c BEGINS */
 
 static const struct qt_touch_extension_listener touch_listener = {
@@ -183,13 +184,23 @@
 
 /* wayland-qt-surface-extension.c BEGINS */
 extern const struct wl_interface qt_extended_surface_interface;
+#ifndef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC
 extern const struct wl_interface wl_surface_interface;
+#endif
 
 static const struct wl_interface *qt_surface_extension_types[] = {
     NULL,
     NULL,
     &qt_extended_surface_interface,
+#ifdef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC
+    /* FIXME: Set this dynamically to (*WAYLAND_wl_surface_interface) ? 
+     * The value comes from auto generated code and does 
+     * not appear to actually be used anywhere
+     */
+    NULL, 
+#else
     &wl_surface_interface,
+#endif    
 };
 
 static const struct wl_message qt_surface_extension_requests[] = {
--- a/src/video/wayland/SDL_waylandtouch.h	Wed Jan 08 14:53:08 2014 -0500
+++ b/src/video/wayland/SDL_waylandtouch.h	Thu Jan 09 13:56:21 2014 -0300
@@ -19,7 +19,7 @@
   3. This notice may not be removed or altered from any source distribution.
 */
 
-#include "SDL_config.h"
+#include "../../SDL_internal.h"
 
 #ifdef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH
 
@@ -29,8 +29,9 @@
 #include "SDL_waylandvideo.h"
 #include <stdint.h>
 #include <stddef.h>
-#include "wayland-client.h"
 #include "wayland-util.h"
+#include "SDL_waylanddyn.h"
+
 
 void Wayland_touch_create(SDL_VideoData *data, uint32_t id);
 void Wayland_touch_destroy(SDL_VideoData *data);
@@ -89,7 +90,7 @@
 static inline void
 qt_surface_extension_destroy(struct qt_surface_extension *qt_surface_extension)
 {
-    wl_proxy_destroy((struct wl_proxy *) qt_surface_extension);
+    WAYLAND_wl_proxy_destroy((struct wl_proxy *) qt_surface_extension);
 }
 
 static inline struct qt_extended_surface *
@@ -102,7 +103,7 @@
     if (!id)
         return NULL;
 
-    wl_proxy_marshal((struct wl_proxy *) qt_surface_extension,
+    WAYLAND_wl_proxy_marshal((struct wl_proxy *) qt_surface_extension,
              QT_SURFACE_EXTENSION_GET_EXTENDED_SURFACE, id, surface);
 
     return (struct qt_extended_surface *) id;
@@ -166,39 +167,39 @@
 static inline void
 qt_extended_surface_set_user_data(struct qt_extended_surface *qt_extended_surface, void *user_data)
 {
-    wl_proxy_set_user_data((struct wl_proxy *) qt_extended_surface, user_data);
+    WAYLAND_wl_proxy_set_user_data((struct wl_proxy *) qt_extended_surface, user_data);
 }
 
 static inline void *
 qt_extended_surface_get_user_data(struct qt_extended_surface *qt_extended_surface)
 {
-    return wl_proxy_get_user_data((struct wl_proxy *) qt_extended_surface);
+    return WAYLAND_wl_proxy_get_user_data((struct wl_proxy *) qt_extended_surface);
 }
 
 static inline void
 qt_extended_surface_destroy(struct qt_extended_surface *qt_extended_surface)
 {
-    wl_proxy_destroy((struct wl_proxy *) qt_extended_surface);
+    WAYLAND_wl_proxy_destroy((struct wl_proxy *) qt_extended_surface);
 }
 
 static inline void
 qt_extended_surface_update_generic_property(struct qt_extended_surface *qt_extended_surface, const char *name, struct wl_array *value)
 {
-    wl_proxy_marshal((struct wl_proxy *) qt_extended_surface,
+    WAYLAND_wl_proxy_marshal((struct wl_proxy *) qt_extended_surface,
              QT_EXTENDED_SURFACE_UPDATE_GENERIC_PROPERTY, name, value);
 }
 
 static inline void
 qt_extended_surface_set_content_orientation(struct qt_extended_surface *qt_extended_surface, int32_t orientation)
 {
-    wl_proxy_marshal((struct wl_proxy *) qt_extended_surface,
+    WAYLAND_wl_proxy_marshal((struct wl_proxy *) qt_extended_surface,
              QT_EXTENDED_SURFACE_SET_CONTENT_ORIENTATION, orientation);
 }
 
 static inline void
 qt_extended_surface_set_window_flags(struct qt_extended_surface *qt_extended_surface, int32_t flags)
 {
-    wl_proxy_marshal((struct wl_proxy *) qt_extended_surface,
+    WAYLAND_wl_proxy_marshal((struct wl_proxy *) qt_extended_surface,
              QT_EXTENDED_SURFACE_SET_WINDOW_FLAGS, flags);
 }
 
@@ -269,25 +270,25 @@
 static inline void
 qt_touch_extension_set_user_data(struct qt_touch_extension *qt_touch_extension, void *user_data)
 {
-    wl_proxy_set_user_data((struct wl_proxy *) qt_touch_extension, user_data);
+    WAYLAND_wl_proxy_set_user_data((struct wl_proxy *) qt_touch_extension, user_data);
 }
 
 static inline void *
 qt_touch_extension_get_user_data(struct qt_touch_extension *qt_touch_extension)
 {
-    return wl_proxy_get_user_data((struct wl_proxy *) qt_touch_extension);
+    return WAYLAND_wl_proxy_get_user_data((struct wl_proxy *) qt_touch_extension);
 }
 
 static inline void
 qt_touch_extension_destroy(struct qt_touch_extension *qt_touch_extension)
 {
-    wl_proxy_destroy((struct wl_proxy *) qt_touch_extension);
+    WAYLAND_wl_proxy_destroy((struct wl_proxy *) qt_touch_extension);
 }
 
 static inline void
 qt_touch_extension_dummy(struct qt_touch_extension *qt_touch_extension)
 {
-    wl_proxy_marshal((struct wl_proxy *) qt_touch_extension,
+    WAYLAND_wl_proxy_marshal((struct wl_proxy *) qt_touch_extension,
              QT_TOUCH_EXTENSION_DUMMY);
 }
 
@@ -324,25 +325,25 @@
 static inline void
 qt_windowmanager_set_user_data(struct qt_windowmanager *qt_windowmanager, void *user_data)
 {
-    wl_proxy_set_user_data((struct wl_proxy *) qt_windowmanager, user_data);
+    WAYLAND_wl_proxy_set_user_data((struct wl_proxy *) qt_windowmanager, user_data);
 }
 
 static inline void *
 qt_windowmanager_get_user_data(struct qt_windowmanager *qt_windowmanager)
 {
-    return wl_proxy_get_user_data((struct wl_proxy *) qt_windowmanager);
+    return WAYLAND_wl_proxy_get_user_data((struct wl_proxy *) qt_windowmanager);
 }
 
 static inline void
 qt_windowmanager_destroy(struct qt_windowmanager *qt_windowmanager)
 {
-    wl_proxy_destroy((struct wl_proxy *) qt_windowmanager);
+    WAYLAND_wl_proxy_destroy((struct wl_proxy *) qt_windowmanager);
 }
 
 static inline void
 qt_windowmanager_open_url(struct qt_windowmanager *qt_windowmanager, uint32_t remaining, const char *url)
 {
-    wl_proxy_marshal((struct wl_proxy *) qt_windowmanager,
+    WAYLAND_wl_proxy_marshal((struct wl_proxy *) qt_windowmanager,
              QT_WINDOWMANAGER_OPEN_URL, remaining, url);
 }
 
--- a/src/video/wayland/SDL_waylandvideo.c	Wed Jan 08 14:53:08 2014 -0500
+++ b/src/video/wayland/SDL_waylandvideo.c	Thu Jan 09 13:56:21 2014 -0300
@@ -19,10 +19,11 @@
   3. This notice may not be removed or altered from any source distribution.
 */
 
-#include "SDL_config.h"
+#include "../../SDL_internal.h"
 
 #include "SDL_video.h"
 #include "SDL_mouse.h"
+#include "SDL_stdinc.h"
 #include "../../events/SDL_events_c.h"
 
 #include "SDL_waylandvideo.h"
@@ -35,6 +36,9 @@
 #include <fcntl.h>
 #include <xkbcommon/xkbcommon.h>
 
+#include "SDL_waylanddyn.h"
+#include <wayland-util.h>
+
 #define WAYLANDVID_DRIVER_NAME "wayland"
 
 struct wayland_mode {
@@ -59,10 +63,12 @@
 Wayland_Available(void)
 {
     struct wl_display *display = NULL;
-
-    display = wl_display_connect(NULL);
-    if (display != NULL) {
-        wl_display_disconnect(display);
+    if (SDL_WAYLAND_LoadSymbols()) {
+        display = WAYLAND_wl_display_connect(NULL);
+        if (display != NULL) {
+            WAYLAND_wl_display_disconnect(display);
+        }
+        SDL_WAYLAND_UnloadSymbols();
     }
 
     return (display != NULL);
@@ -72,12 +78,17 @@
 Wayland_DeleteDevice(SDL_VideoDevice *device)
 {
     SDL_free(device);
+    SDL_WAYLAND_UnloadSymbols();
 }
 
 static SDL_VideoDevice *
 Wayland_CreateDevice(int devindex)
 {
     SDL_VideoDevice *device;
+    
+    if (!SDL_WAYLAND_LoadSymbols()) {
+        return NULL;
+    }
 
     /* Initialize all variables that we clean on shutdown */
     device = SDL_calloc(1, sizeof(SDL_VideoDevice));
@@ -133,13 +144,13 @@
 	    return;
 
     /* Add new mode to the list */
-    mode = SDL_calloc(1, sizeof *mode);
+    mode = (struct wayland_mode *) SDL_calloc(1, sizeof *mode);
 
     if (!mode)
 	return;
 
     mode->mode = m;
-    wl_list_insert(&d->modes_list, &mode->link);
+    WAYLAND_wl_list_insert(&d->modes_list, &mode->link);
 }
 
 static void
@@ -227,7 +238,7 @@
 					const char *interface, uint32_t version)
 {
     SDL_VideoData *d = data;
-
+    
     if (strcmp(interface, "wl_compositor") == 0) {
         d->compositor = wl_registry_bind(d->registry, id, &wl_compositor_interface, 1);
     } else if (strcmp(interface, "wl_output") == 0) {
@@ -239,8 +250,8 @@
         d->shell = wl_registry_bind(d->registry, id, &wl_shell_interface, 1);
     } else if (strcmp(interface, "wl_shm") == 0) {
         d->shm = wl_registry_bind(registry, id, &wl_shm_interface, 1);
-        d->cursor_theme = wl_cursor_theme_load(NULL, 32, d->shm);
-        d->default_cursor = wl_cursor_theme_get_cursor(d->cursor_theme, "left_ptr");
+        d->cursor_theme = WAYLAND_wl_cursor_theme_load(NULL, 32, d->shm);
+        d->default_cursor = WAYLAND_wl_cursor_theme_get_cursor(d->cursor_theme, "left_ptr");
         wl_shm_add_listener(d->shm, &shm_listener, d);
     
 #ifdef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH
@@ -265,7 +276,10 @@
 Wayland_VideoInit(_THIS)
 {
     SDL_VideoData *data;
-
+    SDL_VideoDisplay display;
+    SDL_DisplayMode mode;
+    int i;
+    
     data = malloc(sizeof *data);
     if (data == NULL)
         return 0;
@@ -273,29 +287,41 @@
 
     _this->driverdata = data;
 
-    wl_list_init(&data->modes_list);
+    WAYLAND_wl_list_init(&data->modes_list);
     
-    data->display = wl_display_connect(NULL);
+    data->display = WAYLAND_wl_display_connect(NULL);
     if (data->display == NULL) {
         SDL_SetError("Failed to connect to a Wayland display");
         return 0;
     }
 
     data->registry = wl_display_get_registry(data->display);
+   
+    if ( data->registry == NULL) {
+        SDL_SetError("Failed to get the Wayland registry");
+        return 0;
+    }
+    
     wl_registry_add_listener(data->registry, &registry_listener, data);
 
-    while (data->screen_allocation.width == 0)
-        wl_display_dispatch(data->display);
+    for (i=0; i < 100; i++) {
+        if (data->screen_allocation.width != 0 || WAYLAND_wl_display_get_error(data->display) != 0) {
+            break;
+        }
+        WAYLAND_wl_display_dispatch(data->display);
+    }
+    
+    if (data->screen_allocation.width == 0) {
+        SDL_SetError("Failed while waiting for screen allocation: %d ", WAYLAND_wl_display_get_error(data->display));
+        return 0;
+    }
 
-    data->xkb_context = xkb_context_new(0);
+    data->xkb_context = WAYLAND_xkb_context_new(0);
     if (!data->xkb_context) {
         SDL_SetError("Failed to create XKB context");
         return 0;
     }
 
-    SDL_VideoDisplay display;
-    SDL_DisplayMode mode;
-
     /* Use a fake 32-bpp desktop mode */
     mode.format = SDL_PIXELFORMAT_RGB888;
     mode.w = data->screen_allocation.width;
@@ -311,7 +337,7 @@
 
     Wayland_InitMouse ();
 
-    wayland_schedule_write(data);
+    WAYLAND_wl_display_flush(data->display);
 
     return 0;
 }
@@ -363,7 +389,7 @@
     Wayland_display_destroy_input(data);
 
     if (data->xkb_context) {
-        xkb_context_unref(data->xkb_context);
+        WAYLAND_xkb_context_unref(data->xkb_context);
         data->xkb_context = NULL;
     }
 #ifdef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH
@@ -380,7 +406,7 @@
         wl_shm_destroy(data->shm);
 
     if (data->cursor_theme)
-        wl_cursor_theme_destroy(data->cursor_theme);
+        WAYLAND_wl_cursor_theme_destroy(data->cursor_theme);
 
     if (data->shell)
         wl_shell_destroy(data->shell);
@@ -389,12 +415,12 @@
         wl_compositor_destroy(data->compositor);
 
     if (data->display) {
-        wl_display_flush(data->display);
-        wl_display_disconnect(data->display);
+        WAYLAND_wl_display_flush(data->display);
+        WAYLAND_wl_display_disconnect(data->display);
     }
     
     wl_list_for_each_safe(m, t, &data->modes_list, link) {
-        wl_list_remove(&m->link);
+        WAYLAND_wl_list_remove(&m->link);
         free(m);
     }
 
--- a/src/video/wayland/SDL_waylandvideo.h	Wed Jan 08 14:53:08 2014 -0500
+++ b/src/video/wayland/SDL_waylandvideo.h	Thu Jan 09 13:56:21 2014 -0300
@@ -19,16 +19,13 @@
   3. This notice may not be removed or altered from any source distribution.
 */
 
-#include "SDL_config.h"
+#include "../../SDL_internal.h"
 
 #ifndef _SDL_waylandvideo_h
 #define _SDL_waylandvideo_h
 
-#include <wayland-client.h>
-#include <wayland-cursor.h>
-#include <wayland-egl.h>
-
 #include <EGL/egl.h>
+#include "wayland-util.h"
 
 struct xkb_context;
 struct SDL_WaylandInput;
@@ -72,12 +69,6 @@
     uint32_t shm_formats;
 } SDL_VideoData;
 
-static inline void
-wayland_schedule_write(SDL_VideoData *data)
-{
-    wl_display_flush(data->display);
-}
-
 #endif /* _SDL_nullvideo_h */
 
 /* vi: set ts=4 sw=4 expandtab: */
--- a/src/video/wayland/SDL_waylandwindow.c	Wed Jan 08 14:53:08 2014 -0500
+++ b/src/video/wayland/SDL_waylandwindow.c	Thu Jan 09 13:56:21 2014 -0300
@@ -19,7 +19,7 @@
   3. This notice may not be removed or altered from any source distribution.
 */
 
-#include "SDL_config.h"
+#include "../../SDL_internal.h"
 
 #include "../SDL_sysvideo.h"
 #include "../../events/SDL_windowevents_c.h"
@@ -104,7 +104,7 @@
     else
         wl_shell_surface_set_toplevel(wind->shell_surface);
 
-    wayland_schedule_write(_this->driverdata);
+    WAYLAND_wl_display_flush( ((SDL_VideoData*)_this->driverdata)->display );
 }
 
 void
@@ -120,7 +120,7 @@
     else
         wl_shell_surface_set_toplevel(wind->shell_surface);
 
-    wayland_schedule_write(_this->driverdata);
+    WAYLAND_wl_display_flush( ((SDL_VideoData*)_this->driverdata)->display );
 }
 
 int Wayland_CreateWindow(_THIS, SDL_Window *window)
@@ -162,7 +162,7 @@
                 c->surface_extension, data->surface);
     }
 #endif /* SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH */
-    data->egl_window = wl_egl_window_create(data->surface,
+    data->egl_window = WAYLAND_wl_egl_window_create(data->surface,
                                             window->w, window->h);
 
     /* Create the GLES window surface */
@@ -192,7 +192,7 @@
     wl_surface_set_opaque_region(data->surface, region);
     wl_region_destroy(region);
 
-    wayland_schedule_write(c);
+    WAYLAND_wl_display_flush(c->display);
 
     return 0;
 }
@@ -203,9 +203,9 @@
     SDL_WindowData *wind = window->driverdata;
     struct wl_region *region;
 
-    wl_egl_window_resize(wind->egl_window, window->w, window->h, 0, 0);
+    WAYLAND_wl_egl_window_resize(wind->egl_window, window->w, window->h, 0, 0);
 
-    region = wl_compositor_create_region(data->compositor);
+    region =wl_compositor_create_region(data->compositor);
     wl_region_add(region, 0, 0, window->w, window->h);
     wl_surface_set_opaque_region(wind->surface, region);
     wl_region_destroy(region);
@@ -220,7 +220,7 @@
 
     if (data) {
         SDL_EGL_DestroySurface(_this, wind->egl_surface);
-        wl_egl_window_destroy(wind->egl_window);
+        WAYLAND_wl_egl_window_destroy(wind->egl_window);
 
         if (wind->shell_surface)
             wl_shell_surface_destroy(wind->shell_surface);
@@ -232,7 +232,7 @@
         wl_surface_destroy(wind->surface);
 
         SDL_free(wind);
-        wayland_schedule_write(data);
+        WAYLAND_wl_display_flush(data->display);
     }
 }
 
--- a/src/video/wayland/SDL_waylandwindow.h	Wed Jan 08 14:53:08 2014 -0500
+++ b/src/video/wayland/SDL_waylandwindow.h	Thu Jan 09 13:56:21 2014 -0300
@@ -19,7 +19,7 @@
   3. This notice may not be removed or altered from any source distribution.
 */
 
-#include "SDL_config.h"
+#include "../../SDL_internal.h"
 
 #ifndef _SDL_waylandwindow_h
 #define _SDL_waylandwindow_h