diff --git a/collects/mred/private/wx/gtk/queue.rkt b/collects/mred/private/wx/gtk/queue.rkt index bc6d8c35af..8abda62e6a 100644 --- a/collects/mred/private/wx/gtk/queue.rkt +++ b/collects/mred/private/wx/gtk/queue.rkt @@ -6,7 +6,8 @@ "../../lock.rkt" "../common/queue.rkt" "../common/freeze.rkt" - "const.rkt") + "const.rkt" + "w32.rkt") (provide gtk-start-event-pump @@ -63,6 +64,8 @@ (define-mz scheme_get_fdset (_fun _pointer _int -> _pointer)) (define-mz scheme_fdset (_fun _pointer _int -> _void)) (define-mz scheme_set_wakeup_time (_fun _pointer _double -> _void)) +(define-mz scheme_add_fd_eventmask (_fun _pointer _int -> _void) + #:fail #f) (define (install-wakeup fds) (pre-event-sync #t) @@ -79,16 +82,21 @@ (set! poll-fds (malloc _GPollFD n)) (set! poll-fd-count n) (install-wakeup fds)) - (for ([i (in-range n)]) - (let* ([gfd (ptr-ref poll-fds _GPollFD i)] - [fd (GPollFD-fd gfd)] - [events (GPollFD-events gfd)]) - (when (not (zero? (bitwise-and events POLLIN))) - (scheme_fdset (scheme_get_fdset fds 0) fd)) - (when (not (zero? (bitwise-and events POLLOUT))) - (scheme_fdset (scheme_get_fdset fds 1) fd)) - (when (not (zero? (bitwise-and events (bitwise-ior POLLERR POLLHUP)))) - (scheme_fdset (scheme_get_fdset fds 2) fd))))))) + (if (eq? 'windows (system-type)) + ;; We don't know how to deal with GLib FDs under + ;; Windows, but we should wake up on any Windows event + (scheme_add_fd_eventmask fds QS_ALLINPUT) + ;; Normal FD handling under Unix variants: + (for ([i (in-range n)]) + (let* ([gfd (ptr-ref poll-fds _GPollFD i)] + [fd (GPollFD-fd gfd)] + [events (GPollFD-events gfd)]) + (when (not (zero? (bitwise-and events POLLIN))) + (scheme_fdset (scheme_get_fdset fds 0) fd)) + (when (not (zero? (bitwise-and events POLLOUT))) + (scheme_fdset (scheme_get_fdset fds 1) fd)) + (when (not (zero? (bitwise-and events (bitwise-ior POLLERR POLLHUP)))) + (scheme_fdset (scheme_get_fdset fds 2) fd)))))))) (set-check-queue! gtk_events_pending) (set-queue-wakeup! install-wakeup) diff --git a/collects/mred/private/wx/gtk/w32.rkt b/collects/mred/private/wx/gtk/w32.rkt new file mode 100644 index 0000000000..8e995ba602 --- /dev/null +++ b/collects/mred/private/wx/gtk/w32.rkt @@ -0,0 +1,32 @@ +#lang racket/base + +(provide QS_ALLINPUT) + +(define QS_KEY #x0001) +(define QS_MOUSEMOVE #x0002) +(define QS_MOUSEBUTTON #x0004) +(define QS_POSTMESSAGE #x0008) +(define QS_TIMER #x0010) +(define QS_PAINT #x0020) +(define QS_SENDMESSAGE #x0040) +(define QS_HOTKEY #x0080) +(define QS_ALLPOSTMESSAGE #x0100) +(define QS_RAWINPUT #x0400) +(define QS_MOUSE (bitwise-ior QS_MOUSEMOVE + QS_MOUSEBUTTON)) + +(define QS_INPUT (bitwise-ior QS_MOUSE + QS_KEY + QS_RAWINPUT)) +(define QS_ALLEVENTS (bitwise-ior QS_INPUT + QS_POSTMESSAGE + QS_TIMER + QS_PAINT + QS_HOTKEY)) + +(define QS_ALLINPUT (bitwise-ior QS_INPUT + QS_POSTMESSAGE + QS_TIMER + QS_PAINT + QS_HOTKEY + QS_SENDMESSAGE))