1 /*
2 * input.h
3 * DIN Is Noise is copyright (c) 2006-2021 Jagannathan Sampath
4 * DIN Is Noise is released under GNU Public License 2.0
5 * For more information, please visit https://dinisnoise.org/
6 */
7
8
9 #ifndef __input
10 #define __input
11
12 #include "chrono.h"
13 #include "log.h"
14 #include <SDL/SDL.h>
15
16 struct keyboard {
17
18 int nkeys; // number of keys
19 Uint8* now; // key state now (1 - down, 0 - up)
20 Uint8* last; // last state of keys
21
22 unsigned int size;
23
24 double* tstamp;
25 double* repeat;
26
keyboardkeyboard27 keyboard () {
28
29 SDL_GetKeyState (&nkeys);
30
31 size = nkeys * sizeof (Uint8);
32
33 last = new Uint8 [nkeys];
34 memset (last, 0, size);
35
36 tstamp = new double [nkeys];
37 repeat = new double [nkeys];
38
39 dlog << "+++ initialised computer keyboard input +++" << endl;
40
41 }
42
readkeyboard43 void read () {
44 now = SDL_GetKeyState (0);
45 }
46
savekeyboard47 void save () {
48 memcpy (last, now, size);
49 }
50
~keyboardkeyboard51 ~keyboard () {
52 delete[] last;
53 delete[] tstamp;
54 delete[] repeat;
55 dlog << "--- destroyed computer keyboard input ---" << endl;
56 }
57
58 };
59
60 extern keyboard keybd;
61
62 struct pressedt {
63 int g;
pressedtpressedt64 pressedt () : g(0) {}
65 };
66 extern pressedt elsewhere;
67 extern pressedt& pressed;
68
nkeys()69 inline int nkeys () {
70 return keybd.nkeys;
71 }
72
keydown(unsigned int k)73 inline int keydown (unsigned int k) {
74 return keybd.now[k];
75 }
76
keyup(unsigned int k)77 inline int keyup (unsigned int k) {
78 int wkd = keybd.last[k];
79 int kd = keybd.now[k];
80 return (!kd && wkd);
81 }
82
waskeydown(unsigned int k)83 inline int waskeydown (unsigned int k) {
84 return keybd.last[k];
85 }
86
keypressed(unsigned int k)87 inline int keypressed (unsigned int k) {
88 int wkd = waskeydown (k), kd = keydown (k);
89 if (kd && !wkd) return 1; else return 0;
90 }
91
92 inline int keypressedd (unsigned int k, double firstt = 1./3, double constt = 1./20) {
93 /* keypressed with key repeat */
94 int wkd = waskeydown(k), kd = keydown(k);
95 if (kd) {
96 if (!wkd) {
97 keybd.repeat[k] = firstt + ui_clk();
98 return 1;
99 } else {
100 if (ui_clk() > keybd.repeat[k]) {
101 keybd.repeat[k] = constt + ui_clk();
102 return 1;
103 }
104 }
105 }
106 return 0;
107 }
108
shift_down()109 inline int shift_down () {
110 return (keydown (SDLK_LSHIFT) || keydown (SDLK_RSHIFT));
111 }
112
ctrl_down()113 inline int ctrl_down () {
114 return (keydown (SDLK_LCTRL) || keydown (SDLK_RCTRL));
115 }
116
alt_down()117 inline int alt_down () {
118 return (keydown (SDLK_LALT) || keydown (SDLK_RALT));
119 }
120
121 extern int lmb, rmb, mmb;
122 extern int mousex, mousey, mouseyy;
123 extern int wheel;
124 extern int SHIFT, CTRL, ALT;
125 #endif
126