diff --git a/collects/drracket/private/eb.rkt b/collects/drracket/private/eb.rkt index 936245d2ce..b39aed2731 100644 --- a/collects/drracket/private/eb.rkt +++ b/collects/drracket/private/eb.rkt @@ -56,7 +56,7 @@ (with-handlers ([exn:fail? (lambda (x) (printf "~s\n" (exn-message x)) #f)]) - (let ([b (make-object bitmap% (collection-file-path "recycle.gif" "icons"))]) + (let ([b (make-object bitmap% (collection-file-path "recycle.png" "icons"))]) (cond [(send b ok?) (let ([gbdc (make-object bitmap-dc% b)] diff --git a/collects/mred/private/mrtextfield.rkt b/collects/mred/private/mrtextfield.rkt index 400acb4629..c3747db11f 100644 --- a/collects/mred/private/mrtextfield.rkt +++ b/collects/mred/private/mrtextfield.rkt @@ -124,14 +124,6 @@ (send (as-entry (lambda () (mred->wx this))) command (make-object wx:control-event% 'text-field)))]) - (override - [on-subwindow-event (lambda (w e) - (and (send e button-down?) - (let-values ([(cw) (send (mred->wx this) get-canvas-width)]) - (and ((send e get-x) . >= . (- cw side-combo-width)) - (begin - (on-popup e) - #t)))))]) (private-field [menu (new popup-menu% [font font])]) (sequence diff --git a/collects/mred/private/wx/cocoa/canvas.rkt b/collects/mred/private/wx/cocoa/canvas.rkt index 644cb8bff6..072401c969 100644 --- a/collects/mred/private/wx/cocoa/canvas.rkt +++ b/collects/mred/private/wx/cocoa/canvas.rkt @@ -11,6 +11,7 @@ "window.rkt" "dc.rkt" "queue.rkt" + "item.rkt" "../common/event.rkt" "../common/queue.rkt" "../../syntax.rkt" @@ -21,7 +22,9 @@ ;; ---------------------------------------- -(import-class NSView NSGraphicsContext NSScroller) +(import-class NSView NSGraphicsContext NSScroller NSComboBox) + +(import-protocol NSComboBoxDelegate) (define-objc-class MyView NSView #:mixins (FocusResponder KeyMouseResponder) @@ -52,6 +55,38 @@ (-a _void (onVScroll: [_id scroller]) (when wx (send wx do-scroll 'vertical scroller)))) +(define-objc-class MyComboBox NSComboBox + #:mixins (FocusResponder KeyMouseResponder) + #:protocols (NSComboBoxDelegate) + [wx] + (-a _void (drawRect: [_NSRect r]) + (super-tell #:type _void drawRect: #:type _NSRect r) + (unless (send wx during-menu-click?) + (let ([bg (send wx get-canvas-background-for-clearing)]) + (when bg + (let ([ctx (tell NSGraphicsContext currentContext)]) + (tellv ctx saveGraphicsState) + (let ([cg (tell #:type _CGContextRef ctx graphicsPort)] + [adj (lambda (v) (/ v 255.0))]) + (CGContextSetRGBFillColor cg + (adj (color-red bg)) + (adj (color-blue bg)) + (adj (color-green bg)) + 1.0) + (CGContextFillRect cg (make-NSRect (make-NSPoint 0 0) + (make-NSSize 32000 32000)))) + (tellv ctx restoreGraphicsState)))) + (send wx queue-paint) + ;; ensure that `nextEventMatchingMask:' returns + (post-dummy-event))) + (-a _void (comboBoxWillPopUp: [_id notification]) + (send wx starting-combo)) + (-a _void (comboBoxWillDismiss: [_id notification]) + (send wx ending-combo)) + (-a _void (viewWillMoveToWindow: [_id w]) + (when wx + (queue-window-event wx (lambda () (send wx fix-dc)))))) + (define-struct scroller (cocoa [range #:mutable] [page #:mutable])) (define scroll-width (tell #:type _CGFloat NSScroller scrollerWidth)) @@ -66,7 +101,6 @@ (inherit get-cocoa get-eventspace make-graphics-context - get-client-size is-shown-to-root? move get-x get-y on-size @@ -103,10 +137,13 @@ (set! refresh-after-drawing? #f) (refresh))))))) (define/override (refresh) + ;; can be called from any thread, including the event-pump thread (tellv content-cocoa setNeedsDisplay: #:type _BOOL #t)) (define/override (get-cocoa-content) content-cocoa) + (define is-combo? (memq 'combo style)) + (super-new [parent parent] [cocoa @@ -118,14 +155,20 @@ (define cocoa (get-cocoa)) - (define content-cocoa - (as-objc-allocation - (tell (tell MyView alloc) - initWithFrame: #:type _NSRect (make-NSRect (make-NSPoint 0 0) - (make-NSSize w h))))) + (define content-cocoa + (let ([r (make-NSRect (make-NSPoint 0 0) + (make-NSSize w h))]) + (as-objc-allocation + (tell (tell (if is-combo? MyComboBox MyView) alloc) + initWithFrame: #:type _NSRect r)))) (tell #:type _void cocoa addSubview: content-cocoa) (set-ivar! content-cocoa wx this) + (when is-combo? + (tellv content-cocoa setEditable: #:type _BOOL #f) + (tellv content-cocoa setDelegate: content-cocoa) + (install-control-font content-cocoa #f)) + (define dc (make-object dc% (make-graphics-context) 0 0 10 10)) (queue-paint) @@ -139,7 +182,16 @@ [xb (box 0)] [yb (box 0)]) (get-client-size xb yb) - (send dc reset-bounds (NSPoint-x p) (NSPoint-y p) (unbox xb) (unbox yb)))) + (send dc reset-bounds + (+ (NSPoint-x p) (if is-combo? 2 0)) + (- (NSPoint-y p) (if is-combo? 22 0)) + (max 1 (- (unbox xb) (if is-combo? 22 0))) + (unbox yb)))) + + (define/override (get-client-size xb yb) + (super get-client-size xb yb) + (when is-combo? + (set-box! yb (max 0 (- (unbox yb) 5))))) (define/override (maybe-register-as-child parent on?) (register-as-child parent on?)) @@ -330,7 +382,9 @@ (scroller-page scroller) 1)])) - (define/public (append-combo-item str) #f) + (define/public (append-combo-item str) + (tellv content-cocoa addItemWithObjectValue: #:type _NSString str) + #t) (define/public (on-combo-select i) (void)) (define bg-col (make-object color% "white")) @@ -383,9 +437,40 @@ (void))) (define/public (on-scroll e) (void)) - (define/override (wants-all-events?) + (define/override (definitely-wants-event? e) ;; Called in Cocoa event-handling mode - #t) + (or (not is-combo?) + (e . is-a? . key-event%) + (not (send e button-down? 'left)) + (not (on-menu-click? e)))) + + (define/private (on-menu-click? e) + ;; Called in Cocoa event-handling mode + (let ([xb (box 0)] + [yb (box 0)]) + (get-client-size xb yb) + ((send e get-x) . > . (- (unbox xb) 22)))) + + (define/public (starting-combo) + (set! in-menu-click? #t) + (tellv content-cocoa setStringValue: #:type _NSString current-text)) + + (define/public (ending-combo) + (set! in-menu-click? #f) + (let ([pos (tell #:type _NSInteger content-cocoa indexOfSelectedItem)]) + (when (pos . > . -1) + (queue-window-event this (lambda () (on-combo-select pos))))) + (refresh)) + + (define current-text "") + (define/public (set-combo-text t) + (set! current-text t)) + + (define in-menu-click? #f) + + (define/public (during-menu-click?) + ;; Called in Cocoa event-handling mode + in-menu-click?) (def/public-unimplemented set-background-to-gray) (def/public-unimplemented scroll) diff --git a/collects/mred/private/wx/cocoa/item.rkt b/collects/mred/private/wx/cocoa/item.rkt index ec6e7074f8..54c3d34cdc 100644 --- a/collects/mred/private/wx/cocoa/item.rkt +++ b/collects/mred/private/wx/cocoa/item.rkt @@ -9,12 +9,16 @@ (unsafe!) (objc-unsafe!) -(provide item%) +(provide item% + install-control-font) (import-class NSFont) (define sys-font (tell NSFont systemFontOfSize: #:type _CGFloat 13)) +(define (install-control-font cocoa font) + (tellv cocoa setFont: sys-font)) + (defclass item% window% (inherit get-cocoa) @@ -38,4 +42,4 @@ (super-new) (define/public (init-font cocoa font) - (tellv cocoa setFont: sys-font))) + (install-control-font cocoa font))) diff --git a/collects/mred/private/wx/cocoa/list-box.rkt b/collects/mred/private/wx/cocoa/list-box.rkt index fa855e309e..c02bc1c014 100644 --- a/collects/mred/private/wx/cocoa/list-box.rkt +++ b/collects/mred/private/wx/cocoa/list-box.rkt @@ -85,7 +85,8 @@ (super-new [parent parent] [cocoa cocoa] - [no-show? (memq 'deleted style)]) + [no-show? (memq 'deleted style)] + [callback cb]) (set-size 0 0 32 50) ; (tellv content-cocoa sizeToFit) diff --git a/collects/mred/private/wx/cocoa/message.rkt b/collects/mred/private/wx/cocoa/message.rkt index 1d1f752684..6a09103fa8 100644 --- a/collects/mred/private/wx/cocoa/message.rkt +++ b/collects/mred/private/wx/cocoa/message.rkt @@ -34,7 +34,7 @@ (init parent label x y style font) - (inherit get-cocoa) + (inherit get-cocoa init-font) (super-new [parent parent] [cocoa (let* ([label (cond @@ -64,6 +64,7 @@ (tell (tell NSImageView alloc) init)))]) (cond [(string? label) + (init-font cocoa font) (tellv cocoa setSelectable: #:type _BOOL #f) (tellv cocoa setEditable: #:type _BOOL #f) (tellv cocoa setBordered: #:type _BOOL #f) diff --git a/collects/mred/private/wx/cocoa/procs.rkt b/collects/mred/private/wx/cocoa/procs.rkt index 1317a4c1bd..da4f6ec169 100644 --- a/collects/mred/private/wx/cocoa/procs.rkt +++ b/collects/mred/private/wx/cocoa/procs.rkt @@ -94,7 +94,7 @@ (define-unimplemented draw-tab) (define-unimplemented draw-tab-base) (define-unimplemented key-symbol-to-integer) -(define (get-control-font-size) 14) +(define (get-control-font-size) 13) (define-unimplemented cancel-quit) (define-unimplemented fill-private-color) (define (flush-display) (void)) diff --git a/collects/mred/private/wx/cocoa/radio-box.rkt b/collects/mred/private/wx/cocoa/radio-box.rkt index cb082d63fc..0437014ca8 100644 --- a/collects/mred/private/wx/cocoa/radio-box.rkt +++ b/collects/mred/private/wx/cocoa/radio-box.rkt @@ -64,7 +64,7 @@ val style font) - (inherit get-cocoa set-focus) + (inherit get-cocoa set-focus init-font) (define horiz? (and (memq 'horizontal style) #t)) @@ -91,9 +91,11 @@ (begin (tellv button setTitle: #:type _NSString "") (set-ivar! button img (bitmap->image label))) - (tellv button setTitleWithMnemonic: #:type _NSString (if (string? label) - label - ""))) + (begin + (init-font button font) + (tellv button setTitleWithMnemonic: #:type _NSString (if (string? label) + label + "")))) (tellv button setButtonType: #:type _int NSRadioButton))) (tellv cocoa sizeToFit) (tellv cocoa setTarget: cocoa) diff --git a/collects/mred/private/wx/cocoa/window.rkt b/collects/mred/private/wx/cocoa/window.rkt index 06a6491f8e..aa967de4da 100644 --- a/collects/mred/private/wx/cocoa/window.rkt +++ b/collects/mred/private/wx/cocoa/window.rkt @@ -58,12 +58,12 @@ (let loop ([hit hit]) (when hit (if (tell #:type _BOOL hit respondsToSelector: #:type _SEL (selector doMouseMoved:)) - (tell hit doMouseMoved: event) + (unless (tell #:type _BOOL hit doMouseMoved: event) + (super-tell #:type _void mouseMoved: event)) (loop (tell hit superview))))))] - [-a _void (doMouseMoved: [_id event]) + [-a _BOOL (doMouseMoved: [_id event]) ;; called by mouseMoved: - (unless (do-mouse-event wx event 'motion #f #f #f) - (super-tell #:type _void mouseMoved: event))] + (do-mouse-event wx event 'motion #f #f #f)] [-a _void (mouseEntered: [_id event]) (unless (do-mouse-event wx event 'enter #f #f #f) (super-tell #:type _void mouseEntered: event))] @@ -116,7 +116,7 @@ [y (->long y)] [time-stamp (->long (* (tell #:type _double event timestamp) 1000.0))] [caps-down (bit? modifiers NSAlphaShiftKeyMask)])]) - (if (send wx wants-all-events?) + (if (send wx definitely-wants-event? k) (begin (queue-window-event wx (lambda () (send wx dispatch-on-char k #f))) @@ -143,7 +143,7 @@ [alt-down (bit? modifiers NSAlternateKeyMask)] [time-stamp (->long (* (tell #:type _double event timestamp) 1000.0))] [caps-down (bit? modifiers NSAlphaShiftKeyMask)])]) - (if (send wx wants-all-events?) + (if (send wx definitely-wants-event? m) (begin (queue-window-event wx (lambda () (send wx dispatch-on-event m #f))) @@ -261,6 +261,7 @@ (set-box! h (->long (NSSize-height s))))) (define/public (get-client-size w h) + ;; May be called in Cocoa event-handling mode (let ([s (NSRect-size (tell #:type _NSRect (get-cocoa-content) bounds))]) (set-box! w (->long (NSSize-width s))) (set-box! h (->long (NSSize-height s))))) @@ -281,7 +282,7 @@ (define/public (on-set-focus) (void)) (define/public (on-kill-focus) (void)) - (define/public (wants-all-events?) + (define/public (definitely-wants-event? e) ;; Called in Cocoa event-handling mode #f) diff --git a/collects/mred/private/wx/common/freeze.rkt b/collects/mred/private/wx/common/freeze.rkt index 0d1a7965ca..30505b2b51 100644 --- a/collects/mred/private/wx/common/freeze.rkt +++ b/collects/mred/private/wx/common/freeze.rkt @@ -15,7 +15,7 @@ (define-mz scheme_restore_on_atomic_timeout (_fun _pointer -> _pointer) #:c-id scheme_set_on_atomic_timeout) -(define freezer-box (make-parameter null)) +(define freezer-box (make-parameter #f)) (define freeze-tag (make-continuation-prompt-tag)) ;; Runs `thunk' atomically, but cooperates with @@ -70,6 +70,10 @@ (let ([b (freezer-box)]) (cond [(not b) + ;; Ideally, this would count as an error that we can fix. It seems that we + ;; don't always have enough control to use the right eventspace with an + ;; unfreeze point, though, so just bail out with the default. + #; (internal-error (format "constrained-reply not within an unfreeze point for ~s" thunk)) default] diff --git a/collects/mred/private/wx/gtk/canvas.rkt b/collects/mred/private/wx/gtk/canvas.rkt index ebed237152..d8057d8372 100644 --- a/collects/mred/private/wx/gtk/canvas.rkt +++ b/collects/mred/private/wx/gtk/canvas.rkt @@ -353,6 +353,8 @@ (queue-window-event this (lambda () (on-combo-select i)))))) (define/public (on-combo-select i) (void)) + (define/public (set-combo-text t) (void)) + (def/public-unimplemented set-background-to-gray) (define/public (do-scroll direction) diff --git a/collects/mred/private/wx/gtk/client-window.rkt b/collects/mred/private/wx/gtk/client-window.rkt index 5a5e50b76f..9fbfe58672 100644 --- a/collects/mred/private/wx/gtk/client-window.rkt +++ b/collects/mred/private/wx/gtk/client-window.rkt @@ -17,7 +17,7 @@ (_fun _GtkWidget _GtkAllocation-pointer -> _gboolean) (lambda (gtk a) (let ([wx (gtk->wx gtk)]) - (send wx remember-client-size + (send wx save-client-size (GtkAllocation-x a) (GtkAllocation-y a) (GtkAllocation-width a) @@ -28,6 +28,8 @@ (class % (init client-gtk) + (inherit remember-client-size) + (connect-size-allocate client-gtk) (define client-w 0) @@ -37,12 +39,13 @@ (define/public (on-client-size w h) (void)) - (define/public (remember-client-size x y w h) + (define/public (save-client-size x y w h) ;; Called in the Gtk event-loop thread (set! client-x x) (set! client-y y) (set! client-w w) (set! client-h h) + (remember-client-size w h) (queue-window-event this (lambda () (internal-on-client-size w h) (on-client-size w h)))) @@ -50,6 +53,10 @@ (define/public (internal-on-client-size w h) (void)) + (define/override (tentative-client-size w h) + (set! client-w w) + (set! client-h h)) + (define/override (get-client-size xb yb) (set-box! xb client-w) (set-box! yb client-h)) diff --git a/collects/mred/private/wx/gtk/const.rkt b/collects/mred/private/wx/gtk/const.rkt index 5a6b8d6d5b..5a3edc96d3 100644 --- a/collects/mred/private/wx/gtk/const.rkt +++ b/collects/mred/private/wx/gtk/const.rkt @@ -120,3 +120,13 @@ (define GDK_WINDOW_STATE_FULLSCREEN (1 . << . 4)) (define GDK_WINDOW_STATE_ABOVE (1 . << . 5)) (define GDK_WINDOW_STATE_BELOW (1 . << . 6)) + +(define GDK_HINT_POS (1 . << . 0)) +(define GDK_HINT_MIN_SIZE (1 . << . 1)) +(define GDK_HINT_MAX_SIZE (1 . << . 2)) +(define GDK_HINT_BASE_SIZE (1 . << . 3)) +(define GDK_HINT_ASPECT (1 . << . 4)) +(define GDK_HINT_RESIZE_INC (1 . << . 5)) +(define GDK_HINT_WIN_GRAVITY (1 . << . 6)) +(define GDK_HINT_USER_POS (1 . << . 7)) +(define GDK_HINT_USER_SIZE (1 . << . 8)) diff --git a/collects/mred/private/wx/gtk/frame.rkt b/collects/mred/private/wx/gtk/frame.rkt index 2c6b2ac53d..1ec3356853 100644 --- a/collects/mred/private/wx/gtk/frame.rkt +++ b/collects/mred/private/wx/gtk/frame.rkt @@ -36,6 +36,22 @@ -> (values x y))) (define-gtk gtk_window_set_gravity (_fun _GtkWindow _int -> _void)) +(define-gtk gtk_window_resize (_fun _GtkWidget _int _int -> _void)) + +(define-cstruct _GdkGeometry ([min_width _int] + [min_height _int] + [max_width _int] + [max_height _int] + [base_width _int] + [base_height _int] + [width_inc _int] + [height_inc _int] + [min_aspect _double] + [max_aspect _double] + [win_gravity _int])) +(define-gtk gtk_window_set_geometry_hints (_fun _GtkWindow _GtkWidget _GdkGeometry-pointer _int -> _void)) + + (define (handle-delete gtk) (let ([wx (gtk->wx gtk)]) (queue-window-event wx (lambda () @@ -45,14 +61,14 @@ (function-ptr handle-delete (_fun #:atomic? #t _GtkWidget -> _gboolean))) -(define (handle-configure gtk) - (let ([wx (gtk->wx gtk)]) - (queue-window-event wx (lambda () - (send wx on-size 0 0))) +(define-signal-handler connect-configure "configure-event" + (_fun _GtkWidget _GdkEventConfigure-pointer -> _gboolean) + (lambda (gtk a) + (let ([wx (gtk->wx gtk)]) + (send wx remember-size + (GdkEventConfigure-width a) + (GdkEventConfigure-height a))) #f)) -(define handle_configure - (function-ptr handle-configure - (_fun #:atomic? #t _GtkWidget -> _gboolean))) (define-cstruct _GdkEventWindowState ([type _int] [window _GtkWindow] @@ -80,7 +96,7 @@ (inherit get-gtk set-size on-size pre-on-char pre-on-event - get-client-delta) + get-client-delta get-size) (define gtk (gtk_window_new GTK_WINDOW_TOPLEVEL)) (when (memq 'no-caption style) @@ -105,7 +121,7 @@ (set-size x y w h) (g_signal_connect gtk "delete_event" handle_delete) - ;; (g_signal_connect gtk "configure_event" handle_configure) + (connect-configure gtk) (when label (gtk_window_set_title gtk label)) @@ -121,8 +137,21 @@ (gtk_box_pack_start vbox-gtk mb-gtk #t #t 0) (gtk_widget_show mb-gtk))) + (define saved-enforcements (vector 0 0 -1 -1)) + (define/public (enforce-size min-x min-y max-x max-y inc-x inc-y) - (void)) + (define (to-max v) (if (= v -1) #x3FFFFFFF v)) + (set! saved-enforcements (vector min-x min-y max-x max-y)) + (gtk_window_set_geometry_hints gtk gtk + (make-GdkGeometry min-x min-y + (to-max max-x) (to-max max-y) + 0 0 + inc-x inc-y + 0.0 0.0 + 0) + (bitwise-ior GDK_HINT_MIN_SIZE + GDK_HINT_MAX_SIZE + GDK_HINT_RESIZE_INC))) (define/override (get-top-win) this) @@ -149,15 +178,22 @@ (quotient (- sh fh) 2) -11111))))) - (define/override (set-top-position x y) + (define/public (set-top-position x y) + (when (and (vector? saved-enforcements) + (or (x . < . (vector-ref saved-enforcements 0)) + (let ([max-x (vector-ref saved-enforcements 1)]) + (and (max-x . > . -1) (x . > . max-x))) + (y . < . (vector-ref saved-enforcements 2)) + (let ([max-y (vector-ref saved-enforcements 3)]) + (and (max-y . > . -1) (y . > . max-y))))) + (enforce-size 0 0 -1 -1 1 1)) (gtk_widget_set_uposition gtk (if (= x -11111) -2 x) (if (= y -11111) -2 y))) - (define/override (get-size wb hb) - (let-values ([(w h) (gtk_window_get_size gtk)]) - (set-box! wb w) - (set-box! hb h))) + (define/override (set-top-size x y w h) + (set-top-position x y) + (gtk_window_resize gtk w h)) (define/override (direct-show on?) (super direct-show on?) diff --git a/collects/mred/private/wx/gtk/subtype.rkt b/collects/mred/private/wx/gtk/subtype.rkt deleted file mode 100644 index 33304459b0..0000000000 --- a/collects/mred/private/wx/gtk/subtype.rkt +++ /dev/null @@ -1,148 +0,0 @@ -#lang racket/base -(require ffi/unsafe - ffi/unsafe/alloc - "utils.rkt" - "const.rkt" - "types.rkt") - -(provide make-subclass - GtkWidgetClass-expose_event - set-GtkWidgetClass-expose_event!) - -(define _GTypeClass _GType) - -(define-cstruct _GObjectClass ([g_type_class _GTypeClass] - [construct_properties _pointer] - [constructor _fpointer] - [set_property _fpointer] - [get_property _fpointer] - [dispose _fpointer] - [finalize _fpointer] - [dispatch_properties _fpointer] - [notify _fpointer] - [constructed _fpointer] - [pdummy1 _pointer] - [pdummy2 _pointer] - [pdummy3 _pointer] - [pdummy4 _pointer] - [pdummy5 _pointer] - [pdummy6 _pointer] - [pdummy7 _pointer])) - -(define-cstruct _GtkObjectClass ([parent_class _GObjectClass] - [set_arg _fpointer] - [get_arg _fpointer] - [destroy _fpointer])) - -(define-cstruct _GtkWidgetClass ([parent_class _GtkObjectClass] - [activate_signal _uint] - [set_scroll_adjustments_signal _uint] - [dispatch_child_properties_changed _fpointer] - [show _fpointer] - [show_all _fpointer] - [hide _fpointer] - [hide_all _fpointer] - [map _fpointer] - [unmap _fpointer] - [realize _fpointer] - [unrealize _fpointer] - [size_request _fpointer] - [size_allocate _fpointer] - [parent_set _fpointer] - [hierarchy_changed _fpointer] - [style_set _fpointer] - [direction_changed _fpointer] - [grab_notify _fpointer] - [child_notify _fpointer] - [mnemonic_activate _fpointer] - [grab_focus _fpointer] - [focus _fpointer] - [event _fpointer] - [button_press_event _fpointer] - [button_release_event _fpointer] - [scroll_event _fpointer] - [motion_notify_event _fpointer] - [delete_event _fpointer] - [destroy_event _fpointer] - [whatever _pointer] ;;; HACK!!!!!! Something is wrong so that expose shows up in the wrong place - [expose_event (_fun #:atomic? #t _GtkWidget _GdkEventExpose -> _void)] - [key_press_event _fpointer] - [key_release_event _fpointer] - [enter_notify_event _fpointer] - [leave_notify_event _fpointer] - [configure_event _fpointer] - [focus_in_event _fpointer] - [focus_out_event _fpointer] - [map_event _fpointer] - [unmap_event _fpointer] - [property_notify_event _fpointer] - [selection_clear_event _fpointer] - [selection_request_event _fpointer] - [selection_notify_event _fpointer] - [proximity_in_event _fpointer] - [proximity_out_event _fpointer] - [visibility_notify_event _fpointer] - [client_event _fpointer] - [no_expose_event _fpointer] - [window_state_event _fpointer] - [selection_get _fpointer] - [selection_received _fpointer] - [drag_begin _fpointer] - [drag_end _fpointer] - [drag_data_get _fpointer] - [drag_data_delete _fpointer] - [drag_leave _fpointer] - [drag_motion _fpointer] - [drag_drop _fpointer] - [drag_data_received _fpointer] - [popup_menu _fpointer] - [show_help _fpointer] - [get_accessible _fpointer] - [screen_changed _fpointer] - [can_activate_accel _fpointer] - [grab_broken_event _fpointer] - [composited_changed _fpointer] - [query_tooltip _fpointer] - [gtk_reserved5 _fpointer] - [gtk_reserved6 _fpointer] - [gtk_reserved7 _fpointer])) - -(define-cstruct _GTypeQuery ([type _GType] - [type_name _string] - [class_size _uint] - [instance_size _uint])) - -(define-gobj g_type_query (_fun _GType _GTypeQuery-pointer -> _void)) - -(define-cstruct _GTypeInfo ([class_size _uint16] - [base_init _fpointer] - [base_finalize _fpointer] - [class_init (_fun #:atomic? #t _GtkWidgetClass-pointer _pointer -> _void)] - [class_finalize _fpointer] - [class_data _pointer] - [instance_size _uint16] - [n_preallocs _uint16] - [instance_init _fpointer] - [value_table _pointer])) - -(define-gobj g_type_register_static (_fun _GType _string _GTypeInfo-pointer _int -> _GType)) - -(define saves null) - -(define (make-subclass base-type name class-init-func) - (when class-init-func - (set! saves (cons class-init-func saves))) - (let ([q (make-GTypeQuery 0 #f 0 0)]) - (g_type_query base-type q) - (let ([ti (make-GTypeInfo (GTypeQuery-class_size q) - #f - #f - class-init-func - #f - #f - (GTypeQuery-instance_size q) - 0 - #f - #f)]) - (g_type_register_static base-type name ti 0)))) - diff --git a/collects/mred/private/wx/gtk/types.rkt b/collects/mred/private/wx/gtk/types.rkt index 20d9797da4..783f3a047b 100644 --- a/collects/mred/private/wx/gtk/types.rkt +++ b/collects/mred/private/wx/gtk/types.rkt @@ -19,7 +19,9 @@ _GdkEventMotion _GdkEventMotion-pointer (struct-out GdkEventMotion) _GdkEventCrossing _GdkEventCrossing-pointer - (struct-out GdkEventCrossing)) + (struct-out GdkEventCrossing) + _GdkEventConfigure _GdkEventConfigure-pointer + (struct-out GdkEventConfigure)) (define _GType _long) @@ -89,3 +91,11 @@ [detail _int] [focus _gboolean] [state _uint])) + +(define-cstruct _GdkEventConfigure ([type _GdkEventType] + [window _GdkWindow] + [send_event _byte] + [x _int] + [y _int] + [width _int] + [height _int])) diff --git a/collects/mred/private/wx/gtk/window.rkt b/collects/mred/private/wx/gtk/window.rkt index d52a0dd438..42127c985f 100644 --- a/collects/mred/private/wx/gtk/window.rkt +++ b/collects/mred/private/wx/gtk/window.rkt @@ -210,6 +210,32 @@ ;; ---------------------------------------- +(define (internal-error str) + (log-error + (apply string-append + (format "internal error: ~a" str) + (append + (for/list ([c (continuation-mark-set->context (current-continuation-marks))]) + (let ([name (car c)] + [loc (cdr c)]) + (cond + [loc + (string-append + "\n" + (cond + [(srcloc-line loc) + (format "~a:~a:~a" + (srcloc-source loc) + (srcloc-line loc) + (srcloc-column loc))] + [else + (format "~a::~a" + (srcloc-source loc) + (srcloc-position loc))]) + (if name (format " ~a" name) ""))] + [else (format "\n ~a" name)]))) + '("\n"))))) + (define window% (class widget% (init-field parent @@ -234,24 +260,47 @@ (define/public (get-window-gtk) (send parent get-window-gtk)) (define/public (move x y) - (set! save-x x) - (set! save-y y) - (when parent - (send parent set-child-position gtk x y))) + (set-size x y -1 -1)) + (define/public (set-size x y w h) - (unless (= x -11111) (set! save-x x)) - (unless (= y -11111) (set! save-y y)) - (unless (= w -1) (set! save-w w)) - (unless (= h -1) (set! save-h h)) - (if parent - (send parent set-child-size gtk save-x save-y save-w save-h) - (set-child-size gtk save-x save-y save-w save-h)) - (set-top-position save-x save-y)) - (define/public (set-top-position x y) (void)) + (unless (and (or (= x -11111) (= save-x x)) + (or (= y -11111) (= save-y y)) + (or (= w -1) (= save-w w)) + (or (= h -1) (= save-h h))) + (unless (= x -11111) (set! save-x x)) + (unless (= y -11111) (set! save-y y)) + (unless (= w -1) (set! save-w w)) + (unless (= h -1) (set! save-h h)) + (tentative-client-size (+ save-w client-delta-w) + (+ save-h client-delta-h)) + (if parent + (send parent set-child-size gtk save-x save-y save-w save-h) + (set-top-size save-x save-y save-w save-h)))) + (define/public (set-child-size child-gtk x y w h) (gtk_widget_set_size_request child-gtk w h) (gtk_widget_size_allocate child-gtk (make-GtkAllocation x y w h))) + (define/public (set-top-size x y w h) (void)) + + (define/public (remember-size w h) + ;; called in event-pump thread + (unless (and (= save-w w) + (= save-h h)) + (set! save-w w) + (set! save-h h) + (queue-window-event this (lambda () (on-size w h))))) + + (define client-delta-w 0) + (define client-delta-h 0) + (define/public (remember-client-size w h) + ;; Called in the Gtk event-loop thread + (set! client-delta-w (max 0 (- save-w w))) + (set! client-delta-h (max 0 (- save-h h))) + (queue-window-event this (lambda () (on-size 0 0)))) + (define/public (tentative-client-size w h) + (void)) + (define/public (set-auto-size) (let ([req (make-GtkRequisition 0 0)]) (gtk_widget_size_request gtk req) diff --git a/collects/mred/private/wxtextfield.rkt b/collects/mred/private/wxtextfield.rkt index 7c92b5819c..b12ee9a82b 100644 --- a/collects/mred/private/wxtextfield.rkt +++ b/collects/mred/private/wxtextfield.rkt @@ -20,15 +20,16 @@ (provide (protect wx-text-field%)) (define text-field-text% - (class100 text% (cb ret-cb control set-cb-mgrs!) + (class100 text% (cb ret-cb control set-cb-mgrs! record-text) (rename [super-on-char on-char]) - (inherit get-text last-position set-max-undo-history) + (inherit get-text last-position set-max-undo-history get-flattened-text) (private-field [return-cb ret-cb]) (private-field [block-callback 1] [callback (lambda (type) + (as-exit (lambda () (record-text (get-flattened-text)))) (when (zero? block-callback) (let ([e (make-object wx:control-event% type)]) (as-exit (lambda () @@ -88,7 +89,9 @@ this (lambda (wc cr) (set! without-callback wc) - (set! callback-ready cr)))]) + (set! callback-ready cr)) + (lambda (t) + (send c set-combo-text t)))]) (sequence (as-exit (lambda ()