diff options
| -rw-r--r-- | indra/llwindow/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | indra/llwindow/llwindow.cpp | 10 | ||||
| -rw-r--r-- | indra/llwindow/llwindow.h | 2 | ||||
| -rw-r--r-- | indra/llwindow/llwindowlistener.cpp | 174 | ||||
| -rw-r--r-- | indra/llwindow/llwindowlistener.h | 53 | 
5 files changed, 239 insertions, 2 deletions
diff --git a/indra/llwindow/CMakeLists.txt b/indra/llwindow/CMakeLists.txt index 4d2677fd91..00aaba2052 100644 --- a/indra/llwindow/CMakeLists.txt +++ b/indra/llwindow/CMakeLists.txt @@ -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 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/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  | 
