Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* [PATCH] [PR gdb/16762 gdb/15958] Fixes for properly resizing TUI
@ 2014-10-09 15:57 CustaiCo
  0 siblings, 0 replies; 25+ messages in thread
From: CustaiCo @ 2014-10-09 15:57 UTC (permalink / raw)
  To: gdb-patches

[-- Attachment #1: Type: text/plain, Size: 2445 bytes --]

This patch is to fix Bug 16762 - GDB doesn't update display size when host
terminal resize, and it inadvertently fixes Bug 15958 - readline modifies
env (LINES+COLUMNS) as well.

Before it was getting it's size data from curses, but curses is not
available to the readline based interface, so things would get out of sync.
The readline based interface had no way at all to know if there had been
any changes to the size of the window. 

I have changed it so that both the sides use the same callback function. The
event handler has been changed to call some clean up operations that
readlines needs and then puts in a request to call the resize function in 
the main event loop on the next pass. It does change a couple new parameters
that readline 6.3 introduces, rl_change_environment and rl_prefer_env_winsize
They make it so readline does not set ROWS or COLUMNS in the environment,
and seems to be suggested by the ncurses FAQ [1]. The previous method
that handedled resizing after getting input from curses, along with some
support code, has been removed.

The only problem I am aware of with this patch is that until the first
character is typed after resizing in curses mode, you do not see
the contents of the command window. This seems to have no impact on any
other function. Resizing with, without, or any number of switches in
between curses and readline modes were unable to produce a out of sync
size report for me. Without the patch, any resize operation shrinks the
size of the command portion of the window to 3 lines, which is retained
as the full height of the screen in readline mode until you exit the 
session.

I see no regressions in the test suite, even though this isn't the
sort of issue that automated testing is very good at.

CustaiCo

[1] http://invisible-island.net/ncurses/ncurses.faq.html#handle_resize

                === gdb Summary ===

# of expected passes            28624
# of unexpected failures        98
# of unexpected successes       1
# of expected failures          58
# of known failures             55
# of unresolved testcases       12
# of untested testcases         46
# of unsupported tests          184

---
 gdb/ChangeLog      | 14 ++++++++++++++
 gdb/tui/tui-data.c | 16 ----------------
 gdb/tui/tui-io.c   | 21 ---------------------
 gdb/tui/tui-win.c  | 40 +++++++++++++++++++++++++++++++++++-----
 gdb/utils.c        |  7 +++++--
 5 files changed, 54 insertions(+), 44 deletions(-)


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Fixes-issue-gdb-16762-and-gdb-15958.patch --]
[-- Type: text/x-patch; name="0001-Fixes-issue-gdb-16762-and-gdb-15958.patch", Size: 5560 bytes --]

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index ee82f1f..73be21b 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,17 @@
+2014-10-09  CustaiCo  <custaico@openmailbox.org>
+
+	PR gdb/16762
+	PR gdb/15958
+	* tui/tui-win.c: Changed the signal handling code to use the main
+	event loop.
+	* tui/tui-io.c: tui_handle_resize_during_io is not needed. The main
+	event loop handles the call back to resized the windows.
+	* tui/tui-data.c: Support methods for tui_handle_resize_during_io
+	removed.
+	* utils.c: Set new option in latest readline to prevent
+	environment from being changed. Also changed to not incorrectly resize
+	window when tui running.
+
 2014-10-09  Yao Qi  <yao@codesourcery.com>
 
 	* infrun.c (handle_signal_stop): Remove local variable
diff --git a/gdb/tui/tui-data.c b/gdb/tui/tui-data.c
index 7e51b3e..06ea29b 100644
--- a/gdb/tui/tui-data.c
+++ b/gdb/tui/tui-data.c
@@ -98,22 +98,6 @@ tui_set_win_highlight (struct tui_win_info *win_info,
 ** ACCESSORS & MUTATORS FOR PRIVATE DATA
 ******************************************/
 
-/* Answer a whether the terminal window has been resized or not.  */
-int
-tui_win_resized (void)
-{
-  return win_resized;
-}
-
-
-/* Set a whether the terminal window has been resized or not.  */
-void
-tui_set_win_resized_to (int resized)
-{
-  win_resized = resized;
-}
-
-
 /* Answer a pointer to the current layout definition.  */
 struct tui_layout_def *
 tui_layout_def (void)
diff --git a/gdb/tui/tui-io.c b/gdb/tui/tui-io.c
index 601d278..4c7fca8 100644
--- a/gdb/tui/tui-io.c
+++ b/gdb/tui/tui-io.c
@@ -146,8 +146,6 @@ static int tui_readline_pipe[2];
    This may be the main gdb prompt or a secondary prompt.  */
 static char *tui_rl_saved_prompt;
 
-static unsigned int tui_handle_resize_during_io (unsigned int);
-
 static void
 tui_putc (char c)
 {
@@ -653,7 +651,6 @@ tui_getc (FILE *fp)
 #endif
 
   ch = wgetch (w);
-  ch = tui_handle_resize_during_io (ch);
 
   /* The \n must be echoed because it will not be printed by
      readline.  */
@@ -694,21 +691,3 @@ tui_getc (FILE *fp)
   
   return ch;
 }
-
-
-/* Cleanup when a resize has occured.
-   Returns the character that must be processed.  */
-static unsigned int
-tui_handle_resize_during_io (unsigned int original_ch)
-{
-  if (tui_win_resized ())
-    {
-      tui_resize_all ();
-      tui_refresh_all_win ();
-      dont_repeat ();
-      tui_set_win_resized_to (FALSE);
-      return '\n';
-    }
-  else
-    return original_ch;
-}
diff --git a/gdb/tui/tui-win.c b/gdb/tui/tui-win.c
index 9c7a23f..095097a 100644
--- a/gdb/tui/tui-win.c
+++ b/gdb/tui/tui-win.c
@@ -29,6 +29,7 @@
 #include "symtab.h"
 #include "breakpoint.h"
 #include "frame.h"
+#include "event-loop.h"
 #include "cli/cli-cmds.h"
 #include "top.h"
 #include "source.h"
@@ -72,7 +73,7 @@ static void tui_scroll_right_command (char *, int);
 static void parse_scrolling_args (char *, 
 				  struct tui_win_info **, 
 				  int *);
-
+static void tui_handle_resize (void *);
 
 /***************************************
 ** DEFINITIONS
@@ -457,6 +458,31 @@ bold-standout   use extra bright or bold with standout mode"),
 			&tui_setlist, &tui_showlist);
 }
 
+/* This is called from the main event loop after we catch SIGWINCH */
+void
+tui_handle_resize (void *signal)
+{
+  char cmd[50];
+  int col, row;
+  if (tui_active)
+    {
+      tui_resize_all ();
+      tui_refresh_all_win ();
+      xsnprintf (cmd, sizeof (cmd), "set width %d", TUI_CMD_WIN->generic.width);
+      execute_command (cmd, 0);
+      xsnprintf (cmd, sizeof (cmd), "set height %d", TUI_CMD_WIN->generic.height);
+      execute_command (cmd, 0);
+    }
+  else
+    {
+      rl_get_screen_size (&row, &col);
+      xsnprintf (cmd, sizeof (cmd), "set width %d", col);
+      execute_command (cmd, 0);
+      xsnprintf (cmd, sizeof (cmd), "set height %d", row);
+      execute_command (cmd, 0);
+    }
+}
+
 /* Update gdb's knowledge of the terminal size.  */
 void
 tui_update_gdb_sizes (void)
@@ -670,7 +696,7 @@ tui_resize_all (void)
 
 #ifdef HAVE_RESIZE_TERM
       resize_term (screenheight, screenwidth);
-#endif      
+#endif
       /* Turn keypad off while we resize.  */
       if (win_with_focus != TUI_CMD_WIN)
 	keypad (TUI_CMD_WIN->generic.handle, FALSE);
@@ -818,9 +844,13 @@ tui_resize_all (void)
 static void
 tui_sigwinch_handler (int signal)
 {
-  /* Say that a resize was done so that the readline can do it later
-     when appropriate.  */
-  tui_set_win_resized_to (TRUE);
+  /* Say that a resize was done so that the we can update
+     the UI when appropriate. */
+  struct tui_translate data;
+  data.value = signal;
+  rl_cleanup_after_signal ();
+  rl_resize_terminal ();
+  mark_async_signal_handler (create_async_signal_handler (tui_handle_resize, &data));
 }
 #endif
 
diff --git a/gdb/utils.c b/gdb/utils.c
index 3915b58..ae0342a 100644
--- a/gdb/utils.c
+++ b/gdb/utils.c
@@ -1686,6 +1686,8 @@ init_page_info (void)
       chars_per_line = cols;
 #else
       /* Make sure Readline has initialized its terminal settings.  */
+      rl_change_environment = 0;
+      rl_prefer_env_winsize = 0;
       rl_reset_terminal (NULL);
 
       /* Get the screen size from Readline.  */
@@ -1775,8 +1777,9 @@ set_screen_size (void)
   if (cols <= 0)
     cols = INT_MAX;
 
-  /* Update Readline's idea of the terminal size.  */
-  rl_set_screen_size (rows, cols);
+  /* Don't update with tui active or it will be too large */
+  if (!tui_active)
+      rl_set_screen_size (rows, cols);
 }
 
 /* Reinitialize WRAP_BUFFER according to the current value of

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH] [PR gdb/16762 gdb/15958] Fixes for properly resizing TUI
       [not found] <5436b07f.25f9440a.540c.4c6fSMTPIN_ADDED_MISSING@mx.google.com>
@ 2014-10-24 18:44 ` Pedro Alves
  0 siblings, 0 replies; 25+ messages in thread
From: Pedro Alves @ 2014-10-24 18:44 UTC (permalink / raw)
  To: CustaiCo, gdb-patches

Hi!

Thanks much for tackling this.

Do you have a copyright assignment on file?  We will need it before
we can accept the changes.

See <http://sourceware.org/gdb/wiki/ContributionChecklist>.

If you haven't filed it yet, please contact me off-list and I
will get you started.

(I haven't really looked at the patch.)

-- 
Pedro Alves

On 10/09/2014 04:02 PM, CustaiCo wrote:
> This patch is to fix Bug 16762 - GDB doesn't update display size when host
> terminal resize, and it inadvertently fixes Bug 15958 - readline modifies
> env (LINES+COLUMNS) as well.
> 
> Before it was getting it's size data from curses, but curses is not
> available to the readline based interface, so things would get out of sync.
> The readline based interface had no way at all to know if there had been
> any changes to the size of the window. 
> 
> I have changed it so that both the sides use the same callback function. The
> event handler has been changed to call some clean up operations that
> readlines needs and then puts in a request to call the resize function in 
> the main event loop on the next pass. It does change a couple new parameters
> that readline 6.3 introduces, rl_change_environment and rl_prefer_env_winsize
> They make it so readline does not set ROWS or COLUMNS in the environment,
> and seems to be suggested by the ncurses FAQ [1]. The previous method
> that handedled resizing after getting input from curses, along with some
> support code, has been removed.
> 
> The only problem I am aware of with this patch is that until the first
> character is typed after resizing in curses mode, you do not see
> the contents of the command window. This seems to have no impact on any
> other function. Resizing with, without, or any number of switches in
> between curses and readline modes were unable to produce a out of sync
> size report for me. Without the patch, any resize operation shrinks the
> size of the command portion of the window to 3 lines, which is retained
> as the full height of the screen in readline mode until you exit the 
> session.
> 
> I see no regressions in the test suite, even though this isn't the
> sort of issue that automated testing is very good at.
> 
> CustaiCo
> 
> [1] http://invisible-island.net/ncurses/ncurses.faq.html#handle_resize
> 
>                 === gdb Summary ===
> 
> # of expected passes            28624
> # of unexpected failures        98
> # of unexpected successes       1
> # of expected failures          58
> # of known failures             55
> # of unresolved testcases       12
> # of untested testcases         46
> # of unsupported tests          184
> 
> ---
>  gdb/ChangeLog      | 14 ++++++++++++++
>  gdb/tui/tui-data.c | 16 ----------------
>  gdb/tui/tui-io.c   | 21 ---------------------
>  gdb/tui/tui-win.c  | 40 +++++++++++++++++++++++++++++++++++-----
>  gdb/utils.c        |  7 +++++--
>  5 files changed, 54 insertions(+), 44 deletions(-)
> 


Thanks,
Pedro Alves


^ permalink raw reply	[flat|nested] 25+ messages in thread

* [PATCH] [PR gdb/16762 gdb/15958] Fixes for properly resizing TUI
@ 2014-10-09 15:57 CustaiCo
  0 siblings, 0 replies; 25+ messages in thread
From: CustaiCo @ 2014-10-09 15:57 UTC (permalink / raw)
  To: gdb-patches

[-- Attachment #1: Type: text/plain, Size: 2445 bytes --]

This patch is to fix Bug 16762 - GDB doesn't update display size when host
terminal resize, and it inadvertently fixes Bug 15958 - readline modifies
env (LINES+COLUMNS) as well.

Before it was getting it's size data from curses, but curses is not
available to the readline based interface, so things would get out of sync.
The readline based interface had no way at all to know if there had been
any changes to the size of the window. 

I have changed it so that both the sides use the same callback function. The
event handler has been changed to call some clean up operations that
readlines needs and then puts in a request to call the resize function in 
the main event loop on the next pass. It does change a couple new parameters
that readline 6.3 introduces, rl_change_environment and rl_prefer_env_winsize
They make it so readline does not set ROWS or COLUMNS in the environment,
and seems to be suggested by the ncurses FAQ [1]. The previous method
that handedled resizing after getting input from curses, along with some
support code, has been removed.

The only problem I am aware of with this patch is that until the first
character is typed after resizing in curses mode, you do not see
the contents of the command window. This seems to have no impact on any
other function. Resizing with, without, or any number of switches in
between curses and readline modes were unable to produce a out of sync
size report for me. Without the patch, any resize operation shrinks the
size of the command portion of the window to 3 lines, which is retained
as the full height of the screen in readline mode until you exit the 
session.

I see no regressions in the test suite, even though this isn't the
sort of issue that automated testing is very good at.

CustaiCo

[1] http://invisible-island.net/ncurses/ncurses.faq.html#handle_resize

                === gdb Summary ===

# of expected passes            28624
# of unexpected failures        98
# of unexpected successes       1
# of expected failures          58
# of known failures             55
# of unresolved testcases       12
# of untested testcases         46
# of unsupported tests          184

---
 gdb/ChangeLog      | 14 ++++++++++++++
 gdb/tui/tui-data.c | 16 ----------------
 gdb/tui/tui-io.c   | 21 ---------------------
 gdb/tui/tui-win.c  | 40 +++++++++++++++++++++++++++++++++++-----
 gdb/utils.c        |  7 +++++--
 5 files changed, 54 insertions(+), 44 deletions(-)


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Fixes-issue-gdb-16762-and-gdb-15958.patch --]
[-- Type: text/x-patch; name="0001-Fixes-issue-gdb-16762-and-gdb-15958.patch", Size: 5560 bytes --]

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index ee82f1f..73be21b 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,17 @@
+2014-10-09  CustaiCo  <custaico@openmailbox.org>
+
+	PR gdb/16762
+	PR gdb/15958
+	* tui/tui-win.c: Changed the signal handling code to use the main
+	event loop.
+	* tui/tui-io.c: tui_handle_resize_during_io is not needed. The main
+	event loop handles the call back to resized the windows.
+	* tui/tui-data.c: Support methods for tui_handle_resize_during_io
+	removed.
+	* utils.c: Set new option in latest readline to prevent
+	environment from being changed. Also changed to not incorrectly resize
+	window when tui running.
+
 2014-10-09  Yao Qi  <yao@codesourcery.com>
 
 	* infrun.c (handle_signal_stop): Remove local variable
diff --git a/gdb/tui/tui-data.c b/gdb/tui/tui-data.c
index 7e51b3e..06ea29b 100644
--- a/gdb/tui/tui-data.c
+++ b/gdb/tui/tui-data.c
@@ -98,22 +98,6 @@ tui_set_win_highlight (struct tui_win_info *win_info,
 ** ACCESSORS & MUTATORS FOR PRIVATE DATA
 ******************************************/
 
-/* Answer a whether the terminal window has been resized or not.  */
-int
-tui_win_resized (void)
-{
-  return win_resized;
-}
-
-
-/* Set a whether the terminal window has been resized or not.  */
-void
-tui_set_win_resized_to (int resized)
-{
-  win_resized = resized;
-}
-
-
 /* Answer a pointer to the current layout definition.  */
 struct tui_layout_def *
 tui_layout_def (void)
diff --git a/gdb/tui/tui-io.c b/gdb/tui/tui-io.c
index 601d278..4c7fca8 100644
--- a/gdb/tui/tui-io.c
+++ b/gdb/tui/tui-io.c
@@ -146,8 +146,6 @@ static int tui_readline_pipe[2];
    This may be the main gdb prompt or a secondary prompt.  */
 static char *tui_rl_saved_prompt;
 
-static unsigned int tui_handle_resize_during_io (unsigned int);
-
 static void
 tui_putc (char c)
 {
@@ -653,7 +651,6 @@ tui_getc (FILE *fp)
 #endif
 
   ch = wgetch (w);
-  ch = tui_handle_resize_during_io (ch);
 
   /* The \n must be echoed because it will not be printed by
      readline.  */
@@ -694,21 +691,3 @@ tui_getc (FILE *fp)
   
   return ch;
 }
-
-
-/* Cleanup when a resize has occured.
-   Returns the character that must be processed.  */
-static unsigned int
-tui_handle_resize_during_io (unsigned int original_ch)
-{
-  if (tui_win_resized ())
-    {
-      tui_resize_all ();
-      tui_refresh_all_win ();
-      dont_repeat ();
-      tui_set_win_resized_to (FALSE);
-      return '\n';
-    }
-  else
-    return original_ch;
-}
diff --git a/gdb/tui/tui-win.c b/gdb/tui/tui-win.c
index 9c7a23f..095097a 100644
--- a/gdb/tui/tui-win.c
+++ b/gdb/tui/tui-win.c
@@ -29,6 +29,7 @@
 #include "symtab.h"
 #include "breakpoint.h"
 #include "frame.h"
+#include "event-loop.h"
 #include "cli/cli-cmds.h"
 #include "top.h"
 #include "source.h"
@@ -72,7 +73,7 @@ static void tui_scroll_right_command (char *, int);
 static void parse_scrolling_args (char *, 
 				  struct tui_win_info **, 
 				  int *);
-
+static void tui_handle_resize (void *);
 
 /***************************************
 ** DEFINITIONS
@@ -457,6 +458,31 @@ bold-standout   use extra bright or bold with standout mode"),
 			&tui_setlist, &tui_showlist);
 }
 
+/* This is called from the main event loop after we catch SIGWINCH */
+void
+tui_handle_resize (void *signal)
+{
+  char cmd[50];
+  int col, row;
+  if (tui_active)
+    {
+      tui_resize_all ();
+      tui_refresh_all_win ();
+      xsnprintf (cmd, sizeof (cmd), "set width %d", TUI_CMD_WIN->generic.width);
+      execute_command (cmd, 0);
+      xsnprintf (cmd, sizeof (cmd), "set height %d", TUI_CMD_WIN->generic.height);
+      execute_command (cmd, 0);
+    }
+  else
+    {
+      rl_get_screen_size (&row, &col);
+      xsnprintf (cmd, sizeof (cmd), "set width %d", col);
+      execute_command (cmd, 0);
+      xsnprintf (cmd, sizeof (cmd), "set height %d", row);
+      execute_command (cmd, 0);
+    }
+}
+
 /* Update gdb's knowledge of the terminal size.  */
 void
 tui_update_gdb_sizes (void)
@@ -670,7 +696,7 @@ tui_resize_all (void)
 
 #ifdef HAVE_RESIZE_TERM
       resize_term (screenheight, screenwidth);
-#endif      
+#endif
       /* Turn keypad off while we resize.  */
       if (win_with_focus != TUI_CMD_WIN)
 	keypad (TUI_CMD_WIN->generic.handle, FALSE);
@@ -818,9 +844,13 @@ tui_resize_all (void)
 static void
 tui_sigwinch_handler (int signal)
 {
-  /* Say that a resize was done so that the readline can do it later
-     when appropriate.  */
-  tui_set_win_resized_to (TRUE);
+  /* Say that a resize was done so that the we can update
+     the UI when appropriate. */
+  struct tui_translate data;
+  data.value = signal;
+  rl_cleanup_after_signal ();
+  rl_resize_terminal ();
+  mark_async_signal_handler (create_async_signal_handler (tui_handle_resize, &data));
 }
 #endif
 
diff --git a/gdb/utils.c b/gdb/utils.c
index 3915b58..ae0342a 100644
--- a/gdb/utils.c
+++ b/gdb/utils.c
@@ -1686,6 +1686,8 @@ init_page_info (void)
       chars_per_line = cols;
 #else
       /* Make sure Readline has initialized its terminal settings.  */
+      rl_change_environment = 0;
+      rl_prefer_env_winsize = 0;
       rl_reset_terminal (NULL);
 
       /* Get the screen size from Readline.  */
@@ -1775,8 +1777,9 @@ set_screen_size (void)
   if (cols <= 0)
     cols = INT_MAX;
 
-  /* Update Readline's idea of the terminal size.  */
-  rl_set_screen_size (rows, cols);
+  /* Don't update with tui active or it will be too large */
+  if (!tui_active)
+      rl_set_screen_size (rows, cols);
 }
 
 /* Reinitialize WRAP_BUFFER according to the current value of

^ permalink raw reply	[flat|nested] 25+ messages in thread

* [PATCH] [PR gdb/16762 gdb/15958] Fixes for properly resizing TUI
@ 2014-10-09 15:57 CustaiCo
  0 siblings, 0 replies; 25+ messages in thread
From: CustaiCo @ 2014-10-09 15:57 UTC (permalink / raw)
  To: gdb-patches

[-- Attachment #1: Type: text/plain, Size: 2445 bytes --]

This patch is to fix Bug 16762 - GDB doesn't update display size when host
terminal resize, and it inadvertently fixes Bug 15958 - readline modifies
env (LINES+COLUMNS) as well.

Before it was getting it's size data from curses, but curses is not
available to the readline based interface, so things would get out of sync.
The readline based interface had no way at all to know if there had been
any changes to the size of the window. 

I have changed it so that both the sides use the same callback function. The
event handler has been changed to call some clean up operations that
readlines needs and then puts in a request to call the resize function in 
the main event loop on the next pass. It does change a couple new parameters
that readline 6.3 introduces, rl_change_environment and rl_prefer_env_winsize
They make it so readline does not set ROWS or COLUMNS in the environment,
and seems to be suggested by the ncurses FAQ [1]. The previous method
that handedled resizing after getting input from curses, along with some
support code, has been removed.

The only problem I am aware of with this patch is that until the first
character is typed after resizing in curses mode, you do not see
the contents of the command window. This seems to have no impact on any
other function. Resizing with, without, or any number of switches in
between curses and readline modes were unable to produce a out of sync
size report for me. Without the patch, any resize operation shrinks the
size of the command portion of the window to 3 lines, which is retained
as the full height of the screen in readline mode until you exit the 
session.

I see no regressions in the test suite, even though this isn't the
sort of issue that automated testing is very good at.

CustaiCo

[1] http://invisible-island.net/ncurses/ncurses.faq.html#handle_resize

                === gdb Summary ===

# of expected passes            28624
# of unexpected failures        98
# of unexpected successes       1
# of expected failures          58
# of known failures             55
# of unresolved testcases       12
# of untested testcases         46
# of unsupported tests          184

---
 gdb/ChangeLog      | 14 ++++++++++++++
 gdb/tui/tui-data.c | 16 ----------------
 gdb/tui/tui-io.c   | 21 ---------------------
 gdb/tui/tui-win.c  | 40 +++++++++++++++++++++++++++++++++++-----
 gdb/utils.c        |  7 +++++--
 5 files changed, 54 insertions(+), 44 deletions(-)


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Fixes-issue-gdb-16762-and-gdb-15958.patch --]
[-- Type: text/x-patch; name="0001-Fixes-issue-gdb-16762-and-gdb-15958.patch", Size: 5560 bytes --]

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index ee82f1f..73be21b 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,17 @@
+2014-10-09  CustaiCo  <custaico@openmailbox.org>
+
+	PR gdb/16762
+	PR gdb/15958
+	* tui/tui-win.c: Changed the signal handling code to use the main
+	event loop.
+	* tui/tui-io.c: tui_handle_resize_during_io is not needed. The main
+	event loop handles the call back to resized the windows.
+	* tui/tui-data.c: Support methods for tui_handle_resize_during_io
+	removed.
+	* utils.c: Set new option in latest readline to prevent
+	environment from being changed. Also changed to not incorrectly resize
+	window when tui running.
+
 2014-10-09  Yao Qi  <yao@codesourcery.com>
 
 	* infrun.c (handle_signal_stop): Remove local variable
diff --git a/gdb/tui/tui-data.c b/gdb/tui/tui-data.c
index 7e51b3e..06ea29b 100644
--- a/gdb/tui/tui-data.c
+++ b/gdb/tui/tui-data.c
@@ -98,22 +98,6 @@ tui_set_win_highlight (struct tui_win_info *win_info,
 ** ACCESSORS & MUTATORS FOR PRIVATE DATA
 ******************************************/
 
-/* Answer a whether the terminal window has been resized or not.  */
-int
-tui_win_resized (void)
-{
-  return win_resized;
-}
-
-
-/* Set a whether the terminal window has been resized or not.  */
-void
-tui_set_win_resized_to (int resized)
-{
-  win_resized = resized;
-}
-
-
 /* Answer a pointer to the current layout definition.  */
 struct tui_layout_def *
 tui_layout_def (void)
diff --git a/gdb/tui/tui-io.c b/gdb/tui/tui-io.c
index 601d278..4c7fca8 100644
--- a/gdb/tui/tui-io.c
+++ b/gdb/tui/tui-io.c
@@ -146,8 +146,6 @@ static int tui_readline_pipe[2];
    This may be the main gdb prompt or a secondary prompt.  */
 static char *tui_rl_saved_prompt;
 
-static unsigned int tui_handle_resize_during_io (unsigned int);
-
 static void
 tui_putc (char c)
 {
@@ -653,7 +651,6 @@ tui_getc (FILE *fp)
 #endif
 
   ch = wgetch (w);
-  ch = tui_handle_resize_during_io (ch);
 
   /* The \n must be echoed because it will not be printed by
      readline.  */
@@ -694,21 +691,3 @@ tui_getc (FILE *fp)
   
   return ch;
 }
-
-
-/* Cleanup when a resize has occured.
-   Returns the character that must be processed.  */
-static unsigned int
-tui_handle_resize_during_io (unsigned int original_ch)
-{
-  if (tui_win_resized ())
-    {
-      tui_resize_all ();
-      tui_refresh_all_win ();
-      dont_repeat ();
-      tui_set_win_resized_to (FALSE);
-      return '\n';
-    }
-  else
-    return original_ch;
-}
diff --git a/gdb/tui/tui-win.c b/gdb/tui/tui-win.c
index 9c7a23f..095097a 100644
--- a/gdb/tui/tui-win.c
+++ b/gdb/tui/tui-win.c
@@ -29,6 +29,7 @@
 #include "symtab.h"
 #include "breakpoint.h"
 #include "frame.h"
+#include "event-loop.h"
 #include "cli/cli-cmds.h"
 #include "top.h"
 #include "source.h"
@@ -72,7 +73,7 @@ static void tui_scroll_right_command (char *, int);
 static void parse_scrolling_args (char *, 
 				  struct tui_win_info **, 
 				  int *);
-
+static void tui_handle_resize (void *);
 
 /***************************************
 ** DEFINITIONS
@@ -457,6 +458,31 @@ bold-standout   use extra bright or bold with standout mode"),
 			&tui_setlist, &tui_showlist);
 }
 
+/* This is called from the main event loop after we catch SIGWINCH */
+void
+tui_handle_resize (void *signal)
+{
+  char cmd[50];
+  int col, row;
+  if (tui_active)
+    {
+      tui_resize_all ();
+      tui_refresh_all_win ();
+      xsnprintf (cmd, sizeof (cmd), "set width %d", TUI_CMD_WIN->generic.width);
+      execute_command (cmd, 0);
+      xsnprintf (cmd, sizeof (cmd), "set height %d", TUI_CMD_WIN->generic.height);
+      execute_command (cmd, 0);
+    }
+  else
+    {
+      rl_get_screen_size (&row, &col);
+      xsnprintf (cmd, sizeof (cmd), "set width %d", col);
+      execute_command (cmd, 0);
+      xsnprintf (cmd, sizeof (cmd), "set height %d", row);
+      execute_command (cmd, 0);
+    }
+}
+
 /* Update gdb's knowledge of the terminal size.  */
 void
 tui_update_gdb_sizes (void)
@@ -670,7 +696,7 @@ tui_resize_all (void)
 
 #ifdef HAVE_RESIZE_TERM
       resize_term (screenheight, screenwidth);
-#endif      
+#endif
       /* Turn keypad off while we resize.  */
       if (win_with_focus != TUI_CMD_WIN)
 	keypad (TUI_CMD_WIN->generic.handle, FALSE);
@@ -818,9 +844,13 @@ tui_resize_all (void)
 static void
 tui_sigwinch_handler (int signal)
 {
-  /* Say that a resize was done so that the readline can do it later
-     when appropriate.  */
-  tui_set_win_resized_to (TRUE);
+  /* Say that a resize was done so that the we can update
+     the UI when appropriate. */
+  struct tui_translate data;
+  data.value = signal;
+  rl_cleanup_after_signal ();
+  rl_resize_terminal ();
+  mark_async_signal_handler (create_async_signal_handler (tui_handle_resize, &data));
 }
 #endif
 
diff --git a/gdb/utils.c b/gdb/utils.c
index 3915b58..ae0342a 100644
--- a/gdb/utils.c
+++ b/gdb/utils.c
@@ -1686,6 +1686,8 @@ init_page_info (void)
       chars_per_line = cols;
 #else
       /* Make sure Readline has initialized its terminal settings.  */
+      rl_change_environment = 0;
+      rl_prefer_env_winsize = 0;
       rl_reset_terminal (NULL);
 
       /* Get the screen size from Readline.  */
@@ -1775,8 +1777,9 @@ set_screen_size (void)
   if (cols <= 0)
     cols = INT_MAX;
 
-  /* Update Readline's idea of the terminal size.  */
-  rl_set_screen_size (rows, cols);
+  /* Don't update with tui active or it will be too large */
+  if (!tui_active)
+      rl_set_screen_size (rows, cols);
 }
 
 /* Reinitialize WRAP_BUFFER according to the current value of

^ permalink raw reply	[flat|nested] 25+ messages in thread

* [PATCH] [PR gdb/16762 gdb/15958] Fixes for properly resizing TUI
@ 2014-10-09 15:57 CustaiCo
  0 siblings, 0 replies; 25+ messages in thread
From: CustaiCo @ 2014-10-09 15:57 UTC (permalink / raw)
  To: gdb-patches

[-- Attachment #1: Type: text/plain, Size: 2445 bytes --]

This patch is to fix Bug 16762 - GDB doesn't update display size when host
terminal resize, and it inadvertently fixes Bug 15958 - readline modifies
env (LINES+COLUMNS) as well.

Before it was getting it's size data from curses, but curses is not
available to the readline based interface, so things would get out of sync.
The readline based interface had no way at all to know if there had been
any changes to the size of the window. 

I have changed it so that both the sides use the same callback function. The
event handler has been changed to call some clean up operations that
readlines needs and then puts in a request to call the resize function in 
the main event loop on the next pass. It does change a couple new parameters
that readline 6.3 introduces, rl_change_environment and rl_prefer_env_winsize
They make it so readline does not set ROWS or COLUMNS in the environment,
and seems to be suggested by the ncurses FAQ [1]. The previous method
that handedled resizing after getting input from curses, along with some
support code, has been removed.

The only problem I am aware of with this patch is that until the first
character is typed after resizing in curses mode, you do not see
the contents of the command window. This seems to have no impact on any
other function. Resizing with, without, or any number of switches in
between curses and readline modes were unable to produce a out of sync
size report for me. Without the patch, any resize operation shrinks the
size of the command portion of the window to 3 lines, which is retained
as the full height of the screen in readline mode until you exit the 
session.

I see no regressions in the test suite, even though this isn't the
sort of issue that automated testing is very good at.

CustaiCo

[1] http://invisible-island.net/ncurses/ncurses.faq.html#handle_resize

                === gdb Summary ===

# of expected passes            28624
# of unexpected failures        98
# of unexpected successes       1
# of expected failures          58
# of known failures             55
# of unresolved testcases       12
# of untested testcases         46
# of unsupported tests          184

---
 gdb/ChangeLog      | 14 ++++++++++++++
 gdb/tui/tui-data.c | 16 ----------------
 gdb/tui/tui-io.c   | 21 ---------------------
 gdb/tui/tui-win.c  | 40 +++++++++++++++++++++++++++++++++++-----
 gdb/utils.c        |  7 +++++--
 5 files changed, 54 insertions(+), 44 deletions(-)


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Fixes-issue-gdb-16762-and-gdb-15958.patch --]
[-- Type: text/x-patch; name="0001-Fixes-issue-gdb-16762-and-gdb-15958.patch", Size: 5560 bytes --]

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index ee82f1f..73be21b 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,17 @@
+2014-10-09  CustaiCo  <custaico@openmailbox.org>
+
+	PR gdb/16762
+	PR gdb/15958
+	* tui/tui-win.c: Changed the signal handling code to use the main
+	event loop.
+	* tui/tui-io.c: tui_handle_resize_during_io is not needed. The main
+	event loop handles the call back to resized the windows.
+	* tui/tui-data.c: Support methods for tui_handle_resize_during_io
+	removed.
+	* utils.c: Set new option in latest readline to prevent
+	environment from being changed. Also changed to not incorrectly resize
+	window when tui running.
+
 2014-10-09  Yao Qi  <yao@codesourcery.com>
 
 	* infrun.c (handle_signal_stop): Remove local variable
diff --git a/gdb/tui/tui-data.c b/gdb/tui/tui-data.c
index 7e51b3e..06ea29b 100644
--- a/gdb/tui/tui-data.c
+++ b/gdb/tui/tui-data.c
@@ -98,22 +98,6 @@ tui_set_win_highlight (struct tui_win_info *win_info,
 ** ACCESSORS & MUTATORS FOR PRIVATE DATA
 ******************************************/
 
-/* Answer a whether the terminal window has been resized or not.  */
-int
-tui_win_resized (void)
-{
-  return win_resized;
-}
-
-
-/* Set a whether the terminal window has been resized or not.  */
-void
-tui_set_win_resized_to (int resized)
-{
-  win_resized = resized;
-}
-
-
 /* Answer a pointer to the current layout definition.  */
 struct tui_layout_def *
 tui_layout_def (void)
diff --git a/gdb/tui/tui-io.c b/gdb/tui/tui-io.c
index 601d278..4c7fca8 100644
--- a/gdb/tui/tui-io.c
+++ b/gdb/tui/tui-io.c
@@ -146,8 +146,6 @@ static int tui_readline_pipe[2];
    This may be the main gdb prompt or a secondary prompt.  */
 static char *tui_rl_saved_prompt;
 
-static unsigned int tui_handle_resize_during_io (unsigned int);
-
 static void
 tui_putc (char c)
 {
@@ -653,7 +651,6 @@ tui_getc (FILE *fp)
 #endif
 
   ch = wgetch (w);
-  ch = tui_handle_resize_during_io (ch);
 
   /* The \n must be echoed because it will not be printed by
      readline.  */
@@ -694,21 +691,3 @@ tui_getc (FILE *fp)
   
   return ch;
 }
-
-
-/* Cleanup when a resize has occured.
-   Returns the character that must be processed.  */
-static unsigned int
-tui_handle_resize_during_io (unsigned int original_ch)
-{
-  if (tui_win_resized ())
-    {
-      tui_resize_all ();
-      tui_refresh_all_win ();
-      dont_repeat ();
-      tui_set_win_resized_to (FALSE);
-      return '\n';
-    }
-  else
-    return original_ch;
-}
diff --git a/gdb/tui/tui-win.c b/gdb/tui/tui-win.c
index 9c7a23f..095097a 100644
--- a/gdb/tui/tui-win.c
+++ b/gdb/tui/tui-win.c
@@ -29,6 +29,7 @@
 #include "symtab.h"
 #include "breakpoint.h"
 #include "frame.h"
+#include "event-loop.h"
 #include "cli/cli-cmds.h"
 #include "top.h"
 #include "source.h"
@@ -72,7 +73,7 @@ static void tui_scroll_right_command (char *, int);
 static void parse_scrolling_args (char *, 
 				  struct tui_win_info **, 
 				  int *);
-
+static void tui_handle_resize (void *);
 
 /***************************************
 ** DEFINITIONS
@@ -457,6 +458,31 @@ bold-standout   use extra bright or bold with standout mode"),
 			&tui_setlist, &tui_showlist);
 }
 
+/* This is called from the main event loop after we catch SIGWINCH */
+void
+tui_handle_resize (void *signal)
+{
+  char cmd[50];
+  int col, row;
+  if (tui_active)
+    {
+      tui_resize_all ();
+      tui_refresh_all_win ();
+      xsnprintf (cmd, sizeof (cmd), "set width %d", TUI_CMD_WIN->generic.width);
+      execute_command (cmd, 0);
+      xsnprintf (cmd, sizeof (cmd), "set height %d", TUI_CMD_WIN->generic.height);
+      execute_command (cmd, 0);
+    }
+  else
+    {
+      rl_get_screen_size (&row, &col);
+      xsnprintf (cmd, sizeof (cmd), "set width %d", col);
+      execute_command (cmd, 0);
+      xsnprintf (cmd, sizeof (cmd), "set height %d", row);
+      execute_command (cmd, 0);
+    }
+}
+
 /* Update gdb's knowledge of the terminal size.  */
 void
 tui_update_gdb_sizes (void)
@@ -670,7 +696,7 @@ tui_resize_all (void)
 
 #ifdef HAVE_RESIZE_TERM
       resize_term (screenheight, screenwidth);
-#endif      
+#endif
       /* Turn keypad off while we resize.  */
       if (win_with_focus != TUI_CMD_WIN)
 	keypad (TUI_CMD_WIN->generic.handle, FALSE);
@@ -818,9 +844,13 @@ tui_resize_all (void)
 static void
 tui_sigwinch_handler (int signal)
 {
-  /* Say that a resize was done so that the readline can do it later
-     when appropriate.  */
-  tui_set_win_resized_to (TRUE);
+  /* Say that a resize was done so that the we can update
+     the UI when appropriate. */
+  struct tui_translate data;
+  data.value = signal;
+  rl_cleanup_after_signal ();
+  rl_resize_terminal ();
+  mark_async_signal_handler (create_async_signal_handler (tui_handle_resize, &data));
 }
 #endif
 
diff --git a/gdb/utils.c b/gdb/utils.c
index 3915b58..ae0342a 100644
--- a/gdb/utils.c
+++ b/gdb/utils.c
@@ -1686,6 +1686,8 @@ init_page_info (void)
       chars_per_line = cols;
 #else
       /* Make sure Readline has initialized its terminal settings.  */
+      rl_change_environment = 0;
+      rl_prefer_env_winsize = 0;
       rl_reset_terminal (NULL);
 
       /* Get the screen size from Readline.  */
@@ -1775,8 +1777,9 @@ set_screen_size (void)
   if (cols <= 0)
     cols = INT_MAX;
 
-  /* Update Readline's idea of the terminal size.  */
-  rl_set_screen_size (rows, cols);
+  /* Don't update with tui active or it will be too large */
+  if (!tui_active)
+      rl_set_screen_size (rows, cols);
 }
 
 /* Reinitialize WRAP_BUFFER according to the current value of

^ permalink raw reply	[flat|nested] 25+ messages in thread

* [PATCH] [PR gdb/16762 gdb/15958] Fixes for properly resizing TUI
@ 2014-10-09 15:57 CustaiCo
  0 siblings, 0 replies; 25+ messages in thread
From: CustaiCo @ 2014-10-09 15:57 UTC (permalink / raw)
  To: gdb-patches

[-- Attachment #1: Type: text/plain, Size: 2445 bytes --]

This patch is to fix Bug 16762 - GDB doesn't update display size when host
terminal resize, and it inadvertently fixes Bug 15958 - readline modifies
env (LINES+COLUMNS) as well.

Before it was getting it's size data from curses, but curses is not
available to the readline based interface, so things would get out of sync.
The readline based interface had no way at all to know if there had been
any changes to the size of the window. 

I have changed it so that both the sides use the same callback function. The
event handler has been changed to call some clean up operations that
readlines needs and then puts in a request to call the resize function in 
the main event loop on the next pass. It does change a couple new parameters
that readline 6.3 introduces, rl_change_environment and rl_prefer_env_winsize
They make it so readline does not set ROWS or COLUMNS in the environment,
and seems to be suggested by the ncurses FAQ [1]. The previous method
that handedled resizing after getting input from curses, along with some
support code, has been removed.

The only problem I am aware of with this patch is that until the first
character is typed after resizing in curses mode, you do not see
the contents of the command window. This seems to have no impact on any
other function. Resizing with, without, or any number of switches in
between curses and readline modes were unable to produce a out of sync
size report for me. Without the patch, any resize operation shrinks the
size of the command portion of the window to 3 lines, which is retained
as the full height of the screen in readline mode until you exit the 
session.

I see no regressions in the test suite, even though this isn't the
sort of issue that automated testing is very good at.

CustaiCo

[1] http://invisible-island.net/ncurses/ncurses.faq.html#handle_resize

                === gdb Summary ===

# of expected passes            28624
# of unexpected failures        98
# of unexpected successes       1
# of expected failures          58
# of known failures             55
# of unresolved testcases       12
# of untested testcases         46
# of unsupported tests          184

---
 gdb/ChangeLog      | 14 ++++++++++++++
 gdb/tui/tui-data.c | 16 ----------------
 gdb/tui/tui-io.c   | 21 ---------------------
 gdb/tui/tui-win.c  | 40 +++++++++++++++++++++++++++++++++++-----
 gdb/utils.c        |  7 +++++--
 5 files changed, 54 insertions(+), 44 deletions(-)


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Fixes-issue-gdb-16762-and-gdb-15958.patch --]
[-- Type: text/x-patch; name="0001-Fixes-issue-gdb-16762-and-gdb-15958.patch", Size: 5560 bytes --]

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index ee82f1f..73be21b 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,17 @@
+2014-10-09  CustaiCo  <custaico@openmailbox.org>
+
+	PR gdb/16762
+	PR gdb/15958
+	* tui/tui-win.c: Changed the signal handling code to use the main
+	event loop.
+	* tui/tui-io.c: tui_handle_resize_during_io is not needed. The main
+	event loop handles the call back to resized the windows.
+	* tui/tui-data.c: Support methods for tui_handle_resize_during_io
+	removed.
+	* utils.c: Set new option in latest readline to prevent
+	environment from being changed. Also changed to not incorrectly resize
+	window when tui running.
+
 2014-10-09  Yao Qi  <yao@codesourcery.com>
 
 	* infrun.c (handle_signal_stop): Remove local variable
diff --git a/gdb/tui/tui-data.c b/gdb/tui/tui-data.c
index 7e51b3e..06ea29b 100644
--- a/gdb/tui/tui-data.c
+++ b/gdb/tui/tui-data.c
@@ -98,22 +98,6 @@ tui_set_win_highlight (struct tui_win_info *win_info,
 ** ACCESSORS & MUTATORS FOR PRIVATE DATA
 ******************************************/
 
-/* Answer a whether the terminal window has been resized or not.  */
-int
-tui_win_resized (void)
-{
-  return win_resized;
-}
-
-
-/* Set a whether the terminal window has been resized or not.  */
-void
-tui_set_win_resized_to (int resized)
-{
-  win_resized = resized;
-}
-
-
 /* Answer a pointer to the current layout definition.  */
 struct tui_layout_def *
 tui_layout_def (void)
diff --git a/gdb/tui/tui-io.c b/gdb/tui/tui-io.c
index 601d278..4c7fca8 100644
--- a/gdb/tui/tui-io.c
+++ b/gdb/tui/tui-io.c
@@ -146,8 +146,6 @@ static int tui_readline_pipe[2];
    This may be the main gdb prompt or a secondary prompt.  */
 static char *tui_rl_saved_prompt;
 
-static unsigned int tui_handle_resize_during_io (unsigned int);
-
 static void
 tui_putc (char c)
 {
@@ -653,7 +651,6 @@ tui_getc (FILE *fp)
 #endif
 
   ch = wgetch (w);
-  ch = tui_handle_resize_during_io (ch);
 
   /* The \n must be echoed because it will not be printed by
      readline.  */
@@ -694,21 +691,3 @@ tui_getc (FILE *fp)
   
   return ch;
 }
-
-
-/* Cleanup when a resize has occured.
-   Returns the character that must be processed.  */
-static unsigned int
-tui_handle_resize_during_io (unsigned int original_ch)
-{
-  if (tui_win_resized ())
-    {
-      tui_resize_all ();
-      tui_refresh_all_win ();
-      dont_repeat ();
-      tui_set_win_resized_to (FALSE);
-      return '\n';
-    }
-  else
-    return original_ch;
-}
diff --git a/gdb/tui/tui-win.c b/gdb/tui/tui-win.c
index 9c7a23f..095097a 100644
--- a/gdb/tui/tui-win.c
+++ b/gdb/tui/tui-win.c
@@ -29,6 +29,7 @@
 #include "symtab.h"
 #include "breakpoint.h"
 #include "frame.h"
+#include "event-loop.h"
 #include "cli/cli-cmds.h"
 #include "top.h"
 #include "source.h"
@@ -72,7 +73,7 @@ static void tui_scroll_right_command (char *, int);
 static void parse_scrolling_args (char *, 
 				  struct tui_win_info **, 
 				  int *);
-
+static void tui_handle_resize (void *);
 
 /***************************************
 ** DEFINITIONS
@@ -457,6 +458,31 @@ bold-standout   use extra bright or bold with standout mode"),
 			&tui_setlist, &tui_showlist);
 }
 
+/* This is called from the main event loop after we catch SIGWINCH */
+void
+tui_handle_resize (void *signal)
+{
+  char cmd[50];
+  int col, row;
+  if (tui_active)
+    {
+      tui_resize_all ();
+      tui_refresh_all_win ();
+      xsnprintf (cmd, sizeof (cmd), "set width %d", TUI_CMD_WIN->generic.width);
+      execute_command (cmd, 0);
+      xsnprintf (cmd, sizeof (cmd), "set height %d", TUI_CMD_WIN->generic.height);
+      execute_command (cmd, 0);
+    }
+  else
+    {
+      rl_get_screen_size (&row, &col);
+      xsnprintf (cmd, sizeof (cmd), "set width %d", col);
+      execute_command (cmd, 0);
+      xsnprintf (cmd, sizeof (cmd), "set height %d", row);
+      execute_command (cmd, 0);
+    }
+}
+
 /* Update gdb's knowledge of the terminal size.  */
 void
 tui_update_gdb_sizes (void)
@@ -670,7 +696,7 @@ tui_resize_all (void)
 
 #ifdef HAVE_RESIZE_TERM
       resize_term (screenheight, screenwidth);
-#endif      
+#endif
       /* Turn keypad off while we resize.  */
       if (win_with_focus != TUI_CMD_WIN)
 	keypad (TUI_CMD_WIN->generic.handle, FALSE);
@@ -818,9 +844,13 @@ tui_resize_all (void)
 static void
 tui_sigwinch_handler (int signal)
 {
-  /* Say that a resize was done so that the readline can do it later
-     when appropriate.  */
-  tui_set_win_resized_to (TRUE);
+  /* Say that a resize was done so that the we can update
+     the UI when appropriate. */
+  struct tui_translate data;
+  data.value = signal;
+  rl_cleanup_after_signal ();
+  rl_resize_terminal ();
+  mark_async_signal_handler (create_async_signal_handler (tui_handle_resize, &data));
 }
 #endif
 
diff --git a/gdb/utils.c b/gdb/utils.c
index 3915b58..ae0342a 100644
--- a/gdb/utils.c
+++ b/gdb/utils.c
@@ -1686,6 +1686,8 @@ init_page_info (void)
       chars_per_line = cols;
 #else
       /* Make sure Readline has initialized its terminal settings.  */
+      rl_change_environment = 0;
+      rl_prefer_env_winsize = 0;
       rl_reset_terminal (NULL);
 
       /* Get the screen size from Readline.  */
@@ -1775,8 +1777,9 @@ set_screen_size (void)
   if (cols <= 0)
     cols = INT_MAX;
 
-  /* Update Readline's idea of the terminal size.  */
-  rl_set_screen_size (rows, cols);
+  /* Don't update with tui active or it will be too large */
+  if (!tui_active)
+      rl_set_screen_size (rows, cols);
 }
 
 /* Reinitialize WRAP_BUFFER according to the current value of

^ permalink raw reply	[flat|nested] 25+ messages in thread

* [PATCH] [PR gdb/16762 gdb/15958] Fixes for properly resizing TUI
@ 2014-10-09 15:57 CustaiCo
  0 siblings, 0 replies; 25+ messages in thread
From: CustaiCo @ 2014-10-09 15:57 UTC (permalink / raw)
  To: gdb-patches

[-- Attachment #1: Type: text/plain, Size: 2445 bytes --]

This patch is to fix Bug 16762 - GDB doesn't update display size when host
terminal resize, and it inadvertently fixes Bug 15958 - readline modifies
env (LINES+COLUMNS) as well.

Before it was getting it's size data from curses, but curses is not
available to the readline based interface, so things would get out of sync.
The readline based interface had no way at all to know if there had been
any changes to the size of the window. 

I have changed it so that both the sides use the same callback function. The
event handler has been changed to call some clean up operations that
readlines needs and then puts in a request to call the resize function in 
the main event loop on the next pass. It does change a couple new parameters
that readline 6.3 introduces, rl_change_environment and rl_prefer_env_winsize
They make it so readline does not set ROWS or COLUMNS in the environment,
and seems to be suggested by the ncurses FAQ [1]. The previous method
that handedled resizing after getting input from curses, along with some
support code, has been removed.

The only problem I am aware of with this patch is that until the first
character is typed after resizing in curses mode, you do not see
the contents of the command window. This seems to have no impact on any
other function. Resizing with, without, or any number of switches in
between curses and readline modes were unable to produce a out of sync
size report for me. Without the patch, any resize operation shrinks the
size of the command portion of the window to 3 lines, which is retained
as the full height of the screen in readline mode until you exit the 
session.

I see no regressions in the test suite, even though this isn't the
sort of issue that automated testing is very good at.

CustaiCo

[1] http://invisible-island.net/ncurses/ncurses.faq.html#handle_resize

                === gdb Summary ===

# of expected passes            28624
# of unexpected failures        98
# of unexpected successes       1
# of expected failures          58
# of known failures             55
# of unresolved testcases       12
# of untested testcases         46
# of unsupported tests          184

---
 gdb/ChangeLog      | 14 ++++++++++++++
 gdb/tui/tui-data.c | 16 ----------------
 gdb/tui/tui-io.c   | 21 ---------------------
 gdb/tui/tui-win.c  | 40 +++++++++++++++++++++++++++++++++++-----
 gdb/utils.c        |  7 +++++--
 5 files changed, 54 insertions(+), 44 deletions(-)


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Fixes-issue-gdb-16762-and-gdb-15958.patch --]
[-- Type: text/x-patch; name="0001-Fixes-issue-gdb-16762-and-gdb-15958.patch", Size: 5560 bytes --]

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index ee82f1f..73be21b 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,17 @@
+2014-10-09  CustaiCo  <custaico@openmailbox.org>
+
+	PR gdb/16762
+	PR gdb/15958
+	* tui/tui-win.c: Changed the signal handling code to use the main
+	event loop.
+	* tui/tui-io.c: tui_handle_resize_during_io is not needed. The main
+	event loop handles the call back to resized the windows.
+	* tui/tui-data.c: Support methods for tui_handle_resize_during_io
+	removed.
+	* utils.c: Set new option in latest readline to prevent
+	environment from being changed. Also changed to not incorrectly resize
+	window when tui running.
+
 2014-10-09  Yao Qi  <yao@codesourcery.com>
 
 	* infrun.c (handle_signal_stop): Remove local variable
diff --git a/gdb/tui/tui-data.c b/gdb/tui/tui-data.c
index 7e51b3e..06ea29b 100644
--- a/gdb/tui/tui-data.c
+++ b/gdb/tui/tui-data.c
@@ -98,22 +98,6 @@ tui_set_win_highlight (struct tui_win_info *win_info,
 ** ACCESSORS & MUTATORS FOR PRIVATE DATA
 ******************************************/
 
-/* Answer a whether the terminal window has been resized or not.  */
-int
-tui_win_resized (void)
-{
-  return win_resized;
-}
-
-
-/* Set a whether the terminal window has been resized or not.  */
-void
-tui_set_win_resized_to (int resized)
-{
-  win_resized = resized;
-}
-
-
 /* Answer a pointer to the current layout definition.  */
 struct tui_layout_def *
 tui_layout_def (void)
diff --git a/gdb/tui/tui-io.c b/gdb/tui/tui-io.c
index 601d278..4c7fca8 100644
--- a/gdb/tui/tui-io.c
+++ b/gdb/tui/tui-io.c
@@ -146,8 +146,6 @@ static int tui_readline_pipe[2];
    This may be the main gdb prompt or a secondary prompt.  */
 static char *tui_rl_saved_prompt;
 
-static unsigned int tui_handle_resize_during_io (unsigned int);
-
 static void
 tui_putc (char c)
 {
@@ -653,7 +651,6 @@ tui_getc (FILE *fp)
 #endif
 
   ch = wgetch (w);
-  ch = tui_handle_resize_during_io (ch);
 
   /* The \n must be echoed because it will not be printed by
      readline.  */
@@ -694,21 +691,3 @@ tui_getc (FILE *fp)
   
   return ch;
 }
-
-
-/* Cleanup when a resize has occured.
-   Returns the character that must be processed.  */
-static unsigned int
-tui_handle_resize_during_io (unsigned int original_ch)
-{
-  if (tui_win_resized ())
-    {
-      tui_resize_all ();
-      tui_refresh_all_win ();
-      dont_repeat ();
-      tui_set_win_resized_to (FALSE);
-      return '\n';
-    }
-  else
-    return original_ch;
-}
diff --git a/gdb/tui/tui-win.c b/gdb/tui/tui-win.c
index 9c7a23f..095097a 100644
--- a/gdb/tui/tui-win.c
+++ b/gdb/tui/tui-win.c
@@ -29,6 +29,7 @@
 #include "symtab.h"
 #include "breakpoint.h"
 #include "frame.h"
+#include "event-loop.h"
 #include "cli/cli-cmds.h"
 #include "top.h"
 #include "source.h"
@@ -72,7 +73,7 @@ static void tui_scroll_right_command (char *, int);
 static void parse_scrolling_args (char *, 
 				  struct tui_win_info **, 
 				  int *);
-
+static void tui_handle_resize (void *);
 
 /***************************************
 ** DEFINITIONS
@@ -457,6 +458,31 @@ bold-standout   use extra bright or bold with standout mode"),
 			&tui_setlist, &tui_showlist);
 }
 
+/* This is called from the main event loop after we catch SIGWINCH */
+void
+tui_handle_resize (void *signal)
+{
+  char cmd[50];
+  int col, row;
+  if (tui_active)
+    {
+      tui_resize_all ();
+      tui_refresh_all_win ();
+      xsnprintf (cmd, sizeof (cmd), "set width %d", TUI_CMD_WIN->generic.width);
+      execute_command (cmd, 0);
+      xsnprintf (cmd, sizeof (cmd), "set height %d", TUI_CMD_WIN->generic.height);
+      execute_command (cmd, 0);
+    }
+  else
+    {
+      rl_get_screen_size (&row, &col);
+      xsnprintf (cmd, sizeof (cmd), "set width %d", col);
+      execute_command (cmd, 0);
+      xsnprintf (cmd, sizeof (cmd), "set height %d", row);
+      execute_command (cmd, 0);
+    }
+}
+
 /* Update gdb's knowledge of the terminal size.  */
 void
 tui_update_gdb_sizes (void)
@@ -670,7 +696,7 @@ tui_resize_all (void)
 
 #ifdef HAVE_RESIZE_TERM
       resize_term (screenheight, screenwidth);
-#endif      
+#endif
       /* Turn keypad off while we resize.  */
       if (win_with_focus != TUI_CMD_WIN)
 	keypad (TUI_CMD_WIN->generic.handle, FALSE);
@@ -818,9 +844,13 @@ tui_resize_all (void)
 static void
 tui_sigwinch_handler (int signal)
 {
-  /* Say that a resize was done so that the readline can do it later
-     when appropriate.  */
-  tui_set_win_resized_to (TRUE);
+  /* Say that a resize was done so that the we can update
+     the UI when appropriate. */
+  struct tui_translate data;
+  data.value = signal;
+  rl_cleanup_after_signal ();
+  rl_resize_terminal ();
+  mark_async_signal_handler (create_async_signal_handler (tui_handle_resize, &data));
 }
 #endif
 
diff --git a/gdb/utils.c b/gdb/utils.c
index 3915b58..ae0342a 100644
--- a/gdb/utils.c
+++ b/gdb/utils.c
@@ -1686,6 +1686,8 @@ init_page_info (void)
       chars_per_line = cols;
 #else
       /* Make sure Readline has initialized its terminal settings.  */
+      rl_change_environment = 0;
+      rl_prefer_env_winsize = 0;
       rl_reset_terminal (NULL);
 
       /* Get the screen size from Readline.  */
@@ -1775,8 +1777,9 @@ set_screen_size (void)
   if (cols <= 0)
     cols = INT_MAX;
 
-  /* Update Readline's idea of the terminal size.  */
-  rl_set_screen_size (rows, cols);
+  /* Don't update with tui active or it will be too large */
+  if (!tui_active)
+      rl_set_screen_size (rows, cols);
 }
 
 /* Reinitialize WRAP_BUFFER according to the current value of

^ permalink raw reply	[flat|nested] 25+ messages in thread

* [PATCH] [PR gdb/16762 gdb/15958] Fixes for properly resizing TUI
@ 2014-10-09 15:57 CustaiCo
  0 siblings, 0 replies; 25+ messages in thread
From: CustaiCo @ 2014-10-09 15:57 UTC (permalink / raw)
  To: gdb-patches

[-- Attachment #1: Type: text/plain, Size: 2445 bytes --]

This patch is to fix Bug 16762 - GDB doesn't update display size when host
terminal resize, and it inadvertently fixes Bug 15958 - readline modifies
env (LINES+COLUMNS) as well.

Before it was getting it's size data from curses, but curses is not
available to the readline based interface, so things would get out of sync.
The readline based interface had no way at all to know if there had been
any changes to the size of the window. 

I have changed it so that both the sides use the same callback function. The
event handler has been changed to call some clean up operations that
readlines needs and then puts in a request to call the resize function in 
the main event loop on the next pass. It does change a couple new parameters
that readline 6.3 introduces, rl_change_environment and rl_prefer_env_winsize
They make it so readline does not set ROWS or COLUMNS in the environment,
and seems to be suggested by the ncurses FAQ [1]. The previous method
that handedled resizing after getting input from curses, along with some
support code, has been removed.

The only problem I am aware of with this patch is that until the first
character is typed after resizing in curses mode, you do not see
the contents of the command window. This seems to have no impact on any
other function. Resizing with, without, or any number of switches in
between curses and readline modes were unable to produce a out of sync
size report for me. Without the patch, any resize operation shrinks the
size of the command portion of the window to 3 lines, which is retained
as the full height of the screen in readline mode until you exit the 
session.

I see no regressions in the test suite, even though this isn't the
sort of issue that automated testing is very good at.

CustaiCo

[1] http://invisible-island.net/ncurses/ncurses.faq.html#handle_resize

                === gdb Summary ===

# of expected passes            28624
# of unexpected failures        98
# of unexpected successes       1
# of expected failures          58
# of known failures             55
# of unresolved testcases       12
# of untested testcases         46
# of unsupported tests          184

---
 gdb/ChangeLog      | 14 ++++++++++++++
 gdb/tui/tui-data.c | 16 ----------------
 gdb/tui/tui-io.c   | 21 ---------------------
 gdb/tui/tui-win.c  | 40 +++++++++++++++++++++++++++++++++++-----
 gdb/utils.c        |  7 +++++--
 5 files changed, 54 insertions(+), 44 deletions(-)


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Fixes-issue-gdb-16762-and-gdb-15958.patch --]
[-- Type: text/x-patch; name="0001-Fixes-issue-gdb-16762-and-gdb-15958.patch", Size: 5560 bytes --]

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index ee82f1f..73be21b 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,17 @@
+2014-10-09  CustaiCo  <custaico@openmailbox.org>
+
+	PR gdb/16762
+	PR gdb/15958
+	* tui/tui-win.c: Changed the signal handling code to use the main
+	event loop.
+	* tui/tui-io.c: tui_handle_resize_during_io is not needed. The main
+	event loop handles the call back to resized the windows.
+	* tui/tui-data.c: Support methods for tui_handle_resize_during_io
+	removed.
+	* utils.c: Set new option in latest readline to prevent
+	environment from being changed. Also changed to not incorrectly resize
+	window when tui running.
+
 2014-10-09  Yao Qi  <yao@codesourcery.com>
 
 	* infrun.c (handle_signal_stop): Remove local variable
diff --git a/gdb/tui/tui-data.c b/gdb/tui/tui-data.c
index 7e51b3e..06ea29b 100644
--- a/gdb/tui/tui-data.c
+++ b/gdb/tui/tui-data.c
@@ -98,22 +98,6 @@ tui_set_win_highlight (struct tui_win_info *win_info,
 ** ACCESSORS & MUTATORS FOR PRIVATE DATA
 ******************************************/
 
-/* Answer a whether the terminal window has been resized or not.  */
-int
-tui_win_resized (void)
-{
-  return win_resized;
-}
-
-
-/* Set a whether the terminal window has been resized or not.  */
-void
-tui_set_win_resized_to (int resized)
-{
-  win_resized = resized;
-}
-
-
 /* Answer a pointer to the current layout definition.  */
 struct tui_layout_def *
 tui_layout_def (void)
diff --git a/gdb/tui/tui-io.c b/gdb/tui/tui-io.c
index 601d278..4c7fca8 100644
--- a/gdb/tui/tui-io.c
+++ b/gdb/tui/tui-io.c
@@ -146,8 +146,6 @@ static int tui_readline_pipe[2];
    This may be the main gdb prompt or a secondary prompt.  */
 static char *tui_rl_saved_prompt;
 
-static unsigned int tui_handle_resize_during_io (unsigned int);
-
 static void
 tui_putc (char c)
 {
@@ -653,7 +651,6 @@ tui_getc (FILE *fp)
 #endif
 
   ch = wgetch (w);
-  ch = tui_handle_resize_during_io (ch);
 
   /* The \n must be echoed because it will not be printed by
      readline.  */
@@ -694,21 +691,3 @@ tui_getc (FILE *fp)
   
   return ch;
 }
-
-
-/* Cleanup when a resize has occured.
-   Returns the character that must be processed.  */
-static unsigned int
-tui_handle_resize_during_io (unsigned int original_ch)
-{
-  if (tui_win_resized ())
-    {
-      tui_resize_all ();
-      tui_refresh_all_win ();
-      dont_repeat ();
-      tui_set_win_resized_to (FALSE);
-      return '\n';
-    }
-  else
-    return original_ch;
-}
diff --git a/gdb/tui/tui-win.c b/gdb/tui/tui-win.c
index 9c7a23f..095097a 100644
--- a/gdb/tui/tui-win.c
+++ b/gdb/tui/tui-win.c
@@ -29,6 +29,7 @@
 #include "symtab.h"
 #include "breakpoint.h"
 #include "frame.h"
+#include "event-loop.h"
 #include "cli/cli-cmds.h"
 #include "top.h"
 #include "source.h"
@@ -72,7 +73,7 @@ static void tui_scroll_right_command (char *, int);
 static void parse_scrolling_args (char *, 
 				  struct tui_win_info **, 
 				  int *);
-
+static void tui_handle_resize (void *);
 
 /***************************************
 ** DEFINITIONS
@@ -457,6 +458,31 @@ bold-standout   use extra bright or bold with standout mode"),
 			&tui_setlist, &tui_showlist);
 }
 
+/* This is called from the main event loop after we catch SIGWINCH */
+void
+tui_handle_resize (void *signal)
+{
+  char cmd[50];
+  int col, row;
+  if (tui_active)
+    {
+      tui_resize_all ();
+      tui_refresh_all_win ();
+      xsnprintf (cmd, sizeof (cmd), "set width %d", TUI_CMD_WIN->generic.width);
+      execute_command (cmd, 0);
+      xsnprintf (cmd, sizeof (cmd), "set height %d", TUI_CMD_WIN->generic.height);
+      execute_command (cmd, 0);
+    }
+  else
+    {
+      rl_get_screen_size (&row, &col);
+      xsnprintf (cmd, sizeof (cmd), "set width %d", col);
+      execute_command (cmd, 0);
+      xsnprintf (cmd, sizeof (cmd), "set height %d", row);
+      execute_command (cmd, 0);
+    }
+}
+
 /* Update gdb's knowledge of the terminal size.  */
 void
 tui_update_gdb_sizes (void)
@@ -670,7 +696,7 @@ tui_resize_all (void)
 
 #ifdef HAVE_RESIZE_TERM
       resize_term (screenheight, screenwidth);
-#endif      
+#endif
       /* Turn keypad off while we resize.  */
       if (win_with_focus != TUI_CMD_WIN)
 	keypad (TUI_CMD_WIN->generic.handle, FALSE);
@@ -818,9 +844,13 @@ tui_resize_all (void)
 static void
 tui_sigwinch_handler (int signal)
 {
-  /* Say that a resize was done so that the readline can do it later
-     when appropriate.  */
-  tui_set_win_resized_to (TRUE);
+  /* Say that a resize was done so that the we can update
+     the UI when appropriate. */
+  struct tui_translate data;
+  data.value = signal;
+  rl_cleanup_after_signal ();
+  rl_resize_terminal ();
+  mark_async_signal_handler (create_async_signal_handler (tui_handle_resize, &data));
 }
 #endif
 
diff --git a/gdb/utils.c b/gdb/utils.c
index 3915b58..ae0342a 100644
--- a/gdb/utils.c
+++ b/gdb/utils.c
@@ -1686,6 +1686,8 @@ init_page_info (void)
       chars_per_line = cols;
 #else
       /* Make sure Readline has initialized its terminal settings.  */
+      rl_change_environment = 0;
+      rl_prefer_env_winsize = 0;
       rl_reset_terminal (NULL);
 
       /* Get the screen size from Readline.  */
@@ -1775,8 +1777,9 @@ set_screen_size (void)
   if (cols <= 0)
     cols = INT_MAX;
 
-  /* Update Readline's idea of the terminal size.  */
-  rl_set_screen_size (rows, cols);
+  /* Don't update with tui active or it will be too large */
+  if (!tui_active)
+      rl_set_screen_size (rows, cols);
 }
 
 /* Reinitialize WRAP_BUFFER according to the current value of

^ permalink raw reply	[flat|nested] 25+ messages in thread

* [PATCH] [PR gdb/16762 gdb/15958] Fixes for properly resizing TUI
@ 2014-10-09 15:57 CustaiCo
  0 siblings, 0 replies; 25+ messages in thread
From: CustaiCo @ 2014-10-09 15:57 UTC (permalink / raw)
  To: gdb-patches

[-- Attachment #1: Type: text/plain, Size: 2445 bytes --]

This patch is to fix Bug 16762 - GDB doesn't update display size when host
terminal resize, and it inadvertently fixes Bug 15958 - readline modifies
env (LINES+COLUMNS) as well.

Before it was getting it's size data from curses, but curses is not
available to the readline based interface, so things would get out of sync.
The readline based interface had no way at all to know if there had been
any changes to the size of the window. 

I have changed it so that both the sides use the same callback function. The
event handler has been changed to call some clean up operations that
readlines needs and then puts in a request to call the resize function in 
the main event loop on the next pass. It does change a couple new parameters
that readline 6.3 introduces, rl_change_environment and rl_prefer_env_winsize
They make it so readline does not set ROWS or COLUMNS in the environment,
and seems to be suggested by the ncurses FAQ [1]. The previous method
that handedled resizing after getting input from curses, along with some
support code, has been removed.

The only problem I am aware of with this patch is that until the first
character is typed after resizing in curses mode, you do not see
the contents of the command window. This seems to have no impact on any
other function. Resizing with, without, or any number of switches in
between curses and readline modes were unable to produce a out of sync
size report for me. Without the patch, any resize operation shrinks the
size of the command portion of the window to 3 lines, which is retained
as the full height of the screen in readline mode until you exit the 
session.

I see no regressions in the test suite, even though this isn't the
sort of issue that automated testing is very good at.

CustaiCo

[1] http://invisible-island.net/ncurses/ncurses.faq.html#handle_resize

                === gdb Summary ===

# of expected passes            28624
# of unexpected failures        98
# of unexpected successes       1
# of expected failures          58
# of known failures             55
# of unresolved testcases       12
# of untested testcases         46
# of unsupported tests          184

---
 gdb/ChangeLog      | 14 ++++++++++++++
 gdb/tui/tui-data.c | 16 ----------------
 gdb/tui/tui-io.c   | 21 ---------------------
 gdb/tui/tui-win.c  | 40 +++++++++++++++++++++++++++++++++++-----
 gdb/utils.c        |  7 +++++--
 5 files changed, 54 insertions(+), 44 deletions(-)


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Fixes-issue-gdb-16762-and-gdb-15958.patch --]
[-- Type: text/x-patch; name="0001-Fixes-issue-gdb-16762-and-gdb-15958.patch", Size: 5560 bytes --]

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index ee82f1f..73be21b 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,17 @@
+2014-10-09  CustaiCo  <custaico@openmailbox.org>
+
+	PR gdb/16762
+	PR gdb/15958
+	* tui/tui-win.c: Changed the signal handling code to use the main
+	event loop.
+	* tui/tui-io.c: tui_handle_resize_during_io is not needed. The main
+	event loop handles the call back to resized the windows.
+	* tui/tui-data.c: Support methods for tui_handle_resize_during_io
+	removed.
+	* utils.c: Set new option in latest readline to prevent
+	environment from being changed. Also changed to not incorrectly resize
+	window when tui running.
+
 2014-10-09  Yao Qi  <yao@codesourcery.com>
 
 	* infrun.c (handle_signal_stop): Remove local variable
diff --git a/gdb/tui/tui-data.c b/gdb/tui/tui-data.c
index 7e51b3e..06ea29b 100644
--- a/gdb/tui/tui-data.c
+++ b/gdb/tui/tui-data.c
@@ -98,22 +98,6 @@ tui_set_win_highlight (struct tui_win_info *win_info,
 ** ACCESSORS & MUTATORS FOR PRIVATE DATA
 ******************************************/
 
-/* Answer a whether the terminal window has been resized or not.  */
-int
-tui_win_resized (void)
-{
-  return win_resized;
-}
-
-
-/* Set a whether the terminal window has been resized or not.  */
-void
-tui_set_win_resized_to (int resized)
-{
-  win_resized = resized;
-}
-
-
 /* Answer a pointer to the current layout definition.  */
 struct tui_layout_def *
 tui_layout_def (void)
diff --git a/gdb/tui/tui-io.c b/gdb/tui/tui-io.c
index 601d278..4c7fca8 100644
--- a/gdb/tui/tui-io.c
+++ b/gdb/tui/tui-io.c
@@ -146,8 +146,6 @@ static int tui_readline_pipe[2];
    This may be the main gdb prompt or a secondary prompt.  */
 static char *tui_rl_saved_prompt;
 
-static unsigned int tui_handle_resize_during_io (unsigned int);
-
 static void
 tui_putc (char c)
 {
@@ -653,7 +651,6 @@ tui_getc (FILE *fp)
 #endif
 
   ch = wgetch (w);
-  ch = tui_handle_resize_during_io (ch);
 
   /* The \n must be echoed because it will not be printed by
      readline.  */
@@ -694,21 +691,3 @@ tui_getc (FILE *fp)
   
   return ch;
 }
-
-
-/* Cleanup when a resize has occured.
-   Returns the character that must be processed.  */
-static unsigned int
-tui_handle_resize_during_io (unsigned int original_ch)
-{
-  if (tui_win_resized ())
-    {
-      tui_resize_all ();
-      tui_refresh_all_win ();
-      dont_repeat ();
-      tui_set_win_resized_to (FALSE);
-      return '\n';
-    }
-  else
-    return original_ch;
-}
diff --git a/gdb/tui/tui-win.c b/gdb/tui/tui-win.c
index 9c7a23f..095097a 100644
--- a/gdb/tui/tui-win.c
+++ b/gdb/tui/tui-win.c
@@ -29,6 +29,7 @@
 #include "symtab.h"
 #include "breakpoint.h"
 #include "frame.h"
+#include "event-loop.h"
 #include "cli/cli-cmds.h"
 #include "top.h"
 #include "source.h"
@@ -72,7 +73,7 @@ static void tui_scroll_right_command (char *, int);
 static void parse_scrolling_args (char *, 
 				  struct tui_win_info **, 
 				  int *);
-
+static void tui_handle_resize (void *);
 
 /***************************************
 ** DEFINITIONS
@@ -457,6 +458,31 @@ bold-standout   use extra bright or bold with standout mode"),
 			&tui_setlist, &tui_showlist);
 }
 
+/* This is called from the main event loop after we catch SIGWINCH */
+void
+tui_handle_resize (void *signal)
+{
+  char cmd[50];
+  int col, row;
+  if (tui_active)
+    {
+      tui_resize_all ();
+      tui_refresh_all_win ();
+      xsnprintf (cmd, sizeof (cmd), "set width %d", TUI_CMD_WIN->generic.width);
+      execute_command (cmd, 0);
+      xsnprintf (cmd, sizeof (cmd), "set height %d", TUI_CMD_WIN->generic.height);
+      execute_command (cmd, 0);
+    }
+  else
+    {
+      rl_get_screen_size (&row, &col);
+      xsnprintf (cmd, sizeof (cmd), "set width %d", col);
+      execute_command (cmd, 0);
+      xsnprintf (cmd, sizeof (cmd), "set height %d", row);
+      execute_command (cmd, 0);
+    }
+}
+
 /* Update gdb's knowledge of the terminal size.  */
 void
 tui_update_gdb_sizes (void)
@@ -670,7 +696,7 @@ tui_resize_all (void)
 
 #ifdef HAVE_RESIZE_TERM
       resize_term (screenheight, screenwidth);
-#endif      
+#endif
       /* Turn keypad off while we resize.  */
       if (win_with_focus != TUI_CMD_WIN)
 	keypad (TUI_CMD_WIN->generic.handle, FALSE);
@@ -818,9 +844,13 @@ tui_resize_all (void)
 static void
 tui_sigwinch_handler (int signal)
 {
-  /* Say that a resize was done so that the readline can do it later
-     when appropriate.  */
-  tui_set_win_resized_to (TRUE);
+  /* Say that a resize was done so that the we can update
+     the UI when appropriate. */
+  struct tui_translate data;
+  data.value = signal;
+  rl_cleanup_after_signal ();
+  rl_resize_terminal ();
+  mark_async_signal_handler (create_async_signal_handler (tui_handle_resize, &data));
 }
 #endif
 
diff --git a/gdb/utils.c b/gdb/utils.c
index 3915b58..ae0342a 100644
--- a/gdb/utils.c
+++ b/gdb/utils.c
@@ -1686,6 +1686,8 @@ init_page_info (void)
       chars_per_line = cols;
 #else
       /* Make sure Readline has initialized its terminal settings.  */
+      rl_change_environment = 0;
+      rl_prefer_env_winsize = 0;
       rl_reset_terminal (NULL);
 
       /* Get the screen size from Readline.  */
@@ -1775,8 +1777,9 @@ set_screen_size (void)
   if (cols <= 0)
     cols = INT_MAX;
 
-  /* Update Readline's idea of the terminal size.  */
-  rl_set_screen_size (rows, cols);
+  /* Don't update with tui active or it will be too large */
+  if (!tui_active)
+      rl_set_screen_size (rows, cols);
 }
 
 /* Reinitialize WRAP_BUFFER according to the current value of

^ permalink raw reply	[flat|nested] 25+ messages in thread

* [PATCH] [PR gdb/16762 gdb/15958] Fixes for properly resizing TUI
@ 2014-10-09 15:57 CustaiCo
  0 siblings, 0 replies; 25+ messages in thread
From: CustaiCo @ 2014-10-09 15:57 UTC (permalink / raw)
  To: gdb-patches

[-- Attachment #1: Type: text/plain, Size: 2445 bytes --]

This patch is to fix Bug 16762 - GDB doesn't update display size when host
terminal resize, and it inadvertently fixes Bug 15958 - readline modifies
env (LINES+COLUMNS) as well.

Before it was getting it's size data from curses, but curses is not
available to the readline based interface, so things would get out of sync.
The readline based interface had no way at all to know if there had been
any changes to the size of the window. 

I have changed it so that both the sides use the same callback function. The
event handler has been changed to call some clean up operations that
readlines needs and then puts in a request to call the resize function in 
the main event loop on the next pass. It does change a couple new parameters
that readline 6.3 introduces, rl_change_environment and rl_prefer_env_winsize
They make it so readline does not set ROWS or COLUMNS in the environment,
and seems to be suggested by the ncurses FAQ [1]. The previous method
that handedled resizing after getting input from curses, along with some
support code, has been removed.

The only problem I am aware of with this patch is that until the first
character is typed after resizing in curses mode, you do not see
the contents of the command window. This seems to have no impact on any
other function. Resizing with, without, or any number of switches in
between curses and readline modes were unable to produce a out of sync
size report for me. Without the patch, any resize operation shrinks the
size of the command portion of the window to 3 lines, which is retained
as the full height of the screen in readline mode until you exit the 
session.

I see no regressions in the test suite, even though this isn't the
sort of issue that automated testing is very good at.

CustaiCo

[1] http://invisible-island.net/ncurses/ncurses.faq.html#handle_resize

                === gdb Summary ===

# of expected passes            28624
# of unexpected failures        98
# of unexpected successes       1
# of expected failures          58
# of known failures             55
# of unresolved testcases       12
# of untested testcases         46
# of unsupported tests          184

---
 gdb/ChangeLog      | 14 ++++++++++++++
 gdb/tui/tui-data.c | 16 ----------------
 gdb/tui/tui-io.c   | 21 ---------------------
 gdb/tui/tui-win.c  | 40 +++++++++++++++++++++++++++++++++++-----
 gdb/utils.c        |  7 +++++--
 5 files changed, 54 insertions(+), 44 deletions(-)


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Fixes-issue-gdb-16762-and-gdb-15958.patch --]
[-- Type: text/x-patch; name="0001-Fixes-issue-gdb-16762-and-gdb-15958.patch", Size: 5560 bytes --]

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index ee82f1f..73be21b 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,17 @@
+2014-10-09  CustaiCo  <custaico@openmailbox.org>
+
+	PR gdb/16762
+	PR gdb/15958
+	* tui/tui-win.c: Changed the signal handling code to use the main
+	event loop.
+	* tui/tui-io.c: tui_handle_resize_during_io is not needed. The main
+	event loop handles the call back to resized the windows.
+	* tui/tui-data.c: Support methods for tui_handle_resize_during_io
+	removed.
+	* utils.c: Set new option in latest readline to prevent
+	environment from being changed. Also changed to not incorrectly resize
+	window when tui running.
+
 2014-10-09  Yao Qi  <yao@codesourcery.com>
 
 	* infrun.c (handle_signal_stop): Remove local variable
diff --git a/gdb/tui/tui-data.c b/gdb/tui/tui-data.c
index 7e51b3e..06ea29b 100644
--- a/gdb/tui/tui-data.c
+++ b/gdb/tui/tui-data.c
@@ -98,22 +98,6 @@ tui_set_win_highlight (struct tui_win_info *win_info,
 ** ACCESSORS & MUTATORS FOR PRIVATE DATA
 ******************************************/
 
-/* Answer a whether the terminal window has been resized or not.  */
-int
-tui_win_resized (void)
-{
-  return win_resized;
-}
-
-
-/* Set a whether the terminal window has been resized or not.  */
-void
-tui_set_win_resized_to (int resized)
-{
-  win_resized = resized;
-}
-
-
 /* Answer a pointer to the current layout definition.  */
 struct tui_layout_def *
 tui_layout_def (void)
diff --git a/gdb/tui/tui-io.c b/gdb/tui/tui-io.c
index 601d278..4c7fca8 100644
--- a/gdb/tui/tui-io.c
+++ b/gdb/tui/tui-io.c
@@ -146,8 +146,6 @@ static int tui_readline_pipe[2];
    This may be the main gdb prompt or a secondary prompt.  */
 static char *tui_rl_saved_prompt;
 
-static unsigned int tui_handle_resize_during_io (unsigned int);
-
 static void
 tui_putc (char c)
 {
@@ -653,7 +651,6 @@ tui_getc (FILE *fp)
 #endif
 
   ch = wgetch (w);
-  ch = tui_handle_resize_during_io (ch);
 
   /* The \n must be echoed because it will not be printed by
      readline.  */
@@ -694,21 +691,3 @@ tui_getc (FILE *fp)
   
   return ch;
 }
-
-
-/* Cleanup when a resize has occured.
-   Returns the character that must be processed.  */
-static unsigned int
-tui_handle_resize_during_io (unsigned int original_ch)
-{
-  if (tui_win_resized ())
-    {
-      tui_resize_all ();
-      tui_refresh_all_win ();
-      dont_repeat ();
-      tui_set_win_resized_to (FALSE);
-      return '\n';
-    }
-  else
-    return original_ch;
-}
diff --git a/gdb/tui/tui-win.c b/gdb/tui/tui-win.c
index 9c7a23f..095097a 100644
--- a/gdb/tui/tui-win.c
+++ b/gdb/tui/tui-win.c
@@ -29,6 +29,7 @@
 #include "symtab.h"
 #include "breakpoint.h"
 #include "frame.h"
+#include "event-loop.h"
 #include "cli/cli-cmds.h"
 #include "top.h"
 #include "source.h"
@@ -72,7 +73,7 @@ static void tui_scroll_right_command (char *, int);
 static void parse_scrolling_args (char *, 
 				  struct tui_win_info **, 
 				  int *);
-
+static void tui_handle_resize (void *);
 
 /***************************************
 ** DEFINITIONS
@@ -457,6 +458,31 @@ bold-standout   use extra bright or bold with standout mode"),
 			&tui_setlist, &tui_showlist);
 }
 
+/* This is called from the main event loop after we catch SIGWINCH */
+void
+tui_handle_resize (void *signal)
+{
+  char cmd[50];
+  int col, row;
+  if (tui_active)
+    {
+      tui_resize_all ();
+      tui_refresh_all_win ();
+      xsnprintf (cmd, sizeof (cmd), "set width %d", TUI_CMD_WIN->generic.width);
+      execute_command (cmd, 0);
+      xsnprintf (cmd, sizeof (cmd), "set height %d", TUI_CMD_WIN->generic.height);
+      execute_command (cmd, 0);
+    }
+  else
+    {
+      rl_get_screen_size (&row, &col);
+      xsnprintf (cmd, sizeof (cmd), "set width %d", col);
+      execute_command (cmd, 0);
+      xsnprintf (cmd, sizeof (cmd), "set height %d", row);
+      execute_command (cmd, 0);
+    }
+}
+
 /* Update gdb's knowledge of the terminal size.  */
 void
 tui_update_gdb_sizes (void)
@@ -670,7 +696,7 @@ tui_resize_all (void)
 
 #ifdef HAVE_RESIZE_TERM
       resize_term (screenheight, screenwidth);
-#endif      
+#endif
       /* Turn keypad off while we resize.  */
       if (win_with_focus != TUI_CMD_WIN)
 	keypad (TUI_CMD_WIN->generic.handle, FALSE);
@@ -818,9 +844,13 @@ tui_resize_all (void)
 static void
 tui_sigwinch_handler (int signal)
 {
-  /* Say that a resize was done so that the readline can do it later
-     when appropriate.  */
-  tui_set_win_resized_to (TRUE);
+  /* Say that a resize was done so that the we can update
+     the UI when appropriate. */
+  struct tui_translate data;
+  data.value = signal;
+  rl_cleanup_after_signal ();
+  rl_resize_terminal ();
+  mark_async_signal_handler (create_async_signal_handler (tui_handle_resize, &data));
 }
 #endif
 
diff --git a/gdb/utils.c b/gdb/utils.c
index 3915b58..ae0342a 100644
--- a/gdb/utils.c
+++ b/gdb/utils.c
@@ -1686,6 +1686,8 @@ init_page_info (void)
       chars_per_line = cols;
 #else
       /* Make sure Readline has initialized its terminal settings.  */
+      rl_change_environment = 0;
+      rl_prefer_env_winsize = 0;
       rl_reset_terminal (NULL);
 
       /* Get the screen size from Readline.  */
@@ -1775,8 +1777,9 @@ set_screen_size (void)
   if (cols <= 0)
     cols = INT_MAX;
 
-  /* Update Readline's idea of the terminal size.  */
-  rl_set_screen_size (rows, cols);
+  /* Don't update with tui active or it will be too large */
+  if (!tui_active)
+      rl_set_screen_size (rows, cols);
 }
 
 /* Reinitialize WRAP_BUFFER according to the current value of

^ permalink raw reply	[flat|nested] 25+ messages in thread

* [PATCH] [PR gdb/16762 gdb/15958] Fixes for properly resizing TUI
@ 2014-10-09 15:57 CustaiCo
  0 siblings, 0 replies; 25+ messages in thread
From: CustaiCo @ 2014-10-09 15:57 UTC (permalink / raw)
  To: gdb-patches

[-- Attachment #1: Type: text/plain, Size: 2445 bytes --]

This patch is to fix Bug 16762 - GDB doesn't update display size when host
terminal resize, and it inadvertently fixes Bug 15958 - readline modifies
env (LINES+COLUMNS) as well.

Before it was getting it's size data from curses, but curses is not
available to the readline based interface, so things would get out of sync.
The readline based interface had no way at all to know if there had been
any changes to the size of the window. 

I have changed it so that both the sides use the same callback function. The
event handler has been changed to call some clean up operations that
readlines needs and then puts in a request to call the resize function in 
the main event loop on the next pass. It does change a couple new parameters
that readline 6.3 introduces, rl_change_environment and rl_prefer_env_winsize
They make it so readline does not set ROWS or COLUMNS in the environment,
and seems to be suggested by the ncurses FAQ [1]. The previous method
that handedled resizing after getting input from curses, along with some
support code, has been removed.

The only problem I am aware of with this patch is that until the first
character is typed after resizing in curses mode, you do not see
the contents of the command window. This seems to have no impact on any
other function. Resizing with, without, or any number of switches in
between curses and readline modes were unable to produce a out of sync
size report for me. Without the patch, any resize operation shrinks the
size of the command portion of the window to 3 lines, which is retained
as the full height of the screen in readline mode until you exit the 
session.

I see no regressions in the test suite, even though this isn't the
sort of issue that automated testing is very good at.

CustaiCo

[1] http://invisible-island.net/ncurses/ncurses.faq.html#handle_resize

                === gdb Summary ===

# of expected passes            28624
# of unexpected failures        98
# of unexpected successes       1
# of expected failures          58
# of known failures             55
# of unresolved testcases       12
# of untested testcases         46
# of unsupported tests          184

---
 gdb/ChangeLog      | 14 ++++++++++++++
 gdb/tui/tui-data.c | 16 ----------------
 gdb/tui/tui-io.c   | 21 ---------------------
 gdb/tui/tui-win.c  | 40 +++++++++++++++++++++++++++++++++++-----
 gdb/utils.c        |  7 +++++--
 5 files changed, 54 insertions(+), 44 deletions(-)


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Fixes-issue-gdb-16762-and-gdb-15958.patch --]
[-- Type: text/x-patch; name="0001-Fixes-issue-gdb-16762-and-gdb-15958.patch", Size: 5560 bytes --]

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index ee82f1f..73be21b 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,17 @@
+2014-10-09  CustaiCo  <custaico@openmailbox.org>
+
+	PR gdb/16762
+	PR gdb/15958
+	* tui/tui-win.c: Changed the signal handling code to use the main
+	event loop.
+	* tui/tui-io.c: tui_handle_resize_during_io is not needed. The main
+	event loop handles the call back to resized the windows.
+	* tui/tui-data.c: Support methods for tui_handle_resize_during_io
+	removed.
+	* utils.c: Set new option in latest readline to prevent
+	environment from being changed. Also changed to not incorrectly resize
+	window when tui running.
+
 2014-10-09  Yao Qi  <yao@codesourcery.com>
 
 	* infrun.c (handle_signal_stop): Remove local variable
diff --git a/gdb/tui/tui-data.c b/gdb/tui/tui-data.c
index 7e51b3e..06ea29b 100644
--- a/gdb/tui/tui-data.c
+++ b/gdb/tui/tui-data.c
@@ -98,22 +98,6 @@ tui_set_win_highlight (struct tui_win_info *win_info,
 ** ACCESSORS & MUTATORS FOR PRIVATE DATA
 ******************************************/
 
-/* Answer a whether the terminal window has been resized or not.  */
-int
-tui_win_resized (void)
-{
-  return win_resized;
-}
-
-
-/* Set a whether the terminal window has been resized or not.  */
-void
-tui_set_win_resized_to (int resized)
-{
-  win_resized = resized;
-}
-
-
 /* Answer a pointer to the current layout definition.  */
 struct tui_layout_def *
 tui_layout_def (void)
diff --git a/gdb/tui/tui-io.c b/gdb/tui/tui-io.c
index 601d278..4c7fca8 100644
--- a/gdb/tui/tui-io.c
+++ b/gdb/tui/tui-io.c
@@ -146,8 +146,6 @@ static int tui_readline_pipe[2];
    This may be the main gdb prompt or a secondary prompt.  */
 static char *tui_rl_saved_prompt;
 
-static unsigned int tui_handle_resize_during_io (unsigned int);
-
 static void
 tui_putc (char c)
 {
@@ -653,7 +651,6 @@ tui_getc (FILE *fp)
 #endif
 
   ch = wgetch (w);
-  ch = tui_handle_resize_during_io (ch);
 
   /* The \n must be echoed because it will not be printed by
      readline.  */
@@ -694,21 +691,3 @@ tui_getc (FILE *fp)
   
   return ch;
 }
-
-
-/* Cleanup when a resize has occured.
-   Returns the character that must be processed.  */
-static unsigned int
-tui_handle_resize_during_io (unsigned int original_ch)
-{
-  if (tui_win_resized ())
-    {
-      tui_resize_all ();
-      tui_refresh_all_win ();
-      dont_repeat ();
-      tui_set_win_resized_to (FALSE);
-      return '\n';
-    }
-  else
-    return original_ch;
-}
diff --git a/gdb/tui/tui-win.c b/gdb/tui/tui-win.c
index 9c7a23f..095097a 100644
--- a/gdb/tui/tui-win.c
+++ b/gdb/tui/tui-win.c
@@ -29,6 +29,7 @@
 #include "symtab.h"
 #include "breakpoint.h"
 #include "frame.h"
+#include "event-loop.h"
 #include "cli/cli-cmds.h"
 #include "top.h"
 #include "source.h"
@@ -72,7 +73,7 @@ static void tui_scroll_right_command (char *, int);
 static void parse_scrolling_args (char *, 
 				  struct tui_win_info **, 
 				  int *);
-
+static void tui_handle_resize (void *);
 
 /***************************************
 ** DEFINITIONS
@@ -457,6 +458,31 @@ bold-standout   use extra bright or bold with standout mode"),
 			&tui_setlist, &tui_showlist);
 }
 
+/* This is called from the main event loop after we catch SIGWINCH */
+void
+tui_handle_resize (void *signal)
+{
+  char cmd[50];
+  int col, row;
+  if (tui_active)
+    {
+      tui_resize_all ();
+      tui_refresh_all_win ();
+      xsnprintf (cmd, sizeof (cmd), "set width %d", TUI_CMD_WIN->generic.width);
+      execute_command (cmd, 0);
+      xsnprintf (cmd, sizeof (cmd), "set height %d", TUI_CMD_WIN->generic.height);
+      execute_command (cmd, 0);
+    }
+  else
+    {
+      rl_get_screen_size (&row, &col);
+      xsnprintf (cmd, sizeof (cmd), "set width %d", col);
+      execute_command (cmd, 0);
+      xsnprintf (cmd, sizeof (cmd), "set height %d", row);
+      execute_command (cmd, 0);
+    }
+}
+
 /* Update gdb's knowledge of the terminal size.  */
 void
 tui_update_gdb_sizes (void)
@@ -670,7 +696,7 @@ tui_resize_all (void)
 
 #ifdef HAVE_RESIZE_TERM
       resize_term (screenheight, screenwidth);
-#endif      
+#endif
       /* Turn keypad off while we resize.  */
       if (win_with_focus != TUI_CMD_WIN)
 	keypad (TUI_CMD_WIN->generic.handle, FALSE);
@@ -818,9 +844,13 @@ tui_resize_all (void)
 static void
 tui_sigwinch_handler (int signal)
 {
-  /* Say that a resize was done so that the readline can do it later
-     when appropriate.  */
-  tui_set_win_resized_to (TRUE);
+  /* Say that a resize was done so that the we can update
+     the UI when appropriate. */
+  struct tui_translate data;
+  data.value = signal;
+  rl_cleanup_after_signal ();
+  rl_resize_terminal ();
+  mark_async_signal_handler (create_async_signal_handler (tui_handle_resize, &data));
 }
 #endif
 
diff --git a/gdb/utils.c b/gdb/utils.c
index 3915b58..ae0342a 100644
--- a/gdb/utils.c
+++ b/gdb/utils.c
@@ -1686,6 +1686,8 @@ init_page_info (void)
       chars_per_line = cols;
 #else
       /* Make sure Readline has initialized its terminal settings.  */
+      rl_change_environment = 0;
+      rl_prefer_env_winsize = 0;
       rl_reset_terminal (NULL);
 
       /* Get the screen size from Readline.  */
@@ -1775,8 +1777,9 @@ set_screen_size (void)
   if (cols <= 0)
     cols = INT_MAX;
 
-  /* Update Readline's idea of the terminal size.  */
-  rl_set_screen_size (rows, cols);
+  /* Don't update with tui active or it will be too large */
+  if (!tui_active)
+      rl_set_screen_size (rows, cols);
 }
 
 /* Reinitialize WRAP_BUFFER according to the current value of

^ permalink raw reply	[flat|nested] 25+ messages in thread

* [PATCH] [PR gdb/16762 gdb/15958] Fixes for properly resizing TUI
@ 2014-10-09 15:57 CustaiCo
  0 siblings, 0 replies; 25+ messages in thread
From: CustaiCo @ 2014-10-09 15:57 UTC (permalink / raw)
  To: gdb-patches

[-- Attachment #1: Type: text/plain, Size: 2445 bytes --]

This patch is to fix Bug 16762 - GDB doesn't update display size when host
terminal resize, and it inadvertently fixes Bug 15958 - readline modifies
env (LINES+COLUMNS) as well.

Before it was getting it's size data from curses, but curses is not
available to the readline based interface, so things would get out of sync.
The readline based interface had no way at all to know if there had been
any changes to the size of the window. 

I have changed it so that both the sides use the same callback function. The
event handler has been changed to call some clean up operations that
readlines needs and then puts in a request to call the resize function in 
the main event loop on the next pass. It does change a couple new parameters
that readline 6.3 introduces, rl_change_environment and rl_prefer_env_winsize
They make it so readline does not set ROWS or COLUMNS in the environment,
and seems to be suggested by the ncurses FAQ [1]. The previous method
that handedled resizing after getting input from curses, along with some
support code, has been removed.

The only problem I am aware of with this patch is that until the first
character is typed after resizing in curses mode, you do not see
the contents of the command window. This seems to have no impact on any
other function. Resizing with, without, or any number of switches in
between curses and readline modes were unable to produce a out of sync
size report for me. Without the patch, any resize operation shrinks the
size of the command portion of the window to 3 lines, which is retained
as the full height of the screen in readline mode until you exit the 
session.

I see no regressions in the test suite, even though this isn't the
sort of issue that automated testing is very good at.

CustaiCo

[1] http://invisible-island.net/ncurses/ncurses.faq.html#handle_resize

                === gdb Summary ===

# of expected passes            28624
# of unexpected failures        98
# of unexpected successes       1
# of expected failures          58
# of known failures             55
# of unresolved testcases       12
# of untested testcases         46
# of unsupported tests          184

---
 gdb/ChangeLog      | 14 ++++++++++++++
 gdb/tui/tui-data.c | 16 ----------------
 gdb/tui/tui-io.c   | 21 ---------------------
 gdb/tui/tui-win.c  | 40 +++++++++++++++++++++++++++++++++++-----
 gdb/utils.c        |  7 +++++--
 5 files changed, 54 insertions(+), 44 deletions(-)


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Fixes-issue-gdb-16762-and-gdb-15958.patch --]
[-- Type: text/x-patch; name="0001-Fixes-issue-gdb-16762-and-gdb-15958.patch", Size: 5560 bytes --]

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index ee82f1f..73be21b 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,17 @@
+2014-10-09  CustaiCo  <custaico@openmailbox.org>
+
+	PR gdb/16762
+	PR gdb/15958
+	* tui/tui-win.c: Changed the signal handling code to use the main
+	event loop.
+	* tui/tui-io.c: tui_handle_resize_during_io is not needed. The main
+	event loop handles the call back to resized the windows.
+	* tui/tui-data.c: Support methods for tui_handle_resize_during_io
+	removed.
+	* utils.c: Set new option in latest readline to prevent
+	environment from being changed. Also changed to not incorrectly resize
+	window when tui running.
+
 2014-10-09  Yao Qi  <yao@codesourcery.com>
 
 	* infrun.c (handle_signal_stop): Remove local variable
diff --git a/gdb/tui/tui-data.c b/gdb/tui/tui-data.c
index 7e51b3e..06ea29b 100644
--- a/gdb/tui/tui-data.c
+++ b/gdb/tui/tui-data.c
@@ -98,22 +98,6 @@ tui_set_win_highlight (struct tui_win_info *win_info,
 ** ACCESSORS & MUTATORS FOR PRIVATE DATA
 ******************************************/
 
-/* Answer a whether the terminal window has been resized or not.  */
-int
-tui_win_resized (void)
-{
-  return win_resized;
-}
-
-
-/* Set a whether the terminal window has been resized or not.  */
-void
-tui_set_win_resized_to (int resized)
-{
-  win_resized = resized;
-}
-
-
 /* Answer a pointer to the current layout definition.  */
 struct tui_layout_def *
 tui_layout_def (void)
diff --git a/gdb/tui/tui-io.c b/gdb/tui/tui-io.c
index 601d278..4c7fca8 100644
--- a/gdb/tui/tui-io.c
+++ b/gdb/tui/tui-io.c
@@ -146,8 +146,6 @@ static int tui_readline_pipe[2];
    This may be the main gdb prompt or a secondary prompt.  */
 static char *tui_rl_saved_prompt;
 
-static unsigned int tui_handle_resize_during_io (unsigned int);
-
 static void
 tui_putc (char c)
 {
@@ -653,7 +651,6 @@ tui_getc (FILE *fp)
 #endif
 
   ch = wgetch (w);
-  ch = tui_handle_resize_during_io (ch);
 
   /* The \n must be echoed because it will not be printed by
      readline.  */
@@ -694,21 +691,3 @@ tui_getc (FILE *fp)
   
   return ch;
 }
-
-
-/* Cleanup when a resize has occured.
-   Returns the character that must be processed.  */
-static unsigned int
-tui_handle_resize_during_io (unsigned int original_ch)
-{
-  if (tui_win_resized ())
-    {
-      tui_resize_all ();
-      tui_refresh_all_win ();
-      dont_repeat ();
-      tui_set_win_resized_to (FALSE);
-      return '\n';
-    }
-  else
-    return original_ch;
-}
diff --git a/gdb/tui/tui-win.c b/gdb/tui/tui-win.c
index 9c7a23f..095097a 100644
--- a/gdb/tui/tui-win.c
+++ b/gdb/tui/tui-win.c
@@ -29,6 +29,7 @@
 #include "symtab.h"
 #include "breakpoint.h"
 #include "frame.h"
+#include "event-loop.h"
 #include "cli/cli-cmds.h"
 #include "top.h"
 #include "source.h"
@@ -72,7 +73,7 @@ static void tui_scroll_right_command (char *, int);
 static void parse_scrolling_args (char *, 
 				  struct tui_win_info **, 
 				  int *);
-
+static void tui_handle_resize (void *);
 
 /***************************************
 ** DEFINITIONS
@@ -457,6 +458,31 @@ bold-standout   use extra bright or bold with standout mode"),
 			&tui_setlist, &tui_showlist);
 }
 
+/* This is called from the main event loop after we catch SIGWINCH */
+void
+tui_handle_resize (void *signal)
+{
+  char cmd[50];
+  int col, row;
+  if (tui_active)
+    {
+      tui_resize_all ();
+      tui_refresh_all_win ();
+      xsnprintf (cmd, sizeof (cmd), "set width %d", TUI_CMD_WIN->generic.width);
+      execute_command (cmd, 0);
+      xsnprintf (cmd, sizeof (cmd), "set height %d", TUI_CMD_WIN->generic.height);
+      execute_command (cmd, 0);
+    }
+  else
+    {
+      rl_get_screen_size (&row, &col);
+      xsnprintf (cmd, sizeof (cmd), "set width %d", col);
+      execute_command (cmd, 0);
+      xsnprintf (cmd, sizeof (cmd), "set height %d", row);
+      execute_command (cmd, 0);
+    }
+}
+
 /* Update gdb's knowledge of the terminal size.  */
 void
 tui_update_gdb_sizes (void)
@@ -670,7 +696,7 @@ tui_resize_all (void)
 
 #ifdef HAVE_RESIZE_TERM
       resize_term (screenheight, screenwidth);
-#endif      
+#endif
       /* Turn keypad off while we resize.  */
       if (win_with_focus != TUI_CMD_WIN)
 	keypad (TUI_CMD_WIN->generic.handle, FALSE);
@@ -818,9 +844,13 @@ tui_resize_all (void)
 static void
 tui_sigwinch_handler (int signal)
 {
-  /* Say that a resize was done so that the readline can do it later
-     when appropriate.  */
-  tui_set_win_resized_to (TRUE);
+  /* Say that a resize was done so that the we can update
+     the UI when appropriate. */
+  struct tui_translate data;
+  data.value = signal;
+  rl_cleanup_after_signal ();
+  rl_resize_terminal ();
+  mark_async_signal_handler (create_async_signal_handler (tui_handle_resize, &data));
 }
 #endif
 
diff --git a/gdb/utils.c b/gdb/utils.c
index 3915b58..ae0342a 100644
--- a/gdb/utils.c
+++ b/gdb/utils.c
@@ -1686,6 +1686,8 @@ init_page_info (void)
       chars_per_line = cols;
 #else
       /* Make sure Readline has initialized its terminal settings.  */
+      rl_change_environment = 0;
+      rl_prefer_env_winsize = 0;
       rl_reset_terminal (NULL);
 
       /* Get the screen size from Readline.  */
@@ -1775,8 +1777,9 @@ set_screen_size (void)
   if (cols <= 0)
     cols = INT_MAX;
 
-  /* Update Readline's idea of the terminal size.  */
-  rl_set_screen_size (rows, cols);
+  /* Don't update with tui active or it will be too large */
+  if (!tui_active)
+      rl_set_screen_size (rows, cols);
 }
 
 /* Reinitialize WRAP_BUFFER according to the current value of

^ permalink raw reply	[flat|nested] 25+ messages in thread

* [PATCH] [PR gdb/16762 gdb/15958] Fixes for properly resizing TUI
@ 2014-10-09 15:57 CustaiCo
  0 siblings, 0 replies; 25+ messages in thread
From: CustaiCo @ 2014-10-09 15:57 UTC (permalink / raw)
  To: gdb-patches

[-- Attachment #1: Type: text/plain, Size: 2445 bytes --]

This patch is to fix Bug 16762 - GDB doesn't update display size when host
terminal resize, and it inadvertently fixes Bug 15958 - readline modifies
env (LINES+COLUMNS) as well.

Before it was getting it's size data from curses, but curses is not
available to the readline based interface, so things would get out of sync.
The readline based interface had no way at all to know if there had been
any changes to the size of the window. 

I have changed it so that both the sides use the same callback function. The
event handler has been changed to call some clean up operations that
readlines needs and then puts in a request to call the resize function in 
the main event loop on the next pass. It does change a couple new parameters
that readline 6.3 introduces, rl_change_environment and rl_prefer_env_winsize
They make it so readline does not set ROWS or COLUMNS in the environment,
and seems to be suggested by the ncurses FAQ [1]. The previous method
that handedled resizing after getting input from curses, along with some
support code, has been removed.

The only problem I am aware of with this patch is that until the first
character is typed after resizing in curses mode, you do not see
the contents of the command window. This seems to have no impact on any
other function. Resizing with, without, or any number of switches in
between curses and readline modes were unable to produce a out of sync
size report for me. Without the patch, any resize operation shrinks the
size of the command portion of the window to 3 lines, which is retained
as the full height of the screen in readline mode until you exit the 
session.

I see no regressions in the test suite, even though this isn't the
sort of issue that automated testing is very good at.

CustaiCo

[1] http://invisible-island.net/ncurses/ncurses.faq.html#handle_resize

                === gdb Summary ===

# of expected passes            28624
# of unexpected failures        98
# of unexpected successes       1
# of expected failures          58
# of known failures             55
# of unresolved testcases       12
# of untested testcases         46
# of unsupported tests          184

---
 gdb/ChangeLog      | 14 ++++++++++++++
 gdb/tui/tui-data.c | 16 ----------------
 gdb/tui/tui-io.c   | 21 ---------------------
 gdb/tui/tui-win.c  | 40 +++++++++++++++++++++++++++++++++++-----
 gdb/utils.c        |  7 +++++--
 5 files changed, 54 insertions(+), 44 deletions(-)


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Fixes-issue-gdb-16762-and-gdb-15958.patch --]
[-- Type: text/x-patch; name="0001-Fixes-issue-gdb-16762-and-gdb-15958.patch", Size: 5560 bytes --]

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index ee82f1f..73be21b 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,17 @@
+2014-10-09  CustaiCo  <custaico@openmailbox.org>
+
+	PR gdb/16762
+	PR gdb/15958
+	* tui/tui-win.c: Changed the signal handling code to use the main
+	event loop.
+	* tui/tui-io.c: tui_handle_resize_during_io is not needed. The main
+	event loop handles the call back to resized the windows.
+	* tui/tui-data.c: Support methods for tui_handle_resize_during_io
+	removed.
+	* utils.c: Set new option in latest readline to prevent
+	environment from being changed. Also changed to not incorrectly resize
+	window when tui running.
+
 2014-10-09  Yao Qi  <yao@codesourcery.com>
 
 	* infrun.c (handle_signal_stop): Remove local variable
diff --git a/gdb/tui/tui-data.c b/gdb/tui/tui-data.c
index 7e51b3e..06ea29b 100644
--- a/gdb/tui/tui-data.c
+++ b/gdb/tui/tui-data.c
@@ -98,22 +98,6 @@ tui_set_win_highlight (struct tui_win_info *win_info,
 ** ACCESSORS & MUTATORS FOR PRIVATE DATA
 ******************************************/
 
-/* Answer a whether the terminal window has been resized or not.  */
-int
-tui_win_resized (void)
-{
-  return win_resized;
-}
-
-
-/* Set a whether the terminal window has been resized or not.  */
-void
-tui_set_win_resized_to (int resized)
-{
-  win_resized = resized;
-}
-
-
 /* Answer a pointer to the current layout definition.  */
 struct tui_layout_def *
 tui_layout_def (void)
diff --git a/gdb/tui/tui-io.c b/gdb/tui/tui-io.c
index 601d278..4c7fca8 100644
--- a/gdb/tui/tui-io.c
+++ b/gdb/tui/tui-io.c
@@ -146,8 +146,6 @@ static int tui_readline_pipe[2];
    This may be the main gdb prompt or a secondary prompt.  */
 static char *tui_rl_saved_prompt;
 
-static unsigned int tui_handle_resize_during_io (unsigned int);
-
 static void
 tui_putc (char c)
 {
@@ -653,7 +651,6 @@ tui_getc (FILE *fp)
 #endif
 
   ch = wgetch (w);
-  ch = tui_handle_resize_during_io (ch);
 
   /* The \n must be echoed because it will not be printed by
      readline.  */
@@ -694,21 +691,3 @@ tui_getc (FILE *fp)
   
   return ch;
 }
-
-
-/* Cleanup when a resize has occured.
-   Returns the character that must be processed.  */
-static unsigned int
-tui_handle_resize_during_io (unsigned int original_ch)
-{
-  if (tui_win_resized ())
-    {
-      tui_resize_all ();
-      tui_refresh_all_win ();
-      dont_repeat ();
-      tui_set_win_resized_to (FALSE);
-      return '\n';
-    }
-  else
-    return original_ch;
-}
diff --git a/gdb/tui/tui-win.c b/gdb/tui/tui-win.c
index 9c7a23f..095097a 100644
--- a/gdb/tui/tui-win.c
+++ b/gdb/tui/tui-win.c
@@ -29,6 +29,7 @@
 #include "symtab.h"
 #include "breakpoint.h"
 #include "frame.h"
+#include "event-loop.h"
 #include "cli/cli-cmds.h"
 #include "top.h"
 #include "source.h"
@@ -72,7 +73,7 @@ static void tui_scroll_right_command (char *, int);
 static void parse_scrolling_args (char *, 
 				  struct tui_win_info **, 
 				  int *);
-
+static void tui_handle_resize (void *);
 
 /***************************************
 ** DEFINITIONS
@@ -457,6 +458,31 @@ bold-standout   use extra bright or bold with standout mode"),
 			&tui_setlist, &tui_showlist);
 }
 
+/* This is called from the main event loop after we catch SIGWINCH */
+void
+tui_handle_resize (void *signal)
+{
+  char cmd[50];
+  int col, row;
+  if (tui_active)
+    {
+      tui_resize_all ();
+      tui_refresh_all_win ();
+      xsnprintf (cmd, sizeof (cmd), "set width %d", TUI_CMD_WIN->generic.width);
+      execute_command (cmd, 0);
+      xsnprintf (cmd, sizeof (cmd), "set height %d", TUI_CMD_WIN->generic.height);
+      execute_command (cmd, 0);
+    }
+  else
+    {
+      rl_get_screen_size (&row, &col);
+      xsnprintf (cmd, sizeof (cmd), "set width %d", col);
+      execute_command (cmd, 0);
+      xsnprintf (cmd, sizeof (cmd), "set height %d", row);
+      execute_command (cmd, 0);
+    }
+}
+
 /* Update gdb's knowledge of the terminal size.  */
 void
 tui_update_gdb_sizes (void)
@@ -670,7 +696,7 @@ tui_resize_all (void)
 
 #ifdef HAVE_RESIZE_TERM
       resize_term (screenheight, screenwidth);
-#endif      
+#endif
       /* Turn keypad off while we resize.  */
       if (win_with_focus != TUI_CMD_WIN)
 	keypad (TUI_CMD_WIN->generic.handle, FALSE);
@@ -818,9 +844,13 @@ tui_resize_all (void)
 static void
 tui_sigwinch_handler (int signal)
 {
-  /* Say that a resize was done so that the readline can do it later
-     when appropriate.  */
-  tui_set_win_resized_to (TRUE);
+  /* Say that a resize was done so that the we can update
+     the UI when appropriate. */
+  struct tui_translate data;
+  data.value = signal;
+  rl_cleanup_after_signal ();
+  rl_resize_terminal ();
+  mark_async_signal_handler (create_async_signal_handler (tui_handle_resize, &data));
 }
 #endif
 
diff --git a/gdb/utils.c b/gdb/utils.c
index 3915b58..ae0342a 100644
--- a/gdb/utils.c
+++ b/gdb/utils.c
@@ -1686,6 +1686,8 @@ init_page_info (void)
       chars_per_line = cols;
 #else
       /* Make sure Readline has initialized its terminal settings.  */
+      rl_change_environment = 0;
+      rl_prefer_env_winsize = 0;
       rl_reset_terminal (NULL);
 
       /* Get the screen size from Readline.  */
@@ -1775,8 +1777,9 @@ set_screen_size (void)
   if (cols <= 0)
     cols = INT_MAX;
 
-  /* Update Readline's idea of the terminal size.  */
-  rl_set_screen_size (rows, cols);
+  /* Don't update with tui active or it will be too large */
+  if (!tui_active)
+      rl_set_screen_size (rows, cols);
 }
 
 /* Reinitialize WRAP_BUFFER according to the current value of

^ permalink raw reply	[flat|nested] 25+ messages in thread

* [PATCH] [PR gdb/16762 gdb/15958] Fixes for properly resizing TUI
@ 2014-10-09 15:57 CustaiCo
  0 siblings, 0 replies; 25+ messages in thread
From: CustaiCo @ 2014-10-09 15:57 UTC (permalink / raw)
  To: gdb-patches

[-- Attachment #1: Type: text/plain, Size: 2445 bytes --]

This patch is to fix Bug 16762 - GDB doesn't update display size when host
terminal resize, and it inadvertently fixes Bug 15958 - readline modifies
env (LINES+COLUMNS) as well.

Before it was getting it's size data from curses, but curses is not
available to the readline based interface, so things would get out of sync.
The readline based interface had no way at all to know if there had been
any changes to the size of the window. 

I have changed it so that both the sides use the same callback function. The
event handler has been changed to call some clean up operations that
readlines needs and then puts in a request to call the resize function in 
the main event loop on the next pass. It does change a couple new parameters
that readline 6.3 introduces, rl_change_environment and rl_prefer_env_winsize
They make it so readline does not set ROWS or COLUMNS in the environment,
and seems to be suggested by the ncurses FAQ [1]. The previous method
that handedled resizing after getting input from curses, along with some
support code, has been removed.

The only problem I am aware of with this patch is that until the first
character is typed after resizing in curses mode, you do not see
the contents of the command window. This seems to have no impact on any
other function. Resizing with, without, or any number of switches in
between curses and readline modes were unable to produce a out of sync
size report for me. Without the patch, any resize operation shrinks the
size of the command portion of the window to 3 lines, which is retained
as the full height of the screen in readline mode until you exit the 
session.

I see no regressions in the test suite, even though this isn't the
sort of issue that automated testing is very good at.

CustaiCo

[1] http://invisible-island.net/ncurses/ncurses.faq.html#handle_resize

                === gdb Summary ===

# of expected passes            28624
# of unexpected failures        98
# of unexpected successes       1
# of expected failures          58
# of known failures             55
# of unresolved testcases       12
# of untested testcases         46
# of unsupported tests          184

---
 gdb/ChangeLog      | 14 ++++++++++++++
 gdb/tui/tui-data.c | 16 ----------------
 gdb/tui/tui-io.c   | 21 ---------------------
 gdb/tui/tui-win.c  | 40 +++++++++++++++++++++++++++++++++++-----
 gdb/utils.c        |  7 +++++--
 5 files changed, 54 insertions(+), 44 deletions(-)


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Fixes-issue-gdb-16762-and-gdb-15958.patch --]
[-- Type: text/x-patch; name="0001-Fixes-issue-gdb-16762-and-gdb-15958.patch", Size: 5560 bytes --]

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index ee82f1f..73be21b 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,17 @@
+2014-10-09  CustaiCo  <custaico@openmailbox.org>
+
+	PR gdb/16762
+	PR gdb/15958
+	* tui/tui-win.c: Changed the signal handling code to use the main
+	event loop.
+	* tui/tui-io.c: tui_handle_resize_during_io is not needed. The main
+	event loop handles the call back to resized the windows.
+	* tui/tui-data.c: Support methods for tui_handle_resize_during_io
+	removed.
+	* utils.c: Set new option in latest readline to prevent
+	environment from being changed. Also changed to not incorrectly resize
+	window when tui running.
+
 2014-10-09  Yao Qi  <yao@codesourcery.com>
 
 	* infrun.c (handle_signal_stop): Remove local variable
diff --git a/gdb/tui/tui-data.c b/gdb/tui/tui-data.c
index 7e51b3e..06ea29b 100644
--- a/gdb/tui/tui-data.c
+++ b/gdb/tui/tui-data.c
@@ -98,22 +98,6 @@ tui_set_win_highlight (struct tui_win_info *win_info,
 ** ACCESSORS & MUTATORS FOR PRIVATE DATA
 ******************************************/
 
-/* Answer a whether the terminal window has been resized or not.  */
-int
-tui_win_resized (void)
-{
-  return win_resized;
-}
-
-
-/* Set a whether the terminal window has been resized or not.  */
-void
-tui_set_win_resized_to (int resized)
-{
-  win_resized = resized;
-}
-
-
 /* Answer a pointer to the current layout definition.  */
 struct tui_layout_def *
 tui_layout_def (void)
diff --git a/gdb/tui/tui-io.c b/gdb/tui/tui-io.c
index 601d278..4c7fca8 100644
--- a/gdb/tui/tui-io.c
+++ b/gdb/tui/tui-io.c
@@ -146,8 +146,6 @@ static int tui_readline_pipe[2];
    This may be the main gdb prompt or a secondary prompt.  */
 static char *tui_rl_saved_prompt;
 
-static unsigned int tui_handle_resize_during_io (unsigned int);
-
 static void
 tui_putc (char c)
 {
@@ -653,7 +651,6 @@ tui_getc (FILE *fp)
 #endif
 
   ch = wgetch (w);
-  ch = tui_handle_resize_during_io (ch);
 
   /* The \n must be echoed because it will not be printed by
      readline.  */
@@ -694,21 +691,3 @@ tui_getc (FILE *fp)
   
   return ch;
 }
-
-
-/* Cleanup when a resize has occured.
-   Returns the character that must be processed.  */
-static unsigned int
-tui_handle_resize_during_io (unsigned int original_ch)
-{
-  if (tui_win_resized ())
-    {
-      tui_resize_all ();
-      tui_refresh_all_win ();
-      dont_repeat ();
-      tui_set_win_resized_to (FALSE);
-      return '\n';
-    }
-  else
-    return original_ch;
-}
diff --git a/gdb/tui/tui-win.c b/gdb/tui/tui-win.c
index 9c7a23f..095097a 100644
--- a/gdb/tui/tui-win.c
+++ b/gdb/tui/tui-win.c
@@ -29,6 +29,7 @@
 #include "symtab.h"
 #include "breakpoint.h"
 #include "frame.h"
+#include "event-loop.h"
 #include "cli/cli-cmds.h"
 #include "top.h"
 #include "source.h"
@@ -72,7 +73,7 @@ static void tui_scroll_right_command (char *, int);
 static void parse_scrolling_args (char *, 
 				  struct tui_win_info **, 
 				  int *);
-
+static void tui_handle_resize (void *);
 
 /***************************************
 ** DEFINITIONS
@@ -457,6 +458,31 @@ bold-standout   use extra bright or bold with standout mode"),
 			&tui_setlist, &tui_showlist);
 }
 
+/* This is called from the main event loop after we catch SIGWINCH */
+void
+tui_handle_resize (void *signal)
+{
+  char cmd[50];
+  int col, row;
+  if (tui_active)
+    {
+      tui_resize_all ();
+      tui_refresh_all_win ();
+      xsnprintf (cmd, sizeof (cmd), "set width %d", TUI_CMD_WIN->generic.width);
+      execute_command (cmd, 0);
+      xsnprintf (cmd, sizeof (cmd), "set height %d", TUI_CMD_WIN->generic.height);
+      execute_command (cmd, 0);
+    }
+  else
+    {
+      rl_get_screen_size (&row, &col);
+      xsnprintf (cmd, sizeof (cmd), "set width %d", col);
+      execute_command (cmd, 0);
+      xsnprintf (cmd, sizeof (cmd), "set height %d", row);
+      execute_command (cmd, 0);
+    }
+}
+
 /* Update gdb's knowledge of the terminal size.  */
 void
 tui_update_gdb_sizes (void)
@@ -670,7 +696,7 @@ tui_resize_all (void)
 
 #ifdef HAVE_RESIZE_TERM
       resize_term (screenheight, screenwidth);
-#endif      
+#endif
       /* Turn keypad off while we resize.  */
       if (win_with_focus != TUI_CMD_WIN)
 	keypad (TUI_CMD_WIN->generic.handle, FALSE);
@@ -818,9 +844,13 @@ tui_resize_all (void)
 static void
 tui_sigwinch_handler (int signal)
 {
-  /* Say that a resize was done so that the readline can do it later
-     when appropriate.  */
-  tui_set_win_resized_to (TRUE);
+  /* Say that a resize was done so that the we can update
+     the UI when appropriate. */
+  struct tui_translate data;
+  data.value = signal;
+  rl_cleanup_after_signal ();
+  rl_resize_terminal ();
+  mark_async_signal_handler (create_async_signal_handler (tui_handle_resize, &data));
 }
 #endif
 
diff --git a/gdb/utils.c b/gdb/utils.c
index 3915b58..ae0342a 100644
--- a/gdb/utils.c
+++ b/gdb/utils.c
@@ -1686,6 +1686,8 @@ init_page_info (void)
       chars_per_line = cols;
 #else
       /* Make sure Readline has initialized its terminal settings.  */
+      rl_change_environment = 0;
+      rl_prefer_env_winsize = 0;
       rl_reset_terminal (NULL);
 
       /* Get the screen size from Readline.  */
@@ -1775,8 +1777,9 @@ set_screen_size (void)
   if (cols <= 0)
     cols = INT_MAX;
 
-  /* Update Readline's idea of the terminal size.  */
-  rl_set_screen_size (rows, cols);
+  /* Don't update with tui active or it will be too large */
+  if (!tui_active)
+      rl_set_screen_size (rows, cols);
 }
 
 /* Reinitialize WRAP_BUFFER according to the current value of

^ permalink raw reply	[flat|nested] 25+ messages in thread

* [PATCH] [PR gdb/16762 gdb/15958] Fixes for properly resizing TUI
@ 2014-10-09 15:57 CustaiCo
  0 siblings, 0 replies; 25+ messages in thread
From: CustaiCo @ 2014-10-09 15:57 UTC (permalink / raw)
  To: gdb-patches

[-- Attachment #1: Type: text/plain, Size: 2445 bytes --]

This patch is to fix Bug 16762 - GDB doesn't update display size when host
terminal resize, and it inadvertently fixes Bug 15958 - readline modifies
env (LINES+COLUMNS) as well.

Before it was getting it's size data from curses, but curses is not
available to the readline based interface, so things would get out of sync.
The readline based interface had no way at all to know if there had been
any changes to the size of the window. 

I have changed it so that both the sides use the same callback function. The
event handler has been changed to call some clean up operations that
readlines needs and then puts in a request to call the resize function in 
the main event loop on the next pass. It does change a couple new parameters
that readline 6.3 introduces, rl_change_environment and rl_prefer_env_winsize
They make it so readline does not set ROWS or COLUMNS in the environment,
and seems to be suggested by the ncurses FAQ [1]. The previous method
that handedled resizing after getting input from curses, along with some
support code, has been removed.

The only problem I am aware of with this patch is that until the first
character is typed after resizing in curses mode, you do not see
the contents of the command window. This seems to have no impact on any
other function. Resizing with, without, or any number of switches in
between curses and readline modes were unable to produce a out of sync
size report for me. Without the patch, any resize operation shrinks the
size of the command portion of the window to 3 lines, which is retained
as the full height of the screen in readline mode until you exit the 
session.

I see no regressions in the test suite, even though this isn't the
sort of issue that automated testing is very good at.

CustaiCo

[1] http://invisible-island.net/ncurses/ncurses.faq.html#handle_resize

                === gdb Summary ===

# of expected passes            28624
# of unexpected failures        98
# of unexpected successes       1
# of expected failures          58
# of known failures             55
# of unresolved testcases       12
# of untested testcases         46
# of unsupported tests          184

---
 gdb/ChangeLog      | 14 ++++++++++++++
 gdb/tui/tui-data.c | 16 ----------------
 gdb/tui/tui-io.c   | 21 ---------------------
 gdb/tui/tui-win.c  | 40 +++++++++++++++++++++++++++++++++++-----
 gdb/utils.c        |  7 +++++--
 5 files changed, 54 insertions(+), 44 deletions(-)


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Fixes-issue-gdb-16762-and-gdb-15958.patch --]
[-- Type: text/x-patch; name="0001-Fixes-issue-gdb-16762-and-gdb-15958.patch", Size: 5560 bytes --]

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index ee82f1f..73be21b 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,17 @@
+2014-10-09  CustaiCo  <custaico@openmailbox.org>
+
+	PR gdb/16762
+	PR gdb/15958
+	* tui/tui-win.c: Changed the signal handling code to use the main
+	event loop.
+	* tui/tui-io.c: tui_handle_resize_during_io is not needed. The main
+	event loop handles the call back to resized the windows.
+	* tui/tui-data.c: Support methods for tui_handle_resize_during_io
+	removed.
+	* utils.c: Set new option in latest readline to prevent
+	environment from being changed. Also changed to not incorrectly resize
+	window when tui running.
+
 2014-10-09  Yao Qi  <yao@codesourcery.com>
 
 	* infrun.c (handle_signal_stop): Remove local variable
diff --git a/gdb/tui/tui-data.c b/gdb/tui/tui-data.c
index 7e51b3e..06ea29b 100644
--- a/gdb/tui/tui-data.c
+++ b/gdb/tui/tui-data.c
@@ -98,22 +98,6 @@ tui_set_win_highlight (struct tui_win_info *win_info,
 ** ACCESSORS & MUTATORS FOR PRIVATE DATA
 ******************************************/
 
-/* Answer a whether the terminal window has been resized or not.  */
-int
-tui_win_resized (void)
-{
-  return win_resized;
-}
-
-
-/* Set a whether the terminal window has been resized or not.  */
-void
-tui_set_win_resized_to (int resized)
-{
-  win_resized = resized;
-}
-
-
 /* Answer a pointer to the current layout definition.  */
 struct tui_layout_def *
 tui_layout_def (void)
diff --git a/gdb/tui/tui-io.c b/gdb/tui/tui-io.c
index 601d278..4c7fca8 100644
--- a/gdb/tui/tui-io.c
+++ b/gdb/tui/tui-io.c
@@ -146,8 +146,6 @@ static int tui_readline_pipe[2];
    This may be the main gdb prompt or a secondary prompt.  */
 static char *tui_rl_saved_prompt;
 
-static unsigned int tui_handle_resize_during_io (unsigned int);
-
 static void
 tui_putc (char c)
 {
@@ -653,7 +651,6 @@ tui_getc (FILE *fp)
 #endif
 
   ch = wgetch (w);
-  ch = tui_handle_resize_during_io (ch);
 
   /* The \n must be echoed because it will not be printed by
      readline.  */
@@ -694,21 +691,3 @@ tui_getc (FILE *fp)
   
   return ch;
 }
-
-
-/* Cleanup when a resize has occured.
-   Returns the character that must be processed.  */
-static unsigned int
-tui_handle_resize_during_io (unsigned int original_ch)
-{
-  if (tui_win_resized ())
-    {
-      tui_resize_all ();
-      tui_refresh_all_win ();
-      dont_repeat ();
-      tui_set_win_resized_to (FALSE);
-      return '\n';
-    }
-  else
-    return original_ch;
-}
diff --git a/gdb/tui/tui-win.c b/gdb/tui/tui-win.c
index 9c7a23f..095097a 100644
--- a/gdb/tui/tui-win.c
+++ b/gdb/tui/tui-win.c
@@ -29,6 +29,7 @@
 #include "symtab.h"
 #include "breakpoint.h"
 #include "frame.h"
+#include "event-loop.h"
 #include "cli/cli-cmds.h"
 #include "top.h"
 #include "source.h"
@@ -72,7 +73,7 @@ static void tui_scroll_right_command (char *, int);
 static void parse_scrolling_args (char *, 
 				  struct tui_win_info **, 
 				  int *);
-
+static void tui_handle_resize (void *);
 
 /***************************************
 ** DEFINITIONS
@@ -457,6 +458,31 @@ bold-standout   use extra bright or bold with standout mode"),
 			&tui_setlist, &tui_showlist);
 }
 
+/* This is called from the main event loop after we catch SIGWINCH */
+void
+tui_handle_resize (void *signal)
+{
+  char cmd[50];
+  int col, row;
+  if (tui_active)
+    {
+      tui_resize_all ();
+      tui_refresh_all_win ();
+      xsnprintf (cmd, sizeof (cmd), "set width %d", TUI_CMD_WIN->generic.width);
+      execute_command (cmd, 0);
+      xsnprintf (cmd, sizeof (cmd), "set height %d", TUI_CMD_WIN->generic.height);
+      execute_command (cmd, 0);
+    }
+  else
+    {
+      rl_get_screen_size (&row, &col);
+      xsnprintf (cmd, sizeof (cmd), "set width %d", col);
+      execute_command (cmd, 0);
+      xsnprintf (cmd, sizeof (cmd), "set height %d", row);
+      execute_command (cmd, 0);
+    }
+}
+
 /* Update gdb's knowledge of the terminal size.  */
 void
 tui_update_gdb_sizes (void)
@@ -670,7 +696,7 @@ tui_resize_all (void)
 
 #ifdef HAVE_RESIZE_TERM
       resize_term (screenheight, screenwidth);
-#endif      
+#endif
       /* Turn keypad off while we resize.  */
       if (win_with_focus != TUI_CMD_WIN)
 	keypad (TUI_CMD_WIN->generic.handle, FALSE);
@@ -818,9 +844,13 @@ tui_resize_all (void)
 static void
 tui_sigwinch_handler (int signal)
 {
-  /* Say that a resize was done so that the readline can do it later
-     when appropriate.  */
-  tui_set_win_resized_to (TRUE);
+  /* Say that a resize was done so that the we can update
+     the UI when appropriate. */
+  struct tui_translate data;
+  data.value = signal;
+  rl_cleanup_after_signal ();
+  rl_resize_terminal ();
+  mark_async_signal_handler (create_async_signal_handler (tui_handle_resize, &data));
 }
 #endif
 
diff --git a/gdb/utils.c b/gdb/utils.c
index 3915b58..ae0342a 100644
--- a/gdb/utils.c
+++ b/gdb/utils.c
@@ -1686,6 +1686,8 @@ init_page_info (void)
       chars_per_line = cols;
 #else
       /* Make sure Readline has initialized its terminal settings.  */
+      rl_change_environment = 0;
+      rl_prefer_env_winsize = 0;
       rl_reset_terminal (NULL);
 
       /* Get the screen size from Readline.  */
@@ -1775,8 +1777,9 @@ set_screen_size (void)
   if (cols <= 0)
     cols = INT_MAX;
 
-  /* Update Readline's idea of the terminal size.  */
-  rl_set_screen_size (rows, cols);
+  /* Don't update with tui active or it will be too large */
+  if (!tui_active)
+      rl_set_screen_size (rows, cols);
 }
 
 /* Reinitialize WRAP_BUFFER according to the current value of

^ permalink raw reply	[flat|nested] 25+ messages in thread

* [PATCH] [PR gdb/16762 gdb/15958] Fixes for properly resizing TUI
@ 2014-10-09 15:57 CustaiCo
  0 siblings, 0 replies; 25+ messages in thread
From: CustaiCo @ 2014-10-09 15:57 UTC (permalink / raw)
  To: gdb-patches

[-- Attachment #1: Type: text/plain, Size: 2445 bytes --]

This patch is to fix Bug 16762 - GDB doesn't update display size when host
terminal resize, and it inadvertently fixes Bug 15958 - readline modifies
env (LINES+COLUMNS) as well.

Before it was getting it's size data from curses, but curses is not
available to the readline based interface, so things would get out of sync.
The readline based interface had no way at all to know if there had been
any changes to the size of the window. 

I have changed it so that both the sides use the same callback function. The
event handler has been changed to call some clean up operations that
readlines needs and then puts in a request to call the resize function in 
the main event loop on the next pass. It does change a couple new parameters
that readline 6.3 introduces, rl_change_environment and rl_prefer_env_winsize
They make it so readline does not set ROWS or COLUMNS in the environment,
and seems to be suggested by the ncurses FAQ [1]. The previous method
that handedled resizing after getting input from curses, along with some
support code, has been removed.

The only problem I am aware of with this patch is that until the first
character is typed after resizing in curses mode, you do not see
the contents of the command window. This seems to have no impact on any
other function. Resizing with, without, or any number of switches in
between curses and readline modes were unable to produce a out of sync
size report for me. Without the patch, any resize operation shrinks the
size of the command portion of the window to 3 lines, which is retained
as the full height of the screen in readline mode until you exit the 
session.

I see no regressions in the test suite, even though this isn't the
sort of issue that automated testing is very good at.

CustaiCo

[1] http://invisible-island.net/ncurses/ncurses.faq.html#handle_resize

                === gdb Summary ===

# of expected passes            28624
# of unexpected failures        98
# of unexpected successes       1
# of expected failures          58
# of known failures             55
# of unresolved testcases       12
# of untested testcases         46
# of unsupported tests          184

---
 gdb/ChangeLog      | 14 ++++++++++++++
 gdb/tui/tui-data.c | 16 ----------------
 gdb/tui/tui-io.c   | 21 ---------------------
 gdb/tui/tui-win.c  | 40 +++++++++++++++++++++++++++++++++++-----
 gdb/utils.c        |  7 +++++--
 5 files changed, 54 insertions(+), 44 deletions(-)


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Fixes-issue-gdb-16762-and-gdb-15958.patch --]
[-- Type: text/x-patch; name="0001-Fixes-issue-gdb-16762-and-gdb-15958.patch", Size: 5560 bytes --]

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index ee82f1f..73be21b 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,17 @@
+2014-10-09  CustaiCo  <custaico@openmailbox.org>
+
+	PR gdb/16762
+	PR gdb/15958
+	* tui/tui-win.c: Changed the signal handling code to use the main
+	event loop.
+	* tui/tui-io.c: tui_handle_resize_during_io is not needed. The main
+	event loop handles the call back to resized the windows.
+	* tui/tui-data.c: Support methods for tui_handle_resize_during_io
+	removed.
+	* utils.c: Set new option in latest readline to prevent
+	environment from being changed. Also changed to not incorrectly resize
+	window when tui running.
+
 2014-10-09  Yao Qi  <yao@codesourcery.com>
 
 	* infrun.c (handle_signal_stop): Remove local variable
diff --git a/gdb/tui/tui-data.c b/gdb/tui/tui-data.c
index 7e51b3e..06ea29b 100644
--- a/gdb/tui/tui-data.c
+++ b/gdb/tui/tui-data.c
@@ -98,22 +98,6 @@ tui_set_win_highlight (struct tui_win_info *win_info,
 ** ACCESSORS & MUTATORS FOR PRIVATE DATA
 ******************************************/
 
-/* Answer a whether the terminal window has been resized or not.  */
-int
-tui_win_resized (void)
-{
-  return win_resized;
-}
-
-
-/* Set a whether the terminal window has been resized or not.  */
-void
-tui_set_win_resized_to (int resized)
-{
-  win_resized = resized;
-}
-
-
 /* Answer a pointer to the current layout definition.  */
 struct tui_layout_def *
 tui_layout_def (void)
diff --git a/gdb/tui/tui-io.c b/gdb/tui/tui-io.c
index 601d278..4c7fca8 100644
--- a/gdb/tui/tui-io.c
+++ b/gdb/tui/tui-io.c
@@ -146,8 +146,6 @@ static int tui_readline_pipe[2];
    This may be the main gdb prompt or a secondary prompt.  */
 static char *tui_rl_saved_prompt;
 
-static unsigned int tui_handle_resize_during_io (unsigned int);
-
 static void
 tui_putc (char c)
 {
@@ -653,7 +651,6 @@ tui_getc (FILE *fp)
 #endif
 
   ch = wgetch (w);
-  ch = tui_handle_resize_during_io (ch);
 
   /* The \n must be echoed because it will not be printed by
      readline.  */
@@ -694,21 +691,3 @@ tui_getc (FILE *fp)
   
   return ch;
 }
-
-
-/* Cleanup when a resize has occured.
-   Returns the character that must be processed.  */
-static unsigned int
-tui_handle_resize_during_io (unsigned int original_ch)
-{
-  if (tui_win_resized ())
-    {
-      tui_resize_all ();
-      tui_refresh_all_win ();
-      dont_repeat ();
-      tui_set_win_resized_to (FALSE);
-      return '\n';
-    }
-  else
-    return original_ch;
-}
diff --git a/gdb/tui/tui-win.c b/gdb/tui/tui-win.c
index 9c7a23f..095097a 100644
--- a/gdb/tui/tui-win.c
+++ b/gdb/tui/tui-win.c
@@ -29,6 +29,7 @@
 #include "symtab.h"
 #include "breakpoint.h"
 #include "frame.h"
+#include "event-loop.h"
 #include "cli/cli-cmds.h"
 #include "top.h"
 #include "source.h"
@@ -72,7 +73,7 @@ static void tui_scroll_right_command (char *, int);
 static void parse_scrolling_args (char *, 
 				  struct tui_win_info **, 
 				  int *);
-
+static void tui_handle_resize (void *);
 
 /***************************************
 ** DEFINITIONS
@@ -457,6 +458,31 @@ bold-standout   use extra bright or bold with standout mode"),
 			&tui_setlist, &tui_showlist);
 }
 
+/* This is called from the main event loop after we catch SIGWINCH */
+void
+tui_handle_resize (void *signal)
+{
+  char cmd[50];
+  int col, row;
+  if (tui_active)
+    {
+      tui_resize_all ();
+      tui_refresh_all_win ();
+      xsnprintf (cmd, sizeof (cmd), "set width %d", TUI_CMD_WIN->generic.width);
+      execute_command (cmd, 0);
+      xsnprintf (cmd, sizeof (cmd), "set height %d", TUI_CMD_WIN->generic.height);
+      execute_command (cmd, 0);
+    }
+  else
+    {
+      rl_get_screen_size (&row, &col);
+      xsnprintf (cmd, sizeof (cmd), "set width %d", col);
+      execute_command (cmd, 0);
+      xsnprintf (cmd, sizeof (cmd), "set height %d", row);
+      execute_command (cmd, 0);
+    }
+}
+
 /* Update gdb's knowledge of the terminal size.  */
 void
 tui_update_gdb_sizes (void)
@@ -670,7 +696,7 @@ tui_resize_all (void)
 
 #ifdef HAVE_RESIZE_TERM
       resize_term (screenheight, screenwidth);
-#endif      
+#endif
       /* Turn keypad off while we resize.  */
       if (win_with_focus != TUI_CMD_WIN)
 	keypad (TUI_CMD_WIN->generic.handle, FALSE);
@@ -818,9 +844,13 @@ tui_resize_all (void)
 static void
 tui_sigwinch_handler (int signal)
 {
-  /* Say that a resize was done so that the readline can do it later
-     when appropriate.  */
-  tui_set_win_resized_to (TRUE);
+  /* Say that a resize was done so that the we can update
+     the UI when appropriate. */
+  struct tui_translate data;
+  data.value = signal;
+  rl_cleanup_after_signal ();
+  rl_resize_terminal ();
+  mark_async_signal_handler (create_async_signal_handler (tui_handle_resize, &data));
 }
 #endif
 
diff --git a/gdb/utils.c b/gdb/utils.c
index 3915b58..ae0342a 100644
--- a/gdb/utils.c
+++ b/gdb/utils.c
@@ -1686,6 +1686,8 @@ init_page_info (void)
       chars_per_line = cols;
 #else
       /* Make sure Readline has initialized its terminal settings.  */
+      rl_change_environment = 0;
+      rl_prefer_env_winsize = 0;
       rl_reset_terminal (NULL);
 
       /* Get the screen size from Readline.  */
@@ -1775,8 +1777,9 @@ set_screen_size (void)
   if (cols <= 0)
     cols = INT_MAX;
 
-  /* Update Readline's idea of the terminal size.  */
-  rl_set_screen_size (rows, cols);
+  /* Don't update with tui active or it will be too large */
+  if (!tui_active)
+      rl_set_screen_size (rows, cols);
 }
 
 /* Reinitialize WRAP_BUFFER according to the current value of

^ permalink raw reply	[flat|nested] 25+ messages in thread

* [PATCH] [PR gdb/16762 gdb/15958] Fixes for properly resizing TUI
@ 2014-10-09 15:57 CustaiCo
  0 siblings, 0 replies; 25+ messages in thread
From: CustaiCo @ 2014-10-09 15:57 UTC (permalink / raw)
  To: gdb-patches

[-- Attachment #1: Type: text/plain, Size: 2445 bytes --]

This patch is to fix Bug 16762 - GDB doesn't update display size when host
terminal resize, and it inadvertently fixes Bug 15958 - readline modifies
env (LINES+COLUMNS) as well.

Before it was getting it's size data from curses, but curses is not
available to the readline based interface, so things would get out of sync.
The readline based interface had no way at all to know if there had been
any changes to the size of the window. 

I have changed it so that both the sides use the same callback function. The
event handler has been changed to call some clean up operations that
readlines needs and then puts in a request to call the resize function in 
the main event loop on the next pass. It does change a couple new parameters
that readline 6.3 introduces, rl_change_environment and rl_prefer_env_winsize
They make it so readline does not set ROWS or COLUMNS in the environment,
and seems to be suggested by the ncurses FAQ [1]. The previous method
that handedled resizing after getting input from curses, along with some
support code, has been removed.

The only problem I am aware of with this patch is that until the first
character is typed after resizing in curses mode, you do not see
the contents of the command window. This seems to have no impact on any
other function. Resizing with, without, or any number of switches in
between curses and readline modes were unable to produce a out of sync
size report for me. Without the patch, any resize operation shrinks the
size of the command portion of the window to 3 lines, which is retained
as the full height of the screen in readline mode until you exit the 
session.

I see no regressions in the test suite, even though this isn't the
sort of issue that automated testing is very good at.

CustaiCo

[1] http://invisible-island.net/ncurses/ncurses.faq.html#handle_resize

                === gdb Summary ===

# of expected passes            28624
# of unexpected failures        98
# of unexpected successes       1
# of expected failures          58
# of known failures             55
# of unresolved testcases       12
# of untested testcases         46
# of unsupported tests          184

---
 gdb/ChangeLog      | 14 ++++++++++++++
 gdb/tui/tui-data.c | 16 ----------------
 gdb/tui/tui-io.c   | 21 ---------------------
 gdb/tui/tui-win.c  | 40 +++++++++++++++++++++++++++++++++++-----
 gdb/utils.c        |  7 +++++--
 5 files changed, 54 insertions(+), 44 deletions(-)


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Fixes-issue-gdb-16762-and-gdb-15958.patch --]
[-- Type: text/x-patch; name="0001-Fixes-issue-gdb-16762-and-gdb-15958.patch", Size: 5560 bytes --]

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index ee82f1f..73be21b 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,17 @@
+2014-10-09  CustaiCo  <custaico@openmailbox.org>
+
+	PR gdb/16762
+	PR gdb/15958
+	* tui/tui-win.c: Changed the signal handling code to use the main
+	event loop.
+	* tui/tui-io.c: tui_handle_resize_during_io is not needed. The main
+	event loop handles the call back to resized the windows.
+	* tui/tui-data.c: Support methods for tui_handle_resize_during_io
+	removed.
+	* utils.c: Set new option in latest readline to prevent
+	environment from being changed. Also changed to not incorrectly resize
+	window when tui running.
+
 2014-10-09  Yao Qi  <yao@codesourcery.com>
 
 	* infrun.c (handle_signal_stop): Remove local variable
diff --git a/gdb/tui/tui-data.c b/gdb/tui/tui-data.c
index 7e51b3e..06ea29b 100644
--- a/gdb/tui/tui-data.c
+++ b/gdb/tui/tui-data.c
@@ -98,22 +98,6 @@ tui_set_win_highlight (struct tui_win_info *win_info,
 ** ACCESSORS & MUTATORS FOR PRIVATE DATA
 ******************************************/
 
-/* Answer a whether the terminal window has been resized or not.  */
-int
-tui_win_resized (void)
-{
-  return win_resized;
-}
-
-
-/* Set a whether the terminal window has been resized or not.  */
-void
-tui_set_win_resized_to (int resized)
-{
-  win_resized = resized;
-}
-
-
 /* Answer a pointer to the current layout definition.  */
 struct tui_layout_def *
 tui_layout_def (void)
diff --git a/gdb/tui/tui-io.c b/gdb/tui/tui-io.c
index 601d278..4c7fca8 100644
--- a/gdb/tui/tui-io.c
+++ b/gdb/tui/tui-io.c
@@ -146,8 +146,6 @@ static int tui_readline_pipe[2];
    This may be the main gdb prompt or a secondary prompt.  */
 static char *tui_rl_saved_prompt;
 
-static unsigned int tui_handle_resize_during_io (unsigned int);
-
 static void
 tui_putc (char c)
 {
@@ -653,7 +651,6 @@ tui_getc (FILE *fp)
 #endif
 
   ch = wgetch (w);
-  ch = tui_handle_resize_during_io (ch);
 
   /* The \n must be echoed because it will not be printed by
      readline.  */
@@ -694,21 +691,3 @@ tui_getc (FILE *fp)
   
   return ch;
 }
-
-
-/* Cleanup when a resize has occured.
-   Returns the character that must be processed.  */
-static unsigned int
-tui_handle_resize_during_io (unsigned int original_ch)
-{
-  if (tui_win_resized ())
-    {
-      tui_resize_all ();
-      tui_refresh_all_win ();
-      dont_repeat ();
-      tui_set_win_resized_to (FALSE);
-      return '\n';
-    }
-  else
-    return original_ch;
-}
diff --git a/gdb/tui/tui-win.c b/gdb/tui/tui-win.c
index 9c7a23f..095097a 100644
--- a/gdb/tui/tui-win.c
+++ b/gdb/tui/tui-win.c
@@ -29,6 +29,7 @@
 #include "symtab.h"
 #include "breakpoint.h"
 #include "frame.h"
+#include "event-loop.h"
 #include "cli/cli-cmds.h"
 #include "top.h"
 #include "source.h"
@@ -72,7 +73,7 @@ static void tui_scroll_right_command (char *, int);
 static void parse_scrolling_args (char *, 
 				  struct tui_win_info **, 
 				  int *);
-
+static void tui_handle_resize (void *);
 
 /***************************************
 ** DEFINITIONS
@@ -457,6 +458,31 @@ bold-standout   use extra bright or bold with standout mode"),
 			&tui_setlist, &tui_showlist);
 }
 
+/* This is called from the main event loop after we catch SIGWINCH */
+void
+tui_handle_resize (void *signal)
+{
+  char cmd[50];
+  int col, row;
+  if (tui_active)
+    {
+      tui_resize_all ();
+      tui_refresh_all_win ();
+      xsnprintf (cmd, sizeof (cmd), "set width %d", TUI_CMD_WIN->generic.width);
+      execute_command (cmd, 0);
+      xsnprintf (cmd, sizeof (cmd), "set height %d", TUI_CMD_WIN->generic.height);
+      execute_command (cmd, 0);
+    }
+  else
+    {
+      rl_get_screen_size (&row, &col);
+      xsnprintf (cmd, sizeof (cmd), "set width %d", col);
+      execute_command (cmd, 0);
+      xsnprintf (cmd, sizeof (cmd), "set height %d", row);
+      execute_command (cmd, 0);
+    }
+}
+
 /* Update gdb's knowledge of the terminal size.  */
 void
 tui_update_gdb_sizes (void)
@@ -670,7 +696,7 @@ tui_resize_all (void)
 
 #ifdef HAVE_RESIZE_TERM
       resize_term (screenheight, screenwidth);
-#endif      
+#endif
       /* Turn keypad off while we resize.  */
       if (win_with_focus != TUI_CMD_WIN)
 	keypad (TUI_CMD_WIN->generic.handle, FALSE);
@@ -818,9 +844,13 @@ tui_resize_all (void)
 static void
 tui_sigwinch_handler (int signal)
 {
-  /* Say that a resize was done so that the readline can do it later
-     when appropriate.  */
-  tui_set_win_resized_to (TRUE);
+  /* Say that a resize was done so that the we can update
+     the UI when appropriate. */
+  struct tui_translate data;
+  data.value = signal;
+  rl_cleanup_after_signal ();
+  rl_resize_terminal ();
+  mark_async_signal_handler (create_async_signal_handler (tui_handle_resize, &data));
 }
 #endif
 
diff --git a/gdb/utils.c b/gdb/utils.c
index 3915b58..ae0342a 100644
--- a/gdb/utils.c
+++ b/gdb/utils.c
@@ -1686,6 +1686,8 @@ init_page_info (void)
       chars_per_line = cols;
 #else
       /* Make sure Readline has initialized its terminal settings.  */
+      rl_change_environment = 0;
+      rl_prefer_env_winsize = 0;
       rl_reset_terminal (NULL);
 
       /* Get the screen size from Readline.  */
@@ -1775,8 +1777,9 @@ set_screen_size (void)
   if (cols <= 0)
     cols = INT_MAX;
 
-  /* Update Readline's idea of the terminal size.  */
-  rl_set_screen_size (rows, cols);
+  /* Don't update with tui active or it will be too large */
+  if (!tui_active)
+      rl_set_screen_size (rows, cols);
 }
 
 /* Reinitialize WRAP_BUFFER according to the current value of

^ permalink raw reply	[flat|nested] 25+ messages in thread

* [PATCH] [PR gdb/16762 gdb/15958] Fixes for properly resizing TUI
@ 2014-10-09 15:57 CustaiCo
  0 siblings, 0 replies; 25+ messages in thread
From: CustaiCo @ 2014-10-09 15:57 UTC (permalink / raw)
  To: gdb-patches

[-- Attachment #1: Type: text/plain, Size: 2445 bytes --]

This patch is to fix Bug 16762 - GDB doesn't update display size when host
terminal resize, and it inadvertently fixes Bug 15958 - readline modifies
env (LINES+COLUMNS) as well.

Before it was getting it's size data from curses, but curses is not
available to the readline based interface, so things would get out of sync.
The readline based interface had no way at all to know if there had been
any changes to the size of the window. 

I have changed it so that both the sides use the same callback function. The
event handler has been changed to call some clean up operations that
readlines needs and then puts in a request to call the resize function in 
the main event loop on the next pass. It does change a couple new parameters
that readline 6.3 introduces, rl_change_environment and rl_prefer_env_winsize
They make it so readline does not set ROWS or COLUMNS in the environment,
and seems to be suggested by the ncurses FAQ [1]. The previous method
that handedled resizing after getting input from curses, along with some
support code, has been removed.

The only problem I am aware of with this patch is that until the first
character is typed after resizing in curses mode, you do not see
the contents of the command window. This seems to have no impact on any
other function. Resizing with, without, or any number of switches in
between curses and readline modes were unable to produce a out of sync
size report for me. Without the patch, any resize operation shrinks the
size of the command portion of the window to 3 lines, which is retained
as the full height of the screen in readline mode until you exit the 
session.

I see no regressions in the test suite, even though this isn't the
sort of issue that automated testing is very good at.

CustaiCo

[1] http://invisible-island.net/ncurses/ncurses.faq.html#handle_resize

                === gdb Summary ===

# of expected passes            28624
# of unexpected failures        98
# of unexpected successes       1
# of expected failures          58
# of known failures             55
# of unresolved testcases       12
# of untested testcases         46
# of unsupported tests          184

---
 gdb/ChangeLog      | 14 ++++++++++++++
 gdb/tui/tui-data.c | 16 ----------------
 gdb/tui/tui-io.c   | 21 ---------------------
 gdb/tui/tui-win.c  | 40 +++++++++++++++++++++++++++++++++++-----
 gdb/utils.c        |  7 +++++--
 5 files changed, 54 insertions(+), 44 deletions(-)


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Fixes-issue-gdb-16762-and-gdb-15958.patch --]
[-- Type: text/x-patch; name="0001-Fixes-issue-gdb-16762-and-gdb-15958.patch", Size: 5560 bytes --]

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index ee82f1f..73be21b 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,17 @@
+2014-10-09  CustaiCo  <custaico@openmailbox.org>
+
+	PR gdb/16762
+	PR gdb/15958
+	* tui/tui-win.c: Changed the signal handling code to use the main
+	event loop.
+	* tui/tui-io.c: tui_handle_resize_during_io is not needed. The main
+	event loop handles the call back to resized the windows.
+	* tui/tui-data.c: Support methods for tui_handle_resize_during_io
+	removed.
+	* utils.c: Set new option in latest readline to prevent
+	environment from being changed. Also changed to not incorrectly resize
+	window when tui running.
+
 2014-10-09  Yao Qi  <yao@codesourcery.com>
 
 	* infrun.c (handle_signal_stop): Remove local variable
diff --git a/gdb/tui/tui-data.c b/gdb/tui/tui-data.c
index 7e51b3e..06ea29b 100644
--- a/gdb/tui/tui-data.c
+++ b/gdb/tui/tui-data.c
@@ -98,22 +98,6 @@ tui_set_win_highlight (struct tui_win_info *win_info,
 ** ACCESSORS & MUTATORS FOR PRIVATE DATA
 ******************************************/
 
-/* Answer a whether the terminal window has been resized or not.  */
-int
-tui_win_resized (void)
-{
-  return win_resized;
-}
-
-
-/* Set a whether the terminal window has been resized or not.  */
-void
-tui_set_win_resized_to (int resized)
-{
-  win_resized = resized;
-}
-
-
 /* Answer a pointer to the current layout definition.  */
 struct tui_layout_def *
 tui_layout_def (void)
diff --git a/gdb/tui/tui-io.c b/gdb/tui/tui-io.c
index 601d278..4c7fca8 100644
--- a/gdb/tui/tui-io.c
+++ b/gdb/tui/tui-io.c
@@ -146,8 +146,6 @@ static int tui_readline_pipe[2];
    This may be the main gdb prompt or a secondary prompt.  */
 static char *tui_rl_saved_prompt;
 
-static unsigned int tui_handle_resize_during_io (unsigned int);
-
 static void
 tui_putc (char c)
 {
@@ -653,7 +651,6 @@ tui_getc (FILE *fp)
 #endif
 
   ch = wgetch (w);
-  ch = tui_handle_resize_during_io (ch);
 
   /* The \n must be echoed because it will not be printed by
      readline.  */
@@ -694,21 +691,3 @@ tui_getc (FILE *fp)
   
   return ch;
 }
-
-
-/* Cleanup when a resize has occured.
-   Returns the character that must be processed.  */
-static unsigned int
-tui_handle_resize_during_io (unsigned int original_ch)
-{
-  if (tui_win_resized ())
-    {
-      tui_resize_all ();
-      tui_refresh_all_win ();
-      dont_repeat ();
-      tui_set_win_resized_to (FALSE);
-      return '\n';
-    }
-  else
-    return original_ch;
-}
diff --git a/gdb/tui/tui-win.c b/gdb/tui/tui-win.c
index 9c7a23f..095097a 100644
--- a/gdb/tui/tui-win.c
+++ b/gdb/tui/tui-win.c
@@ -29,6 +29,7 @@
 #include "symtab.h"
 #include "breakpoint.h"
 #include "frame.h"
+#include "event-loop.h"
 #include "cli/cli-cmds.h"
 #include "top.h"
 #include "source.h"
@@ -72,7 +73,7 @@ static void tui_scroll_right_command (char *, int);
 static void parse_scrolling_args (char *, 
 				  struct tui_win_info **, 
 				  int *);
-
+static void tui_handle_resize (void *);
 
 /***************************************
 ** DEFINITIONS
@@ -457,6 +458,31 @@ bold-standout   use extra bright or bold with standout mode"),
 			&tui_setlist, &tui_showlist);
 }
 
+/* This is called from the main event loop after we catch SIGWINCH */
+void
+tui_handle_resize (void *signal)
+{
+  char cmd[50];
+  int col, row;
+  if (tui_active)
+    {
+      tui_resize_all ();
+      tui_refresh_all_win ();
+      xsnprintf (cmd, sizeof (cmd), "set width %d", TUI_CMD_WIN->generic.width);
+      execute_command (cmd, 0);
+      xsnprintf (cmd, sizeof (cmd), "set height %d", TUI_CMD_WIN->generic.height);
+      execute_command (cmd, 0);
+    }
+  else
+    {
+      rl_get_screen_size (&row, &col);
+      xsnprintf (cmd, sizeof (cmd), "set width %d", col);
+      execute_command (cmd, 0);
+      xsnprintf (cmd, sizeof (cmd), "set height %d", row);
+      execute_command (cmd, 0);
+    }
+}
+
 /* Update gdb's knowledge of the terminal size.  */
 void
 tui_update_gdb_sizes (void)
@@ -670,7 +696,7 @@ tui_resize_all (void)
 
 #ifdef HAVE_RESIZE_TERM
       resize_term (screenheight, screenwidth);
-#endif      
+#endif
       /* Turn keypad off while we resize.  */
       if (win_with_focus != TUI_CMD_WIN)
 	keypad (TUI_CMD_WIN->generic.handle, FALSE);
@@ -818,9 +844,13 @@ tui_resize_all (void)
 static void
 tui_sigwinch_handler (int signal)
 {
-  /* Say that a resize was done so that the readline can do it later
-     when appropriate.  */
-  tui_set_win_resized_to (TRUE);
+  /* Say that a resize was done so that the we can update
+     the UI when appropriate. */
+  struct tui_translate data;
+  data.value = signal;
+  rl_cleanup_after_signal ();
+  rl_resize_terminal ();
+  mark_async_signal_handler (create_async_signal_handler (tui_handle_resize, &data));
 }
 #endif
 
diff --git a/gdb/utils.c b/gdb/utils.c
index 3915b58..ae0342a 100644
--- a/gdb/utils.c
+++ b/gdb/utils.c
@@ -1686,6 +1686,8 @@ init_page_info (void)
       chars_per_line = cols;
 #else
       /* Make sure Readline has initialized its terminal settings.  */
+      rl_change_environment = 0;
+      rl_prefer_env_winsize = 0;
       rl_reset_terminal (NULL);
 
       /* Get the screen size from Readline.  */
@@ -1775,8 +1777,9 @@ set_screen_size (void)
   if (cols <= 0)
     cols = INT_MAX;
 
-  /* Update Readline's idea of the terminal size.  */
-  rl_set_screen_size (rows, cols);
+  /* Don't update with tui active or it will be too large */
+  if (!tui_active)
+      rl_set_screen_size (rows, cols);
 }
 
 /* Reinitialize WRAP_BUFFER according to the current value of

^ permalink raw reply	[flat|nested] 25+ messages in thread

* [PATCH] [PR gdb/16762 gdb/15958] Fixes for properly resizing TUI
@ 2014-10-09 15:57 CustaiCo
  0 siblings, 0 replies; 25+ messages in thread
From: CustaiCo @ 2014-10-09 15:57 UTC (permalink / raw)
  To: gdb-patches

[-- Attachment #1: Type: text/plain, Size: 2445 bytes --]

This patch is to fix Bug 16762 - GDB doesn't update display size when host
terminal resize, and it inadvertently fixes Bug 15958 - readline modifies
env (LINES+COLUMNS) as well.

Before it was getting it's size data from curses, but curses is not
available to the readline based interface, so things would get out of sync.
The readline based interface had no way at all to know if there had been
any changes to the size of the window. 

I have changed it so that both the sides use the same callback function. The
event handler has been changed to call some clean up operations that
readlines needs and then puts in a request to call the resize function in 
the main event loop on the next pass. It does change a couple new parameters
that readline 6.3 introduces, rl_change_environment and rl_prefer_env_winsize
They make it so readline does not set ROWS or COLUMNS in the environment,
and seems to be suggested by the ncurses FAQ [1]. The previous method
that handedled resizing after getting input from curses, along with some
support code, has been removed.

The only problem I am aware of with this patch is that until the first
character is typed after resizing in curses mode, you do not see
the contents of the command window. This seems to have no impact on any
other function. Resizing with, without, or any number of switches in
between curses and readline modes were unable to produce a out of sync
size report for me. Without the patch, any resize operation shrinks the
size of the command portion of the window to 3 lines, which is retained
as the full height of the screen in readline mode until you exit the 
session.

I see no regressions in the test suite, even though this isn't the
sort of issue that automated testing is very good at.

CustaiCo

[1] http://invisible-island.net/ncurses/ncurses.faq.html#handle_resize

                === gdb Summary ===

# of expected passes            28624
# of unexpected failures        98
# of unexpected successes       1
# of expected failures          58
# of known failures             55
# of unresolved testcases       12
# of untested testcases         46
# of unsupported tests          184

---
 gdb/ChangeLog      | 14 ++++++++++++++
 gdb/tui/tui-data.c | 16 ----------------
 gdb/tui/tui-io.c   | 21 ---------------------
 gdb/tui/tui-win.c  | 40 +++++++++++++++++++++++++++++++++++-----
 gdb/utils.c        |  7 +++++--
 5 files changed, 54 insertions(+), 44 deletions(-)


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Fixes-issue-gdb-16762-and-gdb-15958.patch --]
[-- Type: text/x-patch; name="0001-Fixes-issue-gdb-16762-and-gdb-15958.patch", Size: 5560 bytes --]

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index ee82f1f..73be21b 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,17 @@
+2014-10-09  CustaiCo  <custaico@openmailbox.org>
+
+	PR gdb/16762
+	PR gdb/15958
+	* tui/tui-win.c: Changed the signal handling code to use the main
+	event loop.
+	* tui/tui-io.c: tui_handle_resize_during_io is not needed. The main
+	event loop handles the call back to resized the windows.
+	* tui/tui-data.c: Support methods for tui_handle_resize_during_io
+	removed.
+	* utils.c: Set new option in latest readline to prevent
+	environment from being changed. Also changed to not incorrectly resize
+	window when tui running.
+
 2014-10-09  Yao Qi  <yao@codesourcery.com>
 
 	* infrun.c (handle_signal_stop): Remove local variable
diff --git a/gdb/tui/tui-data.c b/gdb/tui/tui-data.c
index 7e51b3e..06ea29b 100644
--- a/gdb/tui/tui-data.c
+++ b/gdb/tui/tui-data.c
@@ -98,22 +98,6 @@ tui_set_win_highlight (struct tui_win_info *win_info,
 ** ACCESSORS & MUTATORS FOR PRIVATE DATA
 ******************************************/
 
-/* Answer a whether the terminal window has been resized or not.  */
-int
-tui_win_resized (void)
-{
-  return win_resized;
-}
-
-
-/* Set a whether the terminal window has been resized or not.  */
-void
-tui_set_win_resized_to (int resized)
-{
-  win_resized = resized;
-}
-
-
 /* Answer a pointer to the current layout definition.  */
 struct tui_layout_def *
 tui_layout_def (void)
diff --git a/gdb/tui/tui-io.c b/gdb/tui/tui-io.c
index 601d278..4c7fca8 100644
--- a/gdb/tui/tui-io.c
+++ b/gdb/tui/tui-io.c
@@ -146,8 +146,6 @@ static int tui_readline_pipe[2];
    This may be the main gdb prompt or a secondary prompt.  */
 static char *tui_rl_saved_prompt;
 
-static unsigned int tui_handle_resize_during_io (unsigned int);
-
 static void
 tui_putc (char c)
 {
@@ -653,7 +651,6 @@ tui_getc (FILE *fp)
 #endif
 
   ch = wgetch (w);
-  ch = tui_handle_resize_during_io (ch);
 
   /* The \n must be echoed because it will not be printed by
      readline.  */
@@ -694,21 +691,3 @@ tui_getc (FILE *fp)
   
   return ch;
 }
-
-
-/* Cleanup when a resize has occured.
-   Returns the character that must be processed.  */
-static unsigned int
-tui_handle_resize_during_io (unsigned int original_ch)
-{
-  if (tui_win_resized ())
-    {
-      tui_resize_all ();
-      tui_refresh_all_win ();
-      dont_repeat ();
-      tui_set_win_resized_to (FALSE);
-      return '\n';
-    }
-  else
-    return original_ch;
-}
diff --git a/gdb/tui/tui-win.c b/gdb/tui/tui-win.c
index 9c7a23f..095097a 100644
--- a/gdb/tui/tui-win.c
+++ b/gdb/tui/tui-win.c
@@ -29,6 +29,7 @@
 #include "symtab.h"
 #include "breakpoint.h"
 #include "frame.h"
+#include "event-loop.h"
 #include "cli/cli-cmds.h"
 #include "top.h"
 #include "source.h"
@@ -72,7 +73,7 @@ static void tui_scroll_right_command (char *, int);
 static void parse_scrolling_args (char *, 
 				  struct tui_win_info **, 
 				  int *);
-
+static void tui_handle_resize (void *);
 
 /***************************************
 ** DEFINITIONS
@@ -457,6 +458,31 @@ bold-standout   use extra bright or bold with standout mode"),
 			&tui_setlist, &tui_showlist);
 }
 
+/* This is called from the main event loop after we catch SIGWINCH */
+void
+tui_handle_resize (void *signal)
+{
+  char cmd[50];
+  int col, row;
+  if (tui_active)
+    {
+      tui_resize_all ();
+      tui_refresh_all_win ();
+      xsnprintf (cmd, sizeof (cmd), "set width %d", TUI_CMD_WIN->generic.width);
+      execute_command (cmd, 0);
+      xsnprintf (cmd, sizeof (cmd), "set height %d", TUI_CMD_WIN->generic.height);
+      execute_command (cmd, 0);
+    }
+  else
+    {
+      rl_get_screen_size (&row, &col);
+      xsnprintf (cmd, sizeof (cmd), "set width %d", col);
+      execute_command (cmd, 0);
+      xsnprintf (cmd, sizeof (cmd), "set height %d", row);
+      execute_command (cmd, 0);
+    }
+}
+
 /* Update gdb's knowledge of the terminal size.  */
 void
 tui_update_gdb_sizes (void)
@@ -670,7 +696,7 @@ tui_resize_all (void)
 
 #ifdef HAVE_RESIZE_TERM
       resize_term (screenheight, screenwidth);
-#endif      
+#endif
       /* Turn keypad off while we resize.  */
       if (win_with_focus != TUI_CMD_WIN)
 	keypad (TUI_CMD_WIN->generic.handle, FALSE);
@@ -818,9 +844,13 @@ tui_resize_all (void)
 static void
 tui_sigwinch_handler (int signal)
 {
-  /* Say that a resize was done so that the readline can do it later
-     when appropriate.  */
-  tui_set_win_resized_to (TRUE);
+  /* Say that a resize was done so that the we can update
+     the UI when appropriate. */
+  struct tui_translate data;
+  data.value = signal;
+  rl_cleanup_after_signal ();
+  rl_resize_terminal ();
+  mark_async_signal_handler (create_async_signal_handler (tui_handle_resize, &data));
 }
 #endif
 
diff --git a/gdb/utils.c b/gdb/utils.c
index 3915b58..ae0342a 100644
--- a/gdb/utils.c
+++ b/gdb/utils.c
@@ -1686,6 +1686,8 @@ init_page_info (void)
       chars_per_line = cols;
 #else
       /* Make sure Readline has initialized its terminal settings.  */
+      rl_change_environment = 0;
+      rl_prefer_env_winsize = 0;
       rl_reset_terminal (NULL);
 
       /* Get the screen size from Readline.  */
@@ -1775,8 +1777,9 @@ set_screen_size (void)
   if (cols <= 0)
     cols = INT_MAX;
 
-  /* Update Readline's idea of the terminal size.  */
-  rl_set_screen_size (rows, cols);
+  /* Don't update with tui active or it will be too large */
+  if (!tui_active)
+      rl_set_screen_size (rows, cols);
 }
 
 /* Reinitialize WRAP_BUFFER according to the current value of

^ permalink raw reply	[flat|nested] 25+ messages in thread

* [PATCH] [PR gdb/16762 gdb/15958] Fixes for properly resizing TUI
@ 2014-10-09 15:57 CustaiCo
  0 siblings, 0 replies; 25+ messages in thread
From: CustaiCo @ 2014-10-09 15:57 UTC (permalink / raw)
  To: gdb-patches

[-- Attachment #1: Type: text/plain, Size: 2445 bytes --]

This patch is to fix Bug 16762 - GDB doesn't update display size when host
terminal resize, and it inadvertently fixes Bug 15958 - readline modifies
env (LINES+COLUMNS) as well.

Before it was getting it's size data from curses, but curses is not
available to the readline based interface, so things would get out of sync.
The readline based interface had no way at all to know if there had been
any changes to the size of the window. 

I have changed it so that both the sides use the same callback function. The
event handler has been changed to call some clean up operations that
readlines needs and then puts in a request to call the resize function in 
the main event loop on the next pass. It does change a couple new parameters
that readline 6.3 introduces, rl_change_environment and rl_prefer_env_winsize
They make it so readline does not set ROWS or COLUMNS in the environment,
and seems to be suggested by the ncurses FAQ [1]. The previous method
that handedled resizing after getting input from curses, along with some
support code, has been removed.

The only problem I am aware of with this patch is that until the first
character is typed after resizing in curses mode, you do not see
the contents of the command window. This seems to have no impact on any
other function. Resizing with, without, or any number of switches in
between curses and readline modes were unable to produce a out of sync
size report for me. Without the patch, any resize operation shrinks the
size of the command portion of the window to 3 lines, which is retained
as the full height of the screen in readline mode until you exit the 
session.

I see no regressions in the test suite, even though this isn't the
sort of issue that automated testing is very good at.

CustaiCo

[1] http://invisible-island.net/ncurses/ncurses.faq.html#handle_resize

                === gdb Summary ===

# of expected passes            28624
# of unexpected failures        98
# of unexpected successes       1
# of expected failures          58
# of known failures             55
# of unresolved testcases       12
# of untested testcases         46
# of unsupported tests          184

---
 gdb/ChangeLog      | 14 ++++++++++++++
 gdb/tui/tui-data.c | 16 ----------------
 gdb/tui/tui-io.c   | 21 ---------------------
 gdb/tui/tui-win.c  | 40 +++++++++++++++++++++++++++++++++++-----
 gdb/utils.c        |  7 +++++--
 5 files changed, 54 insertions(+), 44 deletions(-)


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Fixes-issue-gdb-16762-and-gdb-15958.patch --]
[-- Type: text/x-patch; name="0001-Fixes-issue-gdb-16762-and-gdb-15958.patch", Size: 5560 bytes --]

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index ee82f1f..73be21b 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,17 @@
+2014-10-09  CustaiCo  <custaico@openmailbox.org>
+
+	PR gdb/16762
+	PR gdb/15958
+	* tui/tui-win.c: Changed the signal handling code to use the main
+	event loop.
+	* tui/tui-io.c: tui_handle_resize_during_io is not needed. The main
+	event loop handles the call back to resized the windows.
+	* tui/tui-data.c: Support methods for tui_handle_resize_during_io
+	removed.
+	* utils.c: Set new option in latest readline to prevent
+	environment from being changed. Also changed to not incorrectly resize
+	window when tui running.
+
 2014-10-09  Yao Qi  <yao@codesourcery.com>
 
 	* infrun.c (handle_signal_stop): Remove local variable
diff --git a/gdb/tui/tui-data.c b/gdb/tui/tui-data.c
index 7e51b3e..06ea29b 100644
--- a/gdb/tui/tui-data.c
+++ b/gdb/tui/tui-data.c
@@ -98,22 +98,6 @@ tui_set_win_highlight (struct tui_win_info *win_info,
 ** ACCESSORS & MUTATORS FOR PRIVATE DATA
 ******************************************/
 
-/* Answer a whether the terminal window has been resized or not.  */
-int
-tui_win_resized (void)
-{
-  return win_resized;
-}
-
-
-/* Set a whether the terminal window has been resized or not.  */
-void
-tui_set_win_resized_to (int resized)
-{
-  win_resized = resized;
-}
-
-
 /* Answer a pointer to the current layout definition.  */
 struct tui_layout_def *
 tui_layout_def (void)
diff --git a/gdb/tui/tui-io.c b/gdb/tui/tui-io.c
index 601d278..4c7fca8 100644
--- a/gdb/tui/tui-io.c
+++ b/gdb/tui/tui-io.c
@@ -146,8 +146,6 @@ static int tui_readline_pipe[2];
    This may be the main gdb prompt or a secondary prompt.  */
 static char *tui_rl_saved_prompt;
 
-static unsigned int tui_handle_resize_during_io (unsigned int);
-
 static void
 tui_putc (char c)
 {
@@ -653,7 +651,6 @@ tui_getc (FILE *fp)
 #endif
 
   ch = wgetch (w);
-  ch = tui_handle_resize_during_io (ch);
 
   /* The \n must be echoed because it will not be printed by
      readline.  */
@@ -694,21 +691,3 @@ tui_getc (FILE *fp)
   
   return ch;
 }
-
-
-/* Cleanup when a resize has occured.
-   Returns the character that must be processed.  */
-static unsigned int
-tui_handle_resize_during_io (unsigned int original_ch)
-{
-  if (tui_win_resized ())
-    {
-      tui_resize_all ();
-      tui_refresh_all_win ();
-      dont_repeat ();
-      tui_set_win_resized_to (FALSE);
-      return '\n';
-    }
-  else
-    return original_ch;
-}
diff --git a/gdb/tui/tui-win.c b/gdb/tui/tui-win.c
index 9c7a23f..095097a 100644
--- a/gdb/tui/tui-win.c
+++ b/gdb/tui/tui-win.c
@@ -29,6 +29,7 @@
 #include "symtab.h"
 #include "breakpoint.h"
 #include "frame.h"
+#include "event-loop.h"
 #include "cli/cli-cmds.h"
 #include "top.h"
 #include "source.h"
@@ -72,7 +73,7 @@ static void tui_scroll_right_command (char *, int);
 static void parse_scrolling_args (char *, 
 				  struct tui_win_info **, 
 				  int *);
-
+static void tui_handle_resize (void *);
 
 /***************************************
 ** DEFINITIONS
@@ -457,6 +458,31 @@ bold-standout   use extra bright or bold with standout mode"),
 			&tui_setlist, &tui_showlist);
 }
 
+/* This is called from the main event loop after we catch SIGWINCH */
+void
+tui_handle_resize (void *signal)
+{
+  char cmd[50];
+  int col, row;
+  if (tui_active)
+    {
+      tui_resize_all ();
+      tui_refresh_all_win ();
+      xsnprintf (cmd, sizeof (cmd), "set width %d", TUI_CMD_WIN->generic.width);
+      execute_command (cmd, 0);
+      xsnprintf (cmd, sizeof (cmd), "set height %d", TUI_CMD_WIN->generic.height);
+      execute_command (cmd, 0);
+    }
+  else
+    {
+      rl_get_screen_size (&row, &col);
+      xsnprintf (cmd, sizeof (cmd), "set width %d", col);
+      execute_command (cmd, 0);
+      xsnprintf (cmd, sizeof (cmd), "set height %d", row);
+      execute_command (cmd, 0);
+    }
+}
+
 /* Update gdb's knowledge of the terminal size.  */
 void
 tui_update_gdb_sizes (void)
@@ -670,7 +696,7 @@ tui_resize_all (void)
 
 #ifdef HAVE_RESIZE_TERM
       resize_term (screenheight, screenwidth);
-#endif      
+#endif
       /* Turn keypad off while we resize.  */
       if (win_with_focus != TUI_CMD_WIN)
 	keypad (TUI_CMD_WIN->generic.handle, FALSE);
@@ -818,9 +844,13 @@ tui_resize_all (void)
 static void
 tui_sigwinch_handler (int signal)
 {
-  /* Say that a resize was done so that the readline can do it later
-     when appropriate.  */
-  tui_set_win_resized_to (TRUE);
+  /* Say that a resize was done so that the we can update
+     the UI when appropriate. */
+  struct tui_translate data;
+  data.value = signal;
+  rl_cleanup_after_signal ();
+  rl_resize_terminal ();
+  mark_async_signal_handler (create_async_signal_handler (tui_handle_resize, &data));
 }
 #endif
 
diff --git a/gdb/utils.c b/gdb/utils.c
index 3915b58..ae0342a 100644
--- a/gdb/utils.c
+++ b/gdb/utils.c
@@ -1686,6 +1686,8 @@ init_page_info (void)
       chars_per_line = cols;
 #else
       /* Make sure Readline has initialized its terminal settings.  */
+      rl_change_environment = 0;
+      rl_prefer_env_winsize = 0;
       rl_reset_terminal (NULL);
 
       /* Get the screen size from Readline.  */
@@ -1775,8 +1777,9 @@ set_screen_size (void)
   if (cols <= 0)
     cols = INT_MAX;
 
-  /* Update Readline's idea of the terminal size.  */
-  rl_set_screen_size (rows, cols);
+  /* Don't update with tui active or it will be too large */
+  if (!tui_active)
+      rl_set_screen_size (rows, cols);
 }
 
 /* Reinitialize WRAP_BUFFER according to the current value of

^ permalink raw reply	[flat|nested] 25+ messages in thread

* [PATCH] [PR gdb/16762 gdb/15958] Fixes for properly resizing TUI
@ 2014-10-09 15:57 CustaiCo
  0 siblings, 0 replies; 25+ messages in thread
From: CustaiCo @ 2014-10-09 15:57 UTC (permalink / raw)
  To: gdb-patches

[-- Attachment #1: Type: text/plain, Size: 2445 bytes --]

This patch is to fix Bug 16762 - GDB doesn't update display size when host
terminal resize, and it inadvertently fixes Bug 15958 - readline modifies
env (LINES+COLUMNS) as well.

Before it was getting it's size data from curses, but curses is not
available to the readline based interface, so things would get out of sync.
The readline based interface had no way at all to know if there had been
any changes to the size of the window. 

I have changed it so that both the sides use the same callback function. The
event handler has been changed to call some clean up operations that
readlines needs and then puts in a request to call the resize function in 
the main event loop on the next pass. It does change a couple new parameters
that readline 6.3 introduces, rl_change_environment and rl_prefer_env_winsize
They make it so readline does not set ROWS or COLUMNS in the environment,
and seems to be suggested by the ncurses FAQ [1]. The previous method
that handedled resizing after getting input from curses, along with some
support code, has been removed.

The only problem I am aware of with this patch is that until the first
character is typed after resizing in curses mode, you do not see
the contents of the command window. This seems to have no impact on any
other function. Resizing with, without, or any number of switches in
between curses and readline modes were unable to produce a out of sync
size report for me. Without the patch, any resize operation shrinks the
size of the command portion of the window to 3 lines, which is retained
as the full height of the screen in readline mode until you exit the 
session.

I see no regressions in the test suite, even though this isn't the
sort of issue that automated testing is very good at.

CustaiCo

[1] http://invisible-island.net/ncurses/ncurses.faq.html#handle_resize

                === gdb Summary ===

# of expected passes            28624
# of unexpected failures        98
# of unexpected successes       1
# of expected failures          58
# of known failures             55
# of unresolved testcases       12
# of untested testcases         46
# of unsupported tests          184

---
 gdb/ChangeLog      | 14 ++++++++++++++
 gdb/tui/tui-data.c | 16 ----------------
 gdb/tui/tui-io.c   | 21 ---------------------
 gdb/tui/tui-win.c  | 40 +++++++++++++++++++++++++++++++++++-----
 gdb/utils.c        |  7 +++++--
 5 files changed, 54 insertions(+), 44 deletions(-)


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Fixes-issue-gdb-16762-and-gdb-15958.patch --]
[-- Type: text/x-patch; name="0001-Fixes-issue-gdb-16762-and-gdb-15958.patch", Size: 5560 bytes --]

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index ee82f1f..73be21b 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,17 @@
+2014-10-09  CustaiCo  <custaico@openmailbox.org>
+
+	PR gdb/16762
+	PR gdb/15958
+	* tui/tui-win.c: Changed the signal handling code to use the main
+	event loop.
+	* tui/tui-io.c: tui_handle_resize_during_io is not needed. The main
+	event loop handles the call back to resized the windows.
+	* tui/tui-data.c: Support methods for tui_handle_resize_during_io
+	removed.
+	* utils.c: Set new option in latest readline to prevent
+	environment from being changed. Also changed to not incorrectly resize
+	window when tui running.
+
 2014-10-09  Yao Qi  <yao@codesourcery.com>
 
 	* infrun.c (handle_signal_stop): Remove local variable
diff --git a/gdb/tui/tui-data.c b/gdb/tui/tui-data.c
index 7e51b3e..06ea29b 100644
--- a/gdb/tui/tui-data.c
+++ b/gdb/tui/tui-data.c
@@ -98,22 +98,6 @@ tui_set_win_highlight (struct tui_win_info *win_info,
 ** ACCESSORS & MUTATORS FOR PRIVATE DATA
 ******************************************/
 
-/* Answer a whether the terminal window has been resized or not.  */
-int
-tui_win_resized (void)
-{
-  return win_resized;
-}
-
-
-/* Set a whether the terminal window has been resized or not.  */
-void
-tui_set_win_resized_to (int resized)
-{
-  win_resized = resized;
-}
-
-
 /* Answer a pointer to the current layout definition.  */
 struct tui_layout_def *
 tui_layout_def (void)
diff --git a/gdb/tui/tui-io.c b/gdb/tui/tui-io.c
index 601d278..4c7fca8 100644
--- a/gdb/tui/tui-io.c
+++ b/gdb/tui/tui-io.c
@@ -146,8 +146,6 @@ static int tui_readline_pipe[2];
    This may be the main gdb prompt or a secondary prompt.  */
 static char *tui_rl_saved_prompt;
 
-static unsigned int tui_handle_resize_during_io (unsigned int);
-
 static void
 tui_putc (char c)
 {
@@ -653,7 +651,6 @@ tui_getc (FILE *fp)
 #endif
 
   ch = wgetch (w);
-  ch = tui_handle_resize_during_io (ch);
 
   /* The \n must be echoed because it will not be printed by
      readline.  */
@@ -694,21 +691,3 @@ tui_getc (FILE *fp)
   
   return ch;
 }
-
-
-/* Cleanup when a resize has occured.
-   Returns the character that must be processed.  */
-static unsigned int
-tui_handle_resize_during_io (unsigned int original_ch)
-{
-  if (tui_win_resized ())
-    {
-      tui_resize_all ();
-      tui_refresh_all_win ();
-      dont_repeat ();
-      tui_set_win_resized_to (FALSE);
-      return '\n';
-    }
-  else
-    return original_ch;
-}
diff --git a/gdb/tui/tui-win.c b/gdb/tui/tui-win.c
index 9c7a23f..095097a 100644
--- a/gdb/tui/tui-win.c
+++ b/gdb/tui/tui-win.c
@@ -29,6 +29,7 @@
 #include "symtab.h"
 #include "breakpoint.h"
 #include "frame.h"
+#include "event-loop.h"
 #include "cli/cli-cmds.h"
 #include "top.h"
 #include "source.h"
@@ -72,7 +73,7 @@ static void tui_scroll_right_command (char *, int);
 static void parse_scrolling_args (char *, 
 				  struct tui_win_info **, 
 				  int *);
-
+static void tui_handle_resize (void *);
 
 /***************************************
 ** DEFINITIONS
@@ -457,6 +458,31 @@ bold-standout   use extra bright or bold with standout mode"),
 			&tui_setlist, &tui_showlist);
 }
 
+/* This is called from the main event loop after we catch SIGWINCH */
+void
+tui_handle_resize (void *signal)
+{
+  char cmd[50];
+  int col, row;
+  if (tui_active)
+    {
+      tui_resize_all ();
+      tui_refresh_all_win ();
+      xsnprintf (cmd, sizeof (cmd), "set width %d", TUI_CMD_WIN->generic.width);
+      execute_command (cmd, 0);
+      xsnprintf (cmd, sizeof (cmd), "set height %d", TUI_CMD_WIN->generic.height);
+      execute_command (cmd, 0);
+    }
+  else
+    {
+      rl_get_screen_size (&row, &col);
+      xsnprintf (cmd, sizeof (cmd), "set width %d", col);
+      execute_command (cmd, 0);
+      xsnprintf (cmd, sizeof (cmd), "set height %d", row);
+      execute_command (cmd, 0);
+    }
+}
+
 /* Update gdb's knowledge of the terminal size.  */
 void
 tui_update_gdb_sizes (void)
@@ -670,7 +696,7 @@ tui_resize_all (void)
 
 #ifdef HAVE_RESIZE_TERM
       resize_term (screenheight, screenwidth);
-#endif      
+#endif
       /* Turn keypad off while we resize.  */
       if (win_with_focus != TUI_CMD_WIN)
 	keypad (TUI_CMD_WIN->generic.handle, FALSE);
@@ -818,9 +844,13 @@ tui_resize_all (void)
 static void
 tui_sigwinch_handler (int signal)
 {
-  /* Say that a resize was done so that the readline can do it later
-     when appropriate.  */
-  tui_set_win_resized_to (TRUE);
+  /* Say that a resize was done so that the we can update
+     the UI when appropriate. */
+  struct tui_translate data;
+  data.value = signal;
+  rl_cleanup_after_signal ();
+  rl_resize_terminal ();
+  mark_async_signal_handler (create_async_signal_handler (tui_handle_resize, &data));
 }
 #endif
 
diff --git a/gdb/utils.c b/gdb/utils.c
index 3915b58..ae0342a 100644
--- a/gdb/utils.c
+++ b/gdb/utils.c
@@ -1686,6 +1686,8 @@ init_page_info (void)
       chars_per_line = cols;
 #else
       /* Make sure Readline has initialized its terminal settings.  */
+      rl_change_environment = 0;
+      rl_prefer_env_winsize = 0;
       rl_reset_terminal (NULL);
 
       /* Get the screen size from Readline.  */
@@ -1775,8 +1777,9 @@ set_screen_size (void)
   if (cols <= 0)
     cols = INT_MAX;
 
-  /* Update Readline's idea of the terminal size.  */
-  rl_set_screen_size (rows, cols);
+  /* Don't update with tui active or it will be too large */
+  if (!tui_active)
+      rl_set_screen_size (rows, cols);
 }
 
 /* Reinitialize WRAP_BUFFER according to the current value of

^ permalink raw reply	[flat|nested] 25+ messages in thread

* [PATCH] [PR gdb/16762 gdb/15958] Fixes for properly resizing TUI
@ 2014-10-09 15:57 CustaiCo
  0 siblings, 0 replies; 25+ messages in thread
From: CustaiCo @ 2014-10-09 15:57 UTC (permalink / raw)
  To: gdb-patches

[-- Attachment #1: Type: text/plain, Size: 2445 bytes --]

This patch is to fix Bug 16762 - GDB doesn't update display size when host
terminal resize, and it inadvertently fixes Bug 15958 - readline modifies
env (LINES+COLUMNS) as well.

Before it was getting it's size data from curses, but curses is not
available to the readline based interface, so things would get out of sync.
The readline based interface had no way at all to know if there had been
any changes to the size of the window. 

I have changed it so that both the sides use the same callback function. The
event handler has been changed to call some clean up operations that
readlines needs and then puts in a request to call the resize function in 
the main event loop on the next pass. It does change a couple new parameters
that readline 6.3 introduces, rl_change_environment and rl_prefer_env_winsize
They make it so readline does not set ROWS or COLUMNS in the environment,
and seems to be suggested by the ncurses FAQ [1]. The previous method
that handedled resizing after getting input from curses, along with some
support code, has been removed.

The only problem I am aware of with this patch is that until the first
character is typed after resizing in curses mode, you do not see
the contents of the command window. This seems to have no impact on any
other function. Resizing with, without, or any number of switches in
between curses and readline modes were unable to produce a out of sync
size report for me. Without the patch, any resize operation shrinks the
size of the command portion of the window to 3 lines, which is retained
as the full height of the screen in readline mode until you exit the 
session.

I see no regressions in the test suite, even though this isn't the
sort of issue that automated testing is very good at.

CustaiCo

[1] http://invisible-island.net/ncurses/ncurses.faq.html#handle_resize

                === gdb Summary ===

# of expected passes            28624
# of unexpected failures        98
# of unexpected successes       1
# of expected failures          58
# of known failures             55
# of unresolved testcases       12
# of untested testcases         46
# of unsupported tests          184

---
 gdb/ChangeLog      | 14 ++++++++++++++
 gdb/tui/tui-data.c | 16 ----------------
 gdb/tui/tui-io.c   | 21 ---------------------
 gdb/tui/tui-win.c  | 40 +++++++++++++++++++++++++++++++++++-----
 gdb/utils.c        |  7 +++++--
 5 files changed, 54 insertions(+), 44 deletions(-)


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Fixes-issue-gdb-16762-and-gdb-15958.patch --]
[-- Type: text/x-patch; name="0001-Fixes-issue-gdb-16762-and-gdb-15958.patch", Size: 5560 bytes --]

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index ee82f1f..73be21b 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,17 @@
+2014-10-09  CustaiCo  <custaico@openmailbox.org>
+
+	PR gdb/16762
+	PR gdb/15958
+	* tui/tui-win.c: Changed the signal handling code to use the main
+	event loop.
+	* tui/tui-io.c: tui_handle_resize_during_io is not needed. The main
+	event loop handles the call back to resized the windows.
+	* tui/tui-data.c: Support methods for tui_handle_resize_during_io
+	removed.
+	* utils.c: Set new option in latest readline to prevent
+	environment from being changed. Also changed to not incorrectly resize
+	window when tui running.
+
 2014-10-09  Yao Qi  <yao@codesourcery.com>
 
 	* infrun.c (handle_signal_stop): Remove local variable
diff --git a/gdb/tui/tui-data.c b/gdb/tui/tui-data.c
index 7e51b3e..06ea29b 100644
--- a/gdb/tui/tui-data.c
+++ b/gdb/tui/tui-data.c
@@ -98,22 +98,6 @@ tui_set_win_highlight (struct tui_win_info *win_info,
 ** ACCESSORS & MUTATORS FOR PRIVATE DATA
 ******************************************/
 
-/* Answer a whether the terminal window has been resized or not.  */
-int
-tui_win_resized (void)
-{
-  return win_resized;
-}
-
-
-/* Set a whether the terminal window has been resized or not.  */
-void
-tui_set_win_resized_to (int resized)
-{
-  win_resized = resized;
-}
-
-
 /* Answer a pointer to the current layout definition.  */
 struct tui_layout_def *
 tui_layout_def (void)
diff --git a/gdb/tui/tui-io.c b/gdb/tui/tui-io.c
index 601d278..4c7fca8 100644
--- a/gdb/tui/tui-io.c
+++ b/gdb/tui/tui-io.c
@@ -146,8 +146,6 @@ static int tui_readline_pipe[2];
    This may be the main gdb prompt or a secondary prompt.  */
 static char *tui_rl_saved_prompt;
 
-static unsigned int tui_handle_resize_during_io (unsigned int);
-
 static void
 tui_putc (char c)
 {
@@ -653,7 +651,6 @@ tui_getc (FILE *fp)
 #endif
 
   ch = wgetch (w);
-  ch = tui_handle_resize_during_io (ch);
 
   /* The \n must be echoed because it will not be printed by
      readline.  */
@@ -694,21 +691,3 @@ tui_getc (FILE *fp)
   
   return ch;
 }
-
-
-/* Cleanup when a resize has occured.
-   Returns the character that must be processed.  */
-static unsigned int
-tui_handle_resize_during_io (unsigned int original_ch)
-{
-  if (tui_win_resized ())
-    {
-      tui_resize_all ();
-      tui_refresh_all_win ();
-      dont_repeat ();
-      tui_set_win_resized_to (FALSE);
-      return '\n';
-    }
-  else
-    return original_ch;
-}
diff --git a/gdb/tui/tui-win.c b/gdb/tui/tui-win.c
index 9c7a23f..095097a 100644
--- a/gdb/tui/tui-win.c
+++ b/gdb/tui/tui-win.c
@@ -29,6 +29,7 @@
 #include "symtab.h"
 #include "breakpoint.h"
 #include "frame.h"
+#include "event-loop.h"
 #include "cli/cli-cmds.h"
 #include "top.h"
 #include "source.h"
@@ -72,7 +73,7 @@ static void tui_scroll_right_command (char *, int);
 static void parse_scrolling_args (char *, 
 				  struct tui_win_info **, 
 				  int *);
-
+static void tui_handle_resize (void *);
 
 /***************************************
 ** DEFINITIONS
@@ -457,6 +458,31 @@ bold-standout   use extra bright or bold with standout mode"),
 			&tui_setlist, &tui_showlist);
 }
 
+/* This is called from the main event loop after we catch SIGWINCH */
+void
+tui_handle_resize (void *signal)
+{
+  char cmd[50];
+  int col, row;
+  if (tui_active)
+    {
+      tui_resize_all ();
+      tui_refresh_all_win ();
+      xsnprintf (cmd, sizeof (cmd), "set width %d", TUI_CMD_WIN->generic.width);
+      execute_command (cmd, 0);
+      xsnprintf (cmd, sizeof (cmd), "set height %d", TUI_CMD_WIN->generic.height);
+      execute_command (cmd, 0);
+    }
+  else
+    {
+      rl_get_screen_size (&row, &col);
+      xsnprintf (cmd, sizeof (cmd), "set width %d", col);
+      execute_command (cmd, 0);
+      xsnprintf (cmd, sizeof (cmd), "set height %d", row);
+      execute_command (cmd, 0);
+    }
+}
+
 /* Update gdb's knowledge of the terminal size.  */
 void
 tui_update_gdb_sizes (void)
@@ -670,7 +696,7 @@ tui_resize_all (void)
 
 #ifdef HAVE_RESIZE_TERM
       resize_term (screenheight, screenwidth);
-#endif      
+#endif
       /* Turn keypad off while we resize.  */
       if (win_with_focus != TUI_CMD_WIN)
 	keypad (TUI_CMD_WIN->generic.handle, FALSE);
@@ -818,9 +844,13 @@ tui_resize_all (void)
 static void
 tui_sigwinch_handler (int signal)
 {
-  /* Say that a resize was done so that the readline can do it later
-     when appropriate.  */
-  tui_set_win_resized_to (TRUE);
+  /* Say that a resize was done so that the we can update
+     the UI when appropriate. */
+  struct tui_translate data;
+  data.value = signal;
+  rl_cleanup_after_signal ();
+  rl_resize_terminal ();
+  mark_async_signal_handler (create_async_signal_handler (tui_handle_resize, &data));
 }
 #endif
 
diff --git a/gdb/utils.c b/gdb/utils.c
index 3915b58..ae0342a 100644
--- a/gdb/utils.c
+++ b/gdb/utils.c
@@ -1686,6 +1686,8 @@ init_page_info (void)
       chars_per_line = cols;
 #else
       /* Make sure Readline has initialized its terminal settings.  */
+      rl_change_environment = 0;
+      rl_prefer_env_winsize = 0;
       rl_reset_terminal (NULL);
 
       /* Get the screen size from Readline.  */
@@ -1775,8 +1777,9 @@ set_screen_size (void)
   if (cols <= 0)
     cols = INT_MAX;
 
-  /* Update Readline's idea of the terminal size.  */
-  rl_set_screen_size (rows, cols);
+  /* Don't update with tui active or it will be too large */
+  if (!tui_active)
+      rl_set_screen_size (rows, cols);
 }
 
 /* Reinitialize WRAP_BUFFER according to the current value of

^ permalink raw reply	[flat|nested] 25+ messages in thread

* [PATCH] [PR gdb/16762 gdb/15958] Fixes for properly resizing TUI
@ 2014-10-09 15:57 CustaiCo
  0 siblings, 0 replies; 25+ messages in thread
From: CustaiCo @ 2014-10-09 15:57 UTC (permalink / raw)
  To: gdb-patches

[-- Attachment #1: Type: text/plain, Size: 2445 bytes --]

This patch is to fix Bug 16762 - GDB doesn't update display size when host
terminal resize, and it inadvertently fixes Bug 15958 - readline modifies
env (LINES+COLUMNS) as well.

Before it was getting it's size data from curses, but curses is not
available to the readline based interface, so things would get out of sync.
The readline based interface had no way at all to know if there had been
any changes to the size of the window. 

I have changed it so that both the sides use the same callback function. The
event handler has been changed to call some clean up operations that
readlines needs and then puts in a request to call the resize function in 
the main event loop on the next pass. It does change a couple new parameters
that readline 6.3 introduces, rl_change_environment and rl_prefer_env_winsize
They make it so readline does not set ROWS or COLUMNS in the environment,
and seems to be suggested by the ncurses FAQ [1]. The previous method
that handedled resizing after getting input from curses, along with some
support code, has been removed.

The only problem I am aware of with this patch is that until the first
character is typed after resizing in curses mode, you do not see
the contents of the command window. This seems to have no impact on any
other function. Resizing with, without, or any number of switches in
between curses and readline modes were unable to produce a out of sync
size report for me. Without the patch, any resize operation shrinks the
size of the command portion of the window to 3 lines, which is retained
as the full height of the screen in readline mode until you exit the 
session.

I see no regressions in the test suite, even though this isn't the
sort of issue that automated testing is very good at.

CustaiCo

[1] http://invisible-island.net/ncurses/ncurses.faq.html#handle_resize

                === gdb Summary ===

# of expected passes            28624
# of unexpected failures        98
# of unexpected successes       1
# of expected failures          58
# of known failures             55
# of unresolved testcases       12
# of untested testcases         46
# of unsupported tests          184

---
 gdb/ChangeLog      | 14 ++++++++++++++
 gdb/tui/tui-data.c | 16 ----------------
 gdb/tui/tui-io.c   | 21 ---------------------
 gdb/tui/tui-win.c  | 40 +++++++++++++++++++++++++++++++++++-----
 gdb/utils.c        |  7 +++++--
 5 files changed, 54 insertions(+), 44 deletions(-)


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Fixes-issue-gdb-16762-and-gdb-15958.patch --]
[-- Type: text/x-patch; name="0001-Fixes-issue-gdb-16762-and-gdb-15958.patch", Size: 5560 bytes --]

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index ee82f1f..73be21b 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,17 @@
+2014-10-09  CustaiCo  <custaico@openmailbox.org>
+
+	PR gdb/16762
+	PR gdb/15958
+	* tui/tui-win.c: Changed the signal handling code to use the main
+	event loop.
+	* tui/tui-io.c: tui_handle_resize_during_io is not needed. The main
+	event loop handles the call back to resized the windows.
+	* tui/tui-data.c: Support methods for tui_handle_resize_during_io
+	removed.
+	* utils.c: Set new option in latest readline to prevent
+	environment from being changed. Also changed to not incorrectly resize
+	window when tui running.
+
 2014-10-09  Yao Qi  <yao@codesourcery.com>
 
 	* infrun.c (handle_signal_stop): Remove local variable
diff --git a/gdb/tui/tui-data.c b/gdb/tui/tui-data.c
index 7e51b3e..06ea29b 100644
--- a/gdb/tui/tui-data.c
+++ b/gdb/tui/tui-data.c
@@ -98,22 +98,6 @@ tui_set_win_highlight (struct tui_win_info *win_info,
 ** ACCESSORS & MUTATORS FOR PRIVATE DATA
 ******************************************/
 
-/* Answer a whether the terminal window has been resized or not.  */
-int
-tui_win_resized (void)
-{
-  return win_resized;
-}
-
-
-/* Set a whether the terminal window has been resized or not.  */
-void
-tui_set_win_resized_to (int resized)
-{
-  win_resized = resized;
-}
-
-
 /* Answer a pointer to the current layout definition.  */
 struct tui_layout_def *
 tui_layout_def (void)
diff --git a/gdb/tui/tui-io.c b/gdb/tui/tui-io.c
index 601d278..4c7fca8 100644
--- a/gdb/tui/tui-io.c
+++ b/gdb/tui/tui-io.c
@@ -146,8 +146,6 @@ static int tui_readline_pipe[2];
    This may be the main gdb prompt or a secondary prompt.  */
 static char *tui_rl_saved_prompt;
 
-static unsigned int tui_handle_resize_during_io (unsigned int);
-
 static void
 tui_putc (char c)
 {
@@ -653,7 +651,6 @@ tui_getc (FILE *fp)
 #endif
 
   ch = wgetch (w);
-  ch = tui_handle_resize_during_io (ch);
 
   /* The \n must be echoed because it will not be printed by
      readline.  */
@@ -694,21 +691,3 @@ tui_getc (FILE *fp)
   
   return ch;
 }
-
-
-/* Cleanup when a resize has occured.
-   Returns the character that must be processed.  */
-static unsigned int
-tui_handle_resize_during_io (unsigned int original_ch)
-{
-  if (tui_win_resized ())
-    {
-      tui_resize_all ();
-      tui_refresh_all_win ();
-      dont_repeat ();
-      tui_set_win_resized_to (FALSE);
-      return '\n';
-    }
-  else
-    return original_ch;
-}
diff --git a/gdb/tui/tui-win.c b/gdb/tui/tui-win.c
index 9c7a23f..095097a 100644
--- a/gdb/tui/tui-win.c
+++ b/gdb/tui/tui-win.c
@@ -29,6 +29,7 @@
 #include "symtab.h"
 #include "breakpoint.h"
 #include "frame.h"
+#include "event-loop.h"
 #include "cli/cli-cmds.h"
 #include "top.h"
 #include "source.h"
@@ -72,7 +73,7 @@ static void tui_scroll_right_command (char *, int);
 static void parse_scrolling_args (char *, 
 				  struct tui_win_info **, 
 				  int *);
-
+static void tui_handle_resize (void *);
 
 /***************************************
 ** DEFINITIONS
@@ -457,6 +458,31 @@ bold-standout   use extra bright or bold with standout mode"),
 			&tui_setlist, &tui_showlist);
 }
 
+/* This is called from the main event loop after we catch SIGWINCH */
+void
+tui_handle_resize (void *signal)
+{
+  char cmd[50];
+  int col, row;
+  if (tui_active)
+    {
+      tui_resize_all ();
+      tui_refresh_all_win ();
+      xsnprintf (cmd, sizeof (cmd), "set width %d", TUI_CMD_WIN->generic.width);
+      execute_command (cmd, 0);
+      xsnprintf (cmd, sizeof (cmd), "set height %d", TUI_CMD_WIN->generic.height);
+      execute_command (cmd, 0);
+    }
+  else
+    {
+      rl_get_screen_size (&row, &col);
+      xsnprintf (cmd, sizeof (cmd), "set width %d", col);
+      execute_command (cmd, 0);
+      xsnprintf (cmd, sizeof (cmd), "set height %d", row);
+      execute_command (cmd, 0);
+    }
+}
+
 /* Update gdb's knowledge of the terminal size.  */
 void
 tui_update_gdb_sizes (void)
@@ -670,7 +696,7 @@ tui_resize_all (void)
 
 #ifdef HAVE_RESIZE_TERM
       resize_term (screenheight, screenwidth);
-#endif      
+#endif
       /* Turn keypad off while we resize.  */
       if (win_with_focus != TUI_CMD_WIN)
 	keypad (TUI_CMD_WIN->generic.handle, FALSE);
@@ -818,9 +844,13 @@ tui_resize_all (void)
 static void
 tui_sigwinch_handler (int signal)
 {
-  /* Say that a resize was done so that the readline can do it later
-     when appropriate.  */
-  tui_set_win_resized_to (TRUE);
+  /* Say that a resize was done so that the we can update
+     the UI when appropriate. */
+  struct tui_translate data;
+  data.value = signal;
+  rl_cleanup_after_signal ();
+  rl_resize_terminal ();
+  mark_async_signal_handler (create_async_signal_handler (tui_handle_resize, &data));
 }
 #endif
 
diff --git a/gdb/utils.c b/gdb/utils.c
index 3915b58..ae0342a 100644
--- a/gdb/utils.c
+++ b/gdb/utils.c
@@ -1686,6 +1686,8 @@ init_page_info (void)
       chars_per_line = cols;
 #else
       /* Make sure Readline has initialized its terminal settings.  */
+      rl_change_environment = 0;
+      rl_prefer_env_winsize = 0;
       rl_reset_terminal (NULL);
 
       /* Get the screen size from Readline.  */
@@ -1775,8 +1777,9 @@ set_screen_size (void)
   if (cols <= 0)
     cols = INT_MAX;
 
-  /* Update Readline's idea of the terminal size.  */
-  rl_set_screen_size (rows, cols);
+  /* Don't update with tui active or it will be too large */
+  if (!tui_active)
+      rl_set_screen_size (rows, cols);
 }
 
 /* Reinitialize WRAP_BUFFER according to the current value of

^ permalink raw reply	[flat|nested] 25+ messages in thread

* [PATCH] [PR gdb/16762 gdb/15958] Fixes for properly resizing TUI
@ 2014-10-09 15:57 CustaiCo
  0 siblings, 0 replies; 25+ messages in thread
From: CustaiCo @ 2014-10-09 15:57 UTC (permalink / raw)
  To: gdb-patches

[-- Attachment #1: Type: text/plain, Size: 2445 bytes --]

This patch is to fix Bug 16762 - GDB doesn't update display size when host
terminal resize, and it inadvertently fixes Bug 15958 - readline modifies
env (LINES+COLUMNS) as well.

Before it was getting it's size data from curses, but curses is not
available to the readline based interface, so things would get out of sync.
The readline based interface had no way at all to know if there had been
any changes to the size of the window. 

I have changed it so that both the sides use the same callback function. The
event handler has been changed to call some clean up operations that
readlines needs and then puts in a request to call the resize function in 
the main event loop on the next pass. It does change a couple new parameters
that readline 6.3 introduces, rl_change_environment and rl_prefer_env_winsize
They make it so readline does not set ROWS or COLUMNS in the environment,
and seems to be suggested by the ncurses FAQ [1]. The previous method
that handedled resizing after getting input from curses, along with some
support code, has been removed.

The only problem I am aware of with this patch is that until the first
character is typed after resizing in curses mode, you do not see
the contents of the command window. This seems to have no impact on any
other function. Resizing with, without, or any number of switches in
between curses and readline modes were unable to produce a out of sync
size report for me. Without the patch, any resize operation shrinks the
size of the command portion of the window to 3 lines, which is retained
as the full height of the screen in readline mode until you exit the 
session.

I see no regressions in the test suite, even though this isn't the
sort of issue that automated testing is very good at.

CustaiCo

[1] http://invisible-island.net/ncurses/ncurses.faq.html#handle_resize

                === gdb Summary ===

# of expected passes            28624
# of unexpected failures        98
# of unexpected successes       1
# of expected failures          58
# of known failures             55
# of unresolved testcases       12
# of untested testcases         46
# of unsupported tests          184

---
 gdb/ChangeLog      | 14 ++++++++++++++
 gdb/tui/tui-data.c | 16 ----------------
 gdb/tui/tui-io.c   | 21 ---------------------
 gdb/tui/tui-win.c  | 40 +++++++++++++++++++++++++++++++++++-----
 gdb/utils.c        |  7 +++++--
 5 files changed, 54 insertions(+), 44 deletions(-)


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Fixes-issue-gdb-16762-and-gdb-15958.patch --]
[-- Type: text/x-patch; name="0001-Fixes-issue-gdb-16762-and-gdb-15958.patch", Size: 5560 bytes --]

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index ee82f1f..73be21b 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,17 @@
+2014-10-09  CustaiCo  <custaico@openmailbox.org>
+
+	PR gdb/16762
+	PR gdb/15958
+	* tui/tui-win.c: Changed the signal handling code to use the main
+	event loop.
+	* tui/tui-io.c: tui_handle_resize_during_io is not needed. The main
+	event loop handles the call back to resized the windows.
+	* tui/tui-data.c: Support methods for tui_handle_resize_during_io
+	removed.
+	* utils.c: Set new option in latest readline to prevent
+	environment from being changed. Also changed to not incorrectly resize
+	window when tui running.
+
 2014-10-09  Yao Qi  <yao@codesourcery.com>
 
 	* infrun.c (handle_signal_stop): Remove local variable
diff --git a/gdb/tui/tui-data.c b/gdb/tui/tui-data.c
index 7e51b3e..06ea29b 100644
--- a/gdb/tui/tui-data.c
+++ b/gdb/tui/tui-data.c
@@ -98,22 +98,6 @@ tui_set_win_highlight (struct tui_win_info *win_info,
 ** ACCESSORS & MUTATORS FOR PRIVATE DATA
 ******************************************/
 
-/* Answer a whether the terminal window has been resized or not.  */
-int
-tui_win_resized (void)
-{
-  return win_resized;
-}
-
-
-/* Set a whether the terminal window has been resized or not.  */
-void
-tui_set_win_resized_to (int resized)
-{
-  win_resized = resized;
-}
-
-
 /* Answer a pointer to the current layout definition.  */
 struct tui_layout_def *
 tui_layout_def (void)
diff --git a/gdb/tui/tui-io.c b/gdb/tui/tui-io.c
index 601d278..4c7fca8 100644
--- a/gdb/tui/tui-io.c
+++ b/gdb/tui/tui-io.c
@@ -146,8 +146,6 @@ static int tui_readline_pipe[2];
    This may be the main gdb prompt or a secondary prompt.  */
 static char *tui_rl_saved_prompt;
 
-static unsigned int tui_handle_resize_during_io (unsigned int);
-
 static void
 tui_putc (char c)
 {
@@ -653,7 +651,6 @@ tui_getc (FILE *fp)
 #endif
 
   ch = wgetch (w);
-  ch = tui_handle_resize_during_io (ch);
 
   /* The \n must be echoed because it will not be printed by
      readline.  */
@@ -694,21 +691,3 @@ tui_getc (FILE *fp)
   
   return ch;
 }
-
-
-/* Cleanup when a resize has occured.
-   Returns the character that must be processed.  */
-static unsigned int
-tui_handle_resize_during_io (unsigned int original_ch)
-{
-  if (tui_win_resized ())
-    {
-      tui_resize_all ();
-      tui_refresh_all_win ();
-      dont_repeat ();
-      tui_set_win_resized_to (FALSE);
-      return '\n';
-    }
-  else
-    return original_ch;
-}
diff --git a/gdb/tui/tui-win.c b/gdb/tui/tui-win.c
index 9c7a23f..095097a 100644
--- a/gdb/tui/tui-win.c
+++ b/gdb/tui/tui-win.c
@@ -29,6 +29,7 @@
 #include "symtab.h"
 #include "breakpoint.h"
 #include "frame.h"
+#include "event-loop.h"
 #include "cli/cli-cmds.h"
 #include "top.h"
 #include "source.h"
@@ -72,7 +73,7 @@ static void tui_scroll_right_command (char *, int);
 static void parse_scrolling_args (char *, 
 				  struct tui_win_info **, 
 				  int *);
-
+static void tui_handle_resize (void *);
 
 /***************************************
 ** DEFINITIONS
@@ -457,6 +458,31 @@ bold-standout   use extra bright or bold with standout mode"),
 			&tui_setlist, &tui_showlist);
 }
 
+/* This is called from the main event loop after we catch SIGWINCH */
+void
+tui_handle_resize (void *signal)
+{
+  char cmd[50];
+  int col, row;
+  if (tui_active)
+    {
+      tui_resize_all ();
+      tui_refresh_all_win ();
+      xsnprintf (cmd, sizeof (cmd), "set width %d", TUI_CMD_WIN->generic.width);
+      execute_command (cmd, 0);
+      xsnprintf (cmd, sizeof (cmd), "set height %d", TUI_CMD_WIN->generic.height);
+      execute_command (cmd, 0);
+    }
+  else
+    {
+      rl_get_screen_size (&row, &col);
+      xsnprintf (cmd, sizeof (cmd), "set width %d", col);
+      execute_command (cmd, 0);
+      xsnprintf (cmd, sizeof (cmd), "set height %d", row);
+      execute_command (cmd, 0);
+    }
+}
+
 /* Update gdb's knowledge of the terminal size.  */
 void
 tui_update_gdb_sizes (void)
@@ -670,7 +696,7 @@ tui_resize_all (void)
 
 #ifdef HAVE_RESIZE_TERM
       resize_term (screenheight, screenwidth);
-#endif      
+#endif
       /* Turn keypad off while we resize.  */
       if (win_with_focus != TUI_CMD_WIN)
 	keypad (TUI_CMD_WIN->generic.handle, FALSE);
@@ -818,9 +844,13 @@ tui_resize_all (void)
 static void
 tui_sigwinch_handler (int signal)
 {
-  /* Say that a resize was done so that the readline can do it later
-     when appropriate.  */
-  tui_set_win_resized_to (TRUE);
+  /* Say that a resize was done so that the we can update
+     the UI when appropriate. */
+  struct tui_translate data;
+  data.value = signal;
+  rl_cleanup_after_signal ();
+  rl_resize_terminal ();
+  mark_async_signal_handler (create_async_signal_handler (tui_handle_resize, &data));
 }
 #endif
 
diff --git a/gdb/utils.c b/gdb/utils.c
index 3915b58..ae0342a 100644
--- a/gdb/utils.c
+++ b/gdb/utils.c
@@ -1686,6 +1686,8 @@ init_page_info (void)
       chars_per_line = cols;
 #else
       /* Make sure Readline has initialized its terminal settings.  */
+      rl_change_environment = 0;
+      rl_prefer_env_winsize = 0;
       rl_reset_terminal (NULL);
 
       /* Get the screen size from Readline.  */
@@ -1775,8 +1777,9 @@ set_screen_size (void)
   if (cols <= 0)
     cols = INT_MAX;
 
-  /* Update Readline's idea of the terminal size.  */
-  rl_set_screen_size (rows, cols);
+  /* Don't update with tui active or it will be too large */
+  if (!tui_active)
+      rl_set_screen_size (rows, cols);
 }
 
 /* Reinitialize WRAP_BUFFER according to the current value of

^ permalink raw reply	[flat|nested] 25+ messages in thread

* [PATCH] [PR gdb/16762 gdb/15958] Fixes for properly resizing TUI
@ 2014-10-09 15:57 CustaiCo
  0 siblings, 0 replies; 25+ messages in thread
From: CustaiCo @ 2014-10-09 15:57 UTC (permalink / raw)
  To: gdb-patches

[-- Attachment #1: Type: text/plain, Size: 2445 bytes --]

This patch is to fix Bug 16762 - GDB doesn't update display size when host
terminal resize, and it inadvertently fixes Bug 15958 - readline modifies
env (LINES+COLUMNS) as well.

Before it was getting it's size data from curses, but curses is not
available to the readline based interface, so things would get out of sync.
The readline based interface had no way at all to know if there had been
any changes to the size of the window. 

I have changed it so that both the sides use the same callback function. The
event handler has been changed to call some clean up operations that
readlines needs and then puts in a request to call the resize function in 
the main event loop on the next pass. It does change a couple new parameters
that readline 6.3 introduces, rl_change_environment and rl_prefer_env_winsize
They make it so readline does not set ROWS or COLUMNS in the environment,
and seems to be suggested by the ncurses FAQ [1]. The previous method
that handedled resizing after getting input from curses, along with some
support code, has been removed.

The only problem I am aware of with this patch is that until the first
character is typed after resizing in curses mode, you do not see
the contents of the command window. This seems to have no impact on any
other function. Resizing with, without, or any number of switches in
between curses and readline modes were unable to produce a out of sync
size report for me. Without the patch, any resize operation shrinks the
size of the command portion of the window to 3 lines, which is retained
as the full height of the screen in readline mode until you exit the 
session.

I see no regressions in the test suite, even though this isn't the
sort of issue that automated testing is very good at.

CustaiCo

[1] http://invisible-island.net/ncurses/ncurses.faq.html#handle_resize

                === gdb Summary ===

# of expected passes            28624
# of unexpected failures        98
# of unexpected successes       1
# of expected failures          58
# of known failures             55
# of unresolved testcases       12
# of untested testcases         46
# of unsupported tests          184

---
 gdb/ChangeLog      | 14 ++++++++++++++
 gdb/tui/tui-data.c | 16 ----------------
 gdb/tui/tui-io.c   | 21 ---------------------
 gdb/tui/tui-win.c  | 40 +++++++++++++++++++++++++++++++++++-----
 gdb/utils.c        |  7 +++++--
 5 files changed, 54 insertions(+), 44 deletions(-)


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Fixes-issue-gdb-16762-and-gdb-15958.patch --]
[-- Type: text/x-patch; name="0001-Fixes-issue-gdb-16762-and-gdb-15958.patch", Size: 5560 bytes --]

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index ee82f1f..73be21b 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,17 @@
+2014-10-09  CustaiCo  <custaico@openmailbox.org>
+
+	PR gdb/16762
+	PR gdb/15958
+	* tui/tui-win.c: Changed the signal handling code to use the main
+	event loop.
+	* tui/tui-io.c: tui_handle_resize_during_io is not needed. The main
+	event loop handles the call back to resized the windows.
+	* tui/tui-data.c: Support methods for tui_handle_resize_during_io
+	removed.
+	* utils.c: Set new option in latest readline to prevent
+	environment from being changed. Also changed to not incorrectly resize
+	window when tui running.
+
 2014-10-09  Yao Qi  <yao@codesourcery.com>
 
 	* infrun.c (handle_signal_stop): Remove local variable
diff --git a/gdb/tui/tui-data.c b/gdb/tui/tui-data.c
index 7e51b3e..06ea29b 100644
--- a/gdb/tui/tui-data.c
+++ b/gdb/tui/tui-data.c
@@ -98,22 +98,6 @@ tui_set_win_highlight (struct tui_win_info *win_info,
 ** ACCESSORS & MUTATORS FOR PRIVATE DATA
 ******************************************/
 
-/* Answer a whether the terminal window has been resized or not.  */
-int
-tui_win_resized (void)
-{
-  return win_resized;
-}
-
-
-/* Set a whether the terminal window has been resized or not.  */
-void
-tui_set_win_resized_to (int resized)
-{
-  win_resized = resized;
-}
-
-
 /* Answer a pointer to the current layout definition.  */
 struct tui_layout_def *
 tui_layout_def (void)
diff --git a/gdb/tui/tui-io.c b/gdb/tui/tui-io.c
index 601d278..4c7fca8 100644
--- a/gdb/tui/tui-io.c
+++ b/gdb/tui/tui-io.c
@@ -146,8 +146,6 @@ static int tui_readline_pipe[2];
    This may be the main gdb prompt or a secondary prompt.  */
 static char *tui_rl_saved_prompt;
 
-static unsigned int tui_handle_resize_during_io (unsigned int);
-
 static void
 tui_putc (char c)
 {
@@ -653,7 +651,6 @@ tui_getc (FILE *fp)
 #endif
 
   ch = wgetch (w);
-  ch = tui_handle_resize_during_io (ch);
 
   /* The \n must be echoed because it will not be printed by
      readline.  */
@@ -694,21 +691,3 @@ tui_getc (FILE *fp)
   
   return ch;
 }
-
-
-/* Cleanup when a resize has occured.
-   Returns the character that must be processed.  */
-static unsigned int
-tui_handle_resize_during_io (unsigned int original_ch)
-{
-  if (tui_win_resized ())
-    {
-      tui_resize_all ();
-      tui_refresh_all_win ();
-      dont_repeat ();
-      tui_set_win_resized_to (FALSE);
-      return '\n';
-    }
-  else
-    return original_ch;
-}
diff --git a/gdb/tui/tui-win.c b/gdb/tui/tui-win.c
index 9c7a23f..095097a 100644
--- a/gdb/tui/tui-win.c
+++ b/gdb/tui/tui-win.c
@@ -29,6 +29,7 @@
 #include "symtab.h"
 #include "breakpoint.h"
 #include "frame.h"
+#include "event-loop.h"
 #include "cli/cli-cmds.h"
 #include "top.h"
 #include "source.h"
@@ -72,7 +73,7 @@ static void tui_scroll_right_command (char *, int);
 static void parse_scrolling_args (char *, 
 				  struct tui_win_info **, 
 				  int *);
-
+static void tui_handle_resize (void *);
 
 /***************************************
 ** DEFINITIONS
@@ -457,6 +458,31 @@ bold-standout   use extra bright or bold with standout mode"),
 			&tui_setlist, &tui_showlist);
 }
 
+/* This is called from the main event loop after we catch SIGWINCH */
+void
+tui_handle_resize (void *signal)
+{
+  char cmd[50];
+  int col, row;
+  if (tui_active)
+    {
+      tui_resize_all ();
+      tui_refresh_all_win ();
+      xsnprintf (cmd, sizeof (cmd), "set width %d", TUI_CMD_WIN->generic.width);
+      execute_command (cmd, 0);
+      xsnprintf (cmd, sizeof (cmd), "set height %d", TUI_CMD_WIN->generic.height);
+      execute_command (cmd, 0);
+    }
+  else
+    {
+      rl_get_screen_size (&row, &col);
+      xsnprintf (cmd, sizeof (cmd), "set width %d", col);
+      execute_command (cmd, 0);
+      xsnprintf (cmd, sizeof (cmd), "set height %d", row);
+      execute_command (cmd, 0);
+    }
+}
+
 /* Update gdb's knowledge of the terminal size.  */
 void
 tui_update_gdb_sizes (void)
@@ -670,7 +696,7 @@ tui_resize_all (void)
 
 #ifdef HAVE_RESIZE_TERM
       resize_term (screenheight, screenwidth);
-#endif      
+#endif
       /* Turn keypad off while we resize.  */
       if (win_with_focus != TUI_CMD_WIN)
 	keypad (TUI_CMD_WIN->generic.handle, FALSE);
@@ -818,9 +844,13 @@ tui_resize_all (void)
 static void
 tui_sigwinch_handler (int signal)
 {
-  /* Say that a resize was done so that the readline can do it later
-     when appropriate.  */
-  tui_set_win_resized_to (TRUE);
+  /* Say that a resize was done so that the we can update
+     the UI when appropriate. */
+  struct tui_translate data;
+  data.value = signal;
+  rl_cleanup_after_signal ();
+  rl_resize_terminal ();
+  mark_async_signal_handler (create_async_signal_handler (tui_handle_resize, &data));
 }
 #endif
 
diff --git a/gdb/utils.c b/gdb/utils.c
index 3915b58..ae0342a 100644
--- a/gdb/utils.c
+++ b/gdb/utils.c
@@ -1686,6 +1686,8 @@ init_page_info (void)
       chars_per_line = cols;
 #else
       /* Make sure Readline has initialized its terminal settings.  */
+      rl_change_environment = 0;
+      rl_prefer_env_winsize = 0;
       rl_reset_terminal (NULL);
 
       /* Get the screen size from Readline.  */
@@ -1775,8 +1777,9 @@ set_screen_size (void)
   if (cols <= 0)
     cols = INT_MAX;
 
-  /* Update Readline's idea of the terminal size.  */
-  rl_set_screen_size (rows, cols);
+  /* Don't update with tui active or it will be too large */
+  if (!tui_active)
+      rl_set_screen_size (rows, cols);
 }
 
 /* Reinitialize WRAP_BUFFER according to the current value of

^ permalink raw reply	[flat|nested] 25+ messages in thread

end of thread, other threads:[~2014-10-24 18:44 UTC | newest]

Thread overview: 25+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-10-09 15:57 [PATCH] [PR gdb/16762 gdb/15958] Fixes for properly resizing TUI CustaiCo
     [not found] <5436b07f.25f9440a.540c.4c6fSMTPIN_ADDED_MISSING@mx.google.com>
2014-10-24 18:44 ` Pedro Alves
  -- strict thread matches above, loose matches on Subject: below --
2014-10-09 15:57 CustaiCo
2014-10-09 15:57 CustaiCo
2014-10-09 15:57 CustaiCo
2014-10-09 15:57 CustaiCo
2014-10-09 15:57 CustaiCo
2014-10-09 15:57 CustaiCo
2014-10-09 15:57 CustaiCo
2014-10-09 15:57 CustaiCo
2014-10-09 15:57 CustaiCo
2014-10-09 15:57 CustaiCo
2014-10-09 15:57 CustaiCo
2014-10-09 15:57 CustaiCo
2014-10-09 15:57 CustaiCo
2014-10-09 15:57 CustaiCo
2014-10-09 15:57 CustaiCo
2014-10-09 15:57 CustaiCo
2014-10-09 15:57 CustaiCo
2014-10-09 15:57 CustaiCo
2014-10-09 15:57 CustaiCo
2014-10-09 15:57 CustaiCo
2014-10-09 15:57 CustaiCo
2014-10-09 15:57 CustaiCo
2014-10-09 15:57 CustaiCo

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox