mirror of
https://github.com/Next-Flip/Momentum-Firmware.git
synced 2026-06-07 19:01:54 -07:00
Fix desktop keybinds buffer overrun
This commit is contained in:
@@ -31,7 +31,7 @@ static bool desktop_settings_back_event_callback(void* context) {
|
||||
return scene_manager_handle_back_event(app->scene_manager);
|
||||
}
|
||||
|
||||
char* desktop_settings_app_get_keybind(DesktopSettingsApp* app) {
|
||||
const char* desktop_settings_app_get_keybind(DesktopSettingsApp* app) {
|
||||
KeybindType type =
|
||||
scene_manager_get_scene_state(app->scene_manager, DesktopSettingsAppSceneKeybindsType);
|
||||
KeybindKey key =
|
||||
@@ -39,6 +39,34 @@ char* desktop_settings_app_get_keybind(DesktopSettingsApp* app) {
|
||||
return app->desktop->keybinds[type][key].data;
|
||||
}
|
||||
|
||||
bool desktop_settings_app_set_keybind(DesktopSettingsApp* app, const char* value) {
|
||||
if(strnlen(value, MAX_KEYBIND_LENGTH) == MAX_KEYBIND_LENGTH) {
|
||||
// No NULL terminator, value is too long for keybind
|
||||
DialogMessage* message = dialog_message_alloc();
|
||||
dialog_message_set_header(message, "Keybind Too Long", 64, 0, AlignCenter, AlignTop);
|
||||
dialog_message_set_buttons(message, NULL, "Ok", NULL);
|
||||
dialog_message_set_text(
|
||||
message,
|
||||
"Keybinds are max 63 chars.\n"
|
||||
"Shorten the file path or\n"
|
||||
"choose something else.",
|
||||
64,
|
||||
32,
|
||||
AlignCenter,
|
||||
AlignCenter);
|
||||
dialog_message_show(app->dialogs, message);
|
||||
dialog_message_free(message);
|
||||
return false;
|
||||
}
|
||||
KeybindType type =
|
||||
scene_manager_get_scene_state(app->scene_manager, DesktopSettingsAppSceneKeybindsType);
|
||||
KeybindKey key =
|
||||
scene_manager_get_scene_state(app->scene_manager, DesktopSettingsAppSceneKeybindsKey);
|
||||
strlcpy(app->desktop->keybinds[type][key].data, value, MAX_KEYBIND_LENGTH);
|
||||
DESKTOP_KEYBINDS_SAVE(&app->desktop->keybinds, sizeof(app->desktop->keybinds));
|
||||
return true;
|
||||
}
|
||||
|
||||
DesktopSettingsApp* desktop_settings_app_alloc() {
|
||||
DesktopSettingsApp* app = malloc(sizeof(DesktopSettingsApp));
|
||||
|
||||
|
||||
@@ -58,4 +58,5 @@ typedef struct {
|
||||
bool save_settings;
|
||||
} DesktopSettingsApp;
|
||||
|
||||
char* desktop_settings_app_get_keybind(DesktopSettingsApp* app);
|
||||
const char* desktop_settings_app_get_keybind(DesktopSettingsApp* app);
|
||||
bool desktop_settings_app_set_keybind(DesktopSettingsApp* app, const char* value);
|
||||
|
||||
+5
-7
@@ -5,19 +5,17 @@
|
||||
static void
|
||||
desktop_settings_scene_keybinds_action_submenu_callback(void* context, uint32_t index) {
|
||||
DesktopSettingsApp* app = context;
|
||||
char* keybind = desktop_settings_app_get_keybind(app);
|
||||
|
||||
strncpy(keybind, (const char*)index, MAX_KEYBIND_LENGTH);
|
||||
|
||||
DESKTOP_KEYBINDS_SAVE(&app->desktop->keybinds, sizeof(app->desktop->keybinds));
|
||||
scene_manager_search_and_switch_to_previous_scene(
|
||||
app->scene_manager, DesktopSettingsAppSceneStart);
|
||||
if(desktop_settings_app_set_keybind(app, (const char*)index)) {
|
||||
scene_manager_search_and_switch_to_previous_scene(
|
||||
app->scene_manager, DesktopSettingsAppSceneStart);
|
||||
}
|
||||
}
|
||||
|
||||
void desktop_settings_scene_keybinds_action_on_enter(void* context) {
|
||||
DesktopSettingsApp* app = context;
|
||||
Submenu* submenu = app->submenu;
|
||||
char* keybind = desktop_settings_app_get_keybind(app);
|
||||
const char* keybind = desktop_settings_app_get_keybind(app);
|
||||
submenu_reset(submenu);
|
||||
|
||||
uint32_t pre_select_item = 0;
|
||||
|
||||
+10
-10
@@ -23,7 +23,7 @@ static void
|
||||
DesktopSettingsApp* app = context;
|
||||
scene_manager_set_scene_state(
|
||||
app->scene_manager, DesktopSettingsAppSceneKeybindsActionType, index);
|
||||
char* keybind = desktop_settings_app_get_keybind(app);
|
||||
const char* keybind = desktop_settings_app_get_keybind(app);
|
||||
|
||||
switch(index) {
|
||||
case DesktopSettingsAppKeybindActionTypeMainApp:
|
||||
@@ -60,19 +60,19 @@ static void
|
||||
}
|
||||
furi_record_close(RECORD_STORAGE);
|
||||
if(dialog_file_browser_show(app->dialogs, temp_path, temp_path, &browser_options)) {
|
||||
strncpy(keybind, furi_string_get_cstr(temp_path), MAX_KEYBIND_LENGTH);
|
||||
DESKTOP_KEYBINDS_SAVE(&app->desktop->keybinds, sizeof(app->desktop->keybinds));
|
||||
scene_manager_search_and_switch_to_previous_scene(
|
||||
app->scene_manager, DesktopSettingsAppSceneStart);
|
||||
if(desktop_settings_app_set_keybind(app, furi_string_get_cstr(temp_path))) {
|
||||
scene_manager_search_and_switch_to_previous_scene(
|
||||
app->scene_manager, DesktopSettingsAppSceneStart);
|
||||
}
|
||||
}
|
||||
furi_string_free(temp_path);
|
||||
break;
|
||||
}
|
||||
case DesktopSettingsAppKeybindActionTypeRemoveKeybind:
|
||||
strncpy(keybind, "", MAX_KEYBIND_LENGTH);
|
||||
DESKTOP_KEYBINDS_SAVE(&app->desktop->keybinds, sizeof(app->desktop->keybinds));
|
||||
scene_manager_search_and_switch_to_previous_scene(
|
||||
app->scene_manager, DesktopSettingsAppSceneStart);
|
||||
if(desktop_settings_app_set_keybind(app, "")) {
|
||||
scene_manager_search_and_switch_to_previous_scene(
|
||||
app->scene_manager, DesktopSettingsAppSceneStart);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -82,7 +82,7 @@ static void
|
||||
void desktop_settings_scene_keybinds_action_type_on_enter(void* context) {
|
||||
DesktopSettingsApp* app = context;
|
||||
Submenu* submenu = app->submenu;
|
||||
char* keybind = desktop_settings_app_get_keybind(app);
|
||||
const char* keybind = desktop_settings_app_get_keybind(app);
|
||||
|
||||
submenu_add_item(
|
||||
submenu,
|
||||
|
||||
Reference in New Issue
Block a user