|
|
1.1 root 1: /*
2: * Copyright (C) 2009 Michael Brown <[email protected]>.
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:
19: FILE_LICENCE ( GPL2_OR_LATER );
20:
21: /** @file
22: *
23: * Login UI
24: *
25: */
26:
27: #include <string.h>
28: #include <errno.h>
29: #include <curses.h>
30: #include <ipxe/console.h>
31: #include <ipxe/settings.h>
32: #include <ipxe/editbox.h>
33: #include <ipxe/keys.h>
34: #include <ipxe/login_ui.h>
35:
36: /* Colour pairs */
37: #define CPAIR_NORMAL 1
38: #define CPAIR_LABEL 2
39: #define CPAIR_EDITBOX 3
40:
41: /* Screen layout */
42: #define USERNAME_LABEL_ROW 8
43: #define USERNAME_ROW 10
44: #define PASSWORD_LABEL_ROW 14
45: #define PASSWORD_ROW 16
46: #define LABEL_COL 36
47: #define EDITBOX_COL 30
48: #define EDITBOX_WIDTH 20
49:
50: int login_ui ( void ) {
51: char username[64];
52: char password[64];
53: struct edit_box username_box;
54: struct edit_box password_box;
55: struct edit_box *current_box = &username_box;
56: int key;
57: int rc = -EINPROGRESS;
58:
59: /* Fetch current setting values */
60: fetch_string_setting ( NULL, &username_setting, username,
61: sizeof ( username ) );
62: fetch_string_setting ( NULL, &password_setting, password,
63: sizeof ( password ) );
64:
65: /* Initialise UI */
66: initscr();
67: start_color();
68: init_pair ( CPAIR_NORMAL, COLOR_WHITE, COLOR_BLACK );
69: init_pair ( CPAIR_LABEL, COLOR_WHITE, COLOR_BLACK );
70: init_pair ( CPAIR_EDITBOX, COLOR_WHITE, COLOR_BLUE );
71: init_editbox ( &username_box, username, sizeof ( username ), NULL,
72: USERNAME_ROW, EDITBOX_COL, EDITBOX_WIDTH, 0 );
73: init_editbox ( &password_box, password, sizeof ( password ), NULL,
74: PASSWORD_ROW, EDITBOX_COL, EDITBOX_WIDTH,
75: EDITBOX_STARS );
76:
77: /* Draw initial UI */
78: erase();
79: color_set ( CPAIR_LABEL, NULL );
80: mvprintw ( USERNAME_LABEL_ROW, LABEL_COL, "Username:" );
81: mvprintw ( PASSWORD_LABEL_ROW, LABEL_COL, "Password:" );
82: color_set ( CPAIR_EDITBOX, NULL );
83: draw_editbox ( &username_box );
84: draw_editbox ( &password_box );
85:
86: /* Main loop */
87: while ( rc == -EINPROGRESS ) {
88:
89: draw_editbox ( current_box );
90:
91: key = getkey ( 0 );
92: switch ( key ) {
93: case KEY_DOWN:
94: current_box = &password_box;
95: break;
96: case KEY_UP:
97: current_box = &username_box;
98: break;
99: case TAB:
100: current_box = ( ( current_box == &username_box ) ?
101: &password_box : &username_box );
102: break;
103: case KEY_ENTER:
104: if ( current_box == &username_box ) {
105: current_box = &password_box;
106: } else {
107: rc = 0;
108: }
109: break;
110: case CTRL_C:
111: case ESC:
112: rc = -ECANCELED;
113: break;
114: default:
115: edit_editbox ( current_box, key );
116: break;
117: }
118: }
119:
120: /* Terminate UI */
121: color_set ( CPAIR_NORMAL, NULL );
122: erase();
123: endwin();
124:
125: if ( rc != 0 )
126: return rc;
127:
128: /* Store settings */
129: if ( ( rc = store_setting ( NULL, &username_setting, username,
130: strlen ( username ) ) ) != 0 )
131: return rc;
132: if ( ( rc = store_setting ( NULL, &password_setting, password,
133: strlen ( password ) ) ) != 0 )
134: return rc;
135:
136: return 0;
137: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.