1: /*
2: ============================================================================
3: xoblite™ -> an advanced "extended shell" for Microsoft® Windows® 11
4: Copyright © 2002-2026 Karl Henrik Henriksson [qwilk/@xoblite]
5: Copyright © 2001-2004 The Blackbox for Windows Development Team
6: http://xoblite.net/ + https://github.com/xoblite/
7: ============================================================================
8:
9: Blackbox for Windows is free software, released under the
10: GNU General Public License (GPL version 2 or later), with an extension
11: that allows linking of proprietary modules under a controlled interface.
12: What this means is that plugins etc. are allowed to be released
13: under any license the author wishes. Please note, however, that the
14: original Blackbox gradient math code used in Blackbox for Windows
15: is available under the BSD license.
16:
17: http://www.fsf.org/licenses/gpl.html
18: http://www.fsf.org/licenses/gpl-faq.html#LinkingOverControlledInterface
19: http://www.xfree86.org/3.3.6/COPYRIGHT2.html#5
20:
21: This program is distributed in the hope that it will be useful,
22: but WITHOUT ANY WARRANTY; without even the implied warranty of
23: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24: GNU General Public License for more details.
25:
26: For additional license information, please read the included license.html.
27:
28: ============================================================================
29: */
30:
31: #include "MessageManager.h"
32:
33: //===========================================================================
34:
35: MessageManager::MessageManager()
36: {
37: }
38:
39: MessageManager::~MessageManager()
40: {
41: ClearMessages();
42: }
43:
44: //===========================================================================
45:
46: void MessageManager::AddMessage(UINT message, HWND window)
47: {
48: WindowSet *winSet;
49: MsgMap::iterator iter = msgs.find(message);
50:
51: if (iter == msgs.end())
52: {
53: winSet = new WindowSet();
54: msgs[message] = winSet;
55: }
56: else winSet = iter->second;
57:
58: winSet->insert(window);
59: }
60:
61: //====================
62:
63: void MessageManager::RemoveMessage(UINT message, HWND window)
64: {
65: MsgMap::iterator iter = msgs.find(message);
66:
67: if (iter == msgs.end()) return;
68:
69: iter->second->erase(window);
70:
71: if (iter->second->size() == 0)
72: {
73: delete iter->second;
74: msgs.erase(iter);
75: }
76: }
77:
78: //====================
79:
80: void MessageManager::ClearMessages()
81: {
82: MsgMap::iterator iter = msgs.begin();
83:
84: while (iter != msgs.end())
85: {
86: if (iter->second) delete iter->second;
87: iter++;
88: }
89:
90: msgs.clear();
91: }
92:
93: //====================
94:
95: bool MessageManager::SendMessage(UINT message, WPARAM wParam, LPARAM lParam, LRESULT *result)
96: {
97: WindowSet *winSet;
98: MsgMap::iterator iter1 = msgs.find(message);
99:
100: if (result) *result = 0;
101:
102: if (iter1 == msgs.end()) return false;
103:
104: winSet = iter1->second;
105:
106: WindowSet::iterator iter2 = winSet->begin();
107:
108: // Use the first one for the result...
109: if (iter2 != winSet->end())
110: {
111: if (result)
112: {
113: *result = ::SendMessage((HWND)*iter2, message, wParam, lParam);
114: iter2++;
115: }
116: }
117:
118: while (iter2 != winSet->end())
119: {
120: ::SendMessage((HWND)*iter2, message, wParam, lParam);
121: iter2++;
122: }
123:
124: return true;
125: }
126:
127: //====================
128:
129: void MessageManager::PostMessage(UINT message, WPARAM wParam, LPARAM lParam)
130: {
131: WindowSet *winSet;
132: MsgMap::iterator iter1;
133:
134: iter1 = msgs.find(message);
135:
136: if (iter1 == msgs.end()) return;
137:
138: winSet = iter1->second;
139:
140: WindowSet::iterator iter2 = winSet->begin();
141:
142: while (iter2 != winSet->end())
143: {
144: ::PostMessage((HWND)*iter2, message, wParam, lParam);
145: iter2++;
146: }
147: }
148:
149: //====================
150:
151: bool MessageManager::HandlerExists(UINT message)
152: {
153: if (msgs.find(message) != msgs.end()) return true;
154:
155: return false;
156: }
157:
158: //===========================================================================
159: