Updare French translation for binutils and German translation for opcodes.
[deliverable/binutils-gdb.git] / gdb / tui / tui-stack.c
index f90dff382ea751dd081f0fe4357bcba9a2de143e..e36f8bd1ac63bc753da6c71ff8ef697dba311949 100644 (file)
@@ -1,6 +1,6 @@
 /* TUI display locator.
 
-   Copyright (C) 1998-2014 Free Software Foundation, Inc.
+   Copyright (C) 1998-2015 Free Software Foundation, Inc.
 
    Contributed by Hewlett-Packard Company.
 
@@ -48,10 +48,10 @@ static char *tui_get_function_from_frame (struct frame_info *fi);
 static void tui_set_locator_fullname (const char *fullname);
 
 /* Update the locator, with the provided arguments.  */
-static void tui_set_locator_info (struct gdbarch *gdbarch,
-                                 const char *fullname,
-                                 const char *procname,
-                                  int lineno, CORE_ADDR addr);
+static int tui_set_locator_info (struct gdbarch *gdbarch,
+                                const char *fullname,
+                                const char *procname,
+                                 int lineno, CORE_ADDR addr);
 
 static void tui_update_command (char *, int);
 \f
@@ -253,7 +253,7 @@ tui_show_locator_content (void)
     {
       struct tui_win_element *element;
 
-      element = (struct tui_win_element *) locator->content[0];
+      element = locator->content[0];
 
       string = tui_make_status_line (&element->which_element.locator);
       wmove (locator->handle, 0, 0);
@@ -287,14 +287,17 @@ tui_set_locator_fullname (const char *fullname)
       return;
     }
 
-  element = &((struct tui_win_element *)
-             locator->content[0])->which_element.locator;
+  element = &locator->content[0]->which_element.locator;
   element->full_name[0] = 0;
   strcat_to_buf (element->full_name, MAX_LOCATOR_ELEMENT_LEN, fullname);
 }
 
-/* Update the locator, with the provided arguments.  */
-static void
+/* Update the locator, with the provided arguments.
+
+   Returns 1 if any of the locator's fields were actually changed,
+   and 0 otherwise.  */
+
+static int
 tui_set_locator_info (struct gdbarch *gdbarch,
                      const char *fullname,
                      const char *procname, 
@@ -303,22 +306,40 @@ tui_set_locator_info (struct gdbarch *gdbarch,
 {
   struct tui_gen_win_info *locator = tui_locator_win_info_ptr ();
   struct tui_locator_element *element;
+  int locator_changed_p = 0;
 
   /* Allocate the locator content if necessary.  */
   if (locator->content_size <= 0)
     {
-      locator->content = (void **) tui_alloc_content (1, locator->type);
+      locator->content = tui_alloc_content (1, LOCATOR_WIN);
       locator->content_size = 1;
+      locator_changed_p = 1;
     }
 
-  element = &((struct tui_win_element *)
-             locator->content[0])->which_element.locator;
+  if (procname == NULL)
+    procname = "";
+
+  if (fullname == NULL)
+    fullname = "";
+
+  element = &locator->content[0]->which_element.locator;
+
+  locator_changed_p |= strncmp (element->proc_name, procname,
+                               MAX_LOCATOR_ELEMENT_LEN) != 0;
+  locator_changed_p |= lineno != element->line_no;
+  locator_changed_p |= addr != element->addr;
+  locator_changed_p |= gdbarch != element->gdbarch;
+  locator_changed_p |= strncmp (element->full_name, fullname,
+                               MAX_LOCATOR_ELEMENT_LEN) != 0;
+
   element->proc_name[0] = (char) 0;
   strcat_to_buf (element->proc_name, MAX_LOCATOR_ELEMENT_LEN, procname);
   element->line_no = lineno;
   element->addr = addr;
   element->gdbarch = gdbarch;
   tui_set_locator_fullname (fullname);
+
+  return locator_changed_p;
 }
 
 /* Update only the full_name portion of the locator.  */
@@ -329,11 +350,17 @@ tui_update_locator_fullname (const char *fullname)
   tui_show_locator_content ();
 }
 
-/* Function to print the frame information for the TUI.  */
-void
+/* Function to print the frame information for the TUI.  The windows are
+   refreshed only if frame information has changed since the last refresh.
+
+   Return 1 if frame information has changed (and windows subsequently
+   refreshed), 0 otherwise.  */
+
+int
 tui_show_frame_info (struct frame_info *fi)
 {
   struct tui_win_info *win_info;
+  int locator_changed_p;
   int i;
 
   if (fi)
@@ -351,15 +378,23 @@ tui_show_frame_info (struct frame_info *fi)
         && tui_source_is_displayed (symtab_to_fullname (sal.symtab));
 
       if (get_frame_pc_if_available (fi, &pc))
-       tui_set_locator_info (get_frame_arch (fi),
-                             (sal.symtab == 0
-                              ? "??" : symtab_to_fullname (sal.symtab)),
-                             tui_get_function_from_frame (fi),
-                             sal.line,
-                             pc);
+       locator_changed_p
+         = tui_set_locator_info (get_frame_arch (fi),
+                                 (sal.symtab == 0
+                                  ? "??" : symtab_to_fullname (sal.symtab)),
+                                 tui_get_function_from_frame (fi),
+                                 sal.line,
+                                 pc);
       else
-       tui_set_locator_info (get_frame_arch (fi),
-                             "??", _("<unavailable>"), sal.line, 0);
+       locator_changed_p
+         = tui_set_locator_info (get_frame_arch (fi),
+                                 "??", _("<unavailable>"), sal.line, 0);
+
+      /* If the locator information has not changed, then frame information has
+        not changed.  If frame information has not changed, then the windows'
+        contents will not change.  So don't bother refreshing the windows.  */
+      if (!locator_changed_p)
+       return 0;
 
       tui_show_locator_content ();
       start_line = 0;
@@ -369,8 +404,7 @@ tui_show_frame_info (struct frame_info *fi)
 
          win_info = (tui_source_windows ())->list[i];
 
-         item = &((struct tui_win_element *)
-                  locator->content[0])->which_element;
+         item = &locator->content[0]->which_element;
          if (win_info == TUI_SRC_WIN)
            {
              start_line = (item->locator.line_no -
@@ -431,10 +465,17 @@ tui_show_frame_info (struct frame_info *fi)
            }
          tui_update_exec_info (win_info);
        }
+
+      return 1;
     }
   else
     {
-      tui_set_locator_info (NULL, NULL, NULL, 0, (CORE_ADDR) 0);
+      locator_changed_p
+       = tui_set_locator_info (NULL, NULL, NULL, 0, (CORE_ADDR) 0);
+
+      if (!locator_changed_p)
+       return 0;
+
       tui_show_locator_content ();
       for (i = 0; i < (tui_source_windows ())->count; i++)
        {
@@ -442,6 +483,8 @@ tui_show_frame_info (struct frame_info *fi)
          tui_clear_source_content (win_info, EMPTY_SOURCE_PROMPT);
          tui_update_exec_info (win_info);
        }
+
+      return 1;
     }
 }
 
This page took 0.025539 seconds and 4 git commands to generate.