diff options
author | Hugo Hörnquist <hugo@lysator.liu.se> | 2020-07-20 04:11:35 +0200 |
---|---|---|
committer | Hugo Hörnquist <hugo@lysator.liu.se> | 2020-07-20 04:19:03 +0200 |
commit | 2102dc11c23953a8ef362196bf5db20db43b257a (patch) | |
tree | bb7390c6eab4d0ec71f8786cd2e293e94209e698 /module | |
parent | Cleanup for cpp. (diff) | |
download | calp-2102dc11c23953a8ef362196bf5db20db43b257a.tar.gz calp-2102dc11c23953a8ef362196bf5db20db43b257a.tar.xz |
Resolve TODO for with-ptr.
Diffstat (limited to '')
-rw-r--r-- | module/vulgar/termios.scm | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/module/vulgar/termios.scm b/module/vulgar/termios.scm index 62212122..414dc986 100644 --- a/module/vulgar/termios.scm +++ b/module/vulgar/termios.scm @@ -94,12 +94,15 @@ -;; TODO this should possibly use unwind guards -(define (with-ptr termios proc) - (let ((ptr (as-ptr termios))) - (let ((ret (proc ptr))) - (set-ptr! termios ptr) - ret))) +;; Calls procedure with current termios pointer, and restore +;; current pointer afterwards. Allows stuff like turning off echo +;; mode without breaking the calling terminal. +(define (with-termios termios proc) + (let ((og-ptr #f)) + (dynamic-wind + (lambda () (set! og-ptr (as-ptr termios))) + (lambda () (proc (as-ptr termios))) + (lambda () (set-ptr! termios og-ptr))))) @@ -130,18 +133,18 @@ (define* (tcsetattr! termios #:optional (port (current-input-port)) (when TCSANOW)) - (with-ptr termios (lambda (ptr) (tcsetattr (port->fdes port) when ptr)))) + (with-termios termios (lambda (ptr) (tcsetattr (port->fdes port) when ptr)))) (define-foreign (tcgetattr int *) → int (dynamic-func "tcgetattr" lib)) (define* (tcgetattr! termios #:optional (port (current-input-port))) - (with-ptr termios (lambda (ptr) (tcgetattr (port->fdes port) ptr)))) + (with-termios termios (lambda (ptr) (tcgetattr (port->fdes port) ptr)))) (define-foreign (cfmakeraw *) (dynamic-func "cfmakeraw" lib)) (define* (cfmakeraw! termios) - (with-ptr termios cfmakeraw)) + (with-termios termios cfmakeraw)) |