[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#12364: 24.2.50; wrong overhang display for gstring compositions
From: |
YAMAMOTO Mitsuharu |
Subject: |
bug#12364: 24.2.50; wrong overhang display for gstring compositions |
Date: |
Fri, 07 Sep 2012 17:47:23 +0900 |
User-agent: |
Wanderlust/2.14.0 (Africa) SEMI/1.14.6 (Maruoka) FLIM/1.14.8 (Shijō) APEL/10.6 Emacs/22.3 (sparc-sun-solaris2.8) MULE/5.0 (SAKAKI) |
>>>>> On Thu, 06 Sep 2012 11:37:26 +0900, YAMAMOTO Mitsuharu
>>>>> <mituharu@math.s.chiba-u.ac.jp> said:
> Steps to Reproduce:
> 1. $ emacs -Q &
> 2. evaluate (set-fontset-font t 'arabic (font-spec :family "arial" :size 30))
> 3. C-u C-\ arabic RET
> 4. u S u
> At this moment, the two grapheme clusters look connected.
> 5. C-b C-p
> Now the two grapheme clusters look unconnected.
> See also the "u-S-u" example in the first screenshot in
> http://lists.gnu.org/archive/html/bug-gnu-emacs/2012-09/msg00178.html .
> I think at least the two occurrences of the following line in xdisp.c
> are wrong.
> int first = (s->first_glyph - glyphs) + (s->cmp ? 1 : s->nchars);
> The value of s->cmp seems to be NULL for the "gstring" cases.
I tried making a fix. The change for xterm.c is so the box cursor can
invert the left overhang of the succeeding glyph. The attached
screenshots show the difference between with (first) and without
(second) the patch with respect to the following steps.
1. emacs -Q -D &
2. (set-frame-font "Times-32") C-j
3. C-u y
4. C-a C-SPC C-e M-o b
5. C-a C-SPC C-e M-o i
6. C-b C-b
YAMAMOTO Mitsuharu
mituharu@math.s.chiba-u.ac.jp
=== modified file 'src/xdisp.c'
*** src/xdisp.c 2012-09-05 03:37:32 +0000
--- src/xdisp.c 2012-09-07 01:21:28 +0000
***************
*** 23050,23056 ****
{
int x = 0, i;
struct glyph *glyphs = s->row->glyphs[s->area];
! int first = (s->first_glyph - glyphs) + (s->cmp ? 1 : s->nchars);
int end = s->row->used[s->area];
for (i = first; i < end && s->right_overhang > x; ++i)
--- 23050,23057 ----
{
int x = 0, i;
struct glyph *glyphs = s->row->glyphs[s->area];
! int first = (s->first_glyph - glyphs
! + (s->first_glyph->type == COMPOSITE_GLYPH ? 1 : s->nchars));
int end = s->row->used[s->area];
for (i = first; i < end && s->right_overhang > x; ++i)
***************
*** 23073,23079 ****
int i, k, x;
int end = s->row->used[s->area];
struct glyph *glyphs = s->row->glyphs[s->area];
! int first = (s->first_glyph - glyphs) + (s->cmp ? 1 : s->nchars);
k = -1;
x = 0;
--- 23074,23081 ----
int i, k, x;
int end = s->row->used[s->area];
struct glyph *glyphs = s->row->glyphs[s->area];
! int first = (s->first_glyph - glyphs
! + (s->first_glyph->type == COMPOSITE_GLYPH ? 1 : s->nchars));
k = -1;
x = 0;
=== modified file 'src/xterm.c'
*** src/xterm.c 2012-09-07 01:27:44 +0000
--- src/xterm.c 2012-09-07 03:41:30 +0000
***************
*** 2975,2980 ****
--- 2975,2981 ----
XSetClipMask (next->display, next->gc, None);
next->hl = save;
next->num_clips = 0;
+ next->clip_head = s->next;
}
}
}