diff --git a/command_event.c b/command_event.c index 4b6731b6f3..f080b4b3cf 100644 --- a/command_event.c +++ b/command_event.c @@ -1664,21 +1664,28 @@ bool event_cmd_ctl(enum event_command cmd, void *data) break; case EVENT_CMD_GRAB_MOUSE_TOGGLE: { + bool ret = false; static bool grab_mouse_state = false; - bool grab_mouse_state_tmp; grab_mouse_state = !grab_mouse_state; - if (!input_driver_ctl(RARCH_INPUT_CTL_GRAB_MOUSE, &grab_mouse_state)) - return false; + if (grab_mouse_state) + { + ret = input_driver_ctl(RARCH_INPUT_CTL_GRAB_MOUSE, NULL); + video_driver_ctl(RARCH_DISPLAY_CTL_SHOW_MOUSE, NULL); + } + else + { + ret = input_driver_ctl(RARCH_INPUT_CTL_UNGRAB_MOUSE, NULL); + video_driver_ctl(RARCH_DISPLAY_CTL_HIDE_MOUSE, NULL); + } RARCH_LOG("%s: %s.\n", msg_hash_to_str(MSG_GRAB_MOUSE_STATE), grab_mouse_state ? "yes" : "no"); - grab_mouse_state_tmp = !grab_mouse_state; - video_driver_ctl(RARCH_DISPLAY_CTL_SHOW_MOUSE, - &grab_mouse_state_tmp); + if (!ret) + return false; } break; case EVENT_CMD_PERFCNT_REPORT_FRONTEND_LOG: diff --git a/gfx/video_driver.c b/gfx/video_driver.c index f513957178..99cd332962 100644 --- a/gfx/video_driver.c +++ b/gfx/video_driver.c @@ -1451,13 +1451,14 @@ bool video_driver_ctl(enum rarch_display_ctl_state state, void *data) case RARCH_DISPLAY_CTL_SHOW_MOUSE: if (!video_driver_poke) return false; - - { - bool *toggle = (bool*)data; - - if (video_driver_poke->show_mouse) - video_driver_poke->show_mouse(video_driver_data, *toggle); - } + if (video_driver_poke->show_mouse) + video_driver_poke->show_mouse(video_driver_data, true); + break; + case RARCH_DISPLAY_CTL_HIDE_MOUSE: + if (!video_driver_poke) + return false; + if (video_driver_poke->show_mouse) + video_driver_poke->show_mouse(video_driver_data, false); break; case RARCH_DISPLAY_CTL_SET_NONBLOCK_STATE: { diff --git a/gfx/video_driver.h b/gfx/video_driver.h index 61340274b6..bdb0bcec7f 100644 --- a/gfx/video_driver.h +++ b/gfx/video_driver.h @@ -136,6 +136,7 @@ enum rarch_display_ctl_state RARCH_DISPLAY_CTL_CACHED_FRAME_HAS_VALID_FB, RARCH_DISPLAY_CTL_CACHED_FRAME_SET_PTR, RARCH_DISPLAY_CTL_SHOW_MOUSE, + RARCH_DISPLAY_CTL_HIDE_MOUSE, RARCH_DISPLAY_CTL_GET_FRAME_COUNT, RARCH_DISPLAY_CTL_SET_OWN_DRIVER, RARCH_DISPLAY_CTL_UNSET_OWN_DRIVER, diff --git a/input/input_driver.c b/input/input_driver.c index 84baaa529b..166e413215 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -836,13 +836,16 @@ bool input_driver_ctl(enum rarch_input_ctl_state state, void *data) #endif break; case RARCH_INPUT_CTL_GRAB_MOUSE: - { - bool *bool_data = (bool*)data; - if (!current_input || !current_input->grab_mouse) - return false; + if (!current_input || !current_input->grab_mouse) + return false; - current_input->grab_mouse(current_input_data, *bool_data); - } + current_input->grab_mouse(current_input_data, true); + break; + case RARCH_INPUT_CTL_UNGRAB_MOUSE: + if (!current_input || !current_input->grab_mouse) + return false; + + current_input->grab_mouse(current_input_data, false); break; case RARCH_INPUT_CTL_IS_DATA_PTR_SAME: return (current_input_data == data); diff --git a/input/input_driver.h b/input/input_driver.h index 6481d77c51..b38976f7c3 100644 --- a/input/input_driver.h +++ b/input/input_driver.h @@ -84,6 +84,7 @@ enum rarch_input_ctl_state RARCH_INPUT_CTL_REMOTE_DEINIT, RARCH_INPUT_CTL_KEY_PRESSED, RARCH_INPUT_CTL_GRAB_MOUSE, + RARCH_INPUT_CTL_UNGRAB_MOUSE, RARCH_INPUT_CTL_IS_DATA_PTR_SAME };