Home | History | Annotate | Download | only in mucurses
      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 }
    159