int input_evdev_init(EvdevController* controller, const char* device, const char* custom_mapping_fname = NULL) { load_libevdev(); char name[256] = "Unknown"; printf("evdev: Trying to open device at '%s'\n", device); int fd = open(device, O_RDWR); if (fd >= 0) { fcntl(fd, F_SETFL, O_NONBLOCK); if(ioctl(fd, EVIOCGNAME(sizeof(name)), name) < 0) { perror("evdev: ioctl"); return -2; } else { printf("evdev: Found '%s' at '%s'\n", name, device); controller->fd = fd; const char* mapping_fname; if(custom_mapping_fname != NULL) { mapping_fname = custom_mapping_fname; } else { #if defined(TARGET_PANDORA) mapping_fname = "controller_pandora.cfg"; #elif defined(TARGET_GCW0) mapping_fname = "controller_gcwz.cfg"; #else if (strcmp(name, "Microsoft X-Box 360 pad") == 0 || strcmp(name, "Xbox 360 Wireless Receiver") == 0 || strcmp(name, "Xbox 360 Wireless Receiver (XBOX)") == 0) { mapping_fname = "controller_xpad.cfg"; } else if (strstr(name, "Xbox Gamepad (userspace driver)") != NULL) { mapping_fname = "controller_xboxdrv.cfg"; } else if (strstr(name, "keyboard") != NULL || strstr(name, "Keyboard") != NULL) { mapping_fname = "keyboard.cfg"; } else { mapping_fname = "controller_generic.cfg"; } #endif } if(loaded_mappings.count(string(mapping_fname)) == 0) { FILE* mapping_fd = NULL; if(mapping_fname[0] == '/') { // Absolute mapping mapping_fd = fopen(mapping_fname, "r"); } else { // Mapping from ~/.reicast/mappings/ size_t size_needed = snprintf(NULL, 0, EVDEV_MAPPING_PATH, mapping_fname) + 1; char* mapping_path = (char*)malloc(size_needed); sprintf(mapping_path, EVDEV_MAPPING_PATH, mapping_fname); mapping_fd = fopen(get_readonly_data_path(mapping_path).c_str(), "r"); free(mapping_path); } if(mapping_fd != NULL) { printf("evdev: reading mapping file: '%s'\n", mapping_fname); loaded_mappings.insert(std::make_pair(string(mapping_fname), load_mapping(mapping_fd))); fclose(mapping_fd); } else { printf("evdev: unable to open mapping file '%s'\n", mapping_fname); perror("evdev"); return -3; } } controller->mapping = &loaded_mappings[string(mapping_fname)]; printf("evdev: Using '%s' mapping\n", controller->mapping->name); controller->init(); return 0; } } else { perror("evdev: open"); return -1; } }
int dc_init(int argc,wchar* argv[]) { setbuf(stdin,0); setbuf(stdout,0); setbuf(stderr,0); if (!_vmem_reserve()) { printf("Failed to alloc mem\n"); return -1; } #if !defined(TARGET_NO_WEBUI) webui_thd.Start(); #endif if(ParseCommandLine(argc,argv)) { return 69; } if(!cfgOpen()) { msgboxf("Unable to open config file",MBX_ICONERROR); return -4; } LoadSettings(); #ifndef _ANDROID os_CreateWindow(); #endif int rv= 0; #if HOST_OS != OS_DARWIN #define DATA_PATH "/data/" #else #define DATA_PATH "/" #endif if (settings.bios.UseReios || !LoadRomFiles(get_readonly_data_path(DATA_PATH))) { if (!LoadHle(get_readonly_data_path(DATA_PATH))) return -3; else printf("Did not load bios, using reios\n"); } #if FEAT_SHREC != DYNAREC_NONE if(settings.dynarec.Enable) { Get_Sh4Recompiler(&sh4_cpu); printf("Using Recompiler\n"); } else #endif { Get_Sh4Interpreter(&sh4_cpu); printf("Using Interpreter\n"); } InitAudio(); sh4_cpu.Init(); mem_Init(); plugins_Init(); mem_map_default(); #ifndef _ANDROID mcfg_CreateDevices(); #else mcfg_CreateDevices(); #endif plugins_Reset(false); mem_Reset(false); sh4_cpu.Reset(false); return rv; }