#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}, \
};