Previous: The basics of keys, Up: Interfacing with the keyboard [Contents][Index]
#!/usr/bin/guile
!#
(use-modules (ncurses curses))
;; Draw the menu on to the window WIN, using the list of CHOICES,
;; highlighting the currently selected entry.
(define (print-menu win highlight choices)
(let ((x 2)
(y 2)
(n-choices (length choices)))
;; The menu border
(box win (acs-vline) (acs-hline))
;; The menu entries from CHOICES, with the current entry
;; highlighted
(let loop ((i 0)
(y y)
(n n-choices))
(cond
((eqv? highlight i)
(attr-on! win A_REVERSE)
(move win y x)
(addstr win (list-ref choices i))
(attr-off! win A_REVERSE))
(else
(move win y x)
(addstr win (list-ref choices i))))
(if (< i (- n-choices 1))
(loop (+ 1 i)
(+ 1 y)
n-choices)
(refresh win)))))
;; This loop lets the user select a menu. It returns the number of the
;; selected item.
(define (get-selection menu-win highlight choices)
(let ((n-choices (length choices)))
(let loop ((highlight highlight)
(ch (getch menu-win)))
(cond
((eqv? ch KEY_UP)
((lambda (h)
(print-menu menu-win h choices)
(loop h (getch menu-win)))
(if (eqv? highlight 0)
(- n-choices 1)
(- highlight 1))))
((eqv? ch KEY_DOWN)
((lambda (h)
(print-menu menu-win h choices)
(loop h (getch menu-win)))
(if (eqv? highlight (- n-choices 1))
0
(+ highlight 1))))
;; If enter or return is pressed, return the current selected
;; menu item
((or (eqv? ch #\nl) (eqv? ch KEY_ENTER))
highlight)
(else
(loop highlight (getch menu-win)))))))
(define (main)
(let ((stdscr(initscr)))
(cbreak!)
(noecho!)
(let* ((menu-width 30)
(menu-height 10)
(startx (round (/ (- (cols) menu-width) 2)))
(starty (round (/ (- (lines) menu-height) 2)))
(menu-win (newwin menu-height menu-width starty startx))
(choices '("Choice 1"
"Choice 2"
"Choice 3"
"Choice 4"
"Exit"))
(highlight 0))
(begin
(keypad! menu-win #t)
(print-menu menu-win 0 choices)
(let ((choice (get-selection menu-win highlight choices)))
(move stdscr 23 0)
(addstr stdscr (format #f "You chose ~s ~%"
(list-ref choices choice)))
(clrtoeol stdscr)
(refresh stdscr)
(sleep 2)
(endwin)
0)))))
(main)
Previous: The basics of keys, Up: Interfacing with the keyboard [Contents][Index]