]> gitweb.factorcode.org Git - factor.git/blob - basis/ui/cocoa/cocoa.factor
Fix some bugs in epoll, and use it on Linux
[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 assocs 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 cocoa.nibs
7 sequences system ui ui.backend ui.clipboards ui.gadgets
8 ui.gadgets.worlds ui.cocoa.views core-foundation threads
9 math.geometry.rect fry ;
10 IN: ui.cocoa
11
12 TUPLE: handle view window ;
13
14 C: <handle> handle
15
16 SINGLETON: cocoa-ui-backend
17
18 M: cocoa-ui-backend do-events ( -- )
19     [ NSApp '[ _ do-event ] loop ui-wait ] with-autorelease-pool ;
20
21 TUPLE: pasteboard handle ;
22
23 C: <pasteboard> pasteboard
24
25 M: pasteboard clipboard-contents
26     handle>> pasteboard-string ;
27
28 M: pasteboard set-clipboard-contents
29     handle>> set-pasteboard-string ;
30
31 : init-clipboard ( -- )
32     NSPasteboard -> generalPasteboard <pasteboard>
33     clipboard set-global
34     <clipboard> selection set-global ;
35
36 : world>NSRect ( world -- NSRect )
37     [ window-loc>> ] [ dim>> ] bi [ first2 ] bi@ <NSRect> ;
38
39 : gadget-window ( world -- )
40     dup <FactorView>
41     2dup swap world>NSRect <ViewWindow>
42     [ [ -> release ] [ install-window-delegate ] bi* ] [ <handle> ] 2bi
43     >>handle drop ;
44
45 M: cocoa-ui-backend set-title ( string world -- )
46     handle>> window>> swap <NSString> -> setTitle: ;
47
48 : enter-fullscreen ( world -- )
49     handle>> view>>
50     NSScreen -> mainScreen
51     f -> enterFullScreenMode:withOptions:
52     drop ;
53
54 : exit-fullscreen ( world -- )
55     handle>> view>> f -> exitFullScreenModeWithOptions: ;
56
57 M: cocoa-ui-backend set-fullscreen* ( ? world -- )
58     swap [ enter-fullscreen ] [ exit-fullscreen ] if ;
59
60 M: cocoa-ui-backend fullscreen* ( world -- ? )
61     handle>> view>> -> isInFullScreenMode zero? not ;
62
63 : auto-position ( world -- )
64     dup window-loc>> { 0 0 } = [
65         handle>> window>> -> center
66     ] [
67         drop
68     ] if ;
69
70 M: cocoa-ui-backend (open-window) ( world -- )
71     dup gadget-window
72     dup auto-position
73     handle>> window>> f -> makeKeyAndOrderFront: ;
74
75 M: cocoa-ui-backend (close-window) ( handle -- )
76     window>> -> release ;
77
78 M: cocoa-ui-backend close-window ( gadget -- )
79     find-world [
80         handle>> [
81             window>> f -> performClose:
82         ] when*
83     ] when* ;
84
85 M: cocoa-ui-backend raise-window* ( world -- )
86     handle>> [
87         window>> dup f -> orderFront: -> makeKeyWindow
88         NSApp 1 -> activateIgnoringOtherApps:
89     ] when* ;
90
91 M: cocoa-ui-backend select-gl-context ( handle -- )
92     view>> -> openGLContext -> makeCurrentContext ;
93
94 M: cocoa-ui-backend flush-gl-context ( handle -- )
95     view>> -> openGLContext -> flushBuffer ;
96
97 M: cocoa-ui-backend beep ( -- )
98     NSBeep ;
99
100 CLASS: {
101     { +superclass+ "NSObject" }
102     { +name+ "FactorApplicationDelegate" }
103 }
104
105 { "applicationDidFinishLaunching:" "void" { "id" "SEL" "id" }
106     [ 3drop event-loop ]
107 } ;
108
109 : install-app-delegate ( -- )
110     NSApp FactorApplicationDelegate install-delegate ;
111
112 SYMBOL: cocoa-init-hook
113
114 cocoa-init-hook global [
115     [ "MiniFactor.nib" load-nib install-app-delegate ] or
116 ] change-at
117
118 M: cocoa-ui-backend ui
119     "UI" assert.app [
120         [
121             init-clipboard
122             cocoa-init-hook get call
123             start-ui
124             NSApp -> run
125         ] ui-running
126     ] with-cocoa ;
127
128 cocoa-ui-backend ui-backend set-global
129
130 [ running.app? "ui" "listener" ? ] main-vocab-hook set-global