Allow TUI windows in Python

This patch adds support for writing new TUI windows in Python.

2020-02-22  Tom Tromey  <tom@tromey.com>

	* NEWS: Add entry for gdb.register_window_type.
	* tui/tui-layout.h (window_factory): New typedef.
	(tui_register_window): Declare.
	* tui/tui-layout.c (saved_tui_windows): New global.
	(tui_apply_current_layout): Use it.
	(tui_register_window): New function.
	* python/python.c (do_start_initialization): Call
	gdbpy_initialize_tui.
	(python_GdbMethods): Add "register_window_type" function.
	* python/python-internal.h (gdbpy_register_tui_window)
	(gdbpy_initialize_tui): Declare.
	* python/py-tui.c: New file.
	* Makefile.in (SUBDIR_PYTHON_SRCS): Add py-tui.c.

gdb/doc/ChangeLog
2020-02-22  Tom Tromey  <tom@tromey.com>

	* python.texi (Python API): Add menu item.
	(TUI Windows In Python): New node.

gdb/testsuite/ChangeLog
2020-02-22  Tom Tromey  <tom@tromey.com>

	* gdb.python/tui-window.exp: New file.
	* gdb.python/tui-window.py: New file.

Change-Id: I85fbfb923a1840450a00a7dce113a05d7f048baa
This commit is contained in:
Tom Tromey 2020-02-22 11:48:26 -07:00
parent fc96d20b2c
commit 01b1af321f
13 changed files with 783 additions and 4 deletions

View file

@ -163,6 +163,7 @@ optional arguments while skipping others. Example:
using Python.
* Lazy Strings In Python:: Python representation of lazy strings.
* Architectures In Python:: Python representation of architectures.
* TUI Windows In Python:: Implementing new TUI windows.
@end menu
@node Basic Python
@ -5673,6 +5674,110 @@ instruction in bytes.
@end table
@end defun
@node TUI Windows In Python
@subsubsection Implementing new TUI windows
@cindex Python TUI Windows
New TUI (@pxref{TUI}) windows can be implemented in Python.
@findex gdb.register_window_type
@defun gdb.register_window_type (@var{name}, @var{factory})
Because TUI windows are created and destroyed depending on the layout
the user chooses, new window types are implemented by registering a
factory function with @value{GDBN}.
@var{name} is the name of the new window. It's an error to try to
replace one of the built-in windows, but other window types can be
replaced.
@var{function} is a factory function that is called to create the TUI
window. This is called with a single argument of type
@code{gdb.TuiWindow}, described below. It should return an object
that implements the TUI window protocol, also described below.
@end defun
As mentioned above, when a factory function is called, it is passed a
an object of type @code{gdb.TuiWindow}. This object has these
methods and attributes:
@defun TuiWindow.is_valid ()
This method returns @code{True} when this window is valid. When the
user changes the TUI layout, windows no longer visible in the new
layout will be destroyed. At this point, the @code{gdb.TuiWindow}
will no longer be valid, and methods (and attributes) other than
@code{is_valid} will throw an exception.
@end defun
@defvar TuiWindow.width
This attribute holds the width of the window. It is not writable.
@end defvar
@defvar TuiWindow.height
This attribute holds the height of the window. It is not writable.
@end defvar
@defvar TuiWindow.title
This attribute holds the window's title, a string. This is normally
displayed above the window. This attribute can be modified.
@end defvar
@defun TuiWindow.erase ()
Remove all the contents of the window.
@end defun
@defun TuiWindow.write (@var{string})
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.
@end defun
The factory function that you supply should return an object
conforming to the TUI window protocol. These are the method that can
be called on this object, which is referred to below as the ``window
object''. The methods documented below are optional; if the object
does not implement one of these methods, @value{GDBN} will not attempt
to call it. Additional new methods may be added to the window
protocol in the future. @value{GDBN} guarantees that they will begin
with a lower-case letter, so you can start implementation methods with
upper-case letters or underscore to avoid any future conflicts.
@defun Window.close ()
When the TUI window is closed, the @code{gdb.TuiWindow} object will be
put into an invalid state. At this time, @value{GDBN} will call
@code{close} method on the window object.
After this method is called, @value{GDBN} will discard any references
it holds on this window object, and will no longer call methods on
this object.
@end defun
@defun Window.render ()
In some situations, a TUI window can change size. For example, this
can happen if the user resizes the terminal, or changes the layout.
When this happens, @value{GDBN} will call the @code{render} method on
the window object.
If your window is intended to update in response to changes in the
inferior, you will probably also want to register event listeners and
send output to the @code{gdb.TuiWindow}.
@end defun
@defun Window.hscroll (@var{num})
This is a request to scroll the window horizontally. @var{num} is the
amount by which to scroll, with negative numbers meaning to scroll
right. In the TUI model, it is the viewport that moves, not the
contents. A positive argument should cause the viewport to move
right, and so the content should appear to move to the left.
@end defun
@defun Window.vscroll (@var{num})
This is a request to scroll the window vertically. @var{num} is the
amount by which to scroll, with negative numbers meaning to scroll
backward. In the TUI model, it is the viewport that moves, not the
contents. A positive argument should cause the viewport to move down,
and so the content should appear to move up.
@end defun
@node Python Auto-loading
@subsection Python Auto-loading
@cindex Python auto-loading