]> git.sur5r.net Git - i3/i3/commit
Reset B_UPON_KEYRELEASE_IGNORE_MODS bindings when switching modes 3179/head
authorOrestis Floros <orestisf1993@gmail.com>
Mon, 19 Mar 2018 23:44:50 +0000 (01:44 +0200)
committerOrestis Floros <orestisf1993@gmail.com>
Tue, 20 Mar 2018 02:09:34 +0000 (04:09 +0200)
commitdc0337d2e543c57f3b40bed5bb3f3a324718ab72
treed3f68ceb0f0615253caeb47d1f155c1ad2dfee22
parentff579ef22f7ba2fa4762564f84bfa062e79cfaa2
Reset B_UPON_KEYRELEASE_IGNORE_MODS bindings when switching modes

With example config:
    mode "a_mode" {
        bindcode 27 --release mode "default"
    }
    bindsym $mod+r mode "a_mode"

The first time $mod+r is pressed "a_mode" is activated like normal. When
r (bindcode 27) is pressed to exit the mode:
- On the KeyPress event the corresponding bind->release is correctly
marked as B_UPON_KEYRELEASE_IGNORE_MODS.
- On the KeyRelease event the command 'mode "default"' is executed but
bind->release is still B_UPON_KEYRELEASE_IGNORE_MODS since they are only
reset on KeyPress events.
The second time $mod+r is pressed and "a_mode" is activated and when the
r key is released the 'mode "default"' is executed even though the mods
are not matching since bind->release == B_UPON_KEYRELEASE_IGNORE_MODS.

This still doesn't catch 2 cases:
1. When the order is: press $mod -> press r -> release $mod -> release
    r. Since 'r' is released without any modifiers the binding matches.
2. With:
        mode "resize" {
            bindsym --release r mode "default"
        }
        bindsym r mode "resize"
    This is arguably correct: on the KeyPress event we switch to the mode and
    on the KeyRelease we switch back.
src/bindings.c
testcases/t/258-keypress-release.t