Moved many parts of Cocoa backend into backend-independent UI code

release
slava 2006-03-15 06:20:59 +00:00
parent 80857c7a36
commit b9e823362f
6 changed files with 138 additions and 140 deletions

View File

@ -1,9 +1,9 @@
! Copyright (C) 2006 Slava Pestov ! Copyright (C) 2006 Slava Pestov
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
IN: cocoa IN: cocoa
USING: alien errors gadgets io kernel namespaces USING: alien errors gadgets io kernel namespaces objc
objc-NSApplication objc-NSAutoreleasePool objc-NSException objc-NSApplication objc-NSAutoreleasePool objc-NSException
objc-NSObject objc-NSView threads ; objc-NSNotificationCenter objc-NSObject objc-NSView threads ;
: with-autorelease-pool ( quot -- ) : with-autorelease-pool ( quot -- )
NSAutoreleasePool [new] slip [release] ; inline NSAutoreleasePool [new] slip [release] ; inline
@ -34,6 +34,10 @@ objc-NSObject objc-NSView threads ;
NSApplication [sharedApplication] do-events world-step NSApplication [sharedApplication] do-events world-step
] with-autorelease-pool 10 sleep event-loop ; ] with-autorelease-pool 10 sleep event-loop ;
: add-observer ( observer selector name object -- )
>r >r >r >r NSNotificationCenter [defaultCenter] r> r>
sel_registerName r> r> [addObserver:selector:name:object:] ;
IN: errors IN: errors
: objc-error. ( alien -- ) : objc-error. ( alien -- )

View File

@ -9,6 +9,7 @@ USING: compiler io parser sequences words ;
"/library/cocoa/init-cocoa.factor" "/library/cocoa/init-cocoa.factor"
"/library/cocoa/application-utils.factor" "/library/cocoa/application-utils.factor"
"/library/cocoa/window-utils.factor" "/library/cocoa/window-utils.factor"
"/library/cocoa/view-utils.factor"
} [ } [
run-resource run-resource
] each ] each

View File

@ -15,42 +15,10 @@ IN: gadgets
IN: gadgets-cocoa IN: gadgets-cocoa
! Cocoa backend for Factor UI ! Cocoa backend for Factor UI
: init-gl ( rect -- )
0.0 0.0 0.0 0.0 glClearColor
{ 1.0 0.0 0.0 0.0 } gl-color
GL_COLOR_BUFFER_BIT glClear
GL_PROJECTION glMatrixMode
glLoadIdentity
GL_MODELVIEW glMatrixMode
glLoadIdentity
{ 0 0 0 } over NSRect-w pick NSRect-h 0 3array <rect>
clip set
dup NSRect-w over NSRect-h 0 0 2swap glViewport
dup NSRect-w swap NSRect-h >r >r 0 r> r> 0 gluOrtho2D
GL_SMOOTH glShadeModel
GL_BLEND glEnable
GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA glBlendFunc
GL_SCISSOR_TEST glEnable
GL_MODELVIEW glMatrixMode ;
: with-gl-context ( context quot -- )
swap
[ [makeCurrentContext] call glFlush ] keep
[flushBuffer] ; inline
: button ( event -- n ) : button ( event -- n )
#! Cocoa -> Factor UI button mapping #! Cocoa -> Factor UI button mapping
[buttonNumber] H{ { 0 1 } { 2 2 } { 1 3 } } hash ; [buttonNumber] H{ { 0 1 } { 2 2 } { 1 3 } } hash ;
: send-button-down ( event -- )
update-clicked
button dup hand get hand-buttons push
[ button-down ] button-gesture ;
: send-button-up ( event -- )
button dup hand get hand-buttons delete
[ button-up ] button-gesture ;
: mouse-location ( window -- loc ) : mouse-location ( window -- loc )
dup [contentView] [ dup [contentView] [
swap [mouseLocationOutsideOfEventStream] f swap [mouseLocationOutsideOfEventStream] f
@ -61,11 +29,6 @@ IN: gadgets-cocoa
: send-mouse-moved ( -- ) : send-mouse-moved ( -- )
world get world-handle mouse-location move-hand ; world get world-handle mouse-location move-hand ;
: send-scroll-wheel ( event -- )
[deltaY] 0 >
[ wheel-up ] [ wheel-down ] ?
hand get hand-clicked handle-gesture drop ;
: modifiers : modifiers
{ {
{ "SHIFT" HEX: 10000 } { "SHIFT" HEX: 10000 }
@ -97,25 +60,16 @@ IN: gadgets-cocoa
dup [modifierFlags] modifier swap [keyCode] key-codes dup [modifierFlags] modifier swap [keyCode] key-codes
[ add >list ] [ drop f ] if* ; [ add >list ] [ drop f ] if* ;
: send-user-input ( event -- )
[characters] CF>string dup empty?
[ hand get hand-focus user-input ] unless drop ;
: send-key-event ( event -- ) : send-key-event ( event -- )
dup event>binding dup event>binding
[ hand get hand-focus handle-gesture ] [ t ] if* [ hand get hand-focus handle-gesture ] [ t ] if*
[ send-user-input ] [ drop ] if ; [ [characters] CF>string send-user-input ] [ drop ] if ;
: resize-world ( world -- ) "NSOpenGLView" "FactorView" {
>r [bounds] dup NSRect-w swap NSRect-h 0 3array r>
set-gadget-dim ;
: init-FactorView-class
"NSOpenGLView" "FactorView" {
{ "drawRect:" "void" { "id" "SEL" "NSRect" } { "drawRect:" "void" { "id" "SEL" "NSRect" }
[ [
2drop dup [openGLContext] [ 2drop dup [openGLContext] [
[bounds] init-gl world get draw-gadget view-dim init-gl world get draw-gadget
] with-gl-context ] with-gl-context
] ]
} }
@ -137,31 +91,31 @@ IN: gadgets-cocoa
} }
{ "mouseDown:" "void" { "id" "SEL" "id" } { "mouseDown:" "void" { "id" "SEL" "id" }
[ 2nip send-button-down ] [ 2nip button send-button-down ]
} }
{ "mouseUp:" "void" { "id" "SEL" "id" } { "mouseUp:" "void" { "id" "SEL" "id" }
[ 2nip send-button-up ] [ 2nip button send-button-up ]
} }
{ "rightMouseDown:" "void" { "id" "SEL" "id" } { "rightMouseDown:" "void" { "id" "SEL" "id" }
[ 2nip send-button-down ] [ 2nip button send-button-down ]
} }
{ "rightMouseUp:" "void" { "id" "SEL" "id" } { "rightMouseUp:" "void" { "id" "SEL" "id" }
[ 2nip send-button-up ] [ 2nip button send-button-up ]
} }
{ "otherMouseDown:" "void" { "id" "SEL" "id" } { "otherMouseDown:" "void" { "id" "SEL" "id" }
[ 2nip send-button-down ] [ 2nip button send-button-down ]
} }
{ "otherMouseUp:" "void" { "id" "SEL" "id" } { "otherMouseUp:" "void" { "id" "SEL" "id" }
[ 2nip send-button-up ] [ 2nip button send-button-up ]
} }
{ "scrollWheel:" "void" { "id" "SEL" "id" } { "scrollWheel:" "void" { "id" "SEL" "id" }
[ 2nip send-scroll-wheel ] [ 2nip [deltaY] 0 > send-scroll-wheel ]
} }
{ "keyDown:" "void" { "id" "SEL" "id" } { "keyDown:" "void" { "id" "SEL" "id" }
@ -169,17 +123,18 @@ IN: gadgets-cocoa
} }
{ "updateFactorGadgetSize:" "void" { "id" "SEL" "id" } { "updateFactorGadgetSize:" "void" { "id" "SEL" "id" }
[ 2drop world get resize-world ] [ 2drop view-dim world get set-gadget-dim ]
} }
{ "acceptsFirstResponder" "bool" { "id" "SEL" } { "acceptsFirstResponder" "bool" { "id" "SEL" }
[ 2drop 1 ] [ 2drop 1 ]
} }
} { } define-objc-class ; parsing } { } define-objc-class
init-FactorView-class IN: objc-FactorView
DEFER: FactorView
USE: objc-FactorView IN: gadgets-cocoa
: <FactorView> ( gadget -- view ) : <FactorView> ( gadget -- view )
drop drop
@ -187,18 +142,18 @@ USE: objc-FactorView
0 0 100 100 <NSRect> NSOpenGLView [defaultPixelFormat] 0 0 100 100 <NSRect> NSOpenGLView [defaultPixelFormat]
[initWithFrame:pixelFormat:] [initWithFrame:pixelFormat:]
dup 1 [setPostsBoundsChangedNotifications:] dup 1 [setPostsBoundsChangedNotifications:]
dup 1 [setPostsFrameChangedNotifications:] ; dup 1 [setPostsFrameChangedNotifications:]
dup "updateFactorGadgetSize:" add-resize-observer ;
: <FactorWindow> ( gadget title -- window ) : <FactorWindow> ( gadget title -- window )
over rect-dim first2 0 0 2swap <NSRect> <NSWindow> over rect-dim first2 0 0 2swap <NSRect> <NSWindow>
[ swap <FactorView> [setContentView:] ] 2keep [ swap <FactorView> [setContentView:] ] 2keep
[ swap set-world-handle ] keep ; [ swap set-world-handle ] keep
dup 1 [setAcceptsMouseMovedEvents:]
dup dup [contentView] [setInitialFirstResponder:]
dup f [makeKeyAndOrderFront:] ;
: NSViewBoundsDidChangeNotification IN: shells
"NSViewBoundsDidChangeNotification" <NSString> ;
: NSViewFrameDidChangeNotification
"NSViewFrameDidChangeNotification" <NSString> ;
: ui : ui
[ [
@ -207,23 +162,10 @@ USE: objc-FactorView
world get ui-title <FactorWindow> world get ui-title <FactorWindow>
dup 1 [setAcceptsMouseMovedEvents:]
dup dup [contentView] [setInitialFirstResponder:]
NSNotificationCenter [defaultCenter]
over [contentView]
"updateFactorGadgetSize:" sel_registerName
NSViewFrameDidChangeNotification
pick
[addObserver:selector:name:object:]
dup f [makeKeyAndOrderFront:]
[contentView] [openGLContext] [makeCurrentContext]
listener-application listener-application
NSApplication [sharedApplication] [finishLaunching] NSApplication [sharedApplication] [finishLaunching]
event-loop event-loop
] with-cocoa ] with-cocoa
] with-freetype ; ] with-freetype ;

View File

@ -0,0 +1,17 @@
! Copyright (C) 2006 Slava Pestov
! See http://factorcode.org/license.txt for BSD license.
IN: cocoa
USING: arrays kernel objc-NSOpenGLContext objc-NSView opengl ;
: with-gl-context ( context quot -- )
swap
[ [makeCurrentContext] call glFlush ] keep
[flushBuffer] ; inline
: view-dim [bounds] dup NSRect-w swap NSRect-h 0 3array ;
: NSViewFrameDidChangeNotification
"NSViewFrameDidChangeNotification" <NSString> ;
: add-resize-observer ( view selector -- )
NSViewFrameDidChangeNotification pick add-observer ;

View File

@ -1,5 +1,5 @@
! Copyright (C) 2005 Slava Pestov. ! Copyright (C) 2005, 2006 Slava Pestov.
! See http://factor.sf.net/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
IN: gadgets IN: gadgets
USING: kernel math namespaces sequences ; USING: kernel math namespaces sequences ;
@ -21,6 +21,19 @@ C: hand ( -- hand )
swap hand get hand-clicked 3dup >r add r> handle-gesture swap hand get hand-clicked 3dup >r add r> handle-gesture
[ nip handle-gesture drop ] [ 3drop ] if ; [ nip handle-gesture drop ] [ 3drop ] if ;
: send-button-down ( event -- )
update-clicked
dup hand get hand-buttons push
[ button-down ] button-gesture ;
: send-button-up ( event -- )
dup hand get hand-buttons delete
[ button-up ] button-gesture ;
: send-scroll-wheel ( up/down -- )
[ wheel-up ] [ wheel-down ] ?
hand get hand-clicked handle-gesture drop ;
: drag-gesture ( -- ) : drag-gesture ( -- )
#! Send a gesture like [ drag 2 ]; if nobody handles it, #! Send a gesture like [ drag 2 ]; if nobody handles it,
#! send [ drag ]. #! send [ drag ].
@ -33,6 +46,10 @@ C: hand ( -- hand )
[ motion ] over hand-gadget handle-gesture drop [ motion ] over hand-gadget handle-gesture drop
hand-buttons empty? [ drag-gesture ] unless ; hand-buttons empty? [ drag-gesture ] unless ;
: send-user-input ( string -- )
dup empty?
[ hand get hand-focus user-input ] unless drop ;
: each-gesture ( gesture seq -- ) : each-gesture ( gesture seq -- )
[ handle-gesture* drop ] each-with ; [ handle-gesture* drop ] each-with ;

View File

@ -1,10 +1,27 @@
! Copyright (C) 2005 Slava Pestov. ! Copyright (C) 2005, 2006 Slava Pestov.
! See http://factor.sf.net/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: alien arrays freetype gadgets-layouts generic hashtables USING: alien arrays freetype gadgets-layouts generic hashtables
io kernel lists math namespaces opengl sequences strings io kernel lists math namespaces opengl sequences strings
styles vectors ; styles vectors ;
IN: gadgets IN: gadgets
: init-gl ( dim -- )
0.0 0.0 0.0 0.0 glClearColor
{ 1.0 0.0 0.0 0.0 } gl-color
GL_COLOR_BUFFER_BIT glClear
GL_PROJECTION glMatrixMode
glLoadIdentity
GL_MODELVIEW glMatrixMode
glLoadIdentity
{ 0 0 0 } over <rect> clip set
dup first2 0 0 2swap glViewport
0 swap first2 0 gluOrtho2D
GL_SMOOTH glShadeModel
GL_BLEND glEnable
GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA glBlendFunc
GL_SCISSOR_TEST glEnable
GL_MODELVIEW glMatrixMode ;
GENERIC: draw-gadget* ( gadget -- ) GENERIC: draw-gadget* ( gadget -- )
M: gadget draw-gadget* ( gadget -- ) drop ; M: gadget draw-gadget* ( gadget -- ) drop ;