summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/contributions.txt5
-rw-r--r--indra/llcommon/llversionviewer.h4
-rw-r--r--indra/llui/lllineeditor.cpp3
-rw-r--r--indra/llui/llmenugl.cpp1
-rw-r--r--indra/llui/lltexteditor.cpp3
-rw-r--r--indra/llui/llview.cpp1
-rw-r--r--indra/llwindow/llwindowwin32.cpp18
-rw-r--r--indra/llwindow/llwindowwin32.h1
-rw-r--r--indra/newview/English.lproj/InfoPlist.strings4
-rw-r--r--indra/newview/Info-SecondLife.plist2
-rw-r--r--indra/newview/llagent.cpp8
-rw-r--r--indra/newview/llclassifiedstatsresponder.cpp18
-rw-r--r--indra/newview/llclassifiedstatsresponder.h4
-rw-r--r--indra/newview/llfloaterchat.cpp1
-rw-r--r--indra/newview/llpanelclassified.cpp53
-rw-r--r--indra/newview/llpanelclassified.h10
-rw-r--r--indra/newview/llpanelpermissions.cpp18
-rw-r--r--indra/newview/llpanelplace.cpp50
-rw-r--r--indra/newview/llpanelplace.h10
-rw-r--r--indra/newview/llurldispatcher.cpp2
-rw-r--r--indra/newview/llviewermenu.cpp2
-rw-r--r--indra/newview/llviewermessage.cpp28
-rw-r--r--indra/newview/llviewerregion.cpp6
-rwxr-xr-xscripts/update_version_files.py46
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