| @@ -54,6 +54,16 @@ namespace | |||||
| } | } | ||||
| } | } | ||||
| //============================================================================== | |||||
| template <typename ObjectType> | |||||
| struct NSObjectRetainer | |||||
| { | |||||
| inline NSObjectRetainer (ObjectType* o) : object (o) { [object retain]; } | |||||
| inline ~NSObjectRetainer() { [object release]; } | |||||
| ObjectType* object; | |||||
| }; | |||||
| //============================================================================== | //============================================================================== | ||||
| template <typename SuperclassType> | template <typename SuperclassType> | ||||
| struct ObjCClass | struct ObjCClass | ||||
| @@ -676,11 +676,9 @@ public: | |||||
| return used; | return used; | ||||
| } | } | ||||
| else | |||||
| { | |||||
| if (handleKeyUpOrDown (false)) | |||||
| return true; | |||||
| } | |||||
| if (handleKeyUpOrDown (false)) | |||||
| return true; | |||||
| } | } | ||||
| return false; | return false; | ||||
| @@ -688,6 +686,10 @@ public: | |||||
| bool redirectKeyDown (NSEvent* ev) | bool redirectKeyDown (NSEvent* ev) | ||||
| { | { | ||||
| // (need to retain this in case a modal loop runs in handleKeyEvent and | |||||
| // our event object gets lost) | |||||
| const NSObjectRetainer<NSEvent> r (ev); | |||||
| updateKeysDown (ev, true); | updateKeysDown (ev, true); | ||||
| bool used = handleKeyEvent (ev, true); | bool used = handleKeyEvent (ev, true); | ||||
| @@ -715,6 +717,9 @@ public: | |||||
| void redirectModKeyChange (NSEvent* ev) | void redirectModKeyChange (NSEvent* ev) | ||||
| { | { | ||||
| // (need to retain this in case a modal loop runs and our event object gets lost) | |||||
| const NSObjectRetainer<NSEvent> r (ev); | |||||
| keysCurrentlyDown.clear(); | keysCurrentlyDown.clear(); | ||||
| handleKeyUpOrDown (true); | handleKeyUpOrDown (true); | ||||
| @@ -26,13 +26,13 @@ | |||||
| class UIViewComponent::Pimpl : public ComponentMovementWatcher | class UIViewComponent::Pimpl : public ComponentMovementWatcher | ||||
| { | { | ||||
| public: | public: | ||||
| Pimpl (UIView* const view_, Component& owner_) | |||||
| : ComponentMovementWatcher (&owner_), | |||||
| view (view_), | |||||
| owner (owner_), | |||||
| Pimpl (UIView* const v, Component& comp) | |||||
| : ComponentMovementWatcher (&comp), | |||||
| view (v), | |||||
| owner (comp), | |||||
| currentPeer (nullptr) | currentPeer (nullptr) | ||||
| { | { | ||||
| [view_ retain]; | |||||
| [view retain]; | |||||
| if (owner.isShowing()) | if (owner.isShowing()) | ||||
| componentPeerChanged(); | componentPeerChanged(); | ||||