50
50
#define JOYSTICK_USAGE_NUMBER 0x04
51
51
#define GAMEPAD_USAGE_NUMBER 0x05
52
52
53
- #define JOYSTICK_NAME_MAX 256
54
-
55
53
typedef struct {
56
54
ALLEGRO_JOYSTICK parent;
57
- char name[JOYSTICK_NAME_MAX];
58
55
IOHIDElementRef buttons[_AL_MAX_JOYSTICK_BUTTONS];
59
56
IOHIDElementRef axes[_AL_MAX_JOYSTICK_STICKS][_AL_MAX_JOYSTICK_AXES];
60
57
IOHIDElementRef dpad;
@@ -133,37 +130,12 @@ static CFMutableDictionaryRef CreateDeviceMatchingDictionary(
133
130
return result;
134
131
}
135
132
136
- static bool joystick_uses_element (ALLEGRO_JOYSTICK_OSX *joy, IOHIDElementRef elem)
137
- {
138
- int i, j;
139
-
140
- if (elem) {
141
- for (i = 0 ; i < joy->parent .info .num_buttons ; i++) {
142
- if (joy->buttons [i] == elem)
143
- return true ;
144
- }
145
- for (i = 0 ; i < joy->parent .info .num_sticks ; i++) {
146
- for (j = 0 ; j < joy->parent .info .stick [i].num_axes ; j++) {
147
- if (joy->axes [i][j] == elem)
148
- return true ;
149
- }
150
- }
151
- if (joy->dpad == elem)
152
- return true ;
153
- }
154
- else {
155
- return true ;
156
- }
157
-
158
- return false ;
159
- }
160
-
161
- static ALLEGRO_JOYSTICK_OSX *find_joystick (IOHIDDeviceRef ident, IOHIDElementRef elem)
133
+ static ALLEGRO_JOYSTICK_OSX *find_joystick (IOHIDDeviceRef ident)
162
134
{
163
135
int i;
164
136
for (i = 0 ; i < (int )_al_vector_size (&joysticks); i++) {
165
137
ALLEGRO_JOYSTICK_OSX *joy = *(ALLEGRO_JOYSTICK_OSX **)_al_vector_ref (&joysticks, i);
166
- if (ident == joy->ident && joystick_uses_element (joy, elem) ) {
138
+ if (ident == joy->ident ) {
167
139
return joy;
168
140
}
169
141
}
@@ -173,12 +145,10 @@ static bool joystick_uses_element(ALLEGRO_JOYSTICK_OSX *joy, IOHIDElementRef ele
173
145
174
146
static const char *get_element_name (IOHIDElementRef elem, const char *default_name)
175
147
{
176
- const char *name_cstr = NULL ;
177
148
CFStringRef name = IOHIDElementGetName (elem);
178
- if (name)
179
- name_cstr = CFStringGetCStringPtr (name, kCFStringEncodingUTF8 );
180
- if (name_cstr)
181
- return name_cstr;
149
+ if (name) {
150
+ return CFStringGetCStringPtr (name, kCFStringEncodingUTF8 );
151
+ }
182
152
else
183
153
return default_name;
184
154
}
@@ -212,58 +182,31 @@ static void add_axis(ALLEGRO_JOYSTICK_OSX *joy, int stick_index, int axis_index,
212
182
joy->axes [stick_index][axis_index] = elem;
213
183
}
214
184
215
- static void add_elements (CFArrayRef elements, ALLEGRO_JOYSTICK_OSX *joy, int device_joystick )
185
+ static void add_elements (CFArrayRef elements, ALLEGRO_JOYSTICK_OSX *joy)
216
186
{
217
- int i, start_i = 0 ;
187
+ int i;
218
188
char default_name[100 ];
219
189
int stick_class = -1 ;
220
190
int axis_index = 0 ;
221
- bool collection_started = false ;
222
- int current_joystick = -1 ;
223
191
224
192
joy_null (joy);
225
193
226
- /* look for device_joystick */
227
194
for (i = 0 ; i < CFArrayGetCount (elements); i++) {
228
195
IOHIDElementRef elem = (IOHIDElementRef)CFArrayGetValueAtIndex (
229
196
elements,
230
197
i
231
198
);
232
- int etype = IOHIDElementGetType (elem);
233
- if (etype == kIOHIDElementTypeCollection ) {
234
- collection_started = true ;
235
- }
236
- else if (etype == kIOHIDElementTypeInput_Button || etype == kIOHIDElementTypeInput_Misc ) {
237
- if (collection_started) {
238
- current_joystick++;
239
- collection_started = false ;
240
- if (current_joystick == device_joystick) {
241
- start_i = i;
242
- break ;
243
- }
244
- }
245
- }
246
- }
247
-
248
- for (i = start_i; i < CFArrayGetCount (elements); i++) {
249
- IOHIDElementRef elem = (IOHIDElementRef)CFArrayGetValueAtIndex (
250
- elements,
251
- i
252
- );
253
199
254
200
int usage = IOHIDElementGetUsage (elem);
255
- if (IOHIDElementGetType (elem) == kIOHIDElementTypeCollection ) {
256
- break ;
257
- }
258
201
if (IOHIDElementGetType (elem) == kIOHIDElementTypeInput_Button ) {
259
- if (usage >= 0 && joy-> parent . info . num_buttons < _AL_MAX_JOYSTICK_BUTTONS &&
260
- !joy->buttons [joy->parent.info.num_buttons ]) {
261
- joy->buttons [joy->parent.info.num_buttons ] = elem;
262
- sprintf (default_name, " Button %d " , joy-> parent . info . num_buttons );
202
+ if (usage >= 0 && usage < _AL_MAX_JOYSTICK_BUTTONS &&
203
+ !joy->buttons [usage- 1 ]) {
204
+ joy->buttons [usage- 1 ] = elem;
205
+ sprintf (default_name, " Button %d " , usage- 1 );
263
206
const char *name = get_element_name (elem, default_name);
264
207
char *str = al_malloc (strlen (name)+1 );
265
208
strcpy (str, name);
266
- joy->parent .info .button [joy->parent.info.num_buttons ].name = str;
209
+ joy->parent .info .button [usage- 1 ].name = str;
267
210
joy->parent .info .num_buttons ++;
268
211
}
269
212
}
@@ -273,33 +216,18 @@ static void add_elements(CFArrayRef elements, ALLEGRO_JOYSTICK_OSX *joy, int dev
273
216
long max = IOHIDElementGetLogicalMax (elem);
274
217
int new_stick_class = -1 ;
275
218
int stick_index = joy->parent .info .num_sticks - 1 ;
276
- int axis_type = -1 ;
277
219
278
220
switch (usage) {
279
221
case kHIDUsage_GD_X :
280
- new_stick_class = 1 ;
281
- axis_type = 0 ;
282
- break ;
283
222
case kHIDUsage_GD_Y :
284
- new_stick_class = 1 ;
285
- axis_type = 1 ;
286
- break ;
287
223
case kHIDUsage_GD_Z :
288
224
new_stick_class = 1 ;
289
- axis_type = 2 ;
290
225
break ;
291
226
292
227
case kHIDUsage_GD_Rx :
293
- new_stick_class = 2 ;
294
- axis_type = 0 ;
295
- break ;
296
228
case kHIDUsage_GD_Ry :
297
- new_stick_class = 2 ;
298
- axis_type = 1 ;
299
- break ;
300
229
case kHIDUsage_GD_Rz :
301
230
new_stick_class = 2 ;
302
- axis_type = 2 ;
303
231
break ;
304
232
305
233
case kHIDUsage_GD_Hatswitch :
@@ -322,19 +250,7 @@ static void add_elements(CFArrayRef elements, ALLEGRO_JOYSTICK_OSX *joy, int dev
322
250
stick_class = new_stick_class;
323
251
324
252
char *buf = al_malloc (20 );
325
- switch (stick_class) {
326
- case 1 :
327
- sprintf (buf, " Primary Stick" );
328
- break ;
329
- case 2 :
330
- sprintf (buf, " Secondary Stick" );
331
- break ;
332
- case 3 :
333
- sprintf (buf, " Hat Switch" );
334
- break ;
335
- default :
336
- sprintf (buf, " Stick %d " , stick_index);
337
- }
253
+ sprintf (buf, " Stick %d " , stick_index);
338
254
joy->parent .info .stick [stick_index].name = buf;
339
255
}
340
256
else
@@ -345,14 +261,14 @@ static void add_elements(CFArrayRef elements, ALLEGRO_JOYSTICK_OSX *joy, int dev
345
261
joy->dpad = elem;
346
262
347
263
joy->dpad_axis_horiz = axis_index;
348
- sprintf (default_name, " X- Axis" );
264
+ sprintf (default_name, " Axis %i " , axis_index );
349
265
char *str = al_malloc (strlen (default_name)+1 );
350
266
strcpy (str, default_name);
351
267
joy->parent .info .stick [stick_index].axis [axis_index].name = str;
352
268
353
269
++axis_index;
354
270
joy->dpad_axis_vert = axis_index;
355
- sprintf (default_name, " Y- Axis" );
271
+ sprintf (default_name, " Axis %i " , axis_index );
356
272
str = al_malloc (strlen (default_name)+1 );
357
273
strcpy (str, default_name);
358
274
add_axis (joy, stick_index, axis_index, min, max, str, elem);
@@ -361,19 +277,7 @@ static void add_elements(CFArrayRef elements, ALLEGRO_JOYSTICK_OSX *joy, int dev
361
277
joy->parent .info .stick [stick_index].num_axes = 2 ;
362
278
}
363
279
else {
364
- switch (axis_type) {
365
- case 0 :
366
- sprintf (default_name, " X-Axis" );
367
- break ;
368
- case 1 :
369
- sprintf (default_name, " Y-Axis" );
370
- break ;
371
- case 2 :
372
- sprintf (default_name, " Z-Axis" );
373
- break ;
374
- default :
375
- sprintf (default_name, " Axis %i " , axis_index);
376
- }
280
+ sprintf (default_name, " Axis %i " , axis_index);
377
281
const char *name = get_element_name (elem, default_name);
378
282
char *str = al_malloc (strlen (name)+1 );
379
283
strcpy (str, name);
@@ -394,92 +298,44 @@ static void osx_joy_generate_configure_event(void)
394
298
_al_generate_joystick_event (&event);
395
299
}
396
300
397
- static int device_count_joysticks (IOHIDDeviceRef ref)
398
- {
399
- int i;
400
- int count = 0 ;
401
- bool collection_started = false ;
402
-
403
- CFArrayRef elements = IOHIDDeviceCopyMatchingElements (
404
- ref,
405
- NULL ,
406
- kIOHIDOptionsTypeNone
407
- );
408
- for (i = 0 ; i < CFArrayGetCount (elements); i++) {
409
- IOHIDElementRef elem = (IOHIDElementRef)CFArrayGetValueAtIndex (
410
- elements,
411
- i
412
- );
413
-
414
- int etype = IOHIDElementGetType (elem);
415
- if (etype == kIOHIDElementTypeCollection ) {
416
- collection_started = true ;
417
- }
418
- else if (etype == kIOHIDElementTypeInput_Button || etype == kIOHIDElementTypeInput_Misc ) {
419
- if (collection_started) {
420
- count++;
421
- collection_started = false ;
422
- }
423
- }
424
- }
425
- CFRelease (elements);
426
- return count;
427
- }
428
-
429
- static void device_setup_joystick (IOHIDDeviceRef ref, ALLEGRO_JOYSTICK_OSX *joy, int device_joystick)
430
- {
431
- CFStringRef product_name;
432
- joy->cfg_state = new_joystick_state;
433
-
434
- CFArrayRef elements = IOHIDDeviceCopyMatchingElements (
435
- ref,
436
- NULL ,
437
- kIOHIDOptionsTypeNone
438
- );
439
-
440
- add_elements (elements, joy, device_joystick);
441
- product_name = IOHIDDeviceGetProperty (ref, CFSTR (kIOHIDProductKey ));
442
- if (product_name)
443
- {
444
- CFStringGetCString (product_name, joy->name , JOYSTICK_NAME_MAX, kCFStringEncodingUTF8 );
445
- }
446
- CFRelease (elements);
447
- }
448
-
449
301
static void device_add_callback (
450
302
void *context,
451
303
IOReturn result,
452
304
void *sender,
453
305
IOHIDDeviceRef ref
454
306
) {
455
- int i;
456
- int device_joysticks;
457
307
(void )context;
458
308
(void )result;
459
309
(void )sender;
460
310
461
311
al_lock_mutex (add_mutex);
462
312
463
- ALLEGRO_JOYSTICK_OSX *joy = find_joystick (ref, NULL );
313
+ ALLEGRO_JOYSTICK_OSX *joy = find_joystick (ref);
464
314
if (joy == NULL ) {
465
- device_joysticks = device_count_joysticks (ref);
466
- for (i = 0 ; i < device_joysticks; i++) {
467
- joy = al_calloc (1 , sizeof (ALLEGRO_JOYSTICK_OSX));
468
- joy->ident = ref;
469
- ALLEGRO_JOYSTICK_OSX **back = _al_vector_alloc_back (&joysticks);
470
- *back = joy;
471
- device_setup_joystick (ref, joy, i);
472
- ALLEGRO_INFO (" Found joystick (%d buttons, %d sticks)\n " ,
473
- joy->parent .info .num_buttons , joy->parent .info .num_sticks );
474
- }
475
- }
476
- else {
477
- device_setup_joystick (ref, joy, 0 );
315
+ joy = al_calloc (1 , sizeof (ALLEGRO_JOYSTICK_OSX));
316
+ joy->ident = ref;
317
+ ALLEGRO_JOYSTICK_OSX **back = _al_vector_alloc_back (&joysticks);
318
+ *back = joy;
478
319
}
320
+ joy->cfg_state = new_joystick_state;
321
+
322
+ CFArrayRef elements = IOHIDDeviceCopyMatchingElements (
323
+ ref,
324
+ NULL ,
325
+ kIOHIDOptionsTypeNone
326
+ );
327
+
328
+ add_elements (elements, joy);
329
+
330
+ CFRelease (elements);
331
+
479
332
480
333
al_unlock_mutex (add_mutex);
481
334
482
335
osx_joy_generate_configure_event ();
336
+
337
+ ALLEGRO_INFO (" Found joystick (%d buttons, %d sticks)\n " ,
338
+ joy->parent .info .num_buttons , joy->parent .info .num_sticks );
483
339
}
484
340
485
341
static void device_remove_callback (
@@ -576,7 +432,7 @@ static void value_callback(
576
432
577
433
IOHIDElementRef elem = IOHIDValueGetElement (value);
578
434
IOHIDDeviceRef ref = IOHIDElementGetDevice (elem);
579
- ALLEGRO_JOYSTICK_OSX *joy = find_joystick (ref, elem );
435
+ ALLEGRO_JOYSTICK_OSX *joy = find_joystick (ref);
580
436
581
437
if (!joy) return ;
582
438
@@ -877,8 +733,8 @@ static bool reconfigure_joysticks(void)
877
733
// FIXME!
878
734
static const char *get_joystick_name (ALLEGRO_JOYSTICK *joy_)
879
735
{
880
- ALLEGRO_JOYSTICK_OSX *joy = (ALLEGRO_JOYSTICK_OSX * )joy_;
881
- return joy-> name ;
736
+ ( void )joy_;
737
+ return " Joystick " ;
882
738
}
883
739
884
740
static bool get_joystick_active (ALLEGRO_JOYSTICK *joy_)
0 commit comments