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

;;; Reason: Fixes problem on a pointer-grab when a confine-to
;;;  window is specified. Now when the confine-to window moves
;;;  the cursor will move with it. Fixes SPR #11139.

;;;                           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.27
;;; Written 06/06/90 15:38:01 by HAGY,
;;; while running on Zwingli from band LOD2
;;; With SYSTEM 6.25, VIRTUAL-MEMORY 6.2, EH 6.5, MAKE-SYSTEM 6.2, MICRONET 6.0, LOCAL-FILE 6.1,
;;;  BASIC-PATHNAME 6.2, NETWORK-SUPPORT-COLD 6.2, BASIC-NAMESPACE 6.7, NETWORK-NAMESPACE 6.0,
;;;  DISK-IO 6.1, DISK-LABEL 6.0, BASIC-FILE 6.6, MAC-PATHNAME 6.0, NETWORK-PATHNAME 6.0,
;;;  COMPILER 6.14, TV 6.19, DATALINK 6.0, CHAOSNET 6.5, GC 6.3, MEMORY-AUX 6.0, NVRAM 6.2,
;;;  SYSLOG 6.2, STREAMER-TAPE 6.5, UCL 6.0, INPUT-EDITOR 6.0, METER 6.1, ZWEI 6.8,
;;;  DEBUG-TOOLS 6.3, NETWORK-SUPPORT 6.0, NETWORK-SERVICE 6.2, DATALINK-DISPLAYS 6.0,
;;;  FONT-EDITOR 6.1, SERIAL 6.0, PRINTER 6.3, MAC-PRINTER-TYPES 6.1, PRINTER-TYPES 6.2,
;;;  IMAGEN 6.1, SUGGESTIONS 6.1, MAIL-DAEMON 6.3, MAIL-READER 6.6, TELNET 6.0, VT100 6.0,
;;;  NAMESPACE-EDITOR 6.4, PROFILE 6.2, VISIDOC 6.5, TI-CLOS 6.26, CLEH 6.5, IP 3.56,
;;;  Experimental CLX 6.11, CLUE 6.104, X11M 6.26, Experimental BUG 11.17, Experimental CLIO 1.0,
;;;   microcode 430, Band Name: REl 6.0 +SLE +CLIO

#!C
; From file MOUSE-HANDLER.LISP#> X11M.SERVER; Hotel:
#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-HANDLER.#"


(DEFUN BUFFER-MOUSE-EVENTS ()
  "Runs in its own process to obtain events from the Explorer mouse queue
and place them in a larger queue for X."
  ;; This sleep makes it reasonable for the mouse process to be high priority.
  ;; It insures that moving the mouse does not lock out lower priority
  ;; processes for a long time.  This constant may want to be tweaked.  A
  ;; value of 1 (1/60 of a second) does not noticably affect mouse response.
  (PROCESS-SLEEP 1)
  ;; Note that W:MOUSE-WAKEUP is a microcode register that becomes non-nil
  ;; when either the mouse moves or when the user clicks a mouse button.
  (PROCESS-WAIT "X Mouse" #'(LAMBDA () W:MOUSE-WAKEUP))
  (SETQ W:MOUSE-WAKEUP (NOT (= W:MOUSE-BUTTONS-BUFFER-IN-INDEX
                               W:MOUSE-BUTTONS-BUFFER-OUT-INDEX)))
  (LET ((DELTA-X (- W:MOUSE-X MOUSE-LAST-X))
        (DELTA-Y (- W:MOUSE-Y MOUSE-LAST-Y))
        NEW-BUTTONS
        MOUSE-LAST-BUTTONS-TIME
        GLITCH-X GLITCH-Y
        MOUSE-LAST-BUTTONS-X MOUSE-LAST-BUTTONS-Y
        CHANGED-BUTTONS)
    (MULTIPLE-VALUE-SETQ (NEW-BUTTONS MOUSE-LAST-BUTTONS-TIME
                          MOUSE-LAST-BUTTONS-X MOUSE-LAST-BUTTONS-Y)
      (W:MOUSE-BUTTONS NIL))
    (INCF MOUSE-LAST-X DELTA-X)
    (INCF MOUSE-LAST-Y DELTA-Y)
    (SETQ CHANGED-BUTTONS (LOGXOR NEW-BUTTONS MOUSE-LAST-BUTTONS)
          MOUSE-LAST-BUTTONS NEW-BUTTONS)
    ;; Force blinker to stay within mouse-sheet.  If the mouse moves during this
    ;; computation, it will glitch back.  So we only SETQ the variables
    ;; if the mouse position actually needs to be changed, rather than using
    ;; MAX and MIN which would be more readable.
    (IF (> 0 W:MOUSE-X)
        (SETQ GLITCH-X 0))
    (IF (<= (W:SHEET-WIDTH W:MOUSE-SHEET) W:MOUSE-X)
        (SETQ GLITCH-X (1- (W:SHEET-WIDTH W:MOUSE-SHEET))))
    (IF (> 0 W:MOUSE-Y)
        (SETQ GLITCH-Y 0))
    (IF (<= (W:SHEET-HEIGHT W:MOUSE-SHEET) W:MOUSE-Y)
        (SETQ GLITCH-Y (1- (W:SHEET-HEIGHT W:MOUSE-SHEET))))
    ;; If mouse blinker needs to be glitched, do so
    (IF (OR GLITCH-X GLITCH-Y)
        (WITHOUT-INTERRUPTS
          (W:%OPEN-MOUSE-CURSOR)
          (IF GLITCH-X
              (SETQ MOUSE-LAST-X (SETQ W:MOUSE-X GLITCH-X)))
          (IF GLITCH-Y
              (SETQ MOUSE-LAST-Y (SETQ W:MOUSE-Y GLITCH-Y)))))
    (IF (LOGAND MOUSE-LEFT-BUTTON-MASK NEW-BUTTONS)
        ;; Only record the time of the first depression of this mouse button.
        (WHEN (NULL MOUSE-LEFT-LAST-DOWN-TIME)
          (SETQ MOUSE-LEFT-LAST-DOWN-TIME (GET-TIME-IN-MILLIS)))
        ;;ELSE
        (SETQ MOUSE-LEFT-LAST-DOWN-TIME NIL))
    (IF (LOGAND MOUSE-MIDDLE-BUTTON-MASK NEW-BUTTONS)
        ;; Only record the time of the first depression of this mouse button.
        (WHEN (NULL MOUSE-MIDDLE-LAST-DOWN-TIME)
          (SETQ MOUSE-MIDDLE-LAST-DOWN-TIME (GET-TIME-IN-MILLIS)))
        ;;ELSE
        (SETQ MOUSE-MIDDLE-LAST-DOWN-TIME NIL))
    (IF (LOGAND MOUSE-RIGHT-BUTTON-MASK NEW-BUTTONS)
        ;; Only record the time of the first depression of this mouse button.
        (WHEN (NULL MOUSE-RIGHT-LAST-DOWN-TIME)
          (SETQ MOUSE-RIGHT-LAST-DOWN-TIME (GET-TIME-IN-MILLIS)))
        ;;ELSE
        (SETQ MOUSE-RIGHT-LAST-DOWN-TIME NIL))
    (IF (AND (= NEW-BUTTONS (LOGIOR MOUSE-RIGHT-BUTTON-MASK
                                    MOUSE-MIDDLE-BUTTON-MASK
                                    MOUSE-LEFT-BUTTON-MASK))
             (> MOUSE-BUTTONS-ALL-DOWN-TIME-WINDOW
                (MAX (- MOUSE-LAST-BUTTONS-TIME MOUSE-LEFT-LAST-DOWN-TIME)
                     (- MOUSE-LAST-BUTTONS-TIME MOUSE-MIDDLE-LAST-DOWN-TIME)
                     (- MOUSE-LAST-BUTTONS-TIME MOUSE-RIGHT-LAST-DOWN-TIME))))
        ;; Pressing all mouse buttons down within a specified time window means
        ;; that the user (most likely an X hacker) is trying to disable X and
        ;; reenable the Explorer window system.
	(X-SHUTDOWN)
      ;;ELSE
	(UNLESS (= 0 CHANGED-BUTTONS DELTA-X DELTA-Y)  ; Avoid extraneous events
	  (WRITE-EVENTS MOUSE-EVENT-QUEUE 
			;; Merge changed buttons with current button state so we have both in the same number.
			(DPB CHANGED-BUTTONS BUTTON-DELTA-BYTE-SPEC NEW-BUTTONS)
			MOUSE-LAST-BUTTONS-TIME
			MOUSE-LAST-X MOUSE-LAST-Y))
;;;        (FORMAT TV:INITIAL-LISP-LISTENER "~D ~D, Buttons=~2R, at (~D,~D)"
;;;                W:MOUSE-BUTTONS-BUFFER-IN-INDEX
;;;                W:MOUSE-BUTTONS-BUFFER-OUT-INDEX
;;;                NEW-BUTTONS MOUSE-LAST-X MOUSE-LAST-Y)
      )))
))

#!C
; From file DEVICE-AND-EVENT-STRUCTURES.LISP#> X11M.SERVER; Hotel:
#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; DEVICE-AND-EVENT-STRUCTURES.#"


(DEFSTRUCT (GRAB-RECORD (:CONC-NAME "GRAB-RECORD."))
   ;; For chain of passive grabs.
   (NEXT             NIL) ;      :TYPE (OR NULL GRAB-RECORD))
   (RESOURCE         :UNBOUND :TYPE INTEGER)
   (CLIENT           :UNBOUND :TYPE STATE)
   (DEVICE           :UNBOUND :TYPE DEVICE)
   (WINDOW           :UNBOUND :TYPE WINDOW)
   (OWNER-EVENTS     :UNBOUND :TYPE BOOLEAN)
   (KEYBOARD-MODE    :UNBOUND :TYPE card8)     ; either grab-mode-sync or grab-mode-async
   (POINTER-MODE     :UNBOUND :TYPE card8)     ; either grab-mode-sync or grab-mode-async
   (MODIFIERS-DETAIL :UNBOUND :TYPE DETAIL-REC)
   (EVENT-MASK       :UNBOUND :TYPE INTEGER)
   (DETAIL	  :UNBOUND :TYPE DETAIL-REC)
   (CONFINE-TO    nil :TYPE (OR NULL WINDOW))		       ; only used for pointer
   (CURSOR        nil :TYPE (OR NULL CURSOR-RECORD)))
))

#!C
; From file CONFIGURE-WINDOW.LISP#> X11M.SERVER; Hotel:
#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; CONFIGURE-WINDOW.#"


(DEFUN CHECK-CURSOR-CONFINEMENT (WINDOW)
  ;; The purpose of this function is to check to see if we have
  ;;  just moved a window which we have the cursor confined to.
  ;;  If we have, we move the cursor so it is inside the window
  ;;  at its new position. If WINDOW is not the confine-to
  ;;  window we check its inferiors.
  (SERVER-TRACE "~%ENTERING CHECK-CURSOR-CONFINEMENT, window=~a" window)
  (WHEN	(AND PTR-GRAB
	     (GRAB-RECORD.CONFINE-TO PTR-GRAB))
    (IF (EQ WINDOW (GRAB-RECORD.CONFINE-TO PTR-GRAB))
	; WINDOW is the confine-to window, so move the cursor
	
	(LET ((CX (+ (TRUNCATE (* .5 (WINDOW.WIDTH WINDOW)))
		     (WINDOW.ABSOLUTE-INSIDE-X WINDOW)))
	      (CY (+ (TRUNCATE (* .5 (WINDOW.HEIGHT WINDOW)))
		     (WINDOW.ABSOLUTE-INSIDE-Y WINDOW))))
	  
	  (NEW-CURSOR-CONFINES (WINDOW.ABSOLUTE-INSIDE-X WINDOW)
			       (+ (WINDOW.ABSOLUTE-INSIDE-X WINDOW)
				  (WINDOW.WIDTH WINDOW))
			       (WINDOW.ABSOLUTE-INSIDE-Y WINDOW)
			       (+ (WINDOW.ABSOLUTE-INSIDE-Y WINDOW)
				  (WINDOW.HEIGHT WINDOW)))
	  (EXPLORER-SET-CURSOR-POSITION (DEFAULT-SCREEN) CX CY t) 
	  (EXPLORER-RESTORE-CURSOR)
	  t  ; Return t to indicate we have found the confine-to window
	  )
	
	; ELSE check the inferiors of WINDOW
	(LET ((LAST-CHILD (WINDOW.LAST-CHILD  WINDOW))
	      (CHILD      (WINDOW.FIRST-CHILD WINDOW)))
	  
	  (WHEN CHILD
	    (LOOP
	      (WHEN (CHECK-CURSOR-CONFINEMENT CHILD)
		(RETURN T)) ; CHILD was confine-to window so quit checking
	      (WHEN (EQ CHILD LAST-CHILD)
		(RETURN NIL))
	      (SETQ CHILD (WINDOW.NEXT-SIB CHILD)))))))
  (SERVER-TRACE "~%LEAVING CHECK-CURSOR-CONFINEMENT")
  )
))

#!C
; From file CONFIGURE-WINDOW.LISP#> X11M.SERVER; Hotel:
#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; CONFIGURE-WINDOW.#"


(DEFUN CONFIGURE-WINDOW (WINDOW VALUE-MASK LONGS LONG-OFFSET WORDS WORD-OFFSET STATE)
  (DECLARE (TYPE WINDOW WINDOW)
           (TYPE INTEGER VALUE-MASK LONG-OFFSET WORD-OFFSET)
           (TYPE ARRAY LONGS WORDS)
           (TYPE STATE STATE))
  ;; Move the word offset to the start of the values.  The long-offset has already been
  ;; adjusted so we don't need to bother with that.
  (INCF WORD-OFFSET 6)
  (server-trace-value-mask value-mask longs long-offset
			   '#(X Y Width Height Border-Width Sibling Stack-Mode))
  (block RETURN-VALUE
    (LET ((SIBLING NIL)
          (WIDTH  (WINDOW.WIDTH  WINDOW))
          (HEIGHT (WINDOW.HEIGHT WINDOW))
          (BORDER-WIDTH (WINDOW.BWIDTH WINDOW))
          (STACK-MODE STACK-ABOVE)
          ;; The following are constants.  The compiler should do constant-folding so that
          ;; they will really be their values.
          (RESTACK-WIN 0)
          (MOVE-WIN    1)
          (RESIZE-WIN  2)
          (CHANGE-MASK (LOGIOR CW-X CW-Y CW-WIDTH CW-HEIGHT))
          X Y
          BEFORE-X BEFORE-Y
          ACTION T-MASK
          INDEX)
      (DECLARE (TYPE INTEGER WIDTH HEIGHT BORDER-WIDTH
                     RESTACK-WIN MOVE-WIN RESIZE-WIN CHANGE-MASK))
      (macrolet ((GET-CARD16 ()
                   '(PROG1
		      (AREF WORDS WORD-OFFSET)
		      (INCF WORD-OFFSET 2)
		      (INCF LONG-OFFSET))))
        (COND ((zerop value-mask)
	       (return-from return-value nil))
	      #+comment ;; configure window works for input-only windows too - LGO
	      ((and (eql (window.class window) Input-Only)
		    (logtest value-mask (lognot (logior CW-X CW-Y CW-WIDTH CW-HEIGHT
							CW-BORDER-WIDTH))))
               (BAD-MATCH))
              ((AND (LOGTEST CW-SIBLING VALUE-MASK)
                    (NOT (LOGTEST CW-STACK-MODE VALUE-MASK)))
               ;; User specified a sibling but didn't specify stack-mode.
               (BAD-MATCH))
              (T
               ;; I'm not sure about these calculations since the C server has a different
               ;; meaning for the absolute X/Y corner.
               (SETQ X (WINDOW.X WINDOW)
                     Y (WINDOW.Y WINDOW))
               (server-trace "~%In change-w-a: x= ~d y= ~d" x y)
               (SETQ BEFORE-X X
                     BEFORE-Y Y
                     ACTION RESTACK-WIN)
               ;; Now we decide what kind of action we will perform.
               (COND ((AND (OR (LOGTEST CW-X       VALUE-MASK)
                               (LOGTEST CW-Y       VALUE-MASK))
                           (NOT (LOGTEST CW-WIDTH  VALUE-MASK))
                           (NOT (LOGTEST CW-HEIGHT VALUE-MASK)))
                      (WHEN (LOGTEST CW-X VALUE-MASK) (SETQ X (card16->int16 (GET-CARD16))))
                      (WHEN (LOGTEST CW-Y VALUE-MASK) (SETQ Y (card16->int16 (GET-CARD16))))
                      (SETQ ACTION MOVE-WIN))
                     ((OR (LOGTEST CW-X      VALUE-MASK)
                          (LOGTEST CW-Y      VALUE-MASK)
                          (LOGTEST CW-WIDTH  VALUE-MASK)
                          (LOGTEST CW-HEIGHT VALUE-MASK))
                      (WHEN (LOGTEST CW-X      VALUE-MASK) (SETQ X   (card16->int16 (GET-CARD16))))
                      (WHEN (LOGTEST CW-Y      VALUE-MASK) (SETQ Y   (card16->int16 (GET-CARD16))))
                      (WHEN (LOGTEST CW-WIDTH  VALUE-MASK) (SETQ WIDTH  (GET-CARD16)))
                      (WHEN (LOGTEST CW-HEIGHT VALUE-MASK) (SETQ HEIGHT (GET-CARD16)))
                      (SETQ ACTION RESIZE-WIN)))
               (server-trace "~%In change-w-a after checking action: x= ~d y= ~d" x y)
               ;; Turn off the X/Y/WIDTH/HEIGHT bits in and put into T-MASK.
               (SETQ T-MASK (LOGAND VALUE-MASK (LOGNOT CHANGE-MASK)))
               (LOOP
                 (WHEN (ZEROP T-MASK)
                   (RETURN NIL))
                 (SETQ INDEX (ASH 1 (1- (FFS T-MASK)))
                       T-MASK (LOGXOR INDEX T-MASK))
                 (COND
                   ((= INDEX CW-BORDER-WIDTH)
                    (SETQ BORDER-WIDTH (GET-CARD16)))
                   ((= INDEX CW-SIBLING)
                    (PROCESS-VALUES
                      (VALUE-MASK LONGS LONG-OFFSET)
                      ()
                      (((CW-SIBLING WINDOW SIBLING))))
                    (WHEN (OR (NOT (EQ (WINDOW.PARENT SIBLING) (WINDOW.PARENT WINDOW)))
                              (EQ SIBLING WINDOW))
                      (BAD-MATCH)
                      (RETURN-FROM RETURN-VALUE 0)))
                   ((= INDEX CW-STACK-MODE)
                    (PROCESS-VALUES
                      (VALUE-MASK LONGS LONG-OFFSET)
                      ()
                      (((CW-STACK-MODE (CARD8 STACK-ABOVE STACK-BELOW STACK-TOP-IF STACK-BOTTOM-IF
                                              STACK-OPPOSITE) STACK-MODE))))
                    (SERVER-TRACE "~%IN CONFIGURE-WINDOW, STACK-MODE=~D" STACK-MODE))
                   (T
                     (BAD-MATCH)
                     (RETURN-FROM RETURN-VALUE 0))))
               ;; Root can't be reconfigured, so just return.
               (WHEN (NULL (WINDOW.PARENT WINDOW))
                 (RETURN-FROM RETURN-VALUE 1))

               ;; Figure out if the window should be moved.  Doesn't make
               ;; the changed to the window if event sent.
               (SETQ SIBLING (IF (LOGTEST CW-STACK-MODE VALUE-MASK)
                                 (WHERE-DO-I-GO-IN-THE-STACK WINDOW SIBLING X Y
                                                             (WINDOW.OUTSIDE-WIDTH  WINDOW)
                                                             (WINDOW.OUTSIDE-HEIGHT WINDOW)
                                                             STACK-MODE)
			       ;;ELSE 
			       (IF (EQ (WINDOW.NEXT-SIB WINDOW) (WINDOW.FIRST-CHILD (WINDOW.PARENT WINDOW)))
				   ;; Window is last (because Next points back to First) - don't let it change.
				   NIL
				 (WINDOW.NEXT-SIB WINDOW))))
               (WHEN (AND (NOT (WINDOW.OVERRIDE-REDIRECT WINDOW))
                          (LOGTEST SUBSTRUCTURE-REDIRECT-MASK
                                   (WINDOW.ALL-EVENT-MASKS (WINDOW.PARENT WINDOW))))
                 (LET ((EVENT (MAKE-EVENT-CONFIGURE-REQUEST
                                :TYPE CONFIGURE-REQUEST-EVENT
                                :WINDOW WINDOW
                                :PARENT (WINDOW.PARENT WINDOW)
                                :SIBLING (IF (LOGTEST CW-SIBLING VALUE-MASK)
                                             SIBLING
                                             NIL)
                                :X X
                                :Y Y
                                :WIDTH WIDTH
                                :HEIGHT HEIGHT
                                :BORDER-WIDTH BORDER-WIDTH
                                :VALUE-MASK VALUE-MASK)))
                   (WHEN (= (MAYBE-DELIVER-EVENTS-TO-CLIENT (WINDOW.PARENT WINDOW) EVENT 1
                                                   SUBSTRUCTURE-REDIRECT-MASK STATE)
                            1)
                     (RETURN-FROM RETURN-VALUE 1))))
               (SERVER-TRACE "~%IN CONFIGURE-WINDOW, ACTION=~A"
                             (COND ((= ACTION RESIZE-WIN)
                                    :RESIZE-WIN)
                                   ((= ACTION RESTACK-WIN)
                                    :RESTACK-WIN)
                                   ((= ACTION MOVE-WIN)
                                    :MOVE-WIN)))
               (WHEN (= ACTION RESIZE-WIN)
                 (LET ((SIZE-CHANGE (OR (NOT (= (WINDOW.WIDTH  WINDOW) WIDTH))
                                        (NOT (= (WINDOW.HEIGHT WINDOW) HEIGHT)))))
                   (DECLARE (TYPE BOOLEAN SIZE-CHANGE))
                   (WHEN (AND SIZE-CHANGE
                              (LOGTEST RESIZE-REDIRECT-MASK (WINDOW.ALL-EVENT-MASKS WINDOW)))
                     (LET ((EVENT (MAKE-EVENT-RESIZE-REQUEST
                                    :TYPE RESIZE-REQUEST-EVENT
                                    :WINDOW WINDOW
                                    :WIDTH WIDTH
                                    :HEIGHT HEIGHT)))
                       (WHEN (= (MAYBE-DELIVER-EVENTS-TO-CLIENT WINDOW EVENT 1
                                                                RESIZE-REDIRECT-MASK STATE)
                                1)
                         (SETQ WIDTH  (WINDOW.WIDTH  WINDOW)
                               HEIGHT (WINDOW.HEIGHT WINDOW)
                               SIZE-CHANGE NIL))))
                   (WHEN (NOT SIZE-CHANGE)
                     (COND ((LOGTEST (LOGIOR CW-X CW-Y) VALUE-MASK)
                            (SETQ ACTION MOVE-WIN))
                           ((LOGTEST (LOGIOR CW-STACK-MODE CW-BORDER-WIDTH) VALUE-MASK)
                            (SETQ ACTION RESTACK-WIN))
                           (T
                            ;; Really nothing to do.
                            (RETURN-FROM RETURN-VALUE 1))))))
               (when (or (= ACTION RESIZE-WIN) ;; We've already checked whether ther's really a size change.
			 (AND (LOGTEST CW-X VALUE-MASK) (NOT (= X BEFORE-X)))
			 (AND (LOGTEST CW-Y VALUE-MASK) (NOT (= Y BEFORE-Y)))
			 (AND (LOGTEST CW-BORDER-WIDTH VALUE-MASK)
			      (NOT (= BORDER-WIDTH (WINDOW.BWIDTH WINDOW))))
			 (AND (LOGTEST CW-STACK-MODE VALUE-MASK)
			      (NOT (EQ SIBLING
				       ;; In the C code, the next sibling for the last child is NIL.
				       ;; In the Lisp code, the next sibling for the last child
				       ;; is the first child.
				       (IF (EQ (WINDOW.LAST-CHILD (WINDOW.PARENT WINDOW))
					       WINDOW)
					   NIL
                                         ;;ELSE
                                         (WINDOW.NEXT-SIB WINDOW))))))
		 (LET ((EVENT (MAKE-EVENT-CONFIGURE-NOTIFY
				:TYPE CONFIGURE-NOTIFY-EVENT
				:WINDOW WINDOW
				:ABOVE-SIBLING (OR SIBLING NIL)
				:X X
				:Y Y
				:WIDTH WIDTH
				:HEIGHT HEIGHT
				:BORDER-WIDTH BORDER-WIDTH
				:OVERRIDE (WINDOW.OVERRIDE-REDIRECT WINDOW))))
		   (DELIVER-EVENTS WINDOW EVENT 1 NIL)
		   (SERVER-TRACE "~%IN CONFIGURE-WINDOW, AFTER DELIVER-EVENTS")
		   (WHEN (LOGTEST CW-BORDER-WIDTH VALUE-MASK)
		     (IF (= ACTION RESTACK-WIN)
			 (CHANGE-BORDER-WIDTH STATE WINDOW BORDER-WIDTH)
                       ;;ELSE
                       (SETF (WINDOW.BWIDTH WINDOW) BORDER-WIDTH)))
		   (COND ((= ACTION MOVE-WIN)
			  (SERVER-TRACE "~%IN CONFIGURE-WINDOW, moving window")
			  (MOVE-WINDOW STATE WINDOW X Y SIBLING))
			 ((= ACTION RESIZE-WIN)
			  (SERVER-TRACE "~%IN CONFIGURE-WINDOW, sliding and sizing window")
			  (SLIDE-AND-SIZE-WINDOW STATE WINDOW X Y WIDTH HEIGHT SIBLING))
			 ((LOGTEST CW-STACK-MODE VALUE-MASK)
			  (SERVER-TRACE "~%IN CONFIGURE-WINDOW, restacking window")
			  (REFLECT-STACK-CHANGE STATE WINDOW SIBLING)))
		   (WHEN (NOT (= ACTION  RESTACK-WIN))
		     (CHECK-CURSOR-CONFINEMENT WINDOW))
		     )))))))    
  (SERVER-TRACE "~%LEAVING CONFIGURE-WINDOW"))
))
