Subject: Re: bug#15045: Point jumps inappropriately around time of Semantic lexing

From: Barry OReilly <[email-masked]>
Date: Thu, 17 Oct 2013 11:03:11 -0400

Here's the solution you requested. Let me know that it's good to
install.

diff --git a/ChangeLog b/ChangeLog
index a755b5c..8b58ebc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2013-10-17  Barry O'Reilly  <[email-masked]>
+
+       Change how input-pending-p checks for timers to run. Its default
+       changes from checking to not checking. Its new check-timers param
+       allows for prior behavior. (Bug#15045).
+       * src/keyboard.c (Finput_pending_p): Accept optional check-timers
+       param.
+       * lisp/subr.el (sit-for): Call (input-pending-p t) so as to behave
+       as before.
+       * test/automated/timer-tests.el: New file. Tests that (sit-for 0)
+       allows another timer to run.
+
 2013-10-13  Glenn Morris  <[email-masked]>

        * configure.ac [alpha]: Explicit error in non-ELF case.  (Bug#15601)
diff --git a/etc/NEWS b/etc/NEWS
index ddb9a9f..06372f9 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -611,6 +611,9 @@ low-level libraries gfilenotify.c, inotify.c or
w32notify.c.
 ^L
 * Incompatible Lisp Changes in Emacs 24.4

+** `(input-pending-p)' no longer runs other timers which are ready to
+run. The new optional CHECK-TIMERS param allows for the prior behavior.
+
 ** `defvar' and `defcustom' in a let-binding affect the "external" default.

 ** The syntax of ?» and ?« is now punctuation instead of matched parens.
diff --git a/lisp/subr.el b/lisp/subr.el
index 0d03e9a..952b9b6 100644
--- a/lisp/subr.el
+++ b/lisp/subr.el
@@ -2222,7 +2222,7 @@ floating point support."
    (noninteractive
     (sleep-for seconds)
     t)
-   ((input-pending-p)
+   ((input-pending-p t)
     nil)
    ((<= seconds 0)
     (or nodisp (redisplay)))
diff --git a/src/keyboard.c b/src/keyboard.c
index e0cd4d4..7f8692a 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -9947,12 +9947,13 @@ requeued_events_pending_p (void)
   return (!NILP (Vunread_command_events));
 }

-
-DEFUN ("input-pending-p", Finput_pending_p, Sinput_pending_p, 0, 0, 0,
+DEFUN ("input-pending-p", Finput_pending_p, Sinput_pending_p, 0, 1, 0,
        doc: /* Return t if command input is currently available with no
wait.
 Actually, the value is nil only if we can be sure that no input is
available;
-if there is a doubt, the value is t.  */)
-  (void)
+if there is a doubt, the value is t.
+
+If CHECK-TIMERS is non-nil, timers that are ready to run will do so.  */)
+  (Lisp_Object check_timers)
 {
   if (!NILP (Vunread_command_events)
       || !NILP (Vunread_post_input_method_events)
@@ -9962,8 +9963,9 @@ if there is a doubt, the value is t.  */)
   /* Process non-user-visible events (Bug#10195).  */
   process_special_events ();

-  return (get_input_pending (READABLE_EVENTS_DO_TIMERS_NOW
-                 | READABLE_EVENTS_FILTER_EVENTS)
+  return (get_input_pending ((EQ (check_timers, Qnil)
+                              ? 0 : READABLE_EVENTS_DO_TIMERS_NOW)
+                             | READABLE_EVENTS_FILTER_EVENTS)
       ? Qt : Qnil);
 }

diff --git a/test/automated/timer-tests.el b/test/automated/timer-tests.el
new file mode 100644
index 0000000..b4cb1e6
--- /dev/null
+++ b/test/automated/timer-tests.el
@@ -0,0 +1,42 @@
+;;; timer-tests.el --- tests for timers -*- coding: utf-8;
lexical-binding:t -*-
+
+;; Copyright (C) 2013 Free Software Foundation, Inc.
+
+;; This file is part of GNU Emacs.
+
+;; This program is free software: you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License as
+;; published by the Free Software Foundation, either version 3 of the
+;; License, or (at your option) any later version.
+;;
+;; This program is distributed in the hope that it will be useful, but
+;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+;; General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with this program.  If not, see `http://www.gnu.org/licenses/'.
+
+;;; Commentary:
+
+;;; Code:
+
+(require 'ert)
+
+(ert-deftest timer-tests-sit-for ()
+  (let ((timer-ran nil)
+        (timeout (time-add (current-time)
+                           '(0 10 0 0)))
+        ;; Want sit-for behavior when interactive
+        (noninteractive nil))
+    (run-at-time '(0 1 0 0)
+                 nil
+                 (lambda ()
+                   (setq timer-ran t)))
+    (while (not timer-ran)
+        (should (time-less-p (current-time)
+                             timeout))
+        (sit-for 0 t))))
+
+;;; timer-tests.el ends here
+