This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Explicitly call rl_resize_terminal() in TUI's SIGWINCH handler


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=8900d71e388043726fece2695b9b0ffc9a0d7afb

commit 8900d71e388043726fece2695b9b0ffc9a0d7afb
Author: Patrick Palka <patrick@parcs.ath.cx>
Date:   Wed Apr 22 19:25:55 2015 -0400

    Explicitly call rl_resize_terminal() in TUI's SIGWINCH handler
    
    In readline 6.3, the semantics of SIGWINCH handling has changed.
    When a SIGWINCH signal is raised, readline's rl_sigwinch_handler() now
    does not immediately call rl_resize_terminal().  Instead it sets a flag
    that is checked by RL_CHECK_SIGNALS() at a point where readline has
    control, and calls rl_resize_terminal() if said flag is set.
    
    This change is item (c) in https://cnswww.cns.cwru.edu/php/chet/readline/CHANGES
    
      c.  Fixed a bug that caused readline to try and run code to modify its idea
          of the screen size in a signal handler context upon receiving a SIGWINCH.
    
    This change in behavior is important to us because TUI's
    tui_sigwinch_handler() relies on the assumption that by the time it's
    called, readline will have updated its knowledge of the terminal
    dimensions via rl_resize_terminal().  Since this assumption no longer
    holds true, TUI's SIGWINCH handling does not work correctly with
    readline 6.3.
    
    To fix this issue this patch makes TUI explicitly call
    rl_resize_terminal() in tui_async_resize_screen() at the point where
    current terminal dimensions are needed.  (We could call it in
    tui_sigwinch_handler too, but since readline avoids doing it, we are
    probably safer off avoiding to call it in signal handler context as
    well.)  After this change, SIGWINCH handling continues to work properly
    with both readline 6.2 and 6.3.
    
    Since we no longer need it, we could now explicitly disable readline's
    SIGWINCH handler by setting rl_catch_sigwinch to zero early on in the
    program startup but I can't seem to find a good spot to place this
    assignment (the first call to rl_initialize() occurs in
    tui_initialize_readline() so the assignment should occur before then),
    and the handler is harmless anyway.
    
    gdb/ChangeLog:
    
    	* tui/tui-win.c (tui_async_resize_screen): Call
    	rl_resize_terminal().

Diff:
---
 gdb/ChangeLog     | 5 +++++
 gdb/tui/tui-win.c | 1 +
 2 files changed, 6 insertions(+)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index f5ea395..f518c6c 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,8 @@
+2015-04-23  Patrick Palka  <patrick@parcs.ath.cx>
+
+	* tui/tui-win.c (tui_async_resize_screen): Call
+	rl_resize_terminal().
+
 2015-04-22  Jon Turney  <jon.turney@dronecode.org.uk>
 
 	* windows-nat.c (handle_output_debug_string): Don't change
diff --git a/gdb/tui/tui-win.c b/gdb/tui/tui-win.c
index 77218e8..3cf38fc 100644
--- a/gdb/tui/tui-win.c
+++ b/gdb/tui/tui-win.c
@@ -848,6 +848,7 @@ tui_async_resize_screen (gdb_client_data arg)
   if (!tui_active)
     return;
 
+  rl_resize_terminal ();
   tui_resize_all ();
   tui_refresh_all_win ();
   tui_update_gdb_sizes ();


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]