]> git.ipfire.org Git - thirdparty/e2fsprogs.git/blame - ext2ed/win.c
libext2fs: fix potential divide by zero bug caused by a lxcfs bug
[thirdparty/e2fsprogs.git] / ext2ed / win.c
CommitLineData
583a1ce5
TT
1/*
2
3/usr/src/ext2ed/win.c
4
5A part of the extended file system 2 disk editor.
6
7--------------------------------------------------------
8Window management - Interfacing with the ncurses library
9--------------------------------------------------------
10
11First written on: April 17 1995
0f31c737
TT
12Modified on : April 05 2001 Christian.Bac@int-evry.fr
13it looks like readline does not like that initscr decides to set the tty to
14noecho.
583a1ce5
TT
15
16Copyright (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
31struct struct_pad_info show_pad_info;
5e941d29 32WINDOW *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 37struct termios termioInit, termioCurrent;
0f31c737 38
5e941d29
TT
39void 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
51void 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
62void 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
101void refresh_title_win (void)
583a1ce5
TT
102{
103 wrefresh (title_win);
104}
105
106void 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
123void 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
152void refresh_command_win (void)
583a1ce5
TT
153{
154 wrefresh (command_win);
155}
156
157void 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
170void 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
188void 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}