From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Stephen Berman Newsgroups: gmane.emacs.bugs Subject: bug#7307: 24.0.50; Mode line had more than just dashes removed Date: Sun, 21 Nov 2010 01:37:20 +0100 Message-ID: <87hbfbtsu7.fsf@escher.home> References: <871v78mwg3.fsf@escher.home> <831v786un1.fsf@gnu.org> <87wrozbykb.fsf@escher.home> <87iq0g6hi2.fsf@escher.home> <87vd4b68xn.fsf@escher.home> NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Trace: dough.gmane.org 1290300286 2821 80.91.229.12 (21 Nov 2010 00:44:46 GMT) X-Complaints-To: usenet@dough.gmane.org NNTP-Posting-Date: Sun, 21 Nov 2010 00:44:46 +0000 (UTC) Cc: 7307@debbugs.gnu.org To: Stefan Monnier Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Sun Nov 21 01:44:41 2010 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1PJy2q-0000bu-Bs for geb-bug-gnu-emacs@m.gmane.org; Sun, 21 Nov 2010 01:44:40 +0100 Original-Received: from localhost ([127.0.0.1]:56346 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PJy2p-0005Y7-MP for geb-bug-gnu-emacs@m.gmane.org; Sat, 20 Nov 2010 19:44:39 -0500 Original-Received: from [140.186.70.92] (port=40262 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PJy2f-0005Vr-0w for bug-gnu-emacs@gnu.org; Sat, 20 Nov 2010 19:44:34 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PJy2d-0000Nv-GC for bug-gnu-emacs@gnu.org; Sat, 20 Nov 2010 19:44:28 -0500 Original-Received: from debbugs.gnu.org ([140.186.70.43]:37296) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PJy2d-0000Nb-EB for bug-gnu-emacs@gnu.org; Sat, 20 Nov 2010 19:44:27 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.69) (envelope-from ) id 1PJxra-0007Sm-DD; Sat, 20 Nov 2010 19:33:02 -0500 X-Loop: help-debbugs@gnu.org Resent-From: Stephen Berman Original-Sender: debbugs-submit-bounces@debbugs.gnu.org Resent-To: owner@debbugs.gnu.org Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sun, 21 Nov 2010 00:33:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 7307 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: Original-Received: via spool by 7307-submit@debbugs.gnu.org id=B7307.129029952728679 (code B ref 7307); Sun, 21 Nov 2010 00:33:02 +0000 Original-Received: (at 7307) by debbugs.gnu.org; 21 Nov 2010 00:32:07 +0000 Original-Received: from localhost ([127.0.0.1] helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1PJxqg-0007SW-W4 for submit@debbugs.gnu.org; Sat, 20 Nov 2010 19:32:07 -0500 Original-Received: from mailout-de.gmx.net ([213.165.64.23] helo=mail.gmx.net) by debbugs.gnu.org with smtp (Exim 4.69) (envelope-from ) id 1PJxqd-0007S8-G9 for 7307@debbugs.gnu.org; Sat, 20 Nov 2010 19:32:04 -0500 Original-Received: (qmail invoked by alias); 21 Nov 2010 00:37:13 -0000 Original-Received: from i59F57764.versanet.de (EHLO escher.home) [89.245.119.100] by mail.gmx.net (mp015) with SMTP; 21 Nov 2010 01:37:13 +0100 X-Authenticated: #20778731 X-Provags-ID: V01U2FsdGVkX19PaB9UrMNP1H2V9wxG4R+m6gNp24WCxDSVUeyF7z pI1ErMmXTYeSJT Original-Received: by escher.home (Postfix, from userid 1000) id 842C61036E; Sun, 21 Nov 2010 01:37:20 +0100 (CET) In-Reply-To: (Stefan Monnier's message of "Mon, 08 Nov 2010 13:28:17 -0500") User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.0.50 (gnu/linux) X-Y-GMX-Trusted: 0 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.11 Precedence: list Resent-Date: Sat, 20 Nov 2010 19:33:02 -0500 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 3) X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:41777 Archived-At: --=-=-= Content-Type: text/plain On Mon, 08 Nov 2010 13:28:17 -0500 Stefan Monnier wrote: (Sorry about the delay; I couldn't get back to it sooner.) >> How about something like the following patch? > > Looks pretty good. It should probably come together with a Lisp part > that removes the current mode-line-format change. See the attached patch. >> This builds the string >> dynamically by filling decode_mode_spec_buf to the desired length, >> dispensing with an additional lots_of_ 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 guess the lots_of_filler case is when you use things like "%5-". ?? That's not a documented mode line %-spec, is it? Anyway, using it I still see no difference. >> 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. > > That's because you re-initialize mode_line_filler each time. > Instead you should initialize it once and "for all" in init_xdisp. > But indeed, that exposes another problem: being global, you won't be > able to have "----" in tty frames and " " in GUI frames in the > same process. I've discovered, if I'm not mistaken, that it apparently isn't necessary to initialize mode_line_filler at the C level at all: rather, this can be done in cus-start.el, and (except with --daemon, see below) it correctly distinguishes tty and GUI frames. (Admittedly, I don't understand why it works, and would be grateful if you or someone else could tell me.) >> 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? > > Indeed. You could use a terminal property instead of (or additionally > to) a global variable, or you could let the global variable be a cons > cell where the car is the char to use for GUI frames and the cdr is for > tty frames :-( It turns out to be much simpler (if I'm not mistaken). That is, the attached patch (against trunk from 2010-11-11) at least appears to DTRT, except for three issues: (i) As Andreas already noted, this does not work for non-ASCII characters, which show up as octal codes. I haven't yet figured out how to fix this (I tried using string_make_multibyte, but then attempting to use a non-ASCII character as the filler makes Emacs crash). (ii) Using the character customization type and trying to set the filler character to SPC signals the error "This field should contain a single character". I looked at the code but failed to see why this happens. The patch below contains a workaround I found in ruler.el: allowing the filler to choose between character and integer type; choosing the latter with value 32 results in spaces filling the mode line. (iii) Starting Emacs with --daemon and then opening a frame with emacsclient -c results in the mode line being filled with `-' characters, because the daemon uses a tty frame. Moreover, the Custom buffer for mode-line-filler says the state was "CHANGED outside Customize", even with -Q. If these three issues, or at least the first two, can be dealt with, do you think this is a reasonable way to make the mode line filler customizable? Steve Berman --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=emacs5.diff Content-Description: mode line filler patch === modified file 'lisp/bindings.el' --- lisp/bindings.el 2010-10-19 19:20:33 +0000 +++ lisp/bindings.el 2010-11-19 11:27:06 +0000 @@ -336,8 +336,7 @@ 'mode-line-modes `(which-func-mode ("" which-func-format ,spaces)) `(global-mode-string ("" global-mode-string ,spaces)) - `(:eval (unless (display-graphic-p) - ,(propertize "-%-" 'help-echo help-echo))))) + `(:eval ,(propertize "%-" 'help-echo help-echo)))) (standard-mode-line-modes (list (propertize "%[" 'help-echo recursive-edit-help-echo) === modified file 'lisp/cus-start.el' --- lisp/cus-start.el 2010-10-31 22:47:12 +0000 +++ lisp/cus-start.el 2010-11-20 19:52:54 +0000 @@ -397,6 +397,15 @@ (truncate-partial-width-windows display boolean "23.1") (mode-line-inverse-video mode-line boolean) (mode-line-in-non-selected-windows mode-line boolean "22.1") + (mode-line-filler mode-line + (choice + (character :tag "Character") + (integer :tag "Integer char value" + ;; :validate ruler-mode-character-validate + )) + "24.1" + :standard (if (display-graphic-p) ? ?-) + :initialize custom-initialize-delay) (line-number-display-limit display (choice integer (const :tag "No limit" nil))) === modified file 'src/xdisp.c' --- src/xdisp.c 2010-11-09 20:07:10 +0000 +++ src/xdisp.c 2010-11-19 22:13:02 +0000 @@ -667,6 +667,11 @@ int cursor_type_changed; +/* Filler character used by the "%-" mode line spec. Defaults to ' ' + on a graphical display and to '-' on a tty. */ + +EMACS_INT mode_line_filler; + /* Nonzero after display_mode_line if %l was used and it displayed a line number. */ @@ -19382,8 +19387,6 @@ 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) @@ -19453,21 +19456,21 @@ 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; + int fill_len; + int lots_of_filler = 140; + + /* 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': @@ -26654,6 +26657,10 @@ 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. --=-=-=--