From 6cc2182f4218a02a9b0b1f60c8e48b922fec00cc Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Fri, 23 Jun 2017 19:07:18 -0400 Subject: [PATCH] 4.0.21 pretty much ready to go barring any bug discoveries, (need to add README.txt LICENSE.txt and new features list in messages, and setup new casey customization file) --- 4coder_API/types.h | 8 ++- 4coder_default_framework.h | 65 ++++++++++++++++++--- 4coder_default_hooks.cpp | 6 +- 4coder_helper/4coder_bind_helper.h | 10 ++++ 4coder_helper/4coder_helper.h | 15 ++++- 4ed.cpp | 92 ++++++++---------------------- 4ed_app_models.h | 7 ++- 4ed_app_target.cpp | 2 +- 4ed_file_view.cpp | 15 +++-- 9 files changed, 130 insertions(+), 90 deletions(-) diff --git a/4coder_API/types.h b/4coder_API/types.h index f4d88798..c91cbd77 100644 --- a/4coder_API/types.h +++ b/4coder_API/types.h @@ -790,8 +790,6 @@ STRUCT User_Input{ /* DOC(Hook_IDs name the various hooks into 4coder, these hooks use the Hook_Function signature.) DOC_SEE(Hook_Function) */ ENUM(int32_t, Hook_ID){ - /* DOC(TODO) */ - hook_start, /* DOC(TODO) */ hook_file_out_of_sync, /* DOC(TODO) */ @@ -818,6 +816,8 @@ ENUM(int32_t, Special_Hook_ID){ special_hook_command_caller, /* DOC(TODO) */ special_hook_input_filter, + /* DOC(TODO) */ + special_hook_start, }; TYPEDEF_FUNC int32_t Command_Caller_Hook_Function(struct Application_Links *app, Generic_Command cmd); @@ -836,6 +836,10 @@ TYPEDEF_FUNC int32_t Scroll_Rule_Function(float target_x, float target_y, float #define SCROLL_RULE_SIG(name) \ int32_t name(float target_x, float target_y, float *scroll_x, float *scroll_y, int32_t view_id, int32_t is_new_target, float dt) +TYPEDEF_FUNC int32_t Start_Hook_Function(struct Application_Links *app, char **files, int32_t file_count, char **flags, int32_t flag_count); +#define START_HOOK_SIG(name) \ +int32_t name(struct Application_Links *app, char **files, int32_t file_count, char **flags, int32_t flag_count) + TYPEDEF_FUNC int32_t Get_Binding_Data_Function(void *data, int32_t size); #define GET_BINDING_DATA(name) int32_t name(void *data, int32_t size) diff --git a/4coder_default_framework.h b/4coder_default_framework.h index c1aa331d..cd4f433b 100644 --- a/4coder_default_framework.h +++ b/4coder_default_framework.h @@ -1023,23 +1023,74 @@ default_4coder_initialize(Application_Links *app){ } static void -default_4coder_side_by_side_panels(Application_Links *app){ +default_4coder_side_by_side_panels(Application_Links *app, Buffer_Identifier left_buffer, Buffer_Identifier right_buffer){ + Buffer_ID left_id = buffer_identifier_to_id(app, left_buffer); + Buffer_ID right_id = buffer_identifier_to_id(app, right_buffer); + + // Left Panel View_Summary view = get_active_view(app, AccessAll); new_view_settings(app, &view); + view_set_buffer(app, &view, left_id, 0); + + // Right Panel open_panel_vsplit(app); + View_Summary right_view = get_active_view(app, AccessAll); + view_set_buffer(app, &right_view, right_id, 0); + + // Restore Active to Left set_active_view(app, &view); } static void -default_4coder_one_panel(Application_Links *app){ - View_Summary view = get_active_view(app, AccessAll); - new_view_settings(app, &view); +default_4coder_side_by_side_panels(Application_Links *app, char **command_line_files, int32_t file_count){ + Buffer_Identifier left = buffer_identifier(literal("*scratch*")); + Buffer_Identifier right = buffer_identifier(literal("*messages*")); + + if (file_count > 0){ + char *name = command_line_files[0]; + int32_t len = str_size(name); + left = buffer_identifier(name, len); + + if (file_count > 1){ + char *name = command_line_files[1]; + int32_t len = str_size(name); + right = buffer_identifier(name, len); + } + } + + default_4coder_side_by_side_panels(app, left, right); } static void -default_4coder_full_width_bottom_side_by_side_panels(Application_Links *app){ - open_special_note_view(app); - default_4coder_side_by_side_panels(app); +default_4coder_side_by_side_panels(Application_Links *app){ + default_4coder_side_by_side_panels(app, 0, 0); +} + +static void +default_4coder_one_panel(Application_Links *app, Buffer_Identifier buffer){ + Buffer_ID id = buffer_identifier_to_id(app, buffer); + + View_Summary view = get_active_view(app, AccessAll); + new_view_settings(app, &view); + view_set_buffer(app, &view, id, 0); +} + +static void +default_4coder_one_panel(Application_Links *app, char **command_line_files, int32_t file_count){ + Buffer_Identifier buffer = buffer_identifier(literal("*messages*")); + + if (file_count > 0){ + char *name = command_line_files[0]; + int32_t len = str_size(name); + buffer = buffer_identifier(name, len); + } + + default_4coder_one_panel(app, buffer); +} + +static void +default_4coder_one_panel(Application_Links *app){ + default_4coder_one_panel(app, 0, 0); } #endif diff --git a/4coder_default_hooks.cpp b/4coder_default_hooks.cpp index 7e3006c1..d822236d 100644 --- a/4coder_default_hooks.cpp +++ b/4coder_default_hooks.cpp @@ -18,9 +18,9 @@ TYPE: 'internal-for-default-system' #include "languages/4coder_language_cs.h" #include "languages/4coder_language_java.h" -HOOK_SIG(default_start){ +START_HOOK_SIG(default_start){ default_4coder_initialize(app); - default_4coder_side_by_side_panels(app); + default_4coder_side_by_side_panels(app, files, file_count); if (automatically_load_project){ load_project(app); @@ -321,10 +321,10 @@ SCROLL_RULE_SIG(smooth_scroll_rule){ static void set_all_default_hooks(Bind_Helper *context){ - set_hook(context, hook_start, default_start); set_hook(context, hook_exit, default_exit); set_hook(context, hook_view_size_change, default_view_adjust); + set_start_hook(context, default_start); set_open_file_hook(context, default_file_settings); set_new_file_hook(context, default_new_file); set_save_file_hook(context, default_file_save); diff --git a/4coder_helper/4coder_bind_helper.h b/4coder_helper/4coder_bind_helper.h index 20876203..76b3d24a 100644 --- a/4coder_helper/4coder_bind_helper.h +++ b/4coder_helper/4coder_bind_helper.h @@ -175,6 +175,16 @@ set_new_file_hook(Bind_Helper *helper, Open_File_Hook_Function *func){ write_unit(helper, unit); } +inline void +set_start_hook(Bind_Helper *helper, Start_Hook_Function *func){ + Binding_Unit unit; + unit.type = unit_hook; + unit.hook.hook_id = special_hook_start; + unit.hook.func = (void*) func; + + write_unit(helper, unit); +} + inline void set_open_file_hook(Bind_Helper *helper, Open_File_Hook_Function *func){ Binding_Unit unit; diff --git a/4coder_helper/4coder_helper.h b/4coder_helper/4coder_helper.h index d64ff46d..00dfde2b 100644 --- a/4coder_helper/4coder_helper.h +++ b/4coder_helper/4coder_helper.h @@ -170,7 +170,7 @@ buffer_identifier(char *str, int32_t len){ } static Buffer_Identifier -buffer_identifier(int32_t id){ +buffer_identifier(Buffer_ID id){ Buffer_Identifier identifier; identifier.name = 0; identifier.name_len = 0; @@ -178,6 +178,19 @@ buffer_identifier(int32_t id){ return(identifier); } +static Buffer_ID +buffer_identifier_to_id(Application_Links *app, Buffer_Identifier identifier){ + Buffer_ID id = 0; + if (identifier.id != 0){ + id = identifier.id; + } + else{ + Buffer_Summary buffer = get_buffer_by_name(app, identifier.name, identifier.name_len, AccessAll); + id = buffer.buffer_id; + } + return(id); +} + static Buffer_Summary create_buffer(Application_Links *app, char *filename, int32_t filename_len, Buffer_Create_Flag flags){ Buffer_Summary buffer = {0}; diff --git a/4ed.cpp b/4ed.cpp index 2da9bc6e..3cf09e17 100644 --- a/4ed.cpp +++ b/4ed.cpp @@ -657,7 +657,7 @@ enum Command_Line_Mode{ CLMode_Custom }; -void +internal void init_command_line_settings(App_Settings *settings, Plat_Settings *plat_settings, Command_Line_Parameters clparams){ char *arg = 0; Command_Line_Mode mode = CLMode_App; @@ -677,8 +677,6 @@ init_command_line_settings(App_Settings *settings, Plat_Settings *plat_settings, char *long_arg_name = arg+2; if (match_cc(long_arg_name, "custom")){ mode = CLMode_Custom; - settings->custom_arg_start = i+1; - settings->custom_arg_end = i+1; continue; } } @@ -819,7 +817,10 @@ init_command_line_settings(App_Settings *settings, Plat_Settings *plat_settings, case CLMode_Custom: { - settings->custom_arg_end = i+1; + settings->custom_flags = clparams.argv + i; + settings->custom_flags_count = clparams.argc - i; + i = clparams.argc; + mode = CLMode_App; }break; } } @@ -1118,6 +1119,11 @@ App_Init_Sig(app_init){ { models->input_filter = (Input_Filter_Function*)unit->hook.func; }break; + + case special_hook_start: + { + models->hook_start = (Start_Hook_Function*)unit->hook.func; + }break; } } } @@ -1491,51 +1497,15 @@ App_Step_Sig(app_step){ cmd->key = null_key_event_data; if (input->first_step){ - -#if 0 - { - View *view = 0; - View_Persistent *persistent = 0; - i32 i = 0; - i32 max = 0; - - max = vars->live_set.max; - view = vars->live_set.views; - for (i = 1; i <= max; ++i, ++view){ - persistent = &view->persistent; - - persistent->coroutine = - system->create_coroutine(view_caller); - - persistent->coroutine = - app_launch_coroutine(system, &models->app_links, Co_View, - persistent->coroutine, view, 0); - - if (!persistent->coroutine){ - // TODO(allen): Error message and recover - NotImplemented; - } - } - } -#endif - - if (models->hooks[hook_start]){ - models->hooks[hook_start](&models->app_links); - } - + // Open command line files. char space[512]; String cl_filename = make_fixed_width_string(space); copy_ss(&cl_filename, models->hot_directory.string); - i32 cl_filename_len = cl_filename.size; - - i32 i = 0; - Panel *panel = models->layout.used_sentinel.next; - for (; i < models->settings.init_files_count; ++i, panel = panel->next){ + for (i32 i = 0; i < models->settings.init_files_count; ++i){ cl_filename.size = cl_filename_len; String filename = {0}; - Editing_File_Canon_Name canon_name; if (get_canon_name(system, &canon_name, make_string_slowly(models->settings.init_files[i]))){ filename = canon_name.name; @@ -1545,35 +1515,21 @@ App_Step_Sig(app_step){ filename = cl_filename; } - if (i < models->layout.panel_count){ - view_open_file(system, models, panel->view, filename); - view_show_file(panel->view); - Assert("Earlier" && panel->view->file_data.file != 0); -#if 0 - if (i == 0){ - if (panel->view->file_data.file){ - // TODO(allen): How to set the cursor of a file on the first frame? - view_compute_cursor_from_line_pos(panel->view, models->settings.initial_line, 1); - view_move_view_to_cursor(panel->view, &panel->view->recent.scroll); - } - } -#endif - } - else{ - view_open_file(system, models, 0, filename); - } + open_file(system, models, filename); + } + + if (models->hook_start != 0){ + char **files = models->settings.init_files; + i32 files_count = models->settings.init_files_count; + char **flags = models->settings.custom_flags; + i32 flags_count = models->settings.custom_flags_count; + + models->hook_start(&models->app_links, files, files_count, flags, flags_count); } - if (i < models->layout.panel_count){ - view_set_file(system, panel->view, models->message_buffer, models); - view_show_file(panel->view); - ++i; - panel = panel->next; - } - - panel = models->layout.used_sentinel.next; - for (i = 0; i < models->settings.init_files_count; ++i, panel = panel->next){ + Panel *panel = models->layout.used_sentinel.next; + for (i32 i = 0; i < models->settings.init_files_count; ++i, panel = panel->next){ Assert(panel->view->file_data.file != 0); } } diff --git a/4ed_app_models.h b/4ed_app_models.h index ec9b3e5a..6a69e79c 100644 --- a/4ed_app_models.h +++ b/4ed_app_models.h @@ -14,15 +14,15 @@ struct App_Settings{ i32 init_files_count; i32 init_files_max; + char **custom_flags; + i32 custom_flags_count; + i32 initial_line; b32 lctrl_lalt_is_altgr; char *custom_font_file; char *custom_font_name; i32 custom_font_size; - - i32 custom_arg_start; - i32 custom_arg_end; }; global_const App_Settings null_app_settings = {0}; @@ -65,6 +65,7 @@ struct Models{ Custom_API config_api; + Start_Hook_Function *hook_start; Open_File_Hook_Function *hook_open_file; Open_File_Hook_Function *hook_new_file; Open_File_Hook_Function *hook_save_file; diff --git a/4ed_app_target.cpp b/4ed_app_target.cpp index 6480ae19..2fc9a616 100644 --- a/4ed_app_target.cpp +++ b/4ed_app_target.cpp @@ -24,7 +24,7 @@ // TODO(allen): set in compilation line #define PREFERRED_ALIGNMENT 8 -#define USE_DEBUG_MEMORY +//#define USE_DEBUG_MEMORY #define FSTRING_IMPLEMENTATION #define FSTRING_C diff --git a/4ed_file_view.cpp b/4ed_file_view.cpp index e40e1755..8f850eb8 100644 --- a/4ed_file_view.cpp +++ b/4ed_file_view.cpp @@ -260,7 +260,7 @@ get_view_size(){ return(sizeof(View) - sizeof(View_Persistent)); } -// TODO(past-allen): Switch over to using an i32 for these. +// TODO(allen): Switch over to using an i32 for these. inline f32 view_width(View *view){ i32_Rect file_rect = view->file_region; @@ -1788,7 +1788,7 @@ file_measure_wraps(System_Functions *system, Models *models, Editing_File *file, } if (!emit_comment_position){ - step = wrap_state_consume_token(system, font, &wrap_state, next_line_start-1); + step = wrap_state_consume_token(system, font, &wrap_state, next_line_start); } b32 need_to_choose_a_wrap = 0; @@ -3885,8 +3885,8 @@ init_read_only_file(System_Functions *system, Models *models, Editing_File *file } } -internal void -view_open_file(System_Functions *system, Models *models, View *view, String filename){ +internal Editing_File* +open_file(System_Functions *system, Models *models, String filename){ Working_Set *working_set = &models->working_set; Editing_File *file = 0; @@ -3896,7 +3896,6 @@ view_open_file(System_Functions *system, Models *models, View *view, String file file = working_set_canon_contains(working_set, canon_name.name); if (!file){ - Plat_Handle handle; if (system->load_handle(canon_name.name.str, &handle)){ Mem_Options *mem = &models->mem; @@ -3939,6 +3938,12 @@ view_open_file(System_Functions *system, Models *models, View *view, String file } } + return(file); +} + +internal void +view_open_file(System_Functions *system, Models *models, View *view, String filename){ + Editing_File *file = open_file(system, models, filename); if (file){ view_set_file(system, view, file, models); }