]> git.sur5r.net Git - i3/i3/commitdiff
Allow "modifier none" in i3bar to disable the modifier. 2209/head
authorIngo Bürk <ingo.buerk@tngtech.com>
Thu, 11 Feb 2016 18:57:32 +0000 (19:57 +0100)
committerIngo Bürk <ingo.buerk@tngtech.com>
Thu, 11 Feb 2016 19:51:05 +0000 (20:51 +0100)
This allows "modifier none" (and "modifier off") for the bar config
in order to disable the modifier key altogether. This is useful
for users who use a different approach to hiding / showing the bar,
e.g., a custom keybind that involved multiple keys or scripts.

fixes #2208

docs/userguide
i3bar/src/config.c
i3bar/src/xcb.c
parser-specs/config.spec
src/config_directives.c
src/ipc.c

index e67a8c09ce4cadf0533fd42518653bb6de7d21af..f3f80c96fbe4c9666d1a052a9d219eafad8266c0 100644 (file)
@@ -1238,7 +1238,7 @@ the windows key). The default value for the hidden_state is hide.
 -------------------------
 mode dock|hide|invisible
 hidden_state hide|show
-modifier <Modifier>
+modifier <Modifier>|none
 ------------------------
 
 *Example*:
@@ -1250,7 +1250,8 @@ bar {
 }
 ----------------
 
-Available modifiers are Mod1-Mod5, Shift, Control (see +xmodmap(1)+).
+Available modifiers are Mod1-Mod5, Shift, Control (see +xmodmap(1)+). You can
+also use "none" if you don't want any modifier to trigger this behavior.
 
 === Mouse button commands
 
index bc13f3d902f321f183a0c51ae66017a8869778cd..5c23bc78647775b4bb532dfcb966054ed1279555 100644 (file)
@@ -121,6 +121,11 @@ static int config_string_cb(void *params_, const unsigned char *val, size_t _len
 
     if (!strcmp(cur_key, "modifier")) {
         DLOG("modifier = %.*s\n", len, val);
+        if (len == 4 && !strncmp((const char *)val, "none", strlen("none"))) {
+            config.modifier = XCB_NONE;
+            return 1;
+        }
+
         if (len == 5 && !strncmp((const char *)val, "shift", strlen("shift"))) {
             config.modifier = ShiftMask;
             return 1;
@@ -140,16 +145,12 @@ static int config_string_cb(void *params_, const unsigned char *val, size_t _len
                 case '3':
                     config.modifier = Mod3Mask;
                     return 1;
-                /*
-                case '4':
-                    config.modifier = Mod4Mask;
-                    return 1;
-                */
                 case '5':
                     config.modifier = Mod5Mask;
                     return 1;
             }
         }
+
         config.modifier = Mod4Mask;
         return 1;
     }
index 30111aab5c13e424241eda6082849371e4d3169c..d2aa28e9cbe1ab8660cfa41dfbc1095e17d88ddc 100644 (file)
@@ -1094,7 +1094,7 @@ void xcb_chk_cb(struct ev_loop *loop, ev_check *watcher, int revents) {
             DLOG("received an xkb event\n");
 
             xcb_xkb_state_notify_event_t *state = (xcb_xkb_state_notify_event_t *)event;
-            if (state->xkbType == XCB_XKB_STATE_NOTIFY) {
+            if (state->xkbType == XCB_XKB_STATE_NOTIFY && config.modifier != XCB_NONE) {
                 int modstate = state->mods & config.modifier;
 
 #define DLOGMOD(modmask, status)                        \
index f5275028de4235ca99891263e6c11f56cdb9dd85..ef3bc2e0e4eeb69834057385d4fd03fb1646400c 100644 (file)
@@ -453,7 +453,7 @@ state BAR_ID:
       -> call cfg_bar_id($bar_id); BAR
 
 state BAR_MODIFIER:
-  modifier = 'Mod1', 'Mod2', 'Mod3', 'Mod4', 'Mod5', 'Control', 'Ctrl', 'Shift'
+  modifier = 'Mod1', 'Mod2', 'Mod3', 'Mod4', 'Mod5', 'Control', 'Ctrl', 'Shift', 'none', 'off'
       -> call cfg_bar_modifier($modifier); BAR
 
 state BAR_WHEEL_UP_CMD:
index e92ef1d9fb38d49eb082a31fa1f3436c38a4c0c1..ec99321a9849b8b708010c4848769c203e80cffe 100644 (file)
@@ -446,6 +446,9 @@ CFGFUN(bar_modifier, const char *modifier) {
         current_bar->modifier = M_CONTROL;
     else if (strcmp(modifier, "Shift") == 0)
         current_bar->modifier = M_SHIFT;
+    else if (strcmp(modifier, "none") == 0 ||
+             strcmp(modifier, "off") == 0)
+        current_bar->modifier = M_NONE;
 }
 
 static void bar_configure_binding(const char *button, const char *command) {
@@ -575,6 +578,7 @@ CFGFUN(bar_start) {
     TAILQ_INIT(&(current_bar->bar_bindings));
     TAILQ_INIT(&(current_bar->tray_outputs));
     current_bar->tray_padding = 2;
+    current_bar->modifier = M_MOD4;
 }
 
 CFGFUN(bar_finish) {
index f46e71797b5262d41681162c7d270065d40b037f..566fe52a717acb1863612fdfb7ac5a7d35eba32a 100644 (file)
--- a/src/ipc.c
+++ b/src/ipc.c
@@ -611,6 +611,9 @@ static void dump_bar_config(yajl_gen gen, Barconfig *config) {
 
     ystr("modifier");
     switch (config->modifier) {
+        case M_NONE:
+            ystr("none");
+            break;
         case M_CONTROL:
             ystr("ctrl");
             break;
@@ -626,11 +629,6 @@ static void dump_bar_config(yajl_gen gen, Barconfig *config) {
         case M_MOD3:
             ystr("Mod3");
             break;
-        /*
-               case M_MOD4:
-               ystr("Mod4");
-               break;
-               */
         case M_MOD5:
             ystr("Mod5");
             break;