This commit is contained in:
Shyotl
2016-08-22 22:37:25 -05:00
36 changed files with 223 additions and 137 deletions

View File

@@ -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>

View File

@@ -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)

View File

@@ -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())
{

View File

@@ -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;

View File

@@ -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>

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

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

View File

@@ -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\

View File

@@ -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

View File

@@ -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
{

View File

@@ -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

View File

@@ -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);
}

View File

@@ -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)))
{

View File

@@ -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);

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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());

View File

@@ -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();
}

View File

@@ -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,

View File

@@ -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;
}

View File

@@ -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

View File

@@ -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;
}

View File

@@ -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);

View File

@@ -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.

View File

@@ -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];

View File

@@ -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" />

View File

@@ -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.

View File

@@ -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]&apos;s &apos;[TITLE]&apos; (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]&apos;s &apos;[TITLE]&apos;
[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"

View File

@@ -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")