factor/basis/ui/cocoa/cocoa.factor

128 lines
3.3 KiB
Factor
Raw Normal View History

2008-03-19 15:25:53 -04:00
! Copyright (C) 2006, 2008 Slava Pestov.
2007-09-20 18:09:08 -04:00
! See http://factorcode.org/license.txt for BSD license.
USING: accessors math arrays assocs cocoa cocoa.application
command-line kernel memory namespaces cocoa.messages
cocoa.runtime cocoa.subclassing cocoa.pasteboard cocoa.types
cocoa.windows cocoa.classes cocoa.application sequences system
ui ui.backend ui.clipboards ui.gadgets ui.gadgets.worlds
ui.cocoa.views core-foundation threads math.geometry.rect fry ;
2007-09-20 18:09:08 -04:00
IN: ui.cocoa
2008-03-19 15:25:53 -04:00
TUPLE: handle view window ;
C: <handle> handle
2008-04-02 20:44:01 -04:00
SINGLETON: cocoa-ui-backend
2007-09-20 18:09:08 -04:00
2008-05-08 17:58:13 -04:00
M: cocoa-ui-backend do-events ( -- )
[ NSApp '[ _ do-event ] loop ui-wait ] with-autorelease-pool ;
2007-09-20 18:09:08 -04:00
TUPLE: pasteboard handle ;
C: <pasteboard> pasteboard
M: pasteboard clipboard-contents
2008-09-01 19:57:12 -04:00
handle>> pasteboard-string ;
2007-09-20 18:09:08 -04:00
M: pasteboard set-clipboard-contents
2008-09-01 19:57:12 -04:00
handle>> set-pasteboard-string ;
2007-09-20 18:09:08 -04:00
: init-clipboard ( -- )
NSPasteboard -> generalPasteboard <pasteboard>
clipboard set-global
<clipboard> selection set-global ;
: world>NSRect ( world -- NSRect )
[ window-loc>> ] [ dim>> ] bi [ first2 ] bi@ <NSRect> ;
2007-09-20 18:09:08 -04:00
: gadget-window ( world -- )
dup <FactorView>
2dup swap world>NSRect <ViewWindow>
[ [ -> release ] [ install-window-delegate ] bi* ] [ <handle> ] 2bi
>>handle drop ;
2007-09-20 18:09:08 -04:00
M: cocoa-ui-backend set-title ( string world -- )
2008-09-01 20:02:44 -04:00
handle>> window>> swap <NSString> -> setTitle: ;
2007-09-20 18:09:08 -04:00
: enter-fullscreen ( world -- )
2008-09-01 20:02:44 -04:00
handle>> view>>
2008-03-19 15:25:53 -04:00
NSScreen -> mainScreen
f -> enterFullScreenMode:withOptions:
drop ;
: exit-fullscreen ( world -- )
2008-09-01 20:02:44 -04:00
handle>> view>> f -> exitFullScreenModeWithOptions: ;
M: cocoa-ui-backend set-fullscreen* ( ? world -- )
swap [ enter-fullscreen ] [ exit-fullscreen ] if ;
M: cocoa-ui-backend fullscreen* ( world -- ? )
2008-09-01 20:02:44 -04:00
handle>> view>> -> isInFullScreenMode zero? not ;
2007-09-20 18:09:08 -04:00
: auto-position ( world -- )
dup window-loc>> { 0 0 } = [
2008-09-01 20:02:44 -04:00
handle>> window>> -> center
2007-09-20 18:09:08 -04:00
] [
drop
] if ;
M: cocoa-ui-backend (open-window) ( world -- )
2007-09-20 18:09:08 -04:00
dup gadget-window
dup auto-position
2008-09-01 20:02:44 -04:00
handle>> window>> f -> makeKeyAndOrderFront: ;
2007-09-20 18:09:08 -04:00
M: cocoa-ui-backend (close-window) ( handle -- )
2008-09-01 19:57:12 -04:00
window>> -> release ;
M: cocoa-ui-backend close-window ( gadget -- )
find-world [
2008-09-01 20:02:44 -04:00
handle>> [
2008-09-01 19:57:12 -04:00
window>> f -> performClose:
2008-03-19 15:25:53 -04:00
] when*
] when* ;
2008-02-21 00:13:31 -05:00
M: cocoa-ui-backend raise-window* ( world -- )
2008-09-01 20:02:44 -04:00
handle>> [
2008-09-01 19:57:12 -04:00
window>> dup f -> orderFront: -> makeKeyWindow
2007-09-20 18:09:08 -04:00
NSApp 1 -> activateIgnoringOtherApps:
] when* ;
M: cocoa-ui-backend select-gl-context ( handle -- )
2008-09-01 19:57:12 -04:00
view>> -> openGLContext -> makeCurrentContext ;
2007-09-20 18:09:08 -04:00
M: cocoa-ui-backend flush-gl-context ( handle -- )
2008-09-01 19:57:12 -04:00
view>> -> openGLContext -> flushBuffer ;
2007-09-20 18:09:08 -04:00
M: cocoa-ui-backend beep ( -- )
NSBeep ;
CLASS: {
{ +superclass+ "NSObject" }
{ +name+ "FactorApplicationDelegate" }
}
{ "applicationDidFinishLaunching:" "void" { "id" "SEL" "id" }
[ 3drop event-loop ]
} ;
: install-app-delegate ( -- )
NSApp FactorApplicationDelegate install-delegate ;
2007-09-20 18:09:08 -04:00
SYMBOL: cocoa-init-hook
cocoa-init-hook global [ [ install-app-delegate ] or ] change-at
2007-09-20 18:09:08 -04:00
M: cocoa-ui-backend ui
"UI" assert.app [
[
init-clipboard
cocoa-init-hook get call
2007-09-20 18:09:08 -04:00
start-ui
NSApp -> run
2007-09-20 18:09:08 -04:00
] ui-running
] with-cocoa ;
2008-04-02 20:44:01 -04:00
cocoa-ui-backend ui-backend set-global
2007-09-20 18:09:08 -04:00
[ running.app? "ui" "listener" ? ] main-vocab-hook set-global