Commit 3c370943 authored by Jim Blandy's avatar Jim Blandy

* keyboard.c (kbd_buffer_get_event): Protect assignment to

	Vlast_event_frame in a "#ifdef MULTI_FRAME" clause.

	Use the term `scroll bar', instead of `scrollbar'.
	* alloc.c, frame.c, frame.h, indent.c, keyboard.c, keyboard.h,
	lisp.h, term.c, termhooks.h, window.c, window.h, xdisp.c, xfns.c,
	xterm.c, xterm.h: Terminology changed.

        Don't generate switch-frame events by checking Vlast_event_frame;
	use a separate variable for that bookkeeping.  In order to
	generate them properly, we may need to fiddle with it.
	* keyboard.c (internal_last_event_frame): New variable.
	(command_loop_1): Check internal_last_event_frame, not
	Vlast_event_frame.
	(read_char, kbd_buffer_store_event): Set both Vlast_event_frame and
	internal_last_event_frame.
	(kbd_buffer_get_event): Check internal_last_event_frame to decide
	whether to generate a switch-frame event.  Set Vlast_event_frame
	after each event.
	(init_keyboard): Initialize both Vlast_event_frame and
	internal_last_event_frame.
	* keyboard.h (internal_last_event_frame): Add extern declaration
	for this.
	* frame.c (Vlast_event_frame): Remove external declaration for
	this.
	(Fselect_frame): Set internal_last_event_frame to Qnil to force a
	switch-frame event, not Vlast_event_frame; the latter is supposed
	to convey information to the user.

	* keyboard.c (syms_of_keyboard): Doc fix for unread_command_events.
parent 0a3e4d65
......@@ -205,7 +205,15 @@ Lisp_Object this_command;
#ifdef MULTI_FRAME
/* The frame in which the last input event occurred, or Qmacro if the
last event came from a macro. */
last event came from a macro. We use this to determine when to
generate switch-frame events. This may be cleared by functions
like Fselect_frame, to make sure that a switch-frame event is
generated by the next character. */
Lisp_Object internal_last_event_frame;
/* A user-visible version of the above, intended to allow users to
figure out where the last event came from, if the event doesn't
carry that information itself (i.e. if it was a character). */
Lisp_Object Vlast_event_frame;
#endif
......@@ -248,8 +256,8 @@ static struct input_event kbd_buffer[KBD_BUFFER_SIZE];
The interrupt-level event handlers will never enqueue an event on a
frame which is not in Vframe_list, and once an event is dequeued,
Vlast_event_frame or the event itself points to the frame. So
that's all fine.
internal_last_event_frame or the event itself points to the frame.
So that's all fine.
But while the event is sitting in the queue, it's completely
unprotected. Suppose the user types one command which will run for
......@@ -260,7 +268,7 @@ static struct input_event kbd_buffer[KBD_BUFFER_SIZE];
have an event referring to a freed frame, which will crash Emacs
when it is dequeued.
Similar things happen when an event on a scrollbar is enqueued; the
Similar things happen when an event on a scroll bar is enqueued; the
window may be deleted while the event is in the queue.
So, we use this vector to protect the frame_or_window field in the
......@@ -318,7 +326,7 @@ int mouse_moved;
/* Symbols to head events. */
Lisp_Object Qmouse_movement;
Lisp_Object Qscrollbar_movement;
Lisp_Object Qscroll_bar_movement;
Lisp_Object Qswitch_frame;
......@@ -347,7 +355,7 @@ Lisp_Object Qmodifier_cache;
/* Symbols to use for non-text mouse positions. */
Lisp_Object Qmode_line;
Lisp_Object Qvertical_line;
Lisp_Object Qvertical_scrollbar;
Lisp_Object Qvertical_scroll_bar;
Lisp_Object recursive_edit_unwind (), command_loop ();
Lisp_Object Fthis_command_keys ();
......@@ -884,9 +892,9 @@ command_loop_1 ()
switch-frame events will take care of this, but if some lisp
code swallows a switch-frame event, we'll fix things up here.
Is this a good idea? */
if (XTYPE (Vlast_event_frame) == Lisp_Frame
&& XFRAME (Vlast_event_frame) != selected_frame)
Fselect_frame (Vlast_event_frame, Qnil);
if (XTYPE (internal_last_event_frame) == Lisp_Frame
&& XFRAME (internal_last_event_frame) != selected_frame)
Fselect_frame (internal_last_event_frame, Qnil);
#endif
#endif
......@@ -1166,11 +1174,12 @@ read_char (commandflag, nmaps, maps, prev_event, used_mouse_menu)
remain unchanged.
Since this event came from a macro, it would be misleading to
leave Vlast_event_frame set to whereever the last real event
came from. Normally, command_loop_1 selects
Vlast_event_frame after each command is read, but events read
from a macro should never cause a new frame to be selected. */
Vlast_event_frame = Qmacro;
leave internal_last_event_frame set to whereever the last
real event came from. Normally, a switch-frame event selects
internal_last_event_frame after each command is read, but
events read from a macro should never cause a new frame to be
selected. */
Vlast_event_frame = internal_last_event_frame = Qmacro;
#endif
if (executing_macro_index >= XFASTINT (Flength (Vexecuting_macro)))
......@@ -1207,7 +1216,8 @@ read_char (commandflag, nmaps, maps, prev_event, used_mouse_menu)
{
XSET (c, Lisp_Int, quit_char);
#ifdef MULTI_FRAME
XSET (Vlast_event_frame, Lisp_Frame, selected_frame);
XSET (internal_last_event_frame, Lisp_Frame, selected_frame);
Vlast_event_frame = internal_last_event_frame;
#endif
goto non_reread;
......@@ -1534,7 +1544,7 @@ kbd_buffer_store_event (event)
#ifdef MULTI_FRAME
/* If this results in a quit_char being returned to Emacs as
input, set last-event-frame properly. If this doesn't
input, set Vlast_event_frame properly. If this doesn't
get returned to Emacs as an event, the next event read
will set Vlast_event_frame again, so this is safe to do. */
{
......@@ -1542,9 +1552,10 @@ kbd_buffer_store_event (event)
FRAME_FOCUS_FRAME (XFRAME (event->frame_or_window));
if (NILP (focus))
Vlast_event_frame = event->frame_or_window;
internal_last_event_frame = event->frame_or_window;
else
Vlast_event_frame = focus;
internal_last_event_frame = focus;
Vlast_event_frame = internal_last_event_frame;
}
#endif
......@@ -1670,9 +1681,9 @@ kbd_buffer_get_event ()
if (! NILP (focus))
frame = focus;
if (! EQ (frame, Vlast_event_frame))
if (! EQ (frame, internal_last_event_frame))
{
Vlast_event_frame = frame;
internal_last_event_frame = frame;
obj = make_lispy_switch_frame (frame);
}
}
......@@ -1698,7 +1709,7 @@ kbd_buffer_get_event ()
{
FRAME_PTR f;
Lisp_Object bar_window;
enum scrollbar_part part;
enum scroll_bar_part part;
Lisp_Object x, y;
unsigned long time;
......@@ -1717,10 +1728,10 @@ kbd_buffer_get_event ()
if (NILP (frame))
XSET (frame, Lisp_Frame, f);
if (! EQ (frame, Vlast_event_frame))
if (! EQ (frame, internal_last_event_frame))
{
XSET (Vlast_event_frame, Lisp_Frame, frame);
obj = make_lispy_switch_frame (Vlast_event_frame);
XSET (internal_last_event_frame, Lisp_Frame, frame);
obj = make_lispy_switch_frame (internal_last_event_frame);
}
}
#endif
......@@ -1737,6 +1748,10 @@ kbd_buffer_get_event ()
input_pending = readable_events ();
#ifdef MULTI_FRAME
Vlast_event_frame = internal_last_event_frame;
#endif
return (obj);
}
......@@ -1826,17 +1841,17 @@ static char *lispy_mouse_names[] =
"mouse-1", "mouse-2", "mouse-3", "mouse-4", "mouse-5"
};
/* Scrollbar parts. */
/* Scroll bar parts. */
Lisp_Object Qabove_handle, Qhandle, Qbelow_handle;
/* An array of scrollbar parts, indexed by an enum scrollbar_part value. */
Lisp_Object *scrollbar_parts[] = {
/* An array of scroll bar parts, indexed by an enum scroll_bar_part value. */
Lisp_Object *scroll_bar_parts[] = {
&Qabove_handle, &Qhandle, &Qbelow_handle
};
/* A vector, indexed by button number, giving the down-going location
of currently depressed buttons, both scrollbar and non-scrollbar.
of currently depressed buttons, both scroll bar and non-scroll bar.
The elements have the form
(BUTTON-NUMBER MODIFIER-MASK . REST)
......@@ -1884,7 +1899,7 @@ make_lispy_event (event)
/* A mouse click. Figure out where it is, decide whether it's
a press, click or drag, and build the appropriate structure. */
case mouse_click:
case scrollbar_click:
case scroll_bar_click:
{
int button = XFASTINT (event->code);
Lisp_Object position;
......@@ -1935,11 +1950,11 @@ make_lispy_event (event)
{
Lisp_Object window = event->frame_or_window;
Lisp_Object portion_whole = Fcons (event->x, event->y);
Lisp_Object part = *scrollbar_parts[(int) event->part];
Lisp_Object part = *scroll_bar_parts[(int) event->part];
position =
Fcons (window,
Fcons (Qvertical_scrollbar,
Fcons (Qvertical_scroll_bar,
Fcons (portion_whole,
Fcons (make_number (event->timestamp),
Fcons (part,
......@@ -2021,18 +2036,18 @@ static Lisp_Object
make_lispy_movement (frame, bar_window, part, x, y, time)
FRAME_PTR frame;
Lisp_Object bar_window;
enum scrollbar_part part;
enum scroll_bar_part part;
Lisp_Object x, y;
unsigned long time;
{
/* Is it a scrollbar movement? */
/* Is it a scroll bar movement? */
if (frame && ! NILP (bar_window))
{
Lisp_Object part_sym = *scrollbar_parts[(int) part];
Lisp_Object part_sym = *scroll_bar_parts[(int) part];
return Fcons (Qscrollbar_movement,
return Fcons (Qscroll_bar_movement,
(Fcons (Fcons (bar_window,
Fcons (Qvertical_scrollbar,
Fcons (Qvertical_scroll_bar,
Fcons (Fcons (x, y),
Fcons (make_number (time),
Fcons (part_sym,
......@@ -3483,8 +3498,8 @@ drag's starting position. This means that you don't have to distinguish\n\
between click and drag events unless you want to.\n\
\n\
`read-key-sequence' prefixes mouse events on mode lines, the vertical\n\
lines separating windows, and scrollbars with imaginary keys\n\
`mode-line', `vertical-line', and `vertical-scrollbar'.\n\
lines separating windows, and scroll bars with imaginary keys\n\
`mode-line', `vertical-line', and `vertical-scroll-bar'.\n\
\n\
If the user switches frames in the middle of a key sequence, the\n\
frame-switch event is put off until after the current key sequence.\n\
......@@ -4071,7 +4086,8 @@ init_keyboard ()
#ifdef MULTI_FRAME
/* This means that command_loop_1 won't try to select anything the first
time through. */
Vlast_event_frame = Qnil;
internal_last_event_frame = Qnil;
Vlast_event_frame = internal_last_event_frame;
#endif
/* If we're running a dumped Emacs, we need to clear out
......@@ -4133,7 +4149,7 @@ struct event_head {
struct event_head head_table[] = {
&Qmouse_movement, "mouse-movement", &Qmouse_movement,
&Qscrollbar_movement, "scrollbar-movement", &Qmouse_movement,
&Qscroll_bar_movement, "scroll-bar-movement", &Qmouse_movement,
&Qswitch_frame, "switch-frame", &Qswitch_frame,
};
......@@ -4160,8 +4176,8 @@ syms_of_keyboard ()
staticpro (&Qmode_line);
Qvertical_line = intern ("vertical-line");
staticpro (&Qvertical_line);
Qvertical_scrollbar = intern ("vertical-scrollbar");
staticpro (&Qvertical_scrollbar);
Qvertical_scroll_bar = intern ("vertical-scroll-bar");
staticpro (&Qvertical_scroll_bar);
Qabove_handle = intern ("above-handle");
staticpro (&Qabove_handle);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment