]> code.delx.au - gnu-emacs/blobdiff - src/indent.c
*** empty log message ***
[gnu-emacs] / src / indent.c
index f76b65418ef896a95b62fb800f0b96e935e04b7e..cc928f2171fbbe96a5414f402a73147162eb542e 100644 (file)
@@ -1,6 +1,6 @@
 /* Indentation functions.
    Copyright (C) 1985, 1986, 1987, 1988, 1993, 1994, 1995, 1998, 2000, 2001,
-     2002, 2003, 2004, 2005  Free Software Foundation, Inc.
+                 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
 
@@ -16,8 +16,8 @@ GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with GNU Emacs; see the file COPYING.  If not, write to
-the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
+the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+Boston, MA 02110-1301, USA.  */
 
 #include <config.h>
 #include "lisp.h"
@@ -65,8 +65,6 @@ static double position_indentation P_ ((int));
 
 int current_column_bol_cache;
 
-extern Lisp_Object Qfontification_functions;
-
 /* Get the display table to use for the current buffer.  */
 
 struct Lisp_Char_Table *
@@ -2049,7 +2047,6 @@ whether or not it is currently displayed in some window.  */)
   struct window *w;
   Lisp_Object old_buffer;
   struct gcpro gcpro1;
-  int count = SPECPDL_INDEX ();
 
   CHECK_NUMBER (lines);
   if (! NILP (window))
@@ -2067,9 +2064,6 @@ whether or not it is currently displayed in some window.  */)
       XSETBUFFER (w->buffer, current_buffer);
     }
 
-  /* Don't fontify text that we just move across.  */
-  specbind (Qfontification_functions, Qnil);
-
   if (noninteractive)
     {
       struct position pos;
@@ -2080,6 +2074,7 @@ whether or not it is currently displayed in some window.  */)
     {
       int it_start;
       int oselective;
+      int start_on_image_or_stretch_p;
 
       SET_TEXT_POS (pt, PT, PT_BYTE);
       start_display (&it, w, pt);
@@ -2091,6 +2086,8 @@ whether or not it is currently displayed in some window.  */)
         while the end position is really at some X > 0, the same X that
         PT had.  */
       it_start = IT_CHARPOS (it);
+      start_on_image_or_stretch_p = (it.method == GET_FROM_IMAGE
+                                    || it.method == GET_FROM_STRETCH);
       reseat_at_previous_visible_line_start (&it);
       it.current_x = it.hpos = 0;
       /* Temporarily disable selective display so we don't move too far */
@@ -2100,14 +2097,18 @@ whether or not it is currently displayed in some window.  */)
       it.selective = oselective;
 
       /* Move back if we got too far.  This may happen if
-        truncate-lines is on and PT is beyond right margin.  */
-      if (IT_CHARPOS (it) > it_start && XINT (lines) > 0)
+        truncate-lines is on and PT is beyond right margin.
+        It may also happen if it_start is on an image or a stretch
+        glyph -- in that case, don't go back.  */
+      if (IT_CHARPOS (it) > it_start && XINT (lines) > 0
+         && !start_on_image_or_stretch_p)
        move_it_by_lines (&it, -1, 0);
 
       it.vpos = 0;
       /* Do this even if LINES is 0, so that we move back
         to the beginning of the current line as we ought.  */
-      move_it_by_lines (&it, XINT (lines), 0);
+      if (XINT (lines) >= 0 || IT_CHARPOS (it) > 0)
+       move_it_by_lines (&it, XINT (lines), 0);
 
       SET_PT_BOTH (IT_CHARPOS (it), IT_BYTEPOS (it));
     }
@@ -2115,7 +2116,6 @@ whether or not it is currently displayed in some window.  */)
   if (BUFFERP (old_buffer))
     w->buffer = old_buffer;
 
-  unbind_to (count, Qnil);
   RETURN_UNGCPRO (make_number (it.vpos));
 }