source: bootcd/isolinux/syslinux-6.03/gpxe/src/hci/mucurses/widgets/editbox.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: 2.7 KB
Line 
1/*
2 * Copyright (C) 2006 Michael Brown <mbrown@fensystems.co.uk>.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License as
6 * published by the Free Software Foundation; either version 2 of the
7 * License, or any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 * General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17 */
18
19FILE_LICENCE ( GPL2_OR_LATER );
20
21#include <string.h>
22#include <assert.h>
23#include <gpxe/editbox.h>
24
25/** @file
26 *
27 * Editable text box widget
28 *
29 */
30
31#define EDITBOX_MIN_CHARS 3
32
33/**
34 * Initialise text box widget
35 *
36 * @v box               Editable text box widget
37 * @v buf               Text buffer
38 * @v len               Size of text buffer
39 * @v win               Containing window
40 * @v row               Row
41 * @v col               Starting column
42 * @v width             Width
43 * @v flags             Flags
44 */
45void init_editbox ( struct edit_box *box, char *buf, size_t len,
46                    WINDOW *win, unsigned int row, unsigned int col,
47                    unsigned int width, unsigned int flags ) {
48        memset ( box, 0, sizeof ( *box ) );
49        box->string.buf = buf;
50        box->string.len = len;
51        box->string.cursor = strlen ( buf );
52        box->win = ( win ? win : stdscr );
53        box->row = row;
54        box->col = col;
55        box->width = width;
56        box->flags = flags;
57}
58
59/**
60 * Draw text box widget
61 *
62 * @v box               Editable text box widget
63 *
64 */
65void draw_editbox ( struct edit_box *box ) {
66        size_t width = box->width;
67        char buf[ width + 1 ];
68        signed int cursor_offset, underflow, overflow, first;
69        size_t len;
70
71        /* Adjust starting offset so that cursor remains within box */
72        cursor_offset = ( box->string.cursor - box->first );
73        underflow = ( EDITBOX_MIN_CHARS - cursor_offset );
74        overflow = ( cursor_offset - ( width - 1 ) );
75        first = box->first;
76        if ( underflow > 0 ) {
77                first -= underflow;
78                if ( first < 0 )
79                        first = 0;
80        } else if ( overflow > 0 ) {
81                first += overflow;
82        }
83        box->first = first;
84        cursor_offset = ( box->string.cursor - first );
85
86        /* Construct underscore-padded string portion */
87        memset ( buf, '_', width );
88        buf[width] = '\0';
89        len = ( strlen ( box->string.buf ) - first );
90        if ( len > width )
91                len = width;
92        if ( box->flags & EDITBOX_STARS ) {
93                memset ( buf, '*', len );
94        } else {
95                memcpy ( buf, ( box->string.buf + first ), len );
96        }
97
98        /* Print box content and move cursor */
99        if ( ! box->win )
100                box->win = stdscr;
101        mvwprintw ( box->win, box->row, box->col, "%s", buf );
102        wmove ( box->win, box->row, ( box->col + cursor_offset ) );
103}
Note: See TracBrowser for help on using the repository browser.