summaryrefslogtreecommitdiff
path: root/world/ui.scm
blob: 3b946167aef8d4a44f5d80d964e80ec7a8f2a32a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
;; TODO make this the only platform specific thing
;; Should remember the latest screen to be able to only reprint differences

(define terminal-size #f)
(define current-port #f)
(define scroll 0)

(define (scroll-down)
  (set! scroll (+ 3 scroll)))
(define (scroll-up)
  (set! scroll (- scroll 3))
  (when (> 0 scroll) (set! scroll 0)))

(define (get-terminal-size)
  (get-terminal-dimensions current-port))

(define (control c)
  (integer->char (bitwise-and #b00011111 (char->integer c))))


(define (redisplay! table)
  ; TODO: This is currently utter slow!
  "I need to remove the arguments from it... Probably call-with-window later"
  (hide-cursor!)
  (erase-screen!)
  (for-each
    (lambda (line-number)
      (let ((line (piece-table-line table (+ line-number scroll))))
        (move-cursor! 0 line-number)
        (cond
          ((eof-object? line)
           (write-char #\~))
          ((string? line)
           (write-string line)))))
    (iota (car terminal-size)))
  (show-cursor!))

(define (tui-loop)
  (define table (make-piece-table "hola\nhola"))
  (redisplay! table)
  (call/cc
    (lambda (exit)
      (let loop ((char (read-char)))
        (cond
          ; TODO: Assign characters and combinations symbolic names and
          ; pass that to the core?
          ((char=? (control #\q) char) (exit))
          ((char=? (control #\d) char) (scroll-down))
          ((char=? (control #\u) char) (scroll-up))
          (else (piece-table-insert! table
                                     (piece-table-text-length table)
                                     (string char)
                                     'normal)))
        (redisplay! table)
        (loop (read-char))))))

(define (call-with-tui thunk)
  (dynamic-wind
    tui-initialize!
    (lambda ()
      (call-with-input-file "/dev/tty"
        (lambda (p)
          (set! current-port p)
          (set! terminal-size (get-terminal-size))
          (with-raw-io p thunk))))
    tui-deinitialize!))

(define (run arguments)
  (call-with-tui tui-loop))