source: bootcd/isolinux/syslinux-6.03/gpxe/src/hci/mucurses/windows.c

Last change on this file was e16e8f2, checked in by Edwin Eefting <edwin@datux.nl>, 3 years ago

bootstuff

  • Property mode set to 100644
File size: 3.6 KB
Line 
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 */
18int 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 */
49WINDOW *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 */
74WINDOW *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 */
99int 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 */
121WINDOW *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 */
147WINDOW *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}
Note: See TracBrowser for help on using the repository browser.