# HG changeset patch # User Stefan Monnier # Date 1180105241 0 # Node ID 20f40276359ea4faddb7ebe5582f36f1326ab9ff # Parent c97a9221b6b8c4bf15b6c58b8bf2691ae5527c13 (xterm-mouse-truncate-wrap): New function. (xterm-mouse-event): Use it. diff -r c97a9221b6b8 -r 20f40276359e lisp/xt-mouse.el --- a/lisp/xt-mouse.el Fri May 25 15:00:22 2007 +0000 +++ b/lisp/xt-mouse.el Fri May 25 15:00:41 2007 +0000 @@ -122,6 +122,22 @@ (+ c #x8000000 128) c))) +(defun xterm-mouse-truncate-wrap (f) + "Truncate with wrap-around." + (condition-case nil + ;; First try the built-in truncate, in case there's no overflow. + (truncate f) + ;; In case of overflow, do wraparound by hand. + (range-error + ;; In our case, we wrap around every 3 days or so, so if we assume + ;; a maximum of 65536 wraparounds, we're safe for a couple years. + ;; Using a power of 2 makes rounding errors less likely. + (let* ((maxwrap (* 65536 2048)) + (dbig (truncate (/ f maxwrap))) + (fdiff (- f (* 1.0 maxwrap dbig)))) + (+ (truncate fdiff) (* maxwrap dbig)))))) + + (defun xterm-mouse-event () "Convert XTerm mouse event to Emacs mouse event." (let* ((type (- (xterm-mouse-event-read) #o40)) @@ -129,7 +145,7 @@ (y (- (xterm-mouse-event-read) #o40 1)) ;; Emulate timestamp information. This is accurate enough ;; for default value of mouse-1-click-follows-link (450msec). - (timestamp (truncate + (timestamp (xterm-mouse-truncate-wrap (* 1000 (- (float-time) (or xt-mouse-epoch @@ -206,5 +222,5 @@ (provide 'xt-mouse) -;;; arch-tag: 84962d4e-fae9-4c13-a9d7-ef4925a4ac03 +;; arch-tag: 84962d4e-fae9-4c13-a9d7-ef4925a4ac03 ;;; xt-mouse.el ends here