]> gitweb.factorcode.org Git - factor.git/blob - extra/ui/cocoa/cocoa.factor
1e46544180ce99498821225f695733d9d5acb344
[factor.git] / extra / ui / cocoa / cocoa.factor
1 ! Copyright (C) 2006, 2007 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: 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 ;
9 IN: ui.cocoa
10
11 TUPLE: cocoa-ui-backend ;
12
13 SYMBOL: stop-after-last-window?
14
15 : event-loop? ( -- ? )
16     stop-after-last-window? get-global
17     [ windows get-global empty? not ] [ t ] if ;
18
19 : event-loop ( -- )
20     event-loop? [
21         [
22             [ NSApp do-events ui-step 10 sleep ] ui-try
23         ] with-autorelease-pool event-loop
24     ] when ;
25
26 TUPLE: pasteboard handle ;
27
28 C: <pasteboard> pasteboard
29
30 M: pasteboard clipboard-contents
31     pasteboard-handle pasteboard-string ;
32
33 M: pasteboard set-clipboard-contents
34     pasteboard-handle set-pasteboard-string ;
35
36 : init-clipboard ( -- )
37     NSPasteboard -> generalPasteboard <pasteboard>
38     clipboard set-global
39     <clipboard> selection set-global ;
40
41 : world>NSRect ( world -- NSRect )
42     dup world-loc first2 rot rect-dim first2 <NSRect> ;
43
44 : gadget-window ( world -- )
45     [
46         dup <FactorView>
47         dup rot world>NSRect <ViewWindow>
48         dup install-window-delegate
49         over -> release
50         2array
51     ] keep set-world-handle ;
52
53 M: cocoa-ui-backend set-title ( string world -- )
54     world-handle second swap <NSString> -> setTitle: ;
55
56 : auto-position ( world -- )
57     dup world-loc { 0 0 } = [
58         world-handle second -> center
59     ] [
60         drop
61     ] if ;
62
63 M: cocoa-ui-backend (open-window) ( world -- )
64     dup gadget-window
65     dup auto-position
66     world-handle second f -> makeKeyAndOrderFront: ;
67
68 M: cocoa-ui-backend (close-window) ( handle -- )
69     first unregister-window ;
70
71 M: cocoa-ui-backend close-window ( gadget -- )
72     find-world [
73         world-handle second f -> performClose:
74     ] when* ;
75
76 M: cocoa-ui-backend raise-window ( world -- )
77     world-handle [
78         second dup f -> orderFront: -> makeKeyWindow
79         NSApp 1 -> activateIgnoringOtherApps:
80     ] when* ;
81
82 M: cocoa-ui-backend select-gl-context ( handle -- )
83     first -> openGLContext -> makeCurrentContext ;
84
85 M: cocoa-ui-backend flush-gl-context ( handle -- )
86     first -> openGLContext -> flushBuffer ;
87
88 SYMBOL: cocoa-init-hook
89
90 M: cocoa-ui-backend ui
91     "UI" assert.app [
92         [
93             init-clipboard
94             cocoa-init-hook get [ call ] when*
95             start-ui
96             finish-launching
97             event-loop
98         ] ui-running
99     ] with-cocoa ;
100
101 T{ cocoa-ui-backend } ui-backend set-global
102
103 [ running.app? "ui" "listener" ? ] main-vocab-hook set-global