diff src/video/win32/SDL_win32mouse.c @ 3768:1b87a8beab9d gsoc2008_manymouse

Project part1
author Szymon Wilczek <kazeuser@gmail.com>
date Wed, 30 Jul 2008 16:09:24 +0000
parents c121d94672cb
children 81b649bad6d2
line wrap: on
line diff
--- a/src/video/win32/SDL_win32mouse.c	Wed Jul 23 16:12:43 2008 +0000
+++ b/src/video/win32/SDL_win32mouse.c	Wed Jul 30 16:09:24 2008 +0000
@@ -1,46 +1,165 @@
-/*
-    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
-*/
-#include "SDL_config.h"
-
-#include "SDL_win32video.h"
-
-#include "../../events/SDL_mouse_c.h"
-
-void
-WIN_InitMouse(_THIS)
-{
-    SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
-    SDL_Mouse mouse;
-
-    SDL_zero(mouse);
-    data->mouse = SDL_AddMouse(&mouse, -1);
-}
-
-void
-WIN_QuitMouse(_THIS)
-{
-    SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
-
-    SDL_DelMouse(data->mouse);
-}
-
-/* vi: set ts=4 sw=4 expandtab: */
+/*
+    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
+*/
+
+#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"
+
+extern int total_mice;
+
+extern HANDLE* mice;
+
+extern int total_mice;
+
+RAWINPUTDEVICE *Rid=NULL;
+
+void
+WIN_InitMouse(_THIS)
+{
+	int index=0;
+	RAWINPUTDEVICELIST *deviceList=NULL;
+	int devCount=0;
+	int i;
+	int tmp=0;
+	char* buffer=NULL;
+
+    SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
+
+	if(GetRawInputDeviceList(NULL,&devCount,sizeof(RAWINPUTDEVICELIST)))
+	{
+		return;
+	}
+	else
+	{
+		deviceList = SDL_malloc(sizeof(RAWINPUTDEVICELIST)*devCount);
+	}
+
+	GetRawInputDeviceList(deviceList,&devCount,sizeof(RAWINPUTDEVICELIST));
+
+	mice = SDL_malloc(devCount*sizeof(HANDLE));
+
+	for(i=0;i<devCount;++i)
+	{
+		int j;
+		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;
+		if(deviceList[i].dwType!=RIM_TYPEMOUSE)
+		{
+			continue;
+		}
+		if(GetRawInputDeviceInfoA(deviceList[i].hDevice, RIDI_DEVICENAME, NULL, &tmp)<0)
+		{
+			continue;
+		}
+		buffer = SDL_malloc((tmp+1)*sizeof(char));
+		key_name = SDL_malloc(tmp + sizeof(reg_key_root)*sizeof(char));
+
+		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);
+    
+	rc = RegOpenKeyExA(HKEY_LOCAL_MACHINE, key_name, 0, KEY_READ, &hkey);
+    
+	if (rc != ERROR_SUCCESS)
+        return;
+
+    rc = RegQueryValueExA(hkey, "DeviceDesc", NULL, &regtype, device_name, &out);
+    RegCloseKey(hkey);
+    if (rc != ERROR_SUCCESS)
+	{
+		return;
+        //SDL_memcpy(device_name, default_device_name, SDL_strlen(default_device_name));
+    } 
+    //device_name[254] = '\0';
+
+		mice[index]=deviceList[i].hDevice;
+		SDL_zero(mouse);
+		SDL_SetIndexId(index,index);
+		data->mouse = SDL_AddMouse(&mouse, index,device_name,0,0);
+		//data->mouse = SDL_AddMouse(&mouse, index,key_name,0,0);
+		++index;
+
+		SDL_free(buffer);
+		SDL_free(key_name);
+	}
+	Rid = SDL_malloc(sizeof(RAWINPUTDEVICE));
+	/*Rid[0].usUsagePage = 0x01; 
+	Rid[0].usUsage = 0x02; 
+	Rid[0].dwFlags = RIDEV_INPUTSINK;   // adds HID mouse and also ignores legacy mouse messages
+	Rid[0].hwndTarget = NULL;
+
+	RegisterRawInputDevices(Rid, 1, sizeof(Rid[0]));*/
+
+	total_mice=index;
+	SDL_free(deviceList);
+}
+
+void
+WIN_QuitMouse(_THIS)
+{
+	int i;
+    SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
+	for(i=0;i<total_mice;++i)
+	{
+		SDL_DelMouse(i);
+	}
+	SDL_free(Rid);
+}
+
+/* vi: set ts=4 sw=4 expandtab: */