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