summaryrefslogtreecommitdiff
path: root/indra/newview
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview')
-rw-r--r--indra/newview/CMakeLists.txt5
-rw-r--r--indra/newview/app_settings/settings.xml22
-rw-r--r--indra/newview/llappviewer.cpp65
-rw-r--r--indra/newview/llfilepicker.cpp5
-rw-r--r--indra/newview/llkeyconflict.cpp21
-rw-r--r--indra/newview/llkeyconflict.h12
-rw-r--r--indra/newview/skins/default/xui/en/floater_preferences.xml7
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_game_controls.xml32
-rw-r--r--indra/newview/tests/llgamecontrol_stub.cpp76
-rw-r--r--indra/newview/tests/llversioninfo_test.cpp5
-rwxr-xr-xindra/newview/viewer_manifest.py15
11 files changed, 244 insertions, 21 deletions
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 29dbceedac..7fbf214dcf 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -28,6 +28,7 @@ include(LLKDU)
include(LLPhysicsExtensions)
include(LLPrimitive)
include(LLWindow)
+include(SDL2)
include(NDOF)
include(NVAPI)
include(OPENAL)
@@ -1745,7 +1746,7 @@ if (WINDOWS)
# And of course it's straightforward to read a text file in Python.
set(COPY_INPUT_DEPENDENCIES
- # The following commented dependencies are determined at variably at build time. Can't do this here.
+ # The following commented dependencies are determined variably at build time. Can't do this here.
${CMAKE_SOURCE_DIR}/../etc/message.xml
${CMAKE_SOURCE_DIR}/../scripts/messages/message_template.msg
${SHARED_LIB_STAGING_DIR}/openjp2.dll
@@ -2245,6 +2246,7 @@ if (LL_TESTS)
lllogin
llplugin
llappearance
+ ll::SDL2
)
set_source_files_properties(
@@ -2296,6 +2298,7 @@ if (LL_TESTS)
lllogin
llprimitive
lllogin
+ ll::SDL2
)
LL_ADD_INTEGRATION_TEST(cppfeatures
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 60d8c6db76..55f8f77383 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -2612,6 +2612,28 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>EnableGameControlInput</key>
+ <map>
+ <key>Comment</key>
+ <string>Transmit game controller input to server</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>EnableGameControlKeyboardInput</key>
+ <map>
+ <key>Comment</key>
+ <string>Send 'unhandled' keystrokes as GameInput to server</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>EnableGestureSounds</key>
<map>
<key>Comment</key>
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 6fd58ef1be..ffa742d154 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -64,6 +64,7 @@
#include "llluamanager.h"
#include "llurlfloaterdispatchhandler.h"
#include "llviewerjoystick.h"
+#include "llgamecontrol.h"
#include "llcalc.h"
#include "llconversationlog.h"
#if LL_WINDOWS
@@ -1132,6 +1133,7 @@ bool LLAppViewer::init()
{
LLViewerJoystick::getInstance()->init(false);
}
+ LLGameControl::init();
try
{
@@ -1416,6 +1418,59 @@ bool LLAppViewer::frame()
return ret;
}
+
+// static
+bool packGameControlInput(LLMessageSystem* msg)
+{
+ if (! LLGameControl::computeFinalInputAndCheckForChanges())
+ {
+ return false;
+ }
+ if (!gSavedSettings.getBOOL("EnableGameControlInput"))
+ {
+ LLGameControl::clearAllInput();
+ return false;
+ }
+
+ msg->newMessageFast(_PREHASH_GameControlInput);
+ msg->nextBlock("AgentData");
+ msg->addUUID("AgentID", gAgentID);
+ msg->addUUID("SessionID", gAgentSessionID);
+
+ const LLGameControl::State& state = LLGameControl::getState();
+
+ size_t num_indices = state.mAxes.size();
+ for (U8 i = 0; i < num_indices; ++i)
+ {
+ if (state.mAxes[i] != state.mPrevAxes[i])
+ {
+ // only pack an axis if it differs from previously packed value
+ msg->nextBlockFast(_PREHASH_AxisData);
+ msg->addU8Fast(_PREHASH_Index, i);
+ msg->addS16Fast(_PREHASH_Value, state.mAxes[i]);
+ }
+ }
+
+ U32 button_flags = state.mButtons;
+ if (button_flags > 0)
+ {
+ std::vector<U8> buttons;
+ for (U8 i = 0; i < 32; i++)
+ {
+ if (button_flags & (0x1 << i))
+ {
+ buttons.push_back(i);
+ }
+ }
+ msg->nextBlockFast(_PREHASH_ButtonData);
+ msg->addBinaryDataFast(_PREHASH_Data, (void*)(buttons.data()), (S32)(buttons.size()));
+ }
+
+ LLGameControl::updateResendPeriod();
+ return true;
+}
+
+
bool LLAppViewer::doFrame()
{
LL_RECORD_BLOCK_TIME(FTM_FRAME);
@@ -1526,6 +1581,15 @@ bool LLAppViewer::doFrame()
joystick->scanJoystick();
gKeyboard->scanKeyboard();
gViewerInput.scanMouse();
+
+ LLGameControl::setIncludeKeyboardButtons(gSavedSettings.getBOOL("EnableGameControlKeyboardInput"));
+ LLGameControl::processEvents(gFocusMgr.getAppHasFocus());
+ // to help minimize lag we send GameInput packets immediately
+ // after getting the latest GameController input
+ if (packGameControlInput(gMessageSystem))
+ {
+ gAgent.sendMessage();
+ }
}
// Update state based on messages, user input, object idle.
@@ -1961,6 +2025,7 @@ bool LLAppViewer::cleanup()
// Turn off Space Navigator and similar devices
LLViewerJoystick::getInstance()->terminate();
}
+ LLGameControl::terminate();
LL_INFOS() << "Cleaning up Objects" << LL_ENDL;
diff --git a/indra/newview/llfilepicker.cpp b/indra/newview/llfilepicker.cpp
index d5e3627d8e..3639064cc4 100644
--- a/indra/newview/llfilepicker.cpp
+++ b/indra/newview/llfilepicker.cpp
@@ -36,11 +36,8 @@
#include "llviewercontrol.h"
#include "llwindow.h" // beforeDialog()
-#if LL_SDL
-#include "llwindowsdl.h" // for some X/GTK utils to help with filepickers
-#endif // LL_SDL
-
#if LL_LINUX
+#include "llwindowsdl.h" // for some X/GTK utils to help with filepickers
#include "llhttpconstants.h" // file picker uses some of thes constants on Linux
#endif
diff --git a/indra/newview/llkeyconflict.cpp b/indra/newview/llkeyconflict.cpp
index 666ab4f5d0..b9456349cd 100644
--- a/indra/newview/llkeyconflict.cpp
+++ b/indra/newview/llkeyconflict.cpp
@@ -99,29 +99,34 @@ LLKeyConflictHandler::~LLKeyConflictHandler()
// Note: does not reset bindings if temporary file was used
}
-bool LLKeyConflictHandler::canHandleControl(const std::string &control_name, EMouseClickType mouse_ind, KEY key, MASK mask)
+bool LLKeyConflictHandler::canHandleControl(const std::string &control_name, EMouseClickType mouse_ind, KEY key, MASK mask) const
{
- return mControlsMap[control_name].canHandle(mouse_ind, key, mask);
+ control_map_t::const_iterator iter = mControlsMap.find(control_name);
+ if (iter != mControlsMap.end())
+ {
+ return iter->second.canHandle(mouse_ind, key, mask);
+ }
+ return false;
}
-bool LLKeyConflictHandler::canHandleKey(const std::string &control_name, KEY key, MASK mask)
+bool LLKeyConflictHandler::canHandleKey(const std::string &control_name, KEY key, MASK mask) const
{
return canHandleControl(control_name, CLICK_NONE, key, mask);
}
-bool LLKeyConflictHandler::canHandleMouse(const std::string &control_name, EMouseClickType mouse_ind, MASK mask)
+bool LLKeyConflictHandler::canHandleMouse(const std::string &control_name, EMouseClickType mouse_ind, MASK mask) const
{
return canHandleControl(control_name, mouse_ind, KEY_NONE, mask);
}
-bool LLKeyConflictHandler::canHandleMouse(const std::string &control_name, S32 mouse_ind, MASK mask)
+bool LLKeyConflictHandler::canHandleMouse(const std::string &control_name, S32 mouse_ind, MASK mask) const
{
return canHandleControl(control_name, (EMouseClickType)mouse_ind, KEY_NONE, mask);
}
-bool LLKeyConflictHandler::canAssignControl(const std::string &control_name)
+bool LLKeyConflictHandler::canAssignControl(const std::string &control_name) const
{
- control_map_t::iterator iter = mControlsMap.find(control_name);
+ control_map_t::const_iterator iter = mControlsMap.find(control_name);
if (iter != mControlsMap.end())
{
return iter->second.mAssignable;
@@ -284,7 +289,7 @@ void LLKeyConflictHandler::loadFromSettings(const LLViewerInput::KeyMode& keymod
LLKeyboard::keyFromString(it->key, &key);
}
LLKeyboard::maskFromString(it->mask, &mask);
- // Note: it->command is also the name of UI element, howhever xml we are loading from
+ // Note: it->command is also the name of UI element, however xml we are loading from
// might not know all the commands, so UI will have to know what to fill by its own
// Assumes U32_MAX conflict mask, and is assignable by default,
// but assignability might have been overriden by generatePlaceholders.
diff --git a/indra/newview/llkeyconflict.h b/indra/newview/llkeyconflict.h
index 6c01ddb7a7..21990688a2 100644
--- a/indra/newview/llkeyconflict.h
+++ b/indra/newview/llkeyconflict.h
@@ -44,7 +44,7 @@ public:
LLKeyData getKeyData(U32 index) { return mKeyBind.getKeyData(index); }
void setPrimaryKeyData(const LLKeyData& data) { mKeyBind.replaceKeyData(data, 0); }
void setKeyData(const LLKeyData& data, U32 index) { mKeyBind.replaceKeyData(data, index); }
- bool canHandle(EMouseClickType mouse, KEY key, MASK mask) { return mKeyBind.canHandle(mouse, key, mask); }
+ bool canHandle(EMouseClickType mouse, KEY key, MASK mask) const { return mKeyBind.canHandle(mouse, key, mask); }
LLKeyBind mKeyBind;
bool mAssignable; // whether user can change key or key simply acts as placeholder
@@ -76,11 +76,11 @@ public:
LLKeyConflictHandler(ESourceMode mode);
~LLKeyConflictHandler();
- bool canHandleControl(const std::string &control_name, EMouseClickType mouse_ind, KEY key, MASK mask);
- bool canHandleKey(const std::string &control_name, KEY key, MASK mask);
- bool canHandleMouse(const std::string &control_name, EMouseClickType mouse_ind, MASK mask);
- bool canHandleMouse(const std::string &control_name, S32 mouse_ind, MASK mask); //Just for convinience
- bool canAssignControl(const std::string &control_name);
+ bool canHandleControl(const std::string &control_name, EMouseClickType mouse_ind, KEY key, MASK mask) const;
+ bool canHandleKey(const std::string &control_name, KEY key, MASK mask) const;
+ bool canHandleMouse(const std::string &control_name, EMouseClickType mouse_ind, MASK mask) const;
+ bool canHandleMouse(const std::string &control_name, S32 mouse_ind, MASK mask) const; //Just for convenience
+ bool canAssignControl(const std::string &control_name) const;
static bool isReservedByMenu(const KEY &key, const MASK &mask);
static bool isReservedByMenu(const LLKeyData &data);
diff --git a/indra/newview/skins/default/xui/en/floater_preferences.xml b/indra/newview/skins/default/xui/en/floater_preferences.xml
index 4b0e0bb221..4614f2f06c 100644
--- a/indra/newview/skins/default/xui/en/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/en/floater_preferences.xml
@@ -170,6 +170,13 @@
layout="topleft"
help_topic="preferences_controls_tab"
name="controls" />
+ <panel
+ class="panel_preference_game_controls"
+ filename="panel_preferences_game_controls.xml"
+ label="Game Controls"
+ layout="topleft"
+ help_topic="preferences_game_controls_tab"
+ name="gamecontrols" />
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_game_controls.xml b/indra/newview/skins/default/xui/en/panel_preferences_game_controls.xml
new file mode 100644
index 0000000000..4b693e8955
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_preferences_game_controls.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<panel
+ border="true"
+ follows="all"
+ height="408"
+ label="Game Controls"
+ layout="topleft"
+ left="102"
+ name="gamecontrols"
+ top="1"
+ width="517">
+ <check_box
+ control_name="EnableGameControlInput"
+ follows="top|left"
+ height="15"
+ label="Send GameControl Input to server"
+ layout="topleft"
+ left="10"
+ name="enable_game_control_input"
+ top="6"
+ width="232"/>
+ <check_box
+ control_name="EnableGameControlKeyboardInput"
+ follows="top|left"
+ height="15"
+ label="Include otherwise 'unhandled' Keyboard events in GameControl Input"
+ layout="topleft"
+ left="10"
+ name="game_control_keyboard_input"
+ top="27"
+ width="232"/>
+</panel>
diff --git a/indra/newview/tests/llgamecontrol_stub.cpp b/indra/newview/tests/llgamecontrol_stub.cpp
new file mode 100644
index 0000000000..0872f647d7
--- /dev/null
+++ b/indra/newview/tests/llgamecontrol_stub.cpp
@@ -0,0 +1,76 @@
+/**
+ * @file llgamecontrol_stub.h
+ * @brief Stubbery for LLGameControl
+ *
+ * $LicenseInfo:firstyear=2023&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2023, 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 "llgamecontrol.h"
+
+#include "SDL2/SDL_events.h"
+
+
+void LLGameControl::addKeyButtonMap(U16 key, U8 button)
+{
+}
+
+void LLGameControl::removeKeyButtonMap(U16 key)
+{
+}
+
+void LLGameControl::addKeyAxisMap(U16 key, U8 axis, bool positive)
+{
+}
+
+void LLGameControl::removeKeyAxisMap(U16 key)
+{
+}
+
+void LLGameControl::onKeyDown(U16 key, U32 mask)
+{
+}
+
+void LLGameControl::onKeyUp(U16 key, U32 mask)
+{
+}
+
+// static
+bool LLGameControl::isInitialized()
+{
+ return false;
+}
+
+// static
+void LLGameControl::init()
+{
+}
+
+// static
+void LLGameControl::terminate()
+{
+}
+
+// static
+void LLGameControl::processEvents(bool app_has_focus)
+{
+}
+
diff --git a/indra/newview/tests/llversioninfo_test.cpp b/indra/newview/tests/llversioninfo_test.cpp
index 8049e67fc5..9eb5146f2b 100644
--- a/indra/newview/tests/llversioninfo_test.cpp
+++ b/indra/newview/tests/llversioninfo_test.cpp
@@ -29,7 +29,10 @@
#include "../llversioninfo.h"
- #include <iostream>
+#include <iostream>
+
+#include "llgamecontrol_stub.cpp"
+
// LL_VIEWER_CHANNEL is a macro defined on the compiler command line. The
// macro expands to the string name of the channel, but without quotes. We
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index daa7e58211..16904cc43c 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -584,6 +584,9 @@ class Windows_x86_64_Manifest(ViewerManifest):
self.path("vivoxsdk_x64.dll")
self.path("ortp_x64.dll")
+ # SDL2
+ self.path("SDL2.dll")
+
# BugSplat
if self.args.get('bugsplat'):
self.path("BsSndRpt64.exe")
@@ -928,6 +931,7 @@ class Darwin_x86_64_Manifest(ViewerManifest):
with self.prefix(src=relpkgdir, dst=""):
self.path("libndofdev.dylib")
+ self.path("libSDL2-*.dylib")
with self.prefix(src_dst="cursors_mac"):
self.path("*.tif")
@@ -1406,7 +1410,7 @@ class Linux_x86_64_Manifest(LinuxManifest):
pkgdir = self.args['package_dir']
relpkgdir = os.path.join(pkgdir, "lib", "release")
- debpkgdir = os.path.join(pkgdir, "lib", "debug")
+ #debpkgdir = os.path.join(pkgdir, "lib", "debug")
with self.prefix(src=relpkgdir, dst="lib"):
self.path("libapr-1.so*")
@@ -1415,6 +1419,15 @@ class Linux_x86_64_Manifest(LinuxManifest):
self.path_optional("libjemalloc*.so")
+ self.path("libdb*.so")
+ self.path("libuuid.so*")
+ self.path("libdirectfb-1.*.so.*")
+ self.path("libfusion-1.*.so.*")
+ self.path("libdirect-1.*.so.*")
+ self.path("libopenjp2.so*")
+ self.path("libdirectfb-1.4.so.5")
+ self.path("libfusion-1.4.so.5")
+ self.path("libdirect-1.4.so.5*")
self.path("libalut.so*")
self.path("libopenal.so*")
self.path("libopenal.so", "libvivoxoal.so.1") # vivox's sdk expects this soname