9de0d42e555facef16847056037ae6437f23a28e
[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
11 // TODO: Move out to a common header
12 typedef struct
13 {
14         int Num;
15         int Value;
16 } tNumValue;
17 #define JOY_IOCTL_GETSETAXISLIMIT       6
18 #define JOY_IOCTL_GETSETAXISPOSITION    7
19
20 // === IMPORTS ===
21 // TODO: Move out
22 const char      *gsMouseDevice;
23  int    giTerminalFD;
24  int    giScreenWidth;
25  int    giScreenHeight;
26
27 // === GLOBALS ===
28  int    giMouseFD;
29
30 // === CODE ===
31 int Input_Init(void)
32 {
33         tNumValue       num_value;
34
35         // Open mouse for RW
36         giMouseFD = open(gsMouseDevice, 3);
37
38         // Set mouse limits
39         // TODO: Update these if the screen resolution changes
40         num_value.Num = 0;      num_value.Value = giScreenWidth;
41         ioctl(giMouseFD, JOY_IOCTL_GETSETAXISLIMIT, &num_value);
42         num_value.Value = giScreenWidth/2;
43         ioctl(giMouseFD, JOY_IOCTL_GETSETAXISPOSITION, &num_value);
44
45         num_value.Num = 1;      num_value.Value = giScreenHeight;
46         ioctl(giMouseFD, JOY_IOCTL_GETSETAXISLIMIT, &num_value);
47         num_value.Value = giScreenHeight/2;
48         ioctl(giMouseFD, JOY_IOCTL_GETSETAXISPOSITION, &num_value);
49
50         return 0;
51 }
52
53 void Input_FillSelect(int *nfds, fd_set *set)
54 {
55         if(*nfds < giTerminalFD)        *nfds = giTerminalFD;
56         if(*nfds < giMouseFD)   *nfds = giMouseFD;
57         FD_SET(giTerminalFD, set);
58         FD_SET(giMouseFD, set);
59 }
60
61 void Input_HandleSelect(fd_set *set)
62 {
63         if(FD_ISSET(giTerminalFD, set))
64         {
65                 uint32_t        codepoint;
66                 if( read(giTerminalFD, &codepoint, sizeof(codepoint)) != sizeof(codepoint) )
67                 {
68                         // oops, error
69                 }
70                 // TODO: pass on to message handler
71                 _SysDebug("Keypress 0x%x", codepoint);
72         }
73
74         if(FD_ISSET(giMouseFD, set))
75         {
76                 struct sMouseInfo {
77                         uint16_t        NAxies;
78                         uint16_t        NButtons;
79                         struct sMouseAxis {
80                                  int16_t        MinValue;
81                                  int16_t        MaxValue;
82                                  int16_t        CurValue;
83                                 uint16_t        CursorPos;
84                         }       Axies[2];
85                         uint8_t Buttons[3];
86                 }       mouseinfo;
87         
88                 seek(giMouseFD, 0, SEEK_SET);
89                 if( read(giMouseFD, &mouseinfo, sizeof(mouseinfo)) != sizeof(mouseinfo) )
90                 {
91                         // Not a 3 button mouse, oops
92                         return ;
93                 }
94
95                 // Handle movement
96                 Video_SetCursorPos( mouseinfo.Axies[0].CursorPos, mouseinfo.Axies[1].CursorPos );
97                 
98
99                 // TODO: Handle button presses
100         }
101 }

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