1 /* pager.c - display very long strings (with scrolling)
2 *
3 * Copyright 1999, 2000 Jochen Voss */
4
5 static const char rcsid[] = "$Id: pager.c 4839 2003-04-13 16:50:02Z voss $";
6
7 #ifdef HAVE_CONFIG_H
8 #include <config.h>
9 #endif
10
11 #include <string.h>
12
13 #include "moon-buggy.h"
14 #include "copying.h"
15
16
17
18 struct mode *pager_mode;
19
20
21 static int lines_used, current_line;
22 static int mb_lines = 25;
23
24
25 static void
print_page(unsigned current_line)26 print_page (unsigned current_line)
27 {
28 int i;
29
30 for (i=0; i<mb_lines-3; ++i) {
31 if (current_line + i < lines_used) {
32 mvwaddstr (moon, i, 2, copying_lines[current_line+i]);
33 } else {
34 mvwaddstr (moon, i, 2, "~");
35 }
36 wclrtoeol (moon);
37 }
38 wnoutrefresh (moon);
39
40 mvwprintw (status, 0, 0, "=== COPYING %3d%% === ",
41 lines_used==0 ? 100 :(int)(current_line*100.0/(lines_used-1)+.5));
42 wnoutrefresh (status);
43 }
44
45 static void
pager_redraw(void)46 pager_redraw (void)
47 {
48 mb_lines = LINES;
49 print_page (current_line);
50 }
51
52 static void
key_handler(game_time t,int val)53 key_handler (game_time t, int val)
54 {
55 switch (val) {
56 case 1:
57 mode_change (title_mode, 0);
58 break;
59 case 2:
60 if (current_line > 0) --current_line;
61 print_page (current_line);
62 break;
63 case 3:
64 if (current_line < lines_used-1) ++current_line;
65 print_page (current_line);
66 break;
67 case 4:
68 if (current_line > mb_lines-3) {
69 current_line -= mb_lines-3;
70 } else {
71 current_line = 0;
72 }
73 print_page (current_line);
74 break;
75 case 5:
76 current_line += mb_lines-3;
77 if (current_line >= lines_used) {
78 current_line = lines_used-1;
79 if (current_line < 0) current_line = 0;
80 }
81 print_page (current_line);
82 break;
83 case 6:
84 current_line = 0;
85 print_page (current_line);
86 break;
87 case 7:
88 current_line = lines_used-1;
89 if (current_line < 0) current_line = 0;
90 print_page (current_line);
91 break;
92 }
93 }
94
95 static void
pager_enter(int what)96 pager_enter (int what)
97 {
98 int i;
99
100 lines_used = sizeof (copying_lines) / sizeof (const char *);
101 switch (what) {
102 case 0:
103 current_line = 0;
104 break;
105 case 1:
106 current_line = 0;
107 for (i=0; i<lines_used; ++i) {
108 if (strstr (copying_lines[i], "NO WARRANTY")) {
109 current_line = i;
110 break;
111 }
112 }
113 default:
114 break;
115 }
116 }
117
118 static void
pager_leave(void)119 pager_leave (void)
120 {
121 werase (status);
122 wnoutrefresh (status);
123 }
124
125 void
setup_pager_mode(void)126 setup_pager_mode (void)
127 {
128 pager_mode = new_mode ();
129 pager_mode->enter = pager_enter;
130 pager_mode->leave = pager_leave;
131 pager_mode->redraw = pager_redraw;
132 pager_mode->keypress = key_handler;
133 mode_add_key (pager_mode, mbk_end, "quit", 1);
134 mode_add_key (pager_mode, mbk_up, "up", 2);
135 mode_add_key (pager_mode, mbk_down, "down", 3);
136 mode_add_key (pager_mode, mbk_pageup, "pg up", 4);
137 mode_add_key (pager_mode, mbk_pagedown, "pg down", 5);
138 mode_add_key (pager_mode, mbk_first, "home", 6);
139 mode_add_key (pager_mode, mbk_last, "end", 7);
140 mode_complete (pager_mode);
141 }
142