# HG changeset patch # User Kim F. Storm # Date 1098139993 0 # Node ID a928074615eabcd46ac127b49c10fbb03bc3d66d # Parent eca0af7f95d3e512aeefde0cd3509f87885cabd7 (display_mode_element): Fix display of wide chars. From Kenichi Handa . diff -r eca0af7f95d3 -r a928074615ea src/xdisp.c --- a/src/xdisp.c Mon Oct 18 22:52:44 2004 +0000 +++ b/src/xdisp.c Mon Oct 18 22:53:13 2004 +0000 @@ -7976,7 +7976,7 @@ /* Copy at most PRECISION chars from STR. */ nbytes = strlen (str); - n+= c_string_width (str, nbytes, precision, &dummy, &nbytes); + n += c_string_width (str, nbytes, precision, &dummy, &nbytes); while (nbytes--) store_frame_title_char (*str++); @@ -15457,14 +15457,15 @@ if (this - 1 != last) { + int nchars, nbytes; + /* Output to end of string or up to '%'. Field width is length of string. Don't output more than PRECISION allows us. */ --this; - prec = chars_in_text (last, this - last); - if (precision > 0 && prec > precision - n) - prec = precision - n; + prec = c_string_width (last, this - last, precision - n, + &nchars, &nbytes); if (frame_title_ptr) n += store_frame_title (last, 0, prec); @@ -15472,9 +15473,12 @@ { int bytepos = last - lisp_string; int charpos = string_byte_to_char (elt, bytepos); + int endpos = (precision <= 0 ? SCHARS (elt) + : charpos + nchars); + n += store_mode_line_string (NULL, Fsubstring (elt, make_number (charpos), - make_number (charpos + prec)), + make_number (endpos)), 0, 0, 0, Qnil); } else