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 | } |
---|