Add conf parsage: keybind section available, config.h associative struct/func

This commit is contained in:
Martin Duquesnoy 2011-08-25 21:19:43 +02:00
parent 7f346c150c
commit 05aafde11a
8 changed files with 160 additions and 14 deletions

View File

@ -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);
} }

View File

@ -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 */

View File

@ -169,7 +169,7 @@ event_unmapnotify(XEvent *e)
static void static void
event_motionnotify(XEvent *e) event_motionnotify(XEvent *e)
{ {
/* /*
XMotionEvent *ev = &e->xmotion; XMotionEvent *ev = &e->xmotion;
Client *c; Client *c;
@ -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

View File

@ -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);

View File

@ -118,3 +118,9 @@ spawn(const char *format, ...)
return pid; return pid;
} }
void
uicb_spawn(Uicb cmd)
{
spawn("%s", cmd);
}

View File

@ -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 */

View File

@ -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();

View File

@ -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;