Added an EventAPI listener to LLWindow for hooking into key and mouse inputs.

meow-7.2.2
brad kittenbrink 2011-02-17 15:50:44 -08:00
parent eacd9d5d59
commit 930710ceec
5 changed files with 239 additions and 2 deletions

View File

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

View File

@ -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()

View File

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

View File

@ -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);
}

View File

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