diff --git a/headers/private/interface/ToolTipManager.h b/headers/private/interface/ToolTipManager.h index 90b040fbd4..604c6c9a6c 100644 --- a/headers/private/interface/ToolTipManager.h +++ b/headers/private/interface/ToolTipManager.h @@ -6,6 +6,7 @@ #define _TOOL_TIP_MANAGER_H +#include #include #include @@ -25,6 +26,9 @@ public: void SetHideDelay(bigtime_t time); bigtime_t HideDelay() const; + static bool Lock() { return sLock.Lock(); } + static void Unlock() { sLock.Unlock(); } + private: BToolTipManager(); virtual ~BToolTipManager(); @@ -34,6 +38,7 @@ private: bigtime_t fShowDelay; bigtime_t fHideDelay; + static BLocker sLock; static BToolTipManager* sDefaultInstance; }; diff --git a/src/kits/interface/ToolTip.cpp b/src/kits/interface/ToolTip.cpp index 819610dbfb..1e40a4b481 100644 --- a/src/kits/interface/ToolTip.cpp +++ b/src/kits/interface/ToolTip.cpp @@ -10,6 +10,7 @@ #include #include +#include BToolTip::BToolTip() @@ -157,7 +158,26 @@ BTextToolTip::Text() const void BTextToolTip::SetText(const char* text) { + bool lockedLooper; + while (true) { + lockedLooper = fTextView->LockLooper(); + if (!lockedLooper) { + BToolTipManager::Lock(); + + if (fTextView->Window() != NULL) { + BToolTipManager::Unlock(); + continue; + } + } + break; + } + fTextView->SetText(text); + + if (lockedLooper) + fTextView->UnlockLooper(); + else + BToolTipManager::Unlock(); } diff --git a/src/kits/interface/ToolTipManager.cpp b/src/kits/interface/ToolTipManager.cpp index 46f37f0f50..1d0ce92f08 100644 --- a/src/kits/interface/ToolTipManager.cpp +++ b/src/kits/interface/ToolTipManager.cpp @@ -14,10 +14,9 @@ #include +BLocker BToolTipManager::sLock("tool tip manager"); BToolTipManager* BToolTipManager::sDefaultInstance; -static BLocker sLock("tool tip manager"); - static const uint32 kMsgHideToolTip = 'hide'; static const uint32 kMsgShowToolTip = 'show'; static const uint32 kMsgCurrentToolTip = 'curr'; @@ -56,8 +55,12 @@ public: virtual void DetachedFromWindow() { + BToolTipManager::Lock(); + RemoveChild(fToolTip->View()); // don't delete this one! + + BToolTipManager::Unlock(); } virtual void MouseMoved(BPoint where, uint32 transit, @@ -112,7 +115,10 @@ ToolTipWindow::ToolTipWindow(BToolTip* tip, BPoint where) // TODO: take alignment into account! SetLayout(new BGroupLayout(B_VERTICAL)); + + BToolTipManager::Lock(); AddChild(new ToolTipView(tip)); + BToolTipManager::Unlock(); BSize size = ChildAt(0)->PreferredSize(); ResizeTo(size.width, size.height);