[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] Changes to emacs/src/xdisp.c,v
From: |
Chong Yidong |
Subject: |
[Emacs-diffs] Changes to emacs/src/xdisp.c,v |
Date: |
Sat, 05 Jul 2008 05:31:14 +0000 |
CVSROOT: /sources/emacs
Module name: emacs
Changes by: Chong Yidong <cyd> 08/07/05 05:31:13
Index: xdisp.c
===================================================================
RCS file: /sources/emacs/emacs/src/xdisp.c,v
retrieving revision 1.1227
retrieving revision 1.1228
diff -u -b -r1.1227 -r1.1228
--- xdisp.c 2 Jul 2008 15:20:33 -0000 1.1227
+++ xdisp.c 5 Jul 2008 05:31:12 -0000 1.1228
@@ -346,10 +346,17 @@
(!NILP (Voverflow_newline_into_fringe) \
&& FRAME_WINDOW_P (it->f) \
&& WINDOW_RIGHT_FRINGE_WIDTH (it->w) > 0 \
- && it->current_x == it->last_visible_x)
+ && it->current_x == it->last_visible_x \
+ && it->line_wrap != WORD_WRAP)
#endif /* HAVE_WINDOW_SYSTEM */
+/* Test if the display element loaded in IT is a space or tab
+ character. This is used to determine word wrapping. */
+
+#define IT_DISPLAYING_WHITESPACE(it) \
+ (it->what == IT_CHARACTER && (it->c == ' ' || it->c == '\t'))
+
/* Non-nil means show the text cursor in void text areas
i.e. in blank areas after eol and eob. This used to be
the default in 21.3. */
@@ -6664,7 +6671,7 @@
{
enum move_it_result result = MOVE_UNDEFINED;
struct glyph_row *saved_glyph_row;
- struct it wrap_it, atpos_it;
+ struct it wrap_it, atpos_it, atx_it;
int may_wrap = 0;
/* Don't produce glyphs in produce_glyphs. */
@@ -6672,11 +6679,13 @@
it->glyph_row = NULL;
/* Use wrap_it to save a copy of IT wherever a word wrap could
- occur. Use atpos_it to save a copy of IT at the desired
+ occur. Use atpos_it to save a copy of IT at the desired buffer
position, if found, so that we can scan ahead and check if the
- word later overshoots the window edge. */
+ word later overshoots the window edge. Use atx_it similarly, for
+ pixel positions. */
wrap_it.sp = -1;
atpos_it.sp = -1;
+ atx_it.sp = -1;
#define BUFFER_POS_REACHED_P() \
((op & MOVE_TO_POS) != 0 \
@@ -6689,39 +6698,35 @@
/* If there's a line-/wrap-prefix, handle it. */
if (it->hpos == 0 && it->method == GET_FROM_BUFFER
&& it->current_y < it->last_visible_y)
- {
handle_line_prefix (it);
- }
while (1)
{
int x, i, ascent = 0, descent = 0;
- /* Stop if we move beyond TO_CHARPOS (after an image or stretch glyph).
*/
+/* Utility macro to reset an iterator with x, ascent, and descent. */
+#define IT_RESET_X_ASCENT_DESCENT(IT) \
+ ((IT)->current_x = x, (IT)->max_ascent = ascent, \
+ (IT)->max_descent = descent)
+
+ /* Stop if we move beyond TO_CHARPOS (after an image or stretch
+ glyph). */
if ((op & MOVE_TO_POS) != 0
&& BUFFERP (it->object)
&& it->method == GET_FROM_BUFFER
&& IT_CHARPOS (*it) > to_charpos)
{
- if (it->line_wrap == WORD_WRAP)
- {
- /* If wrap_it is valid, the current position might be in
- a word that is wrapped to the next line, so continue
- to see if that happens. */
- if (wrap_it.sp < 0)
+ if (it->line_wrap != WORD_WRAP || wrap_it.sp < 0)
{
result = MOVE_POS_MATCH_OR_ZV;
break;
}
- if (atpos_it.sp < 0)
+ else if (it->line_wrap == WORD_WRAP && atpos_it.sp < 0)
+ /* If wrap_it is valid, the current position might be in a
+ word that is wrapped. So, save the iterator in
+ atpos_it and continue to see if wrapping happens. */
atpos_it = *it;
}
- else
- {
- result = MOVE_POS_MATCH_OR_ZV;
- break;
- }
- }
/* Stop when ZV reached.
We used to stop here when TO_CHARPOS reached as well, but that is
@@ -6743,31 +6748,39 @@
}
else
{
- /* Remember the line height so far in case the next element
- doesn't fit on the line. */
- ascent = it->max_ascent;
- descent = it->max_descent;
-
if (it->line_wrap == WORD_WRAP)
{
- if (it->what == IT_CHARACTER
- && (it->c == ' ' || it->c == '\t'))
+ if (IT_DISPLAYING_WHITESPACE (it))
may_wrap = 1;
else if (may_wrap)
{
- /* We are done if the position is already found. */
+ /* We have reached a glyph that follows one or more
+ whitespace characters. If the position is
+ already found, we are done. */
if (atpos_it.sp >= 0)
{
*it = atpos_it;
- atpos_it.sp = -1;
- goto buffer_pos_reached;
+ result = MOVE_POS_MATCH_OR_ZV;
+ goto done;
+ }
+ if (atx_it.sp >= 0)
+ {
+ *it = atx_it;
+ result = MOVE_X_REACHED;
+ goto done;
}
+ /* Otherwise, we can wrap here. */
wrap_it = *it;
may_wrap = 0;
}
}
}
+ /* Remember the line height for the current line, in case
+ the next element doesn't fit on the line. */
+ ascent = it->max_ascent;
+ descent = it->max_descent;
+
/* The call to produce_glyphs will get the metrics of the
display element IT is loaded with. Record the x-position
before this display element, in case it doesn't fit on the
@@ -6818,20 +6831,29 @@
{
if (BUFFER_POS_REACHED_P ())
{
- if (it->line_wrap == WORD_WRAP)
- {
- if (wrap_it.sp < 0)
+ if (it->line_wrap != WORD_WRAP || wrap_it.sp < 0)
goto buffer_pos_reached;
if (atpos_it.sp < 0)
+ {
atpos_it = *it;
+ IT_RESET_X_ASCENT_DESCENT (&atpos_it);
}
- else
- goto buffer_pos_reached;
}
+ else
+ {
+ if (it->line_wrap != WORD_WRAP || wrap_it.sp < 0)
+ {
it->current_x = x;
result = MOVE_X_REACHED;
break;
}
+ if (atx_it.sp < 0)
+ {
+ atx_it = *it;
+ IT_RESET_X_ASCENT_DESCENT (&atx_it);
+ }
+ }
+ }
if (/* Lines are continued. */
it->line_wrap != TRUNCATE
@@ -6860,11 +6882,22 @@
now that we know it fits in this row. */
if (BUFFER_POS_REACHED_P ())
{
+ if (it->line_wrap != WORD_WRAP
+ || wrap_it.sp < 0)
+ {
it->hpos = hpos_before_this_char;
it->current_x = x_before_this_char;
result = MOVE_POS_MATCH_OR_ZV;
break;
}
+ if (it->line_wrap == WORD_WRAP
+ && atpos_it.sp < 0)
+ {
+ atpos_it = *it;
+ atpos_it.current_x = x_before_this_char;
+ atpos_it.hpos = hpos_before_this_char;
+ }
+ }
set_iterator_to_next (it, 1);
#ifdef HAVE_WINDOW_SYSTEM
@@ -6893,16 +6926,13 @@
}
}
else
- {
- it->current_x = x;
- it->max_ascent = ascent;
- it->max_descent = descent;
- }
+ IT_RESET_X_ASCENT_DESCENT (it);
if (wrap_it.sp >= 0)
{
*it = wrap_it;
atpos_it.sp = -1;
+ atx_it.sp = -1;
}
TRACE_MOVE ((stderr, "move_it_in: continued at %d\n",
@@ -6913,15 +6943,13 @@
if (BUFFER_POS_REACHED_P ())
{
- if (it->line_wrap == WORD_WRAP)
- {
- if (wrap_it.sp < 0)
+ if (it->line_wrap != WORD_WRAP || wrap_it.sp < 0)
goto buffer_pos_reached;
- if (atpos_it.sp < 0)
+ if (it->line_wrap == WORD_WRAP && atpos_it.sp < 0)
+ {
atpos_it = *it;
+ IT_RESET_X_ASCENT_DESCENT (&atpos_it);
}
- else
- goto buffer_pos_reached;
}
if (new_x > it->first_visible_x)
@@ -6938,9 +6966,7 @@
else if (BUFFER_POS_REACHED_P ())
{
buffer_pos_reached:
- it->current_x = x;
- it->max_ascent = ascent;
- it->max_descent = descent;
+ IT_RESET_X_ASCENT_DESCENT (it);
result = MOVE_POS_MATCH_OR_ZV;
break;
}
@@ -6990,14 +7016,19 @@
result = MOVE_LINE_TRUNCATED;
break;
}
+#undef IT_RESET_X_ASCENT_DESCENT
}
#undef BUFFER_POS_REACHED_P
/* If we scanned beyond to_pos and didn't find a point to wrap at,
- return iterator at to_pos. */
+ restore the saved iterator. */
if (atpos_it.sp >= 0)
*it = atpos_it;
+ else if (atx_it.sp >= 0)
+ *it = atx_it;
+
+ done:
/* Restore the iterator settings altered at the beginning of this
function. */
@@ -16506,8 +16537,7 @@
if (it->line_wrap == WORD_WRAP && it->area == TEXT_AREA)
{
- if (it->what == IT_CHARACTER
- && (it->c == ' ' || it->c == '\t'))
+ if (IT_DISPLAYING_WHITESPACE (it))
may_wrap = 1;
else if (may_wrap)
{
@@ -16604,6 +16634,18 @@
++it->hpos;
if (i == nglyphs - 1)
{
+ /* If line-wrap is on, check if a previous
+ wrap point was found. */
+ if (wrap_row_used > 0
+ /* Even if there is a previous wrap
+ point, continue the line here as
+ usual, if (i) the previous character
+ was a space or tab AND (ii) the
+ current character is not. */
+ && (!may_wrap
+ || IT_DISPLAYING_WHITESPACE (it)))
+ goto back_to_wrap;
+
set_iterator_to_next (it, 1);
#ifdef HAVE_WINDOW_SYSTEM
if (IT_OVERFLOW_NEWLINE_INTO_FRINGE (it))
@@ -16622,8 +16664,6 @@
}
}
#endif /* HAVE_WINDOW_SYSTEM */
- if (wrap_row_used > 0)
- goto back_to_wrap;
}
}
else if (CHAR_GLYPH_PADDING_P (*glyph)
- [Emacs-diffs] Changes to emacs/src/xdisp.c,v, Miles Bader, 2008/07/01
- [Emacs-diffs] Changes to emacs/src/xdisp.c,v, Jason Rumney, 2008/07/02
- [Emacs-diffs] Changes to emacs/src/xdisp.c,v,
Chong Yidong <=
- [Emacs-diffs] Changes to emacs/src/xdisp.c,v, Andreas Schwab, 2008/07/05
- [Emacs-diffs] Changes to emacs/src/xdisp.c,v, Chong Yidong, 2008/07/05
- [Emacs-diffs] Changes to emacs/src/xdisp.c,v, Chong Yidong, 2008/07/10
- [Emacs-diffs] Changes to emacs/src/xdisp.c,v, Adrian Robert, 2008/07/15
- [Emacs-diffs] Changes to emacs/src/xdisp.c,v, Jason Rumney, 2008/07/15
- [Emacs-diffs] Changes to emacs/src/xdisp.c,v, Adrian Robert, 2008/07/15
- [Emacs-diffs] Changes to emacs/src/xdisp.c,v, Chong Yidong, 2008/07/16
- [Emacs-diffs] Changes to emacs/src/xdisp.c,v, Adrian Robert, 2008/07/17
- [Emacs-diffs] Changes to emacs/src/xdisp.c,v, Jason Rumney, 2008/07/23
- [Emacs-diffs] Changes to emacs/src/xdisp.c,v, Dan Nicolaescu, 2008/07/27