Ncurses does not change the mode back, thus leaving some terminals,
such as foot, in a different state than when they started.
---

This is a patch against stable branch.

See gitlab ticket: https://gitlab.com/muttmua/mutt/-/work_items/528
and also the foot ticket referenced there at:
https://codeberg.org/dnkl/foot/issues/2393

I also emailed Thomas Dickey to check with him about this.  He
confirmed that meta() is not reset.  It's apparently a rarely set
mode, and so he also advised to turn it back off before exiting.

 curs_lib.c    | 10 ++++++++++
 main.c        |  9 ++++++++-
 mutt_curses.h |  1 +
 3 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/curs_lib.c b/curs_lib.c
index 5c93cbb0..62451c43 100644
--- a/curs_lib.c
+++ b/curs_lib.c
@@ -1008,6 +1008,16 @@ void mutt_show_error(void)
   mutt_window_clrtoeol(MuttMessageWindow);
 }
 
+/* Before exiting, turn off features enabled in start_curses() that
+ * are not reversed by endwin().
+ */
+void mutt_curses_cleanup(void)
+{
+#if HAVE_META
+  meta(stdscr, FALSE);
+#endif
+}
+
 void mutt_endwin(const char *msg)
 {
   int e = errno;
diff --git a/main.c b/main.c
index 376d9407..95720f2b 100644
--- a/main.c
+++ b/main.c
@@ -126,7 +126,11 @@ char **envlist;
 
 void mutt_exit(int code)
 {
-  mutt_endwin(NULL);
+  if (!option(OPTNOCURSES))
+  {
+    mutt_curses_cleanup();
+    mutt_endwin(NULL);
+  }
   exit(code);
 }
 
@@ -1433,6 +1437,9 @@ cleanup_and_exit:
   mutt_free_windows();
   mutt_buffer_pool_free();
   if (!option(OPTNOCURSES))
+  {
+    mutt_curses_cleanup();
     mutt_endwin(exit_endwin_msg);
+  }
   exit(exit_code);
 }
diff --git a/mutt_curses.h b/mutt_curses.h
index cdd63c72..75f193ca 100644
--- a/mutt_curses.h
+++ b/mutt_curses.h
@@ -86,6 +86,7 @@ extern int MuttGetchTimeout;
 event_t mutt_getch(void);
 
 void mutt_getch_timeout(int);
+void mutt_curses_cleanup(void);
 void mutt_endwin(const char *);
 void mutt_flushinp(void);
 void mutt_refresh(void);
-- 
2.54.0

Reply via email to