emacs-devel
[Top][All Lists]
Advanced

[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.  */



reply via email to

[Prev in Thread] Current Thread [Next in Thread]