diff options
Diffstat (limited to 'gtk/PlatGTK.cxx')
-rw-r--r-- | gtk/PlatGTK.cxx | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/gtk/PlatGTK.cxx b/gtk/PlatGTK.cxx index aa0fb3659..d0778c707 100644 --- a/gtk/PlatGTK.cxx +++ b/gtk/PlatGTK.cxx @@ -9,6 +9,7 @@ #include <stddef.h> #include <glib.h> +#include <gmodule.h> #include <gdk/gdk.h> #include <gtk/gtk.h> #include <gdk/gdkkeysyms.h> @@ -1918,6 +1919,41 @@ ElapsedTime::ElapsedTime() { littleBit = curTime.tv_usec; } +class DynamicLibraryImpl : public DynamicLibrary { +protected: + GModule* m; +public: + DynamicLibraryImpl(const char *modulePath) { + m = g_module_open(modulePath, G_MODULE_BIND_LAZY); + } + + virtual ~DynamicLibraryImpl() { + if (m != NULL) + g_module_close(m); + } + + // Use g_module_symbol to get a pointer to the relevant function. + virtual Function *FindFunction(const char *name) { + if (m != NULL) { + gpointer fn_address = NULL; + gboolean status = g_module_symbol(m, name, &fn_address); + if (status) + return static_cast<Function*>( fn_address ); + else + return NULL; + } else + return NULL; + } + + virtual bool IsValid() { + return m != NULL; + } +}; + +DynamicLibrary *DynamicLibrary::Load(const char *modulePath) { + return static_cast<DynamicLibrary *>( new DynamicLibraryImpl(modulePath) ); +} + double ElapsedTime::Duration(bool reset) { GTimeVal curTime; g_get_current_time(&curTime); |