dunlin

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

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:
MProcfile | 4++--
Mbuffer.fnl | 2+-
Mframe.fnl | 26+++++++++++++++++++++-----
Akeymap.fnl | 19+++++++++++++++++++
Atest/keymap.fnl | 20++++++++++++++++++++
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))