# HG changeset patch # User Gerd Moellmann # Date 1000910910 0 # Node ID 17ddc09facffa4098c5c99865e99e8d61caca228 # Parent 0be887929f9f4a2d19f4e0e3697006741adb64dc (decode_mode_spec): Add parameter MULTIBYTE. (display_mode_element): Display the string from decode_mode_spec depending on its multibyteness. diff -r 0be887929f9f -r 17ddc09facff src/xdisp.c --- a/src/xdisp.c Wed Sep 19 10:55:52 2001 +0000 +++ b/src/xdisp.c Wed Sep 19 14:48:30 2001 +0000 @@ -732,7 +732,7 @@ 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)); -static char *decode_mode_spec P_ ((struct window *, int, int, int)); +static char *decode_mode_spec P_ ((struct window *, int, int, int, int *)); 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, @@ -13449,22 +13449,25 @@ Vglobal_mode_string); else if (c != 0) { + int multibyte; unsigned char *spec - = decode_mode_spec (it->w, c, field, prec); - + = decode_mode_spec (it->w, c, field, prec, &multibyte); + if (frame_title_ptr) n += store_frame_title (spec, field, prec); else { - int nglyphs_before - = it->glyph_row->used[TEXT_AREA]; - int bytepos - = percent_position - XSTRING (elt)->data; - int charpos - = string_byte_to_char (elt, bytepos); - int nwritten - = display_string (spec, Qnil, elt, charpos, 0, it, - field, prec, 0, -1); + int nglyphs_before, bytepos, charpos, nwritten; + + nglyphs_before = it->glyph_row->used[TEXT_AREA]; + bytepos = percent_position - XSTRING (elt)->data; + charpos = (multibyte + ? string_byte_to_char (elt, bytepos) + : bytepos); + nwritten = display_string (spec, Qnil, elt, + charpos, 0, it, + field, prec, 0, + multibyte); /* Assign to the glyphs written above the string where the `%x' came from, position @@ -13760,15 +13763,17 @@ /* 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. */ + string returned with spaces to that value. Return 1 in *MULTIBYTE + if the result is multibyte text. */ static char lots_of_dashes[] = "--------------------------------------------------------------------------------------------------------------------------------------------"; static char * -decode_mode_spec (w, c, field_width, precision) +decode_mode_spec (w, c, field_width, precision, multibyte) struct window *w; register int c; int field_width, precision; + int *multibyte; { Lisp_Object obj; struct frame *f = XFRAME (WINDOW_FRAME (w)); @@ -13776,6 +13781,7 @@ struct buffer *b = XBUFFER (w->buffer); obj = Qnil; + *multibyte = 0; switch (c) { @@ -14109,7 +14115,10 @@ } if (STRINGP (obj)) - return (char *) XSTRING (obj)->data; + { + *multibyte = STRING_MULTIBYTE (obj); + return (char *) XSTRING (obj)->data; + } else return ""; }