311
312
static void get_cfg(int joy)
313
keysym_type *keysym = (joy == 2) ? keysym_2 : keysym_1;
317
sprintf(txt, "JOYAI%d_ID", joy);
319
resources_get_value(txt, (void *)&tmp);
321
joy_id[joy-1] = atoi(tmp);
324
for (i=0; i<NUM_KEYSYM; i++) {
325
sprintf(txt, "JOYAI%d_%s", joy, keysym[i].label);
314
keysym_type *keysym = (joy == 2) ? keysym_2 : keysym_1;
318
sprintf(txt, "JOYAI%d_ID", joy);
327
320
resources_get_value(txt, (void *)&tmp);
328
321
if (tmp != NULL) {
329
sscanf(tmp, "%d,%d,%d", &keysym[i].type, &keysym[i].offset, &keysym[i].rawkey);
322
joy_id[joy - 1] = atoi(tmp);
325
for (i = 0; i < NUM_KEYSYM; i++) {
326
sprintf(txt, "JOYAI%d_%s", joy, keysym[i].label);
328
resources_get_value(txt, (void *)&tmp);
330
sscanf(tmp, "%d,%d,%d", &keysym[i].type, &keysym[i].offset, &keysym[i].rawkey);
334
335
static void set_cfg(int joy)
336
keysym_type *keysym = (joy == 2) ? keysym_2 : keysym_1;
337
char tmp[256], txt[256];
340
sprintf(txt, "JOYAI%d_ID", joy);
341
sprintf(tmp, "%lu", joy_id[joy-1]);
342
resources_set_value(txt, tmp);
344
for (i=0; i<NUM_KEYSYM; i++) {
345
sprintf(txt, "JOYAI%d_%s", joy, keysym[i].label);
346
sprintf(tmp, "%d,%d,%d", keysym[i].type,keysym[i].offset,keysym[i].rawkey);
337
keysym_type *keysym = (joy == 2) ? keysym_2 : keysym_1;
338
char tmp[256], txt[256];
341
sprintf(txt, "JOYAI%d_ID", joy);
342
sprintf(tmp, "%lu", joy_id[joy - 1]);
347
343
resources_set_value(txt, tmp);
345
for (i = 0; i < NUM_KEYSYM; i++) {
346
sprintf(txt, "JOYAI%d_%s", joy, keysym[i].label);
347
sprintf(tmp, "%d,%d,%d", keysym[i].type,keysym[i].offset,keysym[i].rawkey);
348
resources_set_value(txt, tmp);
351
352
static void ai_exit(void)
354
AIN_DeleteContext(CTX);
357
if (ai_port != NULL) {
358
DeleteMsgPort(ai_port);
362
DropInterface((struct Interface *)IAIN);
366
CloseLibrary(AIN_Base);
355
AIN_DeleteContext(CTX);
358
if (ai_port != NULL) {
359
DeleteMsgPort(ai_port);
363
DropInterface((struct Interface *)IAIN);
367
CloseLibrary(AIN_Base);
371
372
static int ai_init(void)
373
if ((AIN_Base = OpenLibrary("AmigaInput.library", 51))) {
374
if ((IAIN = (struct AIN_IFace *)GetInterface(AIN_Base, "main", 1, NULL))) {
375
if ((ai_port = CreateMsgPort())) {
376
struct TagItem tags[] = { { AINCC_Port, (ULONG)ai_port }, { TAG_DONE, TAG_DONE } };
377
CTX = AIN_CreateContext(1, tags);
374
if ((AIN_Base = OpenLibrary("AmigaInput.library", 51))) {
375
if ((IAIN = (struct AIN_IFace *)GetInterface(AIN_Base, "main", 1, NULL))) {
376
if ((ai_port = CreateMsgPort())) {
377
struct TagItem tags[] = { { AINCC_Port, (ULONG)ai_port}, { TAG_DONE, TAG_DONE } };
379
CTX = AIN_CreateContext(1, tags);
390
392
static void ai_release(void)
393
for (i=0; i<2; i++) {
394
if ((CTX != NULL) && (ai_handle[i] != NULL)) {
395
AIN_ReleaseDevice(CTX, ai_handle[i]);
396
for (i = 0; i < 2; i++) {
397
if ((CTX != NULL) && (ai_handle[i] != NULL)) {
398
AIN_ReleaseDevice(CTX, ai_handle[i]);
401
404
static void ai_attach(void)
404
for (i=0; i<2; i++) {
406
if ((CTX != NULL) && (joy_id[i] != -1)) {
407
ai_handle[i] = AIN_ObtainDevice(CTX, joy_id[i]);
408
for (i = 0; i < 2; i++) {
410
if ((CTX != NULL) && (joy_id[i] != -1)) {
411
ai_handle[i] = AIN_ObtainDevice(CTX, joy_id[i]);
412
416
void joyai_close(void)
418
422
int joyai_open(void)
420
if (ai_init() == -1) {
424
if (ai_init() == -1) {
429
433
static int get_key(AIN_DeviceID ID, int *keycode, int *offset)
431
static char *window_text;
432
struct Window *window;
433
AIN_InputEvent *event;
436
window_text = translate_text(IDS_PRESS_KEY_BUTTON);
437
*keycode = *offset = -1; /* no key */
440
ai_handle[0] = AIN_ObtainDevice(CTX, ID);
435
static char *window_text;
436
struct Window *window;
437
AIN_InputEvent *event;
440
window_text = translate_text(IDS_PRESS_KEY_BUTTON);
441
*keycode = *offset = -1; /* no key */
444
ai_handle[0] = AIN_ObtainDevice(CTX, ID);
445
if (ai_handle[0] != NULL) {
446
AIN_SetDeviceParameter(CTX, ai_handle[0], AINDP_EVENT, TRUE);
450
window = OpenWindowTags(NULL,
452
WA_Flags, WFLG_NOCAREREFRESH|WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_CLOSEGADGET|WFLG_RMBTRAP|WFLG_GIMMEZEROZERO,
453
WA_IDCMP, IDCMP_CLOSEWINDOW|WFLG_REPORTMOUSE|IDCMP_RAWKEY|IDCMP_CHANGEWINDOW,
461
if (window != NULL) {
462
struct IntuiMessage *imsg = NULL;
463
ULONG imCode, imClass;
465
/* Resize window and set pens */
466
int length = TextLength(window->RPort, window_text, strlen(window_text));
468
ChangeWindowBox(window, 100, 100, window->BorderLeft+length+window->BorderRight+8, window->BorderTop+window->IFont->tf_YSize*2+window->BorderBottom);
469
SetAPen(window->RPort, 1);
470
SetBPen(window->RPort, 0);
472
/* Wait until window has been resized */
474
/* Wait for messages */
475
Wait((1L << window->UserPort->mp_SigBit) | (1L << ai_port->mp_SigBit));
477
/* Check for IDCMP messages */
478
while ((imsg = (struct IntuiMessage *)GetMsg(window->UserPort))) {
479
imClass = imsg->Class;
482
ReplyMsg((struct Message *)imsg);
484
if (imClass == IDCMP_CHANGEWINDOW) {
485
Move(window->RPort, 4, window->IFont->tf_YSize);
486
Text(window->RPort, window_text, strlen(window_text));
487
} else if (imClass == IDCMP_RAWKEY) {
492
done = 1; /* KEY ok */
493
} else if (imClass == IDCMP_CLOSEWINDOW) {
494
done = -1; /* cancel */
498
/* Check for AI messages */
499
if (ai_handle[0] != NULL) {
500
while ((event = AIN_GetEvent(CTX))) {
501
switch(event->Type) {
503
if ((event->Value >= (ONOFF_VALUE)) || (event->Value <= (-(ONOFF_VALUE)))) {
504
*offset = event->Index;
505
done = 2; /* AI ok */
509
*offset = event->Index;
510
done = 2; /* AI ok */
513
*offset = event->Index;
514
done = 2; /* AI ok */
520
AIN_FreeEvent(CTX, event);
441
527
if (ai_handle[0] != NULL) {
442
AIN_SetDeviceParameter(CTX, ai_handle[0], AINDP_EVENT, TRUE);
446
window = OpenWindowTags(NULL,
448
WA_Flags, WFLG_NOCAREREFRESH|WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_CLOSEGADGET|WFLG_RMBTRAP|WFLG_GIMMEZEROZERO,
449
WA_IDCMP, IDCMP_CLOSEWINDOW|WFLG_REPORTMOUSE|IDCMP_RAWKEY|IDCMP_CHANGEWINDOW,
457
if (window != NULL) {
458
struct IntuiMessage *imsg = NULL;
459
ULONG imCode, imClass;
461
/* Resize window and set pens */
462
int length = TextLength(window->RPort, window_text, strlen(window_text));
463
ChangeWindowBox(window, 100, 100, window->BorderLeft+length+window->BorderRight+8, window->BorderTop+window->IFont->tf_YSize*2+window->BorderBottom);
464
SetAPen(window->RPort, 1);
465
SetBPen(window->RPort, 0);
467
/* Wait until window has been resized */
469
/* Wait for messages */
470
Wait((1L << window->UserPort->mp_SigBit) | (1L << ai_port->mp_SigBit));
472
/* Check for IDCMP messages */
473
while ((imsg = (struct IntuiMessage *)GetMsg(window->UserPort))) {
474
imClass = imsg->Class;
477
ReplyMsg((struct Message *)imsg);
479
if (imClass == IDCMP_CHANGEWINDOW) {
480
Move(window->RPort, 4, window->IFont->tf_YSize);
481
Text(window->RPort, window_text, strlen(window_text));
483
else if (imClass == IDCMP_RAWKEY) {
488
done = 1; /* KEY ok */
490
else if (imClass == IDCMP_CLOSEWINDOW) {
491
done = -1; /* cancel */
495
/* Check for AI messages */
496
if (ai_handle[0] != NULL) {
528
AIN_SetDeviceParameter(CTX, ai_handle[0], AINDP_EVENT, FALSE);
529
/* Remove pending AI messages */
497
530
while ((event = AIN_GetEvent(CTX))) {
498
switch(event->Type) {
500
if ((event->Value >= (ONOFF_VALUE)) || (event->Value <= (-(ONOFF_VALUE)))) {
501
*offset = event->Index;
502
done = 2; /* AI ok */
507
*offset = event->Index;
508
done = 2; /* AI ok */
512
*offset = event->Index;
513
done = 2; /* AI ok */
520
AIN_FreeEvent(CTX, event);
531
AIN_FreeEvent(CTX, event);
527
if (ai_handle[0] != NULL) {
528
AIN_SetDeviceParameter(CTX, ai_handle[0], AINDP_EVENT, FALSE);
529
/* Remove pending AI messages */
530
while ((event = AIN_GetEvent(CTX))) {
531
AIN_FreeEvent(CTX, event);
533
AIN_ReleaseDevice(CTX, ai_handle[0]);
533
AIN_ReleaseDevice(CTX, ai_handle[0]);
542
AIN_DeviceID ids[256];
542
AIN_DeviceID ids[256];
553
553
static void update_inputs(ULONG ID)
559
for (i=0; i<inputs.count; i++) {
560
if (inputs.names[i] != NULL) {
561
lib_free(inputs.names[i]);
564
memset(&inputs, 0, sizeof(inputs));
566
inputs.offsets[0] = 0;
567
inputs.names[0] = lib_stralloc("-");
568
inputs.types[0] = TYPE_NONE;
576
AIN_Query(CTX, ID, AINQ_NUMBUTTONS, 0, &num, sizeof(num));
577
AIN_Query(CTX, ID, AINQ_BUTTON_OFFSET, 0, &offset, sizeof(offset));
578
for (i=0; i<num; i++) {
580
AIN_Query(CTX, ID, AINQ_BUTTONNAME, i, name, sizeof(name));
581
if (name[0] != '\0') {
582
inputs.offsets[inputs.count] = offset + i;
583
inputs.names[inputs.count] = lib_stralloc(name);
584
inputs.types[inputs.count] = TYPE_BUTTON;
590
AIN_Query(CTX, ID, AINQ_NUMAXES, 0, &num, sizeof(num));
591
AIN_Query(CTX, ID, AINQ_AXIS_OFFSET, 0, &offset, sizeof(offset));
592
for (i=0; i<num; i++) {
594
AIN_Query(CTX, ID, AINQ_AXISNAME, i, name, sizeof(name));
595
if (name[0] != '\0') {
596
inputs.offsets[inputs.count] = offset + i;
597
inputs.names[inputs.count] = lib_stralloc(name);
598
inputs.types[inputs.count] = TYPE_AXES;
604
AIN_Query(CTX, ID, AINQ_NUMHATS, 0, &num, sizeof(num));
605
AIN_Query(CTX, ID, AINQ_HAT_OFFSET, 0, &offset, sizeof(offset));
606
for (i=0; i<num; i++) {
608
AIN_Query(CTX, ID, AINQ_HATNAME, i, name, sizeof(name));
609
if (name[0] != '\0') {
610
inputs.offsets[inputs.count] = offset + i;
611
inputs.names[inputs.count] = lib_stralloc(name);
612
inputs.types[inputs.count] = TYPE_HAT;
559
for (i = 0; i < inputs.count; i++) {
560
lib_free(inputs.names[i]);
562
memset(&inputs, 0, sizeof(inputs));
564
inputs.offsets[0] = 0;
565
inputs.names[0] = lib_stralloc("-");
566
inputs.types[0] = TYPE_NONE;
574
AIN_Query(CTX, ID, AINQ_NUMBUTTONS, 0, &num, sizeof(num));
575
AIN_Query(CTX, ID, AINQ_BUTTON_OFFSET, 0, &offset, sizeof(offset));
576
for (i = 0; i < num; i++) {
578
AIN_Query(CTX, ID, AINQ_BUTTONNAME, i, name, sizeof(name));
579
if (name[0] != '\0') {
580
inputs.offsets[inputs.count] = offset + i;
581
inputs.names[inputs.count] = lib_stralloc(name);
582
inputs.types[inputs.count] = TYPE_BUTTON;
588
AIN_Query(CTX, ID, AINQ_NUMAXES, 0, &num, sizeof(num));
589
AIN_Query(CTX, ID, AINQ_AXIS_OFFSET, 0, &offset, sizeof(offset));
590
for (i = 0; i < num; i++) {
592
AIN_Query(CTX, ID, AINQ_AXISNAME, i, name, sizeof(name));
593
if (name[0] != '\0') {
594
inputs.offsets[inputs.count] = offset + i;
595
inputs.names[inputs.count] = lib_stralloc(name);
596
inputs.types[inputs.count] = TYPE_AXES;
602
AIN_Query(CTX, ID, AINQ_NUMHATS, 0, &num, sizeof(num));
603
AIN_Query(CTX, ID, AINQ_HAT_OFFSET, 0, &offset, sizeof(offset));
604
for (i = 0; i < num; i++) {
606
AIN_Query(CTX, ID, AINQ_HATNAME, i, name, sizeof(name));
607
if (name[0] != '\0') {
608
inputs.offsets[inputs.count] = offset + i;
609
inputs.names[inputs.count] = lib_stralloc(name);
610
inputs.types[inputs.count] = TYPE_HAT;
618
616
static int offset_to_index(int offset)
622
for (i=0; i<inputs.count; i++) {
623
if ((inputs.types[i] != TYPE_NONE) && (inputs.offsets[i] == offset)) {
620
for (i = 0; i < inputs.count; i++) {
621
if ((inputs.types[i] != TYPE_NONE) && (inputs.offsets[i] == offset)) {
630
628
BOOL enumfunc(AIN_Device *device, void *UserData)
632
devices.ids[devices.count] = device->DeviceID;
633
devices.names[devices.count] = lib_stralloc(device->DeviceName);
630
devices.ids[devices.count] = device->DeviceID;
631
devices.names[devices.count] = lib_stralloc(device->DeviceName);
635
if (default_id != -1) {
636
if (default_id == device->DeviceID) {
637
default_count = devices.count;
633
if (default_id != -1) {
634
if (default_id == device->DeviceID) {
635
default_count = devices.count;
646
644
static int offset_to_active(int type, int offset)
650
for (i=0; i<inputs.count; i++) {
651
if ((inputs.types[i] == type) && (inputs.offsets[i] == offset)) {
648
for (i = 0; i < inputs.count; i++) {
649
if ((inputs.types[i] == type) && (inputs.offsets[i] == offset)) {
657
#define DEV_CHANGE (33)
658
#define KEYNAME "VICE"
658
660
int joyai_config(int joy)
661
keysym_type *keysym = (joy == 2) ? keysym_2 : keysym_1;
672
#define DEV_CHANGE (33)
673
#define KEYNAME "VICE"
675
memset(&devices, 0, sizeof(devices));
676
memset(&inputs, 0, sizeof(inputs));
678
if (joy_id[joy-1] != -1) {
679
ai_handle[0] = AIN_ObtainDevice(CTX, joy_id[joy-1]);
680
if (ai_handle[0] != NULL) {
681
AIN_ReleaseDevice(CTX, ai_handle[0]);
688
devices.ids[devices.count] = -1;
689
devices.names[devices.count] = lib_stralloc("-");
692
default_id = joy_id[joy-1];
695
AIN_EnumDevices(CTX, enumfunc, &devices);
697
update_inputs(joy_id[joy-1]);
700
APTR label, text[NUM_KEYSYM], button, app, main_group, window, ok, cancel, Odevice, Oinput[NUM_KEYSYM];
702
app = ApplicationObject,
703
MUIA_Application_Author, "Mathias Roslund",
704
MUIA_Application_Base, KEYNAME,
705
MUIA_Application_Title, KEYNAME,
706
MUIA_Application_Version, "$VER: " KEYNAME " v1.0",
707
MUIA_Application_Copyright, "Mathias Roslund",
708
MUIA_Application_Description, KEYNAME,
709
SubWindow, window = WindowObject,
710
MUIA_Window_Title, KEYNAME,
711
MUIA_Window_ID, MAKE_ID('0', 'W', 'I', 'N'),
712
MUIA_Window_Screen, canvaslist->os->screen,
713
WindowContents, VGroup,
717
MUIA_Text_PreParse, "\033r",
718
MUIA_Text_Contents, "AI Device",
724
Child, Odevice = CycleObject,
725
MUIA_Cycle_Entries, devices.names,
726
MUIA_Cycle_Active, default_count,
730
Child, main_group = ColGroup(4), End,
732
Child, ok = TextObject,
734
MUIA_Background, MUII_ButtonBack,
735
MUIA_Text_Contents, "Ok",
736
MUIA_Text_PreParse, "\033c",
737
MUIA_InputMode, MUIV_InputMode_RelVerify,
739
Child, cancel = TextObject,
741
MUIA_Background, MUII_ButtonBack,
742
MUIA_Text_Contents, "Cancel",
743
MUIA_Text_PreParse, "\033c",
744
MUIA_InputMode, MUIV_InputMode_RelVerify,
756
MUIM_Notify, MUIA_Window_CloseRequest, TRUE,
759
MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit
763
MUIM_Notify, MUIA_Cycle_Active, MUIV_EveryTime,
766
MUIM_Application_ReturnID, DEV_CHANGE
770
MUIM_Notify, MUIA_Pressed, FALSE,
773
MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit
777
MUIM_Notify, MUIA_Pressed, FALSE,
780
MUIM_Application_ReturnID, BTN_OK
783
for (i=0; i<NUM_KEYSYM; i++) {
787
MUIA_Text_PreParse, "\033r",
788
MUIA_Text_Contents, keysym[i].label,
793
Oinput[i] = CycleObject,
794
MUIA_Cycle_Entries, inputs.names,
795
MUIA_Cycle_Active, offset_to_active(keysym[i].type, keysym[i].offset),
798
text[i] = TextObject,
799
MUIA_Background, MUII_TextBack,
800
MUIA_Frame, MUIV_Frame_Text,
801
MUIA_Text_Contents, rawkey_to_name(keysym[i].rawkey),
806
MUIA_Background, MUII_ButtonBack,
807
MUIA_Text_Contents, "Change",
808
MUIA_Text_PreParse, "\033c",
809
MUIA_InputMode, MUIV_InputMode_RelVerify,
813
MUIM_Notify, MUIA_Pressed, FALSE,
816
MUIM_Application_ReturnID, (i + 1)
821
DoMethod(main_group, OM_ADDMEMBER, label);
822
DoMethod(main_group, OM_ADDMEMBER, Oinput[i]);
823
DoMethod(main_group, OM_ADDMEMBER, text[i]);
824
DoMethod(main_group, OM_ADDMEMBER, button);
831
set(window, MUIA_Window_Open, TRUE);
833
unsigned long retval = DoMethod(app, MUIM_Application_Input, &signals);
835
case MUIV_Application_ReturnID_Quit:
840
for (i=0; i<NUM_KEYSYM; i++) {
842
get(Oinput[i], MUIA_Cycle_Active, &active);
843
keysym[i].type = inputs.types[active];
844
keysym[i].offset = inputs.offsets[active];
852
get(Odevice, MUIA_Cycle_Active, &active);
853
joy_id[joy-1] = devices.ids[active];
854
update_inputs(joy_id[joy-1]);
855
for (i=0; i<NUM_KEYSYM; i++) {
856
set(Oinput[i], MUIA_Cycle_Entries, inputs.names);
857
set(Oinput[i], MUIA_Cycle_Active, 0);
862
if ((retval >= 1) && (retval <= (1+NUM_KEYSYM))) {
863
int keycode, index, result;
864
result = get_key(joy_id[joy-1], &keycode, &index);
865
if (result == 1) { /* KEY */
866
keysym[retval - 1].rawkey = keycode;
867
set(text[retval - 1], MUIA_Text_Contents, rawkey_to_name(keycode));
868
} else if (result == 2) { /* AI */
869
index = offset_to_index(index);
871
set(Oinput[retval - 1], MUIA_Cycle_Active, index);
877
if (running && signals) {
881
MUI_DisposeObject(app);
663
keysym_type *keysym = (joy == 2) ? keysym_2 : keysym_1;
673
memset(&devices, 0, sizeof(devices));
674
memset(&inputs, 0, sizeof(inputs));
676
if (joy_id[joy - 1] != -1) {
677
ai_handle[0] = AIN_ObtainDevice(CTX, joy_id[joy - 1]);
678
if (ai_handle[0] != NULL) {
679
AIN_ReleaseDevice(CTX, ai_handle[0]);
682
joy_id[joy - 1] = -1;
686
devices.ids[devices.count] = -1;
687
devices.names[devices.count] = lib_stralloc("-");
690
default_id = joy_id[joy - 1];
693
AIN_EnumDevices(CTX, enumfunc, &devices);
695
update_inputs(joy_id[joy - 1]);
698
APTR label, text[NUM_KEYSYM], button, app, main_group, window, ok, cancel, Odevice, Oinput[NUM_KEYSYM];
700
app = ApplicationObject,
701
MUIA_Application_Author, "Mathias Roslund & Marco van den Heuvel",
702
MUIA_Application_Base, KEYNAME,
703
MUIA_Application_Title, KEYNAME,
704
MUIA_Application_Version, "$VER: " KEYNAME " v1.0",
705
MUIA_Application_Copyright, "Mathias Roslund & Marco van den Heuvel",
706
MUIA_Application_Description, KEYNAME,
707
SubWindow, window = WindowObject,
708
MUIA_Window_Title, KEYNAME,
709
MUIA_Window_ID, MAKE_ID('0', 'W', 'I', 'N'),
710
MUIA_Window_Screen, canvaslist->os->screen,
711
WindowContents, VGroup,
714
MUIA_Text_PreParse, "\033r",
715
MUIA_Text_Contents, "AI Device",
720
Child, Odevice = CycleObject,
721
MUIA_Cycle_Entries, devices.names,
722
MUIA_Cycle_Active, default_count,
725
Child, main_group = ColGroup(4),
728
Child, ok = TextObject,
730
MUIA_Background, MUII_ButtonBack,
731
MUIA_Text_Contents, "Ok",
732
MUIA_Text_PreParse, "\033c",
733
MUIA_InputMode, MUIV_InputMode_RelVerify,
735
Child, cancel = TextObject,
737
MUIA_Background, MUII_ButtonBack,
738
MUIA_Text_Contents, "Cancel",
739
MUIA_Text_PreParse, "\033c",
740
MUIA_InputMode, MUIV_InputMode_RelVerify,
750
DoMethod(window, MUIM_Notify, MUIA_Window_CloseRequest, TRUE,
751
app, 2, MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit);
753
DoMethod(Odevice, MUIM_Notify, MUIA_Cycle_Active, MUIV_EveryTime,
754
app, 2, MUIM_Application_ReturnID, DEV_CHANGE);
756
DoMethod(cancel, MUIM_Notify, MUIA_Pressed, FALSE,
757
app, 2, MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit);
759
DoMethod(ok, MUIM_Notify, MUIA_Pressed, FALSE,
760
app, 2, MUIM_Application_ReturnID, BTN_OK);
762
for (i = 0; i < NUM_KEYSYM; i++) {
766
MUIA_Text_PreParse, "\033r",
767
MUIA_Text_Contents, keysym[i].label,
772
Oinput[i] = CycleObject,
773
MUIA_Cycle_Entries, inputs.names,
774
MUIA_Cycle_Active, offset_to_active(keysym[i].type, keysym[i].offset),
777
text[i] = TextObject,
778
MUIA_Background, MUII_TextBack,
779
MUIA_Frame, MUIV_Frame_Text,
780
MUIA_Text_Contents, rawkey_to_name(keysym[i].rawkey),
785
MUIA_Background, MUII_ButtonBack,
786
MUIA_Text_Contents, "Change",
787
MUIA_Text_PreParse, "\033c",
788
MUIA_InputMode, MUIV_InputMode_RelVerify,
791
DoMethod(button, MUIM_Notify, MUIA_Pressed, FALSE,
792
app, 2, MUIM_Application_ReturnID, (i + 1));
796
DoMethod(main_group, OM_ADDMEMBER, label);
797
DoMethod(main_group, OM_ADDMEMBER, Oinput[i]);
798
DoMethod(main_group, OM_ADDMEMBER, text[i]);
799
DoMethod(main_group, OM_ADDMEMBER, button);
807
set(window, MUIA_Window_Open, TRUE);
809
unsigned long retval = DoMethod(app, MUIM_Application_Input, &signals);
812
case MUIV_Application_ReturnID_Quit:
816
for (i = 0; i < NUM_KEYSYM; i++) {
819
get(Oinput[i], MUIA_Cycle_Active, &active);
820
keysym[i].type = inputs.types[active];
821
keysym[i].offset = inputs.offsets[active];
830
get(Odevice, MUIA_Cycle_Active, &active);
831
joy_id[joy - 1] = devices.ids[active];
832
update_inputs(joy_id[joy - 1]);
833
for (i = 0; i < NUM_KEYSYM; i++) {
834
set(Oinput[i], MUIA_Cycle_Entries, inputs.names);
835
set(Oinput[i], MUIA_Cycle_Active, 0);
840
if ((retval >= 1) && (retval <= (1 + NUM_KEYSYM))) {
841
int keycode, index, result;
842
result = get_key(joy_id[joy - 1], &keycode, &index);
843
if (result == 1) { /* KEY */
844
keysym[retval - 1].rawkey = keycode;
845
set(text[retval - 1], MUIA_Text_Contents, rawkey_to_name(keycode));
846
} else if (result == 2) { /* AI */
847
index = offset_to_index(index);
849
set(Oinput[retval - 1], MUIA_Cycle_Active, index);
855
if (running && signals) {
859
MUI_DisposeObject(app);
893
871
int joyai_update(int joy, int dst)