static int init_joysticks (void) { int i; int success = 0; if (!joystickContext) { if (openAmigaInput ()) { joystickContext = AIN_CreateContext (1, NULL); if (joystickContext) { struct enumPacket packet = { joystickContext, &joystickCount, &joystickList[0] }; AIN_EnumDevices (joystickContext, enumerateJoysticks, &packet); write_log ("Found %d joysticks\n", joystickCount); success = 1; } } } return success; }
int joyai_config(int joy) { BOOL running = TRUE; keysym_type *keysym = (joy == 2) ? keysym_2 : keysym_1; ULONG signals; if (!amigainput_lib_loaded) { return -1; } if (CTX == NULL) { return -1; } get_cfg(joy); ai_release(); memset(&devices, 0, sizeof(devices)); memset(&inputs, 0, sizeof(inputs)); if (joy_id[joy - 1] != -1) { ai_handle[0] = AIN_ObtainDevice(CTX, joy_id[joy - 1]); if (ai_handle[0] != NULL) { AIN_ReleaseDevice(CTX, ai_handle[0]); ai_handle[0] = NULL; } else { joy_id[joy - 1] = -1; } } devices.ids[devices.count] = -1; devices.names[devices.count] = lib_stralloc("-"); devices.count++; default_id = joy_id[joy - 1]; default_count = 0; AIN_EnumDevices(CTX, enumfunc, &devices); update_inputs(joy_id[joy - 1]); { APTR label, text[NUM_KEYSYM], button, app, main_group, window, ok, cancel, Odevice, Oinput[NUM_KEYSYM]; app = ApplicationObject, MUIA_Application_Author, "Mathias Roslund & Marco van den Heuvel", MUIA_Application_Base, KEYNAME, MUIA_Application_Title, KEYNAME, MUIA_Application_Version, "$VER: " KEYNAME " v1.0", MUIA_Application_Copyright, "Mathias Roslund & Marco van den Heuvel", MUIA_Application_Description, "Versatile Commodore Emulator", SubWindow, window = WindowObject, MUIA_Window_Title, KEYNAME, MUIA_Window_ID, MAKE_ID('0', 'W', 'I', 'N'), MUIA_Window_Screen, canvaslist->os->screen, WindowContents, VGroup, Child, HGroup, Child, TextObject, MUIA_Text_PreParse, "\033r", MUIA_Text_Contents, "AI Device", MUIA_Weight, 0, MUIA_InnerLeft, 0, MUIA_InnerRight, 0, End, Child, Odevice = CycleObject, MUIA_Cycle_Entries, devices.names, MUIA_Cycle_Active, default_count, End, End, Child, main_group = ColGroup(4), End, Child, HGroup, Child, ok = TextObject, ButtonFrame, MUIA_Background, MUII_ButtonBack, MUIA_Text_Contents, "Ok", MUIA_Text_PreParse, "\033c", MUIA_InputMode, MUIV_InputMode_RelVerify, End, Child, cancel = TextObject, ButtonFrame, MUIA_Background, MUII_ButtonBack, MUIA_Text_Contents, "Cancel", MUIA_Text_PreParse, "\033c", MUIA_InputMode, MUIV_InputMode_RelVerify, End, End, End, End, End; if (app) { unsigned int i; DoMethod(window, MUIM_Notify, MUIA_Window_CloseRequest, TRUE, app, 2, MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit); DoMethod(Odevice, MUIM_Notify, MUIA_Cycle_Active, MUIV_EveryTime, app, 2, MUIM_Application_ReturnID, DEV_CHANGE); DoMethod(cancel, MUIM_Notify, MUIA_Pressed, FALSE, app, 2, MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit); DoMethod(ok, MUIM_Notify, MUIA_Pressed, FALSE, app, 2, MUIM_Application_ReturnID, BTN_OK); for (i = 0; i < NUM_KEYSYM; i++) { /* label */ label = TextObject, MUIA_Text_PreParse, "\033r", MUIA_Text_Contents, keysym[i].label, MUIA_InnerLeft, 0, MUIA_InnerRight, 0, End; Oinput[i] = CycleObject, MUIA_Cycle_Entries, inputs.names, MUIA_Cycle_Active, offset_to_active(keysym[i].type, keysym[i].offset), End, text[i] = TextObject, MUIA_Background, MUII_TextBack, MUIA_Frame, MUIV_Frame_Text, MUIA_Text_Contents, rawkey_to_name(keysym[i].rawkey), End; button = TextObject, ButtonFrame, MUIA_Background, MUII_ButtonBack, MUIA_Text_Contents, "Change", MUIA_Text_PreParse, "\033c", MUIA_InputMode, MUIV_InputMode_RelVerify, End; DoMethod(button, MUIM_Notify, MUIA_Pressed, FALSE, app, 2, MUIM_Application_ReturnID, (i + 1)); /* add to window */ DoMethod(main_group, OM_ADDMEMBER, label); DoMethod(main_group, OM_ADDMEMBER, Oinput[i]); DoMethod(main_group, OM_ADDMEMBER, text[i]); DoMethod(main_group, OM_ADDMEMBER, button); } } if (app) { unsigned int i; set(window, MUIA_Window_Open, TRUE); while (running) { unsigned long retval = DoMethod(app, MUIM_Application_Input, &signals); switch (retval) { case MUIV_Application_ReturnID_Quit: running = FALSE; break; case BTN_OK: for (i = 0; i < NUM_KEYSYM; i++) { ULONG active; get(Oinput[i], MUIA_Cycle_Active, &active); keysym[i].type = inputs.types[active]; keysym[i].offset = inputs.offsets[active]; } set_cfg(joy); running = FALSE; break; case DEV_CHANGE: { ULONG active; get(Odevice, MUIA_Cycle_Active, &active); joy_id[joy - 1] = devices.ids[active]; update_inputs(joy_id[joy - 1]); for (i = 0; i < NUM_KEYSYM; i++) { set(Oinput[i], MUIA_Cycle_Entries, inputs.names); set(Oinput[i], MUIA_Cycle_Active, 0); } } break; default: if ((retval >= 1) && (retval <= (1 + NUM_KEYSYM))) { int keycode, index, result; result = get_key(joy_id[joy - 1], &keycode, &index); if (result == 1) { /* KEY */ keysym[retval - 1].rawkey = keycode; set(text[retval - 1], MUIA_Text_Contents, rawkey_to_name(keycode)); } else if (result == 2) { /* AI */ index = offset_to_index(index); if (index >= 0) { set(Oinput[retval - 1], MUIA_Cycle_Active, index); } } } break; } if (running && signals) { Wait(signals); } } MUI_DisposeObject(app); } } #undef DEV_CHANGE #undef BTN_OK ai_attach(); return 0; }