]> git.eshelyaron.com Git - emacs.git/commitdiff
Avoid crashes and assertions while handling SIGWINCH
authorEli Zaretskii <eliz@gnu.org>
Mon, 3 Jun 2024 17:37:31 +0000 (20:37 +0300)
committerEshel Yaron <me@eshelyaron.com>
Mon, 3 Jun 2024 19:33:25 +0000 (21:33 +0200)
* src/dispnew.c (build_frame_matrix_from_leaf_window)
(window_to_frame_vpos): Avoid assertion violations when we have an
unhandled SIGWINCH.
(frame_size_change_delayed): New function.
* src/dispextern.h (frame_size_change_delayed): Add prototype.
* src/cm.c (cmcheckmagic): Don't check magicwrap if we have an
unhandled SIGWINCH.  (Bug#71289)

(cherry picked from commit eb9afd558ec506f1d349dbb61668d6231fda136f)

src/cm.c
src/dispextern.h
src/dispnew.c

index d6b54d507c7e75f53112d50ba4f11b898f20fc99..85fc3e776c8a617d69d6543a79e39ba0a38e600f 100644 (file)
--- a/src/cm.c
+++ b/src/cm.c
@@ -111,6 +111,10 @@ addcol (tty, n) {
 void
 cmcheckmagic (struct tty_display_info *tty)
 {
+  /* If we have unhandled SIGWINCH, we don't really know what are our
+     up-to-date frame diumensions.  */
+  if (frame_size_change_delayed ())
+    return;
   if (curX (tty) == FrameCols (tty))
     {
       if (!MagicWrap (tty) || curY (tty) >= FrameRows (tty) - 1)
index 28e59700469ad1d6539871079274d498d2d37c34..8207e74a90ccba6a79f5dd753175649a58d01a8e 100644 (file)
@@ -3812,6 +3812,7 @@ extern void gui_update_window_end (struct window *, bool, bool);
 #endif
 void do_pending_window_change (bool);
 void change_frame_size (struct frame *, int, int, bool, bool, bool);
+extern bool frame_size_change_delayed (void);
 void init_display (void);
 void syms_of_display (void);
 extern void spec_glyph_lookup_face (struct window *, GLYPH *);
index 8eda8dbb358317e6d8110ab779b3d45a41b01e5f..dfa36a9f54f6ad8ba2becdd5657dc5977cc1e5e5 100644 (file)
@@ -2643,7 +2643,8 @@ build_frame_matrix_from_leaf_window (struct glyph_matrix *frame_matrix, struct w
 #ifdef GLYPH_DEBUG
          /* Window row window_y must be a slice of frame row
             frame_y.  */
-         eassert (glyph_row_slice_p (window_row, frame_row));
+         eassert (delayed_size_change
+                  || glyph_row_slice_p (window_row, frame_row));
 
          /* If rows are in sync, we don't have to copy glyphs because
             frame and window share glyphs.  */
@@ -3149,7 +3150,8 @@ window_to_frame_vpos (struct window *w, int vpos)
   eassert (!FRAME_WINDOW_P (XFRAME (w->frame)));
   eassert (vpos >= 0 && vpos <= w->desired_matrix->nrows);
   vpos += WINDOW_TOP_EDGE_LINE (w);
-  eassert (vpos >= 0 && vpos <= FRAME_TOTAL_LINES (XFRAME (w->frame)));
+  eassert (delayed_size_change
+          || (vpos >= 0 && vpos <= FRAME_TOTAL_LINES (XFRAME (w->frame))));
   return vpos;
 }
 
@@ -6078,6 +6080,15 @@ change_frame_size (struct frame *f, int new_width, int new_height,
   else
     change_frame_size_1 (f, new_width, new_height, pretend, delay, safe);
 }
+
+/* Return non-zero if we delayed size-changes and haven't handled them
+   yet, which means we cannot be sure about the exact dimensions of our
+   frames.  */
+bool
+frame_size_change_delayed (void)
+{
+  return delayed_size_change;
+}
 \f
 /***********************************************************************
                   Terminal Related Lisp Functions