Partial setup for binding documentations

master
Allen Webster 2019-12-17 00:11:31 -08:00
parent b9dedc912d
commit c3e96803d2
10 changed files with 537 additions and 290 deletions

View File

@ -34,6 +34,7 @@
#include "generated/font_api.h"
#include "4coder_profile.h"
#include "4coder_command_map.h"
#include "4ed_render_target.h"
#include "4ed.h"

View File

@ -1,14 +1,35 @@
/*
* Mr. 4th Dimention - Allen Webster
*
* 19.08.2015
*
* Command management functions
*
*/
4coder_command_map.cpp - Command management functions
*/
// TOP
#if !defined(MAP_METADATA_ONLY)
#define MAP_METADATA_ONLY 0
#endif
#if MAP_METADATA_ONLY
#define BindingGetPtr(b) ((b).name)
#else
#define BindingGetPtr(b) ((b).custom)
#endif
Command_Binding::Command_Binding(){
block_zero_struct(this);
}
Command_Binding::Command_Binding(Custom_Command_Function *c){
this->custom = c;
}
Command_Binding::Command_Binding(char *n){
this->name = n;
}
Command_Binding::operator Custom_Command_Function*(){
return(this->custom);
}
Command_Binding::operator char*(){
return(this->name);
}
function u64
mapping__key(Input_Event_Kind kind, u32 sub_code){
return((((u64)kind) << 32) | sub_code);
@ -23,11 +44,13 @@ mapping__alloc_map(Mapping *mapping){
else{
result = push_array(mapping->node_arena, Command_Map, 1);
}
zdll_push_back(mapping->first_map, mapping->last_map, result);
return(result);
}
function void
mapping__free_map(Mapping *mapping, Command_Map *map){
zdll_remove(mapping->first_map, mapping->last_map, map);
sll_stack_push(mapping->free_maps, map);
}
@ -295,10 +318,9 @@ map_null_parent(Command_Map *map){
}
function void
map__command_add_trigger(Command_Map *map, Custom_Command_Function *custom,
Command_Trigger *trigger){
map__command_add_trigger(Command_Map *map, Command_Binding binding, Command_Trigger *trigger){
if (map != 0){
u64 key = (u64)(PtrAsInt(custom));
u64 key = (u64)(PtrAsInt(BindingGetPtr(binding)));
Table_Lookup lookup = table_lookup(&map->cmd_to_binding_trigger, key);
Command_Trigger_List *list = 0;
if (!lookup.found_match){
@ -357,10 +379,10 @@ map_trigger_as_event(Command_Trigger *trigger){
}
function Command_Trigger_List
map_get_triggers_non_recursive(Mapping *mapping, Command_Map *map, Custom_Command_Function *custom){
map_get_triggers_non_recursive(Mapping *mapping, Command_Map *map, Command_Binding binding){
Command_Trigger_List *result_ptr = 0;
if (map != 0){
u64 key = (u64)(PtrAsInt(custom));
u64 key = (u64)(PtrAsInt(BindingGetPtr(binding)));
Table_Lookup lookup = table_lookup(&map->cmd_to_binding_trigger, key);
if (lookup.found_match){
u64 val = 0;
@ -373,14 +395,14 @@ map_get_triggers_non_recursive(Mapping *mapping, Command_Map *map, Custom_Comman
node = next){
next = node->next;
Input_Event event = map_trigger_as_event(node);
Command_Binding binding = {};
Command_Binding this_binding = {};
if (mapping != 0){
binding = map_get_binding_recursive(mapping, map, &event);
this_binding = map_get_binding_recursive(mapping, map, &event);
}
else{
binding = map_get_binding_non_recursive(map, &event);
this_binding = map_get_binding_non_recursive(map, &event);
}
if (binding.custom == custom){
if (BindingGetPtr(this_binding) == BindingGetPtr(binding)){
sll_queue_push(list.first, list.last, node);
}
}
@ -395,18 +417,18 @@ map_get_triggers_non_recursive(Mapping *mapping, Command_Map *map, Custom_Comman
}
function Command_Trigger_List
map_get_triggers_non_recursive(Command_Map *map, Custom_Command_Function *custom){
return(map_get_triggers_non_recursive(0, map, custom));
map_get_triggers_non_recursive(Command_Map *map, Command_Binding binding){
return(map_get_triggers_non_recursive(0, map, binding));
}
function Command_Trigger_List
map_get_triggers_recursive(Arena *arena, Mapping *mapping, Command_Map *map, Custom_Command_Function *custom){
map_get_triggers_recursive(Arena *arena, Mapping *mapping, Command_Map *map, Command_Binding binding){
Command_Trigger_List result = {};
if (mapping != 0){
for (i32 safety_counter = 0;
map != 0 && safety_counter < 40;
safety_counter += 1){
Command_Trigger_List list = map_get_triggers_non_recursive(mapping, map, custom);
Command_Trigger_List list = map_get_triggers_non_recursive(mapping, map, binding);
for (Command_Trigger *node = list.first, *next = 0;
node != 0;
@ -455,7 +477,7 @@ map_get_binding_list_on_core(Command_Map *map, Core_Code code){
////////////////////////////////
function void
map_set_binding(Mapping *mapping, Command_Map *map, Custom_Command_Function *custom, u32 code1, u32 code2, Input_Modifier_Set *mods){
map_set_binding(Mapping *mapping, Command_Map *map, Command_Binding binding, u32 code1, u32 code2, Input_Modifier_Set *mods){
if (map != 0){
u64 key = mapping__key(code1, code2);
Command_Binding_List *list = map__get_or_make_list(mapping, map, key);
@ -470,38 +492,38 @@ map_set_binding(Mapping *mapping, Command_Map *map, Custom_Command_Function *cus
}
list->count += 1;
mod_binding->mods = copy_modifier_set(&map->node_arena, mods);
mod_binding->binding.custom = custom;
mod_binding->binding = binding;
Command_Trigger trigger = {};
trigger.kind = code1;
trigger.sub_code = code2;
trigger.mods = mod_binding->mods;
map__command_add_trigger(map, custom, &trigger);
map__command_add_trigger(map, binding, &trigger);
}
}
function void
map_set_binding_key(Mapping *mapping, Command_Map *map, Custom_Command_Function *custom, Key_Code code, Input_Modifier_Set *modifiers){
map_set_binding(mapping, map, custom, InputEventKind_KeyStroke, code, modifiers);
map_set_binding_key(Mapping *mapping, Command_Map *map, Command_Binding binding, Key_Code code, Input_Modifier_Set *modifiers){
map_set_binding(mapping, map, binding, InputEventKind_KeyStroke, code, modifiers);
}
function void
map_set_binding_mouse(Mapping *mapping, Command_Map *map, Custom_Command_Function *custom, Mouse_Code code, Input_Modifier_Set *modifiers){
map_set_binding(mapping, map, custom, InputEventKind_MouseButton, code, modifiers);
map_set_binding_mouse(Mapping *mapping, Command_Map *map, Command_Binding binding, Mouse_Code code, Input_Modifier_Set *modifiers){
map_set_binding(mapping, map, binding, InputEventKind_MouseButton, code, modifiers);
}
function void
map_set_binding_core(Mapping *mapping, Command_Map *map, Custom_Command_Function *custom, Core_Code code, Input_Modifier_Set *modifiers){
map_set_binding(mapping, map, custom, InputEventKind_Core, code, modifiers);
map_set_binding_core(Mapping *mapping, Command_Map *map, Command_Binding binding, Core_Code code, Input_Modifier_Set *modifiers){
map_set_binding(mapping, map, binding, InputEventKind_Core, code, modifiers);
}
function void
map_set_binding_text_input(Command_Map *map, Custom_Command_Function *custom){
map_set_binding_text_input(Command_Map *map, Command_Binding binding){
if (map != 0){
map->text_input_command.custom = custom;
map->text_input_command = binding;
Command_Trigger trigger = {};
trigger.kind = InputEventKind_TextInsert;
map__command_add_trigger(map, custom, &trigger);
map__command_add_trigger(map, binding, &trigger);
}
}
@ -526,15 +548,15 @@ map_get_binding_recursive(Mapping *mapping, Command_Map_ID map_id, Input_Event *
}
function Command_Trigger_List
map_get_triggers_non_recursive(Mapping *mapping, Command_Map_ID map_id, Custom_Command_Function *custom){
map_get_triggers_non_recursive(Mapping *mapping, Command_Map_ID map_id, Command_Binding binding){
Command_Map *map = mapping_get_map(mapping, map_id);
return(map_get_triggers_non_recursive(map, custom));
return(map_get_triggers_non_recursive(map, binding));
}
function Command_Trigger_List
map_get_triggers_recursive(Arena *arena, Mapping *mapping, Command_Map_ID map_id, Custom_Command_Function *custom){
map_get_triggers_recursive(Arena *arena, Mapping *mapping, Command_Map_ID map_id, Command_Binding binding){
Command_Map *map = mapping_get_map(mapping, map_id);
return(map_get_triggers_recursive(arena, mapping, map, custom));
return(map_get_triggers_recursive(arena, mapping, map, binding));
}
function void
@ -557,37 +579,37 @@ map_null_parent(Mapping *mapping, Command_Map_ID map_id){
}
function void
map_set_binding(Mapping *mapping, Command_Map_ID map_id, Custom_Command_Function *custom,
map_set_binding(Mapping *mapping, Command_Map_ID map_id, Command_Binding binding,
u32 code1, u32 code2, Input_Modifier_Set *modifiers){
Command_Map *map = mapping_get_map(mapping, map_id);
map_set_binding(mapping, map, custom, code1, code2, modifiers);
map_set_binding(mapping, map, binding, code1, code2, modifiers);
}
function void
map_set_binding_key(Mapping *mapping, Command_Map_ID map_id, Custom_Command_Function *custom,
map_set_binding_key(Mapping *mapping, Command_Map_ID map_id, Command_Binding binding,
Key_Code code, Input_Modifier_Set *modifiers){
Command_Map *map = mapping_get_map(mapping, map_id);
map_set_binding_key(mapping, map, custom, code, modifiers);
map_set_binding_key(mapping, map, binding, code, modifiers);
}
function void
map_set_binding_mouse(Mapping *mapping, Command_Map_ID map_id, Custom_Command_Function *custom,
map_set_binding_mouse(Mapping *mapping, Command_Map_ID map_id, Command_Binding binding,
Mouse_Code code, Input_Modifier_Set *modifiers){
Command_Map *map = mapping_get_map(mapping, map_id);
map_set_binding_mouse(mapping, map, custom, code, modifiers);
map_set_binding_mouse(mapping, map, binding, code, modifiers);
}
function void
map_set_binding_core(Mapping *mapping, Command_Map_ID map_id, Custom_Command_Function *custom,
map_set_binding_core(Mapping *mapping, Command_Map_ID map_id, Command_Binding binding,
Core_Code code, Input_Modifier_Set *modifiers){
Command_Map *map = mapping_get_map(mapping, map_id);
map_set_binding_core(mapping, map, custom, code, modifiers);
map_set_binding_core(mapping, map, binding, code, modifiers);
}
function void
map_set_binding_text_input(Mapping *mapping, Command_Map_ID map_id, Custom_Command_Function *custom){
map_set_binding_text_input(Mapping *mapping, Command_Map_ID map_id, Command_Binding binding){
Command_Map *map = mapping_get_map(mapping, map_id);
map_set_binding_text_input(map, custom);
map_set_binding_text_input(map, binding);
}
////////////////////////////////
@ -667,7 +689,7 @@ command_trigger_stringize(Arena *arena, List_String_Const_u8 *list, Command_Trig
function void
map_set_binding_lv(Mapping *mapping, Command_Map *map,
Custom_Command_Function *custom, u32 code1, u32 code2, va_list args){
Command_Binding binding, u32 code1, u32 code2, va_list args){
Input_Modifier_Set mods = {};
Key_Code mods_array[Input_MaxModifierCount];
mods.mods = mods_array;
@ -679,53 +701,77 @@ map_set_binding_lv(Mapping *mapping, Command_Map *map,
mods.mods[mods.count] = v;
mods.count += 1;
}
return(map_set_binding(mapping, map, custom, code1, code2, &mods));
return(map_set_binding(mapping, map, binding, code1, code2, &mods));
}
#if MAP_METADATA_ONLY
function void
map_set_binding_l(Mapping *mapping, Command_Map *map,
Custom_Command_Function *custom, u32 code1, u32 code2, ...){
map_set_binding_l(Mapping *mapping, Command_Map *map, char *name, u32 code1, u32 code2, ...){
va_list args;
va_start(args, code2);
map_set_binding_lv(mapping, map, custom, code1, code2, args);
Command_Binding binding = {};
binding.name = name;
map_set_binding_lv(mapping, map, binding, code1, code2, args);
va_end(args);
}
#else
function void
map_set_binding_l(Mapping *mapping, Command_Map *map, Custom_Command_Function *custom, u32 code1, u32 code2, ...){
va_list args;
va_start(args, code2);
Command_Binding binding = {};
binding.custom = custom;
map_set_binding_lv(mapping, map, binding, code1, code2, args);
va_end(args);
}
#endif
#if MAP_METADATA_ONLY
# define BindFWrap_(F) stringify(F)
#else
# define BindFWrap_(F) F
#endif
#define MappingScope() Mapping *m = 0; Command_Map *map = 0
#define SelectMapping(N) m = (N)
#define SelectMap(ID) map = mapping_get_or_make_map(m, (ID))
#define ParentMap(ID) map_set_parent(m, map, (ID))
#define BindTextInput(F) map_set_binding_text_input(map, (F))
// TODO(allen): detect compiler and apply va args extensions correctly
#define BindTextInput(F) map_set_binding_text_input(map, BindFWrap_(F))
#if COMPILER_CL
#define Bind(F, K, ...) \
map_set_binding_l(m, map, (F), InputEventKind_KeyStroke, (K), __VA_ARGS__, 0)
map_set_binding_l(m, map, BindFWrap_(F), InputEventKind_KeyStroke, (K), __VA_ARGS__, 0)
#define BindRelease(F, K, ...) \
map_set_binding_l(m, map, (F), InputEventKind_KeyRelease, (K), __VA_ARGS__, 0)
map_set_binding_l(m, map, BindFWrap_(F), InputEventKind_KeyRelease, (K), __VA_ARGS__, 0)
#define BindMouse(F, K, ...) \
map_set_binding_l(m, map, (F), InputEventKind_MouseButton, (K), __VA_ARGS__, 0)
map_set_binding_l(m, map, BindFWrap_(F), InputEventKind_MouseButton, (K), __VA_ARGS__, 0)
#define BindMouseRelease(F, K, ...) \
map_set_binding_l(m, map, (F), InputEventKind_MouseButtonRelease, (K), __VA_ARGS__, 0)
map_set_binding_l(m, map, BindFWrap_(F), InputEventKind_MouseButtonRelease, (K), __VA_ARGS__, 0)
#define BindMouseWheel(F, ...) \
map_set_binding_l(m, map, (F), InputEventKind_MouseWheel, 0, __VA_ARGS__, 0)
map_set_binding_l(m, map, BindFWrap_(F), InputEventKind_MouseWheel, 0, __VA_ARGS__, 0)
#define BindMouseMove(F, ...) \
map_set_binding_l(m, map, (F), InputEventKind_MouseMove, 0, __VA_ARGS__, 0)
map_set_binding_l(m, map, BindFWrap_(F), InputEventKind_MouseMove, 0, __VA_ARGS__, 0)
#define BindCore(F, K, ...) \
map_set_binding_l(m, map, (F), InputEventKind_Core, (K), __VA_ARGS__, 0)
map_set_binding_l(m, map, BindFWrap_(F), InputEventKind_Core, (K), __VA_ARGS__, 0)
#elif COMPILER_GCC
#define Bind(F, K, ...) \
map_set_binding_l(m, map, (F), InputEventKind_KeyStroke, (K), ##__VA_ARGS__, 0)
map_set_binding_l(m, map, BindFWrap_(F), InputEventKind_KeyStroke, (K), ##__VA_ARGS__, 0)
#define BindRelease(F, K, ...) \
map_set_binding_l(m, map, (F), InputEventKind_KeyRelease, (K), ##__VA_ARGS__, 0)
map_set_binding_l(m, map, BindFWrap_(F), InputEventKind_KeyRelease, (K), ##__VA_ARGS__, 0)
#define BindMouse(F, K, ...) \
map_set_binding_l(m, map, (F), InputEventKind_MouseButton, (K), ##__VA_ARGS__, 0)
map_set_binding_l(m, map, BindFWrap_(F), InputEventKind_MouseButton, (K), ##__VA_ARGS__, 0)
#define BindMouseRelease(F, K, ...) \
map_set_binding_l(m, map, (F), InputEventKind_MouseButtonRelease, (K), ##__VA_ARGS__, 0)
map_set_binding_l(m, map, BindFWrap_(F), InputEventKind_MouseButtonRelease, (K), ##__VA_ARGS__, 0)
#define BindMouseWheel(F, ...) \
map_set_binding_l(m, map, (F), InputEventKind_MouseWheel, 0, ##__VA_ARGS__, 0)
map_set_binding_l(m, map, BindFWrap_(F), InputEventKind_MouseWheel, 0, ##__VA_ARGS__, 0)
#define BindMouseMove(F, ...) \
map_set_binding_l(m, map, (F), InputEventKind_MouseMove, 0, ##__VA_ARGS__, 0)
map_set_binding_l(m, map, BindFWrap_(F), InputEventKind_MouseMove, 0, ##__VA_ARGS__, 0)
#define BindCore(F, K, ...) \
map_set_binding_l(m, map, (F), InputEventKind_Core, (K), ##__VA_ARGS__, 0)
map_set_binding_l(m, map, BindFWrap_(F), InputEventKind_Core, (K), ##__VA_ARGS__, 0)
#else
#error "Unsupported compiler"
#endif

View File

@ -0,0 +1,84 @@
/*
4coder_command_map.h - Command management types
*/
// TOP
#if !defined(FCODER_CODEPOINT_MAP_H)
#define FCODER_CODEPOINT_MAP_H
typedef i64 Command_Map_ID;
struct Command_Trigger{
Command_Trigger *next;
Input_Event_Kind kind;
u32 sub_code;
Input_Modifier_Set mods;
};
struct Command_Trigger_List{
Command_Trigger *first;
Command_Trigger *last;
};
struct Command_Binding{
union{
Custom_Command_Function *custom;
char *name;
};
Command_Binding();
Command_Binding(Custom_Command_Function *c);
Command_Binding(char *n);
operator Custom_Command_Function*();
operator char*();
};
struct Command_Modified_Binding{
Command_Modified_Binding *next;
SNode order_node;
Input_Modifier_Set mods;
Command_Binding binding;
};
struct Command_Binding_List{
Command_Binding_List *next;
SNode *first;
SNode *last;
i32 count;
};
struct Command_Map{
Command_Map *next;
Command_Map *prev;
Command_Map_ID id;
Command_Map_ID parent;
Command_Binding text_input_command;
Arena node_arena;
Table_u64_u64 event_code_to_binding_list;
Table_u64_u64 cmd_to_binding_trigger;
Command_Modified_Binding *binding_first;
Command_Modified_Binding *binding_last;
Command_Binding_List *list_first;
Command_Binding_List *list_last;
struct Binding_Unit *real_beginning;
};
struct Mapping{
Arena *node_arena;
Heap heap;
Base_Allocator heap_wrapper;
Table_u64_u64 id_to_map;
Command_Map_ID id_counter;
Command_Map *first_map;
Command_Map *last_map;
Command_Map *free_maps;
Command_Modified_Binding *free_bindings;
Command_Binding_List *free_lists;
};
#endif
// BOTTOM

View File

@ -8,157 +8,7 @@
#define FCODER_DEFAULT_BINDINGS_CPP
#include "4coder_default_include.cpp"
function void
setup_default_mapping(Mapping *mapping){
MappingScope();
SelectMapping(mapping);
SelectMap(mapid_global);
BindCore(default_startup, CoreCode_Startup);
BindCore(default_try_exit, CoreCode_TryExit);
Bind(keyboard_macro_start_recording , KeyCode_U, KeyCode_Control);
Bind(keyboard_macro_finish_recording, KeyCode_U, KeyCode_Control, KeyCode_Shift);
Bind(keyboard_macro_replay, KeyCode_U, KeyCode_Alt);
Bind(change_active_panel, KeyCode_Comma, KeyCode_Control);
Bind(change_active_panel_backwards, KeyCode_Comma, KeyCode_Control, KeyCode_Shift);
Bind(interactive_new, KeyCode_N, KeyCode_Control);
Bind(interactive_open_or_new, KeyCode_O, KeyCode_Control);
Bind(open_in_other, KeyCode_O, KeyCode_Alt);
Bind(interactive_kill_buffer, KeyCode_K, KeyCode_Control);
Bind(interactive_switch_buffer, KeyCode_I, KeyCode_Control);
Bind(project_go_to_root_directory, KeyCode_H, KeyCode_Control);
Bind(save_all_dirty_buffers, KeyCode_S, KeyCode_Control, KeyCode_Shift);
Bind(change_to_build_panel, KeyCode_Period, KeyCode_Alt);
Bind(close_build_panel, KeyCode_Comma, KeyCode_Alt);
Bind(goto_next_jump, KeyCode_N, KeyCode_Alt);
Bind(goto_prev_jump, KeyCode_N, KeyCode_Alt, KeyCode_Shift);
Bind(build_in_build_panel, KeyCode_M, KeyCode_Alt);
Bind(goto_first_jump, KeyCode_M, KeyCode_Alt, KeyCode_Shift);
Bind(toggle_filebar, KeyCode_B, KeyCode_Alt);
Bind(execute_any_cli, KeyCode_Z, KeyCode_Alt);
Bind(execute_previous_cli, KeyCode_Z, KeyCode_Alt, KeyCode_Shift);
Bind(command_lister, KeyCode_X, KeyCode_Alt);
Bind(project_command_lister, KeyCode_X, KeyCode_Alt, KeyCode_Shift);
Bind(list_all_functions_current_buffer, KeyCode_I, KeyCode_Control, KeyCode_Shift);
Bind(project_fkey_command, KeyCode_F1);
Bind(project_fkey_command, KeyCode_F2);
Bind(project_fkey_command, KeyCode_F3);
Bind(project_fkey_command, KeyCode_F4);
Bind(project_fkey_command, KeyCode_F5);
Bind(project_fkey_command, KeyCode_F6);
Bind(project_fkey_command, KeyCode_F7);
Bind(project_fkey_command, KeyCode_F8);
Bind(project_fkey_command, KeyCode_F9);
Bind(project_fkey_command, KeyCode_F10);
Bind(project_fkey_command, KeyCode_F11);
Bind(project_fkey_command, KeyCode_F12);
Bind(project_fkey_command, KeyCode_F13);
Bind(project_fkey_command, KeyCode_F14);
Bind(project_fkey_command, KeyCode_F15);
Bind(project_fkey_command, KeyCode_F16);
Bind(exit_4coder, KeyCode_F4, KeyCode_Alt);
BindMouseWheel(mouse_wheel_scroll);
BindMouseWheel(mouse_wheel_change_face_size, KeyCode_Control);
SelectMap(mapid_file);
ParentMap(mapid_global);
BindTextInput(write_text_input);
BindMouse(click_set_cursor_and_mark, MouseCode_Left);
BindMouseRelease(click_set_cursor, MouseCode_Left);
BindCore(click_set_cursor_and_mark, CoreCode_ClickActivateView);
BindMouseMove(click_set_cursor_if_lbutton);
Bind(delete_char, KeyCode_Delete);
Bind(backspace_char, KeyCode_Backspace);
Bind(move_up, KeyCode_Up);
Bind(move_down, KeyCode_Down);
Bind(move_left, KeyCode_Left);
Bind(move_right, KeyCode_Right);
Bind(seek_end_of_line, KeyCode_End);
Bind(seek_beginning_of_line, KeyCode_Home);
Bind(page_up, KeyCode_PageUp);
Bind(page_down, KeyCode_PageDown);
Bind(goto_beginning_of_file, KeyCode_PageUp, KeyCode_Control);
Bind(goto_end_of_file, KeyCode_PageDown, KeyCode_Control);
Bind(move_up_to_blank_line_end, KeyCode_Up, KeyCode_Control);
Bind(move_down_to_blank_line_end, KeyCode_Down, KeyCode_Control);
Bind(move_left_whitespace_boundary, KeyCode_Left, KeyCode_Control);
Bind(move_right_whitespace_boundary, KeyCode_Right, KeyCode_Control);
Bind(move_line_up, KeyCode_Up, KeyCode_Alt);
Bind(move_line_down, KeyCode_Down, KeyCode_Alt);
Bind(backspace_alpha_numeric_boundary, KeyCode_Backspace, KeyCode_Control);
Bind(delete_alpha_numeric_boundary, KeyCode_Delete, KeyCode_Control);
Bind(snipe_backward_whitespace_or_token_boundary, KeyCode_Backspace, KeyCode_Alt);
Bind(snipe_forward_whitespace_or_token_boundary, KeyCode_Delete, KeyCode_Alt);
Bind(set_mark, KeyCode_Space, KeyCode_Control);
Bind(replace_in_range, KeyCode_A, KeyCode_Control);
Bind(copy, KeyCode_C, KeyCode_Control);
Bind(delete_range, KeyCode_D, KeyCode_Control);
Bind(delete_line, KeyCode_D, KeyCode_Control, KeyCode_Shift);
Bind(center_view, KeyCode_E, KeyCode_Control);
Bind(left_adjust_view, KeyCode_E, KeyCode_Control, KeyCode_Shift);
Bind(search, KeyCode_F, KeyCode_Control);
Bind(list_all_locations, KeyCode_F, KeyCode_Control, KeyCode_Shift);
Bind(list_all_substring_locations_case_insensitive, KeyCode_F, KeyCode_Alt);
Bind(goto_line, KeyCode_G, KeyCode_Control);
Bind(list_all_locations_of_selection, KeyCode_G, KeyCode_Control, KeyCode_Shift);
Bind(snippet_lister, KeyCode_J, KeyCode_Control);
Bind(kill_buffer, KeyCode_K, KeyCode_Control, KeyCode_Shift);
Bind(duplicate_line, KeyCode_L, KeyCode_Control);
Bind(cursor_mark_swap, KeyCode_M, KeyCode_Control);
Bind(reopen, KeyCode_O, KeyCode_Control, KeyCode_Shift);
Bind(query_replace, KeyCode_Q, KeyCode_Control);
Bind(query_replace_identifier, KeyCode_Q, KeyCode_Control, KeyCode_Shift);
Bind(query_replace_selection, KeyCode_Q, KeyCode_Alt);
Bind(reverse_search, KeyCode_R, KeyCode_Control);
Bind(save, KeyCode_S, KeyCode_Control);
Bind(save_all_dirty_buffers, KeyCode_S, KeyCode_Control, KeyCode_Shift);
Bind(search_identifier, KeyCode_T, KeyCode_Control);
Bind(list_all_locations_of_identifier, KeyCode_T, KeyCode_Control, KeyCode_Shift);
Bind(paste_and_indent, KeyCode_V, KeyCode_Control);
Bind(paste_next_and_indent, KeyCode_V, KeyCode_Control, KeyCode_Shift);
Bind(cut, KeyCode_X, KeyCode_Control);
Bind(redo, KeyCode_Y, KeyCode_Control);
Bind(undo, KeyCode_Z, KeyCode_Control);
Bind(view_buffer_other_panel, KeyCode_1, KeyCode_Control);
Bind(swap_panels, KeyCode_2, KeyCode_Control);
Bind(if_read_only_goto_position, KeyCode_Return);
Bind(if_read_only_goto_position_same_panel, KeyCode_Return, KeyCode_Shift);
Bind(view_jump_list_with_lister, KeyCode_Period, KeyCode_Control, KeyCode_Shift);
SelectMap(mapid_code);
ParentMap(mapid_file);
BindTextInput(write_text_and_auto_indent);
Bind(move_left_alpha_numeric_boundary, KeyCode_Left, KeyCode_Control);
Bind(move_right_alpha_numeric_boundary, KeyCode_Right, KeyCode_Control);
Bind(move_left_alpha_numeric_or_camel_boundary, KeyCode_Left, KeyCode_Alt);
Bind(move_right_alpha_numeric_or_camel_boundary, KeyCode_Right, KeyCode_Alt);
Bind(comment_line_toggle, KeyCode_Semicolon, KeyCode_Control);
Bind(word_complete, KeyCode_Tab);
Bind(auto_indent_range, KeyCode_Tab, KeyCode_Control);
Bind(auto_indent_line_at_cursor, KeyCode_Tab, KeyCode_Shift);
Bind(word_complete_drop_down, KeyCode_Tab, KeyCode_Shift, KeyCode_Control);
Bind(write_block, KeyCode_R, KeyCode_Alt);
Bind(write_todo, KeyCode_T, KeyCode_Alt);
Bind(write_note, KeyCode_Y, KeyCode_Alt);
Bind(list_all_locations_of_type_definition, KeyCode_D, KeyCode_Alt);
Bind(list_all_locations_of_type_definition_of_identifier, KeyCode_T, KeyCode_Alt, KeyCode_Shift);
Bind(open_long_braces, KeyCode_LeftBracket, KeyCode_Control);
Bind(open_long_braces_semicolon, KeyCode_LeftBracket, KeyCode_Control, KeyCode_Shift);
Bind(open_long_braces_break, KeyCode_RightBracket, KeyCode_Control, KeyCode_Shift);
Bind(select_surrounding_scope, KeyCode_LeftBracket, KeyCode_Alt);
Bind(select_surrounding_scope_maximal, KeyCode_LeftBracket, KeyCode_Alt, KeyCode_Shift);
Bind(select_prev_scope_absolute, KeyCode_RightBracket, KeyCode_Alt);
Bind(select_prev_top_most_scope, KeyCode_RightBracket, KeyCode_Alt, KeyCode_Shift);
Bind(select_next_scope_absolute, KeyCode_Quote, KeyCode_Alt);
Bind(select_next_scope_after_current, KeyCode_Quote, KeyCode_Alt, KeyCode_Shift);
Bind(place_in_scope, KeyCode_ForwardSlash, KeyCode_Alt);
Bind(delete_current_scope, KeyCode_Minus, KeyCode_Alt);
Bind(if0_off, KeyCode_I, KeyCode_Alt);
Bind(open_file_in_quotes, KeyCode_1, KeyCode_Alt);
Bind(open_matching_file_cpp, KeyCode_2, KeyCode_Alt);
Bind(write_zero_struct, KeyCode_0, KeyCode_Control);
}
#include "4coder_default_map.cpp"
void
custom_layer_init(Application_Links *app){
@ -176,7 +26,7 @@ custom_layer_init(Application_Links *app){
// NOTE(allen): default hooks and command maps
set_all_default_hooks(app);
mapping_init(tctx, &framework_mapping);
setup_default_mapping(&framework_mapping);
setup_default_mapping(&framework_mapping, mapid_global, mapid_file, mapid_code);
}
#endif //FCODER_DEFAULT_BINDINGS

View File

@ -31,6 +31,7 @@
#include "4coder_code_index.h"
#include "4coder_draw.h"
#include "4coder_insertion.h"
#include "4coder_command_map.h"
#include "4coder_lister_base.h"
#include "4coder_default_framework.h"
#include "4coder_config.h"

View File

@ -0,0 +1,159 @@
/*
4coder_default_map.cpp - Instantiate default bindings.
*/
// TOP
function void
setup_default_mapping(Mapping *mapping, i64 global_id, i64 file_id, i64 code_id){
MappingScope();
SelectMapping(mapping);
SelectMap(global_id);
BindCore(default_startup, CoreCode_Startup);
BindCore(default_try_exit, CoreCode_TryExit);
Bind(keyboard_macro_start_recording , KeyCode_U, KeyCode_Control);
Bind(keyboard_macro_finish_recording, KeyCode_U, KeyCode_Control, KeyCode_Shift);
Bind(keyboard_macro_replay, KeyCode_U, KeyCode_Alt);
Bind(change_active_panel, KeyCode_Comma, KeyCode_Control);
Bind(change_active_panel_backwards, KeyCode_Comma, KeyCode_Control, KeyCode_Shift);
Bind(interactive_new, KeyCode_N, KeyCode_Control);
Bind(interactive_open_or_new, KeyCode_O, KeyCode_Control);
Bind(open_in_other, KeyCode_O, KeyCode_Alt);
Bind(interactive_kill_buffer, KeyCode_K, KeyCode_Control);
Bind(interactive_switch_buffer, KeyCode_I, KeyCode_Control);
Bind(project_go_to_root_directory, KeyCode_H, KeyCode_Control);
Bind(save_all_dirty_buffers, KeyCode_S, KeyCode_Control, KeyCode_Shift);
Bind(change_to_build_panel, KeyCode_Period, KeyCode_Alt);
Bind(close_build_panel, KeyCode_Comma, KeyCode_Alt);
Bind(goto_next_jump, KeyCode_N, KeyCode_Alt);
Bind(goto_prev_jump, KeyCode_N, KeyCode_Alt, KeyCode_Shift);
Bind(build_in_build_panel, KeyCode_M, KeyCode_Alt);
Bind(goto_first_jump, KeyCode_M, KeyCode_Alt, KeyCode_Shift);
Bind(toggle_filebar, KeyCode_B, KeyCode_Alt);
Bind(execute_any_cli, KeyCode_Z, KeyCode_Alt);
Bind(execute_previous_cli, KeyCode_Z, KeyCode_Alt, KeyCode_Shift);
Bind(command_lister, KeyCode_X, KeyCode_Alt);
Bind(project_command_lister, KeyCode_X, KeyCode_Alt, KeyCode_Shift);
Bind(list_all_functions_current_buffer, KeyCode_I, KeyCode_Control, KeyCode_Shift);
Bind(project_fkey_command, KeyCode_F1);
Bind(project_fkey_command, KeyCode_F2);
Bind(project_fkey_command, KeyCode_F3);
Bind(project_fkey_command, KeyCode_F4);
Bind(project_fkey_command, KeyCode_F5);
Bind(project_fkey_command, KeyCode_F6);
Bind(project_fkey_command, KeyCode_F7);
Bind(project_fkey_command, KeyCode_F8);
Bind(project_fkey_command, KeyCode_F9);
Bind(project_fkey_command, KeyCode_F10);
Bind(project_fkey_command, KeyCode_F11);
Bind(project_fkey_command, KeyCode_F12);
Bind(project_fkey_command, KeyCode_F13);
Bind(project_fkey_command, KeyCode_F14);
Bind(project_fkey_command, KeyCode_F15);
Bind(project_fkey_command, KeyCode_F16);
Bind(exit_4coder, KeyCode_F4, KeyCode_Alt);
BindMouseWheel(mouse_wheel_scroll);
BindMouseWheel(mouse_wheel_change_face_size, KeyCode_Control);
SelectMap(file_id);
ParentMap(global_id);
BindTextInput(write_text_input);
BindMouse(click_set_cursor_and_mark, MouseCode_Left);
BindMouseRelease(click_set_cursor, MouseCode_Left);
BindCore(click_set_cursor_and_mark, CoreCode_ClickActivateView);
BindMouseMove(click_set_cursor_if_lbutton);
Bind(delete_char, KeyCode_Delete);
Bind(backspace_char, KeyCode_Backspace);
Bind(move_up, KeyCode_Up);
Bind(move_down, KeyCode_Down);
Bind(move_left, KeyCode_Left);
Bind(move_right, KeyCode_Right);
Bind(seek_end_of_line, KeyCode_End);
Bind(seek_beginning_of_line, KeyCode_Home);
Bind(page_up, KeyCode_PageUp);
Bind(page_down, KeyCode_PageDown);
Bind(goto_beginning_of_file, KeyCode_PageUp, KeyCode_Control);
Bind(goto_end_of_file, KeyCode_PageDown, KeyCode_Control);
Bind(move_up_to_blank_line_end, KeyCode_Up, KeyCode_Control);
Bind(move_down_to_blank_line_end, KeyCode_Down, KeyCode_Control);
Bind(move_left_whitespace_boundary, KeyCode_Left, KeyCode_Control);
Bind(move_right_whitespace_boundary, KeyCode_Right, KeyCode_Control);
Bind(move_line_up, KeyCode_Up, KeyCode_Alt);
Bind(move_line_down, KeyCode_Down, KeyCode_Alt);
Bind(backspace_alpha_numeric_boundary, KeyCode_Backspace, KeyCode_Control);
Bind(delete_alpha_numeric_boundary, KeyCode_Delete, KeyCode_Control);
Bind(snipe_backward_whitespace_or_token_boundary, KeyCode_Backspace, KeyCode_Alt);
Bind(snipe_forward_whitespace_or_token_boundary, KeyCode_Delete, KeyCode_Alt);
Bind(set_mark, KeyCode_Space, KeyCode_Control);
Bind(replace_in_range, KeyCode_A, KeyCode_Control);
Bind(copy, KeyCode_C, KeyCode_Control);
Bind(delete_range, KeyCode_D, KeyCode_Control);
Bind(delete_line, KeyCode_D, KeyCode_Control, KeyCode_Shift);
Bind(center_view, KeyCode_E, KeyCode_Control);
Bind(left_adjust_view, KeyCode_E, KeyCode_Control, KeyCode_Shift);
Bind(search, KeyCode_F, KeyCode_Control);
Bind(list_all_locations, KeyCode_F, KeyCode_Control, KeyCode_Shift);
Bind(list_all_substring_locations_case_insensitive, KeyCode_F, KeyCode_Alt);
Bind(goto_line, KeyCode_G, KeyCode_Control);
Bind(list_all_locations_of_selection, KeyCode_G, KeyCode_Control, KeyCode_Shift);
Bind(snippet_lister, KeyCode_J, KeyCode_Control);
Bind(kill_buffer, KeyCode_K, KeyCode_Control, KeyCode_Shift);
Bind(duplicate_line, KeyCode_L, KeyCode_Control);
Bind(cursor_mark_swap, KeyCode_M, KeyCode_Control);
Bind(reopen, KeyCode_O, KeyCode_Control, KeyCode_Shift);
Bind(query_replace, KeyCode_Q, KeyCode_Control);
Bind(query_replace_identifier, KeyCode_Q, KeyCode_Control, KeyCode_Shift);
Bind(query_replace_selection, KeyCode_Q, KeyCode_Alt);
Bind(reverse_search, KeyCode_R, KeyCode_Control);
Bind(save, KeyCode_S, KeyCode_Control);
Bind(save_all_dirty_buffers, KeyCode_S, KeyCode_Control, KeyCode_Shift);
Bind(search_identifier, KeyCode_T, KeyCode_Control);
Bind(list_all_locations_of_identifier, KeyCode_T, KeyCode_Control, KeyCode_Shift);
Bind(paste_and_indent, KeyCode_V, KeyCode_Control);
Bind(paste_next_and_indent, KeyCode_V, KeyCode_Control, KeyCode_Shift);
Bind(cut, KeyCode_X, KeyCode_Control);
Bind(redo, KeyCode_Y, KeyCode_Control);
Bind(undo, KeyCode_Z, KeyCode_Control);
Bind(view_buffer_other_panel, KeyCode_1, KeyCode_Control);
Bind(swap_panels, KeyCode_2, KeyCode_Control);
Bind(if_read_only_goto_position, KeyCode_Return);
Bind(if_read_only_goto_position_same_panel, KeyCode_Return, KeyCode_Shift);
Bind(view_jump_list_with_lister, KeyCode_Period, KeyCode_Control, KeyCode_Shift);
SelectMap(code_id);
ParentMap(file_id);
BindTextInput(write_text_and_auto_indent);
Bind(move_left_alpha_numeric_boundary, KeyCode_Left, KeyCode_Control);
Bind(move_right_alpha_numeric_boundary, KeyCode_Right, KeyCode_Control);
Bind(move_left_alpha_numeric_or_camel_boundary, KeyCode_Left, KeyCode_Alt);
Bind(move_right_alpha_numeric_or_camel_boundary, KeyCode_Right, KeyCode_Alt);
Bind(comment_line_toggle, KeyCode_Semicolon, KeyCode_Control);
Bind(word_complete, KeyCode_Tab);
Bind(auto_indent_range, KeyCode_Tab, KeyCode_Control);
Bind(auto_indent_line_at_cursor, KeyCode_Tab, KeyCode_Shift);
Bind(word_complete_drop_down, KeyCode_Tab, KeyCode_Shift, KeyCode_Control);
Bind(write_block, KeyCode_R, KeyCode_Alt);
Bind(write_todo, KeyCode_T, KeyCode_Alt);
Bind(write_note, KeyCode_Y, KeyCode_Alt);
Bind(list_all_locations_of_type_definition, KeyCode_D, KeyCode_Alt);
Bind(list_all_locations_of_type_definition_of_identifier, KeyCode_T, KeyCode_Alt, KeyCode_Shift);
Bind(open_long_braces, KeyCode_LeftBracket, KeyCode_Control);
Bind(open_long_braces_semicolon, KeyCode_LeftBracket, KeyCode_Control, KeyCode_Shift);
Bind(open_long_braces_break, KeyCode_RightBracket, KeyCode_Control, KeyCode_Shift);
Bind(select_surrounding_scope, KeyCode_LeftBracket, KeyCode_Alt);
Bind(select_surrounding_scope_maximal, KeyCode_LeftBracket, KeyCode_Alt, KeyCode_Shift);
Bind(select_prev_scope_absolute, KeyCode_RightBracket, KeyCode_Alt);
Bind(select_prev_top_most_scope, KeyCode_RightBracket, KeyCode_Alt, KeyCode_Shift);
Bind(select_next_scope_absolute, KeyCode_Quote, KeyCode_Alt);
Bind(select_next_scope_after_current, KeyCode_Quote, KeyCode_Alt, KeyCode_Shift);
Bind(place_in_scope, KeyCode_ForwardSlash, KeyCode_Alt);
Bind(delete_current_scope, KeyCode_Minus, KeyCode_Alt);
Bind(if0_off, KeyCode_I, KeyCode_Alt);
Bind(open_file_in_quotes, KeyCode_1, KeyCode_Alt);
Bind(open_matching_file_cpp, KeyCode_2, KeyCode_Alt);
Bind(write_zero_struct, KeyCode_0, KeyCode_Control);
}
// BOTTOM

View File

@ -23,5 +23,148 @@ doc_commands(Arena *arena){
return(cluster);
}
function Doc_Cluster*
doc_default_bindings(Arena *arena, Mapping *mapping, i64 global_id, i64 file_id, i64 code_id){
Doc_Cluster *cluster = new_doc_cluster(arena, "Bindings", "bindings");
Doc_Page *page = new_doc_page(arena, cluster, "Default", "default");
for (Command_Map *map = mapping->first_map;
map != 0;
map = map->next){
char *map_name = "";
if (map->id == global_id){
map_name = "Global";
}
else if (map->id == file_id){
map_name = "File";
}
else if (map->id == code_id){
map_name = "Code";
}
Doc_Block *block = new_doc_block(arena, page, map_name);
Doc_Paragraph *par = new_doc_par_table(arena, block);
(void)par;
struct Bind_Node{
Bind_Node *next;
Input_Event_Kind kind;
u32 sub_code;
Input_Modifier_Set mods;
Command_Binding binding;
u32 j;
};
Bind_Node *first = 0;
Bind_Node *last = 0;
i32 node_count = 0;
if (map->text_input_command.name != 0){
Bind_Node *node = push_array_zero(arena, Bind_Node, 1);
sll_queue_push(first, last, node);
node_count += 1;
node->binding = map->text_input_command;
node->j = max_u32;
}
u32 counts[] = {
KeyCode_COUNT,
KeyCode_COUNT,
MouseCode_COUNT,
MouseCode_COUNT,
1,
1,
CoreCode_COUNT,
};
u32 event_codes[] = {
InputEventKind_KeyStroke,
InputEventKind_KeyRelease,
InputEventKind_MouseButton,
InputEventKind_MouseButtonRelease,
InputEventKind_MouseWheel,
InputEventKind_MouseMove,
InputEventKind_Core,
};
char *mouse_wheel_name[] = {"MoveWheel"};
char *mouse_move_name[] = {"MoveMove"};
char **event_names[] = {
key_code_name,
key_code_name,
mouse_code_name,
mouse_code_name,
mouse_wheel_name,
mouse_move_name,
core_code_name,
};
b32 is_release[] = {
false,
true,
false,
true,
false,
false,
false,
};
for (u32 j = 0; j < ArrayCount(counts); j += 1){
for (u32 code = 0; code < counts[j]; code += 1){
u64 key = mapping__key(event_codes[j], code);
Table_Lookup lookup = table_lookup(&map->event_code_to_binding_list, key);
if (lookup.found_match){
u64 val = 0;
table_read(&map->event_code_to_binding_list, lookup, &val);
Command_Binding_List *list = (Command_Binding_List*)IntAsPtr(val);
for (SNode *snode = list->first;
snode != 0;
snode = snode->next){
Command_Modified_Binding *mod_binding = CastFromMember(Command_Modified_Binding, order_node, snode);
Bind_Node *node = push_array_zero(arena, Bind_Node, 1);
sll_queue_push(first, last, node);
node_count += 1;
node->kind = event_codes[j];
node->sub_code = code;
node->mods = mod_binding->mods;
node->binding = mod_binding->binding;
node->j = j;
}
}
}
}
Vec2_i32 table_dims = V2i32(2, node_count);
Doc_Content_List *vals = push_array_zero(arena, Doc_Content_List, table_dims.x*table_dims.y);
Bind_Node *bnode = first;
for (i32 y = 0; y < table_dims.y; y += 1, bnode = bnode->next){
Doc_Content_List *line = &vals[y*table_dims.x];
doc_text(arena, &line[0], "[");
if (bnode->j != max_u32){
doc_text(arena, &line[0], event_names[bnode->j][bnode->sub_code]);
if (is_release[bnode->j]){
doc_text(arena, &line[0], "Release");
}
Input_Modifier_Set *mods = &bnode->mods;
for (i32 k = 0; k < mods->count; k += 1){
doc_text(arena, &line[0], key_code_name[mods->mods[k]]);
}
}
else{
doc_text(arena, &line[0], "TextInput");
}
doc_text(arena, &line[0], "]");
Doc_Content *content = doc_text(arena, &line[1], bnode->binding.name);
content->page_link = SCu8(bnode->binding.name);
}
}
return(cluster);
}
// BOTTOM

View File

@ -131,6 +131,13 @@ new_doc_par_single_code(Arena *arena, Doc_Block *block, String_Const_u8 contents
doc_code_list_push(arena, &paragraph->code, contents, language);
}
function Doc_Paragraph*
new_doc_par_table(Arena *arena, Doc_Block *block){
Doc_Paragraph *result = new_doc_par(arena, block);
result->kind = DocParagraphKind_Table;
return(result);
}
////////////////////////////////
function void
@ -169,7 +176,7 @@ doc_logf(Arena *arena, Doc_Cluster *cluster, char *format, ...){
////////////////////////////////
function void
function Doc_Content*
doc_text(Arena *arena, Doc_Block *block, char *str){
Doc_Paragraph *par = block->last_par;
if (par != 0){
@ -183,7 +190,12 @@ doc_text(Arena *arena, Doc_Block *block, char *str){
par->kind = DocParagraphKind_Text;
}
doc_content_push(arena, &par->text, SCu8(str));
return(doc_content_push(arena, &par->text, SCu8(str)));
}
function Doc_Content*
doc_text(Arena *arena, Doc_Content_List *list, char *string){
return(doc_content_push(arena, list, SCu8(string)));
}
function void

View File

@ -734,81 +734,14 @@ struct Layout_Item_List{
api(custom)
typedef Layout_Item_List Layout_Function(Application_Links *app, Arena *arena, Buffer_ID buffer, Range_i64 range, Face_ID face, f32 width);
api(custom)
typedef i64 Command_Map_ID;
api(custom)
struct Command_Trigger{
Command_Trigger *next;
Input_Event_Kind kind;
u32 sub_code;
Input_Modifier_Set mods;
};
api(custom)
struct Command_Trigger_List{
Command_Trigger *first;
Command_Trigger *last;
};
api(custom)
struct Command_Binding{
Custom_Command_Function *custom;
};
api(custom)
struct Command_Modified_Binding{
Command_Modified_Binding *next;
SNode order_node;
Input_Modifier_Set mods;
Command_Binding binding;
};
api(custom)
struct Command_Binding_List{
Command_Binding_List *next;
SNode *first;
SNode *last;
i32 count;
};
api(custom)
struct Command_Map{
Command_Map *next;
Command_Map_ID id;
Command_Map_ID parent;
Command_Binding text_input_command;
Arena node_arena;
Table_u64_u64 event_code_to_binding_list;
Table_u64_u64 cmd_to_binding_trigger;
Command_Modified_Binding *binding_first;
Command_Modified_Binding *binding_last;
Command_Binding_List *list_first;
Command_Binding_List *list_last;
struct Binding_Unit *real_beginning;
};
api(custom)
struct Mapping{
Arena *node_arena;
Heap heap;
Base_Allocator heap_wrapper;
Table_u64_u64 id_to_map;
Command_Map_ID id_counter;
Command_Map *free_maps;
Command_Modified_Binding *free_bindings;
Command_Binding_List *free_lists;
};
api(custom)
struct View_Context{
Render_Caller_Function *render_caller;
Delta_Rule_Function *delta_rule;
umem delta_rule_memory_size;
b32 hides_buffer;
Mapping *mapping;
Command_Map_ID map_id;
struct Mapping *mapping;
i64 map_id;
};
api(custom)

View File

@ -10,20 +10,29 @@
// TOP
#include "4coder_base_types.h"
#include "4coder_events.h"
#include "4coder_table.h"
#include "../4ed_api_definition.h"
#include "4coder_doc_content_types.h"
#include "../docs/4ed_doc_helper.h"
#include "4coder_command_map.h"
#include "generated/command_metadata.h"
#include "4coder_base_types.cpp"
#include "4coder_stringf.cpp"
#include "4coder_hash_functions.cpp"
#include "4coder_table.cpp"
#include "4coder_events.cpp"
#include "4coder_malloc_allocator.cpp"
#include "../4ed_api_definition.cpp"
#include "4coder_doc_content_types.cpp"
#include "../docs/4ed_doc_helper.cpp"
#include "4coder_file.cpp"
#define MAP_METADATA_ONLY 1
#include "4coder_command_map.cpp"
#include "4coder_default_map.cpp"
#include "generated/custom_api_constructor.cpp"
#include "../docs/4ed_doc_custom_api.cpp"
#include "4coder_doc_commands.cpp"
@ -507,6 +516,10 @@ render_doc_cluster_to_html(Arena *scratch, Doc_Cluster *cluster, String_Const_u8
int main(){
Arena arena = make_arena_malloc();
Thread_Context tctx_ = {};
thread_ctx_init(&tctx_, ThreadKind_Main, get_allocator_malloc(), get_allocator_malloc());
Thread_Context *tctx = &tctx_;
String_Const_u8 self = string_u8_litexpr(__FILE__);
umem code_pos = string_find_first(self, string_u8_litexpr("code"));
String_Const_u8 root = string_prefix(self, code_pos + 5);
@ -520,10 +533,15 @@ int main(){
(void)root;
Mapping mapping = {};
mapping_init(tctx, &mapping);
setup_default_mapping(&mapping, 1, 2, 3);
API_Definition *api_def = custom_api_construct(&arena);
Doc_Cluster *cluster_array[] = {
doc_custom_api(&arena, api_def),
doc_commands(&arena),
doc_default_bindings(&arena, &mapping, 1, 2, 3),
};
for (i32 i = 0; i < ArrayCount(cluster_array); i += 1){