interface for controlling window controls (close, minimize, resize, titlebar, etc.). cocoa backend
parent
2b3d62821e
commit
3231fcd052
|
@ -60,6 +60,7 @@ SYNTAX: IMPORT: scan [ ] import-objc-class ;
|
|||
"NSOpenGLPixelFormat"
|
||||
"NSOpenGLView"
|
||||
"NSOpenPanel"
|
||||
"NSPanel"
|
||||
"NSPasteboard"
|
||||
"NSPropertyListSerialization"
|
||||
"NSResponder"
|
||||
|
|
|
@ -4,36 +4,37 @@ USING: arrays kernel math cocoa cocoa.messages cocoa.classes
|
|||
sequences math.bitwise ;
|
||||
IN: cocoa.windows
|
||||
|
||||
! Window styles
|
||||
CONSTANT: NSBorderlessWindowMask 0
|
||||
CONSTANT: NSTitledWindowMask 1
|
||||
CONSTANT: NSClosableWindowMask 2
|
||||
CONSTANT: NSMiniaturizableWindowMask 4
|
||||
CONSTANT: NSResizableWindowMask 8
|
||||
|
||||
! Additional panel-only styles
|
||||
CONSTANT: NSUtilityWindowMask 16
|
||||
CONSTANT: NSDocModalWindowMask 64
|
||||
CONSTANT: NSNonactivatingPanelMask 128
|
||||
CONSTANT: NSHUDWindowMask HEX: 1000
|
||||
|
||||
CONSTANT: NSBackingStoreRetained 0
|
||||
CONSTANT: NSBackingStoreNonretained 1
|
||||
CONSTANT: NSBackingStoreBuffered 2
|
||||
|
||||
: standard-window-type ( -- n )
|
||||
{
|
||||
NSTitledWindowMask
|
||||
NSClosableWindowMask
|
||||
NSMiniaturizableWindowMask
|
||||
NSResizableWindowMask
|
||||
} flags ; inline
|
||||
|
||||
: <NSWindow> ( rect -- window )
|
||||
NSWindow -> alloc swap
|
||||
standard-window-type NSBackingStoreBuffered 1
|
||||
: <NSWindow> ( rect style class -- window )
|
||||
[ -> alloc ] curry 2dip NSBackingStoreBuffered 1
|
||||
-> initWithContentRect:styleMask:backing:defer: ;
|
||||
|
||||
: <ViewWindow> ( view rect -- window )
|
||||
<NSWindow> [ swap -> setContentView: ] keep
|
||||
: class-for-style ( style -- NSWindow/NSPanel )
|
||||
HEX: 1ff0 bitand zero? NSWindow NSPanel ? ;
|
||||
|
||||
: <ViewWindow> ( view rect style -- window )
|
||||
dup class-for-style <NSWindow> [ swap -> setContentView: ] keep
|
||||
dup dup -> contentView -> setInitialFirstResponder:
|
||||
dup 1 -> setAcceptsMouseMovedEvents:
|
||||
dup 0 -> setReleasedWhenClosed: ;
|
||||
|
||||
: window-content-rect ( window -- rect )
|
||||
[ NSWindow ] dip
|
||||
dup -> class swap
|
||||
[ -> frame ] [ -> styleMask ] bi
|
||||
-> contentRectForFrameRect:styleMask: ;
|
||||
|
|
|
@ -109,10 +109,23 @@ M: cocoa-ui-backend (set-fullscreen) ( world ? -- )
|
|||
M: cocoa-ui-backend (fullscreen?) ( world -- ? )
|
||||
handle>> view>> -> isInFullScreenMode zero? not ;
|
||||
|
||||
CONSTANT: window-control>styleMask
|
||||
H{
|
||||
{ close-button $ NSClosableWindowMask }
|
||||
{ minimize-button $ NSMiniaturizableWindowMask }
|
||||
{ maximize-button 0 }
|
||||
{ resize-handles $ NSResizableWindowMask }
|
||||
{ small-title-bar $[ NSTitledWindowMask NSUtilityWindowMask bitor ] }
|
||||
{ normal-title-bar $ NSTitledWindowMask }
|
||||
}
|
||||
|
||||
: world>styleMask ( world -- n )
|
||||
window-controls>> [ window-control>styleMask at ] map 0 [ bitor ] reduce ;
|
||||
|
||||
M:: cocoa-ui-backend (open-window) ( world -- )
|
||||
world [ [ dim>> ] dip <FactorView> ]
|
||||
with-world-pixel-format :> view
|
||||
view world world>NSRect <ViewWindow> :> window
|
||||
view world [ world>NSRect ] [ world>styleMask ] bi <ViewWindow> :> window
|
||||
view -> release
|
||||
world view register-window
|
||||
window world window-loc>> auto-position
|
||||
|
|
|
@ -7,16 +7,34 @@ ui.gadgets ui.gestures ui.render ui.backend ui.gadgets.tracks
|
|||
ui.pixel-formats destructors literals strings ;
|
||||
IN: ui.gadgets.worlds
|
||||
|
||||
SYMBOLS:
|
||||
close-button
|
||||
minimize-button
|
||||
maximize-button
|
||||
resize-handles
|
||||
small-title-bar
|
||||
normal-title-bar ;
|
||||
|
||||
CONSTANT: default-world-pixel-format-attributes
|
||||
{ windowed double-buffered T{ depth-bits { value 16 } } }
|
||||
|
||||
CONSTANT: default-world-window-controls
|
||||
{
|
||||
normal-title-bar
|
||||
close-button
|
||||
minimize-button
|
||||
maximize-button
|
||||
resize-handles
|
||||
}
|
||||
|
||||
TUPLE: world < track
|
||||
active? focused? grab-input?
|
||||
layers
|
||||
title status status-owner
|
||||
text-handle handle images
|
||||
window-loc
|
||||
pixel-format-attributes ;
|
||||
pixel-format-attributes
|
||||
window-controls ;
|
||||
|
||||
TUPLE: world-attributes
|
||||
{ world-class initial: world }
|
||||
|
@ -24,7 +42,8 @@ TUPLE: world-attributes
|
|||
{ title string initial: "Factor Window" }
|
||||
status
|
||||
gadgets
|
||||
{ pixel-format-attributes initial: $ default-world-pixel-format-attributes } ;
|
||||
{ pixel-format-attributes initial: $ default-world-pixel-format-attributes }
|
||||
{ window-controls initial: $ default-world-window-controls } ;
|
||||
|
||||
: <world-attributes> ( -- world-attributes )
|
||||
world-attributes new ; inline
|
||||
|
@ -86,6 +105,7 @@ M: world request-focus-on ( child gadget -- )
|
|||
[ title>> >>title ]
|
||||
[ status>> >>status ]
|
||||
[ pixel-format-attributes>> >>pixel-format-attributes ]
|
||||
[ window-controls>> >>window-controls ]
|
||||
[ grab-input?>> >>grab-input? ]
|
||||
[ gadgets>> [ 1 track-add ] each ]
|
||||
} cleave ;
|
||||
|
|
Loading…
Reference in New Issue