bug-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#7307: 24.0.50; Mode line had more than just dashes removed


From: Stephen Berman
Subject: bug#7307: 24.0.50; Mode line had more than just dashes removed
Date: Fri, 05 Nov 2010 17:18:12 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.0.50 (gnu/linux)

On Tue, 02 Nov 2010 10:32:55 -0400 Stefan Monnier <monnier@IRO.UMontreal.CA> 
wrote:

>> Hm, this may be conceptually simpler but at least for me not simpler to
>> implement, if I understand what you're suggesting, namely, that the
>> filler character should be provided by a defcustom, which is defined in
>> xdisp.c; is that right?  Before I try to do that, is the following
>> consistent with what you're suggesting (aside from lack the
>> configurability)?  If not, could you be more specific?
>
> Yes, that's pretty much what I meant, except for the lack
> of configurability.  To make it configurable, we'll need to build the
> lots_of_<foo> string dynamically in all cases.  Maybe that can be done
> by removing the test of field_width.

How about something like the following patch?  This builds the string
dynamically by filling decode_mode_spec_buf to the desired length,
dispensing with an additional lots_of_<foo> string.  AFAICT this gives
good results (though I admittedly haven't been able to find a case where
lots_of_filler (replacing lots_of_dashes) is used; what is such a
case?).

I also exposed the string character variable mode_line_filler to Lisp,
so it could be customizable, but I haven't been able to figure out how
to update the mode line with a new character.  Also, I don't know the
right way to set the default value: I assume it shouldn't be done in
decode_mode_spec() as below but at the top level together with the
DEFVAR, but then how can it be associated with the window whose mode
line is being constructed?

Steve Berman


*** /home/steve/bzr/emacs/trunk/src/xdisp.c     2010-10-24 13:56:16.000000000 
+0200
--- /home/steve/bzr/emacs/quickfixes/src/xdisp.c        2010-11-05 
16:02:21.000000000 +0100
***************
*** 642,647 ****
--- 642,652 ----
  
  int line_number_displayed;
  
+ /* Filler character used by the "%-" mode line spec.  Defaults to ' '
+    on a graphical display and to '-' on a tty.  */
+ 
+ static EMACS_INT mode_line_filler;
+ 
  /* Maximum buffer size for which to display line numbers.  */
  
  Lisp_Object Vline_number_display_limit;
***************
*** 19267,19274 ****
     Note we operate on the current buffer for most purposes,
     the exception being w->base_line_pos.  */
  
- static char lots_of_dashes[] = 
"--------------------------------------------------------------------------------------------------------------------------------------------";
- 
  static const char *
  decode_mode_spec (struct window *w, register int c, int field_width,
                  int precision, Lisp_Object *string)
--- 19272,19277 ----
***************
*** 19277,19282 ****
--- 19280,19286 ----
    struct frame *f = XFRAME (WINDOW_FRAME (w));
    char *decode_mode_spec_buf = f->decode_mode_spec_buffer;
    struct buffer *b = current_buffer;
+   mode_line_filler = (FRAME_WINDOW_P (f)) ? ' ' : '-';
  
    obj = Qnil;
    *string = Qnil;
***************
*** 19338,19358 ****
      case '-':
        {
        register int i;
! 
!       /* Let lots_of_dashes be a string of infinite length.  */
!       if (mode_line_target == MODE_LINE_NOPROP ||
!           mode_line_target == MODE_LINE_STRING)
!         return "--";
!       if (field_width <= 0
!           || field_width > sizeof (lots_of_dashes))
!         {
!           for (i = 0; i < FRAME_MESSAGE_BUF_SIZE (f) - 1; ++i)
!             decode_mode_spec_buf[i] = '-';
!           decode_mode_spec_buf[i] = '\0';
!           return decode_mode_spec_buf;
!         }
!       else
!         return lots_of_dashes;
        }
  
      case 'b':
--- 19342,19362 ----
      case '-':
        {
        register int i;
!       int fill_len;
!       int lots_of_filler = 140 * sizeof (char);
!   
!       /* Make a string of mode_line_filler characters.  */
!       fill_len = 
!         (mode_line_target == MODE_LINE_NOPROP
!          || mode_line_target == MODE_LINE_STRING) 
!         ? 2
!         : ((field_width <= 0 || field_width > lots_of_filler)
!            ? FRAME_MESSAGE_BUF_SIZE (f) - 1 
!            : lots_of_filler);
!       for (i = 0; i < fill_len; ++i)
!         decode_mode_spec_buf[i] = mode_line_filler;
!       decode_mode_spec_buf[i] = '\0';
!       return decode_mode_spec_buf;
        }
  
      case 'b':
***************
*** 26191,26196 ****
--- 26195,26204 ----
      doc: /* String (or mode line construct) included (normally) in 
`mode-line-format'.  */);
    Vglobal_mode_string = Qnil;
  
+   DEFVAR_INT ("mode-line-filler", &mode_line_filler,
+     doc: /* Filler character used by the "%-" mode line spec.
+ Defaults to ' ' on a graphical display and to '-' on a tty.  */);
+ 
    DEFVAR_LISP ("overlay-arrow-position", &Voverlay_arrow_position,
      doc: /* Marker for where to display an arrow on top of the buffer text.
  This must be the beginning of a line in order to work.





reply via email to

[Prev in Thread] Current Thread [Next in Thread]