emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] Changes to emacs/src/keyboard.c


From: Kim F. Storm
Subject: [Emacs-diffs] Changes to emacs/src/keyboard.c
Date: Tue, 25 Dec 2001 18:38:23 -0500

Index: emacs/src/keyboard.c
diff -c emacs/src/keyboard.c:1.644 emacs/src/keyboard.c:1.645
*** emacs/src/keyboard.c:1.644  Tue Dec 18 01:25:27 2001
--- emacs/src/keyboard.c        Tue Dec 25 18:38:23 2001
***************
*** 2982,3024 ****
  record_char (c)
       Lisp_Object c;
  {
!   /* Don't record `help-echo' in recent_keys unless it shows some help
!      message, and a different help than the previoiusly recorded
!      event.  */
!   if (CONSP (c) && EQ (XCAR (c), Qhelp_echo))
      {
!       Lisp_Object help;
  
!       help = Fcar (Fcdr (XCDR (c)));
!       if (STRINGP (help))
        {
!         int last_idx;
!         Lisp_Object last_c, last_help;
!         
!         last_idx = recent_keys_index - 1;
!         if (last_idx < 0)
!           last_idx = NUM_RECENT_KEYS - 1;
!         last_c = AREF (recent_keys, last_idx);
!         
!         if (!CONSP (last_c)
!             || !EQ (XCAR (last_c), Qhelp_echo)
!             || (last_help = Fcar (Fcdr (XCDR (last_c))),
!                 !EQ (last_help, help)))
            {
!             total_keys++;
!             ASET (recent_keys, recent_keys_index, c);
!             if (++recent_keys_index >= NUM_RECENT_KEYS)
!               recent_keys_index = 0;
            }
        }
      }
    else
      {
        total_keys++;
        ASET (recent_keys, recent_keys_index, c);
        if (++recent_keys_index >= NUM_RECENT_KEYS)
        recent_keys_index = 0;
      }
        
    /* Write c to the dribble file.  If c is a lispy event, write
       the event's symbol to the dribble file, in <brackets>.  Bleaugh.
--- 2982,3082 ----
  record_char (c)
       Lisp_Object c;
  {
!   int recorded = 0;
! 
!   if (CONSP (c) && (EQ (XCAR (c), Qhelp_echo) || EQ (XCAR (c), 
Qmouse_movement)))
      {
!       /* To avoid filling recent_keys with help-echo and mouse-movement
!        events, we filter out repeated help-echo events, only store the
!        first and last in a series of mouse-movement events, and don't
!        store repeated help-echo events which are only separated by
!        mouse-movement events.  */
  
!       Lisp_Object ev1, ev2, ev3;
!       int ix1, ix2, ix3;
!       
!       if ((ix1 = recent_keys_index - 1) < 0)
!       ix1 = NUM_RECENT_KEYS - 1;
!       ev1 = AREF (recent_keys, ix1);
!       
!       if ((ix2 = ix1 - 1) < 0)
!       ix2 = NUM_RECENT_KEYS - 1;
!       ev2 = AREF (recent_keys, ix2);
!       
!       if ((ix3 = ix2 - 1) < 0)
!       ix3 = NUM_RECENT_KEYS - 1;
!       ev3 = AREF (recent_keys, ix3);
!      
!       if (EQ (XCAR (c), Qhelp_echo))
!       {
!         /* Don't record `help-echo' in recent_keys unless it shows some help
!            message, and a different help than the previoiusly recorded
!            event.  */
!         Lisp_Object help, last_help;
! 
!         help = Fcar_safe (Fcdr_safe (XCDR (c)));
!         if (!STRINGP (help))
!           recorded = 1;
!         else if (CONSP (ev1) && EQ (XCAR (ev1), Qhelp_echo)
!                  && (last_help = Fcar_safe (Fcdr_safe (XCDR (ev1))), EQ 
(last_help, help)))
!           recorded = 1;
!         else if (CONSP (ev1) && EQ (XCAR (ev1), Qmouse_movement)
!                  && CONSP (ev2) && EQ (XCAR (ev2), Qhelp_echo)
!                  && (last_help = Fcar_safe (Fcdr_safe (XCDR (ev2))), EQ 
(last_help, help)))
!           recorded = -1;
!         else if (CONSP (ev1) && EQ (XCAR (ev1), Qmouse_movement)
!                  && CONSP (ev2) && EQ (XCAR (ev2), Qmouse_movement)
!                  && CONSP (ev3) && EQ (XCAR (ev3), Qhelp_echo)
!                  && (last_help = Fcar_safe (Fcdr_safe (XCDR (ev3))), EQ 
(last_help, help)))
!           recorded = -2;
!       }
!       else if (EQ (XCAR (c), Qmouse_movement))
        {
!         /* Only record one pair of `mouse-movement' on a window in 
recent_keys.
!            So additional mouse movement events replace the last element.  */
!         Lisp_Object last_window, window;
! 
!         window = Fcar_safe (Fcar_safe (XCDR (c)));
!         if (CONSP (ev1) && EQ (XCAR (ev1), Qmouse_movement)
!             && (last_window = Fcar_safe (Fcar_safe (XCDR (ev1))), EQ 
(last_window, window))
!             && CONSP (ev2) && EQ (XCAR (ev2), Qmouse_movement)
!             && (last_window = Fcar_safe (Fcar_safe (XCDR (ev2))), EQ 
(last_window, window)))
            {
!             ASET (recent_keys, ix1, c);
!             recorded = 1;
            }
        }
      }
    else
+     store_kbd_macro_char (c);
+ 
+   if (!recorded)
      {
        total_keys++;
        ASET (recent_keys, recent_keys_index, c);
        if (++recent_keys_index >= NUM_RECENT_KEYS)
        recent_keys_index = 0;
      }
+   else if (recorded < 0)
+     {
+       /* We need to remove one or two events from recent_keys.
+          To do this, we simply put nil at those events and move the
+        recent_keys_index backwards over those events.  Usually,
+        users will never see those nil events, as they will be
+        overwritten by the command keys entered to see recent_keys
+        (e.g. C-h l).  */
+ 
+       while (recorded++ < 0 && total_keys > 0)
+       {
+         if (total_keys < NUM_RECENT_KEYS)
+           total_keys--;
+         if (--recent_keys_index < 0)
+           recent_keys_index = NUM_RECENT_KEYS - 1;
+         ASET (recent_keys, recent_keys_index, Qnil);
+       }
+     }
+ 
+   num_nonmacro_input_events++;
        
    /* Write c to the dribble file.  If c is a lispy event, write
       the event's symbol to the dribble file, in <brackets>.  Bleaugh.
***************
*** 3051,3061 ****
  
        fflush (dribble);
      }
- 
-   if (!CONSP (c) || !EQ (Qhelp_echo, XCAR (c)))
-     store_kbd_macro_char (c);
- 
-   num_nonmacro_input_events++;
  }
  
  Lisp_Object
--- 3109,3114 ----



reply via email to

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