Added an EventAPI listener to LLWindow for hooking into key and mouse inputs.
parent
eacd9d5d59
commit
930710ceec
|
|
@ -36,6 +36,7 @@ set(llwindow_SOURCE_FILES
|
|||
llkeyboard.cpp
|
||||
llwindowheadless.cpp
|
||||
llwindowcallbacks.cpp
|
||||
llwindowlistener.cpp
|
||||
)
|
||||
|
||||
set(llwindow_HEADER_FILES
|
||||
|
|
@ -44,6 +45,7 @@ set(llwindow_HEADER_FILES
|
|||
llkeyboard.h
|
||||
llwindowheadless.h
|
||||
llwindowcallbacks.h
|
||||
llwindowlistener.h
|
||||
)
|
||||
|
||||
set(viewer_SOURCE_FILES
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
@ -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
|
||||
Loading…
Reference in New Issue