From bdef5723041368f3e264ac641360950c936b7ce4 Mon Sep 17 00:00:00 2001 From: Hannes Domani Date: Sun, 22 Nov 2020 16:51:30 +0100 Subject: [PATCH] Add optional full_window argument to TuiWindow.write 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 * 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 * python.texi (TUI Windows In Python): Document "full_window" argument. --- gdb/ChangeLog | 6 ++++++ gdb/doc/ChangeLog | 5 +++++ gdb/doc/python.texi | 6 +++++- gdb/python/py-tui.c | 20 ++++++++++++++------ 4 files changed, 30 insertions(+), 7 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 9d06a771ae..739e7732b8 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 51503a7142..2743079e93 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 9127b9617d..23e6ac666f 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 22f4b0ffd4..97e9de7a00 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; } -- 2.34.1