diff --git a/frontend/menu/backend/menu_common_backend.c b/frontend/menu/backend/menu_common_backend.c index e061f51fd1..ccc7da3f17 100644 --- a/frontend/menu/backend/menu_common_backend.c +++ b/frontend/menu/backend/menu_common_backend.c @@ -187,6 +187,76 @@ static int menu_start_screen_iterate(unsigned action) return 0; } +static int mouse_iterate(unsigned action) +{ + const struct retro_keybind *binds[MAX_PLAYERS]; + + if (!driver.menu->mouse.enable) + return 0; + + driver.menu->mouse.dx = driver.input->input_state(driver.input_data, + binds, 0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_X); + driver.menu->mouse.dy = driver.input->input_state(driver.input_data, + binds, 0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_Y); + + driver.menu->mouse.x += driver.menu->mouse.dx; + driver.menu->mouse.y += driver.menu->mouse.dy; + + if (driver.menu->mouse.x < 5) + driver.menu->mouse.x = 5; + if (driver.menu->mouse.y < 5) + driver.menu->mouse.y = 5; + if (driver.menu->mouse.x > driver.menu->width - 5) + driver.menu->mouse.x = driver.menu->width - 5; + if (driver.menu->mouse.y > driver.menu->height - 5) + driver.menu->mouse.y = driver.menu->height - 5; + + driver.menu->mouse.left = driver.input->input_state(driver.input_data, + binds, 0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_LEFT); + + driver.menu->mouse.right = driver.input->input_state(driver.input_data, + binds, 0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_RIGHT); + + return 0; +} + +static int mouse_post_iterate(menu_file_list_cbs_t *cbs, unsigned action) +{ + if (!driver.menu->mouse.enable) + return 0; + + if (driver.menu->mouse.dy) + { + unsigned mouse_ptr = driver.menu->mouse.y / 11 - 2; + if (mouse_ptr <= menu_list_get_size(driver.menu->menu_list)) + menu_navigation_set(driver.menu, mouse_ptr); + } + + if (driver.menu->mouse.left) + { + if (!driver.menu->mouse.oldleft) + { + driver.menu->mouse.oldleft = true; + return menu_action_ok(cbs); + } + } + else + driver.menu->mouse.oldleft = false; + + if (driver.menu->mouse.right) + { + if (!driver.menu->mouse.oldright) + { + driver.menu->mouse.oldright = true; + menu_list_pop_stack(driver.menu->menu_list); + } + } + else + driver.menu->mouse.oldright = false; + + return 0; +} + static int menu_settings_iterate(unsigned action, menu_file_list_cbs_t *cbs) { @@ -277,38 +347,7 @@ static int menu_settings_iterate(unsigned action, driver.menu->push_start_screen = false; } - if (driver.menu->mouse.dy) - { - unsigned mouse_ptr = driver.menu->mouse.y / 11 - 2; - if (mouse_ptr <= menu_list_get_size(driver.menu->menu_list)) - menu_navigation_set(driver.menu, mouse_ptr); - } - - if (driver.menu->mouse.left) - { - if (!driver.menu->mouse.oldleft) - { - driver.menu->mouse.oldleft = true; - if (cbs && cbs->action_ok) - return cbs->action_ok(path, label, type, driver.menu->selection_ptr); - } - } - else - driver.menu->mouse.oldleft = false; - - if (driver.menu->mouse.right) - { - if (!driver.menu->mouse.oldright) - { - driver.menu->mouse.oldright = true; - apply_deferred_settings(); - menu_list_pop_stack(driver.menu->menu_list); - } - } - else - driver.menu->mouse.oldright = false; - - return 0; + return mouse_post_iterate(cbs, action); } static int menu_viewport_iterate(unsigned action) @@ -574,69 +613,6 @@ static int menu_load_or_open_zip_iterate(unsigned action) return 0; } -static int mouse_iterate(unsigned action) -{ - const struct retro_keybind *binds[MAX_PLAYERS]; - - driver.menu->mouse.dx = driver.input->input_state(driver.input_data, - binds, 0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_X); - driver.menu->mouse.dy = driver.input->input_state(driver.input_data, - binds, 0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_Y); - - driver.menu->mouse.x += driver.menu->mouse.dx; - driver.menu->mouse.y += driver.menu->mouse.dy; - - if (driver.menu->mouse.x < 5) - driver.menu->mouse.x = 5; - if (driver.menu->mouse.y < 5) - driver.menu->mouse.y = 5; - if (driver.menu->mouse.x > driver.menu->width - 5) - driver.menu->mouse.x = driver.menu->width - 5; - if (driver.menu->mouse.y > driver.menu->height - 5) - driver.menu->mouse.y = driver.menu->height - 5; - - driver.menu->mouse.left = driver.input->input_state(driver.input_data, - binds, 0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_LEFT); - - driver.menu->mouse.right = driver.input->input_state(driver.input_data, - binds, 0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_RIGHT); - - return 0; -} - -static int mouse_post_iterate(menu_file_list_cbs_t *cbs, unsigned action) -{ - if (driver.menu->mouse.dy) - { - unsigned mouse_ptr = driver.menu->mouse.y / 11 - 2; - if (mouse_ptr <= menu_list_get_size(driver.menu->menu_list)) - menu_navigation_set(driver.menu, mouse_ptr); - } - - if (driver.menu->mouse.left) - { - if (!driver.menu->mouse.oldleft) - { - driver.menu->mouse.oldleft = true; - return menu_action_ok(cbs); - } - } - else - driver.menu->mouse.oldleft = false; - - if (driver.menu->mouse.right) - { - if (!driver.menu->mouse.oldright) - { - driver.menu->mouse.oldright = true; - menu_list_pop_stack(driver.menu->menu_list); - } - } - else - driver.menu->mouse.oldright = false; - - return 0; -} static int menu_common_iterate(unsigned action) { diff --git a/frontend/menu/disp/rgui.c b/frontend/menu/disp/rgui.c index 4ea71bd7ac..b42c810955 100644 --- a/frontend/menu/disp/rgui.c +++ b/frontend/menu/disp/rgui.c @@ -422,7 +422,8 @@ static void rgui_render(void) rgui_render_messagebox(msg); } - blit_cursor(); + if (driver.menu->mouse.enable) + blit_cursor(); } static void *rgui_init(void) diff --git a/frontend/menu/menu_common.c b/frontend/menu/menu_common.c index c72a6b515d..7e0940e20d 100644 --- a/frontend/menu/menu_common.c +++ b/frontend/menu/menu_common.c @@ -431,6 +431,8 @@ int menu_iterate(retro_input_t input, driver.menu->scroll_accel = 0; } + driver.menu->mouse.enable = g_settings.menu.mouse_enable; + driver.menu->delay_count++; if (driver.block_input) diff --git a/frontend/menu/menu_driver.h b/frontend/menu/menu_driver.h index 83abed4b53..b3ff331286 100644 --- a/frontend/menu/menu_driver.h +++ b/frontend/menu/menu_driver.h @@ -122,6 +122,7 @@ typedef struct int16_t dy; int16_t x; int16_t y; + bool enable; bool left; bool right; bool oldleft; diff --git a/general.h b/general.h index 677de29331..fa1cfe0951 100644 --- a/general.h +++ b/general.h @@ -286,6 +286,7 @@ struct settings { char driver[32]; bool pause_libretro; + bool mouse_enable; } menu; #endif diff --git a/settings_data.c b/settings_data.c index 6f2108e99f..bb67c97fc8 100644 --- a/settings_data.c +++ b/settings_data.c @@ -4862,6 +4862,19 @@ static bool setting_data_append_list_menu_options( general_read_handler); settings_list_current_add_cmd(list, list_info, RARCH_CMD_MENU_PAUSE_LIBRETRO); settings_data_list_current_add_flags(list, list_info, SD_FLAG_CMD_APPLY_AUTO); + + CONFIG_BOOL( + g_settings.menu.mouse_enable, + "menu_mouse_enable", + "Mouse Enable", + false, + "OFF", + "ON", + group_info.name, + subgroup_info.name, + general_write_handler, + general_read_handler); + END_SUB_GROUP(list, list_info); END_GROUP(list, list_info); #endif