-/* $scrotwm$ */
/*
* Copyright (c) 2009-2010-2011 Marco Peereboom <marco@peereboom.us>
* Copyright (c) 2009-2010-2011 Ryan McBride <mcbride@countersiege.com>
* DEALINGS IN THE SOFTWARE.
*/
-static const char *cvstag =
- "$scrotwm$";
-
-#define SWM_VERSION "0.9.34"
-
#include <stdio.h>
#include <stdlib.h>
#include <err.h>
#include <osx.h>
#endif
+#include "version.h"
+
+#ifdef SCROTWM_BUILDSTR
+static const char *buildstr = SCROTWM_BUILDSTR;
+#else
+static const char *buildstr = SCROTWM_VERSION;
+#endif
+
#if RANDR_MAJOR < 1
# error XRandR versions less than 1.0 are not supported
#endif
#define SWM_FOCUS_SYNERGY (1)
#define SWM_FOCUS_FOLLOW (2)
+#define SWM_CONF_DEFAULT (0)
+#define SWM_CONF_KEYMAPPING (1)
+
#ifndef SWM_LIB
#define SWM_LIB "/usr/local/lib/libswmhack.so"
#endif
XFontStruct *bar_fs;
char *bar_fonts[] = { NULL, NULL, NULL, NULL };/* XXX Make fully dynamic */
char *spawn_term[] = { NULL, NULL }; /* XXX Make fully dynamic */
+struct passwd *pwd;
#define SWM_MENU_FN (2)
#define SWM_MENU_NB (4)
void unmanage_window(struct ws_win *);
long getstate(Window);
+int conf_load(char *, int);
+
struct layout {
void (*l_stack)(struct workspace *, struct swm_geometry *);
void (*l_config)(struct workspace *, int);
void
fancy_stacker(struct workspace *ws)
{
- strcpy(ws->stacker, "[ ]");
+ strlcpy(ws->stacker, "[ ]", sizeof ws->stacker);
if (ws->cur_layout->l_stack == vertical_stack)
snprintf(ws->stacker, sizeof ws->stacker, "[%d|%d]",
ws->l_state.vertical_mwin, ws->l_state.vertical_stacks);
void
plain_stacker(struct workspace *ws)
{
- strcpy(ws->stacker, "[ ]");
+ strlcpy(ws->stacker, "[ ]", sizeof ws->stacker);
if (ws->cur_layout->l_stack == vertical_stack)
- strcpy(ws->stacker, "[|]");
+ strlcpy(ws->stacker, "[|]", sizeof ws->stacker);
if (ws->cur_layout->l_stack == horizontal_stack)
- strcpy(ws->stacker, "[-]");
+ strlcpy(ws->stacker, "[-]", sizeof ws->stacker);
}
void
char s[SWM_BAR_MAX];
char cn[SWM_BAR_MAX];
char loc[SWM_BAR_MAX];
- char *b;
+ char *b, *stack = "";
if (bar_enabled == 0)
return;
bar_class_name(cn, sizeof cn, r->ws->focus);
bar_window_name(cn, sizeof cn, r->ws->focus);
}
+ if (stack_enabled)
+ stack = r->ws->stacker;
snprintf(loc, sizeof loc, "%d:%d %s %s%s %s %s",
- x++, r->ws->idx + 1, r->ws->stacker, s, cn, bar_ext,
- bar_vertext);
+ x++, r->ws->idx + 1, stack, s, cn, bar_ext, bar_vertext);
bar_print(r, loc);
}
}
{
bar_version = !bar_version;
if (bar_version)
- snprintf(bar_vertext, sizeof bar_vertext, "Version: %s CVS: %s",
- SWM_VERSION, cvstag);
+ snprintf(bar_vertext, sizeof bar_vertext, "Version: %s Build: %s",
+ SCROTWM_VERSION, buildstr);
else
strlcpy(bar_vertext, "", sizeof bar_vertext);
bar_update();
if ((resp = calloc(1, MAX_RESP_LEN + 1)) == NULL) {
fprintf(stderr, "search: calloc\n");
- return;
+ goto done;
}
rbytes = read(select_resp_pipe[0], resp, MAX_RESP_LEN);
free(s);
}
done:
+ close(select_resp_pipe[0]);
free(resp);
}
{
XEvent ev;
Time time = 0;
- struct swm_region *r = win->ws->r;
+ struct swm_region *r = NULL;
int relx, rely;
int resize_step = 0;
+ if (win == NULL)
+ return;
+ r = win->ws->r;
DNPRINTF(SWM_D_MOUSE, "resize: win %lu floating %d trans %lu\n",
win->id, win->floating, win->transient);
{
struct ws_win *win = NULL;
- if (r && r->ws)
+ if (r && r->ws && r->ws->focus)
win = r->ws->focus;
else
return;
XEvent ev;
Time time = 0;
int move_step = 0;
- struct swm_region *r = win->ws->r;
+ struct swm_region *r = NULL;
+
+ if (win == NULL)
+ return;
+ r = win->ws->r;
DNPRINTF(SWM_D_MOUSE, "move: win %lu floating %d trans %lu\n",
win->id, win->floating, win->transient);
{
struct ws_win *win = NULL;
- if (r && r->ws)
+ if (r && r->ws && r->ws->focus)
win = r->ws->focus;
else
return;
}
void
+clear_keys(void)
+{
+ int i;
+
+ /* clear all key bindings, if any */
+ for (i = 0; i < keys_length; i++)
+ free(keys[i].spawn_name);
+ keys_length = 0;
+}
+
+int
+setkeymapping(char *selector, char *value, int flags)
+{
+ char keymapping_file[PATH_MAX];
+ DNPRINTF(SWM_D_KEY, "setkeymapping: enter\n");
+ if (value[0] == '~')
+ snprintf(keymapping_file, sizeof keymapping_file, "%s/%s",
+ pwd->pw_dir, &value[1]);
+ else
+ strlcpy(keymapping_file, value, sizeof keymapping_file);
+ clear_keys();
+ /* load new key bindings; if it fails, revert to default bindings */
+ if (conf_load(keymapping_file, SWM_CONF_KEYMAPPING)) {
+ clear_keys();
+ setup_keys();
+ }
+ DNPRINTF(SWM_D_KEY, "setkeymapping: leave\n");
+ return (0);
+}
+
+void
updatenumlockmask(void)
{
unsigned int i, j;
int
setconfvalue(char *selector, char *value, int flags)
{
- int i;
+ int i;
+
switch (flags) {
case SWM_S_BAR_DELAY:
bar_delay = atoi(value);
{ "bar_font", setconfvalue, SWM_S_BAR_FONT },
{ "bar_action", setconfvalue, SWM_S_BAR_ACTION },
{ "bar_delay", setconfvalue, SWM_S_BAR_DELAY },
+ { "keyboard_mapping", setkeymapping, 0 },
{ "bind", setconfbinding, 0 },
{ "stack_enabled", setconfvalue, SWM_S_STACK_ENABLED },
{ "clock_enabled", setconfvalue, SWM_S_CLOCK_ENABLED },
int
-conf_load(char *filename)
+conf_load(char *filename, int keymapping)
{
FILE *config;
char *line, *cp, *optsub, *optval;
return (1);
}
if ((config = fopen(filename, "r")) == NULL) {
- warn("conf_load: fopen");
+ warn("conf_load: fopen: %s", filename);
return (1);
}
filename, lineno, wordlen, cp);
return (1);
}
+ if (keymapping && strcmp(opt->optname, "bind")) {
+ warnx("%s: line %zd: invalid option %.*s",
+ filename, lineno, wordlen, cp);
+ return (1);
+ }
cp += wordlen;
cp += strspn(cp, " \t\n"); /* eat whitespace */
/* get [selector] if any */
int
main(int argc, char *argv[])
{
- struct passwd *pwd;
struct swm_region *r, *rr;
struct ws_win *winfocus = NULL;
struct timeval tv;
struct sigaction sact;
start_argv = argv;
- fprintf(stderr, "Welcome to scrotwm V%s cvs tag: %s\n",
- SWM_VERSION, cvstag);
+ fprintf(stderr, "Welcome to scrotwm V%s Build: %s\n",
+ SCROTWM_VERSION, buildstr);
if (!setlocale(LC_CTYPE, "") || !XSupportsLocale())
warnx("no locale support");
cfile = conf;
}
if (cfile)
- conf_load(cfile);
+ conf_load(cfile, SWM_CONF_DEFAULT);
setup_ewmh();
/* set some values to work around bad programs */