source: xplra/src/plugin/src/xplra/HotkeyHandler.h@ 45:72d5105fcb72

Last change on this file since 45:72d5105fcb72 was 45:72d5105fcb72, checked in by István Váradi <ivaradi@…>, 11 years ago

Implemented hotkey handling

File size: 5.1 KB
Line 
1// Copyright (c) 2013 by István Váradi
2
3// This file is part of XPLRA, a remote-access plugin for X-Plane
4
5// Redistribution and use in source and binary forms, with or without
6// modification, are permitted provided that the following conditions are met:
7
8// 1. Redistributions of source code must retain the above copyright notice, this
9// list of conditions and the following disclaimer.
10// 2. Redistributions in binary form must reproduce the above copyright notice,
11// this list of conditions and the following disclaimer in the documentation
12// and/or other materials provided with the distribution.
13
14// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
15// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
18// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
19// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
20// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
21// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
23// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24
25// The views and conclusions contained in the software and documentation are those
26// of the authors and should not be interpreted as representing official policies,
27// either expressed or implied, of the FreeBSD Project.
28
29#ifndef XPLRA_HOTKEYHANDLER_H
30#define XPLRA_HOTKEYHANDLER_H
31//------------------------------------------------------------------------------
32
33#include <hu/varadiistvan/scpl/Mutex.h>
34
35#include <XPLMDefs.h>
36
37#include <list>
38
39#include <inttypes.h>
40
41//------------------------------------------------------------------------------
42
43namespace hu { namespace varadiistvan { namespace scpl { namespace io {
44
45class DataStream;
46
47} } } }
48
49//------------------------------------------------------------------------------
50
51namespace xplra {
52
53//------------------------------------------------------------------------------
54
55/**
56 * The handler for hotkeys.
57 */
58class HotkeyHandler
59{
60public:
61 /**
62 * A set of hotkeys for a client.
63 */
64 class Hotkeys
65 {
66 private:
67 /**
68 * The number of hotkeys.
69 */
70 size_t numHotkeys;
71
72 /**
73 * The hotkey codes.
74 */
75 uint16_t* hotkeys;
76
77 /**
78 * The array of indicators whether the hotkey at the given
79 * index in the array of codes has been pressed.
80 */
81 uint8_t* pressed;
82
83 public:
84 /**
85 * Construct the set of hotkeys by reading the data from the
86 * given data stream.
87 */
88 Hotkeys(size_t numHotkeys, hu::varadiistvan::scpl::io::DataStream& stream);
89
90 /**
91 * Destroy the set of hotkeys.
92 */
93 ~Hotkeys();
94
95 /**
96 * Determine if this hotkey set is valid.
97 */
98 bool isValid() const;
99
100 /**
101 * Handle the hotkey with the given code. If it matches any of
102 * the codes registered, the corresponding value in the
103 * pressed array will be set atomically.
104 *
105 * @return whether the hotkey was handled or not.
106 */
107 bool handleKey(uint16_t code);
108
109 /**
110 * Write the pressed indicators into the given stream. It also
111 * clears the indicators.
112 */
113 void writePressed(hu::varadiistvan::scpl::io::DataStream& stream);
114 };
115
116 friend class Hotkeys;
117
118private:
119 /**
120 * Type for the the list of hotkey sets.
121 */
122 typedef std::list<Hotkeys*> hotkeySets_t;
123
124 /**
125 * The callback function receiving the keypresses.
126 */
127 static int keyCallback(char c, XPLMKeyFlags flags, char virtualKey,
128 void* refCon);
129
130 /**
131 * Mutex to protect some common data structures.
132 */
133 hu::varadiistvan::scpl::Mutex mutex;
134
135 /**
136 * The list of hotkey sets.
137 */
138 hotkeySets_t hotkeySets;
139
140public:
141 /**
142 * Construct the hotkey handler.
143 */
144 HotkeyHandler();
145
146 /**
147 * Register the given set of hotkeys.
148 */
149 void registerHotkeys(Hotkeys* hotkeys);
150
151 /**
152 * Unregister the given set of hotkeys.
153 */
154 void unregisterHotkeys(Hotkeys* hotkeys);
155
156protected:
157 /**
158 * Handle the given hotkey code.
159 *
160 * @return true if the hotkey was handled, false otherwise.
161 */
162 bool handleKey(char c, XPLMKeyFlags flags, char virtualKey);
163};
164
165//------------------------------------------------------------------------------
166// Inline definitions
167//------------------------------------------------------------------------------
168
169inline bool HotkeyHandler::Hotkeys::isValid() const
170{
171 return hotkeys!=0;
172}
173
174//------------------------------------------------------------------------------
175
176} /* namespace xplra */
177
178//------------------------------------------------------------------------------
179#endif // XPLRA_HOTKEYHANDLER_H
180
181// Local Variables:
182// mode: C++
183// c-basic-offset: 4
184// indent-tabs-mode: nil
185// End:
Note: See TracBrowser for help on using the repository browser.