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