fixes shift/unshift bug

This commit is contained in:
Harald Albrecht 2019-01-07 13:28:26 +01:00
parent b608f2cc28
commit 0810e11a40
3 changed files with 60 additions and 43 deletions

View File

@ -30,8 +30,12 @@ local mb = require "snippets/multibow"
-- Unshift to primary keymap. For simplification, use it with the "anykey" -- Unshift to primary keymap. For simplification, use it with the "anykey"
-- release handlers, see below. -- release handlers, see below.
function k.unshift() function k.unshift(keyno)
mb.activate_keymap(k.keymap.name) if keyno == 11 then
print(debug.traceback())
else
mb.activate_keymap(k.keymap.name)
end
end end
-- Key colors for unshifted and shifted keys; keep them rather muted in order -- Key colors for unshifted and shifted keys; keep them rather muted in order

View File

@ -20,17 +20,31 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE. SOFTWARE.
]] -- ]] --
-- This all-key, central key router forwards Keybow key events to -- This all-key, central key router forwards Keybow key events to their
-- their correct handlers, depending on which keyboard layout currently -- correct handlers, depending on which keyboard layout currently is active.
-- is active. --
-- A keymap grab will always only route keys to the "grabbing" keymap, and to
-- no other keymap. Without a keymap grab in place, permanent keymaps will be
-- searched first for a matching key definition, with the first hit to score.
-- The current keymap will be considered only last, after all permanent
-- keymaps have been exhausted.
--
-- Additionally, "any" keyhandlers will be considered only for (1) the
-- grabbing keymap (if a grab is active) and for (2) the current keymap.
-- Permanent keymaps cannot have "any" key handlers (or rather, they will be
-- ignored.)
function mb.route(keyno, pressed) function mb.route(keyno, pressed)
local keydef, grabbed_any_keydef, anykdeydef local keydef, any_kdeydef
-- Checks for a keymap grab being enforced at this time... -- Checks for a keymap grab being enforced at this time; if the grabbing
-- keymap does not define the key, then it's game over. Additionally,
-- grabbing keymaps may define "any" handlers.
if mb.grab_keymap then if mb.grab_keymap then
keydef = mb.grab_keymap[keyno] keydef = mb.grab_keymap[keyno]
grabbed_any_keydef = mb.grab_keymap[-1] any_kdeydef = mb.grab_keymap[-1]
else else
-- Checks for key in permanent keymaps first... -- No grab in place, so continue checking for a matching key in the
-- permanent keymaps first. Remember, there cannot be "any" handlers
-- with permanent keymaps.
for name, keymap in pairs(mb.keymaps) do for name, keymap in pairs(mb.keymaps) do
if keymap.permanent then if keymap.permanent then
keydef = keymap[keyno] keydef = keymap[keyno]
@ -39,17 +53,18 @@ function mb.route(keyno, pressed)
end end
end end
end end
-- Checks for key in current keymap if no persistent key was found yet. -- If no permanent key matched then finally check for our key in the
if not keydef then -- current keymap. Additionally, the current keymap is allowed to
if mb.current_keymap then -- define an "any" handler.
keydef = mb.current_keymap[keyno] if not keydef and mb.current_keymap then
anykeydef = mb.current_keymap[-1] keydef = mb.current_keymap[keyno]
end any_kdeydef = mb.current_keymap[-1]
end end
end end
-- Bails out if no key definition to route to could be found. -- Bails out now if either a specific nor an "any" key definition to route
if not (keydef or anykeydef or grabbed_any_keydef) then -- to could be found.
if not (keydef or any_kdeydef) then
return return
end end
@ -61,25 +76,13 @@ function mb.route(keyno, pressed)
mb.led(led, {r = 0, g = 0, b = 0}) mb.led(led, {r = 0, g = 0, b = 0})
end end
end end
if grabbed_any_keydef and grabbed_any_keydef.press then
grabbed_any_keydef.press(keyno) if keydef and keydef.press then keydef.press(keyno) end
end if any_kdeydef and any_kdeydef.press then any_kdeydef.press(keyno) end
if keydef and keydef.press then
keydef.press(keyno)
end
if anykeydef and anykeydef.press then
anykeydef.press(keyno)
end
else else
if grabbed_any_keydef and grabbed_any_keydef.release then if keydef and keydef.release then keydef.release(keyno) end
grabbed_any_keydef.release(keyno) if any_kdeydef and any_kdeydef.release then any_kdeydef.release(keyno) end
end
if keydef and keydef.release then
keydef.release(keyno)
end
if anykeydef and anykeydef.release then
anykeydef.release(keyno)
end
mb.activate_leds() mb.activate_leds()
end end
end end

View File

@ -46,14 +46,24 @@ describe("Kdenlive keymap", function()
_G.setup() _G.setup()
end) end)
inslit("", function() inslit("automatically un-shifts after key press", function()
assert.is.equal(k.keymap.name, mb.current_keymap.name) local some_key = shift.KEY_SHIFT ~= 0 and 0 or 1
hwk.tap(shift.KEY_SHIFT)
assert.is.equal(k.keymap_shifted.name, mb.current_keymap.name) for round = 1, 2 do
hwk.tap(0) -- FIXME for round = 1, 2 do
assert.is.equal(k.keymap.name, mb.current_keymap.name) assert.is.equal(k.keymap.name, mb.current_keymap.name)
hwk.tap(shift.KEY_SHIFT) hwk.tap(shift.KEY_SHIFT)
assert.is.equal(k.keymap_shifted.name, mb.current_keymap.name) assert.is.equal(k.keymap_shifted.name, mb.current_keymap.name)
hwk.tap(some_key)
assert.is.equal(k.keymap.name, mb.current_keymap.name)
end
for round = 1, 2 do
hwk.tap(shift.KEY_SHIFT)
assert.is.equal(k.keymap_shifted.name, mb.current_keymap.name)
hwk.tap(shift.KEY_SHIFT)
assert.is.equal(k.keymap.name, mb.current_keymap.name)
end
end
end) end)
end) end)