use keymap to choose command to invoke

This commit is contained in:
Daniel Barlow 2022-12-22 22:42:45 +00:00
parent a489df34ab
commit 25d31e0262
5 changed files with 62 additions and 7 deletions

View File

@ -1,2 +1,2 @@
repl: fennel repl: fennel
test: find . | entr sh test/run.sh test: find . -type d | entr -d sh test/run.sh

View File

@ -1,7 +1,7 @@
(local { : Gtk : Gdk : WebKit2 : cairo } (require :lgi)) (local { : Gtk : Gdk : WebKit2 : cairo } (require :lgi))
(local { : view } (require :fennel)) (local { : view } (require :fennel))
(fn new-buffer [name] (fn new-buffer [name keymap]
(let [props {} (let [props {}
widget (WebKit2.WebView { widget (WebKit2.WebView {
;; :on_decide_policy ;; :on_decide_policy

View File

@ -1,12 +1,29 @@
(local { : Gtk : Gdk : WebKit2 : cairo } (require :lgi)) (local { : Gtk : Gdk : WebKit2 : cairo } (require :lgi))
(local { : view } (require :fennel)) (local { : view } (require :fennel))
(local Command (require :command)) (local Command (require :command))
(local keymap (require :keymap))
(var frames []) (var frames [])
(fn new-frame [] (fn new-frame []
(let [hpad 2 (let [hpad 2
vpad 2 vpad 2
recogniser (keymap.recogniser
{
"g" #(Command.invoke-interactively
"visit-location"
{:buffer "main"})
"q" #(Command.invoke-interactively
"quit-browser"
{})
"c" {
"x"
#(Command.invoke-interactively
"quit-browser"
{})
}
})
window (Gtk.Window { window (Gtk.Window {
:title "Dunlin" :title "Dunlin"
:default_width 800 :default_width 800
@ -36,11 +53,10 @@
(tset window :on_key_release_event (tset window :on_key_release_event
(fn [window event] (fn [window event]
(when (and (not (Command.active?)) (when (not (Command.active?))
(= event.keyval (string.byte "g"))) (match (recogniser:accept (string.char event.keyval))
(Command.invoke-interactively c (c)
"visit-location" (nil prompt) (print "prompted" prompt)))
{:buffer "main"}))
(when (and event.state.MOD1_MASK (when (and event.state.MOD1_MASK
(= event.keyval (string.byte "x"))) (= event.keyval (string.byte "x")))
(Command.activate)))) (Command.activate))))

19
keymap.fnl Normal file
View File

@ -0,0 +1,19 @@
(fn recogniser [keymap]
(var m keymap)
{
:accept
(fn [_ c]
(let [v (. m c)]
(match (type v)
"table" (do
(set m v)
(values nil (.. c " ")))
"function" (do
(set m keymap)
v))))
})
{ : recogniser }

20
test/keymap.fnl Normal file
View File

@ -0,0 +1,20 @@
(local { : view } (require :fennel))
(local keymap (require :keymap))
(local km
{"a"
{"a" #1
"b" #2}
"b"
{"z" #3}
"c" #4
})
(let [r (keymap.recogniser km)
(ok err)
(match (r:accept "c")
(where f (= (f) 4)) true
x (values false (x)))]
(assert ok err))