diff options
24 files changed, 226 insertions, 72 deletions
diff --git a/doc/contributions.txt b/doc/contributions.txt index 2d3fa99c8b..897977cb9a 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -31,6 +31,9 @@ Alissa Sabre VWR-1353 VWR-1410 VWR-2116 + VWR-2826 +Angus Boyd + VWR-592 Argent Stonecutter VWR-68 Benja Kepler @@ -149,6 +152,8 @@ Matthew Dowd VWR-1761 McCabe Maxsted VWR-1318 +Michelle2 Zenovka + VWR-2834 Mr Greggan VWR-445 Nicholaz Beresford diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h index 71b7347c4a..e3a4df190e 100644 --- a/indra/llcommon/llversionviewer.h +++ b/indra/llcommon/llversionviewer.h @@ -34,8 +34,8 @@ const S32 LL_VERSION_MAJOR = 1; const S32 LL_VERSION_MINOR = 18; -const S32 LL_VERSION_PATCH = 4; -const S32 LL_VERSION_BUILD = 3; +const S32 LL_VERSION_PATCH = 5; +const S32 LL_VERSION_BUILD = 1; const char * const LL_CHANNEL = "Second Life Release"; diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp index 0a63ebbe74..420970a38a 100644 --- a/indra/llui/lllineeditor.cpp +++ b/indra/llui/lllineeditor.cpp @@ -1637,6 +1637,9 @@ void LLLineEditor::draw() S32 pixels_after_scroll = findPixelNearestPos(); // RCalculcate for IME position LLRect screen_pos = getScreenRect(); LLCoordGL ime_pos( screen_pos.mLeft + pixels_after_scroll, screen_pos.mTop - UI_LINEEDITOR_V_PAD ); + + ime_pos.mX = (S32) (ime_pos.mX * LLUI::sGLScaleFactor.mV[VX]); + ime_pos.mY = (S32) (ime_pos.mY * LLUI::sGLScaleFactor.mV[VY]); getWindow()->setLanguageTextInput( ime_pos ); } } diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index 8ec5656e18..d150f8954e 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -1421,6 +1421,7 @@ void LLMenuItemBranchGL::onVisibilityChange( BOOL new_visibility ) { mBranch->setVisible(FALSE); } + LLMenuItemGL::onVisibilityChange(new_visibility); } BOOL LLMenuItemBranchGL::handleKeyHere( KEY key, MASK mask, BOOL called_from_parent ) diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp index af1813a429..fa1181a866 100644 --- a/indra/llui/lltexteditor.cpp +++ b/indra/llui/lltexteditor.cpp @@ -2816,6 +2816,9 @@ void LLTextEditor::drawCursor() // Make sure the IME is in the right place LLRect screen_pos = getScreenRect(); LLCoordGL ime_pos( screen_pos.mLeft + llfloor(cursor_left), screen_pos.mBottom + llfloor(cursor_top) ); + + ime_pos.mX = (S32) (ime_pos.mX * LLUI::sGLScaleFactor.mV[VX]); + ime_pos.mY = (S32) (ime_pos.mY * LLUI::sGLScaleFactor.mV[VY]); getWindow()->setLanguageTextInput( ime_pos ); } } diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp index 4d3bdaed98..a047f9912e 100644 --- a/indra/llui/llview.cpp +++ b/indra/llui/llview.cpp @@ -797,6 +797,7 @@ BOOL LLView::setLabelArg(const LLString& key, const LLStringExplicit& text) return FALSE; } +// virtual void LLView::onVisibilityChange ( BOOL new_visibility ) { for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it) diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp index 0286623662..e5fd0f7360 100644 --- a/indra/llwindow/llwindowwin32.cpp +++ b/indra/llwindow/llwindowwin32.cpp @@ -89,6 +89,7 @@ void show_window_creation_error(const char* title) BOOL LLWindowWin32::sIsClassRegistered = FALSE; BOOL LLWindowWin32::sLanguageTextInputAllowed = TRUE; +BOOL LLWindowWin32::sWinIMEOpened = FALSE; HKL LLWindowWin32::sWinInputLocale = 0; DWORD LLWindowWin32::sWinIMEConversionMode = IME_CMODE_NATIVE; DWORD LLWindowWin32::sWinIMESentenceMode = IME_SMODE_AUTOMATIC; @@ -3325,7 +3326,7 @@ void LLWindowWin32::focusClient() void LLWindowWin32::allowLanguageTextInput(BOOL b) { - if ( !LLWinImm::isAvailable() ) + if (b == sLanguageTextInputAllowed || !LLWinImm::isAvailable()) { return; } @@ -3336,14 +3337,13 @@ void LLWindowWin32::allowLanguageTextInput(BOOL b) // Allowing: Restore the previous IME status, so that the user has a feeling that the previous // text input continues naturally. Be careful, however, the IME status is meaningful only during the user keeps // using same Input Locale (aka Keyboard Layout). - HIMC himc = LLWinImm::getContext(mWindowHandle); - LLWinImm::setOpenStatus(himc, TRUE); - if (GetKeyboardLayout(0) == sWinInputLocale && sWinIMEConversionMode != IME_CMODE_RESERVED) + if (sWinIMEOpened && GetKeyboardLayout(0) == sWinInputLocale) { + HIMC himc = LLWinImm::getContext(mWindowHandle); + LLWinImm::setOpenStatus(himc, TRUE); LLWinImm::setConversionStatus(himc, sWinIMEConversionMode, sWinIMESentenceMode); - sWinIMEConversionMode = IME_CMODE_RESERVED; // Set saved state so we won't do this repeatedly + LLWinImm::releaseContext(mWindowHandle, himc); } - LLWinImm::releaseContext(mWindowHandle, himc); } else { @@ -3351,10 +3351,12 @@ void LLWindowWin32::allowLanguageTextInput(BOOL b) // However, do it after saving the current IME status. We need to restore the status when // allowing language text input again. sWinInputLocale = GetKeyboardLayout(0); - if ( LLWinImm::isIME(sWinInputLocale) ) + sWinIMEOpened = LLWinImm::isIME(sWinInputLocale); + if (sWinIMEOpened) { HIMC himc = LLWinImm::getContext(mWindowHandle); - if ( LLWinImm::getOpenStatus(himc) ) + sWinIMEOpened = LLWinImm::getOpenStatus(himc); + if (sWinIMEOpened) { LLWinImm::getConversionStatus(himc, &sWinIMEConversionMode, &sWinIMESentenceMode); diff --git a/indra/llwindow/llwindowwin32.h b/indra/llwindow/llwindowwin32.h index 62b1f73ced..602e06600f 100644 --- a/indra/llwindow/llwindowwin32.h +++ b/indra/llwindow/llwindowwin32.h @@ -184,6 +184,7 @@ protected: // They are all static, since one context is shared by all LLWindowWin32 // instances. static BOOL sLanguageTextInputAllowed; + static BOOL sWinIMEOpened; static HKL sWinInputLocale; static DWORD sWinIMEConversionMode; static DWORD sWinIMESentenceMode; diff --git a/indra/newview/English.lproj/InfoPlist.strings b/indra/newview/English.lproj/InfoPlist.strings index 8929cb4226..a25f97768a 100644 --- a/indra/newview/English.lproj/InfoPlist.strings +++ b/indra/newview/English.lproj/InfoPlist.strings @@ -1,5 +1,5 @@ /* Localized versions of Info.plist keys */ CFBundleName = "Second Life"; -CFBundleShortVersionString = "Second Life version 1.18.4.3"; -CFBundleGetInfoString = "Second Life version 1.18.4.3, Copyright 2004-2007 Linden Research, Inc."; +CFBundleShortVersionString = "Second Life version 1.18.5.1"; +CFBundleGetInfoString = "Second Life version 1.18.5.1, Copyright 2004-2007 Linden Research, Inc."; diff --git a/indra/newview/Info-SecondLife.plist b/indra/newview/Info-SecondLife.plist index 0778494394..2c9f58a0c0 100644 --- a/indra/newview/Info-SecondLife.plist +++ b/indra/newview/Info-SecondLife.plist @@ -32,7 +32,7 @@ </dict> </array> <key>CFBundleVersion</key> - <string>1.18.4.3</string> + <string>1.18.5.1</string> <key>CSResourcesFileMapped</key> <true/> </dict> diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index d7e316438c..39d4a3fc15 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -2954,6 +2954,7 @@ void LLAgent::endAnimationUpdateUI() // Don't let this be called more than once if the camera // mode hasn't changed. --JC mLastCameraMode = mCameraMode; + } @@ -4214,15 +4215,22 @@ void LLAgent::changeCameraToCustomizeAvatar(BOOL animate) if (animate && !mAvatarObject.isNull()) { sendAnimationRequest(ANIM_AGENT_CUSTOMIZE, ANIM_REQUEST_START); + mAvatarObject->startMotion(ANIM_AGENT_CUSTOMIZE); LLMotion* turn_motion = mAvatarObject->findMotion(ANIM_AGENT_CUSTOMIZE); + if (turn_motion) { mAnimationDuration = turn_motion->getDuration() + CUSTOMIZE_AVATAR_CAMERA_ANIM_SLOP; + } else { mAnimationDuration = gSavedSettings.getF32("ZoomTime"); } + + + + gAgent.setFocusGlobal(LLVector3d::zero); } else diff --git a/indra/newview/llclassifiedstatsresponder.cpp b/indra/newview/llclassifiedstatsresponder.cpp index 3a31074ed0..7a575ca5fd 100644 --- a/indra/newview/llclassifiedstatsresponder.cpp +++ b/indra/newview/llclassifiedstatsresponder.cpp @@ -19,14 +19,14 @@ #include "llview.h" #include "message.h" -LLClassifiedStatsResponder::LLClassifiedStatsResponder(LLViewHandle classified_panel_handle) -: mClassifiedPanelHandle(classified_panel_handle) +LLClassifiedStatsResponder::LLClassifiedStatsResponder(LLViewHandle classified_panel_handle, LLUUID classified_id) +: mClassifiedPanelHandle(classified_panel_handle), +mClassifiedID(classified_id) { } /*virtual*/ void LLClassifiedStatsResponder::result(const LLSD& content) { - LLUUID classified_id = content["classified_id"]; S32 teleport = content["teleport_clicks"].asInteger(); S32 map = content["map_clicks"].asInteger(); S32 profile = content["profile_clicks"].asInteger(); @@ -34,16 +34,15 @@ void LLClassifiedStatsResponder::result(const LLSD& content) S32 search_map = content["search_map_clicks"].asInteger(); S32 search_profile = content["search_profile_clicks"].asInteger(); - std::string msg = llformat("Clicks: %d teleport, %d map, %d profile", - teleport + search_teleport, - map + search_map, - profile + search_profile); - LLPanelClassified* classified_panelp = (LLPanelClassified*)LLPanel::getPanelByHandle(mClassifiedPanelHandle); if(classified_panelp) { - classified_panelp->setClickThroughText(msg); + classified_panelp->setClickThrough(mClassifiedID, + teleport + search_teleport, + map + search_map, + profile + search_profile, + true); } } @@ -55,3 +54,4 @@ void LLClassifiedStatsResponder::error(U32 status, const std::string& reason) << status << ": " << reason << ")" << llendl; } + diff --git a/indra/newview/llclassifiedstatsresponder.h b/indra/newview/llclassifiedstatsresponder.h index 25ae67141c..ed19311a9a 100644 --- a/indra/newview/llclassifiedstatsresponder.h +++ b/indra/newview/llclassifiedstatsresponder.h @@ -11,11 +11,12 @@ #include "llhttpclient.h" #include "llview.h" +#include "lluuid.h" class LLClassifiedStatsResponder : public LLHTTPClient::Responder { public: - LLClassifiedStatsResponder(LLViewHandle classified_panel_handle); + LLClassifiedStatsResponder(LLViewHandle classified_panel_handle, LLUUID classified_id); //If we get back a normal response, handle it here virtual void result(const LLSD& content); //If we get back an error (not found, etc...), handle it here @@ -23,6 +24,7 @@ public: protected: LLViewHandle mClassifiedPanelHandle; + LLUUID mClassifiedID; }; #endif // LL_LLCLASSIFIEDSTATSRESPONDER_H diff --git a/indra/newview/llfloaterchat.cpp b/indra/newview/llfloaterchat.cpp index b435ada463..5fdbf7d408 100644 --- a/indra/newview/llfloaterchat.cpp +++ b/indra/newview/llfloaterchat.cpp @@ -164,6 +164,7 @@ void LLFloaterChat::onVisibilityChange(BOOL new_visibility) { // Hide the chat overlay when our history is visible. gConsole->setVisible( !new_visibility ); + LLFloater::onVisibilityChange(new_visibility); } diff --git a/indra/newview/llpanelclassified.cpp b/indra/newview/llpanelclassified.cpp index 821eaf1a72..04fb54b0a7 100644 --- a/indra/newview/llpanelclassified.cpp +++ b/indra/newview/llpanelclassified.cpp @@ -91,7 +91,8 @@ public: S32 profile_clicks = atoi(strings[3].c_str()); LLPanelClassified::setClickThrough(classified_id, teleport_clicks, map_clicks, - profile_clicks); + profile_clicks, + false); return true; } }; @@ -127,7 +128,14 @@ LLPanelClassified::LLPanelClassified(BOOL in_finder, bool from_search) mProfileBtn(NULL), mInfoText(NULL), mSetBtn(NULL), - mClickThroughText(NULL) + mClickThroughText(NULL), + mTeleportClicksOld(0), + mMapClicksOld(0), + mProfileClicksOld(0), + mTeleportClicksNew(0), + mMapClicksNew(0), + mProfileClicksNew(0) + { sAllPanels.push_back(this); @@ -368,16 +376,12 @@ void LLPanelClassified::setClassifiedID(const LLUUID& id) mClassifiedID = id; } -void LLPanelClassified::setClickThroughText(const std::string& text) -{ - if(mClickThroughText) - this->mClickThroughText->setText(text); -} //static void LLPanelClassified::setClickThrough(const LLUUID& classified_id, S32 teleport, S32 map, - S32 profile) + S32 profile, + bool from_new_table) { for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter) { @@ -388,22 +392,29 @@ void LLPanelClassified::setClickThrough(const LLUUID& classified_id, continue; } - // We need to see if we should use the new stat table or the old. - // If the SearchStatRequest capability exists, then the data will come - // from the new table. - std::string url = gAgent.getRegion()->getCapability("SearchStatRequest"); + // We need to check to see if the data came from the new stat_table + // or the old classified table. We also need to cache the data from + // the two separate sources so as to display the aggregate totals. - if (!url.empty()) + if (from_new_table) { - return; + self->mTeleportClicksNew = teleport; + self->mMapClicksNew = map; + self->mProfileClicksNew = profile; + } + else + { + self->mTeleportClicksOld = teleport; + self->mMapClicksOld = map; + self->mProfileClicksOld = profile; } if (self->mClickThroughText) { std::string msg = llformat("Clicks: %d teleport, %d map, %d profile", - teleport, - map, - profile); + self->mTeleportClicksNew + self->mTeleportClicksOld, + self->mMapClicksNew + self->mMapClicksOld, + self->mProfileClicksNew + self->mProfileClicksOld); self->mClickThroughText->setText(msg); } } @@ -449,7 +460,7 @@ void LLPanelClassified::sendClassifiedInfoRequest() if (!url.empty()) { llinfos << "Classified stat request via capability" << llendl; - LLHTTPClient::post(url, body, new LLClassifiedStatsResponder(this->getHandle())); + LLHTTPClient::post(url, body, new LLClassifiedStatsResponder(this->getHandle(), mClassifiedID)); } } } @@ -929,7 +940,6 @@ void LLPanelClassified::sendClassifiedClickMessage(const char* type) strings.push_back(mClassifiedID.asString()); strings.push_back(type); LLUUID no_invoice; - send_generic_message("classifiedclick", strings, no_invoice); // New classified click-through handling LLSD body; @@ -938,11 +948,16 @@ void LLPanelClassified::sendClassifiedClickMessage(const char* type) body["classified_id"] = mClassifiedID; std::string url = gAgent.getRegion()->getCapability("SearchStatTracking"); + // If the capability exists send to the new database, otherwise send to the old one. if (!url.empty()) { llinfos << "LLPanelClassified::sendClassifiedClickMessage via capability" << llendl; LLHTTPClient::post(url, body, new LLHTTPClient::Responder()); } + else + { + send_generic_message("classifiedclick", strings, no_invoice); + } } //////////////////////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/llpanelclassified.h b/indra/newview/llpanelclassified.h index 6ebac4c98a..a2bb29b224 100644 --- a/indra/newview/llpanelclassified.h +++ b/indra/newview/llpanelclassified.h @@ -81,7 +81,7 @@ public: void setClassifiedID(const LLUUID& id); void setClickThroughText(const std::string& text); static void setClickThrough(const LLUUID& classified_id, - S32 teleport, S32 map, S32 profile); + S32 teleport, S32 map, S32 profile, bool from_new_table); // check that the title is valid (E.G. starts with a number or letter) BOOL titleIsValid(); @@ -129,6 +129,14 @@ protected: LLUUID mParcelID; S32 mPriceForListing; + // Needed for stat tracking + S32 mTeleportClicksOld; + S32 mMapClicksOld; + S32 mProfileClicksOld; + S32 mTeleportClicksNew; + S32 mMapClicksNew; + S32 mProfileClicksNew; + // Data will be requested on first draw BOOL mDataRequested; diff --git a/indra/newview/llpanelpermissions.cpp b/indra/newview/llpanelpermissions.cpp index 923f4b3115..7beba92ebb 100644 --- a/indra/newview/llpanelpermissions.cpp +++ b/indra/newview/llpanelpermissions.cpp @@ -741,17 +741,17 @@ void LLPanelPermissions::refresh() } } - if (is_for_sale) + childSetValue("checkbox for sale", is_for_sale); + + // HACK: There are some old objects in world that are set for sale, + // but are no-transfer. We need to let users turn for-sale off, but only + // if for-sale is set. + bool cannot_actually_sell = !can_transfer || (!can_copy && sale_type == LLSaleInfo::FS_COPY); + if (is_for_sale && has_change_sale_ability && cannot_actually_sell) { - childSetValue("checkbox for sale",TRUE); - childSetTentative("checkbox for sale",!can_transfer || (!can_copy && sale_type == LLSaleInfo::FS_COPY)); + childSetEnabled("checkbox for sale", true); } - else - { - childSetValue("checkbox for sale",FALSE); - childSetTentative("checkbox for sale",false); - } - + // Check search status of objects BOOL all_volume = gSelectMgr->selectionAllPCode( LL_PCODE_VOLUME ); bool include_in_search; diff --git a/indra/newview/llpanelplace.cpp b/indra/newview/llpanelplace.cpp index 459e726f87..8825ce71fc 100644 --- a/indra/newview/llpanelplace.cpp +++ b/indra/newview/llpanelplace.cpp @@ -89,6 +89,9 @@ BOOL LLPanelPlace::postBuild() mSnapshotCtrl->setEnabled(FALSE); mNameEditor = LLViewerUICtrlFactory::getTextBoxByName(this, "name_editor"); + // Text boxes appear to have a " " in them by default. This breaks the + // emptiness test for filling in data from the network. Slam to empty. + mNameEditor->setText( LLString::null ); mDescEditor = LLUICtrlFactory::getTextEditorByName(this, "desc_editor"); @@ -127,6 +130,26 @@ void LLPanelPlace::displayItemInfo(const LLInventoryItem* pItem) mDescEditor->setText(pItem->getDescription()); } +// Use this for search directory clicks, because we are totally +// recycling the panel and don't need to use what's there. +// +// For SLURL clicks, don't call this, because we need to cache +// the location info from the user. +void LLPanelPlace::resetLocation() +{ + mParcelID.setNull(); + mRequestedID.setNull(); + mRegionID.setNull(); + mLandmarkAssetID.setNull(); + mPosGlobal.clearVec(); + mPosRegion.clearVec(); + mAuctionID = 0; + mNameEditor->setText( LLString::null ); + mDescEditor->setText( LLString::null ); + mInfoEditor->setText( LLString::null ); + mLocationEditor->setText( LLString::null ); +} + void LLPanelPlace::setParcelID(const LLUUID& parcel_id) { mParcelID = parcel_id; @@ -138,10 +161,6 @@ void LLPanelPlace::setSnapshot(const LLUUID& snapshot_id) mSnapshotCtrl->setImageAssetID(snapshot_id); } -void LLPanelPlace::setName(const std::string& name) -{ - mNameEditor->setText(name); -} void LLPanelPlace::setLocationString(const std::string& location) { @@ -240,11 +259,17 @@ void LLPanelPlace::processParcelInfoReply(LLMessageSystem *msg, void **) std::string name_str(name); std::string desc_str(desc); - if(! name_str.empty() && ! self->mNameEditor->getText().empty()) + if( !name_str.empty() + && self->mNameEditor->getText().empty()) + { self->mNameEditor->setText(name_str); + } - if(! desc_str.empty() && ! self->mDescEditor->getText().empty()) + if( !desc_str.empty() + && self->mDescEditor->getText().empty()) + { self->mDescEditor->setText(desc_str); + } LLString info_text; LLUIString traffic = self->getUIString("traffic_text"); @@ -280,6 +305,19 @@ void LLPanelPlace::processParcelInfoReply(LLMessageSystem *msg, void **) S32 region_y = llround(self->mPosRegion.mV[1]); S32 region_z = llround(self->mPosRegion.mV[2]); + // If the region position is zero, grab position from the global + if(self->mPosRegion.isExactlyZero()) + { + region_x = llround(global_x) % REGION_WIDTH_UNITS; + region_y = llround(global_y) % REGION_WIDTH_UNITS; + region_z = llround(global_z); + } + + if(self->mPosGlobal.isExactlyZero()) + { + self->mPosGlobal.setVec(global_x, global_y, global_z); + } + LLString location = llformat("%s %d, %d, %d (%s)", sim_name, region_x, region_y, region_z, rating); self->mLocationEditor->setText(location); diff --git a/indra/newview/llpanelplace.h b/indra/newview/llpanelplace.h index 8f56eda729..c473900693 100644 --- a/indra/newview/llpanelplace.h +++ b/indra/newview/llpanelplace.h @@ -53,11 +53,17 @@ public: /*virtual*/ BOOL postBuild(); - void displayItemInfo(const LLInventoryItem* pItem); + void resetLocation(); + // Ignore all old location information, useful if you are + // recycling an existing dialog and need to clear it. + void setParcelID(const LLUUID& parcel_id); + // Sends a request for data about the given parcel, which will + // only update the location if there is none already available. + + void displayItemInfo(const LLInventoryItem* pItem); void setRegionID(const LLUUID& region_id) { mRegionID = region_id; } void setSnapshot(const LLUUID& snapshot_id); - void setName(const std::string& name); void setLocationString(const std::string& location); void setErrorStatus(U32 status, const std::string& reason); diff --git a/indra/newview/llurldispatcher.cpp b/indra/newview/llurldispatcher.cpp index c6d9b2fbe2..51b9505980 100644 --- a/indra/newview/llurldispatcher.cpp +++ b/indra/newview/llurldispatcher.cpp @@ -154,7 +154,9 @@ bool LLURLDispatcherImpl::dispatchHelp(const std::string& url, BOOL right_mouse) { if (matchPrefix(url, SLURL_SL_HELP_PREFIX)) { +#if LL_LIBXUL_ENABLED gViewerHtmlHelp.show(); +#endif // LL_LIBXUL_ENABLED return true; } return false; diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 688b2889c8..a6fb7fa0b7 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -5573,7 +5573,7 @@ class LLShowAgentProfile : public view_listener_t LLVOAvatar* avatar = find_avatar_from_object(agent_id); if (avatar) { - LLFloaterAvatarInfo::show(agent_id); + LLFloaterAvatarInfo::show( avatar->getID() ); } return true; } diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 2fdc040684..2011275bdb 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -132,6 +132,7 @@ #include "llappviewer.h" #include "llfloaterworldmap.h" #include "llviewerdisplay.h" +#include "llkeythrottle.h" #include <boost/tokenizer.hpp> @@ -145,6 +146,12 @@ const F32 BIRD_AUDIBLE_RADIUS = 32.0f; const F32 SIT_DISTANCE_FROM_TARGET = 0.25f; static const F32 LOGOUT_REPLY_TIME = 3.f; // Wait this long after LogoutReply before quitting. + +// Determine how quickly residents' scripts can issue question dialogs +// Allow bursts of up to 5 dialogs in 10 seconds. 10*2=20 seconds recovery if throttle kicks in +static const U32 LLREQUEST_PERMISSION_THROTTLE_LIMIT = 5; // requests +static const F32 LLREQUEST_PERMISSION_THROTTLE_INTERVAL = 10.0f; // seconds + extern BOOL gDebugClicks; // function prototypes @@ -4457,6 +4464,27 @@ void process_script_question(LLMessageSystem *msg, void **user_data) // don't display permission requests if this object is muted - JS. if (gMuteListp->isMuted(taskid)) return; + // throttle excessive requests from any specific user's scripts + LLString throttle_owner_name = owner_name; + typedef LLKeyThrottle<LLString> LLStringThrottle; + static LLStringThrottle question_throttle( LLREQUEST_PERMISSION_THROTTLE_LIMIT, LLREQUEST_PERMISSION_THROTTLE_INTERVAL ); + + switch (question_throttle.noteAction(throttle_owner_name)) + { + case LLStringThrottle::THROTTLE_NEWLY_BLOCKED: + llinfos << "process_script_question throttled" + << " owner_name:" << owner_name + << llendl; + // Fall through + + case LLStringThrottle::THROTTLE_BLOCKED: + // Escape altogether until we recover + return; + + case LLStringThrottle::THROTTLE_OK: + break; + } + LLString script_question; if (questions) { diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 5bfe023168..0022212399 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -870,7 +870,7 @@ public: for(int i=0; locs_it != locs.endArray(); - i++, locs_it++, agents_it++) + i++, locs_it++) { U8 x = locs_it->get("X").asInteger(), @@ -903,6 +903,10 @@ public: avatar_ids->put(agent_id); } } + if (has_agent_data) + { + agents_it++; + } } } }; diff --git a/scripts/update_version_files.py b/scripts/update_version_files.py index 8c500e4e08..d06e475341 100755 --- a/scripts/update_version_files.py +++ b/scripts/update_version_files.py @@ -18,6 +18,11 @@ def usage(): Options: --version Specify the version string to replace current version. + --skip-on-branch + Specify a regular expression against which the current branch + is matched. If it matches, then leave version strings alone. + Use this to avoid changing version strings on release candidate + builds. --server Update llversionserver.h only with new version --viewer @@ -34,6 +39,9 @@ Common Uses: # Update server and viewer build numbers to the current SVN revision: update_version_files.py + # Update build numbers unless we are on a release branch: + update_version_files.py --skip-on-branch='^Branch_' + # Update server and viewer version numbers explicitly: update_version_files.py --version=1.18.1.6 @@ -109,8 +117,9 @@ re_map['indra/newview/English.lproj/InfoPlist.strings'] = \ 'CFBundleGetInfoString = "Second Life version %(VER_MAJOR)s.%(VER_MINOR)s.%(VER_PATCH)s.%(VER_BUILD)s')) -version_re = re.compile('(\d+).(\d+).(\d+).(\d+)') -svn_re = re.compile('Last Changed Rev: (\d+)') +version_re = re.compile('(\d+).(\d+).(\d+).(\d+)') +svn_branch_re = re.compile('^URL:\s+\S+/([^/\s]+)$', re.MULTILINE) +svn_revision_re = re.compile('^Last Changed Rev: (\d+)$', re.MULTILINE) def main(): script_path = os.path.dirname(__file__) @@ -119,15 +128,25 @@ def main(): opts, args = getopt.getopt(sys.argv[1:], "", - ['version=', 'channel=', 'server_channel=', 'verbose', 'server', 'viewer', 'help']) + ['version=', + 'channel=', + 'server_channel=', + 'skip-on-branch=', + 'verbose', + 'server', + 'viewer', + 'help']) update_server = False update_viewer = False new_version = None new_viewer_channel = None new_server_channel = None + skip_on_branch_re = None for o,a in opts: if o in ('--version'): new_version = a + if o in ('--skip-on-branch'): + skip_on_branch_re = re.compile(a) if o in ('--channel'): new_viewer_channel = a if o in ('--server_channel'): @@ -193,16 +212,23 @@ def main(): # Assume we're updating just the build number cl = 'svn info "%s"' % src_root status, output = _getstatusoutput(cl) - #print - #print "svn info output:" - #print "----------------" - #print output - m = svn_re.search(output) - if not m: + if verbose: + print + print "svn info output:" + print "----------------" + print output + + branch_match = svn_branch_re.search(output) + revision_match = svn_revision_re.search(output) + if not branch_match or not revision_match: print "Failed to execute svn info, output follows:" print output return -1 - revision = m.group(1) + branch = branch_match.group(1) + revision = revision_match.group(1) + if skip_on_branch_re and skip_on_branch_re.match(branch): + print "Release Candidate Build, leaving version files untouched." + return 0 if update_viewer: m = version_re.match(viewer_version) viewer_version = m.group(1)+"."+m.group(2)+"."+m.group(3)+"."+revision |