static void unacquire_joy (unsigned int joynum) { struct joystick *joy = &joystickList[joynum]; if (joy->handle) { AIN_ReleaseDevice (joy->context, joy->handle); joy->handle = 0; } }
static void ai_release(void) { int i; for (i = 0; i < 2; i++) { if ((CTX != NULL) && (ai_handle[i] != NULL)) { AIN_ReleaseDevice(CTX, ai_handle[i]); ai_handle[i] = NULL; } } }
static void close_joysticks (void) { unsigned int i = joystickCount; while (i-- > 0) { struct joystick *joy = &joystickList[i]; if (joy->handle) { AIN_ReleaseDevice (joy->context, joy->handle); joy->handle = 0; } } joystickCount = 0; AIN_DeleteContext (joystickContext); joystickContext = 0; }
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; }
static int get_key(AIN_DeviceID ID, int *keycode, int *offset) { static char *window_text; struct Window *window; AIN_InputEvent *event; int done = 0; window_text = translate_text(IDS_PRESS_KEY_BUTTON); *keycode = *offset = -1; /* no key */ if (ID != -1) { ai_handle[0] = AIN_ObtainDevice(CTX, ID); if (ai_handle[0] != NULL) { AIN_SetDeviceParameter(CTX, ai_handle[0], AINDP_EVENT, TRUE); } } window = OpenWindowTags(NULL, WA_Title, (ULONG)"", WA_Flags, WFLG_NOCAREREFRESH|WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_CLOSEGADGET|WFLG_RMBTRAP|WFLG_GIMMEZEROZERO, WA_IDCMP, IDCMP_CLOSEWINDOW|WFLG_REPORTMOUSE|IDCMP_RAWKEY|IDCMP_CHANGEWINDOW, WA_Left, 100, WA_Top, 100, WA_Width, 100, WA_Height, 40, WA_Activate, TRUE, TAG_DONE); if (window != NULL) { struct IntuiMessage *imsg = NULL; ULONG imCode, imClass; /* Resize window and set pens */ int length = TextLength(window->RPort, window_text, strlen(window_text)); ChangeWindowBox(window, 100, 100, window->BorderLeft+length+window->BorderRight+8, window->BorderTop+window->IFont->tf_YSize*2+window->BorderBottom); SetAPen(window->RPort, 1); SetBPen(window->RPort, 0); /* Wait until window has been resized */ while (done == 0) { /* Wait for messages */ Wait((1L << window->UserPort->mp_SigBit) | (1L << ai_port->mp_SigBit)); /* Check for IDCMP messages */ while ((imsg = (struct IntuiMessage *)GetMsg(window->UserPort))) { imClass = imsg->Class; imCode = imsg->Code; ReplyMsg((struct Message *)imsg); if (imClass == IDCMP_CHANGEWINDOW) { Move(window->RPort, 4, window->IFont->tf_YSize); Text(window->RPort, window_text, strlen(window_text)); } else if (imClass == IDCMP_RAWKEY) { imCode &= 0x7f; if (imCode != 69) { *keycode = imCode; } done = 1; /* KEY ok */ } else if (imClass == IDCMP_CLOSEWINDOW) { done = -1; /* cancel */ } } /* Check for AI messages */ if (ai_handle[0] != NULL) { while ((event = AIN_GetEvent(CTX))) { switch(event->Type) { case AINET_AXIS: if ((event->Value >= (ONOFF_VALUE)) || (event->Value <= (-(ONOFF_VALUE)))) { *offset = event->Index; done = 2; /* AI ok */ } break; case AINET_BUTTON: *offset = event->Index; done = 2; /* AI ok */ break; case AINET_HAT: *offset = event->Index; done = 2; /* AI ok */ break; default: break; } AIN_FreeEvent(CTX, event); } } } CloseWindow(window); } if (ai_handle[0] != NULL) { AIN_SetDeviceParameter(CTX, ai_handle[0], AINDP_EVENT, FALSE); /* Remove pending AI messages */ while ((event = AIN_GetEvent(CTX))) { AIN_FreeEvent(CTX, event); } AIN_ReleaseDevice(CTX, ai_handle[0]); ai_handle[0] = NULL; } return done; }