is displayed as-is by @code{show-help-function}, without being passed
through @code{substitute-command-keys}.
+@item left-fringe-help
+@itemx right-fringe-help
+@cindex help-echo text on fringes
+If any visible text of a buffer line has @code{left-fringe-help} or
+@code{right-fringe-help} string text property defined on it, then the
+string will be displayed for a corresponding line's fringe through
+@code{show-help-function} (@pxref{Help display}). This is useful when
+used together with fringe cursors and bitmaps (@pxref{Fringes}).
+
@item keymap
@cindex keymap of character
@kindex keymap @r{(text property)}
DEFSYM (Qchild_frame_border_width, "child-frame-border-width");
DEFSYM (Qinternal_border_width, "internal-border-width");
DEFSYM (Qleft_fringe, "left-fringe");
+ DEFSYM (Qleft_fringe_help, "left-fringe-help");
DEFSYM (Qline_spacing, "line-spacing");
DEFSYM (Qmenu_bar_lines, "menu-bar-lines");
DEFSYM (Qtab_bar_lines, "tab-bar-lines");
DEFSYM (Qname, "name");
DEFSYM (Qright_divider_width, "right-divider-width");
DEFSYM (Qright_fringe, "right-fringe");
+ DEFSYM (Qright_fringe_help, "right-fringe-help");
DEFSYM (Qscreen_gamma, "screen-gamma");
DEFSYM (Qscroll_bar_background, "scroll-bar-background");
DEFSYM (Qscroll_bar_foreground, "scroll-bar-foreground");
}
+/* Take proper action when mouse has moved to the window WINDOW, with
+ window-local x-position X and y-position Y. This is only used for
+ displaying user-defined fringe indicator help-echo messages. */
+
+static void
+note_fringe_highlight (Lisp_Object window, int x, int y,
+ enum window_part part)
+{
+ if (!NILP (help_echo_string))
+ return;
+
+ /* Find a message to display through the help-echo mechanism whenever
+ the mouse hovers over a fringe indicator. Both text properties and
+ overlays have to be checked. */
+
+ /* Check the text property symbol to use. */
+ Lisp_Object sym;
+ if (part == ON_LEFT_FRINGE)
+ sym = Qleft_fringe_help;
+ else
+ sym = Qright_fringe_help;
+
+ /* Translate windows coordinates into a vertical window position. */
+ int hpos, vpos, area;
+ struct window *w = XWINDOW (window);
+ x_y_to_hpos_vpos (w, x, y, &hpos, &vpos, 0, 0, &area);
+
+ /* Get to the first glyph of a text row based on the vertical position
+ of the fringe. */
+ struct glyph *glyph = MATRIX_ROW_GLYPH_START(w->current_matrix, vpos);
+ int glyph_num = MATRIX_ROW_USED(w->current_matrix, vpos);
+
+ /* Check all glyphs while looking for fringe tooltips. */
+
+ /* NOTE: iterating over glyphs can only find text properties coming
+ from visible text. This means that zero-length overlays and
+ invisibile text are NOT inspected. */
+ for (;glyph_num; glyph_num--, glyph++)
+ {
+ Lisp_Object pos = make_fixnum(glyph->charpos);
+ Lisp_Object help_echo = Qnil;
+
+ if (STRINGP(glyph->object) || BUFFERP(glyph->object))
+ help_echo = get_char_property_and_overlay (pos, sym, glyph->object, NULL);
+
+ if (STRINGP (help_echo))
+ {
+ help_echo_string = help_echo;
+ break;
+ }
+ }
+}
+
/* EXPORT:
Take proper action when the mouse has moved to position X, Y on
frame F with regards to highlighting portions of display that have
}
else
cursor = FRAME_OUTPUT_DATA (f)->nontext_cursor;
- else if (part == ON_LEFT_FRINGE || part == ON_RIGHT_FRINGE
- || part == ON_VERTICAL_SCROLL_BAR
+ else if (part == ON_LEFT_FRINGE || part == ON_RIGHT_FRINGE)
+ {
+ cursor = FRAME_OUTPUT_DATA (f)->nontext_cursor;
+ note_fringe_highlight (window, x, y, part);
+ }
+ else if (part == ON_VERTICAL_SCROLL_BAR
|| part == ON_HORIZONTAL_SCROLL_BAR)
cursor = FRAME_OUTPUT_DATA (f)->nontext_cursor;
else