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.h81
1 files changed, 81 insertions, 0 deletions
diff --git a/widget/windows/WindowHook.h b/widget/windows/WindowHook.h
new file mode 100644
index 000000000..69df4eb2f
--- /dev/null
+++ b/widget/windows/WindowHook.h
@@ -0,0 +1,81 @@
+/* -*- 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);
+ }
+ 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;
+};
+
+}
+}
+
+#endif // __mozilla_WindowHook_h__