diff options
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/llplugin/slplugin/CMakeLists.txt | 19 | ||||
| -rw-r--r-- | indra/llplugin/slplugin/slplugin-objc.h | 40 | ||||
| -rw-r--r-- | indra/llplugin/slplugin/slplugin-objc.mm | 87 | ||||
| -rw-r--r-- | indra/llplugin/slplugin/slplugin.cpp | 17 | ||||
| -rw-r--r-- | indra/llwindow/llwindowmacosx-objc.mm | 2 | ||||
| -rw-r--r-- | indra/newview/llfloaterpay.cpp | 3 | ||||
| -rw-r--r-- | indra/newview/llinspecttoast.cpp | 4 | ||||
| -rw-r--r-- | indra/newview/llinventoryfunctions.cpp | 41 | ||||
| -rw-r--r-- | indra/newview/llinventoryfunctions.h | 3 | ||||
| -rw-r--r-- | indra/newview/llpaneloutfitedit.cpp | 7 | 
10 files changed, 218 insertions, 5 deletions
| diff --git a/indra/llplugin/slplugin/CMakeLists.txt b/indra/llplugin/slplugin/CMakeLists.txt index c1536e85de..08d35f9ae7 100644 --- a/indra/llplugin/slplugin/CMakeLists.txt +++ b/indra/llplugin/slplugin/CMakeLists.txt @@ -16,6 +16,7 @@ include_directories(  if (DARWIN)      include(CMakeFindFrameworks)      find_library(CARBON_LIBRARY Carbon) +    find_library(COCOA_LIBRARY Cocoa)  endif (DARWIN) @@ -25,6 +26,22 @@ set(SLPlugin_SOURCE_FILES      slplugin.cpp      ) +if (DARWIN) +  list(APPEND SLPlugin_SOURCE_FILES +    slplugin-objc.mm +  ) +  list(APPEND SLPlugin_HEADER_FILES +    slplugin-objc.h +  ) +endif (DARWIN) + +set_source_files_properties(${SLPlugin_HEADER_FILES} +                            PROPERTIES HEADER_FILE_ONLY TRUE) + +if (SLPlugin_HEADER_FILES) +  list(APPEND SLPlugin_SOURCE_FILES ${SLPlugin_HEADER_FILES}) +endif (SLPlugin_HEADER_FILES) +  add_executable(SLPlugin      WIN32      MACOSX_BUNDLE @@ -51,7 +68,7 @@ add_dependencies(SLPlugin  if (DARWIN)    # Mac version needs to link against Carbon -  target_link_libraries(SLPlugin ${CARBON_LIBRARY}) +  target_link_libraries(SLPlugin ${CARBON_LIBRARY} ${COCOA_LIBRARY})    # Make sure the app bundle has a Resources directory (it will get populated by viewer-manifest.py later)    add_custom_command(      TARGET SLPlugin POST_BUILD diff --git a/indra/llplugin/slplugin/slplugin-objc.h b/indra/llplugin/slplugin/slplugin-objc.h new file mode 100644 index 0000000000..4e55cb14cf --- /dev/null +++ b/indra/llplugin/slplugin/slplugin-objc.h @@ -0,0 +1,40 @@ +/** + * @file slplugin-objc.h + * @brief Header file for slplugin-objc.mm. + * + * @cond + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab.  Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlife.com/developers/opensource/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlife.com/developers/opensource/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + * + * @endcond + */ + + +/* Defined in slplugin-objc.mm: */ +void setupCocoa(); +void createAutoReleasePool(); +void deleteAutoReleasePool(); diff --git a/indra/llplugin/slplugin/slplugin-objc.mm b/indra/llplugin/slplugin/slplugin-objc.mm new file mode 100644 index 0000000000..823e1ebea6 --- /dev/null +++ b/indra/llplugin/slplugin/slplugin-objc.mm @@ -0,0 +1,87 @@ +/** + * @file slplugin-objc.mm + * @brief Objective-C++ file for use with the loader shell, so we can use a couple of Cocoa APIs. + * + * @cond + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab.  Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlife.com/developers/opensource/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlife.com/developers/opensource/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + * + * @endcond + */ + + +#include <AppKit/AppKit.h> + +#include "slplugin-objc.h" + + +void setupCocoa() +{ +	static bool inited = false; +	 +	if(!inited) +	{ +		createAutoReleasePool(); +		 +		// The following prevents the Cocoa command line parser from trying to open 'unknown' arguements as documents. +		// ie. running './secondlife -set Language fr' would cause a pop-up saying can't open document 'fr'  +		// when init'ing the Cocoa App window.		 +		[[NSUserDefaults standardUserDefaults] setObject:@"NO" forKey:@"NSTreatUnknownArgumentsAsOpen"]; +		 +		// This is a bit of voodoo taken from the Apple sample code "CarbonCocoa_PictureCursor": +		//   http://developer.apple.com/samplecode/CarbonCocoa_PictureCursor/index.html +		 +		//	Needed for Carbon based applications which call into Cocoa +		NSApplicationLoad(); + +		//	Must first call [[[NSWindow alloc] init] release] to get the NSWindow machinery set up so that NSCursor can use a window to cache the cursor image +		[[[NSWindow alloc] init] release]; +		 +		deleteAutoReleasePool(); +		 +		inited = true; +	} +} + +static NSAutoreleasePool *sPool = NULL; + +void createAutoReleasePool() +{ +	if(!sPool) +	{ +		sPool = [[NSAutoreleasePool alloc] init]; +	} +} + +void deleteAutoReleasePool() +{ +	if(sPool) +	{ +		[sPool release]; +		sPool = NULL; +	} +} diff --git a/indra/llplugin/slplugin/slplugin.cpp b/indra/llplugin/slplugin/slplugin.cpp index 7d6dde1a58..4c955e875a 100644 --- a/indra/llplugin/slplugin/slplugin.cpp +++ b/indra/llplugin/slplugin/slplugin.cpp @@ -44,6 +44,7 @@  #if LL_DARWIN  	#include <Carbon/Carbon.h> +	#include "slplugin-objc.h"  #endif  #if LL_DARWIN || LL_LINUX @@ -229,10 +230,19 @@ int main(int argc, char **argv)  	signal(SIGSYS, &crash_handler);		// non-existent system call invoked  #endif +#if LL_DARWIN +	setupCocoa(); +	createAutoReleasePool(); +#endif +  	LLPluginProcessChild *plugin = new LLPluginProcessChild();  	plugin->init(port); +#if LL_DARWIN +		deleteAutoReleasePool(); +#endif +  	LLTimer timer;  	timer.start(); @@ -260,6 +270,9 @@ int main(int argc, char **argv)  #endif  	while(!plugin->isDone())  	{ +#if LL_DARWIN +		createAutoReleasePool(); +#endif  		timer.reset();  		plugin->idle();  #if LL_DARWIN @@ -377,6 +390,10 @@ int main(int argc, char **argv)  	// exception handler such as QuickTime.  	//checkExceptionHandler();  #endif + +#if LL_DARWIN +		deleteAutoReleasePool(); +#endif  	}  	delete plugin; diff --git a/indra/llwindow/llwindowmacosx-objc.mm b/indra/llwindow/llwindowmacosx-objc.mm index 3a822a93a6..01e04dbb07 100644 --- a/indra/llwindow/llwindowmacosx-objc.mm +++ b/indra/llwindow/llwindowmacosx-objc.mm @@ -64,6 +64,8 @@ void setupCocoa()  		[[[NSWindow alloc] init] release];  		[pool release]; +		 +		inited = true;  	}  } diff --git a/indra/newview/llfloaterpay.cpp b/indra/newview/llfloaterpay.cpp index 51364594e4..ba7526ccd5 100644 --- a/indra/newview/llfloaterpay.cpp +++ b/indra/newview/llfloaterpay.cpp @@ -145,6 +145,9 @@ LLFloaterPay::~LLFloaterPay()  {  	std::for_each(mCallbackData.begin(), mCallbackData.end(), DeletePointer());  	// Name callbacks will be automatically disconnected since LLFloater is trackable +	 +	// In case this floater is currently waiting for a reply. +	gMessageSystem->setHandlerFuncFast(_PREHASH_PayPriceReply, 0, 0);  }  BOOL LLFloaterPay::postBuild() diff --git a/indra/newview/llinspecttoast.cpp b/indra/newview/llinspecttoast.cpp index 3ca8fa2f56..9a10a7ede8 100644 --- a/indra/newview/llinspecttoast.cpp +++ b/indra/newview/llinspecttoast.cpp @@ -55,7 +55,7 @@ public:  private:  	void onToastDestroy(LLToast * toast); -private: +	boost::signals2::scoped_connection mConnection;  	LLPanel* mPanel;  	LLScreenChannel* mScreenChannel;  }; @@ -88,7 +88,7 @@ void LLInspectToast::onOpen(const LLSD& notification_id)  		llwarns << "Could not get requested toast  from screen channel." << llendl;  		return;  	} -	toast->setOnToastDestroyedCallback(boost::bind(&LLInspectToast::onToastDestroy, this, _1)); +	mConnection = toast->setOnToastDestroyedCallback(boost::bind(&LLInspectToast::onToastDestroy, this, _1));  	LLPanel * panel = toast->getPanel();  	panel->setVisible(TRUE); diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index 37088064c6..7e9a2cb716 100644 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -245,6 +245,47 @@ BOOL get_is_item_worn(const LLUUID& id)  	return FALSE;  } +BOOL get_can_item_be_worn(const LLUUID& id) +{ +	const LLViewerInventoryItem* item = gInventory.getItem(id); +	if (!item) +		return FALSE; +	 +	switch(item->getType()) +	{ +		case LLAssetType::AT_OBJECT: +		{ +			if (isAgentAvatarValid() && gAgentAvatarp->isWearingAttachment(item->getLinkedUUID())) +			{ +				// Already being worn +				return FALSE; +			} +			else +			{ +				// Not being worn yet. +				return TRUE; +			} +			break; +		} +		case LLAssetType::AT_BODYPART: +		case LLAssetType::AT_CLOTHING: +			if(gAgentWearables.isWearingItem(item->getLinkedUUID())) +			{ +				// Already being worn +				return FALSE; +			} +			else +			{ +				// Not being worn yet. +				return TRUE; +			} +			break; +		default: +			break; +	} +	return FALSE; +} +  BOOL get_is_item_removable(const LLInventoryModel* model, const LLUUID& id)  {  	if (!model) diff --git a/indra/newview/llinventoryfunctions.h b/indra/newview/llinventoryfunctions.h index 6619a50d28..1c3f82c531 100644 --- a/indra/newview/llinventoryfunctions.h +++ b/indra/newview/llinventoryfunctions.h @@ -46,6 +46,9 @@  // Is this item or its baseitem is worn, attached, etc...  BOOL get_is_item_worn(const LLUUID& id); +// Could this item be worn (correct type + not already being worn) +BOOL get_can_item_be_worn(const LLUUID& id); +  BOOL get_is_item_removable(const LLInventoryModel* model, const LLUUID& id);  BOOL get_is_category_removable(const LLInventoryModel* model, const LLUUID& id); diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp index 1544717873..ffd879dfd7 100644 --- a/indra/newview/llpaneloutfitedit.cpp +++ b/indra/newview/llpaneloutfitedit.cpp @@ -661,10 +661,13 @@ void LLPanelOutfitEdit::onInventorySelectionChange()  	getSelectedItemsUUID(selected_items);  	if (selected_items.empty())  	{ +		mPlusBtn->setEnabled(false);  		return;  	} -	uuid_vec_t::iterator worn_item = std::find_if(selected_items.begin(), selected_items.end(), boost::bind(&get_is_item_worn, _1)); -	bool can_add = ( worn_item == selected_items.end() ); + +	// If any of the selected items are not wearable (due to already being worn OR being of the wrong type), disable the add button. +	uuid_vec_t::iterator unwearable_item = std::find_if(selected_items.begin(), selected_items.end(), !boost::bind(& get_can_item_be_worn, _1)); +	bool can_add = ( unwearable_item == selected_items.end() );  	mPlusBtn->setEnabled(can_add); | 
