XPending returns an integer and I was using it in a boolean context which led to unintended blocking. Fix coming.

On 11/07/2012 12:27 PM, Laurent wrote:
Thank you all very much for your answers, they are very helpful.

AFAICT, after some light testing, Jon's code does what I want, but Kevin's one is still blocking. Also, both versions seem to suffer a heavy cost of a few seconds of initialization compared to the basic XNextEvent version.

Laurent


On Wed, Nov 7, 2012 at 7:24 PM, Jon Rafkind <[email protected] <mailto:[email protected]>> wrote:

    Here is some goofy code from my barely-started window manager

     (define (run)
        (define (make-root-node)
          (send (new RootNode (window x-root))
                add-windows
                (get-all-windows)))
        (printf "Welcome to smokey\n")
        (XSetInputFocus x-display None 0 0)
        (let ((events (make-channel)))
          ;; (run-events-thread events)
          (start-x11-event-thread x-display events)
          (let server-loop ((root (make-root-node)))
            (sync (handle-evt events (lambda (event)
                                       ;; (printf "Event ~a\n" event)
                                       (server-loop
                                         (send root handle-event
    event))))))))


    On 11/07/2012 11:13 AM, Kevin Tew wrote:
    yeah I'm putting it in a subdirectory.

    I'm also trying to get XConnectionNumber to work first.

    Kevin

    On 11/07/2012 11:09 AM, Jon Rafkind wrote:
    xlambda :p

    would you like to commit it to the repo?

    On 11/07/2012 10:23 AM, Kevin Tew wrote:
    I've attached my in-progress port of xmonad to x11-racket.

    Kevin

    On 11/07/2012 10:16 AM, Kevin Tew wrote:
    Racket threads are green or user threads, they are not
    scheduled by the operating system.
    Blocking on a socket in XNextEvent blocks the entire Racket VM.


    You need to use XConnectionNumber to get the X socket file
    descriptor number and then create a port that you can sync on
    with Racket's sync functionality.

    I'm not sure how you would create the port using the ffi.

    See
    http://fixunix.com/xwindows/91558-xconnectionnumber-select.html.

    Kevin

    On 11/07/2012 09:58 AM, Laurent wrote:
    Hi,

    I don't know if this issue is due to me, Racket, Xlib FFI or
    Xlib in itself, but I'm struggling with it. Hopefully someone
    knows.

    In a multi-threaded application using Jon's Xlib FFI (
    https://github.com/kazzmir/x11-racket ), I'm using one thread
    for processing X events with XNextEvent, which is a blocking
    call (apparently on a socket).
    I have another thread that listens to a tcp port, and does
    not need to do any X call.

    The problem is that the second thread blocks on 'read' even
    if there is something in the queue to read, unless some X
    event unblocks XNextEvent, in which case both threads run,
    until there is no X event left (and XNextEvent blocks again).

    I have called XInitThreads prior to any other X call to
    enable threads (and the return values says it's ok).

    Any idea anyone?

    Thanks,
    Laurent



    ____________________
       Racket Users list:
       http://lists.racket-lang.org/users



    ____________________
       Racket Users list:
       http://lists.racket-lang.org/users






____________________
  Racket Users list:
  http://lists.racket-lang.org/users

Reply via email to