[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] Changes to emacs/src/keyboard.c
From: |
Kim F. Storm |
Subject: |
[Emacs-diffs] Changes to emacs/src/keyboard.c |
Date: |
Sat, 22 Nov 2003 19:09:39 -0500 |
Index: emacs/src/keyboard.c
diff -c emacs/src/keyboard.c:1.755 emacs/src/keyboard.c:1.756
*** emacs/src/keyboard.c:1.755 Mon Nov 17 18:29:40 2003
--- emacs/src/keyboard.c Sat Nov 22 19:09:39 2003
***************
*** 586,591 ****
--- 586,592 ----
Lisp_Object Qvertical_scroll_bar;
Lisp_Object Qmenu_bar;
extern Lisp_Object Qleft_margin, Qright_margin;
+ extern Lisp_Object Qleft_fringe, Qright_fringe;
Lisp_Object recursive_edit_unwind (), command_loop ();
Lisp_Object Fthis_command_keys ();
***************
*** 4955,4960 ****
--- 4956,5078 ----
int double_click_count;
+ /* Return position of a mouse click or wheel event */
+
+ static Lisp_Object
+ make_lispy_position (f, x, y, time)
+ struct frame *f;
+ Lisp_Object *x, *y;
+ unsigned long time;
+ {
+ Lisp_Object window;
+ enum window_part part;
+ Lisp_Object posn = Qnil;
+ Lisp_Object extra_info = Qnil;
+ int wx, wy;
+
+ /* Set `window' to the window under frame pixel coordinates (x,y) */
+ if (f)
+ window = window_from_coordinates (f, XINT (*x), XINT (*y),
+ &part, &wx, &wy, 0);
+ else
+ window = Qnil;
+
+ if (WINDOWP (window))
+ {
+ /* It's a click in window window at frame coordinates (x,y) */
+ struct window *w = XWINDOW (window);
+ Lisp_Object object = Qnil;
+ int textpos = -1, rx = -1, ry = -1;
+
+ /* Set event coordinates to window-relative coordinates
+ for constructing the Lisp event below. */
+ XSETINT (*x, wx);
+ XSETINT (*y, wy);
+
+ if (part == ON_MODE_LINE || part == ON_HEADER_LINE)
+ {
+ /* Mode line or header line. Look for a string under
+ the mouse that may have a `local-map' property. */
+ Lisp_Object string;
+ int charpos;
+
+ posn = part == ON_MODE_LINE ? Qmode_line : Qheader_line;
+ rx = wx, ry = wy;
+ string = mode_line_string (w, &rx, &ry, part, &charpos);
+ if (STRINGP (string))
+ object = Fcons (string, make_number (charpos));
+ if (w == XWINDOW (selected_window))
+ textpos = PT;
+ else
+ textpos = XMARKER (w->pointm)->charpos;
+ }
+ else if (part == ON_VERTICAL_BORDER)
+ {
+ posn = Qvertical_line;
+ wx = -1;
+ }
+ else if (part == ON_LEFT_MARGIN || part == ON_RIGHT_MARGIN)
+ {
+ Lisp_Object string;
+ int charpos;
+
+ posn = (part == ON_LEFT_MARGIN) ? Qleft_margin : Qright_margin;
+ rx = wx, ry = wy;
+ string = marginal_area_string (w, &rx, &ry, part, &charpos);
+ if (STRINGP (string))
+ object = Fcons (string, make_number (charpos));
+ }
+ else if (part == ON_LEFT_FRINGE || part == ON_RIGHT_FRINGE)
+ {
+ posn = (part == ON_LEFT_FRINGE) ? Qleft_fringe : Qright_fringe;
+ rx = 0;
+ }
+
+ if (textpos < 0)
+ {
+ Lisp_Object string;
+ struct display_pos p;
+ wx = max (WINDOW_LEFT_MARGIN_WIDTH (w), wx);
+ buffer_posn_from_coords (w, &wx, &wy, &string, &p);
+ textpos = CHARPOS (p.pos);
+ if (rx < 0)
+ rx = wx;
+ if (ry < 0)
+ ry = wy;
+
+ if (NILP (posn))
+ {
+ posn = make_number (textpos);
+ if (STRINGP (string))
+ object = Fcons (string,
+ make_number (CHARPOS (p.string_pos)));
+ }
+ }
+
+ extra_info = Fcons (object,
+ Fcons (make_number (textpos),
+ Fcons (Fcons (make_number (rx),
+ make_number (ry)),
+ Qnil)));
+ }
+ else if (f != 0)
+ {
+ XSETFRAME (window, f);
+ }
+ else
+ {
+ window = Qnil;
+ XSETFASTINT (*x, 0);
+ XSETFASTINT (*y, 0);
+ }
+
+ return Fcons (window,
+ Fcons (posn,
+ Fcons (Fcons (*x, *y),
+ Fcons (make_number (time),
+ extra_info))));
+ }
+
/* Given a struct input_event, build the lisp event which represents
it. If EVENT is 0, build a mouse movement event from the mouse
movement buffer, which should have a movement event in it.
***************
*** 5089,5113 ****
Lisp_Object position;
Lisp_Object *start_pos_ptr;
Lisp_Object start_pos;
- Lisp_Object window;
position = Qnil;
/* Build the position as appropriate for this mouse click. */
if (event->kind == MOUSE_CLICK_EVENT)
{
- enum window_part part;
struct frame *f = XFRAME (event->frame_or_window);
! Lisp_Object posn;
! Lisp_Object string_info = Qnil;
int row, column;
! int wx, wy;
/* Ignore mouse events that were made on frame that
have been deleted. */
if (! FRAME_LIVE_P (f))
return Qnil;
/* EVENT->x and EVENT->y are frame-relative pixel
coordinates at this place. Under old redisplay, COLUMN
and ROW are set to frame relative glyph coordinates
--- 5207,5229 ----
Lisp_Object position;
Lisp_Object *start_pos_ptr;
Lisp_Object start_pos;
position = Qnil;
/* Build the position as appropriate for this mouse click. */
if (event->kind == MOUSE_CLICK_EVENT)
{
struct frame *f = XFRAME (event->frame_or_window);
! #if ! defined (USE_X_TOOLKIT) && ! defined (USE_GTK)
int row, column;
! #endif
/* Ignore mouse events that were made on frame that
have been deleted. */
if (! FRAME_LIVE_P (f))
return Qnil;
+ #if ! defined (USE_X_TOOLKIT) && ! defined (USE_GTK)
/* EVENT->x and EVENT->y are frame-relative pixel
coordinates at this place. Under old redisplay, COLUMN
and ROW are set to frame relative glyph coordinates
***************
*** 5116,5122 ****
pixel_to_glyph_coords (f, XINT (event->x), XINT (event->y),
&column, &row, NULL, 1);
- #if ! defined (USE_X_TOOLKIT) && ! defined (USE_GTK)
/* In the non-toolkit version, clicks on the menu bar
are ordinary button events in the event buffer.
Distinguish them, and invoke the menu.
--- 5232,5237 ----
***************
*** 5170,5246 ****
}
#endif /* not USE_X_TOOLKIT && not USE_GTK */
! /* Set `window' to the window under frame pixel coordinates
! event->x/event->y. */
! window = window_from_coordinates (f, XINT (event->x),
! XINT (event->y),
! &part, &wx, &wy, 0);
!
! if (!WINDOWP (window))
! {
! window = event->frame_or_window;
! posn = Qnil;
! }
! else
! {
! /* It's a click in window window at frame coordinates
! event->x/ event->y. */
! struct window *w = XWINDOW (window);
!
! /* Set event coordinates to window-relative coordinates
! for constructing the Lisp event below. */
! XSETINT (event->x, wx);
! XSETINT (event->y, wy);
!
! if (part == ON_MODE_LINE || part == ON_HEADER_LINE)
! {
! /* Mode line or header line. Look for a string under
! the mouse that may have a `local-map' property. */
! Lisp_Object string;
! int charpos;
!
! posn = part == ON_MODE_LINE ? Qmode_line : Qheader_line;
! string = mode_line_string (w, wx, wy, part, &charpos);
! if (STRINGP (string))
! string_info = Fcons (string, make_number (charpos));
! }
! else if (part == ON_VERTICAL_BORDER)
! posn = Qvertical_line;
! else if (part == ON_LEFT_MARGIN || part == ON_RIGHT_MARGIN)
! {
! int charpos;
! Lisp_Object object = marginal_area_string (w, wx, wy, part,
! &charpos);
! posn = (part == ON_LEFT_MARGIN) ? Qleft_margin :
Qright_margin;
! if (STRINGP (object))
! string_info = Fcons (object, make_number (charpos));
! }
! else
! {
! Lisp_Object object;
! struct display_pos p;
! buffer_posn_from_coords (w, &wx, &wy, &object, &p);
! posn = make_number (CHARPOS (p.pos));
! if (STRINGP (object))
! string_info
! = Fcons (object,
! make_number (CHARPOS (p.string_pos)));
! }
! }
!
! position
! = Fcons (window,
! Fcons (posn,
! Fcons (Fcons (event->x, event->y),
! Fcons (make_number (event->timestamp),
! (NILP (string_info)
! ? Qnil
! : Fcons (string_info, Qnil))))));
}
#ifndef USE_TOOLKIT_SCROLL_BARS
else
{
/* It's a scrollbar click. */
Lisp_Object portion_whole;
Lisp_Object part;
--- 5285,5298 ----
}
#endif /* not USE_X_TOOLKIT && not USE_GTK */
! position = make_lispy_position (f, &event->x, &event->y,
! event->timestamp);
}
#ifndef USE_TOOLKIT_SCROLL_BARS
else
{
/* It's a scrollbar click. */
+ Lisp_Object window;
Lisp_Object portion_whole;
Lisp_Object part;
***************
*** 5405,5501 ****
case WHEEL_EVENT:
{
Lisp_Object position;
- Lisp_Object window;
Lisp_Object head;
/* Build the position as appropriate for this mouse click. */
- enum window_part part;
struct frame *f = XFRAME (event->frame_or_window);
- Lisp_Object posn;
- Lisp_Object string_info = Qnil;
- int row, column;
- int wx, wy;
- position = Qnil;
/* Ignore wheel events that were made on frame that have been
deleted. */
if (! FRAME_LIVE_P (f))
return Qnil;
! /* EVENT->x and EVENT->y are frame-relative pixel
! coordinates at this place. Under old redisplay, COLUMN
! and ROW are set to frame relative glyph coordinates
! which are then used to determine whether this click is
! in a menu (non-toolkit version). */
! pixel_to_glyph_coords (f, XINT (event->x), XINT (event->y),
! &column, &row, NULL, 1);
!
! /* Set `window' to the window under frame pixel coordinates
! event->x/event->y. */
! window = window_from_coordinates (f, XINT (event->x),
! XINT (event->y),
! &part, &wx, &wy, 0);
!
! if (!WINDOWP (window))
! {
! window = event->frame_or_window;
! posn = Qnil;
! }
! else
! {
! /* It's a click in window window at frame coordinates
! event->x/ event->y. */
! struct window *w = XWINDOW (window);
!
! /* Set event coordinates to window-relative coordinates
! for constructing the Lisp event below. */
! XSETINT (event->x, wx);
! XSETINT (event->y, wy);
!
! if (part == ON_MODE_LINE || part == ON_HEADER_LINE)
! {
! /* Mode line or header line. Look for a string under
! the mouse that may have a `local-map' property. */
! Lisp_Object string;
! int charpos;
!
! posn = part == ON_MODE_LINE ? Qmode_line : Qheader_line;
! string = mode_line_string (w, wx, wy, part, &charpos);
! if (STRINGP (string))
! string_info = Fcons (string, make_number (charpos));
! }
! else if (part == ON_VERTICAL_BORDER)
! posn = Qvertical_line;
! else if (part == ON_LEFT_MARGIN || part == ON_RIGHT_MARGIN)
! {
! int charpos;
! Lisp_Object object = marginal_area_string (w, wx, wy, part,
! &charpos);
! posn = (part == ON_LEFT_MARGIN) ? Qleft_margin : Qright_margin;
! if (STRINGP (object))
! string_info = Fcons (object, make_number (charpos));
! }
! else
! {
! Lisp_Object object;
! struct display_pos p;
! buffer_posn_from_coords (w, &wx, &wy, &object, &p);
! posn = make_number (CHARPOS (p.pos));
! if (STRINGP (object))
! string_info
! = Fcons (object,
! make_number (CHARPOS (p.string_pos)));
! }
! }
!
! position
! = Fcons (window,
! Fcons (posn,
! Fcons (Fcons (event->x, event->y),
! Fcons (make_number (event->timestamp),
! (NILP (string_info)
! ? Qnil
! : Fcons (string_info, Qnil))))));
/* Set double or triple modifiers to indicate the wheel speed. */
{
--- 5457,5474 ----
case WHEEL_EVENT:
{
Lisp_Object position;
Lisp_Object head;
/* Build the position as appropriate for this mouse click. */
struct frame *f = XFRAME (event->frame_or_window);
/* Ignore wheel events that were made on frame that have been
deleted. */
if (! FRAME_LIVE_P (f))
return Qnil;
! position = make_lispy_position (f, &event->x, &event->y,
! event->timestamp);
/* Set double or triple modifiers to indicate the wheel speed. */
{
***************
*** 5689,5700 ****
case DRAG_N_DROP_EVENT:
{
- enum window_part part;
FRAME_PTR f;
! Lisp_Object window;
! Lisp_Object posn;
Lisp_Object files;
- int wx, wy;
/* The frame_or_window field should be a cons of the frame in
which the event occurred and a list of the filenames
--- 5662,5670 ----
case DRAG_N_DROP_EVENT:
{
FRAME_PTR f;
! Lisp_Object head, position;
Lisp_Object files;
/* The frame_or_window field should be a cons of the frame in
which the event occurred and a list of the filenames
***************
*** 5710,5769 ****
if (! FRAME_LIVE_P (f))
return Qnil;
! window = window_from_coordinates (f, XINT (event->x),
! XINT (event->y),
! &part, &wx, &wy, 0);
!
! if (!WINDOWP (window))
! {
! window = XCAR (event->frame_or_window);
! posn = Qnil;
! }
! else
! {
! /* It's an event in window `window' at frame coordinates
! event->x/ event->y. */
! struct window *w = XWINDOW (window);
!
! /* Set event coordinates to window-relative coordinates
! for constructing the Lisp event below. */
! XSETINT (event->x, wx);
! XSETINT (event->y, wy);
!
! if (part == ON_MODE_LINE)
! posn = Qmode_line;
! else if (part == ON_VERTICAL_BORDER)
! posn = Qvertical_line;
! else if (part == ON_HEADER_LINE)
! posn = Qheader_line;
! else
! {
! Lisp_Object object;
! struct display_pos p;
! buffer_posn_from_coords (w, &wx, &wy, &object, &p);
! posn = make_number (CHARPOS (p.pos));
! }
! }
!
! {
! Lisp_Object head, position;
!
! position
! = Fcons (window,
! Fcons (posn,
! Fcons (Fcons (event->x, event->y),
! Fcons (make_number (event->timestamp),
! Qnil))));
! head = modify_event_symbol (0, event->modifiers,
! Qdrag_n_drop, Qnil,
! lispy_drag_n_drop_names,
! &drag_n_drop_syms, 1);
! return Fcons (head,
! Fcons (position,
! Fcons (files,
! Qnil)));
! }
}
#endif /* HAVE_MOUSE */
--- 5680,5696 ----
if (! FRAME_LIVE_P (f))
return Qnil;
! position = make_lispy_position (f, &event->x, &event->y,
! event->timestamp);
! head = modify_event_symbol (0, event->modifiers,
! Qdrag_n_drop, Qnil,
! lispy_drag_n_drop_names,
! &drag_n_drop_syms, 1);
! return Fcons (head,
! Fcons (position,
! Fcons (files,
! Qnil)));
}
#endif /* HAVE_MOUSE */
***************
*** 5836,5894 ****
/* Or is it an ordinary mouse movement? */
else
{
! enum window_part area;
! Lisp_Object window;
! Lisp_Object posn;
! int wx, wy;
! if (frame)
! /* It's in a frame; which window on that frame? */
! window = window_from_coordinates (frame, XINT (x), XINT (y),
! &area, &wx, &wy, 0);
! else
! window = Qnil;
!
! if (WINDOWP (window))
! {
! struct window *w = XWINDOW (window);
!
! /* Set window relative coordinates. */
! XSETINT (x, wx);
! XSETINT (y, wy);
!
! if (area == ON_MODE_LINE)
! posn = Qmode_line;
! else if (area == ON_VERTICAL_BORDER)
! posn = Qvertical_line;
! else if (area == ON_HEADER_LINE)
! posn = Qheader_line;
! else
! {
! Lisp_Object object;
! struct display_pos p;
! buffer_posn_from_coords (w, &wx, &wy, &object, &p);
! posn = make_number (CHARPOS (p.pos));
! }
! }
! else if (frame != 0)
! {
! XSETFRAME (window, frame);
! posn = Qnil;
! }
! else
! {
! window = Qnil;
! posn = Qnil;
! XSETFASTINT (x, 0);
! XSETFASTINT (y, 0);
! }
return Fcons (Qmouse_movement,
! Fcons (Fcons (window,
! Fcons (posn,
! Fcons (Fcons (x, y),
! Fcons (make_number (time),
! Qnil)))),
Qnil));
}
}
--- 5763,5774 ----
/* Or is it an ordinary mouse movement? */
else
{
! Lisp_Object position;
! position = make_lispy_position (frame, &x, &y, time);
return Fcons (Qmouse_movement,
! Fcons (position,
Qnil));
}
}