From 7f05551216924ead0c2f1cc8ed25fdd3e246b9f7 Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Thu, 23 Jun 2016 19:11:09 -0400 Subject: [PATCH] 4.0.8 almost ready to go --- 4coder_custom.h | 113 +++++++------ 4coder_custom_api.h | 26 +-- 4coder_default_bindings.cpp | 11 +- 4coder_default_include.cpp | 8 +- 4coder_gui.h | 10 +- 4coder_helper.h | 36 ++++- 4ed.cpp | 39 +++-- 4ed_api_implementation.cpp | 293 +++++++++++++++++++++------------ 4ed_app_models.h | 6 +- 4ed_file.cpp | 46 +----- 4ed_file_view.cpp | 145 +++++++++-------- 4ed_gui.cpp | 37 ++--- 4ed_math.cpp | 19 +++ 4ed_mem.cpp | 10 ++ 4ed_meta.h | 3 +- README.txt | 2 +- SUPERREADME.txt | 2 +- build_all.bat | 2 +- custom_api_spec.cpp | 19 +-- power/4coder_casey.cpp | 19 ++- power/4coder_chronal.cpp | 304 ----------------------------------- power/4coder_experiments.cpp | 2 +- win32_4ed.cpp | 54 +++++-- 23 files changed, 513 insertions(+), 693 deletions(-) delete mode 100644 power/4coder_chronal.cpp diff --git a/4coder_custom.h b/4coder_custom.h index 30b22a07..8521b043 100644 --- a/4coder_custom.h +++ b/4coder_custom.h @@ -162,30 +162,10 @@ enum Command_ID{ cmdid_count }; -enum{ - CLI_OverlapWithConflict = 0x1, - CLI_AlwaysBindToView = 0x2, - CLI_CursorAtEnd = 0x4, -}; - -enum{ - BufferSetting_Null, - BufferSetting_Lex, - BufferSetting_WrapLine, - BufferSetting_MapID, -}; - -enum{ - AutoTab_ClearLine = 0x1, - AutoTab_UseTab = 0x2 -}; - // These are regular hooks, any of them can be set to any function // that matches the HOOK_SIG pattern. enum Hook_ID{ hook_start, - hook_open_file, - hook_new_file, hook_file_out_of_sync, // never below this hook_type_count @@ -195,6 +175,8 @@ enum Hook_ID{ // that do not necessarily have access to the app pointer. enum Special_Hook_ID{ _hook_scroll_rule = hook_type_count, + _hook_new_file, + _hook_open_file, }; // None of the members of *_Summary structs nor any of the data pointed @@ -245,11 +227,6 @@ view_summary_zero(){ return(summary); } -enum User_Input_Type{ - UserInputNone, - UserInputKey, - UserInputMouse -}; struct User_Input{ int type; int abort; @@ -267,12 +244,6 @@ struct Query_Bar{ String string; }; -enum Event_Message_Type{ - EM_No_Message, - EM_Open_View, - EM_Frame, - EM_Close_View -}; struct Event_Message{ int type; }; @@ -282,18 +253,73 @@ struct Theme_Color{ unsigned int color; }; -enum Access_Types{ +// Flags and enum values +// TODO(allen): auto generate this and the docs for it +enum User_Input_Type_ID{ + UserInputNone, + UserInputKey, + UserInputMouse +}; + +enum Event_Message_Type_ID{ + EventMessage_NoMessage, + EventMessage_OpenView, + EventMessage_Frame, + EventMessage_CloseView +}; + +enum Buffer_Setting_ID{ + BufferSetting_Null, + BufferSetting_Lex, + BufferSetting_WrapLine, + BufferSetting_MapID, +}; + +enum Access_Flag{ AccessOpen = 0x0, AccessProtected = 0x1, AccessHidden = 0x2, AccessAll = 0xFF }; +enum Seek_Boundry_Flag{ + BoundryWhitespace = 0x1, + BoundryToken = 0x2, + BoundryAlphanumeric = 0x4, + BoundryCamelCase = 0x8 +}; + +enum Command_Line_Input_Flag{ + CLI_OverlapWithConflict = 0x1, + CLI_AlwaysBindToView = 0x2, + CLI_CursorAtEnd = 0x4, +}; + +enum Auto_Tab_Flag{ + AutoTab_ClearLine = 0x1, + AutoTab_UseTab = 0x2 +}; + +enum Input_Type_Flag{ + EventOnAnyKey = 0x1, + EventOnEsc = 0x2, + EventOnLeftButton = 0x4, + EventOnRightButton = 0x8, + EventOnWheel = 0x10, + EventOnButton = (EventOnLeftButton | EventOnRightButton | EventOnWheel), + + // NOTE(allen): These don't work so much, so let's pretend they're not here for now. + EventOnMouseMove = 0x20, + EventOnMouse = (EventOnButton | EventOnMouseMove), + + EventAll = 0xFF +}; #define VIEW_ROUTINE_SIG(name) void name(struct Application_Links *app, int view_id) #define GET_BINDING_DATA(name) int name(void *data, int size) #define CUSTOM_COMMAND_SIG(name) void name(struct Application_Links *app) #define HOOK_SIG(name) int name(struct Application_Links *app) +#define OPEN_FILE_HOOK_SIG(name) int name(struct Application_Links *app, int buffer_id) #define SCROLL_RULE_SIG(name) int name(float target_x, float target_y, float *scroll_x, float *scroll_y, int view_id, int is_new_target, float dt) extern "C"{ @@ -301,6 +327,8 @@ extern "C"{ typedef CUSTOM_COMMAND_SIG(Custom_Command_Function); typedef GET_BINDING_DATA(Get_Binding_Data_Function); typedef HOOK_SIG(Hook_Function); + + typedef OPEN_FILE_HOOK_SIG(Open_File_Hook_Function); typedef SCROLL_RULE_SIG(Scroll_Rule_Function); } @@ -308,27 +336,6 @@ struct Application_Links; #include "4coder_custom_api.h" -// Boundry type flags -#define BoundryWhitespace 0x1 -#define BoundryToken 0x2 -#define BoundryAlphanumeric 0x4 -#define BoundryCamelCase 0x8 - - - -// Input type flags -#define EventOnAnyKey 0x1 -#define EventOnEsc 0x2 -#define EventOnLeftButton 0x4 -#define EventOnRightButton 0x8 -#define EventOnWheel 0x10 -#define EventOnButton (EventOnLeftButton | EventOnRightButton | EventOnWheel) - -// NOTE(allen): These don't work so much, so let's pretend they're not here for now. -#define EventOnMouseMove 0x20 -#define EventOnMouse (EventOnButton | EventOnMouseMove) - - #define _GET_VERSION_SIG(n) int n(int maj, int min, int patch) typedef _GET_VERSION_SIG(_Get_Version_Function); diff --git a/4coder_custom_api.h b/4coder_custom_api.h index 51eead1a..438dc5ff 100644 --- a/4coder_custom_api.h +++ b/4coder_custom_api.h @@ -6,17 +6,15 @@ #define DIRECTORY_CD_SIG(n) int n(Application_Links *app, char *dir, int *len, int capacity, char *rel_path, int rel_len) #define GET_FILE_LIST_SIG(n) File_List n(Application_Links *app, char *dir, int len) #define FREE_FILE_LIST_SIG(n) void n(Application_Links *app, File_List list) -#define CLIPBOARD_POST_SIG(n) int n(Application_Links *app, char *str, int len) +#define CLIPBOARD_POST_SIG(n) void n(Application_Links *app, char *str, int len) #define CLIPBOARD_COUNT_SIG(n) int n(Application_Links *app) #define CLIPBOARD_INDEX_SIG(n) int n(Application_Links *app, int index, char *out, int len) #define GET_BUFFER_FIRST_SIG(n) Buffer_Summary n(Application_Links *app, unsigned int access) #define GET_BUFFER_NEXT_SIG(n) void n(Application_Links *app, Buffer_Summary *buffer, unsigned int access) -#define GET_BUFFER_SIG(n) Buffer_Summary n(Application_Links *app, int index, unsigned int access) -#define GET_PARAMETER_BUFFER_SIG(n) Buffer_Summary n(Application_Links *app, int param_index, unsigned int access) -#define GET_BUFFER_BY_NAME_SIG(n) Buffer_Summary n(Application_Links *app, char *filename, int len, unsigned int access) -#define REFRESH_BUFFER_SIG(n) int n(Application_Links *app, Buffer_Summary *buffer) -#define BUFFER_READ_RANGE_SIG(n) int n(Application_Links *app, Buffer_Summary *buffer, int start, int end, char *out) +#define GET_BUFFER_SIG(n) Buffer_Summary n(Application_Links *app, int buffer_id, unsigned int access) +#define GET_BUFFER_BY_NAME_SIG(n) Buffer_Summary n(Application_Links *app, char *name, int len, unsigned int access) #define BUFFER_SEEK_SIG(n) int n(Application_Links *app, Buffer_Summary *buffer, int start_pos, int seek_forward, unsigned int flags) +#define BUFFER_READ_RANGE_SIG(n) int n(Application_Links *app, Buffer_Summary *buffer, int start, int end, char *out) #define BUFFER_REPLACE_RANGE_SIG(n) int n(Application_Links *app, Buffer_Summary *buffer, int start, int end, char *str, int len) #define BUFFER_SET_SETTING_SIG(n) int n(Application_Links *app, Buffer_Summary *buffer, int setting, int value) #define CREATE_BUFFER_SIG(n) Buffer_Summary n(Application_Links *app, char *filename, int filename_len, int do_in_background) @@ -26,7 +24,6 @@ #define GET_VIEW_NEXT_SIG(n) void n(Application_Links *app, View_Summary *view, unsigned int access) #define GET_VIEW_SIG(n) View_Summary n(Application_Links *app, int index, unsigned int access) #define GET_ACTIVE_VIEW_SIG(n) View_Summary n(Application_Links *app, unsigned int access) -#define REFRESH_VIEW_SIG(n) int n(Application_Links *app, View_Summary *view) #define VIEW_AUTO_TAB_SIG(n) int n(Application_Links *app, View_Summary *view, int start, int end, int tab_width, unsigned int flags) #define VIEW_COMPUTE_CURSOR_SIG(n) Full_Cursor n(Application_Links *app, View_Summary *view, Buffer_Seek seek) #define VIEW_SET_CURSOR_SIG(n) int n(Application_Links *app, View_Summary *view, Buffer_Seek seek, int set_preferred_x) @@ -62,11 +59,9 @@ extern "C"{ typedef GET_BUFFER_FIRST_SIG(Get_Buffer_First_Function); typedef GET_BUFFER_NEXT_SIG(Get_Buffer_Next_Function); typedef GET_BUFFER_SIG(Get_Buffer_Function); - typedef GET_PARAMETER_BUFFER_SIG(Get_Parameter_Buffer_Function); typedef GET_BUFFER_BY_NAME_SIG(Get_Buffer_By_Name_Function); - typedef REFRESH_BUFFER_SIG(Refresh_Buffer_Function); - typedef BUFFER_READ_RANGE_SIG(Buffer_Read_Range_Function); typedef BUFFER_SEEK_SIG(Buffer_Seek_Function); + typedef BUFFER_READ_RANGE_SIG(Buffer_Read_Range_Function); typedef BUFFER_REPLACE_RANGE_SIG(Buffer_Replace_Range_Function); typedef BUFFER_SET_SETTING_SIG(Buffer_Set_Setting_Function); typedef CREATE_BUFFER_SIG(Create_Buffer_Function); @@ -76,7 +71,6 @@ extern "C"{ typedef GET_VIEW_NEXT_SIG(Get_View_Next_Function); typedef GET_VIEW_SIG(Get_View_Function); typedef GET_ACTIVE_VIEW_SIG(Get_Active_View_Function); - typedef REFRESH_VIEW_SIG(Refresh_View_Function); typedef VIEW_AUTO_TAB_SIG(View_Auto_Tab_Function); typedef VIEW_COMPUTE_CURSOR_SIG(View_Compute_Cursor_Function); typedef VIEW_SET_CURSOR_SIG(View_Set_Cursor_Function); @@ -115,11 +109,9 @@ struct Application_Links{ Get_Buffer_First_Function *get_buffer_first; Get_Buffer_Next_Function *get_buffer_next; Get_Buffer_Function *get_buffer; - Get_Parameter_Buffer_Function *get_parameter_buffer; Get_Buffer_By_Name_Function *get_buffer_by_name; - Refresh_Buffer_Function *refresh_buffer; - Buffer_Read_Range_Function *buffer_read_range; Buffer_Seek_Function *buffer_seek; + Buffer_Read_Range_Function *buffer_read_range; Buffer_Replace_Range_Function *buffer_replace_range; Buffer_Set_Setting_Function *buffer_set_setting; Create_Buffer_Function *create_buffer; @@ -129,7 +121,6 @@ struct Application_Links{ Get_View_Next_Function *get_view_next; Get_View_Function *get_view; Get_Active_View_Function *get_active_view; - Refresh_View_Function *refresh_view; View_Auto_Tab_Function *view_auto_tab; View_Compute_Cursor_Function *view_compute_cursor; View_Set_Cursor_Function *view_set_cursor; @@ -170,11 +161,9 @@ app_links->clipboard_index = external_clipboard_index;\ app_links->get_buffer_first = external_get_buffer_first;\ app_links->get_buffer_next = external_get_buffer_next;\ app_links->get_buffer = external_get_buffer;\ -app_links->get_parameter_buffer = external_get_parameter_buffer;\ app_links->get_buffer_by_name = external_get_buffer_by_name;\ -app_links->refresh_buffer = external_refresh_buffer;\ -app_links->buffer_read_range = external_buffer_read_range;\ app_links->buffer_seek = external_buffer_seek;\ +app_links->buffer_read_range = external_buffer_read_range;\ app_links->buffer_replace_range = external_buffer_replace_range;\ app_links->buffer_set_setting = external_buffer_set_setting;\ app_links->create_buffer = external_create_buffer;\ @@ -184,7 +173,6 @@ app_links->get_view_first = external_get_view_first;\ app_links->get_view_next = external_get_view_next;\ app_links->get_view = external_get_view;\ app_links->get_active_view = external_get_active_view;\ -app_links->refresh_view = external_refresh_view;\ app_links->view_auto_tab = external_view_auto_tab;\ app_links->view_compute_cursor = external_view_compute_cursor;\ app_links->view_set_cursor = external_view_set_cursor;\ diff --git a/4coder_default_bindings.cpp b/4coder_default_bindings.cpp index 65d87ffb..f5bf14be 100644 --- a/4coder_default_bindings.cpp +++ b/4coder_default_bindings.cpp @@ -60,11 +60,11 @@ CUSTOM_COMMAND_SIG(rewrite_as_single_caps){ cursor = view.cursor; exec_command(app, seek_token_left); - app->refresh_view(app, &view); + refresh_view(app, &view); range.min = view.cursor.pos; exec_command(app, seek_token_right); - app->refresh_view(app, &view); + refresh_view(app, &view); range.max = view.cursor.pos; string.str = (char*)app->memory; @@ -137,13 +137,14 @@ HOOK_SIG(my_start){ return(0); } -HOOK_SIG(my_file_settings){ +OPEN_FILE_HOOK_SIG(my_file_settings){ // NOTE(allen|a4): In hooks that want parameters, such as this file // opened hook. The file created hook is guaranteed to have only // and exactly one buffer parameter. In normal command callbacks // there are no parameter buffers. unsigned int access = AccessProtected|AccessHidden; - Buffer_Summary buffer = app->get_parameter_buffer(app, 0, access); + //Buffer_Summary buffer = app->get_parameter_buffer(app, 0, access); + Buffer_Summary buffer = app->get_buffer(app, buffer_id, access); assert(buffer.exists); int treat_as_code = 0; @@ -330,8 +331,8 @@ get_bindings(void *data, int size){ // NOTE(allen|a3.1): Hooks have no loyalties to maps. All hooks are global // and once set they always apply, regardless of what map is active. set_hook(context, hook_start, my_start); - set_hook(context, hook_open_file, my_file_settings); + set_open_file_hook(context, my_file_settings); set_scroll_rule(context, smooth_scroll_rule); default_keys(context); diff --git a/4coder_default_include.cpp b/4coder_default_include.cpp index 86435cd0..3c7292c7 100644 --- a/4coder_default_include.cpp +++ b/4coder_default_include.cpp @@ -710,7 +710,7 @@ CUSTOM_COMMAND_SIG(if0_off){ DEF_TAB_WIDTH, 0); - app->refresh_view(app, &view); + refresh_view(app, &view); range = get_range(&view); pos = range.max; @@ -733,7 +733,7 @@ CUSTOM_COMMAND_SIG(backspace_word){ pos2 = view.cursor.pos; exec_command(app, seek_alphanumeric_left); - app->refresh_view(app, &view); + refresh_view(app, &view); pos1 = view.cursor.pos; buffer = app->get_buffer(app, view.buffer_id, access); @@ -751,7 +751,7 @@ CUSTOM_COMMAND_SIG(delete_word){ pos1 = view.cursor.pos; exec_command(app, seek_alphanumeric_right); - app->refresh_view(app, &view); + refresh_view(app, &view); pos2 = view.cursor.pos; buffer = app->get_buffer(app, view.buffer_id, access); @@ -992,7 +992,7 @@ CUSTOM_COMMAND_SIG(replace_in_range){ while (new_pos + r.size <= range.end){ app->buffer_replace_range(app, &buffer, new_pos, new_pos + r.size, w.str, w.size); - app->refresh_view(app, &view); + refresh_view(app, &view); range = get_range(&view); pos = new_pos + w.size; buffer_seek_string_forward(app, &buffer, pos, r.str, r.size, &new_pos); diff --git a/4coder_gui.h b/4coder_gui.h index 28ddc8ef..6e1a272a 100644 --- a/4coder_gui.h +++ b/4coder_gui.h @@ -15,13 +15,13 @@ gui_id_zero(){ struct GUI_Scroll_Vars{ float scroll_y; - float target_y; - float prev_target_y; - float max_y; + int target_y; + int prev_target_y; + int max_y; float scroll_x; - float target_x; - float prev_target_x; + int target_x; + int prev_target_x; }; typedef struct GUI GUI; diff --git a/4coder_helper.h b/4coder_helper.h index e2f54c22..40718c7d 100644 --- a/4coder_helper.h +++ b/4coder_helper.h @@ -173,6 +173,26 @@ set_hook(Bind_Helper *helper, int hook_id, Hook_Function *func){ write_unit(helper, unit); } +inline void +set_open_file_hook(Bind_Helper *helper, Open_File_Hook_Function *func){ + Binding_Unit unit; + unit.type = unit_hook; + unit.hook.hook_id = _hook_open_file; + unit.hook.func = (void*) func; + + write_unit(helper, unit); +} + +inline void +set_new_file_hook(Bind_Helper *helper, Open_File_Hook_Function *func){ + Binding_Unit unit; + unit.type = unit_hook; + unit.hook.hook_id = _hook_new_file; + unit.hook.func = (void*) func; + + write_unit(helper, unit); +} + inline void set_scroll_rule(Bind_Helper *helper, Scroll_Rule_Function *func){ Binding_Unit unit; @@ -392,13 +412,23 @@ round_up(int x, int b){ return(r); } +void +refresh_buffer(Application_Links *app, Buffer_Summary *buffer){ + *buffer = app->get_buffer(app, buffer->buffer_id, AccessAll); +} + +void +refresh_view(Application_Links *app, View_Summary *view){ + *view = app->get_view(app, view->view_id, AccessAll); +} + int init_stream_chunk(Stream_Chunk *chunk, Application_Links *app, Buffer_Summary *buffer, int pos, char *data, int size){ int result = 0; - app->refresh_buffer(app, buffer); + refresh_buffer(app, buffer); if (pos >= 0 && pos < buffer->size && size > 0){ result = 1; chunk->app = app; @@ -422,7 +452,7 @@ forward_stream_chunk(Stream_Chunk *chunk){ Buffer_Summary *buffer = chunk->buffer; int result = 0; - app->refresh_buffer(app, buffer); + refresh_buffer(app, buffer); if (chunk->end < buffer->size){ result = 1; chunk->start = chunk->end; @@ -442,7 +472,7 @@ backward_stream_chunk(Stream_Chunk *chunk){ Buffer_Summary *buffer = chunk->buffer; int result = 0; - app->refresh_buffer(app, buffer); + refresh_buffer(app, buffer); if (chunk->start > 0){ result = 1; chunk->end = chunk->start; diff --git a/4ed.cpp b/4ed.cpp index 5f2e5ad6..3da9232b 100644 --- a/4ed.cpp +++ b/4ed.cpp @@ -242,7 +242,7 @@ do_feedback_message(System_Functions *system, Models *models, String value){ Editing_File *file = models->message_buffer; if (file){ - output_file_append(system, models, file, value, 1); + output_file_append(system, models, file, value, true); i32 pos = buffer_size(&file->state.buffer); for (View_Iter iter = file_view_iter_init(&models->layout, file, 0); file_view_iter_good(iter); @@ -318,7 +318,7 @@ COMMAND_DECL(center_view){ REQ_READABLE_VIEW(view); REQ_FILE(file, view); - f32 y, h; + f32 y = 0, h = 0; if (view->file_data.unwrapped_lines){ y = view->recent->cursor.unwrapped_y; } @@ -329,14 +329,14 @@ COMMAND_DECL(center_view){ h = view_file_height(view); y = clamp_bottom(0.f, y - h*.5f); - view->recent->scroll.target_y = y; + view->recent->scroll.target_y = ROUND32(y); } COMMAND_DECL(left_adjust_view){ REQ_READABLE_VIEW(view); REQ_FILE(file, view); - f32 x; + f32 x = 0; if (view->file_data.unwrapped_lines){ x = view->recent->cursor.unwrapped_x; } @@ -345,7 +345,7 @@ COMMAND_DECL(left_adjust_view){ } x = clamp_bottom(0.f, x - 30.f); - view->recent->scroll.target_x = x; + view->recent->scroll.target_x = ROUND32(x); } COMMAND_DECL(set_cursor){ @@ -918,8 +918,8 @@ COMMAND_DECL(close_panel){ COMMAND_DECL(page_down){ REQ_READABLE_VIEW(view); - f32 height = view_file_height(view); - f32 max_target_y = view->recent->scroll.max_y; + i32 height = CEIL32(view_file_height(view)); + i32 max_target_y = view->recent->scroll.max_y; view->recent->scroll.target_y = clamp_top(view->recent->scroll.target_y + height, max_target_y); @@ -931,10 +931,10 @@ COMMAND_DECL(page_down){ COMMAND_DECL(page_up){ REQ_READABLE_VIEW(view); - f32 height = view_file_height(view); + i32 height = CEIL32(view_file_height(view)); view->recent->scroll.target_y = - clamp_bottom(0.f, view->recent->scroll.target_y - height); + clamp_bottom(0, view->recent->scroll.target_y - height); view->recent->cursor = view_compute_cursor_from_xy(view, 0, view->recent->scroll.target_y + (height - view->line_height)*.5f); @@ -1624,6 +1624,8 @@ App_Init_Sig(app_init){ b32 did_file = 0; models->scroll_rule = fallback_scroll_rule; + models->hook_open_file = 0; + models->hook_new_file = 0; setup_command_table(); @@ -1754,7 +1756,19 @@ App_Init_Sig(app_init){ models->hooks[hook_id] = (Hook_Function*)unit->hook.func; } else{ - models->scroll_rule = (Scroll_Rule_Function*)unit->hook.func; + switch (hook_id){ + case _hook_open_file: + models->hook_open_file = (Open_File_Hook_Function*)unit->hook.func; + break; + + case _hook_new_file: + models->hook_new_file = (Open_File_Hook_Function*)unit->hook.func; + break; + + case _hook_scroll_rule: + models->scroll_rule = (Scroll_Rule_Function*)unit->hook.func; + break; + } } } }break; @@ -1861,11 +1875,6 @@ App_Init_Sig(app_init){ vars->cli_processes.procs = push_array(partition, CLI_Process, max_children); vars->cli_processes.max = max_children; vars->cli_processes.count = 0; - - // NOTE(allen): parameter setup - models->buffer_param_max = 1; - models->buffer_param_count = 0; - models->buffer_param_indices = push_array(partition, i32, models->buffer_param_max); } internal i32 diff --git a/4ed_api_implementation.cpp b/4ed_api_implementation.cpp index 742cf97b..ab73cb7c 100644 --- a/4ed_api_implementation.cpp +++ b/4ed_api_implementation.cpp @@ -100,16 +100,6 @@ get_file_from_identifier(System_Functions *system, Working_Set *working_set, Buf return(file); } -internal String -make_string_terminated(Partition *part, char *str, int len){ - char *space = (char*)push_array(part, char, len + 1); - String string = make_string(str, len, len+1); - copy_fast_unsafe(space, string); - string.str = space; - terminate_with_null(&string); - return(string); -} - internal Editing_File* imp_get_file(Command_Data *cmd, Buffer_Summary *buffer){ Editing_File *file = 0; @@ -149,7 +139,10 @@ imp_get_view(Command_Data *cmd, View_Summary *view){ return(vptr); } -EXEC_COMMAND_SIG(external_exec_command){ +EXEC_COMMAND_SIG(external_exec_command)/* +DOC_PARAM(command_id, an integer id enumerated in 4coder_custom.h starting with cmdid) +DOC(Executes the command associated with the command_id passed in) +*/{ Command_Data *cmd = (Command_Data*)app->cmd_context; Command_Function function = command_table[command_id]; Command_Binding binding = {}; @@ -160,7 +153,35 @@ EXEC_COMMAND_SIG(external_exec_command){ } // TODO(allen): This is a bit of a mess and needs to be fixed soon -EXEC_SYSTEM_COMMAND_SIG(external_exec_system_command){ +EXEC_SYSTEM_COMMAND_SIG(external_exec_system_command)/* +DOC_PARAM(view, the target view that will display the output buffer, may be NULL, see description for details) +DOC_PARAM(buffer, a buffer identifier for the buffer that will be filled with the output from the command) +DOC_PARAM(path, the path from which the command is executed) +DOC_PARAM(path_len, the length of the path string) +DOC_PARAM(command, the command to be executed) +DOC_PARAM(command_len, the length of the command string) +DOC_PARAM(flags, may be zero or one or more CLI flags ORed together) +DOC_RETURN(returns non-zero if the command is successfully started, returns zero otherwise) +DOC +( +Executes a system command as if called from the command line, and sends the output to a buffer. The buffer +identifier can either name a new buffer that does not exist, name a buffer that does exist, or provide the +id of a buffer that does exist. If the buffer already exists the command will fail, unless +CLI_OverlapWithConflict is set in the flags. + +If the buffer is not already in an active view, and the view parameter is no NULL, then the provided view +will display the output buffer. If the view parameter is NULL, no view will display the output. + +If CLI_OverlapWithConflict is set in the flags, the command will always be executed even if another command +was outputting to the same buffer still. + +If CLI_AlwaysBindToView is set and the view parameter is not NULL, then the specified view will always +begin displaying the output buffer, even if another active view already displays that buffer. + +If CLI_CursorAtEnd is set the cursor in the output buffer will be placed at the end of the buffer instead +of at the beginning. +) +*/{ Command_Data *cmd = (Command_Data*)app->cmd_context; System_Functions *system = cmd->system; App_Vars *vars = cmd->vars; @@ -178,22 +199,9 @@ EXEC_SYSTEM_COMMAND_SIG(external_exec_system_command){ Partition *part = &models->mem.part; Temp_Memory temp = begin_temp_memory(part); - View *vptr = 0; - int result = true; - if (view->exists){ - Live_Views *live_set = cmd->live_set; - i32 view_id = view->view_id - 1; - if (view_id >= 0 && view_id < live_set->max){ - vptr = live_set->views + view_id; - } - } - - if (vptr == 0){ - result = false; - goto done; - } + View *vptr = imp_get_view(cmd, view); if (vars->cli_processes.count < vars->cli_processes.max){ file = get_file_from_identifier(system, working_set, buffer); @@ -248,7 +256,7 @@ EXEC_SYSTEM_COMMAND_SIG(external_exec_system_command){ if (!(flags & CLI_AlwaysBindToView)){ View_Iter iter = file_view_iter_init(&models->layout, file, 0); if (file_view_iter_good(iter)){ - bind_to_new_view = 0; + bind_to_new_view = false; } } } @@ -282,7 +290,7 @@ EXEC_SYSTEM_COMMAND_SIG(external_exec_system_command){ command_string = make_string_terminated(part, command, command_len); } - if (bind_to_new_view){ + if (vptr && bind_to_new_view){ view_set_file(vptr, file, models); view_show_file(vptr); } @@ -313,7 +321,19 @@ EXEC_SYSTEM_COMMAND_SIG(external_exec_system_command){ return(result); } -DIRECTORY_GET_HOT_SIG(external_directory_get_hot){ +DIRECTORY_GET_HOT_SIG(external_directory_get_hot)/* +DOC_PARAM(out, a buffer that receives the 4coder 'hot directory') +DOC_PARAM(capacity, the maximum size to be output to the output buffer) +DOC_RETURN(returns the size of the string written into the buffer) +DOC +( +4coder has a concept of a 'hot directory' which is the directory most recently +accessed in the GUI. Whenever the GUI is opened it shows the hot directory. + +In the future this will be deprecated and eliminated in favor of more flexible +directories controlled by the custom side. +) +*/{ Command_Data *cmd = (Command_Data*)app->cmd_context; Hot_Directory *hot = &cmd->models->hot_directory; i32 copy_max = capacity - 1; @@ -331,7 +351,16 @@ DIRECTORY_GET_HOT_SIG(external_directory_get_hot){ #define external_directory_cd system->directory_cd -GET_FILE_LIST_SIG(external_get_file_list){ +GET_FILE_LIST_SIG(external_get_file_list)/* +DOC_PARAM(dir, the directory whose files will be enumerated in the returned list) +DOC_PARAM(len, the length of the dir string) +DOC_RETURN +( +returns a File_List struct containing pointers to the names of the files in +the specified directory. The File_List returned should be passed to free_file_list +when it is no longer in use. +) +*/{ Command_Data *cmd = (Command_Data*)app->cmd_context; System_Functions *system = cmd->system; File_List result = {}; @@ -339,35 +368,61 @@ GET_FILE_LIST_SIG(external_get_file_list){ return(result); } -FREE_FILE_LIST_SIG(external_free_file_list){ +FREE_FILE_LIST_SIG(external_free_file_list)/* +DOC_PARAM(list, the file list to be freed) +DOC(after this call the file list passed in should not be read or written to) +*/{ Command_Data *cmd = (Command_Data*)app->cmd_context; System_Functions *system = cmd->system; system->set_file_list(&list, make_string(0, 0)); } -CLIPBOARD_POST_SIG(external_clipboard_post){ +CLIPBOARD_POST_SIG(external_clipboard_post)/* +DOC_PARAM(str, the string to post to the clipboard) +DOC_PARAM(len, the length of the string str) +DOC +( +Stores the string str in the clipboard initially with index 0. +Also reports the copy to the operating system, so that it may +be pasted into other applications. +) +*/{ Command_Data *cmd = (Command_Data*)app->cmd_context; System_Functions *system = cmd->system; Models *models = cmd->models; General_Memory *general = &models->mem.general; Working_Set *working = &models->working_set; - int result = false; String *dest = working_set_next_clipboard_string(general, working, len); copy(dest, make_string(str, len)); system->post_clipboard(*dest); - - return(result); } -CLIPBOARD_COUNT_SIG(external_clipboard_count){ +CLIPBOARD_COUNT_SIG(external_clipboard_count)/* +DOC(returns the number of items in the clipboard) +*/{ Command_Data *cmd = (Command_Data*)app->cmd_context; Working_Set *working = &cmd->models->working_set; int count = working->clipboard_size; return(count); } -CLIPBOARD_INDEX_SIG(external_clipboard_index){ +CLIPBOARD_INDEX_SIG(external_clipboard_index)/* +DOC_PARAM(index, the index of the item to be read) +DOC_PARAM(out, a buffer where the clipboard contents are written or NULL) +DOC_PARAM(len, the length of the out buffer) +DOC_RETURN(returns the size of the item on the clipboard associated with the given index) +DOC +( +There are multiple items on the 4coder clipboard. The most recent copy is always at +index 0. The second most recent is at index 1, and so on for all the stored clipboard items. +This function reads one of the clipboard items and stores it into the out buffer, if the out +buffer is not NULL. This function always returns the size of the clipboard item specified +even if the output buffer is NULL. If the output buffer is too small to contain the whole +string, it is filled with the first len character of the clipboard contents. The output +string is not null terminated. +) +*/{ Command_Data *cmd = (Command_Data*)app->cmd_context; Working_Set *working = &cmd->models->working_set; @@ -405,7 +460,19 @@ internal_get_buffer_next(Working_Set *working_set, Buffer_Summary *buffer){ } } -GET_BUFFER_FIRST_SIG(external_get_buffer_first){ +GET_BUFFER_FIRST_SIG(external_get_buffer_first)/* +DOC_PARAM(access, the access flags for the access) +DOC_RETURN(returns the summary of the first buffer in a buffer loop) +DOC +( +Begins a loop across all the buffers. + +If the buffer returned does not exist, the loop is finished. Buffers +should not be killed durring a buffer loop. +) +DOC_SEE(Access_Flag) +DOC_SEE(get_buffer_next) +*/{ Command_Data *cmd = (Command_Data*)app->cmd_context; Working_Set *working_set = &cmd->models->working_set; Buffer_Summary result = {}; @@ -418,7 +485,21 @@ GET_BUFFER_FIRST_SIG(external_get_buffer_first){ return(result); } -GET_BUFFER_NEXT_SIG(external_get_buffer_next){ +GET_BUFFER_NEXT_SIG(external_get_buffer_next)/* +DOC_PARAM(buffer, pointer to the loop buffer originally returned by get_buffer_first) +DOC_PARAM(access, the access flags for the access) +DOC +( +Writes the next buffer into the buffer struct. To get predictable results every +call to get_buffer_first and get_buffer_next in the loop should have the same +access flags. + +If the buffer returned does not exist, the loop is finished. Buffers +should not be killed durring a buffer loop. +) +DOC_SEE(Access_Flag) +DOC_SEE(get_buffer_first) +*/{ Command_Data *cmd = (Command_Data*)app->cmd_context; Working_Set *working_set = &cmd->models->working_set; @@ -428,13 +509,17 @@ GET_BUFFER_NEXT_SIG(external_get_buffer_next){ } } -GET_BUFFER_SIG(external_get_buffer){ +GET_BUFFER_SIG(external_get_buffer)/* +DOC_PARAM(buffer_id, the id of the buffer to get) +DOC_PARAM(access, the access flags for the access) +DOC_RETURN(returns a summary that describes the indicated buffer if it exists and is accessible) +*/{ Command_Data *cmd = (Command_Data*)app->cmd_context; Working_Set *working_set = &cmd->models->working_set; Buffer_Summary buffer = {}; Editing_File *file; - file = working_set_get_active_file(working_set, index); + file = working_set_get_active_file(working_set, buffer_id); if (file){ fill_buffer_summary(&buffer, file, working_set); if (!access_test(buffer.lock_flags, access)){ @@ -445,25 +530,18 @@ GET_BUFFER_SIG(external_get_buffer){ return(buffer); } -GET_PARAMETER_BUFFER_SIG(external_get_parameter_buffer){ - Command_Data *cmd = (Command_Data*)app->cmd_context; - Models *models = cmd->models; - Buffer_Summary buffer = {}; - - if (param_index >= 0 && param_index < models->buffer_param_count){ - buffer = external_get_buffer(app, models->buffer_param_indices[param_index], access); - } - - return(buffer); -} - -GET_BUFFER_BY_NAME_SIG(external_get_buffer_by_name){ +GET_BUFFER_BY_NAME_SIG(external_get_buffer_by_name)/* +DOC_PARAM(name, the name of the buffer) +DOC_PARAM(len, the length of the name string) +DOC_PARAM(access, the access flags for the access) +DOC_RETURN(returns a summary that describes the indicated buffer if it exists and is accessible) +*/{ Command_Data *cmd = (Command_Data*)app->cmd_context; Buffer_Summary buffer = {}; Editing_File *file; Working_Set *working_set = &cmd->models->working_set; - file = working_set_contains(cmd->system, working_set, make_string(filename, len)); + file = working_set_contains(cmd->system, working_set, make_string(name, len)); if (file && !file->is_dummy){ fill_buffer_summary(&buffer, file, working_set); if (!access_test(buffer.lock_flags, access)){ @@ -474,14 +552,14 @@ GET_BUFFER_BY_NAME_SIG(external_get_buffer_by_name){ return(buffer); } -REFRESH_BUFFER_SIG(external_refresh_buffer){ - int result; - *buffer = external_get_buffer(app, buffer->buffer_id, AccessAll); - result = buffer->exists; - return(result); -} - -BUFFER_SEEK_SIG(external_buffer_seek){ +BUFFER_SEEK_SIG(external_buffer_seek)/* +DOC_PARAM(buffer, the buffer to seek through) +DOC_PARAM(start_pos, the absolute position in the buffer to begin the seek) +DOC_PARAM(seek_forward, non-zero indicates to seek forward otherwise the seek goes backward) +DOC_PARAM(flags, one or more types of boundaries to use for stopping the seek) +DOC_RETURN(returns the position where the seek stops) +DOC_SEE(Seek_Boundary_Flag) +*/{ Command_Data *cmd = (Command_Data*)app->cmd_context; Editing_File *file; int result = false; @@ -573,7 +651,18 @@ BUFFER_SEEK_SIG(external_buffer_seek){ return(result); } -BUFFER_READ_RANGE_SIG(external_buffer_read_range){ +BUFFER_READ_RANGE_SIG(external_buffer_read_range)/* +DOC_PARAM(buffer, the buffer to read out of) +DOC_PARAM(start, the beginning of the read range) +DOC_PARAM(end, one past the end of the read range) +DOC_PARAM(out, the output buffer to fill with the result of the read) +DOC_RETURN(returns non-zero on success) +DOC +( +The output buffer might have a capacity of at least (end - start) +The output is not null terminated. +) +*/{ Command_Data *cmd = (Command_Data*)app->cmd_context; Editing_File *file = imp_get_file(cmd, buffer); int result = false; @@ -591,7 +680,21 @@ BUFFER_READ_RANGE_SIG(external_buffer_read_range){ return(result); } -BUFFER_REPLACE_RANGE_SIG(external_buffer_replace_range){ +BUFFER_REPLACE_RANGE_SIG(external_buffer_replace_range)/* +DOC_PARAM(buffer, the buffer to edit) +DOC_PARAM(start, the start of the range to edit) +DOC_PARAM(end, the end of the range to edit) +DOC_PARAM(str, the string to write into the range) +DOC_PARAM(len, the length of the str string) +DOC_RETURN(returns non-zero if the replacement succeeds) +DOC +( +Replace simultaneously deletes the range from start to end and writes str +in the same position. If end == start then this call is equivalent to +inserting the string at start. If len == 0 this call is equivalent to +deleteing the range from start to end. +) +*/{ Command_Data *cmd = (Command_Data*)app->cmd_context; Editing_File *file = imp_get_file(cmd, buffer); @@ -602,7 +705,7 @@ BUFFER_REPLACE_RANGE_SIG(external_buffer_replace_range){ if (file){ size = buffer_size(&file->state.buffer); if (0 <= start && start <= end && end <= size){ - result = 1; + result = true; pos = file->state.cursor_pos; if (pos < start) next_cursor = pos; @@ -688,21 +791,18 @@ SAVE_BUFFER_SIG(external_save_buffer){ Command_Data *cmd = (Command_Data*)app->cmd_context; System_Functions *system = cmd->system; Models *models = cmd->models; - - Editing_File *file = imp_get_file(cmd, buffer); - int result = false; + Editing_File *file = imp_get_file(cmd, buffer); if (file){ result = true; String name = make_string(filename, filename_len); - view_save_file(system, models, file, 0, name, 0); + view_save_file(system, models, file, 0, name, false); } return(result); } -// TODO(allen): REPLACE THIS WITH CREATE_BUFFER!!! CREATE_BUFFER_SIG(external_create_buffer){ Command_Data *cmd = (Command_Data*)app->cmd_context; System_Functions *system = cmd->system; @@ -715,10 +815,10 @@ CREATE_BUFFER_SIG(external_create_buffer){ Temp_Memory temp = begin_temp_memory(part); if (filename != 0){ - String filename_string = make_string(filename, filename_len); + String filename_string = make_string_terminated(part, filename, filename_len); Editing_File *file = working_set_contains(system, working_set, filename_string); if (file == 0){ - File_Loading loading = system->file_load_begin(filename); + File_Loading loading = system->file_load_begin(filename_string.str); if (loading.exists){ b32 in_general_mem = false; char *buffer = push_array(part, char, loading.size); @@ -874,13 +974,6 @@ GET_ACTIVE_VIEW_SIG(external_get_active_view){ return(view); } -REFRESH_VIEW_SIG(external_refresh_view){ - int result; - *view = external_get_view(app, view->view_id, AccessAll); - result = view->exists; - return(result); -} - VIEW_AUTO_TAB_SIG(external_view_auto_tab){ Command_Data *cmd = (Command_Data*)app->cmd_context; System_Functions *system = cmd->system; @@ -1133,29 +1226,15 @@ PRINT_MESSAGE_SIG(external_print_message){ do_feedback_message(cmd->system, models, make_string(string, len)); } -#if 0 -GET_GUI_FUNCTIONS_SIG(external_get_gui_functions){ - GUI_Functions *guifn = 0; - NotImplemented; - return(guifn); -} - -GET_GUI_SIG(external_get_gui){ - GUI *gui = 0; - NotImplemented; - return(gui); -} -#endif - CHANGE_THEME_SIG(external_change_theme){ Command_Data *cmd = (Command_Data*)app->cmd_context; Style_Library *styles = &cmd->models->styles; String theme_name = make_string(name, len); - Style *s; - i32 i, count; - count = styles->count; - s = styles->styles; + i32 i = 0; + i32 count = styles->count; + Style *s = styles->styles; + for (i = 0; i < count; ++i, ++s){ if (match(s->name, theme_name)){ style_copy(main_style(cmd->models), s); @@ -1169,7 +1248,7 @@ CHANGE_FONT_SIG(external_change_font){ Font_Set *set = cmd->models->font_set; Style_Font *global_font = &cmd->models->global_font; String font_name = make_string(name, len); - i16 font_id; + i16 font_id = 0; if (font_set_extract(set, font_name, &font_id)){ global_font->font_id = font_id; @@ -1180,11 +1259,11 @@ CHANGE_FONT_SIG(external_change_font){ SET_THEME_COLORS_SIG(external_set_theme_colors){ Command_Data *cmd = (Command_Data*)app->cmd_context; Style *style = main_style(cmd->models); - Theme_Color *theme_color; - u32 *color; - i32 i; - theme_color = colors; + u32 *color = 0; + i32 i = 0; + Theme_Color *theme_color = colors; + for (i = 0; i < count; ++i, ++theme_color){ color = style_index_by_tag(&style->main, theme_color->tag); if (color) *color = theme_color->color | 0xFF000000; @@ -1194,11 +1273,11 @@ SET_THEME_COLORS_SIG(external_set_theme_colors){ GET_THEME_COLORS_SIG(external_get_theme_colors){ Command_Data *cmd = (Command_Data*)app->cmd_context; Style *style = main_style(cmd->models); - Theme_Color *theme_color; - u32 *color; - i32 i; - theme_color = colors; + u32 *color = 0; + i32 i = 0; + Theme_Color *theme_color = colors; + for (i = 0; i < count; ++i, ++theme_color){ color = style_index_by_tag(&style->main, theme_color->tag); if (color){ diff --git a/4ed_app_models.h b/4ed_app_models.h index d22f554e..579bd146 100644 --- a/4ed_app_models.h +++ b/4ed_app_models.h @@ -58,9 +58,6 @@ struct Models{ Hook_Function *hooks[hook_type_count]; Application_Links app_links; - i32 *buffer_param_indices; - i32 buffer_param_count, buffer_param_max; - Font_Set *font_set; Style_Font global_font; Style_Library styles; @@ -78,6 +75,9 @@ struct Models{ Panel *prev_mouse_panel; Custom_API config_api; + + Open_File_Hook_Function *hook_open_file; + Open_File_Hook_Function *hook_new_file; Scroll_Rule_Function *scroll_rule; b32 keep_playing; diff --git a/4ed_file.cpp b/4ed_file.cpp index 0d03d2bc..993a545b 100644 --- a/4ed_file.cpp +++ b/4ed_file.cpp @@ -414,8 +414,8 @@ working_set__entry_comp(System_Functions *system, String filename, File_Entry_Co inline Editing_File* working_set_contains(System_Functions *system, Working_Set *working_set, String filename){ - File_Entry_Comparison entry_comp; - File_Entry *entry; + File_Entry_Comparison entry_comp = {0}; + File_Entry *entry = 0; Editing_File *result = 0; working_set__entry_comp(system, filename, &entry_comp); entry = (File_Entry*)table_find_item(&working_set->table, &entry_comp, system, tbl_string_hash, tbl_file_compare); @@ -582,48 +582,6 @@ filename_match(String query, Absolutes *absolutes, String filename, b32 case_sen return result; } -#if 0 -internal Hot_Directory_Match -hot_directory_first_match(Hot_Directory *hot_directory, - String str, - b32 include_files, - b32 exact_match, - b32 case_sensitive){ - Hot_Directory_Match result = {}; - - Absolutes absolutes; - if (!exact_match) - get_absolutes(str, &absolutes, 1, 1); - - File_List *files = &hot_directory->file_list; - File_Info *info, *end; - end = files->infos + files->count; - for (info = files->infos; info != end; ++info){ - String filename = info->filename; - b32 is_match = 0; - if (exact_match){ - if (case_sensitive){ - if (match(filename, str)) is_match = 1; - } - else{ - if (match_insensitive(filename, str)) is_match = 1; - } - } - else{ - if (filename_match(str, &absolutes, filename, case_sensitive)) is_match = 1; - } - - if (is_match){ - result.is_folder = info->folder; - result.filename = filename; - break; - } - } - - return result; -} -#endif - inline File_Sync_State buffer_get_sync(Editing_File *file){ File_Sync_State result = SYNC_GOOD; diff --git a/4ed_file_view.cpp b/4ed_file_view.cpp index eee85f93..41b4785b 100644 --- a/4ed_file_view.cpp +++ b/4ed_file_view.cpp @@ -333,6 +333,8 @@ view_lock_level(View *view){ return(result); } +// TODO(allen): Switch over to using an i32 instead of +// an f32 for these. inline f32 view_file_width(View *view){ i32_Rect file_rect = view->file_region; @@ -475,9 +477,9 @@ internal b32 file_save(System_Functions *system, Mem_Options *mem, Editing_File *file, char *filename){ b32 result = 0; - i32 max, size; + i32 max = 0, size = 0; b32 dos_write_mode = file->settings.dos_write_mode; - char *data; + char *data = 0; Buffer_Type *buffer = &file->state.buffer; if (dos_write_mode){ @@ -668,19 +670,19 @@ view_compute_lowest_line(View *view){ return lowest_line; } -inline f32 +inline i32 view_compute_max_target_y(i32 lowest_line, i32 line_height, f32 view_height){ f32 max_target_y = ((lowest_line+.5f)*line_height) - view_height*.5f; max_target_y = clamp_bottom(0.f, max_target_y); - return(max_target_y); + return(CEIL32(max_target_y)); } -inline f32 +inline i32 view_compute_max_target_y(View *view){ i32 lowest_line = view_compute_lowest_line(view); i32 line_height = view->line_height; f32 view_height = view_file_height(view); - f32 max_target_y = view_compute_max_target_y(lowest_line, line_height, view_height); + i32 max_target_y = view_compute_max_target_y(lowest_line, line_height, view_height); return(max_target_y); } @@ -785,11 +787,10 @@ file_create_from_string(System_Functions *system, Models *models, file->state.undo.current_block_normal = 1; } - Hook_Function *open_hook = models->hooks[hook_open_file]; - models->buffer_param_indices[0] = file->id.id; - models->buffer_param_count = 1; - open_hook(&models->app_links); - models->buffer_param_count = 0; + Open_File_Hook_Function *open_hook = models->hook_open_file; + if (open_hook){ + open_hook(&models->app_links, file->id.id); + } file->settings.is_initialized = 1; } @@ -1614,25 +1615,25 @@ view_move_view_to_cursor(View *view, GUI_Scroll_Vars *scroll){ f32 cursor_x = view_get_cursor_x(view); GUI_Scroll_Vars scroll_vars = *scroll; - f32 target_y = scroll_vars.target_y; - f32 target_x = scroll_vars.target_x; - + i32 target_y = scroll_vars.target_y; + i32 target_x = scroll_vars.target_x; + Cursor_Limits limits = view_cursor_limits(view); if (cursor_y > target_y + limits.max){ - target_y = cursor_y - limits.max + limits.delta; + target_y = CEIL32(cursor_y - limits.max + limits.delta); } if (cursor_y < target_y + limits.min){ - target_y = cursor_y - limits.delta - limits.min; + target_y = FLOOR32(cursor_y - limits.delta - limits.min); } - target_y = clamp(0.f, target_y, scroll_vars.max_y); + target_y = clamp(0, target_y, scroll_vars.max_y); - if (cursor_x < target_x){ - target_x = (f32)Max(0, cursor_x - max_x/2); + if (cursor_x >= target_x + max_x){ + target_x = CEIL32(cursor_x - max_x/2); } - else if (cursor_x >= target_x + max_x){ - target_x = (f32)(cursor_x - max_x/2); + else if (cursor_x < target_x){ + target_x = FLOOR32(Max(0, cursor_x - max_x/2)); } if (target_x != scroll_vars.target_x || target_y != scroll_vars.target_y){ @@ -1724,8 +1725,7 @@ struct Relative_Scrolling{ internal Relative_Scrolling view_get_relative_scrolling(View *view){ Relative_Scrolling result; - f32 cursor_y; - cursor_y = view_get_cursor_y(view); + f32 cursor_y = view_get_cursor_y(view); result.scroll_y = cursor_y - view->recent->scroll.scroll_y; result.target_y = cursor_y - view->recent->scroll.target_y; return(result); @@ -1733,11 +1733,10 @@ view_get_relative_scrolling(View *view){ internal void view_set_relative_scrolling(View *view, Relative_Scrolling scrolling){ - f32 cursor_y; - cursor_y = view_get_cursor_y(view); + f32 cursor_y = view_get_cursor_y(view); view->recent->scroll.scroll_y = cursor_y - scrolling.scroll_y; view->recent->scroll.target_y = - clamp_bottom(0.f, cursor_y - scrolling.target_y); + ROUND32(clamp_bottom(0.f, cursor_y - scrolling.target_y)); } inline void @@ -2031,12 +2030,12 @@ file_edit_cursor_fix(System_Functions *system, if (view->file_data.unwrapped_lines){ y_position = temp_cursor.unwrapped_y + y_offset; - view->recent->scroll.target_y += (y_position - view->recent->scroll.scroll_y); + view->recent->scroll.target_y += ROUND32(y_position - view->recent->scroll.scroll_y); view->recent->scroll.scroll_y = y_position; } else{ y_position = temp_cursor.wrapped_y + y_offset; - view->recent->scroll.target_y += (y_position - view->recent->scroll.scroll_y); + view->recent->scroll.target_y += ROUND32(y_position - view->recent->scroll.scroll_y); view->recent->scroll.scroll_y = y_position; } } @@ -3146,22 +3145,29 @@ view_save_file(System_Functions *system, Models *models, Mem_Options *mem = &models->mem; Working_Set *working_set = &models->working_set; + Temp_Memory temp = begin_temp_memory(&mem->part); + + String filename_string = + make_string_terminated(&mem->part, filename.str, filename.size); + if (!file){ if (view){ file = view->file_data.file; } else{ - file = working_set_lookup_file(working_set, filename); + file = working_set_lookup_file(working_set, filename_string); } } if (file && buffer_get_sync(file) != SYNC_GOOD){ - if (file_save(system, mem, file, filename.str)){ + if (file_save(system, mem, file, filename_string.str)){ if (save_as){ - file_set_name(working_set, file, filename.str); + file_set_name(working_set, file, filename_string.str); } } } + + end_temp_memory(temp); } internal void @@ -3178,13 +3184,11 @@ view_new_file(System_Functions *system, Models *models, view_show_file(view); view->map = get_map(models, file->settings.base_map_id); - Hook_Function *new_file_fnc = models->hooks[hook_new_file]; + Open_File_Hook_Function *new_file_fnc = models->hook_new_file; if (new_file_fnc){ - models->buffer_param_indices[models->buffer_param_count++] = file->id.id; - new_file_fnc(&models->app_links); - models->buffer_param_count = 0; - file->settings.is_initialized = 1; + new_file_fnc(&models->app_links, file->id.id); } + file->settings.is_initialized = 1; #if BUFFER_EXPERIMENT_SCALPEL <= 0 if (file->settings.tokens_exist){ @@ -3518,15 +3522,12 @@ intbar_draw_string(Render_Target *target, File_Bar *bar, String str, u32 char_co internal void view_reinit_scrolling(View *view){ Editing_File *file = view->file_data.file; - f32 w, h; - f32 cursor_x, cursor_y; - f32 target_x, target_y; + f32 w = 0, h = 0; + f32 cursor_x = 0, cursor_y = 0; + i32 target_x = 0, target_y = 0; view->reinit_scrolling = 0; - target_x = 0; - target_y = 0; - if (file && file_is_ready(file)){ cursor_x = view_get_cursor_x(view); cursor_y = view_get_cursor_y(view); @@ -3535,19 +3536,19 @@ view_reinit_scrolling(View *view){ h = view_file_height(view); if (cursor_x >= target_x + w){ - target_x = (f32)(cursor_x - w*.5f); + target_x = ROUND32(cursor_x - w*.5f); } - target_y = clamp_bottom(0.f, (f32)FLOOR32(cursor_y - h*.5f)); + target_y = clamp_bottom(0, FLOOR32(cursor_y - h*.5f)); } view->recent->scroll.target_y = target_y; - view->recent->scroll.scroll_y = target_y; - view->recent->scroll.prev_target_y = -1000.f; + view->recent->scroll.scroll_y = (f32)target_y; + view->recent->scroll.prev_target_y = -1000; view->recent->scroll.target_x = target_x; - view->recent->scroll.scroll_x = target_x; - view->recent->scroll.prev_target_x = -1000.f; + view->recent->scroll.scroll_x = (f32)target_x; + view->recent->scroll.prev_target_x = -1000; } enum CursorScroll_State{ @@ -3623,8 +3624,8 @@ view_end_cursor_scroll_updates(View *view){ } if (cursor_scroll_state & CursorScroll_ContextChange){ - view->current_scroll->scroll_y = view->current_scroll->target_y; - view->current_scroll->scroll_x = view->current_scroll->target_x; + view->current_scroll->scroll_y = (f32)view->current_scroll->target_y; + view->current_scroll->scroll_x = (f32)view->current_scroll->target_x; gui_post_scroll_vars(&view->gui_target, view->current_scroll, view->scroll_region); } @@ -3989,12 +3990,12 @@ show_gui_scroll(GUI_Target *target, String *string, GUI_Scroll_Vars scroll){ show_gui_line (target, string, indent_level, 0, message, 0); show_gui_float(target, string, indent_level+1, h_align, " scroll_y ", scroll.scroll_y); - show_gui_float(target, string, indent_level+1, h_align, " target_y ", scroll.target_y); - show_gui_float(target, string, indent_level+1, h_align, " prev_target_y ", scroll.prev_target_y); - show_gui_float(target, string, indent_level+1, h_align, " max_y ", scroll.max_y); + show_gui_int (target, string, indent_level+1, h_align, " target_y ", scroll.target_y); + show_gui_int (target, string, indent_level+1, h_align, " prev_target_y ", scroll.prev_target_y); + show_gui_int (target, string, indent_level+1, h_align, " max_y ", scroll.max_y); show_gui_float(target, string, indent_level+1, h_align, " scroll_x ", scroll.scroll_x); - show_gui_float(target, string, indent_level+1, h_align, " target_x ", scroll.target_x); - show_gui_float(target, string, indent_level+1, h_align, " prev_target_x ", scroll.prev_target_x); + show_gui_int (target, string, indent_level+1, h_align, " target_x ", scroll.target_x); + show_gui_int (target, string, indent_level+1, h_align, " prev_target_x ", scroll.prev_target_x); } internal void @@ -4081,7 +4082,7 @@ step_file_view(System_Functions *system, View *view, View *active_view, Input_Su gui_begin_serial_section(target); { - f32 delta = 9.f * view->line_height; + i32 delta = 9 * view->line_height; GUI_id scroll_context = {0}; scroll_context.id[1] = view->showing_ui; scroll_context.id[0] = (u64)(view->file_data.file); @@ -4181,7 +4182,7 @@ step_file_view(System_Functions *system, View *view, View *active_view, Input_Su view->current_scroll = &view->gui_scroll; gui_get_scroll_vars(target, scroll_context, &view->gui_scroll, &view->scroll_region); gui_begin_scrollable(target, scroll_context, view->gui_scroll, - 9.f * view->line_height, show_scrollbar); + 9 * view->line_height, show_scrollbar); { i32 count = models->styles.count; @@ -4255,7 +4256,7 @@ step_file_view(System_Functions *system, View *view, View *active_view, Input_Su view->current_scroll = &view->gui_scroll; gui_get_scroll_vars(target, scroll_context, &view->gui_scroll, &view->scroll_region); gui_begin_scrollable(target, scroll_context, view->gui_scroll, - 9.f * view->line_height, show_scrollbar); + 9 * view->line_height, show_scrollbar); i32 next_color_editing = view->current_color_editing; @@ -4402,7 +4403,7 @@ step_file_view(System_Functions *system, View *view, View *active_view, Input_Su snap_into_view = 1; } gui_begin_scrollable(target, scroll_context, view->gui_scroll, - 9.f * view->line_height, show_scrollbar); + 9 * view->line_height, show_scrollbar); id.id[0] = (u64)(hdir) + 1; @@ -4491,7 +4492,7 @@ step_file_view(System_Functions *system, View *view, View *active_view, Input_Su snap_into_view = 1; } gui_begin_scrollable(target, scroll_context, view->gui_scroll, - 9.f * view->line_height, show_scrollbar); + 9 * view->line_height, show_scrollbar); id.id[0] = (u64)(working_set) + 1; if (gui_begin_list(target, id, view->list_i, @@ -4699,7 +4700,7 @@ step_file_view(System_Functions *system, View *view, View *active_view, Input_Su } gui_begin_scrollable(target, scroll_context, view->gui_scroll, - 9.f * view->line_height, show_scrollbar); + 9 * view->line_height, show_scrollbar); switch (view->debug_vars.mode) { @@ -5096,7 +5097,7 @@ do_step_file_view(System_Functions *system, GUI_Target *target = &view->gui_target; GUI_Interpret_Result interpret_result = {0}; - vars.target_y = clamp(0.f, vars.target_y, vars.max_y); + vars.target_y = clamp(0, vars.target_y, vars.max_y); result.vars = vars; result.region = region; @@ -5143,7 +5144,7 @@ do_step_file_view(System_Functions *system, case guicom_file: { - f32 new_max_y = view_compute_max_target_y(view); + i32 new_max_y = view_compute_max_target_y(view); view->file_region = gui_session.rect; result.vars.max_y = new_max_y; @@ -5233,7 +5234,7 @@ do_step_file_view(System_Functions *system, v = unlerp(gui_session.scroll_top, (f32)my, gui_session.scroll_bottom); v = clamp(0.f, v, 1.f); - result.vars.target_y = lerp(0.f, v, result.vars.max_y); + result.vars.target_y = ROUND32(lerp(0.f, v, (f32)result.vars.max_y)); gui_activate_scrolling(target); result.is_animating = true; @@ -5247,7 +5248,7 @@ do_step_file_view(System_Functions *system, result.vars.target_y += user_input->mouse.wheel*target->delta; result.vars.target_y = - clamp(0.f, result.vars.target_y, result.vars.max_y); + clamp(0, result.vars.target_y, result.vars.max_y); gui_activate_scrolling(target); result.is_animating = true; } @@ -5258,8 +5259,8 @@ do_step_file_view(System_Functions *system, GUI_id id = gui_id_scrollbar_top(); if (scroll_button_input(target, &gui_session, user_input, id, &result.is_animating)){ - result.vars.target_y -= target->delta * 0.25f; - result.vars.target_y = clamp_bottom(0.f, result.vars.target_y); + result.vars.target_y -= clamp_bottom(1, target->delta >> 2); + result.vars.target_y = clamp_bottom(0, result.vars.target_y); result.consumed_l = true; } }break; @@ -5269,7 +5270,7 @@ do_step_file_view(System_Functions *system, GUI_id id = gui_id_scrollbar_bottom(); if (scroll_button_input(target, &gui_session, user_input, id, &result.is_animating)){ - result.vars.target_y += target->delta * 0.25f; + result.vars.target_y += clamp_bottom(1, target->delta >> 2); result.vars.target_y = clamp_top(result.vars.target_y, result.vars.max_y); result.consumed_l = true; } @@ -5278,8 +5279,7 @@ do_step_file_view(System_Functions *system, case guicom_end_scrollable_section: { if (!is_file_scroll){ - f32 new_max_y = gui_session.suggested_max_y; - result.vars.max_y = new_max_y; + result.vars.max_y = gui_session.suggested_max_y; } }break; } @@ -5299,7 +5299,10 @@ do_step_file_view(System_Functions *system, if (scroll_vars.target_x != scroll_vars.prev_target_x) is_new_target = true; if (scroll_vars.target_y != scroll_vars.prev_target_y) is_new_target = true; - if (view->persistent.models->scroll_rule(scroll_vars.target_x, scroll_vars.target_y, + f32 target_x = (f32)scroll_vars.target_x; + f32 target_y = (f32)scroll_vars.target_y; + + if (view->persistent.models->scroll_rule(target_x, target_y, &scroll_vars.scroll_x, &scroll_vars.scroll_y, (view->persistent.id) + 1, is_new_target, user_input->dt)){ result.is_animating = true; diff --git a/4ed_gui.cpp b/4ed_gui.cpp index 96fbcb60..996cbff5 100644 --- a/4ed_gui.cpp +++ b/4ed_gui.cpp @@ -137,7 +137,7 @@ struct GUI_Target{ i32 list_view_max; GUI_id scroll_id; - f32 delta; + i32 delta; b32 has_keys; b32 animating; b32 did_file; @@ -662,7 +662,7 @@ gui_get_scroll_vars(GUI_Target *target, GUI_id scroll_context_id, GUI_Scroll_Var *vars_out = target->scroll_updated; *region_out = target->region_updated; - vars_out->target_y = clamp(0.f, vars_out->target_y, vars_out->max_y); + vars_out->target_y = clamp(0, vars_out->target_y, vars_out->max_y); if (gui_id_eq(target->active, gui_id_scrollbar())){ result = 1; @@ -685,7 +685,7 @@ gui_post_scroll_vars(GUI_Target *target, GUI_Scroll_Vars *vars_in, i32_Rect regi internal void gui_begin_scrollable(GUI_Target *target, GUI_id scroll_context_id, - GUI_Scroll_Vars scroll_vars, f32 delta, b32 show_bar){ + GUI_Scroll_Vars scroll_vars, i32 delta, b32 show_bar){ GUI_Header *h; gui_begin_serial_section(target); @@ -735,7 +735,7 @@ struct GUI_Session{ i32_Rect full_rect; i32_Rect rect; - f32 suggested_max_y; + i32 suggested_max_y; i32 clip_y; i32 line_height; @@ -833,17 +833,14 @@ gui_scrollbar_top(i32_Rect bar, i32_Rect *top){ } internal void -gui_scrollbar_slider(i32_Rect bar, i32_Rect *slider, f32 s, f32 *min_out, f32 *max_out, f32 target_min, f32 target_max){ - i32 h, w = (bar.x1 - bar.x0); - i32 min, max, pos; +gui_scrollbar_slider(i32_Rect bar, i32_Rect *slider, f32 s, f32 *min_out, f32 *max_out, i32 target_min, i32 target_max){ + i32 h = 0, w = (bar.x1 - bar.x0); + i32 min = 0, max = 0, pos = 0; - f32 screen_size; - f32 full_size; - f32 ratio; + f32 screen_size = (f32)(bar.y1 - bar.y0); + f32 full_size = (f32)(target_max - target_min + screen_size); + f32 ratio = 1.f; - screen_size = (f32)(bar.y1 - bar.y0); - full_size = (f32)(target_max - target_min + screen_size); - ratio = 1.f; if (full_size > screen_size){ ratio = screen_size/full_size; } @@ -1158,7 +1155,7 @@ gui_interpret(GUI_Target *target, GUI_Session *session, GUI_Header *h, case guicom_end_scrollable_section: always_give_to_user = 1; session->suggested_max_y = - (f32)(session->scrollable_items_bottom - + CEIL32(session->scrollable_items_bottom - (session->full_rect.y0 + session->full_rect.y1)*.5f); if (session->suggested_max_y < 0){ session->suggested_max_y = 0; @@ -1218,16 +1215,16 @@ gui_interpret(GUI_Target *target, GUI_Session *session, GUI_Header *h, } struct GUI_View_Jump{ - f32 view_min; - f32 view_max; + i32 view_min; + i32 view_max; }; internal GUI_View_Jump gui_compute_view_jump(i32_Rect scroll_region, i32_Rect position){ GUI_View_Jump jump = {0}; i32 region_h = scroll_region.y1 - scroll_region.y0; - jump.view_min = (f32)position.y1 - scroll_region.y0 - region_h; - jump.view_max = (f32)position.y0 - scroll_region.y0; + jump.view_min = position.y1 - scroll_region.y0 - region_h; + jump.view_max = position.y0 - scroll_region.y0; return(jump); } @@ -1253,8 +1250,8 @@ gui_standard_list(GUI_Target *target, GUI_id id, GUI_Scroll_Vars *vars, i32_Rect if (update->has_index_position){ GUI_View_Jump jump = gui_compute_view_jump(scroll_region, update->index_position); - jump.view_min = jump.view_min + 45.f; - jump.view_max = jump.view_max - 45.f; + jump.view_min = jump.view_min + 45; + jump.view_max = jump.view_max - 45; *vars = gui_do_jump(target, jump, *vars); } diff --git a/4ed_math.cpp b/4ed_math.cpp index de324c35..ac5bee8f 100644 --- a/4ed_math.cpp +++ b/4ed_math.cpp @@ -483,6 +483,25 @@ clamp(f32 a, f32 n, f32 z){ return (n); } +inline i32 +clamp_bottom(i32 a, i32 n){ + if (n < a) n = a; + return (n); +} + +inline i32 +clamp_top(i32 n, i32 z){ + if (n > z) n = z; + return (n); +} + +inline i32 +clamp(i32 a, i32 n, i32 z){ + if (n < a) n = a; + else if (n > z) n = z; + return (n); +} + /* * Color */ diff --git a/4ed_mem.cpp b/4ed_mem.cpp index 6be08ccb..0e9a3ef6 100644 --- a/4ed_mem.cpp +++ b/4ed_mem.cpp @@ -191,5 +191,15 @@ general_memory_reallocate_nocopy(General_Memory *general, void *old, i32 size, u #define gen_array(g, T, size) (T*)general_memory_allocate(g, sizeof(T)*(size), 0) #define gen_block(g, size) general_memory_open(g, size, 0) +internal String +make_string_terminated(Partition *part, char *str, int len){ + char *space = (char*)push_array(part, char, len + 1); + String string = make_string(str, len, len+1); + copy_fast_unsafe(space, string); + string.str = space; + terminate_with_null(&string); + return(string); +} + // BOTTOM diff --git a/4ed_meta.h b/4ed_meta.h index c899630e..6e3fcb9d 100644 --- a/4ed_meta.h +++ b/4ed_meta.h @@ -156,5 +156,4 @@ LargeRoundUp(i32 x, i32 granularity){ #define Gbytes(n) (((u64)n) << 30) #define Tbytes(n) (((u64)n) << 40) -#endif - +#endif \ No newline at end of file diff --git a/README.txt b/README.txt index 1a9abc38..08d26851 100644 --- a/README.txt +++ b/README.txt @@ -1,4 +1,4 @@ -Distribution Date: 21.6.2016 (dd.mm.yyyy) +Distribution Date: 23.6.2016 (dd.mm.yyyy) Thank you for contributing to the 4coder project! diff --git a/SUPERREADME.txt b/SUPERREADME.txt index af051aab..82aaf09e 100644 --- a/SUPERREADME.txt +++ b/SUPERREADME.txt @@ -1,4 +1,4 @@ -Distribution Date: 21.6.2016 (dd.mm.yyyy) +Distribution Date: 23.6.2016 (dd.mm.yyyy) Thank you for contributing to the 4coder project! diff --git a/build_all.bat b/build_all.bat index b5a59566..1b66b8c2 100644 --- a/build_all.bat +++ b/build_all.bat @@ -23,7 +23,7 @@ popd pushd ..\build REM call "..\code\buildsuper.bat" ..\code\4coder_default_bindings.cpp -call "..\code\buildsuper.bat" ..\code\power\4coder_experiments.cpp + call "..\code\buildsuper.bat" ..\code\power\4coder_experiments.cpp REM call "..\code\buildsuper.bat" ..\code\power\4coder_casey.cpp REM call "..\code\buildsuper.bat" ..\4vim\4coder_chronal.cpp if %ERRORLEVEL% neq 0 (set FirstError=1) diff --git a/custom_api_spec.cpp b/custom_api_spec.cpp index 3e867ca1..0e91d211 100644 --- a/custom_api_spec.cpp +++ b/custom_api_spec.cpp @@ -12,22 +12,21 @@ File_List Get_File_List(Application_Links *app, char *dir, int len); void Free_File_List(Application_Links *app, File_List list); // Clipboard -int Clipboard_Post(Application_Links *app, char *str, int len); -int Clipboard_Count(Application_Links *app); -int Clipboard_Index(Application_Links *app, int index, char *out, int len); + +// TODO(allen): extend this API out a little bit to allow for future expansion. +void Clipboard_Post(Application_Links *app, char *str, int len); +int Clipboard_Count(Application_Links *app); +int Clipboard_Index(Application_Links *app, int index, char *out, int len); // Direct buffer manipulation Buffer_Summary Get_Buffer_First(Application_Links *app, unsigned int access); void Get_Buffer_Next(Application_Links *app, Buffer_Summary *buffer, unsigned int access); -Buffer_Summary Get_Buffer(Application_Links *app, int index, unsigned int access); -Buffer_Summary Get_Parameter_Buffer(Application_Links *app, int param_index, unsigned int access); -Buffer_Summary Get_Buffer_By_Name(Application_Links *app, char *filename, int len, unsigned int access); +Buffer_Summary Get_Buffer(Application_Links *app, int buffer_id, unsigned int access); +Buffer_Summary Get_Buffer_By_Name(Application_Links *app, char *name, int len, unsigned int access); -int Refresh_Buffer(Application_Links *app, Buffer_Summary *buffer); - -int Buffer_Read_Range(Application_Links *app, Buffer_Summary *buffer, int start, int end, char *out); int Buffer_Seek(Application_Links *app, Buffer_Summary *buffer, int start_pos, int seek_forward, unsigned int flags); +int Buffer_Read_Range(Application_Links *app, Buffer_Summary *buffer, int start, int end, char *out); int Buffer_Replace_Range(Application_Links *app, Buffer_Summary *buffer, int start, int end, char *str, int len); int Buffer_Set_Setting(Application_Links *app, Buffer_Summary *buffer, int setting, int value); @@ -43,8 +42,6 @@ void Get_View_Next(Application_Links *app, View_Summary *view, unsigned int acce View_Summary Get_View(Application_Links *app, int index, unsigned int access); View_Summary Get_Active_View(Application_Links *app, unsigned int access); -int Refresh_View(Application_Links *app, View_Summary *view); - int View_Auto_Tab (Application_Links *app, View_Summary *view, int start, int end, int tab_width, unsigned int flags); Full_Cursor View_Compute_Cursor (Application_Links *app, View_Summary *view, Buffer_Seek seek); int View_Set_Cursor (Application_Links *app, View_Summary *view, Buffer_Seek seek, int set_preferred_x); diff --git a/power/4coder_casey.cpp b/power/4coder_casey.cpp index 08a0957a..01539526 100644 --- a/power/4coder_casey.cpp +++ b/power/4coder_casey.cpp @@ -412,7 +412,7 @@ DeleteAfterCommand(struct Application_Links *app, unsigned long long CommandID) else{ exec_command(app, (Custom_Command_Function*)CommandID); } - app->refresh_view(app, &view); + refresh_view(app, &view); int pos1 = view.cursor.pos; Range range = make_range(pos1, pos2); @@ -438,7 +438,7 @@ CUSTOM_COMMAND_SIG(casey_kill_to_end_of_line) int pos2 = view.cursor.pos; exec_command(app, seek_end_of_line); - app->refresh_view(app, &view); + refresh_view(app, &view); int pos1 = view.cursor.pos; Range range = make_range(pos1, pos2); @@ -761,19 +761,18 @@ casey_parse_error(Application_Links *app, Buffer_Summary buffer, View_Summary vi { Parsed_Error result = {}; - app->refresh_view(app, &view); + refresh_view(app, &view); int restore_pos = view.cursor.pos; + // TODO(allen): view_compute_cursor can get these + // positions without ever changing the position of the cursor. app->view_set_cursor(app, &view, seek_line_char(view.cursor.line, 1), 1); - app->refresh_view(app, &view); int start = view.cursor.pos; app->view_set_cursor(app, &view, seek_line_char(view.cursor.line, 65536), 1); - app->refresh_view(app, &view); int end = view.cursor.pos; app->view_set_cursor(app, &view, seek_pos(restore_pos), 1); - app->refresh_view(app, &view); int size = end - start; @@ -861,7 +860,6 @@ casey_seek_error_dy(Application_Links *app, int dy) { int prev_pos = compilation_view.cursor.pos; app->view_set_cursor(app, &compilation_view, seek_line_char(compilation_view.cursor.line + dy, 0), 1); - app->refresh_view(app, &compilation_view); if(compilation_view.cursor.pos != prev_pos) { Parsed_Error Error = casey_parse_error(app, Buffer, compilation_view); @@ -1333,14 +1331,15 @@ DEFINE_BIMODAL_KEY(modal_page_up, cmdid_page_up, seek_whitespace_up); DEFINE_BIMODAL_KEY(modal_page_down, cmdid_page_down, seek_whitespace_down); DEFINE_BIMODAL_KEY(modal_tab, cmdid_word_complete, cmdid_word_complete); -HOOK_SIG(casey_file_settings) +OPEN_FILE_HOOK_SIG(casey_file_settings) { // NOTE(allen|a4): As of alpha 4 hooks can have parameters which are // received through functions like this app->get_parameter_buffer. // This is different from the past where this hook got a buffer // from app->get_active_buffer. unsigned int access = AccessAll; - Buffer_Summary buffer = app->get_parameter_buffer(app, 0, access); + //Buffer_Summary buffer = app->get_parameter_buffer(app, 0, access); + Buffer_Summary buffer = app->get_buffer(app, buffer_id, access); int treat_as_code = 0; int treat_as_project = 0; @@ -1566,7 +1565,7 @@ extern "C" GET_BINDING_DATA(get_bindings) Bind_Helper *context = &context_actual; set_hook(context, hook_start, casey_start); - set_hook(context, hook_open_file, casey_file_settings); + set_open_file_hook(context, casey_file_settings); set_scroll_rule(context, casey_smooth_scroll_rule); EnumWindows(win32_find_4coder_window, 0); diff --git a/power/4coder_chronal.cpp b/power/4coder_chronal.cpp deleted file mode 100644 index b9a7b8f2..00000000 --- a/power/4coder_chronal.cpp +++ /dev/null @@ -1,304 +0,0 @@ - -// TOP -#include "4coder_default.cpp" - -//#include "chr_winutils.h" - -#ifndef literal -#define literal(s) (s), (sizeof(s)-1) -#endif - -#define rgb_color(r, g, b) (r << 16 + g << 8 + b << 0) -#define hex_color(hex) hex - -const int color_margin_normal = 0x341313; -const int color_margin_insert = 0x5a3619; - -enum Vim_Maps { - mapid_normal = mapid_global, - mapid_insert = 0, - mapid_replace, - mapid_visual, - - // There are a bunch of different chord "starters" that result in keys having - // different behaviors. There's no better way to handle this right now than - // just explicitly creating maps for each one. - - //TODO(chronister): Chords can be built up, so this can have potentially huge - //combinatorics... what I *want* is a way to build up an actual stack of commands - //... - - mapid_chord_delete, - mapid_chord_yank, - mapid_chord_g, -}; - -HOOK_SIG(chronal_init){ - exec_command(app, cmdid_open_panel_vsplit); - exec_command(app, cmdid_change_active_panel); - - app->change_theme(app, literal("4coder")); - app->change_font(app, literal("Hack")); - - const int color_bg = 0x15100f; - const int color_bar = 0x1c1212; - const int color_bar_hover = 0x261414; - const int color_bar_active = 0x341313; - const int color_text = 0x916550; - const int color_comment = 0x9d5b25; - const int color_string_literal = 0x9c2d21; - const int color_num_literals = 0xc56211; - const int color_keyword = 0xf74402; - Theme_Color colors[] = { - { Stag_Back, color_bg }, - { Stag_Margin, color_bar }, - { Stag_Margin_Hover, color_bar_hover }, - { Stag_Margin_Active, color_margin_normal }, - { Stag_Bar, color_bar }, - { Stag_Bar_Active, color_bar_active }, - { Stag_Base, color_text }, - { Stag_Default, color_text }, - { Stag_Comment, color_comment }, - { Stag_Int_Constant, color_num_literals }, - { Stag_Float_Constant, color_num_literals }, - { Stag_Str_Constant, color_string_literal }, - { Stag_Char_Constant, color_string_literal }, - { Stag_Bool_Constant, color_keyword }, - { Stag_Keyword, color_keyword }, - { Stag_Special_Character, color_keyword }, - { Stag_Preproc, color_keyword }, - }; - - app->set_theme_colors(app, colors, ArrayCount(colors)); - - push_parameter(app, par_key_mapid, mapid_normal); - exec_command(app, cmdid_set_settings); - - // no meaning for return - return(0); -} - -HOOK_SIG(chronal_file_settings){ - // NOTE(allen|a4): In hooks that want parameters, such as this file - // created hook. The file created hook is guaranteed to have only - // and exactly one buffer parameter. In normal command callbacks - // there are no parameter buffers. - Buffer_Summary buffer = app->get_parameter_buffer(app, 0); - assert(buffer.exists); - - int treat_as_code = 0; - - if (buffer.file_name && buffer.size < (16 << 20)){ - String ext = file_extension(make_string(buffer.file_name, buffer.file_name_len)); - if (match(ext, make_lit_string("cpp"))) treat_as_code = 1; - else if (match(ext, make_lit_string("h"))) treat_as_code = 1; - else if (match(ext, make_lit_string("c"))) treat_as_code = 1; - else if (match(ext, make_lit_string("hpp"))) treat_as_code = 1; - } - - push_parameter(app, par_lex_as_cpp_file, treat_as_code); - push_parameter(app, par_wrap_lines, !treat_as_code); - push_parameter(app, par_key_mapid, mapid_normal); - exec_command(app, cmdid_set_settings); - - // no meaning for return - return(0); -} - -/* * - * Custom commands * - * */ - - - -CUSTOM_COMMAND_SIG(do_nothing){ -} - -CUSTOM_COMMAND_SIG(enter_insert_mode){ - push_parameter(app, par_key_mapid, mapid_insert); - exec_command(app, cmdid_set_settings); - - Theme_Color colors[] = { - { Stag_Bar_Active, color_margin_insert }, - { Stag_Margin_Active, color_margin_insert }, - }; - app->set_theme_colors(app, colors, ArrayCount(colors)); -} - -CUSTOM_COMMAND_SIG(enter_normal_mode){ - push_parameter(app, par_key_mapid, mapid_normal); - exec_command(app, cmdid_set_settings); - - Theme_Color colors[] = { - { Stag_Bar_Active, color_margin_normal }, - { Stag_Margin_Active, color_margin_normal }, - }; - app->set_theme_colors(app, colors, ArrayCount(colors)); -} - -CUSTOM_COMMAND_SIG(seek_forward_word_start){ - View_Summary view; - view = app->get_active_view(app); - push_parameter(app, par_flags, BoundryToken); - exec_command(app, cmdid_seek_right); - app->refresh_view(app, &view); -} - -CUSTOM_COMMAND_SIG(seek_backward_word_start){ - View_Summary view; - view = app->get_active_view(app); - push_parameter(app, par_flags, BoundryToken | BoundryWhitespace); - exec_command(app, cmdid_seek_left); - app->refresh_view(app, &view); -} - -CUSTOM_COMMAND_SIG(seek_forward_word_end){ - View_Summary view; - view = app->get_active_view(app); - push_parameter(app, par_flags, BoundryToken | BoundryWhitespace); - exec_command(app, cmdid_seek_right); - app->refresh_view(app, &view); -} - -CUSTOM_COMMAND_SIG(newline_then_insert_before){ - exec_command(app, cmdid_seek_beginning_of_line); - write_string(app, make_lit_string("\n")); - exec_command(app, cmdid_move_left); - exec_command(app, enter_insert_mode); -} - -CUSTOM_COMMAND_SIG(newline_then_insert_after){ - exec_command(app, cmdid_seek_end_of_line); - write_string(app, make_lit_string("\n")); - exec_command(app, enter_insert_mode); -} - -CUSTOM_COMMAND_SIG(begin_chord_delete){ - push_parameter(app, par_key_mapid, mapid_chord_delete); - exec_command(app, cmdid_set_settings); -} - -CUSTOM_COMMAND_SIG(delete_line){ - View_Summary view; - Buffer_Summary buffer; - int pos1, pos2; - view = app->get_active_view(app); - - exec_command(app, cmdid_seek_beginning_of_line); - app->refresh_view(app, &view); - pos1 = view.cursor.pos; - - exec_command(app, cmdid_seek_end_of_line); - app->refresh_view(app, &view); - pos2 = view.cursor.pos; - - Range range = make_range(pos1, pos2); - buffer = app->get_buffer(app, view.buffer_id); - app->buffer_replace_range(app, &buffer, range.start, range.end, 0, 0); -} - -CUSTOM_COMMAND_SIG(delete_word){ - View_Summary view; - Buffer_Summary buffer; - int pos1, pos2; - view = app->get_active_view(app); - - exec_command(app, seek_backward_word_start); - app->refresh_view(app, &view); - pos1 = view.cursor.pos; - - exec_command(app, seek_forward_word_end); - app->refresh_view(app, &view); - pos2 = view.cursor.pos; - - Range range = make_range(pos1, pos2); - buffer = app->get_buffer(app, view.buffer_id); - app->buffer_replace_range(app, &buffer, range.start, range.end, 0, 0); - -} - -void -chronal_get_bindings(Bind_Helper *context){ - set_hook(context, hook_start, chronal_init); - set_hook(context, hook_open_file, chronal_file_settings); - - set_scroll_rule(context, smooth_scroll_rule); - - /* * - * SECTION: Vim keybindings * - * */ - - /* Normal mode. - * aka "It's eating all my input, help!" mode. - * Shortcuts for navigation, entering various modes, - * dealing with the editor. - */ - begin_map(context, mapid_normal); - - bind_vanilla_keys(context, do_nothing); - - bind(context, 'w', MDFR_NONE, seek_forward_word_start); - bind(context, 'e', MDFR_NONE, seek_forward_word_end); - bind(context, 'b', MDFR_NONE, seek_backward_word_start); - bind(context, '$', MDFR_NONE, cmdid_seek_end_of_line); - bind(context, '0', MDFR_NONE, cmdid_seek_beginning_of_line); - - bind(context, 'h', MDFR_NONE, cmdid_move_left); - bind(context, 'j', MDFR_NONE, cmdid_move_down); - bind(context, 'k', MDFR_NONE, cmdid_move_up); - bind(context, 'l', MDFR_NONE, cmdid_move_right); - - bind(context, 'u', MDFR_CTRL, cmdid_page_up); - bind(context, 'd', MDFR_CTRL, cmdid_page_down); - - bind(context, 'x', MDFR_NONE, cmdid_delete); - - bind(context, 'u', MDFR_NONE, cmdid_undo); - bind(context, 'r', MDFR_CTRL, cmdid_redo); - - bind(context, '/', MDFR_NONE, search); - - bind(context, 'i', MDFR_NONE, enter_insert_mode); - bind(context, 'o', MDFR_NONE, newline_then_insert_after); - bind(context, 'O', MDFR_NONE, newline_then_insert_before); - - bind(context, 'n', MDFR_CTRL, cmdid_word_complete); - - // TEMP (will be replaced later by :statusbar commands) - bind(context, 'o', MDFR_CTRL, cmdid_interactive_open); - bind(context, 'c', MDFR_CTRL, cmdid_open_color_tweaker); - end_map(context); - - /* Insert mode - * You type and it goes into the buffer. Nice and simple. - * Escape to exit. - */ - begin_map(context, mapid_insert); - inherit_map(context, mapid_nomap); - - bind_vanilla_keys(context, cmdid_write_character); - bind(context, key_back, MDFR_NONE, cmdid_backspace); - - bind(context, key_esc, MDFR_NONE, enter_normal_mode); - - end_map(context); - -#if 1 - - /* Chord "modes". - * They're not really an explicit mode per-say, but the meaning of key presses - * does change once a chord starts, and is context-dependent. - * TODO(chronister): I want these to properly build on each other. - */ - begin_map(context, mapid_chord_delete); - inherit_map(context, mapid_nomap); - - bind(context, 'd', MDFR_NONE, delete_line); - bind(context, 'w', MDFR_NONE, delete_word); - - end_map(context); - -#endif -} - - diff --git a/power/4coder_experiments.cpp b/power/4coder_experiments.cpp index 5c23e086..eef4e354 100644 --- a/power/4coder_experiments.cpp +++ b/power/4coder_experiments.cpp @@ -263,7 +263,7 @@ get_bindings(void *data, int size){ Bind_Helper *context = &context_; set_hook(context, hook_start, experimental_start_hook); - set_hook(context, hook_open_file, my_file_settings); + set_open_file_hook(context, my_file_settings); set_scroll_rule(context, smooth_scroll_rule); diff --git a/win32_4ed.cpp b/win32_4ed.cpp index b0023e0c..c872fdd0 100644 --- a/win32_4ed.cpp +++ b/win32_4ed.cpp @@ -830,12 +830,10 @@ Sys_Set_File_List_Sig(system_set_file_list){ } internal -Sys_File_Track_Sig(system_file_track){ -} +Sys_File_Track_Sig(system_file_track){} internal -Sys_File_Untrack_Sig(system_file_untrack){ -} +Sys_File_Untrack_Sig(system_file_untrack){} internal Sys_File_Unique_Hash_Sig(system_file_unique_hash){ @@ -844,15 +842,15 @@ Sys_File_Unique_Hash_Sig(system_file_unique_hash){ HANDLE handle; char space[1024]; String str; - + if (filename.size < sizeof(space)){ str = make_fixed_width_string(space); copy(&str, filename); terminate_with_null(&str); handle = CreateFile(str.str, GENERIC_READ, 0, 0, - OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); - + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); + *success = 0; if (handle && handle != INVALID_HANDLE_VALUE){ if (GetFileInformationByHandle(handle, &info)){ @@ -861,7 +859,7 @@ Sys_File_Unique_Hash_Sig(system_file_unique_hash){ hash.d[0] = info.nFileIndexLow; *success = 1; } - + CloseHandle(handle); } } @@ -871,12 +869,16 @@ Sys_File_Unique_Hash_Sig(system_file_unique_hash){ // NOTE(allen): Exposed to the custom layer. internal -FILE_EXISTS_SIG(system_file_exists){ +FILE_EXISTS_SIG(system_file_exists)/* +DOC_PARAM(filename, the full path to a file) +DOC_PARAM(len, the number of characters in the filename string) +DOC_RETURN(returns non-zero if the file exists, returns zero if the file does not exist) +*/{ char full_filename_space[1024]; String full_filename; HANDLE file; b32 result; - + result = 0; if (len < sizeof(full_filename_space)){ @@ -885,7 +887,7 @@ FILE_EXISTS_SIG(system_file_exists){ terminate_with_null(&full_filename); file = CreateFile(full_filename.str, GENERIC_READ, 0, 0, - OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if (file != INVALID_HANDLE_VALUE){ CloseHandle(file); @@ -904,11 +906,33 @@ b32 Win32DirectoryExists(char *path){ // NOTE(allen): Exposed to the custom layer. internal -DIRECTORY_CD_SIG(system_directory_cd){ +DIRECTORY_CD_SIG(system_directory_cd)/* +DOC_PARAM(dir, a string buffer containing a directory) +DOC_PARAM(len, the length of the string in the string buffer) +DOC_PARAM(capacity, the maximum size of the string buffer) +DOC_PARAM(rel_path, the path to change to, may include '.' or '..') +DOC_PARAM(rel_len, the length of the rel_path string) +DOC_RETURN(returns non-zero if the call succeeds, returns zero otherwise) +DOC +( +This call succeeds if the directory exists and the new directory fits inside the dir buffer. +If the call succeeds the dir buffer is filled with the new directory and len contains the +length of the string in the buffer. + +For instance if dir contains "C:/Users/MySelf" and rel is "Documents" the buffer will contain +"C:/Users/MySelf/Documents" and len will contain the length of that string. This call can +also be used with rel as ".." to traverse to parent folders. +) +*/{ String directory = make_string(dir, *len, capacity); b32 result = 0; i32 old_size; + char rel_path_space[1024]; + String rel_path_string = make_fixed_width_string(rel_path_space); + copy(&rel_path_string, make_string(rel_path, rel_len)); + terminate_with_null(&rel_path_string); + if (rel_path[0] != 0){ if (rel_path[0] == '.' && rel_path[1] == 0){ result = 1; @@ -951,7 +975,11 @@ Sys_Get_Binary_Path_Sig(system_get_binary_path){ } // NOTE(allen): Exposed to the custom layer. -GET_4ED_PATH_SIG(system_get_4ed_path){ +GET_4ED_PATH_SIG(system_get_4ed_path)/* +DOC_PARAM(out, a buffer that receives the path to the 4ed executable file) +DOC_PARAM(capacity, the maximum capacity of the output buffer) +DOC_RETURN(returns non-zero on success, returns zero on failure) +*/{ String str = make_string(out, 0, capacity); return(system_get_binary_path(&str)); }