express keymap bindings as [command-name args]

instead of using functions directly. This is so that the
appropriate frame-relevant commander can be used to execure
the command, but also makes the keymaps a little less opaque
main
Daniel Barlow 2022-12-26 16:53:41 +00:00
parent a5612fce2a
commit dd139c9796
4 changed files with 40 additions and 34 deletions

View File

@ -9,17 +9,10 @@
;;; when we decide how to do an init file/rc file, this will go in it ;;; when we decide how to do an init file/rc file, this will go in it
(local my-keymap { (local my-keymap {
"g" #(Command.invoke-interactively "g" ["visit-location" {:buffer "main"}]
"visit-location" "M-q" ["quit-browser" {}]
{:buffer "main"})
"M-q" #(Command.invoke-interactively
"quit-browser"
{})
"C-x" { "C-x" {
"C-c" "C-c" ["quit-browser" {}]
#(Command.invoke-interactively
"quit-browser"
{})
} }
}) })

View File

@ -32,7 +32,7 @@
(fn [window event] (fn [window event]
(when (not (Command.active?)) (when (not (Command.active?))
(match (recogniser:accept-event event) (match (recogniser:accept-event event)
c (c) [name params] (Command.invoke-interactively name params)
(nil prompt) (print "prompted" prompt))) (nil prompt) (print "prompted" prompt)))
(when (and event.state.MOD1_MASK (when (and event.state.MOD1_MASK
(= event.keyval (string.byte "x"))) (= event.keyval (string.byte "x")))

View File

@ -26,13 +26,17 @@
(bor m (. Gdk.ModifierType k)))] (bor m (. Gdk.ModifierType k)))]
(spec->index {:keyval event.keyval : modmask}))) (spec->index {:keyval event.keyval : modmask})))
(fn designates-command? [tbl]
;; a keymap entry has a string as key, a command
;; definition is a numerically-indexed array
(if (. tbl 1) true))
(fn compile-keymap [input] (fn compile-keymap [input]
(collect [k v (pairs input)] (collect [k v (pairs input)]
(let [f (-> k keychord->spec spec->index)] (let [f (-> k keychord->spec spec->index)]
(match (type v) (if (designates-command? v)
"function" (values f v) (values f v)
"table" (values f (compile-keymap v)))))) (values f (compile-keymap v))))))
(fn recogniser [source-keymap] (fn recogniser [source-keymap]
(let [keymap (compile-keymap source-keymap)] (let [keymap (compile-keymap source-keymap)]
@ -42,18 +46,17 @@
(fn [_ e] (fn [_ e]
(let [c (event->index e) (let [c (event->index e)
v (. m c)] v (. m c)]
(match (type v) (if v
"table" (do (if (designates-command? v)
(set m v) (do
(values nil (.. c " ")))
"function" (do
(set m keymap)
v)
"nil" (do
(set m keymap) (set m keymap)
(values nil (.. "No binding for " (view e) " "))) v)
(do
))) (set m v)
(values nil (.. c " "))))
(do
(set m keymap)
(values nil (.. "No binding for " (view e) " "))))))
})) }))

View File

@ -6,13 +6,15 @@
(local Mod Gdk.ModifierType) (local Mod Gdk.ModifierType)
(local km (local km {
{"a" "a" {
{"a" #1 "a" ["command-1"]
"b" #2} "b" ["command-2" {:arg-1 "10" :arg-2 "11"}]
"b" }
{"z" #3} "b" {
"c" #4 "z" ["command-3"]
}
"c" ["command-4"]
}) })
(fn fake-key-event [c] (fn fake-key-event [c]
@ -40,8 +42,16 @@
(let [r (keymap.recogniser km) (let [r (keymap.recogniser km)
(ok err) (ok err)
(match (r:accept-event (fake-key-event "c")) (match (r:accept-event (fake-key-event "c"))
(where f (= (f) 4)) true ["command-4"] true
x (values false (view x)) x (values false (view x))
nil (values false "???"))] nil (values false "???"))]
(assert ok err))
(let [r (keymap.recogniser km)
(ok err)
(match-try
(r:accept-event (fake-key-event "a"))
nil (r:accept-event (fake-key-event "b"))
["command-2" {:arg-1 "10" :arg-2 "11"}] true
(catch x (values false (view x))))]
(assert ok err)) (assert ok err))