*** ../../../bash-3.0-patched/lib/readline/display.c 2004-09-08 11:07:51.000000000 -0400 --- display.c 2005-11-06 21:32:59.000000000 -0500 *************** *** 1,5 **** /* display.c -- readline redisplay facility. */ ! /* Copyright (C) 1987-2004 Free Software Foundation, Inc. This file is part of the GNU Readline Library, a library for --- 1,5 ---- /* display.c -- readline redisplay facility. */ ! /* Copyright (C) 1987-2005 Free Software Foundation, Inc. This file is part of the GNU Readline Library, a library for *************** *** 119,122 **** --- 119,123 ---- int _rl_suppress_redisplay = 0; + int _rl_want_redisplay = 0; /* The stuff that gets printed out before the actual text of the line. *************** *** 125,129 **** --- 126,135 ---- /* Pseudo-global variables declared here. */ + /* The visible cursor position. If you print some text, adjust this. */ + /* NOTE: _rl_last_c_pos is used as a buffer index when not in a locale + supporting multibyte characters, and an absolute cursor position when + in such a locale. This is an artifact of the donated multibyte support. + Care must be taken when modifying its value. */ int _rl_last_c_pos = 0; int _rl_last_v_pos = 0; *************** *** 181,184 **** --- 187,202 ---- static int prompt_physical_chars; + /* Variables to save and restore prompt and display information. */ + + /* These are getting numerous enough that it's time to create a struct. */ + + static char *saved_local_prompt; + static char *saved_local_prefix; + static int saved_last_invisible; + static int saved_visible_length; + static int saved_prefix_length; + static int saved_invis_chars_first_line; + static int saved_physical_chars; + /* Expand the prompt string S and return the number of visible characters in *LP, if LP is not null. This is currently more-or-less *************** *** 237,241 **** { ignoring = 0; ! last = r - ret - 1; continue; } --- 255,260 ---- { ignoring = 0; ! if (p[-1] != RL_PROMPT_START_IGNORE) ! last = r - ret - 1; continue; } *************** *** 336,340 **** local_prompt = local_prompt_prefix = (char *)0; ! prompt_last_invisible = prompt_visible_length = 0; if (prompt == 0 || *prompt == 0) --- 355,360 ---- local_prompt = local_prompt_prefix = (char *)0; ! prompt_last_invisible = prompt_invis_chars_first_line = 0; ! prompt_visible_length = prompt_physical_chars = 0; if (prompt == 0 || *prompt == 0) *************** *** 441,445 **** rl_display_prompt = ""; ! if (invisible_line == 0) { init_line_structures (0); --- 461,465 ---- rl_display_prompt = ""; ! if (invisible_line == 0 || vis_lbreaks == 0) { init_line_structures (0); *************** *** 834,838 **** if (_rl_horizontal_scroll_mode == 0 && _rl_term_up && *_rl_term_up) { ! int nleft, pos, changed_screen_line; if (!rl_display_fixed || forced_display) --- 854,858 ---- if (_rl_horizontal_scroll_mode == 0 && _rl_term_up && *_rl_term_up) { ! int nleft, pos, changed_screen_line, tx, fudge; if (!rl_display_fixed || forced_display) *************** *** 879,883 **** (_rl_last_c_pos < visible_first_line_len)) { ! nleft = _rl_screenwidth + wrap_offset - _rl_last_c_pos; if (nleft) _rl_clear_to_eol (nleft); --- 899,906 ---- (_rl_last_c_pos < visible_first_line_len)) { ! if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) ! nleft = _rl_screenwidth - _rl_last_c_pos; ! else ! nleft = _rl_screenwidth + wrap_offset - _rl_last_c_pos; if (nleft) _rl_clear_to_eol (nleft); *************** *** 915,919 **** but the buffer position needs to be adjusted to account for invisible characters. */ ! if (cursor_linenum == 0 && wrap_offset) _rl_last_c_pos += wrap_offset; } --- 938,942 ---- but the buffer position needs to be adjusted to account for invisible characters. */ ! if ((MB_CUR_MAX == 1 || rl_byte_oriented) && cursor_linenum == 0 && wrap_offset) _rl_last_c_pos += wrap_offset; } *************** *** 948,951 **** --- 971,980 ---- nleft = c_pos - pos; + /* NLEFT is now a number of characters in a buffer. When in a + multibyte locale, however, _rl_last_c_pos is an absolute cursor + position that doesn't take invisible characters in the prompt + into account. We use a fudge factor to compensate. */ + fudge = (MB_CUR_MAX > 1 && rl_byte_oriented == 0) ? wrap_offset : 0; + /* Since _rl_backspace() doesn't know about invisible characters in the prompt, and there's no good way to tell it, we compensate for *************** *** 953,961 **** if (wrap_offset && cursor_linenum == 0 && nleft < _rl_last_c_pos) { - _rl_backspace (_rl_last_c_pos - nleft); if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) ! _rl_last_c_pos = _rl_col_width (&visible_line[pos], 0, nleft); else ! _rl_last_c_pos = nleft; } --- 982,994 ---- if (wrap_offset && cursor_linenum == 0 && nleft < _rl_last_c_pos) { if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) ! tx = _rl_col_width (&visible_line[pos], 0, nleft); else ! tx = nleft; ! if ((_rl_last_c_pos+fudge) != tx) ! { ! _rl_backspace (_rl_last_c_pos + fudge - tx); /* XXX */ ! _rl_last_c_pos = tx; ! } } *************** *** 1118,1122 **** emulators. In this calculation, TEMP is the physical screen position of the cursor. */ ! temp = _rl_last_c_pos - W_OFFSET(_rl_last_v_pos, visible_wrap_offset); if (temp == _rl_screenwidth && _rl_term_autowrap && !_rl_horizontal_scroll_mode && _rl_last_v_pos == current_line - 1) --- 1151,1158 ---- emulators. In this calculation, TEMP is the physical screen position of the cursor. */ ! if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) ! temp = _rl_last_c_pos; ! else ! temp = _rl_last_c_pos - W_OFFSET(_rl_last_v_pos, visible_wrap_offset); if (temp == _rl_screenwidth && _rl_term_autowrap && !_rl_horizontal_scroll_mode && _rl_last_v_pos == current_line - 1) *************** *** 1324,1328 **** { _rl_move_vert (current_line); ! if (current_line == 0 && visible_wrap_offset) _rl_last_c_pos += visible_wrap_offset; } --- 1360,1364 ---- { _rl_move_vert (current_line); ! if ((MB_CUR_MAX == 1 || rl_byte_oriented) && current_line == 0 && visible_wrap_offset) _rl_last_c_pos += visible_wrap_offset; } *************** *** 1415,1419 **** _rl_last_c_pos += col_lendiff; } ! else if (*ols == 0 && lendiff > 0) { /* At the end of a line the characters do not have to --- 1451,1455 ---- _rl_last_c_pos += col_lendiff; } ! else if ((MB_CUR_MAX == 1 || rl_byte_oriented != 0) && *ols == 0 && lendiff > 0) { /* At the end of a line the characters do not have to *************** *** 1797,1803 **** return ((ISPRINT (uc)) ? 1 : 2); } - /* How to print things in the "echo-area". The prompt is treated as a mini-modeline. */ #if defined (USE_VARARGS) --- 1833,1839 ---- return ((ISPRINT (uc)) ? 1 : 2); } /* How to print things in the "echo-area". The prompt is treated as a mini-modeline. */ + static int msg_saved_prompt = 0; #if defined (USE_VARARGS) *************** *** 1830,1835 **** --- 1866,1882 ---- va_end (args); + if (saved_local_prompt == 0) + { + rl_save_prompt (); + msg_saved_prompt = 1; + } rl_display_prompt = msg_buf; + local_prompt = expand_prompt (msg_buf, &prompt_visible_length, + &prompt_last_invisible, + &prompt_invis_chars_first_line, + &prompt_physical_chars); + local_prompt_prefix = (char *)NULL; (*rl_redisplay_function) (); + return 0; } *************** *** 1841,1846 **** --- 1888,1905 ---- sprintf (msg_buf, format, arg1, arg2); msg_buf[sizeof(msg_buf) - 1] = '\0'; /* overflow? */ + rl_display_prompt = msg_buf; + if (saved_local_prompt == 0) + { + rl_save_prompt (); + msg_saved_prompt = 1; + } + local_prompt = expand_prompt (msg_buf, &prompt_visible_length, + &prompt_last_invisible, + &prompt_invis_chars_first_line, + &prompt_physical_chars); + local_prompt_prefix = (char *)NULL; (*rl_redisplay_function) (); + return 0; } *************** *** 1852,1855 **** --- 1911,1919 ---- { rl_display_prompt = rl_prompt; + if (msg_saved_prompt) + { + rl_restore_prompt (); + msg_saved_prompt = 0; + } (*rl_redisplay_function) (); return 0; *************** *** 1866,1878 **** } - /* These are getting numerous enough that it's time to create a struct. */ - - static char *saved_local_prompt; - static char *saved_local_prefix; - static int saved_last_invisible; - static int saved_visible_length; - static int saved_invis_chars_first_line; - static int saved_physical_chars; - void rl_save_prompt () --- 1930,1933 ---- *************** *** 1880,1883 **** --- 1935,1939 ---- saved_local_prompt = local_prompt; saved_local_prefix = local_prompt_prefix; + saved_prefix_length = prompt_prefix_length; saved_last_invisible = prompt_last_invisible; saved_visible_length = prompt_visible_length; *************** *** 1886,1890 **** local_prompt = local_prompt_prefix = (char *)0; ! prompt_last_invisible = prompt_visible_length = 0; prompt_invis_chars_first_line = prompt_physical_chars = 0; } --- 1942,1946 ---- local_prompt = local_prompt_prefix = (char *)0; ! prompt_last_invisible = prompt_visible_length = prompt_prefix_length = 0; prompt_invis_chars_first_line = prompt_physical_chars = 0; } *************** *** 1898,1905 **** --- 1954,1967 ---- local_prompt = saved_local_prompt; local_prompt_prefix = saved_local_prefix; + prompt_prefix_length = saved_prefix_length; prompt_last_invisible = saved_last_invisible; prompt_visible_length = saved_visible_length; prompt_invis_chars_first_line = saved_invis_chars_first_line; prompt_physical_chars = saved_physical_chars; + + /* can test saved_local_prompt to see if prompt info has been saved. */ + saved_local_prompt = saved_local_prefix = (char *)0; + saved_last_invisible = saved_visible_length = saved_prefix_length = 0; + saved_invis_chars_first_line = saved_physical_chars = 0; } *************** *** 1935,1938 **** --- 1997,2002 ---- } + prompt_physical_chars = saved_physical_chars + 1; + return pmt; } *************** *** 1995,1998 **** --- 2059,2065 ---- int count, col; { + #if defined (__MSDOS__) || defined (__MINGW32__) + _rl_output_some_chars (string, count); + #else /* DEBUGGING */ if (MB_CUR_MAX == 1 || rl_byte_oriented) *************** *** 2033,2036 **** --- 2100,2104 ---- tputs (_rl_term_ei, 1, _rl_output_character_function); } + #endif /* __MSDOS__ || __MINGW32__ */ } *************** *** 2043,2046 **** --- 2111,2115 ---- return; + #if !defined (__MSDOS__) && !defined (__MINGW32__) if (_rl_term_DC && *_rl_term_DC) { *************** *** 2055,2058 **** --- 2124,2128 ---- tputs (_rl_term_dc, 1, _rl_output_character_function); } + #endif /* !__MSDOS__ && !__MINGW32__ */ } *************** *** 2110,2125 **** char *t; { ! char *oldp, *oldl, *oldlprefix; ! int oldlen, oldlast, oldplen, oldninvis, oldphyschars; - /* Geez, I should make this a struct. */ oldp = rl_display_prompt; ! oldl = local_prompt; ! oldlprefix = local_prompt_prefix; ! oldlen = prompt_visible_length; ! oldplen = prompt_prefix_length; ! oldlast = prompt_last_invisible; ! oldninvis = prompt_invis_chars_first_line; ! oldphyschars = prompt_physical_chars; rl_display_prompt = t; --- 2180,2187 ---- char *t; { ! char *oldp; oldp = rl_display_prompt; ! rl_save_prompt (); rl_display_prompt = t; *************** *** 2129,2142 **** &prompt_physical_chars); local_prompt_prefix = (char *)NULL; rl_forced_update_display (); rl_display_prompt = oldp; ! local_prompt = oldl; ! local_prompt_prefix = oldlprefix; ! prompt_visible_length = oldlen; ! prompt_prefix_length = oldplen; ! prompt_last_invisible = oldlast; ! prompt_invis_chars_first_line = oldninvis; ! prompt_physical_chars = oldphyschars; } --- 2191,2199 ---- &prompt_physical_chars); local_prompt_prefix = (char *)NULL; + rl_forced_update_display (); rl_display_prompt = oldp; ! rl_restore_prompt(); }