;;; -*- Mode: Common-Lisp; Package: User; Base: 10.; Patch-File: T -*-

;;; Reason: Fix several problems in the Get-Motion-Events request.  
;;; Prevent array index error when there are many events to return and
;;; prevent hang when no events are returned.

;;;                           RESTRICTED RIGHTS LEGEND
;;;
;;; Use, duplication, or disclosure by the Government is subject to
;;; restrictions as set forth in subdivision (c)(1)(ii) of the Rights in
;;; Technical Data and Computer Software clause at 52.227-7013.
;;;
;;;   TEXAS INSTRUMENTS INCORPORATED      
;;;   P.O. BOX 2909, M/S 2151             
;;;   AUSTIN, TEXAS 78769                 
;;;
;;; Copyright (C) 1989 Texas Instruments Incorporated.
;;; All rights reserved.

;;; Patch file for X11M version 6.13
;;; Written 07/08/89 00:06:33 by buehring,
;;; while running on Spud from band LOD4
;;; With SYSTEM 6.10, VIRTUAL-MEMORY 6.1, EH 6.3, MAKE-SYSTEM 6.0, MICRONET 6.0, LOCAL-FILE 6.0,
;;;  BASIC-PATHNAME 6.1, NETWORK-SUPPORT-COLD 6.0, BASIC-NAMESPACE 6.1, NETWORK-NAMESPACE 6.0,
;;;  DISK-IO 6.0, DISK-LABEL 6.0, BASIC-FILE 6.2, MAC-PATHNAME 6.0, NETWORK-PATHNAME 6.0,
;;;  COMPILER 6.7, TV 6.12, DATALINK 6.0, CHAOSNET 6.0, GC 6.3, MEMORY-AUX 6.0, NVRAM 6.1,
;;;  SYSLOG 6.1, STREAMER-TAPE 6.4, UCL 6.0, INPUT-EDITOR 6.0, METER 6.1, ZWEI 6.3,
;;;  DEBUG-TOOLS 6.3, NETWORK-SUPPORT 6.0, NETWORK-SERVICE 6.1, DATALINK-DISPLAYS 6.0,
;;;  FONT-EDITOR 6.1, SERIAL 6.0, PRINTER 6.3, MAC-PRINTER-TYPES 6.1, PRINTER-TYPES 6.1,
;;;  IMAGEN 6.0, SUGGESTIONS 6.0, MAIL-DAEMON 6.2, MAIL-READER 6.1, TELNET 6.0, VT100 6.0,
;;;  NAMESPACE-EDITOR 6.0, PROFILE 6.1, VISIDOC 6.2, TI-CLOS 6.11, CLEH 6.4, IP 3.47,
;;;  Experimental BUG 11.10, Experimental CLX 6.2, CLUE 6.5, X11M 6.12,  microcode 429,
;;;  Band Name: Release 6.0 + SLE  6/26

#!C
; From file MOUSE-REQUESTS.LISP#> X11M.SERVER; MR-X:
#10R X11#:
(COMPILER-LET ((*PACKAGE* (FIND-PACKAGE "X11"))
                          (SI:*LISP-MODE* :COMMON-LISP)
                          (*READTABLE* SYS:COMMON-LISP-READTABLE)
                          (SI:*READER-SYMBOL-SUBSTITUTIONS* SYS::*COMMON-LISP-SYMBOL-SUBSTITUTIONS*))
  (COMPILER#:PATCH-SOURCE-FILE "SYS: X11M.SERVER; MOUSE-REQUESTS.#"


(DEFUN GET-MOTION-EVENTS (STATE WINDOW START-TIME STOP-TIME)
  (DECLARE (TYPE STATE STATE)
           (TYPE TIME-STAMP START-TIME STOP-TIME))
  (SETQ START-TIME (CLIENT-TIME-TO-SERVER-TIME START-TIME)
	STOP-TIME  (CLIENT-TIME-TO-SERVER-TIME STOP-TIME))
  (LET* ((MOUSE (INPUT-INFO.POINTER INPUT-INFO))
	 (TIME-COORDS NIL)
	 (INDEX 0))
    (COND ((PLUSP (COMPARE-TIME-STAMPS START-TIME STOP-TIME))
	   ;; Start > Stop -- done.
	   NIL)
	  ((PLUSP (COMPARE-TIME-STAMPS START-TIME CURRENT-TIME))
	   ;; Start > now -- done.
	   NIL)
	  (T
	   (WHEN (PLUSP (COMPARE-TIME-STAMPS STOP-TIME CURRENT-TIME))
	     (SETQ STOP-TIME CURRENT-TIME))
	   (SETQ TIME-COORDS (LOOP WITH COORDS = (READ-HISTORY-EVENT-RANGE
						   MOUSE
						   (TIME-STAMP.MILLISECONDS START-TIME)
						   (TIME-STAMP.MILLISECONDS STOP-TIME))
				   WITH MIN-X = (WINDOW.ABSOLUTE-X-CORNER WINDOW)
				   WITH MIN-Y = (WINDOW.ABSOLUTE-Y-CORNER WINDOW)
				   WITH MAX-X = (+ MIN-X (WINDOW.OUTSIDE-WIDTH  WINDOW))
				   WITH MAX-Y = (+ MIN-Y (WINDOW.OUTSIDE-HEIGHT WINDOW))
				   WITH WIN-X-ORIGIN = (WINDOW.ABSOLUTE-INSIDE-X WINDOW)
				   WITH WIN-Y-ORIGIN = (WINDOW.ABSOLUTE-INSIDE-Y WINDOW)
				   FOR INDEX UPFROM 0
				   FOR (TIME X Y) IN COORDS
				   WHEN (AND (<= MIN-X X) (< X MAX-X)
					     (<= MIN-Y Y) (< Y MAX-Y))
				   COLLECT `(,TIME ,(- X WIN-X-ORIGIN) ,(- Y WIN-Y-ORIGIN))))))
    (FORMAT-REPLY (STATE (* 2 (LENGTH TIME-COORDS)))
      :LONG (LENGTH TIME-COORDS))
    (SERVER-PUSH STATE)
    (LOOP FOR (TIME X Y) IN TIME-COORDS
	  DO
	  (SETQ INDEX (SIMPLE-REPLY (STATE INDEX)
			:LONG TIME
			:WORD X
			:WORD Y)))
    (SERVER-STRING-OUT STATE (RESPONSE.BYTES (STATE.RESPONSE STATE)) INDEX)
    (SERVER-PUSH STATE)))

))
