Lots of progress on the profiler; no more infinite recursion in listers
This commit is contained in:
parent
6bc43256c6
commit
323782f7f7
|
@ -31,7 +31,7 @@ coroutine_main(void *ptr){
|
||||||
Coroutine *me = (Coroutine*)ptr;
|
Coroutine *me = (Coroutine*)ptr;
|
||||||
|
|
||||||
Thread_Context tctx_ = {};
|
Thread_Context tctx_ = {};
|
||||||
thread_ctx_init(&tctx_, get_base_allocator_system());
|
thread_ctx_init(&tctx_, get_base_allocator_system(), get_base_allocator_system());
|
||||||
me->tctx = &tctx_;
|
me->tctx = &tctx_;
|
||||||
|
|
||||||
// NOTE(allen): Init handshake
|
// NOTE(allen): Init handshake
|
||||||
|
|
|
@ -2397,6 +2397,15 @@ rect_range_y(Rect_f32 r){
|
||||||
return(If32(r.y0, r.y1));
|
return(If32(r.y0, r.y1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal i32
|
||||||
|
rect_area(Rect_i32 r){
|
||||||
|
return((r.x1 - r.x0)*(r.y1 - r.y0));
|
||||||
|
}
|
||||||
|
internal f32
|
||||||
|
rect_area(Rect_f32 r){
|
||||||
|
return((r.x1 - r.x0)*(r.y1 - r.y0));
|
||||||
|
}
|
||||||
|
|
||||||
internal b32
|
internal b32
|
||||||
rect_overlap(Rect_i32 a, Rect_i32 b){
|
rect_overlap(Rect_i32 a, Rect_i32 b){
|
||||||
return(range_overlap(rect_range_x(a), rect_range_x(b)) &&
|
return(range_overlap(rect_range_x(a), rect_range_x(b)) &&
|
||||||
|
@ -2825,10 +2834,15 @@ end_temp(Temp_Memory temp){
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
thread_ctx_init(Thread_Context *tctx, Base_Allocator *allocator){
|
thread_ctx_init(Thread_Context *tctx, Base_Allocator *allocator,
|
||||||
|
Base_Allocator *prof_allocator){
|
||||||
block_zero_struct(tctx);
|
block_zero_struct(tctx);
|
||||||
tctx->allocator = allocator;
|
tctx->allocator = allocator;
|
||||||
tctx->node_arena = make_arena(allocator, KB(4), 8);
|
tctx->node_arena = make_arena(allocator, KB(4), 8);
|
||||||
|
|
||||||
|
tctx->prof_allocator = prof_allocator;
|
||||||
|
tctx->prof_id_counter = 1;
|
||||||
|
tctx->prof_arena = make_arena(prof_allocator, KB(4));
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
|
|
|
@ -1126,17 +1126,60 @@ struct Temp_Memory{
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
////////////////////////////////
|
struct Arena_Node{
|
||||||
|
|
||||||
union Arena_Node{
|
|
||||||
Arena_Node *next;
|
Arena_Node *next;
|
||||||
Arena arena;
|
Arena arena;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
////////////////////////////////
|
||||||
|
|
||||||
|
typedef u64 Profile_ID;
|
||||||
|
struct Profile_Record{
|
||||||
|
Profile_Record *next;
|
||||||
|
Profile_ID id;
|
||||||
|
u64 time;
|
||||||
|
String_Const_u8 location;
|
||||||
|
String_Const_u8 name;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Profile_Thread{
|
||||||
|
Profile_Thread *next;
|
||||||
|
Profile_Record *first_record;
|
||||||
|
Profile_Record *last_record;
|
||||||
|
i32 record_count;
|
||||||
|
i32 thread_id;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef u32 Profile_Enable_Flag;
|
||||||
|
enum{
|
||||||
|
ProfileEnable_UserBit = 0x1,
|
||||||
|
ProfileEnable_InspectBit = 0x2,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Profile_Global_List{
|
||||||
|
Arena node_arena;
|
||||||
|
Arena_Node *first_arena;
|
||||||
|
Arena_Node *last_arena;
|
||||||
|
Profile_Thread *first_thread;
|
||||||
|
Profile_Thread *last_thread;
|
||||||
|
i32 thread_count;
|
||||||
|
Profile_Enable_Flag disable_bits;
|
||||||
|
};
|
||||||
|
|
||||||
|
////////////////////////////////
|
||||||
|
|
||||||
struct Thread_Context{
|
struct Thread_Context{
|
||||||
Base_Allocator *allocator;
|
Base_Allocator *allocator;
|
||||||
Arena node_arena;
|
Arena node_arena;
|
||||||
Arena_Node *free_arenas;
|
Arena_Node *free_arenas;
|
||||||
Arena *sharable_scratch;
|
Arena *sharable_scratch;
|
||||||
|
|
||||||
|
Base_Allocator *prof_allocator;
|
||||||
|
Profile_ID prof_id_counter;
|
||||||
|
Arena prof_arena;
|
||||||
|
Profile_Record *prof_first;
|
||||||
|
Profile_Record *prof_last;
|
||||||
|
i32 prof_record_count;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef i32 Scratch_Share_Code;
|
typedef i32 Scratch_Share_Code;
|
||||||
|
|
|
@ -18,7 +18,7 @@ custom_layer_init(Application_Links *app){
|
||||||
Thread_Context *tctx = get_thread_context(app);
|
Thread_Context *tctx = get_thread_context(app);
|
||||||
mapping_init(tctx, &framework_mapping);
|
mapping_init(tctx, &framework_mapping);
|
||||||
setup_default_mapping(&framework_mapping);
|
setup_default_mapping(&framework_mapping);
|
||||||
profile_history_init();
|
global_prof_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -149,6 +149,16 @@ get_next_view_after_active(Application_Links *app, Access_Flag access){
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
|
||||||
|
static void
|
||||||
|
call_after_ui_shutdown(Application_Links *app, View_ID view, Custom_Command_Function *func){
|
||||||
|
Managed_Scope scope = view_get_managed_scope(app, view);
|
||||||
|
Custom_Command_Function **call_next =
|
||||||
|
scope_attachment(app, scope, view_call_next, Custom_Command_Function*);
|
||||||
|
*call_next = func;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////
|
||||||
|
|
||||||
static void
|
static void
|
||||||
view_buffer_set(Application_Links *app, Buffer_ID *buffers, i32 *positions, i32 count){
|
view_buffer_set(Application_Links *app, Buffer_ID *buffers, i32 *positions, i32 count){
|
||||||
if (count > 0){
|
if (count > 0){
|
||||||
|
@ -382,6 +392,7 @@ default_4coder_initialize(Application_Links *app, String_Const_u8_Array file_nam
|
||||||
view_highlight_range = managed_id_declare(app, SCu8("DEFAULT.highlight" ));
|
view_highlight_range = managed_id_declare(app, SCu8("DEFAULT.highlight" ));
|
||||||
view_highlight_buffer = managed_id_declare(app, SCu8("DEFAULT.highlight_buf" ));
|
view_highlight_buffer = managed_id_declare(app, SCu8("DEFAULT.highlight_buf" ));
|
||||||
view_render_hook = managed_id_declare(app, SCu8("DEFAULT.render" ));
|
view_render_hook = managed_id_declare(app, SCu8("DEFAULT.render" ));
|
||||||
|
view_call_next = managed_id_declare(app, SCu8("DEFAULT.call_next" ));
|
||||||
|
|
||||||
buffer_map_id = managed_id_declare(app, SCu8("DEFAULT.buffer_map_id" ));
|
buffer_map_id = managed_id_declare(app, SCu8("DEFAULT.buffer_map_id" ));
|
||||||
buffer_eol_setting = managed_id_declare(app, SCu8("DEFAULT.buffer_eol_setting"));
|
buffer_eol_setting = managed_id_declare(app, SCu8("DEFAULT.buffer_eol_setting"));
|
||||||
|
|
|
@ -40,6 +40,7 @@ global Managed_ID view_ui_data = 0;
|
||||||
global Managed_ID view_highlight_range = 0;
|
global Managed_ID view_highlight_range = 0;
|
||||||
global Managed_ID view_highlight_buffer = 0;
|
global Managed_ID view_highlight_buffer = 0;
|
||||||
global Managed_ID view_render_hook = 0;
|
global Managed_ID view_render_hook = 0;
|
||||||
|
global Managed_ID view_call_next = 0;
|
||||||
|
|
||||||
global Managed_ID buffer_map_id = 0;
|
global Managed_ID buffer_map_id = 0;
|
||||||
global Managed_ID buffer_eol_setting = 0;
|
global Managed_ID buffer_eol_setting = 0;
|
||||||
|
|
|
@ -82,6 +82,13 @@ CUSTOM_DOC("Input consumption loop for default view behavior")
|
||||||
|
|
||||||
Command_Binding binding = map_get_binding_recursive(&framework_mapping, map_id, &input.event);
|
Command_Binding binding = map_get_binding_recursive(&framework_mapping, map_id, &input.event);
|
||||||
|
|
||||||
|
Managed_Scope scope = view_get_managed_scope(app, view);
|
||||||
|
Custom_Command_Function** next_call = 0;
|
||||||
|
|
||||||
|
call_again:
|
||||||
|
next_call = scope_attachment(app, scope, view_call_next, Custom_Command_Function*);
|
||||||
|
*next_call = 0;
|
||||||
|
|
||||||
if (binding.custom == 0){
|
if (binding.custom == 0){
|
||||||
// NOTE(allen): we don't have anything to do with this input,
|
// NOTE(allen): we don't have anything to do with this input,
|
||||||
// leave it marked unhandled so that if there's a follow up
|
// leave it marked unhandled so that if there's a follow up
|
||||||
|
@ -90,7 +97,6 @@ CUSTOM_DOC("Input consumption loop for default view behavior")
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
// NOTE(allen): before the command is called do some book keeping
|
// NOTE(allen): before the command is called do some book keeping
|
||||||
Managed_Scope scope = view_get_managed_scope(app, view);
|
|
||||||
Rewrite_Type *next_rewrite = scope_attachment(app, scope, view_next_rewrite_loc, Rewrite_Type);
|
Rewrite_Type *next_rewrite = scope_attachment(app, scope, view_next_rewrite_loc, Rewrite_Type);
|
||||||
*next_rewrite = Rewrite_None;
|
*next_rewrite = Rewrite_None;
|
||||||
if (fcoder_mode == FCoderMode_NotepadLike){
|
if (fcoder_mode == FCoderMode_NotepadLike){
|
||||||
|
@ -124,6 +130,12 @@ CUSTOM_DOC("Input consumption loop for default view behavior")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
next_call = scope_attachment(app, scope, view_call_next, Custom_Command_Function*);
|
||||||
|
if (*next_call != 0){
|
||||||
|
binding.custom = *next_call;
|
||||||
|
goto call_again;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -694,6 +706,8 @@ BUFFER_HOOK_SIG(default_file_save){
|
||||||
BUFFER_EDIT_RANGE_SIG(default_buffer_edit_range){
|
BUFFER_EDIT_RANGE_SIG(default_buffer_edit_range){
|
||||||
// buffer_id, range, text
|
// buffer_id, range, text
|
||||||
|
|
||||||
|
ProfileScope(app, "default edit range");
|
||||||
|
|
||||||
Interval_i64 replace_range = Ii64(range.first, range.first + text.size);
|
Interval_i64 replace_range = Ii64(range.first, range.first + text.size);
|
||||||
i64 insert_size = range_size(range);
|
i64 insert_size = range_size(range);
|
||||||
i64 text_shift = replace_range_shift(replace_range, insert_size);
|
i64 text_shift = replace_range_shift(replace_range, insert_size);
|
||||||
|
|
|
@ -58,6 +58,8 @@
|
||||||
#define DYNAMIC_LINK_API
|
#define DYNAMIC_LINK_API
|
||||||
#include "generated/system_api.cpp"
|
#include "generated/system_api.cpp"
|
||||||
#include "4coder_system_helpers.cpp"
|
#include "4coder_system_helpers.cpp"
|
||||||
|
#include "4coder_profile.cpp"
|
||||||
|
#include "4coder_profile_static_enable.cpp"
|
||||||
#include "4coder_events.cpp"
|
#include "4coder_events.cpp"
|
||||||
#include "4coder_custom.cpp"
|
#include "4coder_custom.cpp"
|
||||||
#include "4coder_log.cpp"
|
#include "4coder_log.cpp"
|
||||||
|
@ -65,7 +67,6 @@
|
||||||
#include "4coder_table.cpp"
|
#include "4coder_table.cpp"
|
||||||
#include "4coder_string_match.cpp"
|
#include "4coder_string_match.cpp"
|
||||||
#include "4coder_buffer_seek_constructors.cpp"
|
#include "4coder_buffer_seek_constructors.cpp"
|
||||||
#include "4coder_profile.cpp"
|
|
||||||
|
|
||||||
#include "4coder_token.cpp"
|
#include "4coder_token.cpp"
|
||||||
#include "generated/lexer_cpp.cpp"
|
#include "generated/lexer_cpp.cpp"
|
||||||
|
@ -75,10 +76,10 @@
|
||||||
#include "4coder_delta_rule.cpp"
|
#include "4coder_delta_rule.cpp"
|
||||||
#include "4coder_fancy.cpp"
|
#include "4coder_fancy.cpp"
|
||||||
#include "4coder_draw.cpp"
|
#include "4coder_draw.cpp"
|
||||||
#include "4coder_lister_base.cpp"
|
|
||||||
#include "4coder_font_helper.cpp"
|
#include "4coder_font_helper.cpp"
|
||||||
#include "4coder_config.cpp"
|
#include "4coder_config.cpp"
|
||||||
#include "4coder_default_framework.cpp"
|
#include "4coder_default_framework.cpp"
|
||||||
|
#include "4coder_lister_base.cpp"
|
||||||
#include "4coder_base_commands.cpp"
|
#include "4coder_base_commands.cpp"
|
||||||
#include "4coder_insertion.cpp"
|
#include "4coder_insertion.cpp"
|
||||||
#include "4coder_eol.cpp"
|
#include "4coder_eol.cpp"
|
||||||
|
|
|
@ -644,5 +644,26 @@ draw_notepad_style_cursor_highlight(Application_Links *app, View_ID view_id,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////
|
||||||
|
|
||||||
|
function Rect_f32
|
||||||
|
get_tool_tip_box(Rect_f32 container, Vec2_f32 p, Vec2_f32 box_dims){
|
||||||
|
Rect_f32 box = {};
|
||||||
|
Vec2_f32 container_dims = rect_dim(container);
|
||||||
|
if (box_dims.x <= container_dims.x &&
|
||||||
|
box_dims.y <= container_dims.y){
|
||||||
|
p.x -= 6.f;
|
||||||
|
p.y += 22.f;
|
||||||
|
if (p.x + box_dims.x > container.x1){
|
||||||
|
p.x = container.x1 - box_dims.x;
|
||||||
|
}
|
||||||
|
if (p.y + box_dims.y > container.y1){
|
||||||
|
p.y = container.y1 - box_dims.y;
|
||||||
|
}
|
||||||
|
box = Rf32_xy_wh(p, box_dims);
|
||||||
|
}
|
||||||
|
return(box);
|
||||||
|
}
|
||||||
|
|
||||||
// BOTTOM
|
// BOTTOM
|
||||||
|
|
||||||
|
|
|
@ -199,8 +199,8 @@ fancy_string_list_single(Fancy_String *fancy_string){
|
||||||
}
|
}
|
||||||
|
|
||||||
static Vec2_f32
|
static Vec2_f32
|
||||||
draw_fancy_string(Application_Links *app, Face_ID font_id, Fancy_String *string, Vec2 P,
|
draw_fancy_string(Application_Links *app, Face_ID font_id, Fancy_String *string,
|
||||||
int_color fore, int_color back, u32 flags, Vec2 dP){
|
Vec2_f32 P, int_color fore, int_color back, u32 flags, Vec2_f32 dP){
|
||||||
for (;string != 0;
|
for (;string != 0;
|
||||||
string = string->next){
|
string = string->next){
|
||||||
Face_ID use_font_id = (string->font_id) ? string->font_id : font_id;
|
Face_ID use_font_id = (string->font_id) ? string->font_id : font_id;
|
||||||
|
|
|
@ -2326,6 +2326,20 @@ guess_line_ending_kind_from_buffer_contents(Application_Links *app, Buffer_ID bu
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
|
||||||
|
function Command_Metadata*
|
||||||
|
get_command_metadata(Custom_Command_Function *func){
|
||||||
|
Command_Metadata *result = 0;
|
||||||
|
for (i32 i = 0; i < ArrayCount(fcoder_metacmd_table); i += 1){
|
||||||
|
if (func == fcoder_metacmd_table[i].proc){
|
||||||
|
result = &fcoder_metacmd_table[i];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////
|
||||||
|
|
||||||
// TODO(allen): REWRITE THIS EXACTLY HOW YOU WANT IT --- start ---
|
// TODO(allen): REWRITE THIS EXACTLY HOW YOU WANT IT --- start ---
|
||||||
|
|
||||||
internal Child_Process_Set_Target_Flags
|
internal Child_Process_Set_Target_Flags
|
||||||
|
|
|
@ -244,7 +244,8 @@ set_view_to_location(Application_Links *app, View_ID view, Buffer_ID buffer, Buf
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
jump_to_location(Application_Links *app, View_ID view, Buffer_ID buffer, Name_Line_Column_Location location){
|
jump_to_location(Application_Links *app, View_ID view, Buffer_ID buffer,
|
||||||
|
Name_Line_Column_Location location){
|
||||||
view_set_active(app, view);
|
view_set_active(app, view);
|
||||||
set_view_to_location(app, view, buffer, seek_line_col(location.line, location.column));
|
set_view_to_location(app, view, buffer, seek_line_col(location.line, location.column));
|
||||||
if (auto_center_after_jumps){
|
if (auto_center_after_jumps){
|
||||||
|
@ -252,6 +253,15 @@ jump_to_location(Application_Links *app, View_ID view, Buffer_ID buffer, Name_Li
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
jump_to_location(Application_Links *app, View_ID view,
|
||||||
|
Name_Line_Column_Location location){
|
||||||
|
Buffer_ID buffer = 0;
|
||||||
|
if (get_jump_buffer(app, &buffer, &location)){
|
||||||
|
jump_to_location(app, view, buffer, location);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
jump_to_location(Application_Links *app, View_ID view, Buffer_ID buffer, ID_Pos_Jump_Location location){
|
jump_to_location(Application_Links *app, View_ID view, Buffer_ID buffer, ID_Pos_Jump_Location location){
|
||||||
view_set_active(app, view);
|
view_set_active(app, view);
|
||||||
|
@ -261,6 +271,14 @@ jump_to_location(Application_Links *app, View_ID view, Buffer_ID buffer, ID_Pos_
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function void
|
||||||
|
jump_to_location(Application_Links *app, View_ID view, String_Const_u8 location){
|
||||||
|
Parsed_Jump jump = parse_jump_location(location);
|
||||||
|
if (jump.success){
|
||||||
|
jump_to_location(app, view, jump.location);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
|
||||||
// TODO(allen): rewrite
|
// TODO(allen): rewrite
|
||||||
|
|
|
@ -653,12 +653,19 @@ lister_run(Application_Links *app, View_ID view, Lister *lister){
|
||||||
Command_Binding binding =
|
Command_Binding binding =
|
||||||
map_get_binding_recursive(mapping, map, &in.event);
|
map_get_binding_recursive(mapping, map, &in.event);
|
||||||
if (binding.custom != 0){
|
if (binding.custom != 0){
|
||||||
i64 old_num = get_current_input_sequence_number(app);
|
Command_Metadata *metadata = get_command_metadata(binding.custom);
|
||||||
binding.custom(app);
|
if (metadata != 0){
|
||||||
i64 num = get_current_input_sequence_number(app);
|
if (metadata->is_ui){
|
||||||
if (old_num < num){
|
call_after_ui_shutdown(app, view, binding.custom);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
else{
|
||||||
|
binding.custom(app);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
binding.custom(app);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
leave_current_input_unhandled(app);
|
leave_current_input_unhandled(app);
|
||||||
|
|
|
@ -484,7 +484,7 @@ activate_switch_buffer(Application_Links *app,
|
||||||
return(ListerActivation_Finished);
|
return(ListerActivation_Finished);
|
||||||
}
|
}
|
||||||
|
|
||||||
CUSTOM_COMMAND_SIG(interactive_switch_buffer)
|
CUSTOM_UI_COMMAND_SIG(interactive_switch_buffer)
|
||||||
CUSTOM_DOC("Interactively switch to an open buffer.")
|
CUSTOM_DOC("Interactively switch to an open buffer.")
|
||||||
{
|
{
|
||||||
View_ID view = get_active_view(app, Access_Always);
|
View_ID view = get_active_view(app, Access_Always);
|
||||||
|
@ -503,7 +503,7 @@ activate_kill_buffer(Application_Links *app,
|
||||||
return(ListerActivation_Finished);
|
return(ListerActivation_Finished);
|
||||||
}
|
}
|
||||||
|
|
||||||
CUSTOM_COMMAND_SIG(interactive_kill_buffer)
|
CUSTOM_UI_COMMAND_SIG(interactive_kill_buffer)
|
||||||
CUSTOM_DOC("Interactively kill an open buffer.")
|
CUSTOM_DOC("Interactively kill an open buffer.")
|
||||||
{
|
{
|
||||||
View_ID view = get_active_view(app, Access_Always);
|
View_ID view = get_active_view(app, Access_Always);
|
||||||
|
@ -574,7 +574,7 @@ activate_open_or_new(Application_Links *app,
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
CUSTOM_COMMAND_SIG(interactive_open_or_new)
|
CUSTOM_UI_COMMAND_SIG(interactive_open_or_new)
|
||||||
CUSTOM_DOC("Interactively open a file out of the file system.")
|
CUSTOM_DOC("Interactively open a file out of the file system.")
|
||||||
{
|
{
|
||||||
View_ID view = get_active_view(app, Access_Always);
|
View_ID view = get_active_view(app, Access_Always);
|
||||||
|
@ -613,7 +613,7 @@ activate_new(Application_Links *app,
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
CUSTOM_COMMAND_SIG(interactive_new)
|
CUSTOM_UI_COMMAND_SIG(interactive_new)
|
||||||
CUSTOM_DOC("Interactively creates a new file.")
|
CUSTOM_DOC("Interactively creates a new file.")
|
||||||
{
|
{
|
||||||
View_ID view = get_active_view(app, Access_Always);
|
View_ID view = get_active_view(app, Access_Always);
|
||||||
|
@ -646,7 +646,7 @@ activate_open(Application_Links *app,
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
CUSTOM_COMMAND_SIG(interactive_open)
|
CUSTOM_UI_COMMAND_SIG(interactive_open)
|
||||||
CUSTOM_DOC("Interactively opens a file.")
|
CUSTOM_DOC("Interactively opens a file.")
|
||||||
{
|
{
|
||||||
View_ID view = get_active_view(app, Access_Always);
|
View_ID view = get_active_view(app, Access_Always);
|
||||||
|
@ -709,7 +709,7 @@ launch_custom_command_lister(Application_Links *app, i32 *command_ids, i32 comma
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CUSTOM_COMMAND_SIG(command_lister)
|
CUSTOM_UI_COMMAND_SIG(command_lister)
|
||||||
CUSTOM_DOC("Opens an interactive list of all registered commands.")
|
CUSTOM_DOC("Opens an interactive list of all registered commands.")
|
||||||
{
|
{
|
||||||
launch_custom_command_lister(app, 0, 0);
|
launch_custom_command_lister(app, 0, 0);
|
||||||
|
|
|
@ -214,14 +214,16 @@ token_str(String_Const_u8 text, Token token){
|
||||||
|
|
||||||
///////////////////////////////
|
///////////////////////////////
|
||||||
|
|
||||||
typedef u32 Meta_Command_Entry_Type;
|
typedef i32 Meta_Command_Entry_Kind;
|
||||||
enum{
|
enum{
|
||||||
MetaCommandEntry_DocString,
|
MetaCommandEntryKind_ERROR,
|
||||||
MetaCommandEntry_Alias,
|
MetaCommandEntryKind_Normal,
|
||||||
|
MetaCommandEntryKind_UI,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Meta_Command_Entry{
|
struct Meta_Command_Entry{
|
||||||
Meta_Command_Entry *next;
|
Meta_Command_Entry *next;
|
||||||
|
Meta_Command_Entry_Kind kind;
|
||||||
String_Const_u8 name;
|
String_Const_u8 name;
|
||||||
u8 *source_name;
|
u8 *source_name;
|
||||||
i64 line_number;
|
i64 line_number;
|
||||||
|
@ -229,9 +231,6 @@ struct Meta_Command_Entry{
|
||||||
struct{
|
struct{
|
||||||
String_Const_u8 doc;
|
String_Const_u8 doc;
|
||||||
} docstring;
|
} docstring;
|
||||||
struct{
|
|
||||||
String_Const_u8 potential;
|
|
||||||
} alias;
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -240,9 +239,9 @@ struct Meta_Command_Entry_Arrays{
|
||||||
Meta_Command_Entry *last_doc_string;
|
Meta_Command_Entry *last_doc_string;
|
||||||
i32 doc_string_count;
|
i32 doc_string_count;
|
||||||
|
|
||||||
Meta_Command_Entry *first_alias;
|
Meta_Command_Entry *first_ui;
|
||||||
Meta_Command_Entry *last_alias;
|
Meta_Command_Entry *last_ui;
|
||||||
i32 alias_count;
|
i32 ui_count;
|
||||||
};
|
};
|
||||||
|
|
||||||
///////////////////////////////
|
///////////////////////////////
|
||||||
|
@ -515,16 +514,29 @@ extract_string(Reader *reader, String_Const_u8 *str_out){
|
||||||
return(extract_string(reader, str_out, 0));
|
return(extract_string(reader, str_out, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function Meta_Command_Entry_Kind
|
||||||
|
parse_command_kind(String_Const_u8 kind){
|
||||||
|
Meta_Command_Entry_Kind result = MetaCommandEntryKind_ERROR;
|
||||||
|
if (string_match(kind, string_u8_litexpr("Normal"))){
|
||||||
|
result = MetaCommandEntryKind_Normal;
|
||||||
|
}
|
||||||
|
else if (string_match(kind, string_u8_litexpr("UI"))){
|
||||||
|
result = MetaCommandEntryKind_UI;
|
||||||
|
}
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
static b32
|
static b32
|
||||||
parse_documented_command(Arena *arena, Meta_Command_Entry_Arrays *arrays, Reader *reader){
|
parse_documented_command(Arena *arena, Meta_Command_Entry_Arrays *arrays, Reader *reader){
|
||||||
String_Const_u8 name = {};
|
String_Const_u8 name = {};
|
||||||
|
String_Const_u8 kind = {};
|
||||||
String_Const_u8 file_name = {};
|
String_Const_u8 file_name = {};
|
||||||
String_Const_u8 line_number = {};
|
String_Const_u8 line_number = {};
|
||||||
String_Const_u8 doc = {};
|
String_Const_u8 doc = {};
|
||||||
|
|
||||||
// Getting the command's name
|
// Getting the command's name
|
||||||
i64 start_pos = 0;
|
i64 start_pos = 0;
|
||||||
if (!require_key_identifier(reader, "CUSTOM_COMMAND_SIG", &start_pos)){
|
if (!require_key_identifier(reader, "CUSTOM_COMMAND", &start_pos)){
|
||||||
return(false);
|
return(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -552,6 +564,14 @@ parse_documented_command(Arena *arena, Meta_Command_Entry_Arrays *arrays, Reader
|
||||||
return(false);
|
return(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!require_comma(reader)){
|
||||||
|
return(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!extract_identifier(reader, &kind)){
|
||||||
|
return(false);
|
||||||
|
}
|
||||||
|
|
||||||
if (!require_close_parenthese(reader)){
|
if (!require_close_parenthese(reader)){
|
||||||
return(false);
|
return(false);
|
||||||
}
|
}
|
||||||
|
@ -590,6 +610,7 @@ parse_documented_command(Arena *arena, Meta_Command_Entry_Arrays *arrays, Reader
|
||||||
String_Const_u8 source_name = string_interpret_escapes(arena, file_name_unquoted);
|
String_Const_u8 source_name = string_interpret_escapes(arena, file_name_unquoted);
|
||||||
|
|
||||||
Meta_Command_Entry *new_entry = push_array(arena, Meta_Command_Entry, 1);
|
Meta_Command_Entry *new_entry = push_array(arena, Meta_Command_Entry, 1);
|
||||||
|
new_entry->kind = parse_command_kind(kind);
|
||||||
new_entry->name = name;
|
new_entry->name = name;
|
||||||
new_entry->source_name = source_name.str;
|
new_entry->source_name = source_name.str;
|
||||||
new_entry->line_number = (i32)string_to_integer(line_number, 10);
|
new_entry->line_number = (i32)string_to_integer(line_number, 10);
|
||||||
|
@ -600,49 +621,6 @@ parse_documented_command(Arena *arena, Meta_Command_Entry_Arrays *arrays, Reader
|
||||||
return(true);
|
return(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
static b32
|
|
||||||
parse_alias(Arena *arena, Meta_Command_Entry_Arrays *arrays, Reader *reader){
|
|
||||||
String_Const_u8 name = {};
|
|
||||||
String_Const_u8 potential = {};
|
|
||||||
|
|
||||||
// Getting the alias's name
|
|
||||||
i64 start_pos = 0;
|
|
||||||
if (!require_define(reader, &start_pos)){
|
|
||||||
return(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!extract_identifier(reader, &name)){
|
|
||||||
return(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Getting the alias's target
|
|
||||||
if (!require_key_identifier(reader, "CUSTOM_ALIAS")){
|
|
||||||
return(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!require_open_parenthese(reader)){
|
|
||||||
return(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!extract_identifier(reader, &potential)){
|
|
||||||
return(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!require_close_parenthese(reader)){
|
|
||||||
return(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
Meta_Command_Entry *new_entry = push_array(arena, Meta_Command_Entry, 1);
|
|
||||||
new_entry->name = name;
|
|
||||||
new_entry->source_name = reader->source_name;
|
|
||||||
new_entry->line_number = line_number(reader, start_pos);
|
|
||||||
new_entry->alias.potential = potential;
|
|
||||||
sll_queue_push(arrays->first_alias, arrays->last_alias, new_entry);
|
|
||||||
++arrays->alias_count;
|
|
||||||
|
|
||||||
return(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
///////////////////////////////
|
///////////////////////////////
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -661,15 +639,16 @@ parse_text(Arena *arena, Meta_Command_Entry_Arrays *entry_arrays, u8 *source_nam
|
||||||
|
|
||||||
b32 in_preproc_body = HasFlag(token.flags, TokenBaseFlag_PreprocessorBody);
|
b32 in_preproc_body = HasFlag(token.flags, TokenBaseFlag_PreprocessorBody);
|
||||||
|
|
||||||
if (!in_preproc_body && string_match(lexeme, string_u8_litexpr("CUSTOM_DOC"))){
|
if (!in_preproc_body &&
|
||||||
|
string_match(lexeme, string_u8_litexpr("CUSTOM_DOC"))){
|
||||||
Temp_Read temp_read = begin_temp_read(reader);
|
Temp_Read temp_read = begin_temp_read(reader);
|
||||||
|
|
||||||
b32 found_start_pos = false;
|
b32 found_start_pos = false;
|
||||||
for (i32 R = 0; R < 10; ++R){
|
for (i32 R = 0; R < 12; ++R){
|
||||||
Token p_token = prev_token(reader);
|
Token p_token = prev_token(reader);
|
||||||
if (p_token.kind == TokenBaseKind_Identifier){
|
if (p_token.kind == TokenBaseKind_Identifier){
|
||||||
String_Const_u8 p_lexeme = token_str(text, p_token);
|
String_Const_u8 p_lexeme = token_str(text, p_token);
|
||||||
if (string_match(p_lexeme, string_u8_litexpr("CUSTOM_COMMAND_SIG"))){
|
if (string_match(p_lexeme, string_u8_litexpr("CUSTOM_COMMAND"))){
|
||||||
found_start_pos = true;
|
found_start_pos = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -688,31 +667,8 @@ parse_text(Arena *arena, Meta_Command_Entry_Arrays *entry_arrays, u8 *source_nam
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (string_match(lexeme, string_u8_litexpr("CUSTOM_ALIAS"))){
|
else if (string_match(lexeme, string_u8_litexpr("CUSTOM_UI_COMMAND"))){
|
||||||
Temp_Read temp_read = begin_temp_read(reader);
|
|
||||||
|
|
||||||
b32 found_start_pos = false;
|
|
||||||
for (i32 R = 0; R < 3; ++R){
|
|
||||||
Token p_token = prev_token(reader);
|
|
||||||
if (p_token.sub_kind == TokenCppKind_PPDefine){
|
|
||||||
if (R == 2){
|
|
||||||
found_start_pos = true;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (p_token.kind == TokenBaseKind_EOF){
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!found_start_pos){
|
|
||||||
end_temp_read(temp_read);
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
if (!parse_alias(arena, entry_arrays, reader)){
|
|
||||||
end_temp_read(temp_read);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -875,6 +831,7 @@ main(int argc, char **argv){
|
||||||
fprintf(out,
|
fprintf(out,
|
||||||
"struct Command_Metadata{\n"
|
"struct Command_Metadata{\n"
|
||||||
"PROC_LINKS(Custom_Command_Function, void) *proc;\n"
|
"PROC_LINKS(Custom_Command_Function, void) *proc;\n"
|
||||||
|
"b32 is_ui;\n"
|
||||||
"char *name;\n"
|
"char *name;\n"
|
||||||
"i32 name_len;\n"
|
"i32 name_len;\n"
|
||||||
"char *description;\n"
|
"char *description;\n"
|
||||||
|
@ -892,17 +849,21 @@ main(int argc, char **argv){
|
||||||
|
|
||||||
Temp_Memory temp = begin_temp(arena);
|
Temp_Memory temp = begin_temp(arena);
|
||||||
|
|
||||||
// HACK(allen): We could just get these at the HEAD END of the process,
|
|
||||||
// then we only have to do it once per file, and pass the lengths through.
|
|
||||||
//umem source_name_len = cstring_length(entry->source_name);
|
|
||||||
String_Const_u8 source_name = SCu8(entry->source_name);
|
String_Const_u8 source_name = SCu8(entry->source_name);
|
||||||
String_Const_u8 printable = string_replace(arena, source_name,
|
String_Const_u8 printable = string_replace(arena, source_name,
|
||||||
SCu8("\\"), SCu8("\\\\"),
|
SCu8("\\"), SCu8("\\\\"),
|
||||||
StringFill_NullTerminate);
|
StringFill_NullTerminate);
|
||||||
|
|
||||||
|
char *is_ui = "false";
|
||||||
|
if (entry->kind == MetaCommandEntryKind_UI){
|
||||||
|
is_ui = "true";
|
||||||
|
}
|
||||||
|
|
||||||
fprintf(out,
|
fprintf(out,
|
||||||
"{ PROC_LINKS(%.*s, 0), \"%.*s\", %d, \"%.*s\", %d, \"%s\", %d, %lld },\n",
|
"{ PROC_LINKS(%.*s, 0), %s, \"%.*s\", %d, "
|
||||||
|
"\"%.*s\", %d, \"%s\", %d, %lld },\n",
|
||||||
string_expand(entry->name),
|
string_expand(entry->name),
|
||||||
|
is_ui,
|
||||||
string_expand(entry->name),
|
string_expand(entry->name),
|
||||||
(i32)entry->name.size,
|
(i32)entry->name.size,
|
||||||
string_expand(entry->docstring.doc),
|
string_expand(entry->docstring.doc),
|
||||||
|
|
|
@ -4,122 +4,191 @@
|
||||||
|
|
||||||
// TOP
|
// TOP
|
||||||
|
|
||||||
function Profile_Group*
|
global Profile_Global_List global_prof_list = {};
|
||||||
make_profile_group__inner(u32 slot_count, u32 stack_size, char *source_location){
|
global System_Mutex global_prof_mutex = {};
|
||||||
Arena arena = make_arena_system(KB(4));
|
|
||||||
Profile_Group *group = push_array(&arena, Profile_Group, 1);
|
|
||||||
group->arena = arena;
|
|
||||||
group->thread_id = system_thread_get_id();
|
|
||||||
group->source_location = SCu8(source_location);
|
|
||||||
group->slot_names = push_array_zero(&group->arena, String_Const_u8, slot_count);
|
|
||||||
group->timer_stack = push_array_zero(&group->arena, Profile_Slot, stack_size);
|
|
||||||
group->slot_count = slot_count;
|
|
||||||
group->stack_size = stack_size;
|
|
||||||
group->stack_top = 0;
|
|
||||||
group->first = 0;
|
|
||||||
group->last = 0;
|
|
||||||
return(group);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define make_profile_group(L,T) make_profile_group__inner((L),(T), file_name_line_number)
|
|
||||||
|
|
||||||
function void
|
function void
|
||||||
profile_define(Profile_Group *group, u32 slot_index, char *name){
|
global_prof_init(void){
|
||||||
if (slot_index < group->slot_count){
|
global_prof_mutex = system_mutex_make();
|
||||||
group->slot_names[slot_index] = SCu8(name);
|
global_prof_list.node_arena = make_arena(get_base_allocator_system(),
|
||||||
}
|
KB(4));
|
||||||
}
|
}
|
||||||
|
|
||||||
function void
|
function Profile_Thread*
|
||||||
profile__record(Profile_Group *group, u32 slot_index, u64 time){
|
global_prof_get_thread(i32 thread_id){
|
||||||
Profile_Record *record = push_array(&group->arena, Profile_Record, 1);
|
Profile_Thread *result = 0;
|
||||||
record->slot_index = slot_index;
|
for (Profile_Thread *node = global_prof_list.first_thread;
|
||||||
record->time = time;
|
|
||||||
sll_queue_push(group->first, group->last, record);
|
|
||||||
}
|
|
||||||
|
|
||||||
function void
|
|
||||||
profile_begin_range(Profile_Group *group, u32 slot_index){
|
|
||||||
Assert(group->stack_top < group->stack_size);
|
|
||||||
Profile_Slot *slot = &group->timer_stack[group->stack_top];
|
|
||||||
Profile_Slot *prev = 0;
|
|
||||||
if (group->stack_top > 0){
|
|
||||||
prev = &group->timer_stack[group->stack_top - 1];
|
|
||||||
}
|
|
||||||
slot->slot_index = slot_index;
|
|
||||||
group->stack_top += 1;
|
|
||||||
slot->accumulated_time = 0;
|
|
||||||
u64 time = system_now_time();
|
|
||||||
slot->start_time = time;
|
|
||||||
if (prev != 0){
|
|
||||||
prev->accumulated_time += time - prev->start_time;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function void
|
|
||||||
profile_end_range(Profile_Group *group){
|
|
||||||
u64 time = system_now_time();
|
|
||||||
Assert(group->stack_top > 0);
|
|
||||||
group->stack_top -= 1;
|
|
||||||
if (group->stack_top > 0){
|
|
||||||
Profile_Slot *prev = &group->timer_stack[group->stack_top - 1];
|
|
||||||
prev->start_time = time;
|
|
||||||
}
|
|
||||||
Profile_Slot *slot = &group->timer_stack[group->stack_top];
|
|
||||||
u64 accumulated = time - slot->start_time + slot->accumulated_time;
|
|
||||||
profile__record(group, slot->slot_index, accumulated);
|
|
||||||
}
|
|
||||||
|
|
||||||
function void
|
|
||||||
profile_add_note(Profile_Group *group, u32 slot_index){
|
|
||||||
profile__record(group, slot_index, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
function void
|
|
||||||
profile_group_post(Profile_Group *group){
|
|
||||||
Assert(group->stack_top == 0);
|
|
||||||
system_mutex_acquire(profile_history.mutex);
|
|
||||||
if (profile_history.disable_bits == 0){
|
|
||||||
sll_queue_push(profile_history.first, profile_history.last, group);
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
Arena arena = group->arena;
|
|
||||||
linalloc_clear(&arena);
|
|
||||||
}
|
|
||||||
system_mutex_release(profile_history.mutex);
|
|
||||||
}
|
|
||||||
|
|
||||||
function void
|
|
||||||
profile_history_set_enabled(b32 value, Profile_Enable_Flag flag){
|
|
||||||
system_mutex_acquire(profile_history.mutex);
|
|
||||||
if (value){
|
|
||||||
RemFlag(profile_history.disable_bits, flag);
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
AddFlag(profile_history.disable_bits, flag);
|
|
||||||
}
|
|
||||||
system_mutex_release(profile_history.mutex);
|
|
||||||
}
|
|
||||||
|
|
||||||
function void
|
|
||||||
profile_history_clear(void){
|
|
||||||
system_mutex_acquire(profile_history.mutex);
|
|
||||||
for (Profile_Group *node = profile_history.first, *next = 0;
|
|
||||||
node != 0;
|
node != 0;
|
||||||
node = next){
|
node = node->next){
|
||||||
next = node->next;
|
if (thread_id == node->thread_id){
|
||||||
Arena arena = node->arena;
|
result = node;
|
||||||
linalloc_clear(&arena);
|
break;
|
||||||
}
|
}
|
||||||
profile_history.first = 0;
|
}
|
||||||
profile_history.last = 0;
|
if (result == 0){
|
||||||
system_mutex_release(profile_history.mutex);
|
result = push_array_zero(&global_prof_list.node_arena, Profile_Thread, 1);
|
||||||
|
sll_queue_push(global_prof_list.first_thread, global_prof_list.last_thread, result);
|
||||||
|
global_prof_list.thread_count += 1;
|
||||||
|
result->thread_id = thread_id;
|
||||||
|
}
|
||||||
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
function void
|
function void
|
||||||
profile_history_init(void){
|
global_prof_clear(void){
|
||||||
profile_history.mutex = system_mutex_make();
|
Mutex_Lock lock(global_prof_mutex);
|
||||||
profile_history.disable_bits = 0;
|
for (Arena_Node *node = global_prof_list.first_arena;
|
||||||
|
node != 0;
|
||||||
|
node = node->next){
|
||||||
|
linalloc_clear(&node->arena);
|
||||||
|
}
|
||||||
|
global_prof_list.first_arena = 0;
|
||||||
|
global_prof_list.last_arena = 0;
|
||||||
|
|
||||||
|
linalloc_clear(&global_prof_list.node_arena);
|
||||||
|
global_prof_list.first_thread = 0;
|
||||||
|
global_prof_list.last_thread = 0;
|
||||||
|
global_prof_list.thread_count = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function void
|
||||||
|
thread_profile_flush(Thread_Context *tctx){
|
||||||
|
if (tctx->prof_record_count > 0){
|
||||||
|
Mutex_Lock lock(global_prof_mutex);
|
||||||
|
if (global_prof_list.disable_bits == 0){
|
||||||
|
Profile_Thread* thread = global_prof_get_thread(system_thread_get_id());
|
||||||
|
|
||||||
|
Arena_Node* node = push_array(&global_prof_list.node_arena, Arena_Node, 1);
|
||||||
|
sll_queue_push(global_prof_list.first_arena, global_prof_list.last_arena,
|
||||||
|
node);
|
||||||
|
node->arena = tctx->prof_arena;
|
||||||
|
tctx->prof_arena = make_arena(get_base_allocator_system(), KB(4));
|
||||||
|
|
||||||
|
if (thread->first_record == 0){
|
||||||
|
thread->first_record = tctx->prof_first;
|
||||||
|
thread->last_record = tctx->prof_last;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
thread->last_record->next = tctx->prof_first;
|
||||||
|
thread->last_record = tctx->prof_last;
|
||||||
|
}
|
||||||
|
thread->record_count += tctx->prof_record_count;
|
||||||
|
|
||||||
|
tctx->prof_record_count = 0;
|
||||||
|
tctx->prof_first = 0;
|
||||||
|
tctx->prof_last = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function void
|
||||||
|
global_prof_set_enabled(b32 value, Profile_Enable_Flag flag){
|
||||||
|
Mutex_Lock lock(global_prof_mutex);
|
||||||
|
if (value){
|
||||||
|
RemFlag(global_prof_list.disable_bits, flag);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
AddFlag(global_prof_list.disable_bits, flag);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function void
|
||||||
|
thread_profile_record__inner(Thread_Context *tctx, Profile_ID id, u64 time,
|
||||||
|
String_Const_u8 name, String_Const_u8 location){
|
||||||
|
Profile_Record *record = push_array_zero(&tctx->prof_arena, Profile_Record, 1);
|
||||||
|
sll_queue_push(tctx->prof_first, tctx->prof_last, record);
|
||||||
|
tctx->prof_record_count += 1;
|
||||||
|
record->id = id;
|
||||||
|
record->time = time;
|
||||||
|
record->location = location;
|
||||||
|
record->name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
function Profile_ID
|
||||||
|
thread_profile_record_push(Thread_Context *tctx, u64 time,
|
||||||
|
String_Const_u8 name, String_Const_u8 location){
|
||||||
|
Profile_ID id = tctx->prof_id_counter;
|
||||||
|
tctx->prof_id_counter += 1;
|
||||||
|
thread_profile_record__inner(tctx, id, time, name, location);
|
||||||
|
return(id);
|
||||||
|
}
|
||||||
|
function void
|
||||||
|
thread_profile_record_pop(Thread_Context *tctx, u64 time, Profile_ID id){
|
||||||
|
Assert(tctx->prof_id_counter > 1);
|
||||||
|
tctx->prof_id_counter = id;
|
||||||
|
thread_profile_record__inner(tctx, id, time, SCu8(""), SCu8(""));
|
||||||
|
}
|
||||||
|
|
||||||
|
function Profile_ID
|
||||||
|
thread_profile_record_push(Application_Links *app, u64 time,
|
||||||
|
String_Const_u8 name, String_Const_u8 location){
|
||||||
|
Thread_Context *tctx = get_thread_context(app);
|
||||||
|
return(thread_profile_record_push(tctx, time, name, location));
|
||||||
|
}
|
||||||
|
function void
|
||||||
|
thread_profile_record_pop(Application_Links *app, u64 time, Profile_ID id){
|
||||||
|
Thread_Context *tctx = get_thread_context(app);
|
||||||
|
thread_profile_record_pop(tctx, time, id);
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////
|
||||||
|
|
||||||
|
function void
|
||||||
|
profile_block__init(Thread_Context *tctx, String_Const_u8 name,
|
||||||
|
String_Const_u8 location, Profile_Block *block){
|
||||||
|
block->tctx = tctx;
|
||||||
|
block->is_closed = false;
|
||||||
|
block->id = thread_profile_record_push(tctx, system_now_time(), name, location);
|
||||||
|
}
|
||||||
|
function void
|
||||||
|
profile_block__init(Thread_Context *tctx, String_Const_u8 name,
|
||||||
|
String_Const_u8 location, Profile_Scope_Block *block){
|
||||||
|
block->tctx = tctx;
|
||||||
|
block->is_closed = false;
|
||||||
|
block->id = thread_profile_record_push(tctx, system_now_time(), name, location);
|
||||||
|
}
|
||||||
|
|
||||||
|
////////
|
||||||
|
|
||||||
|
Profile_Block::Profile_Block(Thread_Context *tctx, String_Const_u8 name,
|
||||||
|
String_Const_u8 location){
|
||||||
|
profile_block__init(tctx, name, location, this);
|
||||||
|
}
|
||||||
|
Profile_Block::Profile_Block(Application_Links *app, String_Const_u8 name,
|
||||||
|
String_Const_u8 location){
|
||||||
|
profile_block__init(get_thread_context(app), name, location, this);
|
||||||
|
}
|
||||||
|
Profile_Block::~Profile_Block(){
|
||||||
|
this->close_now();
|
||||||
|
}
|
||||||
|
void
|
||||||
|
Profile_Block::close_now(){
|
||||||
|
if (!this->is_closed){
|
||||||
|
thread_profile_record_pop(this->tctx, system_now_time(), this->id);
|
||||||
|
this->is_closed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
////////
|
||||||
|
|
||||||
|
Profile_Scope_Block::Profile_Scope_Block(Thread_Context *tctx, String_Const_u8 name,
|
||||||
|
String_Const_u8 location){
|
||||||
|
profile_block__init(tctx, name, location, this);
|
||||||
|
}
|
||||||
|
Profile_Scope_Block::Profile_Scope_Block(Application_Links *app, String_Const_u8 name,
|
||||||
|
String_Const_u8 location){
|
||||||
|
profile_block__init(get_thread_context(app), name, location, this);
|
||||||
|
}
|
||||||
|
Profile_Scope_Block::~Profile_Scope_Block(){
|
||||||
|
this->close_now();
|
||||||
|
thread_profile_flush(this->tctx);
|
||||||
|
}
|
||||||
|
void
|
||||||
|
Profile_Scope_Block::close_now(){
|
||||||
|
if (!this->is_closed){
|
||||||
|
thread_profile_record_pop(this->tctx, system_now_time(), this->id);
|
||||||
|
this->is_closed = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
@ -127,19 +196,19 @@ profile_history_init(void){
|
||||||
CUSTOM_COMMAND_SIG(profile_enable)
|
CUSTOM_COMMAND_SIG(profile_enable)
|
||||||
CUSTOM_DOC("Allow 4coder's self profiler to gather new profiling information.")
|
CUSTOM_DOC("Allow 4coder's self profiler to gather new profiling information.")
|
||||||
{
|
{
|
||||||
profile_history_set_enabled(true, ProfileEnable_UserBit);
|
global_prof_set_enabled(true, ProfileEnable_UserBit);
|
||||||
}
|
}
|
||||||
|
|
||||||
CUSTOM_COMMAND_SIG(profile_disable)
|
CUSTOM_COMMAND_SIG(profile_disable)
|
||||||
CUSTOM_DOC("Prevent 4coder's self profiler from gathering new profiling information.")
|
CUSTOM_DOC("Prevent 4coder's self profiler from gathering new profiling information.")
|
||||||
{
|
{
|
||||||
profile_history_set_enabled(false, ProfileEnable_UserBit);
|
global_prof_set_enabled(false, ProfileEnable_UserBit);
|
||||||
}
|
}
|
||||||
|
|
||||||
CUSTOM_COMMAND_SIG(profile_clear)
|
CUSTOM_COMMAND_SIG(profile_clear)
|
||||||
CUSTOM_DOC("Clear all profiling information from 4coder's self profiler.")
|
CUSTOM_DOC("Clear all profiling information from 4coder's self profiler.")
|
||||||
{
|
{
|
||||||
profile_history_clear();
|
global_prof_clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
// BOTTOM
|
// BOTTOM
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* 4coder_profile.h - Types for built in self profiling report.
|
* 4coder_profile.cpp - Built in self profiling report.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// TOP
|
// TOP
|
||||||
|
@ -7,53 +7,28 @@
|
||||||
#if !defined(FCODER_PROFILE_H)
|
#if !defined(FCODER_PROFILE_H)
|
||||||
#define FCODER_PROFILE_H
|
#define FCODER_PROFILE_H
|
||||||
|
|
||||||
struct Profile_Slot{
|
struct Profile_Block{
|
||||||
u64 start_time;
|
Thread_Context *tctx;
|
||||||
u64 accumulated_time;
|
b32 is_closed;
|
||||||
u32 slot_index;
|
Profile_ID id;
|
||||||
|
|
||||||
|
Profile_Block(Thread_Context *tctx, String_Const_u8 name, String_Const_u8 location);
|
||||||
|
Profile_Block(Application_Links *app, String_Const_u8 name, String_Const_u8 location);
|
||||||
|
~Profile_Block();
|
||||||
|
void close_now();
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Profile_Record{
|
struct Profile_Scope_Block{
|
||||||
Profile_Record *next;
|
Thread_Context *tctx;
|
||||||
struct Profile_Group *group;
|
b32 is_closed;
|
||||||
u64 time;
|
Profile_ID id;
|
||||||
u32 slot_index;
|
|
||||||
|
Profile_Scope_Block(Application_Links *app, String_Const_u8 name, String_Const_u8 location);
|
||||||
|
Profile_Scope_Block(Thread_Context *tctx, String_Const_u8 name, String_Const_u8 location);
|
||||||
|
~Profile_Scope_Block();
|
||||||
|
void close_now();
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Profile_Group{
|
|
||||||
Profile_Group *next;
|
|
||||||
|
|
||||||
Arena arena;
|
|
||||||
|
|
||||||
i32 thread_id;
|
|
||||||
String_Const_u8 source_location;
|
|
||||||
String_Const_u8 *slot_names;
|
|
||||||
Profile_Slot *timer_stack;
|
|
||||||
u32 slot_count;
|
|
||||||
u32 stack_size;
|
|
||||||
u32 stack_top;
|
|
||||||
|
|
||||||
Profile_Record *first;
|
|
||||||
Profile_Record *last;
|
|
||||||
};
|
|
||||||
|
|
||||||
////////////////////////////////
|
|
||||||
|
|
||||||
typedef u32 Profile_Enable_Flag;
|
|
||||||
enum{
|
|
||||||
ProfileEnable_UserBit = 0x1,
|
|
||||||
ProfileEnable_InspectBit = 0x2
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Profile_History{
|
|
||||||
System_Mutex mutex;
|
|
||||||
Profile_Enable_Flag disable_bits;
|
|
||||||
Profile_Group *first;
|
|
||||||
Profile_Group *last;
|
|
||||||
};
|
|
||||||
|
|
||||||
global Profile_History profile_history = {};
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// BOTTOM
|
// BOTTOM
|
||||||
|
|
|
@ -4,134 +4,191 @@
|
||||||
|
|
||||||
// TOP
|
// TOP
|
||||||
|
|
||||||
function Profile_Thread*
|
function Profile_Slot*
|
||||||
get_column_from_thread_id(Profile_Thread *first, i32 thread_id){
|
profile_parse_get_slot(Arena *arena, Profile_Inspection *insp,
|
||||||
Profile_Thread *result = 0;
|
String_Const_u8 loc, String_Const_u8 name){
|
||||||
for (Profile_Thread *node = first;
|
Profile_Slot *result = 0;
|
||||||
|
for (Profile_Slot *node = insp->first_slot;
|
||||||
node != 0;
|
node != 0;
|
||||||
node = node->next){
|
node = node->next){
|
||||||
if (node->thread_id == thread_id){
|
if (string_match(node->location, loc) &&
|
||||||
|
string_match(node->name, name)){
|
||||||
result = node;
|
result = node;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return(result);
|
if (result == 0){
|
||||||
}
|
result = push_array_zero(arena, Profile_Slot, 1);
|
||||||
|
sll_queue_push(insp->first_slot, insp->last_slot, result);
|
||||||
function Profile_Universal_Slot*
|
insp->slot_count += 1;
|
||||||
get_universal_slot(Profile_Thread *column, String_Const_u8 source_location,
|
result->location = loc;
|
||||||
u32 slot_index){
|
result->name = name;
|
||||||
Profile_Universal_Slot *result = 0;
|
|
||||||
for (Profile_Universal_Slot *node = column->first_slot;
|
|
||||||
node != 0;
|
|
||||||
node = node->next){
|
|
||||||
if (node->slot_index == slot_index &&
|
|
||||||
string_match(node->source_location, source_location)){
|
|
||||||
result = node;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
function void
|
function void
|
||||||
sort_universal_slots(Profile_Universal_Slot **slots, i32 first, i32 one_past_last){
|
profile_parse_error(Arena *arena, Profile_Inspection *insp, String_Const_u8 message,
|
||||||
if (first + 1 < one_past_last){
|
String_Const_u8 location){
|
||||||
i32 pivot = one_past_last - 1;
|
Profile_Error *error = push_array(arena, Profile_Error, 1);
|
||||||
Profile_Universal_Slot *pivot_slot = slots[pivot];
|
sll_queue_push(insp->first_error, insp->last_error, error);
|
||||||
i32 j = first;
|
insp->error_count += 1;
|
||||||
for (i32 i = first; i < pivot; i += 1){
|
error->message = message;
|
||||||
Profile_Universal_Slot *slot = slots[i];
|
error->location = location;
|
||||||
b32 goes_first = false;
|
}
|
||||||
if (slot->total_time > pivot_slot->total_time){
|
|
||||||
goes_first = true;
|
function Profile_Record*
|
||||||
|
profile_parse_record(Arena *arena, Profile_Inspection *insp,
|
||||||
|
Profile_Node *parent, Profile_Record *record,
|
||||||
|
Range_u64 *total_time_range){
|
||||||
|
for (;record != 0;){
|
||||||
|
if (record->id <= parent->id){
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else if (slot->total_time == pivot_slot->total_time){
|
|
||||||
if (slot->count > pivot_slot->count){
|
Profile_ID id = record->id;
|
||||||
goes_first = true;
|
Profile_Node *node = push_array(arena, Profile_Node, 1);
|
||||||
|
sll_queue_push(parent->first_child, parent->last_child, node);
|
||||||
|
parent->child_count += 1;
|
||||||
|
|
||||||
|
String_Const_u8 location = record->location;
|
||||||
|
String_Const_u8 name = record->name;
|
||||||
|
|
||||||
|
node->time.min = record->time;
|
||||||
|
node->time.max = max_u64;
|
||||||
|
node->id = id;
|
||||||
|
node->first_child = 0;
|
||||||
|
node->last_child = 0;
|
||||||
|
node->child_count = 0;
|
||||||
|
node->closed = false;
|
||||||
|
|
||||||
|
record = profile_parse_record(arena, insp, node, record->next,
|
||||||
|
total_time_range);
|
||||||
|
|
||||||
|
b32 quit_loop = false;
|
||||||
|
Profile_Slot *slot = 0;
|
||||||
|
if (record == 0 || record->id < id){
|
||||||
|
if (record == 0){
|
||||||
|
#define M "List ended before all nodes closed"
|
||||||
|
profile_parse_error(arena, insp, string_u8_litexpr(M), location);
|
||||||
|
#undef M
|
||||||
}
|
}
|
||||||
else if (slot->count == pivot_slot->count){
|
else{
|
||||||
i32 comp = string_compare(slot->source_location,
|
#define M "Node '%.*s' closed by parent ending (or higher priority sibling starting)"
|
||||||
pivot_slot->source_location);
|
String_Const_u8 str = push_u8_stringf(arena, M, string_expand(name));
|
||||||
if (comp < 0){
|
profile_parse_error(arena, insp, str, location);
|
||||||
goes_first = true;
|
#undef M
|
||||||
}
|
if (parent->id != 0){
|
||||||
else if (comp == 0){
|
quit_loop = true;
|
||||||
if (slot->slot_index < pivot_slot->slot_index){
|
|
||||||
goes_first = true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
slot = profile_parse_get_slot(arena, insp, location, name);
|
||||||
|
}
|
||||||
|
else if (record->id == id){
|
||||||
|
String_Const_u8 close_location = record->location;
|
||||||
|
String_Const_u8 close_name = record->name;
|
||||||
|
slot = profile_parse_get_slot(arena, insp, location, name);
|
||||||
|
node->time.max = record->time;
|
||||||
|
node->closed = true;
|
||||||
|
total_time_range->min = min(total_time_range->min, node->time.min);
|
||||||
|
total_time_range->max = max(total_time_range->max, node->time.max);
|
||||||
|
record = record->next;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
// NOTE(allen): This would mean that record exists and it's id
|
||||||
|
// is greater than id, but then the sub-call should not have returned!
|
||||||
|
InvalidPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
node->slot = slot;
|
||||||
|
if (!slot->corrupted_time){
|
||||||
|
if (node->closed){
|
||||||
|
slot->total_time += range_size(node->time);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
slot->corrupted_time = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (goes_first){
|
slot->hit_count += 1;
|
||||||
Swap(Profile_Universal_Slot*, slots[i], slots[j]);
|
|
||||||
j += 1;
|
if (quit_loop){
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Swap(Profile_Universal_Slot*, slots[j], slots[pivot]);
|
return(record);
|
||||||
sort_universal_slots(slots, first, j);
|
|
||||||
sort_universal_slots(slots, j + 1, one_past_last);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function Profile_Inspection
|
function Profile_Inspection
|
||||||
profile_inspect(Arena *arena, Profile_History *history){
|
profile_parse(Arena *arena){
|
||||||
Profile_Inspection inspect = {};
|
Mutex_Lock lock(global_prof_mutex);
|
||||||
for (Profile_Group *node = history->first;
|
Profile_Global_List *src = &global_prof_list;
|
||||||
node != 0;
|
|
||||||
node = node->next){
|
|
||||||
i32 thread_id = node->thread_id;
|
|
||||||
Profile_Thread *column = get_column_from_thread_id(inspect.thread_first,
|
|
||||||
thread_id);
|
|
||||||
if (column == 0){
|
|
||||||
column = push_array_zero(arena, Profile_Thread, 1);
|
|
||||||
sll_queue_push(inspect.thread_first, inspect.thread_last, column);
|
|
||||||
inspect.thread_count += 1;
|
|
||||||
column->thread_id = thread_id;
|
|
||||||
}
|
|
||||||
|
|
||||||
Profile_Group_Ptr *ptr = push_array(arena, Profile_Group_Ptr, 1);
|
Profile_Inspection result = {};
|
||||||
sll_queue_push(column->first_group, column->last_group, ptr);
|
|
||||||
ptr->group = node;
|
|
||||||
|
|
||||||
String_Const_u8 source_location = node->source_location;
|
result.thread_count = src->thread_count;
|
||||||
for (Profile_Record *record = node->first;
|
result.threads = push_array_zero(arena, Profile_Inspection_Thread,
|
||||||
record != 0;
|
result.thread_count);
|
||||||
record = record->next){
|
|
||||||
Profile_Universal_Slot *univ_slot =
|
|
||||||
get_universal_slot(column, source_location, record->slot_index);
|
|
||||||
if (univ_slot == 0){
|
|
||||||
univ_slot = push_array(arena, Profile_Universal_Slot, 1);
|
|
||||||
sll_queue_push(column->first_slot, column->last_slot, univ_slot);
|
|
||||||
column->slot_count += 1;
|
|
||||||
univ_slot->source_location = source_location;
|
|
||||||
univ_slot->slot_index = record->slot_index;
|
|
||||||
univ_slot->name = node->slot_names[univ_slot->slot_index];
|
|
||||||
univ_slot->count = 0;
|
|
||||||
univ_slot->total_time = 0;
|
|
||||||
}
|
|
||||||
univ_slot->count += 1;
|
|
||||||
univ_slot->total_time += record->time;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (Profile_Thread *column = inspect.thread_first;
|
|
||||||
column != 0;
|
|
||||||
column = column->next){
|
|
||||||
i32 count = column->slot_count;
|
|
||||||
Profile_Universal_Slot **slots = push_array(arena, Profile_Universal_Slot*, count);
|
|
||||||
column->sorted_slots = slots;
|
|
||||||
i32 counter = 0;
|
i32 counter = 0;
|
||||||
for (Profile_Universal_Slot *node = column->first_slot;
|
Profile_Inspection_Thread *insp_thread = result.threads;
|
||||||
|
for (Profile_Thread *node = src->first_thread;
|
||||||
node != 0;
|
node != 0;
|
||||||
node = node->next){
|
node = node->next, counter += 1, insp_thread += 1){
|
||||||
slots[counter] = node;
|
insp_thread->thread_id = node->thread_id;
|
||||||
counter += 1;
|
|
||||||
}
|
// NOTE(allen): This is the "negative infinity" range.
|
||||||
sort_universal_slots(slots, 0, count);
|
// We will be "maxing" it against all the ranges durring the parse,
|
||||||
|
// to get the root range.
|
||||||
|
Range_u64 time_range = {max_u64, 0};
|
||||||
|
profile_parse_record(arena, &result, &insp_thread->root, node->first_record,
|
||||||
|
&time_range);
|
||||||
|
insp_thread->root.time = time_range;
|
||||||
}
|
}
|
||||||
|
|
||||||
return(inspect);
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////
|
||||||
|
|
||||||
|
struct Tab_State{
|
||||||
|
Vec2_f32 p;
|
||||||
|
Range_f32 tabs_y;
|
||||||
|
Face_ID face_id;
|
||||||
|
f32 x_half_padding;
|
||||||
|
Vec2_f32 m_p;
|
||||||
|
};
|
||||||
|
|
||||||
|
function void
|
||||||
|
profile_draw_tab(Application_Links *app, Tab_State *state, Profile_Inspection *insp,
|
||||||
|
String_Const_u8 string, Profile_Inspection_Tab tab_id){
|
||||||
|
Scratch_Block scratch(app);
|
||||||
|
|
||||||
|
state->p.x += state->x_half_padding;
|
||||||
|
|
||||||
|
Fancy_String_List list = {};
|
||||||
|
push_fancy_string(scratch, &list, fancy_pass_through(), string);
|
||||||
|
|
||||||
|
b32 hover = false;
|
||||||
|
f32 width = get_fancy_string_advance(app, state->face_id, list.first);
|
||||||
|
Rect_f32 box = Rf32(If32_size(state->p.x, width), state->tabs_y);
|
||||||
|
if (rect_contains_point(box, state->m_p)){
|
||||||
|
hover = true;
|
||||||
|
insp->tab_id_hovered = tab_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
int_color text = Stag_Default;
|
||||||
|
int_color back = 0;
|
||||||
|
if (insp->tab_id == tab_id){
|
||||||
|
text = Stag_Pop2;
|
||||||
|
}
|
||||||
|
else if (hover){
|
||||||
|
text = Stag_Pop1;
|
||||||
|
}
|
||||||
|
|
||||||
|
Vec2_f32 np = draw_fancy_string(app, state->face_id, list.first, state->p,
|
||||||
|
text, back);
|
||||||
|
state->p = np;
|
||||||
|
state->p.x += state->x_half_padding;
|
||||||
}
|
}
|
||||||
|
|
||||||
function void
|
function void
|
||||||
|
@ -147,130 +204,172 @@ profile_render(Application_Links *app, Frame_Info frame_info, View_ID view){
|
||||||
f32 normal_advance = metrics.normal_advance;
|
f32 normal_advance = metrics.normal_advance;
|
||||||
f32 block_height = line_height*2.f;
|
f32 block_height = line_height*2.f;
|
||||||
|
|
||||||
system_mutex_acquire(profile_history.mutex);
|
Mouse_State mouse = get_mouse_state(app);
|
||||||
|
Vec2_f32 m_p = V2f32(mouse.p);
|
||||||
|
|
||||||
Profile_Inspection inspect = global_profile_inspection;
|
Profile_Inspection *inspect = &global_profile_inspection;
|
||||||
|
|
||||||
f32 column_width = rect_width(region)/(f32)inspect.thread_count;
|
if (inspect->thread_count == 0){
|
||||||
|
Fancy_String_List text = {};
|
||||||
Rect_f32_Pair header_body = rect_split_top_bottom(region, block_height);
|
push_fancy_string(scratch, &text, fancy_id(Stag_Pop2),
|
||||||
|
string_u8_litexpr("no profile data"));
|
||||||
Range_f32 full_y = rect_range_y(region);
|
f32 width = get_fancy_string_advance(app, face_id, text.first);
|
||||||
Range_f32 header_y = rect_range_y(header_body.min);
|
Vec2_f32 view_center = (region.p0 + region.p1)*0.5f;
|
||||||
Range_f32 body_y = rect_range_y(header_body.max);
|
Vec2_f32 half_dim = V2f32(width, line_height)*0.5f;
|
||||||
|
Vec2_f32 p = view_center - half_dim;
|
||||||
f32 pos_x = region.x0;
|
draw_fancy_string(app, face_id, text.first, p, Stag_Default, 0);
|
||||||
for (Profile_Thread *column = inspect.thread_first;
|
|
||||||
column != 0;
|
|
||||||
column = column->next){
|
|
||||||
Range_f32 column_x = If32_size(pos_x, column_width);
|
|
||||||
Range_f32 text_x = If32(column_x.min + 6.f, column_x.max - 6.f);
|
|
||||||
f32 text_width = range_size(text_x);
|
|
||||||
f32 count_width = normal_advance*6.f;
|
|
||||||
f32 time_width = normal_advance*9.f;
|
|
||||||
f32 half_padding = normal_advance*0.25f;
|
|
||||||
f32 label_width = text_width - count_width - time_width;
|
|
||||||
if (label_width < normal_advance*10.f){
|
|
||||||
f32 count_ratio = 6.f/25.f;
|
|
||||||
f32 time_ratio = 9.f/25.f;
|
|
||||||
f32 label_ratio = 10.f/25.f;
|
|
||||||
count_width = text_width*count_ratio;
|
|
||||||
time_width = text_width*time_ratio;
|
|
||||||
label_width = text_width*label_ratio;
|
|
||||||
}
|
}
|
||||||
|
else{
|
||||||
|
Rect_f32_Pair tabs_body = rect_split_top_bottom(region, line_height + 2.f);
|
||||||
|
Range_f32 tabs_y = rect_range_y(tabs_body.min);
|
||||||
|
|
||||||
i32 count = column->slot_count;
|
f32 x_padding = normal_advance*1.5f;
|
||||||
|
f32 x_half_padding = x_padding*0.5f;
|
||||||
|
|
||||||
draw_set_clip(app, Rf32(column_x, full_y));
|
inspect->tab_id_hovered = ProfileInspectTab_None;
|
||||||
|
block_zero_struct(&inspect->location_jump_hovered);
|
||||||
|
|
||||||
// NOTE(allen): header
|
// NOTE(allen): tabs
|
||||||
{
|
{
|
||||||
Rect_f32 box = Rf32(column_x, header_y);
|
f32 y = (tabs_y.min + tabs_y.max - line_height)*0.5f;
|
||||||
draw_rectangle_outline(app, box, 6.f, 3.f, Stag_Margin_Active);
|
f32 x = region.x0;
|
||||||
|
|
||||||
|
Tab_State tab_state = {};
|
||||||
|
tab_state.p = V2f32(x, y);
|
||||||
|
tab_state.tabs_y = tabs_y;
|
||||||
|
tab_state.face_id = face_id;
|
||||||
|
tab_state.x_half_padding = x_half_padding;
|
||||||
|
tab_state.m_p = m_p;
|
||||||
|
|
||||||
|
draw_rectangle(app, tabs_body.min, 0.f, Stag_Margin_Hover);
|
||||||
|
|
||||||
|
if (inspect->tab_id == ProfileInspectTab_None){
|
||||||
|
inspect->tab_id = ProfileInspectTab_Threads;
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTE(allen): list
|
profile_draw_tab(app, &tab_state, inspect,
|
||||||
|
string_u8_litexpr("threads"),
|
||||||
|
ProfileInspectTab_Threads);
|
||||||
|
|
||||||
|
if (inspect->slot_count > 0){
|
||||||
|
profile_draw_tab(app, &tab_state, inspect,
|
||||||
|
string_u8_litexpr("slots"),
|
||||||
|
ProfileInspectTab_Slots);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (inspect->error_count > 0){
|
||||||
|
profile_draw_tab(app, &tab_state, inspect,
|
||||||
|
string_u8_litexpr("errors"),
|
||||||
|
ProfileInspectTab_Errors);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (inspect->tab_id){
|
||||||
|
case ProfileInspectTab_Slots:
|
||||||
{
|
{
|
||||||
f32 pos_y = body_y.min;
|
draw_set_clip(app, tabs_body.max);
|
||||||
Profile_Universal_Slot **slot_ptr = column->sorted_slots;
|
Range_f32 x = rect_range_x(tabs_body.max);
|
||||||
for (i32 i = 0; i < count; i += 1, slot_ptr += 1){
|
f32 y_pos = tabs_body.max.y0;
|
||||||
Range_f32 slot_y = If32_size(pos_y, block_height);
|
for (Profile_Slot *node = inspect->first_slot;
|
||||||
Rect_f32 box = Rf32(column_x, slot_y);
|
node != 0;
|
||||||
draw_rectangle_outline(app, box, 6.f, 3.f, Stag_Margin);
|
node = node->next){
|
||||||
pos_y = slot_y.max;
|
Range_f32 y = If32_size(y_pos, block_height);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE(allen): header text
|
|
||||||
{
|
|
||||||
draw_set_clip(app, Rf32(text_x, full_y));
|
|
||||||
|
|
||||||
|
i32 name_width = 30;
|
||||||
Fancy_String_List list = {};
|
Fancy_String_List list = {};
|
||||||
push_fancy_stringf(scratch, &list, fancy_id(Stag_Keyword),
|
if (node->name.size > name_width){
|
||||||
"%d", column->thread_id);
|
|
||||||
f32 y = (header_y.min + header_y.max - line_height)*0.5f;
|
|
||||||
draw_fancy_string(app, face_id, list.first, V2f32(text_x.min, y), Stag_Default, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE(allen): list text counts
|
|
||||||
{
|
|
||||||
Range_f32 x = If32_size(text_x.min + label_width + time_width + half_padding, count_width);
|
|
||||||
f32 pos_y = body_y.min;
|
|
||||||
Profile_Universal_Slot **slot_ptr = column->sorted_slots;
|
|
||||||
for (i32 i = 0; i < count; i += 1, slot_ptr += 1){
|
|
||||||
Range_f32 slot_y = If32_size(pos_y, block_height);
|
|
||||||
f32 y = (slot_y.min + slot_y.max - line_height)*0.5f;
|
|
||||||
Profile_Universal_Slot *slot = *slot_ptr;
|
|
||||||
Fancy_String_List list = {};
|
|
||||||
push_fancy_stringf(scratch, &list, fancy_id(Stag_Pop1),
|
push_fancy_stringf(scratch, &list, fancy_id(Stag_Pop1),
|
||||||
"%5u", slot->count);
|
"%.*s... ",
|
||||||
draw_fancy_string(app, face_id, list.first, V2f32(x.min, y), Stag_Default, 0);
|
name_width - 3, node->name.str);
|
||||||
pos_y = slot_y.max;
|
|
||||||
}
|
}
|
||||||
|
else{
|
||||||
|
push_fancy_stringf(scratch, &list, fancy_id(Stag_Pop1),
|
||||||
|
"%-*.*s ",
|
||||||
|
name_width,
|
||||||
|
string_expand(node->name));
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTE(allen): list text labels
|
if (node->corrupted_time){
|
||||||
{
|
push_fancy_string(scratch, &list, fancy_id(Stag_Pop2),
|
||||||
Range_f32 x = If32_size(text_x.min + label_width + half_padding, time_width - half_padding);
|
string_u8_litexpr("timing error "));
|
||||||
draw_set_clip(app, Rf32(x, full_y));
|
}
|
||||||
|
else{
|
||||||
f32 pos_y = body_y.min;
|
|
||||||
Profile_Universal_Slot **slot_ptr = column->sorted_slots;
|
|
||||||
for (i32 i = 0; i < count; i += 1, slot_ptr += 1){
|
|
||||||
Range_f32 slot_y = If32_size(pos_y, block_height);
|
|
||||||
f32 y = (slot_y.min + slot_y.max - line_height)*0.5f;
|
|
||||||
Profile_Universal_Slot *slot = *slot_ptr;
|
|
||||||
Fancy_String_List list = {};
|
|
||||||
push_fancy_stringf(scratch, &list, fancy_id(Stag_Pop2),
|
push_fancy_stringf(scratch, &list, fancy_id(Stag_Pop2),
|
||||||
"%-8.6f", (f32)(slot->total_time)/1000000.f);
|
"%11.8fs ",
|
||||||
draw_fancy_string(app, face_id, list.first, V2f32(x.min, y), Stag_Default, 0);
|
((f32)node->total_time)/1000000.f);
|
||||||
pos_y = slot_y.max;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTE(allen): list text labels
|
push_fancy_stringf(scratch, &list, fancy_id(Stag_Keyword),
|
||||||
|
"hit # %5d", node->hit_count);
|
||||||
|
|
||||||
|
Vec2_f32 p = V2f32(x.min + x_half_padding,
|
||||||
|
(y.min + y.max - line_height)*0.5f);
|
||||||
|
draw_fancy_string(app, face_id, list.first, p, 0, 0);
|
||||||
|
|
||||||
|
Rect_f32 box = Rf32(x, y);
|
||||||
|
int_color margin = Stag_Margin;
|
||||||
|
if (rect_contains_point(box, m_p)){
|
||||||
|
inspect->location_jump_hovered = node->location;
|
||||||
|
margin = Stag_Margin_Hover;
|
||||||
|
}
|
||||||
|
draw_rectangle_outline(app, box, 6.f, 3.f, margin);
|
||||||
|
|
||||||
|
y_pos = y.max;
|
||||||
|
}
|
||||||
|
}break;
|
||||||
|
|
||||||
|
case ProfileInspectTab_Errors:
|
||||||
{
|
{
|
||||||
Range_f32 x = If32_size(text_x.min, label_width - half_padding);
|
draw_set_clip(app, tabs_body.max);
|
||||||
draw_set_clip(app, Rf32(x, full_y));
|
Range_f32 x = rect_range_x(tabs_body.max);
|
||||||
|
f32 y_pos = tabs_body.max.y0;
|
||||||
|
for (Profile_Error *node = inspect->first_error;
|
||||||
|
node != 0;
|
||||||
|
node = node->next){
|
||||||
|
Range_f32 y = If32_size(y_pos, block_height);
|
||||||
|
|
||||||
f32 pos_y = body_y.min;
|
|
||||||
Profile_Universal_Slot **slot_ptr = column->sorted_slots;
|
|
||||||
for (i32 i = 0; i < count; i += 1, slot_ptr += 1){
|
|
||||||
Range_f32 slot_y = If32_size(pos_y, block_height);
|
|
||||||
f32 y = (slot_y.min + slot_y.max - line_height)*0.5f;
|
|
||||||
Profile_Universal_Slot *slot = *slot_ptr;
|
|
||||||
Fancy_String_List list = {};
|
Fancy_String_List list = {};
|
||||||
push_fancy_stringf(scratch, &list, fancy_id(Stag_Default),
|
push_fancy_string(scratch, &list, fancy_id(Stag_Pop2),
|
||||||
"%.*s ", string_expand(slot->name));
|
node->message);
|
||||||
draw_fancy_string(app, face_id, list.first, V2f32(x.min, y), Stag_Default, 0);
|
|
||||||
pos_y = slot_y.max;
|
Vec2_f32 p = V2f32(x.min + x_half_padding,
|
||||||
|
(y.min + y.max - line_height)*0.5f);
|
||||||
|
draw_fancy_string(app, face_id, list.first, p, 0, 0);
|
||||||
|
|
||||||
|
Rect_f32 box = Rf32(x, y);
|
||||||
|
int_color margin = Stag_Margin;
|
||||||
|
if (rect_contains_point(box, m_p)){
|
||||||
|
inspect->location_jump_hovered = node->location;
|
||||||
|
margin = Stag_Margin_Hover;
|
||||||
}
|
}
|
||||||
|
draw_rectangle_outline(app, box, 6.f, 3.f, margin);
|
||||||
|
|
||||||
|
y_pos = y.max;
|
||||||
|
}
|
||||||
|
}break;
|
||||||
}
|
}
|
||||||
|
|
||||||
pos_x = column_x.max;
|
if (inspect->tab_id_hovered != ProfileInspectTab_None){
|
||||||
|
// NOTE(allen): no tool tip for tabs
|
||||||
}
|
}
|
||||||
|
else if (inspect->location_jump_hovered.size > 0){
|
||||||
|
draw_set_clip(app, region);
|
||||||
|
|
||||||
system_mutex_release(profile_history.mutex);
|
Fancy_String_List list = {};
|
||||||
|
push_fancy_stringf(scratch, &list, fancy_rgba(1.f, 1.f, 1.f, 0.5f),
|
||||||
|
"jump to: '%.*s'",
|
||||||
|
string_expand(inspect->location_jump_hovered));
|
||||||
|
f32 width = get_fancy_string_advance(app, face_id, list.first);
|
||||||
|
Vec2_f32 dims = V2f32(width + x_padding, line_height + 2.f);
|
||||||
|
Rect_f32 box = get_tool_tip_box(region, m_p, dims);
|
||||||
|
if (rect_area(box) > 0.f){
|
||||||
|
draw_rectangle(app, box, 6.f, 0x80000000);
|
||||||
|
draw_fancy_string(app, face_id, list.first,
|
||||||
|
V2f32(box.x0 + x_half_padding, box.y0 + 1.f),
|
||||||
|
0, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
draw_set_clip(app, prev_clip);
|
draw_set_clip(app, prev_clip);
|
||||||
}
|
}
|
||||||
|
@ -278,14 +377,15 @@ profile_render(Application_Links *app, Frame_Info frame_info, View_ID view){
|
||||||
CUSTOM_COMMAND_SIG(profile_inspect)
|
CUSTOM_COMMAND_SIG(profile_inspect)
|
||||||
CUSTOM_DOC("Inspect all currently collected profiling information in 4coder's self profiler.")
|
CUSTOM_DOC("Inspect all currently collected profiling information in 4coder's self profiler.")
|
||||||
{
|
{
|
||||||
if (HasFlag(profile_history.disable_bits, ProfileEnable_InspectBit)){
|
if (HasFlag(global_prof_list.disable_bits, ProfileEnable_InspectBit)){
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
profile_history_set_enabled(false, ProfileEnable_InspectBit);
|
global_prof_set_enabled(false, ProfileEnable_InspectBit);
|
||||||
|
|
||||||
Scratch_Block scratch(app);
|
Scratch_Block scratch(app);
|
||||||
global_profile_inspection = profile_inspect(scratch, &profile_history);
|
global_profile_inspection = profile_parse(scratch);
|
||||||
|
Profile_Inspection *insp = &global_profile_inspection;
|
||||||
|
|
||||||
View_ID view = get_active_view(app, Access_Always);
|
View_ID view = get_active_view(app, Access_Always);
|
||||||
View_Context ctx = view_current_context(app, view);
|
View_Context ctx = view_current_context(app, view);
|
||||||
|
@ -299,17 +399,31 @@ CUSTOM_DOC("Inspect all currently collected profiling information in 4coder's se
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
b32 handled = true;
|
b32 handled = true;
|
||||||
switch (in.event.kind){
|
switch (in.event.kind){
|
||||||
|
case InputEventKind_MouseButton:
|
||||||
|
{
|
||||||
|
switch (in.event.mouse.code){
|
||||||
|
case MouseCode_Left:
|
||||||
|
{
|
||||||
|
if (insp->tab_id_hovered != ProfileInspectTab_None){
|
||||||
|
insp->tab_id = insp->tab_id_hovered;
|
||||||
|
}
|
||||||
|
else if (insp->location_jump_hovered.size != 0){
|
||||||
|
View_ID target_view = view;
|
||||||
|
target_view = get_next_view_looped_primary_panels(app, target_view, Access_Always);
|
||||||
|
String_Const_u8 location = insp->location_jump_hovered;
|
||||||
|
jump_to_location(app, target_view, location);
|
||||||
|
}
|
||||||
|
}break;
|
||||||
|
}
|
||||||
|
}break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
handled = false;
|
handled = false;
|
||||||
}break;
|
}break;
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
b32 handled = false;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (!handled){
|
if (!handled){
|
||||||
// TODO(allen): dedup this stuff.
|
// TODO(allen): dedup this stuff.
|
||||||
|
@ -337,7 +451,7 @@ CUSTOM_DOC("Inspect all currently collected profiling information in 4coder's se
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
profile_history_set_enabled(true, ProfileEnable_InspectBit);
|
global_prof_set_enabled(true, ProfileEnable_InspectBit);
|
||||||
|
|
||||||
view_pop_context(app, view);
|
view_pop_context(app, view);
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,41 +7,62 @@
|
||||||
#if !defined(FCODER_PROFILE_INSPECT_H)
|
#if !defined(FCODER_PROFILE_INSPECT_H)
|
||||||
#define FCODER_PROFILE_INSPECT_H
|
#define FCODER_PROFILE_INSPECT_H
|
||||||
|
|
||||||
struct Profile_Group_Ptr{
|
struct Profile_Slot{
|
||||||
Profile_Group_Ptr *next;
|
Profile_Slot *next;
|
||||||
Profile_Group *group;
|
String_Const_u8 location;
|
||||||
};
|
|
||||||
|
|
||||||
struct Profile_Universal_Slot{
|
|
||||||
Profile_Universal_Slot *next;
|
|
||||||
|
|
||||||
String_Const_u8 source_location;
|
|
||||||
u32 slot_index;
|
|
||||||
|
|
||||||
String_Const_u8 name;
|
String_Const_u8 name;
|
||||||
|
|
||||||
u32 count;
|
b32 corrupted_time;
|
||||||
u64 total_time;
|
u64 total_time;
|
||||||
|
i32 hit_count;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Profile_Thread{
|
struct Profile_Node{
|
||||||
Profile_Thread *next;
|
Profile_Node *next;
|
||||||
|
Profile_Slot *slot;
|
||||||
|
Range_u64 time;
|
||||||
|
Profile_ID id;
|
||||||
|
|
||||||
|
Profile_Node *first_child;
|
||||||
|
Profile_Node *last_child;
|
||||||
|
i32 child_count;
|
||||||
|
|
||||||
|
b32 closed;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Profile_Inspection_Thread{
|
||||||
i32 thread_id;
|
i32 thread_id;
|
||||||
|
Profile_Node root;
|
||||||
|
};
|
||||||
|
|
||||||
Profile_Group_Ptr *first_group;
|
struct Profile_Error{
|
||||||
Profile_Group_Ptr *last_group;
|
Profile_Error *next;
|
||||||
|
String_Const_u8 message;
|
||||||
|
String_Const_u8 location;
|
||||||
|
};
|
||||||
|
|
||||||
Profile_Universal_Slot *first_slot;
|
typedef i32 Profile_Inspection_Tab;
|
||||||
Profile_Universal_Slot *last_slot;
|
enum{
|
||||||
i32 slot_count;
|
ProfileInspectTab_None,
|
||||||
|
ProfileInspectTab_Threads,
|
||||||
Profile_Universal_Slot **sorted_slots;
|
ProfileInspectTab_Slots,
|
||||||
|
ProfileInspectTab_Errors
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Profile_Inspection{
|
struct Profile_Inspection{
|
||||||
Profile_Thread *thread_first;
|
Profile_Slot *first_slot;
|
||||||
Profile_Thread *thread_last;
|
Profile_Slot *last_slot;
|
||||||
|
Profile_Error *first_error;
|
||||||
|
Profile_Error *last_error;
|
||||||
|
Profile_Inspection_Thread *threads;
|
||||||
|
i32 slot_count;
|
||||||
i32 thread_count;
|
i32 thread_count;
|
||||||
|
i32 error_count;
|
||||||
|
|
||||||
|
Profile_Inspection_Tab tab_id;
|
||||||
|
Profile_Inspection_Tab tab_id_hovered;
|
||||||
|
|
||||||
|
String_Const_u8 location_jump_hovered;
|
||||||
};
|
};
|
||||||
|
|
||||||
global Profile_Inspection global_profile_inspection = {};
|
global Profile_Inspection global_profile_inspection = {};
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
/*
|
||||||
|
* 4coder_profile_static_disable.cpp - Statically removes all profile posting code
|
||||||
|
* that follows until the next 4coder_profile_static_enable.cpp
|
||||||
|
*/
|
||||||
|
|
||||||
|
// TOP
|
||||||
|
|
||||||
|
#if defined(ProfileBegin)
|
||||||
|
#undef ProfileBegin
|
||||||
|
#undef ProfileEnd
|
||||||
|
#undef ProfileBlock
|
||||||
|
#undef ProfileScope
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define ProfileBegin(T,N)
|
||||||
|
#define ProfileEnd(T,I)
|
||||||
|
#define ProfileBlock(T,N)
|
||||||
|
#define ProfileScope(T,N)
|
||||||
|
|
||||||
|
// BOTTOM
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
/*
|
||||||
|
* 4coder_profile_static_enable.cpp - Macro interface for self profiler.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// TOP
|
||||||
|
|
||||||
|
#if defined(ProfileBegin)
|
||||||
|
#undef ProfileBegin
|
||||||
|
#undef ProfileEnd
|
||||||
|
#undef ProfileBlock
|
||||||
|
#undef ProfileScope
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define ProfileBegin(T,N) \
|
||||||
|
thread_profile_record_push((T), system_now_time(), \
|
||||||
|
string_u8_litexpr(N), string_u8_litexpr(file_name_line_number))
|
||||||
|
|
||||||
|
#define ProfileEnd(T,I) thread_profile_record_pop((T), system_now_time(), (I))
|
||||||
|
|
||||||
|
#define ProfileBlock(T,N) \
|
||||||
|
Profile_Block glue(profile_block_, __LINE__) \
|
||||||
|
((T), string_u8_litexpr(N), string_u8_litexpr(file_name_line_number))
|
||||||
|
|
||||||
|
#define ProfileScope(T,N) \
|
||||||
|
Profile_Scope_Block glue(profile_block_, __LINE__) \
|
||||||
|
((T), string_u8_litexpr(N), string_u8_litexpr(file_name_line_number))
|
||||||
|
|
||||||
|
// BOTTOM
|
||||||
|
|
|
@ -289,6 +289,7 @@ word_complete_list_extend_from_raw(Application_Links *app, Arena *arena,
|
||||||
String_Match_List *matches,
|
String_Match_List *matches,
|
||||||
List_String_Const_u8 *list,
|
List_String_Const_u8 *list,
|
||||||
Table_Data_u64 *used_table){
|
Table_Data_u64 *used_table){
|
||||||
|
ProfileScope(app, "word complete list extend from raw");
|
||||||
Scratch_Block scratch(app);
|
Scratch_Block scratch(app);
|
||||||
for (String_Match *node = matches->first;
|
for (String_Match *node = matches->first;
|
||||||
node != 0;
|
node != 0;
|
||||||
|
@ -391,6 +392,8 @@ word_complete_it_read(Word_Complete_Iterator *it){
|
||||||
CUSTOM_COMMAND_SIG(word_complete)
|
CUSTOM_COMMAND_SIG(word_complete)
|
||||||
CUSTOM_DOC("Iteratively tries completing the word to the left of the cursor with other words in open buffers that have the same prefix string.")
|
CUSTOM_DOC("Iteratively tries completing the word to the left of the cursor with other words in open buffers that have the same prefix string.")
|
||||||
{
|
{
|
||||||
|
ProfileScope(app, "word complete");
|
||||||
|
|
||||||
View_ID view = get_active_view(app, Access_ReadWriteVisible);
|
View_ID view = get_active_view(app, Access_ReadWriteVisible);
|
||||||
Buffer_ID buffer = view_get_buffer(app, view, Access_ReadWriteVisible);
|
Buffer_ID buffer = view_get_buffer(app, view, Access_ReadWriteVisible);
|
||||||
if (buffer != 0){
|
if (buffer != 0){
|
||||||
|
@ -412,6 +415,8 @@ CUSTOM_DOC("Iteratively tries completing the word to the left of the cursor with
|
||||||
local_persist Word_Complete_State state = {};
|
local_persist Word_Complete_State state = {};
|
||||||
|
|
||||||
if (first_completion || !state.initialized){
|
if (first_completion || !state.initialized){
|
||||||
|
ProfileBlock(app, "word complete state init");
|
||||||
|
|
||||||
word_complete_it_release(&state.it);
|
word_complete_it_release(&state.it);
|
||||||
|
|
||||||
i64 pos = view_get_cursor_pos(app, view);
|
i64 pos = view_get_cursor_pos(app, view);
|
||||||
|
@ -425,6 +430,8 @@ CUSTOM_DOC("Iteratively tries completing the word to the left of the cursor with
|
||||||
}
|
}
|
||||||
|
|
||||||
if (state.initialized){
|
if (state.initialized){
|
||||||
|
ProfileBlock(app, "word complete apply");
|
||||||
|
|
||||||
word_complete_it_next(&state.it);
|
word_complete_it_next(&state.it);
|
||||||
String_Const_u8 str = word_complete_it_read(&state.it);
|
String_Const_u8 str = word_complete_it_read(&state.it);
|
||||||
|
|
||||||
|
|
|
@ -454,18 +454,18 @@ STRUCT Record_Info{
|
||||||
|
|
||||||
TYPEDEF void Custom_Command_Function(struct Application_Links *app);
|
TYPEDEF void Custom_Command_Function(struct Application_Links *app);
|
||||||
|
|
||||||
#if defined(CUSTOM_COMMAND_SIG) || defined(CUSTOM_DOC) || defined(CUSTOM_ALIAS)
|
#if defined(CUSTOM_COMMAND_SIG) || defined(CUSTOM_UI_COMMAND) || defined(CUSTOM_DOC) || defined(CUSTOM_COMMAND)
|
||||||
#error Please do not define CUSTOM_COMMAND_SIG, CUSTOM_DOC, or CUSTOM_ALIAS
|
#error Please do not define CUSTOM_COMMAND_SIG, CUSTOM_DOC, or CUSTOM_UI_COMMAND
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(META_PASS)
|
#if !defined(META_PASS)
|
||||||
#define CUSTOM_COMMAND_SIG(name) void name(struct Application_Links *app)
|
#define CUSTOM_COMMAND_SIG(name) void name(struct Application_Links *app)
|
||||||
|
#define CUSTOM_UI_COMMAND_SIG(name) void name(struct Application_Links *app)
|
||||||
#define CUSTOM_DOC(str)
|
#define CUSTOM_DOC(str)
|
||||||
#define CUSTOM_ALIAS(x) x
|
|
||||||
#else
|
#else
|
||||||
#define CUSTOM_COMMAND_SIG(name) CUSTOM_COMMAND_SIG(name, __FILE__, __LINE__)
|
#define CUSTOM_COMMAND_SIG(name) CUSTOM_COMMAND(name, __FILE__, __LINE__, Normal)
|
||||||
|
#define CUSTOM_UI_COMMAND_SIG(name) CUSTOM_COMMAND(name, __FILE__, __LINE__, UI)
|
||||||
#define CUSTOM_DOC(str) CUSTOM_DOC(str)
|
#define CUSTOM_DOC(str) CUSTOM_DOC(str)
|
||||||
#define CUSTOM_ALIAS(x) CUSTOM_ALIAS(x)
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// TODO(allen): rename
|
// TODO(allen): rename
|
||||||
|
|
|
@ -223,6 +223,7 @@ CUSTOM_COMMAND_SIG(default_try_exit);
|
||||||
#endif
|
#endif
|
||||||
struct Command_Metadata{
|
struct Command_Metadata{
|
||||||
PROC_LINKS(Custom_Command_Function, void) *proc;
|
PROC_LINKS(Custom_Command_Function, void) *proc;
|
||||||
|
b32 is_ui;
|
||||||
char *name;
|
char *name;
|
||||||
i32 name_len;
|
i32 name_len;
|
||||||
char *description;
|
char *description;
|
||||||
|
@ -232,217 +233,217 @@ i32 source_name_len;
|
||||||
i32 line_number;
|
i32 line_number;
|
||||||
};
|
};
|
||||||
static Command_Metadata fcoder_metacmd_table[211] = {
|
static Command_Metadata fcoder_metacmd_table[211] = {
|
||||||
{ 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(default_view_input_handler, 0), false, "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(profile_enable, 0), "profile_enable", 14, "Allow 4coder's self profiler to gather new profiling information.", 65, "w:\\4ed\\code\\custom\\4coder_profile.cpp", 37, 127 },
|
{ PROC_LINKS(profile_enable, 0), false, "profile_enable", 14, "Allow 4coder's self profiler to gather new profiling information.", 65, "w:\\4ed\\code\\custom\\4coder_profile.cpp", 37, 196 },
|
||||||
{ PROC_LINKS(profile_disable, 0), "profile_disable", 15, "Prevent 4coder's self profiler from gathering new profiling information.", 72, "w:\\4ed\\code\\custom\\4coder_profile.cpp", 37, 133 },
|
{ PROC_LINKS(profile_disable, 0), false, "profile_disable", 15, "Prevent 4coder's self profiler from gathering new profiling information.", 72, "w:\\4ed\\code\\custom\\4coder_profile.cpp", 37, 202 },
|
||||||
{ PROC_LINKS(profile_clear, 0), "profile_clear", 13, "Clear all profiling information from 4coder's self profiler.", 60, "w:\\4ed\\code\\custom\\4coder_profile.cpp", 37, 139 },
|
{ PROC_LINKS(profile_clear, 0), false, "profile_clear", 13, "Clear all profiling information from 4coder's self profiler.", 60, "w:\\4ed\\code\\custom\\4coder_profile.cpp", 37, 208 },
|
||||||
{ 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, 2106 },
|
{ PROC_LINKS(seek_beginning_of_textual_line, 0), false, "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, 2106 },
|
||||||
{ 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, 2112 },
|
{ PROC_LINKS(seek_end_of_textual_line, 0), false, "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, 2112 },
|
||||||
{ 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, 2118 },
|
{ PROC_LINKS(seek_beginning_of_line, 0), false, "seek_beginning_of_line", 22, "Seeks the cursor to the beginning of the visual line.", 53, "w:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2118 },
|
||||||
{ 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, 2124 },
|
{ PROC_LINKS(seek_end_of_line, 0), false, "seek_end_of_line", 16, "Seeks the cursor to the end of the visual line.", 47, "w:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2124 },
|
||||||
{ 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, 2130 },
|
{ PROC_LINKS(goto_beginning_of_file, 0), false, "goto_beginning_of_file", 22, "Sets the cursor to the beginning of the file.", 45, "w:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2130 },
|
||||||
{ 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, 2138 },
|
{ PROC_LINKS(goto_end_of_file, 0), false, "goto_end_of_file", 16, "Sets the cursor to the end of the file.", 39, "w:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2138 },
|
||||||
{ 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, 203 },
|
{ PROC_LINKS(change_active_panel, 0), false, "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, 213 },
|
||||||
{ 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, 213 },
|
{ PROC_LINKS(change_active_panel_backwards, 0), false, "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, 223 },
|
||||||
{ 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, 223 },
|
{ PROC_LINKS(open_panel_vsplit, 0), false, "open_panel_vsplit", 17, "Create a new panel by vertically splitting the active panel.", 60, "w:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 233 },
|
||||||
{ PROC_LINKS(open_panel_hsplit, 0), "open_panel_hsplit", 17, "Create a new panel by horizontally splitting the active panel.", 62, "w:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 233 },
|
{ PROC_LINKS(open_panel_hsplit, 0), false, "open_panel_hsplit", 17, "Create a new panel by horizontally splitting the active panel.", 62, "w:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 243 },
|
||||||
{ PROC_LINKS(suppress_mouse, 0), "suppress_mouse", 14, "Hides the mouse and causes all mosue input (clicks, position, wheel) to be ignored.", 83, "w:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 298 },
|
{ PROC_LINKS(suppress_mouse, 0), false, "suppress_mouse", 14, "Hides the mouse and causes all mosue input (clicks, position, wheel) to be ignored.", 83, "w:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 308 },
|
||||||
{ PROC_LINKS(allow_mouse, 0), "allow_mouse", 11, "Shows the mouse and causes all mouse input to be processed normally.", 68, "w:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 304 },
|
{ PROC_LINKS(allow_mouse, 0), false, "allow_mouse", 11, "Shows the mouse and causes all mouse input to be processed normally.", 68, "w:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 314 },
|
||||||
{ PROC_LINKS(toggle_mouse, 0), "toggle_mouse", 12, "Toggles the mouse suppression mode, see suppress_mouse and allow_mouse.", 71, "w:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 310 },
|
{ PROC_LINKS(toggle_mouse, 0), false, "toggle_mouse", 12, "Toggles the mouse suppression mode, see suppress_mouse and allow_mouse.", 71, "w:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 320 },
|
||||||
{ PROC_LINKS(set_mode_to_original, 0), "set_mode_to_original", 20, "Sets the edit mode to 4coder original.", 38, "w:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 316 },
|
{ PROC_LINKS(set_mode_to_original, 0), false, "set_mode_to_original", 20, "Sets the edit mode to 4coder original.", 38, "w:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 326 },
|
||||||
{ PROC_LINKS(set_mode_to_notepad_like, 0), "set_mode_to_notepad_like", 24, "Sets the edit mode to Notepad like.", 35, "w:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 322 },
|
{ PROC_LINKS(set_mode_to_notepad_like, 0), false, "set_mode_to_notepad_like", 24, "Sets the edit mode to Notepad like.", 35, "w:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 332 },
|
||||||
{ PROC_LINKS(toggle_highlight_line_at_cursor, 0), "toggle_highlight_line_at_cursor", 31, "Toggles the line highlight at the cursor.", 41, "w:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 328 },
|
{ PROC_LINKS(toggle_highlight_line_at_cursor, 0), false, "toggle_highlight_line_at_cursor", 31, "Toggles the line highlight at the cursor.", 41, "w:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 338 },
|
||||||
{ PROC_LINKS(toggle_highlight_enclosing_scopes, 0), "toggle_highlight_enclosing_scopes", 33, "In code files scopes surrounding the cursor are highlighted with distinguishing colors.", 87, "w:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 334 },
|
{ PROC_LINKS(toggle_highlight_enclosing_scopes, 0), false, "toggle_highlight_enclosing_scopes", 33, "In code files scopes surrounding the cursor are highlighted with distinguishing colors.", 87, "w:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 344 },
|
||||||
{ PROC_LINKS(toggle_paren_matching_helper, 0), "toggle_paren_matching_helper", 28, "In code files matching parentheses pairs are colored with distinguishing colors.", 80, "w:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 340 },
|
{ PROC_LINKS(toggle_paren_matching_helper, 0), false, "toggle_paren_matching_helper", 28, "In code files matching parentheses pairs are colored with distinguishing colors.", 80, "w:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 350 },
|
||||||
{ PROC_LINKS(toggle_fullscreen, 0), "toggle_fullscreen", 17, "Toggle fullscreen mode on or off. The change(s) do not take effect until the next frame.", 89, "w:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 346 },
|
{ PROC_LINKS(toggle_fullscreen, 0), false, "toggle_fullscreen", 17, "Toggle fullscreen mode on or off. The change(s) do not take effect until the next frame.", 89, "w:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 356 },
|
||||||
{ PROC_LINKS(write_text_input, 0), "write_text_input", 16, "Inserts whatever character was used to trigger this command.", 60, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 58 },
|
{ PROC_LINKS(write_text_input, 0), false, "write_text_input", 16, "Inserts whatever character was used to trigger this command.", 60, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 58 },
|
||||||
{ PROC_LINKS(write_space, 0), "write_space", 11, "Inserts an underscore.", 22, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 66 },
|
{ PROC_LINKS(write_space, 0), false, "write_space", 11, "Inserts an underscore.", 22, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 66 },
|
||||||
{ PROC_LINKS(write_underscore, 0), "write_underscore", 16, "Inserts an underscore.", 22, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 72 },
|
{ PROC_LINKS(write_underscore, 0), false, "write_underscore", 16, "Inserts an underscore.", 22, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 72 },
|
||||||
{ PROC_LINKS(delete_char, 0), "delete_char", 11, "Deletes the character to the right of the cursor.", 49, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 78 },
|
{ PROC_LINKS(delete_char, 0), false, "delete_char", 11, "Deletes the character to the right of the cursor.", 49, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 78 },
|
||||||
{ PROC_LINKS(backspace_char, 0), "backspace_char", 14, "Deletes the character to the left of the cursor.", 48, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 95 },
|
{ PROC_LINKS(backspace_char, 0), false, "backspace_char", 14, "Deletes the character to the left of the cursor.", 48, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 95 },
|
||||||
{ PROC_LINKS(set_mark, 0), "set_mark", 8, "Sets the mark to the current position of the cursor.", 52, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 114 },
|
{ PROC_LINKS(set_mark, 0), false, "set_mark", 8, "Sets the mark to the current position of the cursor.", 52, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 114 },
|
||||||
{ PROC_LINKS(cursor_mark_swap, 0), "cursor_mark_swap", 16, "Swaps the position of the cursor and the mark.", 46, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 123 },
|
{ PROC_LINKS(cursor_mark_swap, 0), false, "cursor_mark_swap", 16, "Swaps the position of the cursor and the mark.", 46, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 123 },
|
||||||
{ PROC_LINKS(delete_range, 0), "delete_range", 12, "Deletes the text in the range between the cursor and the mark.", 62, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 133 },
|
{ PROC_LINKS(delete_range, 0), false, "delete_range", 12, "Deletes the text in the range between the cursor and the mark.", 62, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 133 },
|
||||||
{ PROC_LINKS(backspace_alpha_numeric_boundary, 0), "backspace_alpha_numeric_boundary", 32, "Delete characters between the cursor position and the first alphanumeric boundary to the left.", 94, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 153 },
|
{ PROC_LINKS(backspace_alpha_numeric_boundary, 0), false, "backspace_alpha_numeric_boundary", 32, "Delete characters between the cursor position and the first alphanumeric boundary to the left.", 94, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 153 },
|
||||||
{ PROC_LINKS(delete_alpha_numeric_boundary, 0), "delete_alpha_numeric_boundary", 29, "Delete characters between the cursor position and the first alphanumeric boundary to the right.", 95, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 161 },
|
{ PROC_LINKS(delete_alpha_numeric_boundary, 0), false, "delete_alpha_numeric_boundary", 29, "Delete characters between the cursor position and the first alphanumeric boundary to the right.", 95, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 161 },
|
||||||
{ PROC_LINKS(snipe_backward_whitespace_or_token_boundary, 0), "snipe_backward_whitespace_or_token_boundary", 43, "Delete a single, whole token on or to the left of the cursor and post it to the clipboard.", 90, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 181 },
|
{ PROC_LINKS(snipe_backward_whitespace_or_token_boundary, 0), false, "snipe_backward_whitespace_or_token_boundary", 43, "Delete a single, whole token on or to the left of the cursor and post it to the clipboard.", 90, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 181 },
|
||||||
{ PROC_LINKS(snipe_forward_whitespace_or_token_boundary, 0), "snipe_forward_whitespace_or_token_boundary", 42, "Delete a single, whole token on or to the right of the cursor and post it to the clipboard.", 91, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 189 },
|
{ PROC_LINKS(snipe_forward_whitespace_or_token_boundary, 0), false, "snipe_forward_whitespace_or_token_boundary", 42, "Delete a single, whole token on or to the right of the cursor and post it to the clipboard.", 91, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 189 },
|
||||||
{ PROC_LINKS(center_view, 0), "center_view", 11, "Centers the view vertically on the line on which the cursor sits.", 65, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 199 },
|
{ PROC_LINKS(center_view, 0), false, "center_view", 11, "Centers the view vertically on the line on which the cursor sits.", 65, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 199 },
|
||||||
{ PROC_LINKS(left_adjust_view, 0), "left_adjust_view", 16, "Sets the left size of the view near the x position of the cursor.", 65, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 213 },
|
{ PROC_LINKS(left_adjust_view, 0), false, "left_adjust_view", 16, "Sets the left size of the view near the x position of the cursor.", 65, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 213 },
|
||||||
{ PROC_LINKS(click_set_cursor_and_mark, 0), "click_set_cursor_and_mark", 25, "Sets the cursor position and mark to the mouse position.", 56, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 225 },
|
{ PROC_LINKS(click_set_cursor_and_mark, 0), false, "click_set_cursor_and_mark", 25, "Sets the cursor position and mark to the mouse position.", 56, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 225 },
|
||||||
{ PROC_LINKS(click_set_cursor, 0), "click_set_cursor", 16, "Sets the cursor position to the mouse position.", 47, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 235 },
|
{ PROC_LINKS(click_set_cursor, 0), false, "click_set_cursor", 16, "Sets the cursor position to the mouse position.", 47, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 235 },
|
||||||
{ PROC_LINKS(click_set_cursor_if_lbutton, 0), "click_set_cursor_if_lbutton", 27, "If the mouse left button is pressed, sets the cursor position to the mouse position.", 84, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 245 },
|
{ PROC_LINKS(click_set_cursor_if_lbutton, 0), false, "click_set_cursor_if_lbutton", 27, "If the mouse left button is pressed, sets the cursor position to the mouse position.", 84, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 245 },
|
||||||
{ PROC_LINKS(click_set_mark, 0), "click_set_mark", 14, "Sets the mark position to the mouse position.", 45, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 257 },
|
{ PROC_LINKS(click_set_mark, 0), false, "click_set_mark", 14, "Sets the mark position to the mouse position.", 45, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 257 },
|
||||||
{ PROC_LINKS(mouse_wheel_scroll, 0), "mouse_wheel_scroll", 18, "Reads the scroll wheel value from the mouse state and scrolls accordingly.", 74, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 267 },
|
{ PROC_LINKS(mouse_wheel_scroll, 0), false, "mouse_wheel_scroll", 18, "Reads the scroll wheel value from the mouse state and scrolls accordingly.", 74, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 267 },
|
||||||
{ PROC_LINKS(move_up, 0), "move_up", 7, "Moves the cursor up one line.", 29, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 321 },
|
{ PROC_LINKS(move_up, 0), false, "move_up", 7, "Moves the cursor up one line.", 29, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 321 },
|
||||||
{ PROC_LINKS(move_down, 0), "move_down", 9, "Moves the cursor down one line.", 31, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 327 },
|
{ PROC_LINKS(move_down, 0), false, "move_down", 9, "Moves the cursor down one line.", 31, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 327 },
|
||||||
{ PROC_LINKS(move_up_10, 0), "move_up_10", 10, "Moves the cursor up ten lines.", 30, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 333 },
|
{ PROC_LINKS(move_up_10, 0), false, "move_up_10", 10, "Moves the cursor up ten lines.", 30, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 333 },
|
||||||
{ PROC_LINKS(move_down_10, 0), "move_down_10", 12, "Moves the cursor down ten lines.", 32, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 339 },
|
{ PROC_LINKS(move_down_10, 0), false, "move_down_10", 12, "Moves the cursor down ten lines.", 32, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 339 },
|
||||||
{ PROC_LINKS(move_down_textual, 0), "move_down_textual", 17, "Moves down to the next line of actual text, regardless of line wrapping.", 72, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 345 },
|
{ PROC_LINKS(move_down_textual, 0), false, "move_down_textual", 17, "Moves down to the next line of actual text, regardless of line wrapping.", 72, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 345 },
|
||||||
{ PROC_LINKS(page_up, 0), "page_up", 7, "Scrolls the view up one view height and moves the cursor up one view height.", 76, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 355 },
|
{ PROC_LINKS(page_up, 0), false, "page_up", 7, "Scrolls the view up one view height and moves the cursor up one view height.", 76, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 355 },
|
||||||
{ PROC_LINKS(page_down, 0), "page_down", 9, "Scrolls the view down one view height and moves the cursor down one view height.", 80, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 363 },
|
{ PROC_LINKS(page_down, 0), false, "page_down", 9, "Scrolls the view down one view height and moves the cursor down one view height.", 80, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 363 },
|
||||||
{ PROC_LINKS(move_up_to_blank_line, 0), "move_up_to_blank_line", 21, "Seeks the cursor up to the next blank line.", 43, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 393 },
|
{ PROC_LINKS(move_up_to_blank_line, 0), false, "move_up_to_blank_line", 21, "Seeks the cursor up to the next blank line.", 43, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 393 },
|
||||||
{ PROC_LINKS(move_down_to_blank_line, 0), "move_down_to_blank_line", 23, "Seeks the cursor down to the next blank line.", 45, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 399 },
|
{ PROC_LINKS(move_down_to_blank_line, 0), false, "move_down_to_blank_line", 23, "Seeks the cursor down to the next blank line.", 45, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 399 },
|
||||||
{ PROC_LINKS(move_up_to_blank_line_skip_whitespace, 0), "move_up_to_blank_line_skip_whitespace", 37, "Seeks the cursor up to the next blank line and places it at the end of the line.", 80, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 405 },
|
{ PROC_LINKS(move_up_to_blank_line_skip_whitespace, 0), false, "move_up_to_blank_line_skip_whitespace", 37, "Seeks the cursor up to the next blank line and places it at the end of the line.", 80, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 405 },
|
||||||
{ PROC_LINKS(move_down_to_blank_line_skip_whitespace, 0), "move_down_to_blank_line_skip_whitespace", 39, "Seeks the cursor down to the next blank line and places it at the end of the line.", 82, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 411 },
|
{ PROC_LINKS(move_down_to_blank_line_skip_whitespace, 0), false, "move_down_to_blank_line_skip_whitespace", 39, "Seeks the cursor down to the next blank line and places it at the end of the line.", 82, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 411 },
|
||||||
{ PROC_LINKS(move_up_to_blank_line_end, 0), "move_up_to_blank_line_end", 25, "Seeks the cursor up to the next blank line and places it at the end of the line.", 80, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 417 },
|
{ PROC_LINKS(move_up_to_blank_line_end, 0), false, "move_up_to_blank_line_end", 25, "Seeks the cursor up to the next blank line and places it at the end of the line.", 80, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 417 },
|
||||||
{ PROC_LINKS(move_down_to_blank_line_end, 0), "move_down_to_blank_line_end", 27, "Seeks the cursor down to the next blank line and places it at the end of the line.", 82, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 423 },
|
{ PROC_LINKS(move_down_to_blank_line_end, 0), false, "move_down_to_blank_line_end", 27, "Seeks the cursor down to the next blank line and places it at the end of the line.", 82, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 423 },
|
||||||
{ PROC_LINKS(move_left, 0), "move_left", 9, "Moves the cursor one character to the left.", 43, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 429 },
|
{ PROC_LINKS(move_left, 0), false, "move_left", 9, "Moves the cursor one character to the left.", 43, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 429 },
|
||||||
{ PROC_LINKS(move_right, 0), "move_right", 10, "Moves the cursor one character to the right.", 44, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 441 },
|
{ PROC_LINKS(move_right, 0), false, "move_right", 10, "Moves the cursor one character to the right.", 44, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 441 },
|
||||||
{ PROC_LINKS(move_right_whitespace_boundary, 0), "move_right_whitespace_boundary", 30, "Seek right for the next boundary between whitespace and non-whitespace.", 71, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 463 },
|
{ PROC_LINKS(move_right_whitespace_boundary, 0), false, "move_right_whitespace_boundary", 30, "Seek right for the next boundary between whitespace and non-whitespace.", 71, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 463 },
|
||||||
{ PROC_LINKS(move_left_whitespace_boundary, 0), "move_left_whitespace_boundary", 29, "Seek left for the next boundary between whitespace and non-whitespace.", 70, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 471 },
|
{ PROC_LINKS(move_left_whitespace_boundary, 0), false, "move_left_whitespace_boundary", 29, "Seek left for the next boundary between whitespace and non-whitespace.", 70, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 471 },
|
||||||
{ PROC_LINKS(move_right_token_boundary, 0), "move_right_token_boundary", 25, "Seek right for the next end of a token.", 39, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 479 },
|
{ PROC_LINKS(move_right_token_boundary, 0), false, "move_right_token_boundary", 25, "Seek right for the next end of a token.", 39, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 479 },
|
||||||
{ PROC_LINKS(move_left_token_boundary, 0), "move_left_token_boundary", 24, "Seek left for the next beginning of a token.", 44, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 487 },
|
{ PROC_LINKS(move_left_token_boundary, 0), false, "move_left_token_boundary", 24, "Seek left for the next beginning of a token.", 44, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 487 },
|
||||||
{ PROC_LINKS(move_right_whitespace_or_token_boundary, 0), "move_right_whitespace_or_token_boundary", 39, "Seek right for the next end of a token or boundary between whitespace and non-whitespace.", 89, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 495 },
|
{ PROC_LINKS(move_right_whitespace_or_token_boundary, 0), false, "move_right_whitespace_or_token_boundary", 39, "Seek right for the next end of a token or boundary between whitespace and non-whitespace.", 89, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 495 },
|
||||||
{ PROC_LINKS(move_left_whitespace_or_token_boundary, 0), "move_left_whitespace_or_token_boundary", 38, "Seek left for the next end of a token or boundary between whitespace and non-whitespace.", 88, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 503 },
|
{ PROC_LINKS(move_left_whitespace_or_token_boundary, 0), false, "move_left_whitespace_or_token_boundary", 38, "Seek left for the next end of a token or boundary between whitespace and non-whitespace.", 88, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 503 },
|
||||||
{ PROC_LINKS(move_right_alpha_numeric_boundary, 0), "move_right_alpha_numeric_boundary", 33, "Seek right for boundary between alphanumeric characters and non-alphanumeric characters.", 88, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 511 },
|
{ PROC_LINKS(move_right_alpha_numeric_boundary, 0), false, "move_right_alpha_numeric_boundary", 33, "Seek right for boundary between alphanumeric characters and non-alphanumeric characters.", 88, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 511 },
|
||||||
{ PROC_LINKS(move_left_alpha_numeric_boundary, 0), "move_left_alpha_numeric_boundary", 32, "Seek left for boundary between alphanumeric characters and non-alphanumeric characters.", 87, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 519 },
|
{ PROC_LINKS(move_left_alpha_numeric_boundary, 0), false, "move_left_alpha_numeric_boundary", 32, "Seek left for boundary between alphanumeric characters and non-alphanumeric characters.", 87, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 519 },
|
||||||
{ PROC_LINKS(move_right_alpha_numeric_or_camel_boundary, 0), "move_right_alpha_numeric_or_camel_boundary", 42, "Seek right for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.", 107, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 527 },
|
{ PROC_LINKS(move_right_alpha_numeric_or_camel_boundary, 0), false, "move_right_alpha_numeric_or_camel_boundary", 42, "Seek right for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.", 107, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 527 },
|
||||||
{ PROC_LINKS(move_left_alpha_numeric_or_camel_boundary, 0), "move_left_alpha_numeric_or_camel_boundary", 41, "Seek left for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.", 106, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 535 },
|
{ PROC_LINKS(move_left_alpha_numeric_or_camel_boundary, 0), false, "move_left_alpha_numeric_or_camel_boundary", 41, "Seek left for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.", 106, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 535 },
|
||||||
{ PROC_LINKS(select_all, 0), "select_all", 10, "Puts the cursor at the top of the file, and the mark at the bottom of the file.", 79, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 545 },
|
{ PROC_LINKS(select_all, 0), false, "select_all", 10, "Puts the cursor at the top of the file, and the mark at the bottom of the file.", 79, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 545 },
|
||||||
{ PROC_LINKS(to_uppercase, 0), "to_uppercase", 12, "Converts all ascii text in the range between the cursor and the mark to uppercase.", 82, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 558 },
|
{ PROC_LINKS(to_uppercase, 0), false, "to_uppercase", 12, "Converts all ascii text in the range between the cursor and the mark to uppercase.", 82, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 558 },
|
||||||
{ PROC_LINKS(to_lowercase, 0), "to_lowercase", 12, "Converts all ascii text in the range between the cursor and the mark to lowercase.", 82, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 571 },
|
{ PROC_LINKS(to_lowercase, 0), false, "to_lowercase", 12, "Converts all ascii text in the range between the cursor and the mark to lowercase.", 82, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 571 },
|
||||||
{ PROC_LINKS(clean_all_lines, 0), "clean_all_lines", 15, "Removes trailing whitespace from all lines in the current buffer.", 65, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 584 },
|
{ PROC_LINKS(clean_all_lines, 0), false, "clean_all_lines", 15, "Removes trailing whitespace from all lines in the current buffer.", 65, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 584 },
|
||||||
{ PROC_LINKS(basic_change_active_panel, 0), "basic_change_active_panel", 25, "Change the currently active panel, moving to the panel with the next highest view_id. Will not skipe the build panel if it is open.", 132, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 618 },
|
{ PROC_LINKS(basic_change_active_panel, 0), false, "basic_change_active_panel", 25, "Change the currently active panel, moving to the panel with the next highest view_id. Will not skipe the build panel if it is open.", 132, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 618 },
|
||||||
{ PROC_LINKS(close_panel, 0), "close_panel", 11, "Closes the currently active panel if it is not the only panel open.", 67, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 626 },
|
{ PROC_LINKS(close_panel, 0), false, "close_panel", 11, "Closes the currently active panel if it is not the only panel open.", 67, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 626 },
|
||||||
{ PROC_LINKS(show_scrollbar, 0), "show_scrollbar", 14, "Sets the current view to show it's scrollbar.", 45, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 635 },
|
{ PROC_LINKS(show_scrollbar, 0), false, "show_scrollbar", 14, "Sets the current view to show it's scrollbar.", 45, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 635 },
|
||||||
{ PROC_LINKS(hide_scrollbar, 0), "hide_scrollbar", 14, "Sets the current view to hide it's scrollbar.", 45, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 642 },
|
{ PROC_LINKS(hide_scrollbar, 0), false, "hide_scrollbar", 14, "Sets the current view to hide it's scrollbar.", 45, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 642 },
|
||||||
{ PROC_LINKS(show_filebar, 0), "show_filebar", 12, "Sets the current view to show it's filebar.", 43, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 649 },
|
{ PROC_LINKS(show_filebar, 0), false, "show_filebar", 12, "Sets the current view to show it's filebar.", 43, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 649 },
|
||||||
{ PROC_LINKS(hide_filebar, 0), "hide_filebar", 12, "Sets the current view to hide it's filebar.", 43, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 656 },
|
{ PROC_LINKS(hide_filebar, 0), false, "hide_filebar", 12, "Sets the current view to hide it's filebar.", 43, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 656 },
|
||||||
{ PROC_LINKS(toggle_filebar, 0), "toggle_filebar", 14, "Toggles the visibility status of the current view's filebar.", 60, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 663 },
|
{ PROC_LINKS(toggle_filebar, 0), false, "toggle_filebar", 14, "Toggles the visibility status of the current view's filebar.", 60, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 663 },
|
||||||
{ PROC_LINKS(toggle_fps_meter, 0), "toggle_fps_meter", 16, "Toggles the visibility of the FPS performance meter", 51, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 672 },
|
{ PROC_LINKS(toggle_fps_meter, 0), false, "toggle_fps_meter", 16, "Toggles the visibility of the FPS performance meter", 51, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 672 },
|
||||||
{ PROC_LINKS(increase_face_size, 0), "increase_face_size", 18, "Increase the size of the face used by the current buffer.", 57, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 678 },
|
{ PROC_LINKS(increase_face_size, 0), false, "increase_face_size", 18, "Increase the size of the face used by the current buffer.", 57, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 678 },
|
||||||
{ PROC_LINKS(decrease_face_size, 0), "decrease_face_size", 18, "Decrease the size of the face used by the current buffer.", 57, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 689 },
|
{ PROC_LINKS(decrease_face_size, 0), false, "decrease_face_size", 18, "Decrease the size of the face used by the current buffer.", 57, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 689 },
|
||||||
{ PROC_LINKS(mouse_wheel_change_face_size, 0), "mouse_wheel_change_face_size", 28, "Reads the state of the mouse wheel and uses it to either increase or decrease the face size.", 92, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 700 },
|
{ PROC_LINKS(mouse_wheel_change_face_size, 0), false, "mouse_wheel_change_face_size", 28, "Reads the state of the mouse wheel and uses it to either increase or decrease the face size.", 92, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 700 },
|
||||||
{ PROC_LINKS(toggle_virtual_whitespace, 0), "toggle_virtual_whitespace", 25, "Toggles the current buffer's virtual whitespace status.", 55, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 717 },
|
{ PROC_LINKS(toggle_virtual_whitespace, 0), false, "toggle_virtual_whitespace", 25, "Toggles the current buffer's virtual whitespace status.", 55, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 717 },
|
||||||
{ PROC_LINKS(toggle_show_whitespace, 0), "toggle_show_whitespace", 22, "Toggles the current buffer's whitespace visibility status.", 58, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 726 },
|
{ PROC_LINKS(toggle_show_whitespace, 0), false, "toggle_show_whitespace", 22, "Toggles the current buffer's whitespace visibility status.", 58, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 726 },
|
||||||
{ PROC_LINKS(toggle_line_numbers, 0), "toggle_line_numbers", 19, "Toggles the left margin line numbers.", 37, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 735 },
|
{ PROC_LINKS(toggle_line_numbers, 0), false, "toggle_line_numbers", 19, "Toggles the left margin line numbers.", 37, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 735 },
|
||||||
{ PROC_LINKS(exit_4coder, 0), "exit_4coder", 11, "Attempts to close 4coder.", 25, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 741 },
|
{ PROC_LINKS(exit_4coder, 0), false, "exit_4coder", 11, "Attempts to close 4coder.", 25, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 741 },
|
||||||
{ 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, 749 },
|
{ PROC_LINKS(goto_line, 0), false, "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, 749 },
|
||||||
{ 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, 977 },
|
{ PROC_LINKS(search, 0), false, "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, 977 },
|
||||||
{ 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, 983 },
|
{ PROC_LINKS(reverse_search, 0), false, "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, 983 },
|
||||||
{ 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, 989 },
|
{ PROC_LINKS(search_identifier, 0), false, "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, 989 },
|
||||||
{ 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, 995 },
|
{ PROC_LINKS(reverse_search_identifier, 0), false, "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, 995 },
|
||||||
{ 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, 1042 },
|
{ PROC_LINKS(replace_in_range, 0), false, "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, 1042 },
|
||||||
{ 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, 1051 },
|
{ PROC_LINKS(replace_in_buffer, 0), false, "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, 1051 },
|
||||||
{ 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, 1060 },
|
{ PROC_LINKS(replace_in_all_buffers, 0), false, "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, 1060 },
|
||||||
{ 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, 1150 },
|
{ PROC_LINKS(query_replace, 0), false, "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, 1150 },
|
||||||
{ 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, 1171 },
|
{ PROC_LINKS(query_replace_identifier, 0), false, "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, 1171 },
|
||||||
{ 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, 1187 },
|
{ PROC_LINKS(query_replace_selection, 0), false, "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, 1187 },
|
||||||
{ 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, 1222 },
|
{ PROC_LINKS(save_all_dirty_buffers, 0), false, "save_all_dirty_buffers", 22, "Saves all buffers marked dirty (showing the '*' indicator).", 59, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1222 },
|
||||||
{ 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, 1247 },
|
{ PROC_LINKS(delete_file_query, 0), false, "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, 1247 },
|
||||||
{ 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, 1291 },
|
{ PROC_LINKS(save_to_query, 0), false, "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, 1291 },
|
||||||
{ 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, 1324 },
|
{ PROC_LINKS(rename_file_query, 0), false, "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, 1324 },
|
||||||
{ 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, 1362 },
|
{ PROC_LINKS(make_directory_query, 0), false, "make_directory_query", 20, "Queries the user for a name and creates a new directory with the given name.", 76, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1362 },
|
||||||
{ 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, 1396 },
|
{ PROC_LINKS(move_line_up, 0), false, "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, 1396 },
|
||||||
{ 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, 1402 },
|
{ PROC_LINKS(move_line_down, 0), false, "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, 1402 },
|
||||||
{ 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, 1408 },
|
{ PROC_LINKS(duplicate_line, 0), false, "duplicate_line", 14, "Create a copy of the line on which the cursor sits.", 51, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1408 },
|
||||||
{ 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, 1422 },
|
{ PROC_LINKS(delete_line, 0), false, "delete_line", 11, "Delete the line the on which the cursor sits.", 45, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1422 },
|
||||||
{ 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, 1487 },
|
{ PROC_LINKS(open_file_in_quotes, 0), false, "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, 1487 },
|
||||||
{ 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, 1519 },
|
{ PROC_LINKS(open_matching_file_cpp, 0), false, "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, 1519 },
|
||||||
{ 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, 1532 },
|
{ PROC_LINKS(view_buffer_other_panel, 0), false, "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, 1532 },
|
||||||
{ 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, 1544 },
|
{ PROC_LINKS(swap_buffers_between_panels, 0), false, "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, 1544 },
|
||||||
{ PROC_LINKS(kill_buffer, 0), "kill_buffer", 11, "Kills the current buffer.", 25, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1578 },
|
{ PROC_LINKS(kill_buffer, 0), false, "kill_buffer", 11, "Kills the current buffer.", 25, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1578 },
|
||||||
{ PROC_LINKS(save, 0), "save", 4, "Saves the current buffer.", 25, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1586 },
|
{ PROC_LINKS(save, 0), false, "save", 4, "Saves the current buffer.", 25, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1586 },
|
||||||
{ PROC_LINKS(reopen, 0), "reopen", 6, "Reopen the current buffer from the hard drive.", 46, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1596 },
|
{ PROC_LINKS(reopen, 0), false, "reopen", 6, "Reopen the current buffer from the hard drive.", 46, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1596 },
|
||||||
{ 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, 1825 },
|
{ PROC_LINKS(undo, 0), false, "undo", 4, "Advances backwards through the undo history of the current buffer.", 66, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1825 },
|
||||||
{ 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, 1838 },
|
{ PROC_LINKS(redo, 0), false, "redo", 4, "Advances forwards through the undo history of the current buffer.", 65, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1838 },
|
||||||
{ 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, 1852 },
|
{ PROC_LINKS(undo_all_buffers, 0), false, "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, 1852 },
|
||||||
{ 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, 1923 },
|
{ PROC_LINKS(redo_all_buffers, 0), false, "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, 1923 },
|
||||||
{ 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, 2024 },
|
{ PROC_LINKS(open_in_other, 0), false, "open_in_other", 13, "Interactively opens a file in the other panel.", 46, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 2024 },
|
||||||
{ 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, 2031 },
|
{ PROC_LINKS(default_file_externally_modified, 0), false, "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, 2031 },
|
||||||
{ PROC_LINKS(set_eol_mode_to_crlf, 0), "set_eol_mode_to_crlf", 20, "Puts the buffer in crlf line ending mode.", 41, "w:\\4ed\\code\\custom\\4coder_eol.cpp", 33, 80 },
|
{ PROC_LINKS(set_eol_mode_to_crlf, 0), false, "set_eol_mode_to_crlf", 20, "Puts the buffer in crlf line ending mode.", 41, "w:\\4ed\\code\\custom\\4coder_eol.cpp", 33, 80 },
|
||||||
{ PROC_LINKS(set_eol_mode_to_lf, 0), "set_eol_mode_to_lf", 18, "Puts the buffer in lf line ending mode.", 39, "w:\\4ed\\code\\custom\\4coder_eol.cpp", 33, 91 },
|
{ PROC_LINKS(set_eol_mode_to_lf, 0), false, "set_eol_mode_to_lf", 18, "Puts the buffer in lf line ending mode.", 39, "w:\\4ed\\code\\custom\\4coder_eol.cpp", 33, 91 },
|
||||||
{ PROC_LINKS(set_eol_mode_to_binary, 0), "set_eol_mode_to_binary", 22, "Puts the buffer in bin line ending mode.", 40, "w:\\4ed\\code\\custom\\4coder_eol.cpp", 33, 102 },
|
{ PROC_LINKS(set_eol_mode_to_binary, 0), false, "set_eol_mode_to_binary", 22, "Puts the buffer in bin line ending mode.", 40, "w:\\4ed\\code\\custom\\4coder_eol.cpp", 33, 102 },
|
||||||
{ PROC_LINKS(set_eol_mode_from_contents, 0), "set_eol_mode_from_contents", 26, "Sets the buffer's line ending mode to match the contents of the buffer.", 71, "w:\\4ed\\code\\custom\\4coder_eol.cpp", 33, 113 },
|
{ PROC_LINKS(set_eol_mode_from_contents, 0), false, "set_eol_mode_from_contents", 26, "Sets the buffer's line ending mode to match the contents of the buffer.", 71, "w:\\4ed\\code\\custom\\4coder_eol.cpp", 33, 113 },
|
||||||
{ 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, 487 },
|
{ PROC_LINKS(interactive_switch_buffer, 0), true, "interactive_switch_buffer", 25, "Interactively switch to an open buffer.", 39, "w:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 487 },
|
||||||
{ PROC_LINKS(interactive_kill_buffer, 0), "interactive_kill_buffer", 23, "Interactively kill an open buffer.", 34, "w:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 506 },
|
{ PROC_LINKS(interactive_kill_buffer, 0), true, "interactive_kill_buffer", 23, "Interactively kill an open buffer.", 34, "w:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 506 },
|
||||||
{ 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, 577 },
|
{ PROC_LINKS(interactive_open_or_new, 0), true, "interactive_open_or_new", 23, "Interactively open a file out of the file system.", 49, "w:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 577 },
|
||||||
{ PROC_LINKS(interactive_new, 0), "interactive_new", 15, "Interactively creates a new file.", 33, "w:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 616 },
|
{ PROC_LINKS(interactive_new, 0), true, "interactive_new", 15, "Interactively creates a new file.", 33, "w:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 616 },
|
||||||
{ PROC_LINKS(interactive_open, 0), "interactive_open", 16, "Interactively opens a file.", 27, "w:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 649 },
|
{ PROC_LINKS(interactive_open, 0), true, "interactive_open", 16, "Interactively opens a file.", 27, "w:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 649 },
|
||||||
{ 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, 712 },
|
{ PROC_LINKS(command_lister, 0), true, "command_lister", 14, "Opens an interactive list of all registered commands.", 53, "w:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 712 },
|
||||||
{ 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_whole_file, 0), false, "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_line_at_cursor, 0), false, "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 },
|
{ PROC_LINKS(auto_indent_range, 0), false, "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 },
|
||||||
{ PROC_LINKS(write_text_and_auto_indent, 0), "write_text_and_auto_indent", 26, "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.", 145, "w:\\4ed\\code\\custom\\4coder_auto_indent.cpp", 41, 385 },
|
{ PROC_LINKS(write_text_and_auto_indent, 0), false, "write_text_and_auto_indent", 26, "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.", 145, "w:\\4ed\\code\\custom\\4coder_auto_indent.cpp", 41, 385 },
|
||||||
{ PROC_LINKS(list_all_locations, 0), "list_all_locations", 18, "Queries the user for a string and lists all exact case-sensitive matches found in all open buffers.", 99, "w:\\4ed\\code\\custom\\4coder_search.cpp", 36, 166 },
|
{ PROC_LINKS(list_all_locations, 0), false, "list_all_locations", 18, "Queries the user for a string and lists all exact case-sensitive matches found in all open buffers.", 99, "w:\\4ed\\code\\custom\\4coder_search.cpp", 36, 166 },
|
||||||
{ PROC_LINKS(list_all_substring_locations, 0), "list_all_substring_locations", 28, "Queries the user for a string and lists all case-sensitive substring matches found in all open buffers.", 103, "w:\\4ed\\code\\custom\\4coder_search.cpp", 36, 172 },
|
{ PROC_LINKS(list_all_substring_locations, 0), false, "list_all_substring_locations", 28, "Queries the user for a string and lists all case-sensitive substring matches found in all open buffers.", 103, "w:\\4ed\\code\\custom\\4coder_search.cpp", 36, 172 },
|
||||||
{ PROC_LINKS(list_all_locations_case_insensitive, 0), "list_all_locations_case_insensitive", 35, "Queries the user for a string and lists all exact case-insensitive matches found in all open buffers.", 101, "w:\\4ed\\code\\custom\\4coder_search.cpp", 36, 178 },
|
{ PROC_LINKS(list_all_locations_case_insensitive, 0), false, "list_all_locations_case_insensitive", 35, "Queries the user for a string and lists all exact case-insensitive matches found in all open buffers.", 101, "w:\\4ed\\code\\custom\\4coder_search.cpp", 36, 178 },
|
||||||
{ PROC_LINKS(list_all_substring_locations_case_insensitive, 0), "list_all_substring_locations_case_insensitive", 45, "Queries the user for a string and lists all case-insensitive substring matches found in all open buffers.", 105, "w:\\4ed\\code\\custom\\4coder_search.cpp", 36, 184 },
|
{ PROC_LINKS(list_all_substring_locations_case_insensitive, 0), false, "list_all_substring_locations_case_insensitive", 45, "Queries the user for a string and lists all case-insensitive substring matches found in all open buffers.", 105, "w:\\4ed\\code\\custom\\4coder_search.cpp", 36, 184 },
|
||||||
{ PROC_LINKS(list_all_locations_of_identifier, 0), "list_all_locations_of_identifier", 32, "Reads a token or word under the cursor and lists all exact case-sensitive mathces in all open buffers.", 102, "w:\\4ed\\code\\custom\\4coder_search.cpp", 36, 190 },
|
{ PROC_LINKS(list_all_locations_of_identifier, 0), false, "list_all_locations_of_identifier", 32, "Reads a token or word under the cursor and lists all exact case-sensitive mathces in all open buffers.", 102, "w:\\4ed\\code\\custom\\4coder_search.cpp", 36, 190 },
|
||||||
{ PROC_LINKS(list_all_locations_of_identifier_case_insensitive, 0), "list_all_locations_of_identifier_case_insensitive", 49, "Reads a token or word under the cursor and lists all exact case-insensitive mathces in all open buffers.", 104, "w:\\4ed\\code\\custom\\4coder_search.cpp", 36, 196 },
|
{ PROC_LINKS(list_all_locations_of_identifier_case_insensitive, 0), false, "list_all_locations_of_identifier_case_insensitive", 49, "Reads a token or word under the cursor and lists all exact case-insensitive mathces in all open buffers.", 104, "w:\\4ed\\code\\custom\\4coder_search.cpp", 36, 196 },
|
||||||
{ PROC_LINKS(list_all_locations_of_selection, 0), "list_all_locations_of_selection", 31, "Reads the string in the selected range and lists all exact case-sensitive mathces in all open buffers.", 102, "w:\\4ed\\code\\custom\\4coder_search.cpp", 36, 202 },
|
{ PROC_LINKS(list_all_locations_of_selection, 0), false, "list_all_locations_of_selection", 31, "Reads the string in the selected range and lists all exact case-sensitive mathces in all open buffers.", 102, "w:\\4ed\\code\\custom\\4coder_search.cpp", 36, 202 },
|
||||||
{ PROC_LINKS(list_all_locations_of_selection_case_insensitive, 0), "list_all_locations_of_selection_case_insensitive", 48, "Reads the string in the selected range and lists all exact case-insensitive mathces in all open buffers.", 104, "w:\\4ed\\code\\custom\\4coder_search.cpp", 36, 208 },
|
{ PROC_LINKS(list_all_locations_of_selection_case_insensitive, 0), false, "list_all_locations_of_selection_case_insensitive", 48, "Reads the string in the selected range and lists all exact case-insensitive mathces in all open buffers.", 104, "w:\\4ed\\code\\custom\\4coder_search.cpp", 36, 208 },
|
||||||
{ PROC_LINKS(list_all_locations_of_type_definition, 0), "list_all_locations_of_type_definition", 37, "Queries user for string, lists all locations of strings that appear to define a type whose name matches the input string.", 121, "w:\\4ed\\code\\custom\\4coder_search.cpp", 36, 214 },
|
{ PROC_LINKS(list_all_locations_of_type_definition, 0), false, "list_all_locations_of_type_definition", 37, "Queries user for string, lists all locations of strings that appear to define a type whose name matches the input string.", 121, "w:\\4ed\\code\\custom\\4coder_search.cpp", 36, 214 },
|
||||||
{ PROC_LINKS(list_all_locations_of_type_definition_of_identifier, 0), "list_all_locations_of_type_definition_of_identifier", 51, "Reads a token or word under the cursor and lists all locations of strings that appear to define a type whose name matches it.", 125, "w:\\4ed\\code\\custom\\4coder_search.cpp", 36, 222 },
|
{ PROC_LINKS(list_all_locations_of_type_definition_of_identifier, 0), false, "list_all_locations_of_type_definition_of_identifier", 51, "Reads a token or word under the cursor and lists all locations of strings that appear to define a type whose name matches it.", 125, "w:\\4ed\\code\\custom\\4coder_search.cpp", 36, 222 },
|
||||||
{ PROC_LINKS(word_complete, 0), "word_complete", 13, "Iteratively tries completing the word to the left of the cursor with other words in open buffers that have the same prefix string.", 130, "w:\\4ed\\code\\custom\\4coder_search.cpp", 36, 391 },
|
{ PROC_LINKS(word_complete, 0), false, "word_complete", 13, "Iteratively tries completing the word to the left of the cursor with other words in open buffers that have the same prefix string.", 130, "w:\\4ed\\code\\custom\\4coder_search.cpp", 36, 392 },
|
||||||
{ PROC_LINKS(goto_jump_at_cursor, 0), "goto_jump_at_cursor", 19, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in another view and changes the active panel to the view containing the jump.", 187, "w:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 346 },
|
{ PROC_LINKS(goto_jump_at_cursor, 0), false, "goto_jump_at_cursor", 19, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in another view and changes the active panel to the view containing the jump.", 187, "w:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 346 },
|
||||||
{ PROC_LINKS(goto_jump_at_cursor_same_panel, 0), "goto_jump_at_cursor_same_panel", 30, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in this view, losing the compilation output or jump list.", 167, "w:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 373 },
|
{ PROC_LINKS(goto_jump_at_cursor_same_panel, 0), false, "goto_jump_at_cursor_same_panel", 30, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in this view, losing the compilation output or jump list.", 167, "w:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 373 },
|
||||||
{ PROC_LINKS(goto_next_jump, 0), "goto_next_jump", 14, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, skipping sub jump locations.", 123, "w:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 462 },
|
{ PROC_LINKS(goto_next_jump, 0), false, "goto_next_jump", 14, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, skipping sub jump locations.", 123, "w:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 462 },
|
||||||
{ PROC_LINKS(goto_prev_jump, 0), "goto_prev_jump", 14, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, skipping sub jump locations.", 127, "w:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 479 },
|
{ PROC_LINKS(goto_prev_jump, 0), false, "goto_prev_jump", 14, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, skipping sub jump locations.", 127, "w:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 479 },
|
||||||
{ PROC_LINKS(goto_next_jump_no_skips, 0), "goto_next_jump_no_skips", 23, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, and does not skip sub jump locations.", 132, "w:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 492 },
|
{ PROC_LINKS(goto_next_jump_no_skips, 0), false, "goto_next_jump_no_skips", 23, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, and does not skip sub jump locations.", 132, "w:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 492 },
|
||||||
{ PROC_LINKS(goto_prev_jump_no_skips, 0), "goto_prev_jump_no_skips", 23, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, and does not skip sub jump locations.", 136, "w:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 509 },
|
{ PROC_LINKS(goto_prev_jump_no_skips, 0), false, "goto_prev_jump_no_skips", 23, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, and does not skip sub jump locations.", 136, "w:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 509 },
|
||||||
{ PROC_LINKS(goto_first_jump, 0), "goto_first_jump", 15, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer.", 95, "w:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 523 },
|
{ PROC_LINKS(goto_first_jump, 0), false, "goto_first_jump", 15, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer.", 95, "w:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 523 },
|
||||||
{ PROC_LINKS(goto_first_jump_same_panel_sticky, 0), "goto_first_jump_same_panel_sticky", 33, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer and views the buffer in the panel where the jump list was.", 153, "w:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 540 },
|
{ PROC_LINKS(goto_first_jump_same_panel_sticky, 0), false, "goto_first_jump_same_panel_sticky", 33, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer and views the buffer in the panel where the jump list was.", 153, "w:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 540 },
|
||||||
{ PROC_LINKS(if_read_only_goto_position, 0), "if_read_only_goto_position", 26, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor.", 106, "w:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 562 },
|
{ PROC_LINKS(if_read_only_goto_position, 0), false, "if_read_only_goto_position", 26, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor.", 106, "w:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 562 },
|
||||||
{ PROC_LINKS(if_read_only_goto_position_same_panel, 0), "if_read_only_goto_position_same_panel", 37, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor_same_panel.", 117, "w:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 579 },
|
{ PROC_LINKS(if_read_only_goto_position_same_panel, 0), false, "if_read_only_goto_position_same_panel", 37, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor_same_panel.", 117, "w:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 579 },
|
||||||
{ PROC_LINKS(view_jump_list_with_lister, 0), "view_jump_list_with_lister", 26, "When executed on a buffer with jumps, creates a persistent lister for all the jumps", 83, "w:\\4ed\\code\\custom\\4coder_jump_lister.cpp", 41, 104 },
|
{ PROC_LINKS(view_jump_list_with_lister, 0), false, "view_jump_list_with_lister", 26, "When executed on a buffer with jumps, creates a persistent lister for all the jumps", 83, "w:\\4ed\\code\\custom\\4coder_jump_lister.cpp", 41, 104 },
|
||||||
{ PROC_LINKS(show_the_log_graph, 0), "show_the_log_graph", 18, "Parses *log* and displays the 'log graph' UI", 44, "w:\\4ed\\code\\custom\\4coder_log_parser.cpp", 40, 990 },
|
{ PROC_LINKS(show_the_log_graph, 0), false, "show_the_log_graph", 18, "Parses *log* and displays the 'log graph' UI", 44, "w:\\4ed\\code\\custom\\4coder_log_parser.cpp", 40, 990 },
|
||||||
{ PROC_LINKS(copy, 0), "copy", 4, "Copy the text in the range from the cursor to the mark onto the clipboard.", 74, "w:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 19 },
|
{ PROC_LINKS(copy, 0), false, "copy", 4, "Copy the text in the range from the cursor to the mark onto the clipboard.", 74, "w:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 19 },
|
||||||
{ PROC_LINKS(cut, 0), "cut", 3, "Cut the text in the range from the cursor to the mark onto the clipboard.", 73, "w:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 28 },
|
{ PROC_LINKS(cut, 0), false, "cut", 3, "Cut the text in the range from the cursor to the mark onto the clipboard.", 73, "w:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 28 },
|
||||||
{ PROC_LINKS(paste, 0), "paste", 5, "At the cursor, insert the text at the top of the clipboard.", 59, "w:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 39 },
|
{ PROC_LINKS(paste, 0), false, "paste", 5, "At the cursor, insert the text at the top of the clipboard.", 59, "w:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 39 },
|
||||||
{ PROC_LINKS(paste_next, 0), "paste_next", 10, "If the previous command was paste or paste_next, replaces the paste range with the next text down on the clipboard, otherwise operates as the paste command.", 156, "w:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 73 },
|
{ PROC_LINKS(paste_next, 0), false, "paste_next", 10, "If the previous command was paste or paste_next, replaces the paste range with the next text down on the clipboard, otherwise operates as the paste command.", 156, "w:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 73 },
|
||||||
{ PROC_LINKS(paste_and_indent, 0), "paste_and_indent", 16, "Paste from the top of clipboard and run auto-indent on the newly pasted text.", 77, "w:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 115 },
|
{ PROC_LINKS(paste_and_indent, 0), false, "paste_and_indent", 16, "Paste from the top of clipboard and run auto-indent on the newly pasted text.", 77, "w:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 115 },
|
||||||
{ PROC_LINKS(paste_next_and_indent, 0), "paste_next_and_indent", 21, "Paste the next item on the clipboard and run auto-indent on the newly pasted text.", 82, "w:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 122 },
|
{ PROC_LINKS(paste_next_and_indent, 0), false, "paste_next_and_indent", 21, "Paste the next item on the clipboard and run auto-indent on the newly pasted text.", 82, "w:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 122 },
|
||||||
{ PROC_LINKS(execute_previous_cli, 0), "execute_previous_cli", 20, "If the command execute_any_cli has already been used, this will execute a CLI reusing the most recent buffer name and command.", 126, "w:\\4ed\\code\\custom\\4coder_cli_command.cpp", 41, 7 },
|
{ PROC_LINKS(execute_previous_cli, 0), false, "execute_previous_cli", 20, "If the command execute_any_cli has already been used, this will execute a CLI reusing the most recent buffer name and command.", 126, "w:\\4ed\\code\\custom\\4coder_cli_command.cpp", 41, 7 },
|
||||||
{ PROC_LINKS(execute_any_cli, 0), "execute_any_cli", 15, "Queries for an output buffer name and system command, runs the system command as a CLI and prints the output to the specified buffer.", 133, "w:\\4ed\\code\\custom\\4coder_cli_command.cpp", 41, 22 },
|
{ PROC_LINKS(execute_any_cli, 0), false, "execute_any_cli", 15, "Queries for an output buffer name and system command, runs the system command as a CLI and prints the output to the specified buffer.", 133, "w:\\4ed\\code\\custom\\4coder_cli_command.cpp", 41, 22 },
|
||||||
{ PROC_LINKS(build_search, 0), "build_search", 12, "Looks for a build.bat, build.sh, or makefile in the current and parent directories. Runs the first that it finds and prints the output to *compilation*.", 153, "w:\\4ed\\code\\custom\\4coder_build_commands.cpp", 44, 128 },
|
{ PROC_LINKS(build_search, 0), false, "build_search", 12, "Looks for a build.bat, build.sh, or makefile in the current and parent directories. Runs the first that it finds and prints the output to *compilation*.", 153, "w:\\4ed\\code\\custom\\4coder_build_commands.cpp", 44, 128 },
|
||||||
{ PROC_LINKS(build_in_build_panel, 0), "build_in_build_panel", 20, "Looks for a build.bat, build.sh, or makefile in the current and parent directories. Runs the first that it finds and prints the output to *compilation*. Puts the *compilation* buffer in a panel at the footer of the current view.", 230, "w:\\4ed\\code\\custom\\4coder_build_commands.cpp", 44, 163 },
|
{ PROC_LINKS(build_in_build_panel, 0), false, "build_in_build_panel", 20, "Looks for a build.bat, build.sh, or makefile in the current and parent directories. Runs the first that it finds and prints the output to *compilation*. Puts the *compilation* buffer in a panel at the footer of the current view.", 230, "w:\\4ed\\code\\custom\\4coder_build_commands.cpp", 44, 163 },
|
||||||
{ PROC_LINKS(close_build_panel, 0), "close_build_panel", 17, "If the special build panel is open, closes it.", 46, "w:\\4ed\\code\\custom\\4coder_build_commands.cpp", 44, 178 },
|
{ PROC_LINKS(close_build_panel, 0), false, "close_build_panel", 17, "If the special build panel is open, closes it.", 46, "w:\\4ed\\code\\custom\\4coder_build_commands.cpp", 44, 178 },
|
||||||
{ PROC_LINKS(change_to_build_panel, 0), "change_to_build_panel", 21, "If the special build panel is open, makes the build panel the active panel.", 75, "w:\\4ed\\code\\custom\\4coder_build_commands.cpp", 44, 184 },
|
{ PROC_LINKS(change_to_build_panel, 0), false, "change_to_build_panel", 21, "If the special build panel is open, makes the build panel the active panel.", 75, "w:\\4ed\\code\\custom\\4coder_build_commands.cpp", 44, 184 },
|
||||||
{ PROC_LINKS(close_all_code, 0), "close_all_code", 14, "Closes any buffer with a filename ending with an extension configured to be recognized as a code file type.", 107, "w:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 917 },
|
{ PROC_LINKS(close_all_code, 0), false, "close_all_code", 14, "Closes any buffer with a filename ending with an extension configured to be recognized as a code file type.", 107, "w:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 917 },
|
||||||
{ PROC_LINKS(open_all_code, 0), "open_all_code", 13, "Open all code in the current directory. File types are determined by extensions. An extension is considered code based on the extensions specified in 4coder.config.", 164, "w:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 923 },
|
{ PROC_LINKS(open_all_code, 0), false, "open_all_code", 13, "Open all code in the current directory. File types are determined by extensions. An extension is considered code based on the extensions specified in 4coder.config.", 164, "w:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 923 },
|
||||||
{ PROC_LINKS(open_all_code_recursive, 0), "open_all_code_recursive", 23, "Works as open_all_code but also runs in all subdirectories.", 59, "w:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 929 },
|
{ PROC_LINKS(open_all_code_recursive, 0), false, "open_all_code_recursive", 23, "Works as open_all_code but also runs in all subdirectories.", 59, "w:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 929 },
|
||||||
{ PROC_LINKS(load_project, 0), "load_project", 12, "Looks for a project.4coder file in the current directory and tries to load it. Looks in parent directories until a project file is found or there are no more parents.", 167, "w:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 937 },
|
{ PROC_LINKS(load_project, 0), false, "load_project", 12, "Looks for a project.4coder file in the current directory and tries to load it. Looks in parent directories until a project file is found or there are no more parents.", 167, "w:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 937 },
|
||||||
{ PROC_LINKS(project_fkey_command, 0), "project_fkey_command", 20, "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.", 175, "w:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 944 },
|
{ PROC_LINKS(project_fkey_command, 0), false, "project_fkey_command", 20, "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.", 175, "w:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 944 },
|
||||||
{ PROC_LINKS(project_go_to_root_directory, 0), "project_go_to_root_directory", 28, "Changes 4coder's hot directory to the root directory of the currently loaded project. With no loaded project nothing hapepns.", 125, "w:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 969 },
|
{ PROC_LINKS(project_go_to_root_directory, 0), false, "project_go_to_root_directory", 28, "Changes 4coder's hot directory to the root directory of the currently loaded project. With no loaded project nothing hapepns.", 125, "w:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 969 },
|
||||||
{ PROC_LINKS(setup_new_project, 0), "setup_new_project", 17, "Queries the user for several configuration options and initializes a new 4coder project with build scripts for every OS.", 120, "w:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1303 },
|
{ PROC_LINKS(setup_new_project, 0), false, "setup_new_project", 17, "Queries the user for several configuration options and initializes a new 4coder project with build scripts for every OS.", 120, "w:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1303 },
|
||||||
{ PROC_LINKS(setup_build_bat, 0), "setup_build_bat", 15, "Queries the user for several configuration options and initializes a new build batch script.", 92, "w:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1310 },
|
{ PROC_LINKS(setup_build_bat, 0), false, "setup_build_bat", 15, "Queries the user for several configuration options and initializes a new build batch script.", 92, "w:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1310 },
|
||||||
{ PROC_LINKS(setup_build_sh, 0), "setup_build_sh", 14, "Queries the user for several configuration options and initializes a new build shell script.", 92, "w:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1316 },
|
{ PROC_LINKS(setup_build_sh, 0), false, "setup_build_sh", 14, "Queries the user for several configuration options and initializes a new build shell script.", 92, "w:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1316 },
|
||||||
{ PROC_LINKS(setup_build_bat_and_sh, 0), "setup_build_bat_and_sh", 22, "Queries the user for several configuration options and initializes a new build batch script.", 92, "w:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1322 },
|
{ PROC_LINKS(setup_build_bat_and_sh, 0), false, "setup_build_bat_and_sh", 22, "Queries the user for several configuration options and initializes a new build batch script.", 92, "w:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1322 },
|
||||||
{ PROC_LINKS(project_command_lister, 0), "project_command_lister", 22, "Open a lister of all commands in the currently loaded project.", 62, "w:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1338 },
|
{ PROC_LINKS(project_command_lister, 0), false, "project_command_lister", 22, "Open a lister of all commands in the currently loaded project.", 62, "w:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1338 },
|
||||||
{ PROC_LINKS(list_all_functions_current_buffer, 0), "list_all_functions_current_buffer", 33, "Creates a jump list of lines of the current buffer that appear to define or declare functions.", 94, "w:\\4ed\\code\\custom\\4coder_function_list.cpp", 43, 267 },
|
{ PROC_LINKS(list_all_functions_current_buffer, 0), false, "list_all_functions_current_buffer", 33, "Creates a jump list of lines of the current buffer that appear to define or declare functions.", 94, "w:\\4ed\\code\\custom\\4coder_function_list.cpp", 43, 267 },
|
||||||
{ PROC_LINKS(list_all_functions_current_buffer_lister, 0), "list_all_functions_current_buffer_lister", 40, "Creates a lister of locations that look like function definitions and declarations in the buffer.", 97, "w:\\4ed\\code\\custom\\4coder_function_list.cpp", 43, 277 },
|
{ PROC_LINKS(list_all_functions_current_buffer_lister, 0), false, "list_all_functions_current_buffer_lister", 40, "Creates a lister of locations that look like function definitions and declarations in the buffer.", 97, "w:\\4ed\\code\\custom\\4coder_function_list.cpp", 43, 277 },
|
||||||
{ PROC_LINKS(list_all_functions_all_buffers, 0), "list_all_functions_all_buffers", 30, "Creates a jump list of lines from all buffers that appear to define or declare functions.", 89, "w:\\4ed\\code\\custom\\4coder_function_list.cpp", 43, 289 },
|
{ PROC_LINKS(list_all_functions_all_buffers, 0), false, "list_all_functions_all_buffers", 30, "Creates a jump list of lines from all buffers that appear to define or declare functions.", 89, "w:\\4ed\\code\\custom\\4coder_function_list.cpp", 43, 289 },
|
||||||
{ PROC_LINKS(list_all_functions_all_buffers_lister, 0), "list_all_functions_all_buffers_lister", 37, "Creates a lister of locations that look like function definitions and declarations all buffers.", 95, "w:\\4ed\\code\\custom\\4coder_function_list.cpp", 43, 295 },
|
{ PROC_LINKS(list_all_functions_all_buffers_lister, 0), false, "list_all_functions_all_buffers_lister", 37, "Creates a lister of locations that look like function definitions and declarations all buffers.", 95, "w:\\4ed\\code\\custom\\4coder_function_list.cpp", 43, 295 },
|
||||||
{ PROC_LINKS(select_surrounding_scope, 0), "select_surrounding_scope", 24, "Finds the scope enclosed by '{' '}' surrounding the cursor and puts the cursor and mark on the '{' and '}'.", 107, "w:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 7 },
|
{ PROC_LINKS(select_surrounding_scope, 0), false, "select_surrounding_scope", 24, "Finds the scope enclosed by '{' '}' surrounding the cursor and puts the cursor and mark on the '{' and '}'.", 107, "w:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 7 },
|
||||||
{ PROC_LINKS(select_next_scope_absolute, 0), "select_next_scope_absolute", 26, "Finds the first scope started by '{' after the cursor and puts the cursor and mark on the '{' and '}'.", 102, "w:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 32 },
|
{ PROC_LINKS(select_next_scope_absolute, 0), false, "select_next_scope_absolute", 26, "Finds the first scope started by '{' after the cursor and puts the cursor and mark on the '{' and '}'.", 102, "w:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 32 },
|
||||||
{ PROC_LINKS(select_next_scope_after_current, 0), "select_next_scope_after_current", 31, "Finds the first scope started by '{' after the mark and puts the cursor and mark on the '{' and '}'. This command is meant to be used after a scope is already selected so that it will have the effect of selecting the next scope after the current scope.", 253, "w:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 41 },
|
{ PROC_LINKS(select_next_scope_after_current, 0), false, "select_next_scope_after_current", 31, "Finds the first scope started by '{' after the mark and puts the cursor and mark on the '{' and '}'. This command is meant to be used after a scope is already selected so that it will have the effect of selecting the next scope after the current scope.", 253, "w:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 41 },
|
||||||
{ PROC_LINKS(select_prev_scope_absolute, 0), "select_prev_scope_absolute", 26, "Finds the first scope started by '{' before the cursor and puts the cursor and mark on the '{' and '}'.", 103, "w:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 50 },
|
{ PROC_LINKS(select_prev_scope_absolute, 0), false, "select_prev_scope_absolute", 26, "Finds the first scope started by '{' before the cursor and puts the cursor and mark on the '{' and '}'.", 103, "w:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 50 },
|
||||||
{ PROC_LINKS(place_in_scope, 0), "place_in_scope", 14, "Wraps the code contained in the range between cursor and mark with a new curly brace scope.", 91, "w:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 67 },
|
{ PROC_LINKS(place_in_scope, 0), false, "place_in_scope", 14, "Wraps the code contained in the range between cursor and mark with a new curly brace scope.", 91, "w:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 67 },
|
||||||
{ PROC_LINKS(delete_current_scope, 0), "delete_current_scope", 20, "Deletes the braces surrounding the currently selected scope. Leaves the contents within the scope.", 99, "w:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 73 },
|
{ PROC_LINKS(delete_current_scope, 0), false, "delete_current_scope", 20, "Deletes the braces surrounding the currently selected scope. Leaves the contents within the scope.", 99, "w:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 73 },
|
||||||
{ PROC_LINKS(open_long_braces, 0), "open_long_braces", 16, "At the cursor, insert a '{' and '}' separated by a blank line.", 62, "w:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 46 },
|
{ PROC_LINKS(open_long_braces, 0), false, "open_long_braces", 16, "At the cursor, insert a '{' and '}' separated by a blank line.", 62, "w:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 46 },
|
||||||
{ PROC_LINKS(open_long_braces_semicolon, 0), "open_long_braces_semicolon", 26, "At the cursor, insert a '{' and '};' separated by a blank line.", 63, "w:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 54 },
|
{ PROC_LINKS(open_long_braces_semicolon, 0), false, "open_long_braces_semicolon", 26, "At the cursor, insert a '{' and '};' separated by a blank line.", 63, "w:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 54 },
|
||||||
{ PROC_LINKS(open_long_braces_break, 0), "open_long_braces_break", 22, "At the cursor, insert a '{' and '}break;' separated by a blank line.", 68, "w:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 62 },
|
{ PROC_LINKS(open_long_braces_break, 0), false, "open_long_braces_break", 22, "At the cursor, insert a '{' and '}break;' separated by a blank line.", 68, "w:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 62 },
|
||||||
{ PROC_LINKS(if0_off, 0), "if0_off", 7, "Surround the range between the cursor and mark with an '#if 0' and an '#endif'", 78, "w:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 70 },
|
{ PROC_LINKS(if0_off, 0), false, "if0_off", 7, "Surround the range between the cursor and mark with an '#if 0' and an '#endif'", 78, "w:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 70 },
|
||||||
{ PROC_LINKS(write_todo, 0), "write_todo", 10, "At the cursor, insert a '// TODO' comment, includes user name if it was specified in config.4coder.", 99, "w:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 76 },
|
{ PROC_LINKS(write_todo, 0), false, "write_todo", 10, "At the cursor, insert a '// TODO' comment, includes user name if it was specified in config.4coder.", 99, "w:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 76 },
|
||||||
{ PROC_LINKS(write_hack, 0), "write_hack", 10, "At the cursor, insert a '// HACK' comment, includes user name if it was specified in config.4coder.", 99, "w:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 82 },
|
{ PROC_LINKS(write_hack, 0), false, "write_hack", 10, "At the cursor, insert a '// HACK' comment, includes user name if it was specified in config.4coder.", 99, "w:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 82 },
|
||||||
{ PROC_LINKS(write_note, 0), "write_note", 10, "At the cursor, insert a '// NOTE' comment, includes user name if it was specified in config.4coder.", 99, "w:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 88 },
|
{ PROC_LINKS(write_note, 0), false, "write_note", 10, "At the cursor, insert a '// NOTE' comment, includes user name if it was specified in config.4coder.", 99, "w:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 88 },
|
||||||
{ PROC_LINKS(write_block, 0), "write_block", 11, "At the cursor, insert a block comment.", 38, "w:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 94 },
|
{ PROC_LINKS(write_block, 0), false, "write_block", 11, "At the cursor, insert a block comment.", 38, "w:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 94 },
|
||||||
{ PROC_LINKS(write_zero_struct, 0), "write_zero_struct", 17, "At the cursor, insert a ' = {};'.", 33, "w:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 100 },
|
{ PROC_LINKS(write_zero_struct, 0), false, "write_zero_struct", 17, "At the cursor, insert a ' = {};'.", 33, "w:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 100 },
|
||||||
{ PROC_LINKS(comment_line, 0), "comment_line", 12, "Insert '//' at the beginning of the line after leading whitespace.", 66, "w:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 125 },
|
{ PROC_LINKS(comment_line, 0), false, "comment_line", 12, "Insert '//' at the beginning of the line after leading whitespace.", 66, "w:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 125 },
|
||||||
{ PROC_LINKS(uncomment_line, 0), "uncomment_line", 14, "If present, delete '//' at the beginning of the line after leading whitespace.", 78, "w:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 137 },
|
{ PROC_LINKS(uncomment_line, 0), false, "uncomment_line", 14, "If present, delete '//' at the beginning of the line after leading whitespace.", 78, "w:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 137 },
|
||||||
{ PROC_LINKS(comment_line_toggle, 0), "comment_line_toggle", 19, "Turns uncommented lines into commented lines and vice versa for comments starting with '//'.", 92, "w:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 149 },
|
{ PROC_LINKS(comment_line_toggle, 0), false, "comment_line_toggle", 19, "Turns uncommented lines into commented lines and vice versa for comments starting with '//'.", 92, "w:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 149 },
|
||||||
{ PROC_LINKS(snippet_lister, 0), "snippet_lister", 14, "Opens a snippet lister for inserting whole pre-written snippets of text.", 72, "w:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 231 },
|
{ PROC_LINKS(snippet_lister, 0), false, "snippet_lister", 14, "Opens a snippet lister for inserting whole pre-written snippets of text.", 72, "w:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 231 },
|
||||||
{ PROC_LINKS(miblo_increment_basic, 0), "miblo_increment_basic", 21, "Increment an integer under the cursor by one.", 45, "w:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 29 },
|
{ PROC_LINKS(miblo_increment_basic, 0), false, "miblo_increment_basic", 21, "Increment an integer under the cursor by one.", 45, "w:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 29 },
|
||||||
{ PROC_LINKS(miblo_decrement_basic, 0), "miblo_decrement_basic", 21, "Decrement an integer under the cursor by one.", 45, "w:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 44 },
|
{ PROC_LINKS(miblo_decrement_basic, 0), false, "miblo_decrement_basic", 21, "Decrement an integer under the cursor by one.", 45, "w:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 44 },
|
||||||
{ PROC_LINKS(miblo_increment_time_stamp, 0), "miblo_increment_time_stamp", 26, "Increment 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, 231 },
|
{ PROC_LINKS(miblo_increment_time_stamp, 0), false, "miblo_increment_time_stamp", 26, "Increment 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, 231 },
|
||||||
{ 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_decrement_time_stamp, 0), false, "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_increment_time_stamp_minute, 0), false, "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(miblo_decrement_time_stamp_minute, 0), false, "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(profile_inspect, 0), "profile_inspect", 15, "Inspect all currently collected profiling information in 4coder's self profiler.", 80, "w:\\4ed\\code\\custom\\4coder_profile_inspect.cpp", 45, 278 },
|
{ PROC_LINKS(profile_inspect, 0), false, "profile_inspect", 15, "Inspect all currently collected profiling information in 4coder's self profiler.", 80, "w:\\4ed\\code\\custom\\4coder_profile_inspect.cpp", 45, 377 },
|
||||||
{ 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_startup, 0), false, "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 },
|
{ PROC_LINKS(default_try_exit, 0), false, "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_default_view_input_handler = 0;
|
||||||
static i32 fcoder_metacmd_ID_profile_enable = 1;
|
static i32 fcoder_metacmd_ID_profile_enable = 1;
|
||||||
|
|
|
@ -1440,7 +1440,7 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdS
|
||||||
|
|
||||||
// NOTE(allen): context setup
|
// NOTE(allen): context setup
|
||||||
Thread_Context _tctx = {};
|
Thread_Context _tctx = {};
|
||||||
thread_ctx_init(&_tctx, get_base_allocator_system());
|
thread_ctx_init(&_tctx, get_base_allocator_system(), get_base_allocator_system());
|
||||||
|
|
||||||
block_zero_struct(&win32vars);
|
block_zero_struct(&win32vars);
|
||||||
win32vars.tctx = &_tctx;
|
win32vars.tctx = &_tctx;
|
||||||
|
|
Loading…
Reference in New Issue