Add conf parsage: keybind section available, config.h associative struct/func
This commit is contained in:
parent
7f346c150c
commit
05aafde11a
@ -3,8 +3,67 @@
|
|||||||
* For license, see COPYING.
|
* For license, see COPYING.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
#include "wmfs.h"
|
||||||
|
#include "parse.h"
|
||||||
|
|
||||||
|
#define CONFIG_DEFAULT_PATH ".config/wmfs/wmfsrc2" /* tmp */
|
||||||
|
|
||||||
|
static void
|
||||||
|
config_keybind(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
size_t j, n;
|
||||||
|
struct conf_sec *sec, **ks;
|
||||||
|
struct opt_type *opt;
|
||||||
|
Keybind *k;
|
||||||
|
|
||||||
|
sec = fetch_section_first(NULL, "keys");
|
||||||
|
ks = fetch_section(sec, "key");
|
||||||
|
n = fetch_section_count(ks);
|
||||||
|
|
||||||
|
SLIST_INIT(&W->h.keybind);
|
||||||
|
|
||||||
|
for(i = 0; i < n; ++i)
|
||||||
|
{
|
||||||
|
opt = fetch_opt(ks[i], "", "mod");
|
||||||
|
|
||||||
|
k = xcalloc(1, sizeof(Keybind));
|
||||||
|
|
||||||
|
for(j = 0; j < fetch_opt_count(opt); ++j)
|
||||||
|
k->mod |= modkey_keysym(opt[j].str);
|
||||||
|
|
||||||
|
free(opt);
|
||||||
|
|
||||||
|
k->keysym = XStringToKeysym(fetch_opt_first(ks[i], "None", "key").str);
|
||||||
|
|
||||||
|
if(!(k->func = uicb_name_func(fetch_opt_first(ks[i], "", "func").str)))
|
||||||
|
{
|
||||||
|
warnx("configuration : Unknown Function \"%s\".", fetch_opt_first(ks[i], "", "func").str);
|
||||||
|
k->func = uicb_spawn;
|
||||||
|
}
|
||||||
|
|
||||||
|
k->cmd = fetch_opt_first(ks[i], "", "cmd").str;
|
||||||
|
|
||||||
|
SLIST_INSERT_HEAD(&W->h.keybind, k, next);
|
||||||
|
|
||||||
|
k = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
free(ks);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
config_init(void)
|
config_init(void)
|
||||||
{
|
{
|
||||||
|
char *path;
|
||||||
|
|
||||||
|
xasprintf(&path, "%s/"CONFIG_DEFAULT_PATH, getenv("HOME"));
|
||||||
|
|
||||||
|
if(get_conf(path) == -1)
|
||||||
|
errx(1, "parsing configuration file (%s) failed.", path);
|
||||||
|
|
||||||
|
config_keybind();
|
||||||
|
|
||||||
|
free(path);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7,6 +7,59 @@
|
|||||||
#ifndef CONFIG_H
|
#ifndef CONFIG_H
|
||||||
#define CONFIG_H
|
#define CONFIG_H
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <X11/Xlib.h>
|
||||||
|
|
||||||
#include "wmfs.h"
|
#include "wmfs.h"
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
|
static const struct { char *name; void (*func)(Uicb cmd); } uicb_list[] =
|
||||||
|
{
|
||||||
|
{ "spawn", uicb_spawn },
|
||||||
|
{ "quit", uicb_quit },
|
||||||
|
{ NULL, NULL }
|
||||||
|
};
|
||||||
|
|
||||||
|
static inline void*
|
||||||
|
uicb_name_func(Uicb name)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
for(; uicb_list[i].func; ++i)
|
||||||
|
if(!strcmp(name, uicb_list[i].name))
|
||||||
|
return uicb_list[i].func;
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct { const char *name; KeySym keysym; } key_list[] =
|
||||||
|
{
|
||||||
|
{"Control", ControlMask },
|
||||||
|
{"Shift", ShiftMask },
|
||||||
|
{"Lock", LockMask },
|
||||||
|
{"Alt", Mod1Mask },
|
||||||
|
{"Mod1", Mod1Mask },
|
||||||
|
{"Mod2", Mod2Mask },
|
||||||
|
{"Mod3", Mod3Mask },
|
||||||
|
{"Mod4", Mod4Mask },
|
||||||
|
{"Super", Mod4Mask },
|
||||||
|
{"Home", Mod4Mask },
|
||||||
|
{"Mod5", Mod5Mask },
|
||||||
|
{NULL, NoSymbol }
|
||||||
|
};
|
||||||
|
|
||||||
|
static inline KeySym
|
||||||
|
modkey_keysym(const char *name)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
for(; key_list[i].name; ++i)
|
||||||
|
if(!strcmp(name, key_list[i].name))
|
||||||
|
return key_list[i].keysym;
|
||||||
|
|
||||||
|
return NoSymbol;
|
||||||
|
}
|
||||||
|
|
||||||
|
void config_init(void);
|
||||||
|
|
||||||
#endif /* CONFIG_H */
|
#endif /* CONFIG_H */
|
||||||
|
|||||||
@ -184,14 +184,12 @@ static void
|
|||||||
event_keypress(XEvent *e)
|
event_keypress(XEvent *e)
|
||||||
{
|
{
|
||||||
XKeyPressedEvent *ev = &e->xkey;
|
XKeyPressedEvent *ev = &e->xkey;
|
||||||
KeySym keysym;
|
KeySym keysym = XKeycodeToKeysym(EVDPY(e), (KeyCode)ev->keycode, 0);
|
||||||
Keybind *k;
|
|
||||||
Flags m = ~(W->numlockmask | LockMask);
|
Flags m = ~(W->numlockmask | LockMask);
|
||||||
|
Keybind *k;
|
||||||
keysym = XKeycodeToKeysym(EVDPY(e), (KeyCode)ev->keycode, 0);
|
|
||||||
|
|
||||||
SLIST_FOREACH(k, &W->h.keybind, next)
|
SLIST_FOREACH(k, &W->h.keybind, next)
|
||||||
if(k->keysym == keysym && (k->mod & m) == (ev->state & m))
|
if(k->keysym == keysym && KEYPRESS_MASK(k->mod) == KEYPRESS_MASK(ev->state))
|
||||||
if(k->func)
|
if(k->func)
|
||||||
k->func(k->cmd);
|
k->func(k->cmd);
|
||||||
}
|
}
|
||||||
@ -201,13 +199,13 @@ event_expose(XEvent *e)
|
|||||||
{
|
{
|
||||||
XExposeEvent *ev = &e->xexpose;
|
XExposeEvent *ev = &e->xexpose;
|
||||||
Barwin *b;
|
Barwin *b;
|
||||||
/*
|
|
||||||
SLIST_FOREACH(b, &W->h.barwin, next)
|
SLIST_FOREACH(b, &W->h.barwin, next)
|
||||||
if(b->win == ev->window)
|
if(b->win == ev->window)
|
||||||
{
|
{
|
||||||
barwin_refresh(b);
|
barwin_refresh(b);
|
||||||
return;
|
return;
|
||||||
}*/
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|||||||
@ -10,6 +10,7 @@
|
|||||||
|
|
||||||
#define MAX_EV 256
|
#define MAX_EV 256
|
||||||
|
|
||||||
|
#define KEYPRESS_MASK(m) (m & ~(W->numlockmask | LockMask))
|
||||||
#define HANDLE_EVENT(e) event_handle[(e)->type](e);
|
#define HANDLE_EVENT(e) event_handle[(e)->type](e);
|
||||||
|
|
||||||
void event_init(void);
|
void event_init(void);
|
||||||
|
|||||||
@ -118,3 +118,9 @@ spawn(const char *format, ...)
|
|||||||
|
|
||||||
return pid;
|
return pid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
uicb_spawn(Uicb cmd)
|
||||||
|
{
|
||||||
|
spawn("%s", cmd);
|
||||||
|
}
|
||||||
|
|||||||
@ -11,7 +11,7 @@
|
|||||||
/* Todo FREE_LIST(type, head, function_remove) */
|
/* Todo FREE_LIST(type, head, function_remove) */
|
||||||
#define FREE_LIST(type, head) \
|
#define FREE_LIST(type, head) \
|
||||||
do { \
|
do { \
|
||||||
type *t; \
|
struct type *t; \
|
||||||
while(!SLIST_EMPTY(&head)) { \
|
while(!SLIST_EMPTY(&head)) { \
|
||||||
t = SLIST_FIRST(&head); \
|
t = SLIST_FIRST(&head); \
|
||||||
SLIST_REMOVE_HEAD(&head, next); \
|
SLIST_REMOVE_HEAD(&head, next); \
|
||||||
@ -26,5 +26,6 @@ void *xcalloc(size_t nmemb, size_t size);
|
|||||||
int xasprintf(char **strp, const char *fmt, ...);
|
int xasprintf(char **strp, const char *fmt, ...);
|
||||||
char *xstrdup(const char *str);
|
char *xstrdup(const char *str);
|
||||||
pid_t spawn(const char *format, ...);
|
pid_t spawn(const char *format, ...);
|
||||||
|
void uicb_spawn(Uicb cmd);
|
||||||
|
|
||||||
#endif /* UTIL_H */
|
#endif /* UTIL_H */
|
||||||
|
|||||||
@ -3,13 +3,14 @@
|
|||||||
* For license, see COPYING.
|
* For license, see COPYING.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <getopt.h>
|
||||||
#include <X11/keysym.h>
|
#include <X11/keysym.h>
|
||||||
#include <X11/cursorfont.h>
|
#include <X11/cursorfont.h>
|
||||||
|
|
||||||
#include "wmfs.h"
|
#include "wmfs.h"
|
||||||
#include "event.h"
|
#include "event.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
/*#include "infobar.h" */
|
#include "config.h"
|
||||||
|
|
||||||
int
|
int
|
||||||
wmfs_error_handler(Display *d, XErrorEvent *event)
|
wmfs_error_handler(Display *d, XErrorEvent *event)
|
||||||
@ -56,7 +57,7 @@ static void
|
|||||||
wmfs_xinit(void)
|
wmfs_xinit(void)
|
||||||
{
|
{
|
||||||
char **misschar, **names, *defstring;
|
char **misschar, **names, *defstring;
|
||||||
int d, i = 0, j = 0;
|
int d, i, j;
|
||||||
XModifierKeymap *mm;
|
XModifierKeymap *mm;
|
||||||
XFontStruct **xfs = NULL;
|
XFontStruct **xfs = NULL;
|
||||||
XSetWindowAttributes at;
|
XSetWindowAttributes at;
|
||||||
@ -108,8 +109,8 @@ wmfs_xinit(void)
|
|||||||
*/
|
*/
|
||||||
mm = XGetModifierMapping(W->dpy);
|
mm = XGetModifierMapping(W->dpy);
|
||||||
|
|
||||||
for(; i < 8; i++)
|
for(i = 0; i < 8; i++)
|
||||||
for(; j < mm->max_keypermod; ++j)
|
for(j = 0; j < mm->max_keypermod; ++j)
|
||||||
if(mm->modifiermap[i * mm->max_keypermod + j]
|
if(mm->modifiermap[i * mm->max_keypermod + j]
|
||||||
== XKeysymToKeycode(W->dpy, XK_Num_Lock))
|
== XKeysymToKeycode(W->dpy, XK_Num_Lock))
|
||||||
W->numlockmask = (1 << i);
|
W->numlockmask = (1 << i);
|
||||||
@ -217,6 +218,8 @@ wmfs_init(void)
|
|||||||
/* EWMH init */
|
/* EWMH init */
|
||||||
ewmh_init();
|
ewmh_init();
|
||||||
|
|
||||||
|
config_init();
|
||||||
|
|
||||||
/* Event init */
|
/* Event init */
|
||||||
event_init();
|
event_init();
|
||||||
|
|
||||||
@ -232,7 +235,6 @@ void
|
|||||||
wmfs_quit(void)
|
wmfs_quit(void)
|
||||||
{
|
{
|
||||||
/* X stuffs */
|
/* X stuffs */
|
||||||
XFreeGC(W->dpy, W->gc);
|
|
||||||
XFreeFontSet(W->dpy, W->font.fontset);
|
XFreeFontSet(W->dpy, W->font.fontset);
|
||||||
|
|
||||||
screen_free();
|
screen_free();
|
||||||
@ -242,9 +244,18 @@ wmfs_quit(void)
|
|||||||
free(W->net_atom);
|
free(W->net_atom);
|
||||||
free(W);
|
free(W);
|
||||||
|
|
||||||
|
/* Conf stuffs */
|
||||||
|
FREE_LIST(Keybind, W->h.keybind);
|
||||||
|
|
||||||
W->running = false;
|
W->running = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
uicb_quit(Uicb cmd)
|
||||||
|
{
|
||||||
|
(void)cmd;
|
||||||
|
W->running = false;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
main(int argc, char **argv)
|
main(int argc, char **argv)
|
||||||
@ -259,6 +270,21 @@ main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Opt */
|
/* Opt */
|
||||||
|
/*
|
||||||
|
int i;
|
||||||
|
while((i = getopt(argc, argv, "hviC:")) != -1)
|
||||||
|
{
|
||||||
|
switch(i)
|
||||||
|
{
|
||||||
|
case 'h':
|
||||||
|
break;
|
||||||
|
case 'v':
|
||||||
|
break;
|
||||||
|
case 'C':
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
/* Core */
|
/* Core */
|
||||||
wmfs_init();
|
wmfs_init();
|
||||||
|
|||||||
@ -187,6 +187,8 @@ int wmfs_error_handler(Display *d, XErrorEvent *event);
|
|||||||
int wmfs_error_handler_dummy(Display *d, XErrorEvent *event);
|
int wmfs_error_handler_dummy(Display *d, XErrorEvent *event);
|
||||||
void wmfs_grab_keys(void);
|
void wmfs_grab_keys(void);
|
||||||
void wmfs_quit(void);
|
void wmfs_quit(void);
|
||||||
|
void uicb_quit(Uicb cmd);
|
||||||
|
|
||||||
|
|
||||||
/* Single global variable */
|
/* Single global variable */
|
||||||
struct Wmfs *W;
|
struct Wmfs *W;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user