Thread context now introduced to 4coder in ALL layers (booya!) :)

master
Allen Webster 2019-09-30 19:06:21 -07:00
parent 342ba26d29
commit c47270702a
38 changed files with 527 additions and 533 deletions

View File

@ -4,50 +4,38 @@
// TOP
internal void
scratch_block__init(Scratch_Block *block, Arena *arena){
block->temp = begin_temp(arena);
}
Scratch_Block::Scratch_Block(Temp_Memory t){
this->temp = t;
}
Scratch_Block::Scratch_Block(Arena *arena){
scratch_block__init(this, arena);
Scratch_Block::Scratch_Block(Application_Links *app, Scratch_Share_Code share){
scratch_block__init(this, get_thread_context(app), share);
}
Scratch_Block::Scratch_Block(Application_Links *app){
scratch_block__init(this, context_get_arena(app));
}
Scratch_Block::~Scratch_Block(){
end_temp(this->temp);
}
Scratch_Block::operator Arena*(){
return(this->temp.temp_memory_arena.arena);
}
void Scratch_Block::restore(void){
end_temp(this->temp);
scratch_block__init(this, get_thread_context(app), share_code_default);
}
////////////////////////////////
internal Arena
make_arena_app_links(Application_Links *app, umem chunk_size, umem align){
return(make_arena(context_get_base_allocator(app), chunk_size, align));
internal Arena*
reserve_arena(Application_Links *app, umem chunk_size, umem align){
Thread_Context *tctx = get_thread_context(app);
return(reserve_arena(tctx, chunk_size, align));
}
internal Arena
make_arena_app_links(Application_Links *app, umem chunk_size){
return(make_arena_app_links(app, chunk_size, 8));
internal Arena*
reserve_arena(Application_Links *app, umem chunk_size){
Thread_Context *tctx = get_thread_context(app);
return(reserve_arena(tctx, chunk_size));
}
internal Arena
make_arena_app_links(Application_Links *app){
return(make_arena_app_links(app, KB(16), 8));
internal Arena*
reserve_arena(Application_Links *app){
Thread_Context *tctx = get_thread_context(app);
return(reserve_arena(tctx));
}
internal void
release_arena(Application_Links *app, Arena *arena){
Thread_Context *tctx = get_thread_context(app);
release_arena(tctx, arena);
}
// BOTTOM

View File

@ -1232,7 +1232,7 @@ CUSTOM_DOC("Queries the user for a string, and incrementally replace every occur
static void
save_all_dirty_buffers_with_postfix(Application_Links *app, String_Const_u8 postfix){
Arena *scratch = context_get_arena(app);
Scratch_Block scratch(app);
for (Buffer_ID buffer = get_buffer_next(app, 0, AccessOpen);
buffer != 0;
buffer = get_buffer_next(app, buffer, AccessOpen)){
@ -1317,8 +1317,7 @@ CUSTOM_DOC("Queries the user for a file name and saves the contents of the curre
View_ID view = get_active_view(app, AccessAll);
Buffer_ID buffer = view_get_buffer(app, view, AccessAll);
Arena *scratch = context_get_arena(app);
Temp_Memory temp = begin_temp(scratch);
Scratch_Block scratch(app);
String_Const_u8 buffer_name = push_buffer_unique_name(app, scratch, buffer);
// Query the user
@ -1342,8 +1341,6 @@ CUSTOM_DOC("Queries the user for a file name and saves the contents of the curre
}
}
}
end_temp(temp);
}
CUSTOM_COMMAND_SIG(rename_file_query)
@ -1352,8 +1349,7 @@ CUSTOM_DOC("Queries the user for a new name and renames the file of the current
View_ID view = get_active_view(app, AccessAll);
Buffer_ID buffer = view_get_buffer(app, view, AccessAll);
Arena *scratch = context_get_arena(app);
Temp_Memory temp = begin_temp(scratch);
Scratch_Block scratch(app);
String_Const_u8 file_name = push_buffer_file_name(app, scratch, buffer);
if (file_name.size > 0){
@ -1382,8 +1378,6 @@ CUSTOM_DOC("Queries the user for a new name and renames the file of the current
}
}
end_temp(temp);
}
CUSTOM_COMMAND_SIG(make_directory_query)
@ -1616,11 +1610,9 @@ CUSTOM_DOC("Saves the current buffer.")
{
View_ID view = get_active_view(app, AccessProtected);
Buffer_ID buffer = view_get_buffer(app, view, AccessProtected);
Arena *scratch = context_get_arena(app);
Temp_Memory temp = begin_temp(scratch);
Scratch_Block scratch(app);
String_Const_u8 file_name = push_buffer_file_name(app, scratch, buffer);
buffer_save(app, buffer, file_name, 0);
end_temp(temp);
}
CUSTOM_COMMAND_SIG(reopen)
@ -1711,7 +1703,7 @@ CUSTOM_DOC("Advances forwards through the undo history of the current buffer.")
CUSTOM_COMMAND_SIG(undo_all_buffers)
CUSTOM_DOC("Advances backward through the undo history in the buffer containing the most recent regular edit.")
{
Arena *scratch = context_get_arena(app);
Scratch_Block scratch(app, Scratch_Share);
i32 highest_edit_number = -1;
Buffer_ID first_buffer_match = 0;
Buffer_ID last_buffer_match = 0;
@ -1738,7 +1730,6 @@ CUSTOM_DOC("Advances backward through the undo history in the buffer containing
}
}
Temp_Memory temp = begin_temp(scratch);
Buffer_ID *match_buffers = push_array(scratch, Buffer_ID, match_count);
i32 *new_positions = push_array(scratch, i32, match_count);
match_count = 0;
@ -1778,14 +1769,13 @@ CUSTOM_DOC("Advances backward through the undo history in the buffer containing
}
view_buffer_set(app, match_buffers, new_positions, match_count);
end_temp(temp);
}
CUSTOM_COMMAND_SIG(redo_all_buffers)
CUSTOM_DOC("Advances forward through the undo history in the buffer containing the most recent regular edit.")
{
Arena *scratch = context_get_arena(app);
Scratch_Block scratch(app, Scratch_Share);
i32 lowest_edit_number = 0x7FFFFFFF;
Buffer_ID first_buffer_match = 0;
Buffer_ID last_buffer_match = 0;
@ -1813,7 +1803,6 @@ CUSTOM_DOC("Advances forward through the undo history in the buffer containing t
}
}
Temp_Memory temp = begin_temp(scratch);
Buffer_ID *match_buffers = push_array(scratch, Buffer_ID, match_count);
i32 *new_positions = push_array(scratch, i32, match_count);
match_count = 0;
@ -1854,8 +1843,6 @@ CUSTOM_DOC("Advances forward through the undo history in the buffer containing t
}
view_buffer_set(app, match_buffers, new_positions, match_count);
end_temp(temp);
}
////////////////////////////////

View File

@ -2416,7 +2416,7 @@ make_arena(Base_Allocator *allocator, umem chunk_size){
}
internal Arena
make_arena(Base_Allocator *allocator){
return(make_arena(allocator, KB(16), 8));
return(make_arena(allocator, KB(64), 8));
}
internal Cursor_Node*
arena__new_node(Arena *arena, umem min_size){
@ -2575,6 +2575,120 @@ end_temp(Temp_Memory temp){
////////////////////////////////
internal void
thread_ctx_init(Thread_Context *tctx, Base_Allocator *allocator){
block_zero_struct(tctx);
tctx->allocator = allocator;
tctx->node_arena = make_arena(allocator, KB(4), 8);
}
internal Arena*
reserve_arena(Thread_Context *tctx, umem chunk_size, umem align){
Arena_Node *node = tctx->free_arenas;
if (node != 0){
sll_stack_pop(tctx->free_arenas);
}
else{
node = push_array_zero(&tctx->node_arena, Arena_Node, 1);
}
node->arena = make_arena(tctx->allocator, chunk_size, align);
return(&node->arena);
}
internal Arena*
reserve_arena(Thread_Context *tctx, umem chunk_size){
return(reserve_arena(tctx, chunk_size, 8));
}
internal Arena*
reserve_arena(Thread_Context *tctx){
return(reserve_arena(tctx, KB(64), 8));
}
internal void
release_arena(Thread_Context *tctx, Arena *arena){
Arena_Node *node = CastFromMember(Arena_Node, arena, arena);
linalloc_clear(arena);
sll_stack_push(tctx->free_arenas, node);
}
////////////////////////////////
internal void
scratch_block__init(Scratch_Block *block, Arena *arena){
block->arena = arena;
block->temp = begin_temp(arena);
block->do_full_clear = false;
}
internal void
scratch_block__init(Scratch_Block *block, Thread_Context *tctx, Scratch_Share_Code share){
block->tctx = tctx;
Arena *arena = tctx->sharable_scratch;
if (arena != 0){
block->temp = begin_temp(arena);
block->do_full_clear = false;
}
else{
arena = reserve_arena(tctx);
block->do_full_clear = true;
}
block->arena = arena;
block->sharable_restore = tctx->sharable_scratch;
if (share == Scratch_Share){
tctx->sharable_scratch = arena;
}
else{
tctx->sharable_scratch = 0;
}
}
Scratch_Block::Scratch_Block(Temp_Memory t){
this->temp = t;
}
Scratch_Block::Scratch_Block(Arena *arena){
scratch_block__init(this, arena);
}
global_const Scratch_Share_Code share_code_default = Scratch_DontShare;
Scratch_Block::Scratch_Block(Thread_Context *tctx, Scratch_Share_Code share){
scratch_block__init(this, tctx, share);
}
Scratch_Block::Scratch_Block(Thread_Context *tctx){
scratch_block__init(this, tctx, share_code_default);
}
Scratch_Block::~Scratch_Block(){
if (this->do_full_clear){
Assert(this->tctx != 0);
release_arena(this->tctx, this->arena);
}
else{
end_temp(this->temp);
}
if (this->tctx != 0){
this->tctx->sharable_scratch = this->sharable_restore;
}
}
Scratch_Block::operator Arena*(){
return(this->arena);
}
void Scratch_Block::restore(void){
if (this->do_full_clear){
linalloc_clear(this->arena);
}
else{
end_temp(this->temp);
}
}
////////////////////////////////
#define heap__sent_init(s) (s)->next=(s)->prev=(s)
#define heap__insert_next(p,n) ((n)->next=(p)->next,(n)->prev=(p),(n)->next->prev=(n),(p)->next=(n))
#define heap__insert_prev(p,n) ((n)->prev=(p)->prev,(n)->next=(p),(n)->prev->next=(n),(p)->prev=(n))
@ -2611,7 +2725,8 @@ heap_assert_good(Heap *heap){
internal void
heap_init(Heap *heap, Base_Allocator *allocator){
heap->arena = make_arena(allocator, KB(64), KB(8));
heap->arena_ = make_arena(allocator);
heap->arena = &heap->arena_;
heap__sent_init(&heap->in_order);
heap__sent_init(&heap->free_nodes);
heap->used_space = 0;
@ -2619,11 +2734,14 @@ heap_init(Heap *heap, Base_Allocator *allocator){
}
internal Base_Allocator*
heap_get_base_allocator(Heap *heap){
return(heap->arena->base_allocator);
}
internal void
heap_free_all(Heap *heap){
Base_Allocator *allocator = heap->arena.base_allocator;
linalloc_clear(&heap->arena);
linalloc_clear(heap->arena);
block_zero_struct(heap);
return(allocator);
}
internal void
@ -2641,7 +2759,7 @@ heap__extend(Heap *heap, void *memory, umem size){
internal void
heap__extend_automatic(Heap *heap, umem size){
void *memory = push_array(&heap->arena, u8, size);
void *memory = push_array(heap->arena, u8, size);
heap__extend(heap, memory, size);
}

View File

@ -1097,14 +1097,41 @@ struct Temp_Memory{
};
};
////////////////////////////////
union Arena_Node{
Arena_Node *next;
Arena arena;
};
struct Thread_Context{
Base_Allocator *allocator;
Arena node_arena;
Arena_Node *free_arenas;
Arena *sharable_scratch;
};
typedef i32 Scratch_Share_Code;
enum{
Scratch_DontShare,
Scratch_Share,
};
struct Scratch_Block{
Arena *arena;
Temp_Memory temp;
b32 do_full_clear;
Thread_Context *tctx;
Arena *sharable_restore;
Scratch_Block(Temp_Memory temp);
Scratch_Block(Arena *arena);
Scratch_Block(struct Thread_Context *tctx, Scratch_Share_Code share);
Scratch_Block(struct Thread_Context *tctx);
Scratch_Block(struct Application_Links *app, Scratch_Share_Code share);
Scratch_Block(struct Application_Links *app);
~Scratch_Block();
operator Arena*();
void restore(void);
Temp_Memory temp;
};
////////////////////////////////
@ -1126,7 +1153,8 @@ struct Heap_Node{
};
struct Heap{
Arena arena;
Arena arena_;
Arena *arena;
Heap_Basic_Node in_order;
Heap_Basic_Node free_nodes;
umem used_space;

View File

@ -219,8 +219,7 @@ snippet_lister__parameterized(Application_Links *app, Snippet_Array snippet_arra
View_ID view = get_active_view(app, AccessAll);
view_end_ui_mode(app, view);
Arena *scratch = context_get_arena(app);
Temp_Memory temp = begin_temp(scratch);
Scratch_Block scratch(app, Scratch_Share);
i32 option_count = snippet_array.count;
Lister_Option *options = push_array(scratch, Lister_Option, option_count);
for (i32 i = 0; i < snippet_array.count; i += 1){
@ -229,7 +228,6 @@ snippet_lister__parameterized(Application_Links *app, Snippet_Array snippet_arra
options[i].user_data = IntAsPtr(i);
}
begin_integrated_lister__basic_list(app, "Snippet:", activate_snippet, &snippet_array, sizeof(snippet_array), options, option_count, 0, view);
end_temp(temp);
}
CUSTOM_COMMAND_SIG(snippet_lister)

View File

@ -1437,8 +1437,7 @@ config_feedback_int(Arena *arena, List_String_Const_u8 *list, char *name, i32 va
static void
load_config_and_apply(Application_Links *app, Arena *out_arena, Config_Data *config, i32 override_font_size, b32 override_hinting){
Arena *scratch = context_get_arena(app);
Temp_Memory temp = begin_temp(scratch);
Scratch_Block scratch(app);
linalloc_clear(out_arena);
Config *parsed = config_parse__file_name(app, out_arena, "config.4coder", config);
@ -1534,8 +1533,6 @@ load_config_and_apply(Application_Links *app, Arena *out_arena, Config_Data *con
modify_global_face_by_description(app, description);
}
}
end_temp(temp);
}
#if 0

View File

@ -29,11 +29,9 @@ lock_jump_buffer(Application_Links *app, char *name, i32 size){
static void
lock_jump_buffer(Application_Links *app, Buffer_ID buffer_id){
Arena *scratch = context_get_arena(app);
Temp_Memory temp = begin_temp(scratch);
Scratch_Block scratch(app);
String_Const_u8 buffer_name = push_buffer_unique_name(app, scratch, buffer_id);
lock_jump_buffer(app, buffer_name);
end_temp(temp);
}
static View_ID
@ -147,8 +145,7 @@ get_next_view_after_active(Application_Links *app, Access_Flag access){
static void
view_buffer_set(Application_Links *app, Buffer_ID *buffers, i32 *positions, i32 count){
if (count > 0){
Arena *arena = context_get_arena(app);
Temp_Memory temp = begin_temp(arena);
Scratch_Block scratch(app, Scratch_Share);
struct View_Node{
View_Node *next;
@ -167,7 +164,7 @@ view_buffer_set(Application_Links *app, Buffer_ID *buffers, i32 *positions, i32
View_Node *primary_view_last = 0;
i32 available_view_count = 0;
primary_view_first = primary_view_last = push_array(arena, View_Node, 1);
primary_view_first = primary_view_last = push_array(scratch, View_Node, 1);
primary_view_last->next = 0;
primary_view_last->view_id = view_id;
available_view_count += 1;
@ -176,7 +173,7 @@ view_buffer_set(Application_Links *app, Buffer_ID *buffers, i32 *positions, i32
if (view_id == first_view_id){
break;
}
View_Node *node = push_array(arena, View_Node, 1);
View_Node *node = push_array(scratch, View_Node, 1);
primary_view_last->next = node;
node->next = 0;
node->view_id = view_id;
@ -191,8 +188,6 @@ view_buffer_set(Application_Links *app, Buffer_ID *buffers, i32 *positions, i32
view_set_cursor_and_preferred_x(app, node->view_id, seek_pos(positions[i]));
}
}
end_temp(temp);
}
}
@ -363,8 +358,8 @@ CUSTOM_DOC("Switch to a named key binding map.")
static void
default_4coder_initialize(Application_Links *app, char **command_line_files, i32 file_count, i32 override_font_size, b32 override_hinting){
Base_Allocator *allocator = context_get_base_allocator(app);
heap_init(&global_heap, allocator);
Thread_Context *tctx = get_thread_context(app);
heap_init(&global_heap, tctx->allocator);
#define M \
"Welcome to " VERSION "\n" \
@ -379,8 +374,8 @@ default_4coder_initialize(Application_Links *app, char **command_line_files, i32
#if 0
load_folder_of_themes_into_live_set(app, &global_part, "themes");
#endif
global_config_arena = make_arena_app_links(app);
load_config_and_apply(app, &global_config_arena, &global_config, override_font_size, override_hinting);
global_config_arena = reserve_arena(app);
load_config_and_apply(app, global_config_arena, &global_config, override_font_size, override_hinting);
view_rewrite_loc = managed_id_declare(app, SCu8("DEFAULT.rewrite" ));
view_next_rewrite_loc = managed_id_declare(app, SCu8("DEFAULT.next_rewrite" ));
@ -395,8 +390,7 @@ default_4coder_initialize(Application_Links *app, char **command_line_files, i32
attachment_tokens = managed_id_declare(app, SCu8("DEFAULT.tokens"));
// open command line files
Arena *scratch = context_get_arena(app);
Temp_Memory temp = begin_temp(scratch);
Scratch_Block scratch(app);
String_Const_u8 hot_directory = push_hot_directory(app, scratch);
for (i32 i = 0; i < file_count; i += 1){
Temp_Memory temp2 = begin_temp(scratch);
@ -408,7 +402,6 @@ default_4coder_initialize(Application_Links *app, char **command_line_files, i32
}
end_temp(temp2);
}
end_temp(temp);
}
static void

View File

@ -75,7 +75,7 @@ global i32 fcoder_mode = FCoderMode_Original;
global ID_Pos_Jump_Location prev_location = {};
global Arena global_config_arena = {};
global Arena *global_config_arena = {};
global Config_Data global_config = {};
global char previous_isearch_query[256] = {};

View File

@ -962,7 +962,7 @@ BUFFER_HOOK_SIG(default_file_settings){
String_Const_u8_Array extensions = global_config.code_exts;
Scratch_Block scratch = context_get_arena(app);
Scratch_Block scratch(app);
String_Const_u8 file_name = push_buffer_file_name(app, scratch, buffer_id);

View File

@ -70,43 +70,41 @@ multi_paste_range(Application_Links *app, View_ID view, Range_i64 range, i32 pas
}
total_size -= 1;
if (total_size <= app->memory_size){
i32 first = paste_count - 1;
i32 one_past_last = -1;
i32 step = -1;
if (!old_to_new){
first = 0;
one_past_last = paste_count;
step = 1;
}
List_String_Const_u8 list = {};
for (i32 paste_index = first; paste_index != one_past_last; paste_index += step){
if (paste_index != first){
string_list_push(scratch, &list, SCu8("\n", 1));
}
String_Const_u8 string = push_clipboard_index(app, scratch, 0, paste_index);
if (string.size > 0){
string_list_push(scratch, &list, string);
}
}
String_Const_u8 flattened = string_list_flatten(scratch, list);
buffer_replace_range(app, buffer, range, flattened);
i64 pos = range.min;
finish_range.min = pos;
finish_range.max = pos + total_size;
view_set_mark(app, view, seek_pos(finish_range.min));
view_set_cursor_and_preferred_x(app, view, seek_pos(finish_range.max));
// TODO(allen): Send this to all views.
Theme_Color paste;
paste.tag = Stag_Paste;
get_theme_colors(app, &paste, 1);
view_post_fade(app, view, 0.667f, finish_range, paste.color);
i32 first = paste_count - 1;
i32 one_past_last = -1;
i32 step = -1;
if (!old_to_new){
first = 0;
one_past_last = paste_count;
step = 1;
}
List_String_Const_u8 list = {};
for (i32 paste_index = first; paste_index != one_past_last; paste_index += step){
if (paste_index != first){
string_list_push(scratch, &list, SCu8("\n", 1));
}
String_Const_u8 string = push_clipboard_index(app, scratch, 0, paste_index);
if (string.size > 0){
string_list_push(scratch, &list, string);
}
}
String_Const_u8 flattened = string_list_flatten(scratch, list);
buffer_replace_range(app, buffer, range, flattened);
i64 pos = range.min;
finish_range.min = pos;
finish_range.max = pos + total_size;
view_set_mark(app, view, seek_pos(finish_range.min));
view_set_cursor_and_preferred_x(app, view, seek_pos(finish_range.max));
// TODO(allen): Send this to all views.
Theme_Color paste;
paste.tag = Stag_Paste;
get_theme_colors(app, &paste, 1);
view_post_fade(app, view, 0.667f, finish_range, paste.color);
}
}
return(finish_range);

View File

@ -2,8 +2,7 @@ struct Application_Links;
#define GLOBAL_SET_SETTING_SIG(n) b32 n(Application_Links *app, Global_Setting_ID setting, i32 value)
#define GLOBAL_SET_MAPPING_SIG(n) b32 n(Application_Links *app, void *data, i32 size)
#define GLOBAL_GET_SCREEN_RECTANGLE_SIG(n) Rect_f32 n(Application_Links *app)
#define CONTEXT_GET_ARENA_SIG(n) Arena* n(Application_Links *app)
#define CONTEXT_GET_BASE_ALLOCATOR_SIG(n) Base_Allocator* n(Application_Links *app)
#define GET_THREAD_CONTEXT_SIG(n) Thread_Context* n(Application_Links *app)
#define CREATE_CHILD_PROCESS_SIG(n) b32 n(Application_Links *app, String_Const_u8 path, String_Const_u8 command, Child_Process_ID *child_process_id_out)
#define CHILD_PROCESS_SET_TARGET_BUFFER_SIG(n) b32 n(Application_Links *app, Child_Process_ID child_process_id, Buffer_ID buffer_id, Child_Process_Set_Target_Flags flags)
#define BUFFER_GET_ATTACHED_CHILD_PROCESS_SIG(n) Child_Process_ID n(Application_Links *app, Buffer_ID buffer_id)
@ -184,8 +183,7 @@ struct Application_Links;
typedef GLOBAL_SET_SETTING_SIG(Global_Set_Setting_Function);
typedef GLOBAL_SET_MAPPING_SIG(Global_Set_Mapping_Function);
typedef GLOBAL_GET_SCREEN_RECTANGLE_SIG(Global_Get_Screen_Rectangle_Function);
typedef CONTEXT_GET_ARENA_SIG(Context_Get_Arena_Function);
typedef CONTEXT_GET_BASE_ALLOCATOR_SIG(Context_Get_Base_Allocator_Function);
typedef GET_THREAD_CONTEXT_SIG(Get_Thread_Context_Function);
typedef CREATE_CHILD_PROCESS_SIG(Create_Child_Process_Function);
typedef CHILD_PROCESS_SET_TARGET_BUFFER_SIG(Child_Process_Set_Target_Buffer_Function);
typedef BUFFER_GET_ATTACHED_CHILD_PROCESS_SIG(Buffer_Get_Attached_Child_Process_Function);
@ -367,8 +365,7 @@ struct Application_Links{
Global_Set_Setting_Function *global_set_setting_;
Global_Set_Mapping_Function *global_set_mapping_;
Global_Get_Screen_Rectangle_Function *global_get_screen_rectangle_;
Context_Get_Arena_Function *context_get_arena_;
Context_Get_Base_Allocator_Function *context_get_base_allocator_;
Get_Thread_Context_Function *get_thread_context_;
Create_Child_Process_Function *create_child_process_;
Child_Process_Set_Target_Buffer_Function *child_process_set_target_buffer_;
Buffer_Get_Attached_Child_Process_Function *buffer_get_attached_child_process_;
@ -546,8 +543,6 @@ struct Application_Links{
Open_Color_Picker_Function *open_color_picker_;
Animate_In_N_Milliseconds_Function *animate_in_n_milliseconds_;
Buffer_Find_All_Matches_Function *buffer_find_all_matches_;
void *memory;
int32_t memory_size;
void *cmd_context;
void *system_links;
void *current_coroutine;
@ -557,8 +552,7 @@ struct Application_Links{
app_links->global_set_setting_ = Global_Set_Setting;\
app_links->global_set_mapping_ = Global_Set_Mapping;\
app_links->global_get_screen_rectangle_ = Global_Get_Screen_Rectangle;\
app_links->context_get_arena_ = Context_Get_Arena;\
app_links->context_get_base_allocator_ = Context_Get_Base_Allocator;\
app_links->get_thread_context_ = Get_Thread_Context;\
app_links->create_child_process_ = Create_Child_Process;\
app_links->child_process_set_target_buffer_ = Child_Process_Set_Target_Buffer;\
app_links->buffer_get_attached_child_process_ = Buffer_Get_Attached_Child_Process;\
@ -740,8 +734,7 @@ struct Application_Links{
static b32 global_set_setting(Application_Links *app, Global_Setting_ID setting, i32 value){return(app->global_set_setting_(app, setting, value));}
static b32 global_set_mapping(Application_Links *app, void *data, i32 size){return(app->global_set_mapping_(app, data, size));}
static Rect_f32 global_get_screen_rectangle(Application_Links *app){return(app->global_get_screen_rectangle_(app));}
static Arena* context_get_arena(Application_Links *app){return(app->context_get_arena_(app));}
static Base_Allocator* context_get_base_allocator(Application_Links *app){return(app->context_get_base_allocator_(app));}
static Thread_Context* get_thread_context(Application_Links *app){return(app->get_thread_context_(app));}
static b32 create_child_process(Application_Links *app, String_Const_u8 path, String_Const_u8 command, Child_Process_ID *child_process_id_out){return(app->create_child_process_(app, path, command, child_process_id_out));}
static b32 child_process_set_target_buffer(Application_Links *app, Child_Process_ID child_process_id, Buffer_ID buffer_id, Child_Process_Set_Target_Flags flags){return(app->child_process_set_target_buffer_(app, child_process_id, buffer_id, flags));}
static Child_Process_ID buffer_get_attached_child_process(Application_Links *app, Buffer_ID buffer_id){return(app->buffer_get_attached_child_process_(app, buffer_id));}

View File

@ -254,20 +254,20 @@ static Command_Metadata fcoder_metacmd_table[226] = {
{ 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\\4coder_seek.cpp", 27, 47 },
{ 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\\4coder_seek.cpp", 27, 53 },
{ 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\\4coder_seek.cpp", 27, 61 },
{ 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\\4coder_default_framework.cpp", 40, 201 },
{ 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\\4coder_default_framework.cpp", 40, 211 },
{ PROC_LINKS(open_panel_vsplit, 0), "open_panel_vsplit", 17, "Create a new panel by vertically splitting the active panel.", 60, "w:\\4ed\\code\\4coder_default_framework.cpp", 40, 221 },
{ PROC_LINKS(open_panel_hsplit, 0), "open_panel_hsplit", 17, "Create a new panel by horizontally splitting the active panel.", 62, "w:\\4ed\\code\\4coder_default_framework.cpp", 40, 231 },
{ 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\\4coder_default_framework.cpp", 40, 294 },
{ PROC_LINKS(allow_mouse, 0), "allow_mouse", 11, "Shows the mouse and causes all mouse input to be processed normally.", 68, "w:\\4ed\\code\\4coder_default_framework.cpp", 40, 300 },
{ PROC_LINKS(toggle_mouse, 0), "toggle_mouse", 12, "Toggles the mouse suppression mode, see suppress_mouse and allow_mouse.", 71, "w:\\4ed\\code\\4coder_default_framework.cpp", 40, 306 },
{ PROC_LINKS(set_mode_to_original, 0), "set_mode_to_original", 20, "Sets the edit mode to 4coder original.", 38, "w:\\4ed\\code\\4coder_default_framework.cpp", 40, 312 },
{ 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\\4coder_default_framework.cpp", 40, 318 },
{ 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\\4coder_default_framework.cpp", 40, 324 },
{ 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\\4coder_default_framework.cpp", 40, 330 },
{ 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\\4coder_default_framework.cpp", 40, 336 },
{ 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\\4coder_default_framework.cpp", 40, 342 },
{ PROC_LINKS(remap_interactive, 0), "remap_interactive", 17, "Switch to a named key binding map.", 34, "w:\\4ed\\code\\4coder_default_framework.cpp", 40, 350 },
{ 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\\4coder_default_framework.cpp", 40, 196 },
{ PROC_LINKS(change_active_panel_backwards, 0), "change_active_panel_backwards", 29, "Change the currently active panel, moving to the panel with the next lowest view_id.", 84, "w:\\4ed\\code\\4coder_default_framework.cpp", 40, 206 },
{ PROC_LINKS(open_panel_vsplit, 0), "open_panel_vsplit", 17, "Create a new panel by vertically splitting the active panel.", 60, "w:\\4ed\\code\\4coder_default_framework.cpp", 40, 216 },
{ PROC_LINKS(open_panel_hsplit, 0), "open_panel_hsplit", 17, "Create a new panel by horizontally splitting the active panel.", 62, "w:\\4ed\\code\\4coder_default_framework.cpp", 40, 226 },
{ 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\\4coder_default_framework.cpp", 40, 289 },
{ PROC_LINKS(allow_mouse, 0), "allow_mouse", 11, "Shows the mouse and causes all mouse input to be processed normally.", 68, "w:\\4ed\\code\\4coder_default_framework.cpp", 40, 295 },
{ PROC_LINKS(toggle_mouse, 0), "toggle_mouse", 12, "Toggles the mouse suppression mode, see suppress_mouse and allow_mouse.", 71, "w:\\4ed\\code\\4coder_default_framework.cpp", 40, 301 },
{ PROC_LINKS(set_mode_to_original, 0), "set_mode_to_original", 20, "Sets the edit mode to 4coder original.", 38, "w:\\4ed\\code\\4coder_default_framework.cpp", 40, 307 },
{ 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\\4coder_default_framework.cpp", 40, 313 },
{ 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\\4coder_default_framework.cpp", 40, 319 },
{ 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\\4coder_default_framework.cpp", 40, 325 },
{ 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\\4coder_default_framework.cpp", 40, 331 },
{ 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\\4coder_default_framework.cpp", 40, 337 },
{ PROC_LINKS(remap_interactive, 0), "remap_interactive", 17, "Switch to a named key binding map.", 34, "w:\\4ed\\code\\4coder_default_framework.cpp", 40, 345 },
{ PROC_LINKS(write_character, 0), "write_character", 15, "Inserts whatever character was used to trigger this command.", 60, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 57 },
{ PROC_LINKS(write_underscore, 0), "write_underscore", 16, "Inserts an underscore.", 22, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 66 },
{ PROC_LINKS(delete_char, 0), "delete_char", 11, "Deletes the character to the right of the cursor.", 49, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 73 },
@ -346,24 +346,24 @@ static Command_Metadata fcoder_metacmd_table[226] = {
{ PROC_LINKS(save_all_dirty_buffers, 0), "save_all_dirty_buffers", 22, "Saves all buffers marked dirty (showing the '*' indicator).", 59, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1251 },
{ 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\\4coder_base_commands.cpp", 36, 1276 },
{ 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\\4coder_base_commands.cpp", 36, 1314 },
{ 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\\4coder_base_commands.cpp", 36, 1349 },
{ 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\\4coder_base_commands.cpp", 36, 1389 },
{ 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\\4coder_base_commands.cpp", 36, 1422 },
{ 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\\4coder_base_commands.cpp", 36, 1428 },
{ PROC_LINKS(duplicate_line, 0), "duplicate_line", 14, "Create a copy of the line on which the cursor sits.", 51, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1434 },
{ PROC_LINKS(delete_line, 0), "delete_line", 11, "Delete the line the on which the cursor sits.", 45, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1448 },
{ 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\\4coder_base_commands.cpp", 36, 1513 },
{ 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\\4coder_base_commands.cpp", 36, 1545 },
{ 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\\4coder_base_commands.cpp", 36, 1558 },
{ 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\\4coder_base_commands.cpp", 36, 1570 },
{ PROC_LINKS(kill_buffer, 0), "kill_buffer", 11, "Kills the current buffer.", 25, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1606 },
{ PROC_LINKS(save, 0), "save", 4, "Saves the current buffer.", 25, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1614 },
{ PROC_LINKS(reopen, 0), "reopen", 6, "Reopen the current buffer from the hard drive.", 46, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1626 },
{ PROC_LINKS(undo, 0), "undo", 4, "Advances backwards through the undo history of the current buffer.", 66, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1684 },
{ PROC_LINKS(redo, 0), "redo", 4, "Advances forwards through the undo history of the current buffer.", 65, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1697 },
{ 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\\4coder_base_commands.cpp", 36, 1711 },
{ 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\\4coder_base_commands.cpp", 36, 1785 },
{ PROC_LINKS(open_in_other, 0), "open_in_other", 13, "Interactively opens a file in the other panel.", 46, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1888 },
{ 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\\4coder_base_commands.cpp", 36, 1346 },
{ 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\\4coder_base_commands.cpp", 36, 1383 },
{ 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\\4coder_base_commands.cpp", 36, 1416 },
{ 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\\4coder_base_commands.cpp", 36, 1422 },
{ PROC_LINKS(duplicate_line, 0), "duplicate_line", 14, "Create a copy of the line on which the cursor sits.", 51, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1428 },
{ PROC_LINKS(delete_line, 0), "delete_line", 11, "Delete the line the on which the cursor sits.", 45, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1442 },
{ 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\\4coder_base_commands.cpp", 36, 1507 },
{ 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\\4coder_base_commands.cpp", 36, 1539 },
{ 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\\4coder_base_commands.cpp", 36, 1552 },
{ 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\\4coder_base_commands.cpp", 36, 1564 },
{ PROC_LINKS(kill_buffer, 0), "kill_buffer", 11, "Kills the current buffer.", 25, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1600 },
{ PROC_LINKS(save, 0), "save", 4, "Saves the current buffer.", 25, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1608 },
{ PROC_LINKS(reopen, 0), "reopen", 6, "Reopen the current buffer from the hard drive.", 46, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1618 },
{ PROC_LINKS(undo, 0), "undo", 4, "Advances backwards through the undo history of the current buffer.", 66, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1676 },
{ PROC_LINKS(redo, 0), "redo", 4, "Advances forwards through the undo history of the current buffer.", 65, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1689 },
{ 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\\4coder_base_commands.cpp", 36, 1703 },
{ 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\\4coder_base_commands.cpp", 36, 1774 },
{ PROC_LINKS(open_in_other, 0), "open_in_other", 13, "Interactively opens a file in the other panel.", 46, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1875 },
{ PROC_LINKS(lister__quit, 0), "lister__quit", 12, "A lister mode command that quits the list without executing any actions.", 72, "w:\\4ed\\code\\4coder_lists.cpp", 28, 8 },
{ PROC_LINKS(lister__activate, 0), "lister__activate", 16, "A lister mode command that activates the list's action on the highlighted item.", 79, "w:\\4ed\\code\\4coder_lists.cpp", 28, 15 },
{ PROC_LINKS(lister__write_character, 0), "lister__write_character", 23, "A lister mode command that dispatches to the lister's write character handler.", 78, "w:\\4ed\\code\\4coder_lists.cpp", 28, 30 },
@ -381,12 +381,12 @@ static Command_Metadata fcoder_metacmd_table[226] = {
{ PROC_LINKS(lister__write_character__file_path, 0), "lister__write_character__file_path", 34, "A lister mode command that inserts a character into the text field of a file system list.", 89, "w:\\4ed\\code\\4coder_lists.cpp", 28, 183 },
{ PROC_LINKS(lister__backspace_text_field__file_path, 0), "lister__backspace_text_field__file_path", 39, "A lister mode command that backspaces one character from the text field of a file system list.", 94, "w:\\4ed\\code\\4coder_lists.cpp", 28, 208 },
{ PROC_LINKS(lister__write_character__fixed_list, 0), "lister__write_character__fixed_list", 35, "A lister mode command that handles input for the fixed sure to kill list.", 73, "w:\\4ed\\code\\4coder_lists.cpp", 28, 249 },
{ PROC_LINKS(interactive_switch_buffer, 0), "interactive_switch_buffer", 25, "Interactively switch to an open buffer.", 39, "w:\\4ed\\code\\4coder_lists.cpp", 28, 723 },
{ PROC_LINKS(interactive_kill_buffer, 0), "interactive_kill_buffer", 23, "Interactively kill an open buffer.", 34, "w:\\4ed\\code\\4coder_lists.cpp", 28, 742 },
{ 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\\4coder_lists.cpp", 28, 815 },
{ PROC_LINKS(interactive_new, 0), "interactive_new", 15, "Interactively creates a new file.", 33, "w:\\4ed\\code\\4coder_lists.cpp", 28, 854 },
{ PROC_LINKS(interactive_open, 0), "interactive_open", 16, "Interactively opens a file.", 27, "w:\\4ed\\code\\4coder_lists.cpp", 28, 887 },
{ PROC_LINKS(command_lister, 0), "command_lister", 14, "Opens an interactive list of all registered commands.", 53, "w:\\4ed\\code\\4coder_lists.cpp", 28, 969 },
{ PROC_LINKS(interactive_switch_buffer, 0), "interactive_switch_buffer", 25, "Interactively switch to an open buffer.", 39, "w:\\4ed\\code\\4coder_lists.cpp", 28, 718 },
{ PROC_LINKS(interactive_kill_buffer, 0), "interactive_kill_buffer", 23, "Interactively kill an open buffer.", 34, "w:\\4ed\\code\\4coder_lists.cpp", 28, 737 },
{ 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\\4coder_lists.cpp", 28, 808 },
{ PROC_LINKS(interactive_new, 0), "interactive_new", 15, "Interactively creates a new file.", 33, "w:\\4ed\\code\\4coder_lists.cpp", 28, 847 },
{ PROC_LINKS(interactive_open, 0), "interactive_open", 16, "Interactively opens a file.", 27, "w:\\4ed\\code\\4coder_lists.cpp", 28, 880 },
{ PROC_LINKS(command_lister, 0), "command_lister", 14, "Opens an interactive list of all registered commands.", 53, "w:\\4ed\\code\\4coder_lists.cpp", 28, 960 },
{ PROC_LINKS(auto_tab_whole_file, 0), "auto_tab_whole_file", 19, "Audo-indents the entire current buffer.", 39, "w:\\4ed\\code\\4coder_auto_indent.cpp", 34, 500 },
{ PROC_LINKS(auto_tab_line_at_cursor, 0), "auto_tab_line_at_cursor", 23, "Auto-indents the line on which the cursor sits.", 47, "w:\\4ed\\code\\4coder_auto_indent.cpp", 34, 509 },
{ PROC_LINKS(auto_tab_range, 0), "auto_tab_range", 14, "Auto-indents the range between the cursor and the mark.", 55, "w:\\4ed\\code\\4coder_auto_indent.cpp", 34, 519 },
@ -401,18 +401,18 @@ static Command_Metadata fcoder_metacmd_table[226] = {
{ 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\\4coder_search.cpp", 29, 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\\4coder_search.cpp", 29, 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\\4coder_search.cpp", 29, 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\\4coder_search.cpp", 29, 376 },
{ 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\\4coder_jump_sticky.cpp", 34, 353 },
{ 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\\4coder_jump_sticky.cpp", 34, 380 },
{ 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\\4coder_jump_sticky.cpp", 34, 469 },
{ 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\\4coder_jump_sticky.cpp", 34, 486 },
{ 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\\4coder_jump_sticky.cpp", 34, 499 },
{ 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\\4coder_jump_sticky.cpp", 34, 516 },
{ 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\\4coder_jump_sticky.cpp", 34, 530 },
{ 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\\4coder_jump_sticky.cpp", 34, 547 },
{ PROC_LINKS(newline_or_goto_position, 0), "newline_or_goto_position", 24, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor.", 106, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 34, 569 },
{ PROC_LINKS(newline_or_goto_position_same_panel, 0), "newline_or_goto_position_same_panel", 35, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor_same_panel.", 117, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 34, 586 },
{ 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\\4coder_jump_lister.cpp", 34, 104 },
{ 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\\4coder_search.cpp", 29, 378 },
{ 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\\4coder_jump_sticky.cpp", 34, 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\\4coder_jump_sticky.cpp", 34, 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\\4coder_jump_sticky.cpp", 34, 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\\4coder_jump_sticky.cpp", 34, 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\\4coder_jump_sticky.cpp", 34, 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\\4coder_jump_sticky.cpp", 34, 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\\4coder_jump_sticky.cpp", 34, 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\\4coder_jump_sticky.cpp", 34, 540 },
{ PROC_LINKS(newline_or_goto_position, 0), "newline_or_goto_position", 24, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor.", 106, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 34, 562 },
{ PROC_LINKS(newline_or_goto_position_same_panel, 0), "newline_or_goto_position_same_panel", 35, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor_same_panel.", 117, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 34, 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\\4coder_jump_lister.cpp", 34, 102 },
{ PROC_LINKS(log_graph__escape, 0), "log_graph__escape", 17, "Ends the log grapher", 20, "w:\\4ed\\code\\4coder_log_parser.cpp", 33, 906 },
{ PROC_LINKS(log_graph__scroll_wheel, 0), "log_graph__scroll_wheel", 23, "Scrolls the log graph", 21, "w:\\4ed\\code\\4coder_log_parser.cpp", 33, 915 },
{ PROC_LINKS(log_graph__page_up, 0), "log_graph__page_up", 18, "Scroll the log graph up one whole page", 38, "w:\\4ed\\code\\4coder_log_parser.cpp", 33, 926 },
@ -432,17 +432,17 @@ static Command_Metadata fcoder_metacmd_table[226] = {
{ 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\\4coder_build_commands.cpp", 37, 163 },
{ PROC_LINKS(close_build_panel, 0), "close_build_panel", 17, "If the special build panel is open, closes it.", 46, "w:\\4ed\\code\\4coder_build_commands.cpp", 37, 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\\4coder_build_commands.cpp", 37, 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\\4coder_project_commands.cpp", 39, 921 },
{ 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\\4coder_project_commands.cpp", 39, 927 },
{ 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\\4coder_project_commands.cpp", 39, 933 },
{ 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\\4coder_project_commands.cpp", 39, 941 },
{ 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\\4coder_project_commands.cpp", 39, 948 },
{ 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\\4coder_project_commands.cpp", 39, 971 },
{ 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\\4coder_project_commands.cpp", 39, 1306 },
{ 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\\4coder_project_commands.cpp", 39, 1313 },
{ 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\\4coder_project_commands.cpp", 39, 1319 },
{ 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\\4coder_project_commands.cpp", 39, 1325 },
{ 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\\4coder_project_commands.cpp", 39, 1340 },
{ 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\\4coder_project_commands.cpp", 39, 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\\4coder_project_commands.cpp", 39, 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\\4coder_project_commands.cpp", 39, 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\\4coder_project_commands.cpp", 39, 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\\4coder_project_commands.cpp", 39, 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\\4coder_project_commands.cpp", 39, 967 },
{ 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\\4coder_project_commands.cpp", 39, 1299 },
{ 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\\4coder_project_commands.cpp", 39, 1306 },
{ 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\\4coder_project_commands.cpp", 39, 1312 },
{ 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\\4coder_project_commands.cpp", 39, 1318 },
{ 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\\4coder_project_commands.cpp", 39, 1333 },
{ 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\\4coder_function_list.cpp", 36, 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\\4coder_function_list.cpp", 36, 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\\4coder_function_list.cpp", 36, 289 },
@ -464,10 +464,10 @@ static Command_Metadata fcoder_metacmd_table[226] = {
{ PROC_LINKS(comment_line, 0), "comment_line", 12, "Insert '//' at the beginning of the line after leading whitespace.", 66, "w:\\4ed\\code\\4coder_combined_write_commands.cpp", 46, 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\\4coder_combined_write_commands.cpp", 46, 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\\4coder_combined_write_commands.cpp", 46, 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\\4coder_combined_write_commands.cpp", 46, 235 },
{ PROC_LINKS(snippet_lister, 0), "snippet_lister", 14, "Opens a snippet lister for inserting whole pre-written snippets of text.", 72, "w:\\4ed\\code\\4coder_combined_write_commands.cpp", 46, 233 },
{ PROC_LINKS(set_bindings_choose, 0), "set_bindings_choose", 19, "Remap keybindings using the 'choose' mapping rule.", 50, "w:\\4ed\\code\\4coder_remapping_commands.cpp", 41, 41 },
{ PROC_LINKS(set_bindings_default, 0), "set_bindings_default", 20, "Remap keybindings using the 'default' mapping rule.", 51, "w:\\4ed\\code\\4coder_remapping_commands.cpp", 41, 51 },
{ PROC_LINKS(set_bindings_mac_default, 0), "set_bindings_mac_default", 24, "Remap keybindings using the 'mac-default' mapping rule.", 55, "w:\\4ed\\code\\4coder_remapping_commands.cpp", 41, 66 },
{ PROC_LINKS(set_bindings_mac_default, 0), "set_bindings_mac_default", 24, "Remap keybindings using the 'mac-default' mapping rule.", 55, "w:\\4ed\\code\\4coder_remapping_commands.cpp", 41, 62 },
{ PROC_LINKS(miblo_increment_basic, 0), "miblo_increment_basic", 21, "Increment an integer under the cursor by one.", 45, "w:\\4ed\\code\\4coder_miblo_numbers.cpp", 36, 29 },
{ PROC_LINKS(miblo_decrement_basic, 0), "miblo_decrement_basic", 21, "Decrement an integer under the cursor by one.", 45, "w:\\4ed\\code\\4coder_miblo_numbers.cpp", 36, 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\\4coder_miblo_numbers.cpp", 36, 231 },

View File

@ -88,14 +88,12 @@ insert_string(Buffer_Insertion *insertion, String_Const_u8 string){
static umem
insertf(Buffer_Insertion *insertion, char *format, ...){
Arena *scratch = context_get_arena(insertion->app);
Temp_Memory temp = begin_temp(scratch);
Scratch_Block scratch(insertion->app);
va_list args;
va_start(args, format);
String_Const_u8 string = push_u8_stringfv(scratch, format, args);
va_end(args);
insert_string(insertion, string);
end_temp(temp);
return(string.size);
}

View File

@ -68,8 +68,7 @@ open_jump_lister(Application_Links *app, Heap *heap, View_ID ui_view, Buffer_ID
if (list != 0){
i32 estimated_string_space_size = 0;
view_end_ui_mode(app, ui_view);
Arena *scratch = context_get_arena(app);
Temp_Memory temp = begin_temp(scratch);
Scratch_Block scratch(app);
i32 option_count = list->jump_count;
Lister_Option *options = push_array(scratch, Lister_Option, option_count);
Managed_Object stored_jumps = list->jump_array;
@ -97,7 +96,6 @@ open_jump_lister(Application_Links *app, Heap *heap, View_ID ui_view, Buffer_ID
options, option_count,
estimated_string_space_size,
ui_view);
end_temp(temp);
}
}

View File

@ -103,8 +103,7 @@ parse_buffer_to_jump_array(Application_Links *app, Arena *arena, Buffer_ID buffe
internal void
init_marker_list(Application_Links *app, Heap *heap, Buffer_ID buffer, Marker_List *list){
Arena *scratch = context_get_arena(app);
Temp_Memory temp = begin_temp(scratch);
Scratch_Block scratch(app);
Sticky_Jump_Array jumps = parse_buffer_to_jump_array(app, scratch, buffer);
Range_Array buffer_ranges = get_ranges_of_duplicate_keys(scratch, &jumps.jumps->jump_buffer_id, sizeof(*jumps.jumps), jumps.count);
@ -182,8 +181,6 @@ init_marker_list(Application_Links *app, Heap *heap, Buffer_ID buffer, Marker_Li
list->jump_count = jumps.count;
list->previous_size = (i32)buffer_get_size(app, buffer);
list->buffer_id = buffer;
end_temp(temp);
}
internal void
@ -321,13 +318,11 @@ internal i32
get_index_nearest_from_list(Application_Links *app, Marker_List *list, i64 line){
i32 result = -1;
if (list != 0){
Arena *scratch = context_get_arena(app);
Temp_Memory temp = begin_temp(scratch);
Scratch_Block scratch(app);
Sticky_Jump_Stored *stored = get_all_stored_jumps_from_list(app, scratch, list);
if (stored != 0){
result = binary_search((i64*)&stored->list_line, sizeof(*stored), list->jump_count, line);
}
end_temp(temp);
}
return(result);
}
@ -336,8 +331,7 @@ internal i32
get_index_exact_from_list(Application_Links *app, Marker_List *list, i64 line){
i32 result = -1;
if (list != 0){
Arena *scratch = context_get_arena(app);
Temp_Memory temp = begin_temp(scratch);
Scratch_Block scratch(app);
Sticky_Jump_Stored *stored = get_all_stored_jumps_from_list(app, scratch, list);
if (stored != 0){
i32 index = binary_search((i64*)&stored->list_line, sizeof(*stored), list->jump_count, line);
@ -345,7 +339,6 @@ get_index_exact_from_list(Application_Links *app, Marker_List *list, i64 line){
result = index;
}
}
end_temp(temp);
}
return(result);
}

View File

@ -456,11 +456,9 @@ generate_all_buffers_list__output_buffer(Application_Links *app, Lister *lister,
case DirtyState_UnloadedChanges: status = string_u8_litexpr("!"); break;
case DirtyState_UnsavedChangesAndUnloadedChanges: status = string_u8_litexpr("*!"); break;
}
Arena *scratch = context_get_arena(app);
Temp_Memory temp = begin_temp(scratch);
Scratch_Block scratch(app);
String_Const_u8 buffer_name = push_buffer_unique_name(app, scratch, buffer);
lister_add_item(lister, buffer_name, status, IntAsPtr(buffer), 0);
end_temp(temp);
}
static void
@ -528,10 +526,10 @@ static void
generate_hot_directory_file_list(Application_Links *app, Lister *lister){
Scratch_Block scratch(app);
Temp_Memory temp = begin_temp(&lister->arena);
String_Const_u8 hot = push_hot_directory(app, &lister->arena);
Temp_Memory temp = begin_temp(lister->arena);
String_Const_u8 hot = push_hot_directory(app, lister->arena);
if (!character_is_slash(string_get_character(hot, hot.size - 1))){
hot = push_u8_stringf(&lister->arena, "%.*s/", string_expand(hot));
hot = push_u8_stringf(lister->arena, "%.*s/", string_expand(hot));
}
lister_set_text_field(lister, hot);
lister_set_key(lister, string_front_of_path(hot));
@ -543,8 +541,8 @@ generate_hot_directory_file_list(Application_Links *app, Lister *lister){
lister_begin_new_item_set(app, lister);
hot = push_hot_directory(app, &lister->arena);
push_align(&lister->arena, 8);
hot = push_hot_directory(app, lister->arena);
push_align(lister->arena, 8);
if (hot.str != 0){
String_Const_u8 empty_string = string_u8_litexpr("");
Lister_Prealloced_String empty_string_prealloced = lister_prealloced(empty_string);
@ -552,7 +550,7 @@ generate_hot_directory_file_list(Application_Links *app, Lister *lister){
info < one_past_last;
info += 1){
if (!HasFlag((**info).attributes.flags, FileAttribute_IsDirectory)) continue;
String_Const_u8 file_name = push_u8_stringf(&lister->arena, "%.*s/",
String_Const_u8 file_name = push_u8_stringf(lister->arena, "%.*s/",
string_expand((**info).file_name));
lister_add_item(lister, lister_prealloced(file_name), empty_string_prealloced, file_name.str, 0);
}
@ -561,18 +559,18 @@ generate_hot_directory_file_list(Application_Links *app, Lister *lister){
info < one_past_last;
info += 1){
if (HasFlag((**info).attributes.flags, FileAttribute_IsDirectory)) continue;
String_Const_u8 file_name = push_string_copy(&lister->arena, (**info).file_name);
String_Const_u8 file_name = push_string_copy(lister->arena, (**info).file_name);
char *is_loaded = "";
char *status_flag = "";
Buffer_ID buffer = {};
{
Temp_Memory path_temp = begin_temp(&lister->arena);
Temp_Memory path_temp = begin_temp(lister->arena);
List_String_Const_u8 list = {};
string_list_push(&lister->arena, &list, hot);
string_list_push_overlap(&lister->arena, &list, '/', (**info).file_name);
String_Const_u8 full_file_path = string_list_flatten(&lister->arena, list);
string_list_push(lister->arena, &list, hot);
string_list_push_overlap(lister->arena, &list, '/', (**info).file_name);
String_Const_u8 full_file_path = string_list_flatten(lister->arena, list);
buffer = get_buffer_by_file_name(app, full_file_path, AccessAll);
end_temp(path_temp);
}
@ -586,7 +584,7 @@ generate_hot_directory_file_list(Application_Links *app, Lister *lister){
case DirtyState_UnsavedChangesAndUnloadedChanges: status_flag = " *!"; break;
}
}
String_Const_u8 status = push_u8_stringf(&lister->arena, "%s%s", is_loaded, status_flag);
String_Const_u8 status = push_u8_stringf(lister->arena, "%s%s", is_loaded, status_flag);
lister_add_item(lister, lister_prealloced(file_name), lister_prealloced(status), file_name.str, 0);
}
}
@ -636,8 +634,7 @@ activate_confirm_kill(Application_Links *app, Heap *heap, View_ID view, Lister_S
case SureToKill_Save:
{
Arena *scratch = context_get_arena(app);
Temp_Memory temp = begin_temp(scratch);
Scratch_Block scratch(app);
String_Const_u8 file_name = push_buffer_file_name(app, scratch, buffer_id);
if (buffer_save(app, buffer_id, file_name, BufferSave_IgnoreDirtyFlag)){
buffer_kill(app, buffer_id, BufferKill_AlwaysKill);
@ -647,8 +644,6 @@ activate_confirm_kill(Application_Links *app, Heap *heap, View_ID view, Lister_S
string_expand(file_name));
print_message(app, str);
}
end_temp(temp);
}break;
}
lister_default(app, heap, view, state, ListerActivation_Finished);
@ -760,8 +755,7 @@ activate_open_or_new__generic(Application_Links *app, View_ID view,
result = ListerActivation_Finished;
}
else{
Arena *scratch = context_get_arena(app);
Temp_Memory temp = begin_temp(scratch);
Scratch_Block scratch(app, Scratch_Share);
String_Const_u8 full_file_name = {};
if (character_is_slash(string_get_character(path, path.size - 1))){
path = string_chop(path, 1);
@ -778,7 +772,6 @@ activate_open_or_new__generic(Application_Links *app, View_ID view,
}
result = ListerActivation_Finished;
}
end_temp(temp);
}
return(result);
@ -947,10 +940,9 @@ launch_custom_command_lister(Application_Links *app, i32 *command_ids, i32 comma
command_id_count = command_one_past_last_id;
}
Arena *scratch = context_get_arena(app);
Scratch_Block scratch(app, Scratch_Share);
View_ID view = get_active_view(app, AccessAll);
view_end_ui_mode(app, view);
Temp_Memory temp = begin_temp(scratch);
Lister_Option *options = push_array(scratch, Lister_Option, command_id_count);
for (i32 i = 0; i < command_id_count; i += 1){
i32 j = i;
@ -963,7 +955,6 @@ launch_custom_command_lister(Application_Links *app, i32 *command_ids, i32 comma
options[i].user_data = (void*)fcoder_metacmd_table[j].proc;
}
begin_integrated_lister__basic_list(app, "Command:", activate_command, 0, 0, options, command_id_count, 0, view);
end_temp(temp);
}
CUSTOM_COMMAND_SIG(command_lister)

View File

@ -367,7 +367,7 @@ log_event_array_from_list(Arena *arena, Log_Event_List list){
////////////////////////////////
global View_ID log_view = 0;
global Arena log_arena = {};
global Arena *log_arena = {};
global Log_Parse log_parse = {};
global Log_Graph log_graph = {};
global Log_Filter_Set log_filter_set = {};
@ -438,7 +438,7 @@ log_graph_fill(Application_Links *app, Rect_f32 layout_region, Face_ID face_id){
}
block_zero_struct(&log_graph);
log_graph.holding_temp = true;
log_graph.temp = begin_temp(&log_arena);
log_graph.temp = begin_temp(log_arena);
log_graph.layout_region = layout_region;
log_graph.face_id = face_id;
log_graph.filter_alter_counter = log_filter_set.alter_counter;
@ -465,7 +465,7 @@ log_graph_fill(Application_Links *app, Rect_f32 layout_region, Face_ID face_id){
for (Log_Event *event = log_parse.first_event;
event != 0;
event = event->next){
Log_Event_Ptr_Node *node = push_array(&log_arena, Log_Event_Ptr_Node, 1);
Log_Event_Ptr_Node *node = push_array(log_arena, Log_Event_Ptr_Node, 1);
node->event = event;
sll_queue_push(log_graph.filtered_list.first, log_graph.filtered_list.last, node);
log_graph.filtered_list.count += 1;
@ -489,7 +489,7 @@ log_graph_fill(Application_Links *app, Rect_f32 layout_region, Face_ID face_id){
for (Log_Event_Ptr_Node *node = filter_list->first;
node != 0;
node = node->next){
Log_Event_Ptr_Node *new_node = push_array(&log_arena, Log_Event_Ptr_Node, 1);
Log_Event_Ptr_Node *new_node = push_array(log_arena, Log_Event_Ptr_Node, 1);
new_node->event = node->event;
sll_queue_push(log_graph.filtered_list.first, log_graph.filtered_list.last, new_node);
log_graph.filtered_list.count += 1;
@ -525,9 +525,9 @@ log_graph_fill(Application_Links *app, Rect_f32 layout_region, Face_ID face_id){
}
}
log_graph.event_array = log_event_array_from_list(&log_arena,
log_graph.event_array = log_event_array_from_list(log_arena,
log_graph.filtered_list);
log_events_sort_by_tag(&log_arena, log_graph.event_array, thread_code);
log_events_sort_by_tag(log_arena, log_graph.event_array, thread_code);
b32 had_a_tag = true;
u64 thread_id_value = 0;
@ -561,7 +561,7 @@ log_graph_fill(Application_Links *app, Rect_f32 layout_region, Face_ID face_id){
}
if (emit_next_bucket){
Log_Graph_Thread_Bucket *bucket = push_array(&log_arena, Log_Graph_Thread_Bucket, 1);
Log_Graph_Thread_Bucket *bucket = push_array(log_arena, Log_Graph_Thread_Bucket, 1);
sll_queue_push(log_graph.first_bucket, log_graph.last_bucket, bucket);
log_graph.bucket_count += 1;
bucket->range.first = i;
@ -612,7 +612,7 @@ log_graph_fill(Application_Links *app, Rect_f32 layout_region, Face_ID face_id){
bucket_with_next_event->range.first += 1;
Log_Graph_Box *box_node = push_array(&log_arena, Log_Graph_Box, 1);
Log_Graph_Box *box_node = push_array(log_arena, Log_Graph_Box, 1);
sll_queue_push(log_graph.first_box, log_graph.last_box, box_node);
log_graph.box_count += 1;
Rect_f32 rect = Rf32(box_w*bucket_with_next_event_index , y_cursor,
@ -632,17 +632,17 @@ log_graph_fill(Application_Links *app, Rect_f32 layout_region, Face_ID face_id){
internal void
log_parse_fill(Application_Links *app, Buffer_ID buffer){
if (log_arena.base_allocator == 0){
log_arena = make_arena_app_links(app);
if (log_arena == 0){
log_arena = reserve_arena(app);
}
linalloc_clear(&log_arena);
linalloc_clear(log_arena);
block_zero_struct(&log_graph);
log_filter_set_init(&log_filter_set);
log_filter_set_init(&log_preview_set);
String_Const_u8 log_text = push_whole_buffer(app, &log_arena, buffer);
log_parse = make_log_parse(&log_arena, log_text);
String_Const_u8 log_text = push_whole_buffer(app, log_arena, buffer);
log_parse = make_log_parse(log_arena, log_text);
}
internal void

View File

@ -5,7 +5,7 @@
// TOP
static Project current_project = {};
static Arena current_project_arena = {};
static Arena *current_project_arena = {};
///////////////////////////////
@ -707,13 +707,13 @@ set_current_project(Application_Links *app, Project *project, Config *parsed){
Scratch_Block scratch(app);
if (parsed != 0 && project != 0){
if (current_project_arena.base_allocator == 0){
current_project_arena = make_arena_app_links(app, KB(64));
if (current_project_arena == 0){
current_project_arena = reserve_arena(app);
}
// Copy project to current_project
linalloc_clear(&current_project_arena);
Project new_project = project_deep_copy(&current_project_arena, project);
linalloc_clear(current_project_arena);
Project new_project = project_deep_copy(current_project_arena, project);
if (new_project.loaded){
current_project = new_project;
@ -803,20 +803,16 @@ set_current_project(Application_Links *app, Project *project, Config *parsed){
static void
set_current_project_from_data(Application_Links *app, String_Const_u8 file_name, Data data, String_Const_u8 file_dir){
Arena *scratch = context_get_arena(app);
Temp_Memory temp = begin_temp(scratch);
Scratch_Block scratch(app, Scratch_Share);
Project_Parse_Result project_parse = parse_project__data(scratch, file_name, data, file_dir);
set_current_project(app, project_parse.project, project_parse.parsed);
end_temp(temp);
}
static void
set_current_project_from_nearest_project_file(Application_Links *app){
Arena *scratch = context_get_arena(app);
Temp_Memory temp = begin_temp(scratch);
Scratch_Block scratch(app, Scratch_Share);
Project_Parse_Result project_parse = parse_project__nearest_file(app, scratch);
set_current_project(app, project_parse.project, project_parse.parsed);
end_temp(temp);
}
static void
@ -1200,8 +1196,7 @@ project_generate_project_4coder_file(Arena *scratch, String_Const_u8 script_path
static void
project_setup_scripts__generic(Application_Links *app, b32 do_project_file, b32 do_bat_script, b32 do_sh_script){
Arena *scratch = context_get_arena(app);
Temp_Memory temp = begin_temp(scratch);
Scratch_Block scratch(app);
String_Const_u8 script_path = push_hot_directory(app, scratch);
b32 needs_to_do_work = false;
@ -1299,8 +1294,6 @@ project_setup_scripts__generic(Application_Links *app, b32 do_project_file, b32
print_message(app, string_u8_litexpr("project already setup, no changes made\n"));
}
}
end_temp(temp);
}
CUSTOM_COMMAND_SIG(setup_new_project)
@ -1341,11 +1334,10 @@ CUSTOM_COMMAND_SIG(project_command_lister)
CUSTOM_DOC("Open a lister of all commands in the currently loaded project.")
{
if (current_project.loaded){
Arena *scratch = context_get_arena(app);
Scratch_Block scratch(app, Scratch_Share);
View_ID view = get_active_view(app, AccessAll);
view_end_ui_mode(app, view);
Temp_Memory temp = begin_temp(scratch);
i32 option_count = current_project.command_array.count;
Lister_Option *options = push_array(scratch, Lister_Option, option_count);
for (i32 i = 0;
@ -1356,7 +1348,6 @@ CUSTOM_DOC("Open a lister of all commands in the currently loaded project.")
options[i].user_data = IntAsPtr(i);
}
begin_integrated_lister__basic_list(app, "Command:", activate_project_command, 0, 0, options, option_count, 0, view);
end_temp(temp);
}
}

View File

@ -51,31 +51,23 @@ CUSTOM_DOC("Remap keybindings using the 'choose' mapping rule.")
CUSTOM_COMMAND_SIG(set_bindings_default)
CUSTOM_DOC("Remap keybindings using the 'default' mapping rule.")
{
Arena *scratch = context_get_arena(app);
Temp_Memory temp = begin_temp(scratch);
Scratch_Block scratch(app, Scratch_Share);
Bind_Helper context = get_context_on_arena(scratch);
set_all_default_hooks(&context);
default_keys(&context);
Bind_Buffer result = end_bind_helper_get_buffer(&context);
global_set_mapping(app, result.data, result.size);
end_temp(temp);
}
CUSTOM_COMMAND_SIG(set_bindings_mac_default)
CUSTOM_DOC("Remap keybindings using the 'mac-default' mapping rule.")
{
Arena *scratch = context_get_arena(app);
Temp_Memory temp = begin_temp(scratch);
Scratch_Block scratch(app, Scratch_Share);
Bind_Helper context = get_context_on_arena(scratch);
set_all_default_hooks(&context);
mac_default_keys(&context);
Bind_Buffer result = end_bind_helper_get_buffer(&context);
global_set_mapping(app, result.data, result.size);
end_temp(temp);
}
#endif

View File

@ -252,7 +252,8 @@ string_match_list_enclose_all(Application_Links *app, String_Match_List list, En
internal List_String_Const_u8
string_match_list_deduplicated_strings(Application_Links *app, Arena *arena, String_Match_List list){
List_String_Const_u8 extension_list = {};
Table_Data_u64 table = make_table_Data_u64(context_get_base_allocator(app), 128);
Thread_Context *tctx = get_thread_context(app);
Table_Data_u64 table = make_table_Data_u64(tctx->allocator, 128);
for (String_Match *node = list.first;
node != 0;
node = node->next){
@ -272,8 +273,9 @@ string_match_list_deduplicated_strings(Application_Links *app, Arena *arena, Str
internal void
string_match_list_deduplicate(Application_Links *app, String_Match_List *list){
String_Match_List new_list = {};
Scratch_Block scratch(app);
Table_Data_u64 table = make_table_Data_u64(context_get_base_allocator(app), 128);
Thread_Context *tctx = get_thread_context(app);
Scratch_Block scratch(tctx);
Table_Data_u64 table = make_table_Data_u64(tctx->allocator, 128);
for (String_Match *node = list->first, *next = 0;
node != 0;
node = next){
@ -388,20 +390,20 @@ CUSTOM_DOC("Iteratively tries completing the word to the left of the cursor with
}
*rewrite = Rewrite_WordComplete;
local_persist Arena completion_arena = {};
if (completion_arena.base_allocator == 0){
completion_arena = make_arena_app_links(app);
local_persist Arena *completion_arena = {};
if (completion_arena == 0){
completion_arena = reserve_arena(app);
}
local_persist Word_Complete_State state = {};
if (first_completion || !state.initialized){
block_zero_struct(&state);
linalloc_clear(&completion_arena);
linalloc_clear(completion_arena);
i64 pos = view_get_cursor_pos(app, view);
Range_i64 needle_range = get_word_complete_needle_range(app, buffer, pos);
if (range_size(needle_range) > 0){
state = get_word_complete_state(app, &completion_arena, buffer, needle_range);
state = get_word_complete_state(app, completion_arena, buffer, needle_range);
}
}

View File

@ -292,8 +292,7 @@ lister_update_ui(Application_Links *app, View_ID view, Lister_State *state){
f32 block_height = lister_get_block_height(line_height, is_theme_list);
f32 text_field_height = lister_get_text_field_height(metrics.line_height);
Arena *scratch = context_get_arena(app);
Temp_Memory full_temp = begin_temp(scratch);
Scratch_Block scratch(app, Scratch_Share);
Rect_f32 region = view_get_buffer_region(app, view);
Vec2_f32 view_m = get_mouse_position_in_panel_space(app, region.p0);
@ -481,8 +480,6 @@ lister_update_ui(Application_Links *app, View_ID view, Lister_State *state){
//UI_Control control = ui_list_to_ui_control(scratch, &list);
view_set_quit_ui_handler(app, view, lister_quit_function);
}
end_temp(full_temp);
}
static Lister_Prealloced_String
@ -494,19 +491,18 @@ lister_prealloced(String_Const_u8 string){
static void
lister_first_init(Application_Links *app, Lister *lister, void *user_data, i32 user_data_size){
if (lister->arena.base_allocator == 0) {
lister->arena = make_arena_app_links(app, KB(16));
if (lister->arena == 0) {
lister->arena = reserve_arena(app, KB(16));
}
else{
linalloc_clear(&lister->arena);
linalloc_clear(lister->arena);
}
block_zero_struct(&lister->data);
lister->data.query = Su8(lister->data.query_space, 0, sizeof(lister->data.query_space));
lister->data.text_field = Su8(lister->data.text_field_space, 0, sizeof(lister->data.text_field_space));
lister->data.key_string = Su8(lister->data.key_string_space, 0, sizeof(lister->data.key_string_space));
lister->data.user_data = push_array(&lister->arena, char, user_data_size);
lister->data.user_data = push_array(lister->arena, char, user_data_size);
lister->data.user_data_size = user_data_size;
push_align(&lister->arena, 8);
if (user_data != 0){
block_copy(lister->data.user_data, user_data, user_data_size);
}
@ -514,14 +510,14 @@ lister_first_init(Application_Links *app, Lister *lister, void *user_data, i32 u
static void
lister_begin_new_item_set(Application_Links *app, Lister *lister){
linalloc_clear(&lister->arena);
linalloc_clear(lister->arena);
block_zero_struct(&lister->data.options);
}
static void*
lister_add_item(Lister *lister, Lister_Prealloced_String string, Lister_Prealloced_String status,
void *user_data, umem extra_space){
void *base_memory = push_array(&lister->arena, u8, sizeof(Lister_Node) + extra_space);
void *base_memory = push_array(lister->arena, u8, sizeof(Lister_Node) + extra_space);
Lister_Node *node = (Lister_Node*)base_memory;
node->string = string.string;
node->status = status.string;
@ -536,22 +532,22 @@ lister_add_item(Lister *lister, Lister_Prealloced_String string, Lister_Prealloc
static void*
lister_add_item(Lister *lister, Lister_Prealloced_String string, String_Const_u8 status,
void *user_data, umem extra_space){
return(lister_add_item(lister, string, lister_prealloced(push_string_copy(&lister->arena, status)),
return(lister_add_item(lister, string, lister_prealloced(push_string_copy(lister->arena, status)),
user_data, extra_space));
}
static void*
lister_add_item(Lister *lister, String_Const_u8 string, Lister_Prealloced_String status,
void *user_data, umem extra_space){
return(lister_add_item(lister, lister_prealloced(push_string_copy(&lister->arena, string)), status,
return(lister_add_item(lister, lister_prealloced(push_string_copy(lister->arena, string)), status,
user_data, extra_space));
}
static void*
lister_add_item(Lister *lister, String_Const_u8 string, String_Const_u8 status, void *user_data, umem extra_space){
return(lister_add_item(lister,
lister_prealloced(push_string_copy(&lister->arena, string)),
lister_prealloced(push_string_copy(&lister->arena, status)),
lister_prealloced(push_string_copy(lister->arena, string)),
lister_prealloced(push_string_copy(lister->arena, status)),
user_data, extra_space));
}
@ -559,22 +555,22 @@ static void*
lister_add_theme_item(Lister *lister,
Lister_Prealloced_String string, i32 index,
void *user_data, i32 extra_space){
Lister_Node *node = push_array(&lister->arena, Lister_Node, 1);
Lister_Node *node = push_array(lister->arena, Lister_Node, 1);
node->string = string.string;
node->index = index;
node->user_data = user_data;
node->raw_index = lister->data.options.count;
zdll_push_back(lister->data.options.first, lister->data.options.last, node);
lister->data.options.count += 1;
void *result = push_array(&lister->arena, char, extra_space);
push_align(&lister->arena, 8);
void *result = push_array(lister->arena, char, extra_space);
push_align(lister->arena, 8);
return(result);
}
static void*
lister_add_theme_item(Lister *lister, String_Const_u8 string, i32 index,
void *user_data, i32 extra_space){
return(lister_add_theme_item(lister, lister_prealloced(push_string_copy(&lister->arena, string)), index,
return(lister_add_theme_item(lister, lister_prealloced(push_string_copy(lister->arena, string)), index,
user_data, extra_space));
}
@ -609,7 +605,7 @@ lister_default(Application_Links *app, Heap *heap, View_ID view, Lister_State *s
{
view_end_ui_mode(app, view);
state->initialized = false;
linalloc_clear(&state->lister.arena);
linalloc_clear(state->lister.arena);
}break;
case ListerActivation_Continue:

View File

@ -115,7 +115,7 @@ struct Lister_Data{
};
struct Lister{
Arena arena;
Arena *arena;
Lister_Data data;
};

69
4ed.cpp
View File

@ -161,9 +161,8 @@ internal b32
interpret_binding_buffer(Models *models, void *buffer, i32 size){
b32 result = true;
Heap *gen = &models->mem.heap;
Arena *scratch = &models->mem.arena;
Temp_Memory temp = begin_temp(scratch);
Heap *gen = &models->heap;
Scratch_Block scratch(models->tctx, Scratch_Share);
Mapping new_mapping = {};
@ -454,7 +453,6 @@ interpret_binding_buffer(Models *models, void *buffer, i32 size){
}
models->mapping = new_mapping;
end_temp(temp);
return(result);
}
@ -476,9 +474,7 @@ command_caller(Coroutine *coroutine){
}
internal void
app_links_init(System_Functions *system, Application_Links *app_links, void *data, i32 size){
app_links->memory = data;
app_links->memory_size = size;
app_links_init(System_Functions *system, Application_Links *app_links){
FillAppLinksAPI(app_links);
app_links->current_coroutine = 0;
app_links->system_links = system;
@ -539,10 +535,9 @@ fill_hardcode_default_style(Color_Table color_table){
internal void
app_hardcode_default_style(Models *models){
Arena *arena = &models->mem.arena;
Color_Table color_table = {};
color_table.count = Stag_COUNT;
color_table.vals = push_array(arena, u32, color_table.count);
color_table.vals = push_array(models->arena, u32, color_table.count);
fill_hardcode_default_style(color_table);
models->fallback_color_table = color_table;
}
@ -718,12 +713,12 @@ init_command_line_settings(App_Settings *settings, Plat_Settings *plat_settings,
////////////////////////////////
internal Models*
app_setup_memory(System_Functions *system, Application_Memory *memory){
Cursor cursor = make_cursor(memory->vars_memory, memory->vars_memory_size);
Models *models = push_array_zero(&cursor, Models, 1);
models->mem.arena = make_arena_system(system);
models->base_allocator = models->mem.arena.base_allocator;
heap_init(&models->mem.heap, models->base_allocator);
models_init(Thread_Context *tctx){
Arena *arena = reserve_arena(tctx);
Models *models = push_array_zero(arena, Models, 1);
models->tctx = tctx;
models->arena = arena;
heap_init(&models->heap, tctx->allocator);
return(models);
}
@ -811,8 +806,8 @@ app_get_logger(System_Functions *system){
}
App_Read_Command_Line_Sig(app_read_command_line){
i32 out_size = 0;
Models *models = app_setup_memory(system, memory);
Models *models = models_init(tctx);
models->system = system;
App_Settings *settings = &models->settings;
block_zero_struct(settings);
if (argc > 1){
@ -820,21 +815,19 @@ App_Read_Command_Line_Sig(app_read_command_line){
}
*files = models->settings.init_files;
*file_count = &models->settings.init_files_count;
return(out_size);
return(models);
}
App_Init_Sig(app_init){
Models *models = (Models*)memory->vars_memory;
models->system = system;
Models *models = (Models*)base_ptr;
models->keep_playing = true;
app_links_init(system, &models->app_links, memory->user_memory, memory->user_memory_size);
models->custom_layer_arena = make_arena_models(models);
app_links_init(system, &models->app_links);
models->config_api = api;
models->app_links.cmd_context = models;
Arena *arena = &models->mem.arena;
Arena *arena = models->arena;
// NOTE(allen): coroutines
coroutine_system_init(system, &models->coroutines);
@ -865,14 +858,15 @@ App_Init_Sig(app_init){
{
Assert(models->config_api.get_bindings != 0);
i32 wanted_size = models->config_api.get_bindings(models->app_links.memory, models->app_links.memory_size);
Assert(wanted_size <= models->app_links.memory_size);
interpret_binding_buffer(models, models->app_links.memory, wanted_size);
memset(models->app_links.memory, 0, wanted_size);
Scratch_Block scratch(models->tctx);
u8 *memory = push_array(scratch, u8, KB(64));
i32 wanted_size = models->config_api.get_bindings(memory, KB(64));
Assert(wanted_size <= KB(64));
interpret_binding_buffer(models, memory, wanted_size);
}
managed_ids_init(models->base_allocator, &models->managed_id_set);
lifetime_allocator_init(models->base_allocator, &models->lifetime_allocator);
managed_ids_init(models->tctx->allocator, &models->managed_id_set);
lifetime_allocator_init(models->tctx->allocator, &models->lifetime_allocator);
dynamic_workspace_init(&models->lifetime_allocator, DynamicWorkspace_Global, 0, &models->dynamic_workspace);
// NOTE(allen): file setup
@ -892,7 +886,7 @@ App_Init_Sig(app_init){
// TODO(allen): do(better clipboard allocation)
if (clipboard.str != 0){
String_Const_u8 *dest = working_set_next_clipboard_string(&models->mem.heap, &models->working_set, clipboard.size);
String_Const_u8 *dest = working_set_next_clipboard_string(&models->heap, &models->working_set, clipboard.size);
block_copy(dest->str, clipboard.str, clipboard.size);
}
@ -920,7 +914,7 @@ App_Init_Sig(app_init){
{ string_u8_litinit("*log*") , &models->log_buffer , true , },
};
Heap *heap = &models->mem.heap;
Heap *heap = &models->heap;
for (i32 i = 0; i < ArrayCount(init_files); ++i){
Editing_File *file = working_set_allocate_file(&models->working_set, &models->lifetime_allocator);
buffer_bind_name(models, arena, &models->working_set, file, init_files[i].name);
@ -933,7 +927,7 @@ App_Init_Sig(app_init){
file_create_from_string(models, file, SCu8(), attributes);
if (init_files[i].read_only){
file->settings.read_only = true;
history_free(&file->state.history);
history_free(models, &file->state.history);
}
file->settings.never_kill = true;
@ -949,14 +943,14 @@ App_Init_Sig(app_init){
// NOTE(allen): miscellaneous init
hot_directory_init(system, arena, &models->hot_directory, current_directory);
child_process_container_init(models->base_allocator, &models->child_processes);
child_process_container_init(models->tctx->allocator, &models->child_processes);
models->user_up_key = key_up;
models->user_down_key = key_down;
models->period_wakeup_timer = system->wake_up_timer_create();
}
App_Step_Sig(app_step){
Models *models = (Models*)memory->vars_memory;
Models *models = (Models*)base_ptr;
Mutex_Lock file_order_lock(system, models->working_set.mutex);
@ -971,7 +965,7 @@ App_Step_Sig(app_step){
// NOTE(allen): OS clipboard event handling
String_Const_u8 clipboard = input->clipboard;
if (clipboard.str != 0){
String_Const_u8 *dest = working_set_next_clipboard_string(&models->mem.heap, &models->working_set, clipboard.size);
String_Const_u8 *dest = working_set_next_clipboard_string(&models->heap, &models->working_set, clipboard.size);
dest->size = eol_convert_in((char*)dest->str, (char*)clipboard.str, (i32)clipboard.size);
if (input->clipboard_changed && models->clipboard_change != 0){
models->clipboard_change(&models->app_links, *dest, ClipboardFlag_FromOS);
@ -986,10 +980,9 @@ App_Step_Sig(app_step){
// NOTE(allen): update child processes
f32 dt = input->dt;
if (dt > 0){
Arena *scratch = &models->mem.arena;
Scratch_Block scratch(models->tctx, Scratch_Share);
Child_Process_Container *child_processes = &models->child_processes;
Temp_Memory temp = begin_temp(scratch);
Child_Process **processes_to_free = push_array(scratch, Child_Process*, child_processes->active_child_process_count);
i32 processes_to_free_count = 0;
@ -1035,8 +1028,6 @@ App_Step_Sig(app_step){
for (i32 i = 0; i < processes_to_free_count; ++i){
child_process_free(child_processes, processes_to_free[i]->id);
}
end_temp(temp);
}
// NOTE(allen): input filter and simulated events

18
4ed.h
View File

@ -14,18 +14,6 @@
#define MAX_VIEWS 16
// TODO(allen): This is DONE! GET RID OF IT NAO!
struct Application_Memory{
void *vars_memory;
i32 vars_memory_size;
void *target_memory;
i32 target_memory_size;
void *user_memory;
i32 user_memory_size;
void *debug_memory;
i32 debug_memory_size;
};
// TODO(allen): // TODO(allen): // TODO(allen): // TODO(allen): // TODO(allen):
// TODO(allen): // TODO(allen): // TODO(allen): // TODO(allen): // TODO(allen):
// TODO(allen): // TODO(allen): // TODO(allen): // TODO(allen): // TODO(allen):
@ -68,7 +56,7 @@ struct Plat_Settings{
};
#define App_Read_Command_Line_Sig(name) \
i32 name(System_Functions *system, Application_Memory *memory, String_Const_u8 current_directory, Plat_Settings *plat_settings, char ***files, i32 **file_count, i32 argc, char **argv)
void *name(Thread_Context *tctx, System_Functions *system, String_Const_u8 current_directory, Plat_Settings *plat_settings, char ***files, i32 **file_count, i32 argc, char **argv)
typedef App_Read_Command_Line_Sig(App_Read_Command_Line);
@ -78,7 +66,7 @@ struct Custom_API{
};
#define App_Init_Sig(name) \
void name(System_Functions *system, Render_Target *target, Application_Memory *memory, String_Const_u8 clipboard, String_Const_u8 current_directory, Custom_API api)
void name(System_Functions *system, Render_Target *target, void *base_ptr, String_Const_u8 clipboard, String_Const_u8 current_directory, Custom_API api)
typedef App_Init_Sig(App_Init);
@ -106,7 +94,7 @@ struct Application_Step_Input{
#define App_Step_Sig(name) Application_Step_Result \
name(System_Functions *system, \
Render_Target *target, \
Application_Memory *memory, \
void *base_ptr, \
Application_Step_Input *input)
typedef App_Step_Sig(App_Step);

View File

@ -9,19 +9,28 @@
// TOP
internal Arena
make_arena_models(Models *models, umem chunk_size, umem align){
return(make_arena(models->base_allocator, chunk_size, align));
internal Arena*
reserve_arena(Models *models, umem chunk_size, umem align){
Thread_Context *tctx = models->tctx;
return(reserve_arena(tctx, chunk_size, align));
}
internal Arena
make_arena_models(Models *models, umem chunk_size){
return(make_arena(models->base_allocator, chunk_size, 8));
internal Arena*
reserve_arena(Models *models, umem chunk_size){
Thread_Context *tctx = models->tctx;
return(reserve_arena(tctx, chunk_size));
}
internal Arena
make_arena_models(Models *models){
return(make_arena(models->base_allocator, KB(16), 8));
internal Arena*
reserve_arena(Models *models){
Thread_Context *tctx = models->tctx;
return(reserve_arena(tctx));
}
internal void
release_arena(Models *models, Arena *arena){
Thread_Context *tctx = models->tctx;
release_arena(tctx, arena);
}
// BOTTOM

View File

@ -80,16 +80,10 @@ Global_Get_Screen_Rectangle(Application_Links *app){
return(Rf32(V2(0, 0), V2(layout_get_root_size(&models->layout))));
}
API_EXPORT Arena*
Context_Get_Arena(Application_Links *app){
API_EXPORT Thread_Context*
Get_Thread_Context(Application_Links *app){
Models *models = (Models*)app->cmd_context;
return(&models->custom_layer_arena);
}
API_EXPORT Base_Allocator*
Context_Get_Base_Allocator(Application_Links *app){
Models *models = (Models*)app->cmd_context;
return(models->base_allocator);
return(models->tctx);
}
API_EXPORT b32
@ -143,7 +137,7 @@ API_EXPORT b32
Clipboard_Post(Application_Links *app, i32 clipboard_id, String_Const_u8 string)
{
Models *models = (Models*)app->cmd_context;
String_Const_u8 *dest = working_set_next_clipboard_string(&models->mem.heap, &models->working_set, (i32)string.size);
String_Const_u8 *dest = working_set_next_clipboard_string(&models->heap, &models->working_set, (i32)string.size);
block_copy(dest->str, string.str, string.size);
models->system->post_clipboard(*dest);
return(true);
@ -760,12 +754,12 @@ Buffer_Set_Setting(Application_Links *app, Buffer_ID buffer_id, Buffer_Setting_I
{
if (value){
if (!history_is_activated(&file->state.history)){
history_init(app, &file->state.history);
history_init(models, &file->state.history);
}
}
else{
if (history_is_activated(&file->state.history)){
history_free(&file->state.history);
history_free(models, &file->state.history);
}
}
}break;
@ -834,11 +828,9 @@ Buffer_Save(Application_Links *app, Buffer_ID buffer_id, String_Const_u8 file_na
}
if (!skip_save){
Arena *scratch = &models->mem.arena;
Temp_Memory temp = begin_temp(scratch);
Scratch_Block scratch(models->tctx, Scratch_Share);
String_Const_u8 name = push_string_copy(scratch, file_name);
save_file_to_name(system, models, file, name.str);
end_temp(temp);
result = true;
}
}
@ -866,8 +858,8 @@ Buffer_Kill(Application_Links *app, Buffer_ID buffer_id, Buffer_Kill_Flag flags)
if (file->canon.name_size != 0){
buffer_unbind_file(system, working_set, file);
}
file_free(system, &models->lifetime_allocator, working_set, file);
working_set_free_file(&models->mem.heap, working_set, file);
file_free(models, file);
working_set_free_file(&models->heap, working_set, file);
Layout *layout = &models->layout;
@ -908,17 +900,16 @@ Buffer_Reopen(Application_Links *app, Buffer_ID buffer_id, Buffer_Reopen_Flag fl
{
Models *models = (Models*)app->cmd_context;
System_Functions *system = models->system;
Arena *arena = &models->mem.arena;
Scratch_Block scratch(models->tctx, Scratch_Share);
Editing_File *file = imp_get_file(models, buffer_id);
Buffer_Reopen_Result result = BufferReopenResult_Failed;
if (api_check_buffer(file)){
if (file->canon.name_size > 0){
Plat_Handle handle = {};
if (system->load_handle(arena, (char*)file->canon.name_space, &handle)){
if (system->load_handle(scratch, (char*)file->canon.name_space, &handle)){
File_Attributes attributes = system->load_attributes(handle);
Temp_Memory temp = begin_temp(arena);
char *file_memory = push_array(arena, char, (i32)attributes.size);
char *file_memory = push_array(scratch, char, (i32)attributes.size);
if (file_memory != 0){
if (system->load_file(handle, file_memory, (i32)attributes.size)){
@ -948,7 +939,7 @@ Buffer_Reopen(Application_Links *app, Buffer_ID buffer_id, Buffer_Reopen_Flag fl
}
Working_Set *working_set = &models->working_set;
file_free(system, &models->lifetime_allocator, working_set, file);
file_free(models, file);
working_set_file_default_settings(working_set, file);
file_create_from_string(models, file, SCu8(file_memory, attributes.size), attributes);
@ -970,8 +961,6 @@ Buffer_Reopen(Application_Links *app, Buffer_ID buffer_id, Buffer_Reopen_Flag fl
else{
system->load_close(handle);
}
end_temp(temp);
}
}
}
@ -994,8 +983,8 @@ API_EXPORT File_Attributes
Get_File_Attributes(Application_Links *app, String_Const_u8 file_name)
{
Models *models = (Models*)app->cmd_context;
Arena *arena = &models->mem.arena;
return(models->system->quick_file_attributes(arena, file_name));
Scratch_Block scratch(models->tctx, Scratch_Share);
return(models->system->quick_file_attributes(scratch, file_name));
}
internal View*
@ -1813,9 +1802,8 @@ Get_Managed_Scope_With_Multiple_Dependencies(Application_Links *app, Managed_Sco
{
Models *models = (Models*)app->cmd_context;
Lifetime_Allocator *lifetime_allocator = &models->lifetime_allocator;
Arena *scratch = &models->mem.arena;
Temp_Memory temp = begin_temp(scratch);
Scratch_Block scratch(models->tctx, Scratch_Share);
// TODO(allen): revisit this
struct Node_Ptr{
@ -1890,8 +1878,6 @@ Get_Managed_Scope_With_Multiple_Dependencies(Application_Links *app, Managed_Sco
result = (Managed_Scope)key->dynamic_workspace.scope_id;
}
end_temp(temp);
return(result);
}
@ -2843,7 +2829,7 @@ Text_Layout_Create(Application_Links *app, Buffer_ID buffer_id, Rect_f32 rect, B
Text_Layout_ID result = {};
if (api_check_buffer(file)){
Scratch_Block scratch(app);
Arena arena = make_arena_models(models);
Arena *arena = reserve_arena(models->tctx);
Face *face = file_get_face(models, file);
Gap_Buffer *buffer = &file->state.buffer;
@ -2868,7 +2854,7 @@ Text_Layout_Create(Application_Links *app, Buffer_ID buffer_id, Rect_f32 rect, B
buffer_get_last_pos_from_line_number(buffer, visible_line_number_range.max));
i64 item_count = range_size_inclusive(visible_range);
int_color *colors_array = push_array(&arena, int_color, item_count);
int_color *colors_array = push_array(arena, int_color, item_count);
for (i64 i = 0; i < item_count; i += 1){
colors_array[i] = Stag_Default;
}
@ -3018,7 +3004,7 @@ Paint_Text_Color(Application_Links *app, Text_Layout_ID layout_id, Interval_i64
API_EXPORT b32
Text_Layout_Free(Application_Links *app, Text_Layout_ID text_layout_id){
Models *models = (Models*)app->cmd_context;
return(text_layout_erase(&models->text_layouts, text_layout_id));
return(text_layout_erase(models, &models->text_layouts, text_layout_id));
}
API_EXPORT void

View File

@ -36,8 +36,10 @@ enum App_State{
struct Models{
System_Functions *system;
Base_Allocator *base_allocator;
Mem_Options mem;
Thread_Context *tctx;
Arena *arena;
Heap heap;
App_Settings settings;
App_State state;
@ -114,8 +116,6 @@ struct Models{
u32 next_animate_delay;
b32 animate_next_frame;
Arena custom_layer_arena;
// Last frame state
Vec2_i32 prev_p;
Panel *prev_mouse_panel;

View File

@ -32,12 +32,6 @@
#include "4coder_lib/4coder_utf8.h"
// TODO(allen): stop this nonsense
struct Mem_Options{
Arena arena;
Heap heap;
};
#include "4ed_render_target.h"
#include "4ed.h"
#include "4ed_buffer_model.h"

View File

@ -694,8 +694,8 @@ buffer_layout__write(Arena *arena, Buffer_Layout_Item_List *list, i64 index, u32
}
internal Buffer_Layout_Item_List
buffer_layout(Arena *scratch, Arena *arena, Gap_Buffer *buffer, Interval_i64 range, Face *face, f32 width){
Temp_Memory temp = begin_temp(scratch);
buffer_layout(Thread_Context *tctx, Arena *arena, Gap_Buffer *buffer, Interval_i64 range, Face *face, f32 width){
Scratch_Block scratch(tctx);
Buffer_Layout_Item_List list = {};
list.index_range.first = range.first;
@ -822,8 +822,6 @@ buffer_layout(Arena *scratch, Arena *arena, Gap_Buffer *buffer, Interval_i64 ran
}
}
end_temp(temp);
return(list);
}

View File

@ -99,7 +99,8 @@ dynamic_workspace_free(Lifetime_Allocator *lifetime_allocator, Dynamic_Workspace
internal void
dynamic_workspace_clear_contents(Dynamic_Workspace *workspace){
Base_Allocator *base_allocator = heap_free_all(&workspace->heap);
Base_Allocator *base_allocator = heap_get_base_allocator(&workspace->heap);
heap_free_all(&workspace->heap);
heap_init(&workspace->heap, base_allocator);
workspace->heap_wrapper = base_allocator_on_heap(&workspace->heap);
workspace->object_id_to_object_ptr = make_table_u64_u64(&workspace->heap_wrapper, 10);

View File

@ -98,8 +98,8 @@ edit_fix_markers(Models *models, Editing_File *file, Edit edit){
}
cursor_max += total_marker_count;
Arena *scratch = &models->mem.arena;
Temp_Memory cursor_temp = begin_temp(scratch);
Scratch_Block scratch(models->tctx, Scratch_Share);
Cursor_With_Index *cursors = push_array(scratch, Cursor_With_Index, cursor_max);
Cursor_With_Index *r_cursors = push_array(scratch, Cursor_With_Index, cursor_max);
i32 cursor_count = 0;
@ -174,8 +174,6 @@ edit_fix_markers(Models *models, Editing_File *file, Edit edit){
key_index += count;
}
}
end_temp(cursor_temp);
}
internal void
@ -189,8 +187,7 @@ edit_single(Models *models, Editing_File *file, Interval_i64 range, String_Const
Assert(edit.range.first <= edit.range.one_past_last);
Assert(edit.range.one_past_last <= buffer_size(buffer));
Arena *scratch = &models->mem.arena;
Temp_Memory temp = begin_temp(scratch);
Scratch_Block scratch(models->tctx, Scratch_Share);
// NOTE(allen): history update
if (!behaviors.do_not_post_to_history){
@ -232,8 +229,6 @@ edit_single(Models *models, Editing_File *file, Interval_i64 range, String_Const
Interval_i64 new_range = Ii64(edit.range.first, edit.range.first + edit.text.size);
models->hook_file_edit_range(&models->app_links, file->id, new_range, original_text);
}
end_temp(temp);
}
internal void
@ -375,7 +370,8 @@ edit_merge_history_range(Models *models, Editing_File *file, History_Record_Inde
}break;
}
}
history_merge_records(&models->mem.arena, history, first_index, last_index);
Scratch_Block scratch(models->tctx, Scratch_Share);
history_merge_records(scratch, history, first_index, last_index);
if (current_index >= last_index){
current_index -= (last_index - first_index);
}
@ -437,10 +433,9 @@ create_file(Models *models, String_Const_u8 file_name, Buffer_Create_Flag flags)
if (file_name.size > 0){
System_Functions *system = models->system;
Working_Set *working_set = &models->working_set;
Heap *heap = &models->mem.heap;
Heap *heap = &models->heap;
Arena *scratch = &models->mem.arena;
Temp_Memory temp = begin_temp(scratch);
Scratch_Block scratch(models->tctx);
Editing_File *file = 0;
b32 do_empty_buffer = false;
@ -555,8 +550,6 @@ create_file(Models *models, String_Const_u8 file_name, Buffer_Create_Flag flags)
models->hook_new_file != 0){
models->hook_new_file(&models->app_links, file->id);
}
end_temp(temp);
}
return(result);

View File

@ -148,7 +148,6 @@ save_file_to_name(System_Functions *system, Models *models, Editing_File *file,
}
if (file_name != 0){
Mem_Options *mem = &models->mem;
if (models->hook_save_file != 0){
models->hook_save_file(&models->app_links, file->id);
}
@ -156,7 +155,8 @@ save_file_to_name(System_Functions *system, Models *models, Editing_File *file,
Gap_Buffer *buffer = &file->state.buffer;
b32 dos_write_mode = file->settings.dos_write_mode;
Arena *scratch = &mem->arena;
Scratch_Block scratch(models->tctx, Scratch_Share);
if (!using_actual_file_name){
String_Const_u8 s_file_name = SCu8(file_name);
String_Const_u8 canonical_file_name = system->get_canonical(scratch, s_file_name);
@ -165,7 +165,6 @@ save_file_to_name(System_Functions *system, Models *models, Editing_File *file,
}
}
Temp_Memory temp = begin_temp(scratch);
String_Const_u8 saveable_string = buffer_stringify(scratch, buffer, Ii64(0, buffer_size(buffer)));
File_Attributes new_attributes = system->save_file(scratch, (char*)file_name, saveable_string);
@ -179,7 +178,6 @@ save_file_to_name(System_Functions *system, Models *models, Editing_File *file,
"save file [last_write_time=0x%llx]", new_attributes.last_write_time);
file_clear_dirty_flags(file);
end_temp(temp);
}
return(result);
@ -213,10 +211,10 @@ file_compute_cursor(Editing_File *file, Buffer_Seek seek){
internal void
file_create_from_string(Models *models, Editing_File *file, String_Const_u8 val, File_Attributes attributes){
System_Functions *system = models->system;
Arena *scratch = &models->mem.arena;
Application_Links *app_links = &models->app_links;
Base_Allocator *allocator = models->base_allocator;
Thread_Context *tctx = models->tctx;
Scratch_Block scratch(tctx, Scratch_Share);
Base_Allocator *allocator = tctx->allocator;
block_zero_struct(&file->state);
buffer_init(&file->state.buffer, val.str, val.size, allocator);
@ -231,7 +229,7 @@ file_create_from_string(Models *models, Editing_File *file, String_Const_u8 val,
buffer_measure_starts(scratch, &file->state.buffer);
file->lifetime_object = lifetime_alloc_object(&models->lifetime_allocator, DynamicWorkspace_Buffer, file);
history_init(&models->app_links, &file->state.history);
history_init(models, &file->state.history);
file->state.cached_layouts_arena = make_arena(allocator);
file->state.line_layout_table = make_table_Data_u64(allocator, 500);
@ -252,12 +250,15 @@ file_create_from_string(Models *models, Editing_File *file, String_Const_u8 val,
Buffer_Hook_Function *hook_open_file = models->hook_open_file;
if (hook_open_file != 0){
hook_open_file(app_links, file->id);
hook_open_file(&models->app_links, file->id);
}
}
internal void
file_free(System_Functions *system, Lifetime_Allocator *lifetime_allocator, Working_Set *working_set, Editing_File *file){
file_free(Models *models, Editing_File *file){
Lifetime_Allocator *lifetime_allocator = &models->lifetime_allocator;
Working_Set *working_set = &models->working_set;
lifetime_free_object(lifetime_allocator, file->lifetime_object);
Gap_Buffer *buffer = &file->state.buffer;
@ -266,7 +267,7 @@ file_free(System_Functions *system, Lifetime_Allocator *lifetime_allocator, Work
base_free(buffer->allocator, buffer->line_starts);
}
history_free(&file->state.history);
history_free(models, &file->state.history);
linalloc_clear(&file->state.cached_layouts_arena);
table_free(&file->state.line_layout_table);
@ -316,7 +317,7 @@ file_get_line_layout(Models *models, Editing_File *file, f32 width, Face *face,
else{
list = push_array(&file->state.cached_layouts_arena, Buffer_Layout_Item_List, 1);
Interval_i64 line_range = buffer_get_pos_range_from_line_number(&file->state.buffer, line_number);
*list = buffer_layout(&models->mem.arena, &file->state.cached_layouts_arena,
*list = buffer_layout(models->tctx, &file->state.cached_layouts_arena,
&file->state.buffer, line_range, face, width);
key_data = push_data_copy(&file->state.cached_layouts_arena, key_data);
table_insert(&file->state.line_layout_table, key_data, (u64)PtrAsInt(list));

View File

@ -129,10 +129,11 @@ global_history_adjust_edit_grouping_counter(Global_History *global_history, i32
}
internal void
history_init(Application_Links *app, History *history){
history_init(Models *models, History *history){
history->activated = true;
history->arena = make_arena_app_links(app, KB(32));
heap_init(&history->heap, history->arena.base_allocator);
Thread_Context *tctx = models->tctx;
history->arena = reserve_arena(tctx, KB(32));
heap_init(&history->heap, tctx->allocator);
history->heap_wrapper = base_allocator_on_heap(&history->heap);
dll_init_sentinel(&history->free_records);
dll_init_sentinel(&history->records);
@ -146,9 +147,9 @@ history_is_activated(History *history){
}
internal void
history_free(History *history){
history_free(Models *models, History *history){
if (history->activated){
linalloc_clear(&history->arena);
release_arena(models, history->arena);
heap_free_all(&history->heap);
block_zero_struct(history);
}
@ -248,13 +249,13 @@ history_record_edit(Global_History *global_history, History *history, Gap_Buffer
Record *new_record = history__allocate_record(history);
history__stash_record(history, new_record);
new_record->restore_point = begin_temp(&history->arena);
new_record->restore_point = begin_temp(history->arena);
new_record->edit_number = global_history_get_edit_number(global_history);
new_record->kind = RecordKind_Single;
new_record->single.forward_text = push_string_copy(&history->arena, edit.text);
new_record->single.backward_text = buffer_stringify(&history->arena, buffer, edit.range);
new_record->single.forward_text = push_string_copy(history->arena, edit.text);
new_record->single.backward_text = buffer_stringify(history->arena, buffer, edit.range);
new_record->single.first = edit.range.first;
Assert(history->record_lookup.count == history->record_count);
@ -340,8 +341,8 @@ history__optimize_group(Arena *scratch, History *history, Record *record){
end_temp(left->restore_point);
left->edit_number = right->edit_number;
left->single.forward_text = push_string_copy(&history->arena, merged_forward);
left->single.backward_text = push_string_copy(&history->arena, merged_backward);
left->single.forward_text = push_string_copy(history->arena, merged_forward);
left->single.backward_text = push_string_copy(history->arena, merged_backward);
history__free_single_node(history, &right->node);
record->group.count -= 1;

View File

@ -44,7 +44,7 @@ struct Record_Ptr_Lookup_Table{
struct History{
b32 activated;
Arena arena;
Arena *arena;
Heap heap;
Base_Allocator heap_wrapper;
Node free_records;

View File

@ -12,15 +12,15 @@
internal void
text_layout_init(Models *models, Text_Layout_Container *container){
block_zero_struct(container);
container->node_arena = make_arena_models(models);
container->table = make_table_u64_u64(models->base_allocator, 20);
container->node_arena = reserve_arena(models->tctx);
container->table = make_table_u64_u64(models->tctx->allocator, 20);
}
internal Text_Layout*
text_layout_new__alloc_layout(Text_Layout_Container *container){
Text_Layout *node = container->free_nodes;
if (node == 0){
node = push_array(&container->node_arena, Text_Layout, 1);
node = push_array(container->node_arena, Text_Layout, 1);
}
else{
sll_stack_pop(container->free_nodes);
@ -29,13 +29,13 @@ text_layout_new__alloc_layout(Text_Layout_Container *container){
}
internal void
text_layout_release(Text_Layout_Container *container, Text_Layout *layout){
linalloc_clear(&layout->arena);
text_layout_release(Models *models, Text_Layout_Container *container, Text_Layout *layout){
release_arena(models->tctx, layout->arena);
sll_stack_push(container->free_nodes, layout);
}
internal Text_Layout_ID
text_layout_new(Text_Layout_Container *container, Arena arena,
text_layout_new(Text_Layout_Container *container, Arena *arena,
Buffer_ID buffer_id, Buffer_Point point,
Interval_i64 visible_range, Interval_i64 visible_line_number_range,
Rect_f32 rect, int_color *item_colors){
@ -65,14 +65,14 @@ text_layout_get(Text_Layout_Container *container, Text_Layout_ID id){
}
internal b32
text_layout_erase(Text_Layout_Container *container, Text_Layout_ID id){
text_layout_erase(Models *models, Text_Layout_Container *container, Text_Layout_ID id){
b32 result = false;
Table_Lookup lookup = table_lookup(&container->table, id);
if (lookup.found_match){
u64 ptr_val = 0;
table_read(&container->table, lookup, &ptr_val);
Text_Layout *ptr = (Text_Layout*)IntAsPtr(ptr_val);
text_layout_release(container, ptr);
text_layout_release(models, container, ptr);
table_erase(&container->table, lookup);
result = true;
}
@ -85,7 +85,6 @@ internal void
text_layout_render(Models *models, Text_Layout *layout){
Editing_File *file = imp_get_file(models, layout->buffer_id);
if (file != 0){
Arena *scratch = &models->mem.arena;
Render_Target *target = models->target;
Color_Table color_table = models->color_table;
Face *face = file_get_face(models, file);

View File

@ -15,7 +15,7 @@
union Text_Layout{
Text_Layout *next;
struct{
Arena arena;
Arena *arena;
Buffer_ID buffer_id;
Buffer_Point point;
Interval_i64 visible_range;
@ -26,7 +26,7 @@ union Text_Layout{
};
struct Text_Layout_Container{
Arena node_arena;
Arena *node_arena;
Text_Layout *free_nodes;
Table_u64_u64 table;
Text_Layout_ID id_counter;

View File

@ -10,44 +10,10 @@
// TOP
internal void
memory_init(Arena *scratch){
#if defined(FRED_INTERNAL)
# if ARCH_64BIT
void *bases[] = { (void*)TB(1), (void*)TB(2), };
# else
void *bases[] = { (void*)MB(96), (void*)MB(512), };
# endif
#else
void *bases[] = { (void*)0, (void*)0, };
#endif
memory_vars.vars_memory_size = MB(128);
memory_vars.vars_memory = system_memory_allocate_extended(bases[0], memory_vars.vars_memory_size);
memory_vars.target_memory_size = MB(512);
memory_vars.target_memory = system_memory_allocate_extended(bases[1], memory_vars.target_memory_size);
memory_vars.user_memory_size = MB(32);
memory_vars.user_memory = system_memory_allocate_extended(0, memory_vars.user_memory_size);
memory_vars.debug_memory_size = MB(512);
memory_vars.debug_memory = system_memory_allocate_extended(0, memory_vars.debug_memory_size);
i32 render_memsize = MB(1);
target.arena = make_arena_system(&sysfunc);
b32 alloc_success = true;
if (memory_vars.vars_memory == 0 || memory_vars.target_memory == 0 || memory_vars.user_memory == 0){
alloc_success = false;
}
if (!alloc_success){
char msg[] = "Could not allocate sufficient memory. Please make sure you have atleast 512Mb of RAM free. (This requirement will be relaxed in the future).";
system_error_box(scratch, msg);
}
}
internal void
load_app_code(Arena *scratch){
load_app_code(Thread_Context *tctx){
App_Get_Functions *get_funcs = 0;
Scratch_Block scratch(tctx, Scratch_Share);
if (system_load_library(scratch, &libraries.app_code, "4ed_app", LoadLibrary_BinaryDirectory)){
get_funcs = (App_Get_Functions*)system_get_proc(&libraries.app_code, "app_get_functions");
}
@ -70,7 +36,8 @@ global char custom_fail_version_msg[] = "Failed to load custom code due to missi
global char custom_fail_missing_get_bindings_msg[] = "Failed to load custom code due to missing 'get_bindings' symbol. Try rebuilding with buildsuper.";
internal void
load_custom_code(Arena *scratch){
load_custom_code(Thread_Context *tctx){
Scratch_Block scratch(tctx, Scratch_Share);
local_persist char *default_file = "custom_4coder";
local_persist Load_Library_Location locations[] = {
LoadLibrary_CurrentDirectory,
@ -121,17 +88,17 @@ load_custom_code(Arena *scratch){
//LOGF("Loaded custom file: %s\n", success_file);
}
internal void
read_command_line(Arena *scratch, i32 argc, char **argv){
Temp_Memory temp = begin_temp(scratch);
internal void*
read_command_line(Thread_Context *tctx, i32 argc, char **argv){
Scratch_Block scratch(tctx, Scratch_Share);
String_Const_u8 curdir = sysfunc.get_current_path(scratch);
curdir = string_mod_replace_character(curdir, '\\', '/');
char **files = 0;
i32 *file_count = 0;
app.read_command_line(&sysfunc, &memory_vars, curdir, &plat_settings, &files, &file_count, argc, argv);
void *result = app.read_command_line(tctx, &sysfunc, curdir, &plat_settings, &files, &file_count, argc, argv);
sysshared_filter_real_files(scratch, files, file_count);
end_temp(temp);
return(result);
}
// BOTTOM

View File

@ -150,7 +150,7 @@ struct Win32_Object{
};
struct Win32_Vars{
Arena arena;
Thread_Context *tctx;
Win32_Input_Chunk input_chunk;
b8 lctrl_lalt_is_altgr;
@ -201,7 +201,6 @@ struct Win32_Vars{
global Win32_Vars win32vars;
global Render_Target target;
global Application_Memory memory_vars;
global Plat_Settings plat_settings;
global Libraries libraries;
@ -1026,7 +1025,7 @@ Sys_Condition_Variable_Free_Sig(system_condition_variable_free){
internal LRESULT
win32_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
LRESULT result = 0;
Arena *scratch = &win32vars.arena;
Scratch_Block scratch(win32vars.tctx);
switch (uMsg){
case WM_MENUCHAR:break;
@ -1538,20 +1537,21 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdS
// Memory init
//
Thread_Context _tctx = {};
thread_ctx_init(&_tctx, get_base_allocator_system(&sysfunc));
block_zero_struct(&win32vars);
win32vars.tctx = &_tctx;
// TODO(allen): *arena;
target.arena = make_arena_system(&sysfunc);
memset(&win32vars, 0, sizeof(win32vars));
memset(&target, 0, sizeof(target));
memset(&memory_vars, 0, sizeof(memory_vars));
memset(&plat_settings, 0, sizeof(plat_settings));
win32vars.arena = make_arena_system(&sysfunc);
memset(&libraries, 0, sizeof(libraries));
memset(&app, 0, sizeof(app));
memset(&custom_api, 0, sizeof(custom_api));
memory_init(&win32vars.arena);
win32vars.cursor_show = MouseCursorShow_Always;
win32vars.prev_cursor_show = MouseCursorShow_Always;
@ -1568,16 +1568,16 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdS
init_shared_vars();
load_app_code(&win32vars.arena);
load_app_code(win32vars.tctx);
win32vars.log_string = app.get_logger(&sysfunc);
read_command_line(&win32vars.arena, argc, argv);
void *base_ptr = read_command_line(win32vars.tctx, argc, argv);
//
// Load Custom Code
//
#if defined(FRED_SUPER)
load_custom_code(&win32vars.arena);
load_custom_code(win32vars.tctx);
#else
custom_api.get_bindings = get_bindings;
#endif
@ -1630,7 +1630,8 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdS
//
if (!AddClipboardFormatListener(win32vars.window_handle)){
win32_output_error_string(&win32vars.arena, ErrorString_UseLog);
Scratch_Block scratch(win32vars.tctx, Scratch_Share);
win32_output_error_string(scratch, ErrorString_UseLog);
}
win32vars.clip_max = KB(16);
@ -1638,7 +1639,8 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdS
win32vars.clipboard_sequence = GetClipboardSequenceNumber();
if (win32vars.clipboard_sequence == 0){
win32_post_clipboard(&win32vars.arena, "", 0);
Scratch_Block scratch(win32vars.tctx, Scratch_Share);
win32_post_clipboard(scratch, "", 0);
win32vars.clipboard_sequence = GetClipboardSequenceNumber();
win32vars.next_clipboard_is_self = 0;
@ -1648,7 +1650,8 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdS
}
}
else{
win32_read_clipboard_contents(&win32vars.arena);
Scratch_Block scratch(win32vars.tctx, Scratch_Share);
win32_read_clipboard_contents(scratch);
}
win32_keycode_init();
@ -1673,11 +1676,10 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdS
//
{
Temp_Memory temp = begin_temp(&win32vars.arena);
String_Const_u8 curdir = sysfunc.get_current_path(&win32vars.arena);
Scratch_Block scratch(win32vars.tctx, Scratch_Share);
String_Const_u8 curdir = sysfunc.get_current_path(scratch);
curdir = string_mod_replace_character(curdir, '\\', '/');
app.init(&sysfunc, &target, &memory_vars, win32vars.clipboard_contents, curdir, custom_api);
end_temp(temp);
app.init(&sysfunc, &target, base_ptr, win32vars.clipboard_contents, curdir, custom_api);
}
//
@ -1863,7 +1865,8 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdS
}
else{
for (i32 R = 0; R < 4; ++R){
if (win32_read_clipboard_contents(&win32vars.arena)){
Scratch_Block scratch(win32vars.tctx, Scratch_Share);
if (win32_read_clipboard_contents(scratch)){
input.clipboard_changed = true;
break;
}
@ -1880,7 +1883,7 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdS
// NOTE(allen): Application Core Update
Application_Step_Result result = {};
if (app.step != 0){
result = app.step(&sysfunc, &target, &memory_vars, &input);
result = app.step(&sysfunc, &target, base_ptr, &input);
}
else{
//LOG("app.step == 0 -- skipping\n");
@ -1893,12 +1896,14 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdS
// NOTE(allen): Post New Clipboard Content
if (win32vars.clip_post.size > 0){
win32_post_clipboard(&win32vars.arena, (char*)win32vars.clip_post.str, (i32)win32vars.clip_post.size);
Scratch_Block scratch(win32vars.tctx, Scratch_Share);
win32_post_clipboard(scratch, (char*)win32vars.clip_post.str, (i32)win32vars.clip_post.size);
}
// NOTE(allen): Switch to New Title
if (result.has_new_title){
SetWindowText_utf8(&win32vars.arena, win32vars.window_handle, (u8*)result.title_string);
Scratch_Block scratch(win32vars.tctx, Scratch_Share);
SetWindowText_utf8(scratch, win32vars.window_handle, (u8*)result.title_string);
}
// NOTE(allen): Switch to New Cursor