Add modal input layers
This commit is contained in:
parent
213552d0fc
commit
4f112832a7
|
@ -4,25 +4,49 @@
|
|||
#:use-module (ts)
|
||||
#:export (core-loop))
|
||||
|
||||
(define* (core-loop #:optional (win (init-win)))
|
||||
(define modes '(#:normal-mode #:insert-mode))
|
||||
|
||||
(define* (core-loop #:optional (win (init-win)) (mode #:normal-mode))
|
||||
(define process-result
|
||||
(case mode
|
||||
((#:normal-mode) (normal-mode-process-input win (getch win)))
|
||||
((#:insert-mode) (insert-mode-process-input win (getch win)))))
|
||||
(if (memq process-result modes)
|
||||
(core-loop win process-result)
|
||||
(core-loop win mode)))
|
||||
|
||||
(define (insert-mode-process-input win key)
|
||||
(define y (getcury win))
|
||||
(define x (getcurx win))
|
||||
(define ch (getch win))
|
||||
(cond
|
||||
((eqv? ch KEY_BACKSPACE)
|
||||
((eqv? key KEY_BACKSPACE)
|
||||
(delch win #:y y #:x (- x 1)))
|
||||
((eqv? ch KEY_DC)
|
||||
((eqv? key KEY_DC)
|
||||
(delch win))
|
||||
((eqv? ch KEY_LEFT)
|
||||
((eqv? key KEY_LEFT)
|
||||
(move win y (- x 1)))
|
||||
((eqv? ch KEY_RIGHT)
|
||||
((eqv? key KEY_RIGHT)
|
||||
(move win y (+ x 1)))
|
||||
((eqv? ch KEY_UP)
|
||||
((eqv? key KEY_UP)
|
||||
(move win (- y 1) x))
|
||||
((eqv? ch KEY_DOWN)
|
||||
((eqv? key KEY_DOWN)
|
||||
(move win (+ y 1) x))
|
||||
((eqv? ch #\q)
|
||||
(endwin)
|
||||
(quit))
|
||||
(else (echochar win (normal ch))))
|
||||
(core-loop win))
|
||||
((eqv? key #\esc) #:normal-mode)
|
||||
(else (echochar win (normal key)))))
|
||||
|
||||
(define (normal-mode-process-input win key)
|
||||
(define y (getcury win))
|
||||
(define x (getcurx win))
|
||||
(cond
|
||||
((eqv? key KEY_LEFT)
|
||||
(move win y (- x 1)))
|
||||
((eqv? key KEY_RIGHT)
|
||||
(move win y (+ x 1)))
|
||||
((eqv? key KEY_UP)
|
||||
(move win (- y 1) x))
|
||||
((eqv? key KEY_DOWN)
|
||||
(move win (+ y 1) x))
|
||||
((eqv? key #\i) #:insert-mode)
|
||||
((eqv? key #\q)
|
||||
(endwin)
|
||||
(quit))))
|
||||
|
|
Loading…
Reference in New Issue