static void make_source_or_disasm_window (struct tui_win_info **win_info_ptr, enum tui_win_type type, int height, int origin_y) { struct tui_gen_win_info *execution_info = (struct tui_gen_win_info *) NULL; /* Create the exeuction info window. */ if (type == SRC_WIN) execution_info = tui_source_exec_info_win_ptr (); else execution_info = tui_disassem_exec_info_win_ptr (); execution_info = init_and_make_win (execution_info, EXEC_INFO_WIN, height, 3, 0, origin_y, DONT_BOX_WINDOW); /* Now create the source window. */ *win_info_ptr = init_and_make_win (*win_info_ptr, type, height, tui_term_width () - execution_info->width, execution_info->width, origin_y, BOX_WINDOW); (*win_info_ptr)->detail.source_info.execution_info = execution_info; }
static void make_data_window (struct tui_win_info **win_info_ptr, int height, int origin_y) { *win_info_ptr = init_and_make_win (*win_info_ptr, DATA_WIN, height, tui_term_width (), 0, origin_y, BOX_WINDOW); }
static void make_command_window (struct tui_win_info **win_info_ptr, int height, int origin_y) { *win_info_ptr = init_and_make_win (*win_info_ptr, CMD_WIN, height, tui_term_width (), 0, origin_y, DONT_BOX_WINDOW); (*win_info_ptr)->can_highlight = FALSE; }
/* Create the status line to display as much information as we can on this single line: target name, process number, current function, current line, current PC, SingleKey mode. */ static char* tui_make_status_line (struct tui_locator_element *loc) { char *string; char line_buf[50], *pname; char *buf; int status_size; int i, proc_width; const char *pid_name; int target_width; int pid_width; int line_width; if (ptid_equal (inferior_ptid, null_ptid)) pid_name = "No process"; else pid_name = target_pid_to_str (inferior_ptid); target_width = strlen (target_shortname); if (target_width > MAX_TARGET_WIDTH) target_width = MAX_TARGET_WIDTH; pid_width = strlen (pid_name); if (pid_width > MAX_PID_WIDTH) pid_width = MAX_PID_WIDTH; status_size = tui_term_width (); string = (char *) xmalloc (status_size + 1); buf = (char*) alloca (status_size + 1); /* Translate line number and obtain its size. */ if (loc->line_no > 0) xsnprintf (line_buf, sizeof (line_buf), "%d", loc->line_no); else strcpy (line_buf, "??"); line_width = strlen (line_buf); if (line_width < MIN_LINE_WIDTH) line_width = MIN_LINE_WIDTH; /* Translate PC address. */ string_file pc_out; fputs_filtered (loc->gdbarch? paddress (loc->gdbarch, loc->addr) : "??", &pc_out); const char *pc_buf = pc_out.c_str (); int pc_width = pc_out.size (); /* First determine the amount of proc name width we have available. The +1 are for a space separator between fields. The -1 are to take into account the \0 counted by sizeof. */ proc_width = (status_size - (target_width + 1) - (pid_width + 1) - (sizeof (PROC_PREFIX) - 1 + 1) - (sizeof (LINE_PREFIX) - 1 + line_width + 1) - (sizeof (PC_PREFIX) - 1 + pc_width + 1) - (tui_current_key_mode == TUI_SINGLE_KEY_MODE ? (sizeof (SINGLE_KEY) - 1 + 1) : 0)); /* If there is no room to print the function name, try by removing some fields. */ if (proc_width < MIN_PROC_WIDTH) { proc_width += target_width + 1; target_width = 0; if (proc_width < MIN_PROC_WIDTH) { proc_width += pid_width + 1; pid_width = 0; if (proc_width <= MIN_PROC_WIDTH) { proc_width += pc_width + sizeof (PC_PREFIX) - 1 + 1; pc_width = 0; if (proc_width < 0) { proc_width += line_width + sizeof (LINE_PREFIX) - 1 + 1; line_width = 0; if (proc_width < 0) proc_width = 0; } } } } /* Now convert elements to string form. */ pname = loc->proc_name; /* Now create the locator line from the string version of the elements. We could use sprintf() here but that wouldn't ensure that we don't overrun the size of the allocated buffer. strcat_to_buf() will. */ *string = (char) 0; if (target_width > 0) { sprintf (buf, "%*.*s ", -target_width, target_width, target_shortname); strcat_to_buf (string, status_size, buf); } if (pid_width > 0) { sprintf (buf, "%*.*s ", -pid_width, pid_width, pid_name); strcat_to_buf (string, status_size, buf); } /* Show whether we are in SingleKey mode. */ if (tui_current_key_mode == TUI_SINGLE_KEY_MODE) { strcat_to_buf (string, status_size, SINGLE_KEY); strcat_to_buf (string, status_size, " "); } /* Procedure/class name. */ if (proc_width > 0) { if (strlen (pname) > proc_width) sprintf (buf, "%s%*.*s* ", PROC_PREFIX, 1 - proc_width, proc_width - 1, pname); else sprintf (buf, "%s%*.*s ", PROC_PREFIX, -proc_width, proc_width, pname); strcat_to_buf (string, status_size, buf); } if (line_width > 0) { sprintf (buf, "%s%*.*s ", LINE_PREFIX, -line_width, line_width, line_buf); strcat_to_buf (string, status_size, buf); } if (pc_width > 0) { strcat_to_buf (string, status_size, PC_PREFIX); strcat_to_buf (string, status_size, pc_buf); } for (i = strlen (string); i < status_size; i++) string[i] = ' '; string[status_size] = (char) 0; return string; }
/* Show the Source/Data/Command or the Dissassembly/Data/Command layout. */ static void show_data (enum tui_layout_type new_layout) { int total_height = (tui_term_height () - TUI_CMD_WIN->generic.height); int src_height, data_height; enum tui_win_type win_type; struct tui_gen_win_info *locator = tui_locator_win_info_ptr (); data_height = total_height / 2; src_height = total_height - data_height; tui_make_all_invisible (); tui_make_invisible (locator); make_data_window (&TUI_DATA_WIN, data_height, 0); TUI_DATA_WIN->can_highlight = TRUE; if (new_layout == SRC_DATA_COMMAND) win_type = SRC_WIN; else win_type = DISASSEM_WIN; if (tui_win_list[win_type] == NULL) { if (win_type == SRC_WIN) make_source_window (&tui_win_list[win_type], src_height, data_height - 1); else make_disasm_window (&tui_win_list[win_type], src_height, data_height - 1); locator = init_and_make_win (locator, LOCATOR_WIN, 2 /* 1 */ , tui_term_width (), 0, total_height - 1, DONT_BOX_WINDOW); } else { init_gen_win_info (&tui_win_list[win_type]->generic, tui_win_list[win_type]->generic.type, src_height, tui_win_list[win_type]->generic.width, tui_win_list[win_type]->detail.source_info.execution_info->width, data_height - 1); init_gen_win_info (tui_win_list[win_type]->detail.source_info.execution_info, EXEC_INFO_WIN, src_height, 3, 0, data_height - 1); tui_make_visible (&tui_win_list[win_type]->generic); tui_make_visible (tui_win_list[win_type]->detail.source_info.execution_info); init_gen_win_info (locator, LOCATOR_WIN, 2 /* 1 */ , tui_term_width (), 0, total_height - 1); } tui_win_list[win_type]->detail.source_info.has_locator = TRUE; tui_make_visible (locator); tui_show_locator_content (); tui_add_to_source_windows (tui_win_list[win_type]); tui_set_current_layout_to (new_layout); }
/* Show the Source/Disassem/Command layout. */ static void show_source_disasm_command (void) { if (tui_current_layout () != SRC_DISASSEM_COMMAND) { int cmd_height, src_height, asm_height; if (TUI_CMD_WIN != NULL) cmd_height = TUI_CMD_WIN->generic.height; else cmd_height = tui_term_height () / 3; src_height = (tui_term_height () - cmd_height) / 2; asm_height = tui_term_height () - (src_height + cmd_height); if (TUI_SRC_WIN == NULL) make_source_window (&TUI_SRC_WIN, src_height, 0); else { init_gen_win_info (&TUI_SRC_WIN->generic, TUI_SRC_WIN->generic.type, src_height, TUI_SRC_WIN->generic.width, TUI_SRC_WIN->detail.source_info.execution_info->width, 0); TUI_SRC_WIN->can_highlight = TRUE; init_gen_win_info (TUI_SRC_WIN->detail.source_info.execution_info, EXEC_INFO_WIN, src_height, 3, 0, 0); tui_make_visible (&TUI_SRC_WIN->generic); tui_make_visible (TUI_SRC_WIN->detail.source_info.execution_info); TUI_SRC_WIN->detail.source_info.has_locator = FALSE;; } if (TUI_SRC_WIN != NULL) { struct tui_gen_win_info *locator = tui_locator_win_info_ptr (); tui_show_source_content (TUI_SRC_WIN); if (TUI_DISASM_WIN == NULL) { make_disasm_window (&TUI_DISASM_WIN, asm_height, src_height - 1); locator = init_and_make_win (locator, LOCATOR_WIN, 2 /* 1 */ , tui_term_width (), 0, (src_height + asm_height) - 1, DONT_BOX_WINDOW); } else { init_gen_win_info (locator, LOCATOR_WIN, 2 /* 1 */ , tui_term_width (), 0, (src_height + asm_height) - 1); TUI_DISASM_WIN->detail.source_info.has_locator = TRUE; init_gen_win_info (&TUI_DISASM_WIN->generic, TUI_DISASM_WIN->generic.type, asm_height, TUI_DISASM_WIN->generic.width, TUI_DISASM_WIN->detail.source_info.execution_info->width, src_height - 1); init_gen_win_info (TUI_DISASM_WIN->detail.source_info.execution_info, EXEC_INFO_WIN, asm_height, 3, 0, src_height - 1); TUI_DISASM_WIN->can_highlight = TRUE; tui_make_visible (&TUI_DISASM_WIN->generic); tui_make_visible (TUI_DISASM_WIN->detail.source_info.execution_info); } if (TUI_DISASM_WIN != NULL) { TUI_SRC_WIN->detail.source_info.has_locator = FALSE; TUI_DISASM_WIN->detail.source_info.has_locator = TRUE; tui_make_visible (locator); tui_show_locator_content (); tui_show_source_content (TUI_DISASM_WIN); if (TUI_CMD_WIN == NULL) make_command_window (&TUI_CMD_WIN, cmd_height, tui_term_height () - cmd_height); else { init_gen_win_info (&TUI_CMD_WIN->generic, TUI_CMD_WIN->generic.type, TUI_CMD_WIN->generic.height, TUI_CMD_WIN->generic.width, 0, TUI_CMD_WIN->generic.origin.y); TUI_CMD_WIN->can_highlight = FALSE; tui_make_visible (&TUI_CMD_WIN->generic); } if (TUI_CMD_WIN != NULL) tui_refresh_win (&TUI_CMD_WIN->generic); } } tui_set_current_layout_to (SRC_DISASSEM_COMMAND); } }
/* Show the Source/Command or the Disassem layout. */ static void show_source_or_disasm_and_command (enum tui_layout_type layout_type) { if (tui_current_layout () != layout_type) { struct tui_win_info **win_info_ptr; int src_height, cmd_height; struct tui_gen_win_info *locator = tui_locator_win_info_ptr (); if (TUI_CMD_WIN != NULL) cmd_height = TUI_CMD_WIN->generic.height; else cmd_height = tui_term_height () / 3; src_height = tui_term_height () - cmd_height; if (layout_type == SRC_COMMAND) win_info_ptr = &TUI_SRC_WIN; else win_info_ptr = &TUI_DISASM_WIN; if ((*win_info_ptr) == NULL) { if (layout_type == SRC_COMMAND) make_source_window (win_info_ptr, src_height - 1, 0); else make_disasm_window (win_info_ptr, src_height - 1, 0); locator = init_and_make_win (locator, LOCATOR_WIN, 2 /* 1 */ , tui_term_width (), 0, src_height - 1, DONT_BOX_WINDOW); } else { init_gen_win_info (locator, LOCATOR_WIN, 2 /* 1 */ , tui_term_width (), 0, src_height - 1); (*win_info_ptr)->detail.source_info.has_locator = TRUE; init_gen_win_info (&(*win_info_ptr)->generic, (*win_info_ptr)->generic.type, src_height - 1, (*win_info_ptr)->generic.width, (*win_info_ptr)->detail.source_info.execution_info->width, 0); init_gen_win_info ((*win_info_ptr)->detail.source_info.execution_info, EXEC_INFO_WIN, src_height - 1, 3, 0, 0); (*win_info_ptr)->can_highlight = TRUE; tui_make_visible (&(*win_info_ptr)->generic); tui_make_visible ((*win_info_ptr)->detail.source_info.execution_info); } if ((*win_info_ptr) != NULL) { (*win_info_ptr)->detail.source_info.has_locator = TRUE; tui_make_visible (locator); tui_show_locator_content (); tui_show_source_content (*win_info_ptr); if (TUI_CMD_WIN == NULL) { make_command_window (&TUI_CMD_WIN, cmd_height, src_height); tui_refresh_win (&TUI_CMD_WIN->generic); } else { init_gen_win_info (&TUI_CMD_WIN->generic, TUI_CMD_WIN->generic.type, TUI_CMD_WIN->generic.height, TUI_CMD_WIN->generic.width, TUI_CMD_WIN->generic.origin.x, TUI_CMD_WIN->generic.origin.y); TUI_CMD_WIN->can_highlight = FALSE; tui_make_visible (&TUI_CMD_WIN->generic); } } tui_set_current_layout_to (layout_type); } }