#lang racket/base ;; For legal info, see file "info.rkt" (require racket/cmdline racket/date "charterm.rkt") (define (%charterm:string-pad-or-truncate str width) (let ((len (string-length str))) (cond ((= len width) str) ((< len width) (string-append str (make-string (- width len) #\space))) (else (substring str 0 width))))) (define (%charterm:bytes-pad-or-truncate bstr width) (let ((len (bytes-length bstr))) (cond ((= len width) bstr) ((< len width) (let ((new-bstr (make-bytes width 32))) (bytes-copy! new-bstr 0 bstr) new-bstr)) (else (subbytes bstr 0 width))))) (define-struct %charterm:demo-input (x y width bytes used cursor) #:mutable) (define (%charterm:make-demo-input x y width bstr) (let ((new-bstr (%charterm:bytes-pad-or-truncate bstr width)) (used (min (bytes-length bstr) width))) (make-%charterm:demo-input x y width new-bstr used used))) (define (%charterm:demo-input-redraw di) (charterm-cursor (%charterm:demo-input-x di) (%charterm:demo-input-y di)) (charterm-normal) (charterm-underline) (charterm-display (%charterm:demo-input-bytes di) #:width (%charterm:demo-input-width di)) (charterm-normal)) (define (%charterm:demo-input-put-cursor di) ;; Note: Commented-out debugging code: ;; ;; (and #t ;; (begin (charterm-normal) ;; (charterm-cursor (+ (%charterm:demo-input-x di) ;; (%charterm:demo-input-width di) ;; 1) ;; (%charterm:demo-input-y di)) ;; (charterm-display #" cursor: " ;; (%charterm:demo-input-cursor di) ;; #" used: " ;; (%charterm:demo-input-used di)) ;; (charterm-clear-line-right))) (charterm-cursor (+ (%charterm:demo-input-x di) (%charterm:demo-input-cursor di)) (%charterm:demo-input-y di))) (define (%charterm:demo-input-cursor-left di) (let ((cursor (%charterm:demo-input-cursor di))) (if (zero? cursor) (begin (charterm-bell) (%charterm:demo-input-put-cursor di)) (begin (set-%charterm:demo-input-cursor! di (- cursor 1)) (%charterm:demo-input-put-cursor di))))) (define (%charterm:demo-input-cursor-right di) (let ((cursor (%charterm:demo-input-cursor di))) (if (= cursor (%charterm:demo-input-used di)) (begin (charterm-bell) (%charterm:demo-input-put-cursor di)) (begin (set-%charterm:demo-input-cursor! di (+ cursor 1)) (%charterm:demo-input-put-cursor di))))) (define (%charterm:demo-input-backspace di) (let ((cursor (%charterm:demo-input-cursor di))) (if (zero? cursor) (begin (charterm-bell) (%charterm:demo-input-put-cursor di)) (let ((bstr (%charterm:demo-input-bytes di)) (used (%charterm:demo-input-used di))) ;; TODO: test beginning/end of buffer, of used, of width (bytes-copy! bstr (- cursor 1) bstr cursor used) (bytes-set! bstr (- used 1) 32) (set-%charterm:demo-input-used! di (- used 1)) (set-%charterm:demo-input-cursor! di (- cursor 1)) (%charterm:demo-input-redraw di) (%charterm:demo-input-put-cursor di))))) (define (%charterm:demo-input-delete di) (let ((cursor (%charterm:demo-input-cursor di)) (used (%charterm:demo-input-used di))) (if (= cursor used) (begin (charterm-bell) (%charterm:demo-input-put-cursor di)) (let ((bstr (%charterm:demo-input-bytes di))) (or (= cursor used) (bytes-copy! bstr cursor bstr (+ 1 cursor) used)) (bytes-set! bstr (- used 1) 32) (set-%charterm:demo-input-used! di (- used 1)) (%charterm:demo-input-redraw di) (%charterm:demo-input-put-cursor di))))) (define (%charterm:demo-input-insert-byte di new-byte) (let ((used (%charterm:demo-input-used di)) (width (%charterm:demo-input-width di))) (if (= used width) (begin (charterm-bell) (%charterm:demo-input-put-cursor di)) (let ((bstr (%charterm:demo-input-bytes di)) (cursor (%charterm:demo-input-cursor di))) (or (= cursor used) (bytes-copy! bstr (+ cursor 1) bstr cursor used)) (bytes-set! bstr cursor new-byte) (set-%charterm:d
/*
 * (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
 * See LICENSE file for license details.
 */

#define TAGS \
const char *tags[] = { "0", "1", "2", "3", "4", NULL };

#define DEFMODE			dotile /* dofloat */
#define DEFTAG			1 /* index */
#define FONT			"fixed"
#define BGCOLOR			"#666699"
#define FGCOLOR			"#eeeeee"
#define BORDERCOLOR		"#9999CC"
#define MODKEY			Mod1Mask
#define NUMLOCKMASK		Mod2Mask
#define MASTERW			60 /* percent */

#define KEYS \
static Key key[] = { \
	/* modifier		key		function	arguments */ \
	{ MODKEY,		XK_0,		view,		{ .i = 0 } }, \
	{ MODKEY,		XK_1,		view,		{ .i = 1 } }, \
	{ MODKEY,		XK_2,		view,		{ .i = 2 } }, \
	{ MODKEY,		XK_3,		view,		{ .i = 3 } }, \
	{ MODKEY,		XK_4,		view,		{ .i = 4 } }, \
	{ MODKEY,		XK_h,		viewprev,	{ 0 } }, \
	{ MODKEY,		XK_j,		focusnext,	{ 0 } }, \
	{ MODKEY,		XK_k,		focusprev,	{ 0 } }, \
	{ MODKEY,		XK_l,		viewnext,	{ 0 } }, \
	{ MODKEY,		XK_m,		togglemax,	{ 0 } }, \
	{ MODKEY,		XK_space,	togglemode,	{ 0 } }, \
	{ MODKEY,		XK_Return,	zoom,		{ 0 } }, \
	{ MODKEY|ControlMask,	XK_0,		appendtag,	{ .i = 0 } }, \
	{ MODKEY|ControlMask,	XK_1,		appendtag,	{ .i = 1 } }, \
	{ MODKEY|ControlMask,	XK_2,		appendtag,	{ .i = 2 } }, \
	{ MODKEY|ControlMask,	XK_3,		appendtag,	{ .i = 3 } }, \
	{ MODKEY|ControlMask,	XK_4,		appendtag,	{ .i = 4 } }, \
	{ MODKEY|ShiftMask,	XK_0,		replacetag,	{ .i = 0 } }, \
	{ MODKEY|ShiftMask,	XK_1,		replacetag,	{ .i = 1 } }, \
	{ MODKEY|ShiftMask,	XK_2,		replacetag,	{ .i = 2 } }, \
	{ MODKEY|ShiftMask,	XK_3,		replacetag,	{ .i = 3 } }, \
	{ MODKEY|ShiftMask,	XK_4,		replacetag,	{ .i = 4 } }, \
	{ MODKEY|ShiftMask,	XK_c,		killclient,	{ 0 } }, \
	{ MODKEY|ShiftMask,	XK_q,		quit,		{ 0 } }, \
	{ MODKEY|ShiftMask,	XK_Return,	spawn,		{ .cmd = "exec xterm" } }, \
};

#define RULES \
static Rule rule[] = { \
	/* class:instance regex		tags regex	isfloat */ \
	{ "Firefox.*",			"2",		False }, \
	{ "Gimp.*",			NULL,		True}, \
};
(charterm-newline) (done-ec)) (loop-fast-next-key))) (else (loop-fast-next-key))))) (begin ;; (charterm-display "Timeout.") (loop-maybe-check-screen-size))))))))))))))) (provide main) (define (main . args) ;; TODO: Accept TTY as an argument. (let ((tty #f) (escape? #t)) (command-line #:program "(charterm Demo)" #:once-each (("--tty" "-t") arg "The TTY to use (default: /dev/tty)." (set! tty arg)) #:once-any (("--escape" "-e") "Esc key quits program (default)." (set! escape? #t)) (("--no-escape" "-n") "Esc key does not quit program." (set! escape? #f))) (charterm-demo #:tty tty #:escape? escape?)))