11#include "sq.h"
2+ #include "sqRpiDisplay.h"
3+
24#include "keyboard.h"
35#include "mouse.h"
46#include "timer.h" // watchdog
@@ -16,6 +18,18 @@ extern int interruptCheckCounter;
1618extern int interruptKeycode ;
1719extern int interruptPending ; /* set to true by RecordKeystroke if interrupt key is pressed */
1820
21+ /*** Variables -- Event Recording ***/
22+ #define MillisecondClockMask 536870911
23+ #define MAX_EVENT_BUFFER 64
24+ static sqInputEvent eventBuffer [MAX_EVENT_BUFFER ];
25+ static int eventBufferGet = 0 ;
26+ static int eventBufferPut = 0 ;
27+
28+ static char lastKeys [255 ];
29+ static int lastMouseX = 0 ;
30+ static int lastMouseY = 0 ;
31+ static int lastMouseButton = 0 ;
32+
1933void RecordKeystroke (unsigned char key , struct KeyboardModifiers modifiers ) {
2034 int keystate ;
2135
@@ -33,7 +47,7 @@ void RecordKeystroke(unsigned char key, struct KeyboardModifiers modifiers) {
3347 if (modifiers .LeftGui || modifiers .RightGui ) {
3448 keyModifier = 1 << 11 ;
3549 }
36- keystate = (keyModifier ) | (key & 0xff );
50+ keystate = (keyModifier << 8 ) | (key & 0xff );
3751
3852 if (keystate == interruptKeycode ) {
3953 /* Note: interrupt key is "meta"; it not reported as a keystroke */
@@ -76,6 +90,143 @@ int ioPeekKeystroke(void) {
7690 return ioGetKeystrokeAndAdvance (false);
7791}
7892
93+ sqInputEvent * nextEventPut (void ) {
94+ sqInputEvent * evt ;
95+ evt = eventBuffer + eventBufferPut ;
96+ eventBufferPut = (eventBufferPut + 1 ) % MAX_EVENT_BUFFER ;
97+ if (eventBufferGet == eventBufferPut ) {
98+ /* buffer overflow; drop the last event */
99+ eventBufferGet = (eventBufferGet + 1 ) % MAX_EVENT_BUFFER ;
100+ }
101+ return evt ;
102+ }
103+
104+ void rpiProcessMouseEvents (void ) {
105+ int mouseCount = MouseCount ();
106+ if (mouseCount == 0 ) {
107+ return ;
108+ }
109+
110+ uint32_t mouse = MouseGetAddress (0 );
111+ int position = MouseGetPosition (mouse );
112+ int posX = (position >> 16 ) & 0xffff ;
113+ int posY = position & 0xffff ;
114+
115+ int mouseButtons = MouseGetButtons (mouse );
116+ int buttonState = 0 ;
117+ if (mouseButtons & 0x01 ) {
118+ buttonState |= RedButtonBit ;
119+ }
120+ if (mouseButtons & 0x02 ) {
121+ buttonState |= BlueButtonBit ;
122+ }
123+ if (mouseButtons & 0x04 ) {
124+ buttonState |= YellowButtonBit ;
125+ }
126+
127+ if (posX != lastMouseX || posY != lastMouseY || buttonState != lastMouseButton ) {
128+ lastMouseX = posX ;
129+ lastMouseY = posY ;
130+ lastMouseButton = buttonState ;
131+ moveCursor (lastMouseX , lastMouseY );
132+
133+ sqMouseEvent * event = (sqMouseEvent * ) nextEventPut ();
134+
135+ /* first the basics */
136+ event -> type = EventTypeMouse ;
137+ event -> timeStamp = ioMSecs () & MillisecondClockMask ;
138+ event -> x = lastMouseX ;
139+ event -> y = lastMouseY ;
140+ /* then the buttons */
141+ event -> buttons = lastMouseButton & 0x07 ;
142+ /* then the modifiers */
143+ event -> modifiers = 0 ; //buttonState >> 3;
144+ /* clean up reserved */
145+ event -> reserved1 = 0 ;
146+ }
147+ }
148+
149+ void rpiRegisterKeyboardEvent (int keyCode , int pressCode , int modifiers ) {
150+ sqKeyboardEvent * evt = (sqKeyboardEvent * ) nextEventPut ();
151+ /* first the basics */
152+ evt -> type = EventTypeKeyboard ;
153+ evt -> timeStamp = ioMSecs () & MillisecondClockMask ;
154+ /* now the key code */
155+ /* press code must differentiate */
156+ evt -> charCode = keyCode ;
157+ evt -> pressCode = pressCode ;
158+ evt -> modifiers = modifiers ;
159+
160+ evt -> reserved1 = evt -> reserved2 = evt -> reserved3 = 0 ;
161+ }
162+
163+ void rpiProcessKeyboardEvents (void ) {
164+ int keyboardCount = KeyboardCount ();
165+ if (keyboardCount == 0 ) {
166+ return ;
167+ }
168+
169+ uint32_t keyboard = KeyboardGetAddress (0 );
170+ int keysDown = KeyboardGetKeyDownCount (keyboard );
171+
172+ struct KeyboardModifiers keyModifiers = KeyboardGetModifiers (keyboard );
173+ int modifiers = 0 ;
174+ if (keyModifiers .LeftControl || keyModifiers .RightControl ) {
175+ modifiers |= CtrlKeyBit ;
176+ }
177+ if (keyModifiers .LeftShift || keyModifiers .RightShift ) {
178+ modifiers |= ShiftKeyBit ;
179+ }
180+ if (keyModifiers .LeftAlt || keyModifiers .RightAlt ) {
181+ modifiers |= OptionKeyBit ;
182+ }
183+ if (keyModifiers .LeftGui || keyModifiers .RightGui ) {
184+ modifiers |= CommandKeyBit ;
185+ }
186+
187+ char theseKeys [keysDown ];
188+
189+ for (int i = 0 ; i < keysDown ; i ++ ) {
190+ int keyCode = KeyboardGetKeyDown (keyboard , i );
191+ unsigned char key = (keyModifiers .LeftShift || keyModifiers .RightShift ? KeysShift [keyCode ] : KeysNormal [keyCode ]);
192+ theseKeys [i ] = key ;
193+
194+ if (lastKeys [key ] == 0 ) {
195+ lastKeys [key ] = 1 ;
196+ rpiRegisterKeyboardEvent (key , EventKeyDown , modifiers );
197+ rpiRegisterKeyboardEvent (key , EventKeyChar , modifiers );
198+ }
199+ }
200+
201+ for (int i = 0 ; i < 255 ; i ++ ) {
202+ if (lastKeys [i ] != 0 ) {
203+ bool matched = false;
204+ for (int j = 0 ; j < keysDown ; j ++ ) {
205+ if (theseKeys [j ] == i ) {
206+ matched = true;
207+ }
208+ }
209+
210+ if (matched == false) {
211+ lastKeys [i ] = 0 ;
212+ rpiRegisterKeyboardEvent (i , EventKeyUp , modifiers );
213+ }
214+ }
215+ }
216+ }
217+
218+ int ioGetNextEvent (sqInputEvent * evt ) {
219+ ioProcessEvents ();
220+ rpiProcessMouseEvents ();
221+ rpiProcessKeyboardEvents ();
222+
223+ if (eventBufferGet == eventBufferPut ) {
224+ return false;
225+ }
226+ * evt = eventBuffer [eventBufferGet ];
227+ eventBufferGet = (eventBufferGet + 1 ) % MAX_EVENT_BUFFER ;
228+ return true;
229+ }
79230
80231int ioProcessEvents (void ) {
81232 //printf("%s\n", __PRETTY_FUNCTION__);
@@ -109,8 +260,6 @@ int ioProcessEvents(void) {
109260 for (int mouseIndex = 0 ; mouseIndex < mouseCount ; mouseIndex ++ ) {
110261 uint32_t mouse = MouseGetAddress (mouseIndex );
111262 MousePoll (mouse );
112- //int position = MouseGetPosition(mouse);
113- //printf("mouse: x=%i, y=%i\n", ((position>>16)&0xffff), (position&0xffff));
114263 }
115264
116265 watchdog_reset ();
0 commit comments