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