diff options
| author | Gerd Moellmann | 2001-05-09 15:38:04 +0000 |
|---|---|---|
| committer | Gerd Moellmann | 2001-05-09 15:38:04 +0000 |
| commit | 0d487c52addabece10e30de0ffcfd7ec0004ee7c (patch) | |
| tree | c4f384ba531d91774627b96c6f04246ac8665d42 | |
| parent | c533a7e29a5760a65f1f51069db3981c9014fe52 (diff) | |
| download | emacs-0d487c52addabece10e30de0ffcfd7ec0004ee7c.tar.gz emacs-0d487c52addabece10e30de0ffcfd7ec0004ee7c.zip | |
(note_mouse_highlight): Don't change the mouse cursor
back to the text cursor shape without need.
| -rw-r--r-- | src/ChangeLog | 5 | ||||
| -rw-r--r-- | src/xterm.c | 490 |
2 files changed, 253 insertions, 242 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index ed3ee74c5a7..b9261ed28db 100644 --- a/src/ChangeLog +++ b/src/ChangeLog | |||
| @@ -1,3 +1,8 @@ | |||
| 1 | 2001-05-09 Gerd Moellmann <gerd@gnu.org> | ||
| 2 | |||
| 3 | * xterm.c (note_mouse_highlight): Don't change the mouse cursor | ||
| 4 | back to the text cursor shape without need. | ||
| 5 | |||
| 1 | 2001-05-07 Gerd Moellmann <gerd@gnu.org> | 6 | 2001-05-07 Gerd Moellmann <gerd@gnu.org> |
| 2 | 7 | ||
| 3 | * xfns.c (x_set_foreground_color): Set frame's cursor_pixel. | 8 | * xfns.c (x_set_foreground_color): Set frame's cursor_pixel. |
diff --git a/src/xterm.c b/src/xterm.c index 6bc3ced3a90..9201cf1cd13 100644 --- a/src/xterm.c +++ b/src/xterm.c | |||
| @@ -6793,6 +6793,8 @@ note_mouse_highlight (f, x, y) | |||
| 6793 | int portion; | 6793 | int portion; |
| 6794 | Lisp_Object window; | 6794 | Lisp_Object window; |
| 6795 | struct window *w; | 6795 | struct window *w; |
| 6796 | Cursor cursor = None; | ||
| 6797 | struct buffer *b; | ||
| 6796 | 6798 | ||
| 6797 | /* When a menu is active, don't highlight because this looks odd. */ | 6799 | /* When a menu is active, don't highlight because this looks odd. */ |
| 6798 | #ifdef USE_X_TOOLKIT | 6800 | #ifdef USE_X_TOOLKIT |
| @@ -6840,31 +6842,35 @@ note_mouse_highlight (f, x, y) | |||
| 6840 | return; | 6842 | return; |
| 6841 | } | 6843 | } |
| 6842 | 6844 | ||
| 6845 | /* Mouse is on the mode or header line? */ | ||
| 6843 | if (portion == 1 || portion == 3) | 6846 | if (portion == 1 || portion == 3) |
| 6844 | { | 6847 | { |
| 6845 | /* Mouse is on the mode or top line. */ | ||
| 6846 | note_mode_line_highlight (w, x, portion == 1); | 6848 | note_mode_line_highlight (w, x, portion == 1); |
| 6847 | return; | 6849 | return; |
| 6848 | } | 6850 | } |
| 6849 | else if (portion == 2) | 6851 | |
| 6850 | XDefineCursor (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f), | 6852 | if (portion == 2) |
| 6851 | f->output_data.x->horizontal_drag_cursor); | 6853 | cursor = f->output_data.x->horizontal_drag_cursor; |
| 6852 | else | 6854 | else |
| 6853 | XDefineCursor (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f), | 6855 | cursor = f->output_data.x->text_cursor; |
| 6854 | f->output_data.x->text_cursor); | ||
| 6855 | 6856 | ||
| 6856 | /* Are we in a window whose display is up to date? | 6857 | /* Are we in a window whose display is up to date? |
| 6857 | And verify the buffer's text has not changed. */ | 6858 | And verify the buffer's text has not changed. */ |
| 6859 | b = XBUFFER (w->buffer); | ||
| 6858 | if (/* Within text portion of the window. */ | 6860 | if (/* Within text portion of the window. */ |
| 6859 | portion == 0 | 6861 | portion == 0 |
| 6860 | && EQ (w->window_end_valid, w->buffer) | 6862 | && EQ (w->window_end_valid, w->buffer) |
| 6861 | && XFASTINT (w->last_modified) == BUF_MODIFF (XBUFFER (w->buffer)) | 6863 | && XFASTINT (w->last_modified) == BUF_MODIFF (b) |
| 6862 | && (XFASTINT (w->last_overlay_modified) | 6864 | && XFASTINT (w->last_overlay_modified) == BUF_OVERLAY_MODIFF (b)) |
| 6863 | == BUF_OVERLAY_MODIFF (XBUFFER (w->buffer)))) | ||
| 6864 | { | 6865 | { |
| 6865 | int hpos, vpos, pos, i, area; | 6866 | int hpos, vpos, pos, i, area; |
| 6866 | struct glyph *glyph; | 6867 | struct glyph *glyph; |
| 6867 | Lisp_Object object; | 6868 | Lisp_Object object; |
| 6869 | Lisp_Object mouse_face = Qnil, overlay = Qnil, position; | ||
| 6870 | Lisp_Object *overlay_vec = NULL; | ||
| 6871 | int len, noverlays; | ||
| 6872 | struct buffer *obuf; | ||
| 6873 | int obegv, ozv, same_region; | ||
| 6868 | 6874 | ||
| 6869 | /* Find the glyph under X/Y. */ | 6875 | /* Find the glyph under X/Y. */ |
| 6870 | glyph = x_y_to_hpos_vpos (w, x, y, &hpos, &vpos, &area, 0); | 6876 | glyph = x_y_to_hpos_vpos (w, x, y, &hpos, &vpos, &area, 0); |
| @@ -6883,261 +6889,261 @@ note_mouse_highlight (f, x, y) | |||
| 6883 | if (!STRINGP (object) && !BUFFERP (object)) | 6889 | if (!STRINGP (object) && !BUFFERP (object)) |
| 6884 | return; | 6890 | return; |
| 6885 | 6891 | ||
| 6886 | { | 6892 | /* If we get an out-of-range value, return now; avoid an error. */ |
| 6887 | Lisp_Object mouse_face = Qnil, overlay = Qnil, position; | 6893 | if (BUFFERP (object) && pos > BUF_Z (b)) |
| 6888 | Lisp_Object *overlay_vec = NULL; | 6894 | return; |
| 6889 | int len, noverlays; | ||
| 6890 | struct buffer *obuf; | ||
| 6891 | int obegv, ozv; | ||
| 6892 | |||
| 6893 | /* If we get an out-of-range value, return now; avoid an error. */ | ||
| 6894 | if (BUFFERP (object) && pos > BUF_Z (XBUFFER (w->buffer))) | ||
| 6895 | return; | ||
| 6896 | 6895 | ||
| 6897 | /* Make the window's buffer temporarily current for | 6896 | /* Make the window's buffer temporarily current for |
| 6898 | overlays_at and compute_char_face. */ | 6897 | overlays_at and compute_char_face. */ |
| 6899 | obuf = current_buffer; | 6898 | obuf = current_buffer; |
| 6900 | current_buffer = XBUFFER (w->buffer); | 6899 | current_buffer = b; |
| 6901 | obegv = BEGV; | 6900 | obegv = BEGV; |
| 6902 | ozv = ZV; | 6901 | ozv = ZV; |
| 6903 | BEGV = BEG; | 6902 | BEGV = BEG; |
| 6904 | ZV = Z; | 6903 | ZV = Z; |
| 6905 | 6904 | ||
| 6906 | /* Is this char mouse-active or does it have help-echo? */ | 6905 | /* Is this char mouse-active or does it have help-echo? */ |
| 6907 | position = make_number (pos); | 6906 | position = make_number (pos); |
| 6908 | 6907 | ||
| 6909 | if (BUFFERP (object)) | 6908 | if (BUFFERP (object)) |
| 6910 | { | 6909 | { |
| 6911 | /* Put all the overlays we want in a vector in overlay_vec. | 6910 | /* Put all the overlays we want in a vector in overlay_vec. |
| 6912 | Store the length in len. If there are more than 10, make | 6911 | Store the length in len. If there are more than 10, make |
| 6913 | enough space for all, and try again. */ | 6912 | enough space for all, and try again. */ |
| 6914 | len = 10; | 6913 | len = 10; |
| 6915 | overlay_vec = (Lisp_Object *) alloca (len * sizeof (Lisp_Object)); | 6914 | overlay_vec = (Lisp_Object *) alloca (len * sizeof (Lisp_Object)); |
| 6916 | noverlays = overlays_at (pos, 0, &overlay_vec, &len, NULL, NULL, 0); | 6915 | noverlays = overlays_at (pos, 0, &overlay_vec, &len, NULL, NULL, 0); |
| 6917 | if (noverlays > len) | 6916 | if (noverlays > len) |
| 6918 | { | 6917 | { |
| 6919 | len = noverlays; | 6918 | len = noverlays; |
| 6920 | overlay_vec = (Lisp_Object *) alloca (len * sizeof (Lisp_Object)); | 6919 | overlay_vec = (Lisp_Object *) alloca (len * sizeof (Lisp_Object)); |
| 6921 | noverlays = overlays_at (pos, 0, &overlay_vec, &len, NULL, NULL,0); | 6920 | noverlays = overlays_at (pos, 0, &overlay_vec, &len, NULL, NULL,0); |
| 6922 | } | 6921 | } |
| 6923 | 6922 | ||
| 6924 | /* Sort overlays into increasing priority order. */ | 6923 | /* Sort overlays into increasing priority order. */ |
| 6925 | noverlays = sort_overlays (overlay_vec, noverlays, w); | 6924 | noverlays = sort_overlays (overlay_vec, noverlays, w); |
| 6926 | } | 6925 | } |
| 6927 | else | 6926 | else |
| 6928 | noverlays = 0; | 6927 | noverlays = 0; |
| 6929 | 6928 | ||
| 6930 | /* Check mouse-face highlighting. */ | 6929 | same_region = (EQ (window, dpyinfo->mouse_face_window) |
| 6931 | if (! (EQ (window, dpyinfo->mouse_face_window) | 6930 | && vpos >= dpyinfo->mouse_face_beg_row |
| 6932 | && vpos >= dpyinfo->mouse_face_beg_row | 6931 | && vpos <= dpyinfo->mouse_face_end_row |
| 6933 | && vpos <= dpyinfo->mouse_face_end_row | 6932 | && (vpos > dpyinfo->mouse_face_beg_row |
| 6934 | && (vpos > dpyinfo->mouse_face_beg_row | 6933 | || hpos >= dpyinfo->mouse_face_beg_col) |
| 6935 | || hpos >= dpyinfo->mouse_face_beg_col) | 6934 | && (vpos < dpyinfo->mouse_face_end_row |
| 6936 | && (vpos < dpyinfo->mouse_face_end_row | 6935 | || hpos < dpyinfo->mouse_face_end_col |
| 6937 | || hpos < dpyinfo->mouse_face_end_col | 6936 | || dpyinfo->mouse_face_past_end)); |
| 6938 | || dpyinfo->mouse_face_past_end)) | 6937 | |
| 6939 | /* If there exists an overlay with mouse-face overlapping | 6938 | if (same_region) |
| 6940 | the one we are currently highlighting, we have to | 6939 | cursor = None; |
| 6941 | check if we enter the overlapping overlay, and then | 6940 | |
| 6942 | highlight only that. */ | 6941 | /* Check mouse-face highlighting. */ |
| 6943 | || (OVERLAYP (dpyinfo->mouse_face_overlay) | 6942 | if (! same_region |
| 6944 | && mouse_face_overlay_overlaps (dpyinfo->mouse_face_overlay))) | 6943 | /* If there exists an overlay with mouse-face overlapping |
| 6945 | 6944 | the one we are currently highlighting, we have to | |
| 6946 | { | 6945 | check if we enter the overlapping overlay, and then |
| 6947 | /* Clear the display of the old active region, if any. */ | 6946 | highlight only that. */ |
| 6948 | clear_mouse_face (dpyinfo); | 6947 | || (OVERLAYP (dpyinfo->mouse_face_overlay) |
| 6948 | && mouse_face_overlay_overlaps (dpyinfo->mouse_face_overlay))) | ||
| 6949 | { | ||
| 6950 | /* Clear the display of the old active region, if any. */ | ||
| 6951 | clear_mouse_face (dpyinfo); | ||
| 6952 | cursor = None; | ||
| 6949 | 6953 | ||
| 6950 | /* Find the highest priority overlay that has a mouse-face | 6954 | /* Find the highest priority overlay that has a mouse-face |
| 6951 | property. */ | 6955 | property. */ |
| 6952 | overlay = Qnil; | 6956 | overlay = Qnil; |
| 6953 | for (i = noverlays - 1; i >= 0 && NILP (overlay); --i) | 6957 | for (i = noverlays - 1; i >= 0 && NILP (overlay); --i) |
| 6954 | { | 6958 | { |
| 6955 | mouse_face = Foverlay_get (overlay_vec[i], Qmouse_face); | 6959 | mouse_face = Foverlay_get (overlay_vec[i], Qmouse_face); |
| 6956 | if (!NILP (mouse_face)) | 6960 | if (!NILP (mouse_face)) |
| 6957 | overlay = overlay_vec[i]; | 6961 | overlay = overlay_vec[i]; |
| 6958 | } | 6962 | } |
| 6959 | dpyinfo->mouse_face_overlay = overlay; | 6963 | dpyinfo->mouse_face_overlay = overlay; |
| 6960 | 6964 | ||
| 6961 | /* If no overlay applies, get a text property. */ | 6965 | /* If no overlay applies, get a text property. */ |
| 6962 | if (NILP (overlay)) | 6966 | if (NILP (overlay)) |
| 6963 | mouse_face = Fget_text_property (position, Qmouse_face, object); | 6967 | mouse_face = Fget_text_property (position, Qmouse_face, object); |
| 6964 | 6968 | ||
| 6965 | /* Handle the overlay case. */ | 6969 | /* Handle the overlay case. */ |
| 6966 | if (!NILP (overlay)) | 6970 | if (!NILP (overlay)) |
| 6967 | { | 6971 | { |
| 6968 | /* Find the range of text around this char that | 6972 | /* Find the range of text around this char that |
| 6969 | should be active. */ | 6973 | should be active. */ |
| 6970 | Lisp_Object before, after; | 6974 | Lisp_Object before, after; |
| 6971 | int ignore; | 6975 | int ignore; |
| 6972 | 6976 | ||
| 6973 | before = Foverlay_start (overlay); | 6977 | before = Foverlay_start (overlay); |
| 6974 | after = Foverlay_end (overlay); | 6978 | after = Foverlay_end (overlay); |
| 6975 | /* Record this as the current active region. */ | 6979 | /* Record this as the current active region. */ |
| 6976 | fast_find_position (w, XFASTINT (before), | 6980 | fast_find_position (w, XFASTINT (before), |
| 6977 | &dpyinfo->mouse_face_beg_col, | 6981 | &dpyinfo->mouse_face_beg_col, |
| 6978 | &dpyinfo->mouse_face_beg_row, | 6982 | &dpyinfo->mouse_face_beg_row, |
| 6979 | &dpyinfo->mouse_face_beg_x, | 6983 | &dpyinfo->mouse_face_beg_x, |
| 6980 | &dpyinfo->mouse_face_beg_y); | 6984 | &dpyinfo->mouse_face_beg_y); |
| 6981 | dpyinfo->mouse_face_past_end | 6985 | dpyinfo->mouse_face_past_end |
| 6982 | = !fast_find_position (w, XFASTINT (after), | 6986 | = !fast_find_position (w, XFASTINT (after), |
| 6983 | &dpyinfo->mouse_face_end_col, | 6987 | &dpyinfo->mouse_face_end_col, |
| 6984 | &dpyinfo->mouse_face_end_row, | 6988 | &dpyinfo->mouse_face_end_row, |
| 6985 | &dpyinfo->mouse_face_end_x, | 6989 | &dpyinfo->mouse_face_end_x, |
| 6986 | &dpyinfo->mouse_face_end_y); | 6990 | &dpyinfo->mouse_face_end_y); |
| 6987 | dpyinfo->mouse_face_window = window; | 6991 | dpyinfo->mouse_face_window = window; |
| 6992 | dpyinfo->mouse_face_face_id | ||
| 6993 | = face_at_buffer_position (w, pos, 0, 0, | ||
| 6994 | &ignore, pos + 1, 1); | ||
| 6995 | |||
| 6996 | /* Display it as active. */ | ||
| 6997 | show_mouse_face (dpyinfo, DRAW_MOUSE_FACE); | ||
| 6998 | } | ||
| 6999 | /* Handle the text property case. */ | ||
| 7000 | else if (!NILP (mouse_face) && BUFFERP (object)) | ||
| 7001 | { | ||
| 7002 | /* Find the range of text around this char that | ||
| 7003 | should be active. */ | ||
| 7004 | Lisp_Object before, after, beginning, end; | ||
| 7005 | int ignore; | ||
| 7006 | |||
| 7007 | beginning = Fmarker_position (w->start); | ||
| 7008 | end = make_number (BUF_Z (XBUFFER (object)) | ||
| 7009 | - XFASTINT (w->window_end_pos)); | ||
| 7010 | before | ||
| 7011 | = Fprevious_single_property_change (make_number (pos + 1), | ||
| 7012 | Qmouse_face, | ||
| 7013 | object, beginning); | ||
| 7014 | after | ||
| 7015 | = Fnext_single_property_change (position, Qmouse_face, | ||
| 7016 | object, end); | ||
| 7017 | |||
| 7018 | /* Record this as the current active region. */ | ||
| 7019 | fast_find_position (w, XFASTINT (before), | ||
| 7020 | &dpyinfo->mouse_face_beg_col, | ||
| 7021 | &dpyinfo->mouse_face_beg_row, | ||
| 7022 | &dpyinfo->mouse_face_beg_x, | ||
| 7023 | &dpyinfo->mouse_face_beg_y); | ||
| 7024 | dpyinfo->mouse_face_past_end | ||
| 7025 | = !fast_find_position (w, XFASTINT (after), | ||
| 7026 | &dpyinfo->mouse_face_end_col, | ||
| 7027 | &dpyinfo->mouse_face_end_row, | ||
| 7028 | &dpyinfo->mouse_face_end_x, | ||
| 7029 | &dpyinfo->mouse_face_end_y); | ||
| 7030 | dpyinfo->mouse_face_window = window; | ||
| 7031 | |||
| 7032 | if (BUFFERP (object)) | ||
| 6988 | dpyinfo->mouse_face_face_id | 7033 | dpyinfo->mouse_face_face_id |
| 6989 | = face_at_buffer_position (w, pos, 0, 0, | 7034 | = face_at_buffer_position (w, pos, 0, 0, |
| 6990 | &ignore, pos + 1, 1); | 7035 | &ignore, pos + 1, 1); |
| 6991 | 7036 | ||
| 6992 | /* Display it as active. */ | 7037 | /* Display it as active. */ |
| 6993 | show_mouse_face (dpyinfo, DRAW_MOUSE_FACE); | 7038 | show_mouse_face (dpyinfo, DRAW_MOUSE_FACE); |
| 6994 | } | 7039 | } |
| 6995 | /* Handle the text property case. */ | 7040 | else if (!NILP (mouse_face) && STRINGP (object)) |
| 6996 | else if (!NILP (mouse_face) && BUFFERP (object)) | 7041 | { |
| 6997 | { | 7042 | Lisp_Object b, e; |
| 6998 | /* Find the range of text around this char that | 7043 | int ignore; |
| 6999 | should be active. */ | ||
| 7000 | Lisp_Object before, after, beginning, end; | ||
| 7001 | int ignore; | ||
| 7002 | |||
| 7003 | beginning = Fmarker_position (w->start); | ||
| 7004 | end = make_number (BUF_Z (XBUFFER (object)) | ||
| 7005 | - XFASTINT (w->window_end_pos)); | ||
| 7006 | before | ||
| 7007 | = Fprevious_single_property_change (make_number (pos + 1), | ||
| 7008 | Qmouse_face, | ||
| 7009 | object, beginning); | ||
| 7010 | after | ||
| 7011 | = Fnext_single_property_change (position, Qmouse_face, | ||
| 7012 | object, end); | ||
| 7013 | 7044 | ||
| 7014 | /* Record this as the current active region. */ | 7045 | b = Fprevious_single_property_change (make_number (pos + 1), |
| 7015 | fast_find_position (w, XFASTINT (before), | 7046 | Qmouse_face, |
| 7047 | object, Qnil); | ||
| 7048 | e = Fnext_single_property_change (position, Qmouse_face, | ||
| 7049 | object, Qnil); | ||
| 7050 | if (NILP (b)) | ||
| 7051 | b = make_number (0); | ||
| 7052 | if (NILP (e)) | ||
| 7053 | e = make_number (XSTRING (object)->size - 1); | ||
| 7054 | fast_find_string_pos (w, XINT (b), object, | ||
| 7016 | &dpyinfo->mouse_face_beg_col, | 7055 | &dpyinfo->mouse_face_beg_col, |
| 7017 | &dpyinfo->mouse_face_beg_row, | 7056 | &dpyinfo->mouse_face_beg_row, |
| 7018 | &dpyinfo->mouse_face_beg_x, | 7057 | &dpyinfo->mouse_face_beg_x, |
| 7019 | &dpyinfo->mouse_face_beg_y); | 7058 | &dpyinfo->mouse_face_beg_y, 0); |
| 7020 | dpyinfo->mouse_face_past_end | 7059 | fast_find_string_pos (w, XINT (e), object, |
| 7021 | = !fast_find_position (w, XFASTINT (after), | 7060 | &dpyinfo->mouse_face_end_col, |
| 7022 | &dpyinfo->mouse_face_end_col, | 7061 | &dpyinfo->mouse_face_end_row, |
| 7023 | &dpyinfo->mouse_face_end_row, | 7062 | &dpyinfo->mouse_face_end_x, |
| 7024 | &dpyinfo->mouse_face_end_x, | 7063 | &dpyinfo->mouse_face_end_y, 1); |
| 7025 | &dpyinfo->mouse_face_end_y); | 7064 | dpyinfo->mouse_face_past_end = 0; |
| 7026 | dpyinfo->mouse_face_window = window; | 7065 | dpyinfo->mouse_face_window = window; |
| 7027 | 7066 | dpyinfo->mouse_face_face_id | |
| 7028 | if (BUFFERP (object)) | 7067 | = face_at_string_position (w, object, pos, 0, 0, 0, &ignore, |
| 7029 | dpyinfo->mouse_face_face_id | 7068 | glyph->face_id, 1); |
| 7030 | = face_at_buffer_position (w, pos, 0, 0, | 7069 | show_mouse_face (dpyinfo, DRAW_MOUSE_FACE); |
| 7031 | &ignore, pos + 1, 1); | 7070 | } |
| 7032 | 7071 | } | |
| 7033 | /* Display it as active. */ | ||
| 7034 | show_mouse_face (dpyinfo, DRAW_MOUSE_FACE); | ||
| 7035 | } | ||
| 7036 | else if (!NILP (mouse_face) && STRINGP (object)) | ||
| 7037 | { | ||
| 7038 | Lisp_Object b, e; | ||
| 7039 | int ignore; | ||
| 7040 | |||
| 7041 | b = Fprevious_single_property_change (make_number (pos + 1), | ||
| 7042 | Qmouse_face, | ||
| 7043 | object, Qnil); | ||
| 7044 | e = Fnext_single_property_change (position, Qmouse_face, | ||
| 7045 | object, Qnil); | ||
| 7046 | if (NILP (b)) | ||
| 7047 | b = make_number (0); | ||
| 7048 | if (NILP (e)) | ||
| 7049 | e = make_number (XSTRING (object)->size - 1); | ||
| 7050 | fast_find_string_pos (w, XINT (b), object, | ||
| 7051 | &dpyinfo->mouse_face_beg_col, | ||
| 7052 | &dpyinfo->mouse_face_beg_row, | ||
| 7053 | &dpyinfo->mouse_face_beg_x, | ||
| 7054 | &dpyinfo->mouse_face_beg_y, 0); | ||
| 7055 | fast_find_string_pos (w, XINT (e), object, | ||
| 7056 | &dpyinfo->mouse_face_end_col, | ||
| 7057 | &dpyinfo->mouse_face_end_row, | ||
| 7058 | &dpyinfo->mouse_face_end_x, | ||
| 7059 | &dpyinfo->mouse_face_end_y, 1); | ||
| 7060 | dpyinfo->mouse_face_past_end = 0; | ||
| 7061 | dpyinfo->mouse_face_window = window; | ||
| 7062 | dpyinfo->mouse_face_face_id | ||
| 7063 | = face_at_string_position (w, object, pos, 0, 0, 0, &ignore, | ||
| 7064 | glyph->face_id, 1); | ||
| 7065 | show_mouse_face (dpyinfo, DRAW_MOUSE_FACE); | ||
| 7066 | } | ||
| 7067 | } | ||
| 7068 | 7072 | ||
| 7069 | /* Look for a `help-echo' property. */ | 7073 | /* Look for a `help-echo' property. */ |
| 7070 | { | 7074 | { |
| 7071 | Lisp_Object help, overlay; | 7075 | Lisp_Object help, overlay; |
| 7072 | 7076 | ||
| 7073 | /* Check overlays first. */ | 7077 | /* Check overlays first. */ |
| 7074 | help = overlay = Qnil; | 7078 | help = overlay = Qnil; |
| 7075 | for (i = noverlays - 1; i >= 0 && NILP (help); --i) | 7079 | for (i = noverlays - 1; i >= 0 && NILP (help); --i) |
| 7076 | { | 7080 | { |
| 7077 | overlay = overlay_vec[i]; | 7081 | overlay = overlay_vec[i]; |
| 7078 | help = Foverlay_get (overlay, Qhelp_echo); | 7082 | help = Foverlay_get (overlay, Qhelp_echo); |
| 7079 | } | 7083 | } |
| 7080 | 7084 | ||
| 7081 | if (!NILP (help)) | 7085 | if (!NILP (help)) |
| 7082 | { | 7086 | { |
| 7083 | help_echo = help; | 7087 | help_echo = help; |
| 7084 | help_echo_window = window; | 7088 | help_echo_window = window; |
| 7085 | help_echo_object = overlay; | 7089 | help_echo_object = overlay; |
| 7086 | help_echo_pos = pos; | 7090 | help_echo_pos = pos; |
| 7087 | } | 7091 | } |
| 7088 | else | 7092 | else |
| 7089 | { | 7093 | { |
| 7090 | Lisp_Object object = glyph->object; | 7094 | Lisp_Object object = glyph->object; |
| 7091 | int charpos = glyph->charpos; | 7095 | int charpos = glyph->charpos; |
| 7092 | 7096 | ||
| 7093 | /* Try text properties. */ | 7097 | /* Try text properties. */ |
| 7094 | if (STRINGP (object) | 7098 | if (STRINGP (object) |
| 7095 | && charpos >= 0 | 7099 | && charpos >= 0 |
| 7096 | && charpos < XSTRING (object)->size) | 7100 | && charpos < XSTRING (object)->size) |
| 7097 | { | 7101 | { |
| 7098 | help = Fget_text_property (make_number (charpos), | 7102 | help = Fget_text_property (make_number (charpos), |
| 7099 | Qhelp_echo, object); | 7103 | Qhelp_echo, object); |
| 7100 | if (NILP (help)) | 7104 | if (NILP (help)) |
| 7101 | { | 7105 | { |
| 7102 | /* If the string itself doesn't specify a help-echo, | 7106 | /* If the string itself doesn't specify a help-echo, |
| 7103 | see if the buffer text ``under'' it does. */ | 7107 | see if the buffer text ``under'' it does. */ |
| 7104 | struct glyph_row *r | 7108 | struct glyph_row *r |
| 7105 | = MATRIX_ROW (w->current_matrix, vpos); | 7109 | = MATRIX_ROW (w->current_matrix, vpos); |
| 7106 | int start = MATRIX_ROW_START_CHARPOS (r); | 7110 | int start = MATRIX_ROW_START_CHARPOS (r); |
| 7107 | int pos = string_buffer_position (w, object, start); | 7111 | int pos = string_buffer_position (w, object, start); |
| 7108 | if (pos > 0) | 7112 | if (pos > 0) |
| 7109 | { | 7113 | { |
| 7110 | help = Fget_text_property (make_number (pos), | 7114 | help = Fget_text_property (make_number (pos), |
| 7111 | Qhelp_echo, w->buffer); | 7115 | Qhelp_echo, w->buffer); |
| 7112 | if (!NILP (help)) | 7116 | if (!NILP (help)) |
| 7113 | { | 7117 | { |
| 7114 | charpos = pos; | 7118 | charpos = pos; |
| 7115 | object = w->buffer; | 7119 | object = w->buffer; |
| 7116 | } | 7120 | } |
| 7117 | } | 7121 | } |
| 7118 | } | 7122 | } |
| 7119 | } | 7123 | } |
| 7120 | else if (BUFFERP (object) | 7124 | else if (BUFFERP (object) |
| 7121 | && charpos >= BEGV | 7125 | && charpos >= BEGV |
| 7122 | && charpos < ZV) | 7126 | && charpos < ZV) |
| 7123 | help = Fget_text_property (make_number (charpos), Qhelp_echo, | 7127 | help = Fget_text_property (make_number (charpos), Qhelp_echo, |
| 7124 | object); | 7128 | object); |
| 7125 | 7129 | ||
| 7126 | if (!NILP (help)) | 7130 | if (!NILP (help)) |
| 7127 | { | 7131 | { |
| 7128 | help_echo = help; | 7132 | help_echo = help; |
| 7129 | help_echo_window = window; | 7133 | help_echo_window = window; |
| 7130 | help_echo_object = object; | 7134 | help_echo_object = object; |
| 7131 | help_echo_pos = charpos; | 7135 | help_echo_pos = charpos; |
| 7132 | } | 7136 | } |
| 7133 | } | 7137 | } |
| 7134 | } | ||
| 7135 | |||
| 7136 | BEGV = obegv; | ||
| 7137 | ZV = ozv; | ||
| 7138 | current_buffer = obuf; | ||
| 7139 | } | 7138 | } |
| 7139 | |||
| 7140 | BEGV = obegv; | ||
| 7141 | ZV = ozv; | ||
| 7142 | current_buffer = obuf; | ||
| 7140 | } | 7143 | } |
| 7144 | |||
| 7145 | if (cursor != None) | ||
| 7146 | XDefineCursor (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f), cursor); | ||
| 7141 | } | 7147 | } |
| 7142 | 7148 | ||
| 7143 | static void | 7149 | static void |