Paste: curses

Author: blei
Mode: factor
Date: Sun, 18 Oct 2009 16:50:49
Plain Text |
! Copyright (C) 2008 Doug Coleman.
! See http://factorcode.org/license.txt for BSD license.
USING: accessors alien.c-types alien.strings assocs byte-arrays
classes.struct combinators continuations curses.ffi destructors
fry io io.encodings.8-bit io.encodings.string io.encodings.utf8
kernel libc locals math namespaces prettyprint sequences
strings threads ;
IN: curses

SYMBOL: current-window

: >BOOLEAN ( n -- TRUE/FALSE ) TRUE FALSE ? ; inline

ERROR: duplicate-window window ;
ERROR: unnamed-window window ;
ERROR: window-not-found window ;
ERROR: curses-failed ;

: curses-error ( n -- ) ERR = [ curses-failed ] when ;

: with-curses ( quot -- )
    [
        initscr curses-error
        [
            nocbreak curses-error
            echo curses-error
            endwin curses-error
        ] [ ] cleanup
    ] with-destructors ; inline

: with-window ( window quot -- )
    [ current-window ] dip with-variable ; inline

TUPLE: curses-window < disposable
    name
    parent-window
    ptr
    { lines integer initial: 0 }
    { columns integer initial: 0 }
    { y integer initial: 0 }
    { x integer initial: 0 }

    { cbreak initial: t }
    { echo initial: t }
    { raw initial: f }

    { scrollok initial: t }
    { leaveok initial: f }

    idcok idlok immedok
    { keypad initial: f }

    { encoding initial: utf8 } ;

: <curses-window> ( -- window )
    curses-window new-disposable ;

M: curses-window dispose* ( window -- )
    ptr>> delwin curses-error ;

<PRIVATE

: window-params ( window -- lines columns y x )
    { [ lines>> ] [ columns>> ] [ y>> ] [ x>> ] } cleave ;

: set-cbreak/raw ( cbreak raw -- )
    [ drop raw ] [
        [ cbreak ] [ nocbreak ] if
    ] if curses-error ;

PRIVATE>

: setup-window ( window -- )
    {
        [
            dup
            dup parent-window>> [
                ptr>> swap window-params derwin
            ] [
                window-params newwin
            ] if* [ curses-error ] keep >>ptr &dispose drop
        ]
        [ [ cbreak>> ] [ raw>> ] bi set-cbreak/raw ]
        [ echo>> [ echo ] [ noecho ] if curses-error ]
        [ [ ptr>> ] [ scrollok>> >BOOLEAN ] bi scrollok curses-error ]
        [ [ ptr>> ] [ leaveok>> >BOOLEAN ] bi leaveok curses-error ]
        [ [ ptr>> ] [ keypad>> >BOOLEAN ] bi keypad curses-error ]
    } cleave ;

<PRIVATE

: (window-curses-refresh) ( window-ptr -- ) wrefresh curses-error ; inline
: (window-curses-write) ( string window-ptr -- ) swap waddstr curses-error ; inline

:: (window-curses-read) ( n encoding window-ptr -- string )
    [
        n 1 + malloc &free :> str
        window-ptr str n wgetnstr curses-error
        str encoding alien>string
    ] with-destructors ; inline

: (window-curses-getch) ( window -- key )
    wgetch [ curses-error ] keep ;

: (window-curses-move) ( y x window-ptr -- )
    -rot wmove curses-error ; inline

: (window-insert-blank-line) ( y window-ptr -- )
    [ 0 swap (window-curses-move) ]
    [ winsertln curses-error ] bi ; inline

: (window-curses-addch) ( ch window-ptr -- )
    swap waddch curses-error ; inline

PRIVATE>

: window-curses-refresh ( window -- ) ptr>> (window-curses-refresh) ;
: curses-refresh ( -- ) current-window get window-curses-refresh ;

: window-curses-write ( string window -- )
    ptr>> (window-curses-write) ;
: curses-write ( string -- )
    current-window get window-curses-write ;

: window-curses-nl ( window -- )
    [ "\n" ] dip ptr>> (window-curses-write) ;
: curses-nl ( -- )
    current-window get window-curses-nl ;

: window-curses-print ( string window -- )
    ptr>> [ (window-curses-write) ]
    [ "\n" swap (window-curses-write) ] bi ;
: curses-print ( string -- )
    current-window get window-curses-print ;

: window-curses-print-refresh ( string window -- )
    ptr>> [ (window-curses-write) ]
    [ "\n" swap (window-curses-write) ]
    [ (window-curses-refresh) ] tri ;
: curses-print-refresh ( string -- )
    current-window get window-curses-print-refresh ;

: window-curses-write-refresh ( string window -- )
    ptr>> [ (window-curses-write) ] [ (window-curses-refresh) ] bi ;
: curses-write-refresh ( string -- )
    current-window get window-curses-write-refresh ;

: window-curses-read ( n window -- string )
    [ encoding>> ] [ ptr>> ] bi (window-curses-read) ;
: curses-read ( n -- string )
    current-window get window-curses-read ;

: window-curses-getch ( window -- key )
    ptr>> (window-curses-getch) ;
: curses-getch ( -- key )
    current-window get window-curses-getch ;

: window-curses-erase ( window -- )
    ptr>> werase curses-error ;
: curses-erase ( -- )
    current-window get window-curses-erase ;

: window-curses-move ( y x window -- )
    ptr>> [ (window-curses-move) ] [ (window-curses-refresh) ] bi ;
: curses-move ( y x -- )
    current-window get window-curses-move ;

: window-delete-line ( y window -- )
    ptr>> [ 0 swap (window-curses-move) ]
    [ wdeleteln curses-error ] bi ;
: delete-line ( y -- )
    current-window get window-delete-line ;

: window-insert-blank-line ( y window -- )
    ptr>> (window-insert-blank-line) ;
: insert-blank-line ( y -- )
    current-window get window-insert-blank-line ;

: window-insert-line ( string y window -- )
    ptr>> [ (window-insert-blank-line) ]
    [ (window-curses-write) ] bi ;
: insert-line ( string y -- )
    current-window get window-insert-line ;

: window-curses-addch ( ch window -- )
    ptr>> (window-curses-addch) ;
: curses-addch ( ch -- )
    current-window get window-curses-addch ;

New Annotation

Summary:
Author:
Mode:
Body: