Asynchronously resize the TUI
authorPatrick Palka <patrick@parcs.ath.cx>
Tue, 17 Feb 2015 16:13:43 +0000 (11:13 -0500)
committerPatrick Palka <patrick@parcs.ath.cx>
Wed, 18 Feb 2015 22:26:06 +0000 (17:26 -0500)
commitc4ef48c6b22472f197eeefbda1d9fb295ff61a77
tree459899637c91b0552eb5496900aceaedeca75e1d
parentf6a88844c36e2c03806563c9703b92af6ba0b345
Asynchronously resize the TUI

This patch teaches the TUI to resize itself asynchronously instead of
synchronously.  Asynchronously resizing the screen when the underlying
terminal gets resized is the more intuitive behavior and is surprisingly
simple to implement thanks to GDB's async infrastructure.

The implementation is straightforward.  TUI's SIGWINCH handler is just
tweaked to asynchronously invoke a new callback,
tui_async_resize_screen, which is responsible for safely resizing the
screen.  Care must be taken to not to attempt to asynchronously resize
the screen while the TUI is not active.  When the TUI is not active, the
callback will do nothing, but the screen will yet be resized in the next
call to tui_enable() by virtue of win_resized being TRUE.

(So, after the patch there are still two places where the screen gets
resized: one in tui_enable() and the other now in
tui_async_resize_screen() as opposed to being in
tui_handle_resize_during_io().  The one in tui_enable() is still
necessary to handle the case where the terminal gets resized inside the
CLI: in that case, the TUI still needs resizing, but it must wait until
the TUI gets re-enabled.)

gdb/ChangeLog:

* tui/tui-io.c (tui_handle_resize_during_io): Remove this
function.
(tui_putc): Don't call tui_handle_resize_during_io.
(tui_getc): Likewise.
(tui_mld_getc): Likewise.
* tui/tui-win.c: Include event-loop.h and tui/tui-io.h.
(tui_sigwinch_token): New static variable.
(tui_initialize_win): Adjust documentation.  Set
tui_sigwinch_token.
(tui_async_resize_screen): New asynchronous callback.
(tui_sigwinch_handler): Adjust documentation.  Asynchronously
invoke tui_async_resize_screen.
gdb/tui/tui-io.c
gdb/tui/tui-win.c