|
1096
|
1 /**
|
|
|
2 * Copyright (c) 2006-2012 LOVE Development Team
|
|
|
3 *
|
|
|
4 * This software is provided 'as-is', without any express or implied
|
|
|
5 * warranty. In no event will the authors be held liable for any damages
|
|
|
6 * arising from the use of this software.
|
|
|
7 *
|
|
|
8 * Permission is granted to anyone to use this software for any purpose,
|
|
|
9 * including commercial applications, and to alter it and redistribute it
|
|
|
10 * freely, subject to the following restrictions:
|
|
|
11 *
|
|
|
12 * 1. The origin of this software must not be misrepresented; you must not
|
|
|
13 * claim that you wrote the original software. If you use this software
|
|
|
14 * in a product, an acknowledgment in the product documentation would be
|
|
|
15 * appreciated but is not required.
|
|
|
16 * 2. Altered source versions must be plainly marked as such, and must not be
|
|
|
17 * misrepresented as being the original software.
|
|
|
18 * 3. This notice may not be removed or altered from any source distribution.
|
|
|
19 **/
|
|
|
20
|
|
|
21 #include "Event.h"
|
|
|
22
|
|
|
23 using love::thread::Mutex;
|
|
|
24 using love::thread::Lock;
|
|
|
25
|
|
|
26 namespace love
|
|
|
27 {
|
|
|
28 namespace event
|
|
|
29 {
|
|
|
30
|
|
|
31 Message::Message(std::string name, Variant *a, Variant *b, Variant *c, Variant *d)
|
|
|
32 : name(name)
|
|
|
33 , nargs(0)
|
|
|
34 {
|
|
|
35 args[0] = a;
|
|
|
36 args[1] = b;
|
|
|
37 args[2] = c;
|
|
|
38 args[3] = d;
|
|
|
39 for (int i = 0; i < 4; i++)
|
|
|
40 {
|
|
|
41 if (!args[i])
|
|
|
42 continue;
|
|
|
43 args[i]->retain();
|
|
|
44 nargs++;
|
|
|
45 }
|
|
|
46 }
|
|
|
47
|
|
|
48 Message::~Message()
|
|
|
49 {
|
|
|
50 for (int i = 0; i < nargs; i++)
|
|
|
51 args[i]->release();
|
|
|
52 }
|
|
|
53
|
|
|
54 int Message::toLua(lua_State *L)
|
|
|
55 {
|
|
|
56 luax_pushstring(L, name);
|
|
|
57 for (int i = 0; i < nargs; i++)
|
|
|
58 args[i]->toLua(L);
|
|
|
59 return nargs+1;
|
|
|
60 }
|
|
|
61
|
|
|
62 Message *Message::fromLua(lua_State *L, int n)
|
|
|
63 {
|
|
|
64 std::string name = luax_checkstring(L, n);
|
|
|
65 n++;
|
|
|
66 Message *m = new Message(name);
|
|
|
67 for (int i = 0; i < 4; i++)
|
|
|
68 {
|
|
|
69 if (lua_isnoneornil(L, n+i))
|
|
|
70 break;
|
|
|
71 m->args[i] = Variant::fromLua(L, n+i);
|
|
|
72 if (!m->args[i])
|
|
|
73 {
|
|
|
74 delete m;
|
|
|
75 luaL_error(L, "Argument %d can't be stored safely\nExpected boolean, number, string or userdata.", n+i);
|
|
|
76 return NULL;
|
|
|
77 }
|
|
|
78 m->nargs++;
|
|
|
79 }
|
|
|
80 return m;
|
|
|
81 }
|
|
|
82
|
|
|
83 Event::~Event()
|
|
|
84 {
|
|
|
85 }
|
|
|
86
|
|
|
87 void Event::push(Message *msg)
|
|
|
88 {
|
|
|
89 Lock lock(mutex);
|
|
|
90 msg->retain();
|
|
|
91 queue.push(msg);
|
|
|
92 }
|
|
|
93
|
|
|
94 bool Event::poll(Message *&msg)
|
|
|
95 {
|
|
|
96 Lock lock(mutex);
|
|
|
97 if (queue.empty())
|
|
|
98 return false;
|
|
|
99 msg = queue.front();
|
|
|
100 queue.pop();
|
|
|
101 return true;
|
|
|
102 }
|
|
|
103
|
|
|
104 void Event::clear()
|
|
|
105 {
|
|
|
106 Lock lock(mutex);
|
|
|
107 while (!queue.empty())
|
|
|
108 {
|
|
|
109 queue.back()->release();
|
|
|
110 queue.pop();
|
|
|
111 }
|
|
|
112 }
|
|
|
113
|
|
|
114 bool Event::getConstant(const char *in, love::mouse::Mouse::Button &out)
|
|
|
115 {
|
|
|
116 return buttons.find(in, out);
|
|
|
117 }
|
|
|
118
|
|
|
119 bool Event::getConstant(love::mouse::Mouse::Button in, const char *&out)
|
|
|
120 {
|
|
|
121 return buttons.find(in, out);
|
|
|
122 }
|
|
|
123
|
|
|
124 bool Event::getConstant(const char *in, love::keyboard::Keyboard::Key &out)
|
|
|
125 {
|
|
|
126 return keys.find(in, out);
|
|
|
127 }
|
|
|
128
|
|
|
129 bool Event::getConstant(love::keyboard::Keyboard::Key in, const char *&out)
|
|
|
130 {
|
|
|
131 return keys.find(in, out);
|
|
|
132 }
|
|
|
133
|
|
|
134 StringMap<love::mouse::Mouse::Button, love::mouse::Mouse::BUTTON_MAX_ENUM>::Entry Event::buttonEntries[] =
|
|
|
135 {
|
|
|
136 {"l", love::mouse::Mouse::BUTTON_LEFT},
|
|
|
137 {"m", love::mouse::Mouse::BUTTON_MIDDLE},
|
|
|
138 {"r", love::mouse::Mouse::BUTTON_RIGHT},
|
|
|
139 {"wu", love::mouse::Mouse::BUTTON_WHEELUP},
|
|
|
140 {"wd", love::mouse::Mouse::BUTTON_WHEELDOWN},
|
|
|
141 {"x1", love::mouse::Mouse::BUTTON_X1},
|
|
|
142 {"x2", love::mouse::Mouse::BUTTON_X2},
|
|
|
143 };
|
|
|
144
|
|
|
145 StringMap<love::mouse::Mouse::Button, love::mouse::Mouse::BUTTON_MAX_ENUM> Event::buttons(Event::buttonEntries, sizeof(Event::buttonEntries));
|
|
|
146
|
|
|
147 StringMap<love::keyboard::Keyboard::Key, love::keyboard::Keyboard::KEY_MAX_ENUM>::Entry Event::keyEntries[] =
|
|
|
148 {
|
|
|
149 {"backspace", love::keyboard::Keyboard::KEY_BACKSPACE},
|
|
|
150 {"tab", love::keyboard::Keyboard::KEY_TAB},
|
|
|
151 {"clear", love::keyboard::Keyboard::KEY_CLEAR},
|
|
|
152 {"return", love::keyboard::Keyboard::KEY_RETURN},
|
|
|
153 {"pause", love::keyboard::Keyboard::KEY_PAUSE},
|
|
|
154 {"escape", love::keyboard::Keyboard::KEY_ESCAPE},
|
|
|
155 {" ", love::keyboard::Keyboard::KEY_SPACE},
|
|
|
156 {"!", love::keyboard::Keyboard::KEY_EXCLAIM},
|
|
|
157 {"\"", love::keyboard::Keyboard::KEY_QUOTEDBL},
|
|
|
158 {"#", love::keyboard::Keyboard::KEY_HASH},
|
|
|
159 {"$", love::keyboard::Keyboard::KEY_DOLLAR},
|
|
|
160 {"&", love::keyboard::Keyboard::KEY_AMPERSAND},
|
|
|
161 {"'", love::keyboard::Keyboard::KEY_QUOTE},
|
|
|
162 {"(", love::keyboard::Keyboard::KEY_LEFTPAREN},
|
|
|
163 {")", love::keyboard::Keyboard::KEY_RIGHTPAREN},
|
|
|
164 {"*", love::keyboard::Keyboard::KEY_ASTERISK},
|
|
|
165 {"+", love::keyboard::Keyboard::KEY_PLUS},
|
|
|
166 {",", love::keyboard::Keyboard::KEY_COMMA},
|
|
|
167 {"-", love::keyboard::Keyboard::KEY_MINUS},
|
|
|
168 {".", love::keyboard::Keyboard::KEY_PERIOD},
|
|
|
169 {"/", love::keyboard::Keyboard::KEY_SLASH},
|
|
|
170 {"0", love::keyboard::Keyboard::KEY_0},
|
|
|
171 {"1", love::keyboard::Keyboard::KEY_1},
|
|
|
172 {"2", love::keyboard::Keyboard::KEY_2},
|
|
|
173 {"3", love::keyboard::Keyboard::KEY_3},
|
|
|
174 {"4", love::keyboard::Keyboard::KEY_4},
|
|
|
175 {"5", love::keyboard::Keyboard::KEY_5},
|
|
|
176 {"6", love::keyboard::Keyboard::KEY_6},
|
|
|
177 {"7", love::keyboard::Keyboard::KEY_7},
|
|
|
178 {"8", love::keyboard::Keyboard::KEY_8},
|
|
|
179 {"9", love::keyboard::Keyboard::KEY_9},
|
|
|
180 {":", love::keyboard::Keyboard::KEY_COLON},
|
|
|
181 {";", love::keyboard::Keyboard::KEY_SEMICOLON},
|
|
|
182 {"<", love::keyboard::Keyboard::KEY_LESS},
|
|
|
183 {"=", love::keyboard::Keyboard::KEY_EQUALS},
|
|
|
184 {">", love::keyboard::Keyboard::KEY_GREATER},
|
|
|
185 {"?", love::keyboard::Keyboard::KEY_QUESTION},
|
|
|
186 {"@", love::keyboard::Keyboard::KEY_AT},
|
|
|
187
|
|
|
188 {"[", love::keyboard::Keyboard::KEY_LEFTBRACKET},
|
|
|
189 {"\\", love::keyboard::Keyboard::KEY_BACKSLASH},
|
|
|
190 {"]", love::keyboard::Keyboard::KEY_RIGHTBRACKET},
|
|
|
191 {"^", love::keyboard::Keyboard::KEY_CARET},
|
|
|
192 {"_", love::keyboard::Keyboard::KEY_UNDERSCORE},
|
|
|
193 {"`", love::keyboard::Keyboard::KEY_BACKQUOTE},
|
|
|
194 {"a", love::keyboard::Keyboard::KEY_A},
|
|
|
195 {"b", love::keyboard::Keyboard::KEY_B},
|
|
|
196 {"c", love::keyboard::Keyboard::KEY_C},
|
|
|
197 {"d", love::keyboard::Keyboard::KEY_D},
|
|
|
198 {"e", love::keyboard::Keyboard::KEY_E},
|
|
|
199 {"f", love::keyboard::Keyboard::KEY_F},
|
|
|
200 {"g", love::keyboard::Keyboard::KEY_G},
|
|
|
201 {"h", love::keyboard::Keyboard::KEY_H},
|
|
|
202 {"i", love::keyboard::Keyboard::KEY_I},
|
|
|
203 {"j", love::keyboard::Keyboard::KEY_J},
|
|
|
204 {"k", love::keyboard::Keyboard::KEY_K},
|
|
|
205 {"l", love::keyboard::Keyboard::KEY_L},
|
|
|
206 {"m", love::keyboard::Keyboard::KEY_M},
|
|
|
207 {"n", love::keyboard::Keyboard::KEY_N},
|
|
|
208 {"o", love::keyboard::Keyboard::KEY_O},
|
|
|
209 {"p", love::keyboard::Keyboard::KEY_P},
|
|
|
210 {"q", love::keyboard::Keyboard::KEY_Q},
|
|
|
211 {"r", love::keyboard::Keyboard::KEY_R},
|
|
|
212 {"s", love::keyboard::Keyboard::KEY_S},
|
|
|
213 {"t", love::keyboard::Keyboard::KEY_T},
|
|
|
214 {"u", love::keyboard::Keyboard::KEY_U},
|
|
|
215 {"v", love::keyboard::Keyboard::KEY_V},
|
|
|
216 {"w", love::keyboard::Keyboard::KEY_W},
|
|
|
217 {"x", love::keyboard::Keyboard::KEY_X},
|
|
|
218 {"y", love::keyboard::Keyboard::KEY_Y},
|
|
|
219 {"z", love::keyboard::Keyboard::KEY_Z},
|
|
|
220 {"delete", love::keyboard::Keyboard::KEY_DELETE},
|
|
|
221
|
|
|
222 {"kp0", love::keyboard::Keyboard::KEY_KP0},
|
|
|
223 {"kp1", love::keyboard::Keyboard::KEY_KP1},
|
|
|
224 {"kp2", love::keyboard::Keyboard::KEY_KP2},
|
|
|
225 {"kp3", love::keyboard::Keyboard::KEY_KP3},
|
|
|
226 {"kp4", love::keyboard::Keyboard::KEY_KP4},
|
|
|
227 {"kp5", love::keyboard::Keyboard::KEY_KP5},
|
|
|
228 {"kp6", love::keyboard::Keyboard::KEY_KP6},
|
|
|
229 {"kp7", love::keyboard::Keyboard::KEY_KP7},
|
|
|
230 {"kp8", love::keyboard::Keyboard::KEY_KP8},
|
|
|
231 {"kp9", love::keyboard::Keyboard::KEY_KP9},
|
|
|
232 {"kp.", love::keyboard::Keyboard::KEY_KP_PERIOD},
|
|
|
233 {"kp/", love::keyboard::Keyboard::KEY_KP_DIVIDE},
|
|
|
234 {"kp*", love::keyboard::Keyboard::KEY_KP_MULTIPLY},
|
|
|
235 {"kp-", love::keyboard::Keyboard::KEY_KP_MINUS},
|
|
|
236 {"kp+", love::keyboard::Keyboard::KEY_KP_PLUS},
|
|
|
237 {"kpenter", love::keyboard::Keyboard::KEY_KP_ENTER},
|
|
|
238 {"kp=", love::keyboard::Keyboard::KEY_KP_EQUALS},
|
|
|
239
|
|
|
240 {"up", love::keyboard::Keyboard::KEY_UP},
|
|
|
241 {"down", love::keyboard::Keyboard::KEY_DOWN},
|
|
|
242 {"right", love::keyboard::Keyboard::KEY_RIGHT},
|
|
|
243 {"left", love::keyboard::Keyboard::KEY_LEFT},
|
|
|
244 {"insert", love::keyboard::Keyboard::KEY_INSERT},
|
|
|
245 {"home", love::keyboard::Keyboard::KEY_HOME},
|
|
|
246 {"end", love::keyboard::Keyboard::KEY_END},
|
|
|
247 {"pageup", love::keyboard::Keyboard::KEY_PAGEUP},
|
|
|
248 {"pagedown", love::keyboard::Keyboard::KEY_PAGEDOWN},
|
|
|
249
|
|
|
250 {"f1", love::keyboard::Keyboard::KEY_F1},
|
|
|
251 {"f2", love::keyboard::Keyboard::KEY_F2},
|
|
|
252 {"f3", love::keyboard::Keyboard::KEY_F3},
|
|
|
253 {"f4", love::keyboard::Keyboard::KEY_F4},
|
|
|
254 {"f5", love::keyboard::Keyboard::KEY_F5},
|
|
|
255 {"f6", love::keyboard::Keyboard::KEY_F6},
|
|
|
256 {"f7", love::keyboard::Keyboard::KEY_F7},
|
|
|
257 {"f8", love::keyboard::Keyboard::KEY_F8},
|
|
|
258 {"f9", love::keyboard::Keyboard::KEY_F9},
|
|
|
259 {"f10", love::keyboard::Keyboard::KEY_F10},
|
|
|
260 {"f11", love::keyboard::Keyboard::KEY_F11},
|
|
|
261 {"f12", love::keyboard::Keyboard::KEY_F12},
|
|
|
262 {"f13", love::keyboard::Keyboard::KEY_F13},
|
|
|
263 {"f14", love::keyboard::Keyboard::KEY_F14},
|
|
|
264 {"f15", love::keyboard::Keyboard::KEY_F15},
|
|
|
265
|
|
|
266 {"numlock", love::keyboard::Keyboard::KEY_NUMLOCK},
|
|
|
267 {"capslock", love::keyboard::Keyboard::KEY_CAPSLOCK},
|
|
|
268 {"scrollock", love::keyboard::Keyboard::KEY_SCROLLOCK},
|
|
|
269 {"rshift", love::keyboard::Keyboard::KEY_RSHIFT},
|
|
|
270 {"lshift", love::keyboard::Keyboard::KEY_LSHIFT},
|
|
|
271 {"rctrl", love::keyboard::Keyboard::KEY_RCTRL},
|
|
|
272 {"lctrl", love::keyboard::Keyboard::KEY_LCTRL},
|
|
|
273 {"ralt", love::keyboard::Keyboard::KEY_RALT},
|
|
|
274 {"lalt", love::keyboard::Keyboard::KEY_LALT},
|
|
|
275 {"rmeta", love::keyboard::Keyboard::KEY_RMETA},
|
|
|
276 {"lmeta", love::keyboard::Keyboard::KEY_LMETA},
|
|
|
277 {"lsuper", love::keyboard::Keyboard::KEY_LSUPER},
|
|
|
278 {"rsuper", love::keyboard::Keyboard::KEY_RSUPER},
|
|
|
279 {"mode", love::keyboard::Keyboard::KEY_MODE},
|
|
|
280 {"compose", love::keyboard::Keyboard::KEY_COMPOSE},
|
|
|
281
|
|
|
282 {"help", love::keyboard::Keyboard::KEY_HELP},
|
|
|
283 {"print", love::keyboard::Keyboard::KEY_PRINT},
|
|
|
284 {"sysreq", love::keyboard::Keyboard::KEY_SYSREQ},
|
|
|
285 {"break", love::keyboard::Keyboard::KEY_BREAK},
|
|
|
286 {"menu", love::keyboard::Keyboard::KEY_MENU},
|
|
|
287 {"power", love::keyboard::Keyboard::KEY_POWER},
|
|
|
288 {"euro", love::keyboard::Keyboard::KEY_EURO},
|
|
|
289 {"undo", love::keyboard::Keyboard::KEY_UNDO},
|
|
|
290
|
|
|
291 {"unknown", love::keyboard::Keyboard::KEY_UNKNOWN},
|
|
|
292 };
|
|
|
293
|
|
|
294 StringMap<love::keyboard::Keyboard::Key, love::keyboard::Keyboard::KEY_MAX_ENUM> Event::keys(Event::keyEntries, sizeof(Event::keyEntries));
|
|
|
295
|
|
|
296 } // event
|
|
|
297 } // love
|