command is stored in this-original-command. It is nil otherwise. */
Lisp_Object Vthis_original_command;
-/* The value of point when the last command was executed. */
+/* The value of point when the last command was started. */
int last_point_position;
/* The buffer that was current when the last command was started. */
Lisp_Object last_point_position_buffer;
+/* The window that was selected when the last command was started. */
+Lisp_Object last_point_position_window;
+
/* The frame in which the last input event occurred, or Qmacro if the
last event came from a macro. We use this to determine when to
generate switch-frame events. This may be cleared by functions
#endif
Lisp_Object Qdrag_n_drop;
Lisp_Object Qsave_session;
+#ifdef MAC_OS
+Lisp_Object Qmac_apple_event;
+#endif
/* Lisp_Object Qmouse_movement; - also an event header */
push_frame_kboard (f)
FRAME_PTR f;
{
- push_kboard (f->device->kboard);
+ push_kboard (f->terminal->kboard);
}
void
pop_kboard ()
{
#ifdef MULTI_KBOARD
- struct device *d;
+ struct terminal *t;
struct kboard_stack *p = kboard_stack;
- int ok = 0;
current_kboard = NULL;
- for (d = device_list; d; d = d->next_device)
+ for (t = terminal_list; t; t = t->next_terminal)
{
- if (d->kboard == p->kboard)
+ if (t->kboard == p->kboard)
{
current_kboard = p->kboard;
break;
}
if (current_kboard == NULL)
{
- /* The display we remembered has been deleted. */
+ /* The terminal we remembered has been deleted. */
current_kboard = FRAME_KBOARD (SELECTED_FRAME ());
}
kboard_stack = p->next;
prev_buffer = current_buffer;
prev_modiff = MODIFF;
last_point_position = PT;
+ last_point_position_window = selected_window;
XSETBUFFER (last_point_position_buffer, prev_buffer);
/* By default, we adjust point to a boundary of a region that
if (_setjmp (local_getcjmp))
{
+ /* Handle quits while reading the keyboard. */
/* We must have saved the outer value of getcjmp here,
so restore it now. */
restore_getcjmp (save_jump);
if (c == quit_char)
{
#ifdef MULTI_KBOARD
- KBOARD *kb;
+ KBOARD *kb = FRAME_KBOARD (XFRAME (event->frame_or_window));
struct input_event *sp;
- if (single_kboard
- && (kb = FRAME_KBOARD (XFRAME (event->frame_or_window)),
- kb != current_kboard))
+ if (single_kboard && kb != current_kboard)
{
kb->kbd_queue
= Fcons (make_lispy_switch_frame (event->frame_or_window),
unsigned long time;
*kbp = current_kboard;
- /* Note that this uses F to determine which display to look at.
+ /* Note that this uses F to determine which terminal to look at.
If there is no valid info, it does not store anything
so x remains nil. */
x = Qnil;
/* XXX Can f or mouse_position_hook be NULL here? */
- if (f && FRAME_DEVICE (f)->mouse_position_hook)
- (*FRAME_DEVICE (f)->mouse_position_hook) (&f, 0, &bar_window,
- &part, &x, &y, &time);
+ if (f && FRAME_TERMINAL (f)->mouse_position_hook)
+ (*FRAME_TERMINAL (f)->mouse_position_hook) (&f, 0, &bar_window,
+ &part, &x, &y, &time);
obj = Qnil;
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
- dropped. */
- if (! CONSP (event->frame_or_window))
- abort ();
-
- f = XFRAME (XCAR (event->frame_or_window));
- files = XCDR (event->frame_or_window);
+ f = XFRAME (event->frame_or_window);
+ files = event->arg;
/* Ignore mouse events that were made on frames that
have been deleted. */
case SAVE_SESSION_EVENT:
return Qsave_session;
+#ifdef MAC_OS
+ case MAC_APPLE_EVENT:
+ {
+ Lisp_Object spec[2];
+
+ spec[0] = event->x;
+ spec[1] = event->y;
+ return Fcons (Qmac_apple_event,
+ Fcons (Fvector (2, spec),
+ Fcons (mac_make_lispy_event_code (event->code),
+ Qnil)));
+ }
+#endif
+
/* The 'kind' field of the event is something we don't recognize. */
default:
abort ();
{
int nread = 0;
int err = 0;
- struct device *d;
+ struct terminal *t;
- /* Loop through the available devices, and call their input hooks. */
- d = device_list;
- while (d)
+ /* Loop through the available terminals, and call their input hooks. */
+ t = terminal_list;
+ while (t)
{
- struct device *next = d->next_device;
+ struct terminal *next = t->next_terminal;
- if (d->read_socket_hook)
+ if (t->read_socket_hook)
{
int nr;
struct input_event hold_quit;
hold_quit.kind = NO_EVENT;
/* No need for FIONREAD or fcntl; just say don't wait. */
- while (nr = (*d->read_socket_hook) (d, expected, &hold_quit), nr > 0)
+ while (nr = (*t->read_socket_hook) (t, expected, &hold_quit), nr > 0)
{
nread += nr;
expected = 0;
}
else if (nr == -2) /* Non-transient error. */
{
- /* The display device terminated; it should be closed. */
+ /* The terminal device terminated; it should be closed. */
- /* Kill Emacs if this was our last display. */
- if (! device_list->next_device)
+ /* Kill Emacs if this was our last terminal. */
+ if (!terminal_list->next_terminal)
/* Formerly simply reported no input, but that
sometimes led to a failure of Emacs to terminate.
SIGHUP seems appropriate if we can't reach the
alone in its group. */
kill (getpid (), SIGHUP);
- /* XXX Is calling delete_device safe here? It calls Fdelete_frame. */
- if (d->delete_device_hook)
- (*d->delete_device_hook) (d);
+ /* XXX Is calling delete_terminal safe here? It calls Fdelete_frame. */
+ if (t->delete_terminal_hook)
+ (*t->delete_terminal_hook) (t);
else
- delete_device (d);
+ delete_terminal (t);
}
if (hold_quit.kind != NO_EVENT)
kbd_buffer_store_event (&hold_quit);
}
- d = next;
+ t = next;
}
if (err && !nread)
/* This is the tty way of reading available input.
- Note that each terminal device has its own `struct device' object,
+ Note that each terminal device has its own `struct terminal' object,
and so this function is called once for each individual termcap
- display. The first parameter indicates which device to read from. */
+ terminal. The first parameter indicates which terminal to read from. */
int
-tty_read_avail_input (struct device *device,
+tty_read_avail_input (struct terminal *terminal,
int expected,
struct input_event *hold_quit)
{
of characters on some systems when input is stuffed at us. */
unsigned char cbuf[KBD_BUFFER_SIZE - 1];
int n_to_read, i;
- struct tty_display_info *tty = device->display_info.tty;
+ struct tty_display_info *tty = terminal->display_info.tty;
int nread = 0;
- if (device->type != output_termcap)
+ if (terminal->type != output_termcap)
abort ();
/* XXX I think the following code should be moved to separate hook
if (ioctl (fileno (tty->input), FIONREAD, &n_to_read) < 0)
{
if (! noninteractive)
- return -2; /* Close this device. */
+ return -2; /* Close this terminal. */
else
n_to_read = 0;
}
when the control tty is taken away.
Jeffrey Honig <jch@bsdi.com> says this is generally safe. */
if (nread == -1 && errno == EIO)
- return -2; /* Close this device. */
+ return -2; /* Close this terminal. */
#if defined (AIX) && (! defined (aix386) && defined (_BSD))
/* The kernel sometimes fails to deliver SIGHUP for ptys.
This looks incorrect, but it isn't, because _BSD causes
O_NDELAY to be defined in fcntl.h as O_NONBLOCK,
and that causes a value other than 0 when there is no input. */
if (nread == 0)
- return -2; /* Close this device. */
+ return -2; /* Close this terminal. */
#endif
}
while (
last_nonmenu_event = Qnil;
delayed_switch_frame = Qnil;
- fkey.map = fkey.parent = current_kboard->Vlocal_function_key_map;
- keytran.map = keytran.parent = current_kboard->Vlocal_key_translation_map;
- /* If there is no translation-map, turn off scanning. */
- fkey.start = fkey.end = KEYMAPP (fkey.map) ? 0 : bufsize + 1;
- keytran.start = keytran.end = KEYMAPP (keytran.map) ? 0 : bufsize + 1;
-
+
if (INTERACTIVE)
{
if (!NILP (prompt))
keybuf[0..mock_input] holds the sequence we should reread. */
replay_sequence:
+ /* We may switch keyboards between rescans, so we need to
+ reinitialize fkey and keytran before each replay. */
+ fkey.map = fkey.parent = current_kboard->Vlocal_function_key_map;
+ keytran.map = keytran.parent = current_kboard->Vlocal_key_translation_map;
+ /* If there is no translation map, turn off scanning. */
+ fkey.start = fkey.end = KEYMAPP (fkey.map) ? 0 : bufsize + 1;
+ keytran.start = keytran.end = KEYMAPP (keytran.map) ? 0 : bufsize + 1;
+
starting_buffer = current_buffer;
first_unbound = bufsize + 1;
{
/* Must preserve main program's value of errno. */
int old_errno = errno;
- struct device *device;
+ struct terminal *terminal;
#if defined (USG) && !defined (POSIX_SIGNALS)
/* USG systems forget handlers when they are used;
SIGNAL_THREAD_CHECK (signalnum);
- /* See if we have an active display on our controlling terminal. */
- device = get_named_tty (NULL);
- if (!device)
+ /* See if we have an active terminal on our controlling tty. */
+ terminal = get_named_tty (NULL);
+ if (!terminal)
{
/* If there are no frames there, let's pretend that we are a
well-behaving UN*X program and quit. */
controlling tty, if we have a frame there. We disable the
interrupt key on secondary ttys, so the SIGINT must have come
from the controlling tty. */
- internal_last_event_frame = device->display_info.tty->top_frame;
+ internal_last_event_frame = terminal->display_info.tty->top_frame;
handle_interrupt ();
}
_longjmp (getcjmp, 1);
}
\f
-DEFUN ("set-input-mode", Fset_input_mode, Sset_input_mode, 3, 4, 0,
- doc: /* Set mode of reading keyboard input.
-First arg INTERRUPT non-nil means use input interrupts;
- nil means use CBREAK mode.
-Second arg FLOW non-nil means use ^S/^Q flow control for output to terminal
- (no effect except in CBREAK mode).
-Third arg META t means accept 8-bit input (for a Meta key).
- META nil means ignore the top bit, on the assumption it is parity.
- Otherwise, accept 8-bit input and don't use the top bit for Meta.
-Optional fourth arg QUIT if non-nil specifies character to use for quitting.
+DEFUN ("set-input-interrupt-mode", Fset_input_interrupt_mode, Sset_input_interrupt_mode, 1, 1, 0,
+ doc: /* Set interrupt mode of reading keyboard input.
+If INTERRUPT is non-nil, Emacs will use input interrupts;
+otherwise Emacs uses CBREAK mode.
+
See also `current-input-mode'. */)
- (interrupt, flow, meta, quit)
- Lisp_Object interrupt, flow, meta, quit;
+ (interrupt)
+ Lisp_Object interrupt;
{
- /* XXX This function needs to be revised for multi-device support.
- Currently it compiles fine, but its semantics are wrong. It sets
- global parameters (e.g. interrupt_input) based on only the
- current frame's device. */
-
- if (!NILP (quit)
- && (!INTEGERP (quit) || XINT (quit) < 0 || XINT (quit) > 0400))
- error ("set-input-mode: QUIT must be an ASCII character");
-
-#ifdef POLL_FOR_INPUT
- stop_polling ();
-#endif
-
-#ifndef DOS_NT
- if (FRAME_TERMCAP_P (XFRAME (selected_frame)))
- /* this causes startup screen to be restored and messes with the mouse */
- reset_sys_modes (CURTTY ());
-#endif
-
+ int new_interrupt_input;
#ifdef SIGIO
/* Note SIGIO has been undef'd if FIONREAD is missing. */
- if (FRAME_DEVICE (SELECTED_FRAME ())->read_socket_hook)
+ if (0
+#ifdef HAVE_X_WINDOWS
+ || x_display_list != NULL
+#endif
+ )
{
/* When using X, don't give the user a real choice,
because we haven't implemented the mechanisms to support it. */
#ifdef NO_SOCK_SIGIO
- interrupt_input = 0;
+ new_interrupt_input = 0;
#else /* not NO_SOCK_SIGIO */
- interrupt_input = 1;
+ new_interrupt_input = 1;
#endif /* NO_SOCK_SIGIO */
}
else
- interrupt_input = !NILP (interrupt);
+ new_interrupt_input = !NILP (interrupt);
#else /* not SIGIO */
- interrupt_input = 0;
+ new_interrupt_input = 0;
#endif /* not SIGIO */
/* Our VMS input only works by interrupts, as of now. */
#ifdef VMS
- interrupt_input = 1;
+ new_interrupt_input = 1;
#endif
- if (FRAME_TERMCAP_P (XFRAME (selected_frame)))
+ if (new_interrupt_input != interrupt_input)
{
- struct tty_display_info *tty = CURTTY ();
+#ifdef POLL_FOR_INPUT
+ stop_polling ();
+#endif
+#ifndef DOS_NT
+ /* this causes startup screen to be restored and messes with the mouse */
+ reset_all_sys_modes ();
+#endif
+ interrupt_input = new_interrupt_input;
+#ifndef DOS_NT
+ init_all_sys_modes ();
+#endif
+
+#ifdef POLL_FOR_INPUT
+ poll_suppress_count = 1;
+ start_polling ();
+#endif
+ }
+ return Qnil;
+}
+
+DEFUN ("set-output-flow-control", Fset_output_flow_control, Sset_output_flow_control, 1, 2, 0,
+ doc: /* Enable or disable ^S/^Q flow control for output to TERMINAL.
+If FLOW is non-nil, flow control is enabled and you cannot use C-s or
+C-q in key sequences.
+
+This setting only has an effect on tty terminals and only when
+Emacs reads input in CBREAK mode; see `set-input-interrupt-mode'.
+
+See also `current-input-mode'. */)
+ (flow, terminal)
+ Lisp_Object flow, terminal;
+{
+ struct terminal *t = get_terminal (terminal, 1);
+ struct tty_display_info *tty;
+ if (t == NULL || t->type != output_termcap)
+ return Qnil;
+ tty = t->display_info.tty;
+
+ if (tty->flow_control != !NILP (flow))
+ {
+#ifndef DOS_NT
+ /* this causes startup screen to be restored and messes with the mouse */
+ reset_sys_modes (tty);
+#endif
+
tty->flow_control = !NILP (flow);
- if (NILP (meta))
- tty->meta_key = 0;
- else if (EQ (meta, Qt))
- tty->meta_key = 1;
- else
- tty->meta_key = 2;
+
+#ifndef DOS_NT
+ init_sys_modes (tty);
+#endif
}
+ return Qnil;
+}
+
+DEFUN ("set-input-meta-mode", Fset_input_meta_mode, Sset_input_meta_mode, 1, 2, 0,
+ doc: /* Enable or disable 8-bit input on TERMINAL.
+If META is t, Emacs will accept 8-bit input, and interpret the 8th
+bit as the Meta modifier.
+
+If META is nil, Emacs will ignore the top bit, on the assumption it is
+parity.
+
+Otherwise, Emacs will accept and pass through 8-bit input without
+specially interpreting the top bit.
+
+This setting only has an effect on tty terminal devices.
- if (!NILP (quit))
- /* Don't let this value be out of range. */
- quit_char = XINT (quit) & (NILP (meta) ? 0177 : 0377);
+Optional parameter TERMINAL specifies the tty terminal device to use.
+It may be a terminal id, a frame, or nil for the terminal used by the
+currently selected frame.
+See also `current-input-mode'. */)
+ (meta, terminal)
+ Lisp_Object meta, terminal;
+{
+ struct terminal *t = get_terminal (terminal, 1);
+ struct tty_display_info *tty;
+ int new_meta;
+
+ if (t == NULL || t->type != output_termcap)
+ return Qnil;
+ tty = t->display_info.tty;
+
+ if (NILP (meta))
+ new_meta = 0;
+ else if (EQ (meta, Qt))
+ new_meta = 1;
+ else
+ new_meta = 2;
+
+ if (tty->meta_key != new_meta)
+ {
#ifndef DOS_NT
- if (FRAME_TERMCAP_P (XFRAME (selected_frame)))
- init_sys_modes (CURTTY ());
+ /* this causes startup screen to be restored and messes with the mouse */
+ reset_sys_modes (tty);
#endif
-#ifdef POLL_FOR_INPUT
- poll_suppress_count = 1;
- start_polling ();
+ tty->meta_key = new_meta;
+
+#ifndef DOS_NT
+ init_sys_modes (tty);
+#endif
+ }
+ return Qnil;
+}
+
+DEFUN ("set-quit-char", Fset_quit_char, Sset_quit_char, 1, 1, 0,
+ doc: /* Specify character used for quitting.
+QUIT must be an ASCII character.
+
+This function only has an effect on the terminal on the controlling
+tty of the Emacs process.
+
+See also `current-input-mode'. */)
+ (quit)
+ Lisp_Object quit;
+{
+ struct terminal *t = get_named_tty (NULL);
+ struct tty_display_info *tty;
+ if (t == NULL || t->type != output_termcap)
+ return Qnil;
+ tty = t->display_info.tty;
+
+#ifndef DOS_NT
+ /* this causes startup screen to be restored and messes with the mouse */
+ reset_sys_modes (tty);
+#endif
+
+ if (NILP (quit) || !INTEGERP (quit) || XINT (quit) < 0 || XINT (quit) > 0400)
+ error ("QUIT must be an ASCII character");
+
+ /* Don't let this value be out of range. */
+ quit_char = XINT (quit) & (tty->meta_key == 0 ? 0177 : 0377);
+
+#ifndef DOS_NT
+ init_sys_modes (tty);
#endif
+
+ return Qnil;
+}
+
+DEFUN ("set-input-mode", Fset_input_mode, Sset_input_mode, 3, 4, 0,
+ doc: /* Set mode of reading keyboard input.
+First arg INTERRUPT non-nil means use input interrupts;
+ nil means use CBREAK mode.
+Second arg FLOW non-nil means use ^S/^Q flow control for output to terminal
+ (no effect except in CBREAK mode).
+Third arg META t means accept 8-bit input (for a Meta key).
+ META nil means ignore the top bit, on the assumption it is parity.
+ Otherwise, accept 8-bit input and don't use the top bit for Meta.
+Optional fourth arg QUIT if non-nil specifies character to use for quitting.
+See also `current-input-mode'. */)
+ (interrupt, flow, meta, quit)
+ Lisp_Object interrupt, flow, meta, quit;
+{
+ Fset_input_interrupt_mode (interrupt);
+ Fset_output_flow_control (flow, Qnil);
+ Fset_input_meta_mode (meta, Qnil);
+ Fset_quit_char (quit);
return Qnil;
}
&& FRAMEP (selected_frame)
&& FRAME_LIVE_P (XFRAME (selected_frame)))
{
- current_kboard = XFRAME (selected_frame)->device->kboard;
+ current_kboard = XFRAME (selected_frame)->terminal->kboard;
if (current_kboard == kb)
abort ();
}
Qsave_session = intern ("save-session");
staticpro (&Qsave_session);
+#ifdef MAC_OS
+ Qmac_apple_event = intern ("mac-apple-event");
+ staticpro (&Qmac_apple_event);
+#endif
+
Qusr1_signal = intern ("usr1-signal");
staticpro (&Qusr1_signal);
Qusr2_signal = intern ("usr2-signal");
Fset (Qinput_method_use_echo_area, Qnil);
last_point_position_buffer = Qnil;
+ last_point_position_window = Qnil;
{
struct event_head *p;
defsubr (&Stop_level);
defsubr (&Sdiscard_input);
defsubr (&Sopen_dribble_file);
+ defsubr (&Sset_input_interrupt_mode);
+ defsubr (&Sset_output_flow_control);
+ defsubr (&Sset_input_meta_mode);
+ defsubr (&Sset_quit_char);
defsubr (&Sset_input_mode);
defsubr (&Scurrent_input_mode);
defsubr (&Sexecute_extended_command);
The value `kill-region' is special; it means that the previous command
was a kill command.
-`last-command' has a separate binding for each display device.
+`last-command' has a separate binding for each terminal device.
See Info node `(elisp)Multiple displays'. */);
DEFVAR_KBOARD ("real-last-command", Vreal_last_command,
This is applied to the characters supplied to input methods, not their
output. See also `translation-table-for-input'.
-`local-keyboard-translate-table' has a separate binding for each
-terminal. See Info node `(elisp)Multiple displays'. */);
+This variable has a separate binding for each terminal. See Info node
+`(elisp)Multiple displays'. */);
DEFVAR_BOOL ("cannot-suspend", &cannot_suspend,
doc: /* Non-nil means to always spawn a subshell instead of suspending.
This variable is intended to let commands such as `universal-argument'
set up a different keymap for reading the next command.
-`overriding-terminal-local-map' has a separate binding for each display device.
+`overriding-terminal-local-map' has a separate binding for each
+terminal device.
See Info node `(elisp)Multiple displays'. */);
DEFVAR_LISP ("overriding-local-map", &Voverriding_local_map,
numeric keysym code (sans the \"system-specific\" bit 1<<28)
and SYMBOL is its name.
-`system-key-alist' has a separate binding for each display device.
-See Info node `(elisp)Multiple displays'.
-
-Note that the currently selected frame has very little to do with
-which binding of this variable is active at any given moment. If you
-need set or get the binding on a specific display, use
-`terminal-local-value' and `set-terminal-local-value'. */);
+`system-key-alist' has a separate binding for each terminal device.
+See Info node `(elisp)Multiple displays'. */);
DEFVAR_KBOARD ("local-function-key-map", Vlocal_function_key_map,
- doc: /* Keymap mapping ASCII function key sequences onto their preferred forms.
-This allows Emacs to recognize function keys sent from ASCII
-terminals at any point in a key sequence.
+ doc: /* Keymap that translates key sequences to key sequences during input.
+This is used mainly for mapping ASCII function key sequences into
+real Emacs function key events (symbols).
The `read-key-sequence' function replaces any subsequence bound by
`local-function-key-map' with its binding. More precisely, when the
string, `read-key-sequence' replaces the matching suffix with its
binding, and continues with the new sequence.
+If the binding is a function, it is called with one argument (the prompt)
+and its return value (a key sequence) is used.
+
The events that come from bindings in `local-function-key-map' are not
themselves looked up in `local-function-key-map'.
`C-x ESC O P' would return [?\\C-x f1]. If [f1] were a prefix key,
typing `ESC O P x' would return [f1 x].
-`local-function-key-map' has a separate binding for each display
+`local-function-key-map' has a separate binding for each terminal
device. See Info node `(elisp)Multiple displays'. If you need to
-define a binding on all display devices, change `function-key-map'
+define a binding on all terminals, change `function-key-map'
instead. Initially, `local-function-key-map' is an empty keymap that
-has `function-key-map' as its parent on all display devices.
-
-Note that the currently selected frame has very little to do with
-which binding of this variable is active at any given moment. If you
-need set or get the binding on a specific display, use
-`terminal-local-value' and `set-terminal-local-value'. */);
+has `function-key-map' as its parent on all terminal devices. */);
DEFVAR_LISP ("function-key-map", &Vfunction_key_map,
doc: /* The parent keymap of all `local-function-key-map' instances.
-Function key definitions that apply to all display devices should go
+Function key definitions that apply to all terminal devices should go
here. If a mapping is defined in both the current
`local-function-key-map' binding and this variable, then the local
definition will take precendence. */);
This keymap works like `function-key-map', but comes after that,
and its non-prefix bindings override ordinary bindings.
-`key-translation-map' has a separate binding for each display device.
+`key-translation-map' has a separate binding for each terminal device.
(See Info node `(elisp)Multiple displays'.) If you need to set a key
-translation on all devices, change `global-key-translation-map' instead.
-
-Note that the currently selected frame has very little to do with
-which binding of this variable is active at any given moment. If you
-need set or get the binding on a specific display, use
-`terminal-local-value' and `set-terminal-local-value'. */);
+translation on all terminals, change `global-key-translation-map' instead. */);
DEFVAR_LISP ("key-translation-map", &Vkey_translation_map,
doc: /* The parent keymap of all `local-key-translation-map' instances.
-Key translations that apply to all display devices should go here. */);
+Key translations that apply to all terminal devices should go here. */);
Vkey_translation_map = Fmake_sparse_keymap (Qnil);
DEFVAR_LISP ("deferred-action-list", &Vdeferred_action_list,