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 12 Modified on : April 05 2001 Christian.Bac (at) int-evry.fr 13 it looks like readline does not like that initscr decides to set the tty to 14 noecho. 15 16 Copyright (C) 1995 Gadi Oxman 17 18 */ 19 20 #include "config.h" 21 #include <stdio.h> 22 #include <stdlib.h> 23 #include <string.h> 24 #include <termios.h> 25 #include <unistd.h> 26 #include <sys/ioctl.h> 27 28 #include "ext2ed.h" 29 #include "../version.h" 30 31 struct struct_pad_info show_pad_info; 32 WINDOW *title_win,*show_win,*command_win,*mt_win1,*mt_win2,*show_pad; 33 34 /* to remember configuration after initscr 35 * and modify it 36 */ 37 struct termios termioInit, termioCurrent; 38 39 void draw_title_win (void) 40 { 41 char title_string [128]; 42 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; 60 } 61 62 void init_windows (void) 63 { 64 initscr (); 65 tcgetattr(0,&termioInit); /* save initial config */ 66 termioCurrent = termioInit; 67 termioCurrent.c_lflag |= ECHO; /* set echo on */ 68 tcsetattr(0,TCSANOW,&termioCurrent); 69 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); 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); 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 87 draw_title_win(); 88 89 setup_show_win(); 90 91 scrollok (command_win,TRUE); 92 93 refresh_title_win (); 94 refresh_show_win (); 95 refresh_show_pad(); 96 refresh_command_win (); 97 wrefresh(mt_win1); 98 wrefresh(mt_win2); 99 } 100 101 void refresh_title_win (void) 102 { 103 wrefresh (title_win); 104 } 105 106 void refresh_show_win (void) 107 { 108 int current_page,total_pages; 109 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; 127 128 if (show_pad_info.disable_output) 129 return; 130 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) 153 { 154 wrefresh (command_win); 155 } 156 157 void close_windows (void) 158 { 159 // echo (); 160 tcsetattr(0,TCSANOW,&termioInit); 161 162 delwin (title_win); 163 delwin (command_win); 164 delwin (show_win); 165 delwin (show_pad); 166 167 endwin (); 168 } 169 170 void show_info (void) 171 { 172 int block_num,block_offset; 173 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) 189 { 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 (); 232 } 233