diff --git a/mpanel/CMakeLists.txt b/mpanel/CMakeLists.txt index 01cfd0a..87e78e4 100644 --- a/mpanel/CMakeLists.txt +++ b/mpanel/CMakeLists.txt @@ -2,7 +2,11 @@ include(MDEBase) include(MDEPkgConfig) mde_setup_project(mpanel ${CMAKE_INSTALL_BINDIR}) -mde_pkg_config_add(mpanel libconfig) +target_link_libraries( + mpanel + PRIVATE + xemil +) if(${CMAKE_SYSTEM_NAME} STREQUAL Linux) target_link_libraries( diff --git a/mpanel/module.c b/mpanel/module.c index 2575556..61c87c6 100644 --- a/mpanel/module.c +++ b/mpanel/module.c @@ -1,52 +1,73 @@ #include "mpanel.h" -static void read_config(config_t* cfg, const char* path) { - if(!config_read_file(cfg, path)) { - fprintf(stderr, "MPanel config error: file %s at line %d: %s\n", path, config_error_line(cfg), config_error_text(cfg)); +static void read_config(xemil_t** cfg, const char* path) { + xemil_t* tmp; + + if((tmp = xl_open_file(path)) == NULL || !xl_parse(tmp)) { + fprintf(stderr, "MPanel config error: file %s\n", path); + if(tmp != NULL) xl_close(tmp); + } else { + if((*cfg) != NULL) xl_close(*cfg); + + *cfg = tmp; } } void load_modules(void) { - config_t cfg; - config_setting_t* s; - char* conf = MDEDirectoryConfigPath(); - char* dir = MwDirectoryJoin(conf, "mpanel"); - char* path = MwDirectoryJoin(dir, "mpanelrc"); + xemil_t* cfg = NULL; + char* conf = MDEDirectoryConfigPath(); + char* dir = MwDirectoryJoin(conf, "mpanel"); + char* path = MwDirectoryJoin(dir, "mpanelrc"); free(dir); free(conf); - config_init(&cfg); - config_clear(&cfg); read_config(&cfg, SYSCONFDIR "/mpanel/mpanelrc"); read_config(&cfg, path); free(path); - if((s = config_lookup(&cfg, "Modules")) != NULL && (config_setting_type(s) == CONFIG_TYPE_LIST || config_setting_type(s) == CONFIG_TYPE_ARRAY)) { - int i = 0; - config_setting_t* c; - while((c = config_setting_get_elem(s, i)) != NULL) { - config_setting_t* type; - if(config_setting_type(c) == CONFIG_TYPE_GROUP && (type = config_setting_lookup(c, "Type")) != NULL && config_setting_type(type) == CONFIG_TYPE_STRING) { - char* p; - void* lib; + if(cfg != NULL && cfg->root != NULL) { + xl_node_t* n = cfg->root->first_child; + if(strcmp(cfg->root->name, "Modules") != 0) { + fprintf(stderr, "MPanel config error: Root element has to be Modules\n"); + return; + } - dir = MDEStringConcatenate(LIBDIR "/mpanel/lib", config_setting_get_string(type)); - p = MDEStringConcatenate(dir, "Module.so"); - free(dir); + while(n != NULL) { + if(n->type == XL_NODE_NODE && strcmp(n->name, "Module") == 0) { + char* type = NULL; + xl_attribute_t* attr = n->first_attribute; - if((lib = dlopen(p, RTLD_LOCAL | RTLD_LAZY)) != NULL) { - void (*call)(MwWidget box, config_setting_t* setting) = dlsym(lib, "module"); + while(attr != NULL) { + if(strcmp(attr->key, "Type") == 0) { + type = attr->value; + } - call(box, c); + attr = attr->next; } - free(p); - } - i++; - } - } + if(type != NULL) { + char* p = MDEStringConcatenate("lib", type); + char* p2 = MDEStringConcatenate(p, "Module.so"); + char* s = MwDirectoryJoin(LIBDIR "/mpanel", p2); + void* lib = dlopen(s, RTLD_LAZY | RTLD_LOCAL); - config_destroy(&cfg); + if(lib != NULL) { + void (*module)(MwWidget box, xl_node_t* node) = dlsym(lib, "module"); + + if(module != NULL) module(box, n); + } + + free(s); + free(p2); + free(p); + } + } + + n = n->next; + } + + xl_close(cfg); + } } diff --git a/mpanel/mpanel.h b/mpanel/mpanel.h index fca3f8f..2e779f6 100644 --- a/mpanel/mpanel.h +++ b/mpanel/mpanel.h @@ -8,7 +8,7 @@ #include /* External */ -#include +#include /* Standard */ #include diff --git a/mpanel/mpanelrc.in b/mpanel/mpanelrc.in index c4637d2..321fcfe 100644 --- a/mpanel/mpanelrc.in +++ b/mpanel/mpanelrc.in @@ -1,17 +1,10 @@ -Modules: ( - { - Type = "StartButton"; - }, - { - Type = "Separator"; - }, - { - Type = "TaskBar"; - }, - { - Type = "Separator"; - }, - { - Type = "Time"; - } -); + + + + + + + + + + diff --git a/mpanel/separator/CMakeLists.txt b/mpanel/separator/CMakeLists.txt index ae87556..6df817c 100644 --- a/mpanel/separator/CMakeLists.txt +++ b/mpanel/separator/CMakeLists.txt @@ -2,5 +2,8 @@ include(MDEBase) include(MDEPkgConfig) mde_setup_library(SeparatorModule ${CMAKE_INSTALL_LIBDIR}/mpanel) -mde_pkg_config_add(SeparatorModule libconfig) - +target_link_libraries( + SeparatorModule + PRIVATE + xemil +) diff --git a/mpanel/separator/module.c b/mpanel/separator/module.c index 66538f0..72b045a 100644 --- a/mpanel/separator/module.c +++ b/mpanel/separator/module.c @@ -1,7 +1,7 @@ #include -#include +#include -void module(MwWidget box, config_setting_t* setting) { +void module(MwWidget box, xl_node_t* node) { MwVaCreateWidget(MwSeparatorClass, "separator", box, 0, 0, 0, 0, MwNfixedSize, 10, MwNorientation, MwVERTICAL, diff --git a/mpanel/startbutton/CMakeLists.txt b/mpanel/startbutton/CMakeLists.txt index 402d841..e47261d 100644 --- a/mpanel/startbutton/CMakeLists.txt +++ b/mpanel/startbutton/CMakeLists.txt @@ -2,8 +2,12 @@ include(MDEBase) include(MDEPkgConfig) mde_setup_library(StartButtonModule ${CMAKE_INSTALL_LIBDIR}/mpanel) -mde_pkg_config_add(StartButtonModule libconfig) +target_link_libraries( + StartButtonModule + PRIVATE + xemil +) + mde_pkg_config_add(StartButtonModule inih) mde_math_add(StartButtonModule) - diff --git a/mpanel/startbutton/module.c b/mpanel/startbutton/module.c index 47c9340..669f86b 100644 --- a/mpanel/startbutton/module.c +++ b/mpanel/startbutton/module.c @@ -6,7 +6,7 @@ #define _MILSKO #include #include -#include +#include #include #include @@ -132,9 +132,9 @@ static void call(const char* name, int dir, int symlink, void* user) { if(opaque->name != NULL) { int i; MwMenu mc = NULL, m; - for(i = 0; i < arrlen(opaque->menu->sub); i++) { - if(strcmp(opaque->menu->sub[i]->name, category_mapping[c]) == 0) { - mc = opaque->menu->sub[i]; + for(i = 0; i < arrlen(opaque->menu->sub[0]->sub); i++) { + if(strcmp(opaque->menu->sub[0]->sub[i]->name, category_mapping[c]) == 0) { + mc = opaque->menu->sub[0]->sub[i]; break; } } @@ -145,7 +145,7 @@ static void call(const char* name, int dir, int symlink, void* user) { mc->sub = NULL; mc->wsub = NULL; - arrput(opaque->menu->sub, mc); + arrput(opaque->menu->sub[0]->sub, mc); } for(i = 0; i < arrlen(mc->sub); i++) { @@ -275,7 +275,7 @@ int sort_alphabet(const void* a, const void* b) { return strcmp((*((MwMenu*)a))->name, (*((MwMenu*)b))->name); } -void module(MwWidget box, config_setting_t* setting) { +void module(MwWidget box, xl_node_t* node) { MwLLPixmap closed = NULL; MwLLPixmap opened = NULL; MwWidget btn; @@ -348,15 +348,25 @@ void module(MwWidget box, config_setting_t* setting) { opaque->menu->wsub = NULL; opaque->menu->sub = NULL; + m = malloc(sizeof(*m)); + m->name = MwStringDuplicate("Applications"); + m->keep = 0; + m->wsub = NULL; + m->sub = NULL; + + arrput(opaque->menu->sub, m); + MDEDirectoryScan(DATAROOTDIR "/applications", call, opaque); MDEDirectoryScan("/usr/share/applications", call, opaque); #if defined(__NetBSD__) MDEDirectoryScan("/usr/pkg/share/applications", call, opaque); #endif - qsort(opaque->menu->sub, arrlen(opaque->menu->sub), sizeof(MwMenu), sort_alphabet); - for(i = 0; i < arrlen(opaque->menu->sub); i++) { - qsort(opaque->menu->sub[i]->sub, arrlen(opaque->menu->sub[i]->sub), sizeof(MwMenu), sort_alphabet); + if(arrlen(opaque->menu->sub[0]->sub) > 0) { + qsort(opaque->menu->sub[0]->sub, arrlen(opaque->menu->sub[0]->sub), sizeof(MwMenu), sort_alphabet); + for(i = 0; i < arrlen(opaque->menu->sub[0]->sub); i++) { + qsort(opaque->menu->sub[0]->sub[i]->sub, arrlen(opaque->menu->sub[0]->sub[i]->sub), sizeof(MwMenu), sort_alphabet); + } } btn->opaque = opaque; diff --git a/mpanel/taskbar/CMakeLists.txt b/mpanel/taskbar/CMakeLists.txt index db443f6..cacf319 100644 --- a/mpanel/taskbar/CMakeLists.txt +++ b/mpanel/taskbar/CMakeLists.txt @@ -2,5 +2,8 @@ include(MDEBase) include(MDEPkgConfig) mde_setup_library(TaskBarModule ${CMAKE_INSTALL_LIBDIR}/mpanel) -mde_pkg_config_add(TaskBarModule libconfig) - +target_link_libraries( + TaskBarModule + PRIVATE + xemil +) diff --git a/mpanel/taskbar/module.c b/mpanel/taskbar/module.c index 41bb3f6..d55a6c3 100644 --- a/mpanel/taskbar/module.c +++ b/mpanel/taskbar/module.c @@ -1,6 +1,6 @@ #include -#include +#include -void module(MwWidget box, config_setting_t* setting) { +void module(MwWidget box, xl_node_t* node) { MwWidget b = MwCreateWidget(MwFrameClass, "taskbar", box, 0, 0, 0, 0); } diff --git a/mpanel/time/CMakeLists.txt b/mpanel/time/CMakeLists.txt index f7cf608..d479925 100644 --- a/mpanel/time/CMakeLists.txt +++ b/mpanel/time/CMakeLists.txt @@ -2,5 +2,8 @@ include(MDEBase) include(MDEPkgConfig) mde_setup_library(TimeModule ${CMAKE_INSTALL_LIBDIR}/mpanel) -mde_pkg_config_add(TimeModule libconfig) - +target_link_libraries( + TimeModule + PRIVATE + xemil +) diff --git a/mpanel/time/module.c b/mpanel/time/module.c index 74bf367..7f36cc5 100644 --- a/mpanel/time/module.c +++ b/mpanel/time/module.c @@ -1,5 +1,5 @@ #include -#include +#include #include #include @@ -54,7 +54,7 @@ static void tick(MwWidget handle, void* user, void* client) { free(children); } -void module(MwWidget box, config_setting_t* setting) { +void module(MwWidget box, xl_node_t* node) { MwWidget b = MwVaCreateWidget(MwBoxClass, "time", box, 0, 0, 0, 0, MwNfixedSize, 64, MwNbackground, "#bebdb2",