racket/gui Cocoa: fix menu bar after non-GUI startup on 10.9
When a GUI program is run through `racket` instead of `gracket`, an extra dance is needed on recent Mac OS X version (10.9, maybe also 10.8) to make the Racket-based application take over the menu bar.
This commit is contained in:
parent
bee344f41d
commit
fa23a373ac
|
@ -92,7 +92,11 @@
|
||||||
(parameterize ([current-custodian priviledged-custodian])
|
(parameterize ([current-custodian priviledged-custodian])
|
||||||
(thread (lambda () (sleep 5.0)))))
|
(thread (lambda () (sleep 5.0)))))
|
||||||
;; Also need to reset blit windows, since OS may move them incorrectly:
|
;; Also need to reset blit windows, since OS may move them incorrectly:
|
||||||
(fixup-window-locations)])
|
(fixup-window-locations)]
|
||||||
|
[-a _void (tryDockToFront: o)
|
||||||
|
(try-dock-to-front)]
|
||||||
|
[-a _void (retrySelfToFront: o)
|
||||||
|
(tellv app activateIgnoringOtherApps: #:type _BOOL #t)])
|
||||||
|
|
||||||
(define fixup-window-locations void)
|
(define fixup-window-locations void)
|
||||||
(define (set-fixup-window-locations! f) (set! fixup-window-locations f))
|
(define (set-fixup-window-locations! f) (set! fixup-window-locations f))
|
||||||
|
@ -117,7 +121,33 @@
|
||||||
(define app-delegate (tell (tell RacketApplicationDelegate alloc) init))
|
(define app-delegate (tell (tell RacketApplicationDelegate alloc) init))
|
||||||
(tellv app setDelegate: app-delegate)
|
(tellv app setDelegate: app-delegate)
|
||||||
(unless (scheme_register_process_global "Racket-GUI-no-front" #f)
|
(unless (scheme_register_process_global "Racket-GUI-no-front" #f)
|
||||||
(tellv app activateIgnoringOtherApps: #:type _BOOL #t))
|
(tellv app activateIgnoringOtherApps: #:type _BOOL #t)
|
||||||
|
;; It may not be that easy...
|
||||||
|
(when (version-10.6-or-later?)
|
||||||
|
(with-autorelease
|
||||||
|
(import-class NSRunningApplication)
|
||||||
|
(unless (tell #:type _BOOL (tell NSRunningApplication currentApplication) ownsMenuBar)
|
||||||
|
;; Looks like we haven't yet convinced the system to give us
|
||||||
|
;; the menu bar. Perform a menu-bar dance that is based on
|
||||||
|
;; http://stackoverflow.com/questions/7596643/when-calling-transformprocesstype-the-app-menu-doesnt-show-up
|
||||||
|
(tellv app-delegate performSelector: #:type _SEL (selector tryDockToFront:)
|
||||||
|
withObject: #f
|
||||||
|
afterDelay: #:type _double 0.1)))))
|
||||||
|
|
||||||
|
(define (try-dock-to-front)
|
||||||
|
;; Phase 2 of the 10.9 menu-bar dance started above:
|
||||||
|
(with-autorelease
|
||||||
|
(import-class NSRunningApplication)
|
||||||
|
(define docks (tell NSRunningApplication
|
||||||
|
runningApplicationsWithBundleIdentifier: #:type _NSString "com.apple.dock"))
|
||||||
|
(when (positive? (tell #:type _NSUInteger docks count))
|
||||||
|
(define dock (tell docks firstObject))
|
||||||
|
(define NSApplicationActivateIgnoringOtherApps 2)
|
||||||
|
(tell #:type _BOOL dock
|
||||||
|
activateWithOptions: #:type _NSUInteger NSApplicationActivateIgnoringOtherApps)
|
||||||
|
(tellv app-delegate performSelector: #:type _SEL (selector retrySelfToFront:)
|
||||||
|
withObject: #f
|
||||||
|
afterDelay: #:type _double 0.1))))
|
||||||
|
|
||||||
;; For some reason, nextEventMatchingMask:... gets stuck if the
|
;; For some reason, nextEventMatchingMask:... gets stuck if the
|
||||||
;; display changes, and it doesn't even send the
|
;; display changes, and it doesn't even send the
|
||||||
|
|
Loading…
Reference in New Issue
Block a user