[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#30226: Fixing it->pixel_width / it->current_x when tabs and line num
From: |
Keith David Bershatsky |
Subject: |
bug#30226: Fixing it->pixel_width / it->current_x when tabs and line numbers. |
Date: |
Mon, 22 Jan 2018 23:32:14 -0800 |
The following snippet contains the ingredients that can be used to ultimately
fix the problem described on the emacs-devel mailing list beginning at:
https://lists.gnu.org/archive/html/emacs-devel/2018-01/msg00466.html
In a nutshell, it->pixel_width and it->current_x are both incorrect in that
situation. Because the X is wrong, all subsequent references to it->current_x
on the same line are also wrong. In this snippet, we create a new gizmo in
dispextern.h called my_pixel_width so as not to break anything while working on
this issue. Someone more knowledgeable than myself (e.g., Eli) will need to
figure out what other adjustments in x_produce_glyphs are necessary so that
it->pixel_width == it->my_pixel_width in this particular situation. It is a
little confusing, but here is what happens in this snippet:
it->pixel_width "should be" equal to it->my_pixel_width. If we do that,
however, then it->current_x will be wrong.
it->current_x "should be" equal to it->current_x less one (1)
font->space_width. Setting it->pixel_width to be one (1) font->space_width
less than what it was fixes the value of it->current_x and does not break
anything else in the process (as far as I can see).
dispextern.h:2590
int my_pixel_width;
xdisp.c:28298
if (it->char_to_display == '\t'
&& !NILP (Vdisplay_line_numbers)
&& it->w->hscroll > 0
&& it->current_x < it->lnum_pixel_width)
{
int my_tab_width = it->tab_width * font->space_width;
int my_x = it->current_x + it->continuation_lines_width;
int my_next_tab_x = ((1 + my_x + my_tab_width - 1) / my_tab_width)
* my_tab_width;
if (my_next_tab_x - my_x < font->space_width)
my_next_tab_x += my_tab_width;
if (!NILP (Vdisplay_line_numbers))
my_next_tab_x += it->lnum_pixel_width
- ((it->w->hscroll * font->space_width)
% my_tab_width);
it->my_pixel_width = my_next_tab_x - it->lnum_pixel_width -
font->space_width;
it->pixel_width -= font->space_width;
}
else
it->my_pixel_width = 0;
patch.diff
Description: application/diff
- bug#30226: Fixing it->pixel_width / it->current_x when tabs and line numbers.,
Keith David Bershatsky <=