int menu_input_bind_iterate(void) { int64_t current; char msg[PATH_MAX_LENGTH]; struct menu_bind_state binds; int timeout = 0; menu_handle_t *menu = menu_driver_get_ptr(); driver_t *driver = driver_get_ptr(); global_t *global = global_get_ptr(); bool bind_mode_kb = global ? global->menu.bind_mode_keyboard : false; if (!menu) return 1; menu_driver_render(); current = rarch_get_time_usec(); timeout = (menu->binds.timeout_end - current) / 1000000; snprintf(msg, sizeof(msg), bind_mode_kb ? "[%s]\npress keyboard\n(timeout %d seconds)" : "[%s]\npress joypad\n(RETURN to skip)", input_config_bind_map[ menu->binds.begin - MENU_SETTINGS_BIND_BEGIN].desc, timeout); menu_driver_render_messagebox(msg); if (bind_mode_kb) return menu_input_bind_iterate_keyboard(current, timeout); binds = menu->binds; driver->block_input = true; menu_input_poll_bind_state(&binds); if ((binds.skip && !menu->binds.skip) || menu_input_poll_find_trigger(&menu->binds, &binds)) { driver->block_input = false; /* Avoid new binds triggering things right away. */ driver->flushing_input = true; binds.begin++; if (binds.begin > binds.last) return 1; binds.target++; } menu->binds = binds; return 0; }
int menu_input_bind_iterate(char *s, size_t len) { struct menu_bind_state binds; menu_input_t *menu_input = menu_input_get_ptr(); driver_t *driver = driver_get_ptr(); global_t *global = global_get_ptr(); bool bind_mode_kb = global ? global->menu.bind_mode_keyboard : false; int64_t current = rarch_get_time_usec(); int timeout = (menu_input->binds.timeout_end - current) / 1000000; if (bind_mode_kb) { snprintf(s, len, "[%s]\npress keyboard\n(timeout %d %s)", input_config_bind_map[ menu_input->binds.begin - MENU_SETTINGS_BIND_BEGIN].desc, timeout, menu_hash_to_str(MENU_VALUE_SECONDS)); return menu_input_bind_iterate_keyboard(current, timeout); } else snprintf(s, len, "[%s]\npress joypad\n(RETURN to skip)", input_config_bind_map[ menu_input->binds.begin - MENU_SETTINGS_BIND_BEGIN].desc); binds = menu_input->binds; input_driver_keyboard_mapping_set_block(true); menu_input_poll_bind_state(&binds, bind_port); if ((binds.skip && !menu_input->binds.skip) || menu_input_poll_find_trigger(&menu_input->binds, &binds)) { input_driver_keyboard_mapping_set_block(false); /* Avoid new binds triggering things right away. */ driver->flushing_input = true; binds.begin++; if (binds.begin > binds.last) return 1; binds.target++; } menu_input->binds = binds; return 0; }
int menu_input_set_input_device_bind_mode(void *data, enum menu_input_bind_mode type) { struct retro_keybind *keybind = NULL; rarch_setting_t *setting = (rarch_setting_t*)data; settings_t *settings = config_get_ptr(); menu_handle_t *menu = menu_driver_get_ptr(); if (!menu || !setting) return -1; switch (type) { case MENU_INPUT_BIND_NONE: return -1; case MENU_INPUT_BIND_SINGLE: keybind = (struct retro_keybind*)setting->value.keybind; if (!keybind) return -1; menu->binds.begin = setting->bind_type; menu->binds.last = setting->bind_type; menu->binds.target = keybind; menu->binds.user = setting->index_offset; menu_list_push_stack( menu->menu_list, "", "custom_bind", MENU_SETTINGS_CUSTOM_BIND, menu->navigation.selection_ptr); break; case MENU_INPUT_BIND_ALL: menu->binds.target = &settings->input.binds [setting->index_offset][0]; menu->binds.begin = MENU_SETTINGS_BIND_BEGIN; menu->binds.last = MENU_SETTINGS_BIND_LAST; menu_list_push_stack( menu->menu_list, "", "custom_bind_all", MENU_SETTINGS_CUSTOM_BIND, menu->navigation.selection_ptr); break; } menu_input_poll_bind_get_rested_axes(&menu->binds); menu_input_poll_bind_state(&menu->binds); return 0; }
int menu_input_set_input_device_bind_mode(void *data, enum menu_input_bind_mode type) { menu_handle_t *menu = menu_driver_get_ptr(); rarch_setting_t *setting = (rarch_setting_t*)data; if (!setting) return -1; if (menu_input_set_bind_mode_common(setting, type) == -1) return -1; menu_input_poll_bind_get_rested_axes(&menu->binds); menu_input_poll_bind_state(&menu->binds); return 0; }
int menu_input_bind_iterate(void) { char msg[PATH_MAX_LENGTH]; struct menu_bind_state binds; menu_handle_t *menu = menu_driver_resolve(); if (!menu) return 1; binds = menu->binds; if (driver.video_data && driver.menu_ctx && driver.menu_ctx->render) driver.menu_ctx->render(); snprintf(msg, sizeof(msg), "[%s]\npress joypad\n(RETURN to skip)", input_config_bind_map[ menu->binds.begin - MENU_SETTINGS_BIND_BEGIN].desc); if (driver.video_data && driver.menu_ctx && driver.menu_ctx->render_messagebox) driver.menu_ctx->render_messagebox( msg); driver.block_input = true; menu_input_poll_bind_state(&binds); if ((binds.skip && !menu->binds.skip) || menu_input_poll_find_trigger(&menu->binds, &binds)) { driver.block_input = false; /* Avoid new binds triggering things right away. */ driver.flushing_input = true; binds.begin++; if (binds.begin > binds.last) return 1; binds.target++; } menu->binds = binds; return 0; }
int menu_input_set_input_device_bind_mode(void *data, enum menu_input_bind_mode type) { menu_input_t *menu_input = menu_input_get_ptr(); rarch_setting_t *setting = (rarch_setting_t*)data; settings_t *settings = config_get_ptr(); bind_port = settings->input.joypad_map[setting->index_offset]; if (!setting) return -1; if (menu_input_set_bind_mode_common(setting, type) == -1) return -1; menu_input_poll_bind_get_rested_axes(&menu_input->binds, bind_port); menu_input_poll_bind_state(&menu_input->binds, bind_port); return 0; }