On Thu, Aug 29, 2002 at 10:38:04AM -0400, Raymond Toy wrote:
> >>>>> "Manuel" == Manuel Giraud <[EMAIL PROTECTED]> writes:
> 
>     Manuel> Raymond Toy <[EMAIL PROTECTED]> writes:
>     >> 
>     >> Thanks for this update, but what is supposed to happen here?  On my
>     >> Sparc system, when running cmulisp inside XEmacs, I don't get a
>     >> sigsegv anymore.  That's good.  But now it returns #<XLIB:WINDOW
>     >> unix:0 213910036>.  In fact
>     >> 
>     >> (let ((dpy (ext:open-clx-display)))
>     >> (xlib:input-focus dpy))
>     >> 
>     >> returns
>     >> 
>     >> #<XLIB:WINDOW unix:0 213910036>
>     >> :PARENT
>     >> 
>     >> Is this right?
>     >> 
> 
>     Manuel> Compare the string returned by:
> 
>     Manuel>   (let ((dpy (ext:open-clx-display)))
>     Manuel>     (format nil "0x~X" (xlib:drawable-id (xlib:input-focus dpy))))
> 
> I guess I wasn't clear enough.  The first value from xlib:input-focus
> is XLIB:WINDOW object.  However, in the original question, we were
> returning (nth-value 0 (xlib:input-focus dpy)) and people were getting
> things like :POINTER-ROOT.  With Peter's change, I get the xlib:window
> object.  The second value is :PARENT.  Without his change, I was
> getting a segfault.
> 
> So why does (nth-value 0 ...) give my the window instead of some
> keyword?

Ready for a long story?

In /usr/share/doc/xspecs/proto.txt.gz (debian box) we see:

(appendix A):

GetInputFocus
  1  43                  opcode
  1                      unused
  2  1                   request length


 ->
  1  1                   Reply
  1                      revert-to
     0         None
     1         PointerRoot
     2         Parent
  2  CARD16              sequence number
  4  0                   reply length
  4  WINDOW              focus
     0         None
     1         PointerRoot
  20                     unused


So at offset 8 (1+1+2+4) we will either find a window or 0 or 1.

$ lisp
CMU Common Lisp release x86-linux 3.1.2 18d+ 29 August 2002 build 4186, running on 
mustyr-host
For support see http://www.cons.org/cmucl/support.html Send bug reports to the debian 
BTS.
or to [EMAIL PROTECTED]
type (help) for help, (quit) to exit, and (demo) to see the demos

Loaded subsystems:
    Python 1.0, target Intel x86
    CLOS based on PCL version:  September 16 92 PCL (f)
* (require :cmucl-clx)

; Loading #p"/usr/share/common-lisp/systems/cmucl-clx.system".
(#<FILE: hemlock;keysym-defs> #<FILE: hemlock;key-event>
 #<FILE: hemlock;charmacs> #<FILE: code;clx-ext>)
* (in-package :xlib)

#<The XLIB package, 1515/2372 internal, 560/590 external>

The original source was:
(defun input-focus (display) 
  (declare (type display display)) 
  (declare (clx-values focus revert-to)) 
  (with-buffer-request-and-reply (display *x-getinputfocus* 16 :sizes (8 32)) 
       () 
    (values 
      (or-get 8 (member :none :pointer-root) window) 
      (member8-get 1 :none :pointer-root :parent)))) 

The important part is the 
 (or-get 8 (member :none :pointer-root) window)
stuff. It says that there is either a set of 2 that gives :none or :pointer-root or a 
window at 
the offset 8. (look how at offset 1 we find the :none :pointer-root :parent set).

What does it do?

* (macroexpand '(or-get 8 (member :none :pointer-root) window))

(LET ((#:G1271 (READ-CARD32 8)))
  (MACROLET ((READ-CARD32 (INDEX)
               INDEX
               '#:G1271)
             (READ-CARD29 (INDEX)
               INDEX
               '#:G1271))
    (LET ((#:G1273
           (LET ((#:G1272 (READ-CARD29 8)))
             (DECLARE (TYPE (INTEGER 0 (2)) #:G1272))
             (TYPE-CHECK #:G1272 '(INTEGER 0 (2)))
             (SVREF '#(:NONE :POINTER-ROOT) #:G1272))))
      (IF #:G1273 #:G1273 (COND ((LOOKUP-WINDOW %BUFFER (READ-CARD29 8))))))))

Notice that it first tries to get the [01] case. Notice the type-check. Then
notice the svref without checking first if this could be a window.
So what does it read?

* (macroexpand '(with-buffer-request-and-reply (display *x-getinputfocus* 16 :sizes (8 
32)) 
       () 
    (values 
      (or-get 8 (member :none :pointer-root) window) 
      (member8-get 1 :none :pointer-root :parent)))) 
 
(LET ((.DISPLAY. DISPLAY) (.PENDING-COMMAND. NIL) (.REPLY-BUFFER. NIL)) 
  (DECLARE (TYPE DISPLAY .DISPLAY.) 
           (TYPE (OR NULL PENDING-COMMAND) .PENDING-COMMAND.) 
           (TYPE (OR NULL REPLY-BUFFER) .REPLY-BUFFER.)) 
  (UNWIND-PROTECT 
      (PROGN 
       (WITH-BUFFER (.DISPLAY.) 
                    (SETQ .PENDING-COMMAND. (START-PENDING-COMMAND .DISPLAY.)) 
                    (WITHOUT-ABORTS 
                     (WITH-BUFFER-REQUEST-INTERNAL 
                      (.DISPLAY. *X-GETINPUTFOCUS*))) 
                    (BUFFER-FORCE-OUTPUT .DISPLAY.) 
                    (DISPLAY-INVOKE-AFTER-FUNCTION .DISPLAY.)) 
       (SETQ .REPLY-BUFFER. (READ-REPLY .DISPLAY. .PENDING-COMMAND.)) 
       (WITH-BUFFER-INPUT (.REPLY-BUFFER. :DISPLAY .DISPLAY. :SIZES (8 32)) 
                          NIL 
                          (VALUES 
                           (OR-GET 8 (MEMBER :NONE :POINTER-ROOT) WINDOW) 
                           (MEMBER8-GET 1 :NONE :POINTER-ROOT :PARENT)))) 
    (WHEN .REPLY-BUFFER. (DEALLOCATE-REPLY-BUFFER .REPLY-BUFFER.)) 
    (WHEN .PENDING-COMMAND. 
      (STOP-PENDING-COMMAND .DISPLAY. .PENDING-COMMAND.)))) 
T 
* (defun testo (display)
(LET ((.DISPLAY. DISPLAY) (.PENDING-COMMAND. NIL) (.REPLY-BUFFER. NIL))
  (DECLARE (TYPE DISPLAY .DISPLAY.)
           (TYPE (OR NULL PENDING-COMMAND) .PENDING-COMMAND.)
           (TYPE (OR NULL REPLY-BUFFER) .REPLY-BUFFER.))
  (UNWIND-PROTECT
      (PROGN
       (WITH-BUFFER (.DISPLAY.)
                    (SETQ .PENDING-COMMAND. (START-PENDING-COMMAND .DISPLAY.))
                    (WITHOUT-ABORTS
                     (WITH-BUFFER-REQUEST-INTERNAL
                      (.DISPLAY. *X-GETINPUTFOCUS*)))
                    (BUFFER-FORCE-OUTPUT .DISPLAY.)
                    (DISPLAY-INVOKE-AFTER-FUNCTION .DISPLAY.))
       (SETQ .REPLY-BUFFER. (READ-REPLY .DISPLAY. .PENDING-COMMAND.))
       (WITH-BUFFER-INPUT (.REPLY-BUFFER. :DISPLAY .DISPLAY. :SIZES (8 32))
                          NIL
                          (VALUES
                           (LET ((G1271 (READ-CARD32 8)))
  (MACROLET ((READ-CARD32 (INDEX)
               INDEX
               'G1271)
             (READ-CARD29 (INDEX)
               INDEX
               'G1271))
    (LET ((G1273
           (LET ((G1272 (READ-CARD29 8)))
             (DECLARE (TYPE (INTEGER 0 (2)) G1272))
(format t "read got ~S~&" G1271)
             (TYPE-CHECK G1272 '(INTEGER 0 (2)))
             (SVREF '#(:NONE :POINTER-ROOT) G1272))))
(format t "let returned: ~S~&" G1273)
      (IF G1273 G1273 (COND ((LOOKUP-WINDOW %BUFFER (READ-CARD29 8))))))))
                           (MEMBER8-GET 1 :NONE :POINTER-ROOT :PARENT))))
    (WHEN .REPLY-BUFFER. (DEALLOCATE-REPLY-BUFFER .REPLY-BUFFER.))
    (WHEN .PENDING-COMMAND.
      (STOP-PENDING-COMMAND .DISPLAY. .PENDING-COMMAND.)))))

TESTO
* (defvar *disp* (ext:open-clx-display)) 
 
*DISP* 
* (testo *disp*) 
read got 31457282 
 
31457282 isn't a (INTEGER 0 (2)) 
  
Before this would still work, not it just gives me an error. :-)

So the hack seems to be to check for a window first. The 'correct' thing seems
to be to check if the value is plausible for the datatype we want. But that
requires a lot of macro-hacking...

Groetjes, Peter

-- 
It's logic Jim, but not as we know it. | [EMAIL PROTECTED]
"God, root, what is difference?" - Pitr| http://people.debian.org/~pvaneynd/
"God is more forgiving." - Dave Aronson| http://users.belgacom.net/bn110523/

-- Attached file included as plaintext by Listar --

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.7 (GNU/Linux)

iD8DBQE9bkvT11ldN0tyliURApJjAJ9HfvLpwRWcyRUNjquUctoBiW5lkgCgqn/X
fb0K0CUm07onUrLOjqBG+eo=
=G62R
-----END PGP SIGNATURE-----



Reply via email to