frame, dialog, and stock-icon repairs
This commit is contained in:
parent
50d10998c0
commit
2f2341be6f
|
@ -2,6 +2,7 @@
|
||||||
(require scheme/class
|
(require scheme/class
|
||||||
scheme/foreign
|
scheme/foreign
|
||||||
ffi/objc
|
ffi/objc
|
||||||
|
racket/draw/bitmap
|
||||||
"../../syntax.rkt"
|
"../../syntax.rkt"
|
||||||
"item.rkt"
|
"item.rkt"
|
||||||
"utils.rkt"
|
"utils.rkt"
|
||||||
|
@ -14,7 +15,20 @@
|
||||||
|
|
||||||
;; ----------------------------------------
|
;; ----------------------------------------
|
||||||
|
|
||||||
(import-class NSTextField NSImageView)
|
(import-class NSTextField NSImageView NSWorkspace)
|
||||||
|
|
||||||
|
(define _OSType _uint32)
|
||||||
|
|
||||||
|
(define-cocoa NSFileTypeForHFSTypeCode (_fun _OSType -> _id))
|
||||||
|
|
||||||
|
(define (get-app-icon)
|
||||||
|
(tell (tell NSWorkspace sharedWorkspace)
|
||||||
|
iconForFile:
|
||||||
|
(tell (tell (tell NSWorkspace sharedWorkspace)
|
||||||
|
activeApplication)
|
||||||
|
objectForKey:
|
||||||
|
#:type _NSString
|
||||||
|
"NSApplicationPath")))
|
||||||
|
|
||||||
(defclass message% item%
|
(defclass message% item%
|
||||||
(init parent label
|
(init parent label
|
||||||
|
@ -25,7 +39,21 @@
|
||||||
(super-new [parent parent]
|
(super-new [parent parent]
|
||||||
[cocoa (let* ([label (cond
|
[cocoa (let* ([label (cond
|
||||||
[(string? label) label]
|
[(string? label) label]
|
||||||
[(symbol? label) (format "<~a>" label)]
|
[(symbol? label)
|
||||||
|
(let ([icon
|
||||||
|
(if (eq? label 'app)
|
||||||
|
(get-app-icon)
|
||||||
|
(let ([id (integer-bytes->integer
|
||||||
|
(case label
|
||||||
|
[(caution) #"caut"]
|
||||||
|
[(stop) #"stop"])
|
||||||
|
#f
|
||||||
|
#t)])
|
||||||
|
(tell (tell NSWorkspace sharedWorkspace)
|
||||||
|
iconForFileType:
|
||||||
|
(NSFileTypeForHFSTypeCode id))))])
|
||||||
|
(tellv icon setSize: #:type _NSSize (make-NSSize 64 64))
|
||||||
|
icon)]
|
||||||
[(send label ok?) label]
|
[(send label ok?) label]
|
||||||
[else "<bad>"])]
|
[else "<bad>"])]
|
||||||
[cocoa
|
[cocoa
|
||||||
|
@ -43,11 +71,15 @@
|
||||||
(tellv cocoa setTitleWithMnemonic: #:type _NSString label)
|
(tellv cocoa setTitleWithMnemonic: #:type _NSString label)
|
||||||
(tellv cocoa sizeToFit)]
|
(tellv cocoa sizeToFit)]
|
||||||
[else
|
[else
|
||||||
(tellv cocoa setImage: (bitmap->image label))
|
(tellv cocoa setImage: (if (label . is-a? . bitmap%)
|
||||||
|
(bitmap->image label)
|
||||||
|
label))
|
||||||
(tellv cocoa setFrame: #:type _NSRect
|
(tellv cocoa setFrame: #:type _NSRect
|
||||||
(make-NSRect (make-NSPoint 0 0)
|
(make-NSRect (make-NSPoint 0 0)
|
||||||
|
(if (label . is-a? . bitmap%)
|
||||||
(make-NSSize (send label get-width)
|
(make-NSSize (send label get-width)
|
||||||
(send label get-height))))])
|
(send label get-height))
|
||||||
|
(tell #:type _NSSize label size))))])
|
||||||
cocoa)]
|
cocoa)]
|
||||||
[no-show? (memq 'deleted style)])
|
[no-show? (memq 'deleted style)])
|
||||||
|
|
||||||
|
|
|
@ -318,7 +318,15 @@
|
||||||
(define/public (center a b) (void))
|
(define/public (center a b) (void))
|
||||||
(def/public-unimplemented refresh)
|
(def/public-unimplemented refresh)
|
||||||
|
|
||||||
(def/public-unimplemented screen-to-client)
|
(define/public (screen-to-client xb yb)
|
||||||
|
(let ([p (tell #:type _NSPoint (get-cocoa-content)
|
||||||
|
convertPointFromBase: #:type _NSPoint
|
||||||
|
(tell #:type _NSPoint (get-cocoa-window)
|
||||||
|
convertScreenToBase:
|
||||||
|
#:type _NSPoint (make-NSPoint (unbox xb)
|
||||||
|
(send (get-wx-window) flip-screen (unbox yb)))))])
|
||||||
|
(set-box! xb (inexact->exact (floor (NSPoint-x p))))
|
||||||
|
(set-box! yb (inexact->exact (floor (flip-client (NSPoint-y p)))))))
|
||||||
|
|
||||||
(define/public (client-to-screen xb yb)
|
(define/public (client-to-screen xb yb)
|
||||||
(let* ([p (tell #:type _NSPoint (get-cocoa-window)
|
(let* ([p (tell #:type _NSPoint (get-cocoa-window)
|
||||||
|
@ -328,8 +336,8 @@
|
||||||
convertPointToBase: #:type _NSPoint
|
convertPointToBase: #:type _NSPoint
|
||||||
(make-NSPoint (unbox xb) (flip-client (unbox yb)))))])
|
(make-NSPoint (unbox xb) (flip-client (unbox yb)))))])
|
||||||
(let ([new-y (send (get-wx-window) flip-screen (NSPoint-y p))])
|
(let ([new-y (send (get-wx-window) flip-screen (NSPoint-y p))])
|
||||||
(set-box! xb (NSPoint-x p))
|
(set-box! xb (inexact->exact (floor (NSPoint-x p))))
|
||||||
(set-box! yb new-y))))
|
(set-box! yb (inexact->exact (floor new-y))))))
|
||||||
|
|
||||||
(def/public-unimplemented fit)
|
(def/public-unimplemented fit)
|
||||||
|
|
||||||
|
|
|
@ -15,20 +15,20 @@
|
||||||
(define-mz scheme_restore_on_atomic_timeout (_fun _pointer -> _pointer)
|
(define-mz scheme_restore_on_atomic_timeout (_fun _pointer -> _pointer)
|
||||||
#:c-id scheme_set_on_atomic_timeout)
|
#:c-id scheme_set_on_atomic_timeout)
|
||||||
|
|
||||||
(define freezer-box (make-parameter #f))
|
(define freezer-box (make-parameter null))
|
||||||
(define freeze-tag (make-continuation-prompt-tag))
|
(define freeze-tag (make-continuation-prompt-tag))
|
||||||
|
|
||||||
;; Runs `thunk' atomically, but cooperates with
|
;; Runs `thunk' atomically, but cooperates with
|
||||||
;; `constrained-reply' to continue a frozen
|
;; `constrained-reply' to continue a frozen
|
||||||
;; computation in non-atomic mode.
|
;; computation in non-atomic mode.
|
||||||
(define (call-as-unfreeze-point thunk)
|
(define (call-as-unfreeze-point thunk)
|
||||||
(let ([b (box #f)])
|
(let ([b (box null)])
|
||||||
(parameterize ([freezer-box b])
|
(parameterize ([freezer-box b])
|
||||||
;; In atomic mode:
|
;; In atomic mode:
|
||||||
(as-entry (lambda () (thunk)))
|
(as-entry (lambda () (thunk)))
|
||||||
;; Out of atomic mode:
|
;; Out of atomic mode:
|
||||||
(let ([k (unbox b)])
|
(let ([l (unbox b)])
|
||||||
(when k
|
(for ([k (in-list (reverse l))])
|
||||||
(call-with-continuation-prompt ; to catch aborts
|
(call-with-continuation-prompt ; to catch aborts
|
||||||
(lambda ()
|
(lambda ()
|
||||||
(call-with-continuation-prompt
|
(call-with-continuation-prompt
|
||||||
|
@ -41,16 +41,21 @@
|
||||||
(let ([now (current-inexact-milliseconds)])
|
(let ([now (current-inexact-milliseconds)])
|
||||||
(lambda ()
|
(lambda ()
|
||||||
((current-inexact-milliseconds) . > . (+ now 200))))])
|
((current-inexact-milliseconds) . > . (+ now 200))))])
|
||||||
(unless (freezer-box)
|
(let ([b (freezer-box)])
|
||||||
|
(unless b
|
||||||
(log-error "internal error: constrained-reply not within an unfreeze point"))
|
(log-error "internal error: constrained-reply not within an unfreeze point"))
|
||||||
(if (eq? (current-thread) (eventspace-handler-thread es))
|
(if (eq? (current-thread) (eventspace-handler-thread es))
|
||||||
|
(if (pair? b)
|
||||||
|
;; already suspended, so push this work completely:
|
||||||
|
(set-box! b (cons thunk (unbox b)))
|
||||||
|
;; try to do some work:
|
||||||
(let* ([prev #f]
|
(let* ([prev #f]
|
||||||
[ready? #f]
|
[ready? #f]
|
||||||
[handler (lambda ()
|
[handler (lambda ()
|
||||||
(when (and ready? (should-give-up?))
|
(when (and ready? (should-give-up?))
|
||||||
(scheme_call_with_composable_no_dws
|
(scheme_call_with_composable_no_dws
|
||||||
(lambda (proc)
|
(lambda (proc)
|
||||||
(set-box! (freezer-box) proc)
|
(set-box! (freezer-box) (cons proc (freezer-box)))
|
||||||
(scheme_restore_on_atomic_timeout prev)
|
(scheme_restore_on_atomic_timeout prev)
|
||||||
(scheme_abort_continuation_no_dws
|
(scheme_abort_continuation_no_dws
|
||||||
freeze-tag
|
freeze-tag
|
||||||
|
@ -70,7 +75,7 @@
|
||||||
(parameterize ([freezer-box #f])
|
(parameterize ([freezer-box #f])
|
||||||
(thunk))
|
(thunk))
|
||||||
(scheme_restore_on_atomic_timeout prev)))
|
(scheme_restore_on_atomic_timeout prev)))
|
||||||
freeze-tag)))))
|
freeze-tag))))))
|
||||||
(begin
|
(begin
|
||||||
(log-error "internal error: wrong eventspace for constrained event handling\n")
|
(log-error "internal error: wrong eventspace for constrained event handling\n")
|
||||||
default)))
|
default))))
|
||||||
|
|
|
@ -173,7 +173,9 @@
|
||||||
;; Avoid multiple queued paints:
|
;; Avoid multiple queued paints:
|
||||||
(define paint-queued? #f)
|
(define paint-queued? #f)
|
||||||
;; To handle paint requests that happen while on-paint
|
;; To handle paint requests that happen while on-paint
|
||||||
;; is being called already:
|
;; is being called already. kProbably doesn't happen,
|
||||||
|
;; because expose callabcks should be in the right
|
||||||
|
;; eventspace.
|
||||||
(define now-drawing? #f)
|
(define now-drawing? #f)
|
||||||
(define refresh-after-drawing? #f)
|
(define refresh-after-drawing? #f)
|
||||||
|
|
||||||
|
|
|
@ -1,12 +1,23 @@
|
||||||
#lang scheme/base
|
#lang scheme/base
|
||||||
(require scheme/class
|
(require scheme/class
|
||||||
|
ffi/unsafe
|
||||||
"../../syntax.rkt"
|
"../../syntax.rkt"
|
||||||
"../common/queue.rkt"
|
"../common/queue.rkt"
|
||||||
|
"types.rkt"
|
||||||
|
"utils.rkt"
|
||||||
"frame.rkt")
|
"frame.rkt")
|
||||||
|
|
||||||
(provide dialog%)
|
(provide dialog%)
|
||||||
|
|
||||||
|
(define GTK_WIN_POS_CENTER 1)
|
||||||
|
(define GTK_WIN_POS_CENTER_ON_PARENT 4)
|
||||||
|
|
||||||
|
(define-gtk gtk_window_set_position (_fun _GtkWidget _int -> _void))
|
||||||
|
|
||||||
(defclass dialog% frame%
|
(defclass dialog% frame%
|
||||||
|
(inherit get-gtk
|
||||||
|
get-parent)
|
||||||
|
|
||||||
(super-new [is-dialog? #t])
|
(super-new [is-dialog? #t])
|
||||||
|
|
||||||
(define close-sema #f)
|
(define close-sema #f)
|
||||||
|
@ -18,6 +29,14 @@
|
||||||
(set! close-sema #f)))
|
(set! close-sema #f)))
|
||||||
(super direct-show on?))
|
(super direct-show on?))
|
||||||
|
|
||||||
|
(define/override (center dir wrt)
|
||||||
|
(if #f ; (eq? dir 'both)
|
||||||
|
(gtk_window_set_position (get-gtk)
|
||||||
|
(if (get-parent)
|
||||||
|
GTK_WIN_POS_CENTER_ON_PARENT
|
||||||
|
GTK_WIN_POS_CENTER))
|
||||||
|
(super center dir wrt)))
|
||||||
|
|
||||||
(define/override (show on?)
|
(define/override (show on?)
|
||||||
(if on?
|
(if on?
|
||||||
(unless close-sema
|
(unless close-sema
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
"window.rkt"
|
"window.rkt"
|
||||||
"client-window.rkt"
|
"client-window.rkt"
|
||||||
"widget.rkt"
|
"widget.rkt"
|
||||||
|
"procs.rkt"
|
||||||
"../common/queue.rkt")
|
"../common/queue.rkt")
|
||||||
(unsafe!)
|
(unsafe!)
|
||||||
|
|
||||||
|
@ -25,6 +26,7 @@
|
||||||
(define-gtk gtk_window_set_decorated (_fun _GtkWidget _gboolean -> _void))
|
(define-gtk gtk_window_set_decorated (_fun _GtkWidget _gboolean -> _void))
|
||||||
(define-gtk gtk_window_maximize (_fun _GtkWidget -> _void))
|
(define-gtk gtk_window_maximize (_fun _GtkWidget -> _void))
|
||||||
(define-gtk gtk_window_unmaximize (_fun _GtkWidget -> _void))
|
(define-gtk gtk_window_unmaximize (_fun _GtkWidget -> _void))
|
||||||
|
(define-gtk gtk_widget_set_uposition (_fun _GtkWidget _int _int -> _void))
|
||||||
|
|
||||||
(define (handle-delete gtk)
|
(define (handle-delete gtk)
|
||||||
(let ([wx (gtk->wx gtk)])
|
(let ([wx (gtk->wx gtk)])
|
||||||
|
@ -113,6 +115,31 @@
|
||||||
(define/public (enforce-size min-x min-y max-x max-y inc-x inc-y)
|
(define/public (enforce-size min-x min-y max-x max-y inc-x inc-y)
|
||||||
(void))
|
(void))
|
||||||
|
|
||||||
|
(define/override (center dir wrt)
|
||||||
|
(let ([w-box (box 0)]
|
||||||
|
[h-box (box 0)]
|
||||||
|
[sw-box (box 0)]
|
||||||
|
[sh-box (box 0)])
|
||||||
|
(get-size w-box h-box)
|
||||||
|
(display-size sw-box sh-box #t)
|
||||||
|
(let* ([sw (unbox sw-box)]
|
||||||
|
[sh (unbox sh-box)]
|
||||||
|
[fw (unbox w-box)]
|
||||||
|
[fh (unbox h-box)])
|
||||||
|
(set-top-position (if (or (eq? dir 'both)
|
||||||
|
(eq? dir 'horizontal))
|
||||||
|
(/ (- sw fw) 2)
|
||||||
|
-11111)
|
||||||
|
(if (or (eq? dir 'both)
|
||||||
|
(eq? dir 'vertical))
|
||||||
|
(/ (- sh fh) 2)
|
||||||
|
-11111)))))
|
||||||
|
|
||||||
|
(define/override (set-top-position x y)
|
||||||
|
(gtk_widget_set_uposition gtk
|
||||||
|
(if (= x -11111) -2 x)
|
||||||
|
(if (= y -11111) -2 y)))
|
||||||
|
|
||||||
(define/override (get-size wb hb)
|
(define/override (get-size wb hb)
|
||||||
(let-values ([(w h) (gtk_window_get_size gtk)])
|
(let-values ([(w h) (gtk_window_get_size gtk)])
|
||||||
(set-box! wb w)
|
(set-box! wb w)
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
(define-gtk gtk_label_new (_fun _string -> _GtkWidget))
|
(define-gtk gtk_label_new (_fun _string -> _GtkWidget))
|
||||||
(define-gtk gtk_label_set_text (_fun _GtkWidget _string -> _void))
|
(define-gtk gtk_label_set_text (_fun _GtkWidget _string -> _void))
|
||||||
(define-gtk gtk_label_set_text_with_mnemonic (_fun _GtkWidget _string -> _void))
|
(define-gtk gtk_label_set_text_with_mnemonic (_fun _GtkWidget _string -> _void))
|
||||||
|
(define-gtk gtk_image_new_from_stock (_fun _string _int -> _GtkWidget))
|
||||||
|
|
||||||
(define (mnemonic-string s)
|
(define (mnemonic-string s)
|
||||||
(if (regexp-match? #rx"&" s)
|
(if (regexp-match? #rx"&" s)
|
||||||
|
@ -38,6 +39,8 @@
|
||||||
(gtk_label_set_text_with_mnemonic l s)))
|
(gtk_label_set_text_with_mnemonic l s)))
|
||||||
l))
|
l))
|
||||||
|
|
||||||
|
(define icon-size 6) ; = GTK_ICON_SIZE_DIALOG
|
||||||
|
|
||||||
(defclass message% item%
|
(defclass message% item%
|
||||||
(init parent label
|
(init parent label
|
||||||
x y
|
x y
|
||||||
|
@ -49,7 +52,10 @@
|
||||||
(not label))
|
(not label))
|
||||||
(gtk_label_new_with_mnemonic (or label ""))
|
(gtk_label_new_with_mnemonic (or label ""))
|
||||||
(if (symbol? label)
|
(if (symbol? label)
|
||||||
(gtk_label_new (format "<~a>" label))
|
(case label
|
||||||
|
[(caution) (gtk_image_new_from_stock "gtk-dialog-warning" icon-size)]
|
||||||
|
[(stop) (gtk_image_new_from_stock "gtk-dialog-error" icon-size)]
|
||||||
|
[else (gtk_image_new_from_stock "gtk-dialog-question" icon-size)])
|
||||||
(gtk_image_new_from_pixbuf
|
(gtk_image_new_from_pixbuf
|
||||||
(bitmap->pixbuf label))))]
|
(bitmap->pixbuf label))))]
|
||||||
[no-show? (memq 'deleted style)])
|
[no-show? (memq 'deleted style)])
|
||||||
|
|
|
@ -235,7 +235,9 @@
|
||||||
(unless (= h -1) (set! save-h h))
|
(unless (= h -1) (set! save-h h))
|
||||||
(if parent
|
(if parent
|
||||||
(send parent set-child-size gtk save-x save-y save-w save-h)
|
(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-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))
|
||||||
(define/public (set-child-size child-gtk x y w h)
|
(define/public (set-child-size child-gtk x y w h)
|
||||||
(gtk_widget_set_size_request child-gtk w h)
|
(gtk_widget_set_size_request child-gtk w h)
|
||||||
(gtk_widget_size_allocate child-gtk (make-GtkAllocation x y w h)))
|
(gtk_widget_size_allocate child-gtk (make-GtkAllocation x y w h)))
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#lang scheme/base
|
#lang scheme/base
|
||||||
(require scheme/class)
|
(require scheme/class
|
||||||
|
"syntax.rkt")
|
||||||
|
|
||||||
(provide point% point-x point-y
|
(provide point% point-x point-y
|
||||||
list-of-pair-of-real?)
|
list-of-pair-of-real?)
|
||||||
|
@ -8,6 +9,10 @@
|
||||||
(class object%
|
(class object%
|
||||||
(init-field [x 0.0]
|
(init-field [x 0.0]
|
||||||
[y 0.0])
|
[y 0.0])
|
||||||
|
(define/public (get-x) x)
|
||||||
|
(define/public (get-y) y)
|
||||||
|
(def/public (set-x [real? v]) (set! x (exact->inexact v)))
|
||||||
|
(def/public (set-y [real? v]) (set! y (exact->inexact v)))
|
||||||
(super-new)))
|
(super-new)))
|
||||||
|
|
||||||
(define point-x (class-field-accessor point% x))
|
(define point-x (class-field-accessor point% x))
|
||||||
|
|
Loading…
Reference in New Issue
Block a user