Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Latest commit

 

History

History
207 lines (170 loc) · 5.04 KB

SDL_win32mouse.c

File metadata and controls

207 lines (170 loc) · 5.04 KB
 
Jul 30, 2008
Jul 30, 2008
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997-2006 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Sam Lantinga
slouken@libsdl.org
*/
Aug 2, 2008
Aug 2, 2008
23
24
/*we need to define it, so that raw input is included*/
Jul 30, 2008
Jul 30, 2008
25
26
27
28
29
30
31
32
33
34
35
#if (_WIN32_WINNT < 0x0501)
#undef _WIN32_WINNT
#define _WIN32_WINNT 0x0501
#endif
#include "SDL_config.h"
#include "SDL_win32video.h"
#include "../../events/SDL_mouse_c.h"
Jul 31, 2008
Jul 31, 2008
36
#include <wintab.h>
Aug 5, 2008
Aug 5, 2008
37
#define PACKETDATA ( PK_X | PK_Y | PK_BUTTONS | PK_NORMAL_PRESSURE | PK_CURSOR)
Jul 31, 2008
Jul 31, 2008
38
39
#define PACKETMODE 0
#include <pktdef.h>
Jul 30, 2008
Jul 30, 2008
40
41
42
43
44
extern HANDLE* mice;
extern int total_mice;
Jul 31, 2008
Jul 31, 2008
45
extern int tablet;
Jul 30, 2008
Jul 30, 2008
46
47
48
49
50
51
52
53
54
55
void
WIN_InitMouse(_THIS)
{
int index=0;
RAWINPUTDEVICELIST *deviceList=NULL;
int devCount=0;
int i;
int tmp=0;
char* buffer=NULL;
Aug 2, 2008
Aug 2, 2008
56
char* tab="wacom";/*since windows does't give us handles to tablets, we have to detect a tablet by it's name*/
Jul 30, 2008
Jul 30, 2008
57
58
59
SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
Aug 2, 2008
Aug 2, 2008
60
61
/*we're checking for the number of rawinput devices*/
Jul 30, 2008
Jul 30, 2008
62
63
64
65
66
67
68
69
70
if(GetRawInputDeviceList(NULL,&devCount,sizeof(RAWINPUTDEVICELIST)))
{
return;
}
else
{
deviceList = SDL_malloc(sizeof(RAWINPUTDEVICELIST)*devCount);
}
Aug 2, 2008
Aug 2, 2008
71
72
/*we're getting the raw input device list*/
Jul 30, 2008
Jul 30, 2008
73
74
75
76
GetRawInputDeviceList(deviceList,&devCount,sizeof(RAWINPUTDEVICELIST));
mice = SDL_malloc(devCount*sizeof(HANDLE));
Aug 2, 2008
Aug 2, 2008
77
78
/*we're getting the details of the devices*/
Jul 30, 2008
Jul 30, 2008
79
80
81
for(i=0;i<devCount;++i)
{
int j;
Jul 31, 2008
Jul 31, 2008
82
int k;
Jul 30, 2008
Jul 30, 2008
83
84
85
86
87
88
89
90
91
92
char *default_device_name="Pointing device xx";
const char *reg_key_root = "System\\CurrentControlSet\\Enum\\";
char *device_name=SDL_malloc(256*sizeof(char));
char *key_name=NULL;
char *tmp_name=NULL;
LONG rc = 0;
HKEY hkey;
DWORD regtype = REG_SZ;
DWORD out=256*sizeof(char);
SDL_Mouse mouse;
Jul 31, 2008
Jul 31, 2008
93
int l;
Aug 2, 2008
Aug 2, 2008
94
if(deviceList[i].dwType!=RIM_TYPEMOUSE) /*if a device isn't a mouse type we don't want it*/
Jul 30, 2008
Jul 30, 2008
95
96
97
98
99
100
101
{
continue;
}
if(GetRawInputDeviceInfoA(deviceList[i].hDevice, RIDI_DEVICENAME, NULL, &tmp)<0)
{
continue;
}
Aug 2, 2008
Aug 2, 2008
102
Jul 30, 2008
Jul 30, 2008
103
104
105
buffer = SDL_malloc((tmp+1)*sizeof(char));
key_name = SDL_malloc(tmp + sizeof(reg_key_root)*sizeof(char));
Aug 2, 2008
Aug 2, 2008
106
107
108
/*we're getting the device registry path and polishing it to get it's name,
surely there must be an easier way, but we haven't found it yet*/
Jul 30, 2008
Jul 30, 2008
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
if(GetRawInputDeviceInfoA(deviceList[i].hDevice, RIDI_DEVICENAME, buffer, &tmp)<0)
{
continue;
}
buffer+=4;
tmp-=4;
tmp_name=buffer;
for(j=0;j<tmp;++j)
{
if(*tmp_name=='#')
{
*tmp_name='\\';
}
else if(*tmp_name=='{')
{
break;
}
++tmp_name;
}
*tmp_name='\0';
SDL_memcpy(key_name, reg_key_root, SDL_strlen (reg_key_root));
SDL_memcpy(key_name + (SDL_strlen (reg_key_root)), buffer, j + 1);
Aug 2, 2008
Aug 2, 2008
135
136
/*we're opening the registry key to get the mouse name*/
Jul 30, 2008
Jul 30, 2008
137
138
139
rc = RegOpenKeyExA(HKEY_LOCAL_MACHINE, key_name, 0, KEY_READ, &hkey);
if (rc != ERROR_SUCCESS)
Jul 31, 2008
Jul 31, 2008
140
141
142
{
SDL_memcpy(device_name, default_device_name, SDL_strlen(default_device_name));
}
Jul 30, 2008
Jul 30, 2008
143
144
145
rc = RegQueryValueExA(hkey, "DeviceDesc", NULL, &regtype, device_name, &out);
RegCloseKey(hkey);
Aug 2, 2008
Aug 2, 2008
146
Jul 30, 2008
Jul 30, 2008
147
148
if (rc != ERROR_SUCCESS)
{
Jul 31, 2008
Jul 31, 2008
149
SDL_memcpy(device_name, default_device_name, SDL_strlen(default_device_name));
Aug 2, 2008
Aug 2, 2008
150
151
152
153
154
155
156
157
158
159
}
/*we're saving the handle to the device*/
mice[index]=deviceList[i].hDevice;
SDL_zero(mouse);
SDL_SetIndexId(index,index);
l=SDL_strlen(device_name);
/*we're checking if the device isn't by any chance a tablet*/
if(tablet==-1)
{
for(j=0;j<l-5;++j)
Jul 31, 2008
Jul 31, 2008
160
{
Aug 2, 2008
Aug 2, 2008
161
for(k=0;k<5;++k)
Jul 31, 2008
Jul 31, 2008
162
{
Aug 2, 2008
Aug 2, 2008
163
if(tab[k]!=SDL_tolower((unsigned char)device_name[j+k]))
Jul 31, 2008
Jul 31, 2008
164
165
166
167
{
break;
}
}
Aug 2, 2008
Aug 2, 2008
168
169
170
171
172
if(k==5)
{
tablet=index;
break;
}
Jul 31, 2008
Jul 31, 2008
173
}
Aug 2, 2008
Aug 2, 2008
174
175
176
177
178
}
/*if it's a tablet, let's read it's maximum and minimum pressure*/
if(tablet==index)
{
AXIS pressure;
Aug 5, 2008
Aug 5, 2008
179
int cursors;
Aug 2, 2008
Aug 2, 2008
180
WTInfo(WTI_DEVICES,DVC_NPRESSURE, &pressure);
Aug 5, 2008
Aug 5, 2008
181
182
WTInfo(WTI_DEVICES,DVC_NCSRTYPES, &cursors);
data->mouse = SDL_AddMouse(&mouse, index,device_name,pressure.axMax,pressure.axMin,cursors);
Aug 2, 2008
Aug 2, 2008
183
184
185
}
else
{
Aug 5, 2008
Aug 5, 2008
186
data->mouse = SDL_AddMouse(&mouse, index,device_name,0,0,1);
Aug 2, 2008
Aug 2, 2008
187
188
}
++index;
Jul 30, 2008
Jul 30, 2008
189
Aug 2, 2008
Aug 2, 2008
190
191
SDL_free(buffer);
SDL_free(key_name);
Jul 30, 2008
Jul 30, 2008
192
193
194
195
196
197
198
199
200
201
}
total_mice=index;
SDL_free(deviceList);
}
void
WIN_QuitMouse(_THIS)
{
int i;
SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
Aug 2, 2008
Aug 2, 2008
202
203
/*let's delete all of the mouses*/
SDL_MouseQuit();
Jul 30, 2008
Jul 30, 2008
204
205
206
}
/* vi: set ts=4 sw=4 expandtab: */
Jul 31, 2008
Jul 31, 2008
207