<<< Date Index >>>     <<< Thread Index >>>

Re: Bug#365683: mutt: Segmentation fault under X



Re: To Ryan Claycamp 2007-01-27 <20070127183112.GG32656@xxxxxxxx>
> > When I pressed "?" for help in the mailboxes view my mutt reproducible
> > crashed. This did not happen to other users on my box.
> > 
> > Finally, the configuration lines
> >   set xterm_title="Mutt: %f %r [%?M?%M/?%m%?n? N:%n?%?o? O:%o?%?d? 
> > D:%d?%?F? F:%F?%?t? T:%t?%?p? P:%p?%?b? I:%b?%?l? %l?]-(%s/%S)-(%P)-"
> > # look here:                                                                
> >                  this one is never closed: ^  
> 
> I just tracked this down - the xterm_title line quoted above is
> actually fine (the %l is closed) but the culprit is %P. When called
> for the xterm title, "menu" is undefined.

Hi,

here's the updated xtitles patch. (See
http://bugs.debian.org/365683 for the full discussion.)

Christoph
-- 
cb@xxxxxxxx | http://www.df7cb.de/
# vi: ft=diff
This is the xterm title patch as found on the mutt mailing lists.

* Changes made:
  - 2007-01-27 myon: using %P caused a segfault, updated status.c to catch
    menu==NULL.

== END PATCH
Index: mutt/PATCHES
===================================================================
--- mutt.orig/PATCHES   2007-01-27 19:33:32.932962104 +0100
+++ mutt/PATCHES        2007-01-27 19:33:32.932962104 +0100
@@ -0,0 +1 @@
+patch-1.5.13.nt+ab.xtitles.4
Index: mutt/curs_main.c
===================================================================
--- mutt.orig/curs_main.c       2006-12-12 14:15:02.000000000 +0100
+++ mutt/curs_main.c    2007-01-27 19:33:32.933961952 +0100
@@ -110,6 +110,19 @@ static const char *No_visible = N_("No v
 
 extern size_t UngetCount;
 
+#define ASCII_CTRL_G                  0x07
+#define ASCII_CTRL_OPEN_SQUARE_BRAKET 0x1b
+ 
+void set_xterm_title_bar(char *title)
+{
+  fprintf(stderr ,"%c]2;%s%c", ASCII_CTRL_OPEN_SQUARE_BRAKET, title, 
ASCII_CTRL_G);
+}
+
+void set_xterm_icon_name(char *name)
+{
+  fprintf(stderr, "%c]1;%s%c", ASCII_CTRL_OPEN_SQUARE_BRAKET, name, 
ASCII_CTRL_G);
+}
+
 void index_make_entry (char *s, size_t l, MUTTMENU *menu, int num)
 {
   format_flag flag = M_FORMAT_MAKEPRINT | M_FORMAT_ARROWCURSOR | 
M_FORMAT_INDEX;
@@ -568,6 +581,13 @@ int mutt_index_menu (void)
        SETCOLOR (MT_COLOR_NORMAL);
         BKGDSET (MT_COLOR_NORMAL);
        menu->redraw &= ~REDRAW_STATUS;
+       if (option(OPTXTERMSETTITLES))
+       {
+         menu_status_line (buf, sizeof (buf), menu, NONULL (XtermTitle));
+         set_xterm_title_bar(buf);
+         menu_status_line (buf, sizeof (buf), menu, NONULL (XtermIcon));
+         set_xterm_icon_name(buf);
+       }
       }
 
       menu->redraw = 0;
Index: mutt/globals.h
===================================================================
--- mutt.orig/globals.h 2007-01-04 15:23:49.000000000 +0100
+++ mutt/globals.h      2007-01-27 19:33:32.933961952 +0100
@@ -137,6 +137,8 @@ WHERE char *Tempdir;
 WHERE char *Tochars;
 WHERE char *Username;
 WHERE char *Visual;
+WHERE char *XtermTitle;
+WHERE char *XtermIcon;
 
 WHERE char *CurrentFolder;
 WHERE char *LastFolder;
Index: mutt/init.c
===================================================================
--- mutt.orig/init.c    2006-12-12 14:15:03.000000000 +0100
+++ mutt/init.c 2007-01-27 19:33:32.934961800 +0100
@@ -1747,6 +1747,26 @@ static int parse_set (BUFFER *tmp, BUFFE
        toggle_option (MuttVars[idx].data);
       else
        set_option (MuttVars[idx].data);
+
+      /* sanity check for xterm */
+      if ((mutt_strcmp (MuttVars[idx].option, "xterm_set_titles") == 0)
+               && option (OPTXTERMSETTITLES))
+      {
+       char *ep = getenv ("TERM");
+       /* Make sure that the terminal can take the control codes */
+       if (ep == NULL) unset_option (MuttVars[idx].data);
+       else if (mutt_strncasecmp (ep, "xterm", 5) &&
+                mutt_strncasecmp (ep, "color-xterm", 11) &&
+                mutt_strncasecmp (ep, "eterm", 5) &&
+                mutt_strncasecmp (ep, "kterm", 5) &&
+                mutt_strncasecmp (ep, "nxterm", 6) &&
+                mutt_strncasecmp (ep, "putty", 5) &&
+                mutt_strncasecmp (ep, "screen", 6) &&
+                mutt_strncasecmp (ep, "cygwin", 6) &&
+                mutt_strncasecmp (ep, "rxvt", 4) )
+         unset_option (MuttVars[idx].  data);
+
+      }
     }
     else if (myvar || DTYPE (MuttVars[idx].type) == DT_STR ||
             DTYPE (MuttVars[idx].type) == DT_PATH ||
Index: mutt/init.h
===================================================================
--- mutt.orig/init.h    2006-12-12 14:15:03.000000000 +0100
+++ mutt/init.h 2007-01-27 19:33:32.936961496 +0100
@@ -2941,6 +2941,27 @@ struct option_t MuttVars[] = {
   ** Controls whether mutt writes out the Bcc header when preparing
   ** messages to be sent.  Exim users may wish to unset this.
   */
+  {"xterm_icon",       DT_STR,   R_BOTH, UL &XtermIcon,  UL "M%?n?AIL&ail?"},
+  /*
+  ** .pp
+  ** Controls the format of the icon title, as long as xterm_set_titles
+  ** is enabled. This string is identical in formatting to the one used by
+  ** ``$$status_format''.
+  */
+  {"xterm_set_titles", DT_BOOL,  R_BOTH, OPTXTERMSETTITLES, 0},
+  /*
+  ** .pp
+  ** Controls whether mutt sets the xterm title bar and icon name
+  ** (as long as you're in an appropriate terminal). The default must
+  ** be off to force in the validity checking.
+  */
+  {"xterm_title",      DT_STR,   R_BOTH, UL &XtermTitle, UL "Mutt with %?m?%m 
messages&no messages?%?n? [%n NEW]?"},
+  /*
+  ** .pp
+  ** Controls the format of the title bar of the xterm provided that
+  ** xterm_set_titles has been set. This string is identical in formatting
+  ** to the one used by ``$$status_format''.
+  */
   /*--*/
   { NULL }
 };
Index: mutt/mutt.h
===================================================================
--- mutt.orig/mutt.h    2007-01-04 15:23:49.000000000 +0100
+++ mutt/mutt.h 2007-01-27 19:33:32.936961496 +0100
@@ -451,6 +451,7 @@ enum
   OPTWRAPSEARCH,
   OPTWRITEBCC,         /* write out a bcc header? */
   OPTXMAILER,
+  OPTXTERMSETTITLES,
 
   OPTCRYPTUSEGPGME,
 
Index: mutt/pager.c
===================================================================
--- mutt.orig/pager.c   2006-12-12 14:15:03.000000000 +0100
+++ mutt/pager.c        2007-01-27 19:33:32.937961344 +0100
@@ -30,6 +30,8 @@
 #include "pager.h"
 #include "attach.h"
 #include "mbyte.h"
+void set_xterm_title_bar(char *title);
+void set_xterm_icon_name(char *name);
 
 #include "mx.h"
 
@@ -1765,6 +1767,13 @@ mutt_pager (const char *banner, const ch
        addstr (topline == 0 ? "all)" : "end)");
       BKGDSET (MT_COLOR_NORMAL);
       SETCOLOR (MT_COLOR_NORMAL);
+      if (option(OPTXTERMSETTITLES))
+      {
+       menu_status_line (buffer, sizeof (buffer), index, NONULL (XtermTitle));
+       set_xterm_title_bar(buffer);
+       menu_status_line (buffer, sizeof (buffer), index, NONULL (XtermIcon));
+       set_xterm_icon_name(buffer);
+      }
     }
 
     if ((redraw & REDRAW_INDEX) && index)
Index: mutt/status.c
===================================================================
--- mutt.orig/status.c  2007-01-27 19:33:36.429430560 +0100
+++ mutt/status.c       2007-01-27 19:34:11.072164064 +0100
@@ -191,6 +191,8 @@ status_format_str (char *buf, size_t buf
       break;
 
     case 'P':
+      if (!menu)
+       break;
       if (menu->top + menu->pagelen >= menu->max)
        cp = menu->top ? "end" : "all";
       else

Attachment: signature.asc
Description: Digital signature