summaryrefslogtreecommitdiff
path: root/lib/library.c
diff options
context:
space:
mode:
authorJari Vetoniemi <mailroxas@gmail.com>2014-10-25 01:38:30 +0300
committerJari Vetoniemi <mailroxas@gmail.com>2014-10-25 01:38:30 +0300
commit3f5e21a83f525586d1ee5b1bcd04cc2e50350403 (patch)
tree226cb57348ae89bc62df34cfd7ee2afe43f03c45 /lib/library.c
parentf8d97efb8f1bc5a7e764e1bb14f0e97ac36de68d (diff)
downloadbemenu-3f5e21a83f525586d1ee5b1bcd04cc2e50350403.tar.gz
bemenu-3f5e21a83f525586d1ee5b1bcd04cc2e50350403.tar.bz2
bemenu-3f5e21a83f525586d1ee5b1bcd04cc2e50350403.zip
Cleanup wayland renderer and plugin support.
Diffstat (limited to 'lib/library.c')
-rw-r--r--lib/library.c36
1 files changed, 32 insertions, 4 deletions
diff --git a/lib/library.c b/lib/library.c
index 443721c..c7f5e60 100644
--- a/lib/library.c
+++ b/lib/library.c
@@ -36,10 +36,16 @@ load(const char *file, struct bm_renderer *renderer)
if (!(regfun = chckDlLoadSymbol(handle, "register_renderer", &error)))
goto fail;
- renderer->file = bm_strdup(file);
+ const char *name;
+ if (!(name = regfun(&renderer->api)))
+ goto fail;
+
+ if (strcmp(renderer->api.version, BM_VERSION))
+ goto fail;
+
renderer->handle = handle;
- const char *name = regfun(&renderer->api);
- renderer->name = (name ? bm_strdup(name) : NULL);
+ renderer->name = bm_strdup(name);
+ renderer->file = bm_strdup(file);
return true;
fail:
@@ -49,6 +55,13 @@ fail:
return false;
}
+static int
+compare(const void *a, const void *b)
+{
+ const struct bm_renderer *ra = *(struct bm_renderer**)a, *rb = *(struct bm_renderer**)b;
+ return (ra->api.prioritory > rb->api.prioritory);
+}
+
static bool
load_to_list(const char *file)
{
@@ -60,7 +73,12 @@ load_to_list(const char *file)
goto fail;
chckDlUnload(renderer->handle);
- return list_add_item(&renderers, renderer);
+
+ if (!list_add_item(&renderers, renderer))
+ goto fail;
+
+ list_sort(&renderers, compare);
+ return true;
fail:
if (renderer)
@@ -76,6 +94,8 @@ bm_renderer_activate(struct bm_renderer *renderer, struct bm_menu *menu)
if (!load(renderer->file, renderer))
return false;
+ menu->renderer = renderer;
+
if (!renderer->api.constructor(menu))
goto fail;
@@ -83,6 +103,7 @@ bm_renderer_activate(struct bm_renderer *renderer, struct bm_menu *menu)
fail:
chckDlUnload(renderer->handle);
+ menu->renderer = NULL;
return false;
}
@@ -155,4 +176,11 @@ bm_renderer_get_name(const struct bm_renderer *renderer)
return renderer->name;
}
+enum bm_prioritory
+bm_renderer_get_prioritory(const struct bm_renderer *renderer)
+{
+ assert(renderer);
+ return renderer->api.prioritory;
+}
+
/* vim: set ts=8 sw=4 tw=0 :*/