diff options
-rw-r--r-- | calmwm.c | 41 | ||||
-rw-r--r-- | calmwm.h | 10 | ||||
-rw-r--r-- | conf.c | 38 | ||||
-rw-r--r-- | parse.y | 20 | ||||
-rw-r--r-- | screen.c | 18 |
5 files changed, 55 insertions, 72 deletions
diff --git a/calmwm.c b/calmwm.c index 11d8eeb..c809695 100644 --- a/calmwm.c +++ b/calmwm.c @@ -28,7 +28,6 @@ #include <limits.h> #include <locale.h> #include <poll.h> -#include <pwd.h> #include <signal.h> #include <stdio.h> #include <stdlib.h> @@ -54,23 +53,24 @@ static int x_wmerrorhandler(Display *, XErrorEvent *); int main(int argc, char **argv) { - const char *conf_file = NULL; - char *conf_path, *display_name = NULL; + char *display_name = NULL; char *fallback; int ch, xfd; struct pollfd pfd[1]; - struct passwd *pw; if (!setlocale(LC_CTYPE, "") || !XSupportsLocale()) warnx("no locale support"); mbtowc(NULL, NULL, MB_CUR_MAX); + conf_init(&Conf); + fallback = u_argv(argv); Conf.wm_argv = u_argv(argv); while ((ch = getopt(argc, argv, "c:d:v")) != -1) { switch (ch) { case 'c': - conf_file = optarg; + free(Conf.conf_file); + Conf.conf_file = xstrdup(optarg); break; case 'd': display_name = optarg; @@ -90,32 +90,8 @@ main(int argc, char **argv) if (signal(SIGHUP, sighdlr) == SIG_ERR) err(1, "signal"); - Conf.homedir = getenv("HOME"); - if ((Conf.homedir == NULL) || (Conf.homedir[0] == '\0')) { - pw = getpwuid(getuid()); - if (pw != NULL && pw->pw_dir != NULL && *pw->pw_dir != '\0') - Conf.homedir = pw->pw_dir; - else - Conf.homedir = "/"; - } - - if (conf_file == NULL) - xasprintf(&conf_path, "%s/%s", Conf.homedir, CONFFILE); - else - conf_path = xstrdup(conf_file); - - if (access(conf_path, R_OK) != 0) { - if (conf_file != NULL) - warn("%s", conf_file); - free(conf_path); - conf_path = NULL; - } - - conf_init(&Conf); - - if (conf_path && (parse_config(conf_path, &Conf) == -1)) - warnx("config file %s has errors", conf_path); - free(conf_path); + if (parse_config(Conf.conf_file, &Conf) == -1) + warnx("error parsing config file"); xfd = x_init(display_name); cwm_status = CWM_RUNNING; @@ -138,7 +114,7 @@ main(int argc, char **argv) x_teardown(); if (cwm_status == CWM_EXEC_WM) { u_exec(Conf.wm_argv); - warnx("'%s' failed to start, restarting fallback", Conf.wm_argv); + warnx("'%s' failed to start, starting fallback", Conf.wm_argv); u_exec(fallback); } @@ -200,7 +176,6 @@ static int x_wmerrorhandler(Display *dpy, XErrorEvent *e) { errx(1, "root window unavailable - perhaps another wm is running?"); - return(0); } diff --git a/calmwm.h b/calmwm.h index 7cf30c4..033202d 100644 --- a/calmwm.h +++ b/calmwm.h @@ -66,8 +66,6 @@ size_t strlcpy(char *, const char *, size_t); #define nitems(_a) (sizeof((_a)) / sizeof((_a)[0])) #endif -#define CONFFILE ".cwmrc" - #define BUTTONMASK (ButtonPressMask | ButtonReleaseMask) #define MOUSEMASK (BUTTONMASK | PointerMotionMask) #define MENUMASK (MOUSEMASK | ButtonMotionMask | KeyPressMask | \ @@ -227,7 +225,6 @@ TAILQ_HEAD(autogroup_q, autogroup); struct region_ctx { TAILQ_ENTRY(region_ctx) entry; int num; - struct geom area; struct geom view; /* viewable area */ struct geom work; /* workable area, gap-applied */ }; @@ -247,6 +244,8 @@ struct screen_ctx { struct region_q regionq; struct group_q groupq; struct group_ctx *group_active; + Colormap colormap; + Visual *visual; struct { Window win; XftDraw *xftdraw; @@ -329,10 +328,10 @@ struct conf { Cursor cursor[CF_NITEMS]; int xrandr; int xrandr_event_base; - char *homedir; + char *conf_file; char *known_hosts; char *wm_argv; - u_int32_t debug; + int debug; }; /* MWM hints */ @@ -499,7 +498,6 @@ void search_print_text(struct menu *, int); void search_print_wm(struct menu *, int); struct region_ctx *region_find(struct screen_ctx *, int, int); -struct geom screen_apply_gap(struct screen_ctx *, struct geom); struct screen_ctx *screen_find(Window); struct geom screen_area(struct screen_ctx *, int, int, enum apply_gap); diff --git a/conf.c b/conf.c index 0c2ce13..9afa965 100644 --- a/conf.c +++ b/conf.c @@ -25,6 +25,7 @@ #include <err.h> #include <errno.h> #include <limits.h> +#include <pwd.h> #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -248,6 +249,8 @@ mouse_binds[] = { void conf_init(struct conf *c) { + const char *home; + struct passwd *pw; unsigned int i; c->stickygroups = 0; @@ -258,11 +261,11 @@ conf_init(struct conf *c) c->nameqlen = 5; TAILQ_INIT(&c->ignoreq); - TAILQ_INIT(&c->cmdq); - TAILQ_INIT(&c->wmq); - TAILQ_INIT(&c->keybindq); TAILQ_INIT(&c->autogroupq); + TAILQ_INIT(&c->keybindq); TAILQ_INIT(&c->mousebindq); + TAILQ_INIT(&c->cmdq); + TAILQ_INIT(&c->wmq); for (i = 0; i < nitems(key_binds); i++) conf_bind_key(c, key_binds[i].key, key_binds[i].func); @@ -275,13 +278,21 @@ conf_init(struct conf *c) conf_cmd_add(c, "lock", "xlock"); conf_cmd_add(c, "term", "xterm"); - conf_wm_add(c, "cwm", "cwm"); - xasprintf(&c->known_hosts, "%s/%s", c->homedir, ".ssh/known_hosts"); - c->font = xstrdup("sans-serif:pixelsize=14:bold"); c->wmname = xstrdup("CWM"); + + home = getenv("HOME"); + if ((home == NULL) || (*home == '\0')) { + pw = getpwuid(getuid()); + if (pw != NULL && pw->pw_dir != NULL && *pw->pw_dir != '\0') + home = pw->pw_dir; + else + home = "/"; + } + xasprintf(&c->conf_file, "%s/%s", home, ".cwmrc"); + xasprintf(&c->known_hosts, "%s/%s", home, ".ssh/known_hosts"); } void @@ -327,6 +338,7 @@ conf_clear(struct conf *c) for (i = 0; i < CWM_COLOR_NITEMS; i++) free(c->color[i]); + free(c->conf_file); free(c->known_hosts); free(c->font); free(c->wmname); @@ -439,8 +451,6 @@ conf_screen(struct screen_ctx *sc) { unsigned int i; XftColor xc; - Colormap colormap = DefaultColormap(X_Dpy, sc->which); - Visual *visual = DefaultVisual(X_Dpy, sc->which); sc->gap = Conf.gap; sc->snapdist = Conf.snapdist; @@ -457,18 +467,18 @@ conf_screen(struct screen_ctx *sc) xu_xorcolor(sc->xftcolor[CWM_COLOR_MENU_BG], sc->xftcolor[CWM_COLOR_MENU_FG], &xc); xu_xorcolor(sc->xftcolor[CWM_COLOR_MENU_FONT], xc, &xc); - if (!XftColorAllocValue(X_Dpy, visual, colormap, + if (!XftColorAllocValue(X_Dpy, sc->visual, sc->colormap, &xc.color, &sc->xftcolor[CWM_COLOR_MENU_FONT_SEL])) warnx("XftColorAllocValue: %s", Conf.color[i]); break; } - if (XftColorAllocName(X_Dpy, visual, colormap, + if (XftColorAllocName(X_Dpy, sc->visual, sc->colormap, Conf.color[i], &xc)) { sc->xftcolor[i] = xc; - XftColorFree(X_Dpy, visual, colormap, &xc); + XftColorFree(X_Dpy, sc->visual, sc->colormap, &xc); } else { warnx("XftColorAllocName: %s", Conf.color[i]); - XftColorAllocName(X_Dpy, visual, colormap, + XftColorAllocName(X_Dpy, sc->visual, sc->colormap, color_binds[i], &sc->xftcolor[i]); } } @@ -478,7 +488,8 @@ conf_screen(struct screen_ctx *sc) sc->xftcolor[CWM_COLOR_MENU_FG].pixel, sc->xftcolor[CWM_COLOR_MENU_BG].pixel); - sc->menu.xftdraw = XftDrawCreate(X_Dpy, sc->menu.win, visual, colormap); + sc->menu.xftdraw = XftDrawCreate(X_Dpy, sc->menu.win, + sc->visual, sc->colormap); if (sc->menu.xftdraw == NULL) errx(1, "%s: XftDrawCreate", __func__); @@ -703,7 +714,6 @@ static char *ewmhints[] = { "_NET_WM_STATE_SKIP_TASKBAR", "_CWM_WM_STATE_FREEZE", }; - void conf_atoms(void) { diff --git a/parse.y b/parse.y index 1db92c0..e9dce3a 100644 --- a/parse.y +++ b/parse.y @@ -45,7 +45,7 @@ static struct file { int lineno; int errors; } *file, *topfile; -struct file *pushfile(const char *); +struct file *pushfile(const char *, FILE *); int popfile(void); int yyparse(void); int yylex(void); @@ -559,19 +559,13 @@ nodigits: } struct file * -pushfile(const char *name) +pushfile(const char *name, FILE *stream) { struct file *nfile; nfile = xcalloc(1, sizeof(struct file)); nfile->name = xstrdup(name); - - if ((nfile->stream = fopen(nfile->name, "r")) == NULL) { - warn("%s", nfile->name); - free(nfile->name); - free(nfile); - return (NULL); - } + nfile->stream = stream; nfile->lineno = 1; TAILQ_INSERT_TAIL(&files, nfile, entry); return (nfile); @@ -596,13 +590,19 @@ popfile(void) int parse_config(const char *filename, struct conf *xconf) { + FILE *stream; int errors = 0; conf = xconf; - if ((file = pushfile(filename)) == NULL) { + stream = fopen(filename, "r"); + if (stream == NULL) { + if (errno == ENOENT) + return (0); + warn("%s", filename); return (-1); } + file = pushfile(filename, stream); topfile = file; yyparse(); diff --git a/screen.c b/screen.c index 526dcea..2c0b8c1 100644 --- a/screen.c +++ b/screen.c @@ -31,6 +31,8 @@ #include "calmwm.h" +static struct geom screen_apply_gap(struct screen_ctx *, struct geom); + void screen_init(int which) { @@ -48,6 +50,8 @@ screen_init(int which) sc->which = which; sc->rootwin = RootWindow(X_Dpy, sc->which); + sc->colormap = DefaultColormap(X_Dpy, sc->which); + sc->visual = DefaultVisual(X_Dpy, sc->which); sc->cycling = 0; sc->hideall = 0; @@ -144,12 +148,12 @@ struct geom screen_area(struct screen_ctx *sc, int x, int y, enum apply_gap apply_gap) { struct region_ctx *rc; - struct geom area = sc->work; + struct geom area = sc->view; TAILQ_FOREACH(rc, &sc->regionq, entry) { - if ((x >= rc->area.x) && (x < (rc->area.x + rc->area.w)) && - (y >= rc->area.y) && (y < (rc->area.y + rc->area.h))) { - area = rc->area; + if ((x >= rc->view.x) && (x < (rc->view.x + rc->view.w)) && + (y >= rc->view.y) && (y < (rc->view.y + rc->view.h))) { + area = rc->view; break; } } @@ -191,10 +195,6 @@ screen_update_geometry(struct screen_ctx *sc) rc = xmalloc(sizeof(*rc)); rc->num = i; - rc->area.x = ci->x; - rc->area.y = ci->y; - rc->area.w = ci->width; - rc->area.h = ci->height; rc->view.x = ci->x; rc->view.y = ci->y; rc->view.w = ci->width; @@ -220,7 +220,7 @@ screen_update_geometry(struct screen_ctx *sc) xu_ewmh_net_workarea(sc); } -struct geom +static struct geom screen_apply_gap(struct screen_ctx *sc, struct geom geom) { geom.x += sc->gap.left; |