[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: pre-command-hook with input methods
From: |
Stefan Monnier |
Subject: |
Re: pre-command-hook with input methods |
Date: |
Mon, 25 May 2015 18:52:10 -0400 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/25.0.50 (gnu/linux) |
> I think so yes -- so long as input-event means "user input-event" or I
> have some way of telling. Something coming in from a process, or
> file-watch notifications need to be ignored.
Could you try the patch below to see if it provides the feature
you need?
Stefan
diff --git a/etc/NEWS b/etc/NEWS
index 1cccc31..f1b7119 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -811,6 +811,8 @@ behavior, set `diff-switches' to `-c'.
* Lisp Changes in Emacs 25.1
+** New hook `input-event-functions' run whenever a user-input event is read.
+
** The default value of `load-read-function' is now `read'.
** New hook `pre-redisplay-functions', a bit easier to use than
pre-redisplay-function.
diff --git a/lisp/subr.el b/lisp/subr.el
index b9a847d..df0ed42 100644
--- a/lisp/subr.el
+++ b/lisp/subr.el
@@ -1110,6 +1110,12 @@ See `event-start' for a description of the value
returned."
"Return the multi-click count of EVENT, a click or drag event.
The return value is a positive integer."
(if (and (consp event) (integerp (nth 2 event))) (nth 2 event) 1))
+
+(defvar input-event-functions nil
+ ;; BEWARE: If it looks like this is not run anywhere, it's normal:
+ ;; this is run in keyboard.c.
+ "Special hook run each time a user-input event is read.
+Each function is called with one argument: the event.")
;;;; Extracting fields of the positions in an event.
diff --git a/src/keyboard.c b/src/keyboard.c
index eb66c44..5c64199 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -2454,7 +2454,7 @@ read_char (int commandflag, Lisp_Object map,
/* Also check was_disabled so last-nonmenu-event won't return
a bad value when submenus are involved. (Bug#447) */
&& (EQ (c, Qtool_bar) || EQ (c, Qmenu_bar) || was_disabled))
- *used_mouse_menu = 1;
+ *used_mouse_menu = true;
goto reread_for_input_method;
}
@@ -2995,6 +2995,8 @@ read_char (int commandflag, Lisp_Object map,
if (! NILP (also_record))
record_char (also_record);
+ Frun_hook_with_args (2, ((Lisp_Object []) {Qinput_event_functions, c}));
+
/* Wipe the echo area.
But first, if we are about to use an input method,
save the echo area contents for it to refer to. */
@@ -3986,7 +3988,7 @@ kbd_buffer_get_event (KBOARD **kbp,
obj = list1 (intern ("ns-unput-working-text"));
kbd_fetch_ptr = event + 1;
if (used_mouse_menu)
- *used_mouse_menu = 1;
+ *used_mouse_menu = true;
}
#endif
@@ -4181,13 +4183,13 @@ kbd_buffer_get_event (KBOARD **kbp,
&& !EQ (event->frame_or_window, event->arg)
&& (event->kind == MENU_BAR_EVENT
|| event->kind == TOOL_BAR_EVENT))
- *used_mouse_menu = 1;
+ *used_mouse_menu = true;
#endif
#ifdef HAVE_NS
/* Certain system events are non-key events. */
if (used_mouse_menu
&& event->kind == NS_NONKEY_EVENT)
- *used_mouse_menu = 1;
+ *used_mouse_menu = true;
#endif
/* Wipe out this event, to catch bugs. */
@@ -8445,7 +8447,7 @@ read_char_x_menu_prompt (Lisp_Object map,
Lisp_Object prev_event, bool *used_mouse_menu)
{
if (used_mouse_menu)
- *used_mouse_menu = 0;
+ *used_mouse_menu = false;
/* Use local over global Menu maps. */
@@ -8494,7 +8496,7 @@ read_char_x_menu_prompt (Lisp_Object map,
else if (NILP (value))
value = Qt;
if (used_mouse_menu)
- *used_mouse_menu = 1;
+ *used_mouse_menu = true;
return value;
}
return Qnil ;
@@ -9067,7 +9069,7 @@ read_key_sequence (Lisp_Object *keybuf, int bufsize,
Lisp_Object prompt,
: (/* indec.start < t || fkey.start < t || */ keytran.start < t))
{
Lisp_Object key;
- bool used_mouse_menu = 0;
+ bool used_mouse_menu = false;
/* Where the last real key started. If we need to throw away a
key that has expanded into more than one element of keybuf
@@ -11078,6 +11080,7 @@ syms_of_keyboard (void)
DEFSYM (Qself_insert_command, "self-insert-command");
DEFSYM (Qforward_char, "forward-char");
DEFSYM (Qbackward_char, "backward-char");
+ DEFSYM (Qinput_event_functions, "input-event-functions");
/* Non-nil disable property on a command means do not execute it;
call disabled-command-function's value instead. */
- Re: pre-command-hook with input methods,
Stefan Monnier <=