Include stdlib.h rather than malloc.h
[people/meteger/gpxe.git] / src / hci / mucurses / windows.c
1 #include <curses.h>
2 #include <stddef.h>
3 #include <stdlib.h>
4 #include "mucurses.h"
5
6 /** @file
7  *
8  * MuCurses windows instance functions
9  *
10  */
11
12 /**
13  * Delete a window
14  *
15  * @v *win      pointer to window being deleted
16  * @ret rc      return status code
17  */
18 int delwin ( WINDOW *win ) {
19         if ( win == NULL )
20                 return ERR;
21
22         /* I think we should blank the region covered by the window -
23            ncurses doesn't do this, but they have a buffer, so they
24            may just be deleting from an offscreen context whereas we
25            are guaranteed to be deleting something onscreen */
26         wmove( win, 0, 0 );
27         chtype killch = (chtype)' ';
28         do {
29                 _wputch( win, killch, WRAP );
30         } while ( win->curs_x + win->curs_y );
31
32         free( win );
33
34         wmove ( stdscr, 0, 0 );
35
36         return OK;
37 }
38
39 /**
40  * Create a new derived window
41  *
42  * @v parent    parent window
43  * @v nlines    window height
44  * @v ncols     window width
45  * @v begin_y   window y origin (relative to parent)
46  * @v begin_x   window x origin (relative to parent)
47  * @ret ptr     return pointer to child window
48  */
49 WINDOW *derwin ( WINDOW *parent, int nlines, int ncols,
50                                  int begin_y, int begin_x ) {
51         WINDOW *child;
52         if ( parent == NULL )
53                 return NULL;
54         if ( ( child = malloc( sizeof( WINDOW ) ) ) == NULL )
55                 return NULL;
56         if ( ( (unsigned)ncols > parent->width ) || 
57              ( (unsigned)nlines > parent->height ) )
58                 return NULL;
59         child->ori_y = parent->ori_y + begin_y;
60         child->ori_x = parent->ori_x + begin_x;
61         child->height = nlines;
62         child->width = ncols;
63         child->parent = parent;
64         child->scr = parent->scr;
65         return child;
66 }
67
68 /**
69  * Create a duplicate of the specified window
70  *
71  * @v orig      original window
72  * @ret ptr     pointer to duplicate window
73  */
74 WINDOW *dupwin ( WINDOW *orig ) {
75         WINDOW *copy;
76         if ( orig == NULL )
77                 return NULL;
78         if ( ( copy = malloc( sizeof( WINDOW ) ) ) == NULL )
79                 return NULL;
80         copy->scr = orig->scr;
81         copy->attrs = orig->attrs;
82         copy->ori_y = orig->ori_y;
83         copy->ori_x = orig->ori_x;
84         copy->curs_y = orig->curs_y;
85         copy->curs_x = orig->curs_x;
86         copy->height = orig->height;
87         copy->width = orig->width;
88         return copy;
89 }
90
91 /**
92  * Move window origin to specified coordinates
93  *
94  * @v *win      window to move
95  * @v y         Y position
96  * @v x         X position
97  * @ret rc      return status code
98  */
99 int mvwin ( WINDOW *win, int y, int x ) {
100         if ( win == NULL )
101                 return ERR;
102         if ( ( ( (unsigned)y + win->height ) > LINES ) ||
103              ( ( (unsigned)x + win->width ) > COLS ) )
104                 return ERR;
105
106         win->ori_y = y;
107         win->ori_x = x;
108
109         return OK;
110 }
111
112 /**
113  * Create new WINDOW
114  *
115  * @v nlines    number of lines
116  * @v ncols     number of columns
117  * @v begin_y   column origin
118  * @v begin_x   line origin
119  * @ret *win    return pointer to new window
120  */
121 WINDOW *newwin ( int nlines, int ncols, int begin_y, int begin_x ) {
122         WINDOW *win;
123         if ( ( win = malloc( sizeof(WINDOW) ) ) == NULL )
124                 return NULL;
125         if ( ( (unsigned)( begin_y + nlines ) > stdscr->height ) &&
126              ( (unsigned)( begin_x + ncols ) > stdscr->width ) )
127                 return NULL;
128         win->ori_y = begin_y;
129         win->ori_x = begin_x;
130         win->height = nlines;
131         win->width = ncols;
132         win->scr = stdscr->scr;
133         win->parent = stdscr;
134         return win;
135 }
136
137 /**
138  * Create a new sub-window
139  *
140  * @v orig      parent window
141  * @v nlines    window height
142  * @v ncols     window width
143  * @v begin_y   window y origin (absolute)
144  * @v begin_x   window x origin (absolute)
145  * @ret ptr     return pointer to child window
146  */
147 WINDOW *subwin ( WINDOW *parent, int nlines, int ncols,
148                                  int begin_y, int begin_x ) {
149         WINDOW *child;
150         if ( parent == NULL )
151                 return NULL;
152         if ( ( child = malloc( sizeof( WINDOW ) ) ) == NULL )
153                 return NULL;
154         child = newwin( nlines, ncols, begin_y, begin_x );
155         child->parent = parent;
156         child->scr = parent->scr;
157         return child;
158 }