summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKenichi Handa <handa@m17n.org>2010-01-13 10:29:58 +0900
committerKenichi Handa <handa@m17n.org>2010-01-13 10:29:58 +0900
commitdc954cb273234237b615b93b6368d4adbdea31c4 (patch)
tree2b644e57c6c8534510074c420cf90620525db99f
parentd8b8451f8ea52d751035449278ec36c3e598f9cf (diff)
downloademacs-dc954cb273234237b615b93b6368d4adbdea31c4.tar.gz
emacs-dc954cb273234237b615b93b6368d4adbdea31c4.tar.bz2
emacs-dc954cb273234237b615b93b6368d4adbdea31c4.zip
Display buffer name, etc. in mode line by composing correctly.
-rw-r--r--src/ChangeLog18
-rw-r--r--src/composite.c2
-rw-r--r--src/xdisp.c36
-rw-r--r--src/xterm.c10
4 files changed, 52 insertions, 14 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index 4342d39052d..55e69ff9340 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,21 @@
+2010-01-13 Kenichi Handa <handa@m17n.org>
+
+ Display buffer name, etc. in mode line by composing correctly.
+
+ * xdisp.c (reseat_to_string): Call composition_compute_stop_pos if
+ STRING is not nil.
+ (display_mode_element): Adjusted for the change of
+ decode_mode_spec and display_line.
+ (decode_mode_spec): Change arg MULTIBYTE to STRING.
+ (display_string): Handle the case that STRING is non-null and
+ LISP_STRING is not nil.
+
+ * xterm.c (x_draw_composite_glyph_string_foreground): Pay
+ attention to s->face->overstrike.
+
+ * composite.c (composition_reseat_it): Don't check PT if STRING is
+ non nil.
+
2010-01-11 Chong Yidong <cyd@stupidchicken.com>
* nsterm.m (syms_of_nsterm): Initialize Qcontrol etc. before
diff --git a/src/composite.c b/src/composite.c
index a24abd0fe8f..edebf1e3136 100644
--- a/src/composite.c
+++ b/src/composite.c
@@ -1104,7 +1104,7 @@ composition_reseat_it (cmp_it, charpos, bytepos, endpos, w, face, string)
struct face *face;
Lisp_Object string;
{
- if (charpos < PT && PT < endpos)
+ if (NILP (string) && charpos < PT && PT < endpos)
endpos = PT;
if (cmp_it->ch == -2)
diff --git a/src/xdisp.c b/src/xdisp.c
index fd0f6e51695..f7155599a12 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -953,7 +953,8 @@ static int display_mode_lines P_ ((struct window *));
static int display_mode_line P_ ((struct window *, enum face_id, Lisp_Object));
static int display_mode_element P_ ((struct it *, int, int, int, Lisp_Object, Lisp_Object, int));
static int store_mode_line_string P_ ((char *, Lisp_Object, int, int, int, Lisp_Object));
-static char *decode_mode_spec P_ ((struct window *, int, int, int, int *));
+static char *decode_mode_spec P_ ((struct window *, int, int, int,
+ Lisp_Object *));
static void display_menu_bar P_ ((struct window *));
static int display_count_lines P_ ((int, int, int, int, int *));
static int display_string P_ ((unsigned char *, Lisp_Object, Lisp_Object,
@@ -5607,6 +5608,9 @@ reseat_to_string (it, s, string, charpos, precision, field_width, multibyte)
it->dp = XCHAR_TABLE (Vstandard_display_table);
it->stop_charpos = charpos;
+ if (s == NULL && it->multibyte_p)
+ composition_compute_stop_pos (&it->cmp_it, charpos, -1, it->end_charpos,
+ it->string);
CHECK_IT (it);
}
@@ -17576,13 +17580,14 @@ display_mode_element (it, depth, field_width, precision, elt, props, risky)
int multibyte;
int bytepos, charpos;
unsigned char *spec;
+ Lisp_Object string;
bytepos = percent_position;
charpos = (STRING_MULTIBYTE (elt)
? string_byte_to_char (elt, bytepos)
: bytepos);
- spec
- = decode_mode_spec (it->w, c, field, prec, &multibyte);
+ spec = decode_mode_spec (it->w, c, field, prec, &string);
+ multibyte = STRINGP (string) && STRING_MULTIBYTE (string);
switch (mode_line_target)
{
@@ -17604,7 +17609,7 @@ display_mode_element (it, depth, field_width, precision, elt, props, risky)
int nglyphs_before, nwritten;
nglyphs_before = it->glyph_row->used[TEXT_AREA];
- nwritten = display_string (spec, Qnil, elt,
+ nwritten = display_string (spec, string, elt,
charpos, 0, it,
field, prec, 0,
multibyte);
@@ -18267,8 +18272,8 @@ decode_mode_spec_coding (coding_system, buf, eol_flag)
/* Return a string for the output of a mode line %-spec for window W,
generated by character C. PRECISION >= 0 means don't return a
string longer than that value. FIELD_WIDTH > 0 means pad the
- string returned with spaces to that value. Return 1 in *MULTIBYTE
- if the result is multibyte text.
+ string returned with spaces to that value. Return a Lisp string in
+ *STRING if the resulting string is taken from that Lisp string.
Note we operate on the current buffer for most purposes,
the exception being w->base_line_pos. */
@@ -18276,11 +18281,11 @@ decode_mode_spec_coding (coding_system, buf, eol_flag)
static char lots_of_dashes[] = "--------------------------------------------------------------------------------------------------------------------------------------------";
static char *
-decode_mode_spec (w, c, field_width, precision, multibyte)
+decode_mode_spec (w, c, field_width, precision, string)
struct window *w;
register int c;
int field_width, precision;
- int *multibyte;
+ Lisp_Object *string;
{
Lisp_Object obj;
struct frame *f = XFRAME (WINDOW_FRAME (w));
@@ -18288,7 +18293,7 @@ decode_mode_spec (w, c, field_width, precision, multibyte)
struct buffer *b = current_buffer;
obj = Qnil;
- *multibyte = 0;
+ *string = Qnil;
switch (c)
{
@@ -18682,7 +18687,7 @@ decode_mode_spec (w, c, field_width, precision, multibyte)
if (STRINGP (obj))
{
- *multibyte = STRING_MULTIBYTE (obj);
+ *string = obj;
return (char *) SDATA (obj);
}
else
@@ -18803,7 +18808,10 @@ display_count_lines (start, start_byte, limit_byte, count, byte_pos_ptr)
/* Display a NUL-terminated string, starting with index START.
If STRING is non-null, display that C string. Otherwise, the Lisp
- string LISP_STRING is displayed.
+ string LISP_STRING is displayed. There's a case that STRING is
+ non-null and LISP_STRING is not nil. It means STRING is a string
+ data of LISP_STRING. In that case, we display LISP_STRING while
+ ignoring its text properties.
If FACE_STRING is not nil, FACE_STRING_POS is a position in
FACE_STRING. Display STRING or LISP_STRING with the face at
@@ -18853,8 +18861,12 @@ display_string (string, lisp_string, face_string, face_string_pos,
/* Initialize the iterator IT for iteration over STRING beginning
with index START. */
- reseat_to_string (it, string, lisp_string, start,
+ reseat_to_string (it, NILP (lisp_string) ? string : NULL, lisp_string, start,
precision, field_width, multibyte);
+ if (string && STRINGP (lisp_string))
+ /* LISP_STRING is the one returned by decode_mode_spec. We should
+ ignore its text properties. */
+ it->stop_charpos = -1;
/* If displaying STRING, set up the face of the iterator
from LISP_STRING, if that's given. */
diff --git a/src/xterm.c b/src/xterm.c
index 2093b68c110..5af8a64e2ea 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -1378,19 +1378,27 @@ x_draw_composite_glyph_string_foreground (s)
if (j < i)
{
font->driver->draw (s, j, i, x, y, 0);
+ if (s->face->overstrike)
+ font->driver->draw (s, j, i, x + 1, y, 0);
x += width;
}
xoff = LGLYPH_XOFF (glyph);
yoff = LGLYPH_YOFF (glyph);
wadjust = LGLYPH_WADJUST (glyph);
font->driver->draw (s, i, i + 1, x + xoff, y + yoff, 0);
+ if (s->face->overstrike)
+ font->driver->draw (s, i, i + 1, x + xoff + 1, y + yoff, 0);
x += wadjust;
j = i + 1;
width = 0;
}
}
if (j < i)
- font->driver->draw (s, j, i, x, y, 0);
+ {
+ font->driver->draw (s, j, i, x, y, 0);
+ if (s->face->overstrike)
+ font->driver->draw (s, j, i, x + 1, y, 0);
+ }
}
}