Annotation of qemu/roms/ipxe/src/hci/mucurses/windows.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.