]>
Commit | Line | Data |
---|---|---|
583a1ce5 TT |
1 | /* |
2 | ||
3 | /usr/src/ext2ed/win.c | |
4 | ||
5 | A part of the extended file system 2 disk editor. | |
6 | ||
7 | -------------------------------------------------------- | |
8 | Window management - Interfacing with the ncurses library | |
9 | -------------------------------------------------------- | |
10 | ||
11 | First written on: April 17 1995 | |
0f31c737 TT |
12 | Modified on : April 05 2001 Christian.Bac@int-evry.fr |
13 | it looks like readline does not like that initscr decides to set the tty to | |
14 | noecho. | |
583a1ce5 TT |
15 | |
16 | Copyright (C) 1995 Gadi Oxman | |
17 | ||
18 | */ | |
19 | ||
d1154eb4 | 20 | #include "config.h" |
583a1ce5 TT |
21 | #include <stdio.h> |
22 | #include <stdlib.h> | |
23 | #include <string.h> | |
0f31c737 TT |
24 | #include <termios.h> |
25 | #include <unistd.h> | |
5e941d29 | 26 | #include <sys/ioctl.h> |
583a1ce5 TT |
27 | |
28 | #include "ext2ed.h" | |
7c36779a | 29 | #include "../version.h" |
583a1ce5 TT |
30 | |
31 | struct struct_pad_info show_pad_info; | |
5e941d29 | 32 | WINDOW *title_win,*show_win,*command_win,*mt_win1,*mt_win2,*show_pad; |
583a1ce5 | 33 | |
efc6f628 | 34 | /* to remember configuration after initscr |
0f31c737 TT |
35 | * and modify it |
36 | */ | |
5e941d29 | 37 | struct termios termioInit, termioCurrent; |
0f31c737 | 38 | |
5e941d29 TT |
39 | void draw_title_win (void) |
40 | { | |
41 | char title_string [128]; | |
583a1ce5 | 42 | |
5e941d29 TT |
43 | werase(title_win); |
44 | box (title_win,0,0); | |
45 | sprintf (title_string,"EXT2ED - Extended-2 File System editor ver %s (%s)", E2FSPROGS_VERSION, E2FSPROGS_DATE); | |
46 | wmove (title_win,TITLE_WIN_LINES/2,(COLS-strlen (title_string))/2); | |
47 | wprintw (title_win,title_string); | |
48 | wrefresh(title_win); | |
49 | } | |
50 | ||
51 | void setup_show_win(void) | |
52 | { | |
53 | wbkgdset (show_win,A_REVERSE);werase (show_win); | |
54 | show_pad_info.line=0; | |
55 | show_pad_info.col=0; | |
56 | show_pad_info.display_lines=LINES-TITLE_WIN_LINES-SHOW_WIN_LINES-COMMAND_WIN_LINES-2; | |
57 | show_pad_info.display_cols=COLS; | |
58 | show_pad_info.max_line=show_pad_info.display_lines-1;show_pad_info.max_col=show_pad_info.display_cols-1; | |
59 | show_pad_info.disable_output=0; | |
efc6f628 | 60 | } |
5e941d29 TT |
61 | |
62 | void init_windows (void) | |
583a1ce5 | 63 | { |
583a1ce5 | 64 | initscr (); |
0f31c737 TT |
65 | tcgetattr(0,&termioInit); /* save initial config */ |
66 | termioCurrent = termioInit; | |
67 | termioCurrent.c_lflag |= ECHO; /* set echo on */ | |
68 | tcsetattr(0,TCSANOW,&termioCurrent); | |
efc6f628 | 69 | |
583a1ce5 TT |
70 | if (LINES<TITLE_WIN_LINES+SHOW_WIN_LINES+COMMAND_WIN_LINES+3) { |
71 | printf ("Sorry, your terminal screen is too small\n"); | |
72 | printf ("Error - Can not initialize windows\n"); | |
73 | exit (1); | |
74 | } | |
75 | ||
76 | title_win=newwin (TITLE_WIN_LINES,COLS,0,0); | |
77 | show_win=newwin (SHOW_WIN_LINES,COLS,TITLE_WIN_LINES,0); | |
78 | show_pad=newpad (SHOW_PAD_LINES,SHOW_PAD_COLS); | |
5e941d29 TT |
79 | mt_win1=newwin (1,COLS,TITLE_WIN_LINES+SHOW_WIN_LINES,0); |
80 | mt_win2=newwin (1,COLS,LINES-COMMAND_WIN_LINES-1,0); | |
583a1ce5 TT |
81 | command_win=newwin (COMMAND_WIN_LINES,COLS,LINES-COMMAND_WIN_LINES,0); |
82 | ||
83 | if (title_win==NULL || show_win==NULL || show_pad==NULL || command_win==NULL) { | |
84 | printf ("Error - Not enough memory - Can not initialize windows\n");exit (1); | |
85 | } | |
86 | ||
5e941d29 TT |
87 | draw_title_win(); |
88 | ||
89 | setup_show_win(); | |
583a1ce5 | 90 | |
583a1ce5 TT |
91 | scrollok (command_win,TRUE); |
92 | ||
5e941d29 TT |
93 | refresh_title_win (); |
94 | refresh_show_win (); | |
95 | refresh_show_pad(); | |
96 | refresh_command_win (); | |
97 | wrefresh(mt_win1); | |
98 | wrefresh(mt_win2); | |
583a1ce5 TT |
99 | } |
100 | ||
101 | void refresh_title_win (void) | |
583a1ce5 TT |
102 | { |
103 | wrefresh (title_win); | |
104 | } | |
105 | ||
106 | void refresh_show_win (void) | |
583a1ce5 TT |
107 | { |
108 | int current_page,total_pages; | |
efc6f628 | 109 | |
583a1ce5 TT |
110 | current_page=show_pad_info.line/show_pad_info.display_lines+1; |
111 | if (show_pad_info.line%show_pad_info.display_lines) | |
112 | current_page++; | |
113 | total_pages=show_pad_info.max_line/show_pad_info.display_lines+1; | |
114 | ||
115 | wmove (show_win,2,COLS-18); | |
116 | wprintw (show_win,"Page %d of %d\n",current_page,total_pages); | |
117 | ||
118 | wmove (show_win,2,COLS-18); | |
119 | wrefresh (show_win); | |
120 | } | |
121 | ||
122 | ||
123 | void refresh_show_pad (void) | |
124 | ||
125 | { | |
126 | int left,top,right,bottom,i; | |
efc6f628 | 127 | |
583a1ce5 TT |
128 | if (show_pad_info.disable_output) |
129 | return; | |
efc6f628 | 130 | |
583a1ce5 TT |
131 | if (show_pad_info.max_line < show_pad_info.display_lines-1) { |
132 | for (i=show_pad_info.max_line+1;i<show_pad_info.display_lines;i++) { | |
133 | wmove (show_pad,i,0);wprintw (show_pad,"\n"); | |
134 | } | |
135 | } | |
136 | left=0;right=show_pad_info.display_cols-1; | |
137 | top=TITLE_WIN_LINES+SHOW_WIN_LINES+1;bottom=top+show_pad_info.display_lines-1; | |
138 | ||
139 | if (show_pad_info.line > show_pad_info.max_line-show_pad_info.display_lines+1) | |
140 | show_pad_info.line=show_pad_info.max_line-show_pad_info.display_lines+1; | |
141 | ||
142 | if (show_pad_info.line < 0) | |
143 | show_pad_info.line=0; | |
144 | ||
145 | #ifdef OLD_NCURSES | |
146 | prefresh (show_pad,show_pad_info.line,show_pad_info.col,top,left,show_pad_info.display_lines-1,show_pad_info.display_cols-1); | |
147 | #else | |
148 | prefresh (show_pad,show_pad_info.line,show_pad_info.col,top,left,top+show_pad_info.display_lines-1,left+show_pad_info.display_cols-1); | |
149 | #endif | |
150 | } | |
151 | ||
152 | void refresh_command_win (void) | |
583a1ce5 TT |
153 | { |
154 | wrefresh (command_win); | |
155 | } | |
156 | ||
157 | void close_windows (void) | |
583a1ce5 | 158 | { |
0f31c737 TT |
159 | // echo (); |
160 | tcsetattr(0,TCSANOW,&termioInit); | |
efc6f628 | 161 | |
583a1ce5 TT |
162 | delwin (title_win); |
163 | delwin (command_win); | |
164 | delwin (show_win); | |
165 | delwin (show_pad); | |
efc6f628 | 166 | |
583a1ce5 TT |
167 | endwin (); |
168 | } | |
169 | ||
170 | void show_info (void) | |
583a1ce5 TT |
171 | { |
172 | int block_num,block_offset; | |
efc6f628 | 173 | |
583a1ce5 TT |
174 | block_num=device_offset/file_system_info.block_size; |
175 | block_offset=device_offset%file_system_info.block_size; | |
176 | ||
177 | wmove (show_win,0,0); | |
178 | wprintw (show_win,"Offset %-3ld in block %ld. ",block_offset,block_num); | |
179 | if (current_type != NULL) | |
180 | wprintw (show_win,"Type: %s\n",current_type->name); | |
181 | else | |
182 | wprintw (show_win,"Type: %s\n","none"); | |
183 | ||
184 | refresh_show_win (); | |
185 | } | |
186 | ||
187 | ||
188 | void redraw_all (void) | |
583a1ce5 | 189 | { |
5e941d29 TT |
190 | int min_lines = TITLE_WIN_LINES+SHOW_WIN_LINES+COMMAND_WIN_LINES+3; |
191 | struct winsize ws; | |
192 | int save_col, save_lines; | |
193 | ||
194 | /* get the size of the terminal connected to stdout */ | |
195 | ioctl(1, TIOCGWINSZ, &ws); | |
196 | /* | |
197 | * Do it again because GDB doesn't stop before the first ioctl | |
198 | * call, we want an up-to-date size when we're | |
199 | * single-stepping. | |
200 | */ | |
201 | if (ioctl(1, TIOCGWINSZ, &ws) == 0) { | |
202 | if (ws.ws_row < min_lines) | |
203 | ws.ws_row = min_lines; | |
204 | if ((ws.ws_row != LINES) || (ws.ws_col != COLS)) { | |
205 | wmove (show_win,2,COLS-18); | |
206 | wclrtoeol(show_win); | |
207 | wrefresh(show_win); | |
208 | resizeterm(ws.ws_row, ws.ws_col); | |
209 | wresize(title_win, TITLE_WIN_LINES,COLS); | |
210 | wresize(show_win, SHOW_WIN_LINES,COLS); | |
211 | wresize(command_win, COMMAND_WIN_LINES,COLS); | |
212 | wresize(mt_win1, 1,COLS); | |
213 | wresize(mt_win2, 1,COLS); | |
214 | mvwin(mt_win2, LINES-COMMAND_WIN_LINES-1,0); | |
215 | mvwin(command_win, LINES-COMMAND_WIN_LINES,0); | |
216 | draw_title_win(); | |
217 | show_pad_info.display_lines=LINES-TITLE_WIN_LINES-SHOW_WIN_LINES-COMMAND_WIN_LINES-2; | |
218 | show_pad_info.display_cols=COLS; | |
219 | } | |
220 | } | |
221 | clearok(title_win, 1); | |
222 | clearok(show_win, 1); | |
223 | clearok(command_win, 1); | |
224 | clearok(mt_win1, 1); | |
225 | clearok(mt_win2, 1); | |
226 | wrefresh(mt_win1); | |
227 | wrefresh(mt_win2); | |
228 | refresh_show_pad(); | |
229 | refresh_show_win(); | |
230 | refresh_title_win (); | |
231 | refresh_command_win (); | |
0f31c737 | 232 | } |