diff --git a/autobuild.xml b/autobuild.xml index b42a063c1..9f3567918 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -2572,11 +2572,11 @@ archive hash - 960953da9ab7c335a0f4f97e9bf8341c + a38ec464042e1d5e67231d9bcd181ae2 hash_algorithm md5 url - http://depot.alchemyviewer.org/pub/windows/lib-vc14/vcredist-14.0.23506.0-windows-201601191536.tar.bz2 + https://depot.alchemyviewer.org/pub/windows/lib-vc14/vcredist-14.0.23918.0-windows-201606250656.tar.bz2 name windows @@ -2586,18 +2586,18 @@ archive hash - 918588215463f36836eeefd9d3891868 + 0d688527ab7d08f6b7c7a5f73175e4f8 hash_algorithm md5 url - http://depot.alchemyviewer.org/pub/windows64/lib-vc14/vcredist-14.0.23506.0-windows64-201601191536.tar.bz2 + https://depot.alchemyviewer.org/pub/windows64/lib-vc14/vcredist-14.0.23918.0-windows64-201606250656.tar.bz2 name windows64 version - 14.0.23506.0 + 14.0.23918.0 xmlrpc-epi diff --git a/indra/llprimitive/lldaeloader.cpp b/indra/llprimitive/lldaeloader.cpp index 89ca130b6..378efa05a 100644 --- a/indra/llprimitive/lldaeloader.cpp +++ b/indra/llprimitive/lldaeloader.cpp @@ -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) diff --git a/indra/llprimitive/llmodelloader.cpp b/indra/llprimitive/llmodelloader.cpp index 7859b5ee5..189447150 100644 --- a/indra/llprimitive/llmodelloader.cpp +++ b/indra/llprimitive/llmodelloader.cpp @@ -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()) { diff --git a/indra/llui/ailist.h b/indra/llui/ailist.h index c528227ba..1511fef2e 100644 --- a/indra/llui/ailist.h +++ b/indra/llui/ailist.h @@ -253,7 +253,11 @@ class AIConstListIterator { typedef AIConstListIterator _Self; typedef std::list > _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 iterator; _Container const* mContainer; diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index e8de089ea..ec6776cb1 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -796,17 +796,6 @@ Value 1 - LiruResizeRootWithScreen - - Comment - 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). - Persist - 1 - Type - Boolean - Value - 1 - LiruLegacyScrollToEnd Comment @@ -978,6 +967,17 @@ Value 0 + LiruOnlineNotificationBehavior + + Comment + Determines if Friend is Online notifications will do anything when clicked. (0 does nothing, 1 starts an IM (default), 2 opens profile. + Persist + 1 + Type + S32 + Value + 1 + LiruRegionRestartMinimized Comment @@ -991,6 +991,17 @@ IsCOA 1 + LiruResizeRootWithScreen + + Comment + 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). + Persist + 1 + Type + Boolean + Value + 1 + LiruScriptErrorsStealFocus Comment diff --git a/indra/newview/icons/alpha/viewer.icns b/indra/newview/icons/alpha/viewer.icns new file mode 100644 index 000000000..0b5d5c626 Binary files /dev/null and b/indra/newview/icons/alpha/viewer.icns differ diff --git a/indra/newview/icons/alpha/viewer.ico b/indra/newview/icons/alpha/viewer.ico new file mode 100644 index 000000000..e15813d24 Binary files /dev/null and b/indra/newview/icons/alpha/viewer.ico differ diff --git a/indra/newview/icons/alpha/viewer.png b/indra/newview/icons/alpha/viewer.png new file mode 100644 index 000000000..3e4c44fe5 Binary files /dev/null and b/indra/newview/icons/alpha/viewer.png differ diff --git a/indra/newview/icons/alpha/viewer_256.BMP b/indra/newview/icons/alpha/viewer_256.BMP new file mode 100644 index 000000000..b42ed064f Binary files /dev/null and b/indra/newview/icons/alpha/viewer_256.BMP differ diff --git a/indra/newview/icons/default/viewer_256.BMP b/indra/newview/icons/default/viewer_256.BMP index 7e27d0eca..32bf37e5c 100644 Binary files a/indra/newview/icons/default/viewer_256.BMP and b/indra/newview/icons/default/viewer_256.BMP differ diff --git a/indra/newview/linux_tools/refresh_desktop_app_entry.sh.in b/indra/newview/linux_tools/refresh_desktop_app_entry.sh.in index 66b8b90aa..122007320 100755 --- a/indra/newview/linux_tools/refresh_desktop_app_entry.sh.in +++ b/indra/newview/linux_tools/refresh_desktop_app_entry.sh.in @@ -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\ diff --git a/indra/newview/linux_tools/register_secondlifeprotocol.sh b/indra/newview/linux_tools/register_secondlifeprotocol.sh index f4af742fa..16e73cb85 100755 --- a/indra/newview/linux_tools/register_secondlifeprotocol.sh +++ b/indra/newview/linux_tools/register_secondlifeprotocol.sh @@ -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 diff --git a/indra/newview/llcallingcard.cpp b/indra/newview/llcallingcard.cpp index b85cd8fad..cb914859f 100644 --- a/indra/newview/llcallingcard.cpp +++ b/indra/newview/llcallingcard.cpp @@ -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 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 { diff --git a/indra/newview/llfloateravatarlist.cpp b/indra/newview/llfloateravatarlist.cpp index f23d8c6d3..8f54a4e4d 100644 --- a/indra/newview/llfloateravatarlist.cpp +++ b/indra/newview/llfloateravatarlist.cpp @@ -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& 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 diff --git a/indra/newview/llfloatermediafilter.cpp b/indra/newview/llfloatermediafilter.cpp index 3b636484b..f03216ff0 100644 --- a/indra/newview/llfloatermediafilter.cpp +++ b/indra/newview/llfloatermediafilter.cpp @@ -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 selected = (white ? mWhitelist : mBlacklist)->getAllSelected(); LLMediaFilter::string_vec_t domains; - for (std::vector::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); } diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index b8484a2c1..2ebf074de 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -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))) { diff --git a/indra/newview/llgiveinventory.cpp b/indra/newview/llgiveinventory.cpp index a1d49b63c..73596988a 100644 --- a/indra/newview/llgiveinventory.cpp +++ b/indra/newview/llgiveinventory.cpp @@ -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); diff --git a/indra/newview/llmediafilter.cpp b/indra/newview/llmediafilter.cpp index 528dfc86f..9ab66af5a 100644 --- a/indra/newview/llmediafilter.cpp +++ b/indra/newview/llmediafilter.cpp @@ -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; diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp index 88fe06ff9..3731ca3b6 100644 --- a/indra/newview/llnetmap.cpp +++ b/indra/newview/llnetmap.cpp @@ -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; diff --git a/indra/newview/llnotify.cpp b/indra/newview/llnotify.cpp index 3a81ac69a..2bba6d4f9 100644 --- a/indra/newview/llnotify.cpp +++ b/indra/newview/llnotify.cpp @@ -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; diff --git a/indra/newview/lloverlaybar.cpp b/indra/newview/lloverlaybar.cpp index 44631adb9..d57235dcd 100644 --- a/indra/newview/lloverlaybar.cpp +++ b/indra/newview/lloverlaybar.cpp @@ -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; diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp index 36b0422ab..a689b07af 100644 --- a/indra/newview/llpanelavatar.cpp +++ b/indra/newview/llpanelavatar.cpp @@ -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("avatar_key")->setText(avatar_id.asString()); diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 8ec719869..7e49db7d3 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -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(); } diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp index 14ee16c5c..f32c6f695 100644 --- a/indra/newview/lltextureview.cpp +++ b/indra/newview/lltextureview.cpp @@ -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(), total_object_downloaded.valueInUnits(), total_http_requests); //, cache_entries, cache_max_entries LLFontGL::getFontMonospace()->renderUTF8(text, 0, 0, v_offset + line_height*3, diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp index 29dfeba7a..bb525d745 100644 --- a/indra/newview/lltooldraganddrop.cpp +++ b/indra/newview/lltooldraganddrop.cpp @@ -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; } diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index d61300b7c..a6e6da211 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -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& strings) { - if (ids.empty() || zero != 0) return; - std::vector 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 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 diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index dceb46f1c..ddb63c0c0 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -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; } diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index fc517cf30..edcdad0c6 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -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); diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h index 675ff1f8f..19e7aab91 100644 --- a/indra/newview/llviewerobject.h +++ b/indra/newview/llviewerobject.h @@ -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. diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index f5b2a8abe..c528e3f8f 100644 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -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]; diff --git a/indra/newview/skins/default/textures/noentrylines.j2c b/indra/newview/skins/default/textures/noentrylines.j2c deleted file mode 100644 index 93ec17659..000000000 Binary files a/indra/newview/skins/default/textures/noentrylines.j2c and /dev/null differ diff --git a/indra/newview/skins/default/textures/noentrypasslines.j2c b/indra/newview/skins/default/textures/noentrypasslines.j2c deleted file mode 100644 index 800c46696..000000000 Binary files a/indra/newview/skins/default/textures/noentrypasslines.j2c and /dev/null differ diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index ddaf14ca9..3a742f3ce 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -37,6 +37,7 @@ with the same filename but different name + @@ -45,6 +46,9 @@ with the same filename but different name + + + diff --git a/indra/newview/skins/default/xui/en-us/floater_about.xml b/indra/newview/skins/default/xui/en-us/floater_about.xml index 266555ca1..91edb0384 100644 --- a/indra/newview/skins/default/xui/en-us/floater_about.xml +++ b/indra/newview/skins/default/xui/en-us/floater_about.xml @@ -12,7 +12,7 @@ -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. diff --git a/indra/newview/skins/default/xui/en-us/notifications.xml b/indra/newview/skins/default/xui/en-us/notifications.xml index b82dfb7d0..b925dc26b 100644 --- a/indra/newview/skins/default/xui/en-us/notifications.xml +++ b/indra/newview/skins/default/xui/en-us/notifications.xml @@ -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? confirm @@ -4164,9 +4164,10 @@ Remove estate manager for this estate only or for [ALL_ESTATES]? Kick [EVIL_USER] from this estate? confirm + canceltext="Cancel" + name="yesnocancelbuttons" + notext="Kick Home" + yestext="Kick"/> +