From 0810e11a409906ee707795041706bde2e3f42972 Mon Sep 17 00:00:00 2001 From: Harald Albrecht Date: Mon, 7 Jan 2019 13:28:26 +0100 Subject: [PATCH] fixes shift/unshift bug --- sdcard/layouts/kdenlive.lua | 8 +++- sdcard/snippets/routehandlers.lua | 69 ++++++++++++++++--------------- spec/layouts/kdenlive_spec.lua | 26 ++++++++---- 3 files changed, 60 insertions(+), 43 deletions(-) diff --git a/sdcard/layouts/kdenlive.lua b/sdcard/layouts/kdenlive.lua index bca9aea..5c11e50 100644 --- a/sdcard/layouts/kdenlive.lua +++ b/sdcard/layouts/kdenlive.lua @@ -30,8 +30,12 @@ local mb = require "snippets/multibow" -- Unshift to primary keymap. For simplification, use it with the "anykey" -- release handlers, see below. -function k.unshift() - mb.activate_keymap(k.keymap.name) +function k.unshift(keyno) + if keyno == 11 then + print(debug.traceback()) + else + mb.activate_keymap(k.keymap.name) + end end -- Key colors for unshifted and shifted keys; keep them rather muted in order diff --git a/sdcard/snippets/routehandlers.lua b/sdcard/snippets/routehandlers.lua index 4480c4d..b2e4529 100644 --- a/sdcard/snippets/routehandlers.lua +++ b/sdcard/snippets/routehandlers.lua @@ -20,17 +20,31 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ]] -- --- This all-key, central key router forwards Keybow key events to --- their correct handlers, depending on which keyboard layout currently --- is active. +-- This all-key, central key router forwards Keybow key events to their +-- correct handlers, depending on which keyboard layout currently 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) - local keydef, grabbed_any_keydef, anykdeydef - -- Checks for a keymap grab being enforced at this time... + local keydef, any_kdeydef + -- 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 keydef = mb.grab_keymap[keyno] - grabbed_any_keydef = mb.grab_keymap[-1] + any_kdeydef = mb.grab_keymap[-1] 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 if keymap.permanent then keydef = keymap[keyno] @@ -39,17 +53,18 @@ function mb.route(keyno, pressed) end end end - -- Checks for key in current keymap if no persistent key was found yet. - if not keydef then - if mb.current_keymap then - keydef = mb.current_keymap[keyno] - anykeydef = mb.current_keymap[-1] - end + -- If no permanent key matched then finally check for our key in the + -- current keymap. Additionally, the current keymap is allowed to + -- define an "any" handler. + if not keydef and mb.current_keymap then + keydef = mb.current_keymap[keyno] + any_kdeydef = mb.current_keymap[-1] end end - -- Bails out if no key definition to route to could be found. - if not (keydef or anykeydef or grabbed_any_keydef) then + -- Bails out now if either a specific nor an "any" key definition to route + -- to could be found. + if not (keydef or any_kdeydef) then return end @@ -61,25 +76,13 @@ function mb.route(keyno, pressed) mb.led(led, {r = 0, g = 0, b = 0}) end end - if grabbed_any_keydef and grabbed_any_keydef.press then - grabbed_any_keydef.press(keyno) - end - if keydef and keydef.press then - keydef.press(keyno) - end - if anykeydef and anykeydef.press then - anykeydef.press(keyno) - end + + if keydef and keydef.press then keydef.press(keyno) end + if any_kdeydef and any_kdeydef.press then any_kdeydef.press(keyno) end else - if grabbed_any_keydef and grabbed_any_keydef.release then - grabbed_any_keydef.release(keyno) - end - if keydef and keydef.release then - keydef.release(keyno) - end - if anykeydef and anykeydef.release then - anykeydef.release(keyno) - end + if keydef and keydef.release then keydef.release(keyno) end + if any_kdeydef and any_kdeydef.release then any_kdeydef.release(keyno) end + mb.activate_leds() end end diff --git a/spec/layouts/kdenlive_spec.lua b/spec/layouts/kdenlive_spec.lua index 5a67dfc..ebaf3a5 100644 --- a/spec/layouts/kdenlive_spec.lua +++ b/spec/layouts/kdenlive_spec.lua @@ -46,14 +46,24 @@ describe("Kdenlive keymap", function() _G.setup() end) - inslit("", function() - assert.is.equal(k.keymap.name, mb.current_keymap.name) - hwk.tap(shift.KEY_SHIFT) - assert.is.equal(k.keymap_shifted.name, mb.current_keymap.name) - hwk.tap(0) -- FIXME - assert.is.equal(k.keymap.name, mb.current_keymap.name) - hwk.tap(shift.KEY_SHIFT) - assert.is.equal(k.keymap_shifted.name, mb.current_keymap.name) + inslit("automatically un-shifts after key press", function() + local some_key = shift.KEY_SHIFT ~= 0 and 0 or 1 + + for round = 1, 2 do + for round = 1, 2 do + assert.is.equal(k.keymap.name, mb.current_keymap.name) + hwk.tap(shift.KEY_SHIFT) + 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)