/* Cleanup when a resize has occured. Returns the character that must be processed. */ static unsigned int tui_handle_resize_during_io(unsigned int original_ch) { if (tui_win_resized()) { tui_refresh_all_win(); dont_repeat(); tui_set_win_resized_to(FALSE); return '\n'; } else return original_ch; }
/* Dispatch the correct tui function based upon the control character. */ unsigned int tui_dispatch_ctrl_char (unsigned int ch) { struct tui_win_info *win_info = tui_win_with_focus (); /* Handle the CTRL-L refresh for each window. */ if (ch == '\f') tui_refresh_all_win (); /* If the command window has the logical focus, or no-one does assume it is the command window; in this case, pass the character on through and do nothing here. */ if (win_info == NULL || win_info == TUI_CMD_WIN) return ch; switch (ch) { case KEY_NPAGE: tui_scroll_forward (win_info, 0); break; case KEY_PPAGE: tui_scroll_backward (win_info, 0); break; case KEY_DOWN: case KEY_SF: tui_scroll_forward (win_info, 1); break; case KEY_UP: case KEY_SR: tui_scroll_backward (win_info, 1); break; case KEY_RIGHT: tui_scroll_left (win_info, 1); break; case KEY_LEFT: tui_scroll_right (win_info, 1); break; case '\f': break; default: /* We didn't recognize the character as a control character, so pass it through. */ return ch; } /* We intercepted the control character, so return 0 (which readline will interpret as a no-op). */ return 0; }
/* Catch SIGCONT to restore the terminal and refresh the screen. */ static void tui_cont_sig (int sig) { if (tui_active) { /* Restore the terminal setting because another process (shell) might have changed it. */ resetty (); /* Force a refresh of the screen. */ tui_refresh_all_win (); wrefresh (TUI_CMD_WIN->generic.handle); } signal (sig, tui_cont_sig); }
/* Catch SIGCONT to restore the terminal and refresh the screen. */ static void tui_cont_sig (int sig) { if (tui_active) { /* Restore the terminal setting because another process (shell) might have changed it. */ resetty (); /* Force a refresh of the screen. */ tui_refresh_all_win (); /* Update cursor position on the screen. */ wmove (TUI_CMD_WIN->generic.handle, TUI_CMD_WIN->detail.command_info.start_line, TUI_CMD_WIN->detail.command_info.curch); wrefresh (TUI_CMD_WIN->generic.handle); } signal (sig, tui_cont_sig); }
/* Dispatch the correct tui function based upon the control character. */ unsigned int tui_dispatch_ctrl_char (unsigned int ch) { struct tui_win_info *win_info = tui_win_with_focus (); /* Handle the CTRL-L refresh for each window. */ if (ch == '\f') tui_refresh_all_win (); /* If the command window has the logical focus, or no-one does assume it is the command window; in this case, pass the character on through and do nothing here. */ if (win_info == NULL || win_info == TUI_CMD_WIN) return ch; else { unsigned int c = 0, ch_copy = ch; int i; char *term; /* If this is an xterm, page next/prev keys aren't returned by keypad as a single char, so we must handle them here. Seems like a bug in the curses library? */ term = (char *) getenv ("TERM"); if (term) { for (i = 0; term[i]; i++) term[i] = toupper (term[i]); if ((strcmp (term, "XTERM") == 0) && key_is_start_sequence (ch)) { unsigned int page_ch = 0; unsigned int tmp_char; WINDOW *w = TUI_CMD_WIN->generic.handle; tmp_char = 0; while (!key_is_end_sequence (tmp_char)) { tmp_char = (int) wgetch (w); if (tmp_char == ERR) { return ch; } if (!tmp_char) break; if (tmp_char == 53) page_ch = KEY_PPAGE; else if (tmp_char == 54) page_ch = KEY_NPAGE; else { return 0; } } ch_copy = page_ch; } } switch (ch_copy) { case KEY_NPAGE: tui_scroll_forward (win_info, 0); break; case KEY_PPAGE: tui_scroll_backward (win_info, 0); break; case KEY_DOWN: case KEY_SF: tui_scroll_forward (win_info, 1); break; case KEY_UP: case KEY_SR: tui_scroll_backward (win_info, 1); break; case KEY_RIGHT: tui_scroll_left (win_info, 1); break; case KEY_LEFT: tui_scroll_right (win_info, 1); break; case '\f': break; default: c = ch_copy; break; } return c; } }
/* Enter in the tui mode (curses). When in normal mode, it installs the tui hooks in gdb, redirects the gdb output, configures the readline to work in tui mode. When in curses mode, it does nothing. */ void tui_enable (void) { if (tui_active) return; /* To avoid to initialize curses when gdb starts, there is a defered curses initialization. This initialization is made only once and the first time the curses mode is entered. */ if (tui_finish_init) { WINDOW *w; w = initscr (); cbreak (); noecho (); /*timeout (1);*/ nodelay(w, FALSE); nl(); keypad (w, TRUE); rl_initialize (); tui_set_term_height_to (LINES); tui_set_term_width_to (COLS); def_prog_mode (); tui_show_frame_info (0); tui_set_layout (SRC_COMMAND, TUI_UNDEFINED_REGS); tui_set_win_focus_to (TUI_SRC_WIN); keypad (TUI_CMD_WIN->generic.handle, TRUE); wrefresh (TUI_CMD_WIN->generic.handle); tui_finish_init = 0; } else { /* Save the current gdb setting of the terminal. Curses will restore this state when endwin() is called. */ def_shell_mode (); clearok (stdscr, TRUE); } /* Install the TUI specific hooks. */ tui_install_hooks (); rl_startup_hook = tui_rl_startup_hook; tui_update_variables (); tui_setup_io (1); tui_active = 1; if (deprecated_selected_frame) tui_show_frame_info (deprecated_selected_frame); /* Restore TUI keymap. */ tui_set_key_mode (tui_current_key_mode); tui_refresh_all_win (); /* Update gdb's knowledge of its terminal. */ target_terminal_save_ours (); tui_update_gdb_sizes (); }