5948232f6c48e6982f31903cd961d36678252aab
[people/xl0/gpxe.git] / src / hci / mucurses / edging.c
1 #include <curses.h>
2 #include "core.h"
3 #include "cursor.h"
4
5 /**
6  * Draw borders from single-byte characters and renditions around a
7  * window
8  *
9  * @v *win      window to be bordered
10  * @v verch     vertical chtype
11  * @v horch     horizontal chtype
12  * @ret rc      return status code
13  */
14 int box ( WINDOW *win, chtype verch, chtype horch ) {
15         chtype corner = '+' | win->attrs; /* default corner character */
16         return wborder( win, verch, verch, horch, horch,
17                         corner, corner, corner, corner );
18 }
19
20 /**
21  * Draw borders from single-byte characters and renditions around a
22  * window
23  *
24  * @v *win      window to be bordered
25  * @v ls        left side
26  * @v rs        right side
27  * @v ts        top
28  * @v bs        bottom
29  * @v tl        top left corner
30  * @v tr        top right corner
31  * @v bl        bottom left corner
32  * @v br        bottom right corner
33  * @ret rc      return status code
34  */
35 int wborder ( WINDOW *win, chtype ls, chtype rs,
36               chtype ts, chtype bs, chtype tl,
37               chtype tr, chtype bl, chtype br ) {
38         struct cursor_pos pos;
39
40         _store_curs_pos( win, &pos );
41         wmove(win,0,0);
42
43         _wputch(win,tl,WRAP);
44         while ( ( win->width - 1 ) - win->curs_x ) {
45                 _wputch(win,ts,WRAP);
46         }
47         _wputch(win,tr,WRAP);
48
49         while ( ( win->height - 1 ) - win->curs_y ) {
50                 _wputch(win,ls,WRAP);
51                 wmove(win,win->curs_y,(win->width)-1);
52                 _wputch(win,rs,WRAP);
53         }
54
55         _wputch(win,bl,WRAP);
56         while ( ( win->width -1 ) - win->curs_x ) {
57                 _wputch(win,bs,WRAP);
58         }
59         _wputch(win,br,NOWRAP); /* do not wrap last char to leave
60                                    cursor in last position */
61         _restore_curs_pos( win, &pos );
62
63         return OK;
64 }
65
66 /**
67  * Create a horizontal line in a window
68  *
69  * @v *win      subject window
70  * @v ch        rendition and character
71  * @v n         max number of chars (wide) to render
72  * @ret rc      return status code
73  */
74 int whline ( WINDOW *win, chtype ch, int n ) {
75         struct cursor_pos pos;
76
77         _store_curs_pos ( win, &pos );
78         while ( ( win->curs_x - win->width ) && n-- ) {
79                 _wputch ( win, ch, NOWRAP );
80         }
81         _restore_curs_pos ( win, &pos );
82
83         return OK;
84 }
85
86 /**
87  * Create a vertical line in a window
88  *
89  * @v *win      subject window
90  * @v ch        rendition and character
91  * @v n         max number of lines to render
92  * @ret rc      return status code
93  */
94 int wvline ( WINDOW *win, chtype ch, int n ) {
95         struct cursor_pos pos;
96
97         _store_curs_pos ( win, &pos );
98         while ( ( win->curs_y - win->height ) && n-- ) {
99                 _wputch ( win, ch, NOWRAP );
100                 wmove( win, ++(win->curs_y), pos.x);
101         }
102         _restore_curs_pos ( win, &pos );
103
104         return OK;
105 }