1 #include "input.h"
2 #include "gfxinterface.h"
3 #include <X11/keysym.h>
4
5
Input()6 Input::Input()
7 : quit_ (false)
8 , move_ (0)
9 , left_ (false), right_ (false), last_is_left_(false)
10 , up_ (false), down_ (false), last_is_up_(false)
11 , fire_ (false), firing_(false)
12 , start_ (false)
13 , pause_ (false)
14 , cheat_ (false)
15 , details_ (0)
16 , window_size_ (0)
17 , inc_refresh_rate_(false)
18 {}
19
20
Update()21 void Input::Update()
22 {
23 fire_ = false;
24 move_ = 0;
25 vmove_ = 0;
26 start_ = false;
27 cheat_ = false;
28 highscores_ = false;
29 details_ = 0;
30 window_size_ = 0;
31 inc_refresh_rate_ = false;
32
33 while (X11::Inst().Pending()) {
34 XEvent e;
35 X11::Inst().NextEvent(&e);
36
37 switch (e.type) {
38 case KeyPress:
39 switch (XLookupKeysym(&e.xkey, 0)) {
40 case XK_Left:
41 left_ = true;
42 last_is_left_ = true;
43 break;
44 case XK_Right:
45 right_ = true;
46 last_is_left_ = false;
47 break;
48 case XK_Up:
49 up_ = true;
50 last_is_up_ = true;
51 break;
52 case XK_Down:
53 down_ = true;
54 last_is_up_ = false;
55 break;
56 case XK_space:
57 fire_ = firing_ = true;
58 break;
59 default:
60 char c (0);
61 XLookupString(&e.xkey, &c, 1, 0, 0);
62 switch (c) {
63 case '+':
64 details_ = 1;
65 break;
66 case '-':
67 details_ = -1;
68 break;
69 case 'r':
70 inc_refresh_rate_ = true;
71 break;
72 case '1':
73 window_size_ = 1;
74 break;
75 case '2':
76 window_size_ = 2;
77 break;
78 case '3':
79 window_size_ = 3;
80 break;
81 case '4':
82 window_size_ = 4;
83 break;
84 case '5':
85 window_size_ = 5;
86 break;
87 case 'h':
88 highscores_ = true;
89 break;
90 case 'p':
91 pause_ = !pause_;
92 break;
93 case 'q':
94 quit_ = true;
95 return;
96 case 's':
97 start_ = true;
98 return;
99 case 'C':
100 cheat_ = true;
101 return;
102 }
103 }
104 break;
105 case KeyRelease:
106 switch (XLookupKeysym(&e.xkey, 0)) {
107 case XK_Left:
108 left_ = false;
109 break;
110 case XK_Right:
111 right_ = false;
112 break;
113 case XK_Up:
114 up_ = false;
115 break;
116 case XK_Down:
117 down_ = false;
118 break;
119 case XK_space:
120 firing_ = false;
121 break;
122 }
123 break;
124 }
125 }
126
127 fire_ |= firing_;
128
129 if (!left_ && !right_) move_ = 0;
130 else if ( left_ && !right_) move_ = -1;
131 else if (!left_ && right_) move_ = 1;
132 else if (last_is_left_) move_ = -1;
133 else move_ = 1;
134
135 if (!up_ && !down_) vmove_ = 0;
136 else if ( up_ && !down_) vmove_ = -1;
137 else if (!up_ && down_) vmove_ = 1;
138 else if (last_is_up_) vmove_ = -1;
139 else vmove_ = 1;
140 }
141