Mercurial > love-experiments
annotate src/modules/event/Event.cpp @ 1098:a74672ba1320 minor
Merge in channels from love-experiments
Rewritten love.thread and changed communication
method from weird system before, to channels.
| author | Bart van Strien <bart.bes+projects@gmail.com> |
|---|---|
| date | Wed, 04 Jul 2012 17:15:16 +0200 |
| parents | 86a44f2bc38f |
| children | 730ed5f01ab0 |
| rev | line source |
|---|---|
| 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 | |
|
1098
a74672ba1320
Merge in channels from love-experiments
Bart van Strien <bart.bes+projects@gmail.com>
parents:
1096
diff
changeset
|
83 Event::Event() |
|
a74672ba1320
Merge in channels from love-experiments
Bart van Strien <bart.bes+projects@gmail.com>
parents:
1096
diff
changeset
|
84 { |
|
a74672ba1320
Merge in channels from love-experiments
Bart van Strien <bart.bes+projects@gmail.com>
parents:
1096
diff
changeset
|
85 mutex = thread::newMutex(); |
|
a74672ba1320
Merge in channels from love-experiments
Bart van Strien <bart.bes+projects@gmail.com>
parents:
1096
diff
changeset
|
86 } |
|
a74672ba1320
Merge in channels from love-experiments
Bart van Strien <bart.bes+projects@gmail.com>
parents:
1096
diff
changeset
|
87 |
| 1096 | 88 Event::~Event() |
| 89 { | |
|
1098
a74672ba1320
Merge in channels from love-experiments
Bart van Strien <bart.bes+projects@gmail.com>
parents:
1096
diff
changeset
|
90 delete mutex; |
| 1096 | 91 } |
| 92 | |
| 93 void Event::push(Message *msg) | |
| 94 { | |
| 95 Lock lock(mutex); | |
| 96 msg->retain(); | |
| 97 queue.push(msg); | |
| 98 } | |
| 99 | |
| 100 bool Event::poll(Message *&msg) | |
| 101 { | |
| 102 Lock lock(mutex); | |
| 103 if (queue.empty()) | |
| 104 return false; | |
| 105 msg = queue.front(); | |
| 106 queue.pop(); | |
| 107 return true; | |
| 108 } | |
| 109 | |
| 110 void Event::clear() | |
| 111 { | |
| 112 Lock lock(mutex); | |
| 113 while (!queue.empty()) | |
| 114 { | |
| 115 queue.back()->release(); | |
| 116 queue.pop(); | |
| 117 } | |
| 118 } | |
| 119 | |
| 120 bool Event::getConstant(const char *in, love::mouse::Mouse::Button &out) | |
| 121 { | |
| 122 return buttons.find(in, out); | |
| 123 } | |
| 124 | |
| 125 bool Event::getConstant(love::mouse::Mouse::Button in, const char *&out) | |
| 126 { | |
| 127 return buttons.find(in, out); | |
| 128 } | |
| 129 | |
| 130 bool Event::getConstant(const char *in, love::keyboard::Keyboard::Key &out) | |
| 131 { | |
| 132 return keys.find(in, out); | |
| 133 } | |
| 134 | |
| 135 bool Event::getConstant(love::keyboard::Keyboard::Key in, const char *&out) | |
| 136 { | |
| 137 return keys.find(in, out); | |
| 138 } | |
| 139 | |
| 140 StringMap<love::mouse::Mouse::Button, love::mouse::Mouse::BUTTON_MAX_ENUM>::Entry Event::buttonEntries[] = | |
| 141 { | |
| 142 {"l", love::mouse::Mouse::BUTTON_LEFT}, | |
| 143 {"m", love::mouse::Mouse::BUTTON_MIDDLE}, | |
| 144 {"r", love::mouse::Mouse::BUTTON_RIGHT}, | |
| 145 {"wu", love::mouse::Mouse::BUTTON_WHEELUP}, | |
| 146 {"wd", love::mouse::Mouse::BUTTON_WHEELDOWN}, | |
| 147 {"x1", love::mouse::Mouse::BUTTON_X1}, | |
| 148 {"x2", love::mouse::Mouse::BUTTON_X2}, | |
| 149 }; | |
| 150 | |
| 151 StringMap<love::mouse::Mouse::Button, love::mouse::Mouse::BUTTON_MAX_ENUM> Event::buttons(Event::buttonEntries, sizeof(Event::buttonEntries)); | |
| 152 | |
| 153 StringMap<love::keyboard::Keyboard::Key, love::keyboard::Keyboard::KEY_MAX_ENUM>::Entry Event::keyEntries[] = | |
| 154 { | |
| 155 {"backspace", love::keyboard::Keyboard::KEY_BACKSPACE}, | |
| 156 {"tab", love::keyboard::Keyboard::KEY_TAB}, | |
| 157 {"clear", love::keyboard::Keyboard::KEY_CLEAR}, | |
| 158 {"return", love::keyboard::Keyboard::KEY_RETURN}, | |
| 159 {"pause", love::keyboard::Keyboard::KEY_PAUSE}, | |
| 160 {"escape", love::keyboard::Keyboard::KEY_ESCAPE}, | |
| 161 {" ", love::keyboard::Keyboard::KEY_SPACE}, | |
| 162 {"!", love::keyboard::Keyboard::KEY_EXCLAIM}, | |
| 163 {"\"", love::keyboard::Keyboard::KEY_QUOTEDBL}, | |
| 164 {"#", love::keyboard::Keyboard::KEY_HASH}, | |
| 165 {"$", love::keyboard::Keyboard::KEY_DOLLAR}, | |
| 166 {"&", love::keyboard::Keyboard::KEY_AMPERSAND}, | |
| 167 {"'", love::keyboard::Keyboard::KEY_QUOTE}, | |
| 168 {"(", love::keyboard::Keyboard::KEY_LEFTPAREN}, | |
| 169 {")", love::keyboard::Keyboard::KEY_RIGHTPAREN}, | |
| 170 {"*", love::keyboard::Keyboard::KEY_ASTERISK}, | |
| 171 {"+", love::keyboard::Keyboard::KEY_PLUS}, | |
| 172 {",", love::keyboard::Keyboard::KEY_COMMA}, | |
| 173 {"-", love::keyboard::Keyboard::KEY_MINUS}, | |
| 174 {".", love::keyboard::Keyboard::KEY_PERIOD}, | |
| 175 {"/", love::keyboard::Keyboard::KEY_SLASH}, | |
| 176 {"0", love::keyboard::Keyboard::KEY_0}, | |
| 177 {"1", love::keyboard::Keyboard::KEY_1}, | |
| 178 {"2", love::keyboard::Keyboard::KEY_2}, | |
| 179 {"3", love::keyboard::Keyboard::KEY_3}, | |
| 180 {"4", love::keyboard::Keyboard::KEY_4}, | |
| 181 {"5", love::keyboard::Keyboard::KEY_5}, | |
| 182 {"6", love::keyboard::Keyboard::KEY_6}, | |
| 183 {"7", love::keyboard::Keyboard::KEY_7}, | |
| 184 {"8", love::keyboard::Keyboard::KEY_8}, | |
| 185 {"9", love::keyboard::Keyboard::KEY_9}, | |
| 186 {":", love::keyboard::Keyboard::KEY_COLON}, | |
| 187 {";", love::keyboard::Keyboard::KEY_SEMICOLON}, | |
| 188 {"<", love::keyboard::Keyboard::KEY_LESS}, | |
| 189 {"=", love::keyboard::Keyboard::KEY_EQUALS}, | |
| 190 {">", love::keyboard::Keyboard::KEY_GREATER}, | |
| 191 {"?", love::keyboard::Keyboard::KEY_QUESTION}, | |
| 192 {"@", love::keyboard::Keyboard::KEY_AT}, | |
| 193 | |
| 194 {"[", love::keyboard::Keyboard::KEY_LEFTBRACKET}, | |
| 195 {"\\", love::keyboard::Keyboard::KEY_BACKSLASH}, | |
| 196 {"]", love::keyboard::Keyboard::KEY_RIGHTBRACKET}, | |
| 197 {"^", love::keyboard::Keyboard::KEY_CARET}, | |
| 198 {"_", love::keyboard::Keyboard::KEY_UNDERSCORE}, | |
| 199 {"`", love::keyboard::Keyboard::KEY_BACKQUOTE}, | |
| 200 {"a", love::keyboard::Keyboard::KEY_A}, | |
| 201 {"b", love::keyboard::Keyboard::KEY_B}, | |
| 202 {"c", love::keyboard::Keyboard::KEY_C}, | |
| 203 {"d", love::keyboard::Keyboard::KEY_D}, | |
| 204 {"e", love::keyboard::Keyboard::KEY_E}, | |
| 205 {"f", love::keyboard::Keyboard::KEY_F}, | |
| 206 {"g", love::keyboard::Keyboard::KEY_G}, | |
| 207 {"h", love::keyboard::Keyboard::KEY_H}, | |
| 208 {"i", love::keyboard::Keyboard::KEY_I}, | |
| 209 {"j", love::keyboard::Keyboard::KEY_J}, | |
| 210 {"k", love::keyboard::Keyboard::KEY_K}, | |
| 211 {"l", love::keyboard::Keyboard::KEY_L}, | |
| 212 {"m", love::keyboard::Keyboard::KEY_M}, | |
| 213 {"n", love::keyboard::Keyboard::KEY_N}, | |
| 214 {"o", love::keyboard::Keyboard::KEY_O}, | |
| 215 {"p", love::keyboard::Keyboard::KEY_P}, | |
| 216 {"q", love::keyboard::Keyboard::KEY_Q}, | |
| 217 {"r", love::keyboard::Keyboard::KEY_R}, | |
| 218 {"s", love::keyboard::Keyboard::KEY_S}, | |
| 219 {"t", love::keyboard::Keyboard::KEY_T}, | |
| 220 {"u", love::keyboard::Keyboard::KEY_U}, | |
| 221 {"v", love::keyboard::Keyboard::KEY_V}, | |
| 222 {"w", love::keyboard::Keyboard::KEY_W}, | |
| 223 {"x", love::keyboard::Keyboard::KEY_X}, | |
| 224 {"y", love::keyboard::Keyboard::KEY_Y}, | |
| 225 {"z", love::keyboard::Keyboard::KEY_Z}, | |
| 226 {"delete", love::keyboard::Keyboard::KEY_DELETE}, | |
| 227 | |
| 228 {"kp0", love::keyboard::Keyboard::KEY_KP0}, | |
| 229 {"kp1", love::keyboard::Keyboard::KEY_KP1}, | |
| 230 {"kp2", love::keyboard::Keyboard::KEY_KP2}, | |
| 231 {"kp3", love::keyboard::Keyboard::KEY_KP3}, | |
| 232 {"kp4", love::keyboard::Keyboard::KEY_KP4}, | |
| 233 {"kp5", love::keyboard::Keyboard::KEY_KP5}, | |
| 234 {"kp6", love::keyboard::Keyboard::KEY_KP6}, | |
| 235 {"kp7", love::keyboard::Keyboard::KEY_KP7}, | |
| 236 {"kp8", love::keyboard::Keyboard::KEY_KP8}, | |
| 237 {"kp9", love::keyboard::Keyboard::KEY_KP9}, | |
| 238 {"kp.", love::keyboard::Keyboard::KEY_KP_PERIOD}, | |
| 239 {"kp/", love::keyboard::Keyboard::KEY_KP_DIVIDE}, | |
| 240 {"kp*", love::keyboard::Keyboard::KEY_KP_MULTIPLY}, | |
| 241 {"kp-", love::keyboard::Keyboard::KEY_KP_MINUS}, | |
| 242 {"kp+", love::keyboard::Keyboard::KEY_KP_PLUS}, | |
| 243 {"kpenter", love::keyboard::Keyboard::KEY_KP_ENTER}, | |
| 244 {"kp=", love::keyboard::Keyboard::KEY_KP_EQUALS}, | |
| 245 | |
| 246 {"up", love::keyboard::Keyboard::KEY_UP}, | |
| 247 {"down", love::keyboard::Keyboard::KEY_DOWN}, | |
| 248 {"right", love::keyboard::Keyboard::KEY_RIGHT}, | |
| 249 {"left", love::keyboard::Keyboard::KEY_LEFT}, | |
| 250 {"insert", love::keyboard::Keyboard::KEY_INSERT}, | |
| 251 {"home", love::keyboard::Keyboard::KEY_HOME}, | |
| 252 {"end", love::keyboard::Keyboard::KEY_END}, | |
| 253 {"pageup", love::keyboard::Keyboard::KEY_PAGEUP}, | |
| 254 {"pagedown", love::keyboard::Keyboard::KEY_PAGEDOWN}, | |
| 255 | |
| 256 {"f1", love::keyboard::Keyboard::KEY_F1}, | |
| 257 {"f2", love::keyboard::Keyboard::KEY_F2}, | |
| 258 {"f3", love::keyboard::Keyboard::KEY_F3}, | |
| 259 {"f4", love::keyboard::Keyboard::KEY_F4}, | |
| 260 {"f5", love::keyboard::Keyboard::KEY_F5}, | |
| 261 {"f6", love::keyboard::Keyboard::KEY_F6}, | |
| 262 {"f7", love::keyboard::Keyboard::KEY_F7}, | |
| 263 {"f8", love::keyboard::Keyboard::KEY_F8}, | |
| 264 {"f9", love::keyboard::Keyboard::KEY_F9}, | |
| 265 {"f10", love::keyboard::Keyboard::KEY_F10}, | |
| 266 {"f11", love::keyboard::Keyboard::KEY_F11}, | |
| 267 {"f12", love::keyboard::Keyboard::KEY_F12}, | |
| 268 {"f13", love::keyboard::Keyboard::KEY_F13}, | |
| 269 {"f14", love::keyboard::Keyboard::KEY_F14}, | |
| 270 {"f15", love::keyboard::Keyboard::KEY_F15}, | |
| 271 | |
| 272 {"numlock", love::keyboard::Keyboard::KEY_NUMLOCK}, | |
| 273 {"capslock", love::keyboard::Keyboard::KEY_CAPSLOCK}, | |
| 274 {"scrollock", love::keyboard::Keyboard::KEY_SCROLLOCK}, | |
| 275 {"rshift", love::keyboard::Keyboard::KEY_RSHIFT}, | |
| 276 {"lshift", love::keyboard::Keyboard::KEY_LSHIFT}, | |
| 277 {"rctrl", love::keyboard::Keyboard::KEY_RCTRL}, | |
| 278 {"lctrl", love::keyboard::Keyboard::KEY_LCTRL}, | |
| 279 {"ralt", love::keyboard::Keyboard::KEY_RALT}, | |
| 280 {"lalt", love::keyboard::Keyboard::KEY_LALT}, | |
| 281 {"rmeta", love::keyboard::Keyboard::KEY_RMETA}, | |
| 282 {"lmeta", love::keyboard::Keyboard::KEY_LMETA}, | |
| 283 {"lsuper", love::keyboard::Keyboard::KEY_LSUPER}, | |
| 284 {"rsuper", love::keyboard::Keyboard::KEY_RSUPER}, | |
| 285 {"mode", love::keyboard::Keyboard::KEY_MODE}, | |
| 286 {"compose", love::keyboard::Keyboard::KEY_COMPOSE}, | |
| 287 | |
| 288 {"help", love::keyboard::Keyboard::KEY_HELP}, | |
| 289 {"print", love::keyboard::Keyboard::KEY_PRINT}, | |
| 290 {"sysreq", love::keyboard::Keyboard::KEY_SYSREQ}, | |
| 291 {"break", love::keyboard::Keyboard::KEY_BREAK}, | |
| 292 {"menu", love::keyboard::Keyboard::KEY_MENU}, | |
| 293 {"power", love::keyboard::Keyboard::KEY_POWER}, | |
| 294 {"euro", love::keyboard::Keyboard::KEY_EURO}, | |
| 295 {"undo", love::keyboard::Keyboard::KEY_UNDO}, | |
| 296 | |
| 297 {"unknown", love::keyboard::Keyboard::KEY_UNKNOWN}, | |
| 298 }; | |
| 299 | |
| 300 StringMap<love::keyboard::Keyboard::Key, love::keyboard::Keyboard::KEY_MAX_ENUM> Event::keys(Event::keyEntries, sizeof(Event::keyEntries)); | |
| 301 | |
| 302 } // event | |
| 303 } // love |
