diff --git a/indra/newview/ao.cpp b/indra/newview/ao.cpp
index 92c9c813e7..f0fb99875f 100644
--- a/indra/newview/ao.cpp
+++ b/indra/newview/ao.cpp
@@ -282,6 +282,10 @@ bool FloaterAO::postBuild()
mPreviousButtonSmall->setCommitCallback(boost::bind(&FloaterAO::onClickPrevious, this));
mNextButtonSmall->setCommitCallback(boost::bind(&FloaterAO::onClickNext, this));
+// Double click on animation in AO
+ mAnimationList->setDoubleClickCallback(boost::bind(&FloaterAO::onDoubleClick, this));
+//
+
updateSmart();
AOEngine::instance().setReloadCallback(boost::bind(&FloaterAO::updateList, this));
@@ -780,6 +784,40 @@ void FloaterAO::onClickNext()
AOEngine::instance().cycle(AOEngine::CycleNext);
}
+// Double click on animation in AO
+void FloaterAO::onDoubleClick()
+{
+ LLScrollListItem* item = mAnimationList->getFirstSelected();
+ if (!item)
+ {
+ return;
+ }
+ LLUUID* animUUID = (LLUUID*)item->getUserdata();
+ if (!animUUID)
+ {
+ return;
+ }
+
+ // do nothing if animation is for a different state than the active state
+ if (mSelectedState != AOEngine::instance().getCurrentState())
+ {
+ return;
+ }
+
+ // activate AO set if necessary
+ if (AOEngine::instance().getCurrentSet() != mSelectedSet)
+ {
+ // sync small set selector with main set selector
+ mSetSelectorSmall->selectNthItem(mSetSelector->getCurrentIndex());
+
+ LL_DEBUGS("AOEngine") << "Set activated: " << mSetSelector->getSelectedItemLabel() << LL_ENDL;
+ AOEngine::instance().selectSet(mSelectedSet);
+ }
+
+ AOEngine::instance().playAnimation(*animUUID);
+}
+//
+
void FloaterAO::onClickMore()
{
LLRect fullSize = gSavedPerAccountSettings.getRect("floater_rect_animation_overrider_full");
diff --git a/indra/newview/ao.h b/indra/newview/ao.h
index 1ef283d9c0..cadde5088c 100644
--- a/indra/newview/ao.h
+++ b/indra/newview/ao.h
@@ -91,6 +91,10 @@ class FloaterAO
void onClickMore();
void onClickLess();
+// Double click on animation in AO
+ void onDoubleClick();
+//
+
void onAnimationChanged(const LLUUID& animation);
void reloading(bool reload);
diff --git a/indra/newview/aoengine.cpp b/indra/newview/aoengine.cpp
index 62141ef422..33f91d556a 100644
--- a/indra/newview/aoengine.cpp
+++ b/indra/newview/aoengine.cpp
@@ -960,6 +960,115 @@ void AOEngine::cycle(eCycleMode cycleMode)
}
}
+// Double click on animation in AO
+void AOEngine::playAnimation(const LLUUID& animation)
+{
+ if (!mEnabled)
+ {
+ return;
+ }
+
+ if (!mCurrentSet)
+ {
+ LL_DEBUGS("AOEngine") << "cycle without set." << LL_ENDL;
+ return;
+ }
+
+ // do not cycle if we're sitting and sit-override is off
+ if (mLastMotion == ANIM_AGENT_SIT && !mCurrentSet->getSitOverride())
+ {
+ return;
+ }
+ // do not cycle if we're standing and mouselook stand override is disabled while being in mouselook
+ else if (mLastMotion == ANIM_AGENT_STAND && mCurrentSet->getMouselookStandDisable() && mInMouselook)
+ {
+ return;
+ }
+
+ AOSet::AOState* state = mCurrentSet->getStateByRemapID(mLastMotion);
+ if (!state)
+ {
+ LL_DEBUGS("AOEngine") << "cycle without state." << LL_ENDL;
+ return;
+ }
+
+ if (!state->mAnimations.size())
+ {
+ LL_DEBUGS("AOEngine") << "cycle without animations in state." << LL_ENDL;
+ return;
+ }
+
+ LLViewerInventoryItem* item = gInventory.getItem(animation);
+ AOSet::AOAnimation anim;
+ anim.mName = item->LLInventoryItem::getName();
+ anim.mInventoryUUID = item->getUUID();
+ anim.mOriginalUUID = item->getLinkedUUID();
+ anim.mAssetUUID = LLUUID::null;
+
+ // if we can find the original animation already right here, save its asset ID, otherwise this will
+ // be tried again in AOSet::getAnimationForState() and/or AOEngine::cycle()
+ if (item->getLinkedItem())
+ {
+ anim.mAssetUUID = item->getAssetUUID();
+ }
+
+ LLUUID newAnimation = anim.mAssetUUID;
+ LLUUID oldAnimation = state->mCurrentAnimationID;
+
+ // don't do anything if the animation didn't change
+ if (newAnimation == oldAnimation)
+ {
+ return;
+ }
+
+ mAnimationChangedSignal(LLUUID::null);
+
+ // Searches for the index of the animation
+ U32 idx = -1;
+ for (U32 i = 0; i < state->mAnimations.size(); i++)
+ {
+ if (state->mAnimations[i].mAssetUUID == newAnimation)
+ {
+ idx = i;
+ break;
+ }
+ }
+ if (idx < 0)
+ {
+ idx = 0;
+ }
+
+ state->mCurrentAnimation = idx;
+ state->mCurrentAnimationID = newAnimation;
+ if (newAnimation.notNull())
+ {
+ LL_DEBUGS("AOEngine") << "requesting animation start for motion " << gAnimLibrary.animationName(mLastMotion) << ": " << newAnimation << LL_ENDL;
+ gAgent.sendAnimationRequest(newAnimation, ANIM_REQUEST_START);
+ mAnimationChangedSignal(state->mAnimations[state->mCurrentAnimation].mInventoryUUID);
+ }
+ else
+ {
+ LL_DEBUGS("AOEngine") << "overrider came back with NULL animation for motion " << gAnimLibrary.animationName(mLastMotion) << "." << LL_ENDL;
+ }
+
+ if (oldAnimation.notNull())
+ {
+ LL_DEBUGS("AOEngine") << "Cycling state " << state->mName << " - stopping animation " << oldAnimation << LL_ENDL;
+ gAgent.sendAnimationRequest(oldAnimation, ANIM_REQUEST_STOP);
+ gAgentAvatarp->LLCharacter::stopMotion(oldAnimation);
+ }
+}
+
+const AOSet* AOEngine::getCurrentSet() const
+{
+ return mCurrentSet;
+}
+const AOSet::AOState* AOEngine::getCurrentState() const
+{
+ return mCurrentSet->getStateByRemapID(mLastMotion);
+}
+//
+
void AOEngine::updateSortOrder(AOSet::AOState* state)
{
for (U32 index = 0; index < state->mAnimations.size(); ++index)
diff --git a/indra/newview/aoengine.h b/indra/newview/aoengine.h
index a381d00dd3..438fe217b9 100644
--- a/indra/newview/aoengine.h
+++ b/indra/newview/aoengine.h
@@ -123,6 +123,12 @@ class AOEngine
void cycleTimeout(const AOSet* set);
void cycle(eCycleMode cycleMode);
+// Double click on animation in AO
+ void playAnimation(const LLUUID& animation);
+ const AOSet* getCurrentSet() const;
+ const AOSet::AOState* getCurrentState() const;
+//
+
void inMouselook(bool mouselook);
void selectSet(AOSet* set);
AOSet* selectSetByName(const std::string& name);
diff --git a/indra/newview/installers/darwin/apple-notarize.sh b/indra/newview/installers/darwin/apple-notarize.sh
index c8ff10df5c..edaeb95896 100755
--- a/indra/newview/installers/darwin/apple-notarize.sh
+++ b/indra/newview/installers/darwin/apple-notarize.sh
@@ -28,11 +28,35 @@ if [[ -f "$CONFIG_FILE" ]]; then
echo "Notarized with id: [$match]"
else
echo "No match found"
+ exit 1
fi
- # if [[ ! $match -eq 0 ]]; then
- echo "Running Stapler"
- xcrun stapler staple "$app_file"
+ # --- WAIT / RETRY LOGIC FOR STAPLER ---
+ # Try stapler up to 5 times with a 5-second delay in between attempts
+ max_attempts=5
+ sleep_seconds=5
+ attempt=1
+
+ while [[ $attempt -le $max_attempts ]]; do
+ echo "Running stapler (attempt $attempt of $max_attempts)..."
+ xcrun stapler staple "$app_file"
+ ret=$?
+
+ if [[ $ret -eq 0 ]]; then
+ echo "Stapling succeeded on attempt $attempt"
+ break
+ else
+ if [[ $attempt -lt $max_attempts ]]; then
+ echo "Stapling failed (Error $ret). Waiting $sleep_seconds seconds before retry..."
+ sleep $sleep_seconds
+ else
+ echo "Stapling failed after $max_attempts attempts, giving up."
+ exit 65
+ fi
+ fi
+ attempt=$((attempt + 1))
+ done
+
# Delete the zip file to stop it being packed in the dmg
rm -f "$zip_file"
if [[ $? -eq 0 ]]; then
diff --git a/indra/newview/linux_tools/wrapper.sh b/indra/newview/linux_tools/wrapper.sh
index eb3f7c3109..39e5ea7af3 100755
--- a/indra/newview/linux_tools/wrapper.sh
+++ b/indra/newview/linux_tools/wrapper.sh
@@ -103,6 +103,10 @@ echo "LIBGL_DRIVERS_PATH is ${LIBGL_DRIVERS_PATH}"
if [ "$GTK_IM_MODULE" = "scim" ]; then
export GTK_IM_MODULE=xim
fi
+if [ "$XMODIFIERS" = "" ]; then
+ ## IME is valid only for fcitx, not when using ibus
+ export XMODIFIERS="@im=fcitx"
+fi
## - Automatically work around the ATI mouse cursor crash bug:
## (this workaround is disabled as most fglrx users do not see the bug)
diff --git a/indra/newview/llhudtext.cpp b/indra/newview/llhudtext.cpp
index ddd3893bc4..fa1f800952 100644
--- a/indra/newview/llhudtext.cpp
+++ b/indra/newview/llhudtext.cpp
@@ -129,16 +129,12 @@ void LLHUDText::render()
// If the current text object is highighed and the use hover highlight feature is enabled, then
// disable writing to the depth buffer
static LLCachedControl mbUseHoverHighlight(gSavedSettings, "FSHudTextUseHoverHighlight");
- if (mbUseHoverHighlight && mbIsHighlighted)
- {
- LLGLDepthTest gls_depth(GL_FALSE, GL_FALSE);
- }
- //Else, use the standard method of writing to the depth buffer for all other non-highlighted text objects
- else
- {
- LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE);
- }
- // [FIRE-35019]
+ // [FIRE-35102] - Hover text appearing through walls in Beta 7.1.12.7737
+ // So it turns out when the LLGLDepthTest object goes out of scope, it reverts back
+ // to the previous state. So by having the LLGLDepthTest in the if statements, they were
+ // never applied.
+ LLGLDepthTest gls_depth(mbUseHoverHighlight && mbIsHighlighted ? GL_FALSE : GL_TRUE, GL_FALSE);
+ // [FIRE-35019] [FIRE-35102]
//LLGLDisable gls_stencil(GL_STENCIL_TEST);
renderText();
}
diff --git a/indra/newview/skins/ansastorm/xui/pt~ed6409fa7e5b7545e2bf265f1ac47318f4799c88 b/indra/newview/skins/ansastorm/xui/pt~ed6409fa7e5b7545e2bf265f1ac47318f4799c88
new file mode 100644
index 0000000000..8b13789179
--- /dev/null
+++ b/indra/newview/skins/ansastorm/xui/pt~ed6409fa7e5b7545e2bf265f1ac47318f4799c88
@@ -0,0 +1 @@
+