#include "commands.h"
#include "disptab.h"
#include "indent.h"
+#include "intervals.h"
#include "systty.h"
#include "systime.h"
/* Give up if buffer appears in two places. */
|| buffer_shared > 1
+#ifdef USE_TEXT_PROPERTIES
+ /* Intervals have already been adjusted, point is after the
+ character that was just inserted. */
+ /* Give up if character has is invisible. */
+ /* Give up if character has a face property.
+ At the moment we only lose at end of line or end of buffer
+ and only with faces that have some background */
+ /* Instead of wasting time, give up if character has any text properties */
+ || ! NILP (Ftext_properties_at (XFASTINT (point - 1), Qnil))
+#endif
+
/* Give up if w is minibuffer and a message is being displayed there */
|| (MINI_WINDOW_P (w) && echo_area_glyphs))
return 0;
{
#ifdef HAVE_X_WINDOWS
int dummy;
- int face = compute_char_face (frame, w, point, -1, -1, &dummy);
+ int face = compute_char_face (frame, w, point - 1, -1, -1, &dummy);
#else
int face = 0;
#endif
{
register FRAME_PTR frame = selected_frame;
register struct window *w = XWINDOW (selected_window);
-
+ int position;
+
/* Avoid losing if cursor is in invisible text off left margin
or about to go off either side of window. */
if ((FRAME_CURSOR_X (frame) == XFASTINT (w->left)
&& (FRAME_CURSOR_X (frame) + 1 >= window_internal_width (w) - 1))
|| cursor_in_echo_area)
return 0;
-
+
/* Can't use direct output if highlighting a region. */
if (!NILP (Vtransient_mark_mode) && !NILP (current_buffer->mark_active))
return 0;
+#ifdef USE_TEXT_PROPERTIES
+ /* Don't use direct output next to an invisible character
+ since we might need to do something special. */
+
+ XFASTINT (position) = point;
+ if (XFASTINT (position) < ZV
+ && ! NILP (Fget_text_property (position,
+ Qinvisible,
+ Fcurrent_buffer ())))
+ return;
+
+ XFASTINT (position) = point - 1;
+ if (XFASTINT (position) >= BEGV
+ && ! NILP (Fget_text_property (position,
+ Qinvisible,
+ Fcurrent_buffer ())))
+ return;
+#endif
+
FRAME_CURSOR_X (frame) += n;
XFASTINT (w->last_point_x) = FRAME_CURSOR_X (frame);
XFASTINT (w->last_point) = point;
cursor_to (FRAME_CURSOR_Y (frame), FRAME_CURSOR_X (frame));
fflush (stdout);
+
return 1;
}
\f
{
int i,j;
+#if 0
+ if (FRAME_X_P (frame))
+ {
+ /* Under X, erase everything we are going to rewrite,
+ and rewrite everything from the first char that's changed.
+ This is part of supporting fonts like Courier
+ whose chars can overlap outside the char width. */
+ for (i = 0; i < nlen; i++)
+ if (i >= olen || nbody[i] != obody[i])
+ break;
+
+ cursor_to (vpos, i);
+ if (i != olen)
+ clear_end_of_line (olen);
+ write_glyphs (nbody + i, nlen - i);
+ }
+ else
+ {}
+#endif /* 0 */
for (i = 0; i < nlen; i++)
{
if (i >= olen || nbody[i] != obody[i]) /* A non-matching char. */
else
sec += usec / 1000000, usec %= 1000000;
- if (sec < 0)
+ if (sec <= 0)
return Qnil;
{