|
|
1.1 root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.