• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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  */
delwin(WINDOW * win)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  */
derwin(WINDOW * parent,int nlines,int ncols,int begin_y,int begin_x)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  */
dupwin(WINDOW * orig)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  */
mvwin(WINDOW * win,int y,int x)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  */
newwin(int nlines,int ncols,int begin_y,int begin_x)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  */
subwin(WINDOW * parent,int nlines,int ncols,int begin_y,int begin_x)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 }
159