| @@ -557,7 +557,7 @@ PopupMenu ComponentLayout::getRelativeTargetMenu (Component* comp, int whichDime | |||
| { | |||
| Component* const c = components.getUnchecked(i); | |||
| if (c->getComponentUID() != comp->getComponentUID()) | |||
| if (c != comp) | |||
| { | |||
| m.addItem (menuIdBase + i + 1, | |||
| T("Relative to ") + getComponentMemberVariableName (c) | |||
| @@ -39862,18 +39862,158 @@ enum ComponentMessageNumbers | |||
| exitModalStateMessage = 0x7fff0002 | |||
| }; | |||
| static uint32 nextComponentUID = 0; | |||
| Component* Component::currentlyFocusedComponent = 0; | |||
| class Component::MouseListenerList | |||
| { | |||
| public: | |||
| MouseListenerList() | |||
| : numDeepMouseListeners (0) | |||
| { | |||
| } | |||
| ~MouseListenerList() | |||
| { | |||
| } | |||
| void addListener (MouseListener* const newListener, const bool wantsEventsForAllNestedChildComponents) | |||
| { | |||
| if (! listeners.contains (newListener)) | |||
| { | |||
| if (wantsEventsForAllNestedChildComponents) | |||
| { | |||
| listeners.insert (0, newListener); | |||
| ++numDeepMouseListeners; | |||
| } | |||
| else | |||
| { | |||
| listeners.add (newListener); | |||
| } | |||
| } | |||
| } | |||
| void removeListener (MouseListener* const listenerToRemove) | |||
| { | |||
| const int index = listeners.indexOf (listenerToRemove); | |||
| if (index >= 0) | |||
| { | |||
| if (index < numDeepMouseListeners) | |||
| --numDeepMouseListeners; | |||
| listeners.remove (index); | |||
| } | |||
| } | |||
| static void sendMouseEvent (Component* comp, BailOutChecker& checker, | |||
| void (MouseListener::*eventMethod) (const MouseEvent&), const MouseEvent& e) | |||
| { | |||
| if (checker.shouldBailOut()) | |||
| return; | |||
| { | |||
| MouseListenerList* const list = comp->mouseListeners_; | |||
| if (list != 0) | |||
| { | |||
| for (int i = list->listeners.size(); --i >= 0;) | |||
| { | |||
| (list->listeners.getUnchecked(i)->*eventMethod) (e); | |||
| if (checker.shouldBailOut()) | |||
| return; | |||
| i = jmin (i, list->listeners.size()); | |||
| } | |||
| } | |||
| } | |||
| Component* p = comp->parentComponent_; | |||
| while (p != 0) | |||
| { | |||
| MouseListenerList* const list = p->mouseListeners_; | |||
| if (list != 0 && list->numDeepMouseListeners > 0) | |||
| { | |||
| BailOutChecker checker2 (comp, p); | |||
| for (int i = list->numDeepMouseListeners; --i >= 0;) | |||
| { | |||
| (list->listeners.getUnchecked(i)->*eventMethod) (e); | |||
| if (checker2.shouldBailOut()) | |||
| return; | |||
| i = jmin (i, list->numDeepMouseListeners); | |||
| } | |||
| } | |||
| p = p->parentComponent_; | |||
| } | |||
| } | |||
| static void sendWheelEvent (Component* comp, BailOutChecker& checker, const MouseEvent& e, | |||
| const float wheelIncrementX, const float wheelIncrementY) | |||
| { | |||
| if (checker.shouldBailOut()) | |||
| return; | |||
| { | |||
| MouseListenerList* const list = comp->mouseListeners_; | |||
| if (list != 0) | |||
| { | |||
| for (int i = list->listeners.size(); --i >= 0;) | |||
| { | |||
| list->listeners.getUnchecked(i)->mouseWheelMove (e, wheelIncrementX, wheelIncrementY); | |||
| if (checker.shouldBailOut()) | |||
| return; | |||
| i = jmin (i, list->listeners.size()); | |||
| } | |||
| } | |||
| } | |||
| Component* p = comp->parentComponent_; | |||
| while (p != 0) | |||
| { | |||
| MouseListenerList* const list = p->mouseListeners_; | |||
| if (list != 0 && list->numDeepMouseListeners > 0) | |||
| { | |||
| BailOutChecker checker2 (comp, p); | |||
| for (int i = list->numDeepMouseListeners; --i >= 0;) | |||
| { | |||
| list->listeners.getUnchecked(i)->mouseWheelMove (e, wheelIncrementX, wheelIncrementY); | |||
| if (checker2.shouldBailOut()) | |||
| return; | |||
| i = jmin (i, list->numDeepMouseListeners); | |||
| } | |||
| } | |||
| p = p->parentComponent_; | |||
| } | |||
| } | |||
| private: | |||
| Array <MouseListener*> listeners; | |||
| int numDeepMouseListeners; | |||
| MouseListenerList (const MouseListenerList&); | |||
| MouseListenerList& operator= (const MouseListenerList&); | |||
| }; | |||
| Component::Component() | |||
| : parentComponent_ (0), | |||
| componentUID (++nextComponentUID), | |||
| numDeepMouseListeners (0), | |||
| lookAndFeel_ (0), | |||
| effect_ (0), | |||
| bufferedImage_ (0), | |||
| mouseListeners_ (0), | |||
| keyListeners_ (0), | |||
| componentFlags_ (0), | |||
| componentTransparency (0) | |||
| { | |||
| @@ -39882,13 +40022,9 @@ Component::Component() | |||
| Component::Component (const String& name) | |||
| : componentName_ (name), | |||
| parentComponent_ (0), | |||
| componentUID (++nextComponentUID), | |||
| numDeepMouseListeners (0), | |||
| lookAndFeel_ (0), | |||
| effect_ (0), | |||
| bufferedImage_ (0), | |||
| mouseListeners_ (0), | |||
| keyListeners_ (0), | |||
| componentFlags_ (0), | |||
| componentTransparency (0) | |||
| { | |||
| @@ -39915,9 +40051,6 @@ Component::~Component() | |||
| for (int i = childComponentList_.size(); --i >= 0;) | |||
| childComponentList_.getUnchecked(i)->parentComponent_ = 0; | |||
| delete mouseListeners_; | |||
| delete keyListeners_; | |||
| } | |||
| void Component::setName (const String& name) | |||
| @@ -41756,20 +41889,9 @@ void Component::addMouseListener (MouseListener* const newListener, | |||
| jassert ((newListener != this) || wantsEventsForAllNestedChildComponents); | |||
| if (mouseListeners_ == 0) | |||
| mouseListeners_ = new Array<MouseListener*>(); | |||
| mouseListeners_ = new MouseListenerList(); | |||
| if (! mouseListeners_->contains (newListener)) | |||
| { | |||
| if (wantsEventsForAllNestedChildComponents) | |||
| { | |||
| mouseListeners_->insert (0, newListener); | |||
| ++numDeepMouseListeners; | |||
| } | |||
| else | |||
| { | |||
| mouseListeners_->add (newListener); | |||
| } | |||
| } | |||
| mouseListeners_->addListener (newListener, wantsEventsForAllNestedChildComponents); | |||
| } | |||
| void Component::removeMouseListener (MouseListener* const listenerToRemove) | |||
| @@ -41779,17 +41901,7 @@ void Component::removeMouseListener (MouseListener* const listenerToRemove) | |||
| checkMessageManagerIsLocked | |||
| if (mouseListeners_ != 0) | |||
| { | |||
| const int index = mouseListeners_->indexOf (listenerToRemove); | |||
| if (index >= 0) | |||
| { | |||
| if (index < numDeepMouseListeners) | |||
| --numDeepMouseListeners; | |||
| mouseListeners_->remove (index); | |||
| } | |||
| } | |||
| mouseListeners_->removeListener (listenerToRemove); | |||
| } | |||
| void Component::internalMouseEnter (MouseInputSource& source, const Point<int>& relativePos, const Time& time) | |||
| @@ -41813,9 +41925,7 @@ void Component::internalMouseEnter (MouseInputSource& source, const Point<int>& | |||
| repaint(); | |||
| const MouseEvent me (source, relativePos, source.getCurrentModifiers(), | |||
| this, this, time, relativePos, | |||
| time, 0, false); | |||
| this, this, time, relativePos, time, 0, false); | |||
| mouseEnter (me); | |||
| if (checker.shouldBailOut()) | |||
| @@ -41824,43 +41934,7 @@ void Component::internalMouseEnter (MouseInputSource& source, const Point<int>& | |||
| Desktop::getInstance().resetTimer(); | |||
| Desktop::getInstance().mouseListeners.callChecked (checker, &MouseListener::mouseEnter, me); | |||
| if (checker.shouldBailOut()) | |||
| return; | |||
| if (mouseListeners_ != 0) | |||
| { | |||
| for (int i = mouseListeners_->size(); --i >= 0;) | |||
| { | |||
| mouseListeners_->getUnchecked(i)->mouseEnter (me); | |||
| if (checker.shouldBailOut()) | |||
| return; | |||
| i = jmin (i, mouseListeners_->size()); | |||
| } | |||
| } | |||
| Component* p = parentComponent_; | |||
| while (p != 0) | |||
| { | |||
| if (p->numDeepMouseListeners > 0) | |||
| { | |||
| BailOutChecker checker2 (this, p); | |||
| for (int i = p->numDeepMouseListeners; --i >= 0;) | |||
| { | |||
| p->mouseListeners_->getUnchecked(i)->mouseEnter (me); | |||
| if (checker2.shouldBailOut()) | |||
| return; | |||
| i = jmin (i, p->numDeepMouseListeners); | |||
| } | |||
| } | |||
| p = p->parentComponent_; | |||
| } | |||
| MouseListenerList::sendMouseEvent (this, checker, &MouseListener::mouseEnter, me); | |||
| } | |||
| } | |||
| @@ -41886,8 +41960,7 @@ void Component::internalMouseExit (MouseInputSource& source, const Point<int>& r | |||
| repaint(); | |||
| const MouseEvent me (source, relativePos, source.getCurrentModifiers(), | |||
| this, this, time, relativePos, | |||
| time, 0, false); | |||
| this, this, time, relativePos, time, 0, false); | |||
| mouseExit (me); | |||
| if (checker.shouldBailOut()) | |||
| @@ -41896,43 +41969,7 @@ void Component::internalMouseExit (MouseInputSource& source, const Point<int>& r | |||
| Desktop::getInstance().resetTimer(); | |||
| Desktop::getInstance().mouseListeners.callChecked (checker, &MouseListener::mouseExit, me); | |||
| if (checker.shouldBailOut()) | |||
| return; | |||
| if (mouseListeners_ != 0) | |||
| { | |||
| for (int i = mouseListeners_->size(); --i >= 0;) | |||
| { | |||
| ((MouseListener*) mouseListeners_->getUnchecked (i))->mouseExit (me); | |||
| if (checker.shouldBailOut()) | |||
| return; | |||
| i = jmin (i, mouseListeners_->size()); | |||
| } | |||
| } | |||
| Component* p = parentComponent_; | |||
| while (p != 0) | |||
| { | |||
| if (p->numDeepMouseListeners > 0) | |||
| { | |||
| BailOutChecker checker2 (this, p); | |||
| for (int i = p->numDeepMouseListeners; --i >= 0;) | |||
| { | |||
| p->mouseListeners_->getUnchecked (i)->mouseExit (me); | |||
| if (checker2.shouldBailOut()) | |||
| return; | |||
| i = jmin (i, p->numDeepMouseListeners); | |||
| } | |||
| } | |||
| p = p->parentComponent_; | |||
| } | |||
| MouseListenerList::sendMouseEvent (this, checker, &MouseListener::mouseExit, me); | |||
| } | |||
| } | |||
| @@ -42060,43 +42097,7 @@ void Component::internalMouseDown (MouseInputSource& source, const Point<int>& r | |||
| desktop.resetTimer(); | |||
| desktop.mouseListeners.callChecked (checker, &MouseListener::mouseDown, me); | |||
| if (checker.shouldBailOut()) | |||
| return; | |||
| if (mouseListeners_ != 0) | |||
| { | |||
| for (int i = mouseListeners_->size(); --i >= 0;) | |||
| { | |||
| ((MouseListener*) mouseListeners_->getUnchecked (i))->mouseDown (me); | |||
| if (checker.shouldBailOut()) | |||
| return; | |||
| i = jmin (i, mouseListeners_->size()); | |||
| } | |||
| } | |||
| Component* p = parentComponent_; | |||
| while (p != 0) | |||
| { | |||
| if (p->numDeepMouseListeners > 0) | |||
| { | |||
| BailOutChecker checker2 (this, p); | |||
| for (int i = p->numDeepMouseListeners; --i >= 0;) | |||
| { | |||
| p->mouseListeners_->getUnchecked (i)->mouseDown (me); | |||
| if (checker2.shouldBailOut()) | |||
| return; | |||
| i = jmin (i, p->numDeepMouseListeners); | |||
| } | |||
| } | |||
| p = p->parentComponent_; | |||
| } | |||
| MouseListenerList::sendMouseEvent (this, checker, &MouseListener::mouseDown, me); | |||
| } | |||
| void Component::internalMouseUp (MouseInputSource& source, const Point<int>& relativePos, const Time& time, const ModifierKeys& oldModifiers) | |||
| @@ -42127,95 +42128,21 @@ void Component::internalMouseUp (MouseInputSource& source, const Point<int>& rel | |||
| desktop.resetTimer(); | |||
| desktop.mouseListeners.callChecked (checker, &MouseListener::mouseUp, me); | |||
| MouseListenerList::sendMouseEvent (this, checker, &MouseListener::mouseUp, me); | |||
| if (checker.shouldBailOut()) | |||
| return; | |||
| if (mouseListeners_ != 0) | |||
| { | |||
| for (int i = mouseListeners_->size(); --i >= 0;) | |||
| { | |||
| ((MouseListener*) mouseListeners_->getUnchecked (i))->mouseUp (me); | |||
| if (checker.shouldBailOut()) | |||
| return; | |||
| i = jmin (i, mouseListeners_->size()); | |||
| } | |||
| } | |||
| { | |||
| Component* p = parentComponent_; | |||
| while (p != 0) | |||
| { | |||
| if (p->numDeepMouseListeners > 0) | |||
| { | |||
| BailOutChecker checker2 (this, p); | |||
| for (int i = p->numDeepMouseListeners; --i >= 0;) | |||
| { | |||
| p->mouseListeners_->getUnchecked (i)->mouseUp (me); | |||
| if (checker2.shouldBailOut()) | |||
| return; | |||
| i = jmin (i, p->numDeepMouseListeners); | |||
| } | |||
| } | |||
| p = p->parentComponent_; | |||
| } | |||
| } | |||
| // check for double-click | |||
| if (me.getNumberOfClicks() >= 2) | |||
| { | |||
| const int numListeners = (mouseListeners_ != 0) ? mouseListeners_->size() : 0; | |||
| mouseDoubleClick (me); | |||
| if (checker.shouldBailOut()) | |||
| return; | |||
| desktop.mouseListeners.callChecked (checker, &MouseListener::mouseDoubleClick, me); | |||
| if (checker.shouldBailOut()) | |||
| return; | |||
| for (int i = numListeners; --i >= 0;) | |||
| { | |||
| if (checker.shouldBailOut()) | |||
| return; | |||
| MouseListener* const ml = (MouseListener*)((*mouseListeners_)[i]); | |||
| if (ml != 0) | |||
| ml->mouseDoubleClick (me); | |||
| } | |||
| if (checker.shouldBailOut()) | |||
| return; | |||
| Component* p = parentComponent_; | |||
| while (p != 0) | |||
| { | |||
| if (p->numDeepMouseListeners > 0) | |||
| { | |||
| BailOutChecker checker2 (this, p); | |||
| for (int i = p->numDeepMouseListeners; --i >= 0;) | |||
| { | |||
| p->mouseListeners_->getUnchecked (i)->mouseDoubleClick (me); | |||
| if (checker2.shouldBailOut()) | |||
| return; | |||
| i = jmin (i, p->numDeepMouseListeners); | |||
| } | |||
| } | |||
| p = p->parentComponent_; | |||
| } | |||
| MouseListenerList::sendMouseEvent (this, checker, &MouseListener::mouseDoubleClick, me); | |||
| } | |||
| } | |||
| } | |||
| @@ -42245,43 +42172,7 @@ void Component::internalMouseDrag (MouseInputSource& source, const Point<int>& r | |||
| desktop.resetTimer(); | |||
| desktop.mouseListeners.callChecked (checker, &MouseListener::mouseDrag, me); | |||
| if (checker.shouldBailOut()) | |||
| return; | |||
| if (mouseListeners_ != 0) | |||
| { | |||
| for (int i = mouseListeners_->size(); --i >= 0;) | |||
| { | |||
| ((MouseListener*) mouseListeners_->getUnchecked (i))->mouseDrag (me); | |||
| if (checker.shouldBailOut()) | |||
| return; | |||
| i = jmin (i, mouseListeners_->size()); | |||
| } | |||
| } | |||
| Component* p = parentComponent_; | |||
| while (p != 0) | |||
| { | |||
| if (p->numDeepMouseListeners > 0) | |||
| { | |||
| BailOutChecker checker2 (this, p); | |||
| for (int i = p->numDeepMouseListeners; --i >= 0;) | |||
| { | |||
| p->mouseListeners_->getUnchecked (i)->mouseDrag (me); | |||
| if (checker2.shouldBailOut()) | |||
| return; | |||
| i = jmin (i, p->numDeepMouseListeners); | |||
| } | |||
| } | |||
| p = p->parentComponent_; | |||
| } | |||
| MouseListenerList::sendMouseEvent (this, checker, &MouseListener::mouseDrag, me); | |||
| } | |||
| } | |||
| @@ -42311,43 +42202,7 @@ void Component::internalMouseMove (MouseInputSource& source, const Point<int>& r | |||
| desktop.resetTimer(); | |||
| desktop.mouseListeners.callChecked (checker, &MouseListener::mouseMove, me); | |||
| if (checker.shouldBailOut()) | |||
| return; | |||
| if (mouseListeners_ != 0) | |||
| { | |||
| for (int i = mouseListeners_->size(); --i >= 0;) | |||
| { | |||
| ((MouseListener*) mouseListeners_->getUnchecked (i))->mouseMove (me); | |||
| if (checker.shouldBailOut()) | |||
| return; | |||
| i = jmin (i, mouseListeners_->size()); | |||
| } | |||
| } | |||
| Component* p = parentComponent_; | |||
| while (p != 0) | |||
| { | |||
| if (p->numDeepMouseListeners > 0) | |||
| { | |||
| BailOutChecker checker2 (this, p); | |||
| for (int i = p->numDeepMouseListeners; --i >= 0;) | |||
| { | |||
| p->mouseListeners_->getUnchecked (i)->mouseMove (me); | |||
| if (checker2.shouldBailOut()) | |||
| return; | |||
| i = jmin (i, p->numDeepMouseListeners); | |||
| } | |||
| } | |||
| p = p->parentComponent_; | |||
| } | |||
| MouseListenerList::sendMouseEvent (this, checker, &MouseListener::mouseMove, me); | |||
| } | |||
| } | |||
| @@ -42377,43 +42232,7 @@ void Component::internalMouseWheel (MouseInputSource& source, const Point<int>& | |||
| desktop.mouseListeners.callChecked (checker, &MouseListener::mouseWheelMove, me, wheelIncrementX, wheelIncrementY); | |||
| if (checker.shouldBailOut()) | |||
| return; | |||
| if (mouseListeners_ != 0) | |||
| { | |||
| for (int i = mouseListeners_->size(); --i >= 0;) | |||
| { | |||
| ((MouseListener*) mouseListeners_->getUnchecked (i))->mouseWheelMove (me, wheelIncrementX, wheelIncrementY); | |||
| if (checker.shouldBailOut()) | |||
| return; | |||
| i = jmin (i, mouseListeners_->size()); | |||
| } | |||
| } | |||
| Component* p = parentComponent_; | |||
| while (p != 0) | |||
| { | |||
| if (p->numDeepMouseListeners > 0) | |||
| { | |||
| BailOutChecker checker2 (this, p); | |||
| for (int i = p->numDeepMouseListeners; --i >= 0;) | |||
| { | |||
| p->mouseListeners_->getUnchecked (i)->mouseWheelMove (me, wheelIncrementX, wheelIncrementY); | |||
| if (checker2.shouldBailOut()) | |||
| return; | |||
| i = jmin (i, p->numDeepMouseListeners); | |||
| } | |||
| } | |||
| p = p->parentComponent_; | |||
| } | |||
| MouseListenerList::sendWheelEvent (this, checker, me, wheelIncrementX, wheelIncrementY); | |||
| } | |||
| } | |||
| @@ -71403,15 +71222,13 @@ private: | |||
| }; | |||
| MouseCursor::MouseCursor() | |||
| : cursorHandle (SharedCursorHandle::createStandard (NormalCursor)) | |||
| : cursorHandle (0) | |||
| { | |||
| jassert (cursorHandle != 0); | |||
| } | |||
| MouseCursor::MouseCursor (const StandardCursorType type) | |||
| : cursorHandle (SharedCursorHandle::createStandard (type)) | |||
| : cursorHandle (type != MouseCursor::NormalCursor ? SharedCursorHandle::createStandard (type) : 0) | |||
| { | |||
| jassert (cursorHandle != 0); | |||
| } | |||
| MouseCursor::MouseCursor (const Image& image, const int hotSpotX, const int hotSpotY) | |||
| @@ -71420,19 +71237,24 @@ MouseCursor::MouseCursor (const Image& image, const int hotSpotX, const int hotS | |||
| } | |||
| MouseCursor::MouseCursor (const MouseCursor& other) | |||
| : cursorHandle (other.cursorHandle->retain()) | |||
| : cursorHandle (other.cursorHandle == 0 ? 0 : other.cursorHandle->retain()) | |||
| { | |||
| } | |||
| MouseCursor::~MouseCursor() | |||
| { | |||
| cursorHandle->release(); | |||
| if (cursorHandle != 0) | |||
| cursorHandle->release(); | |||
| } | |||
| MouseCursor& MouseCursor::operator= (const MouseCursor& other) | |||
| { | |||
| other.cursorHandle->retain(); | |||
| cursorHandle->release(); | |||
| if (other.cursorHandle != 0) | |||
| other.cursorHandle->retain(); | |||
| if (cursorHandle != 0) | |||
| cursorHandle->release(); | |||
| cursorHandle = other.cursorHandle; | |||
| return *this; | |||
| } | |||
| @@ -71449,7 +71271,7 @@ bool MouseCursor::operator!= (const MouseCursor& other) const throw() | |||
| void* MouseCursor::getHandle() const throw() | |||
| { | |||
| return cursorHandle->getHandle(); | |||
| return cursorHandle != 0 ? cursorHandle->getHandle() : 0; | |||
| } | |||
| void MouseCursor::showWaitCursor() | |||
| @@ -244300,7 +244122,12 @@ void* MouseCursor::createStandardMouseCursor (const MouseCursor::StandardCursorT | |||
| void MouseCursor::showInWindow (ComponentPeer*) const | |||
| { | |||
| SetCursor ((HCURSOR) getHandle()); | |||
| HCURSOR c = (HCURSOR) getHandle(); | |||
| if (c == 0) | |||
| c = LoadCursor (0, IDC_ARROW); | |||
| SetCursor (c); | |||
| } | |||
| void MouseCursor::showInAllWindows() const | |||
| @@ -258483,6 +258310,8 @@ public: | |||
| if (! XInitImage (xImage)) | |||
| jassertfalse; | |||
| } | |||
| zeromem (imageData, h * lineStride); | |||
| } | |||
| ~XBitmapImage() | |||
| @@ -261493,7 +261322,8 @@ public: | |||
| bitDepth (16), | |||
| numChannelsRunning (0), | |||
| latency (0), | |||
| isInput (forInput) | |||
| isInput (forInput), | |||
| isInterleaved (true) | |||
| { | |||
| failed (snd_pcm_open (&handle, deviceID.toUTF8(), | |||
| forInput ? SND_PCM_STREAM_CAPTURE : SND_PCM_STREAM_PLAYBACK, | |||
| @@ -261654,6 +261484,7 @@ public: | |||
| if (isInterleaved) | |||
| { | |||
| scratch.ensureSize (sizeof (float) * numSamples * numChannelsRunning, false); | |||
| scratch.fillWith (0); // (not clearing this data causes warnings in valgrind) | |||
| snd_pcm_sframes_t num = snd_pcm_readi (handle, scratch.getData(), numSamples); | |||
| @@ -269587,7 +269418,12 @@ void MouseCursor::showInAllWindows() const | |||
| void MouseCursor::showInWindow (ComponentPeer*) const | |||
| { | |||
| [((NSCursor*) getHandle()) set]; | |||
| NSCursor* c = (NSCursor*) getHandle(); | |||
| if (c == 0) | |||
| c = [NSCursor arrowCursor]; | |||
| [c set]; | |||
| } | |||
| #else | |||
| @@ -274171,7 +274007,12 @@ void MouseCursor::showInAllWindows() const | |||
| void MouseCursor::showInWindow (ComponentPeer*) const | |||
| { | |||
| [((NSCursor*) getHandle()) set]; | |||
| NSCursor* c = (NSCursor*) getHandle(); | |||
| if (c == 0) | |||
| c = [NSCursor arrowCursor]; | |||
| [c set]; | |||
| } | |||
| #else | |||
| @@ -27802,14 +27802,6 @@ public: | |||
| */ | |||
| void* getWindowHandle() const; | |||
| /** When created, each component is given a number to uniquely identify it. | |||
| The number is incremented each time a new component is created, so it's a more | |||
| unique way of identifying a component than using its memory location (which | |||
| may be reused after the component is deleted, of course). | |||
| */ | |||
| uint32 getComponentUID() const throw() { return componentUID; } | |||
| /** Holds a pointer to some type of Component, which automatically becomes null if | |||
| the component is deleted. | |||
| @@ -27918,16 +27910,18 @@ private: | |||
| String componentName_; | |||
| Component* parentComponent_; | |||
| uint32 componentUID; | |||
| Rectangle<int> bounds_; | |||
| int numDeepMouseListeners; | |||
| Array <Component*> childComponentList_; | |||
| LookAndFeel* lookAndFeel_; | |||
| MouseCursor cursor_; | |||
| ImageEffectFilter* effect_; | |||
| Image bufferedImage_; | |||
| Array <MouseListener*>* mouseListeners_; | |||
| Array <KeyListener*>* keyListeners_; | |||
| class MouseListenerList; | |||
| friend class MouseListenerList; | |||
| friend class ScopedPointer <MouseListenerList>; | |||
| ScopedPointer <MouseListenerList> mouseListeners_; | |||
| ScopedPointer <Array <KeyListener*> > keyListeners_; | |||
| ListenerList <ComponentListener> componentListeners; | |||
| NamedValueSet properties; | |||
| @@ -52,20 +52,161 @@ enum ComponentMessageNumbers | |||
| exitModalStateMessage = 0x7fff0002 | |||
| }; | |||
| static uint32 nextComponentUID = 0; | |||
| Component* Component::currentlyFocusedComponent = 0; | |||
| //============================================================================== | |||
| class Component::MouseListenerList | |||
| { | |||
| public: | |||
| MouseListenerList() | |||
| : numDeepMouseListeners (0) | |||
| { | |||
| } | |||
| ~MouseListenerList() | |||
| { | |||
| } | |||
| void addListener (MouseListener* const newListener, const bool wantsEventsForAllNestedChildComponents) | |||
| { | |||
| if (! listeners.contains (newListener)) | |||
| { | |||
| if (wantsEventsForAllNestedChildComponents) | |||
| { | |||
| listeners.insert (0, newListener); | |||
| ++numDeepMouseListeners; | |||
| } | |||
| else | |||
| { | |||
| listeners.add (newListener); | |||
| } | |||
| } | |||
| } | |||
| void removeListener (MouseListener* const listenerToRemove) | |||
| { | |||
| const int index = listeners.indexOf (listenerToRemove); | |||
| if (index >= 0) | |||
| { | |||
| if (index < numDeepMouseListeners) | |||
| --numDeepMouseListeners; | |||
| listeners.remove (index); | |||
| } | |||
| } | |||
| static void sendMouseEvent (Component* comp, BailOutChecker& checker, | |||
| void (MouseListener::*eventMethod) (const MouseEvent&), const MouseEvent& e) | |||
| { | |||
| if (checker.shouldBailOut()) | |||
| return; | |||
| { | |||
| MouseListenerList* const list = comp->mouseListeners_; | |||
| if (list != 0) | |||
| { | |||
| for (int i = list->listeners.size(); --i >= 0;) | |||
| { | |||
| (list->listeners.getUnchecked(i)->*eventMethod) (e); | |||
| if (checker.shouldBailOut()) | |||
| return; | |||
| i = jmin (i, list->listeners.size()); | |||
| } | |||
| } | |||
| } | |||
| Component* p = comp->parentComponent_; | |||
| while (p != 0) | |||
| { | |||
| MouseListenerList* const list = p->mouseListeners_; | |||
| if (list != 0 && list->numDeepMouseListeners > 0) | |||
| { | |||
| BailOutChecker checker2 (comp, p); | |||
| for (int i = list->numDeepMouseListeners; --i >= 0;) | |||
| { | |||
| (list->listeners.getUnchecked(i)->*eventMethod) (e); | |||
| if (checker2.shouldBailOut()) | |||
| return; | |||
| i = jmin (i, list->numDeepMouseListeners); | |||
| } | |||
| } | |||
| p = p->parentComponent_; | |||
| } | |||
| } | |||
| static void sendWheelEvent (Component* comp, BailOutChecker& checker, const MouseEvent& e, | |||
| const float wheelIncrementX, const float wheelIncrementY) | |||
| { | |||
| if (checker.shouldBailOut()) | |||
| return; | |||
| { | |||
| MouseListenerList* const list = comp->mouseListeners_; | |||
| if (list != 0) | |||
| { | |||
| for (int i = list->listeners.size(); --i >= 0;) | |||
| { | |||
| list->listeners.getUnchecked(i)->mouseWheelMove (e, wheelIncrementX, wheelIncrementY); | |||
| if (checker.shouldBailOut()) | |||
| return; | |||
| i = jmin (i, list->listeners.size()); | |||
| } | |||
| } | |||
| } | |||
| Component* p = comp->parentComponent_; | |||
| while (p != 0) | |||
| { | |||
| MouseListenerList* const list = p->mouseListeners_; | |||
| if (list != 0 && list->numDeepMouseListeners > 0) | |||
| { | |||
| BailOutChecker checker2 (comp, p); | |||
| for (int i = list->numDeepMouseListeners; --i >= 0;) | |||
| { | |||
| list->listeners.getUnchecked(i)->mouseWheelMove (e, wheelIncrementX, wheelIncrementY); | |||
| if (checker2.shouldBailOut()) | |||
| return; | |||
| i = jmin (i, list->numDeepMouseListeners); | |||
| } | |||
| } | |||
| p = p->parentComponent_; | |||
| } | |||
| } | |||
| private: | |||
| Array <MouseListener*> listeners; | |||
| int numDeepMouseListeners; | |||
| MouseListenerList (const MouseListenerList&); | |||
| MouseListenerList& operator= (const MouseListenerList&); | |||
| }; | |||
| //============================================================================== | |||
| Component::Component() | |||
| : parentComponent_ (0), | |||
| componentUID (++nextComponentUID), | |||
| numDeepMouseListeners (0), | |||
| lookAndFeel_ (0), | |||
| effect_ (0), | |||
| bufferedImage_ (0), | |||
| mouseListeners_ (0), | |||
| keyListeners_ (0), | |||
| componentFlags_ (0), | |||
| componentTransparency (0) | |||
| { | |||
| @@ -74,13 +215,9 @@ Component::Component() | |||
| Component::Component (const String& name) | |||
| : componentName_ (name), | |||
| parentComponent_ (0), | |||
| componentUID (++nextComponentUID), | |||
| numDeepMouseListeners (0), | |||
| lookAndFeel_ (0), | |||
| effect_ (0), | |||
| bufferedImage_ (0), | |||
| mouseListeners_ (0), | |||
| keyListeners_ (0), | |||
| componentFlags_ (0), | |||
| componentTransparency (0) | |||
| { | |||
| @@ -107,9 +244,6 @@ Component::~Component() | |||
| for (int i = childComponentList_.size(); --i >= 0;) | |||
| childComponentList_.getUnchecked(i)->parentComponent_ = 0; | |||
| delete mouseListeners_; | |||
| delete keyListeners_; | |||
| } | |||
| //============================================================================== | |||
| @@ -1980,20 +2114,9 @@ void Component::addMouseListener (MouseListener* const newListener, | |||
| jassert ((newListener != this) || wantsEventsForAllNestedChildComponents); | |||
| if (mouseListeners_ == 0) | |||
| mouseListeners_ = new Array<MouseListener*>(); | |||
| mouseListeners_ = new MouseListenerList(); | |||
| if (! mouseListeners_->contains (newListener)) | |||
| { | |||
| if (wantsEventsForAllNestedChildComponents) | |||
| { | |||
| mouseListeners_->insert (0, newListener); | |||
| ++numDeepMouseListeners; | |||
| } | |||
| else | |||
| { | |||
| mouseListeners_->add (newListener); | |||
| } | |||
| } | |||
| mouseListeners_->addListener (newListener, wantsEventsForAllNestedChildComponents); | |||
| } | |||
| void Component::removeMouseListener (MouseListener* const listenerToRemove) | |||
| @@ -2003,17 +2126,7 @@ void Component::removeMouseListener (MouseListener* const listenerToRemove) | |||
| checkMessageManagerIsLocked | |||
| if (mouseListeners_ != 0) | |||
| { | |||
| const int index = mouseListeners_->indexOf (listenerToRemove); | |||
| if (index >= 0) | |||
| { | |||
| if (index < numDeepMouseListeners) | |||
| --numDeepMouseListeners; | |||
| mouseListeners_->remove (index); | |||
| } | |||
| } | |||
| mouseListeners_->removeListener (listenerToRemove); | |||
| } | |||
| //============================================================================== | |||
| @@ -2038,9 +2151,7 @@ void Component::internalMouseEnter (MouseInputSource& source, const Point<int>& | |||
| repaint(); | |||
| const MouseEvent me (source, relativePos, source.getCurrentModifiers(), | |||
| this, this, time, relativePos, | |||
| time, 0, false); | |||
| this, this, time, relativePos, time, 0, false); | |||
| mouseEnter (me); | |||
| if (checker.shouldBailOut()) | |||
| @@ -2049,43 +2160,7 @@ void Component::internalMouseEnter (MouseInputSource& source, const Point<int>& | |||
| Desktop::getInstance().resetTimer(); | |||
| Desktop::getInstance().mouseListeners.callChecked (checker, &MouseListener::mouseEnter, me); | |||
| if (checker.shouldBailOut()) | |||
| return; | |||
| if (mouseListeners_ != 0) | |||
| { | |||
| for (int i = mouseListeners_->size(); --i >= 0;) | |||
| { | |||
| mouseListeners_->getUnchecked(i)->mouseEnter (me); | |||
| if (checker.shouldBailOut()) | |||
| return; | |||
| i = jmin (i, mouseListeners_->size()); | |||
| } | |||
| } | |||
| Component* p = parentComponent_; | |||
| while (p != 0) | |||
| { | |||
| if (p->numDeepMouseListeners > 0) | |||
| { | |||
| BailOutChecker checker2 (this, p); | |||
| for (int i = p->numDeepMouseListeners; --i >= 0;) | |||
| { | |||
| p->mouseListeners_->getUnchecked(i)->mouseEnter (me); | |||
| if (checker2.shouldBailOut()) | |||
| return; | |||
| i = jmin (i, p->numDeepMouseListeners); | |||
| } | |||
| } | |||
| p = p->parentComponent_; | |||
| } | |||
| MouseListenerList::sendMouseEvent (this, checker, &MouseListener::mouseEnter, me); | |||
| } | |||
| } | |||
| @@ -2111,8 +2186,7 @@ void Component::internalMouseExit (MouseInputSource& source, const Point<int>& r | |||
| repaint(); | |||
| const MouseEvent me (source, relativePos, source.getCurrentModifiers(), | |||
| this, this, time, relativePos, | |||
| time, 0, false); | |||
| this, this, time, relativePos, time, 0, false); | |||
| mouseExit (me); | |||
| if (checker.shouldBailOut()) | |||
| @@ -2121,43 +2195,7 @@ void Component::internalMouseExit (MouseInputSource& source, const Point<int>& r | |||
| Desktop::getInstance().resetTimer(); | |||
| Desktop::getInstance().mouseListeners.callChecked (checker, &MouseListener::mouseExit, me); | |||
| if (checker.shouldBailOut()) | |||
| return; | |||
| if (mouseListeners_ != 0) | |||
| { | |||
| for (int i = mouseListeners_->size(); --i >= 0;) | |||
| { | |||
| ((MouseListener*) mouseListeners_->getUnchecked (i))->mouseExit (me); | |||
| if (checker.shouldBailOut()) | |||
| return; | |||
| i = jmin (i, mouseListeners_->size()); | |||
| } | |||
| } | |||
| Component* p = parentComponent_; | |||
| while (p != 0) | |||
| { | |||
| if (p->numDeepMouseListeners > 0) | |||
| { | |||
| BailOutChecker checker2 (this, p); | |||
| for (int i = p->numDeepMouseListeners; --i >= 0;) | |||
| { | |||
| p->mouseListeners_->getUnchecked (i)->mouseExit (me); | |||
| if (checker2.shouldBailOut()) | |||
| return; | |||
| i = jmin (i, p->numDeepMouseListeners); | |||
| } | |||
| } | |||
| p = p->parentComponent_; | |||
| } | |||
| MouseListenerList::sendMouseEvent (this, checker, &MouseListener::mouseExit, me); | |||
| } | |||
| } | |||
| @@ -2288,43 +2326,7 @@ void Component::internalMouseDown (MouseInputSource& source, const Point<int>& r | |||
| desktop.resetTimer(); | |||
| desktop.mouseListeners.callChecked (checker, &MouseListener::mouseDown, me); | |||
| if (checker.shouldBailOut()) | |||
| return; | |||
| if (mouseListeners_ != 0) | |||
| { | |||
| for (int i = mouseListeners_->size(); --i >= 0;) | |||
| { | |||
| ((MouseListener*) mouseListeners_->getUnchecked (i))->mouseDown (me); | |||
| if (checker.shouldBailOut()) | |||
| return; | |||
| i = jmin (i, mouseListeners_->size()); | |||
| } | |||
| } | |||
| Component* p = parentComponent_; | |||
| while (p != 0) | |||
| { | |||
| if (p->numDeepMouseListeners > 0) | |||
| { | |||
| BailOutChecker checker2 (this, p); | |||
| for (int i = p->numDeepMouseListeners; --i >= 0;) | |||
| { | |||
| p->mouseListeners_->getUnchecked (i)->mouseDown (me); | |||
| if (checker2.shouldBailOut()) | |||
| return; | |||
| i = jmin (i, p->numDeepMouseListeners); | |||
| } | |||
| } | |||
| p = p->parentComponent_; | |||
| } | |||
| MouseListenerList::sendMouseEvent (this, checker, &MouseListener::mouseDown, me); | |||
| } | |||
| //============================================================================== | |||
| @@ -2356,95 +2358,21 @@ void Component::internalMouseUp (MouseInputSource& source, const Point<int>& rel | |||
| desktop.resetTimer(); | |||
| desktop.mouseListeners.callChecked (checker, &MouseListener::mouseUp, me); | |||
| MouseListenerList::sendMouseEvent (this, checker, &MouseListener::mouseUp, me); | |||
| if (checker.shouldBailOut()) | |||
| return; | |||
| if (mouseListeners_ != 0) | |||
| { | |||
| for (int i = mouseListeners_->size(); --i >= 0;) | |||
| { | |||
| ((MouseListener*) mouseListeners_->getUnchecked (i))->mouseUp (me); | |||
| if (checker.shouldBailOut()) | |||
| return; | |||
| i = jmin (i, mouseListeners_->size()); | |||
| } | |||
| } | |||
| { | |||
| Component* p = parentComponent_; | |||
| while (p != 0) | |||
| { | |||
| if (p->numDeepMouseListeners > 0) | |||
| { | |||
| BailOutChecker checker2 (this, p); | |||
| for (int i = p->numDeepMouseListeners; --i >= 0;) | |||
| { | |||
| p->mouseListeners_->getUnchecked (i)->mouseUp (me); | |||
| if (checker2.shouldBailOut()) | |||
| return; | |||
| i = jmin (i, p->numDeepMouseListeners); | |||
| } | |||
| } | |||
| p = p->parentComponent_; | |||
| } | |||
| } | |||
| // check for double-click | |||
| if (me.getNumberOfClicks() >= 2) | |||
| { | |||
| const int numListeners = (mouseListeners_ != 0) ? mouseListeners_->size() : 0; | |||
| mouseDoubleClick (me); | |||
| if (checker.shouldBailOut()) | |||
| return; | |||
| desktop.mouseListeners.callChecked (checker, &MouseListener::mouseDoubleClick, me); | |||
| if (checker.shouldBailOut()) | |||
| return; | |||
| for (int i = numListeners; --i >= 0;) | |||
| { | |||
| if (checker.shouldBailOut()) | |||
| return; | |||
| MouseListener* const ml = (MouseListener*)((*mouseListeners_)[i]); | |||
| if (ml != 0) | |||
| ml->mouseDoubleClick (me); | |||
| } | |||
| if (checker.shouldBailOut()) | |||
| return; | |||
| Component* p = parentComponent_; | |||
| while (p != 0) | |||
| { | |||
| if (p->numDeepMouseListeners > 0) | |||
| { | |||
| BailOutChecker checker2 (this, p); | |||
| for (int i = p->numDeepMouseListeners; --i >= 0;) | |||
| { | |||
| p->mouseListeners_->getUnchecked (i)->mouseDoubleClick (me); | |||
| if (checker2.shouldBailOut()) | |||
| return; | |||
| i = jmin (i, p->numDeepMouseListeners); | |||
| } | |||
| } | |||
| p = p->parentComponent_; | |||
| } | |||
| MouseListenerList::sendMouseEvent (this, checker, &MouseListener::mouseDoubleClick, me); | |||
| } | |||
| } | |||
| } | |||
| @@ -2474,43 +2402,7 @@ void Component::internalMouseDrag (MouseInputSource& source, const Point<int>& r | |||
| desktop.resetTimer(); | |||
| desktop.mouseListeners.callChecked (checker, &MouseListener::mouseDrag, me); | |||
| if (checker.shouldBailOut()) | |||
| return; | |||
| if (mouseListeners_ != 0) | |||
| { | |||
| for (int i = mouseListeners_->size(); --i >= 0;) | |||
| { | |||
| ((MouseListener*) mouseListeners_->getUnchecked (i))->mouseDrag (me); | |||
| if (checker.shouldBailOut()) | |||
| return; | |||
| i = jmin (i, mouseListeners_->size()); | |||
| } | |||
| } | |||
| Component* p = parentComponent_; | |||
| while (p != 0) | |||
| { | |||
| if (p->numDeepMouseListeners > 0) | |||
| { | |||
| BailOutChecker checker2 (this, p); | |||
| for (int i = p->numDeepMouseListeners; --i >= 0;) | |||
| { | |||
| p->mouseListeners_->getUnchecked (i)->mouseDrag (me); | |||
| if (checker2.shouldBailOut()) | |||
| return; | |||
| i = jmin (i, p->numDeepMouseListeners); | |||
| } | |||
| } | |||
| p = p->parentComponent_; | |||
| } | |||
| MouseListenerList::sendMouseEvent (this, checker, &MouseListener::mouseDrag, me); | |||
| } | |||
| } | |||
| @@ -2540,43 +2432,7 @@ void Component::internalMouseMove (MouseInputSource& source, const Point<int>& r | |||
| desktop.resetTimer(); | |||
| desktop.mouseListeners.callChecked (checker, &MouseListener::mouseMove, me); | |||
| if (checker.shouldBailOut()) | |||
| return; | |||
| if (mouseListeners_ != 0) | |||
| { | |||
| for (int i = mouseListeners_->size(); --i >= 0;) | |||
| { | |||
| ((MouseListener*) mouseListeners_->getUnchecked (i))->mouseMove (me); | |||
| if (checker.shouldBailOut()) | |||
| return; | |||
| i = jmin (i, mouseListeners_->size()); | |||
| } | |||
| } | |||
| Component* p = parentComponent_; | |||
| while (p != 0) | |||
| { | |||
| if (p->numDeepMouseListeners > 0) | |||
| { | |||
| BailOutChecker checker2 (this, p); | |||
| for (int i = p->numDeepMouseListeners; --i >= 0;) | |||
| { | |||
| p->mouseListeners_->getUnchecked (i)->mouseMove (me); | |||
| if (checker2.shouldBailOut()) | |||
| return; | |||
| i = jmin (i, p->numDeepMouseListeners); | |||
| } | |||
| } | |||
| p = p->parentComponent_; | |||
| } | |||
| MouseListenerList::sendMouseEvent (this, checker, &MouseListener::mouseMove, me); | |||
| } | |||
| } | |||
| @@ -2606,43 +2462,7 @@ void Component::internalMouseWheel (MouseInputSource& source, const Point<int>& | |||
| desktop.mouseListeners.callChecked (checker, &MouseListener::mouseWheelMove, me, wheelIncrementX, wheelIncrementY); | |||
| if (checker.shouldBailOut()) | |||
| return; | |||
| if (mouseListeners_ != 0) | |||
| { | |||
| for (int i = mouseListeners_->size(); --i >= 0;) | |||
| { | |||
| ((MouseListener*) mouseListeners_->getUnchecked (i))->mouseWheelMove (me, wheelIncrementX, wheelIncrementY); | |||
| if (checker.shouldBailOut()) | |||
| return; | |||
| i = jmin (i, mouseListeners_->size()); | |||
| } | |||
| } | |||
| Component* p = parentComponent_; | |||
| while (p != 0) | |||
| { | |||
| if (p->numDeepMouseListeners > 0) | |||
| { | |||
| BailOutChecker checker2 (this, p); | |||
| for (int i = p->numDeepMouseListeners; --i >= 0;) | |||
| { | |||
| p->mouseListeners_->getUnchecked (i)->mouseWheelMove (me, wheelIncrementX, wheelIncrementY); | |||
| if (checker2.shouldBailOut()) | |||
| return; | |||
| i = jmin (i, p->numDeepMouseListeners); | |||
| } | |||
| } | |||
| p = p->parentComponent_; | |||
| } | |||
| MouseListenerList::sendWheelEvent (this, checker, me, wheelIncrementX, wheelIncrementY); | |||
| } | |||
| } | |||
| @@ -1898,14 +1898,6 @@ public: | |||
| */ | |||
| void* getWindowHandle() const; | |||
| /** When created, each component is given a number to uniquely identify it. | |||
| The number is incremented each time a new component is created, so it's a more | |||
| unique way of identifying a component than using its memory location (which | |||
| may be reused after the component is deleted, of course). | |||
| */ | |||
| uint32 getComponentUID() const throw() { return componentUID; } | |||
| //============================================================================== | |||
| /** Holds a pointer to some type of Component, which automatically becomes null if | |||
| the component is deleted. | |||
| @@ -2019,16 +2011,18 @@ private: | |||
| //============================================================================== | |||
| String componentName_; | |||
| Component* parentComponent_; | |||
| uint32 componentUID; | |||
| Rectangle<int> bounds_; | |||
| int numDeepMouseListeners; | |||
| Array <Component*> childComponentList_; | |||
| LookAndFeel* lookAndFeel_; | |||
| MouseCursor cursor_; | |||
| ImageEffectFilter* effect_; | |||
| Image bufferedImage_; | |||
| Array <MouseListener*>* mouseListeners_; | |||
| Array <KeyListener*>* keyListeners_; | |||
| class MouseListenerList; | |||
| friend class MouseListenerList; | |||
| friend class ScopedPointer <MouseListenerList>; | |||
| ScopedPointer <MouseListenerList> mouseListeners_; | |||
| ScopedPointer <Array <KeyListener*> > keyListeners_; | |||
| ListenerList <ComponentListener> componentListeners; | |||
| NamedValueSet properties; | |||
| @@ -125,15 +125,13 @@ private: | |||
| //============================================================================== | |||
| MouseCursor::MouseCursor() | |||
| : cursorHandle (SharedCursorHandle::createStandard (NormalCursor)) | |||
| : cursorHandle (0) | |||
| { | |||
| jassert (cursorHandle != 0); | |||
| } | |||
| MouseCursor::MouseCursor (const StandardCursorType type) | |||
| : cursorHandle (SharedCursorHandle::createStandard (type)) | |||
| : cursorHandle (type != MouseCursor::NormalCursor ? SharedCursorHandle::createStandard (type) : 0) | |||
| { | |||
| jassert (cursorHandle != 0); | |||
| } | |||
| MouseCursor::MouseCursor (const Image& image, const int hotSpotX, const int hotSpotY) | |||
| @@ -142,19 +140,24 @@ MouseCursor::MouseCursor (const Image& image, const int hotSpotX, const int hotS | |||
| } | |||
| MouseCursor::MouseCursor (const MouseCursor& other) | |||
| : cursorHandle (other.cursorHandle->retain()) | |||
| : cursorHandle (other.cursorHandle == 0 ? 0 : other.cursorHandle->retain()) | |||
| { | |||
| } | |||
| MouseCursor::~MouseCursor() | |||
| { | |||
| cursorHandle->release(); | |||
| if (cursorHandle != 0) | |||
| cursorHandle->release(); | |||
| } | |||
| MouseCursor& MouseCursor::operator= (const MouseCursor& other) | |||
| { | |||
| other.cursorHandle->retain(); | |||
| cursorHandle->release(); | |||
| if (other.cursorHandle != 0) | |||
| other.cursorHandle->retain(); | |||
| if (cursorHandle != 0) | |||
| cursorHandle->release(); | |||
| cursorHandle = other.cursorHandle; | |||
| return *this; | |||
| } | |||
| @@ -171,7 +174,7 @@ bool MouseCursor::operator!= (const MouseCursor& other) const throw() | |||
| void* MouseCursor::getHandle() const throw() | |||
| { | |||
| return cursorHandle->getHandle(); | |||
| return cursorHandle != 0 ? cursorHandle->getHandle() : 0; | |||
| } | |||
| void MouseCursor::showWaitCursor() | |||
| @@ -123,7 +123,8 @@ public: | |||
| bitDepth (16), | |||
| numChannelsRunning (0), | |||
| latency (0), | |||
| isInput (forInput) | |||
| isInput (forInput), | |||
| isInterleaved (true) | |||
| { | |||
| failed (snd_pcm_open (&handle, deviceID.toUTF8(), | |||
| forInput ? SND_PCM_STREAM_CAPTURE : SND_PCM_STREAM_PLAYBACK, | |||
| @@ -285,6 +286,7 @@ public: | |||
| if (isInterleaved) | |||
| { | |||
| scratch.ensureSize (sizeof (float) * numSamples * numChannelsRunning, false); | |||
| scratch.fillWith (0); // (not clearing this data causes warnings in valgrind) | |||
| snd_pcm_sframes_t num = snd_pcm_readi (handle, scratch.getData(), numSamples); | |||
| @@ -118,7 +118,12 @@ void MouseCursor::showInAllWindows() const | |||
| void MouseCursor::showInWindow (ComponentPeer*) const | |||
| { | |||
| [((NSCursor*) getHandle()) set]; | |||
| NSCursor* c = (NSCursor*) getHandle(); | |||
| if (c == 0) | |||
| c = [NSCursor arrowCursor]; | |||
| [c set]; | |||
| } | |||
| #else | |||
| @@ -2681,7 +2681,12 @@ void* MouseCursor::createStandardMouseCursor (const MouseCursor::StandardCursorT | |||
| //============================================================================== | |||
| void MouseCursor::showInWindow (ComponentPeer*) const | |||
| { | |||
| SetCursor ((HCURSOR) getHandle()); | |||
| HCURSOR c = (HCURSOR) getHandle(); | |||
| if (c == 0) | |||
| c = LoadCursor (0, IDC_ARROW); | |||
| SetCursor (c); | |||
| } | |||
| void MouseCursor::showInAllWindows() const | |||