#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
+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;
{ "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;
cfile = conf;
}
if (cfile)
- conf_load(cfile);
+ conf_load(cfile, SWM_CONF_DEFAULT);
setup_ewmh();
/* set some values to work around bad programs */
# mod key, (windows key is Mod4) (apple key on OSX is Mod2)
# modkey = Mod1
-# key bindings
-# unbind with: bind[] = <keys>
-#bind[cycle_layout] = MOD+space
-#bind[stack_reset] = MOD+Shift+space
-#bind[master_shrink] = MOD+h
-#bind[master_grow] = MOD+l
-#bind[master_add] = MOD+comma
-#bind[master_del] = MOD+period
-#bind[stack_inc] = MOD+Shift+comma
-#bind[stack_dec] = MOD+Shift+period
-#bind[swap_main] = MOD+Return
-#bind[focus_next] = MOD+j
-#bind[focus_prev] = MOD+k
-#bind[swap_next] = MOD+Shift+j
-#bind[swap_prev] = MOD+Shift+k
-#bind[spawn_term] = MOD+Shift+Return
-#bind[menu] = MOD+p
-#bind[quit] = MOD+Shift+q
-#bind[restart] = MOD+q
-#bind[focus_main] = MOD+m
-#bind[ws_1] = MOD+1
-#bind[ws_2] = MOD+2
-#bind[ws_3] = MOD+3
-#bind[ws_4] = MOD+4
-#bind[ws_5] = MOD+5
-#bind[ws_6] = MOD+6
-#bind[ws_7] = MOD+7
-#bind[ws_8] = MOD+8
-#bind[ws_9] = MOD+9
-#bind[ws_10] = MOD+0
-#bind[ws_next] = MOD+Right
-#bind[ws_prev] = MOD+Left
-#bind[screen_next] = MOD+Shift+Right
-#bind[screen_prev] = MOD+Shift+Left
-#bind[mvws_1] = MOD+Shift+1
-#bind[mvws_2] = MOD+Shift+2
-#bind[mvws_3] = MOD+Shift+3
-#bind[mvws_4] = MOD+Shift+4
-#bind[mvws_5] = MOD+Shift+5
-#bind[mvws_6] = MOD+Shift+6
-#bind[mvws_7] = MOD+Shift+7
-#bind[mvws_8] = MOD+Shift+8
-#bind[mvws_9] = MOD+Shift+9
-#bind[mvws_10] = MOD+Shift+0
-#bind[bar_toggle] = MOD+b
-#bind[focus_next] = MOD+Tab
-#bind[focus_prev] = MOD+Shift+Tab
-#bind[wind_kill] = MOD+Shift+x
-#bind[wind_del] = MOD+x
-#bind[screenshot_all] = MOD+s
-#bind[screenshot_wind] = MOD+Shift+s
-#bind[float_toggle] = MOD+t
-#bind[version] = MOD+Shift+v
-#bind[lock] = MOD+Shift+Delete
-#bind[initscr] = MOD+Shift+i
-#bind[iconify] = MOD+w
-#bind[uniconify] = MOD+Shift+w
-#bind[raise_toggle] = MOD+Shift+r
-#bind[button2] = MOD+v
-#bind[width_shrink] = MOD+minus
-#bind[width_grow] = MOD+equal
-#bind[height_shrink] = MOD+Shift+minus
-#bind[height_grow] = MOD+Shift+equal
-#bind[move_left] = MOD+bracketleft
-#bind[move_right] = MOD+bracketright
-#bind[move_up] = MOD+Shift+bracketleft
-#bind[move_down] = MOD+Shift+bracketright
+# Clear key bindings and load new key bindings from the specified file.
+# This allows you to load pre-defined key bindings for your keyboard layout.
+# keyboard_mapping = ~/.scrotwm_us.conf
# quirks
# remove with: quirk[class:name] = NONE