comments added and improved code look(windows part) gsoc2008_manymouse
authorSzymon Wilczek <kazeuser@gmail.com>
Sat, 02 Aug 2008 14:02:28 +0000
branchgsoc2008_manymouse
changeset 3771 8cc36a399a12
parent 3770 81b649bad6d2
child 3772 9087a84cba51
comments added and improved code look(windows part)
src/events/SDL_mouse.c
src/video/win32/SDL_win32events.c
src/video/win32/SDL_win32mouse.c
src/video/win32/SDL_win32video.c
src/video/win32/SDL_win32window.c
--- a/src/events/SDL_mouse.c	Thu Jul 31 14:41:48 2008 +0000
+++ b/src/events/SDL_mouse.c	Sat Aug 02 14:02:28 2008 +0000
@@ -33,8 +33,8 @@
 static SDL_Mouse **SDL_mice=NULL;
 static int *SDL_IdIndex=NULL;
 static int SDL_highestId=-1;
-static int last_x, last_y;
-int x_max, y_max;
+static int last_x, last_y;/*the last reported x and y coordinates by the system cursor*/
+int x_max, y_max; /*current window width and height*/
 /* Public functions */
 int
 SDL_MouseInit(void)
@@ -77,6 +77,8 @@
         return -1;
     }
     *SDL_mice[index] = *mouse;
+
+	/*we're setting the mouse properties*/
 	length=0;
 	length=SDL_strlen(name);
     SDL_mice[index]->name=SDL_malloc((length+1)*sizeof(char));
@@ -90,7 +92,11 @@
         SDL_CreateCursor(default_cdata, default_cmask, DEFAULT_CWIDTH,
                          DEFAULT_CHEIGHT, DEFAULT_CHOTX, DEFAULT_CHOTY);
     SDL_SetCursor(SDL_mice[index]->def_cursor);
+	/*we're assuming that all mouses are in the computer sensing zone*/
     SDL_mice[index]->proximity=SDL_TRUE;
+	/*we're assuming that all mouses are working in the absolute position mode
+	thanx to that, the users that don't want to use many mouses don't have to
+	worry about anything*/
     SDL_mice[index]->relative_mode=SDL_FALSE;
     SDL_SelectMouse(selected_mouse);
 
@@ -361,6 +367,8 @@
     int posted;
     int xrel;
     int yrel;
+	/*while using the relative mode and many windows, we have to be sure,
+	that the pointers find themselves inside the windows*/
 	if(x>x_max)
 	{
 		x=x_max;
@@ -369,23 +377,23 @@
 	{
 		y=y_max;
 	}
+
     if (!mouse || mouse->flush_motion) {
         return 0;
     }
+
+	/*if the mouse is out of proximity we don't to want to have any motion from it*/
     if(mouse->proximity==SDL_FALSE)
     {
         last_x=x;
         last_y=y;
         return 0;
     }
-    if (mouse->relative_mode==SDL_TRUE && mouse->proximity==SDL_TRUE) {
-        /* Push the cursor around */
-        xrel = x - last_x;
-        yrel = y - last_y;
-    } else {
-        xrel = x - last_x;
-        yrel = y - last_y;
-    }
+
+	/*the relative motion is calculated regarding the system cursor last position*/
+
+    xrel = x - last_x;
+    yrel = y - last_y;
 
     /* Drop events that don't change state */
     if (!xrel && !yrel) {
@@ -395,7 +403,7 @@
         return 0;
     }
 
-    /* Update internal mouse state */
+    /* Update internal mouse coordinates */
     if (mouse->relative_mode==SDL_FALSE) {
         mouse->x = x;
         mouse->y = y;
--- a/src/video/win32/SDL_win32events.c	Thu Jul 31 14:41:48 2008 +0000
+++ b/src/video/win32/SDL_win32events.c	Sat Aug 02 14:02:28 2008 +0000
@@ -64,7 +64,7 @@
 extern int total_mice;
 extern int tablet;
 
-int pressure=0;
+int pressure=0;/*the pressure reported by the tablet*/
 
 static WPARAM
 RemapVKEY(WPARAM wParam, LPARAM lParam)
@@ -138,6 +138,7 @@
     switch (msg) {
 		case WT_PACKET:
 		{
+			/*if we receive such data we need to update the pressure*/
 			if (WTPacket((HCTX)lParam, wParam, &packet))
 			{
 				pressure=(int)packet.pkNormalPressure;
@@ -146,10 +147,12 @@
 		break;
 	case WT_PROXIMITY:
 		{
+			/*checking where the proximity message showed up*/
 			int h_context=LOWORD(lParam);
 			LPPOINT point;
 			GetCursorPos(&point);
 			ScreenToClient(hwnd, &point);
+			/*are we in proximity or out of proximity*/
 			if(h_context==0)
 			{
 				SDL_SendProximity(tablet, (int)(&point->x),(int)(&point->y), SDL_PROXIMITYOUT);
@@ -206,7 +209,7 @@
             return (0);
         }
         break;
-	case WM_INPUT:
+	case WM_INPUT:/*mouse events*/
 		{
 			LPBYTE lpb;
 			int w, h;
@@ -214,16 +217,19 @@
 			int index;
 			int i;
 			int size=0;
-            SDL_Mouse *mouse;
 			const RAWMOUSE *raw_mouse=NULL;
 			LPPOINT point;
 			USHORT flags;
+
+			/*we're collecting data from the mouse*/
 			GetRawInputData((HRAWINPUT) lParam, RID_INPUT, NULL, &size, sizeof (RAWINPUTHEADER));
 			lpb = SDL_malloc(size*sizeof(LPBYTE));
 			GetRawInputData((HRAWINPUT) lParam, RID_INPUT, lpb, &size, sizeof (RAWINPUTHEADER));
 			raw = (RAWINPUT *) lpb;
 			header = &raw->header;
 			flags=raw->data.mouse.usButtonFlags;
+
+			/*we're checking which mouse generated the event*/
 			for(i=0;i<total_mice;++i)
 			{
 				if(mice[i]==header->hDevice)
@@ -232,11 +238,13 @@
 					break;
 				}
 			}
-            mouse = SDL_GetMouse(index);
+          
 			GetCursorPos(&point);
 			ScreenToClient(hwnd, &point);
 			SDL_GetWindowSize(data->windowID, &w, &h);
-			SDL_UpdateCoordinates(w,h);
+			SDL_UpdateCoordinates(w,h);/*we're updating the current window size*/
+
+			/*if the message was sent by a tablet we have to send also pressure*/
 			if(i==tablet)
 			{
 				SDL_SendMouseMotion(index,0,(int)(&point->x),(int)(&point->y),pressure);
@@ -245,6 +253,7 @@
 			{
 				SDL_SendMouseMotion(index,0,(int)(&point->x),(int)(&point->y),0);
 			}
+			/*we're sending mouse buttons messages to check up if sth changed*/
 			if(flags & RI_MOUSE_BUTTON_1_DOWN)
 			{
 				SDL_SendMouseButton(index,SDL_PRESSED,SDL_BUTTON_LEFT);
--- a/src/video/win32/SDL_win32mouse.c	Thu Jul 31 14:41:48 2008 +0000
+++ b/src/video/win32/SDL_win32mouse.c	Sat Aug 02 14:02:28 2008 +0000
@@ -20,6 +20,8 @@
     slouken@libsdl.org
 */
 
+/*we need to define it, so that raw input is included*/
+
 #if (_WIN32_WINNT < 0x0501)
 #undef _WIN32_WINNT
 #define _WIN32_WINNT 0x0501
@@ -51,10 +53,12 @@
 	int i;
 	int tmp=0;
 	char* buffer=NULL;
-	char* tab="wacom";
+	char* tab="wacom";/*since windows does't give us handles to tablets, we have to detect a tablet by it's name*/
 
     SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
 
+	/*we're checking for the number of rawinput devices*/
+
 	if(GetRawInputDeviceList(NULL,&devCount,sizeof(RAWINPUTDEVICELIST)))
 	{
 		return;
@@ -64,10 +68,14 @@
 		deviceList = SDL_malloc(sizeof(RAWINPUTDEVICELIST)*devCount);
 	}
 
+	/*we're getting the raw input device list*/
+
 	GetRawInputDeviceList(deviceList,&devCount,sizeof(RAWINPUTDEVICELIST));
 
 	mice = SDL_malloc(devCount*sizeof(HANDLE));
 
+	/*we're getting the details of the devices*/
+
 	for(i=0;i<devCount;++i)
 	{
 		int j;
@@ -83,7 +91,7 @@
 		DWORD out=256*sizeof(char);
 		SDL_Mouse mouse;
 		int l;
-		if(deviceList[i].dwType!=RIM_TYPEMOUSE)
+		if(deviceList[i].dwType!=RIM_TYPEMOUSE) /*if a device isn't a mouse type we don't want it*/
 		{
 			continue;
 		}
@@ -91,9 +99,13 @@
 		{
 			continue;
 		}
+
 		buffer = SDL_malloc((tmp+1)*sizeof(char));
 		key_name = SDL_malloc(tmp + sizeof(reg_key_root)*sizeof(char));
 
+		/*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*/
+
 		if(GetRawInputDeviceInfoA(deviceList[i].hDevice, RIDI_DEVICENAME, buffer, &tmp)<0)
 		{
 			continue;
@@ -120,6 +132,8 @@
 	SDL_memcpy(key_name, reg_key_root, SDL_strlen (reg_key_root));
     SDL_memcpy(key_name + (SDL_strlen (reg_key_root)), buffer, j + 1);
     
+	/*we're opening the registry key to get the mouse name*/
+
 	rc = RegOpenKeyExA(HKEY_LOCAL_MACHINE, key_name, 0, KEY_READ, &hkey);
     
 	if (rc != ERROR_SUCCESS)
@@ -129,46 +143,50 @@
 
     rc = RegQueryValueExA(hkey, "DeviceDesc", NULL, &regtype, device_name, &out);
     RegCloseKey(hkey);
+
     if (rc != ERROR_SUCCESS)
 	{
         SDL_memcpy(device_name, default_device_name, SDL_strlen(default_device_name));
-    } 
-		mice[index]=deviceList[i].hDevice;
-		SDL_zero(mouse);
-		SDL_SetIndexId(index,index);
-		l=SDL_strlen(device_name);
-		if(tablet==-1)
+    }
+	/*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)
 		{
-			for(j=0;j<l-5;++j)
+			for(k=0;k<5;++k)
 			{
-				for(k=0;k<5;++k)
+				if(tab[k]!=SDL_tolower((unsigned char)device_name[j+k]))
 				{
-					if(tab[k]!=SDL_tolower((unsigned char)device_name[j+k]))
-					{
-						break;
-					}
-				}
-				if(k==5)
-				{
-					tablet=index;
 					break;
 				}
 			}
-		}
-		if(tablet==index)
-		{
-			AXIS pressure;
-			WTInfo(WTI_DEVICES,DVC_NPRESSURE, &pressure);
-			data->mouse = SDL_AddMouse(&mouse, index,device_name,pressure.axMax,pressure.axMin);
+			if(k==5)
+			{
+				tablet=index;
+				break;
+			}
 		}
-		else
-		{
-			data->mouse = SDL_AddMouse(&mouse, index,device_name,0,0);
-		}
-		++index;
+	}
+	/*if it's a tablet, let's read it's maximum and minimum pressure*/
+	if(tablet==index)
+	{
+		AXIS pressure;
+		WTInfo(WTI_DEVICES,DVC_NPRESSURE, &pressure);
+		data->mouse = SDL_AddMouse(&mouse, index,device_name,pressure.axMax,pressure.axMin);
+	}
+	else
+	{
+		data->mouse = SDL_AddMouse(&mouse, index,device_name,0,0);
+	}
+	++index;
 
-		SDL_free(buffer);
-		SDL_free(key_name);
+	SDL_free(buffer);
+	SDL_free(key_name);
 	}
 	total_mice=index;
 	SDL_free(deviceList);
@@ -179,10 +197,8 @@
 {
 	int i;
     SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
-	for(i=0;i<total_mice;++i)
-	{
-		SDL_DelMouse(i);
-	}
+	/*let's delete all of the mouses*/
+	SDL_MouseQuit();
 }
 
 /* vi: set ts=4 sw=4 expandtab: */
--- a/src/video/win32/SDL_win32video.c	Thu Jul 31 14:41:48 2008 +0000
+++ b/src/video/win32/SDL_win32video.c	Sat Aug 02 14:02:28 2008 +0000
@@ -37,10 +37,10 @@
 static int WIN_VideoInit(_THIS);
 static void WIN_VideoQuit(_THIS);
 
-int total_mice =0;
-HANDLE* mice = NULL;
-HCTX* g_hCtx = NULL;
-int tablet=-1;
+int total_mice = 0; /*total mouse count*/
+HANDLE* mice = NULL; /*the handles to the detected mice*/
+HCTX* g_hCtx = NULL; /*handles to tablet contexts*/
+int tablet=-1; /*we're assuming that there is no tablet*/
 
 /* WIN32 driver bootstrap functions */
 
--- a/src/video/win32/SDL_win32window.c	Thu Jul 31 14:41:48 2008 +0000
+++ b/src/video/win32/SDL_win32window.c	Sat Aug 02 14:02:28 2008 +0000
@@ -20,6 +20,8 @@
     slouken@libsdl.org
 */
 
+/*we need to define it, so that raw input is included*/
+
 #if (_WIN32_WINNT < 0x0501)
 #undef _WIN32_WINNT
 #define _WIN32_WINNT 0x0501
@@ -36,13 +38,14 @@
 #include "SDL_syswm.h"
 
 #include <wintab.h>
+/*we're telling wintab that we want to receive movement, button events and pressure information in packets*/
 #define PACKETDATA ( PK_X | PK_Y | PK_BUTTONS | PK_NORMAL_PRESSURE)
 #define PACKETMODE 0
 #include <pktdef.h>
 
-extern HCTX* g_hCtx;
+extern HCTX* g_hCtx; /*the table of tablet event contexts, each windows has to have it's own tablet context*/
 
-int highestId=0;
+int highestId=0; /*the highest id of the tablet context*/
 
 static int
 SetupWindowData(_THIS, SDL_Window * window, HWND hwnd, SDL_bool created)
@@ -198,46 +201,53 @@
         CreateWindow(SDL_Appname, TEXT(""), style, x, y, w, h, NULL, NULL,
                      SDL_Instance, NULL);
 	
-	WTInfo(WTI_DEFSYSCTX, 0, &lc);
-	lc.lcPktData = PACKETDATA;
-	lc.lcPktMode = PACKETMODE;
-	lc.lcOptions |= CXO_MESSAGES;
-	lc.lcOptions |= CXO_SYSTEM;
-	lc.lcMoveMask = PACKETDATA;
-	lc.lcBtnDnMask=lc.lcBtnUpMask = PACKETDATA;
+	/*we're configuring the tablet data. See Wintab reference for more info*/
+	
+	if(WTInfo(WTI_DEFSYSCTX, 0, &lc)!=0)
+	{
+	
+		lc.lcPktData = PACKETDATA;
+		lc.lcPktMode = PACKETMODE;
+		lc.lcOptions |= CXO_MESSAGES;
+		lc.lcOptions |= CXO_SYSTEM;
+		lc.lcMoveMask = PACKETDATA;
+		lc.lcBtnDnMask=lc.lcBtnUpMask = PACKETDATA;
 
-	WTInfo(WTI_DEVICES,DVC_X,&TabX);
-	WTInfo(WTI_DEVICES,DVC_Y,&TabY);
+		WTInfo(WTI_DEVICES,DVC_X,&TabX);
+		WTInfo(WTI_DEVICES,DVC_Y,&TabY);
 	
-	lc.lcInOrgX = 0;
-	lc.lcInOrgY = 0;
+		lc.lcInOrgX = 0;
+		lc.lcInOrgY = 0;
 	
-	lc.lcInExtX = TabX.axMax;
-	lc.lcInExtY = TabY.axMax;
+		lc.lcInExtX = TabX.axMax;
+		lc.lcInExtY = TabY.axMax;
 
-	lc.lcOutOrgX = 0;
-	lc.lcOutOrgY = 0;
+		lc.lcOutOrgX = 0;
+		lc.lcOutOrgY = 0;
+
+		lc.lcOutExtX = GetSystemMetrics(SM_CXSCREEN);
+		lc.lcOutExtY = -GetSystemMetrics(SM_CYSCREEN);
 
-	lc.lcOutExtX = GetSystemMetrics(SM_CXSCREEN);
-	lc.lcOutExtY = -GetSystemMetrics(SM_CYSCREEN);
-	if(window->id>highestId)
-	{
-		HCTX* tmp_hctx;
-		highestId=window->id;
-		tmp_hctx= (HCTX*)SDL_realloc(g_hCtx,(highestId+1)*sizeof(HCTX));
-		if (!tmp_hctx) {
-            SDL_OutOfMemory();
-            return -1;
-        }
-		g_hCtx=tmp_hctx;
+		if(window->id>highestId)
+		{
+			HCTX* tmp_hctx;
+			highestId=window->id;
+			tmp_hctx= (HCTX*)SDL_realloc(g_hCtx,(highestId+1)*sizeof(HCTX));
+			if (!tmp_hctx) {
+				SDL_OutOfMemory();
+				return -1;
+			}
+			g_hCtx=tmp_hctx;
+		}
+
+		g_hCtx[window->id] = WTOpen(hwnd, &lc, TRUE);
 	}
 
-	g_hCtx[window->id] = WTOpen(hwnd, &lc, TRUE);
+	/*we're telling the window, we want it to report raw input events from mice*/
 
 	Rid.usUsagePage = 0x01; 
 	Rid.usUsage = 0x02; 
-	//Rid.usUsage = MOUSE_MOVE_ABSOLUTE;
-	Rid.dwFlags = RIDEV_INPUTSINK;   // adds HID mouse and also ignores legacy mouse messages
+	Rid.dwFlags = RIDEV_INPUTSINK;  
 	Rid.hwndTarget = hwnd;
 
 	RegisterRawInputDevices(&Rid, 1, sizeof(Rid));
@@ -456,6 +466,7 @@
             DestroyWindow(data->hwnd);
         }
         SDL_free(data);
+		/*lets close the tablet context for the destoryed window*/
 		WTClose(g_hCtx[window->id]);
     }
 }