diff --git a/configuration.c b/configuration.c index bc897faf21..7bc42693d1 100644 --- a/configuration.c +++ b/configuration.c @@ -1724,6 +1724,9 @@ static struct config_bool_setting *populate_settings_bool( SETTING_BOOL("config_save_on_exit", &settings->bools.config_save_on_exit, true, DEFAULT_CONFIG_SAVE_ON_EXIT, false); SETTING_BOOL("show_hidden_files", &settings->bools.show_hidden_files, true, DEFAULT_SHOW_HIDDEN_FILES, false); SETTING_BOOL("input_autodetect_enable", &settings->bools.input_autodetect_enable, true, input_autodetect_enable, false); +#if defined(HAVE_DINPUT) || defined(HAVE_WINRAWINPUT) + SETTING_BOOL("input_nowinkey_enable", &settings->bools.input_nowinkey_enable, true, false, false); +#endif SETTING_BOOL("input_sensors_enable", &settings->bools.input_sensors_enable, true, DEFAULT_INPUT_SENSORS_ENABLE, false); SETTING_BOOL("audio_rate_control", &settings->bools.audio_rate_control, true, DEFAULT_RATE_CONTROL, false); #ifdef HAVE_WASAPI diff --git a/configuration.h b/configuration.h index b6e360db23..b78b48e340 100644 --- a/configuration.h +++ b/configuration.h @@ -524,6 +524,9 @@ typedef struct settings bool input_backtouch_toggle; bool input_small_keyboard_enable; bool input_keyboard_gamepad_enable; +#if defined(HAVE_DINPUT) || defined(HAVE_WINRAWINPUT) + bool input_nowinkey_enable; +#endif /* Frame time counter */ bool frame_time_counter_reset_after_fastforwarding; diff --git a/input/drivers/dinput.c b/input/drivers/dinput.c index 8da53b464e..8b9d51b81f 100644 --- a/input/drivers/dinput.c +++ b/input/drivers/dinput.c @@ -159,9 +159,17 @@ static void *dinput_init(const char *joypad_driver) if (di->keyboard) { + DWORD flags; + settings_t *settings; + + settings = config_get_ptr(); + flags = DISCL_NONEXCLUSIVE | DISCL_FOREGROUND; + if (settings->bools.input_nowinkey_enable) + flags |= DISCL_NOWINKEY; + IDirectInputDevice8_SetDataFormat(di->keyboard, &c_dfDIKeyboard); IDirectInputDevice8_SetCooperativeLevel(di->keyboard, - (HWND)video_driver_window_get(), DISCL_NONEXCLUSIVE | DISCL_FOREGROUND | DISCL_NOWINKEY); + (HWND)video_driver_window_get(), flags); IDirectInputDevice8_Acquire(di->keyboard); } diff --git a/input/drivers/winraw_input.c b/input/drivers/winraw_input.c index df64a23d0c..834d0775a7 100644 --- a/input/drivers/winraw_input.c +++ b/input/drivers/winraw_input.c @@ -100,12 +100,16 @@ static void winraw_destroy_window(HWND wnd) static BOOL winraw_set_keyboard_input(HWND window) { RAWINPUTDEVICE rid; + settings_t *settings; + + settings = config_get_ptr(); rid.dwFlags = window ? 0 : RIDEV_REMOVE; rid.hwndTarget = window; rid.usUsagePage = 0x01; /* generic desktop */ rid.usUsage = 0x06; /* keyboard */ - rid.dwFlags |= RIDEV_NOHOTKEYS; /* disable win keys while focused */ + if (settings->bools.input_nowinkey_enable) + rid.dwFlags |= RIDEV_NOHOTKEYS; /* disable win keys while focused */ return RegisterRawInputDevices(&rid, 1, sizeof(RAWINPUTDEVICE)); } diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index 8a0ed762f6..33267f857b 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -1302,6 +1302,12 @@ MSG_HASH( MENU_ENUM_LABEL_INPUT_AUTODETECT_ENABLE, "input_autodetect_enable" ) +#if defined(HAVE_DINPUT) || defined(HAVE_WINRAWINPUT) +MSG_HASH( + MENU_ENUM_LABEL_INPUT_NOWINKEY_ENABLE, + "input_nowinkey_enable" + ) +#endif MSG_HASH( MENU_ENUM_LABEL_INPUT_SENSORS_ENABLE, "input_sensors_enable" diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 4d4dcc4184..3df8785d43 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -2058,6 +2058,16 @@ MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_AUTODETECT_ENABLE, "Automatically configures controllers that have a profile, Plug-and-Play style." ) +#if defined(HAVE_DINPUT) || defined(HAVE_WINRAWINPUT) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_NOWINKEY_ENABLE, + "Disable Windows Hotkeys" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_NOWINKEY_ENABLE, + "Keeps Win-key combinations inside the application. (Restart Required)" + ) +#endif MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_SENSORS_ENABLE, "Auxiliary Sensor Input" diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index 0c926dc8cf..6f22975d58 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -495,6 +495,9 @@ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_savestate_max_keep, MENU_ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_autosave_interval, MENU_ENUM_SUBLABEL_AUTOSAVE_INTERVAL) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_remap_binds_enable, MENU_ENUM_SUBLABEL_INPUT_REMAP_BINDS_ENABLE) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_autodetect_enable, MENU_ENUM_SUBLABEL_INPUT_AUTODETECT_ENABLE) +#if defined(HAVE_DINPUT) || defined(HAVE_WINRAWINPUT) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_nowinkey_enable, MENU_ENUM_SUBLABEL_INPUT_NOWINKEY_ENABLE) +#endif DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_sensors_enable, MENU_ENUM_SUBLABEL_INPUT_SENSORS_ENABLE) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_swap_ok_cancel, MENU_ENUM_SUBLABEL_MENU_INPUT_SWAP_OK_CANCEL) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_pause_libretro, MENU_ENUM_SUBLABEL_PAUSE_LIBRETRO) @@ -2869,6 +2872,11 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_INPUT_AUTODETECT_ENABLE: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_input_autodetect_enable); break; +#if defined(HAVE_DINPUT) || defined(HAVE_WINRAWINPUT) + case MENU_ENUM_LABEL_INPUT_NOWINKEY_ENABLE: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_input_nowinkey_enable); + break; +#endif case MENU_ENUM_LABEL_INPUT_SENSORS_ENABLE: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_input_sensors_enable); break; diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index a56e67c98b..c89327fce4 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -6037,6 +6037,12 @@ unsigned menu_displaylist_build_list( MENU_ENUM_LABEL_INPUT_BIND_MODE, PARSE_ONLY_UINT, false) == 0) count++; +#if defined(HAVE_DINPUT) || defined(HAVE_WINRAWINPUT) + if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(list, + MENU_ENUM_LABEL_INPUT_NOWINKEY_ENABLE, + PARSE_ONLY_BOOL, false) == 0) + count++; +#endif if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(list, MENU_ENUM_LABEL_INPUT_SENSORS_ENABLE, PARSE_ONLY_BOOL, false) == 0) diff --git a/menu/menu_setting.c b/menu/menu_setting.c index b4cfc36e15..592c67ea41 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -12063,6 +12063,24 @@ static bool setting_append_list( SD_FLAG_ADVANCED ); +#if defined(HAVE_DINPUT) || defined(HAVE_WINRAWINPUT) + CONFIG_BOOL( + list, list_info, + &settings->bools.input_nowinkey_enable, + MENU_ENUM_LABEL_INPUT_NOWINKEY_ENABLE, + MENU_ENUM_LABEL_VALUE_INPUT_NOWINKEY_ENABLE, + false, + MENU_ENUM_LABEL_VALUE_OFF, + MENU_ENUM_LABEL_VALUE_ON, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler, + SD_FLAG_NONE + ); +#endif + CONFIG_BOOL( list, list_info, &settings->bools.input_sensors_enable, diff --git a/msg_hash.h b/msg_hash.h index 09293979b5..9ba5057e51 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -918,6 +918,9 @@ enum msg_hash_enums MENU_LABEL(INPUT_USER_BINDS), MENU_LABEL(INPUT_DUTY_CYCLE), MENU_LABEL(INPUT_AUTODETECT_ENABLE), +#if defined(HAVE_DINPUT) || defined(HAVE_WINRAWINPUT) + MENU_LABEL(INPUT_NOWINKEY_ENABLE), +#endif MENU_LABEL(INPUT_SENSORS_ENABLE), MENU_LABEL(INPUT_DESCRIPTOR_LABEL_SHOW), MENU_LABEL(INPUT_DESCRIPTOR_HIDE_UNBOUND),