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: