1 ! Copyright (C) 2006, 2007 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: math arrays cocoa cocoa.application command-line
4 kernel memory namespaces cocoa.messages cocoa.runtime
5 cocoa.subclassing cocoa.pasteboard cocoa.types cocoa.windows
6 cocoa.classes cocoa.application sequences system ui ui.backend
7 ui.clipboards ui.gadgets ui.gadgets.worlds ui.cocoa.views
8 core-foundation threads ;
11 TUPLE: cocoa-ui-backend ;
13 SYMBOL: stop-after-last-window?
15 : event-loop? ( -- ? )
16 stop-after-last-window? get-global
17 [ windows get-global empty? not ] [ t ] if ;
22 [ NSApp do-events ui-step 10 sleep ] ui-try
23 ] with-autorelease-pool event-loop
26 TUPLE: pasteboard handle ;
28 C: <pasteboard> pasteboard
30 M: pasteboard clipboard-contents
31 pasteboard-handle pasteboard-string ;
33 M: pasteboard set-clipboard-contents
34 pasteboard-handle set-pasteboard-string ;
36 : init-clipboard ( -- )
37 NSPasteboard -> generalPasteboard <pasteboard>
39 <clipboard> selection set-global ;
41 : world>NSRect ( world -- NSRect )
42 dup world-loc first2 rot rect-dim first2 <NSRect> ;
44 : gadget-window ( world -- )
47 dup rot world>NSRect <ViewWindow>
48 dup install-window-delegate
51 ] keep set-world-handle ;
53 M: cocoa-ui-backend set-title ( string world -- )
54 world-handle second swap <NSString> -> setTitle: ;
56 : enter-fullscreen ( world -- )
57 world-handle first NSScreen -> mainScreen f -> enterFullScreenMode:withOptions: drop ;
59 : exit-fullscreen ( world -- )
60 world-handle first f -> exitFullScreenModeWithOptions: ;
62 M: cocoa-ui-backend set-fullscreen? ( ? world -- )
63 swap [ enter-fullscreen ] [ exit-fullscreen ] if ;
65 M: cocoa-ui-backend fullscreen? ( world -- ? )
66 world-handle first -> isInFullScreenMode zero? not ;
68 : auto-position ( world -- )
69 dup world-loc { 0 0 } = [
70 world-handle second -> center
75 M: cocoa-ui-backend (open-window) ( world -- )
78 world-handle second f -> makeKeyAndOrderFront: ;
80 M: cocoa-ui-backend (close-window) ( handle -- )
81 first unregister-window ;
83 M: cocoa-ui-backend close-window ( gadget -- )
85 world-handle second f -> performClose:
88 M: cocoa-ui-backend raise-window ( world -- )
90 second dup f -> orderFront: -> makeKeyWindow
91 NSApp 1 -> activateIgnoringOtherApps:
94 M: cocoa-ui-backend select-gl-context ( handle -- )
95 first -> openGLContext -> makeCurrentContext ;
97 M: cocoa-ui-backend flush-gl-context ( handle -- )
98 first -> openGLContext -> flushBuffer ;
100 SYMBOL: cocoa-init-hook
102 M: cocoa-ui-backend ui
106 cocoa-init-hook get [ call ] when*
113 T{ cocoa-ui-backend } ui-backend set-global
115 [ running.app? "ui" "listener" ? ] main-vocab-hook set-global