From: Stefan Monnier <monnier@iro.umontreal.ca>
To: phillip.lord@newcastle.ac.uk (Phillip Lord)
Cc: emacs-devel@gnu.org
Subject: Re: pre-command-hook with input methods
Date: Mon, 25 May 2015 18:52:10 -0400 [thread overview]
Message-ID: <jwv617gclvz.fsf-monnier+emacs@gnu.org> (raw)
In-Reply-To: <878ug53ljk.fsf@newcastle.ac.uk> (Phillip Lord's message of "Tue, 10 Feb 2015 14:09:51 +0000")
> 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'.
\f
* 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.")
\f
;;;; 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. */
next prev parent reply other threads:[~2015-05-25 22:52 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-02-05 13:28 pre-command-hook with input methods Phillip Lord
2015-02-05 20:19 ` Stefan Monnier
2015-02-06 13:55 ` Phillip Lord
2015-02-06 15:17 ` Stefan Monnier
2015-02-06 15:45 ` Phillip Lord
2015-02-06 23:58 ` Stefan Monnier
2015-02-09 10:47 ` Phillip Lord
2015-02-09 14:41 ` Stefan Monnier
2015-02-09 15:30 ` Phillip Lord
2015-02-09 16:13 ` Stefan Monnier
2015-02-10 14:09 ` Phillip Lord
2015-02-11 17:17 ` Phillip Lord
2015-02-11 19:21 ` Stefan Monnier
2015-02-12 10:27 ` Phillip Lord
2015-05-25 22:52 ` Stefan Monnier [this message]
2015-05-27 16:03 ` Phillip Lord
2015-05-27 19:45 ` Stefan Monnier
2015-05-27 21:54 ` Phillip Lord
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=jwv617gclvz.fsf-monnier+emacs@gnu.org \
--to=monnier@iro.umontreal.ca \
--cc=emacs-devel@gnu.org \
--cc=phillip.lord@newcastle.ac.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.