* tuiStack.c (tui_make_status_line): New function to create the
authorStephane Carrez <stcarrez@nerim.fr>
Sun, 1 Sep 2002 10:20:48 +0000 (10:20 +0000)
committerStephane Carrez <stcarrez@nerim.fr>
Sun, 1 Sep 2002 10:20:48 +0000 (10:20 +0000)
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.

gdb/tui/ChangeLog
gdb/tui/tuiData.h
gdb/tui/tuiStack.c

index d72ddc5c3068e57c899cc8137f9471e2ea33ed8c..9b8e26042c770d04e97288931b9f931d72e938b4 100644 (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.
index 9de5c6fa6ee18d4f6cde722ea125e055087637a4..0ce7ed208ee4d76be0977713aba61d614515c467 100644 (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"
index d3f040484c0b23a8c23e831e0e47048d01b8bec1..10bd259bfdc11c0d039b89493f751763ee5033d8 100644 (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);
 \f
 
+/* 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