* tuiStack.c (tui_make_status_line): New function to create the

status line.
	(tuiShowLocatorContent): Use it instead of displayableWinContentAt.
	* tuiData.h (PROC_PREFIX): Use "In:" to reduce length of prefix.
	(PC_PREFIX): Use upper case.
	(SINGLE_KEY, MIN_LINE_WIDTH, MIN_PROC_WIDTH): Define.
	(MAX_TARGET_WIDTH, MAX_PID_WIDTH): Define.
This commit is contained in:
Stephane Carrez 2002-09-01 10:20:48 +00:00
parent 269c21feac
commit 5026540224
3 changed files with 186 additions and 19 deletions

View File

@ -1,3 +1,13 @@
2002-09-01 Stephane Carrez <stcarrez@nerim.fr>
* tuiStack.c (tui_make_status_line): New function to create the
status line.
(tuiShowLocatorContent): Use it instead of displayableWinContentAt.
* tuiData.h (PROC_PREFIX): Use "In:" to reduce length of prefix.
(PC_PREFIX): Use upper case.
(SINGLE_KEY, MIN_LINE_WIDTH, MIN_PROC_WIDTH): Define.
(MAX_TARGET_WIDTH, MAX_PID_WIDTH): Define.
2002-08-31 Stephane Carrez <stcarrez@nerim.fr>
* tuiSourceWin.h (tuiUpdateAllExecInfos): Don't declare.

View File

@ -71,10 +71,18 @@ TuiGenWinInfo, *TuiGenWinInfoPtr;
#define MIN_WIN_HEIGHT 3
#define MIN_CMD_WIN_HEIGHT 3
/* Strings to display in the TUI status line. */
#define FILE_PREFIX "File: "
#define PROC_PREFIX "Procedure: "
#define PROC_PREFIX "In: "
#define LINE_PREFIX "Line: "
#define PC_PREFIX "pc: "
#define PC_PREFIX "PC: "
#define SINGLE_KEY "(SingleKey)"
/* Minimum/Maximum length of some fields displayed in the TUI status line. */
#define MIN_LINE_WIDTH 4 /* Use at least 4 digits for line numbers. */
#define MIN_PROC_WIDTH 12
#define MAX_TARGET_WIDTH 10
#define MAX_PID_WIDTH 14
#define TUI_FLOAT_REGS_NAME "$FREGS"
#define TUI_FLOAT_REGS_NAME_LOWER "$fregs"

View File

@ -44,6 +44,8 @@
#include "breakpoint.h"
#include "frame.h"
#include "command.h"
#include "inferior.h"
#include "target.h"
#include "top.h"
#include "tui.h"
@ -70,6 +72,154 @@ static void tui_set_locator_info (const char *filename, const char *procname,
static void tui_update_command (char *, int);
/* 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 (TuiLocatorElement* loc)
{
char* string;
char line_buf[50], buf[50], *pname;
int status_size = termWidth ();
int i, proc_width;
const char* pid_name;
const char* pc_buf;
int target_width;
int pid_width;
int line_width;
int pc_width;
struct ui_file *pc_out;
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;
string = (char *) xmalloc (status_size + 1);
/* Translate line number and obtain its size. */
if (loc->lineNo > 0)
sprintf (line_buf, "%d", loc->lineNo);
else
strcpy (line_buf, "??");
line_width = strlen (line_buf);
if (line_width < MIN_LINE_WIDTH)
line_width = MIN_LINE_WIDTH;
/* Translate PC address. */
pc_out = tui_sfileopen (128);
print_address_numeric (loc->addr, 1, pc_out);
pc_buf = tui_file_get_strbuf (pc_out);
pc_width = strlen (pc_buf);
/* 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->procName;
/* 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;
ui_file_delete (pc_out);
return string;
}
/* Get a printable name for the function at the address.
The symbol name is demangled if demangling is turned on.
Returns a pointer to a static area holding the result. */
@ -114,24 +264,23 @@ tuiShowLocatorContent (void)
if (m_genWinPtrNotNull (locator) && locator->handle != (WINDOW *) NULL)
{
string = displayableWinContentAt (locator, 0);
if (string != (char *) NULL)
{
wmove (locator->handle, 0, 0);
wstandout (locator->handle);
waddstr (locator->handle, string);
wclrtoeol (locator->handle);
wstandend (locator->handle);
tuiRefreshWin (locator);
wmove (locator->handle, 0, 0);
if (string != nullStr ())
tuiFree (string);
locator->contentInUse = TRUE;
}
}
TuiWinElementPtr element;
element = (TuiWinElementPtr) locator->content[0];
string = tui_make_status_line (&element->whichElement.locator);
wmove (locator->handle, 0, 0);
wstandout (locator->handle);
waddstr (locator->handle, string);
wclrtoeol (locator->handle);
wstandend (locator->handle);
tuiRefreshWin (locator);
wmove (locator->handle, 0, 0);
xfree (string);
locator->contentInUse = TRUE;
}
}
return;
} /* tuiShowLocatorContent */
/* Set the filename portion of the locator. */
static void