From 116628bb79e8f07c84368fffca550040260c9f67 Mon Sep 17 00:00:00 2001
From: Nat Goodspeed <nat@lindenlab.com>
Date: Wed, 19 Aug 2009 15:11:01 -0400
Subject: [PATCH] Introduce LLUIListener, a new event API that doesn't directly
 correspond to any existing C++ class. It calls named functions registered in
 the LLUICtrl:: CommitCallbackRegistry, thus supporting event-level access to
 any function you can specify with XUI's function= parameter=.

---
 indra/newview/CMakeLists.txt   |  2 ++
 indra/newview/lluilistener.cpp | 50 ++++++++++++++++++++++++++++++++++
 indra/newview/lluilistener.h   | 29 ++++++++++++++++++++
 indra/newview/llviewermenu.cpp |  3 ++
 4 files changed, 84 insertions(+)
 create mode 100644 indra/newview/lluilistener.cpp
 create mode 100644 indra/newview/lluilistener.h

diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 8451bc1223e..37df00d9ec4 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -394,6 +394,7 @@ set(viewer_SOURCE_FILES
     lltoolselectland.cpp
     lltoolselectrect.cpp
     lltracker.cpp
+    lluilistener.cpp
     lluploaddialog.cpp
     llurl.cpp
     llurldispatcher.cpp
@@ -848,6 +849,7 @@ set(viewer_HEADER_FILES
     lltoolselectrect.h
     lltracker.h
     lluiconstants.h
+    lluilistener.h
     lluploaddialog.h
     llurl.h
     llurldispatcher.h
diff --git a/indra/newview/lluilistener.cpp b/indra/newview/lluilistener.cpp
new file mode 100644
index 00000000000..9c643e78dec
--- /dev/null
+++ b/indra/newview/lluilistener.cpp
@@ -0,0 +1,50 @@
+/**
+ * @file   lluilistener.cpp
+ * @author Nat Goodspeed
+ * @date   2009-08-18
+ * @brief  Implementation for lluilistener.
+ * 
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * Copyright (c) 2009, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+// Precompiled header
+#include "llviewerprecompiledheaders.h"
+// associated header
+#include "lluilistener.h"
+// STL headers
+// std headers
+// external library headers
+// other Linden headers
+#include "lluictrl.h"
+#include "llerror.h"
+
+LLUIListener::LLUIListener(const std::string& name):
+    LLDispatchListener(name, "op")
+{
+    add("call", &LLUIListener::call, LLSD().insert("function", LLSD()));
+}
+
+void LLUIListener::call(const LLSD& event) const
+{
+    LLUICtrl::commit_callback_t* func =
+        LLUICtrl::CommitCallbackRegistry::getValue(event["function"]);
+    if (! func)
+    {
+        // This API is intended for use by a script. It's a fire-and-forget
+        // API: we provide no reply. Therefore, a typo in the script will
+        // provide no feedback whatsoever to that script. To rub the coder's
+        // nose in such an error, crump rather than quietly ignoring it.
+        LL_ERRS("LLUIListener") << "function '" << event["function"] << "' not found" << LL_ENDL;
+    }
+    else
+    {
+        // Interestingly, view_listener_t::addMenu() (addCommit(),
+        // addEnable()) constructs a commit_callback_t callable that accepts
+        // two parameters but discards the first. Only the second is passed to
+        // handleEvent(). Therefore we feel completely safe passing NULL for
+        // the first parameter.
+        (*func)(NULL, event["parameter"]);
+    }
+}
diff --git a/indra/newview/lluilistener.h b/indra/newview/lluilistener.h
new file mode 100644
index 00000000000..ea904a99ff8
--- /dev/null
+++ b/indra/newview/lluilistener.h
@@ -0,0 +1,29 @@
+/**
+ * @file   lluilistener.h
+ * @author Nat Goodspeed
+ * @date   2009-08-18
+ * @brief  Engage named functions as specified by XUI
+ * 
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * Copyright (c) 2009, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+#if ! defined(LL_LLUILISTENER_H)
+#define LL_LLUILISTENER_H
+
+#include "lleventdispatcher.h"
+#include <string>
+
+class LLSD;
+
+class LLUIListener: public LLDispatchListener
+{
+public:
+    LLUIListener(const std::string& name);
+
+private:
+    void call(const LLSD& event) const;
+};
+
+#endif /* ! defined(LL_LLUILISTENER_H) */
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index a6157aa1e0b..67dcf6bcaeb 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -210,6 +210,7 @@
 #include "llwlparammanager.h"
 #include "llwaterparammanager.h"
 #include "llfloaternotificationsconsole.h"
+#include "lluilistener.h"
 
 #include "lltexlayer.h"
 
@@ -420,6 +421,8 @@ class LLMenuParcelObserver : public LLParcelObserver
 
 static LLMenuParcelObserver* gMenuParcelObserver = NULL;
 
+static LLUIListener sUIListener("UI");
+
 LLMenuParcelObserver::LLMenuParcelObserver()
 {
 	LLViewerParcelMgr::getInstance()->addObserver(this);
-- 
GitLab