Fallback to command map in lister

This commit is contained in:
Allen Webster 2019-10-14 15:57:47 -07:00
parent e307b67f4e
commit 6374d1bd19
32 changed files with 1031 additions and 908 deletions

73
4ed.cpp
View File

@ -462,8 +462,8 @@ App_Step_Sig(app_step){
if (clipboard.str != 0){
String_Const_u8 *dest = working_set_next_clipboard_string(&models->heap, &models->working_set, clipboard.size);
dest->size = eol_convert_in((char*)dest->str, (char*)clipboard.str, (i32)clipboard.size);
if (input->clipboard_changed && models->clipboard_change != 0){
models->clipboard_change(&models->app_links, *dest, ClipboardFlag_FromOS);
if (input->clipboard_changed){
co_send_core_event(models, CoreCode_NewClipboardContents, *dest);
}
}
@ -525,11 +525,7 @@ App_Step_Sig(app_step){
}
}
// NOTE(allen): input filter and simulated events
if (models->input_filter != 0){
models->input_filter(&input->mouse);
}
// NOTE(allen): simulated events
Input_List input_list = input->events;
Input_Modifier_Set modifiers = system_get_keyboard_modifiers(scratch);
if (input->mouse.press_l){
@ -623,13 +619,28 @@ App_Step_Sig(app_step){
// NOTE(allen): First frame initialization
if (input->first_step){
if (models->hook_start != 0){
char **files = models->settings.init_files;
i32 files_count = models->settings.init_files_count;
char **flags = models->settings.custom_flags;
i32 flags_count = models->settings.custom_flags_count;
models->hook_start(&models->app_links, files, files_count, flags, flags_count);
Temp_Memory_Block temp(scratch);
String_Const_u8_Array file_names = {};
file_names.count = models->settings.init_files_count;
file_names.vals = push_array(scratch, String_Const_u8, file_names.count);
for (i32 i = 0; i < file_names.count; i += 1){
file_names.vals[i] = SCu8(models->settings.init_files[i]);
}
String_Const_u8_Array flags = {};
flags.count = models->settings.custom_flags_count;
flags.vals = push_array(scratch, String_Const_u8, flags.count);
for (i32 i = 0; i < flags.count; i += 1){
flags.vals[i] = SCu8(models->settings.custom_flags[i]);
}
Input_Event event = {};
event.kind = InputEventKind_Core;
event.core.code = CoreCode_Startup;
event.core.flag_strings = flags;
event.core.file_names = file_names;
co_send_event(models, &event);
}
// NOTE(allen): consume event stream
@ -795,20 +806,17 @@ App_Step_Sig(app_step){
// NOTE(allen): hook for files reloaded
{
File_Externally_Modified_Function *hook_file_externally_modified = models->hook_file_externally_modified;
if (hook_file_externally_modified != 0){
Working_Set *working_set = &models->working_set;
Assert(working_set->has_external_mod_sentinel.next != 0);
if (working_set->has_external_mod_sentinel.next != &working_set->has_external_mod_sentinel){
for (Node *node = working_set->has_external_mod_sentinel.next, *next = 0;
node != &working_set->has_external_mod_sentinel;
node = next){
next = node->next;
Editing_File *file = CastFromMember(Editing_File, external_mod_node, node);
dll_remove(node);
block_zero_struct(node);
hook_file_externally_modified(&models->app_links, file->id);
}
Working_Set *working_set = &models->working_set;
Assert(working_set->has_external_mod_sentinel.next != 0);
if (working_set->has_external_mod_sentinel.next != &working_set->has_external_mod_sentinel){
for (Node *node = working_set->has_external_mod_sentinel.next, *next = 0;
node != &working_set->has_external_mod_sentinel;
node = next){
next = node->next;
Editing_File *file = CastFromMember(Editing_File, external_mod_node, node);
dll_remove(node);
block_zero_struct(node);
co_send_core_event(models, CoreCode_FileExternallyModified, file->id);
}
}
}
@ -818,12 +826,8 @@ App_Step_Sig(app_step){
models->keep_playing = false;
}
if (!models->keep_playing){
Hook_Function *exit_func = models->exit;
if (exit_func != 0){
if (exit_func(&models->app_links) == 0){
models->animate_next_frame = true;
models->keep_playing = true;
}
if (co_send_core_event(models, CoreCode_TryExit)){
models->keep_playing = true;
}
}
@ -836,6 +840,7 @@ App_Step_Sig(app_step){
{
Color_Table color_table = models->fallback_color_table;
#if 0
if (models->modify_color_table != 0){
color_table = models->modify_color_table(&models->app_links, frame);
if (color_table.count < models->fallback_color_table.count){
@ -843,6 +848,7 @@ App_Step_Sig(app_step){
color_table = models->fallback_color_table;
}
}
#endif
models->color_table = color_table;
}
@ -850,7 +856,6 @@ App_Step_Sig(app_step){
models->in_render_mode = true;
Live_Views *live_views = &models->live_set;
Layout *layout = &models->layout;
for (Node *node = layout->open_panels.next;
node != &layout->open_panels;
node = node->next){

View File

@ -810,8 +810,8 @@ buffer_kill(Application_Links *app, Buffer_ID buffer_id, Buffer_Kill_Flag flags)
if (!file->settings.never_kill){
b32 needs_to_save = file_needs_save(file);
if (!needs_to_save || (flags & BufferKill_AlwaysKill) != 0){
if (models->hook_end_file != 0){
models->hook_end_file(&models->app_links, file->id);
if (models->end_buffer != 0){
models->end_buffer(&models->app_links, file->id);
}
buffer_unbind_name_low_level(working_set, file);
@ -2003,58 +2003,61 @@ managed_object_load_data(Application_Links *app, Managed_Object object, u32 firs
}
api(custom) function User_Input
get_user_input(Application_Links *app, Event_Property get_properties, Event_Property abort_properties)
get_next_input(Application_Links *app, Event_Property get_properties, Event_Property abort_properties)
{
Models *models = (Models*)app->cmd_context;
User_Input result = {};
if (app->type_coroutine == Co_View){
Coroutine *coroutine = (Coroutine*)app->current_coroutine;
Assert(coroutine != 0);
Co_Out *out = (Co_Out*)coroutine->out;
out->request = CoRequest_None;
out->get_flags = get_properties;
out->abort_flags = abort_properties;
coroutine_yield(coroutine);
Co_In *in = (Co_In*)coroutine->in;
result = in->user_input;
if (coroutine != 0){
Co_Out *out = (Co_Out*)coroutine->out;
out->request = CoRequest_None;
out->get_flags = get_properties;
out->abort_flags = abort_properties;
coroutine_yield(coroutine);
Co_In *in = (Co_In*)coroutine->in;
result = in->user_input;
}
else{
#define M "ERROR: get_next_input called in a hook that may not make calls to blocking APIs"
print_message(app, string_u8_litexpr(M));
#undef M
}
}
return(result);
}
api(custom) function i64
get_current_input_sequence_number(Application_Links *app)
{
Models *models = (Models*)app->cmd_context;
return(models->current_input_sequence_number);
}
api(custom) function User_Input
get_command_input(Application_Links *app)
get_current_input(Application_Links *app)
{
Models *models = (Models*)app->cmd_context;
User_Input result = {};
result.event = models->event;
return(result);
return(models->current_input);
}
api(custom) function void
set_command_input(Application_Links *app, Input_Event *event)
set_current_input(Application_Links *app, User_Input *input)
{
Models *models = (Models*)app->cmd_context;
models->event = *event;
block_copy_struct(&models->current_input, input);
}
api(custom) function void
leave_command_input_unhandled(Application_Links *app){
leave_current_input_unhandled(Application_Links *app){
Models *models = (Models*)app->cmd_context;
models->event_unhandled = true;
models->current_input_unhandled = true;
}
api(custom) function void
set_custom_hook(Application_Links *app, Hook_ID hook_id, Void_Func *func_ptr){
Models *models = (Models*)app->cmd_context;
switch (hook_id){
case HookID_FileOutOfSync:
{
models->file_out_of_sync = (Hook_Function*)func_ptr;
}break;
case HookID_Exit:
{
models->exit = (Hook_Function*)func_ptr;
}break;
case HookID_BufferViewerUpdate:
{
models->buffer_viewer_update = (Hook_Function*)func_ptr;
@ -2063,30 +2066,6 @@ set_custom_hook(Application_Links *app, Hook_ID hook_id, Void_Func *func_ptr){
{
models->scroll_rule = (Delta_Rule_Function*)func_ptr;
}break;
case HookID_NewFile:
{
models->hook_new_file = (Buffer_Hook_Function*)func_ptr;
}break;
case HookID_OpenFile:
{
models->hook_open_file = (Buffer_Hook_Function*)func_ptr;
}break;
case HookID_SaveFile:
{
models->hook_save_file = (Buffer_Hook_Function*)func_ptr;
}break;
case HookID_EndFile:
{
models->hook_end_file = (Buffer_Hook_Function*)func_ptr;
}break;
case HookID_FileEditRange:
{
models->hook_file_edit_range = (File_Edit_Range_Function*)func_ptr;
}break;
case HookID_FileExternallyModified:
{
models->hook_file_externally_modified = (File_Externally_Modified_Function*)func_ptr;
}break;
case HookID_ViewEventHandler:
{
models->view_event_handler = (Custom_Command_Function*)func_ptr;
@ -2095,29 +2074,29 @@ set_custom_hook(Application_Links *app, Hook_ID hook_id, Void_Func *func_ptr){
{
models->render_caller = (Render_Caller_Function*)func_ptr;
}break;
case HookID_InputFilter:
{
models->input_filter = (Input_Filter_Function*)func_ptr;
}break;
case HookID_Start:
{
models->hook_start = (Start_Hook_Function*)func_ptr;
}break;
case HookID_BufferNameResolver:
{
models->buffer_name_resolver = (Buffer_Name_Resolver_Function*)func_ptr;
}break;
case HookID_ModifyColorTable:
case HookID_BeginBuffer:
{
models->modify_color_table = (Modify_Color_Table_Function*)func_ptr;
models->begin_buffer = (Buffer_Hook_Function*)func_ptr;
}break;
case HookID_ClipboardChange:
case HookID_EndBuffer:
{
models->clipboard_change = (Clipboard_Change_Hook_Function*)func_ptr;
models->end_buffer = (Buffer_Hook_Function*)func_ptr;
}break;
case HookID_GetViewBufferRegion:
case HookID_NewFile:
{
models->get_view_buffer_region = (Get_View_Buffer_Region_Function*)func_ptr;
models->new_file = (Buffer_Hook_Function*)func_ptr;
}break;
case HookID_SaveFile:
{
models->save_file = (Buffer_Hook_Function*)func_ptr;
}break;
case HookID_BufferEditRange:
{
models->buffer_edit_range = (Buffer_Edit_Range_Function*)func_ptr;
}break;
}
}

View File

@ -52,24 +52,17 @@ struct Models{
Application_Links app_links;
Hook_Function *file_out_of_sync;
Hook_Function *exit;
Hook_Function *buffer_viewer_update;
Delta_Rule_Function *scroll_rule;
Buffer_Hook_Function *hook_new_file;
Buffer_Hook_Function *hook_open_file;
Buffer_Hook_Function *hook_save_file;
Buffer_Hook_Function *hook_end_file;
File_Edit_Range_Function *hook_file_edit_range;
File_Externally_Modified_Function *hook_file_externally_modified;
Custom_Command_Function *view_event_handler;
Render_Caller_Function *render_caller;
Input_Filter_Function *input_filter;
Start_Hook_Function *hook_start;
Buffer_Name_Resolver_Function *buffer_name_resolver;
Modify_Color_Table_Function *modify_color_table;
Clipboard_Change_Hook_Function *clipboard_change;
Get_View_Buffer_Region_Function *get_view_buffer_region;
Buffer_Hook_Function *begin_buffer;
Buffer_Hook_Function *end_buffer;
Buffer_Hook_Function *new_file;
Buffer_Hook_Function *save_file;
Buffer_Edit_Range_Function *buffer_edit_range;
Buffer_Region_Function *buffer_region;
Color_Table fallback_color_table;
Color_Table color_table;
@ -118,8 +111,9 @@ struct Models{
// Event Context
Application_Step_Input *input;
Input_Event event;
b8 event_unhandled;
i64 current_input_sequence_number;
User_Input current_input;
b8 current_input_unhandled;
b8 in_render_mode;
Render_Target *target;

View File

@ -200,7 +200,7 @@ edit_single(Models *models, Editing_File *file, Interval_i64 range, String_Const
// NOTE(allen): save the original text for the edit range hook.
String_Const_u8 original_text = {};
if (models->hook_file_edit_range != 0){
if (models->buffer_edit_range != 0){
original_text = buffer_stringify(scratch, &file->state.buffer, edit.range);
}
@ -224,16 +224,16 @@ edit_single(Models *models, Editing_File *file, Interval_i64 range, String_Const
edit_fix_markers(models, file, edit);
// NOTE(allen): edit range hook
if (models->hook_file_edit_range != 0){
if (models->buffer_edit_range != 0){
Interval_i64 new_range = Ii64(edit.range.first, edit.range.first + edit.text.size);
models->hook_file_edit_range(&models->app_links, file->id, new_range, original_text);
models->buffer_edit_range(&models->app_links, file->id, new_range, original_text);
}
}
internal void
file_end_file(Models *models, Editing_File *file){
if (models->hook_end_file != 0){
models->hook_end_file(&models->app_links, file->id);
if (models->end_buffer != 0){
models->end_buffer(&models->app_links, file->id);
}
Lifetime_Allocator *lifetime_allocator = &models->lifetime_allocator;
lifetime_free_object(lifetime_allocator, file->lifetime_object);
@ -544,8 +544,8 @@ create_file(Models *models, String_Const_u8 file_name, Buffer_Create_Flag flags)
if (file != 0 && buffer_is_for_new_file &&
!HasFlag(flags, BufferCreate_SuppressNewFileHook) &&
models->hook_new_file != 0){
models->hook_new_file(&models->app_links, file->id);
models->new_file != 0){
models->new_file(&models->app_links, file->id);
}
}

View File

@ -148,8 +148,8 @@ save_file_to_name(Models *models, Editing_File *file, u8 *file_name){
}
if (file_name != 0){
if (models->hook_save_file != 0){
models->hook_save_file(&models->app_links, file->id);
if (models->save_file != 0){
models->save_file(&models->app_links, file->id);
}
Gap_Buffer *buffer = &file->state.buffer;
@ -244,9 +244,8 @@ file_create_from_string(Models *models, Editing_File *file, String_Const_u8 val,
////////////////////////////////
Buffer_Hook_Function *hook_open_file = models->hook_open_file;
if (hook_open_file != 0){
hook_open_file(&models->app_links, file->id);
if (models->begin_buffer != 0){
models->begin_buffer(&models->app_links, file->id);
}
}

View File

@ -145,9 +145,13 @@ make_core_list(Arena *arena){
Event_Code_List list = {};
list.code_prefix = string_u8_litexpr("CoreCode");
list.name_table = string_u8_litexpr("core_code_name");
add_code(arena, &list, string_u8_litexpr("Startup"));
add_code(arena, &list, string_u8_litexpr("Animate"));
add_code(arena, &list, string_u8_litexpr("ClickActivateView"));
add_code(arena, &list, string_u8_litexpr("ClickDeactivateView"));
add_code(arena, &list, string_u8_litexpr("TryExit"));
add_code(arena, &list, string_u8_litexpr("FileExternallyModified"));
add_code(arena, &list, string_u8_litexpr("NewClipboardContents"));
return(list);
}

View File

@ -9,6 +9,14 @@
// TOP
function void
begin_handling_input(Models *models, User_Input *input){
block_copy_struct(&models->current_input, input);
models->current_input_sequence_number += 1;
}
////////////////////////////////
internal void
init_query_set(Query_Set *set){
Query_Slot *slot = set->slots;
@ -142,10 +150,10 @@ view_set_edit_pos(View *view, File_Edit_Positions edit_pos){
internal Rect_f32
view_get_buffer_rect(Models *models, View *view){
Rect_f32 region = {};
if (models->get_view_buffer_region != 0){
if (models->buffer_region != 0){
Rect_f32 rect = Rf32(view->panel->rect_inner);
Rect_f32 sub_region = Rf32(V2(0, 0), rect_dim(rect));
sub_region = models->get_view_buffer_region(&models->app_links, view_get_id(&models->live_set, view), sub_region);
sub_region = models->buffer_region(&models->app_links, view_get_id(&models->live_set, view), sub_region);
region.p0 = rect.p0 + sub_region.p0;
region.p1 = rect.p0 + sub_region.p1;
region.x1 = clamp_top(region.x1, rect.x1);
@ -631,30 +639,71 @@ co_send_event(Models *models, View *view, Input_Event *event){
Event_Property event_flags = get_event_properties(event);
if ((get_flags&event_flags) != 0){
models->event_unhandled = false;
models->current_input_unhandled = false;
Co_In in = {};
in.user_input.event = *event;
in.user_input.abort = ((abort_flags & event_flags) != 0);
block_copy_struct(&models->event, &in.user_input.event);
begin_handling_input(models, &in.user_input);
view->co = co_run(models, Co_View, view->co, &in, &view->co_out);
view_check_co_exited(models, view);
if (!HasFlag(event_flags, EventProperty_Animate)){
models->animate_next_frame = true;
}
event_was_handled = !models->event_unhandled;
event_was_handled = !models->current_input_unhandled;
}
return(event_was_handled);
}
function b32
co_send_core_event(Models *models, View *view, Core_Code code){
co_send_core_event(Models *models, View *view, Core_Code code, String_Const_u8 string){
Input_Event event = {};
event.kind = InputEventKind_Core;
event.core.code = code;
event.core.string = string;
return(co_send_event(models, view, &event));
}
function b32
co_send_core_event(Models *models, View *view, Core_Code code, Buffer_ID id){
Input_Event event = {};
event.kind = InputEventKind_Core;
event.core.code = code;
event.core.id = id;
return(co_send_event(models, view, &event));
}
function b32
co_send_core_event(Models *models, View *view, Core_Code code){
return(co_send_core_event(models, view, code, SCu8()));
}
function b32
co_send_event(Models *models, Input_Event *event){
Panel *active_panel = models->layout.active_panel;
View *view = active_panel->view;
return(co_send_event(models, view, event));
}
function b32
co_send_core_event(Models *models, Core_Code code, String_Const_u8 string){
Panel *active_panel = models->layout.active_panel;
View *view = active_panel->view;
return(co_send_core_event(models, view, code, string));
}
function b32
co_send_core_event(Models *models, Core_Code code, Buffer_ID buffer_id){
Panel *active_panel = models->layout.active_panel;
View *view = active_panel->view;
return(co_send_core_event(models, view, code, buffer_id));
}
function b32
co_send_core_event(Models *models, Core_Code code){
return(co_send_core_event(models, code, SCu8()));
}
////////////////////////////////
internal b32

View File

@ -385,7 +385,7 @@ CUSTOM_DOC("Auto-indents the range between the cursor and the mark.")
CUSTOM_COMMAND_SIG(write_text_and_auto_indent)
CUSTOM_DOC("Inserts text and auto-indents the line on which the cursor sits if any of the text contains 'layout punctuation' such as ;:{}()[]# and new lines.")
{
User_Input in = get_command_input(app);
User_Input in = get_current_input(app);
String_Const_u8 insert = to_writable(&in);
if (insert.str != 0 && insert.size > 0){
b32 do_auto_indent = false;

View File

@ -58,7 +58,7 @@ write_character_parameter(Application_Links *app, String_Const_u8 insert){
CUSTOM_COMMAND_SIG(write_text_input)
CUSTOM_DOC("Inserts whatever character was used to trigger this command.")
{
User_Input in = get_command_input(app);
User_Input in = get_current_input(app);
String_Const_u8 insert = to_writable(&in);
write_character_parameter(app, insert);
}
@ -830,8 +830,7 @@ isearch(Application_Links *app, Scan_Direction start_scan, i64 first_pos,
}
isearch__update_highlight(app, view, Ii64_size(pos, match_size));
in = get_user_input(app,
EventPropertyGroup_AnyKeyboardEvent,
in = get_next_input(app, EventPropertyGroup_AnyKeyboardEvent,
EventProperty_Escape|EventProperty_ViewActivation);
if (in.abort){
break;
@ -951,7 +950,7 @@ isearch(Application_Links *app, Scan_Direction start_scan, i64 first_pos,
mouse_wheel_scroll(app);
}
else{
leave_command_input_unhandled(app);
leave_current_input_unhandled(app);
}
}
@ -1104,7 +1103,7 @@ query_replace_base(Application_Links *app, View_ID view, Buffer_ID buffer_id, i6
Range_i64 match = Ii64(new_pos, new_pos + r.size);
isearch__update_highlight(app, view, match);
in = get_user_input(app, EventProperty_AnyKey, EventProperty_MouseButton);
in = get_next_input(app, EventProperty_AnyKey, EventProperty_MouseButton);
if (in.abort || match_key_code(&in, KeyCode_Escape) || !is_unmodified_key(&in.event)){
break;
}
@ -1275,7 +1274,7 @@ CUSTOM_DOC("Deletes the file of the current buffer if 4coder has the appropriate
if (start_query_bar(app, &bar, 0) != 0){
b32 cancelled = false;
for (;!cancelled;){
User_Input in = get_user_input(app, EventProperty_AnyKey, 0);
User_Input in = get_next_input(app, EventProperty_AnyKey, 0);
if (in.abort){
cancelled = true;
}
@ -1728,7 +1727,7 @@ multi_paste_interactive_up_down(Application_Links *app, i32 paste_count, i32 cli
User_Input in = {};
for (;;){
in = get_user_input(app, EventProperty_AnyKey, EventProperty_Escape);
in = get_next_input(app, EventProperty_AnyKey, EventProperty_Escape);
if (in.abort) break;
b32 did_modify = false;
@ -2045,5 +2044,18 @@ CUSTOM_DOC("Interactively opens a file in the other panel.")
interactive_open_or_new(app);
}
CUSTOM_COMMAND_SIG(default_file_externally_modified)
CUSTOM_DOC("Notes the external modification of attached files by printing a message.")
{
User_Input input = get_current_input(app);
if (match_core_code(&input, CoreCode_FileExternallyModified)){
Scratch_Block scratch(app);
Buffer_ID buffer_id = input.event.core.id;
String_Const_u8 name = push_buffer_unique_name(app, scratch, buffer_id);
String_Const_u8 str = push_u8_stringf(scratch, "Modified externally: %s\n", name.str);
print_message(app, str);
}
}
// BOTTOM

View File

@ -198,7 +198,7 @@ static Snippet default_snippets[] = {
static Lister_Activation_Code
activate_snippet(Application_Links *app, View_ID view, Lister *lister, String_Const_u8 text_field, void *user_data, b32 activated_by_mouse){
i32 index = (i32)PtrAsInt(user_data);
Snippet_Array snippets = *(Snippet_Array*)lister->data.user_data;
Snippet_Array snippets = *(Snippet_Array*)lister->user_data;
if (0 <= index && index < snippets.count){
Snippet snippet = snippets.snippets[index];
lister_default(app, view, lister, ListerActivation_Finished);

View File

@ -10,11 +10,8 @@
#include "4coder_default_include.cpp"
#include "generated/remapping.h"
// NOTE(allen|a4.0.22): This no longer serves as very good example code.
// Good example code will be coming soon, but in the mean time you can go
// to 4coder_remapping_commands.cpp for examples of what binding code looks like.
#if !defined(NO_BINDING)
void
custom_layer_init(Application_Links *app){
set_all_default_hooks(app);
@ -22,7 +19,8 @@ custom_layer_init(Application_Links *app){
mapping_init(tctx, &framework_mapping);
setup_default_mapping(&framework_mapping);
}
#endif //NO_BINDING
#endif
#endif //FCODER_DEFAULT_BINDINGS

View File

@ -345,7 +345,8 @@ CUSTOM_DOC("Toggle fullscreen mode on or off. The change(s) do not take effect
////////////////////////////////
static void
default_4coder_initialize(Application_Links *app, char **command_line_files, i32 file_count, i32 override_font_size, b32 override_hinting){
default_4coder_initialize(Application_Links *app, String_Const_u8_Array file_names,
i32 override_font_size, b32 override_hinting){
Thread_Context *tctx = get_thread_context(app);
heap_init(&global_heap, tctx->allocator);
@ -383,39 +384,46 @@ default_4coder_initialize(Application_Links *app, char **command_line_files, i32
// open command line files
Scratch_Block scratch(app);
String_Const_u8 hot_directory = push_hot_directory(app, scratch);
for (i32 i = 0; i < file_count; i += 1){
Temp_Memory temp2 = begin_temp(scratch);
String_Const_u8 input_name = SCu8(command_line_files[i]);
String_Const_u8 file_name = push_u8_stringf(scratch, "%.*s/%.*s", string_expand(hot_directory), string_expand(input_name));
Buffer_ID new_buffer = create_buffer(app, file_name, BufferCreate_NeverNew|BufferCreate_MustAttachToFile);
for (i32 i = 0; i < file_names.count; i += 1){
Temp_Memory_Block temp(scratch);
String_Const_u8 input_name = file_names.vals[i];
String_Const_u8 full_name = push_u8_stringf(scratch, "%.*s/%.*s",
string_expand(hot_directory),
string_expand(input_name));
Buffer_ID new_buffer = create_buffer(app, full_name, BufferCreate_NeverNew|BufferCreate_MustAttachToFile);
if (new_buffer == 0){
create_buffer(app, input_name, 0);
}
end_temp(temp2);
}
}
static void
default_4coder_initialize(Application_Links *app, i32 override_font_size, b32 override_hinting){
default_4coder_initialize(app, 0, 0, override_font_size, override_hinting);
default_4coder_initialize(Application_Links *app,
i32 override_font_size, b32 override_hinting){
String_Const_u8_Array file_names = {};
default_4coder_initialize(app, file_names, override_font_size, override_hinting);
}
static void
default_4coder_initialize(Application_Links *app, char **command_line_files, i32 file_count){
Face_Description command_line_description = get_face_description(app, 0);
default_4coder_initialize(app, command_line_files, file_count, command_line_description.parameters.pt_size, command_line_description.parameters.hinting);
default_4coder_initialize(Application_Links *app, String_Const_u8_Array file_names){
Face_Description description = get_face_description(app, 0);
default_4coder_initialize(app, file_names,
description.parameters.pt_size,
description.parameters.hinting);
}
static void
default_4coder_initialize(Application_Links *app){
Face_Description command_line_description = get_face_description(app, 0);
default_4coder_initialize(app, 0, 0, command_line_description.parameters.pt_size, command_line_description.parameters.hinting);
String_Const_u8_Array file_names = {};
default_4coder_initialize(app, file_names, command_line_description.parameters.pt_size, command_line_description.parameters.hinting);
}
static void
default_4coder_side_by_side_panels(Application_Links *app, Buffer_Identifier left_buffer, Buffer_Identifier right_buffer){
Buffer_ID left_id = buffer_identifier_to_id(app, left_buffer);
Buffer_ID right_id = buffer_identifier_to_id(app, right_buffer);
default_4coder_side_by_side_panels(Application_Links *app,
Buffer_Identifier left, Buffer_Identifier right){
Buffer_ID left_id = buffer_identifier_to_id(app, left);
Buffer_ID right_id = buffer_identifier_to_id(app, right);
// Left Panel
View_ID view = get_active_view(app, AccessAll);
@ -432,26 +440,29 @@ default_4coder_side_by_side_panels(Application_Links *app, Buffer_Identifier lef
}
static void
default_4coder_side_by_side_panels(Application_Links *app, Buffer_Identifier left, Buffer_Identifier right, char **command_line_files, i32 file_count){
if (file_count > 0){
left = buffer_identifier(SCu8(command_line_files[0]));
if (file_count > 1){
right = buffer_identifier(SCu8(command_line_files[1]));
default_4coder_side_by_side_panels(Application_Links *app,
Buffer_Identifier left, Buffer_Identifier right,
String_Const_u8_Array file_names){
if (file_names.count > 0){
left = buffer_identifier(file_names.vals[0]);
if (file_names.count > 1){
right = buffer_identifier(file_names.vals[1]);
}
}
default_4coder_side_by_side_panels(app, left, right);
}
static void
default_4coder_side_by_side_panels(Application_Links *app, char **command_line_files, i32 file_count){
default_4coder_side_by_side_panels(Application_Links *app, String_Const_u8_Array file_names){
Buffer_Identifier left = buffer_identifier(string_u8_litexpr("*scratch*"));
Buffer_Identifier right = buffer_identifier(string_u8_litexpr("*messages*"));
default_4coder_side_by_side_panels(app, left, right, command_line_files, file_count);
default_4coder_side_by_side_panels(app, left, right, file_names);
}
static void
default_4coder_side_by_side_panels(Application_Links *app){
default_4coder_side_by_side_panels(app, 0, 0);
String_Const_u8_Array file_names = {};
default_4coder_side_by_side_panels(app, file_names);
}
static void
@ -463,17 +474,18 @@ default_4coder_one_panel(Application_Links *app, Buffer_Identifier buffer){
}
static void
default_4coder_one_panel(Application_Links *app, char **command_line_files, i32 file_count){
default_4coder_one_panel(Application_Links *app, String_Const_u8_Array file_names){
Buffer_Identifier buffer = buffer_identifier(string_u8_litexpr("*messages*"));
if (file_count > 0){
buffer = buffer_identifier(SCu8(command_line_files[0]));
if (file_names.count > 0){
buffer = buffer_identifier(file_names.vals[0]);
}
default_4coder_one_panel(app, buffer);
}
static void
default_4coder_one_panel(Application_Links *app){
default_4coder_one_panel(app, 0, 0);
String_Const_u8_Array file_names = {};
default_4coder_one_panel(app, file_names);
}
// BOTTOM

View File

@ -65,10 +65,10 @@ typedef void View_Render_Hook(Application_Links *app, View_ID view, Frame_Info f
////////////////////////////////
static void
function b32
do_gui_sure_to_kill(Application_Links *app, Buffer_ID buffer, View_ID view);
static void
function b32
do_gui_sure_to_close_4coder(Application_Links *app, View_ID view);
#endif

View File

@ -4,26 +4,71 @@
// TOP
START_HOOK_SIG(default_start){
default_4coder_initialize(app, files, file_count);
default_4coder_side_by_side_panels(app, files, file_count);
if (global_config.automatically_load_project){
load_project(app);
CUSTOM_COMMAND_SIG(default_startup)
CUSTOM_DOC("Default command for responding to a startup event")
{
User_Input input = get_current_input(app);
if (match_core_code(&input, CoreCode_Startup)){
String_Const_u8_Array file_names = input.event.core.file_names;
default_4coder_initialize(app, file_names);
default_4coder_side_by_side_panels(app, file_names);
if (global_config.automatically_load_project){
load_project(app);
}
}
// no meaning for return
return(0);
}
CUSTOM_COMMAND_SIG(default_try_exit)
CUSTOM_DOC("Default command for responding to a try-exit event")
{
User_Input input = get_current_input(app);
if (match_core_code(&input, CoreCode_TryExit)){
b32 do_exit = true;
if (!allow_immediate_close_without_checking_for_changes){
b32 has_unsaved_changes = false;
for (Buffer_ID buffer = get_buffer_next(app, 0, AccessAll);
buffer != 0;
buffer = get_buffer_next(app, buffer, AccessAll)){
Dirty_State dirty = buffer_get_dirty_state(app, buffer);
if (HasFlag(dirty, DirtyState_UnsavedChanges)){
has_unsaved_changes = true;
break;
}
}
if (has_unsaved_changes){
View_ID view = get_active_view(app, AccessAll);
do_exit = do_gui_sure_to_close_4coder(app, view);
}
}
if (do_exit){
// NOTE(allen): By leaving try exit unhandled we indicate
// that the core should take responsibility for handling this,
// and it will handle it by exiting 4coder. If we leave this
// event marked as handled on the other hand (for instance by
// running a confirmation GUI that cancels the exit) then 4coder
// will not exit.
leave_current_input_unhandled(app);
}
}
}
CUSTOM_COMMAND_SIG(default_view_input_handler)
CUSTOM_DOC("Input consumption loop for base view behavior")
CUSTOM_DOC("Input consumption loop for default view behavior")
{
for (;;){
// NOTE(allen): Get the binding from the buffer's current map
User_Input input = get_user_input(app, EventPropertyGroup_Any, 0);
User_Input input = get_next_input(app, EventPropertyGroup_Any, 0);
if (input.abort){
break;
}
Event_Property event_properties = get_event_properties(&input.event);
if (suppressing_mouse && (event_properties & EventPropertyGroup_AnyMouseEvent) != 0){
continue;
}
View_ID view = get_active_view(app, AccessAll);
Buffer_ID buffer = view_get_buffer(app, view, AccessAll);
@ -41,7 +86,7 @@ CUSTOM_DOC("Input consumption loop for base view behavior")
// NOTE(allen): we don't have anything to do with this input,
// leave it marked unhandled so that if there's a follow up
// event it is not blocked.
leave_command_input_unhandled(app);
leave_current_input_unhandled(app);
}
else{
// NOTE(allen): before the command is called do some book keeping
@ -170,8 +215,8 @@ draw_enclosures(Application_Links *app, Text_Layout_ID text_layout_id, Buffer_ID
}
}
#if 0
static argb_color default_colors[Stag_COUNT] = {};
MODIFY_COLOR_TABLE_SIG(default_modify_color_table){
if (default_colors[Stag_NOOP] == 0){
default_colors[Stag_NOOP] = 0xFFFF00FF;
@ -231,8 +276,10 @@ MODIFY_COLOR_TABLE_SIG(default_modify_color_table){
color_table.count = ArrayCount(default_colors);
return(color_table);
}
#endif
GET_VIEW_BUFFER_REGION_SIG(default_view_buffer_region){
function Rect_f32
default_view_buffer_region(Application_Links *app, View_ID view_id, Rect_f32 sub_region){
Buffer_ID buffer = view_get_buffer(app, view_id, AccessAll);
Face_ID face_id = get_face_id(app, buffer);
Face_Metrics metrics = get_face_metrics(app, face_id);
@ -714,31 +761,6 @@ default_render_caller(Application_Links *app, Frame_Info frame_info, View_ID vie
draw_set_clip(app, prev_clip);
}
HOOK_SIG(default_exit){
// If this returns false it cancels the exit.
b32 result = true;
if (!allow_immediate_close_without_checking_for_changes){
b32 has_unsaved_changes = false;
for (Buffer_ID buffer = get_buffer_next(app, 0, AccessAll);
buffer != 0;
buffer = get_buffer_next(app, buffer, AccessAll)){
Dirty_State dirty = buffer_get_dirty_state(app, buffer);
if (HasFlag(dirty, DirtyState_UnsavedChanges)){
has_unsaved_changes = true;
break;
}
}
if (has_unsaved_changes){
View_ID view = get_active_view(app, AccessAll);
do_gui_sure_to_close_4coder(app, view);
result = false;
}
}
return(result);
}
HOOK_SIG(default_view_adjust){
// NOTE(allen): Called whenever the view layout/sizes have been modified, including
// by full window resize.
@ -1000,7 +1022,7 @@ BUFFER_HOOK_SIG(default_file_save){
return(0);
}
FILE_EDIT_RANGE_SIG(default_file_edit_range){
BUFFER_EDIT_RANGE_SIG(default_buffer_edit_range){
// buffer_id, range, text
Interval_i64 replace_range = Ii64(range.first, range.first + text.size);
@ -1089,16 +1111,6 @@ FILE_EDIT_RANGE_SIG(default_file_edit_range){
return(0);
}
FILE_EXTERNALLY_MODIFIED_SIG(default_file_externally_modified){
// buffer_id
Scratch_Block scratch(app);
String_Const_u8 name = push_buffer_unique_name(app, scratch, buffer_id);
String_Const_u8 str = push_u8_stringf(scratch, "Modified externally: %s\n", name.str);
print_message(app, str);
// no meaning for return
return(0);
}
BUFFER_HOOK_SIG(default_end_file){
Scratch_Block scratch(app);
String_Const_u8 buffer_name = push_buffer_unique_name(app, scratch, buffer_id);
@ -1108,19 +1120,6 @@ BUFFER_HOOK_SIG(default_end_file){
return(0);
}
// NOTE(allen|a4.0.9): The input filter allows you to modify the input
// to a frame before 4coder starts processing it at all.
//
// Right now it only has access to the mouse state, but it will be
// extended to have access to the key presses soon.
INPUT_FILTER_SIG(default_suppress_mouse_filter){
if (suppressing_mouse){
block_zero_struct(mouse);
mouse->p.x = -100;
mouse->p.y = -100;
}
}
// TODO(allen): FIX FIX FIX FIX
// NOTE(allen|a4): scroll rule information
//
@ -1202,24 +1201,27 @@ DELTA_RULE_SIG(smooth_scroll_rule){
internal void
set_all_default_hooks(Application_Links *app){
#if 0
set_custom_hook(app, HookID_Exit, default_exit);
set_custom_hook(app, HookID_BufferViewerUpdate, default_view_adjust);
set_custom_hook(app, HookID_Start, default_start);
set_custom_hook(app, HookID_OpenFile, default_file_settings);
set_custom_hook(app, HookID_NewFile, default_new_file);
set_custom_hook(app, HookID_SaveFile, default_file_save);
set_custom_hook(app, HookID_FileEditRange, default_file_edit_range);
set_custom_hook(app, HookID_FileExternallyModified, default_file_externally_modified);
set_custom_hook(app, HookID_EndFile, end_file_close_jump_list);
set_custom_hook(app, HookID_InputFilter, default_suppress_mouse_filter);
set_custom_hook(app, HookID_ModifyColorTable, default_modify_color_table);
#endif
set_custom_hook(app, HookID_BufferViewerUpdate, default_view_adjust);
set_custom_hook(app, HookID_ViewEventHandler, default_view_input_handler);
set_custom_hook(app, HookID_RenderCaller, default_render_caller);
set_custom_hook(app, HookID_InputFilter, default_suppress_mouse_filter);
set_custom_hook(app, HookID_ScrollRule, smooth_scroll_rule);
set_custom_hook(app, HookID_BufferNameResolver, default_buffer_name_resolution);
set_custom_hook(app, HookID_ModifyColorTable, default_modify_color_table);
set_custom_hook(app, HookID_GetViewBufferRegion, default_view_buffer_region);
set_custom_hook(app, HookID_BeginBuffer, default_file_settings);
set_custom_hook(app, HookID_EndBuffer, end_file_close_jump_list);
set_custom_hook(app, HookID_NewFile, default_new_file);
set_custom_hook(app, HookID_SaveFile, default_file_save);
set_custom_hook(app, HookID_BufferEditRange, default_buffer_edit_range);
set_custom_hook(app, HookID_BufferRegion, default_view_buffer_region);
}
// BOTTOM

View File

@ -9,8 +9,8 @@
#include "4coder_base_types.h"
#include "4coder_version.h"
#include "4coder_events.h"
#include "4coder_default_colors.h"
#include "4coder_events.h"
#include "4coder_types.h"
#define DYNAMIC_LINK_API
#include "generated/custom_api.h"

View File

@ -212,6 +212,26 @@ get_event_properties(Input_Event *event){
{
flags |= EventProperty_ViewActivation;
}break;
case CoreCode_FileExternallyModified:
{
flags |= EventProperty_AnyFile;
}break;
case CoreCode_Startup:
{
flags |= EventProperty_Startup;
}break;
case CoreCode_TryExit:
{
flags |= EventProperty_Exit;
}break;
case CoreCode_NewClipboardContents:
{
flags |= EventProperty_Clipboard;
}break;
}
}break;
}

View File

@ -69,6 +69,14 @@ struct Input_Event{
} mouse_move;
struct{
Core_Code code;
union{
String_Const_u8 string;
i32 id;
struct{
String_Const_u8_Array flag_strings;
String_Const_u8_Array file_names;
};
};
} core;
};
};
@ -96,6 +104,10 @@ enum{
EventProperty_Animate = 0x80,
EventProperty_ViewActivation = 0x100,
EventProperty_TextInsert = 0x200,
EventProperty_AnyFile = 0x400,
EventProperty_Startup = 0x800,
EventProperty_Exit = 0x1000,
EventProperty_Clipboard = 0x2000,
};
enum{
EventPropertyGroup_AnyKeyboardEvent =
@ -114,7 +126,11 @@ enum{
EventPropertyGroup_Any =
EventPropertyGroup_AnyUserInput|
EventProperty_Animate|
EventProperty_ViewActivation,
EventProperty_ViewActivation|
EventProperty_AnyFile|
EventProperty_Startup|
EventProperty_Exit|
EventProperty_Clipboard,
};
#endif

View File

@ -1301,14 +1301,15 @@ query_user_general(Application_Links *app, Query_Bar *bar, b32 force_number){
for (;;){
// NOTE(allen|a3.4.4): This call will block until the user does one of the input
// types specified in the flags. The first set of flags are inputs you'd like to intercept
// that you don't want to abort on. The second set are inputs that you'd like to cause
// the command to abort. If an event satisfies both flags, it is treated as an abort.
User_Input in = get_user_input(app, EventPropertyGroup_AnyKeyboardEvent,
// types specified in the flags. The first set of flags are inputs you'd like to
// intercept that you don't want to abort on. The second set are inputs that
// you'd like to cause the command to abort. If an event satisfies both flags, it
// is treated as an abort.
User_Input in = get_next_input(app, EventPropertyGroup_AnyKeyboardEvent,
EventProperty_Escape|EventProperty_MouseButton);
// NOTE(allen|a3.4.4): The responsible thing to do on abort is to end the command
// without waiting on get_user_input again.
// without waiting on get_next_input again.
if (in.abort){
success = false;
break;
@ -1351,7 +1352,7 @@ query_user_general(Application_Links *app, Query_Bar *bar, b32 force_number){
bar->string = string.string;
}
else{
leave_command_input_unhandled(app);
leave_current_input_unhandled(app);
}
}
@ -1675,7 +1676,9 @@ internal Buffer_Kill_Result
try_buffer_kill(Application_Links *app, Buffer_ID buffer, View_ID gui_view_id, Buffer_Kill_Flag flags){
Buffer_Kill_Result result = buffer_kill(app, buffer, flags);
if (result == BufferKillResult_Dirty){
do_gui_sure_to_kill(app, buffer, gui_view_id);
if (do_gui_sure_to_kill(app, buffer, gui_view_id)){
result = buffer_kill(app, buffer, BufferKill_AlwaysKill);
}
}
return(result);
}

View File

@ -10,7 +10,7 @@ activate_jump(Application_Links *app,
String_Const_u8 text_field, void *user_data, b32 activated_by_mouse){
Lister_Activation_Code result_code = ListerActivation_Finished;
i32 list_index = (i32)PtrAsInt(user_data);
Jump_Lister_Parameters *params = (Jump_Lister_Parameters*)lister->data.user_data;
Jump_Lister_Parameters *params = (Jump_Lister_Parameters*)lister->user_data;
Marker_List *list = get_marker_list_for_buffer(params->list_buffer_id);
if (list != 0){
View_ID target_view = {};

View File

@ -572,7 +572,7 @@ CUSTOM_DOC("If the buffer in the active view is writable, inserts a character, o
}
}
else{
leave_command_input_unhandled(app);
leave_current_input_unhandled(app);
}
}
@ -589,7 +589,7 @@ CUSTOM_DOC("If the buffer in the active view is writable, inserts a character, o
}
}
else{
leave_command_input_unhandled(app);
leave_current_input_unhandled(app);
}
}

View File

@ -50,24 +50,95 @@ view_get_lister(View_ID view){
}
function Lister*
begin_lister(Application_Links *app, Arena *arena, View_ID view, void *user_data, umem user_data_size){
begin_lister(Application_Links *app, Arena *arena, View_ID view,
void *user_data, umem user_data_size){
Lister *lister = push_array_zero(arena, Lister, 1);
lister->arena = arena;
lister->data.query = Su8(lister->data.query_space, 0, sizeof(lister->data.query_space));
lister->data.text_field = Su8(lister->data.text_field_space, 0, sizeof(lister->data.text_field_space));
lister->data.key_string = Su8(lister->data.key_string_space, 0, sizeof(lister->data.key_string_space));
lister->data.user_data_size = user_data_size;
if (user_data_size > 0){
lister->data.user_data = push_array(lister->arena, u8, user_data_size);
if (user_data != 0){
block_copy(lister->data.user_data, user_data, user_data_size);
}
lister->query = Su8(lister->query_space, 0, sizeof(lister->query_space));
lister->text_field = Su8(lister->text_field_space, 0, sizeof(lister->text_field_space));
lister->key_string = Su8(lister->key_string_space, 0, sizeof(lister->key_string_space));
lister->user_data = user_data;
lister->user_data_size = user_data_size;
if (user_data == 0){
lister->user_data = push_array_zero(arena, u8, user_data_size);
}
global_lister_state[view - 1] = lister;
lister->restore_all_point = begin_temp(lister->arena);
return(lister);
}
function void
lister_set_map(Lister *lister, Mapping *mapping, Command_Map *map){
lister->mapping = mapping;
lister->map = map;
}
function void
lister_set_map(Lister *lister, Mapping *mapping, Command_Map_ID map){
lister->mapping = mapping;
lister->map = mapping_get_map(mapping, map);
}
function void
lister_set_string(String_Const_u8 string, String_u8 *target){
target->size = 0;
string_append(target, string);
}
function void
lister_append_string(String_Const_u8 string, String_u8 *target){
string_append(target, string);
}
function void
lister_set_query(Lister *lister, String_Const_u8 string){
lister_set_string(string, &lister->query);
}
function void
lister_set_query(Lister *lister, char *string){
lister_set_string(SCu8(string), &lister->query);
}
function void
lister_set_text_field(Lister *lister, String_Const_u8 string){
lister_set_string(string, &lister->text_field);
}
function void
lister_set_text_field(Lister *lister, char *string){
lister_set_string(SCu8(string), &lister->text_field);
}
function void
lister_set_key(Lister *lister, String_Const_u8 string){
lister_set_string(string, &lister->key_string);
}
function void
lister_set_key(Lister *lister, char *string){
lister_set_string(SCu8(string), &lister->key_string);
}
function void
lister_append_query(Lister *lister, String_Const_u8 string){
lister_append_string(string, &lister->query);
}
function void
lister_append_query(Lister *lister, char *string){
lister_append_string(SCu8(string), &lister->query);
}
function void
lister_append_text_field(Lister *lister, String_Const_u8 string){
lister_append_string(string, &lister->text_field);
}
function void
lister_append_text_field(Lister *lister, char *string){
lister_append_string(SCu8(string), &lister->text_field);
}
function void
lister_append_key(Lister *lister, String_Const_u8 string){
lister_append_string(string, &lister->key_string);
}
function void
lister_append_key(Lister *lister, char *string){
lister_append_string(SCu8(string), &lister->key_string);
}
function void
lister_render(Application_Links *app, Frame_Info frame_info, View_ID view){
Scratch_Block scratch(app);
@ -105,10 +176,10 @@ lister_render(Application_Links *app, Frame_Info frame_info, View_ID view){
{
Fancy_String_List text_field = {};
push_fancy_string(scratch, &text_field, fancy_id(Stag_Pop1),
lister->data.query.string);
lister->query.string);
push_fancy_stringf(scratch, &text_field, fancy_id(Stag_Pop1), " ");
push_fancy_string(scratch, &text_field, fancy_id(Stag_Default),
lister->data.text_field.string);
lister->text_field.string);
draw_fancy_string(app, face_id, text_field.first,
V2f32(layout.text_field_rect.x0 + 3.f, layout.text_field_rect.y0),
Stag_Default, Stag_Back, 0, V2f32(1.f, 0.f));
@ -117,24 +188,24 @@ lister_render(Application_Links *app, Frame_Info frame_info, View_ID view){
Range_f32 x = rect_range_x(layout.list_rect);
draw_set_clip(app, layout.list_rect);
i32 count = lister->data.filtered.count;
i32 count = lister->filtered.count;
Range_f32 scroll_range = If32(0.f, clamp_bot(0.f, count*block_height - block_height));
lister->data.scroll.position.y = clamp_range(scroll_range, lister->data.scroll.position.y);
lister->data.scroll.position.x = 0.f;
lister->data.scroll.target.y = clamp_range(scroll_range, lister->data.scroll.target.y);
lister->data.scroll.target.x = 0.f;
lister->scroll.position.y = clamp_range(scroll_range, lister->scroll.position.y);
lister->scroll.position.x = 0.f;
lister->scroll.target.y = clamp_range(scroll_range, lister->scroll.target.y);
lister->scroll.target.x = 0.f;
// TODO(allen): get scroll rule from context
lister->data.scroll.position = lister->data.scroll.target;
lister->scroll.position = lister->scroll.target;
f32 scroll_y = lister->data.scroll.position.y;
f32 scroll_y = lister->scroll.position.y;
f32 y_pos = layout.list_rect.y0 - scroll_y;
i32 first_index = (i32)(scroll_y/block_height);
y_pos += first_index*block_height;
for (i32 i = first_index; i < count; i += 1){
Lister_Node *node = lister->data.filtered.node_ptrs[i];
Lister_Node *node = lister->filtered.node_ptrs[i];
Range_f32 y = If32(y_pos, y_pos + block_height);
y_pos = y.max;
@ -144,10 +215,10 @@ lister_render(Application_Links *app, Frame_Info frame_info, View_ID view){
b32 hovered = rect_contains_point(item_rect, m_p);
UI_Highlight_Level highlight = UIHighlight_None;
if (node == lister->data.highlighted_node){
if (node == lister->highlighted_node){
highlight = UIHighlight_Active;
}
else if (node->user_data == lister->data.hot_user_data){
else if (node->user_data == lister->hot_user_data){
if (hovered){
highlight = UIHighlight_Active;
}
@ -177,9 +248,9 @@ lister_render(Application_Links *app, Frame_Info frame_info, View_ID view){
function void*
lister_get_user_data(Lister *lister, i32 index){
void *result = 0;
if (0 <= index && index < lister->data.options.count){
if (0 <= index && index < lister->options.count){
i32 counter = 0;
for (Lister_Node *node = lister->data.options.first;
for (Lister_Node *node = lister->options.first;
node != 0;
node = node->next, counter += 1){
if (counter == index){
@ -193,7 +264,7 @@ lister_get_user_data(Lister *lister, i32 index){
function Lister_Filtered
lister_get_filtered(Arena *arena, Lister *lister){
i32 node_count = lister->data.options.count;
i32 node_count = lister->options.count;
Lister_Filtered filtered = {};
filtered.exact_matches.node_ptrs = push_array(arena, Lister_Node*, 1);
@ -202,7 +273,7 @@ lister_get_filtered(Arena *arena, Lister *lister){
Temp_Memory_Block temp(arena);
String_Const_u8 key = lister->data.key_string.string;
String_Const_u8 key = lister->key_string.string;
key = push_string_copy(arena, key);
string_mod_replace_character(key, '_', '*');
string_mod_replace_character(key, ' ', '*');
@ -214,7 +285,7 @@ lister_get_filtered(Arena *arena, Lister *lister){
string_list_push(&absolutes, &splits);
string_list_push(arena, &absolutes, string_u8_litexpr(""));
for (Lister_Node *node = lister->data.options.first;
for (Lister_Node *node = lister->options.first;
node != 0;
node = node->next){
String_Const_u8 node_string = node->string;
@ -250,7 +321,7 @@ lister_update_filtered_list(Application_Links *app, View_ID view, Lister *lister
};
Arena *arena = lister->arena;
end_temp(lister->data.filter_restore_point);
end_temp(lister->filter_restore_point);
i32 total_count = 0;
for (i32 array_index = 0; array_index < ArrayCount(node_ptr_arrays); array_index += 1){
@ -259,11 +330,11 @@ lister_update_filtered_list(Application_Links *app, View_ID view, Lister *lister
}
Lister_Node **node_ptrs = push_array(arena, Lister_Node*, total_count);
lister->data.filtered.node_ptrs = node_ptrs;
lister->data.filtered.count = total_count;
lister->filtered.node_ptrs = node_ptrs;
lister->filtered.count = total_count;
lister->data.raw_item_index = -1;
lister->data.highlighted_node = 0;
lister->raw_item_index = -1;
lister->highlighted_node = 0;
i32 counter = 0;
for (i32 array_index = 0; array_index < ArrayCount(node_ptr_arrays); array_index += 1){
@ -271,9 +342,9 @@ lister_update_filtered_list(Application_Links *app, View_ID view, Lister *lister
for (i32 node_index = 0; node_index < node_ptr_array.count; node_index += 1){
Lister_Node *node = node_ptr_array.node_ptrs[node_index];
node_ptrs[counter] = node;
if (lister->data.item_index == counter){
lister->data.highlighted_node = node;
lister->data.raw_item_index = node->raw_index;
if (lister->item_index == counter){
lister->highlighted_node = node;
lister->raw_item_index = node->raw_index;
}
counter += 1;
}
@ -282,9 +353,9 @@ lister_update_filtered_list(Application_Links *app, View_ID view, Lister *lister
function void
lister_call_refresh_handler(Application_Links *app, View_ID view, Lister *lister){
if (lister->data.handlers.refresh != 0){
lister->data.handlers.refresh(app, lister);
lister->data.filter_restore_point = begin_temp(lister->arena);
if (lister->handlers.refresh != 0){
lister->handlers.refresh(app, lister);
lister->filter_restore_point = begin_temp(lister->arena);
lister_update_filtered_list(app, view, lister);
}
}
@ -300,7 +371,7 @@ lister_default(Application_Links *app, View_ID view, Lister *lister, Lister_Acti
case ListerActivation_ContinueAndRefresh:
{
lister->data.item_index = 0;
lister->item_index = 0;
lister_call_refresh_handler(app, view, lister);
}break;
}
@ -310,9 +381,9 @@ function Lister_Activation_Code
lister_call_activate_handler(Application_Links *app, View_ID view, Lister *lister,
void *user_data, b32 activated_by_mouse){
Lister_Activation_Code result = ListerActivation_Finished;
if (lister->data.handlers.activate != 0){
result = lister->data.handlers.activate(app, view, lister, lister->data.text_field.string,
user_data, activated_by_mouse);
if (lister->handlers.activate != 0){
result = lister->handlers.activate(app, view, lister, lister->text_field.string,
user_data, activated_by_mouse);
}
else{
lister_default(app, view, lister, ListerActivation_Finished);
@ -336,10 +407,10 @@ lister_user_data_at_p(Application_Links *app, View_ID view, Lister *lister, Vec2
void *result = 0;
if (rect_contains_point(layout.list_rect, m_p)){
f32 y = m_p.y - layout.list_rect.y0 + lister->data.scroll.position.y;
f32 y = m_p.y - layout.list_rect.y0 + lister->scroll.position.y;
i32 index = (i32)(y/block_height);
if (0 < index && index < lister->data.filtered.count){
Lister_Node *node = lister->data.filtered.node_ptrs[index];
if (0 < index && index < lister->filtered.count){
Lister_Node *node = lister->filtered.node_ptrs[index];
result = node->user_data;
}
}
@ -349,15 +420,16 @@ lister_user_data_at_p(Application_Links *app, View_ID view, Lister *lister, Vec2
function void
lister_run(Application_Links *app, View_ID view, Lister *lister){
lister->data.filter_restore_point = begin_temp(lister->arena);
lister->filter_restore_point = begin_temp(lister->arena);
lister_update_filtered_list(app, view, lister);
View_Context ctx = view_current_context(app, view);
ctx.render_caller = lister_render;
ctx.hides_buffer = true;
view_push_context(app, view, &ctx);
for (;;){
User_Input in = get_user_input(app, EventPropertyGroup_Any, EventProperty_Escape);
User_Input in = get_next_input(app, EventPropertyGroup_Any, EventProperty_Escape);
if (in.abort){
break;
}
@ -367,8 +439,8 @@ lister_run(Application_Links *app, View_ID view, Lister *lister){
switch (in.event.kind){
case InputEventKind_TextInsert:
{
if (lister->data.handlers.write_character != 0){
lister->data.handlers.write_character(app);
if (lister->handlers.write_character != 0){
lister->handlers.write_character(app);
}
}break;
@ -379,9 +451,9 @@ lister_run(Application_Links *app, View_ID view, Lister *lister){
case KeyCode_Tab:
{
void *user_data = 0;
if (0 <= lister->data.raw_item_index &&
lister->data.raw_item_index < lister->data.options.count){
user_data = lister_get_user_data(lister, lister->data.raw_item_index);
if (0 <= lister->raw_item_index &&
lister->raw_item_index < lister->options.count){
user_data = lister_get_user_data(lister, lister->raw_item_index);
}
result = lister_call_activate_handler(app, view, lister,
user_data, false);
@ -389,11 +461,11 @@ lister_run(Application_Links *app, View_ID view, Lister *lister){
case KeyCode_Backspace:
{
if (lister->data.handlers.backspace != 0){
lister->data.handlers.backspace(app);
if (lister->handlers.backspace != 0){
lister->handlers.backspace(app);
}
else if (lister->data.handlers.key_stroke != 0){
result = lister->data.handlers.key_stroke(app);
else if (lister->handlers.key_stroke != 0){
result = lister->handlers.key_stroke(app);
}
else{
handled = false;
@ -402,8 +474,8 @@ lister_run(Application_Links *app, View_ID view, Lister *lister){
case KeyCode_Up:
{
if (lister->data.handlers.navigate_up != 0){
lister->data.handlers.navigate_up(app);
if (lister->handlers.navigate_up != 0){
lister->handlers.navigate_up(app);
}
else{
handled = false;
@ -412,8 +484,8 @@ lister_run(Application_Links *app, View_ID view, Lister *lister){
case KeyCode_Down:
{
if (lister->data.handlers.navigate_down != 0){
lister->data.handlers.navigate_down(app);
if (lister->handlers.navigate_down != 0){
lister->handlers.navigate_down(app);
}
else{
handled = false;
@ -422,8 +494,8 @@ lister_run(Application_Links *app, View_ID view, Lister *lister){
default:
{
if (lister->data.handlers.key_stroke != 0){
result = lister->data.handlers.key_stroke(app);
if (lister->handlers.key_stroke != 0){
result = lister->handlers.key_stroke(app);
}
else{
handled = false;
@ -439,7 +511,7 @@ lister_run(Application_Links *app, View_ID view, Lister *lister){
{
Vec2_f32 p = V2f32(in.event.mouse.p);
void *clicked = lister_user_data_at_p(app, view, lister, p);
lister->data.hot_user_data = clicked;
lister->hot_user_data = clicked;
}break;
default:
@ -454,15 +526,15 @@ lister_run(Application_Links *app, View_ID view, Lister *lister){
switch (in.event.mouse.code){
case MouseCode_Left:
{
if (lister->data.hot_user_data != 0){
if (lister->hot_user_data != 0){
Vec2_f32 p = V2f32(in.event.mouse.p);
void *clicked = lister_user_data_at_p(app, view, lister, p);
if (lister->data.hot_user_data == clicked){
if (lister->hot_user_data == clicked){
result = lister_call_activate_handler(app, view, lister,
clicked, true);
}
}
lister->data.hot_user_data = 0;
lister->hot_user_data = 0;
}break;
default:
@ -475,7 +547,7 @@ lister_run(Application_Links *app, View_ID view, Lister *lister){
case InputEventKind_MouseWheel:
{
Mouse_State mouse = get_mouse_state(app);
lister->data.scroll.target.y += mouse.wheel;
lister->scroll.target.y += mouse.wheel;
lister_update_filtered_list(app, view, lister);
}break;
@ -494,8 +566,28 @@ lister_run(Application_Links *app, View_ID view, Lister *lister){
if (result == ListerActivation_Finished){
break;
}
if (!handled){
leave_command_input_unhandled(app);
Mapping *mapping = lister->mapping;
Command_Map *map = lister->map;
if (mapping != 0 && map != 0){
Command_Binding binding =
map_get_binding_recursive(mapping, map, &in.event);
if (binding.custom != 0){
i64 old_num = get_current_input_sequence_number(app);
binding.custom(app);
i64 num = get_current_input_sequence_number(app);
if (old_num < num){
break;
}
}
else{
leave_current_input_unhandled(app);
}
}
else{
leave_current_input_unhandled(app);
}
}
}
@ -512,8 +604,8 @@ lister_prealloced(String_Const_u8 string){
function void
lister_begin_new_item_set(Application_Links *app, Lister *lister){
end_temp(lister->restore_all_point);
block_zero_struct(&lister->data.options);
block_zero_struct(&lister->data.filtered);
block_zero_struct(&lister->options);
block_zero_struct(&lister->filtered);
}
function void*
@ -524,9 +616,9 @@ lister_add_item(Lister *lister, Lister_Prealloced_String string, Lister_Prealloc
node->string = string.string;
node->status = status.string;
node->user_data = user_data;
node->raw_index = lister->data.options.count;
zdll_push_back(lister->data.options.first, lister->data.options.last, node);
lister->data.options.count += 1;
node->raw_index = lister->options.count;
zdll_push_back(lister->options.first, lister->options.last, node);
lister->options.count += 1;
void *result = (node + 1);
return(result);
}
@ -553,88 +645,5 @@ lister_add_item(Lister *lister, String_Const_u8 string, String_Const_u8 status,
user_data, extra_space));
}
function void*
lister_add_theme_item(Lister *lister,
Lister_Prealloced_String string, i32 index,
void *user_data, i32 extra_space){
Lister_Node *node = push_array(lister->arena, Lister_Node, 1);
node->string = string.string;
node->index = index;
node->user_data = user_data;
node->raw_index = lister->data.options.count;
zdll_push_back(lister->data.options.first, lister->data.options.last, node);
lister->data.options.count += 1;
void *result = push_array(lister->arena, char, extra_space);
push_align(lister->arena, 8);
return(result);
}
function void*
lister_add_theme_item(Lister *lister, String_Const_u8 string, i32 index,
void *user_data, i32 extra_space){
return(lister_add_theme_item(lister, lister_prealloced(push_string_copy(lister->arena, string)), index,
user_data, extra_space));
}
function void
lister_set_string(String_Const_u8 string, String_u8 *target){
target->size = 0;
string_append(target, string);
}
function void
lister_append_string(String_Const_u8 string, String_u8 *target){
string_append(target, string);
}
function void
lister_set_query(Lister *lister, String_Const_u8 string){
lister_set_string(string, &lister->data.query);
}
function void
lister_set_query(Lister *lister, char *string){
lister_set_string(SCu8(string), &lister->data.query);
}
function void
lister_set_text_field(Lister *lister, String_Const_u8 string){
lister_set_string(string, &lister->data.text_field);
}
function void
lister_set_text_field(Lister *lister, char *string){
lister_set_string(SCu8(string), &lister->data.text_field);
}
function void
lister_set_key(Lister *lister, String_Const_u8 string){
lister_set_string(string, &lister->data.key_string);
}
function void
lister_set_key(Lister *lister, char *string){
lister_set_string(SCu8(string), &lister->data.key_string);
}
function void
lister_append_query(Lister *lister, String_Const_u8 string){
lister_append_string(string, &lister->data.query);
}
function void
lister_append_query(Lister *lister, char *string){
lister_append_string(SCu8(string), &lister->data.query);
}
function void
lister_append_text_field(Lister *lister, String_Const_u8 string){
lister_append_string(string, &lister->data.text_field);
}
function void
lister_append_text_field(Lister *lister, char *string){
lister_append_string(SCu8(string), &lister->data.text_field);
}
function void
lister_append_key(Lister *lister, String_Const_u8 string){
lister_append_string(string, &lister->data.key_string);
}
function void
lister_append_key(Lister *lister, char *string){
lister_append_string(SCu8(string), &lister->data.key_string);
}
// BOTTOM

View File

@ -59,29 +59,32 @@ struct Lister{
Arena *arena;
Temp_Memory restore_all_point;
struct{
Lister_Handlers handlers;
void *user_data;
umem user_data_size;
u8 query_space[256];
u8 text_field_space[256];
u8 key_string_space[256];
String_u8 query;
String_u8 text_field;
String_u8 key_string;
Lister_Node_List options;
Temp_Memory filter_restore_point;
Lister_Node_Ptr_Array filtered;
b32 set_view_vertical_focus_to_item;
Lister_Node *highlighted_node;
void *hot_user_data;
i32 item_index;
i32 raw_item_index;
Basic_Scroll scroll;
} data;
Lister_Handlers handlers;
Mapping *mapping;
Command_Map *map;
void *user_data;
umem user_data_size;
u8 query_space[256];
u8 text_field_space[256];
u8 key_string_space[256];
String_u8 query;
String_u8 text_field;
String_u8 key_string;
Lister_Node_List options;
Temp_Memory filter_restore_point;
Lister_Node_Ptr_Array filtered;
b32 set_view_vertical_focus_to_item;
Lister_Node *highlighted_node;
void *hot_user_data;
i32 item_index;
i32 raw_item_index;
Basic_Scroll scroll;
};
struct Lister_Prealloced_String{

View File

@ -10,12 +10,12 @@ lister__write_string__default(Application_Links *app){
View_ID view = get_active_view(app, AccessAll);
Lister *lister = view_get_lister(view);
if (lister != 0){
User_Input in = get_command_input(app);
User_Input in = get_current_input(app);
String_Const_u8 string = to_writable(&in);
if (string.str != 0 && string.size > 0){
lister_append_text_field(lister, string);
lister_append_key(lister, string);
lister->data.item_index = 0;
lister->item_index = 0;
view_zero_scroll(app, view);
lister_update_filtered_list(app, view, lister);
}
@ -27,9 +27,9 @@ lister__backspace_text_field__default(Application_Links *app){
View_ID view = get_active_view(app, AccessAll);
Lister *lister = view_get_lister(view);
if (lister != 0){
lister->data.text_field.string = backspace_utf8(lister->data.text_field.string);
lister->data.key_string.string = backspace_utf8(lister->data.key_string.string);
lister->data.item_index = 0;
lister->text_field.string = backspace_utf8(lister->text_field.string);
lister->key_string.string = backspace_utf8(lister->key_string.string);
lister->item_index = 0;
view_zero_scroll(app, view);
lister_update_filtered_list(app, view, lister);
}
@ -40,11 +40,11 @@ lister__move_up__default(Application_Links *app){
View_ID view = get_active_view(app, AccessAll);
Lister *lister = view_get_lister(view);
if (lister != 0){
lister->data.item_index = lister->data.item_index - 1;
if (lister->data.item_index < 0){
lister->data.item_index = lister->data.filtered.count - 1;
lister->item_index = lister->item_index - 1;
if (lister->item_index < 0){
lister->item_index = lister->filtered.count - 1;
}
lister->data.set_view_vertical_focus_to_item = true;
lister->set_view_vertical_focus_to_item = true;
lister_update_filtered_list(app, view, lister);
}
}
@ -54,11 +54,11 @@ lister__move_down__default(Application_Links *app){
View_ID view = get_active_view(app, AccessAll);
Lister *lister = view_get_lister(view);
if (lister != 0){
lister->data.item_index = lister->data.item_index + 1;
if (lister->data.item_index > lister->data.filtered.count - 1){
lister->data.item_index = 0;
lister->item_index = lister->item_index + 1;
if (lister->item_index > lister->filtered.count - 1){
lister->item_index = 0;
}
lister->data.set_view_vertical_focus_to_item = true;
lister->set_view_vertical_focus_to_item = true;
lister_update_filtered_list(app, view, lister);
}
}
@ -68,18 +68,18 @@ lister__write_character__file_path(Application_Links *app){
View_ID view = get_active_view(app, AccessAll);
Lister *lister = view_get_lister(view);
if (lister != 0){
User_Input in = get_command_input(app);
User_Input in = get_current_input(app);
String_Const_u8 string = to_writable(&in);
if (string.str != 0 && string.size > 0){
lister_append_text_field(lister, string);
String_Const_u8 front_name = string_front_of_path(lister->data.text_field.string);
String_Const_u8 front_name = string_front_of_path(lister->text_field.string);
lister_set_key(lister, front_name);
if (character_is_slash(string.str[0])){
String_Const_u8 new_hot = lister->data.text_field.string;
String_Const_u8 new_hot = lister->text_field.string;
set_hot_directory(app, new_hot);
lister_call_refresh_handler(app, view, lister);
}
lister->data.item_index = 0;
lister->item_index = 0;
view_zero_scroll(app, view);
lister_update_filtered_list(app, view, lister);
}
@ -91,32 +91,32 @@ lister__backspace_text_field__file_path(Application_Links *app){
View_ID view = get_active_view(app, AccessAll);
Lister *lister = view_get_lister(view);
if (lister != 0){
if (lister->data.text_field.size > 0){
char last_char = lister->data.text_field.str[lister->data.text_field.size - 1];
lister->data.text_field.string = backspace_utf8(lister->data.text_field.string);
if (lister->text_field.size > 0){
char last_char = lister->text_field.str[lister->text_field.size - 1];
lister->text_field.string = backspace_utf8(lister->text_field.string);
if (character_is_slash(last_char)){
User_Input input = get_command_input(app);
String_Const_u8 text_field = lister->data.text_field.string;
User_Input input = get_current_input(app);
String_Const_u8 text_field = lister->text_field.string;
String_Const_u8 new_hot = string_remove_last_folder(text_field);
b32 is_modified = has_modifier(&input, KeyCode_Control);
b32 whole_word_backspace = (is_modified == global_config.lister_whole_word_backspace_when_modified);
if (whole_word_backspace){
lister->data.text_field.size = new_hot.size;
lister->text_field.size = new_hot.size;
}
set_hot_directory(app, new_hot);
// TODO(allen): We have to protect against lister_call_refresh_handler changing
// the text_field here. Clean this up.
String_u8 dingus = lister->data.text_field;
String_u8 dingus = lister->text_field;
lister_call_refresh_handler(app, view, lister);
lister->data.text_field = dingus;
lister->text_field = dingus;
}
else{
String_Const_u8 text_field = lister->data.text_field.string;
String_Const_u8 text_field = lister->text_field.string;
String_Const_u8 new_key = string_front_of_path(text_field);
lister_set_key(lister, new_key);
}
lister->data.item_index = 0;
lister->item_index = 0;
view_zero_scroll(app, view);
lister_update_filtered_list(app, view, lister);
}
@ -129,11 +129,11 @@ lister__key_stroke__fixed_list(Application_Links *app){
View_ID view = get_active_view(app, AccessAll);
Lister *lister = view_get_lister(view);
if (lister != 0){
User_Input in = get_command_input(app);
User_Input in = get_current_input(app);
if (in.event.kind == InputEventKind_KeyStroke){
void *user_data = 0;
b32 did_shortcut_key = false;
for (Lister_Node *node = lister->data.options.first;
for (Lister_Node *node = lister->options.first;
node != 0;
node = node->next){
Key_Code *key_code = (Key_Code*)(node + 1);
@ -180,8 +180,9 @@ run_lister_with_refresh_handler(Application_Links *app, char *query_string,
if (handlers.refresh != 0){
Scratch_Block scratch(app);
Lister *lister = begin_lister(app, scratch, view, user_data, user_data_size);
lister_set_map(lister, &framework_mapping, mapid_global);
lister_set_query(lister, query_string);
lister->data.handlers = handlers;
lister->handlers = handlers;
handlers.refresh(app, lister);
lister_run(app, view, lister);
}
@ -214,12 +215,13 @@ run_lister_with_options_array(Application_Links *app, char *query_string,
View_ID view){
Scratch_Block scratch(app);
Lister *lister = begin_lister(app, scratch, view, user_data, user_data_size);
lister_set_map(lister, &framework_mapping, mapid_global);
for (i32 i = 0; i < option_count; i += 1){
lister_add_item(lister, options[i].string, options[i].status, options[i].user_data, 0);
}
lister_set_query(lister, query_string);
lister->data.handlers = lister_get_default_handlers();
lister->data.handlers.activate = activate;
lister->handlers = lister_get_default_handlers();
lister->handlers.activate = activate;
lister_run(app, view, lister);
}
@ -232,6 +234,7 @@ run_lister_with_fixed_options(Application_Links *app, char *query_string,
View_ID view){
Scratch_Block scratch(app);
Lister *lister = begin_lister(app, scratch, view, user_data, user_data_size);
lister_set_map(lister, &framework_mapping, mapid_global);
for (i32 i = 0; i < option_count; i += 1){
Key_Code code = options[i].key_code;
void *extra = lister_add_item(lister, SCu8(options[i].string), SCu8(options[i].status),
@ -239,8 +242,8 @@ run_lister_with_fixed_options(Application_Links *app, char *query_string,
block_copy(extra, &code, sizeof(code));
}
lister_set_query(lister, query_string);
lister->data.handlers = handlers;
lister->data.handlers.refresh = 0;
lister->handlers = handlers;
lister->handlers.refresh = 0;
lister_run(app, view, lister);
}
@ -434,26 +437,31 @@ enum{
SureToKill_Save = 3,
};
struct Confirm_Kill_Data{
Buffer_ID id;
b32 do_kill;
};
function Lister_Activation_Code
activate_confirm_kill(Application_Links *app, View_ID view, Lister *lister,
String_Const_u8 text_field, void *user_data, b32 clicked){
i32 behavior = (i32)PtrAsInt(user_data);
Buffer_ID buffer_id = *(Buffer_ID*)(lister->data.user_data);
Confirm_Kill_Data *data = (Confirm_Kill_Data*)(lister->user_data);
switch (behavior){
case SureToKill_No:
{}break;
case SureToKill_Yes:
{
buffer_kill(app, buffer_id, BufferKill_AlwaysKill);
data->do_kill = true;
}break;
case SureToKill_Save:
{
Scratch_Block scratch(app);
String_Const_u8 file_name = push_buffer_file_name(app, scratch, buffer_id);
if (buffer_save(app, buffer_id, file_name, BufferSave_IgnoreDirtyFlag)){
buffer_kill(app, buffer_id, BufferKill_AlwaysKill);
String_Const_u8 file_name = push_buffer_file_name(app, scratch, data->id);
if (buffer_save(app, data->id, file_name, BufferSave_IgnoreDirtyFlag)){
data->do_kill = true;
}
else{
String_Const_u8 str = push_u8_stringf(scratch, "Did not close '%.*s' because it did not successfully save.",
@ -466,7 +474,7 @@ activate_confirm_kill(Application_Links *app, View_ID view, Lister *lister,
return(ListerActivation_Finished);
}
function void
function b32
do_gui_sure_to_kill(Application_Links *app, Buffer_ID buffer, View_ID view){
Lister_Fixed_Option options[] = {
{"(N)o" , "", KeyCode_N, IntAsPtr(SureToKill_No) },
@ -474,10 +482,13 @@ do_gui_sure_to_kill(Application_Links *app, Buffer_ID buffer, View_ID view){
{"(S)ave and Kill", "", KeyCode_S, IntAsPtr(SureToKill_Save)},
};
i32 option_count = sizeof(options)/sizeof(options[0]);
Confirm_Kill_Data data = {};
data.id = buffer;
run_lister_with_fixed_options(app, "There are unsaved changes, close anyway?",
activate_confirm_kill, &buffer, sizeof(buffer),
activate_confirm_kill, &data, sizeof(data),
options, option_count, default_string_size_estimation,
view);
return(data.do_kill);
}
function Lister_Activation_Code
@ -485,6 +496,7 @@ activate_confirm_close_4coder(Application_Links *app,
View_ID view, Lister *lister,
String_Const_u8 text_field, void *user_data, b32 clicked){
i32 behavior = (i32)PtrAsInt(user_data);
b32 *do_exit = (b32*)user_data;
switch (behavior){
case SureToKill_No:
{}break;
@ -492,21 +504,21 @@ activate_confirm_close_4coder(Application_Links *app,
case SureToKill_Yes:
{
allow_immediate_close_without_checking_for_changes = true;
send_exit_signal(app);
*do_exit = true;
}break;
case SureToKill_Save:
{
save_all_dirty_buffers(app);
allow_immediate_close_without_checking_for_changes = true;
send_exit_signal(app);
*do_exit = true;
}break;
}
lister_default(app, view, lister, ListerActivation_Finished);
return(ListerActivation_Finished);
}
function void
function b32
do_gui_sure_to_close_4coder(Application_Links *app, View_ID view){
Lister_Fixed_Option options[] = {
{"(N)o" , "", KeyCode_N, (void*)SureToKill_No },
@ -514,10 +526,13 @@ do_gui_sure_to_close_4coder(Application_Links *app, View_ID view){
{"(S)ave All and Close", "", KeyCode_S, (void*)SureToKill_Save},
};
i32 option_count = sizeof(options)/sizeof(options[0]);
b32 do_exit = false;
run_lister_with_fixed_options(app, "There are one or more buffers with unsave changes, close anyway?",
activate_confirm_close_4coder, 0, 0,
activate_confirm_close_4coder,
&do_exit, sizeof(do_exit),
options, option_count, default_string_size_estimation,
view);
return(do_exit);
}
////////////////////////////////
@ -611,7 +626,7 @@ activate_open_or_new(Application_Links *app,
result = ListerActivation_Finished;
}
else{
String_Const_u8 path = lister->data.text_field.string;
String_Const_u8 path = lister->text_field.string;
if (!character_is_slash(string_get_character(path, path.size - 1))){
path = string_remove_last_folder(path);
}
@ -650,7 +665,7 @@ activate_new(Application_Links *app,
result = ListerActivation_Finished;
}
else{
String_Const_u8 path = lister->data.text_field.string;
String_Const_u8 path = lister->text_field.string;
if (character_is_slash(string_get_character(path, path.size - 1))){
path = string_remove_last_folder(path);
}
@ -683,7 +698,7 @@ activate_open(Application_Links *app,
result = ListerActivation_Finished;
}
else{
String_Const_u8 path = lister->data.text_field.string;
String_Const_u8 path = lister->text_field.string;
if (!character_is_slash(string_get_character(path, path.size - 1))){
path = string_remove_last_folder(path);
}

View File

@ -1002,7 +1002,7 @@ CUSTOM_DOC("Parses *log* and displays the 'log graph' UI")
view_push_context(app, log_view, &ctx);
for (;;){
User_Input in = get_user_input(app, EventPropertyGroup_AnyUserInput, KeyCode_Escape);
User_Input in = get_next_input(app, EventPropertyGroup_AnyUserInput, KeyCode_Escape);
if (in.abort){
log_view = 0;
break;

View File

@ -944,7 +944,7 @@ CUSTOM_DOC("Looks for a project.4coder file in the current directory and tries t
CUSTOM_COMMAND_SIG(project_fkey_command)
CUSTOM_DOC("Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.")
{
User_Input input = get_command_input(app);
User_Input input = get_current_input(app);
b32 got_ind = false;
i32 ind = 0;
if (input.event.kind == InputEventKind_KeyStroke){

View File

@ -107,14 +107,6 @@ struct Frame_Info{
f32 animation_dt;
};
typedef void Render_Caller_Function(Application_Links *app, Frame_Info frame_info, View_ID view);
#define RENDER_CALLER_SIG(name) void name(Application_Links *app, Frame_Info frame_info, View_ID view)
struct View_Context{
Render_Caller_Function *render_caller;
b32 hides_buffer;
};
ENUM(i32, View_Setting_ID){
ViewSetting_Null,
ViewSetting_ShowWhitespace,
@ -483,63 +475,23 @@ STRUCT User_Input{
typedef i32 Hook_ID;
enum{
HookID_FileOutOfSync,
HookID_Exit,
HookID_RenderCaller,
HookID_BufferViewerUpdate,
HookID_ScrollRule,
HookID_NewFile,
HookID_OpenFile,
HookID_SaveFile,
HookID_EndFile,
HookID_FileEditRange,
HookID_FileExternallyModified,
HookID_ViewEventHandler,
HookID_RenderCaller,
HookID_InputFilter,
HookID_Start,
HookID_BufferNameResolver,
HookID_ModifyColorTable,
HookID_ClipboardChange,
HookID_GetViewBufferRegion,
HookID_BeginBuffer,
HookID_EndBuffer,
HookID_NewFile,
HookID_SaveFile,
HookID_BufferEditRange,
HookID_BufferRegion,
};
TYPEDEF_FUNC i32 Hook_Function(struct Application_Links *app);
#define HOOK_SIG(name) i32 name(struct Application_Links *app)
typedef i32 Hook_Function(Application_Links *app);
#define HOOK_SIG(name) i32 name(Application_Links *app)
TYPEDEF_FUNC i32 Buffer_Hook_Function(struct Application_Links *app, Buffer_ID buffer_id);
#define BUFFER_HOOK_SIG(name) i32 name(struct Application_Links *app, Buffer_ID buffer_id)
TYPEDEF_FUNC i32 File_Edit_Range_Function(struct Application_Links *app, Buffer_ID buffer_id,
Interval_i64 range, String_Const_u8 text);
#define FILE_EDIT_RANGE_SIG(name) i32 name(struct Application_Links *app, Buffer_ID buffer_id, Interval_i64 range, String_Const_u8 text)
TYPEDEF_FUNC i32 File_Externally_Modified_Function(struct Application_Links *app, Buffer_ID buffer_id);
#define FILE_EXTERNALLY_MODIFIED_SIG(name) i32 name(struct Application_Links *app, Buffer_ID buffer_id)
TYPEDEF_FUNC void Input_Filter_Function(Mouse_State *mouse);
#define INPUT_FILTER_SIG(name) void name(Mouse_State *mouse)
TYPEDEF_FUNC Vec2_f32 Delta_Rule_Function(Vec2_f32 pending_delta, View_ID view_id, b32 is_new_target, f32 dt);
#define DELTA_RULE_SIG(name) Vec2_f32 name(Vec2_f32 pending_delta, View_ID view_id, b32 is_new_target, f32 dt)
STRUCT Color_Table{
argb_color *vals;
u32 count;
};
TYPEDEF_FUNC Color_Table Modify_Color_Table_Function(struct Application_Links *app, Frame_Info frame);
#define MODIFY_COLOR_TABLE_SIG(name) Color_Table name(struct Application_Links *app, Frame_Info frame)
ENUM(u32, Clipboard_Change_Flag){
ClipboardFlag_FromOS = 0x1,
};
TYPEDEF_FUNC void Clipboard_Change_Hook_Function(struct Application_Links *app, String_Const_u8 contents, Clipboard_Change_Flag flags);
#define CLIPBOARD_CHANGE_HOOK_SIG(name) void name(struct Application_Links *app, String_Const_u8 contents, Clipboard_Change_Flag flags)
TYPEDEF_FUNC Rect_f32 Get_View_Buffer_Region_Function(struct Application_Links *app, View_ID view_id, Rect_f32 sub_region);
#define GET_VIEW_BUFFER_REGION_SIG(name) Rect_f32 name(struct Application_Links *app, View_ID view_id, Rect_f32 sub_region)
STRUCT Buffer_Name_Conflict_Entry{
struct Buffer_Name_Conflict_Entry{
Buffer_ID buffer_id;
String_Const_u8 file_name;
String_Const_u8 base_name;
@ -548,16 +500,40 @@ STRUCT Buffer_Name_Conflict_Entry{
umem unique_name_capacity;
};
TYPEDEF_FUNC void Buffer_Name_Resolver_Function(struct Application_Links *app, Buffer_Name_Conflict_Entry *conflicts, i32 conflict_count);
typedef void Buffer_Name_Resolver_Function(Application_Links *app, Buffer_Name_Conflict_Entry *conflicts, i32 conflict_count);
#define BUFFER_NAME_RESOLVER_SIG(n) \
void n(struct Application_Links *app, Buffer_Name_Conflict_Entry *conflicts, i32 conflict_count)
void n(Application_Links *app, Buffer_Name_Conflict_Entry *conflicts, i32 conflict_count)
TYPEDEF_FUNC i32 Start_Hook_Function(struct Application_Links *app, char **files, i32 file_count, char **flags, i32 flag_count);
#define START_HOOK_SIG(name) \
i32 name(struct Application_Links *app, char **files, i32 file_count, char **flags, i32 flag_count)
typedef i32 Buffer_Hook_Function(Application_Links *app, Buffer_ID buffer_id);
#define BUFFER_HOOK_SIG(name) i32 name(Application_Links *app, Buffer_ID buffer_id)
TYPEDEF_FUNC i32 Get_Binding_Data_Function(void *data, i32 size);
#define GET_BINDING_DATA(name) i32 name(void *data, i32 size)
typedef i32 Buffer_Edit_Range_Function(Application_Links *app, Buffer_ID buffer_id,
Range_i64 range, String_Const_u8 text);
#define BUFFER_EDIT_RANGE_SIG(name) i32 name(Application_Links *app, Buffer_ID buffer_id,\
Interval_i64 range, String_Const_u8 text)
typedef Vec2_f32 Delta_Rule_Function(Vec2_f32 pending_delta, View_ID view_id, b32 is_new_target, f32 dt);
#define DELTA_RULE_SIG(name) \
Vec2_f32 name(Vec2_f32 pending_delta, View_ID view_id, b32 is_new_target, f32 dt)
typedef Rect_f32 Buffer_Region_Function(Application_Links *app, View_ID view_id, Rect_f32 region);
struct Color_Table{
argb_color *vals;
u32 count;
};
typedef void New_Clipboard_Contents_Function(Application_Links *app, String_Const_u8 contents);
#define NEW_CLIPBOARD_CONTENTS_SIG(name) \
void name(Application_Links *app, String_Const_u8 contents)
typedef void Render_Caller_Function(Application_Links *app, Frame_Info frame_info, View_ID view);
#define RENDER_CALLER_SIG(name) void name(Application_Links *app, Frame_Info frame_info, View_ID view)
struct View_Context{
Render_Caller_Function *render_caller;
b32 hides_buffer;
};
typedef i64 Command_Map_ID;

View File

@ -1,204 +1,212 @@
enum{
KeyCode_A = 1,
KeyCode_B = 2,
KeyCode_C = 3,
KeyCode_D = 4,
KeyCode_E = 5,
KeyCode_F = 6,
KeyCode_G = 7,
KeyCode_H = 8,
KeyCode_I = 9,
KeyCode_J = 10,
KeyCode_K = 11,
KeyCode_L = 12,
KeyCode_M = 13,
KeyCode_N = 14,
KeyCode_O = 15,
KeyCode_P = 16,
KeyCode_Q = 17,
KeyCode_R = 18,
KeyCode_S = 19,
KeyCode_T = 20,
KeyCode_U = 21,
KeyCode_V = 22,
KeyCode_W = 23,
KeyCode_X = 24,
KeyCode_Y = 25,
KeyCode_Z = 26,
KeyCode_0 = 27,
KeyCode_1 = 28,
KeyCode_2 = 29,
KeyCode_3 = 30,
KeyCode_4 = 31,
KeyCode_5 = 32,
KeyCode_6 = 33,
KeyCode_7 = 34,
KeyCode_8 = 35,
KeyCode_9 = 36,
KeyCode_Space = 37,
KeyCode_Tick = 38,
KeyCode_Minus = 39,
KeyCode_Equal = 40,
KeyCode_LeftBracket = 41,
KeyCode_RightBracket = 42,
KeyCode_Semicolon = 43,
KeyCode_Quote = 44,
KeyCode_Comma = 45,
KeyCode_Period = 46,
KeyCode_ForwardSlash = 47,
KeyCode_BackwardSlash = 48,
KeyCode_Tab = 49,
KeyCode_Escape = 50,
KeyCode_Pause = 51,
KeyCode_Up = 52,
KeyCode_Down = 53,
KeyCode_Left = 54,
KeyCode_Right = 55,
KeyCode_Backspace = 56,
KeyCode_Return = 57,
KeyCode_Delete = 58,
KeyCode_Insert = 59,
KeyCode_Home = 60,
KeyCode_End = 61,
KeyCode_PageUp = 62,
KeyCode_PageDown = 63,
KeyCode_CapsLock = 64,
KeyCode_NumLock = 65,
KeyCode_ScrollLock = 66,
KeyCode_Menu = 67,
KeyCode_Shift = 68,
KeyCode_Control = 69,
KeyCode_Alt = 70,
KeyCode_Command = 71,
KeyCode_F1 = 72,
KeyCode_F2 = 73,
KeyCode_F3 = 74,
KeyCode_F4 = 75,
KeyCode_F5 = 76,
KeyCode_F6 = 77,
KeyCode_F7 = 78,
KeyCode_F8 = 79,
KeyCode_F9 = 80,
KeyCode_F10 = 81,
KeyCode_F11 = 82,
KeyCode_F12 = 83,
KeyCode_F13 = 84,
KeyCode_F14 = 85,
KeyCode_F15 = 86,
KeyCode_F16 = 87,
KeyCode_COUNT = 88,
KeyCode_A = 1,
KeyCode_B = 2,
KeyCode_C = 3,
KeyCode_D = 4,
KeyCode_E = 5,
KeyCode_F = 6,
KeyCode_G = 7,
KeyCode_H = 8,
KeyCode_I = 9,
KeyCode_J = 10,
KeyCode_K = 11,
KeyCode_L = 12,
KeyCode_M = 13,
KeyCode_N = 14,
KeyCode_O = 15,
KeyCode_P = 16,
KeyCode_Q = 17,
KeyCode_R = 18,
KeyCode_S = 19,
KeyCode_T = 20,
KeyCode_U = 21,
KeyCode_V = 22,
KeyCode_W = 23,
KeyCode_X = 24,
KeyCode_Y = 25,
KeyCode_Z = 26,
KeyCode_0 = 27,
KeyCode_1 = 28,
KeyCode_2 = 29,
KeyCode_3 = 30,
KeyCode_4 = 31,
KeyCode_5 = 32,
KeyCode_6 = 33,
KeyCode_7 = 34,
KeyCode_8 = 35,
KeyCode_9 = 36,
KeyCode_Space = 37,
KeyCode_Tick = 38,
KeyCode_Minus = 39,
KeyCode_Equal = 40,
KeyCode_LeftBracket = 41,
KeyCode_RightBracket = 42,
KeyCode_Semicolon = 43,
KeyCode_Quote = 44,
KeyCode_Comma = 45,
KeyCode_Period = 46,
KeyCode_ForwardSlash = 47,
KeyCode_BackwardSlash = 48,
KeyCode_Tab = 49,
KeyCode_Escape = 50,
KeyCode_Pause = 51,
KeyCode_Up = 52,
KeyCode_Down = 53,
KeyCode_Left = 54,
KeyCode_Right = 55,
KeyCode_Backspace = 56,
KeyCode_Return = 57,
KeyCode_Delete = 58,
KeyCode_Insert = 59,
KeyCode_Home = 60,
KeyCode_End = 61,
KeyCode_PageUp = 62,
KeyCode_PageDown = 63,
KeyCode_CapsLock = 64,
KeyCode_NumLock = 65,
KeyCode_ScrollLock = 66,
KeyCode_Menu = 67,
KeyCode_Shift = 68,
KeyCode_Control = 69,
KeyCode_Alt = 70,
KeyCode_Command = 71,
KeyCode_F1 = 72,
KeyCode_F2 = 73,
KeyCode_F3 = 74,
KeyCode_F4 = 75,
KeyCode_F5 = 76,
KeyCode_F6 = 77,
KeyCode_F7 = 78,
KeyCode_F8 = 79,
KeyCode_F9 = 80,
KeyCode_F10 = 81,
KeyCode_F11 = 82,
KeyCode_F12 = 83,
KeyCode_F13 = 84,
KeyCode_F14 = 85,
KeyCode_F15 = 86,
KeyCode_F16 = 87,
KeyCode_COUNT = 88,
};
global char* key_code_name[KeyCode_COUNT] = {
"None",
"A",
"B",
"C",
"D",
"E",
"F",
"G",
"H",
"I",
"J",
"K",
"L",
"M",
"N",
"O",
"P",
"Q",
"R",
"S",
"T",
"U",
"V",
"W",
"X",
"Y",
"Z",
"0",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"Space",
"Tick",
"Minus",
"Equal",
"LeftBracket",
"RightBracket",
"Semicolon",
"Quote",
"Comma",
"Period",
"ForwardSlash",
"BackwardSlash",
"Tab",
"Escape",
"Pause",
"Up",
"Down",
"Left",
"Right",
"Backspace",
"Return",
"Delete",
"Insert",
"Home",
"End",
"PageUp",
"PageDown",
"CapsLock",
"NumLock",
"ScrollLock",
"Menu",
"Shift",
"Control",
"Alt",
"Command",
"F1",
"F2",
"F3",
"F4",
"F5",
"F6",
"F7",
"F8",
"F9",
"F10",
"F11",
"F12",
"F13",
"F14",
"F15",
"F16",
"None",
"A",
"B",
"C",
"D",
"E",
"F",
"G",
"H",
"I",
"J",
"K",
"L",
"M",
"N",
"O",
"P",
"Q",
"R",
"S",
"T",
"U",
"V",
"W",
"X",
"Y",
"Z",
"0",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"Space",
"Tick",
"Minus",
"Equal",
"LeftBracket",
"RightBracket",
"Semicolon",
"Quote",
"Comma",
"Period",
"ForwardSlash",
"BackwardSlash",
"Tab",
"Escape",
"Pause",
"Up",
"Down",
"Left",
"Right",
"Backspace",
"Return",
"Delete",
"Insert",
"Home",
"End",
"PageUp",
"PageDown",
"CapsLock",
"NumLock",
"ScrollLock",
"Menu",
"Shift",
"Control",
"Alt",
"Command",
"F1",
"F2",
"F3",
"F4",
"F5",
"F6",
"F7",
"F8",
"F9",
"F10",
"F11",
"F12",
"F13",
"F14",
"F15",
"F16",
};
enum{
MouseCode_Left = 1,
MouseCode_Middle = 2,
MouseCode_Right = 3,
MouseCode_COUNT = 4,
MouseCode_Left = 1,
MouseCode_Middle = 2,
MouseCode_Right = 3,
MouseCode_COUNT = 4,
};
global char* mouse_code_name[MouseCode_COUNT] = {
"None",
"Left",
"Middle",
"Right",
"None",
"Left",
"Middle",
"Right",
};
enum{
CoreCode_Animate = 1,
CoreCode_ClickActivateView = 2,
CoreCode_ClickDeactivateView = 3,
CoreCode_COUNT = 4,
CoreCode_Startup = 1,
CoreCode_Animate = 2,
CoreCode_ClickActivateView = 3,
CoreCode_ClickDeactivateView = 4,
CoreCode_TryExit = 5,
CoreCode_FileExternallyModified = 6,
CoreCode_NewClipboardContents = 7,
CoreCode_COUNT = 8,
};
global char* core_code_name[CoreCode_COUNT] = {
"None",
"Animate",
"ClickActivateView",
"ClickDeactivateView",
"None",
"Startup",
"Animate",
"ClickActivateView",
"ClickDeactivateView",
"TryExit",
"FileExternallyModified",
"NewClipboardContents",
};

View File

@ -2,7 +2,7 @@
#define command_id(c) (fcoder_metacmd_ID_##c)
#define command_metadata(c) (&fcoder_metacmd_table[command_id(c)])
#define command_metadata_by_id(id) (&fcoder_metacmd_table[id])
#define command_one_past_last_id 202
#define command_one_past_last_id 205
#if defined(CUSTOM_COMMAND_SIG)
#define PROC_LINKS(x,y) x
#else
@ -126,6 +126,7 @@ CUSTOM_COMMAND_SIG(redo);
CUSTOM_COMMAND_SIG(undo_all_buffers);
CUSTOM_COMMAND_SIG(redo_all_buffers);
CUSTOM_COMMAND_SIG(open_in_other);
CUSTOM_COMMAND_SIG(default_file_externally_modified);
CUSTOM_COMMAND_SIG(interactive_switch_buffer);
CUSTOM_COMMAND_SIG(interactive_kill_buffer);
CUSTOM_COMMAND_SIG(interactive_open_or_new);
@ -211,6 +212,8 @@ CUSTOM_COMMAND_SIG(miblo_increment_time_stamp);
CUSTOM_COMMAND_SIG(miblo_decrement_time_stamp);
CUSTOM_COMMAND_SIG(miblo_increment_time_stamp_minute);
CUSTOM_COMMAND_SIG(miblo_decrement_time_stamp_minute);
CUSTOM_COMMAND_SIG(default_startup);
CUSTOM_COMMAND_SIG(default_try_exit);
#endif
struct Command_Metadata{
PROC_LINKS(Custom_Command_Function, void) *proc;
@ -222,14 +225,14 @@ char *source_name;
i32 source_name_len;
i32 line_number;
};
static Command_Metadata fcoder_metacmd_table[202] = {
{ PROC_LINKS(default_view_input_handler, 0), "default_view_input_handler", 26, "Input consumption loop for base view behavior", 45, "w:\\4ed\\code\\custom\\4coder_default_hooks.cpp", 43, 17 },
{ PROC_LINKS(seek_beginning_of_textual_line, 0), "seek_beginning_of_textual_line", 30, "Seeks the cursor to the beginning of the line across all text.", 62, "w:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 1976 },
{ PROC_LINKS(seek_end_of_textual_line, 0), "seek_end_of_textual_line", 24, "Seeks the cursor to the end of the line across all text.", 56, "w:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 1982 },
{ PROC_LINKS(seek_beginning_of_line, 0), "seek_beginning_of_line", 22, "Seeks the cursor to the beginning of the visual line.", 53, "w:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 1988 },
{ PROC_LINKS(seek_end_of_line, 0), "seek_end_of_line", 16, "Seeks the cursor to the end of the visual line.", 47, "w:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 1994 },
{ PROC_LINKS(goto_beginning_of_file, 0), "goto_beginning_of_file", 22, "Sets the cursor to the beginning of the file.", 45, "w:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2000 },
{ PROC_LINKS(goto_end_of_file, 0), "goto_end_of_file", 16, "Sets the cursor to the end of the file.", 39, "w:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2008 },
static Command_Metadata fcoder_metacmd_table[205] = {
{ PROC_LINKS(default_view_input_handler, 0), "default_view_input_handler", 26, "Input consumption loop for default view behavior", 48, "w:\\4ed\\code\\custom\\4coder_default_hooks.cpp", 43, 56 },
{ PROC_LINKS(seek_beginning_of_textual_line, 0), "seek_beginning_of_textual_line", 30, "Seeks the cursor to the beginning of the line across all text.", 62, "w:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 1979 },
{ PROC_LINKS(seek_end_of_textual_line, 0), "seek_end_of_textual_line", 24, "Seeks the cursor to the end of the line across all text.", 56, "w:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 1985 },
{ PROC_LINKS(seek_beginning_of_line, 0), "seek_beginning_of_line", 22, "Seeks the cursor to the beginning of the visual line.", 53, "w:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 1991 },
{ PROC_LINKS(seek_end_of_line, 0), "seek_end_of_line", 16, "Seeks the cursor to the end of the visual line.", 47, "w:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 1997 },
{ PROC_LINKS(goto_beginning_of_file, 0), "goto_beginning_of_file", 22, "Sets the cursor to the beginning of the file.", 45, "w:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2003 },
{ PROC_LINKS(goto_end_of_file, 0), "goto_end_of_file", 16, "Sets the cursor to the end of the file.", 39, "w:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2011 },
{ PROC_LINKS(change_active_panel, 0), "change_active_panel", 19, "Change the currently active panel, moving to the panel with the next highest view_id.", 85, "w:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 196 },
{ PROC_LINKS(change_active_panel_backwards, 0), "change_active_panel_backwards", 29, "Change the currently active panel, moving to the panel with the next lowest view_id.", 84, "w:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 206 },
{ PROC_LINKS(open_panel_vsplit, 0), "open_panel_vsplit", 17, "Create a new panel by vertically splitting the active panel.", 60, "w:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 216 },
@ -309,43 +312,44 @@ static Command_Metadata fcoder_metacmd_table[202] = {
{ PROC_LINKS(eol_nixify, 0), "eol_nixify", 10, "Puts the buffer in NIX line ending mode.", 40, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 749 },
{ PROC_LINKS(exit_4coder, 0), "exit_4coder", 11, "Attempts to close 4coder.", 25, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 757 },
{ PROC_LINKS(goto_line, 0), "goto_line", 9, "Queries the user for a number, and jumps the cursor to the corresponding line.", 78, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 765 },
{ PROC_LINKS(search, 0), "search", 6, "Begins an incremental search down through the current buffer for a user specified string.", 89, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 994 },
{ PROC_LINKS(reverse_search, 0), "reverse_search", 14, "Begins an incremental search up through the current buffer for a user specified string.", 87, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1000 },
{ PROC_LINKS(search_identifier, 0), "search_identifier", 17, "Begins an incremental search down through the current buffer for the word or token under the cursor.", 100, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1006 },
{ PROC_LINKS(reverse_search_identifier, 0), "reverse_search_identifier", 25, "Begins an incremental search up through the current buffer for the word or token under the cursor.", 98, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1012 },
{ PROC_LINKS(replace_in_range, 0), "replace_in_range", 16, "Queries the user for a needle and string. Replaces all occurences of needle with string in the range between cursor and the mark in the active buffer.", 150, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1059 },
{ PROC_LINKS(replace_in_buffer, 0), "replace_in_buffer", 17, "Queries the user for a needle and string. Replaces all occurences of needle with string in the active buffer.", 109, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1068 },
{ PROC_LINKS(replace_in_all_buffers, 0), "replace_in_all_buffers", 22, "Queries the user for a needle and string. Replaces all occurences of needle with string in all editable buffers.", 112, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1077 },
{ PROC_LINKS(query_replace, 0), "query_replace", 13, "Queries the user for two strings, and incrementally replaces every occurence of the first string with the second string.", 120, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1167 },
{ PROC_LINKS(query_replace_identifier, 0), "query_replace_identifier", 24, "Queries the user for a string, and incrementally replace every occurence of the word or token found at the cursor with the specified string.", 140, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1188 },
{ PROC_LINKS(query_replace_selection, 0), "query_replace_selection", 23, "Queries the user for a string, and incrementally replace every occurence of the string found in the selected range with the specified string.", 141, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1204 },
{ PROC_LINKS(save_all_dirty_buffers, 0), "save_all_dirty_buffers", 22, "Saves all buffers marked dirty (showing the '*' indicator).", 59, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1239 },
{ PROC_LINKS(delete_file_query, 0), "delete_file_query", 17, "Deletes the file of the current buffer if 4coder has the appropriate access rights. Will ask the user for confirmation first.", 125, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1264 },
{ PROC_LINKS(save_to_query, 0), "save_to_query", 13, "Queries the user for a file name and saves the contents of the current buffer, altering the buffer's name too.", 110, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1308 },
{ PROC_LINKS(rename_file_query, 0), "rename_file_query", 17, "Queries the user for a new name and renames the file of the current buffer, altering the buffer's name too.", 107, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1341 },
{ PROC_LINKS(make_directory_query, 0), "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, 1379 },
{ PROC_LINKS(move_line_up, 0), "move_line_up", 12, "Swaps the line under the cursor with the line above it, and moves the cursor up with it.", 88, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1413 },
{ PROC_LINKS(move_line_down, 0), "move_line_down", 14, "Swaps the line under the cursor with the line below it, and moves the cursor down with it.", 90, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1419 },
{ PROC_LINKS(duplicate_line, 0), "duplicate_line", 14, "Create a copy of the line on which the cursor sits.", 51, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1425 },
{ PROC_LINKS(delete_line, 0), "delete_line", 11, "Delete the line the on which the cursor sits.", 45, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1439 },
{ PROC_LINKS(open_file_in_quotes, 0), "open_file_in_quotes", 19, "Reads a filename from surrounding '\"' characters and attempts to open the corresponding file.", 94, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1504 },
{ PROC_LINKS(open_matching_file_cpp, 0), "open_matching_file_cpp", 22, "If the current file is a *.cpp or *.h, attempts to open the corresponding *.h or *.cpp file in the other view.", 110, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1536 },
{ PROC_LINKS(view_buffer_other_panel, 0), "view_buffer_other_panel", 23, "Set the other non-active panel to view the buffer that the active panel views, and switch to that panel.", 104, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1549 },
{ PROC_LINKS(swap_buffers_between_panels, 0), "swap_buffers_between_panels", 27, "Set the other non-active panel to view the buffer that the active panel views, and switch to that panel.", 104, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1561 },
{ PROC_LINKS(kill_buffer, 0), "kill_buffer", 11, "Kills the current buffer.", 25, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1595 },
{ PROC_LINKS(save, 0), "save", 4, "Saves the current buffer.", 25, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1603 },
{ PROC_LINKS(reopen, 0), "reopen", 6, "Reopen the current buffer from the hard drive.", 46, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1613 },
{ PROC_LINKS(undo, 0), "undo", 4, "Advances backwards through the undo history of the current buffer.", 66, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1842 },
{ PROC_LINKS(redo, 0), "redo", 4, "Advances forwards through the undo history of the current buffer.", 65, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1855 },
{ PROC_LINKS(undo_all_buffers, 0), "undo_all_buffers", 16, "Advances backward through the undo history in the buffer containing the most recent regular edit.", 97, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1869 },
{ PROC_LINKS(redo_all_buffers, 0), "redo_all_buffers", 16, "Advances forward through the undo history in the buffer containing the most recent regular edit.", 96, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1940 },
{ PROC_LINKS(open_in_other, 0), "open_in_other", 13, "Interactively opens a file in the other panel.", 46, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 2041 },
{ PROC_LINKS(interactive_switch_buffer, 0), "interactive_switch_buffer", 25, "Interactively switch to an open buffer.", 39, "w:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 537 },
{ PROC_LINKS(interactive_kill_buffer, 0), "interactive_kill_buffer", 23, "Interactively kill an open buffer.", 34, "w:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 556 },
{ PROC_LINKS(interactive_open_or_new, 0), "interactive_open_or_new", 23, "Interactively open a file out of the file system.", 49, "w:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 627 },
{ PROC_LINKS(interactive_new, 0), "interactive_new", 15, "Interactively creates a new file.", 33, "w:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 666 },
{ PROC_LINKS(interactive_open, 0), "interactive_open", 16, "Interactively opens a file.", 27, "w:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 699 },
{ PROC_LINKS(command_lister, 0), "command_lister", 14, "Opens an interactive list of all registered commands.", 53, "w:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 759 },
{ PROC_LINKS(search, 0), "search", 6, "Begins an incremental search down through the current buffer for a user specified string.", 89, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 993 },
{ PROC_LINKS(reverse_search, 0), "reverse_search", 14, "Begins an incremental search up through the current buffer for a user specified string.", 87, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 999 },
{ PROC_LINKS(search_identifier, 0), "search_identifier", 17, "Begins an incremental search down through the current buffer for the word or token under the cursor.", 100, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1005 },
{ PROC_LINKS(reverse_search_identifier, 0), "reverse_search_identifier", 25, "Begins an incremental search up through the current buffer for the word or token under the cursor.", 98, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1011 },
{ PROC_LINKS(replace_in_range, 0), "replace_in_range", 16, "Queries the user for a needle and string. Replaces all occurences of needle with string in the range between cursor and the mark in the active buffer.", 150, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1058 },
{ PROC_LINKS(replace_in_buffer, 0), "replace_in_buffer", 17, "Queries the user for a needle and string. Replaces all occurences of needle with string in the active buffer.", 109, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1067 },
{ PROC_LINKS(replace_in_all_buffers, 0), "replace_in_all_buffers", 22, "Queries the user for a needle and string. Replaces all occurences of needle with string in all editable buffers.", 112, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1076 },
{ PROC_LINKS(query_replace, 0), "query_replace", 13, "Queries the user for two strings, and incrementally replaces every occurence of the first string with the second string.", 120, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1166 },
{ PROC_LINKS(query_replace_identifier, 0), "query_replace_identifier", 24, "Queries the user for a string, and incrementally replace every occurence of the word or token found at the cursor with the specified string.", 140, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1187 },
{ PROC_LINKS(query_replace_selection, 0), "query_replace_selection", 23, "Queries the user for a string, and incrementally replace every occurence of the string found in the selected range with the specified string.", 141, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1203 },
{ PROC_LINKS(save_all_dirty_buffers, 0), "save_all_dirty_buffers", 22, "Saves all buffers marked dirty (showing the '*' indicator).", 59, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1238 },
{ PROC_LINKS(delete_file_query, 0), "delete_file_query", 17, "Deletes the file of the current buffer if 4coder has the appropriate access rights. Will ask the user for confirmation first.", 125, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1263 },
{ PROC_LINKS(save_to_query, 0), "save_to_query", 13, "Queries the user for a file name and saves the contents of the current buffer, altering the buffer's name too.", 110, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1307 },
{ PROC_LINKS(rename_file_query, 0), "rename_file_query", 17, "Queries the user for a new name and renames the file of the current buffer, altering the buffer's name too.", 107, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1340 },
{ PROC_LINKS(make_directory_query, 0), "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, 1378 },
{ PROC_LINKS(move_line_up, 0), "move_line_up", 12, "Swaps the line under the cursor with the line above it, and moves the cursor up with it.", 88, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1412 },
{ PROC_LINKS(move_line_down, 0), "move_line_down", 14, "Swaps the line under the cursor with the line below it, and moves the cursor down with it.", 90, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1418 },
{ PROC_LINKS(duplicate_line, 0), "duplicate_line", 14, "Create a copy of the line on which the cursor sits.", 51, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1424 },
{ PROC_LINKS(delete_line, 0), "delete_line", 11, "Delete the line the on which the cursor sits.", 45, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1438 },
{ PROC_LINKS(open_file_in_quotes, 0), "open_file_in_quotes", 19, "Reads a filename from surrounding '\"' characters and attempts to open the corresponding file.", 94, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1503 },
{ PROC_LINKS(open_matching_file_cpp, 0), "open_matching_file_cpp", 22, "If the current file is a *.cpp or *.h, attempts to open the corresponding *.h or *.cpp file in the other view.", 110, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1535 },
{ PROC_LINKS(view_buffer_other_panel, 0), "view_buffer_other_panel", 23, "Set the other non-active panel to view the buffer that the active panel views, and switch to that panel.", 104, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1548 },
{ PROC_LINKS(swap_buffers_between_panels, 0), "swap_buffers_between_panels", 27, "Set the other non-active panel to view the buffer that the active panel views, and switch to that panel.", 104, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1560 },
{ PROC_LINKS(kill_buffer, 0), "kill_buffer", 11, "Kills the current buffer.", 25, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1594 },
{ PROC_LINKS(save, 0), "save", 4, "Saves the current buffer.", 25, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1602 },
{ PROC_LINKS(reopen, 0), "reopen", 6, "Reopen the current buffer from the hard drive.", 46, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1612 },
{ PROC_LINKS(undo, 0), "undo", 4, "Advances backwards through the undo history of the current buffer.", 66, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1841 },
{ PROC_LINKS(redo, 0), "redo", 4, "Advances forwards through the undo history of the current buffer.", 65, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1854 },
{ PROC_LINKS(undo_all_buffers, 0), "undo_all_buffers", 16, "Advances backward through the undo history in the buffer containing the most recent regular edit.", 97, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1868 },
{ PROC_LINKS(redo_all_buffers, 0), "redo_all_buffers", 16, "Advances forward through the undo history in the buffer containing the most recent regular edit.", 96, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1939 },
{ PROC_LINKS(open_in_other, 0), "open_in_other", 13, "Interactively opens a file in the other panel.", 46, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 2040 },
{ PROC_LINKS(default_file_externally_modified, 0), "default_file_externally_modified", 32, "Notes the external modification of attached files by printing a message.", 72, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 2047 },
{ PROC_LINKS(interactive_switch_buffer, 0), "interactive_switch_buffer", 25, "Interactively switch to an open buffer.", 39, "w:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 552 },
{ PROC_LINKS(interactive_kill_buffer, 0), "interactive_kill_buffer", 23, "Interactively kill an open buffer.", 34, "w:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 571 },
{ PROC_LINKS(interactive_open_or_new, 0), "interactive_open_or_new", 23, "Interactively open a file out of the file system.", 49, "w:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 642 },
{ PROC_LINKS(interactive_new, 0), "interactive_new", 15, "Interactively creates a new file.", 33, "w:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 681 },
{ PROC_LINKS(interactive_open, 0), "interactive_open", 16, "Interactively opens a file.", 27, "w:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 714 },
{ PROC_LINKS(command_lister, 0), "command_lister", 14, "Opens an interactive list of all registered commands.", 53, "w:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 774 },
{ PROC_LINKS(auto_indent_whole_file, 0), "auto_indent_whole_file", 22, "Audo-indents the entire current buffer.", 39, "w:\\4ed\\code\\custom\\4coder_auto_indent.cpp", 41, 356 },
{ PROC_LINKS(auto_indent_line_at_cursor, 0), "auto_indent_line_at_cursor", 26, "Auto-indents the line on which the cursor sits.", 47, "w:\\4ed\\code\\custom\\4coder_auto_indent.cpp", 41, 365 },
{ PROC_LINKS(auto_indent_range, 0), "auto_indent_range", 17, "Auto-indents the range between the cursor and the mark.", 55, "w:\\4ed\\code\\custom\\4coder_auto_indent.cpp", 41, 375 },
@ -425,6 +429,8 @@ static Command_Metadata fcoder_metacmd_table[202] = {
{ PROC_LINKS(miblo_decrement_time_stamp, 0), "miblo_decrement_time_stamp", 26, "Decrement a time stamp under the cursor by one second. (format [m]m:ss or h:mm:ss", 81, "w:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 237 },
{ PROC_LINKS(miblo_increment_time_stamp_minute, 0), "miblo_increment_time_stamp_minute", 33, "Increment a time stamp under the cursor by one minute. (format [m]m:ss or h:mm:ss", 81, "w:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 243 },
{ PROC_LINKS(miblo_decrement_time_stamp_minute, 0), "miblo_decrement_time_stamp_minute", 33, "Decrement a time stamp under the cursor by one minute. (format [m]m:ss or h:mm:ss", 81, "w:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 249 },
{ PROC_LINKS(default_startup, 0), "default_startup", 15, "Default command for responding to a startup event", 49, "w:\\4ed\\code\\custom\\4coder_default_hooks.cpp", 43, 7 },
{ PROC_LINKS(default_try_exit, 0), "default_try_exit", 16, "Default command for responding to a try-exit event", 50, "w:\\4ed\\code\\custom\\4coder_default_hooks.cpp", 43, 21 },
};
static i32 fcoder_metacmd_ID_default_view_input_handler = 0;
static i32 fcoder_metacmd_ID_seek_beginning_of_textual_line = 1;
@ -543,89 +549,92 @@ static i32 fcoder_metacmd_ID_redo = 113;
static i32 fcoder_metacmd_ID_undo_all_buffers = 114;
static i32 fcoder_metacmd_ID_redo_all_buffers = 115;
static i32 fcoder_metacmd_ID_open_in_other = 116;
static i32 fcoder_metacmd_ID_interactive_switch_buffer = 117;
static i32 fcoder_metacmd_ID_interactive_kill_buffer = 118;
static i32 fcoder_metacmd_ID_interactive_open_or_new = 119;
static i32 fcoder_metacmd_ID_interactive_new = 120;
static i32 fcoder_metacmd_ID_interactive_open = 121;
static i32 fcoder_metacmd_ID_command_lister = 122;
static i32 fcoder_metacmd_ID_auto_indent_whole_file = 123;
static i32 fcoder_metacmd_ID_auto_indent_line_at_cursor = 124;
static i32 fcoder_metacmd_ID_auto_indent_range = 125;
static i32 fcoder_metacmd_ID_write_text_and_auto_indent = 126;
static i32 fcoder_metacmd_ID_list_all_locations = 127;
static i32 fcoder_metacmd_ID_list_all_substring_locations = 128;
static i32 fcoder_metacmd_ID_list_all_locations_case_insensitive = 129;
static i32 fcoder_metacmd_ID_list_all_substring_locations_case_insensitive = 130;
static i32 fcoder_metacmd_ID_list_all_locations_of_identifier = 131;
static i32 fcoder_metacmd_ID_list_all_locations_of_identifier_case_insensitive = 132;
static i32 fcoder_metacmd_ID_list_all_locations_of_selection = 133;
static i32 fcoder_metacmd_ID_list_all_locations_of_selection_case_insensitive = 134;
static i32 fcoder_metacmd_ID_list_all_locations_of_type_definition = 135;
static i32 fcoder_metacmd_ID_list_all_locations_of_type_definition_of_identifier = 136;
static i32 fcoder_metacmd_ID_word_complete = 137;
static i32 fcoder_metacmd_ID_goto_jump_at_cursor = 138;
static i32 fcoder_metacmd_ID_goto_jump_at_cursor_same_panel = 139;
static i32 fcoder_metacmd_ID_goto_next_jump = 140;
static i32 fcoder_metacmd_ID_goto_prev_jump = 141;
static i32 fcoder_metacmd_ID_goto_next_jump_no_skips = 142;
static i32 fcoder_metacmd_ID_goto_prev_jump_no_skips = 143;
static i32 fcoder_metacmd_ID_goto_first_jump = 144;
static i32 fcoder_metacmd_ID_goto_first_jump_same_panel_sticky = 145;
static i32 fcoder_metacmd_ID_if_read_only_goto_position = 146;
static i32 fcoder_metacmd_ID_if_read_only_goto_position_same_panel = 147;
static i32 fcoder_metacmd_ID_view_jump_list_with_lister = 148;
static i32 fcoder_metacmd_ID_show_the_log_graph = 149;
static i32 fcoder_metacmd_ID_copy = 150;
static i32 fcoder_metacmd_ID_cut = 151;
static i32 fcoder_metacmd_ID_paste = 152;
static i32 fcoder_metacmd_ID_paste_next = 153;
static i32 fcoder_metacmd_ID_paste_and_indent = 154;
static i32 fcoder_metacmd_ID_paste_next_and_indent = 155;
static i32 fcoder_metacmd_ID_execute_previous_cli = 156;
static i32 fcoder_metacmd_ID_execute_any_cli = 157;
static i32 fcoder_metacmd_ID_build_search = 158;
static i32 fcoder_metacmd_ID_build_in_build_panel = 159;
static i32 fcoder_metacmd_ID_close_build_panel = 160;
static i32 fcoder_metacmd_ID_change_to_build_panel = 161;
static i32 fcoder_metacmd_ID_close_all_code = 162;
static i32 fcoder_metacmd_ID_open_all_code = 163;
static i32 fcoder_metacmd_ID_open_all_code_recursive = 164;
static i32 fcoder_metacmd_ID_load_project = 165;
static i32 fcoder_metacmd_ID_project_fkey_command = 166;
static i32 fcoder_metacmd_ID_project_go_to_root_directory = 167;
static i32 fcoder_metacmd_ID_setup_new_project = 168;
static i32 fcoder_metacmd_ID_setup_build_bat = 169;
static i32 fcoder_metacmd_ID_setup_build_sh = 170;
static i32 fcoder_metacmd_ID_setup_build_bat_and_sh = 171;
static i32 fcoder_metacmd_ID_project_command_lister = 172;
static i32 fcoder_metacmd_ID_list_all_functions_current_buffer = 173;
static i32 fcoder_metacmd_ID_list_all_functions_current_buffer_lister = 174;
static i32 fcoder_metacmd_ID_list_all_functions_all_buffers = 175;
static i32 fcoder_metacmd_ID_list_all_functions_all_buffers_lister = 176;
static i32 fcoder_metacmd_ID_select_surrounding_scope = 177;
static i32 fcoder_metacmd_ID_select_next_scope_absolute = 178;
static i32 fcoder_metacmd_ID_select_next_scope_after_current = 179;
static i32 fcoder_metacmd_ID_select_prev_scope_absolute = 180;
static i32 fcoder_metacmd_ID_place_in_scope = 181;
static i32 fcoder_metacmd_ID_delete_current_scope = 182;
static i32 fcoder_metacmd_ID_open_long_braces = 183;
static i32 fcoder_metacmd_ID_open_long_braces_semicolon = 184;
static i32 fcoder_metacmd_ID_open_long_braces_break = 185;
static i32 fcoder_metacmd_ID_if0_off = 186;
static i32 fcoder_metacmd_ID_write_todo = 187;
static i32 fcoder_metacmd_ID_write_hack = 188;
static i32 fcoder_metacmd_ID_write_note = 189;
static i32 fcoder_metacmd_ID_write_block = 190;
static i32 fcoder_metacmd_ID_write_zero_struct = 191;
static i32 fcoder_metacmd_ID_comment_line = 192;
static i32 fcoder_metacmd_ID_uncomment_line = 193;
static i32 fcoder_metacmd_ID_comment_line_toggle = 194;
static i32 fcoder_metacmd_ID_snippet_lister = 195;
static i32 fcoder_metacmd_ID_miblo_increment_basic = 196;
static i32 fcoder_metacmd_ID_miblo_decrement_basic = 197;
static i32 fcoder_metacmd_ID_miblo_increment_time_stamp = 198;
static i32 fcoder_metacmd_ID_miblo_decrement_time_stamp = 199;
static i32 fcoder_metacmd_ID_miblo_increment_time_stamp_minute = 200;
static i32 fcoder_metacmd_ID_miblo_decrement_time_stamp_minute = 201;
static i32 fcoder_metacmd_ID_default_file_externally_modified = 117;
static i32 fcoder_metacmd_ID_interactive_switch_buffer = 118;
static i32 fcoder_metacmd_ID_interactive_kill_buffer = 119;
static i32 fcoder_metacmd_ID_interactive_open_or_new = 120;
static i32 fcoder_metacmd_ID_interactive_new = 121;
static i32 fcoder_metacmd_ID_interactive_open = 122;
static i32 fcoder_metacmd_ID_command_lister = 123;
static i32 fcoder_metacmd_ID_auto_indent_whole_file = 124;
static i32 fcoder_metacmd_ID_auto_indent_line_at_cursor = 125;
static i32 fcoder_metacmd_ID_auto_indent_range = 126;
static i32 fcoder_metacmd_ID_write_text_and_auto_indent = 127;
static i32 fcoder_metacmd_ID_list_all_locations = 128;
static i32 fcoder_metacmd_ID_list_all_substring_locations = 129;
static i32 fcoder_metacmd_ID_list_all_locations_case_insensitive = 130;
static i32 fcoder_metacmd_ID_list_all_substring_locations_case_insensitive = 131;
static i32 fcoder_metacmd_ID_list_all_locations_of_identifier = 132;
static i32 fcoder_metacmd_ID_list_all_locations_of_identifier_case_insensitive = 133;
static i32 fcoder_metacmd_ID_list_all_locations_of_selection = 134;
static i32 fcoder_metacmd_ID_list_all_locations_of_selection_case_insensitive = 135;
static i32 fcoder_metacmd_ID_list_all_locations_of_type_definition = 136;
static i32 fcoder_metacmd_ID_list_all_locations_of_type_definition_of_identifier = 137;
static i32 fcoder_metacmd_ID_word_complete = 138;
static i32 fcoder_metacmd_ID_goto_jump_at_cursor = 139;
static i32 fcoder_metacmd_ID_goto_jump_at_cursor_same_panel = 140;
static i32 fcoder_metacmd_ID_goto_next_jump = 141;
static i32 fcoder_metacmd_ID_goto_prev_jump = 142;
static i32 fcoder_metacmd_ID_goto_next_jump_no_skips = 143;
static i32 fcoder_metacmd_ID_goto_prev_jump_no_skips = 144;
static i32 fcoder_metacmd_ID_goto_first_jump = 145;
static i32 fcoder_metacmd_ID_goto_first_jump_same_panel_sticky = 146;
static i32 fcoder_metacmd_ID_if_read_only_goto_position = 147;
static i32 fcoder_metacmd_ID_if_read_only_goto_position_same_panel = 148;
static i32 fcoder_metacmd_ID_view_jump_list_with_lister = 149;
static i32 fcoder_metacmd_ID_show_the_log_graph = 150;
static i32 fcoder_metacmd_ID_copy = 151;
static i32 fcoder_metacmd_ID_cut = 152;
static i32 fcoder_metacmd_ID_paste = 153;
static i32 fcoder_metacmd_ID_paste_next = 154;
static i32 fcoder_metacmd_ID_paste_and_indent = 155;
static i32 fcoder_metacmd_ID_paste_next_and_indent = 156;
static i32 fcoder_metacmd_ID_execute_previous_cli = 157;
static i32 fcoder_metacmd_ID_execute_any_cli = 158;
static i32 fcoder_metacmd_ID_build_search = 159;
static i32 fcoder_metacmd_ID_build_in_build_panel = 160;
static i32 fcoder_metacmd_ID_close_build_panel = 161;
static i32 fcoder_metacmd_ID_change_to_build_panel = 162;
static i32 fcoder_metacmd_ID_close_all_code = 163;
static i32 fcoder_metacmd_ID_open_all_code = 164;
static i32 fcoder_metacmd_ID_open_all_code_recursive = 165;
static i32 fcoder_metacmd_ID_load_project = 166;
static i32 fcoder_metacmd_ID_project_fkey_command = 167;
static i32 fcoder_metacmd_ID_project_go_to_root_directory = 168;
static i32 fcoder_metacmd_ID_setup_new_project = 169;
static i32 fcoder_metacmd_ID_setup_build_bat = 170;
static i32 fcoder_metacmd_ID_setup_build_sh = 171;
static i32 fcoder_metacmd_ID_setup_build_bat_and_sh = 172;
static i32 fcoder_metacmd_ID_project_command_lister = 173;
static i32 fcoder_metacmd_ID_list_all_functions_current_buffer = 174;
static i32 fcoder_metacmd_ID_list_all_functions_current_buffer_lister = 175;
static i32 fcoder_metacmd_ID_list_all_functions_all_buffers = 176;
static i32 fcoder_metacmd_ID_list_all_functions_all_buffers_lister = 177;
static i32 fcoder_metacmd_ID_select_surrounding_scope = 178;
static i32 fcoder_metacmd_ID_select_next_scope_absolute = 179;
static i32 fcoder_metacmd_ID_select_next_scope_after_current = 180;
static i32 fcoder_metacmd_ID_select_prev_scope_absolute = 181;
static i32 fcoder_metacmd_ID_place_in_scope = 182;
static i32 fcoder_metacmd_ID_delete_current_scope = 183;
static i32 fcoder_metacmd_ID_open_long_braces = 184;
static i32 fcoder_metacmd_ID_open_long_braces_semicolon = 185;
static i32 fcoder_metacmd_ID_open_long_braces_break = 186;
static i32 fcoder_metacmd_ID_if0_off = 187;
static i32 fcoder_metacmd_ID_write_todo = 188;
static i32 fcoder_metacmd_ID_write_hack = 189;
static i32 fcoder_metacmd_ID_write_note = 190;
static i32 fcoder_metacmd_ID_write_block = 191;
static i32 fcoder_metacmd_ID_write_zero_struct = 192;
static i32 fcoder_metacmd_ID_comment_line = 193;
static i32 fcoder_metacmd_ID_uncomment_line = 194;
static i32 fcoder_metacmd_ID_comment_line_toggle = 195;
static i32 fcoder_metacmd_ID_snippet_lister = 196;
static i32 fcoder_metacmd_ID_miblo_increment_basic = 197;
static i32 fcoder_metacmd_ID_miblo_decrement_basic = 198;
static i32 fcoder_metacmd_ID_miblo_increment_time_stamp = 199;
static i32 fcoder_metacmd_ID_miblo_decrement_time_stamp = 200;
static i32 fcoder_metacmd_ID_miblo_increment_time_stamp_minute = 201;
static i32 fcoder_metacmd_ID_miblo_decrement_time_stamp_minute = 202;
static i32 fcoder_metacmd_ID_default_startup = 203;
static i32 fcoder_metacmd_ID_default_try_exit = 204;
#endif

View File

@ -111,10 +111,11 @@ vtable->managed_object_get_containing_scope = managed_object_get_containing_scop
vtable->managed_object_free = managed_object_free;
vtable->managed_object_store_data = managed_object_store_data;
vtable->managed_object_load_data = managed_object_load_data;
vtable->get_user_input = get_user_input;
vtable->get_command_input = get_command_input;
vtable->set_command_input = set_command_input;
vtable->leave_command_input_unhandled = leave_command_input_unhandled;
vtable->get_next_input = get_next_input;
vtable->get_current_input_sequence_number = get_current_input_sequence_number;
vtable->get_current_input = get_current_input;
vtable->set_current_input = set_current_input;
vtable->leave_current_input_unhandled = leave_current_input_unhandled;
vtable->set_custom_hook = set_custom_hook;
vtable->get_mouse_state = get_mouse_state;
vtable->get_active_query_bars = get_active_query_bars;
@ -282,10 +283,11 @@ managed_object_get_containing_scope = vtable->managed_object_get_containing_scop
managed_object_free = vtable->managed_object_free;
managed_object_store_data = vtable->managed_object_store_data;
managed_object_load_data = vtable->managed_object_load_data;
get_user_input = vtable->get_user_input;
get_command_input = vtable->get_command_input;
set_command_input = vtable->set_command_input;
leave_command_input_unhandled = vtable->leave_command_input_unhandled;
get_next_input = vtable->get_next_input;
get_current_input_sequence_number = vtable->get_current_input_sequence_number;
get_current_input = vtable->get_current_input;
set_current_input = vtable->set_current_input;
leave_current_input_unhandled = vtable->leave_current_input_unhandled;
set_custom_hook = vtable->set_custom_hook;
get_mouse_state = vtable->get_mouse_state;
get_active_query_bars = vtable->get_active_query_bars;

View File

@ -109,10 +109,11 @@
#define custom_managed_object_free_sig() b32 custom_managed_object_free(Application_Links* app, Managed_Object object)
#define custom_managed_object_store_data_sig() b32 custom_managed_object_store_data(Application_Links* app, Managed_Object object, u32 first_index, u32 count, void* mem)
#define custom_managed_object_load_data_sig() b32 custom_managed_object_load_data(Application_Links* app, Managed_Object object, u32 first_index, u32 count, void* mem_out)
#define custom_get_user_input_sig() User_Input custom_get_user_input(Application_Links* app, Event_Property get_properties, Event_Property abort_properties)
#define custom_get_command_input_sig() User_Input custom_get_command_input(Application_Links* app)
#define custom_set_command_input_sig() void custom_set_command_input(Application_Links* app, Input_Event* event)
#define custom_leave_command_input_unhandled_sig() void custom_leave_command_input_unhandled(Application_Links* app)
#define custom_get_next_input_sig() User_Input custom_get_next_input(Application_Links* app, Event_Property get_properties, Event_Property abort_properties)
#define custom_get_current_input_sequence_number_sig() i64 custom_get_current_input_sequence_number(Application_Links* app)
#define custom_get_current_input_sig() User_Input custom_get_current_input(Application_Links* app)
#define custom_set_current_input_sig() void custom_set_current_input(Application_Links* app, User_Input* input)
#define custom_leave_current_input_unhandled_sig() void custom_leave_current_input_unhandled(Application_Links* app)
#define custom_set_custom_hook_sig() void custom_set_custom_hook(Application_Links* app, Hook_ID hook_id, Void_Func* func_ptr)
#define custom_get_mouse_state_sig() Mouse_State custom_get_mouse_state(Application_Links* app)
#define custom_get_active_query_bars_sig() b32 custom_get_active_query_bars(Application_Links* app, View_ID view_id, i32 max_result_count, Query_Bar_Ptr_Array* array_out)
@ -276,10 +277,11 @@ typedef Managed_Scope custom_managed_object_get_containing_scope_type(Applicatio
typedef b32 custom_managed_object_free_type(Application_Links* app, Managed_Object object);
typedef b32 custom_managed_object_store_data_type(Application_Links* app, Managed_Object object, u32 first_index, u32 count, void* mem);
typedef b32 custom_managed_object_load_data_type(Application_Links* app, Managed_Object object, u32 first_index, u32 count, void* mem_out);
typedef User_Input custom_get_user_input_type(Application_Links* app, Event_Property get_properties, Event_Property abort_properties);
typedef User_Input custom_get_command_input_type(Application_Links* app);
typedef void custom_set_command_input_type(Application_Links* app, Input_Event* event);
typedef void custom_leave_command_input_unhandled_type(Application_Links* app);
typedef User_Input custom_get_next_input_type(Application_Links* app, Event_Property get_properties, Event_Property abort_properties);
typedef i64 custom_get_current_input_sequence_number_type(Application_Links* app);
typedef User_Input custom_get_current_input_type(Application_Links* app);
typedef void custom_set_current_input_type(Application_Links* app, User_Input* input);
typedef void custom_leave_current_input_unhandled_type(Application_Links* app);
typedef void custom_set_custom_hook_type(Application_Links* app, Hook_ID hook_id, Void_Func* func_ptr);
typedef Mouse_State custom_get_mouse_state_type(Application_Links* app);
typedef b32 custom_get_active_query_bars_type(Application_Links* app, View_ID view_id, i32 max_result_count, Query_Bar_Ptr_Array* array_out);
@ -444,10 +446,11 @@ custom_managed_object_get_containing_scope_type *managed_object_get_containing_s
custom_managed_object_free_type *managed_object_free;
custom_managed_object_store_data_type *managed_object_store_data;
custom_managed_object_load_data_type *managed_object_load_data;
custom_get_user_input_type *get_user_input;
custom_get_command_input_type *get_command_input;
custom_set_command_input_type *set_command_input;
custom_leave_command_input_unhandled_type *leave_command_input_unhandled;
custom_get_next_input_type *get_next_input;
custom_get_current_input_sequence_number_type *get_current_input_sequence_number;
custom_get_current_input_type *get_current_input;
custom_set_current_input_type *set_current_input;
custom_leave_current_input_unhandled_type *leave_current_input_unhandled;
custom_set_custom_hook_type *set_custom_hook;
custom_get_mouse_state_type *get_mouse_state;
custom_get_active_query_bars_type *get_active_query_bars;
@ -613,10 +616,11 @@ internal Managed_Scope managed_object_get_containing_scope(Application_Links* ap
internal b32 managed_object_free(Application_Links* app, Managed_Object object);
internal b32 managed_object_store_data(Application_Links* app, Managed_Object object, u32 first_index, u32 count, void* mem);
internal b32 managed_object_load_data(Application_Links* app, Managed_Object object, u32 first_index, u32 count, void* mem_out);
internal User_Input get_user_input(Application_Links* app, Event_Property get_properties, Event_Property abort_properties);
internal User_Input get_command_input(Application_Links* app);
internal void set_command_input(Application_Links* app, Input_Event* event);
internal void leave_command_input_unhandled(Application_Links* app);
internal User_Input get_next_input(Application_Links* app, Event_Property get_properties, Event_Property abort_properties);
internal i64 get_current_input_sequence_number(Application_Links* app);
internal User_Input get_current_input(Application_Links* app);
internal void set_current_input(Application_Links* app, User_Input* input);
internal void leave_current_input_unhandled(Application_Links* app);
internal void set_custom_hook(Application_Links* app, Hook_ID hook_id, Void_Func* func_ptr);
internal Mouse_State get_mouse_state(Application_Links* app);
internal b32 get_active_query_bars(Application_Links* app, View_ID view_id, i32 max_result_count, Query_Bar_Ptr_Array* array_out);
@ -782,10 +786,11 @@ global custom_managed_object_get_containing_scope_type *managed_object_get_conta
global custom_managed_object_free_type *managed_object_free = 0;
global custom_managed_object_store_data_type *managed_object_store_data = 0;
global custom_managed_object_load_data_type *managed_object_load_data = 0;
global custom_get_user_input_type *get_user_input = 0;
global custom_get_command_input_type *get_command_input = 0;
global custom_set_command_input_type *set_command_input = 0;
global custom_leave_command_input_unhandled_type *leave_command_input_unhandled = 0;
global custom_get_next_input_type *get_next_input = 0;
global custom_get_current_input_sequence_number_type *get_current_input_sequence_number = 0;
global custom_get_current_input_type *get_current_input = 0;
global custom_set_current_input_type *set_current_input = 0;
global custom_leave_current_input_unhandled_type *leave_current_input_unhandled = 0;
global custom_set_custom_hook_type *set_custom_hook = 0;
global custom_get_mouse_state_type *get_mouse_state = 0;
global custom_get_active_query_bars_type *get_active_query_bars = 0;

View File

@ -109,10 +109,11 @@ api(custom) function Managed_Scope managed_object_get_containing_scope(Applicati
api(custom) function b32 managed_object_free(Application_Links* app, Managed_Object object);
api(custom) function b32 managed_object_store_data(Application_Links* app, Managed_Object object, u32 first_index, u32 count, void* mem);
api(custom) function b32 managed_object_load_data(Application_Links* app, Managed_Object object, u32 first_index, u32 count, void* mem_out);
api(custom) function User_Input get_user_input(Application_Links* app, Event_Property get_properties, Event_Property abort_properties);
api(custom) function User_Input get_command_input(Application_Links* app);
api(custom) function void set_command_input(Application_Links* app, Input_Event* event);
api(custom) function void leave_command_input_unhandled(Application_Links* app);
api(custom) function User_Input get_next_input(Application_Links* app, Event_Property get_properties, Event_Property abort_properties);
api(custom) function i64 get_current_input_sequence_number(Application_Links* app);
api(custom) function User_Input get_current_input(Application_Links* app);
api(custom) function void set_current_input(Application_Links* app, User_Input* input);
api(custom) function void leave_current_input_unhandled(Application_Links* app);
api(custom) function void set_custom_hook(Application_Links* app, Hook_ID hook_id, Void_Func* func_ptr);
api(custom) function Mouse_State get_mouse_state(Application_Links* app);
api(custom) function b32 get_active_query_bars(Application_Links* app, View_ID view_id, i32 max_result_count, Query_Bar_Ptr_Array* array_out);

View File

@ -10,6 +10,8 @@ setup_default_mapping(Mapping *mapping){
SelectMapping(mapping);
SelectMap(mapid_global);
BindCore(default_startup , CoreCode_Startup);
BindCore(default_try_exit, CoreCode_TryExit);
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);