1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-28 00:01:33 -08:00

(make_lispy_position): Use modified mode_line_string,

buffer_posn_from_coords, and marginal_area_string functions to
include both string object and image object in the lispy position.
Also add actual glyph width and height to position.
(read_key_sequence): Use real buffer position from mouse
event to find keymap property even when click is in marginal area.
This commit is contained in:
Kim F. Storm 2004-01-06 22:37:39 +00:00
parent 6a3d9c9ff4
commit eee5863b68

View file

@ -2943,13 +2943,13 @@ read_char (commandflag, nmaps, maps, prev_event, used_mouse_menu)
{
Lisp_Object posn;
posn = POSN_BUFFER_POSN (EVENT_START (c));
posn = POSN_POSN (EVENT_START (c));
/* Handle menu-bar events:
insert the dummy prefix event `menu-bar'. */
if (EQ (posn, Qmenu_bar) || EQ (posn, Qtool_bar))
{
/* Change menu-bar to (menu-bar) as the event "position". */
POSN_BUFFER_SET_POSN (EVENT_START (c), Fcons (posn, Qnil));
POSN_SET_POSN (EVENT_START (c), Fcons (posn, Qnil));
also_record = c;
Vunread_command_events = Fcons (c, Vunread_command_events);
@ -4982,9 +4982,11 @@ make_lispy_position (f, x, y, time)
{
/* It's a click in window window at frame coordinates (x,y) */
struct window *w = XWINDOW (window);
Lisp_Object object = Qnil;
Lisp_Object string_info = Qnil;
int textpos = -1, rx = -1, ry = -1;
int dx = -1, dy = -1;
int width = -1, height = -1;
Lisp_Object object = Qnil;
/* Set event coordinates to window-relative coordinates
for constructing the Lisp event below. */
@ -5000,9 +5002,10 @@ make_lispy_position (f, x, y, time)
posn = part == ON_MODE_LINE ? Qmode_line : Qheader_line;
rx = wx, ry = wy;
string = mode_line_string (w, &rx, &ry, &dx, &dy, part, &charpos);
string = mode_line_string (w, part, &rx, &ry, &charpos,
&object, &dx, &dy, &width, &height);
if (STRINGP (string))
object = Fcons (string, make_number (charpos));
string_info = Fcons (string, make_number (charpos));
if (w == XWINDOW (selected_window))
textpos = PT;
else
@ -5013,6 +5016,7 @@ make_lispy_position (f, x, y, time)
posn = Qvertical_line;
wx = -1;
dx = 0;
width = 1;
}
else if (part == ON_LEFT_MARGIN || part == ON_RIGHT_MARGIN)
{
@ -5021,22 +5025,10 @@ make_lispy_position (f, x, y, time)
posn = (part == ON_LEFT_MARGIN) ? Qleft_margin : Qright_margin;
rx = wx, ry = wy;
string = marginal_area_string (w, &rx, &ry, &dx, &dy, part, &charpos);
string = marginal_area_string (w, part, &rx, &ry, &charpos,
&object, &dx, &dy, &width, &height);
if (STRINGP (string))
object = Fcons (string, make_number (charpos));
#ifdef HAVE_WINDOW_SYSTEM
else if (IMAGEP (string))
{
Lisp_Object image_map, hotspot;
object = string;
if ((image_map = Fplist_get (XCDR (object), QCmap),
!NILP (image_map))
&& (hotspot = find_hot_spot (image_map, dx, dy),
CONSP (hotspot))
&& (hotspot = XCDR (hotspot), CONSP (hotspot)))
posn = XCAR (hotspot);
}
#endif
string_info = Fcons (string, make_number (charpos));
}
else if (part == ON_LEFT_FRINGE || part == ON_RIGHT_FRINGE)
{
@ -5055,46 +5047,60 @@ make_lispy_position (f, x, y, time)
if (textpos < 0)
{
Lisp_Object string;
Lisp_Object string2, object2 = Qnil;
struct display_pos p;
int dx2, dy2;
int width2, height2;
wx = max (WINDOW_LEFT_MARGIN_WIDTH (w), wx);
buffer_posn_from_coords (w, &wx, &wy, &dx2, &dy2, &string, &p);
string2 = buffer_posn_from_coords (w, &wx, &wy, &p,
&object2, &dx2, &dy2,
&width2, &height2);
textpos = CHARPOS (p.pos);
if (rx < 0) rx = wx;
if (ry < 0) ry = wy;
if (dx < 0) dx = dx2;
if (dy < 0) dy = dy2;
if (width < 0) width = width2;
if (height < 0) height = height2;
if (NILP (posn))
{
posn = make_number (textpos);
if (STRINGP (string))
object = Fcons (string,
make_number (CHARPOS (p.string_pos)));
#ifdef HAVE_WINDOW_SYSTEM
else if (IMAGEP (string))
{
Lisp_Object image_map, hotspot;
object = string;
if ((image_map = Fplist_get (XCDR (object), QCmap),
!NILP (image_map))
&& (hotspot = find_hot_spot (image_map, dx, dy),
CONSP (hotspot))
&& (hotspot = XCDR (hotspot), CONSP (hotspot)))
posn = XCAR (hotspot);
}
#endif
if (STRINGP (string2))
string_info = Fcons (string2,
make_number (CHARPOS (p.string_pos)));
}
if (NILP (object))
object = object2;
}
#ifdef HAVE_WINDOW_SYSTEM
if (IMAGEP (object))
{
Lisp_Object image_map, hotspot;
if ((image_map = Fplist_get (XCDR (object), QCmap),
!NILP (image_map))
&& (hotspot = find_hot_spot (image_map, dx, dy),
CONSP (hotspot))
&& (hotspot = XCDR (hotspot), CONSP (hotspot)))
posn = XCAR (hotspot);
}
#endif
/* Object info */
extra_info = Fcons (object,
Fcons (Fcons (make_number (dx),
make_number (dy)),
Fcons (Fcons (make_number (width),
make_number (height)),
Qnil)));
/* String info */
extra_info = Fcons (string_info,
Fcons (make_number (textpos),
Fcons (Fcons (make_number (rx),
make_number (ry)),
Fcons (Fcons (make_number (dx),
make_number (dy)),
Qnil))));
extra_info)));
}
else if (f != 0)
{
@ -8862,7 +8868,7 @@ read_key_sequence (keybuf, bufsize, prompt, dont_downcase_last,
Lisp_Object window, posn;
window = POSN_WINDOW (EVENT_START (key));
posn = POSN_BUFFER_POSN (EVENT_START (key));
posn = POSN_POSN (EVENT_START (key));
if (CONSP (posn)
|| (!NILP (fake_prefixed_keys)
@ -8920,7 +8926,7 @@ read_key_sequence (keybuf, bufsize, prompt, dont_downcase_last,
localized_local_map = 1;
start = EVENT_START (key);
if (CONSP (start) && CONSP (XCDR (start)))
if (CONSP (start) && POSN_INBUFFER_P (start))
{
pos = POSN_BUFFER_POSN (start);
if (INTEGERP (pos)
@ -9030,7 +9036,7 @@ read_key_sequence (keybuf, bufsize, prompt, dont_downcase_last,
{
Lisp_Object posn;
posn = POSN_BUFFER_POSN (EVENT_START (key));
posn = POSN_POSN (EVENT_START (key));
/* Handle menu-bar events:
insert the dummy prefix event `menu-bar'. */
if (EQ (posn, Qmenu_bar) || EQ (posn, Qtool_bar))
@ -9042,8 +9048,8 @@ read_key_sequence (keybuf, bufsize, prompt, dont_downcase_last,
/* Zap the position in key, so we know that we've
expanded it, and don't try to do so again. */
POSN_BUFFER_SET_POSN (EVENT_START (key),
Fcons (posn, Qnil));
POSN_SET_POSN (EVENT_START (key),
Fcons (posn, Qnil));
mock_input = t + 2;
goto replay_sequence;