From: Lawrence Teo Date: Wed, 26 Oct 2011 02:40:12 +0000 (-0400) Subject: new keyboard_mapping option to load pre-defined key bindings for X-Git-Url: https://jasonwoof.com/gitweb/?a=commitdiff_plain;h=9c3aa396f4b0e3dfe37a4f7784ca008a6f5046d0;p=spectrwm.git new keyboard_mapping option to load pre-defined key bindings for different keyboard layouts ok marco --- diff --git a/scrotwm.1 b/scrotwm.1 index cb691c5..d6a0099 100644 --- a/scrotwm.1 +++ b/scrotwm.1 @@ -120,6 +120,11 @@ script. Some applications have dialogue windows that are too small to be useful. This ratio is the screen size to what they will be resized. For example, 0.6 is 60% of the physical screen size. +.It Cm keyboard_mapping +Clear all key bindings and load new key bindings from the specified file. +This allows you to load pre-defined key bindings for your keyboard layout. +At present, keyboard mapping files for the US and Spanish keyboards are +provided in scrotwm_us.conf and scrotwm_es.conf respectively. .It Cm layout Select layout to use at start-of-day. Defined in the format diff --git a/scrotwm.c b/scrotwm.c index 862077f..47e7319 100644 --- a/scrotwm.c +++ b/scrotwm.c @@ -162,6 +162,9 @@ u_int32_t swm_debug = 0 #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 @@ -236,6 +239,7 @@ int bar_fidx = 0; 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) @@ -321,6 +325,8 @@ void new_region(struct swm_screen *, int, int, int, int); 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); @@ -4383,6 +4389,37 @@ setup_keys(void) } 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; @@ -4906,6 +4943,7 @@ struct config_option configopt[] = { { "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 }, @@ -4937,7 +4975,7 @@ struct config_option configopt[] = { int -conf_load(char *filename) +conf_load(char *filename, int keymapping) { FILE *config; char *line, *cp, *optsub, *optval; @@ -4952,7 +4990,7 @@ conf_load(char *filename) return (1); } if ((config = fopen(filename, "r")) == NULL) { - warn("conf_load: fopen"); + warn("conf_load: fopen: %s", filename); return (1); } @@ -4992,6 +5030,11 @@ conf_load(char *filename) 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 */ @@ -6266,7 +6309,6 @@ workaround(void) int main(int argc, char *argv[]) { - struct passwd *pwd; struct swm_region *r, *rr; struct ws_win *winfocus = NULL; struct timeval tv; @@ -6337,7 +6379,7 @@ main(int argc, char *argv[]) cfile = conf; } if (cfile) - conf_load(cfile); + conf_load(cfile, SWM_CONF_DEFAULT); setup_ewmh(); /* set some values to work around bad programs */ diff --git a/scrotwm.conf b/scrotwm.conf index 2bc0fcc..ae06e3b 100644 --- a/scrotwm.conf +++ b/scrotwm.conf @@ -57,73 +57,9 @@ dialog_ratio = 0.6 # mod key, (windows key is Mod4) (apple key on OSX is Mod2) # modkey = Mod1 -# key bindings -# unbind with: bind[] = -#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