Merge branch 'Release' of https://github.com/Lirusaito/SingularityViewer.git
This commit is contained in:
@@ -2572,11 +2572,11 @@
|
||||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>960953da9ab7c335a0f4f97e9bf8341c</string>
|
||||
<string>a38ec464042e1d5e67231d9bcd181ae2</string>
|
||||
<key>hash_algorithm</key>
|
||||
<string>md5</string>
|
||||
<key>url</key>
|
||||
<string>http://depot.alchemyviewer.org/pub/windows/lib-vc14/vcredist-14.0.23506.0-windows-201601191536.tar.bz2</string>
|
||||
<string>https://depot.alchemyviewer.org/pub/windows/lib-vc14/vcredist-14.0.23918.0-windows-201606250656.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows</string>
|
||||
@@ -2586,18 +2586,18 @@
|
||||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>918588215463f36836eeefd9d3891868</string>
|
||||
<string>0d688527ab7d08f6b7c7a5f73175e4f8</string>
|
||||
<key>hash_algorithm</key>
|
||||
<string>md5</string>
|
||||
<key>url</key>
|
||||
<string>http://depot.alchemyviewer.org/pub/windows64/lib-vc14/vcredist-14.0.23506.0-windows64-201601191536.tar.bz2</string>
|
||||
<string>https://depot.alchemyviewer.org/pub/windows64/lib-vc14/vcredist-14.0.23918.0-windows64-201606250656.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows64</string>
|
||||
</map>
|
||||
</map>
|
||||
<key>version</key>
|
||||
<string>14.0.23506.0</string>
|
||||
<string>14.0.23918.0</string>
|
||||
</map>
|
||||
<key>xmlrpc-epi</key>
|
||||
<map>
|
||||
|
||||
@@ -2248,7 +2248,7 @@ LLImportMaterial LLDAELoader::profileToMaterial(domProfile_COMMON* material, DAE
|
||||
if (newparams.getCount())
|
||||
{
|
||||
|
||||
for (S32 i = 0; i < newparams.getCount(); i++)
|
||||
for (U32 i = 0; i < newparams.getCount(); i++)
|
||||
{
|
||||
domFx_surface_common* surface = newparams[i]->getSurface();
|
||||
if (surface)
|
||||
|
||||
@@ -379,7 +379,7 @@ bool LLModelLoader::loadFromSLM(const std::string& filename)
|
||||
{
|
||||
if (!model[lod].empty())
|
||||
{
|
||||
if (idx >= model[lod].size())
|
||||
if (idx >= (S32)model[lod].size())
|
||||
{
|
||||
if (model[lod].size())
|
||||
{
|
||||
|
||||
@@ -253,7 +253,11 @@ class AIConstListIterator {
|
||||
typedef AIConstListIterator<T> _Self;
|
||||
typedef std::list<AINode<T> > _Container;
|
||||
typedef typename _Container::iterator _Iterator;
|
||||
#if LL_LINUX && GCC_VERSION <= 40899
|
||||
typedef _Iterator _ConstIterator;
|
||||
#else
|
||||
typedef typename _Container::const_iterator _ConstIterator;
|
||||
#endif
|
||||
typedef AIListIterator<T> iterator;
|
||||
|
||||
_Container const* mContainer;
|
||||
|
||||
@@ -796,17 +796,6 @@
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>LiruResizeRootWithScreen</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>When false, the ui view won't resize when the screen does (floaters won't move around without user interaction, but they also might be restricted from moving everywhere).</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>LiruLegacyScrollToEnd</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
@@ -978,6 +967,17 @@
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>LiruOnlineNotificationBehavior</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Determines if Friend is Online notifications will do anything when clicked. (0 does nothing, 1 starts an IM (default), 2 opens profile.</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>S32</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>LiruRegionRestartMinimized</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
@@ -991,6 +991,17 @@
|
||||
<key>IsCOA</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>LiruResizeRootWithScreen</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>When false, the ui view won't resize when the screen does (floaters won't move around without user interaction, but they also might be restricted from moving everywhere).</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>LiruScriptErrorsStealFocus</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
||||
BIN
indra/newview/icons/alpha/viewer.icns
Normal file
BIN
indra/newview/icons/alpha/viewer.icns
Normal file
Binary file not shown.
BIN
indra/newview/icons/alpha/viewer.ico
Normal file
BIN
indra/newview/icons/alpha/viewer.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 51 KiB |
BIN
indra/newview/icons/alpha/viewer.png
Normal file
BIN
indra/newview/icons/alpha/viewer.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 46 KiB |
BIN
indra/newview/icons/alpha/viewer_256.BMP
Normal file
BIN
indra/newview/icons/alpha/viewer_256.BMP
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 192 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 256 KiB After Width: | Height: | Size: 192 KiB |
@@ -15,7 +15,7 @@ function install_desktop_entry()
|
||||
Name=@VIEWER_BRANDING_ID@\n\
|
||||
Comment=Client for Online Virtual Worlds, such as Second Life\n\
|
||||
Exec=${installation_prefix}/@VIEWER_BRANDING_ID@\n\
|
||||
Icon=${installation_prefix}/@VIEWER_BRANDING_ID@_icon.png\n\
|
||||
Icon=${installation_prefix}/viewer_icon.png\n\
|
||||
Terminal=false\n\
|
||||
Type=Application\n\
|
||||
Categories=Application;Network;\n\
|
||||
|
||||
@@ -7,10 +7,10 @@
|
||||
HANDLER="$1"
|
||||
|
||||
RUN_PATH=`dirname "$0" || echo .`
|
||||
cd "${RUN_PATH}"
|
||||
cd "${RUN_PATH}/.."
|
||||
|
||||
if [ -z "$HANDLER" ]; then
|
||||
HANDLER=`pwd`/handle_secondlifeprotocol.sh
|
||||
HANDLER=`pwd`/etc/handle_secondlifeprotocol.sh
|
||||
fi
|
||||
|
||||
# Register handler for GNOME-aware apps
|
||||
|
||||
@@ -749,13 +749,14 @@ static void on_avatar_name_cache_notify(const LLUUID& agent_id,
|
||||
|
||||
// Popup a notify box with online status of this agent
|
||||
LLNotificationPtr notification;
|
||||
if (online)
|
||||
static const LLCachedControl<S32> behavior(gSavedSettings, "LiruOnlineNotificationBehavior", 1);
|
||||
if (online && behavior)
|
||||
{
|
||||
notification =
|
||||
LLNotifications::instance().add("FriendOnlineOffline",
|
||||
args,
|
||||
payload,
|
||||
boost::bind(&LLAvatarActions::startIM, agent_id));
|
||||
behavior == 1 ? boost::bind(&LLAvatarActions::startIM, agent_id) : (LLNotificationResponder)boost::bind(LLAvatarActions::showProfile, agent_id, false));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -1355,38 +1355,7 @@ void send_eject(const LLUUID& avatar_id, bool ban)
|
||||
}
|
||||
}
|
||||
|
||||
static void send_estate_message(
|
||||
const char* request,
|
||||
const LLUUID& target)
|
||||
{
|
||||
|
||||
LLMessageSystem* msg = gMessageSystem;
|
||||
LLUUID invoice;
|
||||
|
||||
// This seems to provide an ID so that the sim can say which request it's
|
||||
// replying to. I think this can be ignored for now.
|
||||
invoice.generate();
|
||||
|
||||
LL_INFOS() << "Sending estate request '" << request << "'" << LL_ENDL;
|
||||
msg->newMessage("EstateOwnerMessage");
|
||||
msg->nextBlockFast(_PREHASH_AgentData);
|
||||
msg->addUUIDFast(_PREHASH_AgentID, gAgentID);
|
||||
msg->addUUIDFast(_PREHASH_SessionID, gAgentSessionID);
|
||||
msg->addUUIDFast(_PREHASH_TransactionID, LLUUID::null); //not used
|
||||
msg->nextBlock("MethodData");
|
||||
msg->addString("Method", request);
|
||||
msg->addUUID("Invoice", invoice);
|
||||
|
||||
// Agent id
|
||||
msg->nextBlock("ParamList");
|
||||
msg->addString("Parameter", gAgentID.asString().c_str());
|
||||
|
||||
// Target
|
||||
msg->nextBlock("ParamList");
|
||||
msg->addString("Parameter", target.asString().c_str());
|
||||
|
||||
msg->sendReliable(gAgent.getRegion()->getHost());
|
||||
}
|
||||
void send_estate_message(const std::string request, const std::vector<std::string>& strings);
|
||||
|
||||
static void cmd_append_names(const LLAvatarListEntry* entry, std::string &str, std::string &sep)
|
||||
{ if(!str.empty())str.append(sep);str.append(entry->getName()); }
|
||||
@@ -1398,7 +1367,8 @@ static void cmd_freeze(const LLAvatarListEntry* entry) { send_freeze(entry->get
|
||||
static void cmd_unfreeze(const LLAvatarListEntry* entry) { send_freeze(entry->getID(), false); }
|
||||
static void cmd_eject(const LLAvatarListEntry* entry) { send_eject(entry->getID(), false); }
|
||||
static void cmd_ban(const LLAvatarListEntry* entry) { send_eject(entry->getID(), true); }
|
||||
static void cmd_estate_eject(const LLAvatarListEntry* entry){ send_estate_message("teleporthomeuser", entry->getID()); }
|
||||
static void cmd_estate_eject(const LLAvatarListEntry* entry){ send_estate_message("kickestate", {entry->getID().asString()}); }
|
||||
static void cmd_estate_tp_home(const LLAvatarListEntry* entry){ send_estate_message("teleporthomeuser", {gAgentID.asString(), entry->getID().asString()}); }
|
||||
static void cmd_estate_ban(const LLAvatarListEntry* entry) { LLPanelEstateInfo::sendEstateAccessDelta(ESTATE_ACCESS_BANNED_AGENT_ADD | ESTATE_ACCESS_ALLOWED_AGENT_REMOVE | ESTATE_ACCESS_NO_REPLY, entry->getID()); }
|
||||
|
||||
void LLFloaterAvatarList::doCommand(avlist_command_t func, bool single/*=false*/) const
|
||||
@@ -1469,8 +1439,9 @@ void LLFloaterAvatarList::callbackEjectFromEstate(const LLSD& notification, cons
|
||||
{
|
||||
if (!instanceExists()) return;
|
||||
LLFloaterAvatarList& inst(instance());
|
||||
if (!LLNotification::getSelectedOption(notification, response)) // if == 0
|
||||
inst.doCommand(cmd_estate_eject);
|
||||
S32 option = LLNotification::getSelectedOption(notification, response);
|
||||
if (option != 2)
|
||||
inst.doCommand(option ? cmd_estate_tp_home : cmd_estate_eject);
|
||||
}
|
||||
|
||||
//static
|
||||
|
||||
@@ -77,11 +77,11 @@ void LLFloaterMediaFilter::updateLists(LLMediaFilter::EMediaList list_type)
|
||||
const LLMediaFilter::string_list_t& list = white ? inst.getWhiteList() : inst.getBlackList();
|
||||
LLScrollListCtrl* scroll(white ? mWhitelist : mBlacklist);
|
||||
scroll->clearRows();
|
||||
for (LLMediaFilter::string_list_t::const_iterator itr = list.begin(); itr != list.end(); ++itr)
|
||||
for (const auto& value : list)
|
||||
{
|
||||
LLSD element;
|
||||
element["columns"][0]["column"] = "list";
|
||||
element["columns"][0]["value"] = (*itr);
|
||||
element["columns"][0]["value"] = value;
|
||||
scroll->addElement(element);
|
||||
}
|
||||
enableButton(getChildView(white ? "remove_whitelist" : "remove_blacklist"), scroll);
|
||||
@@ -103,9 +103,9 @@ void LLFloaterMediaFilter::onRemoveFromList(bool white)
|
||||
{
|
||||
std::vector<LLScrollListItem*> selected = (white ? mWhitelist : mBlacklist)->getAllSelected();
|
||||
LLMediaFilter::string_vec_t domains;
|
||||
for (std::vector<LLScrollListItem*>::iterator itr = selected.begin(); itr != selected.end(); ++itr)
|
||||
for (auto* item : selected)
|
||||
{
|
||||
domains.push_back((*itr)->getColumn(0)->getValue().asString());
|
||||
domains.push_back(item->getColumn(0)->getValue().asString());
|
||||
}
|
||||
LLMediaFilter::getInstance()->removeFromMediaList(domains, white ? LLMediaFilter::WHITELIST : LLMediaFilter::BLACKLIST);
|
||||
}
|
||||
|
||||
@@ -1572,7 +1572,7 @@ BOOL LLFolderView::handleKeyHere( KEY key, MASK mask )
|
||||
{
|
||||
LLFolderViewItem* last_selected = getCurSelectedItem();
|
||||
bool shift_select = mask & MASK_SHIFT;
|
||||
LLFolderViewItem* next = last_selected->getNextOpenNode();
|
||||
LLFolderViewItem* next = last_selected->getNextOpenNode(!shift_select);
|
||||
|
||||
if (!mKeyboardSelection || (!shift_select && (!next || next == last_selected)))
|
||||
{
|
||||
|
||||
@@ -331,7 +331,7 @@ void LLGiveInventory::logInventoryOffer(const LLUUID& to_agent, const LLUUID &im
|
||||
(!RlvUIEnabler::hasOpenProfile(to_agent)) )
|
||||
{
|
||||
// Log to chat history if the user didn't drop on an IM session or a profile to avoid revealing the name of the recipient
|
||||
std::string strMsgName = "inventory_item_offered"; LLSD args; LLAvatarName avName;
|
||||
std::string strMsgName = "inventory_item_offered-im"; LLSD args; LLAvatarName avName;
|
||||
if (LLAvatarNameCache::get(to_agent, &avName))
|
||||
{
|
||||
args["NAME"] = RlvStrings::getAnonym(avName);
|
||||
|
||||
@@ -161,9 +161,9 @@ void LLMediaFilter::addToMediaList(const std::string& in_url, EMediaList list, b
|
||||
|
||||
string_list_t& p_list(list == WHITELIST ? mWhiteList : mBlackList);
|
||||
// Check for duplicates
|
||||
for (string_list_t::const_iterator itr = p_list.begin(); itr != p_list.end(); ++itr)
|
||||
for (const auto& p : p_list)
|
||||
{
|
||||
if (url == *itr)
|
||||
if (url == p)
|
||||
{
|
||||
LL_INFOS("MediaFilter") << "URL " << url << " already in list!" << LL_ENDL;
|
||||
return;
|
||||
@@ -177,8 +177,8 @@ void LLMediaFilter::addToMediaList(const std::string& in_url, EMediaList list, b
|
||||
void LLMediaFilter::removeFromMediaList(string_vec_t domains, EMediaList list)
|
||||
{
|
||||
if (domains.empty()) return;
|
||||
for (string_vec_t::const_iterator itr = domains.begin(); itr != domains.end(); ++itr)
|
||||
(list == WHITELIST ? mWhiteList : mBlackList).remove(*itr);
|
||||
for (const auto& domain : domains)
|
||||
(list == WHITELIST ? mWhiteList : mBlackList).remove(domain);
|
||||
mMediaListUpdate(list);
|
||||
saveMediaFilterToDisk();
|
||||
}
|
||||
@@ -221,10 +221,10 @@ void LLMediaFilter::loadMediaFilterFromDisk()
|
||||
|
||||
void medialist_to_llsd(const LLMediaFilter::string_list_t& list, LLSD& list_llsd, const LLSD& action)
|
||||
{
|
||||
for (LLMediaFilter::string_list_t::const_iterator itr = list.begin(); itr != list.end(); ++itr)
|
||||
for (const auto& domain : list)
|
||||
{
|
||||
LLSD item;
|
||||
item["domain"] = *itr;
|
||||
item["domain"] = domain;
|
||||
item["action"] = action;
|
||||
list_llsd.append(item);
|
||||
}
|
||||
@@ -352,13 +352,13 @@ bool handle_media_filter_callback(const LLSD& notification, const LLSD& response
|
||||
LLParcel* queue = inst.getQueuedMedia();
|
||||
switch(option)
|
||||
{
|
||||
case 2: // Whitelist domain
|
||||
case 3: // Whitelist domain
|
||||
inst.addToMediaList(url, LLMediaFilter::WHITELIST);
|
||||
case 0: // Allow
|
||||
if (inst.getCurrentParcel() == LLViewerParcelMgr::getInstance()->getAgentParcel())
|
||||
LLViewerParcelMedia::play(parcel);
|
||||
break;
|
||||
case 3: // Blacklist domain
|
||||
case 2: // Blacklist domain
|
||||
inst.addToMediaList(url, LLMediaFilter::BLACKLIST);
|
||||
case 1: // Deny
|
||||
break;
|
||||
|
||||
@@ -1128,7 +1128,7 @@ void LLNetMap::renderPropertyLinesForRegion(const LLViewerRegion* pRegion, const
|
||||
// Draw the north and east region borders
|
||||
//
|
||||
const F32 real_width(pRegion->getWidth());
|
||||
const S32 borderY = originY + ll_round(real_width * mObjectMapTPM);
|
||||
const S32 borderY = originY + ll_round(real_width * mObjectMapTPM);
|
||||
if ( (borderY >= 0) && (borderY < imgHeight) )
|
||||
{
|
||||
S32 curX = llclamp(originX, 0, imgWidth), endX = llclamp(originX + ll_round(real_width * mObjectMapTPM), 0, imgWidth - 1);
|
||||
@@ -1146,8 +1146,8 @@ const S32 borderY = originY + ll_round(real_width * mObjectMapTPM);
|
||||
//
|
||||
// Render parcel lines
|
||||
//
|
||||
static const F32 GRID_STEP = PARCEL_GRID_STEP_METERS;
|
||||
static const S32 GRIDS_PER_EDGE = real_width / GRID_STEP;
|
||||
const F32 GRID_STEP = PARCEL_GRID_STEP_METERS;
|
||||
const S32 GRIDS_PER_EDGE = real_width / GRID_STEP;
|
||||
|
||||
const U8* pOwnership = pRegion->getParcelOverlay()->getOwnership();
|
||||
const U8* pCollision = (pRegion->getHandle() == LLViewerParcelMgr::instance().getCollisionRegionHandle()) ? LLViewerParcelMgr::instance().getCollisionBitmap() : NULL;
|
||||
|
||||
@@ -390,9 +390,9 @@ LLButton* LLNotifyBox::addButton(const std::string& name, const std::string& lab
|
||||
|
||||
if (layout_script_dialog)
|
||||
{
|
||||
// Add two "blank" option spaces, before the "Ignore" button
|
||||
index = button_index + 2;
|
||||
if (button_index == 0)
|
||||
// Add one "blank" option space, before the "Block" and "Ignore" buttons
|
||||
index = button_index + 1;
|
||||
if (button_index == 0 || button_index == 1)
|
||||
{
|
||||
// Ignore button is smaller, less wide
|
||||
btn_height = BTN_HEIGHT_SMALL;
|
||||
@@ -625,9 +625,9 @@ LLRect LLNotifyBox::getNotifyRect(S32 num_options, bool layout_script_dialog, bo
|
||||
if (num_options < 1)
|
||||
num_options = 1;
|
||||
|
||||
// Add two "blank" option spaces.
|
||||
// Add one "blank" option space.
|
||||
if (layout_script_dialog)
|
||||
num_options += 2;
|
||||
num_options += 1;
|
||||
|
||||
S32 additional_lines = (num_options-1) / 3;
|
||||
|
||||
|
||||
@@ -324,7 +324,7 @@ void LLOverlayBar::refresh()
|
||||
}
|
||||
buttons_changed |= updateButtonVisiblity(mNotBusy, gAgent.isDoNotDisturb()) != NULL;
|
||||
buttons_changed |= updateButtonVisiblity(mFlyCam,LLViewerJoystick::getInstance()->getOverrideCamera()) != NULL;
|
||||
buttons_changed |= updateButtonVisiblity(mMouseLook,gAgent.isControlGrabbed(CONTROL_ML_LBUTTON_DOWN_INDEX)||gAgent.isControlGrabbed(CONTROL_ML_LBUTTON_UP_INDEX)) != NULL;
|
||||
buttons_changed |= updateButtonVisiblity(mMouseLook,gAgent.isControlBlocked(CONTROL_ML_LBUTTON_DOWN_INDEX)||gAgent.isControlBlocked(CONTROL_ML_LBUTTON_UP_INDEX)) != NULL;
|
||||
// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g)
|
||||
// buttons_changed |= updateButtonVisiblity("Stand Up", isAgentAvatarValid() && gAgentAvatarp->isSitting()) != NULL;
|
||||
buttons_changed |= updateButtonVisiblity(mStandUp,isAgentAvatarValid() && gAgentAvatarp->isSitting() && !gRlvHandler.hasBehaviour(RLV_BHVR_UNSIT)) != NULL;
|
||||
|
||||
@@ -1324,6 +1324,7 @@ void LLPanelAvatar::setAvatarID(const LLUUID &avatar_id)
|
||||
view = getChildView("Pay...");
|
||||
view->setVisible(!own_avatar);
|
||||
view->setEnabled(false);
|
||||
getChildView("Log")->setVisible(!own_avatar);
|
||||
|
||||
getChild<LLNameEditor>("avatar_key")->setText(avatar_id.asString());
|
||||
|
||||
|
||||
@@ -520,6 +520,16 @@ void LLPanelMainInventory::onFilterEdit(const std::string& search_string )
|
||||
return;
|
||||
}
|
||||
|
||||
/* Singu Note: This is the old behavior, desired by SV-2078, but we'd prefer the new behavior.
|
||||
* I've left this here in case we want to add it back in some way.
|
||||
if (search_string.empty())
|
||||
{
|
||||
mActivePanel->setFilterTypes(0xffffffffffffffffULL);
|
||||
if (auto* finder = getFinder())
|
||||
LLFloaterInventoryFinder::selectAllTypes(finder);
|
||||
}
|
||||
*/
|
||||
|
||||
// set new filter string
|
||||
// Internally handles saving/restoring folder states.
|
||||
mActivePanel->setFilterSubString(search_string);
|
||||
@@ -677,6 +687,9 @@ void LLPanelMainInventory::onResetAll(void* userdata)
|
||||
self->mFilterEditor->setText(LLStringUtil::null);
|
||||
}
|
||||
self->onFilterEdit("");
|
||||
self->mActivePanel->setFilterTypes(0xffffffffffffffffULL);
|
||||
if (auto* finder = self->getFinder())
|
||||
LLFloaterInventoryFinder::selectAllTypes(finder);
|
||||
self->mActivePanel->closeAllFolders();
|
||||
}
|
||||
|
||||
|
||||
@@ -594,7 +594,7 @@ void LLGLTexMemBar::draw()
|
||||
max_bound_mem.value(),
|
||||
LLRenderTarget::sBytesAllocated/(1024*1024),
|
||||
global_raw_memory >> 20, discard_bias,
|
||||
cache_usage, cache_max_usage, total_texture_downloaded, total_object_downloaded, total_http_requests);
|
||||
cache_usage, cache_max_usage, total_texture_downloaded.valueInUnits<LLUnits::Megabytes>(), total_object_downloaded.valueInUnits<LLUnits::Megabytes>(), total_http_requests);
|
||||
//, cache_entries, cache_max_entries
|
||||
|
||||
LLFontGL::getFontMonospace()->renderUTF8(text, 0, 0, v_offset + line_height*3,
|
||||
|
||||
@@ -976,11 +976,14 @@ BOOL LLToolDragAndDrop::handleDropTextureProtections(LLViewerObject* hit_obj,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// In case the inventory has not been updated (e.g. due to some recent operation
|
||||
// causing a dirty inventory), stall the user while fetching the inventory.
|
||||
if (hit_obj->isInventoryDirty())
|
||||
// In case the inventory has not been loaded (e.g. due to some recent operation
|
||||
// causing a dirty inventory) and we can do an update, stall the user
|
||||
// while fetching the inventory.
|
||||
//
|
||||
// Fetch if inventory is dirty and listener is present (otherwise we will not receive update)
|
||||
if (hit_obj->isInventoryDirty() && hit_obj->hasInventoryListeners())
|
||||
{
|
||||
hit_obj->fetchInventoryFromServer();
|
||||
hit_obj->requestInventory();
|
||||
LLSD args;
|
||||
args["ERROR_MESSAGE"] = "Unable to add texture.\nPlease wait a few seconds and try again.";
|
||||
LLNotificationsUtil::add("ErrorMessage", args);
|
||||
@@ -1060,10 +1063,12 @@ BOOL LLToolDragAndDrop::handleDropTextureProtections(LLViewerObject* hit_obj,
|
||||
{
|
||||
hit_obj->updateInventory(new_item, TASK_INVENTORY_ITEM_KEY, true);
|
||||
}
|
||||
// Force the object to update its refetch its inventory so it has this texture.
|
||||
hit_obj->fetchInventoryFromServer();
|
||||
// Force the object to update and refetch its inventory so it has this texture.
|
||||
hit_obj->dirtyInventory();
|
||||
hit_obj->requestInventory();
|
||||
// TODO: Check to see if adding the item was successful; if not, then
|
||||
// we should return false here.
|
||||
// we should return false here. This will requre a separate listener
|
||||
// since without listener, we have no way to receive update
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -8464,7 +8464,7 @@ static void handle_load_from_xml_continued(AIFilePicker* filepicker)
|
||||
|
||||
void handle_web_browser_test(void*)
|
||||
{
|
||||
LLWeb::loadURL("http://secondlife.com/app/search/slurls.html");
|
||||
LLWeb::loadURLInternal("http://secondlife.com/app/search/slurls.html");
|
||||
}
|
||||
|
||||
void handle_buy_currency_test(void*)
|
||||
@@ -9182,20 +9182,30 @@ class ListFreeze : public view_listener_t
|
||||
}
|
||||
};
|
||||
|
||||
void estate_bulk_eject(const uuid_vec_t& ids, bool ban, S32 zero)
|
||||
void send_estate_message(const std::string request, const std::vector<std::string>& strings)
|
||||
{
|
||||
if (ids.empty() || zero != 0) return;
|
||||
std::vector<std::string> strings(2, gAgentID.asString()); // [0] = our agent id
|
||||
for (uuid_vec_t::const_iterator it = ids.begin(); it != ids.end(); ++it)
|
||||
{
|
||||
LLUUID id(*it);
|
||||
if (id.isNull()) continue;
|
||||
strings[1] = id.asString(); // [1] = target agent id
|
||||
LLRegionInfoModel::sendEstateOwnerMessage(gMessageSystem, request, LLFloaterRegionInfo::getLastInvoice(), strings);
|
||||
}
|
||||
|
||||
LLRegionInfoModel::sendEstateOwnerMessage(gMessageSystem, "teleporthomeuser", LLFloaterRegionInfo::getLastInvoice(), strings);
|
||||
void estate_bulk_eject(const uuid_vec_t& ids, bool ban, S32 option)
|
||||
{
|
||||
if (ids.empty() || option == (ban ? 1 : 2)) return;
|
||||
const bool tphome(option == 1);
|
||||
const std::string agent(tphome ? gAgentID.asString() : LLStringUtil::null);
|
||||
std::vector<std::string> strings;
|
||||
if (!tphome) strings.reserve(ids.size());
|
||||
for (const LLUUID& id : ids)
|
||||
{
|
||||
if (id.isNull()) continue;
|
||||
const std::string idstr(id.asString());
|
||||
if (tphome)
|
||||
send_estate_message("teleporthomeuser", {agent, idstr});
|
||||
else
|
||||
strings.push_back(idstr);
|
||||
if (ban)
|
||||
LLPanelEstateInfo::sendEstateAccessDelta(ESTATE_ACCESS_BANNED_AGENT_ADD | ESTATE_ACCESS_ALLOWED_AGENT_REMOVE | ESTATE_ACCESS_NO_REPLY, id);
|
||||
}
|
||||
if (!tphome) send_estate_message("kickestate", strings);
|
||||
}
|
||||
|
||||
class ListEstateBan : public view_listener_t
|
||||
|
||||
@@ -8090,8 +8090,8 @@ bool callback_script_dialog(const LLSD& notification, const LLSD& response)
|
||||
|
||||
std::string button = LLNotification::getSelectedOptionName(response);
|
||||
S32 button_idx = LLNotification::getSelectedOption(notification, response);
|
||||
// Didn't click "Ignore"
|
||||
if (button_idx != -1)
|
||||
// Didn't click "Ignore" or "Block"
|
||||
if (button_idx > -1)
|
||||
{
|
||||
if (notification["payload"].has("textbox"))
|
||||
{
|
||||
@@ -8109,6 +8109,10 @@ bool callback_script_dialog(const LLSD& notification, const LLSD& response)
|
||||
msg->addString("ButtonLabel", button);
|
||||
msg->sendReliable(LLHost(notification["payload"]["sender"].asString()));
|
||||
}
|
||||
else if (button_idx == -2) // Block
|
||||
{
|
||||
LLMuteList::getInstance()->add(LLMute(notification["payload"]["object_id"].asUUID(), notification["substitutions"]["TITLE"].asString(), LLMute::OBJECT));
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -2594,6 +2594,11 @@ void LLViewerObject::clearInventoryListeners()
|
||||
mInventoryCallbacks.clear();
|
||||
}
|
||||
|
||||
bool LLViewerObject::hasInventoryListeners()
|
||||
{
|
||||
return !mInventoryCallbacks.empty();
|
||||
}
|
||||
|
||||
void LLViewerObject::requestInventory()
|
||||
{
|
||||
if(mInventoryDirty && mInventory && !mInventoryCallbacks.empty())
|
||||
@@ -2601,15 +2606,20 @@ void LLViewerObject::requestInventory()
|
||||
mInventory->clear(); // will deref and delete entries
|
||||
delete mInventory;
|
||||
mInventory = NULL;
|
||||
mInventoryDirty = FALSE; //since we are going to request it now
|
||||
}
|
||||
|
||||
if(mInventory)
|
||||
{
|
||||
// inventory is either up to date or doesn't has a listener
|
||||
// if it is dirty, leave it this way in case we gain a listener
|
||||
doInventoryCallback();
|
||||
}
|
||||
// throw away duplicate requests
|
||||
else
|
||||
{
|
||||
// since we are going to request it now
|
||||
mInventoryDirty = FALSE;
|
||||
|
||||
// Note: throws away duplicate requests
|
||||
fetchInventoryFromServer();
|
||||
}
|
||||
}
|
||||
@@ -2619,8 +2629,6 @@ void LLViewerObject::fetchInventoryFromServer()
|
||||
if (!mInventoryPending)
|
||||
{
|
||||
delete mInventory;
|
||||
mInventory = NULL;
|
||||
mInventoryDirty = FALSE;
|
||||
LLMessageSystem* msg = gMessageSystem;
|
||||
msg->newMessageFast(_PREHASH_RequestTaskInventory);
|
||||
msg->nextBlockFast(_PREHASH_AgentData);
|
||||
|
||||
@@ -54,27 +54,27 @@ class LLAgent; // TODO: Get rid of this.
|
||||
class LLAudioSource;
|
||||
class LLAudioSourceVO;
|
||||
class LLBBox;
|
||||
class LLDataPacker;
|
||||
class LLColor4;
|
||||
class LLFrameTimer;
|
||||
class LLDataPacker;
|
||||
class LLDrawable;
|
||||
class LLFrameTimer;
|
||||
class LLHost;
|
||||
class LLWorld;
|
||||
class LLMessageSystem;
|
||||
class LLNameValue;
|
||||
class LLNetMap;
|
||||
class LLMessageSystem;
|
||||
class LLPartSysData;
|
||||
class LLPrimitive;
|
||||
class LLPipeline;
|
||||
class LLPrimitive;
|
||||
class LLTextureEntry;
|
||||
class LLViewerTexture;
|
||||
class LLVOAvatar;
|
||||
class LLVOInventoryListener;
|
||||
class LLViewerInventoryItem;
|
||||
class LLViewerObject;
|
||||
class LLViewerObjectMedia;
|
||||
class LLViewerPartSourceScript;
|
||||
class LLViewerRegion;
|
||||
class LLViewerObjectMedia;
|
||||
class LLVOInventoryListener;
|
||||
class LLVOAvatar;
|
||||
class LLViewerTexture;
|
||||
class LLWorld;
|
||||
|
||||
typedef enum e_object_update_type
|
||||
{
|
||||
@@ -112,7 +112,7 @@ struct PotentialReturnableObject
|
||||
|
||||
//============================================================================
|
||||
|
||||
class LLViewerObject : public LLPrimitive, public LLRefCount, public LLGLUpdate
|
||||
class LLViewerObject: public LLPrimitive, public LLRefCount, public LLGLUpdate
|
||||
{
|
||||
protected:
|
||||
~LLViewerObject(); // use unref()
|
||||
@@ -446,8 +446,8 @@ public:
|
||||
void removeInventoryListener(LLVOInventoryListener* listener);
|
||||
BOOL isInventoryPending() { return mInventoryPending; }
|
||||
void clearInventoryListeners();
|
||||
bool hasInventoryListeners();
|
||||
void requestInventory();
|
||||
void fetchInventoryFromServer();
|
||||
static void processTaskInv(LLMessageSystem* msg, void** user_data);
|
||||
void removeInventory(const LLUUID& item_id);
|
||||
|
||||
@@ -595,6 +595,9 @@ private:
|
||||
// Motion prediction between updates
|
||||
void interpolateLinearMotion(const F64SecondsImplicit & time, const F32SecondsImplicit & dt);
|
||||
|
||||
// forms task inventory request if none are pending
|
||||
void fetchInventoryFromServer();
|
||||
|
||||
public:
|
||||
//
|
||||
// Viewer-side only types - use the LL_PCODE_APP mask.
|
||||
|
||||
@@ -162,8 +162,8 @@ LLViewerParcelMgr::LLViewerParcelMgr()
|
||||
// JC: Resolved a merge conflict here, eliminated
|
||||
// mBlockedImage->setAddressMode(LLTexUnit::TAM_WRAP);
|
||||
// because it is done in llviewertexturelist.cpp
|
||||
mBlockedImage = LLViewerTextureManager::getFetchedTextureFromFile("noentrylines.j2c");
|
||||
mPassImage = LLViewerTextureManager::getFetchedTextureFromFile("noentrypasslines.j2c");
|
||||
mBlockedImage = LLViewerTextureManager::getFetchedTextureFromFile("world/NoEntryLines.png");
|
||||
mPassImage = LLViewerTextureManager::getFetchedTextureFromFile("world/NoEntryPassLines.png");
|
||||
|
||||
S32 overlay_size = mParcelsPerEdge * mParcelsPerEdge / PARCEL_OVERLAY_CHUNKS;
|
||||
sPackedOverlay = new U8[overlay_size];
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -37,6 +37,7 @@ with the same filename but different name
|
||||
<texture name="Accordion_Press" file_name="Accordion_Press.png" preload="false" />
|
||||
<texture name="Accordion_Over" file_name="Accordion_Over.png" preload="false" />
|
||||
<texture name="Accordion_Selected" file_name="Accordion_Selected.png" preload="false" />
|
||||
|
||||
<texture name="icon_group.tga"/>
|
||||
<texture name="Parcel_M_Dark" file_name="map_event_mature.tga" preload="true" />
|
||||
<texture name="Parcel_M_Light" file_name="map_event_mature.tga" preload="false" />
|
||||
@@ -45,6 +46,9 @@ with the same filename but different name
|
||||
<texture name="ProgressBar" file_name="progressbar_fill.tga" preload="true" scale.left="10" scale.top="7" scale.right="65" scale.bottom="7" />
|
||||
<texture name="ProgressTrack" file_name="progressbar_track.tga" preload="true" scale.left="10" scale.top="7" scale.right="80" scale.bottom="7" />
|
||||
<texture name="Refresh_Off" file_name="Refresh_Off.png" preload="true" />
|
||||
|
||||
<texture name="NoEntryLines" file_name="world/NoEntryLines.png" use_mips="true" preload="false" />
|
||||
<texture name="NoEntryPassLines" file_name="world/NoEntryPassLines.png" use_mips="true" preload="false" />
|
||||
<texture name="Rounded_Rect" file_name="Rounded_Rect.png" preload="true" scale.left="6" scale.top="26" scale.right="58" scale.bottom="6" />
|
||||
<texture name="Rounded_Rect_Top" file_name="Rounded_Rect.png" preload="true" scale.left="6" scale.top="8" scale.right="58" scale.bottom="0" clip.left="0" clip.right="64" clip.bottom="16" clip.top="32" />
|
||||
<texture name="Rounded_Rect_Bottom" file_name="Rounded_Rect.png" preload="true" scale.left="6" scale.top="16" scale.right="58" scale.bottom="8" clip.left="0" clip.right="64" clip.bottom="0" clip.top="16" />
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
<panel border="false" label="Credits" height="386" name="credits_panel">
|
||||
<!--Note to Translators: Please do not translate the following text_editor-->
|
||||
<text_editor enabled="false" follows="left|top" bg_readonly_color="transparent" left="3" max_length="65536" name="credits_editor" top="-1" bottom="0" width="443" word_wrap="true">
|
||||
Singularity Viewer is developed and maintained by Siana Gearz, Shyotl Kuhr, Inusaito Kanya, Aleric Inglewood, Tigh MacFanatic, Sovereign Engineer and Cinder Roxley, with contributions by Damian Zhaoying, Fractured Crystal, Franxisco Romano, Fritigern Gothly, Henri Beauchamp, Kadah Coba, Kitty Barnett, Knolan Falconer, Latif Khalifa, McCabe Maxsted, Narv Czervik, nhede Core, Nomade Zhao, Revolution Smythe, Selvone Franizzi, Sim Federal, Thickbrick Sleaford, Wolfspirit Magic, Zauber Parecelsus and others. Singularity is based upon Ascent source code. Credits for Ascent include Hg Beeks, Charley Levenque, Hazim Gazov, Zwagoth Klaar, Qarl Fizz, and others. Ascent is based upon the Inertia source code.
|
||||
Singularity Viewer is developed and maintained by Siana Gearz, Shyotl Kuhr, Inusaito Kanya, Mika Pyon, Router Gray, Tigh MacFanatic, and the Alchemy Viewer Team (specifically Sovereign Engineer and Cinder Roxley), with contributions by Damian Zhaoying, Fractured Crystal, Franxisco Romano, Fritigern Gothly, Henri Beauchamp, Kadah Coba, Kitty Barnett, Knolan Falconer, Latif Khalifa, McCabe Maxsted, Narv Czervik, nhede Core, Nomade Zhao, Revolution Smythe, Selvone Franizzi, Sim Federal, Thickbrick Sleaford, Wolfspirit Magic, Zauber Parecelsus and others. Singularity is maintained in joint effort with the Alchemy Viewer Project. Singularity was forked from Ascent source code. Credits for Ascent include Hg Beeks, Charley Levenque, Hazim Gazov, Zwagoth Klaar, Qarl Fizz, and others. Ascent is based upon the Inertia source code.
|
||||
|
||||
Singularity Viewer includes source code contributions of the following residents: Able Whitman, Adam Marker, Agathos Frascati, Aimee Trescothick, Alejandro Rosenthal, Aleric Inglewood, Alissa Sabre, Angus Boyd, Ann Congrejo, Argent Stonecutter, Asuka Neely, Balp Allen, Benja Kepler, Biancaluce Robbiani, Blakar Ogre, blino Nakamura, Boroondas Gupte, Bulli Schumann, bushing Spatula, Carjay McGinnis, Catherine Pfeffer, Celierra Darling, Cron Stardust, Dale Glass, Drewan Keats, Dylan Haskell, Dzonatas Sol, Eddy Stryker, EponymousDylan Ra, Eva Nowicka, Farallon Greyskin, Feep Larsson, Flemming Congrejo, Fluf Fredriksson, Fractured Crystal, Fremont Cunningham, Geneko Nemeth, Gigs Taggart, Ginko Bayliss, Grazer Kline, Gudmund Shepherd, Hamncheese Omlet, HappySmurf Papp, Henri Beauchamp, Hikkoshi Sakai, Hiro Sommambulist, Hoze Menges, Ian Kas, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Joghert LeSabre, Kage Pixel, Ken March, Kerutsen Sellery, Khyota Wulluf, Kunnis Basiat, Lisa Lowe, Lockhart Cordoso, maciek marksman, Magnus Balczo, Malwina Dollinger, march Korda, Matthew Dowd, McCabe Maxsted, Michelle2 Zenovka, Mm Alder, Mr Greggan, Nicholaz Beresford, Nounouch Hapmouche, Patric Mills, Paul Churchill, Paula Innis, Peekay Semyorka, Peter Lameth, Pf Shan, princess niven, Renault Clio, Ringo Tuxing, Robin Cornelius, Ryozu Kojima, Salahzar Stenvaag, Sammy Frederix, Scrippy Scofield, Seg Baphomet, Sergen Davies, SignpostMarv Martin, Simon Nolan, SpacedOut Frye, Sporked Friis, Stevex Janus, Still Defiant, Strife Onizuka, Tayra Dagostino, TBBle Kurosawa, Teardrops Fall, tenebrous pau, Tharax Ferraris, Thickbrick Sleaford, Thraxis Epsilon, tiamat bingyi, TraductoresAnonimos Alter, Tue Torok, Vadim Bigbear, Vixen Heron, Whoops Babii, Wilton Lundquist, Zarkonnen Decosta, Zi Ree, and Zipherius Turas.
|
||||
|
||||
|
||||
@@ -2705,7 +2705,7 @@ Please enter a higher price.
|
||||
icon="alertmodal.tga"
|
||||
name="ConfirmItemDeleteHasLinks"
|
||||
type="alertmodal">
|
||||
At least one of the items you has link items that point to it. If you delete this item, its links will permanently stop working. It is strongly advised to delete the links first.
|
||||
At least one of the items has links that point to it. If you delete this item, its links will permanently stop working. It is strongly advised to delete the links first.
|
||||
|
||||
Are you sure you want to delete these items?
|
||||
<tag>confirm</tag>
|
||||
@@ -4164,9 +4164,10 @@ Remove estate manager for this estate only or for [ALL_ESTATES]?
|
||||
Kick [EVIL_USER] from this estate?
|
||||
<tag>confirm</tag>
|
||||
<usetemplate
|
||||
name="okcancelbuttons"
|
||||
notext="Cancel"
|
||||
yestext="OK"/>
|
||||
canceltext="Cancel"
|
||||
name="yesnocancelbuttons"
|
||||
notext="Kick Home"
|
||||
yestext="Kick"/>
|
||||
</notification>
|
||||
|
||||
<notification
|
||||
@@ -7537,6 +7538,10 @@ Grant this request?
|
||||
[NAME]'s '[TITLE]' (ch[CHANNEL])
|
||||
[MESSAGE]
|
||||
<form name="form">
|
||||
<button
|
||||
index="-2"
|
||||
name="Block"
|
||||
text="Block"/>
|
||||
<button
|
||||
index="-1"
|
||||
name="Ignore"
|
||||
@@ -7551,6 +7556,10 @@ Grant this request?
|
||||
[GROUPNAME]'s '[TITLE]'
|
||||
[MESSAGE]
|
||||
<form name="form">
|
||||
<button
|
||||
index="-2"
|
||||
name="Block"
|
||||
text="Block"/>
|
||||
<button
|
||||
index="-1"
|
||||
name="Ignore"
|
||||
@@ -7567,6 +7576,10 @@ Grant this request?
|
||||
<form name="form">
|
||||
<input name="message">
|
||||
</input>
|
||||
<button
|
||||
index="-2"
|
||||
name="Block"
|
||||
text="Block"/>
|
||||
<button
|
||||
index="-1"
|
||||
name="Ignore"
|
||||
|
||||
@@ -63,6 +63,10 @@ class ViewerManifest(LLManifest):
|
||||
self.path(skin_dir + "/*")
|
||||
# include the entire textures directory recursively
|
||||
if self.prefix(src=skin_dir+"/textures"):
|
||||
self.path("*/*.tga")
|
||||
self.path("*/*.j2c")
|
||||
self.path("*/*.jpg")
|
||||
self.path("*/*.png")
|
||||
self.path("*.tga")
|
||||
self.path("*.j2c")
|
||||
self.path("*.jpg")
|
||||
@@ -206,7 +210,7 @@ class ViewerManifest(LLManifest):
|
||||
return ''.join(self.app_name().split())
|
||||
|
||||
def icon_path(self):
|
||||
return "icons/default"
|
||||
return "icons/" + ("default", "alpha")[self.channel_type() == "alpha"]
|
||||
|
||||
def extract_names(self,src):
|
||||
try:
|
||||
@@ -671,13 +675,14 @@ class DarwinManifest(ViewerManifest):
|
||||
|
||||
self.path("licenses-mac.txt", dst="licenses.txt")
|
||||
self.path("featuretable_mac.txt")
|
||||
self.path("SecondLife.nib")
|
||||
|
||||
icon_path = self.icon_path()
|
||||
if self.prefix(src=icon_path, dst="") :
|
||||
self.path("%s_icon.icns" % self.viewer_branding_id())
|
||||
self.path("%s.icns" % self.viewer_branding_id())
|
||||
self.end_prefix(icon_path)
|
||||
|
||||
self.path("SecondLife.nib")
|
||||
|
||||
# Translations
|
||||
self.path("English.lproj")
|
||||
self.path("German.lproj")
|
||||
@@ -702,7 +707,6 @@ class DarwinManifest(ViewerManifest):
|
||||
# in our bundled sub-apps. For each of these we'll create a
|
||||
# symlink from sub-app/Contents/Resources to the real .dylib.
|
||||
# Need to get the llcommon dll from any of the build directories as well.
|
||||
|
||||
libfile = "libllcommon.dylib"
|
||||
|
||||
dylibs = self.path_optional(self.find_existing_file(os.path.join(os.pardir,
|
||||
@@ -756,19 +760,29 @@ class DarwinManifest(ViewerManifest):
|
||||
# create a symlink to the real copy of the dylib.
|
||||
resource_path = self.dst_path_of(os.path.join(app, "Contents", "Resources"))
|
||||
for libfile in dylibs:
|
||||
symlinkf(os.path.join(os.pardir, os.pardir, os.pardir, os.path.basename(libfile)),
|
||||
os.path.join(resource_path, os.path.basename(libfile)))
|
||||
src = os.path.join(os.pardir, os.pardir, os.pardir, libfile)
|
||||
dst = os.path.join(resource_path, libfile)
|
||||
try:
|
||||
symlinkf(src, dst)
|
||||
except OSError as err:
|
||||
print "Can't symlink %s -> %s: %s" % (src, dst, err)
|
||||
|
||||
# LLCefLib helper apps go inside AlchemyPlugin.app
|
||||
if self.prefix(src="", dst="AlchemyPlugin.app/Contents/Frameworks"):
|
||||
for helperappfile in ('LLCefLib Helper.app',
|
||||
'LLCefLib Helper EH.app'):
|
||||
self.path2basename(relpkgdir, helperappfile)
|
||||
|
||||
pluginframeworkpath = self.dst_path_of('Chromium Embedded Framework.framework');
|
||||
|
||||
self.end_prefix()
|
||||
|
||||
# plugins
|
||||
if self.prefix(src="", dst="llplugin"):
|
||||
self.path2basename(os.path.join(os.pardir,"plugins", "filepicker", self.args['configuration']),
|
||||
"basic_plugin_filepicker.dylib")
|
||||
self.path2basename(os.path.join(os.pardir,"plugins", "quicktime", self.args['configuration']),
|
||||
self.path2basename("../media_plugins/quicktime/" + self.args['configuration'],
|
||||
"media_plugin_quicktime.dylib")
|
||||
self.path2basename(os.path.join(os.pardir,"plugins", "webkit", self.args['configuration']),
|
||||
"media_plugin_webkit.dylib")
|
||||
self.path2basename(os.path.join(os.pardir,"packages", "libraries", "universal-darwin", "lib", "release"),
|
||||
"libllqtwebkit.dylib")
|
||||
self.path2basename("../media_plugins/cef/" + self.args['configuration'],
|
||||
"media_plugin_cef.dylib")
|
||||
|
||||
self.end_prefix("llplugin")
|
||||
|
||||
@@ -777,6 +791,30 @@ class DarwinManifest(ViewerManifest):
|
||||
|
||||
self.end_prefix("Resources")
|
||||
|
||||
# CEF framework goes inside Second Life.app/Contents/Frameworks
|
||||
if self.prefix(src="", dst="Frameworks"):
|
||||
frameworkfile="Chromium Embedded Framework.framework"
|
||||
self.path2basename(relpkgdir, frameworkfile)
|
||||
self.end_prefix("Frameworks")
|
||||
|
||||
# This code constructs a relative path from the
|
||||
# target framework folder back to the location of the symlink.
|
||||
# It needs to be relative so that the symlink still works when
|
||||
# (as is normal) the user moves the app bunlde out of the DMG
|
||||
# and into the /Applications folder. Note we also call 'raise'
|
||||
# to terminate the process if we get an error since without
|
||||
# this symlink, Second Life web media can't possibly work.
|
||||
# Real Framework folder:
|
||||
# Second Life.app/Contents/Frameworks/Chromium Embedded Framework.framework/
|
||||
# Location of symlink and why it'ds relavie
|
||||
# Second Life.app/Contents/Resources/AlchemyPlugin.app/Contents/Frameworks/Chromium Embedded Framework.framework/
|
||||
frameworkpath = os.path.join(os.pardir, os.pardir, os.pardir, os.pardir, "Frameworks", "Chromium Embedded Framework.framework")
|
||||
try:
|
||||
symlinkf(frameworkpath, pluginframeworkpath)
|
||||
except OSError as err:
|
||||
print "Can't symlink %s -> %s: %s" % (frameworkpath, pluginframeworkpath, err)
|
||||
raise
|
||||
|
||||
self.end_prefix("Contents")
|
||||
|
||||
# NOTE: the -S argument to strip causes it to keep enough info for
|
||||
@@ -970,7 +1008,7 @@ class LinuxManifest(ViewerManifest):
|
||||
icon_path = self.icon_path()
|
||||
print "DEBUG: icon_path '%s'" % icon_path
|
||||
if self.prefix(src=icon_path, dst="") :
|
||||
self.path("viewer_256.png","viewer_icon.png")
|
||||
self.path("viewer.png","viewer_icon.png")
|
||||
if self.prefix(src="",dst="res-sdl") :
|
||||
self.path("viewer_256.BMP","viewer_icon.BMP")
|
||||
self.end_prefix("res-sdl")
|
||||
|
||||
Reference in New Issue
Block a user