emacs-devel
[Top][All Lists]
Advanced

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

Re: Fill column indicator functionality


From: Ergus
Subject: Re: Fill column indicator functionality
Date: Sun, 17 Mar 2019 19:03:10 +0100
User-agent: K-9 Mail for Android

Hi

The version on github is outdated. I have a workaround for that backgrownd issue in a patch I sent to Eli (in this mailing list) on yesterday. Please try that one and check if you experience the same problems.
I will update the github code latter because i am doing some changes in the lisp interface now.

On 17 March 2019 18:28:22 CET, Alp Aker <address@hidden> wrote:
In graphical interfaces the space after the line is always filled with
the background color of the face of the last produced glyph, even if I
reset it to the saved value after the generation. The only solution I
found so far was to add an extra glyph after reset the face to the
default (saved) value, but hopefully there is a better way?
I don't think I understand what face is "the face of the last produced
glyph". is that the face of the indicator character, is that the
default face, or is that something else? Can you show a screenshot?
I noticed an issue with non-default backgrounds that span newlines, such
as happens with region highlighting. I believe I ran into what Ergus is
describing while working on a fix (see (3) below).  The version of the
code I looked at was 9dcaa15e5a, from Ergus's Github repo.

You can see the issue with non-default backgrounds in the attached
screenshots mode-off.png and mode-on.png; activating
display-fill-column-indicator-mode truncates the highlighting on each
line.  To fix:

1. The stretch glyph needs to be drawn in the current face, not the
fill_column face.

2. The default fill-column face should have an unspecified background
and it should be merged into the current face during display, not into
the default face.

3. If the fill-column face specifies a background, we need to reset the
face to the saved face after producing the indicator glyph. Here I found
it necessary to insert another display element in order for the face
change to take effect before the background is extended to the end of
the line. (I used a 0-width stretch glyph.)  Without that, the
fill-column face is used (see the attached c.png for a screenshot).  I
believe this need to add another display element at the end of the line
is what Ergus was asking about.


diff --git a/lisp/faces.el b/lisp/faces.el
index 153e6a208f..6b9980a77f 100644
--- a/lisp/faces.el
+++ b/lisp/faces.el
@@ -2504,7 +2504,7 @@ line-number-current-line

 ;; Definition stolen from linum.el.
 (defface fill-column
-  '((t :inherit (shadow default)))
+  '((t :inherit (shadow)))
   "Face for displaying fill column indicator line.
 This face is used when `display-fill-column-indicator-mode' is
 non-nil.

diff --git a/src/xdisp.c b/src/xdisp.c
index 8ac4be8dc7..7c4f9889eb 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -20416,21 +20416,23 @@ extend_face_to_end_of_line (struct it *it)
           int stretch_ascent = (((it->ascent + it->descent)
             * FONT_BASE (font)) / FONT_HEIGHT (font));

-          it->char_to_display =
XFIXNAT(Vdisplay_fill_column_indicator_character);
           memset (&it->position, 0, sizeof it->position);
           it->avoid_cursor_p = true;
-          it->face_id = merge_faces (it->w, Qfill_column, 0,
DEFAULT_FACE_ID);
           it->start_of_box_run_p = false;
           it->object = Qnil;

           append_stretch_glyph (it, Qnil, stretch_width,
                                 it->ascent + it->descent, stretch_ascent);

+          it->char_to_display =
XFIXNAT(Vdisplay_fill_column_indicator_character);
+          it->face_id = merge_faces (it->w, Qfill_column, 0,
saved_face_id);
           PRODUCE_GLYPHS (it);

+          it->face_id = saved_face_id;
+          append_stretch_glyph (it, Qnil, 0, it->ascent + it->descent,
+                             stretch_ascent);
           it->position = saved_pos;
           it->avoid_cursor_p = saved_avoid_cursor;
-          it->face_id = saved_face_id;
           it->start_of_box_run_p = saved_box_start;
           it->char_to_display = saved_char;
           it->object = save_object;
@@ -20566,7 +20568,7 @@ extend_face_to_end_of_line (struct it *it)
           if (it->current_x == fill_column_indicator_line)
             {
           const int saved_face = it->face_id;
-          it->face_id = merge_faces (it->w, Qfill_column, 0,
DEFAULT_FACE_ID);
+          it->face_id = merge_faces (it->w, Qfill_column, 0, saved_face);
           it->c = it->char_to_display =
XFIXNAT(Vdisplay_fill_column_indicator_character);
           PRODUCE_GLYPHS (it);
           it->face_id = saved_face;


reply via email to

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