From 79f14b7febf512e96a7d63eff8e6db895a7e72cf Mon Sep 17 00:00:00 2001
From: Nat Goodspeed <nat@lindenlab.com>
Date: Thu, 25 Aug 2011 14:54:38 -0400
Subject: [PATCH] CHOP-763: Move llwindowlistener.{h,cpp} from llwindow to
 newview. Instantiate LLWindowListener on LLViewerWindow instead of on
 LLWindow. This permits LLWindowListener to use machinery from llui, e.g.
 LLUI::resolvePath(). Document planned new ["path"], ["reply"] params to
 "keyDown", "keyUp", "mouseDown", "mouseUp", "mouseMove" operations; document
 relationship between ["path"] and ["x"] and ["y"]. NEW PARAMS NOT YET
 IMPLEMENTED.

---
 indra/llwindow/CMakeLists.txt                 |  2 -
 indra/llwindow/llwindow.cpp                   |  9 -----
 indra/llwindow/llwindow.h                     |  2 -
 indra/newview/CMakeLists.txt                  |  2 +
 indra/newview/llviewerwindow.cpp              |  9 ++++-
 indra/newview/llviewerwindow.h                |  4 +-
 .../llwindowlistener.cpp                      | 37 +++++++++++++------
 .../{llwindow => newview}/llwindowlistener.h  |  0
 8 files changed, 38 insertions(+), 27 deletions(-)
 rename indra/{llwindow => newview}/llwindowlistener.cpp (80%)
 rename indra/{llwindow => newview}/llwindowlistener.h (100%)

diff --git a/indra/llwindow/CMakeLists.txt b/indra/llwindow/CMakeLists.txt
index 3d89867bc1d..341bddfffdb 100644
--- a/indra/llwindow/CMakeLists.txt
+++ b/indra/llwindow/CMakeLists.txt
@@ -38,7 +38,6 @@ set(llwindow_SOURCE_FILES
     llkeyboardheadless.cpp
     llwindowheadless.cpp
     llwindowcallbacks.cpp
-    llwindowlistener.cpp
     )
 
 set(llwindow_HEADER_FILES
@@ -48,7 +47,6 @@ set(llwindow_HEADER_FILES
     llkeyboardheadless.h
     llwindowheadless.h
     llwindowcallbacks.h
-    llwindowlistener.h
     )
 
 set(viewer_SOURCE_FILES
diff --git a/indra/llwindow/llwindow.cpp b/indra/llwindow/llwindow.cpp
index 71a5df910da..dc3a1099b11 100644
--- a/indra/llwindow/llwindow.cpp
+++ b/indra/llwindow/llwindow.cpp
@@ -41,8 +41,6 @@
 #include "llkeyboard.h"
 #include "linked_lists.h"
 #include "llwindowcallbacks.h"
-#include "llwindowlistener.h"
-#include <boost/lambda/core.hpp>
 
 
 //
@@ -118,17 +116,10 @@ LLWindow::LLWindow(LLWindowCallbacks* callbacks, BOOL fullscreen, U32 flags)
 	  mFlags(flags),
 	  mHighSurrogate(0)
 {
-	// gKeyboard is still NULL, so it doesn't do LLWindowListener any good to
-	// pass its value right now. Instead, pass it a nullary function that
-	// will, when we later need it, return the value of gKeyboard.
-	// boost::lambda::var() constructs such a functor on the fly.
-	mListener = new LLWindowListener(callbacks, boost::lambda::var(gKeyboard));
 }
 
 LLWindow::~LLWindow()
 {
-	delete mListener;
-	mListener = NULL;
 }
 
 //virtual
diff --git a/indra/llwindow/llwindow.h b/indra/llwindow/llwindow.h
index 6bdc01ae88f..e8a86a18807 100644
--- a/indra/llwindow/llwindow.h
+++ b/indra/llwindow/llwindow.h
@@ -36,7 +36,6 @@
 class LLSplashScreen;
 class LLPreeditor;
 class LLWindowCallbacks;
-class LLWindowListener;
 
 // Refer to llwindow_test in test/common/llwindow for usage example
 
@@ -189,7 +188,6 @@ class LLWindow
 	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/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 935dd2e8875..bd080f2ac47 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -599,6 +599,7 @@ set(viewer_SOURCE_FILES
     llweb.cpp
     llwebsharing.cpp
     llwind.cpp
+    llwindowlistener.cpp
     llwlanimator.cpp
     llwldaycycle.cpp
     llwlhandlers.cpp
@@ -1153,6 +1154,7 @@ set(viewer_HEADER_FILES
     llweb.h
     llwebsharing.h
     llwind.h
+    llwindowlistener.h
     llwlanimator.h
     llwldaycycle.h
     llwlhandlers.h
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 988c4ed1a23..0501b615927 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -36,6 +36,7 @@
 #include <iostream>
 #include <fstream>
 #include <algorithm>
+#include <boost/lambda/core.hpp>
 
 #include "llagent.h"
 #include "llagentcamera.h"
@@ -198,6 +199,7 @@
 #include "llfloaternotificationsconsole.h"
 
 #include "llnearbychat.h"
+#include "llwindowlistener.h"
 #include "llviewerwindowlistener.h"
 #include "llpaneltopinfobar.h"
 
@@ -1552,7 +1554,12 @@ LLViewerWindow::LLViewerWindow(
 	mResDirty(false),
 	mStatesDirty(false),
 	mCurrResolutionIndex(0),
-    mViewerWindowListener(new LLViewerWindowListener(this)),
+	// gKeyboard is still NULL, so it doesn't do LLWindowListener any good to
+	// pass its value right now. Instead, pass it a nullary function that
+	// will, when we later need it, return the value of gKeyboard.
+	// boost::lambda::var() constructs such a functor on the fly.
+	mWindowListener(new LLWindowListener(this, boost::lambda::var(gKeyboard))),
+	mViewerWindowListener(new LLViewerWindowListener(this)),
 	mProgressView(NULL)
 {
 	LLNotificationChannel::buildChannel("VW_alerts", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "alert"));
diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h
index ff49ed1f628..48599ebb005 100644
--- a/indra/newview/llviewerwindow.h
+++ b/indra/newview/llviewerwindow.h
@@ -62,6 +62,7 @@ class LLImageFormatted;
 class LLHUDIcon;
 class LLWindow;
 class LLRootView;
+class LLWindowListener;
 class LLViewerWindowListener;
 class LLPopupView;
 
@@ -455,7 +456,8 @@ class LLViewerWindow : public LLWindowCallbacks
 	bool			mStatesDirty;
 	U32			mCurrResolutionIndex;
 
-    boost::scoped_ptr<LLViewerWindowListener> mViewerWindowListener;
+	boost::scoped_ptr<LLWindowListener> mWindowListener;
+	boost::scoped_ptr<LLViewerWindowListener> mViewerWindowListener;
 
 protected:
 	static std::string sSnapshotBaseName;
diff --git a/indra/llwindow/llwindowlistener.cpp b/indra/newview/llwindowlistener.cpp
similarity index 80%
rename from indra/llwindow/llwindowlistener.cpp
rename to indra/newview/llwindowlistener.cpp
index 006aaa75e72..e5deaa42cf8 100644
--- a/indra/llwindow/llwindowlistener.cpp
+++ b/indra/newview/llwindowlistener.cpp
@@ -31,6 +31,7 @@
 #include "llcoord.h"
 #include "llkeyboard.h"
 #include "llwindowcallbacks.h"
+#include "llui.h"
 #include <map>
 
 LLWindowListener::LLWindowListener(LLWindowCallbacks *window, const KeyboardGetter& kbgetter)
@@ -42,35 +43,47 @@ LLWindowListener::LLWindowListener(LLWindowCallbacks *window, const KeyboardGett
 		"Given [\"keysym\"], [\"keycode\"] or [\"char\"], inject the specified ";
 	std::string keyExplain =
 		"(integer keycode values, or keysym string from any addKeyName() call in\n"
-		"http://hg.secondlife.com/viewer-development/src/tip/indra/llwindow/llkeyboard.cpp )";
+		"http://hg.secondlife.com/viewer-development/src/tip/indra/llwindow/llkeyboard.cpp )\n";
 	std::string mask =
 		"Specify optional [\"mask\"] as an array containing any of \"CTL\", \"ALT\",\n"
 		"\"SHIFT\" or \"MAC_CONTROL\"; the corresponding modifier bits will be combined\n"
 		"to form the mask used with the event.";
 
-	std::string mouseSomething =
-		"Given [\"button\"], [\"x\"] and [\"y\"], inject the given mouse ";
-	std::string mouseExplain =
-		"(button values \"LEFT\", \"MIDDLE\", \"RIGHT\")";
+	std::string given = "Given ";
+	std::string mouseParams =
+		"optional [\"path\"], optional [\"x\"] and [\"y\"], inject the requested mouse ";
+	std::string buttonParams =
+		std::string("[\"button\"], ") + mouseParams;
+	std::string buttonExplain =
+		"(button values \"LEFT\", \"MIDDLE\", \"RIGHT\")\n";
+	std::string paramsExplain =
+		"[\"path\"] is as for LLUI::resolvePath(), described in\n"
+		"http://hg.secondlife.com/viewer-development/src/tip/indra/llui/llui.h\n"
+		"If you omit [\"path\"], you must specify both [\"x\"] and [\"y\"].\n"
+		"If you specify [\"path\"] without both [\"x\"] and [\"y\"], will synthesize (x, y)\n"
+		"in the center of the LLView selected by [\"path\"].\n"
+		"You may specify [\"path\"] with both [\"x\"] and [\"y\"], will use your (x, y).\n"
+		"This may cause the LLView selected by [\"path\"] to reject the event.\n"
+		"Optional [\"reply\"] requests a reply event on the named LLEventPump.\n"
+		"reply[\"error\"] isUndefined (None) on success, else an explanatory message.\n";
 
 	add("keyDown",
-		keySomething + "keypress event.\n" + keyExplain + '\n' + mask,
+		keySomething + "keypress event.\n" + keyExplain + mask,
 		&LLWindowListener::keyDown);
 	add("keyUp",
-		keySomething + "key release event.\n" + keyExplain + '\n' + mask,
+		keySomething + "key release event.\n" + keyExplain + mask,
 		&LLWindowListener::keyUp);
 	add("mouseDown",
-		mouseSomething + "click event.\n" + mouseExplain + '\n' + mask,
+		given + buttonParams + "click event.\n" + buttonExplain + paramsExplain + mask,
 		&LLWindowListener::mouseDown);
 	add("mouseUp",
-		mouseSomething + "release event.\n" + mouseExplain + '\n' + mask,
+		given + buttonParams + "release event.\n" + buttonExplain + paramsExplain + mask,
 		&LLWindowListener::mouseUp);
 	add("mouseMove",
-		std::string("Given [\"x\"] and [\"y\"], inject the given mouse movement event.\n") +
-		mask,
+		given + mouseParams + "movement event.\n" + paramsExplain + mask,
 		&LLWindowListener::mouseMove);
 	add("mouseScroll",
-		"Given an integer number of [\"clicks\"], inject the given mouse scroll event.\n"
+		"Given an integer number of [\"clicks\"], inject the requested mouse scroll event.\n"
 		"(positive clicks moves downward through typical content)",
 		&LLWindowListener::mouseScroll);
 }
diff --git a/indra/llwindow/llwindowlistener.h b/indra/newview/llwindowlistener.h
similarity index 100%
rename from indra/llwindow/llwindowlistener.h
rename to indra/newview/llwindowlistener.h
-- 
GitLab