diff options
author | Jari Vetoniemi <mailroxas@gmail.com> | 2014-10-25 01:38:30 +0300 |
---|---|---|
committer | Jari Vetoniemi <mailroxas@gmail.com> | 2014-10-25 01:38:30 +0300 |
commit | 3f5e21a83f525586d1ee5b1bcd04cc2e50350403 (patch) | |
tree | 226cb57348ae89bc62df34cfd7ee2afe43f03c45 /lib/library.c | |
parent | f8d97efb8f1bc5a7e764e1bb14f0e97ac36de68d (diff) | |
download | bemenu-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.c | 36 |
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 :*/ |