comparison ext/guichan-0.8.1/src/hge/hgeinput.cpp @ 0:4a0efb7baf70

* Datasets becomes the new trunk and retires after that :-)
author mvbarracuda@33b003aa-7bff-0310-803a-e67f0ece8222
date Sun, 29 Jun 2008 18:44:17 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:4a0efb7baf70
1 /* _______ __ __ __ ______ __ __ _______ __ __
2 * / _____/\ / /\ / /\ / /\ / ____/\ / /\ / /\ / ___ /\ / |\/ /\
3 * / /\____\// / // / // / // /\___\// /_// / // /\_/ / // , |/ / /
4 * / / /__ / / // / // / // / / / ___ / // ___ / // /| ' / /
5 * / /_// /\ / /_// / // / // /_/_ / / // / // /\_/ / // / | / /
6 * /______/ //______/ //_/ //_____/\ /_/ //_/ //_/ //_/ //_/ /|_/ /
7 * \______\/ \______\/ \_\/ \_____\/ \_\/ \_\/ \_\/ \_\/ \_\/ \_\/
8 *
9 * Copyright (c) 2004 - 2008 Olof Naessén and Per Larsson
10 *
11 *
12 * Per Larsson a.k.a finalman
13 * Olof Naessén a.k.a jansem/yakslem
14 *
15 * Visit: http://guichan.sourceforge.net
16 *
17 * License: (BSD)
18 * Redistribution and use in source and binary forms, with or without
19 * modification, are permitted provided that the following conditions
20 * are met:
21 * 1. Redistributions of source code must retain the above copyright
22 * notice, this list of conditions and the following disclaimer.
23 * 2. Redistributions in binary form must reproduce the above copyright
24 * notice, this list of conditions and the following disclaimer in
25 * the documentation and/or other materials provided with the
26 * distribution.
27 * 3. Neither the name of Guichan nor the names of its contributors may
28 * be used to endorse or promote products derived from this software
29 * without specific prior written permission.
30 *
31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
36 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
37 * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
38 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
39 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
40 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
41 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
42 */
43
44 /*
45 * For comments regarding functions please see the header file.
46 */
47
48 #include "guichan/hge/hgeinput.hpp"
49 #include "guichan/exception.hpp"
50
51 namespace gcn
52 {
53 HGE *HGEInput::mHGE = NULL;
54
55 HGEInput::HGEInput()
56 {
57 mHGE = hgeCreate(HGE_VERSION);
58
59 mMouseX = 0;
60 mMouseY = 0;
61
62 mLeftMouseButtonDown = false;
63 mRightMouseButtonDown = false;
64 mMiddleMouseButtonDown = false;
65 }
66
67 HGEInput::~HGEInput()
68 {
69 mHGE->Release();
70 }
71
72 bool HGEInput::isKeyQueueEmpty()
73 {
74 return mKeyInputQueue.empty();
75 }
76
77 bool HGEInput::isMouseQueueEmpty()
78 {
79 return mMouseInputQueue.empty();
80 }
81
82 KeyInput HGEInput::dequeueKeyInput()
83 {
84 if (isKeyQueueEmpty())
85 {
86 throw GCN_EXCEPTION("Key queue is empty.");
87 }
88
89 KeyInput keyInput;
90
91 keyInput = mKeyInputQueue.front();
92 mKeyInputQueue.pop();
93
94 return keyInput;
95
96 }
97
98 MouseInput HGEInput::dequeueMouseInput()
99 {
100 if (isMouseQueueEmpty())
101 {
102 throw GCN_EXCEPTION("Mouse queue is empty.");
103 }
104
105 MouseInput mouseInput;
106
107 mouseInput = mMouseInputQueue.front();
108 mMouseInputQueue.pop();
109
110 return mouseInput;
111 }
112
113 void HGEInput::_pollInput()
114 {
115 hgeInputEvent ie;
116
117 mHGE->Input_GetEvent(&ie);
118
119 pollMouseInput();
120 pollKeyInput(ie);
121 }
122
123 void HGEInput::pollMouseInput()
124 {
125 float curMouseX, curMouseY;
126 int mouseWheel;
127
128 bool leftBtn, rightBtn, centerBtn;
129
130 mHGE->Input_GetMousePos(&curMouseX, &curMouseY);
131 mouseWheel = mHGE->Input_GetMouseWheel();
132
133 leftBtn = mHGE->Input_GetKeyState(HGEK_LBUTTON);
134 rightBtn = mHGE->Input_GetKeyState(HGEK_RBUTTON);
135 centerBtn = mHGE->Input_GetKeyState(HGEK_MBUTTON);
136
137 // Check mouse movement
138 if (mMouseX != curMouseX
139 || mMouseY != curMouseY )
140 {
141 mMouseInputQueue.push(MouseInput(MouseInput::EMPTY,
142 MouseInput::MOVED,
143 curMouseX,
144 curMouseY,
145 0));
146
147 mMouseX = curMouseX;
148 mMouseY = curMouseY;
149 }
150
151 // Check mouse wheel
152 if (mouseWheel > 0)
153 {
154 mMouseInputQueue.push(MouseInput(MouseInput::EMPTY,
155 MouseInput::WHEEL_MOVED_UP,
156 curMouseX,
157 curMouseY,
158 0));
159 }
160 else if (mouseWheel < 0)
161 {
162 mMouseInputQueue.push(MouseInput(MouseInput::EMPTY,
163 MouseInput::WHEEL_MOVED_DOWN,
164 curMouseX,
165 curMouseY,
166 0));
167 }
168
169 //check mouse buttons
170 if (!mLeftMouseButtonDown && leftBtn)
171 {
172 mMouseInputQueue.push(MouseInput(MouseInput::LEFT,
173 MouseInput::PRESSED,
174 curMouseX,
175 curMouseY,
176 0));
177 }
178 else if (mLeftMouseButtonDown && !leftBtn )
179 {
180 mMouseInputQueue.push(MouseInput(MouseInput::LEFT,
181 MouseInput::RELEASED,
182 curMouseX,
183 curMouseY,
184 0));
185 }
186 else if (!mRightMouseButtonDown && rightBtn)
187 {
188 mMouseInputQueue.push(MouseInput(MouseInput::RIGHT,
189 MouseInput::PRESSED,
190 curMouseX,
191 curMouseY,
192 0));
193 }
194 else if (mRightMouseButtonDown && !rightBtn)
195 {
196 mMouseInputQueue.push(MouseInput(MouseInput::RIGHT,
197 MouseInput::RELEASED,
198 curMouseX,
199 curMouseY,
200 0));
201 }
202 else if (!mMiddleMouseButtonDown && centerBtn)
203 {
204 mMouseInputQueue.push(MouseInput(MouseInput::MIDDLE,
205 MouseInput::PRESSED,
206 curMouseX,
207 curMouseY,
208 0));
209 }
210 else if (mMiddleMouseButtonDown && !centerBtn)
211 {
212 mMouseInputQueue.push(MouseInput(MouseInput::MIDDLE,
213 MouseInput::RELEASED,
214 curMouseX,
215 curMouseY,
216 0));
217 }
218
219 mLeftMouseButtonDown = leftBtn;
220 mRightMouseButtonDown = rightBtn;
221 mMiddleMouseButtonDown = centerBtn;
222 }
223
224 void HGEInput::pollKeyInput(hgeInputEvent &ki)
225 {
226 if (ki.type != INPUT_KEYDOWN
227 && ki.type != INPUT_KEYUP )
228 {
229 return ;
230 }
231
232 if (ki.type == INPUT_KEYDOWN)
233 {
234 Key keyObj = convertToKey(ki.key, ki.chr);
235
236 KeyInput keyInput(keyObj, KeyInput::PRESSED);
237
238 keyInput.setNumericPad(isNumericPad(ki.key));
239
240 keyInput.setShiftPressed(ki.flags & HGEINP_SHIFT);
241 keyInput.setAltPressed(ki.flags & HGEINP_ALT);
242 keyInput.setControlPressed(ki.flags & HGEINP_CTRL);
243
244 mKeyInputQueue.push(keyInput);
245 }
246
247 if (ki.type == INPUT_KEYUP)
248 {
249 Key keyObj = convertToKey(ki.key, ki.chr);
250
251 KeyInput keyInput(keyObj, KeyInput::RELEASED);
252
253 keyInput.setNumericPad(isNumericPad(ki.key));
254
255 keyInput.setShiftPressed(ki.flags & HGEINP_SHIFT);
256 keyInput.setAltPressed(ki.flags & HGEINP_ALT);
257 keyInput.setControlPressed(ki.flags & HGEINP_CTRL);
258
259 mKeyInputQueue.push(keyInput);
260 }
261 }
262
263 Key HGEInput::convertToKey(int key, int chr)
264 {
265 int keysym;
266
267 switch(key)
268 {
269 case HGEK_TAB:
270 keysym = Key::TAB;
271 break;
272 case HGEK_ESCAPE:
273 keysym = Key::ESCAPE;
274 break;
275 case HGEK_ALT:
276 keysym = Key::LEFT_ALT;
277 break;
278 /*
279 Unsupported by HGE.
280 case HGEK_ALT:
281 keysym = Key::RIGHT_ALT;
282 break;
283 */
284 case HGEK_SHIFT:
285 keysym = Key::LEFT_SHIFT;
286 break;
287 /*
288 Unsuppored by HGE.
289 case HGEK_SHIFT:
290 keysym = Key::RIGHT_SHIFT;
291 break;
292 */
293 case HGEK_CTRL:
294 keysym = Key::LEFT_CONTROL;
295 break;
296 /*
297 Unsupported by HGE.
298 case HGEK_CTRL:
299 keysym = Key::RIGHT_CONTROL;
300 break;
301 */
302 case HGEK_LWIN:
303 keysym = Key::LEFT_META;
304 break;
305 case HGEK_RWIN:
306 keysym = Key::RIGHT_META;
307 break;
308 case HGEK_INSERT:
309 keysym = Key::INSERT;
310 break;
311 case HGEK_HOME:
312 keysym = Key::HOME;
313 break;
314 case HGEK_PGUP:
315 keysym = Key::PAGE_UP;
316 break;
317 case HGEK_PGDN:
318 keysym = Key::PAGE_DOWN;
319 break;
320 case HGEK_DELETE:
321 keysym = Key::DELETE;
322 break;
323 /*
324 Unsupported by HGE.
325 case HGEK_BACKSPACE:
326 keysym = Key::DELETE;
327 pad = true;
328 break;
329 */
330 case HGEK_END:
331 keysym = Key::END;
332 break;
333 case HGEK_CAPSLOCK:
334 keysym = Key::CAPS_LOCK;
335 break;
336 case HGEK_BACKSPACE:
337 keysym = Key::BACKSPACE;
338 break;
339 case HGEK_F1:
340 keysym = Key::F1;
341 break;
342 case HGEK_F2:
343 keysym = Key::F2;
344 break;
345 case HGEK_F3:
346 keysym = Key::F3;
347 break;
348 case HGEK_F4:
349 keysym = Key::F4;
350 break;
351 case HGEK_F5:
352 keysym = Key::F5;
353 break;
354 case HGEK_F6:
355 keysym = Key::F6;
356 break;
357 case HGEK_F7:
358 keysym = Key::F7;
359 break;
360 case HGEK_F8:
361 keysym = Key::F8;
362 break;
363 case HGEK_F9:
364 keysym = Key::F9;
365 break;
366 case HGEK_F10:
367 keysym = Key::F10;
368 break;
369 case HGEK_F11:
370 keysym = Key::F11;
371 break;
372 case HGEK_F12:
373 keysym = Key::F12;
374 break;
375 /*
376 Unsupported by HGE
377 case HGEK_PRTSCR:
378 keysym = Key::PRINT_SCREEN;
379 break;
380 */
381 case HGEK_PAUSE:
382 keysym = Key::PAUSE;
383 break;
384 case HGEK_SCROLLLOCK:
385 keysym = Key::SCROLL_LOCK;
386 break;
387 case HGEK_NUMLOCK:
388 keysym = Key::NUM_LOCK;
389 break;
390 case HGEK_LEFT:
391 keysym = Key::LEFT;
392 break;
393 case HGEK_RIGHT:
394 keysym = Key::RIGHT;
395 break;
396 case HGEK_UP:
397 keysym = Key::UP;
398 break;
399 case HGEK_DOWN:
400 keysym = Key::DOWN;
401 break;
402 case HGEK_ENTER:
403 keysym = Key::ENTER;
404 break;
405 default:
406 keysym = chr;
407 }
408
409 Key k = Key(keysym);
410
411 return k;
412 }
413
414 bool HGEInput::isNumericPad(int keyCode)
415 {
416 switch(keyCode)
417 {
418 case HGEK_NUMPAD0:
419 case HGEK_NUMPAD1:
420 case HGEK_NUMPAD2:
421 case HGEK_NUMPAD3:
422 case HGEK_NUMPAD4:
423 case HGEK_NUMPAD5:
424 case HGEK_NUMPAD6:
425 case HGEK_NUMPAD7:
426 case HGEK_NUMPAD8:
427 case HGEK_NUMPAD9:
428 return true;
429 default:
430 return false;
431 }
432 }
433 }