User managed scopes

This commit is contained in:
Allen Webster 2018-09-26 11:06:57 -07:00
parent ea7f82a2d7
commit fc811b2211
5 changed files with 75 additions and 42 deletions

View File

@ -55,25 +55,23 @@ RENDER_CALLER_SIG(default_render_caller){
View_Summary view = get_view(app, view_id, AccessAll); View_Summary view = get_view(app, view_id, AccessAll);
Buffer_Summary buffer = get_buffer(app, view.buffer_id, AccessAll); Buffer_Summary buffer = get_buffer(app, view.buffer_id, AccessAll);
// NOTE(allen): Line highlight setup Managed_Scope render_scope = create_user_managed_scope(app);
Managed_Object line_highlight = 0;
// NOTE(allen): Line highlight setup
if (highlight_line_at_cursor){ if (highlight_line_at_cursor){
Theme_Color color = {0}; Theme_Color color = {0};
color.tag = Stag_Highlight_Cursor_Line; color.tag = Stag_Highlight_Cursor_Line;
get_theme_colors(app, &color, 1); get_theme_colors(app, &color, 1);
uint32_t line_color = color.color; uint32_t line_color = color.color;
line_highlight = alloc_buffer_markers_on_buffer(app, buffer.buffer_id, 1, 0); Managed_Object o = alloc_buffer_markers_on_buffer(app, buffer.buffer_id, 1, &render_scope);
buffer_markers_set_visuals(app, line_highlight, BufferMarkersType_LineHighlights, line_color, 0, 0); buffer_markers_set_visuals(app, o, BufferMarkersType_LineHighlights, line_color, 0, 0);
Marker marker = {0}; Marker marker = {0};
marker.pos = view.cursor.pos; marker.pos = view.cursor.pos;
managed_object_store_data(app, line_highlight, 0, 1, &marker); managed_object_store_data(app, o, 0, 1, &marker);
} }
// NOTE(allen): Token highlight setup // NOTE(allen): Token highlight setup
bool32 do_token_highlight = false; bool32 do_token_highlight = false;
Managed_Object token_highlight = 0;
if (do_token_highlight){ if (do_token_highlight){
Theme_Color color = {0}; Theme_Color color = {0};
color.tag = Stag_Cursor; color.tag = Stag_Cursor;
@ -85,7 +83,7 @@ RENDER_CALLER_SIG(default_render_caller){
int32_t pos1 = buffer_boundary_seek(app, &buffer, pos0, DirLeft , token_flags); int32_t pos1 = buffer_boundary_seek(app, &buffer, pos0, DirLeft , token_flags);
int32_t pos2 = buffer_boundary_seek(app, &buffer, pos1, DirRight, token_flags); int32_t pos2 = buffer_boundary_seek(app, &buffer, pos1, DirRight, token_flags);
token_highlight = alloc_buffer_markers_on_buffer(app, buffer.buffer_id, 2, 0); Managed_Object token_highlight = alloc_buffer_markers_on_buffer(app, buffer.buffer_id, 2, &render_scope);
buffer_markers_set_visuals(app, token_highlight, BufferMarkersType_CharacterHighlightRanges, token_color, 0, 0); buffer_markers_set_visuals(app, token_highlight, BufferMarkersType_CharacterHighlightRanges, token_color, 0, 0);
Marker range_markers[2] = {0}; Marker range_markers[2] = {0};
range_markers[0].pos = pos1; range_markers[0].pos = pos1;
@ -101,7 +99,7 @@ RENDER_CALLER_SIG(default_render_caller){
0x700000A0, 0x700000A0,
0x70A0A000, 0x70A0A000,
}; };
Managed_Object matching_brace_highlights[ArrayCount(enclosure_colors)] = {0}; int32_t color_count = ArrayCount(enclosure_colors);
if (do_matching_enclosure_highlight){ if (do_matching_enclosure_highlight){
Partition *scratch = &global_part; Partition *scratch = &global_part;
@ -121,10 +119,10 @@ RENDER_CALLER_SIG(default_render_caller){
} }
int32_t count = (int32_t)(push_array(scratch, Range, 0) - ranges); int32_t count = (int32_t)(push_array(scratch, Range, 0) - ranges);
int32_t bucket_count = count/ArrayCount(matching_brace_highlights); int32_t bucket_count = count/color_count;
int32_t left_over_count = count%ArrayCount(matching_brace_highlights); int32_t left_over_count = count%color_count;
for (int32_t i = 0; i < ArrayCount(matching_brace_highlights); i += 1){ for (int32_t i = 0; i < color_count; i += 1){
int32_t sub_count = bucket_count + (i < left_over_count?1:0); int32_t sub_count = bucket_count + (i < left_over_count?1:0);
if (sub_count > 0){ if (sub_count > 0){
int32_t marker_count = sub_count*2; int32_t marker_count = sub_count*2;
@ -136,8 +134,7 @@ RENDER_CALLER_SIG(default_render_caller){
markers[j + 0].pos = range_ptr->first; markers[j + 0].pos = range_ptr->first;
markers[j + 1].pos = range_ptr->one_past_last - 1; markers[j + 1].pos = range_ptr->one_past_last - 1;
} }
Managed_Object m = alloc_buffer_markers_on_buffer(app, buffer.buffer_id, marker_count, 0); Managed_Object m = alloc_buffer_markers_on_buffer(app, buffer.buffer_id, marker_count, &render_scope);
matching_brace_highlights[i] = m;
buffer_markers_set_visuals(app, m, BufferMarkersType_CharacterBlocks, enclosure_colors[i], 0, 0); buffer_markers_set_visuals(app, m, BufferMarkersType_CharacterBlocks, enclosure_colors[i], 0, 0);
managed_object_store_data(app, m, 0, marker_count, markers); managed_object_store_data(app, m, 0, marker_count, markers);
end_temp_memory(marker_temp); end_temp_memory(marker_temp);
@ -149,18 +146,7 @@ RENDER_CALLER_SIG(default_render_caller){
do_core_render(app); do_core_render(app);
if (line_highlight != 0){ destroy_user_managed_scope(app, render_scope);
managed_object_free(app, line_highlight);
}
if (token_highlight != 0){
managed_object_free(app, token_highlight);
}
for (int32_t i = 0; i < ArrayCount(matching_brace_highlights); i += 1){
if (matching_brace_highlights[i] != 0){
managed_object_free(app, matching_brace_highlights[i]);
}
}
} }
HOOK_SIG(default_exit){ HOOK_SIG(default_exit){

View File

@ -49,6 +49,8 @@ struct Application_Links;
#define VIEW_END_UI_MODE_SIG(n) int32_t n(Application_Links *app, View_Summary *view) #define VIEW_END_UI_MODE_SIG(n) int32_t n(Application_Links *app, View_Summary *view)
#define VIEW_SET_UI_SIG(n) bool32 n(Application_Links *app, View_Summary *view, UI_Control *control, UI_Quit_Function_Type *quit_function) #define VIEW_SET_UI_SIG(n) bool32 n(Application_Links *app, View_Summary *view, UI_Control *control, UI_Quit_Function_Type *quit_function)
#define VIEW_GET_UI_COPY_SIG(n) UI_Control n(Application_Links *app, View_Summary *view, struct Partition *part) #define VIEW_GET_UI_COPY_SIG(n) UI_Control n(Application_Links *app, View_Summary *view, struct Partition *part)
#define CREATE_USER_MANAGED_SCOPE_SIG(n) Managed_Scope n(Application_Links *app)
#define DESTROY_USER_MANAGED_SCOPE_SIG(n) bool32 n(Application_Links *app, Managed_Scope scope)
#define GET_GLOBAL_MANAGED_SCOPE_SIG(n) Managed_Scope n(Application_Links *app) #define GET_GLOBAL_MANAGED_SCOPE_SIG(n) Managed_Scope n(Application_Links *app)
#define GET_MANAGED_SCOPE_WITH_MULTIPLE_DEPENDENCIES_SIG(n) Managed_Scope n(Application_Links *app, Managed_Scope *intersected_scopes, int32_t count) #define GET_MANAGED_SCOPE_WITH_MULTIPLE_DEPENDENCIES_SIG(n) Managed_Scope n(Application_Links *app, Managed_Scope *intersected_scopes, int32_t count)
#define MANAGED_VARIABLE_CREATE_SIG(n) Managed_Variable_ID n(Application_Links *app, char *null_terminated_name, uint64_t default_value) #define MANAGED_VARIABLE_CREATE_SIG(n) Managed_Variable_ID n(Application_Links *app, char *null_terminated_name, uint64_t default_value)
@ -155,6 +157,8 @@ typedef VIEW_START_UI_MODE_SIG(View_Start_UI_Mode_Function);
typedef VIEW_END_UI_MODE_SIG(View_End_UI_Mode_Function); typedef VIEW_END_UI_MODE_SIG(View_End_UI_Mode_Function);
typedef VIEW_SET_UI_SIG(View_Set_UI_Function); typedef VIEW_SET_UI_SIG(View_Set_UI_Function);
typedef VIEW_GET_UI_COPY_SIG(View_Get_UI_Copy_Function); typedef VIEW_GET_UI_COPY_SIG(View_Get_UI_Copy_Function);
typedef CREATE_USER_MANAGED_SCOPE_SIG(Create_User_Managed_Scope_Function);
typedef DESTROY_USER_MANAGED_SCOPE_SIG(Destroy_User_Managed_Scope_Function);
typedef GET_GLOBAL_MANAGED_SCOPE_SIG(Get_Global_Managed_Scope_Function); typedef GET_GLOBAL_MANAGED_SCOPE_SIG(Get_Global_Managed_Scope_Function);
typedef GET_MANAGED_SCOPE_WITH_MULTIPLE_DEPENDENCIES_SIG(Get_Managed_Scope_With_Multiple_Dependencies_Function); typedef GET_MANAGED_SCOPE_WITH_MULTIPLE_DEPENDENCIES_SIG(Get_Managed_Scope_With_Multiple_Dependencies_Function);
typedef MANAGED_VARIABLE_CREATE_SIG(Managed_Variable_Create_Function); typedef MANAGED_VARIABLE_CREATE_SIG(Managed_Variable_Create_Function);
@ -263,6 +267,8 @@ View_Start_UI_Mode_Function *view_start_ui_mode;
View_End_UI_Mode_Function *view_end_ui_mode; View_End_UI_Mode_Function *view_end_ui_mode;
View_Set_UI_Function *view_set_ui; View_Set_UI_Function *view_set_ui;
View_Get_UI_Copy_Function *view_get_ui_copy; View_Get_UI_Copy_Function *view_get_ui_copy;
Create_User_Managed_Scope_Function *create_user_managed_scope;
Destroy_User_Managed_Scope_Function *destroy_user_managed_scope;
Get_Global_Managed_Scope_Function *get_global_managed_scope; Get_Global_Managed_Scope_Function *get_global_managed_scope;
Get_Managed_Scope_With_Multiple_Dependencies_Function *get_managed_scope_with_multiple_dependencies; Get_Managed_Scope_With_Multiple_Dependencies_Function *get_managed_scope_with_multiple_dependencies;
Managed_Variable_Create_Function *managed_variable_create; Managed_Variable_Create_Function *managed_variable_create;
@ -370,6 +376,8 @@ View_Start_UI_Mode_Function *view_start_ui_mode_;
View_End_UI_Mode_Function *view_end_ui_mode_; View_End_UI_Mode_Function *view_end_ui_mode_;
View_Set_UI_Function *view_set_ui_; View_Set_UI_Function *view_set_ui_;
View_Get_UI_Copy_Function *view_get_ui_copy_; View_Get_UI_Copy_Function *view_get_ui_copy_;
Create_User_Managed_Scope_Function *create_user_managed_scope_;
Destroy_User_Managed_Scope_Function *destroy_user_managed_scope_;
Get_Global_Managed_Scope_Function *get_global_managed_scope_; Get_Global_Managed_Scope_Function *get_global_managed_scope_;
Get_Managed_Scope_With_Multiple_Dependencies_Function *get_managed_scope_with_multiple_dependencies_; Get_Managed_Scope_With_Multiple_Dependencies_Function *get_managed_scope_with_multiple_dependencies_;
Managed_Variable_Create_Function *managed_variable_create_; Managed_Variable_Create_Function *managed_variable_create_;
@ -485,6 +493,8 @@ app_links->view_start_ui_mode_ = View_Start_UI_Mode;\
app_links->view_end_ui_mode_ = View_End_UI_Mode;\ app_links->view_end_ui_mode_ = View_End_UI_Mode;\
app_links->view_set_ui_ = View_Set_UI;\ app_links->view_set_ui_ = View_Set_UI;\
app_links->view_get_ui_copy_ = View_Get_UI_Copy;\ app_links->view_get_ui_copy_ = View_Get_UI_Copy;\
app_links->create_user_managed_scope_ = Create_User_Managed_Scope;\
app_links->destroy_user_managed_scope_ = Destroy_User_Managed_Scope;\
app_links->get_global_managed_scope_ = Get_Global_Managed_Scope;\ app_links->get_global_managed_scope_ = Get_Global_Managed_Scope;\
app_links->get_managed_scope_with_multiple_dependencies_ = Get_Managed_Scope_With_Multiple_Dependencies;\ app_links->get_managed_scope_with_multiple_dependencies_ = Get_Managed_Scope_With_Multiple_Dependencies;\
app_links->managed_variable_create_ = Managed_Variable_Create;\ app_links->managed_variable_create_ = Managed_Variable_Create;\
@ -592,6 +602,8 @@ static inline bool32 view_start_ui_mode(Application_Links *app, View_Summary *vi
static inline int32_t view_end_ui_mode(Application_Links *app, View_Summary *view){return(app->view_end_ui_mode(app, view));} static inline int32_t view_end_ui_mode(Application_Links *app, View_Summary *view){return(app->view_end_ui_mode(app, view));}
static inline bool32 view_set_ui(Application_Links *app, View_Summary *view, UI_Control *control, UI_Quit_Function_Type *quit_function){return(app->view_set_ui(app, view, control, quit_function));} static inline bool32 view_set_ui(Application_Links *app, View_Summary *view, UI_Control *control, UI_Quit_Function_Type *quit_function){return(app->view_set_ui(app, view, control, quit_function));}
static inline UI_Control view_get_ui_copy(Application_Links *app, View_Summary *view, struct Partition *part){return(app->view_get_ui_copy(app, view, part));} static inline UI_Control view_get_ui_copy(Application_Links *app, View_Summary *view, struct Partition *part){return(app->view_get_ui_copy(app, view, part));}
static inline Managed_Scope create_user_managed_scope(Application_Links *app){return(app->create_user_managed_scope(app));}
static inline bool32 destroy_user_managed_scope(Application_Links *app, Managed_Scope scope){return(app->destroy_user_managed_scope(app, scope));}
static inline Managed_Scope get_global_managed_scope(Application_Links *app){return(app->get_global_managed_scope(app));} static inline Managed_Scope get_global_managed_scope(Application_Links *app){return(app->get_global_managed_scope(app));}
static inline Managed_Scope get_managed_scope_with_multiple_dependencies(Application_Links *app, Managed_Scope *intersected_scopes, int32_t count){return(app->get_managed_scope_with_multiple_dependencies(app, intersected_scopes, count));} static inline Managed_Scope get_managed_scope_with_multiple_dependencies(Application_Links *app, Managed_Scope *intersected_scopes, int32_t count){return(app->get_managed_scope_with_multiple_dependencies(app, intersected_scopes, count));}
static inline Managed_Variable_ID managed_variable_create(Application_Links *app, char *null_terminated_name, uint64_t default_value){return(app->managed_variable_create(app, null_terminated_name, default_value));} static inline Managed_Variable_ID managed_variable_create(Application_Links *app, char *null_terminated_name, uint64_t default_value){return(app->managed_variable_create(app, null_terminated_name, default_value));}
@ -699,6 +711,8 @@ static inline bool32 view_start_ui_mode(Application_Links *app, View_Summary *vi
static inline int32_t view_end_ui_mode(Application_Links *app, View_Summary *view){return(app->view_end_ui_mode_(app, view));} static inline int32_t view_end_ui_mode(Application_Links *app, View_Summary *view){return(app->view_end_ui_mode_(app, view));}
static inline bool32 view_set_ui(Application_Links *app, View_Summary *view, UI_Control *control, UI_Quit_Function_Type *quit_function){return(app->view_set_ui_(app, view, control, quit_function));} static inline bool32 view_set_ui(Application_Links *app, View_Summary *view, UI_Control *control, UI_Quit_Function_Type *quit_function){return(app->view_set_ui_(app, view, control, quit_function));}
static inline UI_Control view_get_ui_copy(Application_Links *app, View_Summary *view, struct Partition *part){return(app->view_get_ui_copy_(app, view, part));} static inline UI_Control view_get_ui_copy(Application_Links *app, View_Summary *view, struct Partition *part){return(app->view_get_ui_copy_(app, view, part));}
static inline Managed_Scope create_user_managed_scope(Application_Links *app){return(app->create_user_managed_scope_(app));}
static inline bool32 destroy_user_managed_scope(Application_Links *app, Managed_Scope scope){return(app->destroy_user_managed_scope_(app, scope));}
static inline Managed_Scope get_global_managed_scope(Application_Links *app){return(app->get_global_managed_scope_(app));} static inline Managed_Scope get_global_managed_scope(Application_Links *app){return(app->get_global_managed_scope_(app));}
static inline Managed_Scope get_managed_scope_with_multiple_dependencies(Application_Links *app, Managed_Scope *intersected_scopes, int32_t count){return(app->get_managed_scope_with_multiple_dependencies_(app, intersected_scopes, count));} static inline Managed_Scope get_managed_scope_with_multiple_dependencies(Application_Links *app, Managed_Scope *intersected_scopes, int32_t count){return(app->get_managed_scope_with_multiple_dependencies_(app, intersected_scopes, count));}
static inline Managed_Variable_ID managed_variable_create(Application_Links *app, char *null_terminated_name, uint64_t default_value){return(app->managed_variable_create_(app, null_terminated_name, default_value));} static inline Managed_Variable_ID managed_variable_create(Application_Links *app, char *null_terminated_name, uint64_t default_value){return(app->managed_variable_create_(app, null_terminated_name, default_value));}

View File

@ -2248,14 +2248,6 @@ View_Get_UI_Copy(Application_Links *app, View_Summary *view, struct Partition *p
return(result); return(result);
} }
API_EXPORT Managed_Scope
Get_Global_Managed_Scope(Application_Links *app)
{
Command_Data *cmd = (Command_Data*)app->cmd_context;
Models *models = cmd->models;
return((Managed_Scope)models->dynamic_workspace.scope_id);
}
internal Dynamic_Workspace* internal Dynamic_Workspace*
get_dynamic_workspace(Models *models, Managed_Scope handle){ get_dynamic_workspace(Models *models, Managed_Scope handle){
u32_Ptr_Lookup_Result lookup_result = lookup_u32_Ptr_table(&models->lifetime_allocator.scope_id_to_scope_ptr_table, (u32)handle); u32_Ptr_Lookup_Result lookup_result = lookup_u32_Ptr_table(&models->lifetime_allocator.scope_id_to_scope_ptr_table, (u32)handle);
@ -2265,6 +2257,38 @@ get_dynamic_workspace(Models *models, Managed_Scope handle){
return((Dynamic_Workspace*)*lookup_result.val); return((Dynamic_Workspace*)*lookup_result.val);
} }
API_EXPORT Managed_Scope
Create_User_Managed_Scope(Application_Links *app){
Command_Data *cmd = (Command_Data*)app->cmd_context;
Models *models = cmd->models;
Heap *heap = &models->mem.heap;
Lifetime_Object *object = lifetime_alloc_object(heap, &models->lifetime_allocator, DynamicWorkspace_Unassociated, 0);
object->workspace.user_back_ptr = object;
Managed_Scope scope = (Managed_Scope)object->workspace.scope_id;
return(scope);
}
API_EXPORT bool32
Destroy_User_Managed_Scope(Application_Links *app, Managed_Scope scope){
Command_Data *cmd = (Command_Data*)app->cmd_context;
Models *models = cmd->models;
Dynamic_Workspace *workspace = get_dynamic_workspace(models, scope);
if (workspace != 0){
Lifetime_Object *lifetime_object = (Lifetime_Object*)workspace->user_back_ptr;
lifetime_free_object(&models->mem.heap, &models->lifetime_allocator, lifetime_object);
return(true);
}
return(false);
}
API_EXPORT Managed_Scope
Get_Global_Managed_Scope(Application_Links *app)
{
Command_Data *cmd = (Command_Data*)app->cmd_context;
Models *models = cmd->models;
return((Managed_Scope)models->dynamic_workspace.scope_id);
}
API_EXPORT Managed_Scope API_EXPORT Managed_Scope
Get_Managed_Scope_With_Multiple_Dependencies(Application_Links *app, Managed_Scope *intersected_scopes, int32_t count) Get_Managed_Scope_With_Multiple_Dependencies(Application_Links *app, Managed_Scope *intersected_scopes, int32_t count)
{ {
@ -2290,6 +2314,12 @@ Get_Managed_Scope_With_Multiple_Dependencies(Application_Links *app, Managed_Sco
// NOTE(allen): (global_scope INTERSECT X) == X for all X, therefore we emit nothing when a global group is in the key list. // NOTE(allen): (global_scope INTERSECT X) == X for all X, therefore we emit nothing when a global group is in the key list.
}break; }break;
case DynamicWorkspace_Unassociated:
{
Lifetime_Object **new_object_ptr = push_array(scratch, Lifetime_Object*, 1);
*new_object_ptr = (Lifetime_Object*)workspace->user_back_ptr;
}break;
case DynamicWorkspace_Buffer: case DynamicWorkspace_Buffer:
{ {
Editing_File *file = (Editing_File*)workspace->user_back_ptr; Editing_File *file = (Editing_File*)workspace->user_back_ptr;
@ -2316,6 +2346,11 @@ Get_Managed_Scope_With_Multiple_Dependencies(Application_Links *app, Managed_Sco
} }
} }
}break; }break;
default:
{
InvalidCodePath;
}break;
} }
} }

View File

@ -121,9 +121,10 @@ struct Models{
typedef i32 Dynamic_Workspace_Type; typedef i32 Dynamic_Workspace_Type;
enum{ enum{
DynamicWorkspace_Global = 0, DynamicWorkspace_Global = 0,
DynamicWorkspace_Buffer = 1, DynamicWorkspace_Unassociated = 1,
DynamicWorkspace_View = 2, DynamicWorkspace_Buffer = 2,
DynamicWorkspace_Intersected = 3, DynamicWorkspace_View = 3,
DynamicWorkspace_Intersected = 4,
}; };
enum App_State{ enum App_State{

View File

@ -163,9 +163,7 @@ dynamic_memory_bank_free_all(Heap *heap, Dynamic_Memory_Bank *mem_bank){
//////////////////////////////// ////////////////////////////////
internal void internal void
dynamic_workspace_init(Heap *heap, Lifetime_Allocator *lifetime_allocator, dynamic_workspace_init(Heap *heap, Lifetime_Allocator *lifetime_allocator, i32 user_type, void *user_back_ptr, Dynamic_Workspace *workspace){
i32 user_type, void *user_back_ptr,
Dynamic_Workspace *workspace){
dynamic_variables_block_init(heap, &workspace->var_block); dynamic_variables_block_init(heap, &workspace->var_block);
dynamic_memory_bank_init(heap, &workspace->mem_bank); dynamic_memory_bank_init(heap, &workspace->mem_bank);
if (lifetime_allocator->scope_id_counter == 0){ if (lifetime_allocator->scope_id_counter == 0){
@ -466,8 +464,7 @@ lifetime_alloc_object(Heap *heap, Lifetime_Allocator *lifetime_allocator, i32 us
} }
internal void internal void
lifetime_free_object(Heap *heap, Lifetime_Allocator *lifetime_allocator, lifetime_free_object(Heap *heap, Lifetime_Allocator *lifetime_allocator, Lifetime_Object *lifetime_object){
Lifetime_Object *lifetime_object){
dynamic_workspace_free(heap, lifetime_allocator, &lifetime_object->workspace); dynamic_workspace_free(heap, lifetime_allocator, &lifetime_object->workspace);
i32 key_i = 0; i32 key_i = 0;