This commit is contained in:
Ian Keane 2020-02-18 14:21:14 -05:00
parent 276853ba84
commit 1cb167b597
361 changed files with 77302 additions and 4 deletions

View file

@ -0,0 +1,116 @@
(in-package :de.anvi.croatoan.test)
;; Tested in xterm and Gnome Terminal.
;; Doesn't work in the Linux console and aterm.
;; Unicode strings are supported by the default non-unicode ncurses API (addstr) as long as libncursesw is used.
;; Special wide-char string functions (addwstr, add_wchstr) do not have to be used.
(defun ut01 ()
(%initscr)
(%mvaddstr 2 2 "ččććššđđžž")
(%mvaddstr 4 6 "öäüüüßß")
(%mvaddstr 6 8 "Без муки нет науки - no pain, no gain")
(%mvaddstr 8 10 "指鹿為馬 - point deer, make horse")
(%mvaddstr 10 12 "μολὼν λαβέ / ΜΟΛΩΝ ΛΑΒΕ - come and get it")
(%refresh)
(%getch)
(%endwin))
;; For displaying single unicode chars, addch functions do not work, and we have to use add_wch explicitly.
;; The data type also changes, from the integral chtype for addch, to the cchar_t struct for add_wch.
;; Use the cchar type for convert-to-foreign via a plist.
;; cchar-chars isnt a pointer to an integer array here, but an integer.
(defun ut02 ()
(let ((scr (%initscr)))
;; %add-wch
;; Add #\CYRILLIC_SMALL_LETTER_SHA = #\ш to the stdscr.
(with-foreign-object (ptr '(:struct cchar))
(setf ptr (convert-to-foreign (list 'cchar-attr 0 'cchar-chars (char-code #\ш))
'(:struct cchar)))
(%add-wch ptr))
;; %wadd-wch
;; #\CYRILLIC_CAPITAL_LETTER_LJE = #\Љ
(with-foreign-object (ptr '(:struct cchar))
(setf ptr (convert-to-foreign (list 'cchar-attr #x00020000 'cchar-chars (char-code #\Љ))
'(:struct cchar)))
(%wadd-wch scr ptr))
(%wrefresh scr)
(%wgetch scr)
(%endwin)))
(defun ut02b ()
(let ((scr (%initscr)))
(%start-color)
(%init-pair 1 1 3) ; red(1) on yellow(3)
;; %wadd-wch
;; #\CYRILLIC_CAPITAL_LETTER_LJE = #\Љ
(with-foreign-object (ptr '(:struct cchar_t))
;; 2 is the attribute, 1 is the color pair, the color doesnt work with convert-to-foreign
;;(setf ptr (convert-to-foreign (list 'cchar-attr #x00020100 'cchar-chars (char-code #\Љ) 'cchar-colors 1)
;; '(:struct cchar_t)))
;; we have to set each slot manually in order to make the extended colors work.
(setf (foreign-slot-value ptr '(:struct cchar_t) 'cchar-attr) #x00020100)
(setf (foreign-slot-value ptr '(:struct cchar_t) 'cchar-colors) 1)
;; also with cchar_t, we can not use convert to foreign at all, but have to manually add the char
;; at the first place in the char array.
(setf (mem-aref
(foreign-slot-pointer ptr '(:struct cchar_t) 'cchar-chars)
'wchar_t
0)
(char-code #\Љ))
(%wadd-wch scr ptr))
(%wrefresh scr)
(%wgetch scr)
(%endwin)))
;; We do not need special "wide character" functions for displaying single UTF-8 characters.
;; We can just use the string output function %waddstr.
;; Here, the underlying %waddstr powers the gray stream interface displaying UTF-8.
(defun ut03 ()
(with-screen (scr)
;; Even though we have a control STRING, format still writes the char
;; arguments char by char with write-char.
(format scr "~C ~A" #\Љ #\ш)
(terpri scr)
(format scr "Без муки нет науки")
(terpri scr)
(format scr "指鹿為馬")
(terpri scr)
(format scr "μολὼν λαβέ / ΜΟΛΩΝ ΛΑΒΕ")
(terpri scr)
(refresh scr)
(get-char scr)))
;; Use the cchar_t type for setcchar.
;; cchar-chars is a pointer to an integer array here, like the C prototype requires.
(defun ut04 ()
(let ((scr (%initscr)))
(%start-color)
;; Initialize color pair 1, yellow 3 on red 1.
(%init-pair 1 3 1)
(with-foreign-objects ((ptr '(:struct cchar_t))
(wch 'wchar_t 5))
;; Reset the wch array to zero.
(dotimes (i 5) (setf (mem-aref wch 'wchar_t i) 0))
(setf (mem-aref wch 'wchar_t) (char-code #\ш))
;; Create a cchar_t containing #\ш, attribute underline, color pair yellow on red.
(%setcchar ptr wch #x00020000 1 (null-pointer))
(%wadd-wch scr ptr)
(%waddch scr (char-code #\newline))
;; Take a look at the plist convert-from-foreign returns from cchar_t.
;; Sadly that plist cant be read back because it contains a pointer.
;; As of now, the convert-to-foreign function requires foreign values, not pointers.
(%waddstr scr (princ-to-string (convert-from-foreign ptr '(:struct cchar)))))
(%wrefresh scr)
(%wgetch scr)
(%endwin)))