diff --git a/lib/glfw3/keyboard.c b/lib/glfw3/keyboard.c
index b33bcc6..2ebe151 100644
--- a/lib/glfw3/keyboard.c
+++ b/lib/glfw3/keyboard.c
@@ -53,6 +53,12 @@ int rtbuf_lib_init (s_rtbuf_lib *lib)
return 0;
}
+void rtbuf_lib_unload (s_rtbuf_lib *lib)
+{
+ (void) lib;
+ glfwTerminate();
+}
+
double scancode_frequency (int scancode, unsigned int octave)
{
int note = -1;
diff --git a/librtbuf/defs.h b/librtbuf/defs.h
index 0830b88..d71a196 100644
--- a/librtbuf/defs.h
+++ b/librtbuf/defs.h
@@ -36,5 +36,16 @@ typedef enum rtbuf_var_type {
typedef int f_rtbuf_proc (s_rtbuf *rtbuf);
typedef int f_rtbuf_lib_init (s_rtbuf_lib *lib);
+typedef void f_rtbuf_lib_unload (s_rtbuf_lib *lib);
+
+typedef union rtbuf_lib_init {
+ void *ptr;
+ f_rtbuf_lib_init *fun;
+} u_rtbuf_lib_init;
+
+typedef union rtbuf_lib_unload {
+ void *ptr;
+ f_rtbuf_lib_unload *fun;
+} u_rtbuf_lib_unload;
#endif
diff --git a/librtbuf/lib.h b/librtbuf/lib.h
index b5bc91c..619ed25 100644
--- a/librtbuf/lib.h
+++ b/librtbuf/lib.h
@@ -81,6 +81,7 @@ struct rtbuf_lib {
s_rtbuf_proc *proc;
void *lib;
const char *path;
+ f_rtbuf_lib_unload *unload;
};
extern char *g_rtbuf_lib_path[];
diff --git a/librtbuf/rtbuf_lib.c b/librtbuf/rtbuf_lib.c
index 8161020..b8f7858 100644
--- a/librtbuf/rtbuf_lib.c
+++ b/librtbuf/rtbuf_lib.c
@@ -106,6 +106,8 @@ void rtbuf_lib_delete (s_rtbuf_lib *rl)
if (rl->proc) {
rtbuf_proc_delete(rl->proc);
rl->proc = 0;
+ if (rl->unload)
+ rl->unload(rl);
}
data_delete(&g_rtbuf_lib_alloc, rl);
}
@@ -170,10 +172,8 @@ s_rtbuf_lib * rtbuf_lib_load (const char *name)
s_rtbuf_lib *lib = rtbuf_lib_new();
s_rtbuf_lib_proc *proc;
unsigned long *ver;
- union {
- void *ptr;
- f_rtbuf_lib_init *init;
- } init_ptr;
+ u_rtbuf_lib_init init;
+ u_rtbuf_lib_unload unload;
if (!lib)
return 0;
rtbuf_lib_load_path(lib, name);
@@ -189,11 +189,13 @@ s_rtbuf_lib * rtbuf_lib_load (const char *name)
}
lib->name = symbol_intern(name);
/* printf("lib_load name %s\n", lib->name); */
- if ((init_ptr.ptr = dlsym(lib->lib, "rtbuf_lib_init")))
- if (init_ptr.init(lib) < 0) {
+ if ((init.ptr = dlsym(lib->lib, "rtbuf_lib_init")))
+ if (init.fun(lib) < 0) {
rtbuf_lib_delete(lib);
return 0;
}
+ unload.ptr = dlsym(lib->lib, "rtbuf_lib_init");
+ lib->unload = unload.fun;
proc = dlsym(lib->lib, "rtbuf_lib_proc");
lib->proc = rtbuf_proc_new();
assert(lib->proc);