racket/collects/mred/private/wx/win32/dialog.rkt
Matthew Flatt 9d563c786a racket/gui, win32: fix problem with modal dialogs
Although most events in other frames were blocked, it was
possible to bring other frames to the front and to select
menu items in other frames.
2012-04-05 06:58:53 -06:00

63 lines
1.8 KiB
Racket

#lang racket/base
(require racket/class
(only-in racket/list last)
ffi/unsafe
"../../syntax.rkt"
"../../lock.rkt"
"../common/queue.rkt"
"../common/freeze.rkt"
"../common/dialog.rkt"
"utils.rkt"
"const.rkt"
"types.rkt"
"window.rkt"
"frame.rkt"
"wndclass.rkt")
(provide dialog%)
(define-cstruct _DLGTEMPLATE
([style _DWORD]
[dwExtendedStyle _DWORD]
[cdit _WORD]
[x _short]
[y _short]
[cx _short]
[cy _short]
[menu _short] ; 0
[class _short] ; 0
[title _short])) ; 0
(define DS_MODALFRAME #x80)
(define dialog%
(class (dialog-mixin frame%)
(super-new)
(inherit get-eventspace)
(define/override (create-frame parent label x y w h style)
(let ([hwnd
(CreateDialogIndirectParamW hInstance
(make-DLGTEMPLATE
(bitwise-ior DS_MODALFRAME WS_CAPTION WS_SYSMENU WS_THICKFRAME)
0 0
0 0 w h
0 0 0)
(and parent (send parent get-hwnd))
dialog-proc
0)])
(SetWindowTextW hwnd label)
(let ([x (if (= x -11111) 0 x)]
[y (if (= y -11111) 0 y)])
(MoveWindow hwnd x y w h #t))
hwnd))
(define/override (is-dialog?) #t)
(define/override (direct-show on?)
;; atomic mode
(when on? (super direct-show on?))
(for ([f (in-list (get-top-level-windows (get-eventspace)))])
(send f modal-enable (and (not on?) this)))
(when (not on?) (super direct-show on?)))))