diff --git a/calmwm.c b/calmwm.c index cce800d..f908a04 100644 --- a/calmwm.c +++ b/calmwm.c @@ -34,6 +34,7 @@ #include "calmwm.h" +char **cwm_argv; Display *X_Dpy; Cursor Cursor_default; @@ -67,6 +68,7 @@ main(int argc, char **argv) warnx("no locale support"); mbtowc(NULL, NULL, MB_CUR_MAX); + cwm_argv = argv; while ((ch = getopt(argc, argv, "c:d:")) != -1) { switch (ch) { case 'c': diff --git a/calmwm.h b/calmwm.h index 47b931b..b0e1512 100644 --- a/calmwm.h +++ b/calmwm.h @@ -297,7 +297,6 @@ struct conf { struct autogroupwin_q autogroupq; struct autostartcmd_q autostartq; struct winmatch_q ignoreq; - char conf_path[MAXPATHLEN]; struct cmd_q cmdq; struct mousebinding_q mousebindingq; #define CONF_STICKY_GROUPS 0x0001 @@ -422,7 +421,7 @@ void kbfunc_lock(struct client_ctx *, union arg *); void kbfunc_menu_search(struct client_ctx *, union arg *); void kbfunc_moveresize(struct client_ctx *, union arg *); void kbfunc_quit_wm(struct client_ctx *, union arg *); -void kbfunc_reload(struct client_ctx *, union arg *); +void kbfunc_restart(struct client_ctx *, union arg *); void kbfunc_ssh(struct client_ctx *, union arg *); void kbfunc_term(struct client_ctx *, union arg *); @@ -456,7 +455,6 @@ void conf_grab(struct conf *, struct keybinding *); void conf_grab_mouse(struct client_ctx *); void conf_init(struct conf *); void conf_mousebind(struct conf *, char *, char *); -void conf_reload(struct conf *); void conf_setup(struct conf *, const char *); void conf_ungrab(struct conf *, struct keybinding *); @@ -474,7 +472,6 @@ void xev_loop(void); void xu_btn_grab(Window, int, u_int); void xu_btn_ungrab(Window, int, u_int); void xu_configure(struct client_ctx *); -void xu_freecolor(struct screen_ctx *, unsigned long); void xu_getatoms(void); unsigned long xu_getcolor(struct screen_ctx *, char *); int xu_getprop(Window, Atom, Atom, long, u_char **); diff --git a/conf.c b/conf.c index 9f23326..7d187a8 100644 --- a/conf.c +++ b/conf.c @@ -81,31 +81,8 @@ conf_color(struct conf *c, struct screen_ctx *sc) { int i; - for (i = 0; i < CWM_COLOR_MAX; i++) { - xu_freecolor(sc, sc->color[i].pixel); + for (i = 0; i < CWM_COLOR_MAX; i++) sc->color[i].pixel = xu_getcolor(sc, c->color[i].name); - } -} - -void -conf_reload(struct conf *c) -{ - struct screen_ctx *sc; - struct client_ctx *cc; - - if (parse_config(c->conf_path, c) == -1) { - warnx("config file %s has errors, not reloading", c->conf_path); - return; - } - - TAILQ_FOREACH(sc, &Screenq, entry) { - conf_gap(c, sc); - conf_color(c, sc); - conf_font(c, sc); - menu_init(sc); - } - TAILQ_FOREACH(cc, &Clientq, entry) - client_draw_border(cc); } static struct { @@ -143,7 +120,7 @@ static struct { { "CM-equal", "vmaximize" }, { "CMS-equal", "hmaximize" }, { "CMS-f", "freeze" }, - { "CMS-r", "reload" }, + { "CMS-r", "restart" }, { "CMS-q", "quit" }, { "M-h", "moveleft" }, { "M-j", "movedown" }, @@ -274,6 +251,7 @@ conf_clear(struct conf *c) void conf_setup(struct conf *c, const char *conf_file) { + char conf_path[MAXPATHLEN]; char *home; struct stat sb; int parse = 0; @@ -284,23 +262,22 @@ conf_setup(struct conf *c, const char *conf_file) if ((home = getenv("HOME")) == NULL) errx(1, "No HOME directory."); - (void)snprintf(c->conf_path, sizeof(c->conf_path), "%s/%s", + (void)snprintf(conf_path, sizeof(conf_path), "%s/%s", home, CONFFILE); - if (stat(c->conf_path, &sb) == 0 && (sb.st_mode & S_IFREG)) + if (stat(conf_path, &sb) == 0 && (sb.st_mode & S_IFREG)) parse = 1; } else { if (stat(conf_file, &sb) == -1 || !(sb.st_mode & S_IFREG)) errx(1, "%s: %s", conf_file, strerror(errno)); else { - (void)strlcpy(c->conf_path, conf_file, - sizeof(c->conf_path)); + (void)strlcpy(conf_path, conf_file, sizeof(conf_path)); parse = 1; } } - if (parse && (parse_config(c->conf_path, c) == -1)) - warnx("config file %s has errors, not loading", c->conf_path); + if (parse && (parse_config(conf_path, c) == -1)) + warnx("config file %s has errors, not loading", conf_path); } void @@ -384,7 +361,7 @@ static struct { { "vmaximize", kbfunc_client_vmaximize, KBFLAG_NEEDCLIENT, {0} }, { "hmaximize", kbfunc_client_hmaximize, KBFLAG_NEEDCLIENT, {0} }, { "freeze", kbfunc_client_freeze, KBFLAG_NEEDCLIENT, {0} }, - { "reload", kbfunc_reload, 0, {0} }, + { "restart", kbfunc_restart, 0, {0} }, { "quit", kbfunc_quit_wm, 0, {0} }, { "exec", kbfunc_exec, 0, {.i = CWM_EXEC_PROGRAM} }, { "exec_wm", kbfunc_exec, 0, {.i = CWM_EXEC_WM} }, diff --git a/cwm.1 b/cwm.1 index 49d4df2..d647618 100644 --- a/cwm.1 +++ b/cwm.1 @@ -14,7 +14,7 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: May 7 2012 $ +.Dd $Mdocdate: May 9 2012 $ .Dt CWM 1 .Os .Sh NAME @@ -116,7 +116,8 @@ dialog; allows you to switch from .Nm to another window manager without restarting the X server. .It Ic CMS-r -Reload configuration. +Restart the running +.Xr cwm 1 . .It Ic CMS-q Quit .Nm . diff --git a/cwmrc.5 b/cwmrc.5 index 86a9c6b..ffc4d0c 100644 --- a/cwmrc.5 +++ b/cwmrc.5 @@ -14,7 +14,7 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: November 6 2011 $ +.Dd $Mdocdate: October 31 2012 $ .Dt CWMRC 5 .Os .Sh NAME @@ -41,16 +41,25 @@ The following options are accepted: .Bl -tag -width Ds -compact .It Ic autogroup Ar group windowclass .It Ic autogroup Ar group windowname,windowclass -Control automatic window grouping, based on the name and/or class -properties, where +Automatically add new windows to +.Ar group +if their class property matches +.Ar windowclass , +or if their name and class properties match +.Ar windowname +and +.Ar windowclass , +respectively. .Ar group is a number between 0 and 9. -If the group number is 0, then the window will not be grouped; this to -allow for -.Dq sticky -windows in sticky group mode. +If +.Ar group +is 0, matching windows will not be added to any group; this may be +used to override +.Dq sticky group mode . .Pp -The name and class of a window may be obtained using +The name and class values, respectively, for existing windows +may be obtained using .Xr xprop 1 . .Pp .It Ic bind Ar keys command @@ -261,8 +270,9 @@ mousebind M-3 window_resize .Ed .Sh BIND COMMAND LIST .Bl -tag -width 18n -compact -.It reload -Reload configuration. +.It restart +Restart the running +.Xr cwm 1 . .It quit Quit .Xr cwm 1 . diff --git a/font.c b/font.c index 54c878e..88d6519 100644 --- a/font.c +++ b/font.c @@ -51,16 +51,11 @@ font_height(struct screen_ctx *sc) void font_init(struct screen_ctx *sc, const char *color) { - if (sc->xftdraw) - XftDrawDestroy(sc->xftdraw); sc->xftdraw = XftDrawCreate(X_Dpy, sc->rootwin, DefaultVisual(X_Dpy, sc->which), DefaultColormap(X_Dpy, sc->which)); if (sc->xftdraw == NULL) errx(1, "XftDrawCreate"); - if (sc->xftcolor.pixel) - XftColorFree(X_Dpy, DefaultVisual(X_Dpy, sc->which), - DefaultColormap(X_Dpy, sc->which), &sc->xftcolor); if (!XftColorAllocName(X_Dpy, DefaultVisual(X_Dpy, sc->which), DefaultColormap(X_Dpy, sc->which), color, &sc->xftcolor)) errx(1, "XftColorAllocName"); diff --git a/kbfunc.c b/kbfunc.c index 34901cf..c141f80 100644 --- a/kbfunc.c +++ b/kbfunc.c @@ -36,6 +36,7 @@ #define KNOWN_HOSTS ".ssh/known_hosts" #define HASH_MARKER "|1|" +extern char **cwm_argv; extern sig_atomic_t xev_quit; void @@ -567,7 +568,8 @@ kbfunc_quit_wm(struct client_ctx *cc, union arg *arg) } void -kbfunc_reload(struct client_ctx *cc, union arg *arg) +kbfunc_restart(struct client_ctx *cc, union arg *arg) { - conf_reload(&Conf); + (void)setsid(); + (void)execvp(cwm_argv[0], cwm_argv); } diff --git a/menu.c b/menu.c index 29008e6..4a532a9 100644 --- a/menu.c +++ b/menu.c @@ -51,6 +51,7 @@ struct menu_ctx { int noresult; int prev; int entry; + int height; int width; int num; int x; @@ -76,8 +77,6 @@ menu_init(struct screen_ctx *sc) { XGCValues gv; - if (sc->menuwin) - XDestroyWindow(X_Dpy, sc->menuwin); sc->menuwin = XCreateSimpleWindow(X_Dpy, sc->rootwin, 0, 0, 1, 1, Conf.bwidth, sc->color[CWM_COLOR_FG_MENU].pixel, @@ -88,8 +87,6 @@ menu_init(struct screen_ctx *sc) gv.background = sc->color[CWM_COLOR_BG_MENU].pixel; gv.function = GXxor; - if (sc->gc) - XFreeGC(X_Dpy, sc->gc); sc->gc = XCreateGC(X_Dpy, sc->menuwin, GCForeground|GCBackground|GCFunction, &gv); } @@ -301,7 +298,7 @@ menu_draw(struct screen_ctx *sc, struct menu_ctx *mc, struct menu_q *menuq, struct menu *mi; XineramaScreenInfo *xine; int xmin, xmax, ymin, ymax; - int n, dy, xsave, ysave; + int n, xsave, ysave; if (mc->list) { if (TAILQ_EMPTY(resultq) && mc->list) { @@ -317,12 +314,12 @@ menu_draw(struct screen_ctx *sc, struct menu_ctx *mc, struct menu_q *menuq, mc->num = 0; mc->width = 0; - dy = 0; + mc->height = 0; if (mc->hasprompt) { (void)snprintf(mc->dispstr, sizeof(mc->dispstr), "%s%s%s", mc->promptstr, mc->searchstr, PROMPT_ECHAR); mc->width = font_width(sc, mc->dispstr, strlen(mc->dispstr)); - dy = font_height(sc); + mc->height = font_height(sc); mc->num = 1; } @@ -339,7 +336,7 @@ menu_draw(struct screen_ctx *sc, struct menu_ctx *mc, struct menu_q *menuq, mc->width = MAX(mc->width, font_width(sc, text, MIN(strlen(text), MENU_MAXENTRY))); - dy += font_height(sc); + mc->height += font_height(sc); mc->num++; } @@ -358,24 +355,26 @@ menu_draw(struct screen_ctx *sc, struct menu_ctx *mc, struct menu_q *menuq, xsave = mc->x; ysave = mc->y; - if (mc->x < xmin) - mc->x = xmin; - else if (mc->x + mc->width >= xmax) + /* Never hide the top, or left side, of the menu. */ + if (mc->x + mc->width >= xmax) mc->x = xmax - mc->width; - - if (mc->y + dy >= ymax) - mc->y = ymax - dy; - /* never hide the top of the menu */ + if (mc->x < xmin) { + mc->x = xmin; + mc->width = xmax - xmin; + } + if (mc->y + mc->height >= ymax) + mc->y = ymax - mc->height; if (mc->y < ymin) { mc->y = ymin; - dy = ymax - ymin; + mc->height = ymax - ymin; } if (mc->x != xsave || mc->y != ysave) xu_ptr_setpos(sc->rootwin, mc->x, mc->y); XClearWindow(X_Dpy, sc->menuwin); - XMoveResizeWindow(X_Dpy, sc->menuwin, mc->x, mc->y, mc->width, dy); + XMoveResizeWindow(X_Dpy, sc->menuwin, mc->x, mc->y, + mc->width, mc->height); if (mc->hasprompt) { font_draw(sc, mc->dispstr, strlen(mc->dispstr), sc->menuwin, @@ -387,9 +386,14 @@ menu_draw(struct screen_ctx *sc, struct menu_ctx *mc, struct menu_q *menuq, TAILQ_FOREACH(mi, resultq, resultentry) { char *text = mi->print[0] != '\0' ? mi->print : mi->text; + int y = n * font_height(sc) + font_ascent(sc) + 1; + + /* Stop drawing when menu doesn't fit inside the screen. */ + if (mc->y + y > ymax) + break; font_draw(sc, text, MIN(strlen(text), MENU_MAXENTRY), - sc->menuwin, 0, n * font_height(sc) + font_ascent(sc) + 1); + sc->menuwin, 0, y); n++; } diff --git a/parse.y b/parse.y index df5db09..024dd5e 100644 --- a/parse.y +++ b/parse.y @@ -529,8 +529,6 @@ parse_config(const char *filename, struct conf *xconf) return (-1); } - (void)strlcpy(conf->conf_path, filename, sizeof(conf->conf_path)); - conf_init(conf); yyparse(); diff --git a/xutil.c b/xutil.c index 66f710f..46540c5 100644 --- a/xutil.c +++ b/xutil.c @@ -429,9 +429,3 @@ xu_getcolor(struct screen_ctx *sc, char *name) return (color.pixel); } - -void -xu_freecolor(struct screen_ctx *sc, unsigned long pixel) -{ - XFreeColors(X_Dpy, DefaultColormap(X_Dpy, sc->which), &pixel, 1, 0L); -}