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