X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=poe-xemacs.el;h=5ebf94fc18f7ac03753e4f3751b89e2581f95ced;hb=refs%2Ftags%2Fchise-core-0_23;hp=e22a29907a31e26bdba6dfad78e419c2522b9c8d;hpb=7ac33fd4acbdd20e941426c25ee6ab4e086a9211;p=elisp%2Fapel.git diff --git a/poe-xemacs.el b/poe-xemacs.el index e22a299..5ebf94f 100644 --- a/poe-xemacs.el +++ b/poe-xemacs.el @@ -20,8 +20,8 @@ ;; You should have received a copy of the GNU General Public License ;; along with XEmacs; see the file COPYING. If not, write to the Free -;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -;; 02111-1307, USA. +;; Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +;; MA 02110-1301, USA. ;;; Code: @@ -82,14 +82,29 @@ When called interactively, prompt for the name of the color to use." ;;; (condition-case nil + (require 'timer-funcs) + (error nil)) +(condition-case nil (require 'timer) - (error + (error nil)) +(or + (or (featurep 'timer-funcs) (featurep 'timer)) + (progn (require 'itimer) - (defun-maybe run-at-time (time repeat function &rest args) - (start-itimer (make-temp-name "rat") - `(lambda () - (,function ,@args)) - time repeat)) + (if (and (= emacs-major-version 19) (<= emacs-minor-version 14)) + (defun-maybe run-at-time (time repeat function &rest args) + (start-itimer (make-temp-name "rat") + `(lambda () + (,function ,@args)) + time repeat)) + (defun-maybe run-at-time (time repeat function &rest args) + "Function emulating the function of the same name of Emacs. +TIME should be nil meaning now, or a number of seconds from now. +Return an itimer object which can be used in either `delete-itimer' +or `cancel-timer'." + (apply #'start-itimer "run-at-time" + function (if time (max time 1e-9) 1e-9) + repeat nil t args))) (defalias 'cancel-timer 'delete-itimer) (defun with-timeout-handler (tag) (throw tag 'timeout)) @@ -114,48 +129,66 @@ When called interactively, prompt for the name of the color to use." (broken-facility run-at-time-tick-tock "`run-at-time' is not punctual." - ;; It should be fixed when someone improves itimer in the future. - ;; Note that it doesn't support XEmacsen of versions prior to 19.15 + ;; Note that it doesn't support XEmacsen prior to the version 19.15 ;; since `start-itimer' doesn't pass arguments to a timer function. - (and (= emacs-major-version 19) (<= emacs-minor-version 14))) + (or (and (= emacs-major-version 19) (<= emacs-minor-version 14)) + (condition-case nil + (progn + (unless (or itimer-process itimer-timer) + (itimer-driver-start)) + ;; Check whether there is a bug to which the difference of + ;; the present time and the time when the itimer driver was + ;; woken up is subtracted from the initial itimer value. + (let* ((inhibit-quit t) + (ctime (current-time)) + (itimer-timer-last-wakeup + (prog1 + ctime + (setcar ctime (1- (car ctime))))) + (itimer-list nil) + (itimer (start-itimer "run-at-time" 'ignore 5))) + (sleep-for 0.1) ;; Accept the timeout interrupt. + (prog1 + (> (itimer-value itimer) 0) + (delete-itimer itimer)))) + (error nil)))) (when-broken run-at-time-tick-tock - (defadvice run-at-time (around make-it-punctual - (time repeat function &rest args) - activate) - "This function was redefined to be made punctual by APEL. -Note that it allows neither a string nor a time in the Emacs style -\(a list of integers) as the first argument TIME." - (let ((itimers (list nil))) - (setcar - itimers - (apply #'start-itimer "run-at-time" - (lambda (itimers repeat function &rest args) - (let ((itimer (car itimers))) - (if repeat - (progn - (set-itimer-function - itimer - (lambda (itimer repeat function &rest args) - (set-itimer-restart itimer repeat) - (set-itimer-function itimer function) - (set-itimer-function-arguments itimer args) - (apply function args))) - (set-itimer-function-arguments - itimer - (append (list itimer repeat function) args))) - (set-itimer-function - itimer - (lambda (itimer function &rest args) - (set-itimer-restart itimer nil) - (delete-itimer itimer) - (apply function args))) - (set-itimer-function-arguments - itimer - (append (list itimer function) args))))) - 1e-9 (if time (max time 1e-9) 1e-9) - nil t itimers repeat function args)) - (setq ad-return-value (car itimers))))) + (defalias 'run-at-time + (lambda (time repeat function &rest args) + "Function emulating the function of the same name of Emacs. +It works correctly for TIME even if there is a bug in the XEmacs core. +TIME should be nil meaning now, or a number of seconds from now. +Return an itimer object which can be used in either `delete-itimer' +or `cancel-timer'." + (let ((itimers (list nil))) + (setcar + itimers + (apply #'start-itimer "fixed-run-at-time" + (lambda (itimers repeat function &rest args) + (let ((itimer (car itimers))) + (if repeat + (progn + (set-itimer-function + itimer + (lambda (itimer repeat function &rest args) + (set-itimer-restart itimer repeat) + (set-itimer-function itimer function) + (set-itimer-function-arguments itimer args) + (apply function args))) + (set-itimer-function-arguments + itimer + (append (list itimer repeat function) args))) + (set-itimer-function + itimer + (lambda (itimer function &rest args) + (delete-itimer itimer) + (apply function args))) + (set-itimer-function-arguments + itimer + (append (list itimer function) args))))) + 1e-9 (if time (max time 1e-9) 1e-9) + nil t itimers repeat function args)))))) ;;; @ to avoid bug of XEmacs 19.14