mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-02-23 21:37:34 +00:00
(message_dolog, message2): New arg MULTIBYTE.
Callers changed. (message1, message1_nolog): String must be ASCII-only. (message2, message2_nolog): Now static. (x_consider_frame_title): Use size_byte. (display_text_line): Likewise. And scan Voverlay_arrow_string by bytes and chars. (display_menu_bar): Call display_string with a byte size. (display_mode_line): Call display_string with a byte size.
This commit is contained in:
parent
596ae0cfb6
commit
0a9dc68b49
1 changed files with 103 additions and 33 deletions
136
src/xdisp.c
136
src/xdisp.c
|
|
@ -271,18 +271,19 @@ void
|
|||
message_log_maybe_newline ()
|
||||
{
|
||||
if (message_log_need_newline)
|
||||
message_dolog ("", 0, 1);
|
||||
message_dolog ("", 0, 1, 0);
|
||||
}
|
||||
|
||||
|
||||
/* Add a string to the message log, optionally terminated with a newline.
|
||||
This function calls low-level routines in order to bypass text property
|
||||
hooks, etc. which might not be safe to run. */
|
||||
hooks, etc. which might not be safe to run.
|
||||
MULTIBYTE, if nonzero, means interpret the contents of M as multibyte. */
|
||||
|
||||
void
|
||||
message_dolog (m, len, nlflag)
|
||||
message_dolog (m, len, nlflag, multibyte)
|
||||
char *m;
|
||||
int len, nlflag;
|
||||
int len, nlflag, multibyte;
|
||||
{
|
||||
if (!NILP (Vmessage_log_max))
|
||||
{
|
||||
|
|
@ -313,7 +314,7 @@ message_dolog (m, len, nlflag)
|
|||
|
||||
/* Insert the string--maybe converting multibyte to single byte
|
||||
or vice versa, so that all the text fits the buffer. */
|
||||
if (! NILP (oldbuf->enable_multibyte_characters)
|
||||
if (multibyte
|
||||
&& NILP (current_buffer->enable_multibyte_characters))
|
||||
{
|
||||
int c, i = 0, nbytes;
|
||||
|
|
@ -330,7 +331,7 @@ message_dolog (m, len, nlflag)
|
|||
insert_char (c);
|
||||
}
|
||||
}
|
||||
else if (NILP (oldbuf->enable_multibyte_characters)
|
||||
else if (! multibyte
|
||||
&& ! NILP (current_buffer->enable_multibyte_characters))
|
||||
{
|
||||
int c, i = 0;
|
||||
|
|
@ -470,16 +471,16 @@ message_log_check_duplicate (prev_bol, prev_bol_byte, this_bol, this_bol_byte)
|
|||
Do not pass text in a buffer that was alloca'd. */
|
||||
|
||||
void
|
||||
message2 (m, len)
|
||||
message2 (m, len, multibyte)
|
||||
char *m;
|
||||
int len;
|
||||
int multibyte;
|
||||
{
|
||||
/* First flush out any partial line written with print. */
|
||||
message_log_maybe_newline ();
|
||||
if (m)
|
||||
message_dolog (m, len, 1);
|
||||
message2_nolog (m, len,
|
||||
! NILP (current_buffer->enable_multibyte_characters));
|
||||
message_dolog (m, len, 1, multibyte);
|
||||
message2_nolog (m, len, multibyte);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -541,10 +542,11 @@ message2_nolog (m, len, multibyte)
|
|||
}
|
||||
}
|
||||
|
||||
/* Display a null-terminated echo area message M. If M is 0, clear out any
|
||||
existing message, and let the minibuffer text show through.
|
||||
/* Display in echo area the null-terminated ASCII-only string M.
|
||||
If M is 0, clear out any existing message,
|
||||
and let the minibuffer text show through.
|
||||
|
||||
The buffer M must continue to exist until after the echo area
|
||||
The string M must continue to exist until after the echo area
|
||||
gets cleared or some other message gets displayed there.
|
||||
|
||||
Do not pass text that is stored in a Lisp string.
|
||||
|
|
@ -554,15 +556,75 @@ void
|
|||
message1 (m)
|
||||
char *m;
|
||||
{
|
||||
message2 (m, (m ? strlen (m) : 0));
|
||||
message2 (m, (m ? strlen (m) : 0), 0);
|
||||
}
|
||||
|
||||
void
|
||||
message1_nolog (m)
|
||||
char *m;
|
||||
{
|
||||
message2_nolog (m, (m ? strlen (m) : 0),
|
||||
! NILP (current_buffer->enable_multibyte_characters));
|
||||
message2_nolog (m, (m ? strlen (m) : 0), 0);
|
||||
}
|
||||
|
||||
/* Display a message M which contains a single %s
|
||||
which gets replaced with STRING. */
|
||||
|
||||
void
|
||||
message_with_string (m, string, log)
|
||||
char *m;
|
||||
Lisp_Object string;
|
||||
int log;
|
||||
{
|
||||
if (noninteractive)
|
||||
{
|
||||
if (m)
|
||||
{
|
||||
if (noninteractive_need_newline)
|
||||
putc ('\n', stderr);
|
||||
noninteractive_need_newline = 0;
|
||||
fprintf (stderr, m, XSTRING (string)->data);
|
||||
if (cursor_in_echo_area == 0)
|
||||
fprintf (stderr, "\n");
|
||||
fflush (stderr);
|
||||
}
|
||||
}
|
||||
else if (INTERACTIVE)
|
||||
{
|
||||
/* The frame whose minibuffer we're going to display the message on.
|
||||
It may be larger than the selected frame, so we need
|
||||
to use its buffer, not the selected frame's buffer. */
|
||||
Lisp_Object mini_window;
|
||||
FRAME_PTR f;
|
||||
|
||||
/* Get the frame containing the minibuffer
|
||||
that the selected frame is using. */
|
||||
mini_window = FRAME_MINIBUF_WINDOW (selected_frame);
|
||||
f = XFRAME (WINDOW_FRAME (XWINDOW (mini_window)));
|
||||
|
||||
/* A null message buffer means that the frame hasn't really been
|
||||
initialized yet. Error messages get reported properly by
|
||||
cmd_error, so this must be just an informative message; toss it. */
|
||||
if (FRAME_MESSAGE_BUF (f))
|
||||
{
|
||||
int len;
|
||||
char *a[1];
|
||||
a[0] = (char *) XSTRING (string)->data;
|
||||
|
||||
len = doprnt (FRAME_MESSAGE_BUF (f),
|
||||
FRAME_MESSAGE_BUF_SIZE (f), m, (char *)0, 3, a);
|
||||
|
||||
if (log)
|
||||
message2 (FRAME_MESSAGE_BUF (f), len,
|
||||
STRING_MULTIBYTE (string));
|
||||
else
|
||||
message2_nolog (FRAME_MESSAGE_BUF (f), len,
|
||||
STRING_MULTIBYTE (string));
|
||||
|
||||
/* Print should start at the beginning of the message
|
||||
buffer next time. */
|
||||
message_buf_print = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Truncate what will be displayed in the echo area
|
||||
|
|
@ -640,7 +702,7 @@ message (m, a1, a2, a3)
|
|||
(char **) &a1);
|
||||
#endif /* NO_ARG_ARRAY */
|
||||
|
||||
message2 (FRAME_MESSAGE_BUF (f), len);
|
||||
message2 (FRAME_MESSAGE_BUF (f), len, 0);
|
||||
}
|
||||
else
|
||||
message1 (0);
|
||||
|
|
@ -668,7 +730,8 @@ message_nolog (m, a1, a2, a3)
|
|||
void
|
||||
update_echo_area ()
|
||||
{
|
||||
message2 (echo_area_glyphs, echo_area_glyphs_length);
|
||||
message2 (echo_area_glyphs, echo_area_glyphs_length,
|
||||
! NILP (current_buffer->enable_multibyte_characters));
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -815,7 +878,7 @@ x_consider_frame_title (frame)
|
|||
already wasted too much time by walking through the list with
|
||||
display_mode_element, then we might need to optimize at a higher
|
||||
level than this.) */
|
||||
if (! STRINGP (f->name) || XSTRING (f->name)->size != len
|
||||
if (! STRINGP (f->name) || XSTRING (f->name)->size_byte != len
|
||||
|| bcmp (frame_title_buf, XSTRING (f->name)->data, len) != 0)
|
||||
x_implicitly_set_name (f, make_string (frame_title_buf, len), Qnil);
|
||||
}
|
||||
|
|
@ -3171,7 +3234,7 @@ display_text_line (w, start, start_byte, vpos, hpos, taboffset, ovstr_done)
|
|||
|
||||
minibuf_prompt_width
|
||||
= (display_string (w, vpos, XSTRING (minibuf_prompt)->data,
|
||||
XSTRING (minibuf_prompt)->size,
|
||||
XSTRING (minibuf_prompt)->size_byte,
|
||||
hpos + WINDOW_LEFT_MARGIN (w),
|
||||
/* Display a space if we truncate. */
|
||||
' ',
|
||||
|
|
@ -3181,7 +3244,7 @@ display_text_line (w, start, start_byte, vpos, hpos, taboffset, ovstr_done)
|
|||
on the first line. */
|
||||
(XFASTINT (w->width) > 10
|
||||
? XFASTINT (w->width) - 4 : -1),
|
||||
-1)
|
||||
STRING_MULTIBYTE (minibuf_prompt))
|
||||
- hpos - WINDOW_LEFT_MARGIN (w));
|
||||
hpos += minibuf_prompt_width;
|
||||
taboffset -= minibuf_prompt_width - old_width;
|
||||
|
|
@ -3940,8 +4003,7 @@ display_text_line (w, start, start_byte, vpos, hpos, taboffset, ovstr_done)
|
|||
&& STRINGP (Voverlay_arrow_string)
|
||||
&& ! overlay_arrow_seen)
|
||||
{
|
||||
unsigned char *p = XSTRING (Voverlay_arrow_string)->data;
|
||||
int i;
|
||||
int i, i_byte;
|
||||
int len = XSTRING (Voverlay_arrow_string)->size;
|
||||
int arrow_end;
|
||||
|
||||
|
|
@ -3951,12 +4013,17 @@ display_text_line (w, start, start_byte, vpos, hpos, taboffset, ovstr_done)
|
|||
if (!NULL_INTERVAL_P (XSTRING (Voverlay_arrow_string)->intervals))
|
||||
{
|
||||
/* If the arrow string has text props, obey them when displaying. */
|
||||
for (i = 0; i < len; i++)
|
||||
for (i = 0, i_byte = 0; i < len; )
|
||||
{
|
||||
int c = p[i];
|
||||
int c;
|
||||
Lisp_Object face, ilisp;
|
||||
int newface;
|
||||
|
||||
if (STRING_MULTIBYTE (Voverlay_arrow_string))
|
||||
FETCH_STRING_CHAR_ADVANCE (c, Voverlay_arrow_string, i, i_byte);
|
||||
else
|
||||
c = XSTRING (Voverlay_arrow_string)->data[i++];
|
||||
|
||||
XSETFASTINT (ilisp, i);
|
||||
face = Fget_text_property (ilisp, Qface, Voverlay_arrow_string);
|
||||
newface = compute_glyph_face_1 (f, face, 0);
|
||||
|
|
@ -4023,8 +4090,9 @@ display_menu_bar (w)
|
|||
if (hpos < maxendcol)
|
||||
hpos = display_string (w, vpos,
|
||||
XSTRING (string)->data,
|
||||
XSTRING (string)->size,
|
||||
hpos, 0, 0, hpos, maxendcol, -1);
|
||||
XSTRING (string)->size_byte,
|
||||
hpos, 0, 0, hpos, maxendcol,
|
||||
STRING_MULTIBYTE (string));
|
||||
/* Put a space between items. */
|
||||
if (hpos < maxendcol)
|
||||
{
|
||||
|
|
@ -4164,7 +4232,8 @@ display_mode_element (w, vpos, hpos, depth, minendcol, maxendcol, elt)
|
|||
hpos = store_frame_title (last, hpos, min (lim, maxendcol));
|
||||
else
|
||||
hpos = display_string (w, vpos, last, -1, hpos, 0, 1,
|
||||
hpos, min (lim, maxendcol), -1);
|
||||
hpos, min (lim, maxendcol),
|
||||
STRING_MULTIBYTE (elt));
|
||||
}
|
||||
else /* c == '%' */
|
||||
{
|
||||
|
|
@ -4228,8 +4297,9 @@ display_mode_element (w, vpos, hpos, depth, minendcol, maxendcol, elt)
|
|||
minendcol, maxendcol);
|
||||
else
|
||||
hpos = display_string (w, vpos, XSTRING (tem)->data,
|
||||
XSTRING (tem)->size,
|
||||
hpos, 0, 1, minendcol, maxendcol, -1);
|
||||
XSTRING (tem)->size_byte,
|
||||
hpos, 0, 1, minendcol, maxendcol,
|
||||
STRING_MULTIBYTE (tem));
|
||||
}
|
||||
/* Give up right away for nil or t. */
|
||||
else if (!EQ (tem, elt))
|
||||
|
|
@ -4523,7 +4593,7 @@ decode_mode_spec (w, c, spec_width, maxwidth)
|
|||
case 'b':
|
||||
obj = b->name;
|
||||
#if 0
|
||||
if (maxwidth >= 3 && XSTRING (obj)->size > maxwidth)
|
||||
if (maxwidth >= 3 && XSTRING (obj)->size_byte > maxwidth)
|
||||
{
|
||||
bcopy (XSTRING (obj)->data, decode_mode_spec_buf, maxwidth - 1);
|
||||
decode_mode_spec_buf[maxwidth - 1] = '\\';
|
||||
|
|
@ -4557,10 +4627,10 @@ decode_mode_spec (w, c, spec_width, maxwidth)
|
|||
#if 0
|
||||
if (NILP (obj))
|
||||
return "[none]";
|
||||
else if (STRINGP (obj) && XSTRING (obj)->size > maxwidth)
|
||||
else if (STRINGP (obj) && XSTRING (obj)->size_byte > maxwidth)
|
||||
{
|
||||
bcopy ("...", decode_mode_spec_buf, 3);
|
||||
bcopy (XSTRING (obj)->data + XSTRING (obj)->size - maxwidth + 3,
|
||||
bcopy (XSTRING (obj)->data + XSTRING (obj)->size_byte - maxwidth + 3,
|
||||
decode_mode_spec_buf + 3, maxwidth - 3);
|
||||
return decode_mode_spec_buf;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue