From 25d31e02622a1b16f920a167f6ef0599dcf9ecdb Mon Sep 17 00:00:00 2001 From: Daniel Barlow Date: Thu, 22 Dec 2022 22:42:45 +0000 Subject: [PATCH] use keymap to choose command to invoke --- Procfile | 2 +- buffer.fnl | 2 +- frame.fnl | 26 +++++++++++++++++++++----- keymap.fnl | 19 +++++++++++++++++++ test/keymap.fnl | 20 ++++++++++++++++++++ 5 files changed, 62 insertions(+), 7 deletions(-) create mode 100644 keymap.fnl create mode 100644 test/keymap.fnl diff --git a/Procfile b/Procfile index 7f7ea18..05a030e 100644 --- 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 index 8ff3983..a2e7894 100644 --- 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 index 1c53ad1..b47b97c 100644 --- 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 new file mode 100644 index 0000000..d7ce918 --- /dev/null +++ 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 new file mode 100644 index 0000000..bcd8394 --- /dev/null +++ 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))