commit 25d31e02622a1b16f920a167f6ef0599dcf9ecdb
parent a489df34ab292ca3bc626038a8e0ca9ffaa990e4
Author: Daniel Barlow <dan@telent.net>
Date: Thu, 22 Dec 2022 22:42:45 +0000
use keymap to choose command to invoke
Diffstat:
5 files changed, 63 insertions(+), 8 deletions(-)
diff --git a/Procfile b/Procfile
@@ -1,2 +1,2 @@
repl: fennel
-test: find . | entr sh test/run.sh
-\ No newline at end of file
+test: find . -type d | entr -d sh test/run.sh
+\ No newline at end of file
diff --git a/buffer.fnl b/buffer.fnl
@@ -1,7 +1,7 @@
(local { : Gtk : Gdk : WebKit2 : cairo } (require :lgi))
(local { : view } (require :fennel))
-(fn new-buffer [name]
+(fn new-buffer [name keymap]
(let [props {}
widget (WebKit2.WebView {
;; :on_decide_policy
diff --git a/frame.fnl b/frame.fnl
@@ -1,12 +1,29 @@
(local { : Gtk : Gdk : WebKit2 : cairo } (require :lgi))
(local { : view } (require :fennel))
(local Command (require :command))
+(local keymap (require :keymap))
(var frames [])
(fn new-frame []
(let [hpad 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 {
:title "Dunlin"
:default_width 800
@@ -36,11 +53,10 @@
(tset window :on_key_release_event
(fn [window event]
- (when (and (not (Command.active?))
- (= event.keyval (string.byte "g")))
- (Command.invoke-interactively
- "visit-location"
- {:buffer "main"}))
+ (when (not (Command.active?))
+ (match (recogniser:accept (string.char event.keyval))
+ c (c)
+ (nil prompt) (print "prompted" prompt)))
(when (and event.state.MOD1_MASK
(= event.keyval (string.byte "x")))
(Command.activate))))
diff --git a/keymap.fnl b/keymap.fnl
@@ -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 }
diff --git a/test/keymap.fnl b/test/keymap.fnl
@@ -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))