View | Details | Raw Unified | Return to bug 200173
Collapse All | Expand All

(-)/usr/ports/devel/sdl12/files/patch-src_joystick_bsd_SDL_sysjoystick.c (-3 / +199 lines)
Lines 1-5 Link Here
1
--- src/joystick/bsd/SDL_sysjoystick.c.orig	2012-01-19 07:30:06.000000000 +0100
1
--- SDL_sysjoystick.c.orig	2012-01-19 15:30:06.000000000 +0900
2
+++ src/joystick/bsd/SDL_sysjoystick.c	2012-07-21 10:09:16.000000000 +0200
2
+++ SDL_sysjoystick.c	2015-05-06 22:52:50.648504057 +0900
3
@@ -82,7 +82,9 @@
3
@@ -82,7 +82,9 @@
4
 #define MAX_JOYS	(MAX_UHID_JOYS + MAX_JOY_JOYS)
4
 #define MAX_JOYS	(MAX_UHID_JOYS + MAX_JOY_JOYS)
5
 
5
 
Lines 23-29 Link Here
23
 #elif (defined(__FREEBSD__) && (__FreeBSD_kernel_version > 800063))
23
 #elif (defined(__FREEBSD__) && (__FreeBSD_kernel_version > 800063))
24
 #define REP_BUF_DATA(rep) ((rep)->buf->ugd_data)
24
 #define REP_BUF_DATA(rep) ((rep)->buf->ugd_data)
25
 #else
25
 #else
26
@@ -582,8 +586,12 @@
26
@@ -411,47 +415,47 @@
27
 	struct joystick gameport;
28
  
29
 	if (joy->hwdata->type == BSDJOY_JOY) {
30
-		if (read(joy->hwdata->fd, &gameport, sizeof gameport) != sizeof gameport)
31
-			return;
32
-		if (abs(joy->hwdata->x - gameport.x) > 8) {
33
-			joy->hwdata->x = gameport.x;
34
-			if (joy->hwdata->x < joy->hwdata->xmin) {
35
-				joy->hwdata->xmin = joy->hwdata->x;
36
-			}
37
-			if (joy->hwdata->x > joy->hwdata->xmax) {
38
-				joy->hwdata->xmax = joy->hwdata->x;
39
-			}
40
-			if (joy->hwdata->xmin == joy->hwdata->xmax) {
41
-				joy->hwdata->xmin--;
42
-				joy->hwdata->xmax++;
43
-			}
44
-			v = (Sint32)joy->hwdata->x;
45
-			v -= (joy->hwdata->xmax + joy->hwdata->xmin + 1)/2;
46
-			v *= 32768/((joy->hwdata->xmax - joy->hwdata->xmin + 1)/2);
47
-			SDL_PrivateJoystickAxis(joy, 0, v);
48
-		}
49
-		if (abs(joy->hwdata->y - gameport.y) > 8) {
50
-			joy->hwdata->y = gameport.y;
51
-			if (joy->hwdata->y < joy->hwdata->ymin) {
52
-				joy->hwdata->ymin = joy->hwdata->y;
53
+		while (read(joy->hwdata->fd, &gameport, sizeof gameport) == sizeof gameport) {
54
+			if (abs(joy->hwdata->x - gameport.x) > 8) {
55
+				joy->hwdata->x = gameport.x;
56
+				if (joy->hwdata->x < joy->hwdata->xmin) {
57
+					joy->hwdata->xmin = joy->hwdata->x;
58
+				}
59
+				if (joy->hwdata->x > joy->hwdata->xmax) {
60
+					joy->hwdata->xmax = joy->hwdata->x;
61
+				}
62
+				if (joy->hwdata->xmin == joy->hwdata->xmax) {
63
+					joy->hwdata->xmin--;
64
+					joy->hwdata->xmax++;
65
+				}
66
+				v = (Sint32)joy->hwdata->x;
67
+				v -= (joy->hwdata->xmax + joy->hwdata->xmin + 1)/2;
68
+				v *= 32768/((joy->hwdata->xmax - joy->hwdata->xmin + 1)/2);
69
+				SDL_PrivateJoystickAxis(joy, 0, v);
70
+			}
71
+			if (abs(joy->hwdata->y - gameport.y) > 8) {
72
+				joy->hwdata->y = gameport.y;
73
+				if (joy->hwdata->y < joy->hwdata->ymin) {
74
+					joy->hwdata->ymin = joy->hwdata->y;
75
+				}
76
+				if (joy->hwdata->y > joy->hwdata->ymax) {
77
+					joy->hwdata->ymax = joy->hwdata->y;
78
+				}
79
+				if (joy->hwdata->ymin == joy->hwdata->ymax) {
80
+					joy->hwdata->ymin--;
81
+					joy->hwdata->ymax++;
82
+				}
83
+				v = (Sint32)joy->hwdata->y;
84
+				v -= (joy->hwdata->ymax + joy->hwdata->ymin + 1)/2;
85
+				v *= 32768/((joy->hwdata->ymax - joy->hwdata->ymin + 1)/2);
86
+				SDL_PrivateJoystickAxis(joy, 1, v);
87
 			}
88
-			if (joy->hwdata->y > joy->hwdata->ymax) {
89
-				joy->hwdata->ymax = joy->hwdata->y;
90
+			if (gameport.b1 != joy->buttons[0]) {
91
+				SDL_PrivateJoystickButton(joy, 0, gameport.b1);
92
 			}
93
-			if (joy->hwdata->ymin == joy->hwdata->ymax) {
94
-				joy->hwdata->ymin--;
95
-				joy->hwdata->ymax++;
96
+			if (gameport.b2 != joy->buttons[1]) {
97
+				SDL_PrivateJoystickButton(joy, 1, gameport.b2);
98
 			}
99
-			v = (Sint32)joy->hwdata->y;
100
-			v -= (joy->hwdata->ymax + joy->hwdata->ymin + 1)/2;
101
-			v *= 32768/((joy->hwdata->ymax - joy->hwdata->ymin + 1)/2);
102
-			SDL_PrivateJoystickAxis(joy, 1, v);
103
-		}
104
-		if (gameport.b1 != joy->buttons[0]) {
105
-			SDL_PrivateJoystickButton(joy, 0, gameport.b1);
106
-		}
107
-		if (gameport.b2 != joy->buttons[1]) {
108
-			SDL_PrivateJoystickButton(joy, 1, gameport.b2);
109
 		}
110
 		return;
111
 	}
112
@@ -459,65 +463,61 @@
113
 	
114
 	rep = &joy->hwdata->inreport;
115
 
116
-	if (read(joy->hwdata->fd, REP_BUF_DATA(rep), rep->size) != rep->size) {
117
-		return;
118
-	}
119
+	while (read(joy->hwdata->fd, REP_BUF_DATA(rep), rep->size) == rep->size) {
120
 #if defined(USBHID_NEW) || (defined(__FREEBSD__) && __FreeBSD_kernel_version >= 500111) || defined(__FreeBSD_kernel__)
121
-	hdata = hid_start_parse(joy->hwdata->repdesc, 1 << hid_input, rep->rid);
122
+		hdata = hid_start_parse(joy->hwdata->repdesc, 1 << hid_input, rep->rid);
123
 #else
124
-	hdata = hid_start_parse(joy->hwdata->repdesc, 1 << hid_input);
125
+		hdata = hid_start_parse(joy->hwdata->repdesc, 1 << hid_input);
126
 #endif
127
-	if (hdata == NULL) {
128
-		fprintf(stderr, "%s: Cannot start HID parser\n",
129
-		    joy->hwdata->path);
130
-		return;
131
-	}
132
+		if (hdata == NULL) {
133
+			/*fprintf(stderr, "%s: Cannot start HID parser\n", joy->hwdata->path);*/
134
+			continue;
135
+		}
136
 
137
-	for (nbutton = 0; hid_get_item(hdata, &hitem) > 0;) {
138
-		switch (hitem.kind) {
139
-		case hid_input:
140
-			switch (HID_PAGE(hitem.usage)) {
141
-			case HUP_GENERIC_DESKTOP: {
142
-			    unsigned usage = HID_USAGE(hitem.usage);
143
-			    int joyaxe = usage_to_joyaxe(usage);
144
-			    if (joyaxe >= 0) {
145
-				naxe = joy->hwdata->axis_map[joyaxe];
146
-				/* scaleaxe */
147
-				v = (Sint32)hid_get_data(REP_BUF_DATA(rep),
148
-							 &hitem);
149
-				v -= (hitem.logical_maximum + hitem.logical_minimum + 1)/2;
150
-				v *= 32768/((hitem.logical_maximum - hitem.logical_minimum + 1)/2);
151
-				if (v != joy->axes[naxe]) {
152
-				    SDL_PrivateJoystickAxis(joy, naxe, v);
153
+		for (nbutton = 0; hid_get_item(hdata, &hitem) > 0;) {
154
+			switch (hitem.kind) {
155
+			case hid_input:
156
+				switch (HID_PAGE(hitem.usage)) {
157
+				case HUP_GENERIC_DESKTOP: {
158
+					unsigned usage = HID_USAGE(hitem.usage);
159
+					int joyaxe = usage_to_joyaxe(usage);
160
+					if (joyaxe >= 0) {
161
+					naxe = joy->hwdata->axis_map[joyaxe];
162
+					/* scaleaxe */
163
+					v = (Sint32)hid_get_data(REP_BUF_DATA(rep),
164
+								 &hitem);
165
+					v -= (hitem.logical_maximum + hitem.logical_minimum + 1)/2;
166
+					v *= 32768/((hitem.logical_maximum - hitem.logical_minimum + 1)/2);
167
+					if (v != joy->axes[naxe]) {
168
+						SDL_PrivateJoystickAxis(joy, naxe, v);
169
+					}
170
+					} else if (usage == HUG_HAT_SWITCH) {
171
+					v = (Sint32)hid_get_data(REP_BUF_DATA(rep),
172
+								 &hitem);
173
+					SDL_PrivateJoystickHat(joy, 0,
174
+						hatval_to_sdl(v)-hitem.logical_minimum);
175
+					}
176
+					break;
177
 				}
178
-			    } else if (usage == HUG_HAT_SWITCH) {
179
-				v = (Sint32)hid_get_data(REP_BUF_DATA(rep),
180
-							 &hitem);
181
-				SDL_PrivateJoystickHat(joy, 0,
182
-					hatval_to_sdl(v)-hitem.logical_minimum);
183
-			    }
184
-			    break;
185
-			}
186
-			case HUP_BUTTON:
187
-				v = (Sint32)hid_get_data(REP_BUF_DATA(rep),
188
-				    &hitem);
189
-				if (joy->buttons[nbutton] != v) {
190
-					SDL_PrivateJoystickButton(joy,
191
-					    nbutton, v);
192
+				case HUP_BUTTON:
193
+					v = (Sint32)hid_get_data(REP_BUF_DATA(rep),
194
+						&hitem);
195
+					if (joy->buttons[nbutton] != v) {
196
+						SDL_PrivateJoystickButton(joy,
197
+							nbutton, v);
198
+					}
199
+					nbutton++;
200
+					break;
201
+				default:
202
+					continue;
203
 				}
204
-				nbutton++;
205
 				break;
206
 			default:
207
-				continue;
208
+				break;
209
 			}
210
-			break;
211
-		default:
212
-			break;
213
 		}
214
+		hid_end_parse(hdata);
215
 	}
216
-	hid_end_parse(hdata);
217
-
218
-	return;
219
 }
220
 
221
 /* Function to close a joystick after use */
222
@@ -582,8 +582,12 @@
27
 	r->size = len;
223
 	r->size = len;
28
 
224
 
29
 	if (r->size > 0) {
225
 	if (r->size > 0) {

Return to bug 200173