PLATFORM LAYER FEATURE: Win32 implementation. set_key_mode determines whether to return physical key codes or language translated key codes

This commit is contained in:
Allen Webster 2020-05-09 08:03:10 -07:00
parent aa773f7413
commit a410ce5f6c
11 changed files with 48 additions and 3 deletions

View File

@ -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);
}

View File

@ -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

View File

@ -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;

View File

@ -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];
};

View File

@ -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 },

View File

@ -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

View File

@ -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

View File

@ -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);
}

View File

@ -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);

View File

@ -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);
u64 vk = wParam;
if (win32vars.key_mode == KeyMode_Physical){
UINT scan_code = ((lParam >> 16) & bitmask_8);
UINT vk = MapVirtualKeyEx(scan_code, MAPVK_VSC_TO_VK_EX, win32vars.kl_universal);
vk = MapVirtualKeyEx(scan_code, MAPVK_VSC_TO_VK_EX, win32vars.kl_universal);
}
Input_Modifier_Set_Fixed *mods = &win32vars.input_chunk.pers.modifiers;

View File

@ -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;