diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 9d06a771ae5..739e7732b87 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2021-05-27 Hannes Domani + + * python/py-tui.c (tui_py_window::output): Add full_window + argument. + (gdbpy_tui_write): Parse "full_window" argument. + 2021-05-27 Simon Marchi * make-init-c: Add option to reverse function calls. diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index 51503a71424..2743079e93e 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,3 +1,8 @@ +2021-05-27 Hannes Domani + + * python.texi (TUI Windows In Python): Document "full_window" + argument. + 2021-05-27 Hannes Domani * python.texi (Symbols In Python): Document gdb.SYMBOL_LOC_LABEL. diff --git a/gdb/doc/python.texi b/gdb/doc/python.texi index 9127b9617db..23e6ac666ff 100644 --- a/gdb/doc/python.texi +++ b/gdb/doc/python.texi @@ -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 diff --git a/gdb/python/py-tui.c b/gdb/python/py-tui.c index 22f4b0ffd43..97e9de7a00c 100644 --- a/gdb/python/py-tui.c +++ b/gdb/python/py-tui.c @@ -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; }