--- a/src/keyboard.c +++ b/src/keyboard.c @@ -1970,5 +1970,63 @@ command_loop_1 () finalize: + /* Run point-entered and point-left hooks for overlays */ + if (NILP (Vinhibit_point_motion_hooks)) + { + int i, j; + int noverlays_cur, noverlays_prev; + Lisp_Object *overlay_cur_vec; + Lisp_Object *overlay_prev_vec; + extern Lisp_Object Qpoint_entered, Qpoint_left, Qwindow; + Lisp_Object point_left, point_entered; + Lisp_Object overlay_window; + + GET_OVERLAYS_AT (current_buffer->pt, + overlay_cur_vec, + noverlays_cur, + NULL, + 0); + GET_OVERLAYS_AT (last_point_position, + overlay_prev_vec, + noverlays_prev, + NULL, + 0); + + /* Go through each overlay that overlapped last_point_position and + run it's point_left hook only if the current location is not + overlapped by that overlay. */ + for (i = 0; i < noverlays_prev; i++) + { + for (j = 0; j < noverlays_cur; j++) + { + if (overlay_prev_vec[i] == overlay_cur_vec[j]) + goto next_overlay; + } + point_left = Foverlay_get (overlay_prev_vec[i], Qpoint_left); + overlay_window = Foverlay_get (overlay_prev_vec[i], Qwindow); + if (!NILP (point_left) + && (NILP (overlay_window) + || !NILP (Feq (overlay_window, Fselected_window())))) + call2 (point_left, + make_number (last_point_position), + make_number (current_buffer->pt)); + + next_overlay: + i = i; + } + + /* Run point_entered functions for all overlays overlapping the + current point */ + for (i = 0; i < noverlays_cur; i++) + { + point_entered = Foverlay_get (overlay_cur_vec[i], Qpoint_entered); + overlay_window = Foverlay_get (overlay_cur_vec[i], Qwindow); + if (!NILP (point_entered) + && (NILP (overlay_window) + || !NILP (Feq (overlay_window, Fselected_window())))) + call2 (point_entered, make_number (last_point_position), make_number (current_buffer->pt)); + } + } + if (current_buffer == prev_buffer && last_point_position != PT && NILP (Vdisable_point_adjustment)