]> gitweb.factorcode.org Git - factor.git/blob - basis/ui/cocoa/cocoa.factor
Fix permission bits
[factor.git] / basis / ui / cocoa / cocoa.factor
1 ! Copyright (C) 2006, 2008 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors math arrays cocoa cocoa.application
4 command-line kernel memory namespaces cocoa.messages
5 cocoa.runtime cocoa.subclassing cocoa.pasteboard cocoa.types
6 cocoa.windows cocoa.classes cocoa.application sequences system
7 ui ui.backend ui.clipboards ui.gadgets ui.gadgets.worlds
8 ui.cocoa.views core-foundation threads math.geometry.rect ;
9 IN: ui.cocoa
10
11 TUPLE: handle view window ;
12
13 C: <handle> handle
14
15 SINGLETON: cocoa-ui-backend
16
17 M: cocoa-ui-backend do-events ( -- )
18     [
19         [ NSApp [ do-event ] curry loop ui-wait ] ui-try
20     ] with-autorelease-pool ;
21
22 TUPLE: pasteboard handle ;
23
24 C: <pasteboard> pasteboard
25
26 M: pasteboard clipboard-contents
27     handle>> pasteboard-string ;
28
29 M: pasteboard set-clipboard-contents
30     handle>> set-pasteboard-string ;
31
32 : init-clipboard ( -- )
33     NSPasteboard -> generalPasteboard <pasteboard>
34     clipboard set-global
35     <clipboard> selection set-global ;
36
37 : world>NSRect ( world -- NSRect )
38     dup window-loc>> first2 rot rect-dim first2 <NSRect> ;
39
40 : gadget-window ( world -- )
41     [
42         dup <FactorView>
43         dup rot world>NSRect <ViewWindow>
44         dup install-window-delegate
45         over -> release
46         <handle>
47     ] keep (>>handle) ;
48
49 M: cocoa-ui-backend set-title ( string world -- )
50     handle>> window>> swap <NSString> -> setTitle: ;
51
52 : enter-fullscreen ( world -- )
53     handle>> view>>
54     NSScreen -> mainScreen
55     f -> enterFullScreenMode:withOptions:
56     drop ;
57
58 : exit-fullscreen ( world -- )
59     handle>> view>> f -> exitFullScreenModeWithOptions: ;
60
61 M: cocoa-ui-backend set-fullscreen* ( ? world -- )
62     swap [ enter-fullscreen ] [ exit-fullscreen ] if ;
63
64 M: cocoa-ui-backend fullscreen* ( world -- ? )
65     handle>> view>> -> isInFullScreenMode zero? not ;
66
67 : auto-position ( world -- )
68     dup window-loc>> { 0 0 } = [
69         handle>> window>> -> center
70     ] [
71         drop
72     ] if ;
73
74 M: cocoa-ui-backend (open-window) ( world -- )
75     dup gadget-window
76     dup auto-position
77     handle>> window>> f -> makeKeyAndOrderFront: ;
78
79 M: cocoa-ui-backend (close-window) ( handle -- )
80     window>> -> release ;
81
82 M: cocoa-ui-backend close-window ( gadget -- )
83     find-world [
84         handle>> [
85             window>> f -> performClose:
86         ] when*
87     ] when* ;
88
89 M: cocoa-ui-backend raise-window* ( world -- )
90     handle>> [
91         window>> dup f -> orderFront: -> makeKeyWindow
92         NSApp 1 -> activateIgnoringOtherApps:
93     ] when* ;
94
95 M: cocoa-ui-backend select-gl-context ( handle -- )
96     view>> -> openGLContext -> makeCurrentContext ;
97
98 M: cocoa-ui-backend flush-gl-context ( handle -- )
99     view>> -> openGLContext -> flushBuffer ;
100
101 M: cocoa-ui-backend beep ( -- )
102     NSBeep ;
103
104 SYMBOL: cocoa-init-hook
105
106 M: cocoa-ui-backend ui
107     "UI" assert.app [
108         [
109             init-clipboard
110             cocoa-init-hook get [ call ] when*
111             start-ui
112             finish-launching
113             event-loop
114         ] ui-running
115     ] with-cocoa ;
116
117 cocoa-ui-backend ui-backend set-global
118
119 [ running.app? "ui" "listener" ? ] main-vocab-hook set-global