/* /usr/src/ext2ed/win.c A part of the extended file system 2 disk editor. -------------------------------------------------------- Window management - Interfacing with the ncurses library -------------------------------------------------------- First written on: April 17 1995 Modified on : April 05 2001 Christian.Bac@int-evry.fr it looks like readline does not like that initscr decides to set the tty to noecho. Copyright (C) 1995 Gadi Oxman */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <termios.h> #include <unistd.h> #include <sys/ioctl.h> #include "ext2ed.h" #include "../version.h" struct struct_pad_info show_pad_info; WINDOW *title_win,*show_win,*command_win,*mt_win1,*mt_win2,*show_pad; /* to remember configuration after initscr * and modify it */ struct termios termioInit, termioCurrent; void draw_title_win (void) { char title_string [128]; werase(title_win); box (title_win,0,0); sprintf (title_string,"EXT2ED - Extended-2 File System editor ver %s (%s)", E2FSPROGS_VERSION, E2FSPROGS_DATE); wmove (title_win,TITLE_WIN_LINES/2,(COLS-strlen (title_string))/2); wprintw (title_win,title_string); wrefresh(title_win); } void setup_show_win(void) { wbkgdset (show_win,A_REVERSE);werase (show_win); show_pad_info.line=0; show_pad_info.col=0; show_pad_info.display_lines=LINES-TITLE_WIN_LINES-SHOW_WIN_LINES-COMMAND_WIN_LINES-2; show_pad_info.display_cols=COLS; show_pad_info.max_line=show_pad_info.display_lines-1;show_pad_info.max_col=show_pad_info.display_cols-1; show_pad_info.disable_output=0; } void init_windows (void) { initscr (); tcgetattr(0,&termioInit); /* save initial config */ termioCurrent = termioInit; termioCurrent.c_lflag |= ECHO; /* set echo on */ tcsetattr(0,TCSANOW,&termioCurrent); if (LINES<TITLE_WIN_LINES+SHOW_WIN_LINES+COMMAND_WIN_LINES+3) { printf ("Sorry, your terminal screen is too small\n"); printf ("Error - Can not initialize windows\n"); exit (1); } title_win=newwin (TITLE_WIN_LINES,COLS,0,0); show_win=newwin (SHOW_WIN_LINES,COLS,TITLE_WIN_LINES,0); show_pad=newpad (SHOW_PAD_LINES,SHOW_PAD_COLS); mt_win1=newwin (1,COLS,TITLE_WIN_LINES+SHOW_WIN_LINES,0); mt_win2=newwin (1,COLS,LINES-COMMAND_WIN_LINES-1,0); command_win=newwin (COMMAND_WIN_LINES,COLS,LINES-COMMAND_WIN_LINES,0); if (title_win==NULL || show_win==NULL || show_pad==NULL || command_win==NULL) { printf ("Error - Not enough memory - Can not initialize windows\n");exit (1); } draw_title_win(); setup_show_win(); scrollok (command_win,TRUE); refresh_title_win (); refresh_show_win (); refresh_show_pad(); refresh_command_win (); wrefresh(mt_win1); wrefresh(mt_win2); } void refresh_title_win (void) { wrefresh (title_win); } void refresh_show_win (void) { int current_page,total_pages; current_page=show_pad_info.line/show_pad_info.display_lines+1; if (show_pad_info.line%show_pad_info.display_lines) current_page++; total_pages=show_pad_info.max_line/show_pad_info.display_lines+1; wmove (show_win,2,COLS-18); wprintw (show_win,"Page %d of %d\n",current_page,total_pages); wmove (show_win,2,COLS-18); wrefresh (show_win); } void refresh_show_pad (void) { int left,top,right,bottom,i; if (show_pad_info.disable_output) return; if (show_pad_info.max_line < show_pad_info.display_lines-1) { for (i=show_pad_info.max_line+1;i<show_pad_info.display_lines;i++) { wmove (show_pad,i,0);wprintw (show_pad,"\n"); } } left=0;right=show_pad_info.display_cols-1; top=TITLE_WIN_LINES+SHOW_WIN_LINES+1;bottom=top+show_pad_info.display_lines-1; if (show_pad_info.line > show_pad_info.max_line-show_pad_info.display_lines+1) show_pad_info.line=show_pad_info.max_line-show_pad_info.display_lines+1; if (show_pad_info.line < 0) show_pad_info.line=0; #ifdef OLD_NCURSES 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); #else 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); #endif } void refresh_command_win (void) { wrefresh (command_win); } void close_windows (void) { // echo (); tcsetattr(0,TCSANOW,&termioInit); delwin (title_win); delwin (command_win); delwin (show_win); delwin (show_pad); endwin (); } void show_info (void) { int block_num,block_offset; block_num=device_offset/file_system_info.block_size; block_offset=device_offset%file_system_info.block_size; wmove (show_win,0,0); wprintw (show_win,"Offset %-3ld in block %ld. ",block_offset,block_num); if (current_type != NULL) wprintw (show_win,"Type: %s\n",current_type->name); else wprintw (show_win,"Type: %s\n","none"); refresh_show_win (); } void redraw_all (void) { int min_lines = TITLE_WIN_LINES+SHOW_WIN_LINES+COMMAND_WIN_LINES+3; struct winsize ws; int save_col, save_lines; /* get the size of the terminal connected to stdout */ ioctl(1, TIOCGWINSZ, &ws); /* * Do it again because GDB doesn't stop before the first ioctl * call, we want an up-to-date size when we're * single-stepping. */ if (ioctl(1, TIOCGWINSZ, &ws) == 0) { if (ws.ws_row < min_lines) ws.ws_row = min_lines; if ((ws.ws_row != LINES) || (ws.ws_col != COLS)) { wmove (show_win,2,COLS-18); wclrtoeol(show_win); wrefresh(show_win); resizeterm(ws.ws_row, ws.ws_col); wresize(title_win, TITLE_WIN_LINES,COLS); wresize(show_win, SHOW_WIN_LINES,COLS); wresize(command_win, COMMAND_WIN_LINES,COLS); wresize(mt_win1, 1,COLS); wresize(mt_win2, 1,COLS); mvwin(mt_win2, LINES-COMMAND_WIN_LINES-1,0); mvwin(command_win, LINES-COMMAND_WIN_LINES,0); draw_title_win(); show_pad_info.display_lines=LINES-TITLE_WIN_LINES-SHOW_WIN_LINES-COMMAND_WIN_LINES-2; show_pad_info.display_cols=COLS; } } clearok(title_win, 1); clearok(show_win, 1); clearok(command_win, 1); clearok(mt_win1, 1); clearok(mt_win2, 1); wrefresh(mt_win1); wrefresh(mt_win2); refresh_show_pad(); refresh_show_win(); refresh_title_win (); refresh_command_win (); }