move binds file to another function

This commit is contained in:
speedie 2023-07-03 21:58:32 +02:00
parent f1b0ecd624
commit b06ea39b11
2 changed files with 221 additions and 204 deletions

View file

@ -2,10 +2,219 @@
#include <libconfig.h>
#include "../theme/theme.c"
int bind_init(void) {
char *xdg_conf;
char *bindfile = NULL;
char *home = NULL;
const char *dest;
int ret = 0;
if (!bindsfile || !strcmp(bindsfile, "NULL")) {
if (!(xdg_conf = getenv("XDG_CONFIG_HOME"))) {
home = getenv("HOME");
if (!(bindfile = malloc(snprintf(NULL, 0, "%s/%s", home, ".config/spmenu/binds.conf") + 1))) {
die("spmenu: failed to malloc bindfile");
}
sprintf(bindfile, "%s/%s", home, ".config/spmenu/binds.conf");
} else {
if (!(bindfile = malloc(snprintf(NULL, 0, "%s/%s", xdg_conf, "spmenu/binds.conf") + 1))) {
die("spmenu: failed to malloc bindfile");
}
sprintf(bindfile, "%s/%s", xdg_conf, "spmenu/binds.conf");
}
} else { // custom keys path
if (!(bindfile = malloc(snprintf(NULL, 0, "%s", bindsfile) + 1))) {
die("spmenu: failed to malloc bindfile");
}
sprintf(bindfile, "%s", bindsfile);
}
// don't bother trying to load if it doesn't exist.
if (access(bindfile, F_OK) != 0) {
return ret;
}
// init config
config_t bind;
config_init(&bind);
// attempt to read config file to cfg
if (!config_read_file(&bind, bindfile)) {
// invalid configuration, but let's try to read it anyway
fprintf(stderr, "spmenu: Invalid keys file.\n");
}
// load options binds.keys
config_setting_t *key_bind = config_lookup(&bind, "bind.keys");
if (key_bind != NULL && loadbinds) {
int nmode = 0;
ret = 1;
for (unsigned int i = 0; i < config_setting_length(key_bind); ++i) {
config_setting_t *conf = config_setting_get_elem(key_bind, i);
// look up
config_setting_lookup_string(conf, "modifier", &dest);
#if USEX
for (int j = 0; j < LENGTH(ml); j++) {
if (!strcmp(ml[j].mod, strdup(dest))) {
ckeys[i].mod = ml[j].modifier;
}
}
#endif
#if USEWAYLAND
for (int j = 0; j < LENGTH(wml); j++) {
if (!strcmp(wml[j].mod, strdup(dest))) {
wl_ckeys[i].modifier = wml[j].modifier;
}
}
#endif
if (config_setting_lookup_int(conf, "mode", &nmode)) {
#if USEX
ckeys[i].mode = nmode;
#endif
#if USEWAYLAND
wl_ckeys[i].mode = nmode;
#endif
}
config_setting_lookup_string(conf, "key", &dest);
#if USEX
for (int j = 0; j < LENGTH(kl); j++) {
if (!strcmp(kl[j].key, strdup(dest))) {
ckeys[i].keysym = kl[j].keysym;
}
}
#endif
#if USEWAYLAND
for (int j = 0; j < LENGTH(wkl); j++) {
if (!strcmp(wkl[j].key, strdup(dest))) {
wl_ckeys[i].keysym = wkl[j].keysym;
}
}
#endif
config_setting_lookup_string(conf, "function", &dest);
for (int j = 0; j < LENGTH(fl); j++) {
if (!strcmp(fl[j].function, strdup(dest))) {
#if USEX
ckeys[i].func = fl[j].func;
#endif
#if USEWAYLAND
wl_ckeys[i].func = fl[j].func;
#endif
}
}
config_setting_lookup_string(conf, "argument", &dest);
for (int j = 0; j < LENGTH(al); j++) {
if (!strcmp(al[j].argument, strdup(dest))) {
#if USEX
ckeys[i].arg = al[j].arg;
#endif
#if USEWAYLAND
wl_ckeys[i].arg = al[j].arg;
#endif
}
}
config_setting_lookup_int(conf, "ignoreglobalkeys", &sp.ignoreglobalkeys);
}
}
// load options binds.mouse
config_setting_t *mouse_bind = config_lookup(&bind, "bind.mouse");
if (mouse_bind != NULL && loadbinds) {
#if USEX
ret = 1;
#endif
for (unsigned int i = 0; i < config_setting_length(mouse_bind); ++i) {
config_setting_t *conf = config_setting_get_elem(mouse_bind, i);
config_setting_lookup_string(conf, "click", &dest);
for (int j = 0; j < LENGTH(ctp); j++) {
if (!strcmp(ctp[j].tclick, strdup(dest))) {
#if USEX
cbuttons[i].click = ctp[j].click;
#endif
#if USEWAYLAND
wl_cbuttons[i].click = ctp[j].click;
#endif
}
}
config_setting_lookup_string(conf, "button", &dest);
#if USEX
for (int j = 0; j < LENGTH(btp); j++) {
if (!strcmp(btp[j].click, strdup(dest))) {
cbuttons[i].button = btp[j].button;
}
}
#endif
#if USEWAYLAND
for (int j = 0; j < LENGTH(w_btp); j++) {
if (!strcmp(w_btp[j].click, strdup(dest))) {
wl_cbuttons[i].button = w_btp[j].button;
}
}
#endif
config_setting_lookup_string(conf, "function", &dest);
for (int j = 0; j < LENGTH(fl); j++) {
if (!strcmp(fl[j].function, strdup(dest))) {
#if USEX
cbuttons[i].func = fl[j].func;
#endif
#if USEWAYLAND
wl_cbuttons[i].func = fl[j].func;
#endif
}
}
config_setting_lookup_string(conf, "argument", &dest);
for (int j = 0; j < LENGTH(al); j++) {
if (!strcmp(al[j].argument, strdup(dest))) {
#if USEX
cbuttons[i].arg = al[j].arg;
#endif
#if USEWAYLAND
wl_cbuttons[i].arg = al[j].arg;
#endif
}
}
config_setting_lookup_int(conf, "ignoreglobalmouse", &sp.ignoreglobalmouse);
}
}
// finally done
config_destroy(&bind);
return ret;
}
void conf_init(void) {
char *xdg_conf;
char *cfgfile = NULL;
char *bindfile = NULL;
char *home = NULL;
const char *dest;
@ -596,12 +805,18 @@ void conf_init(void) {
}
}
int ret = bind_init();
// load options spmenu.keys
config_setting_t *key_setting = config_lookup(&cfg, "spmenu.keys");
if (key_setting != NULL && loadconfig) {
int nmode = 0;
for (unsigned int i = 0; i < config_setting_length(key_setting); ++i) {
if (ret) {
break;
}
config_setting_t *conf = config_setting_get_elem(key_setting, i);
// look up
@ -684,6 +899,10 @@ void conf_init(void) {
config_setting_t *mouse_setting = config_lookup(&cfg, "spmenu.mouse");
if (mouse_setting != NULL && loadconfig) {
for (unsigned int i = 0; i < config_setting_length(mouse_setting); ++i) {
if (ret) {
break;
}
config_setting_t *conf = config_setting_get_elem(mouse_setting, i);
config_setting_lookup_string(conf, "click", &dest);
@ -755,208 +974,5 @@ void conf_init(void) {
theme_load();
}
if (!bindsfile || !strcmp(bindsfile, "NULL")) {
if (!(xdg_conf = getenv("XDG_CONFIG_HOME"))) {
home = getenv("HOME");
if (!(bindfile = malloc(snprintf(NULL, 0, "%s/%s", home, ".config/spmenu/binds.conf") + 1))) {
die("spmenu: failed to malloc bindfile");
}
sprintf(bindfile, "%s/%s", home, ".config/spmenu/binds.conf");
} else {
if (!(bindfile = malloc(snprintf(NULL, 0, "%s/%s", xdg_conf, "spmenu/binds.conf") + 1))) {
die("spmenu: failed to malloc bindfile");
}
sprintf(bindfile, "%s/%s", xdg_conf, "spmenu/binds.conf");
}
} else { // custom keys path
if (!(bindfile = malloc(snprintf(NULL, 0, "%s", bindsfile) + 1))) {
die("spmenu: failed to malloc bindfile");
}
sprintf(bindfile, "%s", bindsfile);
}
// don't bother trying to load if it doesn't exist.
if (access(bindfile, F_OK) != 0) {
return;
}
// init config
config_t bind;
config_init(&bind);
// attempt to read config file to cfg
if (!config_read_file(&bind, bindfile)) {
// invalid configuration, but let's try to read it anyway
fprintf(stderr, "spmenu: Invalid keys file.\n");
}
// load options binds.keys
config_setting_t *key_bind = config_lookup(&bind, "bind.keys");
if (key_bind != NULL && loadbinds) {
int nmode = 0;
#if USEX
memset(ckeys, '\0', LENGTH(ckeys)-1);
#endif
#if USEWAYLAND
memset(wl_ckeys, '\0', LENGTH(wl_ckeys)-1);
#endif
for (unsigned int i = 0; i < config_setting_length(key_bind); ++i) {
config_setting_t *conf = config_setting_get_elem(key_bind, i);
// look up
config_setting_lookup_string(conf, "modifier", &dest);
#if USEX
for (int j = 0; j < LENGTH(ml); j++) {
if (!strcmp(ml[j].mod, strdup(dest))) {
ckeys[i].mod = ml[j].modifier;
}
}
#endif
#if USEWAYLAND
for (int j = 0; j < LENGTH(wml); j++) {
if (!strcmp(wml[j].mod, strdup(dest))) {
wl_ckeys[i].modifier = wml[j].modifier;
}
}
#endif
if (config_setting_lookup_int(conf, "mode", &nmode)) {
#if USEX
ckeys[i].mode = nmode;
#endif
#if USEWAYLAND
wl_ckeys[i].mode = nmode;
#endif
}
config_setting_lookup_string(conf, "key", &dest);
#if USEX
for (int j = 0; j < LENGTH(kl); j++) {
if (!strcmp(kl[j].key, strdup(dest))) {
ckeys[i].keysym = kl[j].keysym;
}
}
#endif
#if USEWAYLAND
for (int j = 0; j < LENGTH(wkl); j++) {
if (!strcmp(wkl[j].key, strdup(dest))) {
wl_ckeys[i].keysym = wkl[j].keysym;
}
}
#endif
config_setting_lookup_string(conf, "function", &dest);
for (int j = 0; j < LENGTH(fl); j++) {
if (!strcmp(fl[j].function, strdup(dest))) {
#if USEX
ckeys[i].func = fl[j].func;
#endif
#if USEWAYLAND
wl_ckeys[i].func = fl[j].func;
#endif
}
}
config_setting_lookup_string(conf, "argument", &dest);
for (int j = 0; j < LENGTH(al); j++) {
if (!strcmp(al[j].argument, strdup(dest))) {
#if USEX
ckeys[i].arg = al[j].arg;
#endif
#if USEWAYLAND
wl_ckeys[i].arg = al[j].arg;
#endif
}
}
config_setting_lookup_int(conf, "ignoreglobalkeys", &sp.ignoreglobalkeys);
}
}
// load options binds.mouse
config_setting_t *mouse_bind = config_lookup(&bind, "bind.mouse");
if (mouse_bind != NULL && loadbinds) {
#if USEX
memset(cbuttons, '\0', LENGTH(cbuttons)-1);
#endif
for (unsigned int i = 0; i < config_setting_length(mouse_bind); ++i) {
config_setting_t *conf = config_setting_get_elem(mouse_bind, i);
config_setting_lookup_string(conf, "click", &dest);
for (int j = 0; j < LENGTH(ctp); j++) {
if (!strcmp(ctp[j].tclick, strdup(dest))) {
#if USEX
cbuttons[i].click = ctp[j].click;
#endif
#if USEWAYLAND
wl_cbuttons[i].click = ctp[j].click;
#endif
}
}
config_setting_lookup_string(conf, "button", &dest);
#if USEX
for (int j = 0; j < LENGTH(btp); j++) {
if (!strcmp(btp[j].click, strdup(dest))) {
cbuttons[i].button = btp[j].button;
}
}
#endif
#if USEWAYLAND
for (int j = 0; j < LENGTH(w_btp); j++) {
if (!strcmp(w_btp[j].click, strdup(dest))) {
wl_cbuttons[i].button = w_btp[j].button;
}
}
#endif
config_setting_lookup_string(conf, "function", &dest);
for (int j = 0; j < LENGTH(fl); j++) {
if (!strcmp(fl[j].function, strdup(dest))) {
#if USEX
cbuttons[i].func = fl[j].func;
#endif
#if USEWAYLAND
wl_cbuttons[i].func = fl[j].func;
#endif
}
}
config_setting_lookup_string(conf, "argument", &dest);
for (int j = 0; j < LENGTH(al); j++) {
if (!strcmp(al[j].argument, strdup(dest))) {
#if USEX
cbuttons[i].arg = al[j].arg;
#endif
#if USEWAYLAND
wl_cbuttons[i].arg = al[j].arg;
#endif
}
}
config_setting_lookup_int(conf, "ignoreglobalmouse", &sp.ignoreglobalmouse);
}
}
// finally done
config_destroy(&bind);
return;
}

View file

@ -688,3 +688,4 @@ static ClickType ctp[] = {
};
static void conf_init(void);
static int bind_init(void);