]> git.eshelyaron.com Git - emacs.git/commitdiff
Unify mouse highlight code of MSDOS and GUI sessions.
authorEli Zaretskii <eliz@gnu.org>
Sat, 30 Oct 2010 13:09:52 +0000 (15:09 +0200)
committerEli Zaretskii <eliz@gnu.org>
Sat, 30 Oct 2010 13:09:52 +0000 (15:09 +0200)
 xdisp.c (coords_in_mouse_face_p): Move prototype out of the
 HAVE_WINDOW_SYSTEM conditional.
 (x_y_to_hpos_vpos, frame_to_window_pixel_xy): Move out of the
 HAVE_WINDOW_SYSTEM block.
 (try_window_id) [HAVE_GPM || MSDOS]: Call
 x_clear_window_mouse_face.
 (draw_row_with_mouse_face): Implementation for HAVE_WINDOW_SYSTEM
 systems.
 (show_mouse_face): Call it, instead of calling draw_glyphs directly.
 (show_mouse_face, clear_mouse_face, coords_in_mouse_face_p)
 (cursor_in_mouse_face_p, rows_from_pos_range)
 (mouse_face_from_buffer_pos, mouse_face_from_string_pos)
 (note_mode_line_or_margin_highlight, note_mouse_highlight)
 (x_clear_window_mouse_face, cancel_mouse_face): Move out of the
 HAVE_WINDOW_SYSTEM block.  Ifdef away window-system specific
 fragments.
 (note_mouse_highlight): Call popup_activated for MSDOS as well.
 Clear mouse highlight if pointer is over glyphs whose OBJECT is an
 integer.
 (mouse_face_from_buffer_pos): Add parentheses around && within ||.
 xmenu.c (popup_activated): Don't define on MSDOS.
 dispnew.c (mirror_make_current): Set Y coordinate of the
 mode-line and header-line rows.
 termchar.h (struct tty_display_info): Define mouse_face_*
 members not only for MSDOS.  Delete stray whitespace.
 <mouse_face_beg_x, mouse_face_beg_y, mouse_face_overlay>: New
 struct members.
 dispextern.h (DPYINFO_DEFINED) [HAVE_X_WINDOWS]: Define.
 (DPYINFO_DEFINED) [HAVE_NTGUI]: Define.
 (DPYINFO_DEFINED) [HAVE_NS]: Define.
 (Display_Info) [!DPYINFO_DEFINED]: Define here.
 (FRAME_X_DISPLAY_INFO) [HAVE_GPM]: Define.
 (FRAME_X_DISPLAY_INFO): Define to NULL if not defined.
 (frame_to_window_pixel_xy, note_mouse_highlight)
 (x_clear_window_mouse_face, cancel_mouse_face, clear_mouse_face)
 (show_mouse_face, cursor_in_mouse_face_p): Move prototypes out of
 HAVE_WINDOW_SYSTEM conditional.
 (draw_row_with_mouse_face): Declare prototype.
 msdos.h (Display_Info): Don't define here.
 msdos.c (show_mouse_face, clear_mouse_face)
 (fast_find_position, IT_note_mode_line_highlight)
 (IT_note_mouse_highlight): Functions deleted.
 (IT_frame_up_to_date, dos_rawgetc): Call note_mouse_highlight
 instead of IT_note_mouse_highlight.
 (draw_row_with_mouse_face, popup_activated): New functions.

src/ChangeLog
src/dispextern.h
src/dispnew.c
src/msdos.c
src/msdos.h
src/termchar.h
src/xdisp.c
src/xmenu.c

index 2d46e42e17b0cd2285faea528e2e06d9c5285dcd..3dacd9a5e638355283c62a59f97725b070ffe50e 100644 (file)
@@ -1,3 +1,57 @@
+2010-10-30  Eli Zaretskii  <eliz@gnu.org>
+
+       * xdisp.c (coords_in_mouse_face_p): Move prototype out of the
+       HAVE_WINDOW_SYSTEM conditional.
+       (x_y_to_hpos_vpos, frame_to_window_pixel_xy): Move out of the
+       HAVE_WINDOW_SYSTEM block.
+       (try_window_id) [HAVE_GPM || MSDOS]: Call
+       x_clear_window_mouse_face.
+       (draw_row_with_mouse_face): Implementation for HAVE_WINDOW_SYSTEM
+       systems.
+       (show_mouse_face): Call it, instead of calling draw_glyphs directly.
+       (show_mouse_face, clear_mouse_face, coords_in_mouse_face_p)
+       (cursor_in_mouse_face_p, rows_from_pos_range)
+       (mouse_face_from_buffer_pos, mouse_face_from_string_pos)
+       (note_mode_line_or_margin_highlight, note_mouse_highlight)
+       (x_clear_window_mouse_face, cancel_mouse_face): Move out of the
+       HAVE_WINDOW_SYSTEM block.  Ifdef away window-system specific
+       fragments.
+       (note_mouse_highlight): Call popup_activated for MSDOS as well.
+       Clear mouse highlight if pointer is over glyphs whose OBJECT is an
+       integer.
+       (mouse_face_from_buffer_pos): Add parentheses around && within ||.
+
+       * xmenu.c (popup_activated): Don't define on MSDOS.
+
+       * dispnew.c (mirror_make_current): Set Y coordinate of the
+       mode-line and header-line rows.
+
+       * termchar.h (struct tty_display_info): Define mouse_face_*
+       members not only for MSDOS.  Delete stray whitespace.
+       <mouse_face_beg_x, mouse_face_beg_y, mouse_face_overlay>: New
+       struct members.
+
+       * dispextern.h (DPYINFO_DEFINED) [HAVE_X_WINDOWS]: Define.
+       (DPYINFO_DEFINED) [HAVE_NTGUI]: Define.
+       (DPYINFO_DEFINED) [HAVE_NS]: Define.
+       (Display_Info) [!DPYINFO_DEFINED]: Define here.
+       (FRAME_X_DISPLAY_INFO) [HAVE_GPM]: Define.
+       (FRAME_X_DISPLAY_INFO): Define to NULL if not defined.
+       (frame_to_window_pixel_xy, note_mouse_highlight)
+       (x_clear_window_mouse_face, cancel_mouse_face, clear_mouse_face)
+       (show_mouse_face, cursor_in_mouse_face_p): Move prototypes out of
+       HAVE_WINDOW_SYSTEM conditional.
+       (draw_row_with_mouse_face): Declare prototype.
+
+       * msdos.h (Display_Info): Don't define here.
+
+       * msdos.c (show_mouse_face, clear_mouse_face)
+       (fast_find_position, IT_note_mode_line_highlight)
+       (IT_note_mouse_highlight): Functions deleted.
+       (IT_frame_up_to_date, dos_rawgetc): Call note_mouse_highlight
+       instead of IT_note_mouse_highlight.
+       (draw_row_with_mouse_face, popup_activated): New functions.
+
 2010-10-29  Eli Zaretskii  <eliz@gnu.org>
 
        * emacs.c (main): Call syms_of_filelock unconditionally.
index 20e074d2393d9bc536aa4e471546ea0d02f85a17..c9006c8e57ea0fd01abd4f8b9aa79fde5fc56bb0 100644 (file)
@@ -43,12 +43,9 @@ typedef struct {
 
 #endif /* HAVE_X_WINDOWS */
 
-#ifdef MSDOS
-#include "msdos.h"
-#endif
-
 #ifdef HAVE_X_WINDOWS
 typedef struct x_display_info Display_Info;
+#define DPYINFO_DEFINED 1
 typedef XImage * XImagePtr;
 typedef XImagePtr XImagePtr_or_DC;
 #define NativeRectangle XRectangle
@@ -57,6 +54,7 @@ typedef XImagePtr XImagePtr_or_DC;
 #ifdef HAVE_NTGUI
 #include "w32gui.h"
 typedef struct w32_display_info Display_Info;
+#define DPYINFO_DEFINED 1
 typedef XImage *XImagePtr;
 typedef HDC XImagePtr_or_DC;
 #endif
@@ -65,10 +63,32 @@ typedef HDC XImagePtr_or_DC;
 #include "nsgui.h"
 /* following typedef needed to accomodate the MSDOS port, believe it or not */
 typedef struct ns_display_info Display_Info;
+#define DPYINFO_DEFINED 1
 typedef Pixmap XImagePtr;
 typedef XImagePtr XImagePtr_or_DC;
 #endif
 
+#ifndef DPYINFO_DEFINED
+typedef struct tty_display_info Display_Info;
+typedef int Cursor;
+#define No_Cursor (0)
+#endif
+
+#undef DPYINFO_DEFINED
+
+#ifdef MSDOS
+/* This defines FRAME_X_DISPLAY_INFO for MSDOS.  */
+#include "msdos.h"
+#endif
+
+#ifdef HAVE_GPM
+#define FRAME_X_DISPLAY_INFO(f) gpm_tty
+#endif
+
+#ifndef FRAME_X_DISPLAY_INFO
+#define FRAME_X_DISPLAY_INFO(f) NULL
+#endif
+
 #ifndef NativeRectangle
 #define NativeRectangle int
 #endif
@@ -3017,28 +3037,30 @@ extern void x_update_cursor (struct frame *, int);
 extern void x_clear_cursor (struct window *);
 extern void x_draw_vertical_border (struct window *w);
 
-extern void frame_to_window_pixel_xy (struct window *, int *, int *);
 extern int get_glyph_string_clip_rects (struct glyph_string *,
                                         NativeRectangle *, int);
 extern void get_glyph_string_clip_rect (struct glyph_string *,
                                         NativeRectangle *nr);
 extern Lisp_Object find_hot_spot (Lisp_Object, int, int);
-extern void note_mouse_highlight (struct frame *, int, int);
-extern void x_clear_window_mouse_face (struct window *);
-extern void cancel_mouse_face (struct frame *);
 
 extern void handle_tool_bar_click (struct frame *,
                                    int, int, int, unsigned int);
 
-/* msdos.c defines its own versions of these functions. */
+extern void expose_frame (struct frame *, int, int, int, int);
+extern int x_intersect_rectangles (XRectangle *, XRectangle *,
+                                   XRectangle *);
+#endif /* HAVE_WINDOW_SYSTEM */
+
+extern void frame_to_window_pixel_xy (struct window *, int *, int *);
+extern void note_mouse_highlight (struct frame *, int, int);
+extern void x_clear_window_mouse_face (struct window *);
+extern void cancel_mouse_face (struct frame *);
 extern int clear_mouse_face (Display_Info *);
 extern void show_mouse_face (Display_Info *, enum draw_glyphs_face);
 extern int cursor_in_mouse_face_p (struct window *w);
+extern void draw_row_with_mouse_face (struct window *, int, struct glyph_row *,
+                                     int, int, enum draw_glyphs_face);
 
-extern void expose_frame (struct frame *, int, int, int, int);
-extern int x_intersect_rectangles (XRectangle *, XRectangle *,
-                                   XRectangle *);
-#endif
 
 /* Flags passed to try_window.  */
 #define TRY_WINDOW_CHECK_MARGINS       (1 << 0)
index 44dad60473d241c1d1aa7a4ac40a072835a50fbb..deb42f47639ab7d770a9a2fb5823bae2fe7772e1 100644 (file)
@@ -2893,6 +2893,14 @@ mirror_make_current (struct window *w, int frame_row)
              else
                swap_glyph_pointers (desired_row, current_row);
              current_row->enabled_p = 1;
+
+             /* Set the Y coordinate of the mode/header line's row.
+                It is needed in draw_row_with_mouse_face to find the
+                screen coordinates.  (Window-based redisplay sets
+                this in update_window, but no one seems to do that
+                for frame-based redisplay.)  */
+             if (current_row->mode_line_p)
+               current_row->y = row;
            }
        }
 
index 0957221f5971226d4d3a483296bbb6fedd0908bd..c676ed91a642ad8830c2e26ef6b279caec3be8ab 100644 (file)
@@ -941,551 +941,78 @@ static Lisp_Object last_mouse_window;
 
 static int mouse_preempted = 0;        /* non-zero when XMenu gobbles mouse events */
 
-/* Set the mouse pointer shape according to whether it is in the
-   area where the mouse highlight is in effect.  */
-static void
-IT_set_mouse_pointer (int mode)
+int
+popup_activated (void)
 {
-  /* A no-op for now.  DOS text-mode mouse pointer doesn't offer too
-     many possibilities to change its shape, and the available
-     functionality pretty much sucks (e.g., almost every reasonable
-     shape will conceal the character it is on).  Since the color of
-     the pointer changes in the highlighted area, it is not clear to
-     me whether anything else is required, anyway.  */
+  return mouse_preempted;
 }
 
-/* Display the active region described by mouse_face_*
-   in its mouse-face if HL > 0, in its normal face if HL = 0.  */
-static void
-show_mouse_face (struct tty_display_info *dpyinfo, int hl)
+/* Draw TEXT_AREA glyphs between START and END of glyph row ROW on
+   window W, starting at x-position X.  X is relative to TEXT_AREA
+   in W.  HL is a face override for drawing the glyphs.  */
+void
+draw_row_with_mouse_face (struct window *w, int x, struct glyph_row *row,
+                         int start_hpos, int end_hpos,
+                         enum draw_glyphs_face hl)
 {
-  struct window *w = XWINDOW (dpyinfo->mouse_face_window);
   struct frame *f = XFRAME (WINDOW_FRAME (w));
-  int i;
-  struct face *fp;
   struct tty_display_info *tty = FRAME_TTY (f);
 
-
-  /* If window is in the process of being destroyed, don't bother
-     doing anything.  */
-  if (w->current_matrix == NULL)
-    goto set_cursor_shape;
-
-  /* Recognize when we are called to operate on rows that don't exist
-     anymore.  This can happen when a window is split.  */
-  if (dpyinfo->mouse_face_end_row >= w->current_matrix->nrows)
-    goto set_cursor_shape;
-
-  /* There's no sense to do anything if the mouse face isn't realized.  */
-  if (hl > 0)
-    {
-      if (dpyinfo->mouse_face_hidden)
-       goto set_cursor_shape;
-
-      fp = FACE_FROM_ID (SELECTED_FRAME(), dpyinfo->mouse_face_face_id);
-      if (!fp)
-       goto set_cursor_shape;
-    }
-
-  /* Note that mouse_face_beg_row etc. are window relative.  */
-  for (i = dpyinfo->mouse_face_beg_row;
-       i <= dpyinfo->mouse_face_end_row;
-       i++)
+  if (hl == DRAW_MOUSE_FACE)
     {
-      int start_hpos, end_hpos;
-      struct glyph_row *row = MATRIX_ROW (w->current_matrix, i);
-
-      /* Don't do anything if row doesn't have valid contents.  */
-      if (!row->enabled_p)
-       continue;
+      int vpos = row->y + WINDOW_TOP_EDGE_Y (w);
+      int kstart = start_hpos + WINDOW_LEFT_EDGE_X (w);
+      int nglyphs = end_hpos - start_hpos;
+      int offset = ScreenPrimary + 2*(vpos*screen_size_X + kstart) + 1;
+      int start_offset = offset;
 
-      /* For all but the first row, the highlight starts at column 0.  */
-      if (i == dpyinfo->mouse_face_beg_row)
-       start_hpos = dpyinfo->mouse_face_beg_col;
-      else
-       start_hpos = 0;
-
-      if (i == dpyinfo->mouse_face_end_row)
-       end_hpos = dpyinfo->mouse_face_end_col;
-      else
-       end_hpos = row->used[TEXT_AREA];
-
-      if (end_hpos <= start_hpos)
-       continue;
-      /* Record that some glyphs of this row are displayed in
-         mouse-face.  */
-      row->mouse_face_p = hl > 0;
-      if (hl > 0)
-       {
-         int vpos = row->y + WINDOW_TOP_EDGE_Y (w);
-         int kstart = start_hpos + WINDOW_LEFT_EDGE_X (w);
-         int nglyphs = end_hpos - start_hpos;
-         int offset = ScreenPrimary + 2*(vpos*screen_size_X + kstart) + 1;
-         int start_offset = offset;
-
-         if (tty->termscript)
-           fprintf (tty->termscript, "\n<MH+ %d-%d:%d>",
-                    kstart, kstart + nglyphs - 1, vpos);
-
-         mouse_off ();
-         IT_set_face (dpyinfo->mouse_face_face_id);
-         /* Since we are going to change only the _colors_ of the
-            displayed text, there's no need to go through all the
-            pain of generating and encoding the text from the glyphs.
-            Instead, we simply poke the attribute byte of each
-            affected position in video memory with the colors
-            computed by IT_set_face!  */
-         _farsetsel (_dos_ds);
-         while (nglyphs--)
-           {
-             _farnspokeb (offset, ScreenAttrib);
-             offset += 2;
-           }
-         if (screen_virtual_segment)
-           dosv_refresh_virtual_screen (start_offset, end_hpos - start_hpos);
-         mouse_on ();
-       }
-      else
-       {
-         /* We are removing a previously-drawn mouse highlight.  The
-            safest way to do so is to redraw the glyphs anew, since
-            all kinds of faces and display tables could have changed
-            behind our back.  */
-         int nglyphs = end_hpos - start_hpos;
-         int save_x = new_pos_X, save_y = new_pos_Y;
-
-         if (end_hpos >= row->used[TEXT_AREA])
-           nglyphs = row->used[TEXT_AREA] - start_hpos;
-
-         /* IT_write_glyphs writes at cursor position, so we need to
-            temporarily move cursor coordinates to the beginning of
-            the highlight region.  */
-         new_pos_X = start_hpos + WINDOW_LEFT_EDGE_X (w);
-         new_pos_Y = row->y + WINDOW_TOP_EDGE_Y (w);
-
-         if (tty->termscript)
-           fprintf (tty->termscript, "<MH- %d-%d:%d>",
-                    new_pos_X, new_pos_X + nglyphs - 1, new_pos_Y);
-         IT_write_glyphs (f, row->glyphs[TEXT_AREA] + start_hpos, nglyphs);
-         if (tty->termscript)
-           fputs ("\n", tty->termscript);
-         new_pos_X = save_x;
-         new_pos_Y = save_y;
-       }
-    }
-
- set_cursor_shape:
-  /* Change the mouse pointer shape.  */
-  IT_set_mouse_pointer (hl);
-}
-
-/* Clear out the mouse-highlighted active region.
-   Redraw it un-highlighted first.  */
-static void
-clear_mouse_face (struct tty_display_info *dpyinfo)
-{
-  if (!dpyinfo->mouse_face_hidden && ! NILP (dpyinfo->mouse_face_window))
-    show_mouse_face (dpyinfo, 0);
-
-  dpyinfo->mouse_face_beg_row = dpyinfo->mouse_face_beg_col = -1;
-  dpyinfo->mouse_face_end_row = dpyinfo->mouse_face_end_col = -1;
-  dpyinfo->mouse_face_window = Qnil;
-}
-
-/* Find the glyph matrix position of buffer position POS in window W.
-   *HPOS and *VPOS are set to the positions found.  W's current glyphs
-   must be up to date.  If POS is above window start return (0, 0).
-   If POS is after end of W, return end of last line in W.  */
-static int
-fast_find_position (struct window *w, int pos, int *hpos, int *vpos)
-{
-  int i, lastcol, line_start_position, maybe_next_line_p = 0;
-  int yb = window_text_bottom_y (w);
-  struct glyph_row *row = MATRIX_ROW (w->current_matrix, 0), *best_row = row;
-
-  while (row->y < yb)
-    {
-      if (row->used[TEXT_AREA])
-       line_start_position = row->glyphs[TEXT_AREA]->charpos;
-      else
-       line_start_position = 0;
-
-      if (line_start_position > pos)
-       break;
-      /* If the position sought is the end of the buffer,
-        don't include the blank lines at the bottom of the window.  */
-      else if (line_start_position == pos
-              && pos == BUF_ZV (XBUFFER (w->buffer)))
-       {
-         maybe_next_line_p = 1;
-         break;
-       }
-      else if (line_start_position > 0)
-       best_row = row;
-
-      /* Don't overstep the last matrix row, lest we get into the
-        never-never land... */
-      if (row->y + 1 >= yb)
-       break;
-
-      ++row;
-    }
-
-  /* Find the right column within BEST_ROW.  */
-  lastcol = 0;
-  row = best_row;
-  for (i = 0; i < row->used[TEXT_AREA]; i++)
-    {
-      struct glyph *glyph = row->glyphs[TEXT_AREA] + i;
-      int charpos;
-
-      charpos = glyph->charpos;
-      if (charpos == pos)
-       {
-         *hpos = i;
-         *vpos = row->y;
-         return 1;
-       }
-      else if (charpos > pos)
-       break;
-      else if (charpos > 0)
-       lastcol = i;
-    }
-
-  /* If we're looking for the end of the buffer,
-     and we didn't find it in the line we scanned,
-     use the start of the following line.  */
-  if (maybe_next_line_p)
-    {
-      ++row;
-      lastcol = 0;
-    }
-
-  *vpos = row->y;
-  *hpos = lastcol + 1;
-  return 0;
-}
-
-/* Take proper action when mouse has moved to the mode or top line of
-   window W, x-position X.  MODE_LINE_P non-zero means mouse is on the
-   mode line.  X is relative to the start of the text display area of
-   W, so the width of fringes and scroll bars must be subtracted
-   to get a position relative to the start of the mode line.  */
-static void
-IT_note_mode_line_highlight (struct window *w, int x, int mode_line_p)
-{
-  struct glyph_row *row;
-
-  if (mode_line_p)
-    row = MATRIX_MODE_LINE_ROW (w->current_matrix);
-  else
-    row = MATRIX_HEADER_LINE_ROW (w->current_matrix);
+      if (tty->termscript)
+       fprintf (tty->termscript, "\n<MH+ %d-%d:%d>",
+                kstart, kstart + nglyphs - 1, vpos);
 
-  if (row->enabled_p)
-    {
-      struct glyph *glyph, *end;
-      Lisp_Object help;
-
-      /* Find the glyph under X.  */
-      glyph = (row->glyphs[TEXT_AREA]
-              + x
-              /* in case someone implements scroll bars some day... */
-              - WINDOW_LEFT_SCROLL_BAR_AREA_WIDTH (w));
-      end = glyph + row->used[TEXT_AREA];
-      if (glyph < end
-         && STRINGP (glyph->object)
-         && STRING_INTERVALS (glyph->object)
-         && glyph->charpos >= 0
-         && glyph->charpos < SCHARS (glyph->object))
+      mouse_off ();
+      IT_set_face (tty->mouse_face_face_id);
+      /* Since we are going to change only the _colors_ of already
+        displayed text, there's no need to go through all the pain of
+        generating and encoding the text from the glyphs.  Instead,
+        we simply poke the attribute byte of each affected position
+        in video memory with the colors computed by IT_set_face!  */
+      _farsetsel (_dos_ds);
+      while (nglyphs--)
        {
-         /* If we're on a string with `help-echo' text property,
-            arrange for the help to be displayed.  This is done by
-            setting the global variable help_echo to the help string.  */
-         help = Fget_text_property (make_number (glyph->charpos),
-                                    Qhelp_echo, glyph->object);
-         if (!NILP (help))
-           {
-             help_echo_string = help;
-             XSETWINDOW (help_echo_window, w);
-             help_echo_object = glyph->object;
-             help_echo_pos = glyph->charpos;
-           }
+         _farnspokeb (offset, ScreenAttrib);
+         offset += 2;
        }
+      if (screen_virtual_segment)
+       dosv_refresh_virtual_screen (start_offset, end_hpos - start_hpos);
+      mouse_on ();
     }
-}
-
-/* Take proper action when the mouse has moved to position X, Y on
-   frame F as regards highlighting characters that have mouse-face
-   properties.  Also de-highlighting chars where the mouse was before.
-   X and Y can be negative or out of range.  */
-static void
-IT_note_mouse_highlight (struct frame *f, int x, int y)
-{
-  struct tty_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
-  enum window_part part = ON_NOTHING;
-  Lisp_Object window;
-  struct window *w;
-
-  /* When a menu is active, don't highlight because this looks odd.  */
-  if (mouse_preempted)
-    return;
-
-  if (NILP (Vmouse_highlight)
-      || !f->glyphs_initialized_p)
-    return;
-
-  dpyinfo->mouse_face_mouse_x = x;
-  dpyinfo->mouse_face_mouse_y = y;
-  dpyinfo->mouse_face_mouse_frame = f;
-
-  if (dpyinfo->mouse_face_defer)
-    return;
-
-  if (gc_in_progress)
-    {
-      dpyinfo->mouse_face_deferred_gc = 1;
-      return;
-    }
-
-  /* Which window is that in?  */
-  window = window_from_coordinates (f, x, y, &part, &x, &y, 0);
-
-  /* If we were displaying active text in another window, clear that.  */
-  if (! EQ (window, dpyinfo->mouse_face_window))
-    clear_mouse_face (dpyinfo);
-
-  /* Not on a window -> return.  */
-  if (!WINDOWP (window))
-    return;
-
-  /* Convert to window-relative coordinates.  */
-  w = XWINDOW (window);
-
-  if (part == ON_MODE_LINE || part == ON_HEADER_LINE)
-    {
-      /* Mouse is on the mode or top line.  */
-      IT_note_mode_line_highlight (w, x, part == ON_MODE_LINE);
-      return;
-    }
-
-  IT_set_mouse_pointer (0);
-
-  /* Are we in a window whose display is up to date?
-     And verify the buffer's text has not changed.  */
-  if (part == ON_TEXT
-      && EQ (w->window_end_valid, w->buffer)
-      && XFASTINT (w->last_modified) == BUF_MODIFF (XBUFFER (w->buffer))
-      && (XFASTINT (w->last_overlay_modified)
-         == BUF_OVERLAY_MODIFF (XBUFFER (w->buffer))))
+  else if (hl == DRAW_NORMAL_TEXT)
     {
-      int pos, i, nrows = w->current_matrix->nrows;
-      struct glyph_row *row;
-      struct glyph *glyph;
+      /* We are removing a previously-drawn mouse highlight.  The
+        safest way to do so is to redraw the glyphs anew, since all
+        kinds of faces and display tables could have changed behind
+        our back.  */
+      int nglyphs = end_hpos - start_hpos;
+      int save_x = new_pos_X, save_y = new_pos_Y;
+
+      if (end_hpos >= row->used[TEXT_AREA])
+       nglyphs = row->used[TEXT_AREA] - start_hpos;
+
+      /* IT_write_glyphs writes at cursor position, so we need to
+        temporarily move cursor coordinates to the beginning of
+        the highlight region.  */
+      new_pos_X = start_hpos + WINDOW_LEFT_EDGE_X (w);
+      new_pos_Y = row->y + WINDOW_TOP_EDGE_Y (w);
 
-      /* Find the glyph under X/Y.  */
-      glyph = NULL;
-      if (y >= 0 && y < nrows)
-       {
-         row = MATRIX_ROW (w->current_matrix, y);
-         /* Give up if some row before the one we are looking for is
-            not enabled.  */
-         for (i = 0; i <= y; i++)
-           if (!MATRIX_ROW (w->current_matrix, i)->enabled_p)
-             break;
-         if (i > y  /* all rows upto and including the one at Y are enabled */
-             && row->displays_text_p
-             && x <  window_box_width (w, TEXT_AREA))
-           {
-             glyph = row->glyphs[TEXT_AREA];
-             if (x >= row->used[TEXT_AREA])
-               glyph = NULL;
-             else
-               {
-                 glyph += x;
-                 if (!BUFFERP (glyph->object))
-                   glyph = NULL;
-               }
-           }
-       }
-
-      /* Clear mouse face if X/Y not over text.  */
-      if (glyph == NULL)
-       {
-         clear_mouse_face (dpyinfo);
-         return;
-       }
-
-      if (!BUFFERP (glyph->object))
-       abort ();
-      pos = glyph->charpos;
-
-      /* Check for mouse-face and help-echo.  */
-      {
-       Lisp_Object mouse_face, overlay, position, *overlay_vec;
-       int noverlays, obegv, ozv;
-       struct buffer *obuf;
-
-       /* If we get an out-of-range value, return now; avoid an error.  */
-       if (pos > BUF_Z (XBUFFER (w->buffer)))
-         return;
-
-       /* Make the window's buffer temporarily current for
-          overlays_at and compute_char_face.  */
-       obuf = current_buffer;
-       current_buffer = XBUFFER (w->buffer);
-       obegv = BEGV;
-       ozv = ZV;
-       BEGV = BEG;
-       ZV = Z;
-
-       /* Is this char mouse-active or does it have help-echo?  */
-       XSETINT (position, pos);
-
-       /* Put all the overlays we want in a vector in overlay_vec. */
-       GET_OVERLAYS_AT (pos, overlay_vec, noverlays, NULL, 0);
-       /* Sort overlays into increasing priority order.  */
-       noverlays = sort_overlays (overlay_vec, noverlays, w);
-
-       /* Check mouse-face highlighting.  */
-       if (! (EQ (window, dpyinfo->mouse_face_window)
-              && y >= dpyinfo->mouse_face_beg_row
-              && y <= dpyinfo->mouse_face_end_row
-              && (y > dpyinfo->mouse_face_beg_row
-                  || x >= dpyinfo->mouse_face_beg_col)
-              && (y < dpyinfo->mouse_face_end_row
-                  || x < dpyinfo->mouse_face_end_col
-                  || dpyinfo->mouse_face_past_end)))
-         {
-           /* Clear the display of the old active region, if any.  */
-           clear_mouse_face (dpyinfo);
-
-           /* Find highest priority overlay that has a mouse-face prop.  */
-           overlay = Qnil;
-           for (i = noverlays - 1; i >= 0; --i)
-             {
-               mouse_face = Foverlay_get (overlay_vec[i], Qmouse_face);
-               if (!NILP (mouse_face))
-                 {
-                   overlay = overlay_vec[i];
-                   break;
-                 }
-             }
-
-           /* If no overlay applies, get a text property.  */
-           if (NILP (overlay))
-             mouse_face = Fget_text_property (position, Qmouse_face,
-                                              w->buffer);
-
-           /* Handle the overlay case.  */
-           if (! NILP (overlay))
-             {
-               /* Find the range of text around this char that
-                  should be active.  */
-               Lisp_Object before, after;
-               EMACS_INT ignore;
-
-               before = Foverlay_start (overlay);
-               after = Foverlay_end (overlay);
-               /* Record this as the current active region.  */
-               fast_find_position (w, XFASTINT (before),
-                                   &dpyinfo->mouse_face_beg_col,
-                                   &dpyinfo->mouse_face_beg_row);
-               dpyinfo->mouse_face_past_end
-                 = !fast_find_position (w, XFASTINT (after),
-                                        &dpyinfo->mouse_face_end_col,
-                                        &dpyinfo->mouse_face_end_row);
-               dpyinfo->mouse_face_window = window;
-               dpyinfo->mouse_face_face_id
-                 = face_at_buffer_position (w, pos, 0, 0,
-                                            &ignore, pos + 1,
-                                            !dpyinfo->mouse_face_hidden,
-                                            -1);
-
-               /* Display it as active.  */
-               show_mouse_face (dpyinfo, 1);
-             }
-           /* Handle the text property case.  */
-           else if (! NILP (mouse_face))
-             {
-               /* Find the range of text around this char that
-                  should be active.  */
-               Lisp_Object before, after, beginning, end;
-               EMACS_INT ignore;
-
-               beginning = Fmarker_position (w->start);
-               XSETINT (end, (BUF_Z (XBUFFER (w->buffer))
-                              - XFASTINT (w->window_end_pos)));
-               before
-                 = Fprevious_single_property_change (make_number (pos + 1),
-                                                     Qmouse_face,
-                                                     w->buffer, beginning);
-               after
-                 = Fnext_single_property_change (position, Qmouse_face,
-                                                 w->buffer, end);
-               /* Record this as the current active region.  */
-               fast_find_position (w, XFASTINT (before),
-                                   &dpyinfo->mouse_face_beg_col,
-                                   &dpyinfo->mouse_face_beg_row);
-               dpyinfo->mouse_face_past_end
-                 = !fast_find_position (w, XFASTINT (after),
-                                        &dpyinfo->mouse_face_end_col,
-                                        &dpyinfo->mouse_face_end_row);
-               dpyinfo->mouse_face_window = window;
-               dpyinfo->mouse_face_face_id
-                 = face_at_buffer_position (w, pos, 0, 0,
-                                            &ignore, pos + 1,
-                                            !dpyinfo->mouse_face_hidden,
-                                            -1);
-
-               /* Display it as active.  */
-               show_mouse_face (dpyinfo, 1);
-             }
-         }
-
-       /* Look for a `help-echo' property.  */
-       {
-         Lisp_Object help;
-
-         /* Check overlays first.  */
-         help = Qnil;
-         for (i = noverlays - 1; i >= 0 && NILP (help); --i)
-           {
-             overlay = overlay_vec[i];
-             help = Foverlay_get (overlay, Qhelp_echo);
-           }
-
-         if (!NILP (help))
-           {
-             help_echo_string = help;
-             help_echo_window = window;
-             help_echo_object = overlay;
-             help_echo_pos = pos;
-           }
-         /* Try text properties.  */
-         else if (NILP (help)
-                  && ((STRINGP (glyph->object)
-                       && glyph->charpos >= 0
-                       && glyph->charpos < SCHARS (glyph->object))
-                      || (BUFFERP (glyph->object)
-                          && glyph->charpos >= BEGV
-                          && glyph->charpos < ZV)))
-           {
-             help = Fget_text_property (make_number (glyph->charpos),
-                                        Qhelp_echo, glyph->object);
-             if (!NILP (help))
-               {
-                 help_echo_string = help;
-                 help_echo_window = window;
-                 help_echo_object = glyph->object;
-                 help_echo_pos = glyph->charpos;
-               }
-           }
-       }
-
-       BEGV = obegv;
-       ZV = ozv;
-       current_buffer = obuf;
-      }
+      if (tty->termscript)
+       fprintf (tty->termscript, "<MH- %d-%d:%d>",
+                new_pos_X, new_pos_X + nglyphs - 1, new_pos_Y);
+      IT_write_glyphs (f, row->glyphs[TEXT_AREA] + start_hpos, nglyphs);
+      if (tty->termscript)
+       fputs ("\n", tty->termscript);
+      new_pos_X = save_x;
+      new_pos_Y = save_y;
     }
 }
 
@@ -1769,9 +1296,9 @@ IT_frame_up_to_date (struct frame *f)
     {
       BLOCK_INPUT;
       if (dpyinfo->mouse_face_mouse_frame)
-       IT_note_mouse_highlight (dpyinfo->mouse_face_mouse_frame,
-                                dpyinfo->mouse_face_mouse_x,
-                                dpyinfo->mouse_face_mouse_y);
+       note_mouse_highlight (dpyinfo->mouse_face_mouse_frame,
+                             dpyinfo->mouse_face_mouse_x,
+                             dpyinfo->mouse_face_mouse_y);
       dpyinfo->mouse_face_deferred_gc = 0;
       UNBLOCK_INPUT;
     }
@@ -3192,8 +2719,7 @@ dos_rawgetc (void)
          previous_help_echo_string = help_echo_string;
          help_echo_string = help_echo_object = help_echo_window = Qnil;
          help_echo_pos = -1;
-         IT_note_mouse_highlight (SELECTED_FRAME(),
-                                  mouse_last_x, mouse_last_y);
+         note_mouse_highlight (SELECTED_FRAME(), mouse_last_x, mouse_last_y);
          /* If the contents of the global variable help_echo has
             changed, generate a HELP_EVENT.  */
          if (!NILP (help_echo_string) || !NILP (previous_help_echo_string))
index fe9964af25e9243b608df8168bc42bf7b0b32935..7b50abe31e1f084057b4054d4d11429caa6d18e0 100644 (file)
@@ -52,8 +52,6 @@ typedef int XRectangle;
 #define PIX_TYPE unsigned long
 #define XDISPLAY
 
-typedef struct tty_display_info Display_Info;
-
 extern struct tty_display_info the_only_display_info;
 
 #define FRAME_X_DISPLAY(f) ((Display *) 0)
index 8135ac723e509a1802bbaed364e5d5ef64101af9..1b4cd0891da262c9c939402ca6e57d113d17afc1 100644 (file)
@@ -34,18 +34,18 @@ struct tty_output
 struct tty_display_info
 {
   struct tty_display_info *next; /* Chain of all tty devices. */
-  
+
   char *name;                   /* The name of the device file or 0 if
                                    stdin/stdout. */
   char *type;                   /* The type of the tty. */
-  
+
   /* Input/output */
-  
+
   FILE *input;                  /* The stream to be used for terminal input.
                                    NULL if the terminal is suspended. */
   FILE *output;                 /* The stream to be used for terminal output.
                                    NULL if the terminal is suspended. */
-  
+
   FILE *termscript;             /* If nonzero, send all terminal output
                                    characters to this stream also.  */
 
@@ -65,22 +65,24 @@ struct tty_display_info
   /* Redisplay. */
 
   Lisp_Object top_frame;        /* The topmost frame on this tty. */
-  
+
   /* The previous frame we displayed on this tty.  */
   struct frame *previous_frame;
   int previous_color_mode;
 
-#ifdef MSDOS
   /* These variables describe the range of text currently shown in its
      mouse-face, together with the window they apply to.  As long as
      the mouse stays within this range, we need not redraw anything on
      its account.  Rows and columns are glyph matrix positions in
      MOUSE_FACE_WINDOW.  */
   int mouse_face_beg_row, mouse_face_beg_col;
+  int mouse_face_beg_x, mouse_face_beg_y;
   int mouse_face_end_row, mouse_face_end_col;
+  int mouse_face_end_x, mouse_face_end_y;
   int mouse_face_past_end;
   Lisp_Object mouse_face_window;
   int mouse_face_face_id;
+  Lisp_Object mouse_face_overlay;
 
   /* 1 if a mouse motion event came and we didn't handle it right away because
      gc was in progress.  */
@@ -96,7 +98,6 @@ struct tty_display_info
 
   /* Nonzero means that the mouse highlight should not be shown.  */
   int mouse_face_hidden;
-#endif /* !MSDOS */
 
   /* Buffer used internally by termcap (see tgetent in the Termcap
      manual).  Only init_tty and delete_tty should change this.  */
@@ -190,12 +191,12 @@ struct tty_display_info
   int RPov;                     /* # chars to start a TS_repeat */
 
   int delete_in_insert_mode;    /* delete mode == insert mode */
-  
+
   int se_is_so;                 /* 1 if same string both enters and leaves
                                    standout mode */
-  
+
   int costs_set;                /* Nonzero if costs have been calculated. */
-  
+
   int insert_mode;              /* Nonzero when in insert mode.  */
   int standout_mode;            /* Nonzero when in standout mode.  */
 
@@ -214,7 +215,7 @@ struct tty_display_info
    lines from those operations.  */
 
   int specified_window;
-  
+
   /* Flag used in tty_show/hide_cursor.  */
 
   int cursor_hidden;
index c9af2ba88ec090b2eeeb4c26bc1124fa38c140c5..6339bb900af5d8441ae8d429636647ecbbaba5bb 100644 (file)
@@ -1085,12 +1085,13 @@ static void notice_overwritten_cursor (struct window *,
                                        int, int, int, int);
 static void append_stretch_glyph (struct it *, Lisp_Object,
                                   int, int, int);
-static int coords_in_mouse_face_p (struct window *, int, int);
-
 
 
 #endif /* HAVE_WINDOW_SYSTEM */
 
+static int coords_in_mouse_face_p (struct window *, int, int);
+
+
 \f
 /***********************************************************************
                      Window display dimensions
@@ -1782,8 +1783,6 @@ glyph_to_pixel_coords (struct window *w, int hpos, int vpos,
 }
 
 
-#ifdef HAVE_WINDOW_SYSTEM
-
 /* Find the glyph under window-relative coordinates X/Y in window W.
    Consider only glyphs from buffer text, i.e. no glyphs from overlay
    strings.  Return in *HPOS and *VPOS the row and column number of
@@ -1866,7 +1865,6 @@ x_y_to_hpos_vpos (struct window *w, int x, int y, int *hpos, int *vpos,
   return glyph;
 }
 
-
 /* EXPORT:
    Convert frame-relative x/y to coordinates relative to window W.
    Takes pseudo-windows into account.  */
@@ -1889,6 +1887,8 @@ frame_to_window_pixel_xy (struct window *w, int *x, int *y)
     }
 }
 
+#ifdef HAVE_WINDOW_SYSTEM
+
 /* EXPORT:
    Return in RECTS[] at most N clipping rectangles for glyph string S.
    Return the number of stored rectangles.  */
@@ -15903,6 +15903,9 @@ try_window_id (struct window *w)
                     + (WINDOW_WANTS_HEADER_LINE_P (w) ? 1 : 0)
                     + window_internal_height (w));
 
+#if defined (HAVE_GPM) || defined (MSDOS)
+         x_clear_window_mouse_face (w);
+#endif
          /* Perform the operation on the screen.  */
          if (dvpos > 0)
            {
@@ -23608,6 +23611,16 @@ x_clear_cursor (struct window *w)
     update_window_cursor (w, 0);
 }
 
+void
+draw_row_with_mouse_face (struct frame *w, int start_x, struct glyph_row *row,
+                         int start_hpos, int end_hpos,
+                         enum draw_glyphs_face draw)
+{
+  draw_glyphs (w, start_x, row, TEXT_AREA, start_hpos, end_hpos, draw, 0);
+}
+
+
+#endif /* HAVE_WINDOW_SYSTEM */
 
 /* EXPORT:
    Display the active region described by mouse_face_* according to DRAW.  */
@@ -23695,15 +23708,15 @@ show_mouse_face (Display_Info *dpyinfo, enum draw_glyphs_face draw)
 
          if (end_hpos > start_hpos)
            {
-             draw_glyphs (w, start_x, row, TEXT_AREA,
-                          start_hpos, end_hpos,
-                          draw, 0);
+             draw_row_with_mouse_face (w, start_x, row,
+                                       start_hpos, end_hpos, draw);
 
              row->mouse_face_p
                = draw == DRAW_MOUSE_FACE || draw == DRAW_IMAGE_RAISED;
            }
        }
 
+#ifdef HAVE_WINDOW_SYSTEM
       /* When we've written over the cursor, arrange for it to
         be displayed again.  */
       if (phys_cursor_on_p && !w->phys_cursor_on_p)
@@ -23714,8 +23727,10 @@ show_mouse_face (Display_Info *dpyinfo, enum draw_glyphs_face draw)
                                  w->phys_cursor.x, w->phys_cursor.y);
          UNBLOCK_INPUT;
        }
+#endif /* HAVE_WINDOW_SYSTEM */
     }
 
+#ifdef HAVE_WINDOW_SYSTEM
   /* Change the mouse cursor.  */
   if (draw == DRAW_NORMAL_TEXT && !EQ (dpyinfo->mouse_face_window, f->tool_bar_window))
     FRAME_RIF (f)->define_frame_cursor (f, FRAME_X_OUTPUT (f)->text_cursor);
@@ -23723,6 +23738,8 @@ show_mouse_face (Display_Info *dpyinfo, enum draw_glyphs_face draw)
     FRAME_RIF (f)->define_frame_cursor (f, FRAME_X_OUTPUT (f)->hand_cursor);
   else
     FRAME_RIF (f)->define_frame_cursor (f, FRAME_X_OUTPUT (f)->nontext_cursor);
+
+#endif /* HAVE_WINDOW_SYSTEM */
 }
 
 /* EXPORT:
@@ -24066,13 +24083,13 @@ mouse_face_from_buffer_pos (Lisp_Object window,
                                            start_charpos);
              /* If pos == 0, it means before_string came from an
                 overlay, not from a buffer position.  */
-             if (!pos || pos >= start_charpos && pos < end_charpos)
+             if (!pos || (pos >= start_charpos && pos < end_charpos))
                break;
            }
          else if (EQ (glyph->object, after_string))
            {
              pos = string_buffer_position (w, after_string, end_charpos);
-             if (!pos || pos >= start_charpos && pos < end_charpos)
+             if (!pos || (pos >= start_charpos && pos < end_charpos))
                break;
            }
          x += glyph->pixel_width;
@@ -24116,13 +24133,13 @@ mouse_face_from_buffer_pos (Lisp_Object window,
              pos = string_buffer_position (w, before_string, start_charpos);
              /* If pos == 0, it means before_string came from an
                 overlay, not from a buffer position.  */
-             if (!pos || pos >= start_charpos && pos < end_charpos)
+             if (!pos || (pos >= start_charpos && pos < end_charpos))
                break;
            }
          else if (EQ (glyph->object, after_string))
            {
              pos = string_buffer_position (w, after_string, end_charpos);
-             if (!pos || pos >= start_charpos && pos < end_charpos)
+             if (!pos || (pos >= start_charpos && pos < end_charpos))
                break;
            }
        }
@@ -24180,13 +24197,13 @@ mouse_face_from_buffer_pos (Lisp_Object window,
          if (EQ (end->object, before_string))
            {
              pos = string_buffer_position (w, before_string, start_charpos);
-             if (!pos || pos >= start_charpos && pos < end_charpos)
+             if (!pos || (pos >= start_charpos && pos < end_charpos))
                break;
            }
          else if (EQ (end->object, after_string))
            {
              pos = string_buffer_position (w, after_string, end_charpos);
-             if (!pos || pos >= start_charpos && pos < end_charpos)
+             if (!pos || (pos >= start_charpos && pos < end_charpos))
                break;
            }
        }
@@ -24230,13 +24247,13 @@ mouse_face_from_buffer_pos (Lisp_Object window,
          if (EQ (end->object, before_string))
            {
              pos = string_buffer_position (w, before_string, start_charpos);
-             if (!pos || pos >= start_charpos && pos < end_charpos)
+             if (!pos || (pos >= start_charpos && pos < end_charpos))
                break;
            }
          else if (EQ (end->object, after_string))
            {
              pos = string_buffer_position (w, after_string, end_charpos);
-             if (!pos || pos >= start_charpos && pos < end_charpos)
+             if (!pos || (pos >= start_charpos && pos < end_charpos))
                break;
            }
          x += end->pixel_width;
@@ -24460,6 +24477,8 @@ mouse_face_from_string_pos (struct window *w, Display_Info *dpyinfo,
     }
 }
 
+#ifdef HAVE_WINDOW_SYSTEM
+
 /* See if position X, Y is within a hot-spot of an image.  */
 
 static int
@@ -24630,6 +24649,8 @@ define_frame_cursor1 (struct frame *f, Cursor cursor, Lisp_Object pointer)
     FRAME_RIF (f)->define_frame_cursor (f, cursor);
 }
 
+#endif /* HAVE_WINDOW_SYSTEM */
+
 /* Take proper action when mouse has moved to the mode or header line
    or marginal area AREA of window W, x-position X and y-position Y.
    X is relative to the start of the text display area of W, so the
@@ -24643,7 +24664,11 @@ note_mode_line_or_margin_highlight (Lisp_Object window, int x, int y,
   struct window *w = XWINDOW (window);
   struct frame *f = XFRAME (w->frame);
   Display_Info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
+#ifdef HAVE_WINDOW_SYSTEM
   Cursor cursor = FRAME_X_OUTPUT (f)->nontext_cursor;
+#else
+  Cursor cursor = No_Cursor;
+#endif
   Lisp_Object pointer = Qnil;
   int dx, dy, width, height;
   EMACS_INT charpos;
@@ -24695,6 +24720,7 @@ note_mode_line_or_margin_highlight (Lisp_Object window, int x, int y,
 
   help = Qnil;
 
+#ifdef HAVE_WINDOW_SYSTEM
   if (IMAGEP (object))
     {
       Lisp_Object image_map, hotspot;
@@ -24731,6 +24757,7 @@ note_mode_line_or_margin_highlight (Lisp_Object window, int x, int y,
       if (NILP (pointer))
        pointer = Fplist_get (XCDR (object), QCpointer);
     }
+#endif /* HAVE_WINDOW_SYSTEM */
 
   if (STRINGP (string))
     {
@@ -24750,6 +24777,7 @@ note_mode_line_or_margin_highlight (Lisp_Object window, int x, int y,
            }
        }
 
+#ifdef HAVE_WINDOW_SYSTEM
       if (NILP (pointer))
        pointer = Fget_text_property (pos, Qpointer, string);
 
@@ -24763,6 +24791,7 @@ note_mode_line_or_margin_highlight (Lisp_Object window, int x, int y,
          if (!KEYMAPP (map))
            cursor = dpyinfo->vertical_scroll_bar_cursor;
        }
+#endif
 
      /* Change the mouse face according to what is under X/Y.  */
       mouse_face = Fget_text_property (pos, Qmouse_face, string);
@@ -24895,7 +24924,9 @@ note_mode_line_or_margin_highlight (Lisp_Object window, int x, int y,
       else if ((area == ON_MODE_LINE) || (area == ON_HEADER_LINE))
        clear_mouse_face (dpyinfo);
     }
+#ifdef HAVE_WINDOW_SYSTEM
   define_frame_cursor1 (f, cursor, pointer);
+#endif
 }
 
 
@@ -24917,7 +24948,7 @@ note_mouse_highlight (struct frame *f, int x, int y)
   struct buffer *b;
 
   /* When a menu is active, don't highlight because this looks odd.  */
-#if defined (USE_X_TOOLKIT) || defined (USE_GTK) || defined (HAVE_NS)
+#if defined (USE_X_TOOLKIT) || defined (USE_GTK) || defined (HAVE_NS) || defined (MSDOS)
   if (popup_activated ())
     return;
 #endif
@@ -24961,6 +24992,7 @@ note_mouse_highlight (struct frame *f, int x, int y)
   w = XWINDOW (window);
   frame_to_window_pixel_xy (w, &x, &y);
 
+#ifdef HAVE_WINDOW_SYSTEM
   /* Handle tool-bar window differently since it doesn't display a
      buffer.  */
   if (EQ (window, f->tool_bar_window))
@@ -24968,6 +25000,7 @@ note_mouse_highlight (struct frame *f, int x, int y)
       note_tool_bar_highlight (f, x, y);
       return;
     }
+#endif
 
   /* Mouse is on the mode, header line or margin?  */
   if (part == ON_MODE_LINE || part == ON_HEADER_LINE
@@ -24977,6 +25010,7 @@ note_mouse_highlight (struct frame *f, int x, int y)
       return;
     }
 
+#ifdef HAVE_WINDOW_SYSTEM
   if (part == ON_VERTICAL_BORDER)
     {
       cursor = FRAME_X_OUTPUT (f)->horizontal_drag_cursor;
@@ -24987,6 +25021,7 @@ note_mouse_highlight (struct frame *f, int x, int y)
     cursor = FRAME_X_OUTPUT (f)->nontext_cursor;
   else
     cursor = FRAME_X_OUTPUT (f)->text_cursor;
+#endif
 
   /* Are we in a window whose display is up to date?
      And verify the buffer's text has not changed.  */
@@ -25010,6 +25045,7 @@ note_mouse_highlight (struct frame *f, int x, int y)
       /* Find the glyph under X/Y.  */
       glyph = x_y_to_hpos_vpos (w, x, y, &hpos, &vpos, &dx, &dy, &area);
 
+#ifdef HAVE_WINDOW_SYSTEM
       /* Look for :pointer property on image.  */
       if (glyph != NULL && glyph->type == IMAGE_GLYPH)
        {
@@ -25051,11 +25087,18 @@ note_mouse_highlight (struct frame *f, int x, int y)
                pointer = Fplist_get (XCDR (img->spec), QCpointer);
            }
        }
+#endif /* HAVE_WINDOW_SYSTEM */
 
       /* Clear mouse face if X/Y not over text.  */
       if (glyph == NULL
          || area != TEXT_AREA
          || !MATRIX_ROW (w->current_matrix, vpos)->displays_text_p
+         /* Glyph's OBJECT is an integer for glyphs inserted by the
+            display engine for its internal purposes, like truncation
+            and continuation glyphs and blanks beyond the end of
+            line's text on text terminals.  If we are over such a
+            glyph, we are not over any text.  */
+         || INTEGERP (glyph->object)
          /* R2L rows have a stretch glyph at their front, which
             stands for no text, whereas L2R rows have no glyphs at
             all beyond the end of text.  Treat such stretch glyphs
@@ -25067,6 +25110,7 @@ note_mouse_highlight (struct frame *f, int x, int y)
        {
          if (clear_mouse_face (dpyinfo))
            cursor = No_Cursor;
+#ifdef HAVE_WINDOW_SYSTEM
          if (NILP (pointer))
            {
              if (area != TEXT_AREA)
@@ -25074,6 +25118,7 @@ note_mouse_highlight (struct frame *f, int x, int y)
              else
                pointer = Vvoid_text_area_pointer;
            }
+#endif
          goto set_cursor;
        }
 
@@ -25323,6 +25368,7 @@ note_mouse_highlight (struct frame *f, int x, int y)
          }
       }
 
+#ifdef HAVE_WINDOW_SYSTEM
       /* Look for a `pointer' property.  */
       if (NILP (pointer))
        {
@@ -25363,6 +25409,7 @@ note_mouse_highlight (struct frame *f, int x, int y)
                                              Qpointer, object);
            }
        }
+#endif /* HAVE_WINDOW_SYSTEM */
 
       BEGV = obegv;
       ZV = ozv;
@@ -25371,7 +25418,13 @@ note_mouse_highlight (struct frame *f, int x, int y)
 
  set_cursor:
 
+#ifdef HAVE_WINDOW_SYSTEM
   define_frame_cursor1 (f, cursor, pointer);
+#else
+  /* This is here to prevent a compiler error, due to "label at end of
+     compound statement".  */
+  return;
+#endif
 }
 
 
@@ -25414,8 +25467,6 @@ cancel_mouse_face (struct frame *f)
 }
 
 
-#endif /* HAVE_WINDOW_SYSTEM */
-
 \f
 /***********************************************************************
                           Exposure Events
index 60b1c2b45950e6f496b94b504a90391579d762de..44f1721d65ee90c86a58b57099f5c86146aeb76c 100644 (file)
@@ -2533,13 +2533,16 @@ xmenu_show (FRAME_PTR f, int x, int y, int for_click, int keymaps,
 
 #endif /* HAVE_MENUS */
 
-/* Detect if a dialog or menu has been posted.  */
+#ifndef MSDOS
+/* Detect if a dialog or menu has been posted.  MSDOS has its own
+   implementation on msdos.c.  */
 
 int
 popup_activated (void)
 {
   return popup_activated_flag;
 }
+#endif /* not MSDOS */
 
 /* The following is used by delayed window autoselection.  */