|
|
1.1 ! root 1: #include <ipxe/console.h> ! 2: #include <curses.h> ! 3: #include "mucurses.h" ! 4: ! 5: /** @file ! 6: * ! 7: * MuCurses core functions ! 8: * ! 9: */ ! 10: ! 11: FILE_LICENCE ( GPL2_OR_LATER ); ! 12: ! 13: static void _wupdcurs ( WINDOW *win ) __nonnull; ! 14: void _wputch ( WINDOW *win, chtype ch, int wrap ) __nonnull; ! 15: void _wputc ( WINDOW *win, char c, int wrap ) __nonnull; ! 16: void _wcursback ( WINDOW *win ) __nonnull; ! 17: void _wputchstr ( WINDOW *win, const chtype *chstr, int wrap, int n ) __nonnull; ! 18: void _wputstr ( WINDOW *win, const char *str, int wrap, int n ) __nonnull; ! 19: int wmove ( WINDOW *win, int y, int x ) __nonnull; ! 20: ! 21: WINDOW _stdscr = { ! 22: .attrs = A_DEFAULT, ! 23: .ori_y = 0, ! 24: .ori_x = 0, ! 25: .curs_y = 0, ! 26: .curs_x = 0, ! 27: .scr = &_ansi_screen, ! 28: }; ! 29: ! 30: /* ! 31: * Primitives ! 32: */ ! 33: ! 34: /** ! 35: * Update cursor position ! 36: * ! 37: * @v *win window in which to update position ! 38: */ ! 39: static void _wupdcurs ( WINDOW *win ) { ! 40: win->scr->movetoyx ( win->scr, win->ori_y + win->curs_y, ! 41: win->ori_x + win->curs_x ); ! 42: } ! 43: ! 44: /** ! 45: * Write a single character rendition to a window ! 46: * ! 47: * @v *win window in which to write ! 48: * @v ch character rendition to write ! 49: * @v wrap wrap "switch" ! 50: */ ! 51: void _wputch ( WINDOW *win, chtype ch, int wrap ) { ! 52: /* make sure we set the screen cursor to the right position ! 53: first! */ ! 54: _wupdcurs(win); ! 55: win->scr->putc(win->scr, ch); ! 56: if ( ++(win->curs_x) - win->width == 0 ) { ! 57: if ( wrap == WRAP ) { ! 58: win->curs_x = 0; ! 59: /* specification says we should really scroll, ! 60: but we have no buffer to scroll with, so we ! 61: can only overwrite back at the beginning of ! 62: the window */ ! 63: if ( ++(win->curs_y) - win->height == 0 ) ! 64: win->curs_y = 0; ! 65: } else { ! 66: (win->curs_x)--; ! 67: } ! 68: } ! 69: } ! 70: ! 71: /** ! 72: * Write a single character to a window ! 73: * ! 74: * @v *win window in which to write ! 75: * @v c character rendition to write ! 76: * @v wrap wrap "switch" ! 77: */ ! 78: void _wputc ( WINDOW *win, char c, int wrap ) { ! 79: _wputch ( win, ( c | win->attrs ), wrap ); ! 80: } ! 81: ! 82: /** ! 83: * Retreat the cursor back one position (useful for a whole host of ! 84: * ops) ! 85: * ! 86: * @v *win window in which to retreat ! 87: */ ! 88: void _wcursback ( WINDOW *win ) { ! 89: if ( win->curs_x == 0 ) { ! 90: if ( win->curs_y == 0 ) ! 91: win->curs_y = win->height - 1; ! 92: win->curs_x = win->width = 1; ! 93: } else { ! 94: win->curs_x--; ! 95: } ! 96: ! 97: _wupdcurs(win); ! 98: } ! 99: ! 100: /** ! 101: * Write a chtype string to a window ! 102: * ! 103: * @v *win window in which to write ! 104: * @v *chstr chtype string ! 105: * @v wrap wrap "switch" ! 106: * @v n write at most n chtypes ! 107: */ ! 108: void _wputchstr ( WINDOW *win, const chtype *chstr, int wrap, int n ) { ! 109: for ( ; *chstr && n-- ; chstr++ ) { ! 110: _wputch(win,*chstr,wrap); ! 111: } ! 112: } ! 113: ! 114: /** ! 115: * Write a standard c-style string to a window ! 116: * ! 117: * @v *win window in which to write ! 118: * @v *str string ! 119: * @v wrap wrap "switch" ! 120: * @v n write at most n chars from *str ! 121: */ ! 122: void _wputstr ( WINDOW *win, const char *str, int wrap, int n ) { ! 123: for ( ; *str && n-- ; str++ ) { ! 124: _wputc ( win, *str, wrap ); ! 125: } ! 126: } ! 127: ! 128: /** ! 129: * Move a window's cursor to the specified position ! 130: * ! 131: * @v *win window to be operated on ! 132: * @v y Y position ! 133: * @v x X position ! 134: * @ret rc return status code ! 135: */ ! 136: int wmove ( WINDOW *win, int y, int x ) { ! 137: /* chech for out-of-bounds errors */ ! 138: if ( ( (unsigned)y >= win->height ) || ! 139: ( (unsigned)x >= win->width ) ) { ! 140: return ERR; ! 141: } ! 142: ! 143: win->curs_y = y; ! 144: win->curs_x = x; ! 145: _wupdcurs(win); ! 146: return OK; ! 147: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.