Usermode/AxWin3 - Working on keyboard input
[tpg/acess2.git] / Usermode / Applications / axwin3_src / WM / input.c
1 /*
2  * Acess2 GUI (AxWin) Version 3
3  * - By John Hodge (thePowersGang)
4  *
5  * input.c
6  * - Input abstraction
7  */
8 #include <common.h>
9 #include <acess/sys.h>
10 #include <wm_input.h>
11
12 // TODO: Move out to a common header
13 typedef struct
14 {
15         int Num;
16         int Value;
17 } tNumValue;
18 #define JOY_IOCTL_GETSETAXISLIMIT       6
19 #define JOY_IOCTL_GETSETAXISPOSITION    7
20
21 // === IMPORTS ===
22 extern void     Video_SetCursorPos(short X, short Y);
23 const char      *gsMouseDevice;
24 extern int      giTerminalFD;
25 extern int      giScreenWidth;
26 extern int      giScreenHeight;
27
28 // === GLOBALS ===
29  int    giMouseFD;
30  int    giInput_MouseButtonState;
31  int    giInput_MouseX, giInput_MouseY;
32
33 // === CODE ===
34 int Input_Init(void)
35 {
36         tNumValue       num_value;
37
38         // Open mouse for RW
39         giMouseFD = open(gsMouseDevice, 3);
40
41         // Set mouse limits
42         // TODO: Update these if the screen resolution changes
43         num_value.Num = 0;      num_value.Value = giScreenWidth;
44         ioctl(giMouseFD, JOY_IOCTL_GETSETAXISLIMIT, &num_value);
45         num_value.Value = giScreenWidth/2;
46         giInput_MouseX = giScreenWidth/2;
47         ioctl(giMouseFD, JOY_IOCTL_GETSETAXISPOSITION, &num_value);
48
49         num_value.Num = 1;      num_value.Value = giScreenHeight;
50         ioctl(giMouseFD, JOY_IOCTL_GETSETAXISLIMIT, &num_value);
51         num_value.Value = giScreenHeight/2;
52         giInput_MouseY = giScreenHeight/2;
53         ioctl(giMouseFD, JOY_IOCTL_GETSETAXISPOSITION, &num_value);
54
55         return 0;
56 }
57
58 void Input_FillSelect(int *nfds, fd_set *set)
59 {
60         if(*nfds < giTerminalFD)        *nfds = giTerminalFD;
61         if(*nfds < giMouseFD)   *nfds = giMouseFD;
62         FD_SET(giTerminalFD, set);
63         FD_SET(giMouseFD, set);
64 }
65
66 void Input_HandleSelect(fd_set *set)
67 {
68         if(FD_ISSET(giTerminalFD, set))
69         {
70                 uint32_t        codepoint;
71                 static uint32_t scancode;
72                 #define KEY_CODEPOINT_MASK      0x3FFFFFFF
73                 
74                 if( read(giTerminalFD, &codepoint, sizeof(codepoint)) != sizeof(codepoint) )
75                 {
76                         // oops, error
77                 }
78         
79                 switch(codepoint & 0xC0000000)
80                 {
81                 case 0x00000000:        // Key pressed
82                         WM_Input_KeyDown(codepoint & KEY_CODEPOINT_MASK, scancode);
83                 case 0x40000000:        // Key refire
84                         WM_Input_KeyFire(codepoint & KEY_CODEPOINT_MASK, scancode);
85                         scancode = 0;
86                         break;
87                 case 0x80000000:        // Key release
88                         WM_Input_KeyUp(codepoint & KEY_CODEPOINT_MASK, scancode);
89                         scancode = 0;
90                         break;
91                 case 0xC0000000:        // Raw scancode
92                         scancode = codepoint & KEY_CODEPOINT_MASK;
93                         break;
94                 }
95         
96                 // TODO: pass on to message handler
97                 _SysDebug("Keypress 0x%x", codepoint);
98         }
99
100         if(FD_ISSET(giMouseFD, set))
101         {
102                  int    i;
103                 struct sMouseInfo {
104                         uint16_t        NAxies;
105                         uint16_t        NButtons;
106                         struct sMouseAxis {
107                                  int16_t        MinValue;
108                                  int16_t        MaxValue;
109                                  int16_t        CurValue;
110                                 uint16_t        CursorPos;
111                         }       Axies[2];
112                         uint8_t Buttons[3];
113                 }       mouseinfo;
114         
115                 seek(giMouseFD, 0, SEEK_SET);
116                 if( read(giMouseFD, &mouseinfo, sizeof(mouseinfo)) != sizeof(mouseinfo) )
117                 {
118                         // Not a 3 button mouse, oops
119                         return ;
120                 }
121
122                 // Handle movement
123                 Video_SetCursorPos( mouseinfo.Axies[0].CursorPos, mouseinfo.Axies[1].CursorPos );
124
125                 WM_Input_MouseMoved(
126                         giInput_MouseX, giInput_MouseY,
127                         mouseinfo.Axies[0].CursorPos, mouseinfo.Axies[1].CursorPos
128                         );
129                 giInput_MouseX = mouseinfo.Axies[0].CursorPos;
130                 giInput_MouseY = mouseinfo.Axies[1].CursorPos;
131
132                 for( i = 0; i < mouseinfo.NButtons; i ++ )
133                 {
134                         int bit = 1 << i;
135                         int cur = mouseinfo.Buttons[i] > 128;
136
137                         if( !!(giInput_MouseButtonState & bit) != cur )
138                         {
139                                 WM_Input_MouseButton(giInput_MouseX, giInput_MouseY, i, cur);
140                                 // Flip button state
141                                 giInput_MouseButtonState ^= bit;
142                         }
143                 }
144         }
145 }

UCC git Repository :: git.ucc.asn.au