diff --git a/4ed_system_api.cpp b/4ed_system_api.cpp index 67be0759..910ed9ae 100644 --- a/4ed_system_api.cpp +++ b/4ed_system_api.cpp @@ -298,6 +298,11 @@ define_api(Arena *arena){ api_param(arena, call, "Arena*", "arena"); } + { + API_Call *call = api_call(arena, api, "set_key_mode", "void"); + api_param(arena, call, "Key_Mode", "mode"); + } + return(api); } diff --git a/custom/4coder_config.cpp b/custom/4coder_config.cpp index bfb2a6aa..7d1a7eac 100644 --- a/custom/4coder_config.cpp +++ b/custom/4coder_config.cpp @@ -1225,6 +1225,7 @@ config_init_default(Config_Data *config){ config->mapping = SCu8(config->mapping_space, (u64)0); config->mode = SCu8(config->mode_space, (u64)0); + config->bind_by_physical_key = false; config->use_scroll_bars = false; config->use_file_bars = true; config->hide_file_bar_in_ui = true; @@ -1298,6 +1299,7 @@ config_parse__data(Application_Links *app, Arena *arena, String_Const_u8 file_na config_fixed_string_var(parsed, "mapping", 0, &config->mapping, config->mapping_space); config_fixed_string_var(parsed, "mode", 0, &config->mode, config->mode_space); + config_bool_var(parsed, "bind_by_physical_key", 0, &config->bind_by_physical_key); config_bool_var(parsed, "use_scroll_bars", 0, &config->use_scroll_bars); config_bool_var(parsed, "use_file_bars", 0, &config->use_file_bars); config_bool_var(parsed, "hide_file_bar_in_ui", 0, &config->hide_file_bar_in_ui); @@ -1565,6 +1567,7 @@ load_config_and_apply(Application_Links *app, Arena *out_arena, Config_Data *con config_feedback_string(scratch, &list, "mapping", config->mapping); config_feedback_string(scratch, &list, "mode", config->mode); + config_feedback_bool(scratch, &list, "bind_by_physical_key", config->bind_by_physical_key); config_feedback_bool(scratch, &list, "use_scroll_bars", config->use_scroll_bars); config_feedback_bool(scratch, &list, "use_file_bars", config->use_file_bars); config_feedback_bool(scratch, &list, "hide_file_bar_in_ui", config->hide_file_bar_in_ui); @@ -1635,6 +1638,13 @@ load_config_and_apply(Application_Links *app, Arena *out_arena, Config_Data *con description.font.file_name = get_file_path_in_fonts_folder(scratch, config->default_font_name); modify_global_face_by_description(app, description); } + + if (config->bind_by_physical_key){ + system_set_key_mode(KeyMode_Physical); + } + else{ + system_set_key_mode(KeyMode_LanguageArranged); + } } function void diff --git a/custom/4coder_config.h b/custom/4coder_config.h index ab672a92..e82a153a 100644 --- a/custom/4coder_config.h +++ b/custom/4coder_config.h @@ -191,6 +191,7 @@ struct Config_Data{ u8 mode_space[64]; String_Const_u8 mode; + b8 bind_by_physical_key; b8 use_scroll_bars; b8 use_file_bars; b8 hide_file_bar_in_ui; diff --git a/custom/4coder_system_types.h b/custom/4coder_system_types.h index d92bf656..b858960a 100644 --- a/custom/4coder_system_types.h +++ b/custom/4coder_system_types.h @@ -7,6 +7,12 @@ #if !defined(FCODER_SYSTEM_TYPES_H) #define FCODER_SYSTEM_TYPES_H +typedef i32 Key_Mode; +enum{ + KeyMode_LanguageArranged, + KeyMode_Physical, +}; + struct Plat_Handle{ u32 d[4]; }; diff --git a/custom/generated/command_metadata.h b/custom/generated/command_metadata.h index cd1ca716..f070e0cd 100644 --- a/custom/generated/command_metadata.h +++ b/custom/generated/command_metadata.h @@ -364,7 +364,7 @@ static Command_Metadata fcoder_metacmd_table[245] = { { PROC_LINKS(list_all_substring_locations, 0), false, "list_all_substring_locations", 28, "Queries the user for a string and lists all case-sensitive substring matches found in all open buffers.", 103, "w:\\4ed\\code\\custom\\4coder_search.cpp", 36, 171 }, { PROC_LINKS(list_all_substring_locations_case_insensitive, 0), false, "list_all_substring_locations_case_insensitive", 45, "Queries the user for a string and lists all case-insensitive substring matches found in all open buffers.", 105, "w:\\4ed\\code\\custom\\4coder_search.cpp", 36, 183 }, { PROC_LINKS(load_project, 0), false, "load_project", 12, "Looks for a project.4coder file in the current directory and tries to load it. Looks in parent directories until a project file is found or there are no more parents.", 167, "w:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 864 }, -{ PROC_LINKS(load_theme_current_buffer, 0), false, "load_theme_current_buffer", 25, "Parse the current buffer as a theme file and add the theme to the theme list. If the buffer has a .4coder postfix in it's name, it is removed when the name is saved.", 165, "w:\\4ed\\code\\custom\\4coder_config.cpp", 36, 1657 }, +{ PROC_LINKS(load_theme_current_buffer, 0), false, "load_theme_current_buffer", 25, "Parse the current buffer as a theme file and add the theme to the theme list. If the buffer has a .4coder postfix in it's name, it is removed when the name is saved.", 165, "w:\\4ed\\code\\custom\\4coder_config.cpp", 36, 1667 }, { PROC_LINKS(load_themes_default_folder, 0), false, "load_themes_default_folder", 26, "Loads all the theme files in the default theme folder.", 54, "w:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 457 }, { PROC_LINKS(load_themes_hot_directory, 0), false, "load_themes_hot_directory", 25, "Loads all the theme files in the current hot directory.", 55, "w:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 469 }, { PROC_LINKS(make_directory_query, 0), false, "make_directory_query", 20, "Queries the user for a name and creates a new directory with the given name.", 76, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1453 }, diff --git a/custom/generated/system_api.cpp b/custom/generated/system_api.cpp index 49339afc..4e961682 100644 --- a/custom/generated/system_api.cpp +++ b/custom/generated/system_api.cpp @@ -53,6 +53,7 @@ vtable->show_mouse_cursor = system_show_mouse_cursor; vtable->set_fullscreen = system_set_fullscreen; vtable->is_fullscreen = system_is_fullscreen; vtable->get_keyboard_modifiers = system_get_keyboard_modifiers; +vtable->set_key_mode = system_set_key_mode; } #if defined(DYNAMIC_LINK_API) function void @@ -110,6 +111,7 @@ system_show_mouse_cursor = vtable->show_mouse_cursor; system_set_fullscreen = vtable->set_fullscreen; system_is_fullscreen = vtable->is_fullscreen; system_get_keyboard_modifiers = vtable->get_keyboard_modifiers; +system_set_key_mode = vtable->set_key_mode; } #undef DYNAMIC_LINK_API #endif diff --git a/custom/generated/system_api.h b/custom/generated/system_api.h index 69f21d5b..7f0f7a39 100644 --- a/custom/generated/system_api.h +++ b/custom/generated/system_api.h @@ -51,6 +51,7 @@ #define system_set_fullscreen_sig() b32 system_set_fullscreen(b32 full_screen) #define system_is_fullscreen_sig() b32 system_is_fullscreen(void) #define system_get_keyboard_modifiers_sig() Input_Modifier_Set system_get_keyboard_modifiers(Arena* arena) +#define system_set_key_mode_sig() void system_set_key_mode(Key_Mode mode) typedef String_Const_u8 system_get_path_type(Arena* arena, System_Path_Code path_code); typedef String_Const_u8 system_get_canonical_type(Arena* arena, String_Const_u8 name); typedef File_List system_get_file_list_type(Arena* arena, String_Const_u8 directory); @@ -104,6 +105,7 @@ typedef void system_show_mouse_cursor_type(i32 show); typedef b32 system_set_fullscreen_type(b32 full_screen); typedef b32 system_is_fullscreen_type(void); typedef Input_Modifier_Set system_get_keyboard_modifiers_type(Arena* arena); +typedef void system_set_key_mode_type(Key_Mode mode); struct API_VTable_system{ system_get_path_type *get_path; system_get_canonical_type *get_canonical; @@ -158,6 +160,7 @@ system_show_mouse_cursor_type *show_mouse_cursor; system_set_fullscreen_type *set_fullscreen; system_is_fullscreen_type *is_fullscreen; system_get_keyboard_modifiers_type *get_keyboard_modifiers; +system_set_key_mode_type *set_key_mode; }; #if defined(STATIC_LINK_API) internal String_Const_u8 system_get_path(Arena* arena, System_Path_Code path_code); @@ -213,6 +216,7 @@ internal void system_show_mouse_cursor(i32 show); internal b32 system_set_fullscreen(b32 full_screen); internal b32 system_is_fullscreen(void); internal Input_Modifier_Set system_get_keyboard_modifiers(Arena* arena); +internal void system_set_key_mode(Key_Mode mode); #undef STATIC_LINK_API #elif defined(DYNAMIC_LINK_API) global system_get_path_type *system_get_path = 0; @@ -268,5 +272,6 @@ global system_show_mouse_cursor_type *system_show_mouse_cursor = 0; global system_set_fullscreen_type *system_set_fullscreen = 0; global system_is_fullscreen_type *system_is_fullscreen = 0; global system_get_keyboard_modifiers_type *system_get_keyboard_modifiers = 0; +global system_set_key_mode_type *system_set_key_mode = 0; #undef DYNAMIC_LINK_API #endif diff --git a/custom/generated/system_api_constructor.cpp b/custom/generated/system_api_constructor.cpp index d9e1b3a2..c7fccb54 100644 --- a/custom/generated/system_api_constructor.cpp +++ b/custom/generated/system_api_constructor.cpp @@ -241,5 +241,9 @@ API_Call *call = api_call_with_location(arena, result, string_u8_litexpr("is_ful API_Call *call = api_call_with_location(arena, result, string_u8_litexpr("get_keyboard_modifiers"), string_u8_litexpr("Input_Modifier_Set"), string_u8_litexpr("")); api_param(arena, call, "Arena*", "arena"); } +{ +API_Call *call = api_call_with_location(arena, result, string_u8_litexpr("set_key_mode"), string_u8_litexpr("void"), string_u8_litexpr("")); +api_param(arena, call, "Key_Mode", "mode"); +} return(result); } diff --git a/custom/generated/system_api_master_list.h b/custom/generated/system_api_master_list.h index 8aa0dffa..8408ad94 100644 --- a/custom/generated/system_api_master_list.h +++ b/custom/generated/system_api_master_list.h @@ -51,3 +51,4 @@ api(system) function void show_mouse_cursor(i32 show); api(system) function b32 set_fullscreen(b32 full_screen); api(system) function b32 is_fullscreen(void); api(system) function Input_Modifier_Set get_keyboard_modifiers(Arena* arena); +api(system) function void set_key_mode(Key_Mode mode); diff --git a/platform_win32/win32_4ed.cpp b/platform_win32/win32_4ed.cpp index ac64be0e..b6981f12 100644 --- a/platform_win32/win32_4ed.cpp +++ b/platform_win32/win32_4ed.cpp @@ -151,6 +151,7 @@ struct Win32_Vars{ b8 lctrl_lalt_is_altgr; b8 got_useful_event; + Key_Mode key_mode; HKL kl_universal; b8 full_screen; @@ -349,6 +350,11 @@ system_get_keyboard_modifiers_sig(){ return(copy_modifier_set(arena, &win32vars.input_chunk.pers.modifiers)); } +internal +system_set_key_mode_sig(){ + win32vars.key_mode = mode; +} + // // Clipboard // @@ -1097,8 +1103,12 @@ win32_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){ b8 down = !release; b8 is_right = HasFlag(lParam, bit_25); - UINT scan_code = ((lParam >> 16) & bitmask_8); - UINT vk = MapVirtualKeyEx(scan_code, MAPVK_VSC_TO_VK_EX, win32vars.kl_universal); + u64 vk = wParam; + + if (win32vars.key_mode == KeyMode_Physical){ + UINT scan_code = ((lParam >> 16) & bitmask_8); + vk = MapVirtualKeyEx(scan_code, MAPVK_VSC_TO_VK_EX, win32vars.kl_universal); + } Input_Modifier_Set_Fixed *mods = &win32vars.input_chunk.pers.modifiers; diff --git a/ship_files/config.4coder b/ship_files/config.4coder index 7dff0efb..82934543 100644 --- a/ship_files/config.4coder +++ b/ship_files/config.4coder @@ -9,6 +9,7 @@ mapping = ""; // "4coder" - The default 4coder mode that has been around since the beginning of time (2015) // "notepad-like" - Single "thin" cursor and highlight ranges like in notepad, sublime, notepad++, etc mode = "4coder"; +bind_by_physical_key = false; // UI use_scroll_bars = false;