DUDS
Distributed Update of Data from Something
InputHandlers.hpp
Go to the documentation of this file.
1 /*
2  * This file is part of the DUDS project. It is subject to the BSD-style
3  * license terms in the LICENSE file found in the top-level directory of this
4  * distribution and at https://github.com/jjackowski/duds/blob/master/LICENSE.
5  * No part of DUDS, including this file, may be copied, modified, propagated,
6  * or distributed except according to the terms contained in the LICENSE file.
7  *
8  * Copyright (C) 2020 Jeff Jackowski
9  */
10 #ifndef INPUTHANDLERS_HPP
11 #define INPUTHANDLERS_HPP
12 
13 #include <unordered_map>
14 #include <boost/signals2/signal.hpp>
16 
17 #ifdef linux
18 // !@?!#?!#?
19 #undef linux
20 #endif
21 
22 namespace duds { namespace os { namespace linux {
23 
29 typedef boost::signals2::signal<void(EventTypeCode etc, std::int32_t value)>
31 
42  typedef std::unordered_map<EventTypeCode, InputSignal> InputMap;
46  InputMap receivers;
51 public:
59  void handleEvent(EventTypeCode etc, std::int32_t value);
63  void clear();
72  boost::signals2::connection connect(
73  EventTypeCode etc,
74  const InputSignal::slot_type &slot,
75  boost::signals2::connect_position at = boost::signals2::at_back
76  ) {
77  return receivers[etc].connect(slot, at);
78  }
87  boost::signals2::connection connect(
88  EventTypeCode etc,
89  const InputSignal::group_type &group,
90  const InputSignal::slot_type &slot,
91  boost::signals2::connect_position at = boost::signals2::at_back
92  ) {
93  return receivers[etc].connect(group, slot, at);
94  }
103  boost::signals2::connection connectExtended(
104  EventTypeCode etc,
105  const InputSignal::extended_slot_type &slot,
106  boost::signals2::connect_position at = boost::signals2::at_back
107  ) {
108  return receivers[etc].connect_extended(slot, at);
109  }
118  boost::signals2::connection connectExtended(
119  EventTypeCode etc,
120  const InputSignal::group_type &group,
121  const InputSignal::extended_slot_type &slot,
122  boost::signals2::connect_position at = boost::signals2::at_back
123  ) {
124  return receivers[etc].connect_extended(group, slot, at);
125  }
134  EventTypeCode etc,
135  const InputSignal::group_type &group
136  ) {
137  receivers[etc].disconnect(group);
138  }
146  template<typename Slot>
147  void disconnect(EventTypeCode etc, const Slot &slotFunc) {
148  receivers[etc].disconnect(slotFunc);
149  }
156  receivers.erase(etc);
157  }
164  boost::signals2::connection connect(
165  const InputSignal::slot_type &slot,
166  boost::signals2::connect_position at = boost::signals2::at_back
167  ) {
168  return defReceiver.connect(slot, at);
169  }
176  boost::signals2::connection connect(
177  const InputSignal::group_type &group,
178  const InputSignal::slot_type &slot,
179  boost::signals2::connect_position at = boost::signals2::at_back
180  ) {
181  return defReceiver.connect(group, slot, at);
182  }
189  boost::signals2::connection connectExtended(
190  const InputSignal::extended_slot_type &slot,
191  boost::signals2::connect_position at = boost::signals2::at_back
192  ) {
193  return defReceiver.connect_extended(slot, at);
194  }
201  boost::signals2::connection connectExtended(
202  const InputSignal::group_type &group,
203  const InputSignal::extended_slot_type &slot,
204  boost::signals2::connect_position at = boost::signals2::at_back
205  ) {
206  return defReceiver.connect_extended(group, slot, at);
207  }
215  const InputSignal::group_type &group
216  ) {
217  defReceiver.disconnect(group);
218  }
225  template<typename Slot>
226  void disconnect(const Slot &slotFunc) {
227  defReceiver.disconnect(slotFunc);
228  }
232  void disconnectAll() {
233  defReceiver.disconnect_all_slots();
234  }
235 };
236 
240 typedef std::shared_ptr<InputHandlers> InputHandlersSptr;
241 
242 } } }
243 
244 #endif // #ifndef INPUTHANDLERS_HPP
boost::signals2::connection connect(EventTypeCode etc, const InputSignal::group_type &group, const InputSignal::slot_type &slot, boost::signals2::connect_position at=boost::signals2::at_back)
Make a connection to an input event signal.
void disconnectAll()
Disconnects all slots from the default input event signal.
boost::signals2::connection connectExtended(const InputSignal::extended_slot_type &slot, boost::signals2::connect_position at=boost::signals2::at_back)
Make a connection to the default input event signal.
boost::signals2::connection connectExtended(const InputSignal::group_type &group, const InputSignal::extended_slot_type &slot, boost::signals2::connect_position at=boost::signals2::at_back)
Make a connection to the default input event signal.
void disconnect(EventTypeCode etc, const Slot &slotFunc)
Disconnect a slot from an input event signal.
boost::signals2::connection connectExtended(EventTypeCode etc, const InputSignal::group_type &group, const InputSignal::extended_slot_type &slot, boost::signals2::connect_position at=boost::signals2::at_back)
Make a connection to an input event signal.
InputMap receivers
Relates events to signal handlers.
std::shared_ptr< InputHandlers > InputHandlersSptr
Shared pointer to a InputHandlers class.
void disconnect(EventTypeCode etc, const InputSignal::group_type &group)
Disconnect a group from an input event signal.
void handleEvent(EventTypeCode etc, std::int32_t value)
Dispatches the provided input event to the appropriate InputSignal.
boost::signals2::connection connectExtended(EventTypeCode etc, const InputSignal::extended_slot_type &slot, boost::signals2::connect_position at=boost::signals2::at_back)
Make a connection to an input event signal.
boost::signals2::signal< void(EventTypeCode etc, std::int32_t value)> InputSignal
The signal type that will handle input events.
Combines an event type and an event code, as defined by libevdev, for the purpose of using a combinat...
void disconnect(const InputSignal::group_type &group)
Disconnect a group from the default input event signal.
boost::signals2::connection connect(EventTypeCode etc, const InputSignal::slot_type &slot, boost::signals2::connect_position at=boost::signals2::at_back)
Make a connection to an input event signal.
void clear()
Removes all input handlers.
boost::signals2::connection connect(const InputSignal::group_type &group, const InputSignal::slot_type &slot, boost::signals2::connect_position at=boost::signals2::at_back)
Make a connection to the default input event signal.
boost::signals2::connection connect(const InputSignal::slot_type &slot, boost::signals2::connect_position at=boost::signals2::at_back)
Make a connection to the default input event signal.
InputSignal defReceiver
Handles input for events that are not listed in the receivers InputMap.
std::unordered_map< EventTypeCode, InputSignal > InputMap
A type that relates events to signal handlers.
Maintains a set of InputSignal objects to respond to input events.
void disconnect(const Slot &slotFunc)
Disconnect a slot from the default input event signal.
void disconnectAll(EventTypeCode etc)
Disconnects all slots from an input event signal.