summaryrefslogtreecommitdiff
path: root/indra/llwindow
diff options
context:
space:
mode:
Diffstat (limited to 'indra/llwindow')
-rw-r--r--indra/llwindow/CMakeLists.txt4
-rw-r--r--indra/llwindow/llkeyboardheadless.cpp50
-rw-r--r--indra/llwindow/llkeyboardheadless.h45
-rw-r--r--indra/llwindow/llwindow.cpp10
-rw-r--r--indra/llwindow/llwindow.h2
-rw-r--r--indra/llwindow/llwindowheadless.cpp4
-rw-r--r--indra/llwindow/llwindowlistener.cpp174
-rw-r--r--indra/llwindow/llwindowlistener.h53
8 files changed, 340 insertions, 2 deletions
diff --git a/indra/llwindow/CMakeLists.txt b/indra/llwindow/CMakeLists.txt
index 4d2677fd91..08ebaf7577 100644
--- a/indra/llwindow/CMakeLists.txt
+++ b/indra/llwindow/CMakeLists.txt
@@ -34,16 +34,20 @@ include_directories(
set(llwindow_SOURCE_FILES
llkeyboard.cpp
+ llkeyboardheadless.cpp
llwindowheadless.cpp
llwindowcallbacks.cpp
+ llwindowlistener.cpp
)
set(llwindow_HEADER_FILES
CMakeLists.txt
llkeyboard.h
+ llkeyboardheadless.h
llwindowheadless.h
llwindowcallbacks.h
+ llwindowlistener.h
)
set(viewer_SOURCE_FILES
diff --git a/indra/llwindow/llkeyboardheadless.cpp b/indra/llwindow/llkeyboardheadless.cpp
new file mode 100644
index 0000000000..4dfaaed4e1
--- /dev/null
+++ b/indra/llwindow/llkeyboardheadless.cpp
@@ -0,0 +1,50 @@
+/**
+ * @file llkeyboardheadless.cpp
+ * @brief Handler for assignable key bindings
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, 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 "linden_common.h"
+#include "llkeyboardheadless.h"
+#include "llwindowcallbacks.h"
+
+LLKeyboardHeadless::LLKeyboardHeadless()
+{ }
+
+void LLKeyboardHeadless::resetMaskKeys()
+{ }
+
+
+BOOL LLKeyboardHeadless::handleKeyDown(const U16 key, const U32 mask)
+{ return FALSE; }
+
+
+BOOL LLKeyboardHeadless::handleKeyUp(const U16 key, const U32 mask)
+{ return FALSE; }
+
+MASK LLKeyboardHeadless::currentMask(BOOL for_mouse_event)
+{ return MASK_NONE; }
+
+void LLKeyboardHeadless::scanKeyboard()
+{ }
+
diff --git a/indra/llwindow/llkeyboardheadless.h b/indra/llwindow/llkeyboardheadless.h
new file mode 100644
index 0000000000..4e666f8ce8
--- /dev/null
+++ b/indra/llwindow/llkeyboardheadless.h
@@ -0,0 +1,45 @@
+/**
+ * @file llkeyboardheadless.h
+ * @brief Handler for assignable key bindings
+ *
+ * $LicenseInfo:firstyear=2004&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, 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$
+ */
+
+#ifndef LL_LLKEYBOARDHEADLESS_H
+#define LL_LLKEYBOARDHEADLESS_H
+
+#include "llkeyboard.h"
+
+class LLKeyboardHeadless : public LLKeyboard
+{
+public:
+ LLKeyboardHeadless();
+ /*virtual*/ ~LLKeyboardHeadless() {};
+
+ /*virtual*/ BOOL handleKeyUp(const U16 key, MASK mask);
+ /*virtual*/ BOOL handleKeyDown(const U16 key, MASK mask);
+ /*virtual*/ void resetMaskKeys();
+ /*virtual*/ MASK currentMask(BOOL for_mouse_event);
+ /*virtual*/ void scanKeyboard();
+};
+
+#endif
diff --git a/indra/llwindow/llwindow.cpp b/indra/llwindow/llwindow.cpp
index 072f694c24..2d00c37719 100644
--- a/indra/llwindow/llwindow.cpp
+++ b/indra/llwindow/llwindow.cpp
@@ -41,6 +41,7 @@
#include "llkeyboard.h"
#include "linked_lists.h"
#include "llwindowcallbacks.h"
+#include "llwindowlistener.h"
//
@@ -115,10 +116,15 @@ LLWindow::LLWindow(LLWindowCallbacks* callbacks, BOOL fullscreen, U32 flags)
mHideCursorPermanent(FALSE),
mFlags(flags),
mHighSurrogate(0)
-{ }
+{
+ mListener = new LLWindowListener(callbacks, gKeyboard);
+}
LLWindow::~LLWindow()
-{ }
+{
+ delete mListener;
+ mListener = NULL;
+}
//virtual
BOOL LLWindow::isValid()
diff --git a/indra/llwindow/llwindow.h b/indra/llwindow/llwindow.h
index e8a86a1880..6bdc01ae88 100644
--- a/indra/llwindow/llwindow.h
+++ b/indra/llwindow/llwindow.h
@@ -36,6 +36,7 @@
class LLSplashScreen;
class LLPreeditor;
class LLWindowCallbacks;
+class LLWindowListener;
// Refer to llwindow_test in test/common/llwindow for usage example
@@ -188,6 +189,7 @@ protected:
BOOL mHideCursorPermanent;
U32 mFlags;
U16 mHighSurrogate;
+ LLWindowListener* mListener;
// Handle a UTF-16 encoding unit received from keyboard.
// Converting the series of UTF-16 encoding units to UTF-32 data,
diff --git a/indra/llwindow/llwindowheadless.cpp b/indra/llwindow/llwindowheadless.cpp
index 35398f1c09..e6e6bc67ff 100644
--- a/indra/llwindow/llwindowheadless.cpp
+++ b/indra/llwindow/llwindowheadless.cpp
@@ -28,6 +28,7 @@
#include "indra_constants.h"
#include "llwindowheadless.h"
+#include "llkeyboardheadless.h"
//
// LLWindowHeadless
@@ -37,6 +38,9 @@ LLWindowHeadless::LLWindowHeadless(LLWindowCallbacks* callbacks, const std::stri
BOOL disable_vsync, BOOL use_gl, BOOL ignore_pixel_depth)
: LLWindow(callbacks, fullscreen, flags)
{
+ // Initialize a headless keyboard.
+ gKeyboard = new LLKeyboardHeadless();
+ gKeyboard->setCallbacks(callbacks);
}
diff --git a/indra/llwindow/llwindowlistener.cpp b/indra/llwindow/llwindowlistener.cpp
new file mode 100644
index 0000000000..22cc12acee
--- /dev/null
+++ b/indra/llwindow/llwindowlistener.cpp
@@ -0,0 +1,174 @@
+/**
+ * @file llwindowlistener.cpp
+ * @brief EventAPI interface for injecting input into LLWindow
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, 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 "linden_common.h"
+
+#include "llwindowlistener.h"
+
+#include "llcoord.h"
+#include "llkeyboard.h"
+#include "llwindowcallbacks.h"
+
+LLWindowListener::LLWindowListener(LLWindowCallbacks *window, LLKeyboard * keyboard)
+ : LLEventAPI("LLWindow", "Inject input events into the LLWindow instance"),
+ mWindow(window),
+ mKeyboard(keyboard)
+{
+ add("keyDown",
+ "Given [\"keycode\"] or [\"char\"], will inject the given keypress event.",
+ &LLWindowListener::keyDown);
+ add("keyUp",
+ "Given [\"keycode\"] or [\"char\"], will inject the given key release event.",
+ &LLWindowListener::keyUp);
+ add("mouseDown",
+ "Given [\"button\"], [\"x\"] and [\"y\"], will inject the given mouse click event.",
+ &LLWindowListener::mouseDown);
+ add("mouseUp",
+ "Given [\"button\"], [\"x\"] and [\"y\"], will inject the given mouse release event.",
+ &LLWindowListener::mouseUp);
+ add("mouseMove",
+ "Given [\"x\"] and [\"y\"], will inject the given mouse movement event.",
+ &LLWindowListener::mouseMove);
+ add("mouseScroll",
+ "Given a number of [\"clicks\"], will inject the given mouse scroll event.",
+ &LLWindowListener::mouseScroll);
+}
+
+void LLWindowListener::keyDown(LLSD const & evt)
+{
+ if(NULL == mKeyboard)
+ {
+ // *HACK to handle the fact that LLWindow subclasses have to initialize
+ // things in an inconvenient order
+ mKeyboard = gKeyboard;
+ }
+
+ KEY keycode = 0;
+ if(evt.has("keycode"))
+ {
+ keycode = KEY(evt["keycode"].asInteger());
+ }
+ else
+ {
+ keycode = KEY(evt["char"].asString()[0]);
+ }
+
+ // *TODO - figure out how to handle the mask
+ mKeyboard->handleTranslatedKeyDown(keycode, 0);
+}
+
+void LLWindowListener::keyUp(LLSD const & evt)
+{
+ if(NULL == mKeyboard)
+ {
+ // *HACK to handle the fact that LLWindow subclasses have to initialize
+ // things in an inconvenient order
+ mKeyboard = gKeyboard;
+ }
+
+ KEY keycode = 0;
+ if(evt.has("keycode"))
+ {
+ keycode = KEY(evt["keycode"].asInteger());
+ }
+ else
+ {
+ keycode = KEY(evt["char"].asString()[0]);
+ }
+
+ // *TODO - figure out how to handle the mask
+ mKeyboard->handleTranslatedKeyDown(keycode, 0);
+}
+
+void LLWindowListener::mouseDown(LLSD const & evt)
+{
+ LLCoordGL pos(evt["x"].asInteger(), evt["y"].asInteger());
+
+ std::string const & button = evt["button"].asString();
+
+ if(button == "LEFT")
+ {
+ // *TODO - figure out how to handle the mask
+ mWindow->handleMouseDown(NULL, pos, 0);
+ }
+ else if (button == "RIGHT")
+ {
+ // *TODO - figure out how to handle the mask
+ mWindow->handleRightMouseDown(NULL, pos, 0);
+ }
+ else if (button == "MIDDLE")
+ {
+ // *TODO - figure out how to handle the mask
+ mWindow->handleMiddleMouseDown(NULL, pos, 0);
+ }
+ else
+ {
+ llwarns << "ignoring unknown mous button \"" << button << '\"' << llendl;
+ }
+}
+
+void LLWindowListener::mouseUp(LLSD const & evt)
+{
+ LLCoordGL pos(evt["x"].asInteger(), evt["y"].asInteger());
+
+ std::string const & button = evt["button"].asString();
+
+ if(button == "LEFT")
+ {
+ // *TODO - figure out how to handle the mask
+ mWindow->handleMouseUp(NULL, pos, 0);
+ }
+ else if (button == "RIGHT")
+ {
+ // *TODO - figure out how to handle the mask
+ mWindow->handleRightMouseUp(NULL, pos, 0);
+ }
+ else if (button == "MIDDLE")
+ {
+ // *TODO - figure out how to handle the mask
+ mWindow->handleMiddleMouseUp(NULL, pos, 0);
+ }
+ else
+ {
+ llwarns << "ignoring unknown mous button \"" << button << '\"' << llendl;
+ }
+}
+
+void LLWindowListener::mouseMove(LLSD const & evt)
+{
+ LLCoordGL pos(evt["x"].asInteger(), evt["y"].asInteger());
+
+ // *TODO - figure out how to handle the mask
+ mWindow->handleMouseMove(NULL, pos, 0);
+}
+
+void LLWindowListener::mouseScroll(LLSD const & evt)
+{
+ S32 clicks = evt["clicks"].asInteger();
+
+ mWindow->handleScrollWheel(NULL, clicks);
+}
+
diff --git a/indra/llwindow/llwindowlistener.h b/indra/llwindow/llwindowlistener.h
new file mode 100644
index 0000000000..5b234c5d1d
--- /dev/null
+++ b/indra/llwindow/llwindowlistener.h
@@ -0,0 +1,53 @@
+/**
+ * @file llwindowlistener.h
+ * @brief EventAPI interface for injecting input into LLWindow
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, 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$
+ */
+
+#ifndef LL_LLWINDOWLISTENER_H
+#define LL_LLWINDOWLISTENER_H
+
+#include "lleventapi.h"
+
+class LLKeyboard;
+class LLWindowCallbacks;
+
+class LLWindowListener : public LLEventAPI
+{
+public:
+ LLWindowListener(LLWindowCallbacks * window, LLKeyboard * keyboard);
+
+ void keyDown(LLSD const & evt);
+ void keyUp(LLSD const & evt);
+ void mouseDown(LLSD const & evt);
+ void mouseUp(LLSD const & evt);
+ void mouseMove(LLSD const & evt);
+ void mouseScroll(LLSD const & evt);
+
+private:
+ LLWindowCallbacks * mWindow;
+ LLKeyboard * mKeyboard;
+};
+
+
+#endif // LL_LLWINDOWLISTENER_H