xref: /utopia/UTPA2-700.0.x/projects/build/scripts/kconfig/lxdialog/textbox.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1*53ee8cc1Swenshuai.xi /*
2*53ee8cc1Swenshuai.xi  *  textbox.c -- implements the text box
3*53ee8cc1Swenshuai.xi  *
4*53ee8cc1Swenshuai.xi  *  ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
5*53ee8cc1Swenshuai.xi  *  MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
6*53ee8cc1Swenshuai.xi  *
7*53ee8cc1Swenshuai.xi  *  This program is free software; you can redistribute it and/or
8*53ee8cc1Swenshuai.xi  *  modify it under the terms of the GNU General Public License
9*53ee8cc1Swenshuai.xi  *  as published by the Free Software Foundation; either version 2
10*53ee8cc1Swenshuai.xi  *  of the License, or (at your option) any later version.
11*53ee8cc1Swenshuai.xi  *
12*53ee8cc1Swenshuai.xi  *  This program is distributed in the hope that it will be useful,
13*53ee8cc1Swenshuai.xi  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14*53ee8cc1Swenshuai.xi  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15*53ee8cc1Swenshuai.xi  *  GNU General Public License for more details.
16*53ee8cc1Swenshuai.xi  *
17*53ee8cc1Swenshuai.xi  *  You should have received a copy of the GNU General Public License
18*53ee8cc1Swenshuai.xi  *  along with this program; if not, write to the Free Software
19*53ee8cc1Swenshuai.xi  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20*53ee8cc1Swenshuai.xi  */
21*53ee8cc1Swenshuai.xi 
22*53ee8cc1Swenshuai.xi #include "dialog.h"
23*53ee8cc1Swenshuai.xi 
24*53ee8cc1Swenshuai.xi static void back_lines(int n);
25*53ee8cc1Swenshuai.xi static void print_page(WINDOW * win, int height, int width);
26*53ee8cc1Swenshuai.xi static void print_line(WINDOW * win, int row, int width);
27*53ee8cc1Swenshuai.xi static char *get_line(void);
28*53ee8cc1Swenshuai.xi static void print_position(WINDOW * win);
29*53ee8cc1Swenshuai.xi 
30*53ee8cc1Swenshuai.xi static int hscroll;
31*53ee8cc1Swenshuai.xi static int begin_reached, end_reached, page_length;
32*53ee8cc1Swenshuai.xi static const char *buf;
33*53ee8cc1Swenshuai.xi static const char *page;
34*53ee8cc1Swenshuai.xi 
35*53ee8cc1Swenshuai.xi /*
36*53ee8cc1Swenshuai.xi  * refresh window content
37*53ee8cc1Swenshuai.xi  */
refresh_text_box(WINDOW * dialog,WINDOW * box,int boxh,int boxw,int cur_y,int cur_x)38*53ee8cc1Swenshuai.xi static void refresh_text_box(WINDOW *dialog, WINDOW *box, int boxh, int boxw,
39*53ee8cc1Swenshuai.xi 							  int cur_y, int cur_x)
40*53ee8cc1Swenshuai.xi {
41*53ee8cc1Swenshuai.xi 	print_page(box, boxh, boxw);
42*53ee8cc1Swenshuai.xi 	print_position(dialog);
43*53ee8cc1Swenshuai.xi 	wmove(dialog, cur_y, cur_x);	/* Restore cursor position */
44*53ee8cc1Swenshuai.xi 	wrefresh(dialog);
45*53ee8cc1Swenshuai.xi }
46*53ee8cc1Swenshuai.xi 
47*53ee8cc1Swenshuai.xi 
48*53ee8cc1Swenshuai.xi /*
49*53ee8cc1Swenshuai.xi  * Display text from a file in a dialog box.
50*53ee8cc1Swenshuai.xi  */
dialog_textbox(const char * title,const char * tbuf,int initial_height,int initial_width)51*53ee8cc1Swenshuai.xi int dialog_textbox(const char *title, const char *tbuf,
52*53ee8cc1Swenshuai.xi 		   int initial_height, int initial_width)
53*53ee8cc1Swenshuai.xi {
54*53ee8cc1Swenshuai.xi 	int i, x, y, cur_x, cur_y, key = 0;
55*53ee8cc1Swenshuai.xi 	int height, width, boxh, boxw;
56*53ee8cc1Swenshuai.xi 	int passed_end;
57*53ee8cc1Swenshuai.xi 	WINDOW *dialog, *box;
58*53ee8cc1Swenshuai.xi 
59*53ee8cc1Swenshuai.xi 	begin_reached = 1;
60*53ee8cc1Swenshuai.xi 	end_reached = 0;
61*53ee8cc1Swenshuai.xi 	page_length = 0;
62*53ee8cc1Swenshuai.xi 	hscroll = 0;
63*53ee8cc1Swenshuai.xi 	buf = tbuf;
64*53ee8cc1Swenshuai.xi 	page = buf;	/* page is pointer to start of page to be displayed */
65*53ee8cc1Swenshuai.xi 
66*53ee8cc1Swenshuai.xi do_resize:
67*53ee8cc1Swenshuai.xi 	getmaxyx(stdscr, height, width);
68*53ee8cc1Swenshuai.xi 	if (height < 8 || width < 8)
69*53ee8cc1Swenshuai.xi 		return -ERRDISPLAYTOOSMALL;
70*53ee8cc1Swenshuai.xi 	if (initial_height != 0)
71*53ee8cc1Swenshuai.xi 		height = initial_height;
72*53ee8cc1Swenshuai.xi 	else
73*53ee8cc1Swenshuai.xi 		if (height > 4)
74*53ee8cc1Swenshuai.xi 			height -= 4;
75*53ee8cc1Swenshuai.xi 		else
76*53ee8cc1Swenshuai.xi 			height = 0;
77*53ee8cc1Swenshuai.xi 	if (initial_width != 0)
78*53ee8cc1Swenshuai.xi 		width = initial_width;
79*53ee8cc1Swenshuai.xi 	else
80*53ee8cc1Swenshuai.xi 		if (width > 5)
81*53ee8cc1Swenshuai.xi 			width -= 5;
82*53ee8cc1Swenshuai.xi 		else
83*53ee8cc1Swenshuai.xi 			width = 0;
84*53ee8cc1Swenshuai.xi 
85*53ee8cc1Swenshuai.xi 	/* center dialog box on screen */
86*53ee8cc1Swenshuai.xi 	x = (COLS - width) / 2;
87*53ee8cc1Swenshuai.xi 	y = (LINES - height) / 2;
88*53ee8cc1Swenshuai.xi 
89*53ee8cc1Swenshuai.xi 	draw_shadow(stdscr, y, x, height, width);
90*53ee8cc1Swenshuai.xi 
91*53ee8cc1Swenshuai.xi 	dialog = newwin(height, width, y, x);
92*53ee8cc1Swenshuai.xi 	keypad(dialog, TRUE);
93*53ee8cc1Swenshuai.xi 
94*53ee8cc1Swenshuai.xi 	/* Create window for box region, used for scrolling text */
95*53ee8cc1Swenshuai.xi 	boxh = height - 4;
96*53ee8cc1Swenshuai.xi 	boxw = width - 2;
97*53ee8cc1Swenshuai.xi 	box = subwin(dialog, boxh, boxw, y + 1, x + 1);
98*53ee8cc1Swenshuai.xi 	wattrset(box, dlg.dialog.atr);
99*53ee8cc1Swenshuai.xi 	wbkgdset(box, dlg.dialog.atr & A_COLOR);
100*53ee8cc1Swenshuai.xi 
101*53ee8cc1Swenshuai.xi 	keypad(box, TRUE);
102*53ee8cc1Swenshuai.xi 
103*53ee8cc1Swenshuai.xi 	/* register the new window, along with its borders */
104*53ee8cc1Swenshuai.xi 	draw_box(dialog, 0, 0, height, width,
105*53ee8cc1Swenshuai.xi 		 dlg.dialog.atr, dlg.border.atr);
106*53ee8cc1Swenshuai.xi 
107*53ee8cc1Swenshuai.xi 	wattrset(dialog, dlg.border.atr);
108*53ee8cc1Swenshuai.xi 	mvwaddch(dialog, height - 3, 0, ACS_LTEE);
109*53ee8cc1Swenshuai.xi 	for (i = 0; i < width - 2; i++)
110*53ee8cc1Swenshuai.xi 		waddch(dialog, ACS_HLINE);
111*53ee8cc1Swenshuai.xi 	wattrset(dialog, dlg.dialog.atr);
112*53ee8cc1Swenshuai.xi 	wbkgdset(dialog, dlg.dialog.atr & A_COLOR);
113*53ee8cc1Swenshuai.xi 	waddch(dialog, ACS_RTEE);
114*53ee8cc1Swenshuai.xi 
115*53ee8cc1Swenshuai.xi 	print_title(dialog, title, width);
116*53ee8cc1Swenshuai.xi 
117*53ee8cc1Swenshuai.xi 	print_button(dialog, gettext(" Exit "), height - 2, width / 2 - 4, TRUE);
118*53ee8cc1Swenshuai.xi 	wnoutrefresh(dialog);
119*53ee8cc1Swenshuai.xi 	getyx(dialog, cur_y, cur_x);	/* Save cursor position */
120*53ee8cc1Swenshuai.xi 
121*53ee8cc1Swenshuai.xi 	/* Print first page of text */
122*53ee8cc1Swenshuai.xi 	attr_clear(box, boxh, boxw, dlg.dialog.atr);
123*53ee8cc1Swenshuai.xi 	refresh_text_box(dialog, box, boxh, boxw, cur_y, cur_x);
124*53ee8cc1Swenshuai.xi 
125*53ee8cc1Swenshuai.xi 	while ((key != KEY_ESC) && (key != '\n')) {
126*53ee8cc1Swenshuai.xi 		key = wgetch(dialog);
127*53ee8cc1Swenshuai.xi 		switch (key) {
128*53ee8cc1Swenshuai.xi 		case 'E':	/* Exit */
129*53ee8cc1Swenshuai.xi 		case 'e':
130*53ee8cc1Swenshuai.xi 		case 'X':
131*53ee8cc1Swenshuai.xi 		case 'x':
132*53ee8cc1Swenshuai.xi 			delwin(box);
133*53ee8cc1Swenshuai.xi 			delwin(dialog);
134*53ee8cc1Swenshuai.xi 			return 0;
135*53ee8cc1Swenshuai.xi 		case 'g':	/* First page */
136*53ee8cc1Swenshuai.xi 		case KEY_HOME:
137*53ee8cc1Swenshuai.xi 			if (!begin_reached) {
138*53ee8cc1Swenshuai.xi 				begin_reached = 1;
139*53ee8cc1Swenshuai.xi 				page = buf;
140*53ee8cc1Swenshuai.xi 				refresh_text_box(dialog, box, boxh, boxw,
141*53ee8cc1Swenshuai.xi 						 cur_y, cur_x);
142*53ee8cc1Swenshuai.xi 			}
143*53ee8cc1Swenshuai.xi 			break;
144*53ee8cc1Swenshuai.xi 		case 'G':	/* Last page */
145*53ee8cc1Swenshuai.xi 		case KEY_END:
146*53ee8cc1Swenshuai.xi 
147*53ee8cc1Swenshuai.xi 			end_reached = 1;
148*53ee8cc1Swenshuai.xi 			/* point to last char in buf */
149*53ee8cc1Swenshuai.xi 			page = buf + strlen(buf);
150*53ee8cc1Swenshuai.xi 			back_lines(boxh);
151*53ee8cc1Swenshuai.xi 			refresh_text_box(dialog, box, boxh, boxw,
152*53ee8cc1Swenshuai.xi 					 cur_y, cur_x);
153*53ee8cc1Swenshuai.xi 			break;
154*53ee8cc1Swenshuai.xi 		case 'K':	/* Previous line */
155*53ee8cc1Swenshuai.xi 		case 'k':
156*53ee8cc1Swenshuai.xi 		case KEY_UP:
157*53ee8cc1Swenshuai.xi 			if (!begin_reached) {
158*53ee8cc1Swenshuai.xi 				back_lines(page_length + 1);
159*53ee8cc1Swenshuai.xi 
160*53ee8cc1Swenshuai.xi 				/* We don't call print_page() here but use
161*53ee8cc1Swenshuai.xi 				 * scrolling to ensure faster screen update.
162*53ee8cc1Swenshuai.xi 				 * However, 'end_reached' and 'page_length'
163*53ee8cc1Swenshuai.xi 				 * should still be updated, and 'page' should
164*53ee8cc1Swenshuai.xi 				 * point to start of next page. This is done
165*53ee8cc1Swenshuai.xi 				 * by calling get_line() in the following
166*53ee8cc1Swenshuai.xi 				 * 'for' loop. */
167*53ee8cc1Swenshuai.xi 				scrollok(box, TRUE);
168*53ee8cc1Swenshuai.xi 				wscrl(box, -1);	/* Scroll box region down one line */
169*53ee8cc1Swenshuai.xi 				scrollok(box, FALSE);
170*53ee8cc1Swenshuai.xi 				page_length = 0;
171*53ee8cc1Swenshuai.xi 				passed_end = 0;
172*53ee8cc1Swenshuai.xi 				for (i = 0; i < boxh; i++) {
173*53ee8cc1Swenshuai.xi 					if (!i) {
174*53ee8cc1Swenshuai.xi 						/* print first line of page */
175*53ee8cc1Swenshuai.xi 						print_line(box, 0, boxw);
176*53ee8cc1Swenshuai.xi 						wnoutrefresh(box);
177*53ee8cc1Swenshuai.xi 					} else
178*53ee8cc1Swenshuai.xi 						/* Called to update 'end_reached' and 'page' */
179*53ee8cc1Swenshuai.xi 						get_line();
180*53ee8cc1Swenshuai.xi 					if (!passed_end)
181*53ee8cc1Swenshuai.xi 						page_length++;
182*53ee8cc1Swenshuai.xi 					if (end_reached && !passed_end)
183*53ee8cc1Swenshuai.xi 						passed_end = 1;
184*53ee8cc1Swenshuai.xi 				}
185*53ee8cc1Swenshuai.xi 
186*53ee8cc1Swenshuai.xi 				print_position(dialog);
187*53ee8cc1Swenshuai.xi 				wmove(dialog, cur_y, cur_x);	/* Restore cursor position */
188*53ee8cc1Swenshuai.xi 				wrefresh(dialog);
189*53ee8cc1Swenshuai.xi 			}
190*53ee8cc1Swenshuai.xi 			break;
191*53ee8cc1Swenshuai.xi 		case 'B':	/* Previous page */
192*53ee8cc1Swenshuai.xi 		case 'b':
193*53ee8cc1Swenshuai.xi 		case KEY_PPAGE:
194*53ee8cc1Swenshuai.xi 			if (begin_reached)
195*53ee8cc1Swenshuai.xi 				break;
196*53ee8cc1Swenshuai.xi 			back_lines(page_length + boxh);
197*53ee8cc1Swenshuai.xi 			refresh_text_box(dialog, box, boxh, boxw,
198*53ee8cc1Swenshuai.xi 					 cur_y, cur_x);
199*53ee8cc1Swenshuai.xi 			break;
200*53ee8cc1Swenshuai.xi 		case 'J':	/* Next line */
201*53ee8cc1Swenshuai.xi 		case 'j':
202*53ee8cc1Swenshuai.xi 		case KEY_DOWN:
203*53ee8cc1Swenshuai.xi 			if (!end_reached) {
204*53ee8cc1Swenshuai.xi 				begin_reached = 0;
205*53ee8cc1Swenshuai.xi 				scrollok(box, TRUE);
206*53ee8cc1Swenshuai.xi 				scroll(box);	/* Scroll box region up one line */
207*53ee8cc1Swenshuai.xi 				scrollok(box, FALSE);
208*53ee8cc1Swenshuai.xi 				print_line(box, boxh - 1, boxw);
209*53ee8cc1Swenshuai.xi 				wnoutrefresh(box);
210*53ee8cc1Swenshuai.xi 				print_position(dialog);
211*53ee8cc1Swenshuai.xi 				wmove(dialog, cur_y, cur_x);	/* Restore cursor position */
212*53ee8cc1Swenshuai.xi 				wrefresh(dialog);
213*53ee8cc1Swenshuai.xi 			}
214*53ee8cc1Swenshuai.xi 			break;
215*53ee8cc1Swenshuai.xi 		case KEY_NPAGE:	/* Next page */
216*53ee8cc1Swenshuai.xi 		case ' ':
217*53ee8cc1Swenshuai.xi 			if (end_reached)
218*53ee8cc1Swenshuai.xi 				break;
219*53ee8cc1Swenshuai.xi 
220*53ee8cc1Swenshuai.xi 			begin_reached = 0;
221*53ee8cc1Swenshuai.xi 			refresh_text_box(dialog, box, boxh, boxw,
222*53ee8cc1Swenshuai.xi 					 cur_y, cur_x);
223*53ee8cc1Swenshuai.xi 			break;
224*53ee8cc1Swenshuai.xi 		case '0':	/* Beginning of line */
225*53ee8cc1Swenshuai.xi 		case 'H':	/* Scroll left */
226*53ee8cc1Swenshuai.xi 		case 'h':
227*53ee8cc1Swenshuai.xi 		case KEY_LEFT:
228*53ee8cc1Swenshuai.xi 			if (hscroll <= 0)
229*53ee8cc1Swenshuai.xi 				break;
230*53ee8cc1Swenshuai.xi 
231*53ee8cc1Swenshuai.xi 			if (key == '0')
232*53ee8cc1Swenshuai.xi 				hscroll = 0;
233*53ee8cc1Swenshuai.xi 			else
234*53ee8cc1Swenshuai.xi 				hscroll--;
235*53ee8cc1Swenshuai.xi 			/* Reprint current page to scroll horizontally */
236*53ee8cc1Swenshuai.xi 			back_lines(page_length);
237*53ee8cc1Swenshuai.xi 			refresh_text_box(dialog, box, boxh, boxw,
238*53ee8cc1Swenshuai.xi 					 cur_y, cur_x);
239*53ee8cc1Swenshuai.xi 			break;
240*53ee8cc1Swenshuai.xi 		case 'L':	/* Scroll right */
241*53ee8cc1Swenshuai.xi 		case 'l':
242*53ee8cc1Swenshuai.xi 		case KEY_RIGHT:
243*53ee8cc1Swenshuai.xi 			if (hscroll >= MAX_LEN)
244*53ee8cc1Swenshuai.xi 				break;
245*53ee8cc1Swenshuai.xi 			hscroll++;
246*53ee8cc1Swenshuai.xi 			/* Reprint current page to scroll horizontally */
247*53ee8cc1Swenshuai.xi 			back_lines(page_length);
248*53ee8cc1Swenshuai.xi 			refresh_text_box(dialog, box, boxh, boxw,
249*53ee8cc1Swenshuai.xi 					 cur_y, cur_x);
250*53ee8cc1Swenshuai.xi 			break;
251*53ee8cc1Swenshuai.xi 		case KEY_ESC:
252*53ee8cc1Swenshuai.xi 			key = on_key_esc(dialog);
253*53ee8cc1Swenshuai.xi 			break;
254*53ee8cc1Swenshuai.xi 		case KEY_RESIZE:
255*53ee8cc1Swenshuai.xi 			back_lines(height);
256*53ee8cc1Swenshuai.xi 			delwin(box);
257*53ee8cc1Swenshuai.xi 			delwin(dialog);
258*53ee8cc1Swenshuai.xi 			on_key_resize();
259*53ee8cc1Swenshuai.xi 			goto do_resize;
260*53ee8cc1Swenshuai.xi 		}
261*53ee8cc1Swenshuai.xi 	}
262*53ee8cc1Swenshuai.xi 	delwin(box);
263*53ee8cc1Swenshuai.xi 	delwin(dialog);
264*53ee8cc1Swenshuai.xi 	return key;		/* ESC pressed */
265*53ee8cc1Swenshuai.xi }
266*53ee8cc1Swenshuai.xi 
267*53ee8cc1Swenshuai.xi /*
268*53ee8cc1Swenshuai.xi  * Go back 'n' lines in text. Called by dialog_textbox().
269*53ee8cc1Swenshuai.xi  * 'page' will be updated to point to the desired line in 'buf'.
270*53ee8cc1Swenshuai.xi  */
back_lines(int n)271*53ee8cc1Swenshuai.xi static void back_lines(int n)
272*53ee8cc1Swenshuai.xi {
273*53ee8cc1Swenshuai.xi 	int i;
274*53ee8cc1Swenshuai.xi 
275*53ee8cc1Swenshuai.xi 	begin_reached = 0;
276*53ee8cc1Swenshuai.xi 	/* Go back 'n' lines */
277*53ee8cc1Swenshuai.xi 	for (i = 0; i < n; i++) {
278*53ee8cc1Swenshuai.xi 		if (*page == '\0') {
279*53ee8cc1Swenshuai.xi 			if (end_reached) {
280*53ee8cc1Swenshuai.xi 				end_reached = 0;
281*53ee8cc1Swenshuai.xi 				continue;
282*53ee8cc1Swenshuai.xi 			}
283*53ee8cc1Swenshuai.xi 		}
284*53ee8cc1Swenshuai.xi 		if (page == buf) {
285*53ee8cc1Swenshuai.xi 			begin_reached = 1;
286*53ee8cc1Swenshuai.xi 			return;
287*53ee8cc1Swenshuai.xi 		}
288*53ee8cc1Swenshuai.xi 		page--;
289*53ee8cc1Swenshuai.xi 		do {
290*53ee8cc1Swenshuai.xi 			if (page == buf) {
291*53ee8cc1Swenshuai.xi 				begin_reached = 1;
292*53ee8cc1Swenshuai.xi 				return;
293*53ee8cc1Swenshuai.xi 			}
294*53ee8cc1Swenshuai.xi 			page--;
295*53ee8cc1Swenshuai.xi 		} while (*page != '\n');
296*53ee8cc1Swenshuai.xi 		page++;
297*53ee8cc1Swenshuai.xi 	}
298*53ee8cc1Swenshuai.xi }
299*53ee8cc1Swenshuai.xi 
300*53ee8cc1Swenshuai.xi /*
301*53ee8cc1Swenshuai.xi  * Print a new page of text. Called by dialog_textbox().
302*53ee8cc1Swenshuai.xi  */
print_page(WINDOW * win,int height,int width)303*53ee8cc1Swenshuai.xi static void print_page(WINDOW * win, int height, int width)
304*53ee8cc1Swenshuai.xi {
305*53ee8cc1Swenshuai.xi 	int i, passed_end = 0;
306*53ee8cc1Swenshuai.xi 
307*53ee8cc1Swenshuai.xi 	page_length = 0;
308*53ee8cc1Swenshuai.xi 	for (i = 0; i < height; i++) {
309*53ee8cc1Swenshuai.xi 		print_line(win, i, width);
310*53ee8cc1Swenshuai.xi 		if (!passed_end)
311*53ee8cc1Swenshuai.xi 			page_length++;
312*53ee8cc1Swenshuai.xi 		if (end_reached && !passed_end)
313*53ee8cc1Swenshuai.xi 			passed_end = 1;
314*53ee8cc1Swenshuai.xi 	}
315*53ee8cc1Swenshuai.xi 	wnoutrefresh(win);
316*53ee8cc1Swenshuai.xi }
317*53ee8cc1Swenshuai.xi 
318*53ee8cc1Swenshuai.xi /*
319*53ee8cc1Swenshuai.xi  * Print a new line of text. Called by dialog_textbox() and print_page().
320*53ee8cc1Swenshuai.xi  */
print_line(WINDOW * win,int row,int width)321*53ee8cc1Swenshuai.xi static void print_line(WINDOW * win, int row, int width)
322*53ee8cc1Swenshuai.xi {
323*53ee8cc1Swenshuai.xi 	int y, x;
324*53ee8cc1Swenshuai.xi 	char *line;
325*53ee8cc1Swenshuai.xi 
326*53ee8cc1Swenshuai.xi 	line = get_line();
327*53ee8cc1Swenshuai.xi 	line += MIN(strlen(line), hscroll);	/* Scroll horizontally */
328*53ee8cc1Swenshuai.xi 	wmove(win, row, 0);	/* move cursor to correct line */
329*53ee8cc1Swenshuai.xi 	waddch(win, ' ');
330*53ee8cc1Swenshuai.xi 	waddnstr(win, line, MIN(strlen(line), width - 2));
331*53ee8cc1Swenshuai.xi 
332*53ee8cc1Swenshuai.xi 	getyx(win, y, x);
333*53ee8cc1Swenshuai.xi 	/* Clear 'residue' of previous line */
334*53ee8cc1Swenshuai.xi #if OLD_NCURSES
335*53ee8cc1Swenshuai.xi 	{
336*53ee8cc1Swenshuai.xi 		int i;
337*53ee8cc1Swenshuai.xi 		for (i = 0; i < width - x; i++)
338*53ee8cc1Swenshuai.xi 			waddch(win, ' ');
339*53ee8cc1Swenshuai.xi 	}
340*53ee8cc1Swenshuai.xi #else
341*53ee8cc1Swenshuai.xi 	wclrtoeol(win);
342*53ee8cc1Swenshuai.xi #endif
343*53ee8cc1Swenshuai.xi }
344*53ee8cc1Swenshuai.xi 
345*53ee8cc1Swenshuai.xi /*
346*53ee8cc1Swenshuai.xi  * Return current line of text. Called by dialog_textbox() and print_line().
347*53ee8cc1Swenshuai.xi  * 'page' should point to start of current line before calling, and will be
348*53ee8cc1Swenshuai.xi  * updated to point to start of next line.
349*53ee8cc1Swenshuai.xi  */
get_line(void)350*53ee8cc1Swenshuai.xi static char *get_line(void)
351*53ee8cc1Swenshuai.xi {
352*53ee8cc1Swenshuai.xi 	int i = 0;
353*53ee8cc1Swenshuai.xi 	static char line[MAX_LEN + 1];
354*53ee8cc1Swenshuai.xi 
355*53ee8cc1Swenshuai.xi 	end_reached = 0;
356*53ee8cc1Swenshuai.xi 	while (*page != '\n') {
357*53ee8cc1Swenshuai.xi 		if (*page == '\0') {
358*53ee8cc1Swenshuai.xi 			if (!end_reached) {
359*53ee8cc1Swenshuai.xi 				end_reached = 1;
360*53ee8cc1Swenshuai.xi 				break;
361*53ee8cc1Swenshuai.xi 			}
362*53ee8cc1Swenshuai.xi 		} else if (i < MAX_LEN)
363*53ee8cc1Swenshuai.xi 			line[i++] = *(page++);
364*53ee8cc1Swenshuai.xi 		else {
365*53ee8cc1Swenshuai.xi 			/* Truncate lines longer than MAX_LEN characters */
366*53ee8cc1Swenshuai.xi 			if (i == MAX_LEN)
367*53ee8cc1Swenshuai.xi 				line[i++] = '\0';
368*53ee8cc1Swenshuai.xi 			page++;
369*53ee8cc1Swenshuai.xi 		}
370*53ee8cc1Swenshuai.xi 	}
371*53ee8cc1Swenshuai.xi 	if (i <= MAX_LEN)
372*53ee8cc1Swenshuai.xi 		line[i] = '\0';
373*53ee8cc1Swenshuai.xi 	if (!end_reached)
374*53ee8cc1Swenshuai.xi 		page++;		/* move pass '\n' */
375*53ee8cc1Swenshuai.xi 
376*53ee8cc1Swenshuai.xi 	return line;
377*53ee8cc1Swenshuai.xi }
378*53ee8cc1Swenshuai.xi 
379*53ee8cc1Swenshuai.xi /*
380*53ee8cc1Swenshuai.xi  * Print current position
381*53ee8cc1Swenshuai.xi  */
print_position(WINDOW * win)382*53ee8cc1Swenshuai.xi static void print_position(WINDOW * win)
383*53ee8cc1Swenshuai.xi {
384*53ee8cc1Swenshuai.xi 	int percent;
385*53ee8cc1Swenshuai.xi 
386*53ee8cc1Swenshuai.xi 	wattrset(win, dlg.position_indicator.atr);
387*53ee8cc1Swenshuai.xi 	wbkgdset(win, dlg.position_indicator.atr & A_COLOR);
388*53ee8cc1Swenshuai.xi 	percent = (page - buf) * 100 / strlen(buf);
389*53ee8cc1Swenshuai.xi 	wmove(win, getmaxy(win) - 3, getmaxx(win) - 9);
390*53ee8cc1Swenshuai.xi 	wprintw(win, "(%3d%%)", percent);
391*53ee8cc1Swenshuai.xi }
392