Submitted By: Jonathan Norman (jonathan at bluesquarelinux.co.uk)
Date: 2009-12-31 
Initial Package Version: 6.0 
Origin: Upstream
Upstream Status: Applied
Description: Contains all upstream patches up to 6.0-004

diff -Naur readline-6.0.orig/display.c readline-6.0/display.c
--- readline-6.0.orig/display.c	2009-12-31 18:52:45.000000000 +0000
+++ readline-6.0/display.c	2009-12-31 19:05:02.000000000 +0000
@@ -512,6 +512,7 @@
   /* Block keyboard interrupts because this function manipulates global
      data structures. */
   _rl_block_sigint ();  
+  RL_SETSTATE (RL_STATE_REDISPLAYING);
 
   if (!rl_display_prompt)
     rl_display_prompt = "";
@@ -1191,6 +1192,8 @@
       if (!rl_display_fixed || forced_display || lmargin != last_lmargin)
 	{
 	  forced_display = 0;
+	  o_cpos = _rl_last_c_pos;
+	  cpos_adjusted = 0;
 	  update_line (&visible_line[last_lmargin],
 		       &invisible_line[lmargin],
 		       0,
@@ -1198,6 +1201,13 @@
 		       _rl_screenwidth + (lmargin ? 0 : wrap_offset),
 		       0);
 
+	  if ((MB_CUR_MAX > 1 && rl_byte_oriented == 0) &&
+ 	      cpos_adjusted == 0 &&
+ 	      _rl_last_c_pos != o_cpos &&
+ 	      _rl_last_c_pos > wrap_offset &&
+ 	      o_cpos < prompt_last_invisible)
+ 		_rl_last_c_pos -= prompt_invis_chars_first_line;	/* XXX - was wrap_offset */
+
 	  /* If the visible new line is shorter than the old, but the number
 	     of invisible characters is greater, and we are at the end of
 	     the new line, we need to clear to eol. */
@@ -1236,6 +1246,7 @@
       visible_wrap_offset = wrap_offset;
   }
 
+  RL_UNSETSTATE (RL_STATE_REDISPLAYING);
   _rl_release_sigint ();
 }
 
@@ -1772,7 +1783,7 @@
 	     space_to_eol will insert too many spaces.  XXX - maybe we should
 	     adjust col_lendiff based on the difference between _rl_last_c_pos
 	     and _rl_screenwidth */
-	  if (col_lendiff && (_rl_last_c_pos < _rl_screenwidth))
+	  if (col_lendiff && ((MB_CUR_MAX == 1 || rl_byte_oriented) || (_rl_last_c_pos < _rl_screenwidth)))
 #endif
 	    {	  
 	      if (_rl_term_autowrap && current_line < inv_botlin)
@@ -1892,6 +1903,10 @@
 
   woff = WRAP_OFFSET (_rl_last_v_pos, wrap_offset);
   cpos = _rl_last_c_pos;
+
+  if (cpos == 0 && cpos == new)
+    return;
+
 #if defined (HANDLE_MULTIBYTE)
   /* If we have multibyte characters, NEW is indexed by the buffer point in
      a multibyte string, but _rl_last_c_pos is the display position.  In
@@ -1905,9 +1920,9 @@
 	 prompt string, since they're both buffer indices and DPOS is a
 	 desired display position. */
       if ((new > prompt_last_invisible) ||		/* XXX - don't use woff here */
-	  (prompt_physical_chars > _rl_screenwidth &&
+	  (prompt_physical_chars >= _rl_screenwidth &&
 	   _rl_last_v_pos == prompt_last_screen_line &&
-	   wrap_offset >= woff &&
+	   wrap_offset >= woff && dpos >= woff &&
 	   new > (prompt_last_invisible-(_rl_screenwidth*_rl_last_v_pos)-wrap_offset)))
 	   /* XXX last comparison might need to be >= */
 	{
diff -Naur readline-6.0.orig/patchlevel readline-6.0/patchlevel
--- readline-6.0.orig/patchlevel	2009-12-31 18:52:45.000000000 +0000
+++ readline-6.0/patchlevel	2009-12-31 18:58:11.000000000 +0000
@@ -1,3 +1,3 @@
 # Do not edit -- exists only for use by patch
 
-0
+3
diff -Naur readline-6.0.orig/readline.h readline-6.0/readline.h
--- readline-6.0.orig/readline.h	2009-12-31 18:52:45.000000000 +0000
+++ readline-6.0/readline.h	2009-12-31 18:58:11.000000000 +0000
@@ -814,8 +814,9 @@
 #define RL_STATE_VIMOTION	0x100000	/* reading vi motion arg */
 #define RL_STATE_MULTIKEY	0x200000	/* reading multiple-key command */
 #define RL_STATE_VICMDONCE	0x400000	/* entered vi command mode at least once */
+#define RL_STATE_REDISPLAYING	0x800000	/* updating terminal display */
 
-#define RL_STATE_DONE		0x800000	/* done; accepted line */
+#define RL_STATE_DONE		0x1000000	/* done; accepted line */
 
 #define RL_SETSTATE(x)		(rl_readline_state |= (x))
 #define RL_UNSETSTATE(x)	(rl_readline_state &= ~(x))
diff -Naur readline-6.0.orig/terminal.c readline-6.0/terminal.c
--- readline-6.0.orig/terminal.c	2009-12-31 18:52:45.000000000 +0000
+++ readline-6.0/terminal.c	2009-12-31 18:58:11.000000000 +0000
@@ -355,7 +355,7 @@
       _rl_get_screen_size (fileno (rl_instream), 1);
       if (CUSTOM_REDISPLAY_FUNC ())
 	rl_forced_update_display ();
-      else
+      else if (RL_ISSTATE(RL_STATE_REDISPLAYING) == 0)
 	_rl_redisplay_after_sigwinch ();
     }
 }
