diff options
Diffstat (limited to 'indra/llui')
| -rw-r--r-- | indra/llui/llbutton.cpp | 2 | ||||
| -rw-r--r-- | indra/llui/llfloater.cpp | 22 | ||||
| -rw-r--r-- | indra/llui/llfloater.h | 11 | ||||
| -rw-r--r-- | indra/llui/llhandle.h | 67 | ||||
| -rw-r--r-- | indra/llui/llmenugl.h | 2 | ||||
| -rw-r--r-- | indra/llui/llpanel.cpp | 2 | ||||
| -rw-r--r-- | indra/llui/llpanel.h | 3 | ||||
| -rw-r--r-- | indra/llui/lluictrl.cpp | 11 | ||||
| -rw-r--r-- | indra/llui/lluictrl.h | 3 | ||||
| -rw-r--r-- | indra/llui/llview.h | 9 | 
10 files changed, 66 insertions, 66 deletions
| diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp index 74b8885e1f..a01dccc7ab 100644 --- a/indra/llui/llbutton.cpp +++ b/indra/llui/llbutton.cpp @@ -115,7 +115,7 @@ LLButton::Params::Params()  LLButton::LLButton(const LLButton::Params& p)  :	LLUICtrl(p), -	LLBadgeOwner(LLView::getHandle()), +	LLBadgeOwner(getHandle()),  	mMouseDownFrame(0),  	mMouseHeldDownCount(0),  	mBorderEnabled( FALSE ), diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index 432397d3e9..07d2e1ed5f 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -111,7 +111,6 @@ LLFloater::click_callback LLFloater::sButtonCallbacks[BUTTON_COUNT] =  LLMultiFloater* LLFloater::sHostp = NULL;  BOOL			LLFloater::sQuitting = FALSE; // Flag to prevent storing visibility controls while quitting -LLFloater::handle_map_t	LLFloater::sFloaterMap;  LLFloaterView* gFloaterView = NULL; @@ -268,7 +267,6 @@ LLFloater::LLFloater(const LLSD& key, const LLFloater::Params& p)  	mMinimizeSignal(NULL)  //	mNotificationContext(NULL)  { -	mHandle.bind(this);  //	mNotificationContext = new LLFloaterNotificationContext(getHandle());  	// Clicks stop here. @@ -323,9 +321,6 @@ void LLFloater::initFloater(const Params& p)  	// Floaters are created in the invisible state	  	setVisible(FALSE); -	// add self to handle->floater map -	sFloaterMap[mHandle] = this; -  	if (!getParent())  	{  		gFloaterView->addChild(this); @@ -532,8 +527,6 @@ LLFloater::~LLFloater()  	// correct, non-minimized positions.  	setMinimized( FALSE ); -	sFloaterMap.erase(mHandle); -  	delete mDragHandle;  	for (S32 i = 0; i < 4; i++)   	{ @@ -1038,7 +1031,9 @@ BOOL LLFloater::canSnapTo(const LLView* other_view)  	if (other_view != getParent())  	{  		const LLFloater* other_floaterp = dynamic_cast<const LLFloater*>(other_view);		 -		if (other_floaterp && other_floaterp->getSnapTarget() == getHandle() && mDependents.find(other_floaterp->getHandle()) != mDependents.end()) +		if (other_floaterp  +			&& other_floaterp->getSnapTarget() == getHandle()  +			&& mDependents.find(other_floaterp->getHandle()) != mDependents.end())  		{  			// this is a dependent that is already snapped to us, so don't snap back to it  			return FALSE; @@ -1677,18 +1672,17 @@ void LLFloater::onClickHelp( LLFloater* self )  LLFloater* LLFloater::getClosableFloaterFromFocus()  {  	LLFloater* focused_floater = NULL; - -	handle_map_iter_t iter; -	for(iter = sFloaterMap.begin(); iter != sFloaterMap.end(); ++iter) +	LLInstanceTracker<LLFloater>::instance_iter it = beginInstances(); +	LLInstanceTracker<LLFloater>::instance_iter end_it = endInstances(); +	for (; it != end_it; ++it)  	{ -		focused_floater = iter->second; -		if (focused_floater->hasFocus()) +		if (it->hasFocus())  		{  			break;  		}  	} -	if (iter == sFloaterMap.end()) +	if (it == endInstances())  	{  		// nothing found, return  		return NULL; diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h index 73e9c9e831..b24ae1beb9 100644 --- a/indra/llui/llfloater.h +++ b/indra/llui/llfloater.h @@ -83,7 +83,7 @@ namespace LLInitParam  } -class LLFloater : public LLPanel +class LLFloater : public LLPanel, public LLInstanceTracker<LLFloater>  {  	friend class LLFloaterView;  	friend class LLFloaterReg; @@ -282,7 +282,7 @@ public:  	void			clearSnapTarget() { mSnappedTo.markDead(); }  	LLHandle<LLFloater>	getSnapTarget() const { return mSnappedTo; } -	LLHandle<LLFloater> getHandle() const { return mHandle; } +	LLHandle<LLFloater> getHandle() const { return getDerivedHandle<LLFloater>(); }  	const LLSD& 	getKey() { return mKey; }  	virtual bool	matchesKey(const LLSD& key) { return mSingleInstance || KeyCompare::equate(key, mKey); } @@ -460,16 +460,9 @@ private:  	typedef void(*click_callback)(LLFloater*);  	static click_callback sButtonCallbacks[BUTTON_COUNT]; -	typedef std::map<LLHandle<LLFloater>, LLFloater*> handle_map_t; -	typedef std::map<LLHandle<LLFloater>, LLFloater*>::iterator handle_map_iter_t; -	static handle_map_t	sFloaterMap; -  	BOOL			mHasBeenDraggedWhileMinimized;  	S32				mPreviousMinimizedBottom;  	S32				mPreviousMinimizedLeft; - -//	LLFloaterNotificationContext* mNotificationContext; -	LLRootHandle<LLFloater>		mHandle;	  }; diff --git a/indra/llui/llhandle.h b/indra/llui/llhandle.h index 8c000eee48..e6390ee599 100644 --- a/indra/llui/llhandle.h +++ b/indra/llui/llhandle.h @@ -28,17 +28,18 @@  #define LLHANDLE_H  #include "llpointer.h" +#include <boost/type_traits/is_convertible.hpp> +#include <boost/utility/enable_if.hpp> -template <typename T>  class LLTombStone : public LLRefCount  {  public: -	LLTombStone(T* target = NULL) : mTarget(target) {} +	LLTombStone(void* target = NULL) : mTarget(target) {} -	void setTarget(T* target) { mTarget = target; } -	T* getTarget() const { return mTarget; } +	void setTarget(void* target) { mTarget = target; } +	void* getTarget() const { return mTarget; }  private: -	T* mTarget; +	mutable void* mTarget;  };  //	LLHandles are used to refer to objects whose lifetime you do not control or influence.   @@ -53,13 +54,15 @@ private:  template <typename T>  class LLHandle  { +	template <typename U> friend class LLHandle; +	template <typename U> friend class LLHandleProvider;  public:  	LLHandle() : mTombStone(getDefaultTombStone()) {} -	const LLHandle<T>& operator =(const LLHandle<T>& other)   -	{  -		mTombStone = other.mTombStone; -		return *this;  -	} + +	template<typename U> +	LLHandle(const LLHandle<U>& other, typename boost::enable_if< typename boost::is_convertible<U*, T*> >::type* dummy = 0) +	: mTombStone(other.mTombStone) +	{}  	bool isDead() const   	{  @@ -73,7 +76,7 @@ public:  	T* get() const  	{ -		return mTombStone->getTarget(); +		return reinterpret_cast<T*>(mTombStone->getTarget());  	}  	friend bool operator== (const LLHandle<T>& lhs, const LLHandle<T>& rhs) @@ -94,12 +97,13 @@ public:  	}  protected: -	LLPointer<LLTombStone<T> > mTombStone; +	LLPointer<LLTombStone> mTombStone;  private: -	static LLPointer<LLTombStone<T> >& getDefaultTombStone() +	typedef T* pointer_t; +	static LLPointer<LLTombStone>& getDefaultTombStone()  	{ -		static LLPointer<LLTombStone<T> > sDefaultTombStone = new LLTombStone<T>; +		static LLPointer<LLTombStone> sDefaultTombStone = new LLTombStone;  		return sDefaultTombStone;  	}  }; @@ -108,23 +112,26 @@ template <typename T>  class LLRootHandle : public LLHandle<T>  {  public: +	typedef LLRootHandle<T> self_t; +	typedef LLHandle<T> base_t; +  	LLRootHandle(T* object) { bind(object); }  	LLRootHandle() {};  	~LLRootHandle() { unbind(); } -	// this is redundant, since a LLRootHandle *is* an LLHandle -	LLHandle<T> getHandle() { return LLHandle<T>(*this); } +	// this is redundant, since an LLRootHandle *is* an LLHandle +	//LLHandle<T> getHandle() { return LLHandle<T>(*this); }  	void bind(T* object)   	{   		// unbind existing tombstone  		if (LLHandle<T>::mTombStone.notNull())  		{ -			if (LLHandle<T>::mTombStone->getTarget() == object) return; +			if (LLHandle<T>::mTombStone->getTarget() == (void*)object) return;  			LLHandle<T>::mTombStone->setTarget(NULL);  		}  		// tombstone reference counted, so no paired delete -		LLHandle<T>::mTombStone = new LLTombStone<T>(object); +		LLHandle<T>::mTombStone = new LLTombStone((void*)object);  	}  	void unbind()  @@ -142,6 +149,15 @@ private:  template <typename T>  class LLHandleProvider  { +public: +	LLHandle<T> getHandle() const +	{  +		// perform lazy binding to avoid small tombstone allocations for handle +		// providers whose handles are never referenced +		mHandle.bind(static_cast<T*>(const_cast<LLHandleProvider<T>* >(this)));  +		return mHandle;  +	} +  protected:  	typedef LLHandle<T> handle_type_t;  	LLHandleProvider()  @@ -149,16 +165,17 @@ protected:  		// provided here to enforce T deriving from LLHandleProvider<T>  	}  -	LLHandle<T> getHandle()  -	{  -		// perform lazy binding to avoid small tombstone allocations for handle -		// providers whose handles are never referenced -		mHandle.bind(static_cast<T*>(this));  -		return mHandle;  +	template <typename U> +	typename LLHandle<U> getDerivedHandle(typename boost::enable_if< typename boost::is_convertible<U*, T*> >::type* dummy = 0) const +	{ +		LLHandle<U> downcast_handle; +		downcast_handle.mTombStone = getHandle().mTombStone; +		return downcast_handle;  	} +  private: -	LLRootHandle<T> mHandle; +	mutable LLRootHandle<T> mHandle;  };  #endif diff --git a/indra/llui/llmenugl.h b/indra/llui/llmenugl.h index bdae899933..36f3ba34b9 100644 --- a/indra/llui/llmenugl.h +++ b/indra/llui/llmenugl.h @@ -681,7 +681,7 @@ public:  			BOOL	appendContextSubMenu(LLContextMenu *menu); -			LLHandle<LLContextMenu> getHandle() { mHandle.bind(this); return mHandle; } +			LLHandle<LLContextMenu> getHandle() { return getDerivedHandle<LLContextMenu>(); }  protected:  	BOOL						mHoveredAnyItem; diff --git a/indra/llui/llpanel.cpp b/indra/llui/llpanel.cpp index a45b617c2e..00318cec6b 100644 --- a/indra/llui/llpanel.cpp +++ b/indra/llui/llpanel.cpp @@ -122,8 +122,6 @@ LLPanel::LLPanel(const LLPanel::Params& p)  	{  		addBorder(p.border);  	} -	 -	mPanelHandle.bind(this);  }  LLPanel::~LLPanel() diff --git a/indra/llui/llpanel.h b/indra/llui/llpanel.h index ab1c87caff..cd33938226 100644 --- a/indra/llui/llpanel.h +++ b/indra/llui/llpanel.h @@ -153,7 +153,7 @@ public:  	void			setCtrlsEnabled(BOOL b); -	LLHandle<LLPanel>	getHandle() const { return mPanelHandle; } +	LLHandle<LLPanel>	getHandle() const { return getDerivedHandle<LLPanel>(); }  	const LLCallbackMap::map_t& getFactoryMap() const { return mFactoryMap; } @@ -278,7 +278,6 @@ private:  	LLViewBorder*	mBorder;  	LLButton*		mDefaultBtn;  	LLUIString		mLabel; -	LLRootHandle<LLPanel> mPanelHandle;  	typedef std::map<std::string, std::string> ui_string_map_t;  	ui_string_map_t	mUIStrings; diff --git a/indra/llui/lluictrl.cpp b/indra/llui/lluictrl.cpp index 2fa260ded1..b9c843e931 100644 --- a/indra/llui/lluictrl.cpp +++ b/indra/llui/lluictrl.cpp @@ -118,7 +118,6 @@ LLUICtrl::LLUICtrl(const LLUICtrl::Params& p, const LLViewModelPtr& viewmodel)  	mDoubleClickSignal(NULL),  	mTransparencyType(TT_DEFAULT)  { -	mUICtrlHandle.bind(this);  }  void LLUICtrl::initFromParams(const Params& p) @@ -460,7 +459,7 @@ void LLUICtrl::setControlVariable(LLControlVariable* control)  	if (control)  	{  		mControlVariable = control; -		mControlConnection = mControlVariable->getSignal()->connect(boost::bind(&controlListener, _2, getUICtrlHandle(), std::string("value"))); +		mControlConnection = mControlVariable->getSignal()->connect(boost::bind(&controlListener, _2, getHandle(), std::string("value")));  		setValue(mControlVariable->getValue());  	}  } @@ -491,7 +490,7 @@ void LLUICtrl::setEnabledControlVariable(LLControlVariable* control)  	if (control)  	{  		mEnabledControlVariable = control; -		mEnabledControlConnection = mEnabledControlVariable->getSignal()->connect(boost::bind(&controlListener, _2, getUICtrlHandle(), std::string("enabled"))); +		mEnabledControlConnection = mEnabledControlVariable->getSignal()->connect(boost::bind(&controlListener, _2, getHandle(), std::string("enabled")));  		setEnabled(mEnabledControlVariable->getValue().asBoolean());  	}  } @@ -506,7 +505,7 @@ void LLUICtrl::setDisabledControlVariable(LLControlVariable* control)  	if (control)  	{  		mDisabledControlVariable = control; -		mDisabledControlConnection = mDisabledControlVariable->getSignal()->connect(boost::bind(&controlListener, _2, getUICtrlHandle(), std::string("disabled"))); +		mDisabledControlConnection = mDisabledControlVariable->getSignal()->connect(boost::bind(&controlListener, _2, getHandle(), std::string("disabled")));  		setEnabled(!(mDisabledControlVariable->getValue().asBoolean()));  	}  } @@ -521,7 +520,7 @@ void LLUICtrl::setMakeVisibleControlVariable(LLControlVariable* control)  	if (control)  	{  		mMakeVisibleControlVariable = control; -		mMakeVisibleControlConnection = mMakeVisibleControlVariable->getSignal()->connect(boost::bind(&controlListener, _2, getUICtrlHandle(), std::string("visible"))); +		mMakeVisibleControlConnection = mMakeVisibleControlVariable->getSignal()->connect(boost::bind(&controlListener, _2, getHandle(), std::string("visible")));  		setVisible(mMakeVisibleControlVariable->getValue().asBoolean());  	}  } @@ -536,7 +535,7 @@ void LLUICtrl::setMakeInvisibleControlVariable(LLControlVariable* control)  	if (control)  	{  		mMakeInvisibleControlVariable = control; -		mMakeInvisibleControlConnection = mMakeInvisibleControlVariable->getSignal()->connect(boost::bind(&controlListener, _2, getUICtrlHandle(), std::string("invisible"))); +		mMakeInvisibleControlConnection = mMakeInvisibleControlVariable->getSignal()->connect(boost::bind(&controlListener, _2, getHandle(), std::string("invisible")));  		setVisible(!(mMakeInvisibleControlVariable->getValue().asBoolean()));  	}  } diff --git a/indra/llui/lluictrl.h b/indra/llui/lluictrl.h index 3e055a9d06..fb2196bb16 100644 --- a/indra/llui/lluictrl.h +++ b/indra/llui/lluictrl.h @@ -223,7 +223,7 @@ public:  	BOOL	focusLastItem(BOOL prefer_text_fields = FALSE);  	// Non Virtuals -	LLHandle<LLUICtrl> getUICtrlHandle() const { return mUICtrlHandle; } +	LLHandle<LLUICtrl> getHandle() const { return getDerivedHandle<LLUICtrl>(); }  	BOOL			getIsChrome() const;  	void			setTabStop( BOOL b ); @@ -313,7 +313,6 @@ private:  	BOOL			mRequestsFront;  	BOOL			mTabStop;  	BOOL			mTentative; -	LLRootHandle<LLUICtrl> mUICtrlHandle;  	ETypeTransparency mTransparencyType; diff --git a/indra/llui/llview.h b/indra/llui/llview.h index 08828e55e6..13f118abec 100644 --- a/indra/llui/llview.h +++ b/indra/llui/llview.h @@ -97,7 +97,11 @@ private:  	static std::vector<LLViewDrawContext*> sDrawContextStack;  }; -class LLView : public LLMouseHandler, public LLMortician, public LLFocusableElement +class LLView  +:	public LLMouseHandler,			// handles mouse events +	public LLFocusableElement,		// handles keyboard events +	public LLMortician,				// lazy deletion +	public LLHandleProvider<LLView>	// passes out weak references to self  {  public:  	struct Follows : public LLInitParam::ChoiceBlock<Follows> @@ -306,8 +310,6 @@ public:  	void			popVisible()				{ setVisible(mLastVisible); }  	BOOL			getLastVisible()	const	{ return mLastVisible; } -	LLHandle<LLView>	getHandle()				{ mHandle.bind(this); return mHandle; } -  	U32			getFollows() const				{ return mReshapeFlags; }  	BOOL		followsLeft() const				{ return mReshapeFlags & FOLLOWS_LEFT; }  	BOOL		followsRight() const			{ return mReshapeFlags & FOLLOWS_RIGHT; } @@ -606,7 +608,6 @@ private:  	BOOL		mIsFocusRoot;  	BOOL		mUseBoundingRect; // hit test against bounding rectangle that includes all child elements -	LLRootHandle<LLView> mHandle;  	BOOL		mLastVisible;  	S32			mNextInsertionOrdinal; | 
