Fully transitioned to the new system api linkage
parent
19f3d7a641
commit
d654adacc5
80
4ed.cpp
80
4ed.cpp
|
@ -9,14 +9,13 @@
|
||||||
|
|
||||||
// TOP
|
// TOP
|
||||||
|
|
||||||
Mutex_Lock::Mutex_Lock(System_Functions *s, System_Mutex m){
|
Mutex_Lock::Mutex_Lock(System_Mutex m){
|
||||||
s->mutex_acquire(m);
|
system_mutex_acquire(m);
|
||||||
this->system = s;
|
|
||||||
this->mutex = m;
|
this->mutex = m;
|
||||||
}
|
}
|
||||||
|
|
||||||
Mutex_Lock::~Mutex_Lock(){
|
Mutex_Lock::~Mutex_Lock(){
|
||||||
this->system->mutex_release(this->mutex);
|
system_mutex_release(this->mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
Mutex_Lock::operator System_Mutex(){
|
Mutex_Lock::operator System_Mutex(){
|
||||||
|
@ -42,7 +41,6 @@ restore_state(Application_Links *app, App_Coroutine_State state){
|
||||||
internal Coroutine*
|
internal Coroutine*
|
||||||
app_coroutine_handle_request(Models *models, Coroutine *co, u32 *vals){
|
app_coroutine_handle_request(Models *models, Coroutine *co, u32 *vals){
|
||||||
Coroutine *result = 0;
|
Coroutine *result = 0;
|
||||||
System_Functions *system = models->system;
|
|
||||||
switch (vals[2]){
|
switch (vals[2]){
|
||||||
case AppCoroutineRequest_NewFontFace:
|
case AppCoroutineRequest_NewFontFace:
|
||||||
{
|
{
|
||||||
|
@ -86,7 +84,7 @@ output_file_append(Models *models, Editing_File *file, String_Const_u8 value){
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
file_cursor_to_end(System_Functions *system, Models *models, Editing_File *file){
|
file_cursor_to_end(Models *models, Editing_File *file){
|
||||||
Assert(file != 0);
|
Assert(file != 0);
|
||||||
i64 pos = buffer_size(&file->state.buffer);
|
i64 pos = buffer_size(&file->state.buffer);
|
||||||
Layout *layout = &models->layout;
|
Layout *layout = &models->layout;
|
||||||
|
@ -473,10 +471,9 @@ command_caller(Coroutine *coroutine){
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
app_links_init(System_Functions *system, Application_Links *app_links){
|
app_links_init(Application_Links *app_links){
|
||||||
FillAppLinksAPI(app_links);
|
FillAppLinksAPI(app_links);
|
||||||
app_links->current_coroutine = 0;
|
app_links->current_coroutine = 0;
|
||||||
app_links->system_links = system;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// App Functions
|
// App Functions
|
||||||
|
@ -753,7 +750,7 @@ get_event_flags(Key_Code keycode){
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
force_abort_coroutine(System_Functions *system, Models *models, View *view){
|
force_abort_coroutine(Models *models, View *view){
|
||||||
User_Input user_in = {};
|
User_Input user_in = {};
|
||||||
user_in.abort = true;
|
user_in.abort = true;
|
||||||
for (u32 j = 0; j < 10 && models->command_coroutine != 0; ++j){
|
for (u32 j = 0; j < 10 && models->command_coroutine != 0; ++j){
|
||||||
|
@ -767,7 +764,7 @@ force_abort_coroutine(System_Functions *system, Models *models, View *view){
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
launch_command_via_event(System_Functions *system, Models *models, View *view, Key_Event_Data event){
|
launch_command_via_event(Models *models, View *view, Key_Event_Data event){
|
||||||
models->key = event;
|
models->key = event;
|
||||||
|
|
||||||
i32 map = view_get_map(view);
|
i32 map = view_get_map(view);
|
||||||
|
@ -792,21 +789,29 @@ launch_command_via_event(System_Functions *system, Models *models, View *view, K
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
launch_command_via_keycode(System_Functions *system, Models *models, View *view, Key_Code keycode){
|
launch_command_via_keycode(Models *models, View *view, Key_Code keycode){
|
||||||
Key_Event_Data event = {};
|
Key_Event_Data event = {};
|
||||||
event.keycode = keycode;
|
event.keycode = keycode;
|
||||||
launch_command_via_event(system, models, view, event);
|
launch_command_via_event(models, view, event);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal void
|
||||||
|
app_load_vtables(API_VTable_system *vtable_system,
|
||||||
|
API_VTable_font *vtable_font,
|
||||||
|
API_VTable_graphics *vtable_graphics){
|
||||||
|
system_api_read_vtable(vtable_system);
|
||||||
|
font_api_read_vtable(vtable_font);
|
||||||
|
graphics_api_read_vtable(vtable_graphics);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal Log_Function*
|
internal Log_Function*
|
||||||
app_get_logger(System_Functions *system){
|
app_get_logger(void){
|
||||||
log_init(system);
|
log_init();
|
||||||
return(log_string);
|
return(log_string);
|
||||||
}
|
}
|
||||||
|
|
||||||
App_Read_Command_Line_Sig(app_read_command_line){
|
App_Read_Command_Line_Sig(app_read_command_line){
|
||||||
Models *models = models_init(tctx);
|
Models *models = models_init(tctx);
|
||||||
models->system = system;
|
|
||||||
App_Settings *settings = &models->settings;
|
App_Settings *settings = &models->settings;
|
||||||
block_zero_struct(settings);
|
block_zero_struct(settings);
|
||||||
if (argc > 1){
|
if (argc > 1){
|
||||||
|
@ -821,7 +826,7 @@ App_Init_Sig(app_init){
|
||||||
Models *models = (Models*)base_ptr;
|
Models *models = (Models*)base_ptr;
|
||||||
models->keep_playing = true;
|
models->keep_playing = true;
|
||||||
|
|
||||||
app_links_init(system, &models->app_links);
|
app_links_init(&models->app_links);
|
||||||
|
|
||||||
models->config_api = api;
|
models->config_api = api;
|
||||||
models->app_links.cmd_context = models;
|
models->app_links.cmd_context = models;
|
||||||
|
@ -829,10 +834,10 @@ App_Init_Sig(app_init){
|
||||||
Arena *arena = models->arena;
|
Arena *arena = models->arena;
|
||||||
|
|
||||||
// NOTE(allen): coroutines
|
// NOTE(allen): coroutines
|
||||||
coroutine_system_init(system, &models->coroutines);
|
coroutine_system_init(&models->coroutines);
|
||||||
|
|
||||||
// NOTE(allen): font set
|
// NOTE(allen): font set
|
||||||
font_set_init(system, &models->font_set);
|
font_set_init(&models->font_set);
|
||||||
|
|
||||||
// NOTE(allen): live set
|
// NOTE(allen): live set
|
||||||
{
|
{
|
||||||
|
@ -871,7 +876,7 @@ App_Init_Sig(app_init){
|
||||||
// NOTE(allen): file setup
|
// NOTE(allen): file setup
|
||||||
working_set_init(models, &models->working_set);
|
working_set_init(models, &models->working_set);
|
||||||
|
|
||||||
Mutex_Lock file_order_lock(system, models->working_set.mutex);
|
Mutex_Lock file_order_lock(models->working_set.mutex);
|
||||||
|
|
||||||
// NOTE(allen):
|
// NOTE(allen):
|
||||||
global_history_init(&models->global_history);
|
global_history_init(&models->global_history);
|
||||||
|
@ -937,21 +942,21 @@ App_Init_Sig(app_init){
|
||||||
{
|
{
|
||||||
Panel *panel = layout_initialize(arena, &models->layout);
|
Panel *panel = layout_initialize(arena, &models->layout);
|
||||||
View *new_view = live_set_alloc_view(&models->lifetime_allocator, &models->live_set, panel);
|
View *new_view = live_set_alloc_view(&models->lifetime_allocator, &models->live_set, panel);
|
||||||
view_set_file(system, models, new_view, models->scratch_buffer);
|
view_set_file(models, new_view, models->scratch_buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTE(allen): miscellaneous init
|
// NOTE(allen): miscellaneous init
|
||||||
hot_directory_init(system, arena, &models->hot_directory, current_directory);
|
hot_directory_init(arena, &models->hot_directory, current_directory);
|
||||||
child_process_container_init(models->tctx->allocator, &models->child_processes);
|
child_process_container_init(models->tctx->allocator, &models->child_processes);
|
||||||
models->user_up_key = key_up;
|
models->user_up_key = key_up;
|
||||||
models->user_down_key = key_down;
|
models->user_down_key = key_down;
|
||||||
models->period_wakeup_timer = system->wake_up_timer_create();
|
models->period_wakeup_timer = system_wake_up_timer_create();
|
||||||
}
|
}
|
||||||
|
|
||||||
App_Step_Sig(app_step){
|
App_Step_Sig(app_step){
|
||||||
Models *models = (Models*)base_ptr;
|
Models *models = (Models*)base_ptr;
|
||||||
|
|
||||||
Mutex_Lock file_order_lock(system, models->working_set.mutex);
|
Mutex_Lock file_order_lock(models->working_set.mutex);
|
||||||
|
|
||||||
models->next_animate_delay = max_u32;
|
models->next_animate_delay = max_u32;
|
||||||
models->animate_next_frame = false;
|
models->animate_next_frame = false;
|
||||||
|
@ -1000,8 +1005,8 @@ App_Step_Sig(app_step){
|
||||||
|
|
||||||
b32 edited_file = false;
|
b32 edited_file = false;
|
||||||
u32 amount = 0;
|
u32 amount = 0;
|
||||||
system->cli_begin_update(cli);
|
system_cli_begin_update(cli);
|
||||||
if (system->cli_update_step(cli, dest, max, &amount)){
|
if (system_cli_update_step(cli, dest, max, &amount)){
|
||||||
if (file != 0 && amount > 0){
|
if (file != 0 && amount > 0){
|
||||||
amount = eol_in_place_convert_in(dest, amount);
|
amount = eol_in_place_convert_in(dest, amount);
|
||||||
output_file_append(models, file, SCu8(dest, amount));
|
output_file_append(models, file, SCu8(dest, amount));
|
||||||
|
@ -1009,7 +1014,7 @@ App_Step_Sig(app_step){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (system->cli_end_update(cli)){
|
if (system_cli_end_update(cli)){
|
||||||
if (file != 0){
|
if (file != 0){
|
||||||
String_Const_u8 str = push_u8_stringf(scratch, "exited with code %d", cli->exit);
|
String_Const_u8 str = push_u8_stringf(scratch, "exited with code %d", cli->exit);
|
||||||
output_file_append(models, file, str);
|
output_file_append(models, file, str);
|
||||||
|
@ -1020,7 +1025,7 @@ App_Step_Sig(app_step){
|
||||||
}
|
}
|
||||||
|
|
||||||
if (child_process->cursor_at_end && file != 0){
|
if (child_process->cursor_at_end && file != 0){
|
||||||
file_cursor_to_end(system, models, file);
|
file_cursor_to_end(models, file);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1150,15 +1155,15 @@ App_Step_Sig(app_step){
|
||||||
{
|
{
|
||||||
// NOTE(allen): kill coroutine if we have one
|
// NOTE(allen): kill coroutine if we have one
|
||||||
if (models->command_coroutine != 0){
|
if (models->command_coroutine != 0){
|
||||||
force_abort_coroutine(system, models, view);
|
force_abort_coroutine(models, view);
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTE(allen): run deactivate command
|
// NOTE(allen): run deactivate command
|
||||||
launch_command_via_keycode(system, models, view, key_click_deactivate_view);
|
launch_command_via_keycode(models, view, key_click_deactivate_view);
|
||||||
|
|
||||||
// NOTE(allen): kill coroutine if we have one (again because we just launched a command)
|
// NOTE(allen): kill coroutine if we have one (again because we just launched a command)
|
||||||
if (models->command_coroutine != 0){
|
if (models->command_coroutine != 0){
|
||||||
force_abort_coroutine(system, models, view);
|
force_abort_coroutine(models, view);
|
||||||
}
|
}
|
||||||
|
|
||||||
layout->active_panel = mouse_panel;
|
layout->active_panel = mouse_panel;
|
||||||
|
@ -1167,7 +1172,7 @@ App_Step_Sig(app_step){
|
||||||
view = active_panel->view;
|
view = active_panel->view;
|
||||||
|
|
||||||
// NOTE(allen): run activate command
|
// NOTE(allen): run activate command
|
||||||
launch_command_via_keycode(system, models, view, key_click_activate_view);
|
launch_command_via_keycode(models, view, key_click_activate_view);
|
||||||
}break;
|
}break;
|
||||||
|
|
||||||
case EventConsume_Command:
|
case EventConsume_Command:
|
||||||
|
@ -1203,7 +1208,7 @@ App_Step_Sig(app_step){
|
||||||
|
|
||||||
// NOTE(allen): launch command
|
// NOTE(allen): launch command
|
||||||
else{
|
else{
|
||||||
launch_command_via_event(system, models, view, *key_ptr);
|
launch_command_via_event(models, view, *key_ptr);
|
||||||
}
|
}
|
||||||
}break;
|
}break;
|
||||||
}
|
}
|
||||||
|
@ -1240,7 +1245,7 @@ App_Step_Sig(app_step){
|
||||||
|
|
||||||
// NOTE(allen): dt
|
// NOTE(allen): dt
|
||||||
f32 literal_dt = 0.f;
|
f32 literal_dt = 0.f;
|
||||||
u64 now_usecond_stamp = system->now_time();
|
u64 now_usecond_stamp = system_now_time();
|
||||||
if (!input->first_step){
|
if (!input->first_step){
|
||||||
u64 elapsed_useconds = now_usecond_stamp - models->last_render_usecond_stamp;
|
u64 elapsed_useconds = now_usecond_stamp - models->last_render_usecond_stamp;
|
||||||
literal_dt = (f32)((f64)(elapsed_useconds)/1000000.f);
|
literal_dt = (f32)((f64)(elapsed_useconds)/1000000.f);
|
||||||
|
@ -1363,7 +1368,7 @@ App_Step_Sig(app_step){
|
||||||
models->color_table = color_table;
|
models->color_table = color_table;
|
||||||
}
|
}
|
||||||
|
|
||||||
begin_render_section(target, system, models->frame_counter, literal_dt, animation_dt);
|
begin_render_section(target, models->frame_counter, literal_dt, animation_dt);
|
||||||
models->in_render_mode = true;
|
models->in_render_mode = true;
|
||||||
|
|
||||||
if (models->render_caller != 0){
|
if (models->render_caller != 0){
|
||||||
|
@ -1371,7 +1376,7 @@ App_Step_Sig(app_step){
|
||||||
}
|
}
|
||||||
|
|
||||||
models->in_render_mode = false;
|
models->in_render_mode = false;
|
||||||
end_render_section(target, system);
|
end_render_section(target);
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTE(allen): flush the log
|
// NOTE(allen): flush the log
|
||||||
|
@ -1411,11 +1416,11 @@ App_Step_Sig(app_step){
|
||||||
app_result.animating = models->animate_next_frame;
|
app_result.animating = models->animate_next_frame;
|
||||||
if (models->animate_next_frame){
|
if (models->animate_next_frame){
|
||||||
// NOTE(allen): Silence the timer, because we're going to do another frame right away anyways.
|
// NOTE(allen): Silence the timer, because we're going to do another frame right away anyways.
|
||||||
system->wake_up_timer_set(models->period_wakeup_timer, max_u32);
|
system_wake_up_timer_set(models->period_wakeup_timer, max_u32);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
// NOTE(allen): Set the timer's wakeup period, possibly to max_u32 thus effectively silencing it.
|
// NOTE(allen): Set the timer's wakeup period, possibly to max_u32 thus effectively silencing it.
|
||||||
system->wake_up_timer_set(models->period_wakeup_timer, models->next_animate_delay);
|
system_wake_up_timer_set(models->period_wakeup_timer, models->next_animate_delay);
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTE(allen): Update Frame to Frame States
|
// NOTE(allen): Update Frame to Frame States
|
||||||
|
@ -1430,6 +1435,7 @@ App_Step_Sig(app_step){
|
||||||
extern "C" App_Get_Functions_Sig(app_get_functions){
|
extern "C" App_Get_Functions_Sig(app_get_functions){
|
||||||
App_Functions result = {};
|
App_Functions result = {};
|
||||||
|
|
||||||
|
result.load_vtables = app_load_vtables;
|
||||||
result.get_logger = app_get_logger;
|
result.get_logger = app_get_logger;
|
||||||
result.read_command_line = app_read_command_line;
|
result.read_command_line = app_read_command_line;
|
||||||
result.init = app_init;
|
result.init = app_init;
|
||||||
|
|
13
4ed.h
13
4ed.h
|
@ -57,7 +57,6 @@ struct Plat_Settings{
|
||||||
|
|
||||||
#define App_Read_Command_Line_Sig(name) \
|
#define App_Read_Command_Line_Sig(name) \
|
||||||
void *name(Thread_Context *tctx, \
|
void *name(Thread_Context *tctx, \
|
||||||
System_Functions *system, \
|
|
||||||
String_Const_u8 current_directory,\
|
String_Const_u8 current_directory,\
|
||||||
Plat_Settings *plat_settings,\
|
Plat_Settings *plat_settings,\
|
||||||
char ***files, \
|
char ***files, \
|
||||||
|
@ -73,8 +72,7 @@ struct Custom_API{
|
||||||
};
|
};
|
||||||
|
|
||||||
#define App_Init_Sig(name) \
|
#define App_Init_Sig(name) \
|
||||||
void name(System_Functions *system, \
|
void name(Render_Target *target, \
|
||||||
Render_Target *target, \
|
|
||||||
void *base_ptr, \
|
void *base_ptr, \
|
||||||
String_Const_u8 clipboard,\
|
String_Const_u8 clipboard,\
|
||||||
String_Const_u8 current_directory,\
|
String_Const_u8 current_directory,\
|
||||||
|
@ -104,17 +102,20 @@ struct Application_Step_Input{
|
||||||
};
|
};
|
||||||
|
|
||||||
#define App_Step_Sig(name) Application_Step_Result \
|
#define App_Step_Sig(name) Application_Step_Result \
|
||||||
name(System_Functions *system, \
|
name(Render_Target *target, \
|
||||||
Render_Target *target, \
|
|
||||||
void *base_ptr, \
|
void *base_ptr, \
|
||||||
Application_Step_Input *input)
|
Application_Step_Input *input)
|
||||||
|
|
||||||
typedef App_Step_Sig(App_Step);
|
typedef App_Step_Sig(App_Step);
|
||||||
|
|
||||||
typedef b32 Log_Function(String_Const_u8 str);
|
typedef b32 Log_Function(String_Const_u8 str);
|
||||||
typedef Log_Function *App_Get_Logger(System_Functions *system);
|
typedef Log_Function *App_Get_Logger(void);
|
||||||
|
typedef void App_Load_VTables(API_VTable_system *vtable_system,
|
||||||
|
API_VTable_font *vtable_font,
|
||||||
|
API_VTable_graphics *vtable_graphics);
|
||||||
|
|
||||||
struct App_Functions{
|
struct App_Functions{
|
||||||
|
App_Load_VTables *load_vtables;
|
||||||
App_Get_Logger *get_logger;
|
App_Get_Logger *get_logger;
|
||||||
App_Read_Command_Line *read_command_line;
|
App_Read_Command_Line *read_command_line;
|
||||||
App_Init *init;
|
App_Init *init;
|
||||||
|
|
|
@ -89,8 +89,7 @@ Get_Thread_Context(Application_Links *app){
|
||||||
api(custom) function b32
|
api(custom) function b32
|
||||||
Create_Child_Process(Application_Links *app, String_Const_u8 path, String_Const_u8 command, Child_Process_ID *child_process_id_out){
|
Create_Child_Process(Application_Links *app, String_Const_u8 path, String_Const_u8 command, Child_Process_ID *child_process_id_out){
|
||||||
Models *models = (Models*)app->cmd_context;
|
Models *models = (Models*)app->cmd_context;
|
||||||
System_Functions *system = models->system;
|
return(child_process_call(models, path, command, child_process_id_out));
|
||||||
return(child_process_call(models, system, path, command, child_process_id_out));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
api(custom) function b32
|
api(custom) function b32
|
||||||
|
@ -139,7 +138,7 @@ Clipboard_Post(Application_Links *app, i32 clipboard_id, String_Const_u8 string)
|
||||||
Models *models = (Models*)app->cmd_context;
|
Models *models = (Models*)app->cmd_context;
|
||||||
String_Const_u8 *dest = working_set_next_clipboard_string(&models->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);
|
block_copy(dest->str, string.str, string.size);
|
||||||
models->system->post_clipboard(*dest);
|
system_post_clipboard(*dest);
|
||||||
return(true);
|
return(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -204,11 +203,10 @@ api(custom) function Buffer_ID
|
||||||
Get_Buffer_By_File_Name(Application_Links *app, String_Const_u8 file_name, Access_Flag access)
|
Get_Buffer_By_File_Name(Application_Links *app, String_Const_u8 file_name, Access_Flag access)
|
||||||
{
|
{
|
||||||
Models *models = (Models*)app->cmd_context;
|
Models *models = (Models*)app->cmd_context;
|
||||||
System_Functions *system = models->system;
|
|
||||||
Editing_File_Name canon = {};
|
Editing_File_Name canon = {};
|
||||||
Buffer_ID result = false;
|
Buffer_ID result = false;
|
||||||
Scratch_Block scratch(app);
|
Scratch_Block scratch(app);
|
||||||
if (get_canon_name(system, scratch, file_name, &canon)){
|
if (get_canon_name(scratch, file_name, &canon)){
|
||||||
Working_Set *working_set = &models->working_set;
|
Working_Set *working_set = &models->working_set;
|
||||||
Editing_File *file = working_set_contains_canon(working_set, string_from_file_name(&canon));
|
Editing_File *file = working_set_contains_canon(working_set, string_from_file_name(&canon));
|
||||||
if (api_check_buffer(file, access)){
|
if (api_check_buffer(file, access)){
|
||||||
|
@ -672,7 +670,6 @@ api(custom) function b32
|
||||||
Buffer_Set_Setting(Application_Links *app, Buffer_ID buffer_id, Buffer_Setting_ID setting, i32 value)
|
Buffer_Set_Setting(Application_Links *app, Buffer_ID buffer_id, Buffer_Setting_ID setting, i32 value)
|
||||||
{
|
{
|
||||||
Models *models = (Models*)app->cmd_context;
|
Models *models = (Models*)app->cmd_context;
|
||||||
System_Functions *system = models->system;
|
|
||||||
Editing_File *file = imp_get_file(models, buffer_id);
|
Editing_File *file = imp_get_file(models, buffer_id);
|
||||||
b32 result = false;
|
b32 result = false;
|
||||||
if (api_check_buffer(file)){
|
if (api_check_buffer(file)){
|
||||||
|
@ -814,7 +811,6 @@ api(custom) function b32
|
||||||
Buffer_Save(Application_Links *app, Buffer_ID buffer_id, String_Const_u8 file_name, Buffer_Save_Flag flags)
|
Buffer_Save(Application_Links *app, Buffer_ID buffer_id, String_Const_u8 file_name, Buffer_Save_Flag flags)
|
||||||
{
|
{
|
||||||
Models *models = (Models*)app->cmd_context;
|
Models *models = (Models*)app->cmd_context;
|
||||||
System_Functions *system = models->system;
|
|
||||||
Editing_File *file = imp_get_file(models, buffer_id);
|
Editing_File *file = imp_get_file(models, buffer_id);
|
||||||
|
|
||||||
b32 result = false;
|
b32 result = false;
|
||||||
|
@ -829,7 +825,7 @@ Buffer_Save(Application_Links *app, Buffer_ID buffer_id, String_Const_u8 file_na
|
||||||
if (!skip_save){
|
if (!skip_save){
|
||||||
Scratch_Block scratch(models->tctx, Scratch_Share);
|
Scratch_Block scratch(models->tctx, Scratch_Share);
|
||||||
String_Const_u8 name = push_string_copy(scratch, file_name);
|
String_Const_u8 name = push_string_copy(scratch, file_name);
|
||||||
save_file_to_name(system, models, file, name.str);
|
save_file_to_name(models, file, name.str);
|
||||||
result = true;
|
result = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -841,7 +837,6 @@ api(custom) function Buffer_Kill_Result
|
||||||
Buffer_Kill(Application_Links *app, Buffer_ID buffer_id, Buffer_Kill_Flag flags)
|
Buffer_Kill(Application_Links *app, Buffer_ID buffer_id, Buffer_Kill_Flag flags)
|
||||||
{
|
{
|
||||||
Models *models = (Models*)app->cmd_context;
|
Models *models = (Models*)app->cmd_context;
|
||||||
System_Functions *system = models->system;
|
|
||||||
Working_Set *working_set = &models->working_set;
|
Working_Set *working_set = &models->working_set;
|
||||||
Editing_File *file = imp_get_file(models, buffer_id);
|
Editing_File *file = imp_get_file(models, buffer_id);
|
||||||
Buffer_Kill_Result result = BufferKillResult_DoesNotExist;
|
Buffer_Kill_Result result = BufferKillResult_DoesNotExist;
|
||||||
|
@ -855,7 +850,7 @@ Buffer_Kill(Application_Links *app, Buffer_ID buffer_id, Buffer_Kill_Flag flags)
|
||||||
|
|
||||||
buffer_unbind_name_low_level(working_set, file);
|
buffer_unbind_name_low_level(working_set, file);
|
||||||
if (file->canon.name_size != 0){
|
if (file->canon.name_size != 0){
|
||||||
buffer_unbind_file(system, working_set, file);
|
buffer_unbind_file(working_set, file);
|
||||||
}
|
}
|
||||||
file_free(models, file);
|
file_free(models, file);
|
||||||
working_set_free_file(&models->heap, working_set, file);
|
working_set_free_file(&models->heap, working_set, file);
|
||||||
|
@ -872,7 +867,7 @@ Buffer_Kill(Application_Links *app, Buffer_ID buffer_id, Buffer_Kill_Flag flags)
|
||||||
Assert(file_node != order);
|
Assert(file_node != order);
|
||||||
view->file = 0;
|
view->file = 0;
|
||||||
Editing_File *new_file = CastFromMember(Editing_File, touch_node, file_node);
|
Editing_File *new_file = CastFromMember(Editing_File, touch_node, file_node);
|
||||||
view_set_file(system, models, view, new_file);
|
view_set_file(models, view, new_file);
|
||||||
file_node = file_node->next;
|
file_node = file_node->next;
|
||||||
if (file_node == order){
|
if (file_node == order){
|
||||||
file_node = file_node->next;
|
file_node = file_node->next;
|
||||||
|
@ -898,21 +893,20 @@ api(custom) function Buffer_Reopen_Result
|
||||||
Buffer_Reopen(Application_Links *app, Buffer_ID buffer_id, Buffer_Reopen_Flag flags)
|
Buffer_Reopen(Application_Links *app, Buffer_ID buffer_id, Buffer_Reopen_Flag flags)
|
||||||
{
|
{
|
||||||
Models *models = (Models*)app->cmd_context;
|
Models *models = (Models*)app->cmd_context;
|
||||||
System_Functions *system = models->system;
|
|
||||||
Scratch_Block scratch(models->tctx, Scratch_Share);
|
Scratch_Block scratch(models->tctx, Scratch_Share);
|
||||||
Editing_File *file = imp_get_file(models, buffer_id);
|
Editing_File *file = imp_get_file(models, buffer_id);
|
||||||
Buffer_Reopen_Result result = BufferReopenResult_Failed;
|
Buffer_Reopen_Result result = BufferReopenResult_Failed;
|
||||||
if (api_check_buffer(file)){
|
if (api_check_buffer(file)){
|
||||||
if (file->canon.name_size > 0){
|
if (file->canon.name_size > 0){
|
||||||
Plat_Handle handle = {};
|
Plat_Handle handle = {};
|
||||||
if (system->load_handle(scratch, (char*)file->canon.name_space, &handle)){
|
if (system_load_handle(scratch, (char*)file->canon.name_space, &handle)){
|
||||||
File_Attributes attributes = system->load_attributes(handle);
|
File_Attributes attributes = system_load_attributes(handle);
|
||||||
|
|
||||||
char *file_memory = push_array(scratch, char, (i32)attributes.size);
|
char *file_memory = push_array(scratch, char, (i32)attributes.size);
|
||||||
|
|
||||||
if (file_memory != 0){
|
if (file_memory != 0){
|
||||||
if (system->load_file(handle, file_memory, (i32)attributes.size)){
|
if (system_load_file(handle, file_memory, (i32)attributes.size)){
|
||||||
system->load_close(handle);
|
system_load_close(handle);
|
||||||
|
|
||||||
// TODO(allen): try(perform a diff maybe apply edits in reopen)
|
// TODO(allen): try(perform a diff maybe apply edits in reopen)
|
||||||
|
|
||||||
|
@ -943,7 +937,7 @@ Buffer_Reopen(Application_Links *app, Buffer_ID buffer_id, Buffer_Reopen_Flag fl
|
||||||
file_create_from_string(models, file, SCu8(file_memory, attributes.size), attributes);
|
file_create_from_string(models, file, SCu8(file_memory, attributes.size), attributes);
|
||||||
|
|
||||||
for (i32 i = 0; i < vptr_count; ++i){
|
for (i32 i = 0; i < vptr_count; ++i){
|
||||||
view_set_file(system, models, vptrs[i], file);
|
view_set_file(models, vptrs[i], file);
|
||||||
|
|
||||||
vptrs[i]->file = file;
|
vptrs[i]->file = file;
|
||||||
i64 line = line_numbers[i];
|
i64 line = line_numbers[i];
|
||||||
|
@ -954,11 +948,11 @@ Buffer_Reopen(Application_Links *app, Buffer_ID buffer_id, Buffer_Reopen_Flag fl
|
||||||
result = BufferReopenResult_Reopened;
|
result = BufferReopenResult_Reopened;
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
system->load_close(handle);
|
system_load_close(handle);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
system->load_close(handle);
|
system_load_close(handle);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -983,7 +977,7 @@ Get_File_Attributes(Application_Links *app, String_Const_u8 file_name)
|
||||||
{
|
{
|
||||||
Models *models = (Models*)app->cmd_context;
|
Models *models = (Models*)app->cmd_context;
|
||||||
Scratch_Block scratch(models->tctx, Scratch_Share);
|
Scratch_Block scratch(models->tctx, Scratch_Share);
|
||||||
return(models->system->quick_file_attributes(scratch, file_name));
|
return(system_quick_file_attributes(scratch, file_name));
|
||||||
}
|
}
|
||||||
|
|
||||||
function View*
|
function View*
|
||||||
|
@ -1232,7 +1226,7 @@ Panel_Split(Application_Links *app, Panel_ID panel_id, Panel_Split_Orientation o
|
||||||
if (layout_split_panel(layout, panel, (orientation == PanelSplit_LeftAndRight), &new_panel)){
|
if (layout_split_panel(layout, panel, (orientation == PanelSplit_LeftAndRight), &new_panel)){
|
||||||
Live_Views *live_set = &models->live_set;
|
Live_Views *live_set = &models->live_set;
|
||||||
View *new_view = live_set_alloc_view(&models->lifetime_allocator, live_set, new_panel);
|
View *new_view = live_set_alloc_view(&models->lifetime_allocator, live_set, new_panel);
|
||||||
view_set_file(models->system, models, new_view, models->scratch_buffer);
|
view_set_file(models, new_view, models->scratch_buffer);
|
||||||
result = true;
|
result = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1634,9 +1628,9 @@ View_Set_Buffer(Application_Links *app, View_ID view_id, Buffer_ID buffer_id, Se
|
||||||
Editing_File *file = working_set_get_file(&models->working_set, buffer_id);
|
Editing_File *file = working_set_get_file(&models->working_set, buffer_id);
|
||||||
if (api_check_buffer(file)){
|
if (api_check_buffer(file)){
|
||||||
if (file != view->file){
|
if (file != view->file){
|
||||||
view_set_file(models->system, models, view, file);
|
view_set_file(models, view, file);
|
||||||
if (!(flags & SetBuffer_KeepOriginalGUI)){
|
if (!(flags & SetBuffer_KeepOriginalGUI)){
|
||||||
view_quit_ui(models->system, models, view);
|
view_quit_ui(models, view);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
result = true;
|
result = true;
|
||||||
|
@ -1683,7 +1677,7 @@ View_End_UI_Mode(Application_Links *app, View_ID view_id)
|
||||||
View *view = imp_get_view(models, view_id);
|
View *view = imp_get_view(models, view_id);
|
||||||
b32 result = false;
|
b32 result = false;
|
||||||
if (api_check_view(view) && view->ui_mode){
|
if (api_check_view(view) && view->ui_mode){
|
||||||
view_quit_ui(models->system, models, view);
|
view_quit_ui(models, view);
|
||||||
view->ui_mode = false;
|
view->ui_mode = false;
|
||||||
result = true;
|
result = true;
|
||||||
}
|
}
|
||||||
|
@ -2123,7 +2117,6 @@ api(custom) function User_Input
|
||||||
Get_User_Input(Application_Links *app, Input_Type_Flag get_type, Input_Type_Flag abort_type)
|
Get_User_Input(Application_Links *app, Input_Type_Flag get_type, Input_Type_Flag abort_type)
|
||||||
{
|
{
|
||||||
Models *models = (Models*)app->cmd_context;
|
Models *models = (Models*)app->cmd_context;
|
||||||
System_Functions *system = models->system;
|
|
||||||
User_Input result = {};
|
User_Input result = {};
|
||||||
if (app->type_coroutine == Co_Command){
|
if (app->type_coroutine == Co_Command){
|
||||||
Coroutine *coroutine = (Coroutine*)app->current_coroutine;
|
Coroutine *coroutine = (Coroutine*)app->current_coroutine;
|
||||||
|
@ -2212,7 +2205,7 @@ Print_Message(Application_Links *app, String_Const_u8 message)
|
||||||
b32 result = false;
|
b32 result = false;
|
||||||
if (file != 0){
|
if (file != 0){
|
||||||
output_file_append(models, file, message);
|
output_file_append(models, file, message);
|
||||||
file_cursor_to_end(models->system, models, file);
|
file_cursor_to_end(models, file);
|
||||||
result = true;
|
result = true;
|
||||||
}
|
}
|
||||||
return(result);
|
return(result);
|
||||||
|
@ -2226,7 +2219,7 @@ Log_String(Application_Links *app, String_Const_u8 str){
|
||||||
api(custom) function i32
|
api(custom) function i32
|
||||||
Thread_Get_ID(Application_Links *app){
|
Thread_Get_ID(Application_Links *app){
|
||||||
Models *models = (Models*)app->cmd_context;
|
Models *models = (Models*)app->cmd_context;
|
||||||
return(models->system->thread_get_id());
|
return(system_thread_get_id());
|
||||||
}
|
}
|
||||||
|
|
||||||
api(custom) function Face_ID
|
api(custom) function Face_ID
|
||||||
|
@ -2240,13 +2233,12 @@ api(custom) function b32
|
||||||
Set_Global_Face(Application_Links *app, Face_ID id, b32 apply_to_all_buffers)
|
Set_Global_Face(Application_Links *app, Face_ID id, b32 apply_to_all_buffers)
|
||||||
{
|
{
|
||||||
Models *models = (Models*)app->cmd_context;
|
Models *models = (Models*)app->cmd_context;
|
||||||
System_Functions *system = models->system;
|
|
||||||
|
|
||||||
b32 did_change = false;
|
b32 did_change = false;
|
||||||
Face *face = font_set_face_from_id(&models->font_set, id);
|
Face *face = font_set_face_from_id(&models->font_set, id);
|
||||||
if (face != 0){
|
if (face != 0){
|
||||||
if (apply_to_all_buffers){
|
if (apply_to_all_buffers){
|
||||||
global_set_font_and_update_files(system, models, face);
|
global_set_font_and_update_files(models, face);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
models->global_face_id = face->id;
|
models->global_face_id = face->id;
|
||||||
|
@ -2384,8 +2376,7 @@ Buffer_History_Set_Current_State_Index(Application_Links *app, Buffer_ID buffer_
|
||||||
if (api_check_buffer(file) && history_is_activated(&file->state.history)){
|
if (api_check_buffer(file) && history_is_activated(&file->state.history)){
|
||||||
i32 max_index = history_get_record_count(&file->state.history);
|
i32 max_index = history_get_record_count(&file->state.history);
|
||||||
if (0 <= index && index <= max_index){
|
if (0 <= index && index <= max_index){
|
||||||
System_Functions *system = models->system;
|
edit_change_current_history_state(models, file, index);
|
||||||
edit_change_current_history_state(system, models, file, index);
|
|
||||||
result = true;
|
result = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2465,7 +2456,6 @@ Get_Face_Description(Application_Links *app, Face_ID face_id)
|
||||||
api(custom) function Face_Metrics
|
api(custom) function Face_Metrics
|
||||||
Get_Face_Metrics(Application_Links *app, Face_ID face_id){
|
Get_Face_Metrics(Application_Links *app, Face_ID face_id){
|
||||||
Models *models = (Models*)app->cmd_context;
|
Models *models = (Models*)app->cmd_context;
|
||||||
System_Functions *system = models->system;
|
|
||||||
Face_Metrics result = {};
|
Face_Metrics result = {};
|
||||||
if (face_id != 0){
|
if (face_id != 0){
|
||||||
Face *face = font_set_face_from_id(&models->font_set, face_id);
|
Face *face = font_set_face_from_id(&models->font_set, face_id);
|
||||||
|
@ -2500,7 +2490,6 @@ Try_Create_New_Face(Application_Links *app, Face_Description *description)
|
||||||
Models *models = (Models*)app->cmd_context;
|
Models *models = (Models*)app->cmd_context;
|
||||||
Face_ID result = 0;
|
Face_ID result = 0;
|
||||||
if (is_running_coroutine(app)){
|
if (is_running_coroutine(app)){
|
||||||
System_Functions *system = models->system;
|
|
||||||
Coroutine *coroutine = (Coroutine*)app->current_coroutine;
|
Coroutine *coroutine = (Coroutine*)app->current_coroutine;
|
||||||
Assert(coroutine != 0);
|
Assert(coroutine != 0);
|
||||||
((Face_Description**)coroutine->out)[0] = description;
|
((Face_Description**)coroutine->out)[0] = description;
|
||||||
|
@ -2521,7 +2510,6 @@ Try_Modify_Face(Application_Links *app, Face_ID id, Face_Description *descriptio
|
||||||
Models *models = (Models*)app->cmd_context;
|
Models *models = (Models*)app->cmd_context;
|
||||||
b32 result = false;
|
b32 result = false;
|
||||||
if (is_running_coroutine(app)){
|
if (is_running_coroutine(app)){
|
||||||
System_Functions *system = models->system;
|
|
||||||
Coroutine *coroutine = (Coroutine*)app->current_coroutine;
|
Coroutine *coroutine = (Coroutine*)app->current_coroutine;
|
||||||
Assert(coroutine != 0);
|
Assert(coroutine != 0);
|
||||||
((Face_Description**)coroutine->out)[0] = description;
|
((Face_Description**)coroutine->out)[0] = description;
|
||||||
|
@ -2543,7 +2531,7 @@ Try_Release_Face(Application_Links *app, Face_ID id, Face_ID replacement_id)
|
||||||
Font_Set *font_set = &models->font_set;
|
Font_Set *font_set = &models->font_set;
|
||||||
Face *face = font_set_face_from_id(font_set, id);
|
Face *face = font_set_face_from_id(font_set, id);
|
||||||
Face *replacement = font_set_face_from_id(font_set, replacement_id);
|
Face *replacement = font_set_face_from_id(font_set, replacement_id);
|
||||||
return(release_font_and_update(models->system, models, face, replacement));
|
return(release_font_and_update(models, face, replacement));
|
||||||
}
|
}
|
||||||
|
|
||||||
api(custom) function void
|
api(custom) function void
|
||||||
|
@ -2595,18 +2583,17 @@ Set_Hot_Directory(Application_Links *app, String_Const_u8 string)
|
||||||
{
|
{
|
||||||
Models *models = (Models*)app->cmd_context;
|
Models *models = (Models*)app->cmd_context;
|
||||||
Hot_Directory *hot = &models->hot_directory;
|
Hot_Directory *hot = &models->hot_directory;
|
||||||
hot_directory_set(models->system, hot, string);
|
hot_directory_set(hot, string);
|
||||||
return(true);
|
return(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
api(custom) function File_List
|
api(custom) function File_List
|
||||||
Get_File_List(Application_Links *app, Arena *arena, String_Const_u8 directory){
|
Get_File_List(Application_Links *app, Arena *arena, String_Const_u8 directory){
|
||||||
Models *models = (Models*)app->cmd_context;
|
Models *models = (Models*)app->cmd_context;
|
||||||
System_Functions *system = models->system;
|
String_Const_u8 canonical_directory = system_get_canonical(arena, directory);
|
||||||
String_Const_u8 canonical_directory = system->get_canonical(arena, directory);
|
|
||||||
File_List list = {};
|
File_List list = {};
|
||||||
if (canonical_directory.str != 0){
|
if (canonical_directory.str != 0){
|
||||||
list = system->get_file_list(arena, canonical_directory);
|
list = system_get_file_list(arena, canonical_directory);
|
||||||
}
|
}
|
||||||
return(list);
|
return(list);
|
||||||
}
|
}
|
||||||
|
@ -2625,7 +2612,7 @@ api(custom) function void*
|
||||||
Memory_Allocate(Application_Links *app, i32 size)
|
Memory_Allocate(Application_Links *app, i32 size)
|
||||||
{
|
{
|
||||||
Models *models = (Models*)app->cmd_context;
|
Models *models = (Models*)app->cmd_context;
|
||||||
void *result = models->system->memory_allocate(size);
|
void *result = system_memory_allocate(size);
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2633,22 +2620,21 @@ api(custom) function b32
|
||||||
Memory_Set_Protection(Application_Links *app, void *ptr, i32 size, Memory_Protect_Flags flags)
|
Memory_Set_Protection(Application_Links *app, void *ptr, i32 size, Memory_Protect_Flags flags)
|
||||||
{
|
{
|
||||||
Models *models = (Models*)app->cmd_context;
|
Models *models = (Models*)app->cmd_context;
|
||||||
return(models->system->memory_set_protection(ptr, size, flags));
|
return(system_memory_set_protection(ptr, size, flags));
|
||||||
}
|
}
|
||||||
|
|
||||||
api(custom) function void
|
api(custom) function void
|
||||||
Memory_Free(Application_Links *app, void *ptr, i32 size)
|
Memory_Free(Application_Links *app, void *ptr, i32 size)
|
||||||
{
|
{
|
||||||
Models *models = (Models*)app->cmd_context;
|
Models *models = (Models*)app->cmd_context;
|
||||||
models->system->memory_free(ptr, size);
|
system_memory_free(ptr, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
api(custom) function String_Const_u8
|
api(custom) function String_Const_u8
|
||||||
Push_4ed_Path(Application_Links *app, Arena *arena)
|
Push_4ed_Path(Application_Links *app, Arena *arena)
|
||||||
{
|
{
|
||||||
Models *models = (Models*)app->cmd_context;
|
Models *models = (Models*)app->cmd_context;
|
||||||
System_Functions *system = models->system;
|
return(system_get_path(arena, SystemPath_Binary));
|
||||||
return(system->get_path(arena, SystemPath_Binary));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO(allen): do(add a "shown but auto-hides on timer" setting for cursor show type)
|
// TODO(allen): do(add a "shown but auto-hides on timer" setting for cursor show type)
|
||||||
|
@ -2656,7 +2642,7 @@ api(custom) function void
|
||||||
Show_Mouse_Cursor(Application_Links *app, Mouse_Cursor_Show_Type show)
|
Show_Mouse_Cursor(Application_Links *app, Mouse_Cursor_Show_Type show)
|
||||||
{
|
{
|
||||||
Models *models = (Models*)app->cmd_context;
|
Models *models = (Models*)app->cmd_context;
|
||||||
models->system->show_mouse_cursor(show);
|
system_show_mouse_cursor(show);
|
||||||
}
|
}
|
||||||
|
|
||||||
api(custom) function b32
|
api(custom) function b32
|
||||||
|
@ -2670,7 +2656,7 @@ api(custom) function b32
|
||||||
Set_Fullscreen(Application_Links *app, b32 full_screen)
|
Set_Fullscreen(Application_Links *app, b32 full_screen)
|
||||||
{
|
{
|
||||||
Models *models = (Models*)app->cmd_context;
|
Models *models = (Models*)app->cmd_context;
|
||||||
b32 success = models->system->set_fullscreen(full_screen);
|
b32 success = system_set_fullscreen(full_screen);
|
||||||
if (!success){
|
if (!success){
|
||||||
print_message(app, string_u8_litexpr("ERROR: Failed to go fullscreen.\n"));
|
print_message(app, string_u8_litexpr("ERROR: Failed to go fullscreen.\n"));
|
||||||
}
|
}
|
||||||
|
@ -2681,7 +2667,7 @@ api(custom) function b32
|
||||||
Is_Fullscreen(Application_Links *app)
|
Is_Fullscreen(Application_Links *app)
|
||||||
{
|
{
|
||||||
Models *models = (Models*)app->cmd_context;
|
Models *models = (Models*)app->cmd_context;
|
||||||
b32 result = models->system->is_fullscreen();
|
b32 result = system_is_fullscreen();
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2709,8 +2695,7 @@ Get_Microseconds_Timestamp(Application_Links *app)
|
||||||
{
|
{
|
||||||
// TODO(allen): do(decrease indirection in API calls)
|
// TODO(allen): do(decrease indirection in API calls)
|
||||||
Models *models = (Models*)app->cmd_context;
|
Models *models = (Models*)app->cmd_context;
|
||||||
System_Functions *system = models->system;
|
return(system_now_time());
|
||||||
return(system->now_time());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function Vec2
|
function Vec2
|
||||||
|
@ -2939,6 +2924,8 @@ Text_Layout_Character_On_Screen(Application_Links *app, Text_Layout_ID layout_id
|
||||||
f32 width = rect_width(rect);
|
f32 width = rect_width(rect);
|
||||||
Face *face = file_get_face(models, file);
|
Face *face = file_get_face(models, file);
|
||||||
|
|
||||||
|
Assert(layout->visible_line_number_range.first <= line_number);
|
||||||
|
|
||||||
f32 y = 0.f;
|
f32 y = 0.f;
|
||||||
Buffer_Layout_Item_List line = {};
|
Buffer_Layout_Item_List line = {};
|
||||||
for (i64 line_number_it = layout->visible_line_number_range.first;;
|
for (i64 line_number_it = layout->visible_line_number_range.first;;
|
||||||
|
@ -3019,11 +3006,10 @@ api(custom) function void
|
||||||
Open_Color_Picker(Application_Links *app, Color_Picker *picker)
|
Open_Color_Picker(Application_Links *app, Color_Picker *picker)
|
||||||
{
|
{
|
||||||
Models *models = (Models*)app->cmd_context;
|
Models *models = (Models*)app->cmd_context;
|
||||||
System_Functions *system = models->system;
|
|
||||||
if (picker->finished){
|
if (picker->finished){
|
||||||
*picker->finished = false;
|
*picker->finished = false;
|
||||||
}
|
}
|
||||||
system->open_color_picker(picker);
|
system_open_color_picker(picker);
|
||||||
}
|
}
|
||||||
|
|
||||||
api(custom) function void
|
api(custom) function void
|
||||||
|
|
|
@ -35,7 +35,6 @@ enum App_State{
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Models{
|
struct Models{
|
||||||
System_Functions *system;
|
|
||||||
Thread_Context *tctx;
|
Thread_Context *tctx;
|
||||||
|
|
||||||
Arena *arena;
|
Arena *arena;
|
||||||
|
@ -212,10 +211,9 @@ enum{
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
|
||||||
struct Mutex_Lock{
|
struct Mutex_Lock{
|
||||||
Mutex_Lock(System_Functions *system, System_Mutex mutex);
|
Mutex_Lock(System_Mutex mutex);
|
||||||
~Mutex_Lock();
|
~Mutex_Lock();
|
||||||
operator System_Mutex();
|
operator System_Mutex();
|
||||||
System_Functions *system;
|
|
||||||
System_Mutex mutex;
|
System_Mutex mutex;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -15,8 +15,16 @@
|
||||||
|
|
||||||
#include "4coder_base_types.h"
|
#include "4coder_base_types.h"
|
||||||
#include "4coder_table.h"
|
#include "4coder_table.h"
|
||||||
|
|
||||||
#include "4ed_font_interface.h"
|
#include "4ed_font_interface.h"
|
||||||
#include "4ed_system.h"
|
#include "4ed_system_types.h"
|
||||||
|
#define DYNAMIC_LINK_API
|
||||||
|
#include "generated/system_api.h"
|
||||||
|
#define DYNAMIC_LINK_API
|
||||||
|
#include "generated/graphics_api.h"
|
||||||
|
#define DYNAMIC_LINK_API
|
||||||
|
#include "generated/font_api.h"
|
||||||
|
|
||||||
#include "4coder_string_match.h"
|
#include "4coder_string_match.h"
|
||||||
|
|
||||||
#include "4coder_base_types.cpp"
|
#include "4coder_base_types.cpp"
|
||||||
|
@ -55,6 +63,13 @@
|
||||||
#include "4ed_log.h"
|
#include "4ed_log.h"
|
||||||
#include "4ed_app_models.h"
|
#include "4ed_app_models.h"
|
||||||
|
|
||||||
|
#define DYNAMIC_LINK_API
|
||||||
|
#include "generated/system_api.cpp"
|
||||||
|
#define DYNAMIC_LINK_API
|
||||||
|
#include "generated/graphics_api.cpp"
|
||||||
|
#define DYNAMIC_LINK_API
|
||||||
|
#include "generated/font_api.cpp"
|
||||||
|
|
||||||
#include "4ed_allocator_models.cpp"
|
#include "4ed_allocator_models.cpp"
|
||||||
#include "4ed_log.cpp"
|
#include "4ed_log.cpp"
|
||||||
#include "4coder_log.cpp"
|
#include "4coder_log.cpp"
|
||||||
|
|
|
@ -98,13 +98,13 @@ child_process_lookup_return_code(Child_Process_Container *container, Child_Proce
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
|
||||||
internal b32
|
internal b32
|
||||||
child_process_call(Models *models, System_Functions *system, String_Const_u8 path, String_Const_u8 command, Child_Process_ID *id_out){
|
child_process_call(Models *models, String_Const_u8 path, String_Const_u8 command, Child_Process_ID *id_out){
|
||||||
b32 result = false;
|
b32 result = false;
|
||||||
Scratch_Block scratch(&models->app_links);
|
Scratch_Block scratch(&models->app_links);
|
||||||
String_Const_u8 path_n = push_string_copy(scratch, path);
|
String_Const_u8 path_n = push_string_copy(scratch, path);
|
||||||
String_Const_u8 command_n = push_string_copy(scratch, command);
|
String_Const_u8 command_n = push_string_copy(scratch, command);
|
||||||
CLI_Handles cli_handles = {};
|
CLI_Handles cli_handles = {};
|
||||||
if (system->cli_call(scratch, (char*)path_n.str, (char*)command_n.str, &cli_handles)){
|
if (system_cli_call(scratch, (char*)path_n.str, (char*)command_n.str, &cli_handles)){
|
||||||
Child_Process_And_ID new_process = child_process_alloc_new(models, &models->child_processes);
|
Child_Process_And_ID new_process = child_process_alloc_new(models, &models->child_processes);
|
||||||
*id_out = new_process.id;
|
*id_out = new_process.id;
|
||||||
new_process.process->cli = cli_handles;
|
new_process.process->cli = cli_handles;
|
||||||
|
|
|
@ -15,15 +15,13 @@ coroutine__pass_control(Coroutine *me, Coroutine *other,
|
||||||
Assert(me->state == CoroutineState_Active);
|
Assert(me->state == CoroutineState_Active);
|
||||||
Assert(me->sys == other->sys);
|
Assert(me->sys == other->sys);
|
||||||
|
|
||||||
System_Functions *system = me->system;
|
|
||||||
|
|
||||||
me->state = my_new_state;
|
me->state = my_new_state;
|
||||||
other->state = CoroutineState_Active;
|
other->state = CoroutineState_Active;
|
||||||
me->sys->active = other;
|
me->sys->active = other;
|
||||||
system->condition_variable_signal(other->cv);
|
system_condition_variable_signal(other->cv);
|
||||||
if (control == CoroutinePassControl_BlockMe){
|
if (control == CoroutinePassControl_BlockMe){
|
||||||
for (;me->state != CoroutineState_Active;){
|
for (;me->state != CoroutineState_Active;){
|
||||||
system->condition_variable_wait(me->cv, me->sys->lock);
|
system_condition_variable_wait(me->cv, me->sys->lock);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -31,18 +29,17 @@ coroutine__pass_control(Coroutine *me, Coroutine *other,
|
||||||
internal void
|
internal void
|
||||||
coroutine_main(void *ptr){
|
coroutine_main(void *ptr){
|
||||||
Coroutine *me = (Coroutine*)ptr;
|
Coroutine *me = (Coroutine*)ptr;
|
||||||
System_Functions *system = me->system;
|
|
||||||
|
|
||||||
// NOTE(allen): Init handshake
|
// NOTE(allen): Init handshake
|
||||||
Assert(me->state == CoroutineState_Dead);
|
Assert(me->state == CoroutineState_Dead);
|
||||||
system->mutex_acquire(me->sys->lock);
|
system_mutex_acquire(me->sys->lock);
|
||||||
me->sys->did_init = true;
|
me->sys->did_init = true;
|
||||||
system->condition_variable_signal(me->sys->init_cv);
|
system_condition_variable_signal(me->sys->init_cv);
|
||||||
|
|
||||||
for (;;){
|
for (;;){
|
||||||
// NOTE(allen): Wait until someone wakes us up, then go into our procedure.
|
// NOTE(allen): Wait until someone wakes us up, then go into our procedure.
|
||||||
for (;me->state != CoroutineState_Active;){
|
for (;me->state != CoroutineState_Active;){
|
||||||
system->condition_variable_wait(me->cv, me->sys->lock);
|
system_condition_variable_wait(me->cv, me->sys->lock);
|
||||||
}
|
}
|
||||||
Assert(me->type != CoroutineType_Root);
|
Assert(me->type != CoroutineType_Root);
|
||||||
Assert(me->yield_ctx != 0);
|
Assert(me->yield_ctx != 0);
|
||||||
|
@ -62,41 +59,37 @@ coroutine_main(void *ptr){
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
coroutine_sub_init(Coroutine *co, Coroutine_Group *sys){
|
coroutine_sub_init(Coroutine *co, Coroutine_Group *sys){
|
||||||
System_Functions *system = sys->system;
|
|
||||||
block_zero_struct(co);
|
block_zero_struct(co);
|
||||||
co->system = system;
|
|
||||||
co->sys = sys;
|
co->sys = sys;
|
||||||
co->state = CoroutineState_Dead;
|
co->state = CoroutineState_Dead;
|
||||||
co->type = CoroutineType_Sub;
|
co->type = CoroutineType_Sub;
|
||||||
co->cv = system->condition_variable_make();
|
co->cv = system_condition_variable_make();
|
||||||
sys->did_init = false;
|
sys->did_init = false;
|
||||||
co->thread = system->thread_launch(coroutine_main, co);
|
co->thread = system_thread_launch(coroutine_main, co);
|
||||||
for (;!sys->did_init;){
|
for (;!sys->did_init;){
|
||||||
system->condition_variable_wait(sys->init_cv, sys->lock);
|
system_condition_variable_wait(sys->init_cv, sys->lock);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
coroutine_system_init(System_Functions *system, Coroutine_Group *sys){
|
coroutine_system_init(Coroutine_Group *sys){
|
||||||
sys->arena = make_arena_system(system);
|
sys->arena = make_arena_system();
|
||||||
sys->system = system;
|
|
||||||
|
|
||||||
Coroutine *root = &sys->root;
|
Coroutine *root = &sys->root;
|
||||||
|
|
||||||
sys->lock = system->mutex_make();
|
sys->lock = system_mutex_make();
|
||||||
sys->init_cv = system->condition_variable_make();
|
sys->init_cv = system_condition_variable_make();
|
||||||
sys->active = root;
|
sys->active = root;
|
||||||
|
|
||||||
block_zero_struct(root);
|
block_zero_struct(root);
|
||||||
root->system = system;
|
|
||||||
root->sys = sys;
|
root->sys = sys;
|
||||||
root->state = CoroutineState_Active;
|
root->state = CoroutineState_Active;
|
||||||
root->type = CoroutineType_Root;
|
root->type = CoroutineType_Root;
|
||||||
root->cv = system->condition_variable_make();
|
root->cv = system_condition_variable_make();
|
||||||
|
|
||||||
sys->unused = 0;
|
sys->unused = 0;
|
||||||
|
|
||||||
system->mutex_acquire(sys->lock);
|
system_mutex_acquire(sys->lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal Coroutine*
|
internal Coroutine*
|
||||||
|
|
|
@ -33,7 +33,6 @@ struct Coroutine{
|
||||||
Coroutine *next;
|
Coroutine *next;
|
||||||
void *in;
|
void *in;
|
||||||
void *out;
|
void *out;
|
||||||
System_Functions *system;
|
|
||||||
System_Thread thread;
|
System_Thread thread;
|
||||||
System_Condition_Variable cv;
|
System_Condition_Variable cv;
|
||||||
struct Coroutine_Group *sys;
|
struct Coroutine_Group *sys;
|
||||||
|
@ -45,7 +44,6 @@ struct Coroutine{
|
||||||
|
|
||||||
struct Coroutine_Group{
|
struct Coroutine_Group{
|
||||||
Arena arena;
|
Arena arena;
|
||||||
System_Functions *system;
|
|
||||||
System_Mutex lock;
|
System_Mutex lock;
|
||||||
System_Condition_Variable init_cv;
|
System_Condition_Variable init_cv;
|
||||||
b32 did_init;
|
b32 did_init;
|
||||||
|
|
37
4ed_edit.cpp
37
4ed_edit.cpp
|
@ -11,7 +11,6 @@
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
edit_pre_state_change(Models *models, Editing_File *file){
|
edit_pre_state_change(Models *models, Editing_File *file){
|
||||||
System_Functions *system = models->system;
|
|
||||||
file_add_dirty_flag(file, DirtyState_UnsavedChanges);
|
file_add_dirty_flag(file, DirtyState_UnsavedChanges);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -242,7 +241,7 @@ file_end_file(Models *models, Editing_File *file){
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
edit__apply_record_forward(System_Functions *system, Models *models, Editing_File *file, Record *record, Edit_Behaviors behaviors_prototype){
|
edit__apply_record_forward(Models *models, Editing_File *file, Record *record, Edit_Behaviors behaviors_prototype){
|
||||||
// NOTE(allen): // NOTE(allen): // NOTE(allen): // NOTE(allen): // NOTE(allen):
|
// NOTE(allen): // NOTE(allen): // NOTE(allen): // NOTE(allen): // NOTE(allen):
|
||||||
// Whenever you change this also change the backward version!
|
// Whenever you change this also change the backward version!
|
||||||
|
|
||||||
|
@ -261,7 +260,7 @@ edit__apply_record_forward(System_Functions *system, Models *models, Editing_Fil
|
||||||
node != sentinel;
|
node != sentinel;
|
||||||
node = node->next){
|
node = node->next){
|
||||||
Record *sub_record = CastFromMember(Record, node, node);
|
Record *sub_record = CastFromMember(Record, node, node);
|
||||||
edit__apply_record_forward(system, models, file, sub_record, behaviors_prototype);
|
edit__apply_record_forward(models, file, sub_record, behaviors_prototype);
|
||||||
}
|
}
|
||||||
}break;
|
}break;
|
||||||
|
|
||||||
|
@ -273,7 +272,7 @@ edit__apply_record_forward(System_Functions *system, Models *models, Editing_Fil
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
edit__apply_record_backward(System_Functions *system, Models *models, Editing_File *file, Record *record, Edit_Behaviors behaviors_prototype){
|
edit__apply_record_backward(Models *models, Editing_File *file, Record *record, Edit_Behaviors behaviors_prototype){
|
||||||
// NOTE(allen): // NOTE(allen): // NOTE(allen): // NOTE(allen): // NOTE(allen):
|
// NOTE(allen): // NOTE(allen): // NOTE(allen): // NOTE(allen): // NOTE(allen):
|
||||||
// Whenever you change this also change the forward version!
|
// Whenever you change this also change the forward version!
|
||||||
|
|
||||||
|
@ -292,7 +291,7 @@ edit__apply_record_backward(System_Functions *system, Models *models, Editing_Fi
|
||||||
node != sentinel;
|
node != sentinel;
|
||||||
node = node->prev){
|
node = node->prev){
|
||||||
Record *sub_record = CastFromMember(Record, node, node);
|
Record *sub_record = CastFromMember(Record, node, node);
|
||||||
edit__apply_record_backward(system, models, file, sub_record, behaviors_prototype);
|
edit__apply_record_backward(models, file, sub_record, behaviors_prototype);
|
||||||
}
|
}
|
||||||
}break;
|
}break;
|
||||||
|
|
||||||
|
@ -304,7 +303,7 @@ edit__apply_record_backward(System_Functions *system, Models *models, Editing_Fi
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
edit_change_current_history_state(System_Functions *system, Models *models, Editing_File *file, i32 target_index){
|
edit_change_current_history_state(Models *models, Editing_File *file, i32 target_index){
|
||||||
History *history = &file->state.history;
|
History *history = &file->state.history;
|
||||||
if (history->activated && file->state.current_record_index != target_index){
|
if (history->activated && file->state.current_record_index != target_index){
|
||||||
Assert(0 <= target_index && target_index <= history->record_count);
|
Assert(0 <= target_index && target_index <= history->record_count);
|
||||||
|
@ -322,13 +321,13 @@ edit_change_current_history_state(System_Functions *system, Models *models, Edit
|
||||||
current += 1;
|
current += 1;
|
||||||
record = CastFromMember(Record, node, record->node.next);
|
record = CastFromMember(Record, node, record->node.next);
|
||||||
Assert(record != dummy_record);
|
Assert(record != dummy_record);
|
||||||
edit__apply_record_forward(system, models, file, record, behaviors_prototype);
|
edit__apply_record_forward(models, file, record, behaviors_prototype);
|
||||||
} while (current != target_index);
|
} while (current != target_index);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
do{
|
do{
|
||||||
Assert(record != dummy_record);
|
Assert(record != dummy_record);
|
||||||
edit__apply_record_backward(system, models, file, record, behaviors_prototype);
|
edit__apply_record_backward(models, file, record, behaviors_prototype);
|
||||||
current -= 1;
|
current -= 1;
|
||||||
record = CastFromMember(Record, node, record->node.prev);
|
record = CastFromMember(Record, node, record->node.prev);
|
||||||
} while (current != target_index);
|
} while (current != target_index);
|
||||||
|
@ -349,18 +348,17 @@ edit_merge_history_range(Models *models, Editing_File *file, History_Record_Inde
|
||||||
if (first_index < last_index){
|
if (first_index < last_index){
|
||||||
i32 current_index = file->state.current_record_index;
|
i32 current_index = file->state.current_record_index;
|
||||||
if (first_index <= current_index && current_index < last_index){
|
if (first_index <= current_index && current_index < last_index){
|
||||||
System_Functions *system = models->system;
|
|
||||||
u32 in_range_handler = (flags & bitmask_2);
|
u32 in_range_handler = (flags & bitmask_2);
|
||||||
switch (in_range_handler){
|
switch (in_range_handler){
|
||||||
case RecordMergeFlag_StateInRange_MoveStateForward:
|
case RecordMergeFlag_StateInRange_MoveStateForward:
|
||||||
{
|
{
|
||||||
edit_change_current_history_state(system, models, file, last_index);
|
edit_change_current_history_state(models, file, last_index);
|
||||||
current_index = last_index;
|
current_index = last_index;
|
||||||
}break;
|
}break;
|
||||||
|
|
||||||
case RecordMergeFlag_StateInRange_MoveStateBackward:
|
case RecordMergeFlag_StateInRange_MoveStateBackward:
|
||||||
{
|
{
|
||||||
edit_change_current_history_state(system, models, file, first_index);
|
edit_change_current_history_state(models, file, first_index);
|
||||||
current_index = first_index;
|
current_index = first_index;
|
||||||
}break;
|
}break;
|
||||||
|
|
||||||
|
@ -431,7 +429,6 @@ create_file(Models *models, String_Const_u8 file_name, Buffer_Create_Flag flags)
|
||||||
Editing_File *result = 0;
|
Editing_File *result = 0;
|
||||||
|
|
||||||
if (file_name.size > 0){
|
if (file_name.size > 0){
|
||||||
System_Functions *system = models->system;
|
|
||||||
Working_Set *working_set = &models->working_set;
|
Working_Set *working_set = &models->working_set;
|
||||||
Heap *heap = &models->heap;
|
Heap *heap = &models->heap;
|
||||||
|
|
||||||
|
@ -445,7 +442,7 @@ create_file(Models *models, String_Const_u8 file_name, Buffer_Create_Flag flags)
|
||||||
|
|
||||||
// NOTE(allen): Try to get the file by canon name.
|
// NOTE(allen): Try to get the file by canon name.
|
||||||
if (HasFlag(flags, BufferCreate_NeverAttachToFile) == 0){
|
if (HasFlag(flags, BufferCreate_NeverAttachToFile) == 0){
|
||||||
if (get_canon_name(system, scratch, file_name, &canon)){
|
if (get_canon_name(scratch, file_name, &canon)){
|
||||||
has_canon_name = true;
|
has_canon_name = true;
|
||||||
file = working_set_contains_canon(working_set, string_from_file_name(&canon));
|
file = working_set_contains_canon(working_set, string_from_file_name(&canon));
|
||||||
}
|
}
|
||||||
|
@ -471,7 +468,7 @@ create_file(Models *models, String_Const_u8 file_name, Buffer_Create_Flag flags)
|
||||||
do_empty_buffer = true;
|
do_empty_buffer = true;
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
if (!system->load_handle(scratch, (char*)canon.name_space, &handle)){
|
if (!system_load_handle(scratch, (char*)canon.name_space, &handle)){
|
||||||
do_empty_buffer = true;
|
do_empty_buffer = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -485,7 +482,7 @@ create_file(Models *models, String_Const_u8 file_name, Buffer_Create_Flag flags)
|
||||||
file = working_set_allocate_file(working_set, &models->lifetime_allocator);
|
file = working_set_allocate_file(working_set, &models->lifetime_allocator);
|
||||||
if (file != 0){
|
if (file != 0){
|
||||||
if (has_canon_name){
|
if (has_canon_name){
|
||||||
file_bind_file_name(system, working_set, file, string_from_file_name(&canon));
|
file_bind_file_name(working_set, file, string_from_file_name(&canon));
|
||||||
}
|
}
|
||||||
String_Const_u8 front = string_front_of_path(file_name);
|
String_Const_u8 front = string_front_of_path(file_name);
|
||||||
buffer_bind_name(models, scratch, working_set, file, front);
|
buffer_bind_name(models, scratch, working_set, file, front);
|
||||||
|
@ -496,7 +493,7 @@ create_file(Models *models, String_Const_u8 file_name, Buffer_Create_Flag flags)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
File_Attributes attributes = system->load_attributes(handle);
|
File_Attributes attributes = system_load_attributes(handle);
|
||||||
b32 in_heap_mem = false;
|
b32 in_heap_mem = false;
|
||||||
char *buffer = push_array(scratch, char, (i32)attributes.size);
|
char *buffer = push_array(scratch, char, (i32)attributes.size);
|
||||||
|
|
||||||
|
@ -506,11 +503,11 @@ create_file(Models *models, String_Const_u8 file_name, Buffer_Create_Flag flags)
|
||||||
in_heap_mem = true;
|
in_heap_mem = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (system->load_file(handle, buffer, (i32)attributes.size)){
|
if (system_load_file(handle, buffer, (i32)attributes.size)){
|
||||||
system->load_close(handle);
|
system_load_close(handle);
|
||||||
file = working_set_allocate_file(working_set, &models->lifetime_allocator);
|
file = working_set_allocate_file(working_set, &models->lifetime_allocator);
|
||||||
if (file != 0){
|
if (file != 0){
|
||||||
file_bind_file_name(system, working_set, file, string_from_file_name(&canon));
|
file_bind_file_name(working_set, file, string_from_file_name(&canon));
|
||||||
String_Const_u8 front = string_front_of_path(file_name);
|
String_Const_u8 front = string_front_of_path(file_name);
|
||||||
buffer_bind_name(models, scratch, working_set, file, front);
|
buffer_bind_name(models, scratch, working_set, file, front);
|
||||||
file_create_from_string(models, file, SCu8(buffer, (i32)attributes.size), attributes);
|
file_create_from_string(models, file, SCu8(buffer, (i32)attributes.size), attributes);
|
||||||
|
@ -518,7 +515,7 @@ create_file(Models *models, String_Const_u8 file_name, Buffer_Create_Flag flags)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
system->load_close(handle);
|
system_load_close(handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (in_heap_mem){
|
if (in_heap_mem){
|
||||||
|
|
15
4ed_file.cpp
15
4ed_file.cpp
|
@ -137,7 +137,7 @@ file_name_terminate(Editing_File_Name *name){
|
||||||
|
|
||||||
// TODO(allen): file_name should be String_Const_u8
|
// TODO(allen): file_name should be String_Const_u8
|
||||||
internal b32
|
internal b32
|
||||||
save_file_to_name(System_Functions *system, Models *models, Editing_File *file, u8 *file_name){
|
save_file_to_name(Models *models, Editing_File *file, u8 *file_name){
|
||||||
b32 result = false;
|
b32 result = false;
|
||||||
b32 using_actual_file_name = false;
|
b32 using_actual_file_name = false;
|
||||||
|
|
||||||
|
@ -159,7 +159,7 @@ save_file_to_name(System_Functions *system, Models *models, Editing_File *file,
|
||||||
|
|
||||||
if (!using_actual_file_name){
|
if (!using_actual_file_name){
|
||||||
String_Const_u8 s_file_name = SCu8(file_name);
|
String_Const_u8 s_file_name = SCu8(file_name);
|
||||||
String_Const_u8 canonical_file_name = system->get_canonical(scratch, s_file_name);
|
String_Const_u8 canonical_file_name = system_get_canonical(scratch, s_file_name);
|
||||||
if (string_match(canonical_file_name, string_from_file_name(&file->canon))){
|
if (string_match(canonical_file_name, string_from_file_name(&file->canon))){
|
||||||
using_actual_file_name = true;
|
using_actual_file_name = true;
|
||||||
}
|
}
|
||||||
|
@ -167,14 +167,14 @@ save_file_to_name(System_Functions *system, Models *models, Editing_File *file,
|
||||||
|
|
||||||
String_Const_u8 saveable_string = buffer_stringify(scratch, buffer, Ii64(0, buffer_size(buffer)));
|
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);
|
File_Attributes new_attributes = system_save_file(scratch, (char*)file_name, saveable_string);
|
||||||
if (new_attributes.last_write_time > 0){
|
if (new_attributes.last_write_time > 0){
|
||||||
if (using_actual_file_name){
|
if (using_actual_file_name){
|
||||||
file->state.ignore_behind_os = 1;
|
file->state.ignore_behind_os = 1;
|
||||||
}
|
}
|
||||||
file->attributes = new_attributes;
|
file->attributes = new_attributes;
|
||||||
}
|
}
|
||||||
LogEventF(log_string(M), scratch, file->id, 0, system->thread_get_id(),
|
LogEventF(log_string(M), scratch, file->id, 0, system_thread_get_id(),
|
||||||
"save file [last_write_time=0x%llx]", new_attributes.last_write_time);
|
"save file [last_write_time=0x%llx]", new_attributes.last_write_time);
|
||||||
|
|
||||||
file_clear_dirty_flags(file);
|
file_clear_dirty_flags(file);
|
||||||
|
@ -184,8 +184,8 @@ save_file_to_name(System_Functions *system, Models *models, Editing_File *file,
|
||||||
}
|
}
|
||||||
|
|
||||||
internal b32
|
internal b32
|
||||||
save_file(System_Functions *system, Models *models, Editing_File *file){
|
save_file(Models *models, Editing_File *file){
|
||||||
return(save_file_to_name(system, models, file, 0));
|
return(save_file_to_name(models, file, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
@ -210,7 +210,6 @@ file_compute_cursor(Editing_File *file, Buffer_Seek seek){
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
file_create_from_string(Models *models, Editing_File *file, String_Const_u8 val, File_Attributes attributes){
|
file_create_from_string(Models *models, Editing_File *file, String_Const_u8 val, File_Attributes attributes){
|
||||||
System_Functions *system = models->system;
|
|
||||||
Thread_Context *tctx = models->tctx;
|
Thread_Context *tctx = models->tctx;
|
||||||
Scratch_Block scratch(tctx, Scratch_Share);
|
Scratch_Block scratch(tctx, Scratch_Share);
|
||||||
|
|
||||||
|
@ -240,7 +239,7 @@ file_create_from_string(Models *models, Editing_File *file, String_Const_u8 val,
|
||||||
Temp_Memory temp = begin_temp(scratch);
|
Temp_Memory temp = begin_temp(scratch);
|
||||||
String_Const_u8 name = SCu8(file->unique_name.name_space, file->unique_name.name_size);
|
String_Const_u8 name = SCu8(file->unique_name.name_space, file->unique_name.name_size);
|
||||||
name = string_escape(scratch, name);
|
name = string_escape(scratch, name);
|
||||||
LogEventF(log_string(M), scratch, file->id, 0, system->thread_get_id(),
|
LogEventF(log_string(M), scratch, file->id, 0, system_thread_get_id(),
|
||||||
"init file [lwt=0x%llx] [name=\"%.*s\"]",
|
"init file [lwt=0x%llx] [name=\"%.*s\"]",
|
||||||
attributes.last_write_time, string_expand(name));
|
attributes.last_write_time, string_expand(name));
|
||||||
end_temp(temp);
|
end_temp(temp);
|
||||||
|
|
|
@ -164,7 +164,7 @@ internal Face*
|
||||||
ft__font_make_face(Arena *arena, Face_Description *description, f32 scale_factor){
|
ft__font_make_face(Arena *arena, Face_Description *description, f32 scale_factor){
|
||||||
String_Const_u8 file_name = {};
|
String_Const_u8 file_name = {};
|
||||||
if (description->font.in_4coder_font_folder){
|
if (description->font.in_4coder_font_folder){
|
||||||
String_Const_u8 binary_path = sysfunc.get_path(arena, SystemPath_Binary);
|
String_Const_u8 binary_path = system_get_path(arena, SystemPath_Binary);
|
||||||
binary_path = string_mod_replace_character(binary_path, '\\', '/');
|
binary_path = string_mod_replace_character(binary_path, '\\', '/');
|
||||||
file_name = push_u8_stringf(arena, "%.*sfonts/%.*s", string_expand(binary_path),
|
file_name = push_u8_stringf(arena, "%.*sfonts/%.*s", string_expand(binary_path),
|
||||||
string_expand(description->font.file_name));
|
string_expand(description->font.file_name));
|
||||||
|
@ -296,7 +296,7 @@ ft__font_make_face(Arena *arena, Face_Description *description, f32 scale_factor
|
||||||
ft__bad_rect_store_finish(&pack);
|
ft__bad_rect_store_finish(&pack);
|
||||||
|
|
||||||
Texture_Kind texture_kind = TextureKind_Mono;
|
Texture_Kind texture_kind = TextureKind_Mono;
|
||||||
u32 texture = sysfunc.get_texture(pack.dim, texture_kind);
|
u32 texture = graphics_get_texture(pack.dim, texture_kind);
|
||||||
face->texture_kind = texture_kind;
|
face->texture_kind = texture_kind;
|
||||||
face->texture = texture;
|
face->texture = texture;
|
||||||
|
|
||||||
|
@ -306,7 +306,7 @@ ft__font_make_face(Arena *arena, Face_Description *description, f32 scale_factor
|
||||||
{
|
{
|
||||||
Vec3_i32 p = V3i32((i32)face->white.uv.x0, (i32)face->white.uv.y0, (i32)face->white.w);
|
Vec3_i32 p = V3i32((i32)face->white.uv.x0, (i32)face->white.uv.y0, (i32)face->white.w);
|
||||||
Vec3_i32 dim = V3i32(white.dim.x, white.dim.y, 1);
|
Vec3_i32 dim = V3i32(white.dim.x, white.dim.y, 1);
|
||||||
sysfunc.fill_texture(texture_kind, texture, p, dim, white.data);
|
graphics_fill_texture(texture_kind, texture, p, dim, white.data);
|
||||||
face->white.uv.x1 = (face->white.uv.x0 + face->white.uv.x1)/texture_dim.x;
|
face->white.uv.x1 = (face->white.uv.x0 + face->white.uv.x1)/texture_dim.x;
|
||||||
face->white.uv.y1 = (face->white.uv.y0 + face->white.uv.y1)/texture_dim.y;
|
face->white.uv.y1 = (face->white.uv.y0 + face->white.uv.y1)/texture_dim.y;
|
||||||
face->white.uv.x0 = face->white.uv.x0/texture_dim.x;
|
face->white.uv.x0 = face->white.uv.x0/texture_dim.x;
|
||||||
|
@ -317,7 +317,7 @@ ft__font_make_face(Arena *arena, Face_Description *description, f32 scale_factor
|
||||||
for (u16 i = 0; i < index_count; i += 1){
|
for (u16 i = 0; i < index_count; i += 1){
|
||||||
Vec3_i32 p = V3i32((i32)face->bounds[i].uv.x0, (i32)face->bounds[i].uv.y0, (i32)face->bounds[i].w);
|
Vec3_i32 p = V3i32((i32)face->bounds[i].uv.x0, (i32)face->bounds[i].uv.y0, (i32)face->bounds[i].w);
|
||||||
Vec3_i32 dim = V3i32(glyph_bitmaps[i].dim.x, glyph_bitmaps[i].dim.y, 1);
|
Vec3_i32 dim = V3i32(glyph_bitmaps[i].dim.x, glyph_bitmaps[i].dim.y, 1);
|
||||||
sysfunc.fill_texture(texture_kind, texture, p, dim, glyph_bitmaps[i].data);
|
graphics_fill_texture(texture_kind, texture, p, dim, glyph_bitmaps[i].data);
|
||||||
face->bounds[i].uv.x1 = (face->bounds[i].uv.x0 + face->bounds[i].uv.x1)/texture_dim.x;
|
face->bounds[i].uv.x1 = (face->bounds[i].uv.x0 + face->bounds[i].uv.x1)/texture_dim.x;
|
||||||
face->bounds[i].uv.y1 = (face->bounds[i].uv.y0 + face->bounds[i].uv.y1)/texture_dim.y;
|
face->bounds[i].uv.y1 = (face->bounds[i].uv.y0 + face->bounds[i].uv.y1)/texture_dim.y;
|
||||||
face->bounds[i].uv.x0 = face->bounds[i].uv.x0/texture_dim.x;
|
face->bounds[i].uv.x0 = face->bounds[i].uv.x0/texture_dim.x;
|
||||||
|
|
|
@ -67,19 +67,18 @@ font_set__free_face_slot(Font_Set *set, Font_Face_Slot *slot){
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
font_set_init(System_Functions *system, Font_Set *set){
|
font_set_init(Font_Set *set){
|
||||||
block_zero_struct(set);
|
block_zero_struct(set);
|
||||||
set->system = system;
|
set->arena = make_arena_system();
|
||||||
set->arena = make_arena_system(system);
|
|
||||||
set->next_id_counter = 1;
|
set->next_id_counter = 1;
|
||||||
set->id_to_slot_table = make_table_u64_u64(set->arena.base_allocator, 40);
|
set->id_to_slot_table = make_table_u64_u64(set->arena.base_allocator, 40);
|
||||||
set->scale_factor = system->get_screen_scale_factor();
|
set->scale_factor = system_get_screen_scale_factor();
|
||||||
}
|
}
|
||||||
|
|
||||||
internal Face*
|
internal Face*
|
||||||
font_set_new_face(Font_Set *set, Face_Description *description){
|
font_set_new_face(Font_Set *set, Face_Description *description){
|
||||||
Arena arena = make_arena_system(set->system);
|
Arena arena = make_arena_system();
|
||||||
Face *face = set->system->font_make_face(&arena, description, set->scale_factor);
|
Face *face = font_make_face(&arena, description, set->scale_factor);
|
||||||
if (face != 0){
|
if (face != 0){
|
||||||
Font_Face_Slot *slot = font_set__alloc_face_slot(set);
|
Font_Face_Slot *slot = font_set__alloc_face_slot(set);
|
||||||
slot->arena = arena;
|
slot->arena = arena;
|
||||||
|
@ -150,8 +149,8 @@ font_set_modify_face(Font_Set *set, Face_ID id, Face_Description *description){
|
||||||
Font_Face_Slot *slot = font_set__get_face_slot(set, id);
|
Font_Face_Slot *slot = font_set__get_face_slot(set, id);
|
||||||
if (slot != 0){
|
if (slot != 0){
|
||||||
i32 version_number = slot->face->version_number;
|
i32 version_number = slot->face->version_number;
|
||||||
Arena arena = make_arena_system(set->system);
|
Arena arena = make_arena_system();
|
||||||
Face *face = set->system->font_make_face(&arena, description, set->scale_factor);
|
Face *face = font_make_face(&arena, description, set->scale_factor);
|
||||||
if (face != 0){
|
if (face != 0){
|
||||||
linalloc_clear(&slot->arena);
|
linalloc_clear(&slot->arena);
|
||||||
slot->arena = arena;
|
slot->arena = arena;
|
||||||
|
|
|
@ -28,7 +28,6 @@ union Font_Face_Slot{
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Font_Set{
|
struct Font_Set{
|
||||||
struct System_Functions *system;
|
|
||||||
Arena arena;
|
Arena arena;
|
||||||
Face_ID next_id_counter;
|
Face_ID next_id_counter;
|
||||||
Font_Face_ID_Node *free_ids;
|
Font_Face_ID_Node *free_ids;
|
||||||
|
|
|
@ -53,30 +53,30 @@ hot_directory_fixup(Hot_Directory *hot_directory){
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
hot_directory_set(System_Functions *system, Hot_Directory *hot_directory, String_Const_u8 str){
|
hot_directory_set(Hot_Directory *hot_directory, String_Const_u8 str){
|
||||||
linalloc_clear(&hot_directory->arena);
|
linalloc_clear(&hot_directory->arena);
|
||||||
hot_directory->string = push_string_copy(&hot_directory->arena, str);
|
hot_directory->string = push_string_copy(&hot_directory->arena, str);
|
||||||
hot_directory->canonical = system->get_canonical(&hot_directory->arena, str);
|
hot_directory->canonical = system_get_canonical(&hot_directory->arena, str);
|
||||||
hot_directory->file_list = system->get_file_list(&hot_directory->arena, hot_directory->canonical);
|
hot_directory->file_list = system_get_file_list(&hot_directory->arena, hot_directory->canonical);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
hot_directory_reload(System_Functions *system, Arena *scratch, Hot_Directory *hot_directory){
|
hot_directory_reload(Arena *scratch, Hot_Directory *hot_directory){
|
||||||
Temp_Memory temp = begin_temp(scratch);
|
Temp_Memory temp = begin_temp(scratch);
|
||||||
String_Const_u8 string = push_string_copy(scratch, hot_directory->string);
|
String_Const_u8 string = push_string_copy(scratch, hot_directory->string);
|
||||||
hot_directory_set(system, hot_directory, string);
|
hot_directory_set(hot_directory, string);
|
||||||
end_temp(temp);
|
end_temp(temp);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
hot_directory_init(System_Functions *system, Arena *scratch, Hot_Directory *hot_directory, String_Const_u8 directory){
|
hot_directory_init(Arena *scratch, Hot_Directory *hot_directory, String_Const_u8 directory){
|
||||||
hot_directory->arena = make_arena_system(system);
|
hot_directory->arena = make_arena_system();
|
||||||
Temp_Memory temp = begin_temp(scratch);
|
Temp_Memory temp = begin_temp(scratch);
|
||||||
String_Const_u8 dir = directory;
|
String_Const_u8 dir = directory;
|
||||||
if (!character_is_slash(string_get_character(directory, directory.size - 1))){
|
if (!character_is_slash(string_get_character(directory, directory.size - 1))){
|
||||||
dir = push_u8_stringf(scratch, "%.*s/", string_expand(directory));
|
dir = push_u8_stringf(scratch, "%.*s/", string_expand(directory));
|
||||||
}
|
}
|
||||||
hot_directory_set(system, hot_directory, dir);
|
hot_directory_set(hot_directory, dir);
|
||||||
end_temp(temp);
|
end_temp(temp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
21
4ed_log.cpp
21
4ed_log.cpp
|
@ -12,22 +12,19 @@
|
||||||
global Log global_log = {};
|
global Log global_log = {};
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
log_init(System_Functions *system){
|
log_init(void){
|
||||||
global_log.mutex = system->mutex_make();
|
global_log.mutex = system_mutex_make();
|
||||||
global_log.mutex_acquire = system->mutex_acquire;
|
global_log.arena = make_arena_system();
|
||||||
global_log.mutex_release = system->mutex_release;
|
|
||||||
global_log.thread_get_id = system->thread_get_id;
|
|
||||||
global_log.arena = make_arena_system(system);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
internal b32
|
internal b32
|
||||||
log_string(String_Const_u8 str){
|
log_string(String_Const_u8 str){
|
||||||
b32 result = false;
|
b32 result = false;
|
||||||
i32 thread_id = global_log.thread_get_id();
|
i32 thread_id = system_thread_get_id();
|
||||||
if (global_log.disabled_thread_id != thread_id){
|
if (global_log.disabled_thread_id != thread_id){
|
||||||
global_log.mutex_acquire(global_log.mutex);
|
system_mutex_acquire(global_log.mutex);
|
||||||
string_list_push(&global_log.arena, &global_log.list, push_string_copy(&global_log.arena, str));
|
string_list_push(&global_log.arena, &global_log.list, push_string_copy(&global_log.arena, str));
|
||||||
global_log.mutex_release(global_log.mutex);
|
system_mutex_release(global_log.mutex);
|
||||||
result = true;
|
result = true;
|
||||||
}
|
}
|
||||||
return(result);
|
return(result);
|
||||||
|
@ -40,8 +37,8 @@ internal b32
|
||||||
log_flush(Models *models){
|
log_flush(Models *models){
|
||||||
b32 result = false;
|
b32 result = false;
|
||||||
|
|
||||||
global_log.mutex_acquire(global_log.mutex);
|
system_mutex_acquire(global_log.mutex);
|
||||||
global_log.disabled_thread_id = global_log.thread_get_id();
|
global_log.disabled_thread_id = system_thread_get_id();
|
||||||
|
|
||||||
if (global_log.list.total_size > 0){
|
if (global_log.list.total_size > 0){
|
||||||
String_Const_u8 text = string_list_flatten(&global_log.arena, global_log.list);
|
String_Const_u8 text = string_list_flatten(&global_log.arena, global_log.list);
|
||||||
|
@ -52,7 +49,7 @@ log_flush(Models *models){
|
||||||
block_zero_struct(&global_log.list);
|
block_zero_struct(&global_log.list);
|
||||||
|
|
||||||
global_log.disabled_thread_id = 0;
|
global_log.disabled_thread_id = 0;
|
||||||
global_log.mutex_release(global_log.mutex);
|
system_mutex_release(global_log.mutex);
|
||||||
|
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,9 +17,6 @@ struct Log{
|
||||||
Arena arena;
|
Arena arena;
|
||||||
List_String_Const_u8 list;
|
List_String_Const_u8 list;
|
||||||
volatile i32 disabled_thread_id;
|
volatile i32 disabled_thread_id;
|
||||||
System_Mutex_Acquire *mutex_acquire;
|
|
||||||
System_Mutex_Release *mutex_release;
|
|
||||||
System_Thread_Get_ID *thread_get_id;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -143,8 +143,7 @@ begin_frame(Render_Target *target, void *font_set){
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
begin_render_section(Render_Target *target, System_Functions *system,
|
begin_render_section(Render_Target *target, i32 frame_index, f32 literal_dt, f32 animation_dt){
|
||||||
i32 frame_index, f32 literal_dt, f32 animation_dt){
|
|
||||||
target->clip_top = -1;
|
target->clip_top = -1;
|
||||||
|
|
||||||
i32_Rect clip;
|
i32_Rect clip;
|
||||||
|
@ -160,7 +159,7 @@ begin_render_section(Render_Target *target, System_Functions *system,
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
end_render_section(Render_Target *target, System_Functions *system){
|
end_render_section(Render_Target *target){
|
||||||
Assert(target->clip_top == 0);
|
Assert(target->clip_top == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,12 +21,12 @@ search_list_add_path(Arena *arena, Path_Search_List *list, String_Const_u8 path)
|
||||||
}
|
}
|
||||||
|
|
||||||
function void
|
function void
|
||||||
search_list_add_system_path(System_Functions *system, Arena *arena, Path_Search_List *list, System_Path_Code path){
|
search_list_add_system_path(Arena *arena, Path_Search_List *list, System_Path_Code path){
|
||||||
search_list_add_path__inner(arena, list, system->get_path(arena, path));
|
search_list_add_path__inner(arena, list, system_get_path(arena, path));
|
||||||
}
|
}
|
||||||
|
|
||||||
function String_Const_u8
|
function String_Const_u8
|
||||||
get_full_path(System_Functions *system, Arena *arena, Path_Search_List *search_list, String_Const_u8 relative){
|
get_full_path(Arena *arena, Path_Search_List *search_list, String_Const_u8 relative){
|
||||||
String_Const_u8 result = {};
|
String_Const_u8 result = {};
|
||||||
Temp_Memory restore_point = begin_temp(arena);
|
Temp_Memory restore_point = begin_temp(arena);
|
||||||
umem buffer_cap = search_list->max_member_length + relative.size + 1;
|
umem buffer_cap = search_list->max_member_length + relative.size + 1;
|
||||||
|
@ -42,7 +42,7 @@ get_full_path(System_Functions *system, Arena *arena, Path_Search_List *search_l
|
||||||
u8 *path_base = relative_base - node_size;
|
u8 *path_base = relative_base - node_size;
|
||||||
block_copy(path_base, node->string.str, node_size);
|
block_copy(path_base, node->string.str, node_size);
|
||||||
String_Const_u8 name = SCu8(path_base, opl);
|
String_Const_u8 name = SCu8(path_base, opl);
|
||||||
File_Attributes attribs = system->quick_file_attributes(arena, name);
|
File_Attributes attribs = system_quick_file_attributes(arena, name);
|
||||||
if (attribs.size > 0){
|
if (attribs.size > 0){
|
||||||
result = name;
|
result = name;
|
||||||
break;
|
break;
|
||||||
|
|
259
4ed_system.h
259
4ed_system.h
|
@ -1,259 +0,0 @@
|
||||||
/*
|
|
||||||
* Mr. 4th Dimention - Allen Webster
|
|
||||||
*
|
|
||||||
* 21.01.2014
|
|
||||||
*
|
|
||||||
* System functions for project codename "4ed"
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
// TOP
|
|
||||||
|
|
||||||
// TODO(allen): rewrite using new arenas and strings!!!!! rewrite rewrite rewrite rewrite rewrite
|
|
||||||
|
|
||||||
#if !defined(FCODER_SYSTEM_INTERFACE_H)
|
|
||||||
#define FCODER_SYSTEM_INTERFACE_H
|
|
||||||
|
|
||||||
// types
|
|
||||||
struct Plat_Handle{
|
|
||||||
u32 d[4];
|
|
||||||
};
|
|
||||||
typedef Plat_Handle System_Library;
|
|
||||||
typedef Plat_Handle System_Thread;
|
|
||||||
typedef Plat_Handle System_Mutex;
|
|
||||||
typedef Plat_Handle System_Condition_Variable;
|
|
||||||
typedef void Thread_Function(void *ptr);
|
|
||||||
struct CLI_Handles{
|
|
||||||
Plat_Handle proc;
|
|
||||||
Plat_Handle out_read;
|
|
||||||
Plat_Handle out_write;
|
|
||||||
Plat_Handle in_read;
|
|
||||||
Plat_Handle in_write;
|
|
||||||
u32 scratch_space[4];
|
|
||||||
i32 exit;
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef i32 System_Path_Code;
|
|
||||||
enum{
|
|
||||||
SystemPath_CurrentDirectory,
|
|
||||||
SystemPath_Binary,
|
|
||||||
};
|
|
||||||
|
|
||||||
// files
|
|
||||||
#define Sys_Get_Canonical_Sig(n) String_Const_u8 n(Arena *arena, String_Const_u8 name)
|
|
||||||
typedef Sys_Get_Canonical_Sig(System_Get_Canonical);
|
|
||||||
|
|
||||||
#define Sys_Get_File_List_Sig(name) File_List name(Arena *arena, String_Const_u8 directory)
|
|
||||||
typedef Sys_Get_File_List_Sig(System_Get_File_List);
|
|
||||||
|
|
||||||
// file load/save
|
|
||||||
#define Sys_Quick_File_Attributes_Sig(name) File_Attributes name(Arena *scratch, String_Const_u8 file_name)
|
|
||||||
typedef Sys_Quick_File_Attributes_Sig(System_Quick_File_Attributes);
|
|
||||||
|
|
||||||
#define Sys_Load_Handle_Sig(name) b32 name(Arena *scratch, char *filename, Plat_Handle *handle_out)
|
|
||||||
typedef Sys_Load_Handle_Sig(System_Load_Handle);
|
|
||||||
|
|
||||||
#define Sys_Load_Attributes_Sig(name) File_Attributes name(Plat_Handle handle)
|
|
||||||
typedef Sys_Load_Attributes_Sig(System_Load_Attributes);
|
|
||||||
|
|
||||||
#define Sys_Load_File_Sig(name) b32 name(Plat_Handle handle, char *buffer, u32 size)
|
|
||||||
typedef Sys_Load_File_Sig(System_Load_File);
|
|
||||||
|
|
||||||
#define Sys_Load_Close_Sig(name) b32 name(Plat_Handle handle)
|
|
||||||
typedef Sys_Load_Close_Sig(System_Load_Close);
|
|
||||||
|
|
||||||
#define Sys_Save_File_Sig(name) \
|
|
||||||
File_Attributes name(Arena *scratch, char *filename, String_Const_u8 data)
|
|
||||||
typedef Sys_Save_File_Sig(System_Save_File);
|
|
||||||
|
|
||||||
// library
|
|
||||||
#define Sys_Load_Library_Sig(name) \
|
|
||||||
b32 name(Arena *scratch, String_Const_u8 file_name, System_Library *out)
|
|
||||||
typedef Sys_Load_Library_Sig(System_Load_Library);
|
|
||||||
|
|
||||||
#define Sys_Release_Library_Sig(name) b32 name(System_Library handle)
|
|
||||||
typedef Sys_Release_Library_Sig(System_Release_Library);
|
|
||||||
|
|
||||||
#define Sys_Get_Proc_Sig(name) Void_Func *name(System_Library handle, char *proc_name)
|
|
||||||
typedef Sys_Get_Proc_Sig(System_Get_Proc);
|
|
||||||
|
|
||||||
// time
|
|
||||||
#define Sys_Now_Time_Sig(name) u64 name()
|
|
||||||
typedef Sys_Now_Time_Sig(System_Now_Time);
|
|
||||||
|
|
||||||
#define Sys_Wake_Up_Timer_Create_Sig(name) Plat_Handle name()
|
|
||||||
typedef Sys_Wake_Up_Timer_Create_Sig(System_Wake_Up_Timer_Create);
|
|
||||||
|
|
||||||
#define Sys_Wake_Up_Timer_Release_Sig(name) void name(Plat_Handle handle)
|
|
||||||
typedef Sys_Wake_Up_Timer_Release_Sig(System_Wake_Up_Timer_Release);
|
|
||||||
|
|
||||||
#define Sys_Wake_Up_Timer_Set_Sig(name) void name(Plat_Handle handle, u32 time_milliseconds)
|
|
||||||
typedef Sys_Wake_Up_Timer_Set_Sig(System_Wake_Up_Timer_Set);
|
|
||||||
|
|
||||||
#define Sys_Wake_Up_Timer_Check_Sig(name) u64 name(Plat_Handle handle)
|
|
||||||
typedef Sys_Wake_Up_Timer_Check_Sig(System_Wake_Up_Timer_Check);
|
|
||||||
|
|
||||||
#define Sys_Signal_Step_Sig(name) void name(u32 code)
|
|
||||||
typedef Sys_Signal_Step_Sig(System_Signal_Step);
|
|
||||||
|
|
||||||
#define Sys_Sleep_Sig(name) void name(u64 microseconds)
|
|
||||||
typedef Sys_Sleep_Sig(System_Sleep);
|
|
||||||
|
|
||||||
// clipboard
|
|
||||||
#define Sys_Post_Clipboard_Sig(name) void name(String_Const_u8 str)
|
|
||||||
typedef Sys_Post_Clipboard_Sig(System_Post_Clipboard);
|
|
||||||
|
|
||||||
// cli
|
|
||||||
#define Sys_CLI_Call_Sig(n, scratch, path, script, cli_out) \
|
|
||||||
b32 n(Arena *scratch, char *path, char *script, CLI_Handles *cli_out)
|
|
||||||
typedef Sys_CLI_Call_Sig(System_CLI_Call, scratch, path, script, cli_out);
|
|
||||||
|
|
||||||
#define Sys_CLI_Begin_Update_Sig(name) void name(CLI_Handles *cli)
|
|
||||||
typedef Sys_CLI_Begin_Update_Sig(System_CLI_Begin_Update);
|
|
||||||
|
|
||||||
#define Sys_CLI_Update_Step_Sig(name) b32 name(CLI_Handles *cli, char *dest, u32 max, u32 *amount)
|
|
||||||
typedef Sys_CLI_Update_Step_Sig(System_CLI_Update_Step);
|
|
||||||
|
|
||||||
#define Sys_CLI_End_Update_Sig(name) b32 name(CLI_Handles *cli)
|
|
||||||
typedef Sys_CLI_End_Update_Sig(System_CLI_End_Update);
|
|
||||||
|
|
||||||
//
|
|
||||||
#define Sys_Open_Color_Picker_Sig(name) void name(Color_Picker *picker)
|
|
||||||
typedef Sys_Open_Color_Picker_Sig(System_Open_Color_Picker);
|
|
||||||
|
|
||||||
#define Sys_Get_Screen_Scale_Factor_Sig(name) f32 name(void)
|
|
||||||
typedef Sys_Get_Screen_Scale_Factor_Sig(System_Get_Screen_Scale_Factor);
|
|
||||||
|
|
||||||
// thread
|
|
||||||
#define Sys_Thread_Launch_Sig(name) \
|
|
||||||
System_Thread name(Thread_Function *proc, void *ptr)
|
|
||||||
typedef Sys_Thread_Launch_Sig(System_Thread_Launch);
|
|
||||||
|
|
||||||
#define Sys_Thread_Join_Sig(name) void name(System_Thread thread)
|
|
||||||
typedef Sys_Thread_Join_Sig(System_Thread_Join);
|
|
||||||
|
|
||||||
#define Sys_Thread_Free_Sig(name) void name(System_Thread thread)
|
|
||||||
typedef Sys_Thread_Free_Sig(System_Thread_Free);
|
|
||||||
|
|
||||||
#define Sys_Thread_Get_ID_Sig(name) i32 name(void)
|
|
||||||
typedef Sys_Thread_Get_ID_Sig(System_Thread_Get_ID);
|
|
||||||
|
|
||||||
#define Sys_Mutex_Make_Sig(name) System_Mutex name(void)
|
|
||||||
typedef Sys_Mutex_Make_Sig(System_Mutex_Make);
|
|
||||||
|
|
||||||
#define Sys_Mutex_Acquire_Sig(name) void name(System_Mutex mutex)
|
|
||||||
typedef Sys_Mutex_Acquire_Sig(System_Mutex_Acquire);
|
|
||||||
|
|
||||||
#define Sys_Mutex_Release_Sig(name) void name(System_Mutex mutex)
|
|
||||||
typedef Sys_Mutex_Release_Sig(System_Mutex_Release);
|
|
||||||
|
|
||||||
#define Sys_Mutex_Free_Sig(name) void name(System_Mutex mutex)
|
|
||||||
typedef Sys_Mutex_Free_Sig(System_Mutex_Free);
|
|
||||||
|
|
||||||
#define Sys_Condition_Variable_Make_Sig(name) System_Condition_Variable name(void)
|
|
||||||
typedef Sys_Condition_Variable_Make_Sig(System_Condition_Variable_Make);
|
|
||||||
|
|
||||||
#define Sys_Condition_Variable_Wait_Sig(name) void name(System_Condition_Variable cv, System_Mutex mutex)
|
|
||||||
typedef Sys_Condition_Variable_Wait_Sig(System_Condition_Variable_Wait);
|
|
||||||
|
|
||||||
#define Sys_Condition_Variable_Signal_Sig(name) void name(System_Condition_Variable cv)
|
|
||||||
typedef Sys_Condition_Variable_Signal_Sig(System_Condition_Variable_Signal);
|
|
||||||
|
|
||||||
#define Sys_Condition_Variable_Free_Sig(name) void name(System_Condition_Variable cv)
|
|
||||||
typedef Sys_Condition_Variable_Free_Sig(System_Condition_Variable_Free);
|
|
||||||
|
|
||||||
// memory
|
|
||||||
#define Sys_Memory_Allocate_Sig(name) void* name(umem size)
|
|
||||||
typedef Sys_Memory_Allocate_Sig(System_Memory_Allocate);
|
|
||||||
|
|
||||||
#define Sys_Memory_Set_Protection_Sig(name) b32 name(void *ptr, umem size, u32 flags)
|
|
||||||
typedef Sys_Memory_Set_Protection_Sig(System_Memory_Set_Protection);
|
|
||||||
|
|
||||||
#define Sys_Memory_Free_Sig(name) void name(void *ptr, umem size)
|
|
||||||
typedef Sys_Memory_Free_Sig(System_Memory_Free);
|
|
||||||
|
|
||||||
// file system
|
|
||||||
#define Sys_Get_Path_Sig(name) String_Const_u8 name(Arena *arena, System_Path_Code code)
|
|
||||||
typedef Sys_Get_Path_Sig(System_Get_Path);
|
|
||||||
|
|
||||||
// behavior and appearance options
|
|
||||||
#define Sys_Show_Mouse_Cursor_Sig(name) void name(i32 show)
|
|
||||||
typedef Sys_Show_Mouse_Cursor_Sig(System_Show_Mouse_Cursor);
|
|
||||||
|
|
||||||
#define Sys_Set_Fullscreen_Sig(name) b32 name(b32 full_screen)
|
|
||||||
typedef Sys_Set_Fullscreen_Sig(System_Set_Fullscreen);
|
|
||||||
|
|
||||||
#define Sys_Is_Fullscreen_Sig(name) b32 name()
|
|
||||||
typedef Sys_Is_Fullscreen_Sig(System_Is_Fullscreen);
|
|
||||||
|
|
||||||
struct System_Functions{
|
|
||||||
Font_Make_Face_Function *font_make_face;
|
|
||||||
Graphics_Get_Texture_Function *get_texture;
|
|
||||||
Graphics_Fill_Texture_Function *fill_texture;
|
|
||||||
|
|
||||||
// files
|
|
||||||
System_Get_Canonical *get_canonical;
|
|
||||||
System_Get_File_List *get_file_list;
|
|
||||||
System_Quick_File_Attributes *quick_file_attributes;
|
|
||||||
System_Load_Handle *load_handle;
|
|
||||||
System_Load_Attributes *load_attributes;
|
|
||||||
System_Load_File *load_file;
|
|
||||||
System_Load_Close *load_close;
|
|
||||||
System_Save_File *save_file;
|
|
||||||
|
|
||||||
// library
|
|
||||||
System_Load_Library *load_library;
|
|
||||||
System_Release_Library *release_library;
|
|
||||||
System_Get_Proc *get_proc;
|
|
||||||
|
|
||||||
// time
|
|
||||||
System_Now_Time *now_time;
|
|
||||||
System_Wake_Up_Timer_Create *wake_up_timer_create;
|
|
||||||
System_Wake_Up_Timer_Release *wake_up_timer_release;
|
|
||||||
System_Wake_Up_Timer_Set *wake_up_timer_set;
|
|
||||||
System_Signal_Step *signal_step;
|
|
||||||
System_Sleep *sleep;
|
|
||||||
|
|
||||||
// clipboard
|
|
||||||
System_Post_Clipboard *post_clipboard;
|
|
||||||
|
|
||||||
// cli
|
|
||||||
System_CLI_Call *cli_call;
|
|
||||||
System_CLI_Begin_Update *cli_begin_update;
|
|
||||||
System_CLI_Update_Step *cli_update_step;
|
|
||||||
System_CLI_End_Update *cli_end_update;
|
|
||||||
|
|
||||||
// TODO(allen):
|
|
||||||
System_Open_Color_Picker *open_color_picker;
|
|
||||||
System_Get_Screen_Scale_Factor *get_screen_scale_factor;
|
|
||||||
|
|
||||||
// threads
|
|
||||||
System_Thread_Launch *thread_launch;
|
|
||||||
System_Thread_Join *thread_join;
|
|
||||||
System_Thread_Free *thread_free;
|
|
||||||
System_Thread_Get_ID *thread_get_id;
|
|
||||||
System_Mutex_Make *mutex_make;
|
|
||||||
System_Mutex_Acquire *mutex_acquire;
|
|
||||||
System_Mutex_Release *mutex_release;
|
|
||||||
System_Mutex_Free *mutex_free;
|
|
||||||
System_Condition_Variable_Make *condition_variable_make;
|
|
||||||
System_Condition_Variable_Wait *condition_variable_wait;
|
|
||||||
System_Condition_Variable_Signal *condition_variable_signal;
|
|
||||||
System_Condition_Variable_Free *condition_variable_free;
|
|
||||||
|
|
||||||
// custom
|
|
||||||
System_Memory_Allocate *memory_allocate;
|
|
||||||
System_Memory_Set_Protection *memory_set_protection;
|
|
||||||
System_Memory_Free *memory_free;
|
|
||||||
|
|
||||||
System_Get_Path *get_path;
|
|
||||||
|
|
||||||
System_Show_Mouse_Cursor *show_mouse_cursor;
|
|
||||||
System_Set_Fullscreen *set_fullscreen;
|
|
||||||
System_Is_Fullscreen *is_fullscreen;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// BOTTOM
|
|
||||||
|
|
|
@ -6,12 +6,11 @@
|
||||||
|
|
||||||
internal void*
|
internal void*
|
||||||
base_reserve__system(void *user_data, umem size, umem *size_out){
|
base_reserve__system(void *user_data, umem size, umem *size_out){
|
||||||
System_Functions *system = (System_Functions*)user_data;
|
|
||||||
umem extra_size = 128;
|
umem extra_size = 128;
|
||||||
umem increased_size = size + extra_size;
|
umem increased_size = size + extra_size;
|
||||||
size = round_up_umem(increased_size, KB(4));
|
size = round_up_umem(increased_size, KB(4));
|
||||||
*size_out = size - extra_size;
|
*size_out = size - extra_size;
|
||||||
void *ptr = system->memory_allocate(size);
|
void *ptr = system_memory_allocate(size);
|
||||||
*(umem*)ptr = size;
|
*(umem*)ptr = size;
|
||||||
ptr = (u8*)ptr + extra_size;
|
ptr = (u8*)ptr + extra_size;
|
||||||
return(ptr);
|
return(ptr);
|
||||||
|
@ -19,42 +18,41 @@ base_reserve__system(void *user_data, umem size, umem *size_out){
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
base_free__system(void *user_data, void *ptr){
|
base_free__system(void *user_data, void *ptr){
|
||||||
System_Functions *system = (System_Functions*)user_data;
|
|
||||||
umem extra_size = 128;
|
umem extra_size = 128;
|
||||||
ptr = (u8*)ptr - extra_size;
|
ptr = (u8*)ptr - extra_size;
|
||||||
umem size = *(umem*)ptr;
|
umem size = *(umem*)ptr;
|
||||||
system->memory_free(ptr, size);
|
system_memory_free(ptr, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal Base_Allocator
|
internal Base_Allocator
|
||||||
make_base_allocator_system(System_Functions *system){
|
make_base_allocator_system(void){
|
||||||
return(make_base_allocator(base_reserve__system, 0, 0,
|
return(make_base_allocator(base_reserve__system, 0, 0,
|
||||||
base_free__system, 0, system));
|
base_free__system, 0, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
global Base_Allocator base_allocator_system = {};
|
global Base_Allocator base_allocator_system = {};
|
||||||
|
|
||||||
internal Base_Allocator*
|
internal Base_Allocator*
|
||||||
get_base_allocator_system(System_Functions *system){
|
get_base_allocator_system(void){
|
||||||
if (base_allocator_system.reserve == 0){
|
if (base_allocator_system.reserve == 0){
|
||||||
base_allocator_system = make_base_allocator_system(system);
|
base_allocator_system = make_base_allocator_system();
|
||||||
}
|
}
|
||||||
return(&base_allocator_system);
|
return(&base_allocator_system);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal Arena
|
internal Arena
|
||||||
make_arena_system(System_Functions *system, umem chunk_size, umem align){
|
make_arena_system(umem chunk_size, umem align){
|
||||||
return(make_arena(get_base_allocator_system(system), chunk_size, align));
|
return(make_arena(get_base_allocator_system(), chunk_size, align));
|
||||||
}
|
}
|
||||||
|
|
||||||
internal Arena
|
internal Arena
|
||||||
make_arena_system(System_Functions *system, umem chunk_size){
|
make_arena_system(umem chunk_size){
|
||||||
return(make_arena_system(system, chunk_size, 8));
|
return(make_arena_system(chunk_size, 8));
|
||||||
}
|
}
|
||||||
|
|
||||||
internal Arena
|
internal Arena
|
||||||
make_arena_system(System_Functions *system){
|
make_arena_system(void){
|
||||||
return(make_arena_system(system, KB(16), 8));
|
return(make_arena_system(KB(16), 8));
|
||||||
}
|
}
|
||||||
|
|
||||||
// BOTTOM
|
// BOTTOM
|
||||||
|
|
|
@ -15,6 +15,12 @@ function API_Definition*
|
||||||
define_api(Arena *arena){
|
define_api(Arena *arena){
|
||||||
API_Definition *api = begin_api(arena, "system");
|
API_Definition *api = begin_api(arena, "system");
|
||||||
|
|
||||||
|
{
|
||||||
|
API_Call *call = api_call(arena, api, "get_path", "String_Const_u8");
|
||||||
|
api_param(arena, call, "Arena*", "arena");
|
||||||
|
api_param(arena, call, "System_Path_Code", "path_code");
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
API_Call *call = api_call(arena, api, "get_canonical", "String_Const_u8");
|
API_Call *call = api_call(arena, api, "get_canonical", "String_Const_u8");
|
||||||
api_param(arena, call, "Arena*", "arena");
|
api_param(arena, call, "Arena*", "arena");
|
||||||
|
@ -77,7 +83,7 @@ define_api(Arena *arena){
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
API_Call *call = api_call(arena, api, "get_proc", "Void_Func");
|
API_Call *call = api_call(arena, api, "get_proc", "Void_Func*");
|
||||||
api_param(arena, call, "System_Library", "handle");
|
api_param(arena, call, "System_Library", "handle");
|
||||||
api_param(arena, call, "char*", "proc_name");
|
api_param(arena, call, "char*", "proc_name");
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,42 @@
|
||||||
|
/*
|
||||||
|
* Mr. 4th Dimention - Allen Webster
|
||||||
|
*
|
||||||
|
* 21.01.2015
|
||||||
|
*
|
||||||
|
* System API types.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
// TOP
|
||||||
|
|
||||||
|
#if !defined(FCODER_SYSTEM_TYPES_H)
|
||||||
|
#define FCODER_SYSTEM_TYPES_H
|
||||||
|
|
||||||
|
struct Plat_Handle{
|
||||||
|
u32 d[4];
|
||||||
|
};
|
||||||
|
typedef Plat_Handle System_Library;
|
||||||
|
typedef Plat_Handle System_Thread;
|
||||||
|
typedef Plat_Handle System_Mutex;
|
||||||
|
typedef Plat_Handle System_Condition_Variable;
|
||||||
|
typedef void Thread_Function(void *ptr);
|
||||||
|
struct CLI_Handles{
|
||||||
|
Plat_Handle proc;
|
||||||
|
Plat_Handle out_read;
|
||||||
|
Plat_Handle out_write;
|
||||||
|
Plat_Handle in_read;
|
||||||
|
Plat_Handle in_write;
|
||||||
|
u32 scratch_space[4];
|
||||||
|
i32 exit;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef i32 System_Path_Code;
|
||||||
|
enum{
|
||||||
|
SystemPath_CurrentDirectory,
|
||||||
|
SystemPath_Binary,
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// BOTTOM
|
||||||
|
|
117
4ed_view.cpp
117
4ed_view.cpp
|
@ -369,7 +369,7 @@ view_post_paste_effect(View *view, f32 seconds, i64 start, i64 size, u32 color){
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
view_set_file(System_Functions *system, Models *models, View *view, Editing_File *file){
|
view_set_file(Models *models, View *view, Editing_File *file){
|
||||||
Assert(file != 0);
|
Assert(file != 0);
|
||||||
|
|
||||||
Editing_File *old_file = view->file;
|
Editing_File *old_file = view->file;
|
||||||
|
@ -408,7 +408,7 @@ file_is_viewed(Layout *layout, Editing_File *file){
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
adjust_views_looking_at_file_to_new_cursor(System_Functions *system, Models *models, Editing_File *file){
|
adjust_views_looking_at_file_to_new_cursor(Models *models, Editing_File *file){
|
||||||
Layout *layout = &models->layout;
|
Layout *layout = &models->layout;
|
||||||
for (Panel *panel = layout_get_first_open_panel(layout);
|
for (Panel *panel = layout_get_first_open_panel(layout);
|
||||||
panel != 0;
|
panel != 0;
|
||||||
|
@ -422,7 +422,7 @@ adjust_views_looking_at_file_to_new_cursor(System_Functions *system, Models *mod
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
global_set_font_and_update_files(System_Functions *system, Models *models, Face *new_global_face){
|
global_set_font_and_update_files(Models *models, Face *new_global_face){
|
||||||
for (Node *node = models->working_set.active_file_sentinel.next;
|
for (Node *node = models->working_set.active_file_sentinel.next;
|
||||||
node != &models->working_set.active_file_sentinel;
|
node != &models->working_set.active_file_sentinel;
|
||||||
node = node->next){
|
node = node->next){
|
||||||
|
@ -433,7 +433,7 @@ global_set_font_and_update_files(System_Functions *system, Models *models, Face
|
||||||
}
|
}
|
||||||
|
|
||||||
internal b32
|
internal b32
|
||||||
release_font_and_update(System_Functions *system, Models *models, Face *face, Face *replacement_face){
|
release_font_and_update(Models *models, Face *face, Face *replacement_face){
|
||||||
b32 success = false;
|
b32 success = false;
|
||||||
Assert(replacement_face != 0 && replacement_face != face);
|
Assert(replacement_face != 0 && replacement_face != face);
|
||||||
if (font_set_release_face(&models->font_set, face->id)){
|
if (font_set_release_face(&models->font_set, face->id)){
|
||||||
|
@ -465,7 +465,7 @@ finalize_color(Color_Table color_table, int_color color){
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
view_quit_ui(System_Functions *system, Models *models, View *view){
|
view_quit_ui(Models *models, View *view){
|
||||||
Assert(view != 0);
|
Assert(view != 0);
|
||||||
view->ui_mode = false;
|
view->ui_mode = false;
|
||||||
if (view->ui_quit != 0){
|
if (view->ui_quit != 0){
|
||||||
|
@ -490,112 +490,5 @@ imp_get_view(Models *models, View_ID view_id){
|
||||||
return(view);
|
return(view);
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
internal void
|
|
||||||
render_loaded_file_in_view__inner(Models *models, Render_Target *target, View *view,
|
|
||||||
Rect_i32 rect,
|
|
||||||
Full_Cursor render_cursor,
|
|
||||||
Interval_i64 on_screen_range,
|
|
||||||
Buffer_Layout_Item_List list,
|
|
||||||
int_color *item_colors){
|
|
||||||
Cpp_Token_Array token_array = file->state.token_array;
|
|
||||||
b32 tokens_use = (token_array.tokens != 0);
|
|
||||||
i64 token_i = 0;
|
|
||||||
|
|
||||||
u32 main_color = color_table.vals[Stag_Default];
|
|
||||||
u32 special_color = color_table.vals[Stag_Special_Character];
|
|
||||||
u32 ghost_color = color_table.vals[Stag_Ghost_Character];
|
|
||||||
if (tokens_use){
|
|
||||||
Cpp_Get_Token_Result result = cpp_get_token(token_array, (i32)items->index);
|
|
||||||
main_color = get_token_color(color_table, token_array.tokens[result.token_index]);
|
|
||||||
token_i = result.token_index + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
i64 ind = item->index;
|
|
||||||
|
|
||||||
// NOTE(allen): Token scanning
|
|
||||||
u32 highlight_this_color = 0;
|
|
||||||
if (tokens_use && ind != prev_ind){
|
|
||||||
Token current_token = token_array.tokens[token_i-1];
|
|
||||||
|
|
||||||
if (token_i < token_array.count){
|
|
||||||
if (ind >= token_array.tokens[token_i].start){
|
|
||||||
for (;token_i < token_array.count && ind >= token_array.tokens[token_i].start; ++token_i){
|
|
||||||
main_color = get_token_color(color_table, token_array.tokens[token_i]);
|
|
||||||
current_token = token_array.tokens[token_i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (ind >= current_token.start + current_token.size){
|
|
||||||
main_color = color_table.vals[Stag_Default];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (current_token.type == CPP_TOKEN_JUNK && ind >= current_token.start && ind < current_token.start + current_token.size){
|
|
||||||
highlight_color = color_table.vals[Stag_Highlight_Junk];
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
highlight_color = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 char_color = main_color;
|
|
||||||
if (on_screen_range.min <= ind && ind < on_screen_range.max){
|
|
||||||
i64 index_shifted = ind - on_screen_range.min;
|
|
||||||
if (item_colors[index_shifted] != 0){
|
|
||||||
char_color = finalize_color(color_table, item_colors[index_shifted]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (HasFlag(item->flags, BRFlag_Special_Character)){
|
|
||||||
char_color = special_color;
|
|
||||||
}
|
|
||||||
else if (HasFlag(item->flags, BRFlag_Ghost_Character)){
|
|
||||||
char_color = ghost_color;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (view->show_whitespace && highlight_color == 0 && codepoint_is_whitespace(item->codepoint)){
|
|
||||||
highlight_this_color = color_table.vals[Stag_Highlight_White];
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
highlight_this_color = highlight_color;
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE(allen): Perform highlight, wireframe, and ibar renders
|
|
||||||
u32 color_highlight = 0;
|
|
||||||
u32 color_wireframe = 0;
|
|
||||||
u32 color_ibar = 0;
|
|
||||||
|
|
||||||
if (highlight_this_color != 0){
|
|
||||||
if (color_highlight == 0){
|
|
||||||
color_highlight = highlight_this_color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (color_highlight != 0){
|
|
||||||
draw_rectangle(target, char_rect, color_highlight);
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 fade_color = 0xFFFF00FF;
|
|
||||||
f32 fade_amount = 0.f;
|
|
||||||
if (file->state.paste_effect.seconds_down > 0.f &&
|
|
||||||
file->state.paste_effect.start <= ind &&
|
|
||||||
ind < file->state.paste_effect.end){
|
|
||||||
fade_color = file->state.paste_effect.color;
|
|
||||||
fade_amount = file->state.paste_effect.seconds_down;
|
|
||||||
fade_amount /= file->state.paste_effect.seconds_max;
|
|
||||||
}
|
|
||||||
char_color = color_blend(char_color, fade_amount, fade_color);
|
|
||||||
|
|
||||||
if (color_wireframe != 0){
|
|
||||||
draw_rectangle_outline(target, char_rect, color_wireframe);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// BOTTOM
|
// BOTTOM
|
||||||
|
|
||||||
|
|
|
@ -17,17 +17,17 @@ working_set_file_default_settings(Working_Set *working_set, Editing_File *file){
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
file_change_notification_check(System_Functions *system, Arena *scratch, Working_Set *working_set, Editing_File *file){
|
file_change_notification_check(Arena *scratch, Working_Set *working_set, Editing_File *file){
|
||||||
if (file->canon.name_size > 0 && !file->settings.unimportant){
|
if (file->canon.name_size > 0 && !file->settings.unimportant){
|
||||||
String_Const_u8 name = SCu8(file->canon.name_space, file->canon.name_size);
|
String_Const_u8 name = SCu8(file->canon.name_space, file->canon.name_size);
|
||||||
File_Attributes attributes = system->quick_file_attributes(scratch, name);
|
File_Attributes attributes = system_quick_file_attributes(scratch, name);
|
||||||
if (attributes.last_write_time > file->attributes.last_write_time){
|
if (attributes.last_write_time > file->attributes.last_write_time){
|
||||||
file_add_dirty_flag(file, DirtyState_UnloadedChanges);
|
file_add_dirty_flag(file, DirtyState_UnloadedChanges);
|
||||||
if (file->external_mod_node.next == 0){
|
if (file->external_mod_node.next == 0){
|
||||||
LogEventF(log_string(M), &working_set->arena, file->id, 0, system->thread_get_id(),
|
LogEventF(log_string(M), &working_set->arena, file->id, 0, system_thread_get_id(),
|
||||||
"external modification [lwt=0x%llx]", attributes.last_write_time);
|
"external modification [lwt=0x%llx]", attributes.last_write_time);
|
||||||
dll_insert_back(&working_set->has_external_mod_sentinel, &file->external_mod_node);
|
dll_insert_back(&working_set->has_external_mod_sentinel, &file->external_mod_node);
|
||||||
system->signal_step(0);
|
system_signal_step(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
file->attributes = attributes;
|
file->attributes = attributes;
|
||||||
|
@ -37,12 +37,11 @@ file_change_notification_check(System_Functions *system, Arena *scratch, Working
|
||||||
internal void
|
internal void
|
||||||
file_change_notification_thread_main(void *ptr){
|
file_change_notification_thread_main(void *ptr){
|
||||||
Models *models = (Models*)ptr;
|
Models *models = (Models*)ptr;
|
||||||
System_Functions *system = models->system;
|
Arena arena = make_arena_system();
|
||||||
Arena arena = make_arena_system(system);
|
|
||||||
Working_Set *working_set = &models->working_set;
|
Working_Set *working_set = &models->working_set;
|
||||||
for (;;){
|
for (;;){
|
||||||
system->sleep(Thousand(250));
|
system_sleep(Thousand(250));
|
||||||
Mutex_Lock lock(system, working_set->mutex);
|
Mutex_Lock lock(working_set->mutex);
|
||||||
if (working_set->active_file_count > 0){
|
if (working_set->active_file_count > 0){
|
||||||
i32 check_count = working_set->active_file_count/16;
|
i32 check_count = working_set->active_file_count/16;
|
||||||
check_count = clamp(1, check_count, 100);
|
check_count = clamp(1, check_count, 100);
|
||||||
|
@ -57,7 +56,7 @@ file_change_notification_thread_main(void *ptr){
|
||||||
if (node == used){
|
if (node == used){
|
||||||
node = node->next;
|
node = node->next;
|
||||||
}
|
}
|
||||||
file_change_notification_check(system, &arena, working_set, file);
|
file_change_notification_check(&arena, working_set, file);
|
||||||
}
|
}
|
||||||
working_set->sync_check_iterator = node;
|
working_set->sync_check_iterator = node;
|
||||||
}
|
}
|
||||||
|
@ -117,8 +116,7 @@ working_set_get_file(Working_Set *working_set, Buffer_ID id){
|
||||||
internal void
|
internal void
|
||||||
working_set_init(Models *models, Working_Set *working_set){
|
working_set_init(Models *models, Working_Set *working_set){
|
||||||
block_zero_struct(working_set);
|
block_zero_struct(working_set);
|
||||||
System_Functions *system = models->system;
|
working_set->arena = make_arena_system();
|
||||||
working_set->arena = make_arena_system(system);
|
|
||||||
|
|
||||||
working_set->id_counter = 1;
|
working_set->id_counter = 1;
|
||||||
|
|
||||||
|
@ -126,14 +124,14 @@ working_set_init(Models *models, Working_Set *working_set){
|
||||||
dll_init_sentinel(&working_set->touch_order_sentinel);
|
dll_init_sentinel(&working_set->touch_order_sentinel);
|
||||||
|
|
||||||
local_const i32 slot_count = 128;
|
local_const i32 slot_count = 128;
|
||||||
Base_Allocator *allocator = get_base_allocator_system(system);
|
Base_Allocator *allocator = get_base_allocator_system();
|
||||||
working_set->id_to_ptr_table = make_table_u64_u64(allocator, slot_count);
|
working_set->id_to_ptr_table = make_table_u64_u64(allocator, slot_count);
|
||||||
working_set->canon_table = make_table_Data_u64(allocator, slot_count);
|
working_set->canon_table = make_table_Data_u64(allocator, slot_count);
|
||||||
working_set->name_table = make_table_Data_u64(allocator, slot_count);
|
working_set->name_table = make_table_Data_u64(allocator, slot_count);
|
||||||
|
|
||||||
dll_init_sentinel(&working_set->has_external_mod_sentinel);
|
dll_init_sentinel(&working_set->has_external_mod_sentinel);
|
||||||
working_set->mutex = system->mutex_make();
|
working_set->mutex = system_mutex_make();
|
||||||
working_set->file_change_thread = system->thread_launch(file_change_notification_thread_main, models);
|
working_set->file_change_thread = system_thread_launch(file_change_notification_thread_main, models);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal Editing_File*
|
internal Editing_File*
|
||||||
|
@ -187,7 +185,7 @@ working_set_remove_name(Working_Set *working_set, String_Const_u8 name){
|
||||||
}
|
}
|
||||||
|
|
||||||
internal Editing_File*
|
internal Editing_File*
|
||||||
get_file_from_identifier(System_Functions *system, Working_Set *working_set, Buffer_Identifier buffer){
|
get_file_from_identifier(Working_Set *working_set, Buffer_Identifier buffer){
|
||||||
Editing_File *file = 0;
|
Editing_File *file = 0;
|
||||||
if (buffer.id != 0){
|
if (buffer.id != 0){
|
||||||
file = working_set_get_file(working_set, buffer.id);
|
file = working_set_get_file(working_set, buffer.id);
|
||||||
|
@ -269,9 +267,9 @@ working_set_clipboard_roll_down(Working_Set *working){
|
||||||
|
|
||||||
// TODO(allen): get rid of this???
|
// TODO(allen): get rid of this???
|
||||||
internal b32
|
internal b32
|
||||||
get_canon_name(System_Functions *system, Arena *scratch, String_Const_u8 file_name, Editing_File_Name *canon_name){
|
get_canon_name(Arena *scratch, String_Const_u8 file_name, Editing_File_Name *canon_name){
|
||||||
Temp_Memory temp = begin_temp(scratch);
|
Temp_Memory temp = begin_temp(scratch);
|
||||||
String_Const_u8 canonical = system->get_canonical(scratch, file_name);
|
String_Const_u8 canonical = system_get_canonical(scratch, file_name);
|
||||||
umem size = Min(sizeof(canon_name->name_space), canonical.size);
|
umem size = Min(sizeof(canon_name->name_space), canonical.size);
|
||||||
block_copy(canon_name->name_space, canonical.str, size);
|
block_copy(canon_name->name_space, canonical.str, size);
|
||||||
canon_name->name_size = size;
|
canon_name->name_size = size;
|
||||||
|
@ -281,7 +279,7 @@ get_canon_name(System_Functions *system, Arena *scratch, String_Const_u8 file_na
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
file_bind_file_name(System_Functions *system, Working_Set *working_set, Editing_File *file, String_Const_u8 canon_file_name){
|
file_bind_file_name(Working_Set *working_set, Editing_File *file, String_Const_u8 canon_file_name){
|
||||||
Assert(file->unique_name.name_size == 0);
|
Assert(file->unique_name.name_size == 0);
|
||||||
Assert(file->canon.name_size == 0);
|
Assert(file->canon.name_size == 0);
|
||||||
umem size = canon_file_name.size;
|
umem size = canon_file_name.size;
|
||||||
|
@ -294,7 +292,7 @@ file_bind_file_name(System_Functions *system, Working_Set *working_set, Editing_
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
buffer_unbind_file(System_Functions *system, Working_Set *working_set, Editing_File *file){
|
buffer_unbind_file(Working_Set *working_set, Editing_File *file){
|
||||||
Assert(file->unique_name.name_size == 0);
|
Assert(file->unique_name.name_size == 0);
|
||||||
Assert(file->canon.name_size != 0);
|
Assert(file->canon.name_size != 0);
|
||||||
working_set_canon_remove(working_set, string_from_file_name(&file->canon));
|
working_set_canon_remove(working_set, string_from_file_name(&file->canon));
|
||||||
|
|
|
@ -13,8 +13,7 @@
|
||||||
#define FCODER_LOG_CPP
|
#define FCODER_LOG_CPP
|
||||||
|
|
||||||
internal String_Const_u8
|
internal String_Const_u8
|
||||||
log_event(Arena *arena, String_Const_u8 event_name, String_Const_u8 src_name, i32 line_number,
|
log_event(Arena *arena, String_Const_u8 event_name, String_Const_u8 src_name, i32 line_number, i32 buffer, i32 view, i32 thread_id){
|
||||||
i32 buffer, i32 view, i32 thread_id){
|
|
||||||
List_String_Const_u8 list = {};
|
List_String_Const_u8 list = {};
|
||||||
string_list_pushf(arena, &list, "%.*s:%d: %.*s",
|
string_list_pushf(arena, &list, "%.*s:%d: %.*s",
|
||||||
string_expand(src_name), line_number, string_expand(event_name));
|
string_expand(src_name), line_number, string_expand(event_name));
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
function void
|
function void
|
||||||
system_api_fill_vtable(API_VTable_system *vtable){
|
system_api_fill_vtable(API_VTable_system *vtable){
|
||||||
|
vtable->get_path = system_get_path;
|
||||||
vtable->get_canonical = system_get_canonical;
|
vtable->get_canonical = system_get_canonical;
|
||||||
vtable->get_file_list = system_get_file_list;
|
vtable->get_file_list = system_get_file_list;
|
||||||
vtable->quick_file_attributes = system_quick_file_attributes;
|
vtable->quick_file_attributes = system_quick_file_attributes;
|
||||||
|
@ -46,6 +47,7 @@ vtable->is_fullscreen = system_is_fullscreen;
|
||||||
#if defined(DYNAMIC_LINK_API)
|
#if defined(DYNAMIC_LINK_API)
|
||||||
function void
|
function void
|
||||||
system_api_read_vtable(API_VTable_system *vtable){
|
system_api_read_vtable(API_VTable_system *vtable){
|
||||||
|
system_get_path = vtable->get_path;
|
||||||
system_get_canonical = vtable->get_canonical;
|
system_get_canonical = vtable->get_canonical;
|
||||||
system_get_file_list = vtable->get_file_list;
|
system_get_file_list = vtable->get_file_list;
|
||||||
system_quick_file_attributes = vtable->quick_file_attributes;
|
system_quick_file_attributes = vtable->quick_file_attributes;
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
#define system_get_path_sig() String_Const_u8 system_get_path(Arena* arena, System_Path_Code path_code)
|
||||||
#define system_get_canonical_sig() String_Const_u8 system_get_canonical(Arena* arena, String_Const_u8 name)
|
#define system_get_canonical_sig() String_Const_u8 system_get_canonical(Arena* arena, String_Const_u8 name)
|
||||||
#define system_get_file_list_sig() File_List system_get_file_list(Arena* arena, String_Const_u8 directory)
|
#define system_get_file_list_sig() File_List system_get_file_list(Arena* arena, String_Const_u8 directory)
|
||||||
#define system_quick_file_attributes_sig() File_Attributes system_quick_file_attributes(Arena* scratch, String_Const_u8 file_name)
|
#define system_quick_file_attributes_sig() File_Attributes system_quick_file_attributes(Arena* scratch, String_Const_u8 file_name)
|
||||||
|
@ -8,7 +9,7 @@
|
||||||
#define system_save_file_sig() File_Attributes system_save_file(Arena* scratch, char* file_name, String_Const_u8 data)
|
#define system_save_file_sig() File_Attributes system_save_file(Arena* scratch, char* file_name, String_Const_u8 data)
|
||||||
#define system_load_library_sig() b32 system_load_library(Arena* scratch, String_Const_u8 file_name, System_Library* out)
|
#define system_load_library_sig() b32 system_load_library(Arena* scratch, String_Const_u8 file_name, System_Library* out)
|
||||||
#define system_release_library_sig() b32 system_release_library(System_Library handle)
|
#define system_release_library_sig() b32 system_release_library(System_Library handle)
|
||||||
#define system_get_proc_sig() Void_Func system_get_proc(System_Library handle, char* proc_name)
|
#define system_get_proc_sig() Void_Func* system_get_proc(System_Library handle, char* proc_name)
|
||||||
#define system_now_time_sig() u64 system_now_time(void)
|
#define system_now_time_sig() u64 system_now_time(void)
|
||||||
#define system_wake_up_timer_create_sig() Plat_Handle system_wake_up_timer_create(void)
|
#define system_wake_up_timer_create_sig() Plat_Handle system_wake_up_timer_create(void)
|
||||||
#define system_wake_up_timer_release_sig() void system_wake_up_timer_release(Plat_Handle handle)
|
#define system_wake_up_timer_release_sig() void system_wake_up_timer_release(Plat_Handle handle)
|
||||||
|
@ -40,6 +41,7 @@
|
||||||
#define system_show_mouse_cursor_sig() void system_show_mouse_cursor(i32 show)
|
#define system_show_mouse_cursor_sig() void system_show_mouse_cursor(i32 show)
|
||||||
#define system_set_fullscreen_sig() b32 system_set_fullscreen(b32 full_screen)
|
#define system_set_fullscreen_sig() b32 system_set_fullscreen(b32 full_screen)
|
||||||
#define system_is_fullscreen_sig() b32 system_is_fullscreen(void)
|
#define system_is_fullscreen_sig() b32 system_is_fullscreen(void)
|
||||||
|
typedef String_Const_u8 system_get_path_type(Arena* arena, System_Path_Code path_code);
|
||||||
typedef String_Const_u8 system_get_canonical_type(Arena* arena, String_Const_u8 name);
|
typedef String_Const_u8 system_get_canonical_type(Arena* arena, String_Const_u8 name);
|
||||||
typedef File_List system_get_file_list_type(Arena* arena, String_Const_u8 directory);
|
typedef File_List system_get_file_list_type(Arena* arena, String_Const_u8 directory);
|
||||||
typedef File_Attributes system_quick_file_attributes_type(Arena* scratch, String_Const_u8 file_name);
|
typedef File_Attributes system_quick_file_attributes_type(Arena* scratch, String_Const_u8 file_name);
|
||||||
|
@ -50,7 +52,7 @@ typedef b32 system_load_close_type(Plat_Handle handle);
|
||||||
typedef File_Attributes system_save_file_type(Arena* scratch, char* file_name, String_Const_u8 data);
|
typedef File_Attributes system_save_file_type(Arena* scratch, char* file_name, String_Const_u8 data);
|
||||||
typedef b32 system_load_library_type(Arena* scratch, String_Const_u8 file_name, System_Library* out);
|
typedef b32 system_load_library_type(Arena* scratch, String_Const_u8 file_name, System_Library* out);
|
||||||
typedef b32 system_release_library_type(System_Library handle);
|
typedef b32 system_release_library_type(System_Library handle);
|
||||||
typedef Void_Func system_get_proc_type(System_Library handle, char* proc_name);
|
typedef Void_Func* system_get_proc_type(System_Library handle, char* proc_name);
|
||||||
typedef u64 system_now_time_type(void);
|
typedef u64 system_now_time_type(void);
|
||||||
typedef Plat_Handle system_wake_up_timer_create_type(void);
|
typedef Plat_Handle system_wake_up_timer_create_type(void);
|
||||||
typedef void system_wake_up_timer_release_type(Plat_Handle handle);
|
typedef void system_wake_up_timer_release_type(Plat_Handle handle);
|
||||||
|
@ -83,6 +85,7 @@ typedef void system_show_mouse_cursor_type(i32 show);
|
||||||
typedef b32 system_set_fullscreen_type(b32 full_screen);
|
typedef b32 system_set_fullscreen_type(b32 full_screen);
|
||||||
typedef b32 system_is_fullscreen_type(void);
|
typedef b32 system_is_fullscreen_type(void);
|
||||||
struct API_VTable_system{
|
struct API_VTable_system{
|
||||||
|
system_get_path_type *get_path;
|
||||||
system_get_canonical_type *get_canonical;
|
system_get_canonical_type *get_canonical;
|
||||||
system_get_file_list_type *get_file_list;
|
system_get_file_list_type *get_file_list;
|
||||||
system_quick_file_attributes_type *quick_file_attributes;
|
system_quick_file_attributes_type *quick_file_attributes;
|
||||||
|
@ -127,6 +130,7 @@ system_set_fullscreen_type *set_fullscreen;
|
||||||
system_is_fullscreen_type *is_fullscreen;
|
system_is_fullscreen_type *is_fullscreen;
|
||||||
};
|
};
|
||||||
#if defined(STATIC_LINK_API)
|
#if defined(STATIC_LINK_API)
|
||||||
|
internal String_Const_u8 system_get_path(Arena* arena, System_Path_Code path_code);
|
||||||
internal String_Const_u8 system_get_canonical(Arena* arena, String_Const_u8 name);
|
internal String_Const_u8 system_get_canonical(Arena* arena, String_Const_u8 name);
|
||||||
internal File_List system_get_file_list(Arena* arena, String_Const_u8 directory);
|
internal File_List system_get_file_list(Arena* arena, String_Const_u8 directory);
|
||||||
internal File_Attributes system_quick_file_attributes(Arena* scratch, String_Const_u8 file_name);
|
internal File_Attributes system_quick_file_attributes(Arena* scratch, String_Const_u8 file_name);
|
||||||
|
@ -137,7 +141,7 @@ internal b32 system_load_close(Plat_Handle handle);
|
||||||
internal File_Attributes system_save_file(Arena* scratch, char* file_name, String_Const_u8 data);
|
internal File_Attributes system_save_file(Arena* scratch, char* file_name, String_Const_u8 data);
|
||||||
internal b32 system_load_library(Arena* scratch, String_Const_u8 file_name, System_Library* out);
|
internal b32 system_load_library(Arena* scratch, String_Const_u8 file_name, System_Library* out);
|
||||||
internal b32 system_release_library(System_Library handle);
|
internal b32 system_release_library(System_Library handle);
|
||||||
internal Void_Func system_get_proc(System_Library handle, char* proc_name);
|
internal Void_Func* system_get_proc(System_Library handle, char* proc_name);
|
||||||
internal u64 system_now_time(void);
|
internal u64 system_now_time(void);
|
||||||
internal Plat_Handle system_wake_up_timer_create(void);
|
internal Plat_Handle system_wake_up_timer_create(void);
|
||||||
internal void system_wake_up_timer_release(Plat_Handle handle);
|
internal void system_wake_up_timer_release(Plat_Handle handle);
|
||||||
|
@ -171,6 +175,7 @@ internal b32 system_set_fullscreen(b32 full_screen);
|
||||||
internal b32 system_is_fullscreen(void);
|
internal b32 system_is_fullscreen(void);
|
||||||
#undef STATIC_LINK_API
|
#undef STATIC_LINK_API
|
||||||
#elif defined(DYNAMIC_LINK_API)
|
#elif defined(DYNAMIC_LINK_API)
|
||||||
|
global system_get_path_type *system_get_path = 0;
|
||||||
global system_get_canonical_type *system_get_canonical = 0;
|
global system_get_canonical_type *system_get_canonical = 0;
|
||||||
global system_get_file_list_type *system_get_file_list = 0;
|
global system_get_file_list_type *system_get_file_list = 0;
|
||||||
global system_quick_file_attributes_type *system_quick_file_attributes = 0;
|
global system_quick_file_attributes_type *system_quick_file_attributes = 0;
|
||||||
|
|
|
@ -1,73 +0,0 @@
|
||||||
/*
|
|
||||||
* Mr. 4th Dimention - Allen Webster
|
|
||||||
*
|
|
||||||
* 18.07.2017
|
|
||||||
*
|
|
||||||
* Code to link system functions using a name convention
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
// TOP
|
|
||||||
|
|
||||||
// TODO(allen): Should auto-gen this!
|
|
||||||
|
|
||||||
#define SYSLINK(name) sysfunc.name = system_##name
|
|
||||||
|
|
||||||
internal void
|
|
||||||
link_system_code(void){
|
|
||||||
SYSLINK(get_canonical);
|
|
||||||
SYSLINK(get_file_list);
|
|
||||||
SYSLINK(quick_file_attributes);
|
|
||||||
SYSLINK(load_handle);
|
|
||||||
SYSLINK(load_attributes);
|
|
||||||
SYSLINK(load_file);
|
|
||||||
SYSLINK(load_close);
|
|
||||||
SYSLINK(save_file);
|
|
||||||
|
|
||||||
SYSLINK(load_library);
|
|
||||||
SYSLINK(release_library);
|
|
||||||
SYSLINK(get_proc);
|
|
||||||
|
|
||||||
SYSLINK(now_time);
|
|
||||||
SYSLINK(wake_up_timer_create);
|
|
||||||
SYSLINK(wake_up_timer_release);
|
|
||||||
SYSLINK(wake_up_timer_set);
|
|
||||||
SYSLINK(signal_step);
|
|
||||||
SYSLINK(sleep);
|
|
||||||
|
|
||||||
SYSLINK(post_clipboard);
|
|
||||||
|
|
||||||
SYSLINK(cli_call);
|
|
||||||
SYSLINK(cli_begin_update);
|
|
||||||
SYSLINK(cli_update_step);
|
|
||||||
SYSLINK(cli_end_update);
|
|
||||||
|
|
||||||
SYSLINK(open_color_picker);
|
|
||||||
SYSLINK(get_screen_scale_factor);
|
|
||||||
|
|
||||||
SYSLINK(thread_launch);
|
|
||||||
SYSLINK(thread_join);
|
|
||||||
SYSLINK(thread_free);
|
|
||||||
SYSLINK(thread_get_id);
|
|
||||||
SYSLINK(mutex_make);
|
|
||||||
SYSLINK(mutex_acquire);
|
|
||||||
SYSLINK(mutex_release);
|
|
||||||
SYSLINK(mutex_free);
|
|
||||||
SYSLINK(condition_variable_make);
|
|
||||||
SYSLINK(condition_variable_wait);
|
|
||||||
SYSLINK(condition_variable_signal);
|
|
||||||
SYSLINK(condition_variable_free);
|
|
||||||
|
|
||||||
SYSLINK(memory_allocate);
|
|
||||||
SYSLINK(memory_set_protection);
|
|
||||||
SYSLINK(memory_free);
|
|
||||||
|
|
||||||
SYSLINK(get_path);
|
|
||||||
|
|
||||||
SYSLINK(set_fullscreen);
|
|
||||||
SYSLINK(is_fullscreen);
|
|
||||||
SYSLINK(show_mouse_cursor);
|
|
||||||
}
|
|
||||||
|
|
||||||
// BOTTOM
|
|
||||||
|
|
|
@ -1,97 +0,0 @@
|
||||||
/*
|
|
||||||
* Mr. 4th Dimention - Allen Webster
|
|
||||||
*
|
|
||||||
* 19.07.2017
|
|
||||||
*
|
|
||||||
* Cross platform library constants
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
// TOP
|
|
||||||
|
|
||||||
#error remove this file
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
#if !defined(FRED_SHARED_LIBRARY_CONSTANTS_H)
|
|
||||||
#define FRED_SHARED_LIBRARY_CONSTANTS_H
|
|
||||||
|
|
||||||
// Wrapper functions
|
|
||||||
union Library;
|
|
||||||
|
|
||||||
internal b32
|
|
||||||
system_load_library_direct(Arena *scratch, Library *library, char *name);
|
|
||||||
|
|
||||||
internal void*
|
|
||||||
system_get_proc(Library *library, char *name);
|
|
||||||
|
|
||||||
internal void
|
|
||||||
system_free_library(Library *library);
|
|
||||||
|
|
||||||
// Shared logic
|
|
||||||
#define LIBRARY_TYPE_SIZE 32
|
|
||||||
|
|
||||||
#define AssertLibrarySizes() Assert(sizeof(Library) == LIBRARY_TYPE_SIZE)
|
|
||||||
|
|
||||||
typedef u32 Load_Library_Location;
|
|
||||||
enum{
|
|
||||||
LoadLibrary_CurrentDirectory,
|
|
||||||
LoadLibrary_BinaryDirectory,
|
|
||||||
};
|
|
||||||
|
|
||||||
internal b32
|
|
||||||
system_load_library(Arena *scratch, Library *library, char *name_cstr, Load_Library_Location location, char *full_file_out, u32 full_file_max){
|
|
||||||
Temp_Memory temp = begin_temp(scratch);
|
|
||||||
|
|
||||||
String_Const_char name = SCchar(name_cstr);
|
|
||||||
String_Const_char extension = string_file_extension(name);
|
|
||||||
if (!string_match(extension, string_litexpr( DLL ))){
|
|
||||||
String_Const_char full_name = push_stringf(scratch, "%.*s." DLL, string_expand(name));
|
|
||||||
name_cstr = full_name.str;
|
|
||||||
}
|
|
||||||
|
|
||||||
String_Const_u8 path = {};
|
|
||||||
switch (location){
|
|
||||||
case LoadLibrary_CurrentDirectory:
|
|
||||||
{
|
|
||||||
path = sysfunc.get_current_path(scratch);
|
|
||||||
}break;
|
|
||||||
|
|
||||||
case LoadLibrary_BinaryDirectory:
|
|
||||||
{
|
|
||||||
path = sysfunc.get_4ed_path(scratch);
|
|
||||||
}break;
|
|
||||||
|
|
||||||
//default: LOG("Invalid library location passed.\n"); break;
|
|
||||||
}
|
|
||||||
|
|
||||||
b32 success = false;
|
|
||||||
if (path.size > 0){
|
|
||||||
if (path.str[path.size - 1] != SLASH){
|
|
||||||
path = push_u8_stringf(scratch, "%.*s%c%.*s", string_expand(path), SLASH, string_expand(name));
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
path = push_u8_stringf(scratch, "%.*s%.*s", string_expand(path), string_expand(name));
|
|
||||||
}
|
|
||||||
success = system_load_library_direct(scratch, library, (char*)path.str);
|
|
||||||
}
|
|
||||||
if (success && full_file_out != 0 && full_file_out > 0){
|
|
||||||
u32 fill_size = clamp_top((u32)(path.size), (u32)(full_file_max - 1));
|
|
||||||
block_copy(full_file_out, path.str, fill_size);
|
|
||||||
full_file_out[fill_size] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
end_temp(temp);
|
|
||||||
|
|
||||||
return(success);
|
|
||||||
}
|
|
||||||
|
|
||||||
internal b32
|
|
||||||
system_load_library(Arena *scratch, Library *library, char *name, Load_Library_Location location){
|
|
||||||
return(system_load_library(scratch, library, name, location, 0, 0));
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// BOTTOM
|
|
||||||
|
|
|
@ -21,12 +21,23 @@
|
||||||
#include "api/4coder_types.h"
|
#include "api/4coder_types.h"
|
||||||
|
|
||||||
#include "4ed_font_interface.h"
|
#include "4ed_font_interface.h"
|
||||||
|
#include "4ed_system_types.h"
|
||||||
|
#define STATIC_LINK_API
|
||||||
|
#include "generated/system_api.h"
|
||||||
|
#define STATIC_LINK_API
|
||||||
|
#include "generated/graphics_api.h"
|
||||||
|
#define STATIC_LINK_API
|
||||||
|
#include "generated/font_api.h"
|
||||||
|
|
||||||
#include "4ed_font_set.h"
|
#include "4ed_font_set.h"
|
||||||
#include "4ed_system.h"
|
|
||||||
#include "4ed_render_target.h"
|
#include "4ed_render_target.h"
|
||||||
#include "4ed_search_list.h"
|
#include "4ed_search_list.h"
|
||||||
#include "4ed.h"
|
#include "4ed.h"
|
||||||
|
|
||||||
|
#include "generated/system_api.cpp"
|
||||||
|
#include "generated/graphics_api.cpp"
|
||||||
|
#include "generated/font_api.cpp"
|
||||||
|
|
||||||
#include "4coder_base_types.cpp"
|
#include "4coder_base_types.cpp"
|
||||||
#include "4coder_stringf.cpp"
|
#include "4coder_stringf.cpp"
|
||||||
#include "4coder_hash_functions.cpp"
|
#include "4coder_hash_functions.cpp"
|
||||||
|
@ -105,8 +116,6 @@ struct Win32_Input_Chunk{
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
|
||||||
global System_Functions sysfunc = {};
|
|
||||||
|
|
||||||
typedef i32 Win32_Object_Kind;
|
typedef i32 Win32_Object_Kind;
|
||||||
enum{
|
enum{
|
||||||
Win32ObjectKind_ERROR = 0,
|
Win32ObjectKind_ERROR = 0,
|
||||||
|
@ -247,7 +256,7 @@ handle_type_ptr(void *ptr){
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
|
||||||
internal
|
internal
|
||||||
Sys_Load_Library_Sig(system_load_library){
|
system_load_library_sig(){
|
||||||
HMODULE lib = LoadLibrary_utf8String(scratch, file_name);
|
HMODULE lib = LoadLibrary_utf8String(scratch, file_name);
|
||||||
b32 result = false;
|
b32 result = false;
|
||||||
if (lib != 0){
|
if (lib != 0){
|
||||||
|
@ -258,13 +267,13 @@ Sys_Load_Library_Sig(system_load_library){
|
||||||
}
|
}
|
||||||
|
|
||||||
internal
|
internal
|
||||||
Sys_Release_Library_Sig(system_release_library){
|
system_release_library_sig(){
|
||||||
HMODULE lib = (HMODULE)handle_type(handle);
|
HMODULE lib = (HMODULE)handle_type(handle);
|
||||||
return(FreeLibrary(lib));
|
return(FreeLibrary(lib));
|
||||||
}
|
}
|
||||||
|
|
||||||
internal
|
internal
|
||||||
Sys_Get_Proc_Sig(system_get_proc){
|
system_get_proc_sig(){
|
||||||
HMODULE lib = (HMODULE)handle_type(handle);
|
HMODULE lib = (HMODULE)handle_type(handle);
|
||||||
return((Void_Func*)(GetProcAddress(lib, proc_name)));
|
return((Void_Func*)(GetProcAddress(lib, proc_name)));
|
||||||
}
|
}
|
||||||
|
@ -307,12 +316,12 @@ win32_toggle_fullscreen(){
|
||||||
|
|
||||||
// TODO(allen): add a "shown but auto-hides on timer" setting here.
|
// TODO(allen): add a "shown but auto-hides on timer" setting here.
|
||||||
internal
|
internal
|
||||||
Sys_Show_Mouse_Cursor_Sig(system_show_mouse_cursor){
|
system_show_mouse_cursor_sig(){
|
||||||
win32vars.cursor_show = show;
|
win32vars.cursor_show = show;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal
|
internal
|
||||||
Sys_Set_Fullscreen_Sig(system_set_fullscreen){
|
system_set_fullscreen_sig(){
|
||||||
// NOTE(allen): If the new value of full_screen does not match the current value,
|
// NOTE(allen): If the new value of full_screen does not match the current value,
|
||||||
// set toggle to true.
|
// set toggle to true.
|
||||||
win32vars.do_toggle = (win32vars.full_screen != full_screen);
|
win32vars.do_toggle = (win32vars.full_screen != full_screen);
|
||||||
|
@ -321,10 +330,10 @@ Sys_Set_Fullscreen_Sig(system_set_fullscreen){
|
||||||
}
|
}
|
||||||
|
|
||||||
internal
|
internal
|
||||||
Sys_Is_Fullscreen_Sig(system_is_fullscreen){
|
system_is_fullscreen_sig(){
|
||||||
// NOTE(allen): Report the fullscreen status as it would be set at the beginning of the next frame.
|
// NOTE(allen): Report the fullscreen status as it would be set at the beginning of the
|
||||||
// That is, take into account all fullscreen toggle requests that have come in already this frame.
|
// next frame. That is, take into account all fullscreen toggle requests that have come in
|
||||||
// Read: "full_screen XOR do_toggle"
|
// already this frame. Read: "full_screen XOR do_toggle"
|
||||||
b32 result = (win32vars.full_screen != win32vars.do_toggle);
|
b32 result = (win32vars.full_screen != win32vars.do_toggle);
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
@ -353,10 +362,10 @@ win32_post_clipboard(Arena *scratch, char *text, i32 len){
|
||||||
}
|
}
|
||||||
|
|
||||||
internal
|
internal
|
||||||
Sys_Post_Clipboard_Sig(system_post_clipboard){
|
system_post_clipboard_sig(){
|
||||||
Arena *arena = &win32vars.clip_post_arena;
|
Arena *arena = &win32vars.clip_post_arena;
|
||||||
if (arena->base_allocator == 0){
|
if (arena->base_allocator == 0){
|
||||||
*arena = make_arena_system(&sysfunc);
|
*arena = make_arena_system();
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
linalloc_clear(arena);
|
linalloc_clear(arena);
|
||||||
|
@ -432,14 +441,14 @@ win32_read_clipboard_contents(Arena *scratch){
|
||||||
//
|
//
|
||||||
|
|
||||||
internal
|
internal
|
||||||
Sys_CLI_Call_Sig(system_cli_call, scratch, path, script_name, cli_out){
|
system_cli_call_sig(){
|
||||||
Assert(sizeof(Plat_Handle) >= sizeof(HANDLE));
|
Assert(sizeof(Plat_Handle) >= sizeof(HANDLE));
|
||||||
|
|
||||||
char cmd[] = "c:\\windows\\system32\\cmd.exe";
|
char cmd[] = "c:\\windows\\system32\\cmd.exe";
|
||||||
char *env_variables = 0;
|
char *env_variables = 0;
|
||||||
|
|
||||||
Temp_Memory temp = begin_temp(scratch);
|
Temp_Memory temp = begin_temp(scratch);
|
||||||
String_Const_u8 s = push_u8_stringf(scratch, "/C %s", script_name);
|
String_Const_u8 s = push_u8_stringf(scratch, "/C %s", script);
|
||||||
|
|
||||||
b32 success = false;
|
b32 success = false;
|
||||||
|
|
||||||
|
@ -504,14 +513,14 @@ struct CLI_Loop_Control{
|
||||||
};
|
};
|
||||||
|
|
||||||
internal
|
internal
|
||||||
Sys_CLI_Begin_Update_Sig(system_cli_begin_update){
|
system_cli_begin_update_sig(){
|
||||||
Assert(sizeof(cli->scratch_space) >= sizeof(CLI_Loop_Control));
|
Assert(sizeof(cli->scratch_space) >= sizeof(CLI_Loop_Control));
|
||||||
CLI_Loop_Control *loop = (CLI_Loop_Control*)cli->scratch_space;
|
CLI_Loop_Control *loop = (CLI_Loop_Control*)cli->scratch_space;
|
||||||
loop->remaining_amount = 0;
|
loop->remaining_amount = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal
|
internal
|
||||||
Sys_CLI_Update_Step_Sig(system_cli_update_step){
|
system_cli_update_step_sig(){
|
||||||
HANDLE handle = *(HANDLE*)&cli->out_read;
|
HANDLE handle = *(HANDLE*)&cli->out_read;
|
||||||
CLI_Loop_Control *loop = (CLI_Loop_Control*)cli->scratch_space;
|
CLI_Loop_Control *loop = (CLI_Loop_Control*)cli->scratch_space;
|
||||||
b32 has_more = 0;
|
b32 has_more = 0;
|
||||||
|
@ -547,7 +556,7 @@ Sys_CLI_Update_Step_Sig(system_cli_update_step){
|
||||||
}
|
}
|
||||||
|
|
||||||
internal
|
internal
|
||||||
Sys_CLI_End_Update_Sig(system_cli_end_update){
|
system_cli_end_update_sig(){
|
||||||
b32 close_me = false;
|
b32 close_me = false;
|
||||||
HANDLE proc = *(HANDLE*)&cli->proc;
|
HANDLE proc = *(HANDLE*)&cli->proc;
|
||||||
DWORD result = 0;
|
DWORD result = 0;
|
||||||
|
@ -583,6 +592,21 @@ Sys_CLI_End_Update_Sig(system_cli_end_update){
|
||||||
#include <GL/gl.h>
|
#include <GL/gl.h>
|
||||||
#include "opengl/4ed_opengl_render.cpp"
|
#include "opengl/4ed_opengl_render.cpp"
|
||||||
|
|
||||||
|
internal
|
||||||
|
graphics_get_texture_sig(){
|
||||||
|
return(gl__get_texture(dim, texture_kind));
|
||||||
|
}
|
||||||
|
|
||||||
|
internal
|
||||||
|
graphics_fill_texture_sig(){
|
||||||
|
return(gl__fill_texture(texture_kind, texture, p, dim, data));
|
||||||
|
}
|
||||||
|
|
||||||
|
internal
|
||||||
|
font_make_face_sig(){
|
||||||
|
return(ft__font_make_face(arena, description, scale_factor));
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Helpers
|
// Helpers
|
||||||
//
|
//
|
||||||
|
@ -834,7 +858,7 @@ win32_free_object(Win32_Object *object){
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
|
||||||
internal
|
internal
|
||||||
Sys_Now_Time_Sig(system_now_time){
|
system_now_time_sig(){
|
||||||
u64 result = 0;
|
u64 result = 0;
|
||||||
LARGE_INTEGER t;
|
LARGE_INTEGER t;
|
||||||
if (QueryPerformanceCounter(&t)){
|
if (QueryPerformanceCounter(&t)){
|
||||||
|
@ -844,7 +868,7 @@ Sys_Now_Time_Sig(system_now_time){
|
||||||
}
|
}
|
||||||
|
|
||||||
internal
|
internal
|
||||||
Sys_Wake_Up_Timer_Create_Sig(system_wake_up_timer_create){
|
system_wake_up_timer_create_sig(){
|
||||||
Win32_Object *object = win32_alloc_object(Win32ObjectKind_Timer);
|
Win32_Object *object = win32_alloc_object(Win32ObjectKind_Timer);
|
||||||
dll_insert(&win32vars.timer_objects, &object->node);
|
dll_insert(&win32vars.timer_objects, &object->node);
|
||||||
object->timer.id = ++win32vars.timer_counter;
|
object->timer.id = ++win32vars.timer_counter;
|
||||||
|
@ -852,7 +876,7 @@ Sys_Wake_Up_Timer_Create_Sig(system_wake_up_timer_create){
|
||||||
}
|
}
|
||||||
|
|
||||||
internal
|
internal
|
||||||
Sys_Wake_Up_Timer_Release_Sig(system_wake_up_timer_release){
|
system_wake_up_timer_release_sig(){
|
||||||
Win32_Object *object = (Win32_Object*)handle_type_ptr(handle);
|
Win32_Object *object = (Win32_Object*)handle_type_ptr(handle);
|
||||||
if (object->kind == Win32ObjectKind_Timer){
|
if (object->kind == Win32ObjectKind_Timer){
|
||||||
KillTimer(win32vars.window_handle, object->timer.id);
|
KillTimer(win32vars.window_handle, object->timer.id);
|
||||||
|
@ -861,7 +885,7 @@ Sys_Wake_Up_Timer_Release_Sig(system_wake_up_timer_release){
|
||||||
}
|
}
|
||||||
|
|
||||||
internal
|
internal
|
||||||
Sys_Wake_Up_Timer_Set_Sig(system_wake_up_timer_set){
|
system_wake_up_timer_set_sig(){
|
||||||
Win32_Object *object = (Win32_Object*)handle_type_ptr(handle);
|
Win32_Object *object = (Win32_Object*)handle_type_ptr(handle);
|
||||||
if (object->kind == Win32ObjectKind_Timer){
|
if (object->kind == Win32ObjectKind_Timer){
|
||||||
object->timer.id = SetTimer(win32vars.window_handle, object->timer.id, time_milliseconds, 0);
|
object->timer.id = SetTimer(win32vars.window_handle, object->timer.id, time_milliseconds, 0);
|
||||||
|
@ -869,12 +893,12 @@ Sys_Wake_Up_Timer_Set_Sig(system_wake_up_timer_set){
|
||||||
}
|
}
|
||||||
|
|
||||||
internal
|
internal
|
||||||
Sys_Signal_Step_Sig(system_signal_step){
|
system_signal_step_sig(){
|
||||||
system_schedule_step(code);
|
system_schedule_step(code);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal
|
internal
|
||||||
Sys_Sleep_Sig(system_sleep){
|
system_sleep_sig(){
|
||||||
u32 milliseconds = (u32)(microseconds/Thousand(1));
|
u32 milliseconds = (u32)(microseconds/Thousand(1));
|
||||||
Sleep(milliseconds);
|
Sleep(milliseconds);
|
||||||
}
|
}
|
||||||
|
@ -895,7 +919,7 @@ win32_thread_wrapper(void *ptr){
|
||||||
}
|
}
|
||||||
|
|
||||||
internal
|
internal
|
||||||
Sys_Thread_Launch_Sig(system_thread_launch){
|
system_thread_launch_sig(){
|
||||||
Win32_Object *object = win32_alloc_object(Win32ObjectKind_Thread);
|
Win32_Object *object = win32_alloc_object(Win32ObjectKind_Thread);
|
||||||
object->thread.proc = proc;
|
object->thread.proc = proc;
|
||||||
object->thread.ptr = ptr;
|
object->thread.ptr = ptr;
|
||||||
|
@ -910,7 +934,7 @@ Sys_Thread_Launch_Sig(system_thread_launch){
|
||||||
}
|
}
|
||||||
|
|
||||||
internal
|
internal
|
||||||
Sys_Thread_Join_Sig(system_thread_join){
|
system_thread_join_sig(){
|
||||||
Win32_Object *object = (Win32_Object*)handle_type_ptr(thread);
|
Win32_Object *object = (Win32_Object*)handle_type_ptr(thread);
|
||||||
if (object->kind == Win32ObjectKind_Thread){
|
if (object->kind == Win32ObjectKind_Thread){
|
||||||
WaitForSingleObject(object->thread.thread, INFINITE);
|
WaitForSingleObject(object->thread.thread, INFINITE);
|
||||||
|
@ -918,7 +942,7 @@ Sys_Thread_Join_Sig(system_thread_join){
|
||||||
}
|
}
|
||||||
|
|
||||||
internal
|
internal
|
||||||
Sys_Thread_Free_Sig(system_thread_free){
|
system_thread_free_sig(){
|
||||||
Win32_Object *object = (Win32_Object*)handle_type_ptr(thread);
|
Win32_Object *object = (Win32_Object*)handle_type_ptr(thread);
|
||||||
if (object->kind == Win32ObjectKind_Thread){
|
if (object->kind == Win32ObjectKind_Thread){
|
||||||
CloseHandle(object->thread.thread);
|
CloseHandle(object->thread.thread);
|
||||||
|
@ -927,20 +951,20 @@ Sys_Thread_Free_Sig(system_thread_free){
|
||||||
}
|
}
|
||||||
|
|
||||||
internal
|
internal
|
||||||
Sys_Thread_Get_ID_Sig(system_thread_get_id){
|
system_thread_get_id_sig(){
|
||||||
DWORD result = GetCurrentThreadId();
|
DWORD result = GetCurrentThreadId();
|
||||||
return((i32)result);
|
return((i32)result);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal
|
internal
|
||||||
Sys_Mutex_Make_Sig(system_mutex_make){
|
system_mutex_make_sig(){
|
||||||
Win32_Object *object = win32_alloc_object(Win32ObjectKind_Mutex);
|
Win32_Object *object = win32_alloc_object(Win32ObjectKind_Mutex);
|
||||||
InitializeCriticalSection(&object->mutex);
|
InitializeCriticalSection(&object->mutex);
|
||||||
return(handle_type(object));
|
return(handle_type(object));
|
||||||
}
|
}
|
||||||
|
|
||||||
internal
|
internal
|
||||||
Sys_Mutex_Acquire_Sig(system_mutex_acquire){
|
system_mutex_acquire_sig(){
|
||||||
Win32_Object *object = (Win32_Object*)handle_type_ptr(mutex);
|
Win32_Object *object = (Win32_Object*)handle_type_ptr(mutex);
|
||||||
if (object->kind == Win32ObjectKind_Mutex){
|
if (object->kind == Win32ObjectKind_Mutex){
|
||||||
EnterCriticalSection(&object->mutex);
|
EnterCriticalSection(&object->mutex);
|
||||||
|
@ -948,7 +972,7 @@ Sys_Mutex_Acquire_Sig(system_mutex_acquire){
|
||||||
}
|
}
|
||||||
|
|
||||||
internal
|
internal
|
||||||
Sys_Mutex_Release_Sig(system_mutex_release){
|
system_mutex_release_sig(){
|
||||||
Win32_Object *object = (Win32_Object*)handle_type_ptr(mutex);
|
Win32_Object *object = (Win32_Object*)handle_type_ptr(mutex);
|
||||||
if (object->kind == Win32ObjectKind_Mutex){
|
if (object->kind == Win32ObjectKind_Mutex){
|
||||||
LeaveCriticalSection(&object->mutex);
|
LeaveCriticalSection(&object->mutex);
|
||||||
|
@ -956,7 +980,7 @@ Sys_Mutex_Release_Sig(system_mutex_release){
|
||||||
}
|
}
|
||||||
|
|
||||||
internal
|
internal
|
||||||
Sys_Mutex_Free_Sig(system_mutex_free){
|
system_mutex_free_sig(){
|
||||||
Win32_Object *object = (Win32_Object*)handle_type_ptr(mutex);
|
Win32_Object *object = (Win32_Object*)handle_type_ptr(mutex);
|
||||||
if (object->kind == Win32ObjectKind_Mutex){
|
if (object->kind == Win32ObjectKind_Mutex){
|
||||||
DeleteCriticalSection(&object->mutex);
|
DeleteCriticalSection(&object->mutex);
|
||||||
|
@ -965,14 +989,14 @@ Sys_Mutex_Free_Sig(system_mutex_free){
|
||||||
}
|
}
|
||||||
|
|
||||||
internal
|
internal
|
||||||
Sys_Condition_Variable_Make_Sig(system_condition_variable_make){
|
system_condition_variable_make_sig(){
|
||||||
Win32_Object *object = win32_alloc_object(Win32ObjectKind_CV);
|
Win32_Object *object = win32_alloc_object(Win32ObjectKind_CV);
|
||||||
InitializeConditionVariable(&object->cv);
|
InitializeConditionVariable(&object->cv);
|
||||||
return(handle_type(object));
|
return(handle_type(object));
|
||||||
}
|
}
|
||||||
|
|
||||||
internal
|
internal
|
||||||
Sys_Condition_Variable_Wait_Sig(system_condition_variable_wait){
|
system_condition_variable_wait_sig(){
|
||||||
Win32_Object *object_cv = (Win32_Object*)handle_type_ptr(cv);
|
Win32_Object *object_cv = (Win32_Object*)handle_type_ptr(cv);
|
||||||
Win32_Object *object_mutex = (Win32_Object*)handle_type_ptr(mutex);
|
Win32_Object *object_mutex = (Win32_Object*)handle_type_ptr(mutex);
|
||||||
if (object_cv->kind == Win32ObjectKind_CV &&
|
if (object_cv->kind == Win32ObjectKind_CV &&
|
||||||
|
@ -982,7 +1006,7 @@ Sys_Condition_Variable_Wait_Sig(system_condition_variable_wait){
|
||||||
}
|
}
|
||||||
|
|
||||||
internal
|
internal
|
||||||
Sys_Condition_Variable_Signal_Sig(system_condition_variable_signal){
|
system_condition_variable_signal_sig(){
|
||||||
Win32_Object *object = (Win32_Object*)handle_type_ptr(cv);
|
Win32_Object *object = (Win32_Object*)handle_type_ptr(cv);
|
||||||
if (object->kind == Win32ObjectKind_CV){
|
if (object->kind == Win32ObjectKind_CV){
|
||||||
WakeConditionVariable(&object->cv);
|
WakeConditionVariable(&object->cv);
|
||||||
|
@ -990,7 +1014,7 @@ Sys_Condition_Variable_Signal_Sig(system_condition_variable_signal){
|
||||||
}
|
}
|
||||||
|
|
||||||
internal
|
internal
|
||||||
Sys_Condition_Variable_Free_Sig(system_condition_variable_free){
|
system_condition_variable_free_sig(){
|
||||||
Win32_Object *object = (Win32_Object*)handle_type_ptr(cv);
|
Win32_Object *object = (Win32_Object*)handle_type_ptr(cv);
|
||||||
if (object->kind == Win32ObjectKind_CV){
|
if (object->kind == Win32ObjectKind_CV){
|
||||||
win32_free_object(object);
|
win32_free_object(object);
|
||||||
|
@ -1487,28 +1511,29 @@ win32_gl_create_window(HWND *wnd_out, HGLRC *context_out, DWORD style, RECT rect
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
|
||||||
#include "4ed_link_system_functions.cpp"
|
|
||||||
|
|
||||||
int CALL_CONVENTION
|
int CALL_CONVENTION
|
||||||
WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){
|
WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){
|
||||||
i32 argc = __argc;
|
i32 argc = __argc;
|
||||||
char **argv = __argv;
|
char **argv = __argv;
|
||||||
|
|
||||||
// NOTE(allen): link
|
|
||||||
sysfunc.font_make_face = ft__font_make_face;
|
|
||||||
sysfunc.get_texture = gl__get_texture;
|
|
||||||
sysfunc.fill_texture = gl__fill_texture;
|
|
||||||
link_system_code();
|
|
||||||
|
|
||||||
// NOTE(allen): memory
|
// NOTE(allen): memory
|
||||||
Thread_Context _tctx = {};
|
Thread_Context _tctx = {};
|
||||||
thread_ctx_init(&_tctx, get_base_allocator_system(&sysfunc));
|
thread_ctx_init(&_tctx, get_base_allocator_system());
|
||||||
|
|
||||||
block_zero_struct(&win32vars);
|
block_zero_struct(&win32vars);
|
||||||
win32vars.tctx = &_tctx;
|
win32vars.tctx = &_tctx;
|
||||||
|
|
||||||
|
API_VTable_system system_vtable = {};
|
||||||
|
system_api_fill_vtable(&system_vtable);
|
||||||
|
|
||||||
|
API_VTable_graphics graphics_vtable = {};
|
||||||
|
graphics_api_fill_vtable(&graphics_vtable);
|
||||||
|
|
||||||
|
API_VTable_font font_vtable = {};
|
||||||
|
font_api_fill_vtable(&font_vtable);
|
||||||
|
|
||||||
// TODO(allen): *arena;
|
// TODO(allen): *arena;
|
||||||
target.arena = make_arena_system(&sysfunc);
|
target.arena = make_arena_system();
|
||||||
|
|
||||||
win32vars.cursor_show = MouseCursorShow_Always;
|
win32vars.cursor_show = MouseCursorShow_Always;
|
||||||
win32vars.prev_cursor_show = MouseCursorShow_Always;
|
win32vars.prev_cursor_show = MouseCursorShow_Always;
|
||||||
|
@ -1537,9 +1562,9 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdS
|
||||||
App_Get_Functions *get_funcs = 0;
|
App_Get_Functions *get_funcs = 0;
|
||||||
Scratch_Block scratch(win32vars.tctx, Scratch_Share);
|
Scratch_Block scratch(win32vars.tctx, Scratch_Share);
|
||||||
Path_Search_List search_list = {};
|
Path_Search_List search_list = {};
|
||||||
search_list_add_system_path(&sysfunc, scratch, &search_list, SystemPath_Binary);
|
search_list_add_system_path(scratch, &search_list, SystemPath_Binary);
|
||||||
|
|
||||||
String_Const_u8 core_path = get_full_path(&sysfunc, scratch, &search_list, SCu8("4ed_app.dll"));
|
String_Const_u8 core_path = get_full_path(scratch, &search_list, SCu8("4ed_app.dll"));
|
||||||
if (system_load_library(scratch, core_path, &core_library)){
|
if (system_load_library(scratch, core_path, &core_library)){
|
||||||
get_funcs = (App_Get_Functions*)system_get_proc(core_library, "app_get_functions");
|
get_funcs = (App_Get_Functions*)system_get_proc(core_library, "app_get_functions");
|
||||||
if (get_funcs != 0){
|
if (get_funcs != 0){
|
||||||
|
@ -1555,18 +1580,21 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdS
|
||||||
system_error_box(scratch, msg);
|
system_error_box(scratch, msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
win32vars.log_string = app.get_logger(&sysfunc);
|
|
||||||
|
// NOTE(allen): send system vtable to core
|
||||||
|
app.load_vtables(&system_vtable, &font_vtable, &graphics_vtable);
|
||||||
|
win32vars.log_string = app.get_logger();
|
||||||
|
|
||||||
// NOTE(allen): init & command line parameters
|
// NOTE(allen): init & command line parameters
|
||||||
Plat_Settings plat_settings = {};
|
Plat_Settings plat_settings = {};
|
||||||
void *base_ptr = 0;
|
void *base_ptr = 0;
|
||||||
{
|
{
|
||||||
Scratch_Block scratch(win32vars.tctx, Scratch_Share);
|
Scratch_Block scratch(win32vars.tctx, Scratch_Share);
|
||||||
String_Const_u8 curdir = sysfunc.get_path(scratch, SystemPath_CurrentDirectory);
|
String_Const_u8 curdir = system_get_path(scratch, SystemPath_CurrentDirectory);
|
||||||
curdir = string_mod_replace_character(curdir, '\\', '/');
|
curdir = string_mod_replace_character(curdir, '\\', '/');
|
||||||
char **files = 0;
|
char **files = 0;
|
||||||
i32 *file_count = 0;
|
i32 *file_count = 0;
|
||||||
base_ptr = app.read_command_line(win32vars.tctx, &sysfunc, curdir, &plat_settings, &files, &file_count, argc, argv);
|
base_ptr = app.read_command_line(win32vars.tctx, curdir, &plat_settings, &files, &file_count, argc, argv);
|
||||||
{
|
{
|
||||||
i32 end = *file_count;
|
i32 end = *file_count;
|
||||||
i32 i = 0, j = 0;
|
i32 i = 0, j = 0;
|
||||||
|
@ -1591,8 +1619,8 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdS
|
||||||
Scratch_Block scratch(win32vars.tctx, Scratch_Share);
|
Scratch_Block scratch(win32vars.tctx, Scratch_Share);
|
||||||
String_Const_u8 default_file_name = string_u8_litexpr("custom_4coder.dll");
|
String_Const_u8 default_file_name = string_u8_litexpr("custom_4coder.dll");
|
||||||
Path_Search_List search_list = {};
|
Path_Search_List search_list = {};
|
||||||
search_list_add_system_path(&sysfunc, scratch, &search_list, SystemPath_CurrentDirectory);
|
search_list_add_system_path(scratch, &search_list, SystemPath_CurrentDirectory);
|
||||||
search_list_add_system_path(&sysfunc, scratch, &search_list, SystemPath_Binary);
|
search_list_add_system_path(scratch, &search_list, SystemPath_Binary);
|
||||||
String_Const_u8 custom_file_names[2] = {};
|
String_Const_u8 custom_file_names[2] = {};
|
||||||
i32 custom_file_count = 1;
|
i32 custom_file_count = 1;
|
||||||
if (plat_settings.custom_dll != 0){
|
if (plat_settings.custom_dll != 0){
|
||||||
|
@ -1607,7 +1635,7 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdS
|
||||||
}
|
}
|
||||||
String_Const_u8 custom_file_name = {};
|
String_Const_u8 custom_file_name = {};
|
||||||
for (i32 i = 0; i < custom_file_count; i += 1){
|
for (i32 i = 0; i < custom_file_count; i += 1){
|
||||||
custom_file_name = get_full_path(&sysfunc, scratch, &search_list, custom_file_names[i]);
|
custom_file_name = get_full_path(scratch, &search_list, custom_file_names[i]);
|
||||||
if (custom_file_name.size > 0){
|
if (custom_file_name.size > 0){
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1711,9 +1739,9 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdS
|
||||||
|
|
||||||
{
|
{
|
||||||
Scratch_Block scratch(win32vars.tctx, Scratch_Share);
|
Scratch_Block scratch(win32vars.tctx, Scratch_Share);
|
||||||
String_Const_u8 curdir = sysfunc.get_path(scratch, SystemPath_CurrentDirectory);
|
String_Const_u8 curdir = system_get_path(scratch, SystemPath_CurrentDirectory);
|
||||||
curdir = string_mod_replace_character(curdir, '\\', '/');
|
curdir = string_mod_replace_character(curdir, '\\', '/');
|
||||||
app.init(&sysfunc, &target, base_ptr, win32vars.clipboard_contents, curdir, custom);
|
app.init(&target, base_ptr, win32vars.clipboard_contents, curdir, custom);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -1917,7 +1945,7 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdS
|
||||||
// NOTE(allen): Application Core Update
|
// NOTE(allen): Application Core Update
|
||||||
Application_Step_Result result = {};
|
Application_Step_Result result = {};
|
||||||
if (app.step != 0){
|
if (app.step != 0){
|
||||||
result = app.step(&sysfunc, &target, base_ptr, &input);
|
result = app.step(&target, base_ptr, &input);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
//LOG("app.step == 0 -- skipping\n");
|
//LOG("app.step == 0 -- skipping\n");
|
||||||
|
|
|
@ -25,18 +25,18 @@ system_file_can_be_made(Arena *scratch, u8 *filename){
|
||||||
//
|
//
|
||||||
|
|
||||||
internal void*
|
internal void*
|
||||||
system_memory_allocate_extended(void *base, umem size){
|
win32_memory_allocate_extended(void *base, umem size){
|
||||||
void *result = VirtualAlloc(base, size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
|
void *result = VirtualAlloc(base, size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal
|
internal
|
||||||
Sys_Memory_Allocate_Sig(system_memory_allocate){
|
system_memory_allocate_sig(){
|
||||||
return(system_memory_allocate_extended(0, size));
|
return(win32_memory_allocate_extended(0, size));
|
||||||
}
|
}
|
||||||
|
|
||||||
internal
|
internal
|
||||||
Sys_Memory_Set_Protection_Sig(system_memory_set_protection){
|
system_memory_set_protection_sig(){
|
||||||
b32 result = false;
|
b32 result = false;
|
||||||
DWORD old_protect = 0;
|
DWORD old_protect = 0;
|
||||||
DWORD protect = 0;
|
DWORD protect = 0;
|
||||||
|
@ -57,7 +57,7 @@ Sys_Memory_Set_Protection_Sig(system_memory_set_protection){
|
||||||
}
|
}
|
||||||
|
|
||||||
internal
|
internal
|
||||||
Sys_Memory_Free_Sig(system_memory_free){
|
system_memory_free_sig(){
|
||||||
VirtualFree(ptr, 0, MEM_RELEASE);
|
VirtualFree(ptr, 0, MEM_RELEASE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -66,9 +66,9 @@ Sys_Memory_Free_Sig(system_memory_free){
|
||||||
//
|
//
|
||||||
|
|
||||||
internal
|
internal
|
||||||
Sys_Get_Path_Sig(system_get_path){
|
system_get_path_sig(){
|
||||||
String_Const_u8 result = {};
|
String_Const_u8 result = {};
|
||||||
switch (code){
|
switch (path_code){
|
||||||
case SystemPath_CurrentDirectory:
|
case SystemPath_CurrentDirectory:
|
||||||
{
|
{
|
||||||
DWORD size = GetCurrentDirectory_utf8(arena, 0, 0);
|
DWORD size = GetCurrentDirectory_utf8(arena, 0, 0);
|
||||||
|
@ -122,7 +122,7 @@ win32_remove_unc_prefix_characters(String_Const_u8 path){
|
||||||
}
|
}
|
||||||
|
|
||||||
internal
|
internal
|
||||||
Sys_Get_Canonical_Sig(system_get_canonical){
|
system_get_canonical_sig(){
|
||||||
String_Const_u8 result = {};
|
String_Const_u8 result = {};
|
||||||
if ((character_is_alpha(string_get_character(name, 0)) &&
|
if ((character_is_alpha(string_get_character(name, 0)) &&
|
||||||
string_get_character(name, 1) == ':') ||
|
string_get_character(name, 1) == ':') ||
|
||||||
|
@ -207,7 +207,7 @@ win32_file_attributes_from_HANDLE(HANDLE file){
|
||||||
}
|
}
|
||||||
|
|
||||||
internal
|
internal
|
||||||
Sys_Get_File_List_Sig(system_get_file_list){
|
system_get_file_list_sig(){
|
||||||
File_List result = {};
|
File_List result = {};
|
||||||
String_Const_u8 search_pattern = {};
|
String_Const_u8 search_pattern = {};
|
||||||
if (character_is_slash(string_get_character(directory, directory.size - 1))){
|
if (character_is_slash(string_get_character(directory, directory.size - 1))){
|
||||||
|
@ -262,7 +262,7 @@ Sys_Get_File_List_Sig(system_get_file_list){
|
||||||
}
|
}
|
||||||
|
|
||||||
internal
|
internal
|
||||||
Sys_Quick_File_Attributes_Sig(system_quick_file_attributes){
|
system_quick_file_attributes_sig(){
|
||||||
WIN32_FILE_ATTRIBUTE_DATA info = {};
|
WIN32_FILE_ATTRIBUTE_DATA info = {};
|
||||||
File_Attributes result = {};
|
File_Attributes result = {};
|
||||||
if (GetFileAttributesEx_utf8String(scratch, file_name, GetFileExInfoStandard, &info)){
|
if (GetFileAttributesEx_utf8String(scratch, file_name, GetFileExInfoStandard, &info)){
|
||||||
|
@ -274,24 +274,24 @@ Sys_Quick_File_Attributes_Sig(system_quick_file_attributes){
|
||||||
}
|
}
|
||||||
|
|
||||||
internal
|
internal
|
||||||
Sys_Load_Handle_Sig(system_load_handle){
|
system_load_handle_sig(){
|
||||||
b32 result = false;
|
b32 result = false;
|
||||||
HANDLE file = CreateFile_utf8(scratch, (u8*)filename, GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
|
HANDLE file = CreateFile_utf8(scratch, (u8*)file_name, GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
|
||||||
if (file != INVALID_HANDLE_VALUE){
|
if (file != INVALID_HANDLE_VALUE){
|
||||||
*(HANDLE*)handle_out = file;
|
*(HANDLE*)out = file;
|
||||||
result = true;
|
result = true;
|
||||||
}
|
}
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal
|
internal
|
||||||
Sys_Load_Attributes_Sig(system_load_attributes){
|
system_load_attributes_sig(){
|
||||||
HANDLE file = *(HANDLE*)(&handle);
|
HANDLE file = *(HANDLE*)(&handle);
|
||||||
return(win32_file_attributes_from_HANDLE(file));
|
return(win32_file_attributes_from_HANDLE(file));
|
||||||
}
|
}
|
||||||
|
|
||||||
internal
|
internal
|
||||||
Sys_Load_File_Sig(system_load_file){
|
system_load_file_sig(){
|
||||||
HANDLE file = *(HANDLE*)(&handle);
|
HANDLE file = *(HANDLE*)(&handle);
|
||||||
DWORD read_size = 0;
|
DWORD read_size = 0;
|
||||||
b32 result = false;
|
b32 result = false;
|
||||||
|
@ -304,7 +304,7 @@ Sys_Load_File_Sig(system_load_file){
|
||||||
}
|
}
|
||||||
|
|
||||||
internal
|
internal
|
||||||
Sys_Load_Close_Sig(system_load_close){
|
system_load_close_sig(){
|
||||||
b32 result = false;
|
b32 result = false;
|
||||||
HANDLE file = *(HANDLE*)(&handle);
|
HANDLE file = *(HANDLE*)(&handle);
|
||||||
if (CloseHandle(file)){
|
if (CloseHandle(file)){
|
||||||
|
@ -314,10 +314,10 @@ Sys_Load_Close_Sig(system_load_close){
|
||||||
}
|
}
|
||||||
|
|
||||||
internal
|
internal
|
||||||
Sys_Save_File_Sig(system_save_file){
|
system_save_file_sig(){
|
||||||
File_Attributes result = {};
|
File_Attributes result = {};
|
||||||
|
|
||||||
HANDLE file = CreateFile_utf8(scratch, (u8*)filename, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
|
HANDLE file = CreateFile_utf8(scratch, (u8*)file_name, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
|
||||||
|
|
||||||
if (file != INVALID_HANDLE_VALUE){
|
if (file != INVALID_HANDLE_VALUE){
|
||||||
u64 written_total = 0;
|
u64 written_total = 0;
|
||||||
|
@ -364,9 +364,6 @@ int_color_from_colorref(COLORREF ref, int_color alpha_from){
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void
|
|
||||||
system_schedule_step(u32 code);
|
|
||||||
|
|
||||||
internal UINT_PTR CALLBACK
|
internal UINT_PTR CALLBACK
|
||||||
color_picker_hook(HWND Window, UINT Message, WPARAM WParam, LPARAM LParam){
|
color_picker_hook(HWND Window, UINT Message, WPARAM WParam, LPARAM LParam){
|
||||||
UINT_PTR result = 0;
|
UINT_PTR result = 0;
|
||||||
|
@ -410,7 +407,7 @@ color_picker_hook(HWND Window, UINT Message, WPARAM WParam, LPARAM LParam){
|
||||||
if(*picker->dest != new_color)
|
if(*picker->dest != new_color)
|
||||||
{
|
{
|
||||||
*picker->dest = new_color;
|
*picker->dest = new_color;
|
||||||
system_schedule_step(0);
|
system_signal_step(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -475,12 +472,12 @@ color_picker_thread(LPVOID Param)
|
||||||
}
|
}
|
||||||
|
|
||||||
internal
|
internal
|
||||||
Sys_Open_Color_Picker_Sig(system_open_color_picker){
|
system_open_color_picker_sig(){
|
||||||
// TODO(allen): review
|
// TODO(allen): review
|
||||||
// NOTE(casey): Because this is going to be used by a semi-permanent thread, we need to copy
|
// NOTE(casey): Because this is going to be used by a semi-permanent thread, we need to
|
||||||
// it to system memory where it can live as long as it wants, no matter what we do over here
|
// copy it to system memory where it can live as long as it wants, no matter what we do
|
||||||
// on the 4coder threads.
|
// over here on the 4coder threads.
|
||||||
Color_Picker *perm = (Color_Picker*)system_memory_allocate_extended(0, sizeof(Color_Picker));
|
Color_Picker *perm = (Color_Picker*)system_memory_allocate(sizeof(Color_Picker));
|
||||||
*perm = *picker;
|
*perm = *picker;
|
||||||
|
|
||||||
HANDLE ThreadHandle = CreateThread(0, 0, color_picker_thread, perm, 0, 0);
|
HANDLE ThreadHandle = CreateThread(0, 0, color_picker_thread, perm, 0, 0);
|
||||||
|
@ -488,7 +485,7 @@ Sys_Open_Color_Picker_Sig(system_open_color_picker){
|
||||||
}
|
}
|
||||||
|
|
||||||
internal
|
internal
|
||||||
Sys_Get_Screen_Scale_Factor_Sig(system_get_screen_scale_factor){
|
system_get_screen_scale_factor_sig(){
|
||||||
return(win32vars.screen_scale_factor);
|
return(win32vars.screen_scale_factor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue