summaryrefslogtreecommitdiff
path: root/indra/newview/llfloaterjoin.cpp
diff options
context:
space:
mode:
authorJonathan "Geenz" Goodman <geenz@lindenlab.com>2026-10-08 17:31:29 -0400
committerGitHub <noreply@github.com>2026-10-08 17:31:29 -0400
commita4b3cdcee40bde061db9eb92977d7e9ffb185c77 (patch)
treec4ef66d6c70893ebb28d3fd9001f0dc8e1a9751a /indra/newview/llfloaterjoin.cpp
parenteea02ed1683b34db7120b0cfa70bc4f9b063c9dc (diff)
parent4fd91009c30dd0479568013c94ab424c23721485 (diff)
Merge branch 'release/26.5' into project/chat-modernization
Diffstat (limited to 'indra/newview/llfloaterjoin.cpp')
-rw-r--r--indra/newview/llfloaterjoin.cpp150
1 files changed, 150 insertions, 0 deletions
diff --git a/indra/newview/llfloaterjoin.cpp b/indra/newview/llfloaterjoin.cpp
new file mode 100644
index 0000000000..e82de2474f
--- /dev/null
+++ b/indra/newview/llfloaterjoin.cpp
@@ -0,0 +1,150 @@
+/**
+ * @file llfloaterjoin.cpp
+ * @brief Modal floater for the Join page on the login screen
+ *
+ * $LicenseInfo:firstyear=2026&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2026, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloaterjoin.h"
+
+#include "llcommandhandler.h"
+#include "llfloaterreg.h"
+#include "llframetimer.h"
+#include "llfloaterwebmodal.h"
+#include "llmediactrl.h"
+#include "llpanellogin.h"
+#include "llui.h"
+#include "llviewercontrol.h"
+
+// support for secondlife:///app/floaterjoin/{ACTION}/... SLapps
+class LLFloaterJoinHandler : public LLCommandHandler
+{
+public:
+ LLFloaterJoinHandler() : LLCommandHandler("floaterjoin", UNTRUSTED_THROTTLE) {}
+
+ // params/query_map can contain the join password, keep it out of the log
+ bool isSensitive() const override { return true; }
+
+ bool handle(const LLSD& params, const LLSD& query_map, const std::string& grid, LLMediaCtrl* web) override
+ {
+ if (params.size() < 1)
+ return false;
+
+ const std::string action = params[0].asString();
+
+ if (action == "close")
+ {
+ LLFloaterReg::hideInstance("join");
+ }
+ else if (action == "tos")
+ {
+ LLFloaterReg::showInstance("web_modal", LLSD().with("url", gSavedSettings.getString("TermsOfServiceURL")));
+ }
+ else if (action == "tc")
+ {
+ LLFloaterReg::showInstance("web_modal", LLSD().with("url", gSavedSettings.getString("TermsAndConditionsURL")));
+ }
+ else if (action == "privacy")
+ {
+ LLFloaterReg::showInstance("web_modal", LLSD().with("url", gSavedSettings.getString("PrivacyPolicyURL")));
+ }
+ else if (action == "join" && params.size() >= 3)
+ {
+ LLPanelLogin::setCredentialFields(LLURI::unescape(params[1].asString()),
+ LLURI::unescape(params[2].asString()));
+ LLFloaterReg::hideInstance("join");
+ }
+
+ return true;
+ }
+};
+LLFloaterJoinHandler gFloaterJoinHandler;
+
+LLFloaterJoin::LLFloaterJoin(const LLSD& key)
+ : LLModalDialog(key, /*modal=*/true)
+{
+}
+
+bool LLFloaterJoin::postBuild()
+{
+ mWebBrowser = getChild<LLMediaCtrl>("join_browser");
+ mNativeRect = getRect();
+ return true;
+}
+
+void LLFloaterJoin::updateFloaterSize()
+{
+ const LLRect& screen_rect = gFloaterView->getRect();
+ S32 width = llmin(mNativeRect.getWidth(), screen_rect.getWidth());
+ S32 height = llmin(mNativeRect.getHeight(), screen_rect.getHeight());
+
+ // Shrink the floater to fit the screen, letting scroll container reveal the rest if
+ // the screen is currently smaller than the floater's native size, else restore it
+ if (width != getRect().getWidth() || height != getRect().getHeight())
+ {
+ reshape(width, height);
+ center();
+ }
+}
+
+void LLFloaterJoin::draw()
+{
+ static LLCachedControl<F32> overlay_opacity(gSavedSettings, "JoinFloaterOverlayOpacity");
+
+ updateFloaterSize();
+
+ // As a modal dialog this floater is drawn twice per frame (once by LLFloaterView and once
+ // by LLPopupView), so paint the overlay only on the first pass of each frame
+ U32 frame_count = LLFrameTimer::getFrameCount();
+ if (mOverlayFrame != frame_count)
+ {
+ mOverlayFrame = frame_count;
+
+ // darken everything behind the floater, in absolute window coordinates
+ LLVector2 window_size = LLUI::getInstance()->getWindowSize();
+ LLUI::pushMatrix();
+ LLUI::loadIdentity();
+ gl_rect_2d(0, ll_round(window_size.mV[VY]), ll_round(window_size.mV[VX]), 0,
+ LLColor4(0.f, 0.f, 0.f, llclamp((F32)overlay_opacity, 0.f, 1.f)));
+ LLUI::popMatrix();
+ }
+
+ LLModalDialog::draw();
+}
+
+void LLFloaterJoin::onOpen(const LLSD& key)
+{
+ LLModalDialog::onOpen(key);
+
+ std::string url = gSavedSettings.getString("JoinURL");
+ if (key.has("url"))
+ {
+ url = key["url"].asString();
+ }
+
+ if (mWebBrowser && !url.empty())
+ {
+ mWebBrowser->navigateTo(url, HTTP_CONTENT_TEXT_HTML);
+ }
+}