1 // EventManager.hh
2 // Copyright (c) 2002 Henrik Kinnunen (fluxgen at fluxbox dot org)
3 //
4 // Permission is hereby granted, free of charge, to any person obtaining a
5 // copy of this software and associated documentation files (the "Software"),
6 // to deal in the Software without restriction, including without limitation
7 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 // and/or sell copies of the Software, and to permit persons to whom the
9 // Software is furnished to do so, subject to the following conditions:
10 //
11 // The above copyright notice and this permission notice shall be included in
12 // all copies or substantial portions of the Software.
13 //
14 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.	IN NO EVENT SHALL
17 // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
20 // DEALINGS IN THE SOFTWARE.
21 
22 // $Id: EventManager.hh 3864 2005-01-24 18:02:34Z mathias $
23 
24 #include "EventHandler.hh"
25 #include <map>
26 
27 namespace FbTk {
28 
29 class FbWindow;
30 
31 /**
32    singleton mediator for EventHandlers
33 */
34 class EventManager {
35 public:
36     static EventManager *instance();
37 
38     void handleEvent(XEvent &ev);
39     // adds a parent to listen to the childrens events
40     void addParent(EventHandler &ev, const FbWindow &parent);
41     void add(EventHandler &ev, const FbWindow &win);
42     void remove(const FbWindow &win);
add(EventHandler & ev,Window win)43     void add(EventHandler &ev, Window win) { registerEventHandler(ev, win); }
remove(Window win)44     void remove(Window win) { unregisterEventHandler(win); }
45 
46     EventHandler *find(Window win);
47 
48     // Some events have the parent window as the xany.window
49     // This function always returns the actual window member of the event structure
50     static Window getEventWindow(XEvent &ev);
51 
52     void registerEventHandler(EventHandler &ev, Window win);
53     void unregisterEventHandler(Window win);
54 
55 private:
EventManager()56     EventManager() { }
57     ~EventManager();
58     void dispatch(Window win, XEvent &event, bool parent = false);
59 
60     typedef std::map<Window, EventHandler *> EventHandlerMap;
61     EventHandlerMap m_eventhandlers;
62     EventHandlerMap m_parent;
63 };
64 
65 } //end namespace FbTk
66