Thread context now introduced to 4coder in ALL layers (booya!) :)
This commit is contained in:
parent
342ba26d29
commit
c47270702a
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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] = {};
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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));}
|
||||
|
|
|
@ -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 },
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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(¤t_project_arena);
|
||||
Project new_project = project_deep_copy(¤t_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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -115,7 +115,7 @@ struct Lister_Data{
|
|||
};
|
||||
|
||||
struct Lister{
|
||||
Arena arena;
|
||||
Arena *arena;
|
||||
Lister_Data data;
|
||||
};
|
||||
|
||||
|
|
69
4ed.cpp
69
4ed.cpp
|
@ -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
18
4ed.h
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
21
4ed_edit.cpp
21
4ed_edit.cpp
|
@ -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);
|
||||
|
|
25
4ed_file.cpp
25
4ed_file.cpp
|
@ -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));
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue