Add optional full_window argument to TuiWindow.write
authorHannes Domani <ssbssa@yahoo.de>
Sun, 22 Nov 2020 15:51:30 +0000 (16:51 +0100)
committerHannes Domani <ssbssa@yahoo.de>
Thu, 27 May 2021 18:42:42 +0000 (20:42 +0200)
To prevent flickering when first calling erase, then write, this new
argument indicates that the passed string contains the full contents of
the window.  This fills every unused cell of the window with a space, so
it's not necessary to call erase beforehand.

gdb/ChangeLog:

2021-05-27  Hannes Domani  <ssbssa@yahoo.de>

* python/py-tui.c (tui_py_window::output): Add full_window
argument.
(gdbpy_tui_write): Parse "full_window" argument.

gdb/doc/ChangeLog:

2021-05-27  Hannes Domani  <ssbssa@yahoo.de>

* python.texi (TUI Windows In Python): Document "full_window"
argument.

gdb/ChangeLog
gdb/doc/ChangeLog
gdb/doc/python.texi
gdb/python/py-tui.c

index 9d06a771ae504c06898f029074a99b4ae8c28947..739e7732b87e6e20173a6ae8b0f3b23a9ab57437 100644 (file)
@@ -1,3 +1,9 @@
+2021-05-27  Hannes Domani  <ssbssa@yahoo.de>
+
+       * python/py-tui.c (tui_py_window::output): Add full_window
+       argument.
+       (gdbpy_tui_write): Parse "full_window" argument.
+
 2021-05-27  Simon Marchi  <simon.marchi@polymtl.ca>
 
        * make-init-c: Add option to reverse function calls.
index 51503a7142441604107deb734cebf7e7d1052147..2743079e93e66e4e2156491c68858ef085d8bb1f 100644 (file)
@@ -1,3 +1,8 @@
+2021-05-27  Hannes Domani  <ssbssa@yahoo.de>
+
+       * python.texi (TUI Windows In Python): Document "full_window"
+       argument.
+
 2021-05-27  Hannes Domani  <ssbssa@yahoo.de>
 
        * python.texi (Symbols In Python): Document gdb.SYMBOL_LOC_LABEL.
index 9127b9617dbd07786fc1e172da585aa5bd2a9126..23e6ac666ffcc966458e51fd465ea56fe0beef8d 100644 (file)
@@ -5959,10 +5959,14 @@ displayed above the window.  This attribute can be modified.
 Remove all the contents of the window.
 @end defun
 
-@defun TuiWindow.write (@var{string})
+@defun TuiWindow.write (@var{string} @r{[}, @var{full_window}@r{]})
 Write @var{string} to the window.  @var{string} can contain ANSI
 terminal escape styling sequences; @value{GDBN} will translate these
 as appropriate for the terminal.
+
+If the @var{full_window} parameter is @code{True}, then @var{string}
+contains the full contents of the window.  This is similar to calling
+@code{erase} before @code{write}, but avoids the flickering.
 @end defun
 
 The factory function that you supply should return an object
index 22f4b0ffd43afebb08013ad4301a29114e7ab3fd..97e9de7a00cb20830b910cf33c33ef8b48b6ef25 100644 (file)
@@ -111,8 +111,9 @@ public:
       }
   }
 
-  /* Write STR to the window.  */
-  void output (const char *str);
+  /* Write STR to the window.  FULL_WINDOW is true to erase the window
+     contents beforehand.  */
+  void output (const char *str, bool full_window);
 
   /* A helper function to compute the viewport width.  */
   int viewport_width () const
@@ -229,12 +230,18 @@ tui_py_window::do_scroll_vertical (int num_to_scroll)
 }
 
 void
-tui_py_window::output (const char *text)
+tui_py_window::output (const char *text, bool full_window)
 {
   if (m_inner_window != nullptr)
     {
+      if (full_window)
+       werase (m_inner_window.get ());
+
       tui_puts (text, m_inner_window.get ());
-      tui_wrefresh (m_inner_window.get ());
+      if (full_window)
+       check_and_display_highlight_if_needed ();
+      else
+       tui_wrefresh (m_inner_window.get ());
     }
 }
 
@@ -405,13 +412,14 @@ gdbpy_tui_write (PyObject *self, PyObject *args)
 {
   gdbpy_tui_window *win = (gdbpy_tui_window *) self;
   const char *text;
+  int full_window = 0;
 
-  if (!PyArg_ParseTuple (args, "s", &text))
+  if (!PyArg_ParseTuple (args, "s|i", &text, &full_window))
     return nullptr;
 
   REQUIRE_WINDOW (win);
 
-  win->window->output (text);
+  win->window->output (text, full_window);
 
   Py_RETURN_NONE;
 }