cocoa: Allow ?-> syntax for methods that might not exist.

If a method doesn't exist we need to provide a signature so the stack is balanced. This should also allow deploying from macOS versions that do not contain methods to ones that do. This is an alternative to asking a class if it provides a selector.
char-rename
Doug Coleman 2017-06-01 11:55:08 -05:00
parent f7ce73b962
commit d838f95370
3 changed files with 17 additions and 7 deletions

View File

@ -14,6 +14,8 @@ SYMBOL: sent-messages
SYNTAX: -> scan-token dup remember-send suffix! \ send suffix! ;
SYNTAX: ?-> scan-token dup remember-send suffix! \ ?send suffix! ;
SYNTAX: SEL:
scan-token
[ remember-send ]

View File

@ -86,6 +86,14 @@ MACRO: (send) ( selector super? -- quot )
: send ( receiver args... selector -- return... ) f (send) ; inline
MACRO:: (?send) ( effect selector super? -- quot )
selector dup ?lookup-method effect or super?
[ make-prepare-send ] 2keep
super-message-senders message-senders ? get at
[ 1quotation append ] [ effect selector sender-stub 1quotation append ] if* ;
: ?send ( receiver args... selector effect -- return... ) f (?send) ; inline
: super-send ( receiver args... selector -- return... ) t (send) ; inline
! Runtime introspection

View File

@ -1,8 +1,8 @@
! Copyright (C) 2017 Doug Coleman.
! See http://factorcode.org/license.txt for BSD license.
USING: accessors alien.enums alien.syntax cocoa cocoa.classes
cocoa.messages combinators core-foundation.strings kernel locals
namespaces sequences words ;
USING: accessors alien.c-types alien.enums alien.syntax cocoa
cocoa.classes cocoa.messages cocoa.runtime combinators
core-foundation.strings kernel locals namespaces sequences words ;
IN: cocoa.touchbar
! ui.backend.cocoa.views creates buttons for each of these actions
@ -15,17 +15,17 @@ ENUM: default-touchbar refresh-all-action auto-use-action ;
: make-touchbar ( enum self -- touchbar )
[ NSTouchBar -> alloc -> init dup ] dip -> setDelegate: {
[ swap enum>CFStringArray -> setDefaultItemIdentifiers: ]
[ swap enum>CFStringArray -> setCustomizationAllowedItemIdentifiers: ]
[ swap enum>CFStringArray { void { id SEL id } } ?-> setDefaultItemIdentifiers: ]
[ swap enum>CFStringArray { void { id SEL id } } ?-> setCustomizationAllowedItemIdentifiers: ]
[ nip ]
} 2cleave ;
:: make-NSTouchBar-button ( self identifier label-string action-string -- button )
NSCustomTouchBarItem -> alloc
identifier <CFString> -> initWithIdentifier: :> item
identifier <CFString> { id { id SEL id } } ?-> initWithIdentifier: :> item
NSButton
label-string <CFString>
self
action-string lookup-selector -> buttonWithTitle:target:action: :> button
action-string lookup-selector { id { id SEL id id SEL } } ?-> buttonWithTitle:target:action: :> button
item button -> setView:
item ;