summaryrefslogtreecommitdiffstats
path: root/widget/windows/WindowHook.h
diff options
context:
space:
mode:
Diffstat (limited to 'widget/windows/WindowHook.h')
-rw-r--r--widget/windows/WindowHook.h76
1 files changed, 76 insertions, 0 deletions
diff --git a/widget/windows/WindowHook.h b/widget/windows/WindowHook.h
new file mode 100644
index 0000000000..1d1f4b02da
--- /dev/null
+++ b/widget/windows/WindowHook.h
@@ -0,0 +1,76 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef __mozilla_WindowHook_h__
+#define __mozilla_WindowHook_h__
+
+#include <windows.h>
+
+#include <nsHashKeys.h>
+#include <nsClassHashtable.h>
+#include <nsTArray.h>
+
+#include "nsAppShell.h"
+
+class nsWindow;
+
+namespace mozilla {
+namespace widget {
+
+struct MSGResult;
+
+class WindowHook {
+ public:
+ // It is expected that most callbacks will return false
+ typedef bool (*Callback)(void* aContext, HWND hWnd, UINT nMsg, WPARAM wParam,
+ LPARAM lParam, LRESULT* aResult);
+
+ nsresult AddHook(UINT nMsg, Callback callback, void* context);
+ nsresult RemoveHook(UINT nMsg, Callback callback, void* context);
+ nsresult AddMonitor(UINT nMsg, Callback callback, void* context);
+ nsresult RemoveMonitor(UINT nMsg, Callback callback, void* context);
+
+ private:
+ struct CallbackData {
+ Callback cb;
+ void* context;
+
+ CallbackData() : cb(nullptr), context(nullptr) {}
+ CallbackData(Callback cb, void* ctx) : cb(cb), context(ctx) {}
+ bool Invoke(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam,
+ LRESULT* aResult);
+ bool operator==(const CallbackData& rhs) const {
+ return cb == rhs.cb && context == rhs.context;
+ }
+ bool operator!=(const CallbackData& rhs) const { return !(*this == rhs); }
+ explicit operator bool() const { return !!cb; }
+ };
+
+ typedef nsTArray<CallbackData> CallbackDataArray;
+ struct MessageData {
+ UINT nMsg;
+ CallbackData hook;
+ CallbackDataArray monitors;
+ };
+
+ bool Notify(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam,
+ MSGResult& aResult);
+
+ MessageData* Lookup(UINT nMsg);
+ MessageData* LookupOrCreate(UINT nMsg);
+ void DeleteIfEmpty(MessageData* data);
+
+ typedef nsTArray<MessageData> MessageDataArray;
+ MessageDataArray mMessageData;
+
+ // For Notify
+ friend class ::nsWindow;
+};
+
+} // namespace widget
+} // namespace mozilla
+
+#endif // __mozilla_WindowHook_h__