Skip to content
  • Patrick Palka's avatar
    Asynchronously resize the TUI · c4ef48c6
    Patrick Palka authored
    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.
    c4ef48c6