a29f79fa4c4e5576da0b57af90d53b2259b164a6
[people/xl0/gpxe.git] / src / hci / mucurses / core.c
1 #include <curses.h>
2 #include "core.h"
3
4 WINDOW _stdscr = {
5         .attrs = A_DEFAULT,
6         .ori_y = 0,
7         .ori_x = 0,
8         .curs_y = 0,
9         .curs_x = 0,
10         .scr = curscr,
11 };
12
13 struct _softlabelkeys *slks;
14
15 /*
16  *  Primitives
17  */
18
19 /**
20  * Write a single character rendition to a window
21  *
22  * @v *win      window in which to write
23  * @v ch        character rendition to write
24  * @v wrap      wrap "switch"
25  */
26 void _wputch ( WINDOW *win, chtype ch, int wrap ) {
27         /* make sure we set the screen cursor to the right position
28            first! */
29         win->scr->movetoyx( win->scr, win->ori_y + win->curs_y,
30                                       win->ori_x + win->curs_x );
31         win->scr->putc(win->scr, ch);
32         if ( ++(win->curs_x) == win->width ) {
33                 if ( wrap == WRAP ) {
34                         win->curs_x = 0;
35                         /* specification says we should really scroll,
36                            but we have no buffer to scroll with, so we
37                            can only overwrite back at the beginning of
38                            the window */
39                         if ( ++(win->curs_y) == win->height )
40                                 win->curs_y = 0;
41                 } else {
42                         (win->curs_x)--;
43                 }
44         }
45 }
46
47 /**
48  * Write a chtype string to a window
49  *
50  * @v *win      window in which to write
51  * @v *chstr    chtype string
52  * @v wrap      wrap "switch"
53  * @v n         write at most n chtypes
54  */
55 void _wputchstr ( WINDOW *win, const chtype *chstr, int wrap, int n ) {
56         for ( ; *chstr && n-- ; chstr++ ) {
57                 _wputch(win,*chstr,wrap);
58         }
59 }
60
61 /**
62  * Write a standard c-style string to a window
63  *
64  * @v *win      window in which to write
65  * @v *str      string
66  * @v wrap      wrap "switch"
67  * @v n         write at most n chars from *str
68  */
69 void _wputstr ( WINDOW *win, const char *str, int wrap, int n ) {
70         for ( ; *str && n-- ; str++ ) {
71                 _wputch( win, *str | win->attrs, wrap );
72         }
73 }
74
75 /**
76  * Move a window's cursor to the specified position
77  *
78  * @v *win      window to be operated on
79  * @v y         Y position
80  * @v x         X position
81  * @ret rc      return status code
82  */
83 int wmove ( WINDOW *win, int y, int x ) {
84         /* chech for out-of-bounds errors */
85         if ( ( ( (unsigned)x - win->ori_x ) > win->width ) ||
86              ( ( (unsigned)y - win->ori_y ) > win->height ) ) {
87                 return ERR;
88         }
89
90         win->curs_y = y;
91         win->curs_x = x;
92         win->scr->movetoyx( win->scr, win->ori_y + win->curs_y, 
93                                       win->ori_x + win->curs_x );
94         return OK;
95 }