Subject: bug#32720: term-mode ignores certain window size changes

From: martin rudalics <[email-masked]>
Date: Sun, 04 Nov 2018 10:56:13 +0100

> *Affects*: version 26 (git-bisected to commit 8e7712c7afc)
 >
 > Note: I have only tried this on --without-x emacs
 >
 > *Steps to reproduce*
 >
 >     1. start emacs
 >     2. start a term buffer with M-x term
 >     3. run `seq 1000` at the bash prompt to fill the screen
 >     4. enlarge the terminal window that emacs is running in, so that the
 >     window size changes as well
 >     5. run `seq 1000` again, and observe that the new space at the bottom of
 >     the buffer is not being used
 >
 > *Analysis notes*
 >
 > term-mode *does* pick up changes after more explicit window configurations,
 > like splits; my workaround for months has been to split and join the
 > terminal window whenever I've resized it.
 >
 > As best I can tell, term-mode subscribes to window size changes by adding
 > advice to the window-adjust-process-window-size-function variable, and the
 > 8e7712c7afc reduced the set of situations in which that function is called.
 >
 > I've developed a more automated workaround with a term-load-hook of this
 > form:
 >
 > (add-hook 'window-size-change-functions (lambda (_frame)
 > (window--adjust-process-windows)))
 >
 > It might be that adding this line to the term-mode setup steps would be
 > sufficient, but I'm not familiar enough with the window.el code to have a
 > guess whether that's actually a good approach.

While all you write above is correct and I agree with the fix you
propose, I tend to restore the old behavior as with the attached
patch.  The reason is that I have no idea in how many more yet
unrevealed occasions my commit had adverse effects so I'd rather be on
the safe side for Emacs 26.2.  Please try the patch and tell me
whether it indeed restores the old behavior.

Thanks, martin
diff --git a/src/frame.c b/src/frame.c
index 0a6ca26..8076eba 100644
--- a/src/frame.c
+++ b/src/frame.c
@@ -779,6 +779,8 @@ struct frame *
 
   unblock_input ();
 
+  run_window_configuration_change_hook (f);
+
 #ifdef HAVE_WINDOW_SYSTEM
   {
     /* Adjust size of F's child frames.  */
diff --git a/src/window.c b/src/window.c
index 9026a7b..ef88fde 100644
--- a/src/window.c
+++ b/src/window.c
@@ -57,7 +57,6 @@ static bool foreach_window_1 (struct window *,
 static bool window_resize_check (struct window *, bool);
 static void window_resize_apply (struct window *, bool);
 static void select_window_1 (Lisp_Object, bool);
-static void run_window_configuration_change_hook (struct frame *);
 
 static struct window *set_window_fringes (struct window *, Lisp_Object,
 					  Lisp_Object, Lisp_Object);
@@ -3319,7 +3318,7 @@ depends on the value of (window-start WINDOW), so if calling this
     Fselect_frame (frame, Qt);
 }
 
-static void
+void
 run_window_configuration_change_hook (struct frame *f)
 {
   ptrdiff_t count = SPECPDL_INDEX ();
diff --git a/src/window.h b/src/window.h
index 629283a..bc6d8ab 100644
--- a/src/window.h
+++ b/src/window.h
@@ -1016,6 +1016,7 @@ extern Lisp_Object window_from_coordinates (struct frame *, int, int,
 extern void shrink_mini_window (struct window *, bool);
 extern int window_relative_x_coord (struct window *, enum window_part, int);
 
+void run_window_configuration_change_hook (struct frame *f);
 void run_window_size_change_functions (Lisp_Object);
 
 /* Make WINDOW display BUFFER.  RUN_HOOKS_P means it's allowed
diff --git a/src/xfns.c b/src/xfns.c
index 1381fee..574f0bb 100644
--- a/src/xfns.c
+++ b/src/xfns.c
@@ -1599,4 +1599,5 @@ struct mouse_cursor_data {
     }
 #endif /* not USE_X_TOOLKIT && not USE_GTK */
   adjust_frame_glyphs (f);
+  run_window_configuration_change_hook (f);
 }