Progress towards a new dynamic scope API

This commit is contained in:
Allen Webster 2018-08-11 20:45:09 -07:00
commit 0f23470717
39 changed files with 1661 additions and 582 deletions

View File

@ -386,17 +386,28 @@ GLOBAL_VAR Mouse_State null_mouse_state = {0};
Throughout the API ranges are thought of in the form [min,max) where max is "one past the end" of the range that is actually read/edited/modified.) */ Throughout the API ranges are thought of in the form [min,max) where max is "one past the end" of the range that is actually read/edited/modified.) */
UNION Range{ UNION Range{
STRUCT{ STRUCT{
/* DOC(This is the smaller value in the range, it is also the 'start'.) */ /* DOC(This is the smaller value in the range.) */
int32_t min; int32_t min;
/* DOC(This is the larger value in the range, it is also the 'end'.) */ /* DOC(This is the larger value in the range.) */
int32_t max; int32_t max;
}; };
STRUCT{ STRUCT{
/* DOC(This is the start of the range, it is also the 'min'.) */ /* DOC(This is the start of the range, unioned with min.) */
int32_t start; int32_t start;
/* DOC(This is the end of the range, it is also the 'max'.) */ /* DOC(This is the end of the range, unioned with max.) */
int32_t end; int32_t end;
}; };
STRUCT{
/* DOC(This is the first value in the range, unioned with min.) */
int32_t first;
/* DOC(This is one_past_the_last value in the range, unioned with max.) */
int32_t one_past_last;
};
};
STRUCT Range_Array{
Range *ranges;
int32_t count;
}; };
/* DOC(Parser_String_And_Type contains a string and type integer used to specify information about keywords to the parser.) */ /* DOC(Parser_String_And_Type contains a string and type integer used to specify information about keywords to the parser.) */
@ -688,16 +699,29 @@ STRUCT Query_Bar{
String string; String string;
}; };
/* DOC(This feature is not implemented.) */ TYPEDEF int32_t Managed_Variable_ID;
STRUCT Event_Message{ static Managed_Variable_ID ManagedVariableIndex_ERROR = -1;
/* DOC(This feature is not implemented.) */
int32_t type; ENUM(int32_t, Dynamic_Scope_Type){
DynamicScopeType_Global = 0,
DynamicScopeType_Intersected = 1,
DynamicScopeType_Buffer = 2,
DynamicScopeType_View = 3,
};
STRUCT Dynamic_Scope{
Dynamic_Scope_Type type;
union{
uint64_t intersected_opaque_handle;
View_ID view_id;
Buffer_ID buffer_id;
};
}; };
ENUM(int16_t, UI_Item_Type){ ENUM(int16_t, UI_Item_Type){
UIType_Option = 0, UIType_Option = 0,
UIType_TextField = 1, UIType_TextField = 1,
UIType_ThemePreview = 2, UIType_ColorTheme = 2,
}; };
ENUM(int8_t, UI_Activation_Level){ ENUM(int8_t, UI_Activation_Level){
@ -727,8 +751,9 @@ STRUCT UI_Item{
String string; String string;
} text_field; } text_field;
struct{ struct{
int32_t theme_index; String string;
} theme_preview; int32_t index;
} color_theme;
}; };
void *user_data; void *user_data;
i32_Rect rectangle; i32_Rect rectangle;
@ -840,7 +865,7 @@ STRUCT Buffer_Batch_Edit{
TYPEDEF void Custom_Command_Function(struct Application_Links *app); TYPEDEF void Custom_Command_Function(struct Application_Links *app);
#if defined(CUSTOM_COMMAND_SIG) || defined(CUSTOM_DOC) || defined(CUSTOM_ALIAS) #if defined(CUSTOM_COMMAND_SIG) || defined(CUSTOM_DOC) || defined(CUSTOM_ALIAS)
#error Please don't define CUSTOM_COMMAND_SIG, CUSTOM_DOC, or CUSTOM_ALIAS #error Please do not define CUSTOM_COMMAND_SIG, CUSTOM_DOC, or CUSTOM_ALIAS
#endif #endif
#if !defined(META_PASS) #if !defined(META_PASS)

View File

@ -974,16 +974,28 @@ CUSTOM_DOC("Queries the user for a string, and incrementally replace every occur
//////////////////////////////// ////////////////////////////////
CUSTOM_COMMAND_SIG(save_all_dirty_buffers) static void
CUSTOM_DOC("Saves all buffers marked dirty (showing the '*' indicator).") save_all_dirty_buffers_with_postfix(Application_Links *app, String postfix){
{
for (Buffer_Summary buffer = get_buffer_first(app, AccessOpen); for (Buffer_Summary buffer = get_buffer_first(app, AccessOpen);
buffer.exists; buffer.exists;
get_buffer_next(app, &buffer, AccessOpen)){ get_buffer_next(app, &buffer, AccessOpen)){
if (buffer.dirty == DirtyState_UnsavedChanges){ if (buffer.dirty == DirtyState_UnsavedChanges){
String file_name = make_string(buffer.file_name, buffer.file_name_len);
if (file_name.size >= postfix.size){
String file_name_post = substr_tail(file_name, file_name.size - postfix.size);
if (match(file_name_post, postfix)){
save_buffer(app, &buffer, buffer.file_name, buffer.file_name_len, 0); save_buffer(app, &buffer, buffer.file_name, buffer.file_name_len, 0);
} }
} }
}
}
}
CUSTOM_COMMAND_SIG(save_all_dirty_buffers)
CUSTOM_DOC("Saves all buffers marked dirty (showing the '*' indicator).")
{
String empty = {0};
save_all_dirty_buffers_with_postfix(app, empty);
} }
static void static void
@ -1462,20 +1474,31 @@ CUSTOM_DOC("Saves the current buffer.")
exec_command(app, cmdid_save); exec_command(app, cmdid_save);
} }
CUSTOM_COMMAND_SIG(open_color_tweaker)
CUSTOM_DOC("Opens the 4coder colors and fonts selector menu.")
{
// TODO(allen): TODO(allen): TODO(allen): TODO(allen): TODO(allen): TODO(allen): TODO(allen):
// TODO(allen): TODO(allen): TODO(allen): TODO(allen): TODO(allen): TODO(allen):
// TODO(allen): TODO(allen): TODO(allen): TODO(allen): TODO(allen):
// TODO(allen): TODO(allen): TODO(allen): TODO(allen):
// TODO(allen): TODO(allen): TODO(allen):
// TODO(allen): TODO(allen):
// TODO(allen):
}
//////////////////////////////// ////////////////////////////////
CUSTOM_COMMAND_SIG(reload_themes)
CUSTOM_DOC("Loads all the theme files in the theme folder, replacing duplicates with the new theme data.")
{
String fcoder_extension = make_lit_string(".4coder");
save_all_dirty_buffers_with_postfix(app, fcoder_extension);
Partition *scratch = &global_part;
Temp_Memory temp = begin_temp_memory(scratch);
load_folder_of_themes_into_live_set(app, scratch, "themes");
String name = get_theme_name(app, scratch, 0);
int32_t theme_count = get_theme_count(app);
for (int32_t i = 1; i < theme_count; i += 1){
Temp_Memory sub_temp = begin_temp_memory(scratch);
String style_name = get_theme_name(app, scratch, i);
if (match(name, style_name)){
change_theme_by_index(app, i);
break;
}
end_temp_memory(sub_temp);
}
end_temp_memory(temp);
}
CUSTOM_COMMAND_SIG(open_in_other) CUSTOM_COMMAND_SIG(open_in_other)
CUSTOM_DOC("Interactively opens a file in the other panel.") CUSTOM_DOC("Interactively opens a file in the other panel.")
{ {

View File

@ -50,10 +50,10 @@ CUSTOM_DOC("At the cursor, insert the text at the top of the clipboard.")
int32_t count = clipboard_count(app, 0); int32_t count = clipboard_count(app, 0);
if (count > 0){ if (count > 0){
View_Summary view = get_active_view(app, access); View_Summary view = get_active_view(app, access);
Dynamic_Scope scope = view_get_dynamic_scope(app, view.view_id);
view_set_variable(app, &view, view_next_rewrite_loc, RewritePaste); managed_variable_set(app, scope, view_next_rewrite_loc, RewritePaste);
int32_t paste_index = 0; int32_t paste_index = 0;
view_set_variable(app, &view, view_paste_index_loc, paste_index); managed_variable_set(app, scope, view_paste_index_loc, paste_index);
int32_t len = clipboard_index(app, 0, paste_index, 0, 0); int32_t len = clipboard_index(app, 0, paste_index, 0, 0);
char *str = 0; char *str = 0;
@ -87,15 +87,16 @@ CUSTOM_DOC("If the previous command was paste or paste_next, replaces the paste
int32_t count = clipboard_count(app, 0); int32_t count = clipboard_count(app, 0);
if (count > 0){ if (count > 0){
View_Summary view = get_active_view(app, access); View_Summary view = get_active_view(app, access);
Dynamic_Scope scope = view_get_dynamic_scope(app, view.view_id);
uint64_t rewrite = 0; uint64_t rewrite = 0;
view_get_variable(app, &view, view_rewrite_loc, &rewrite); managed_variable_get(app, scope, view_rewrite_loc, &rewrite);
if (rewrite == RewritePaste){ if (rewrite == RewritePaste){
view_set_variable(app, &view, view_next_rewrite_loc, RewritePaste); managed_variable_set(app, scope, view_next_rewrite_loc, RewritePaste);
uint64_t prev_paste_index = 0; uint64_t prev_paste_index = 0;
view_get_variable(app, &view, view_paste_index_loc, &prev_paste_index); managed_variable_get(app, scope, view_paste_index_loc, &prev_paste_index);
int32_t paste_index = (int32_t)prev_paste_index + 1; int32_t paste_index = (int32_t)prev_paste_index + 1;
view_set_variable(app, &view, view_paste_index_loc, paste_index); managed_variable_set(app, scope, view_paste_index_loc, paste_index);
int32_t len = clipboard_index(app, 0, paste_index, 0, 0); int32_t len = clipboard_index(app, 0, paste_index, 0, 0);
char *str = 0; char *str = 0;

View File

@ -1681,9 +1681,10 @@ load_folder_of_themes_into_live_set(Application_Links *app, Partition *scratch,
File_List list = get_file_list(app, path.str, path.size); File_List list = get_file_list(app, path.str, path.size);
for (uint32_t i = 0; i < list.count; ++i){ for (uint32_t i = 0; i < list.count; ++i){
File_Info *info = &list.infos[i]; File_Info *info = &list.infos[i];
if (info->folder) continue; if (info->folder){
continue;
}
String info_file_name = make_string(info->filename, info->filename_len); String info_file_name = make_string(info->filename, info->filename_len);
if (!match(file_extension(info_file_name), "4coder")) continue;
char file_name_space[512]; char file_name_space[512];
String file_name = make_fixed_width_string(file_name_space); String file_name = make_fixed_width_string(file_name_space);
copy(&file_name, path); copy(&file_name, path);

View File

@ -56,13 +56,15 @@ new_view_settings(Application_Links *app, View_Summary *view){
static void static void
view_set_passive(Application_Links *app, View_Summary *view, bool32 value){ view_set_passive(Application_Links *app, View_Summary *view, bool32 value){
view_set_variable(app, view, view_is_passive_loc, (uint64_t)value); Dynamic_Scope scope = view_get_dynamic_scope(app, view->view_id);
managed_variable_set(app, scope, view_is_passive_loc, (uint64_t)value);
} }
static bool32 static bool32
view_get_is_passive(Application_Links *app, View_Summary *view){ view_get_is_passive(Application_Links *app, View_Summary *view){
Dynamic_Scope scope = view_get_dynamic_scope(app, view->view_id);
uint64_t is_passive = 0; uint64_t is_passive = 0;
view_get_variable(app, view, view_is_passive_loc, &is_passive); managed_variable_get(app, scope, view_is_passive_loc, &is_passive);
return(is_passive != 0); return(is_passive != 0);
} }
@ -245,10 +247,10 @@ default_4coder_initialize(Application_Links *app, int32_t override_font_size, bo
load_folder_of_themes_into_live_set(app, &global_part, "themes"); load_folder_of_themes_into_live_set(app, &global_part, "themes");
load_config_and_apply(app, &global_part, &global_config, override_font_size, override_hinting); load_config_and_apply(app, &global_part, &global_config, override_font_size, override_hinting);
view_rewrite_loc = create_view_variable(app, "DEFAULT.rewrite" , (uint64_t)0); view_rewrite_loc = managed_variable_create_or_get_id(app, "DEFAULT.rewrite" , (uint64_t)0);
view_next_rewrite_loc = create_view_variable(app, "DEFAULT.next_rewrite", (uint64_t)0); view_next_rewrite_loc = managed_variable_create_or_get_id(app, "DEFAULT.next_rewrite", (uint64_t)0);
view_paste_index_loc = create_view_variable(app, "DEFAULT.paste_index" , (uint64_t)0); view_paste_index_loc = managed_variable_create_or_get_id(app, "DEFAULT.paste_index" , (uint64_t)0);
view_is_passive_loc = create_view_variable(app, "DEFAULT.is_passive" , (uint64_t)false); view_is_passive_loc = managed_variable_create_or_get_id(app, "DEFAULT.is_passive" , (uint64_t)false);
} }
static void static void

View File

@ -23,11 +23,28 @@ enum Rewrite_Type{
//////////////////////////////// ////////////////////////////////
struct ID_Based_Jump_Location{ struct ID_Line_Column_Jump_Location{
int32_t buffer_id; Buffer_ID buffer_id;
int32_t line; int32_t line;
int32_t column; int32_t column;
}; };
typedef ID_Line_Column_Jump_Location ID_Based_Jump_Location;
struct ID_Pos_Jump_Location{
Buffer_ID buffer_id;
int32_t pos;
};
struct Name_Line_Column_Location{
String file;
int32_t line;
int32_t column;
};
struct ID_Pos_Jump_Location_Array{
struct ID_Pos_Jump_Location *jumps;
int32_t count;
};
//////////////////////////////// ////////////////////////////////

View File

@ -30,10 +30,10 @@ static String locked_buffer = make_fixed_width_string(locked_buffer_space);
static View_ID build_footer_panel_view_id = 0; static View_ID build_footer_panel_view_id = 0;
static int32_t view_rewrite_loc = 0; static Managed_Variable_ID view_rewrite_loc = 0;
static int32_t view_next_rewrite_loc = 0; static Managed_Variable_ID view_next_rewrite_loc = 0;
static int32_t view_paste_index_loc = 0; static Managed_Variable_ID view_paste_index_loc = 0;
static int32_t view_is_passive_loc = 0; static Managed_Variable_ID view_is_passive_loc = 0;
static char out_buffer_space[1024]; static char out_buffer_space[1024];
@ -44,7 +44,7 @@ static char hot_directory_space[1024];
static bool32 suppressing_mouse = false; static bool32 suppressing_mouse = false;
static ID_Based_Jump_Location prev_location = {0}; static ID_Line_Column_Jump_Location prev_location = {0};
static Config_Data global_config = {0}; static Config_Data global_config = {0};

View File

@ -42,12 +42,13 @@ START_HOOK_SIG(default_start){
// also relies on this particular command caller hook. // also relies on this particular command caller hook.
COMMAND_CALLER_HOOK(default_command_caller){ COMMAND_CALLER_HOOK(default_command_caller){
View_Summary view = get_active_view(app, AccessAll); View_Summary view = get_active_view(app, AccessAll);
Dynamic_Scope scope = view_get_dynamic_scope(app, view.view_id);
view_set_variable(app, &view, view_next_rewrite_loc, 0); managed_variable_set(app, scope, view_next_rewrite_loc, 0);
exec_command(app, cmd); exec_command(app, cmd);
uint64_t next_rewrite = 0; uint64_t next_rewrite = 0;
view_get_variable(app, &view, view_next_rewrite_loc, &next_rewrite); managed_variable_get(app, scope, view_next_rewrite_loc, &next_rewrite);
view_set_variable(app, &view, view_rewrite_loc, next_rewrite); managed_variable_set(app, scope, view_rewrite_loc, next_rewrite);
return(0); return(0);
} }

View File

@ -30,7 +30,6 @@
#include "4coder_auto_indent.h" #include "4coder_auto_indent.h"
#include "4coder_search.h" #include "4coder_search.h"
#include "4coder_build_commands.h" #include "4coder_build_commands.h"
#include "4coder_jumping.h"
#include "4coder_jump_sticky.h" #include "4coder_jump_sticky.h"
#include "4coder_project_commands.h" #include "4coder_project_commands.h"
#include "4coder_function_list.h" #include "4coder_function_list.h"

View File

@ -25,6 +25,7 @@ struct Application_Links;
#define BUFFER_REMOVE_MARKERS_SIG(n) bool32 n(Application_Links *app, Buffer_Summary *buffer, Marker_Handle marker) #define BUFFER_REMOVE_MARKERS_SIG(n) bool32 n(Application_Links *app, Buffer_Summary *buffer, Marker_Handle marker)
#define BUFFER_GET_SETTING_SIG(n) bool32 n(Application_Links *app, Buffer_Summary *buffer, Buffer_Setting_ID setting, int32_t *value_out) #define BUFFER_GET_SETTING_SIG(n) bool32 n(Application_Links *app, Buffer_Summary *buffer, Buffer_Setting_ID setting, int32_t *value_out)
#define BUFFER_SET_SETTING_SIG(n) bool32 n(Application_Links *app, Buffer_Summary *buffer, Buffer_Setting_ID setting, int32_t value) #define BUFFER_SET_SETTING_SIG(n) bool32 n(Application_Links *app, Buffer_Summary *buffer, Buffer_Setting_ID setting, int32_t value)
#define BUFFER_GET_DYNAMIC_SCOPE_SIG(n) Dynamic_Scope n(Application_Links *app, Buffer_ID buffer_id)
#define BUFFER_TOKEN_COUNT_SIG(n) int32_t n(Application_Links *app, Buffer_Summary *buffer) #define BUFFER_TOKEN_COUNT_SIG(n) int32_t n(Application_Links *app, Buffer_Summary *buffer)
#define BUFFER_READ_TOKENS_SIG(n) bool32 n(Application_Links *app, Buffer_Summary *buffer, int32_t start_token, int32_t end_token, Cpp_Token *tokens_out) #define BUFFER_READ_TOKENS_SIG(n) bool32 n(Application_Links *app, Buffer_Summary *buffer, int32_t start_token, int32_t end_token, Cpp_Token *tokens_out)
#define BUFFER_GET_TOKEN_INDEX_SIG(n) bool32 n(Application_Links *app, Buffer_Summary *buffer, int32_t pos, Cpp_Get_Token_Result *get_result) #define BUFFER_GET_TOKEN_INDEX_SIG(n) bool32 n(Application_Links *app, Buffer_Summary *buffer, int32_t pos, Cpp_Get_Token_Result *get_result)
@ -41,6 +42,7 @@ struct Application_Links;
#define SET_ACTIVE_VIEW_SIG(n) bool32 n(Application_Links *app, View_Summary *view) #define SET_ACTIVE_VIEW_SIG(n) bool32 n(Application_Links *app, View_Summary *view)
#define VIEW_GET_SETTING_SIG(n) bool32 n(Application_Links *app, View_Summary *view, View_Setting_ID setting, int32_t *value_out) #define VIEW_GET_SETTING_SIG(n) bool32 n(Application_Links *app, View_Summary *view, View_Setting_ID setting, int32_t *value_out)
#define VIEW_SET_SETTING_SIG(n) bool32 n(Application_Links *app, View_Summary *view, View_Setting_ID setting, int32_t value) #define VIEW_SET_SETTING_SIG(n) bool32 n(Application_Links *app, View_Summary *view, View_Setting_ID setting, int32_t value)
#define VIEW_GET_DYNAMIC_SCOPE_SIG(n) Dynamic_Scope n(Application_Links *app, View_ID view_id)
#define VIEW_SET_SPLIT_PROPORTION_SIG(n) bool32 n(Application_Links *app, View_Summary *view, float t) #define VIEW_SET_SPLIT_PROPORTION_SIG(n) bool32 n(Application_Links *app, View_Summary *view, float t)
#define VIEW_COMPUTE_CURSOR_SIG(n) bool32 n(Application_Links *app, View_Summary *view, Buffer_Seek seek, Full_Cursor *cursor_out) #define VIEW_COMPUTE_CURSOR_SIG(n) bool32 n(Application_Links *app, View_Summary *view, Buffer_Seek seek, Full_Cursor *cursor_out)
#define VIEW_SET_CURSOR_SIG(n) bool32 n(Application_Links *app, View_Summary *view, Buffer_Seek seek, bool32 set_preferred_x) #define VIEW_SET_CURSOR_SIG(n) bool32 n(Application_Links *app, View_Summary *view, Buffer_Seek seek, bool32 set_preferred_x)
@ -49,21 +51,28 @@ struct Application_Links;
#define VIEW_SET_HIGHLIGHT_SIG(n) bool32 n(Application_Links *app, View_Summary *view, int32_t start, int32_t end, bool32 turn_on) #define VIEW_SET_HIGHLIGHT_SIG(n) bool32 n(Application_Links *app, View_Summary *view, int32_t start, int32_t end, bool32 turn_on)
#define VIEW_SET_BUFFER_SIG(n) bool32 n(Application_Links *app, View_Summary *view, Buffer_ID buffer_id, Set_Buffer_Flag flags) #define VIEW_SET_BUFFER_SIG(n) bool32 n(Application_Links *app, View_Summary *view, Buffer_ID buffer_id, Set_Buffer_Flag flags)
#define VIEW_POST_FADE_SIG(n) bool32 n(Application_Links *app, View_Summary *view, float seconds, int32_t start, int32_t end, int_color color) #define VIEW_POST_FADE_SIG(n) bool32 n(Application_Links *app, View_Summary *view, float seconds, int32_t start, int32_t end, int_color color)
#define CREATE_VIEW_VARIABLE_SIG(n) int32_t n(Application_Links *app, char *null_terminated_name, uint64_t default_value)
#define VIEW_SET_VARIABLE_SIG(n) bool32 n(Application_Links *app, View_Summary *view, int32_t location, uint64_t value)
#define VIEW_GET_VARIABLE_SIG(n) bool32 n(Application_Links *app, View_Summary *view, int32_t location, uint64_t *value_out)
#define VIEW_START_UI_MODE_SIG(n) int32_t n(Application_Links *app, View_Summary *view) #define VIEW_START_UI_MODE_SIG(n) int32_t n(Application_Links *app, View_Summary *view)
#define VIEW_END_UI_MODE_SIG(n) int32_t n(Application_Links *app, View_Summary *view) #define VIEW_END_UI_MODE_SIG(n) int32_t n(Application_Links *app, View_Summary *view)
#define VIEW_SET_UI_SIG(n) bool32 n(Application_Links *app, View_Summary *view, UI_Control *control) #define VIEW_SET_UI_SIG(n) bool32 n(Application_Links *app, View_Summary *view, UI_Control *control)
#define VIEW_GET_UI_COPY_SIG(n) UI_Control n(Application_Links *app, View_Summary *view, struct Partition *part) #define VIEW_GET_UI_COPY_SIG(n) UI_Control n(Application_Links *app, View_Summary *view, struct Partition *part)
#define GET_GLOBAL_DYNAMIC_SCOPE_SIG(n) Dynamic_Scope n(Application_Links *app)
#define GET_INTERSECTED_DYNAMIC_SCOPE_SIG(n) Dynamic_Scope n(Application_Links *app, Dynamic_Scope *intersected_scopes, int32_t count)
#define MANAGED_VARIABLE_CREATE_SIG(n) Managed_Variable_ID n(Application_Links *app, char *null_terminated_name, uint64_t default_value)
#define MANAGED_VARIABLE_GET_ID_SIG(n) Managed_Variable_ID n(Application_Links *app, char *null_terminated_name)
#define MANAGED_VARIABLE_CREATE_OR_GET_ID_SIG(n) int32_t n(Application_Links *app, char *null_terminated_name, uint64_t default_value)
#define MANAGED_VARIABLE_SET_SIG(n) bool32 n(Application_Links *app, Dynamic_Scope scope, Managed_Variable_ID location, uint64_t value)
#define MANAGED_VARIABLE_GET_SIG(n) bool32 n(Application_Links *app, Dynamic_Scope scope, Managed_Variable_ID location, uint64_t *value_out)
#define GET_USER_INPUT_SIG(n) User_Input n(Application_Links *app, Input_Type_Flag get_type, Input_Type_Flag abort_type) #define GET_USER_INPUT_SIG(n) User_Input n(Application_Links *app, Input_Type_Flag get_type, Input_Type_Flag abort_type)
#define GET_COMMAND_INPUT_SIG(n) User_Input n(Application_Links *app) #define GET_COMMAND_INPUT_SIG(n) User_Input n(Application_Links *app)
#define GET_MOUSE_STATE_SIG(n) Mouse_State n(Application_Links *app) #define GET_MOUSE_STATE_SIG(n) Mouse_State n(Application_Links *app)
#define START_QUERY_BAR_SIG(n) bool32 n(Application_Links *app, Query_Bar *bar, uint32_t flags) #define START_QUERY_BAR_SIG(n) bool32 n(Application_Links *app, Query_Bar *bar, uint32_t flags)
#define END_QUERY_BAR_SIG(n) void n(Application_Links *app, Query_Bar *bar, uint32_t flags) #define END_QUERY_BAR_SIG(n) void n(Application_Links *app, Query_Bar *bar, uint32_t flags)
#define PRINT_MESSAGE_SIG(n) void n(Application_Links *app, char *str, int32_t len) #define PRINT_MESSAGE_SIG(n) void n(Application_Links *app, char *str, int32_t len)
#define GET_THEME_COUNT_SIG(n) int32_t n(Application_Links *app)
#define GET_THEME_NAME_SIG(n) String n(Application_Links *app, struct Partition *arena, int32_t index)
#define CREATE_THEME_SIG(n) void n(Application_Links *app, Theme *theme, char *name, int32_t len) #define CREATE_THEME_SIG(n) void n(Application_Links *app, Theme *theme, char *name, int32_t len)
#define CHANGE_THEME_SIG(n) void n(Application_Links *app, char *name, int32_t len) #define CHANGE_THEME_SIG(n) void n(Application_Links *app, char *name, int32_t len)
#define CHANGE_THEME_BY_INDEX_SIG(n) bool32 n(Application_Links *app, int32_t index)
#define GET_LARGEST_FACE_ID_SIG(n) Face_ID n(Application_Links *app) #define GET_LARGEST_FACE_ID_SIG(n) Face_ID n(Application_Links *app)
#define SET_GLOBAL_FACE_SIG(n) bool32 n(Application_Links *app, Face_ID id, bool32 apply_to_all_buffers) #define SET_GLOBAL_FACE_SIG(n) bool32 n(Application_Links *app, Face_ID id, bool32 apply_to_all_buffers)
#define BUFFER_SET_FACE_SIG(n) bool32 n(Application_Links *app, Buffer_Summary *buffer, Face_ID id) #define BUFFER_SET_FACE_SIG(n) bool32 n(Application_Links *app, Buffer_Summary *buffer, Face_ID id)
@ -118,6 +127,7 @@ typedef BUFFER_GET_MARKERS_SIG(Buffer_Get_Markers_Function);
typedef BUFFER_REMOVE_MARKERS_SIG(Buffer_Remove_Markers_Function); typedef BUFFER_REMOVE_MARKERS_SIG(Buffer_Remove_Markers_Function);
typedef BUFFER_GET_SETTING_SIG(Buffer_Get_Setting_Function); typedef BUFFER_GET_SETTING_SIG(Buffer_Get_Setting_Function);
typedef BUFFER_SET_SETTING_SIG(Buffer_Set_Setting_Function); typedef BUFFER_SET_SETTING_SIG(Buffer_Set_Setting_Function);
typedef BUFFER_GET_DYNAMIC_SCOPE_SIG(Buffer_Get_Dynamic_Scope_Function);
typedef BUFFER_TOKEN_COUNT_SIG(Buffer_Token_Count_Function); typedef BUFFER_TOKEN_COUNT_SIG(Buffer_Token_Count_Function);
typedef BUFFER_READ_TOKENS_SIG(Buffer_Read_Tokens_Function); typedef BUFFER_READ_TOKENS_SIG(Buffer_Read_Tokens_Function);
typedef BUFFER_GET_TOKEN_INDEX_SIG(Buffer_Get_Token_Index_Function); typedef BUFFER_GET_TOKEN_INDEX_SIG(Buffer_Get_Token_Index_Function);
@ -134,6 +144,7 @@ typedef CLOSE_VIEW_SIG(Close_View_Function);
typedef SET_ACTIVE_VIEW_SIG(Set_Active_View_Function); typedef SET_ACTIVE_VIEW_SIG(Set_Active_View_Function);
typedef VIEW_GET_SETTING_SIG(View_Get_Setting_Function); typedef VIEW_GET_SETTING_SIG(View_Get_Setting_Function);
typedef VIEW_SET_SETTING_SIG(View_Set_Setting_Function); typedef VIEW_SET_SETTING_SIG(View_Set_Setting_Function);
typedef VIEW_GET_DYNAMIC_SCOPE_SIG(View_Get_Dynamic_Scope_Function);
typedef VIEW_SET_SPLIT_PROPORTION_SIG(View_Set_Split_Proportion_Function); typedef VIEW_SET_SPLIT_PROPORTION_SIG(View_Set_Split_Proportion_Function);
typedef VIEW_COMPUTE_CURSOR_SIG(View_Compute_Cursor_Function); typedef VIEW_COMPUTE_CURSOR_SIG(View_Compute_Cursor_Function);
typedef VIEW_SET_CURSOR_SIG(View_Set_Cursor_Function); typedef VIEW_SET_CURSOR_SIG(View_Set_Cursor_Function);
@ -142,21 +153,28 @@ typedef VIEW_SET_MARK_SIG(View_Set_Mark_Function);
typedef VIEW_SET_HIGHLIGHT_SIG(View_Set_Highlight_Function); typedef VIEW_SET_HIGHLIGHT_SIG(View_Set_Highlight_Function);
typedef VIEW_SET_BUFFER_SIG(View_Set_Buffer_Function); typedef VIEW_SET_BUFFER_SIG(View_Set_Buffer_Function);
typedef VIEW_POST_FADE_SIG(View_Post_Fade_Function); typedef VIEW_POST_FADE_SIG(View_Post_Fade_Function);
typedef CREATE_VIEW_VARIABLE_SIG(Create_View_Variable_Function);
typedef VIEW_SET_VARIABLE_SIG(View_Set_Variable_Function);
typedef VIEW_GET_VARIABLE_SIG(View_Get_Variable_Function);
typedef VIEW_START_UI_MODE_SIG(View_Start_UI_Mode_Function); typedef VIEW_START_UI_MODE_SIG(View_Start_UI_Mode_Function);
typedef VIEW_END_UI_MODE_SIG(View_End_UI_Mode_Function); typedef VIEW_END_UI_MODE_SIG(View_End_UI_Mode_Function);
typedef VIEW_SET_UI_SIG(View_Set_UI_Function); typedef VIEW_SET_UI_SIG(View_Set_UI_Function);
typedef VIEW_GET_UI_COPY_SIG(View_Get_UI_Copy_Function); typedef VIEW_GET_UI_COPY_SIG(View_Get_UI_Copy_Function);
typedef GET_GLOBAL_DYNAMIC_SCOPE_SIG(Get_Global_Dynamic_Scope_Function);
typedef GET_INTERSECTED_DYNAMIC_SCOPE_SIG(Get_Intersected_Dynamic_Scope_Function);
typedef MANAGED_VARIABLE_CREATE_SIG(Managed_Variable_Create_Function);
typedef MANAGED_VARIABLE_GET_ID_SIG(Managed_Variable_Get_ID_Function);
typedef MANAGED_VARIABLE_CREATE_OR_GET_ID_SIG(Managed_Variable_Create_Or_Get_ID_Function);
typedef MANAGED_VARIABLE_SET_SIG(Managed_Variable_Set_Function);
typedef MANAGED_VARIABLE_GET_SIG(Managed_Variable_Get_Function);
typedef GET_USER_INPUT_SIG(Get_User_Input_Function); typedef GET_USER_INPUT_SIG(Get_User_Input_Function);
typedef GET_COMMAND_INPUT_SIG(Get_Command_Input_Function); typedef GET_COMMAND_INPUT_SIG(Get_Command_Input_Function);
typedef GET_MOUSE_STATE_SIG(Get_Mouse_State_Function); typedef GET_MOUSE_STATE_SIG(Get_Mouse_State_Function);
typedef START_QUERY_BAR_SIG(Start_Query_Bar_Function); typedef START_QUERY_BAR_SIG(Start_Query_Bar_Function);
typedef END_QUERY_BAR_SIG(End_Query_Bar_Function); typedef END_QUERY_BAR_SIG(End_Query_Bar_Function);
typedef PRINT_MESSAGE_SIG(Print_Message_Function); typedef PRINT_MESSAGE_SIG(Print_Message_Function);
typedef GET_THEME_COUNT_SIG(Get_Theme_Count_Function);
typedef GET_THEME_NAME_SIG(Get_Theme_Name_Function);
typedef CREATE_THEME_SIG(Create_Theme_Function); typedef CREATE_THEME_SIG(Create_Theme_Function);
typedef CHANGE_THEME_SIG(Change_Theme_Function); typedef CHANGE_THEME_SIG(Change_Theme_Function);
typedef CHANGE_THEME_BY_INDEX_SIG(Change_Theme_By_Index_Function);
typedef GET_LARGEST_FACE_ID_SIG(Get_Largest_Face_ID_Function); typedef GET_LARGEST_FACE_ID_SIG(Get_Largest_Face_ID_Function);
typedef SET_GLOBAL_FACE_SIG(Set_Global_Face_Function); typedef SET_GLOBAL_FACE_SIG(Set_Global_Face_Function);
typedef BUFFER_SET_FACE_SIG(Buffer_Set_Face_Function); typedef BUFFER_SET_FACE_SIG(Buffer_Set_Face_Function);
@ -213,6 +231,7 @@ Buffer_Get_Markers_Function *buffer_get_markers;
Buffer_Remove_Markers_Function *buffer_remove_markers; Buffer_Remove_Markers_Function *buffer_remove_markers;
Buffer_Get_Setting_Function *buffer_get_setting; Buffer_Get_Setting_Function *buffer_get_setting;
Buffer_Set_Setting_Function *buffer_set_setting; Buffer_Set_Setting_Function *buffer_set_setting;
Buffer_Get_Dynamic_Scope_Function *buffer_get_dynamic_scope;
Buffer_Token_Count_Function *buffer_token_count; Buffer_Token_Count_Function *buffer_token_count;
Buffer_Read_Tokens_Function *buffer_read_tokens; Buffer_Read_Tokens_Function *buffer_read_tokens;
Buffer_Get_Token_Index_Function *buffer_get_token_index; Buffer_Get_Token_Index_Function *buffer_get_token_index;
@ -229,6 +248,7 @@ Close_View_Function *close_view;
Set_Active_View_Function *set_active_view; Set_Active_View_Function *set_active_view;
View_Get_Setting_Function *view_get_setting; View_Get_Setting_Function *view_get_setting;
View_Set_Setting_Function *view_set_setting; View_Set_Setting_Function *view_set_setting;
View_Get_Dynamic_Scope_Function *view_get_dynamic_scope;
View_Set_Split_Proportion_Function *view_set_split_proportion; View_Set_Split_Proportion_Function *view_set_split_proportion;
View_Compute_Cursor_Function *view_compute_cursor; View_Compute_Cursor_Function *view_compute_cursor;
View_Set_Cursor_Function *view_set_cursor; View_Set_Cursor_Function *view_set_cursor;
@ -237,21 +257,28 @@ View_Set_Mark_Function *view_set_mark;
View_Set_Highlight_Function *view_set_highlight; View_Set_Highlight_Function *view_set_highlight;
View_Set_Buffer_Function *view_set_buffer; View_Set_Buffer_Function *view_set_buffer;
View_Post_Fade_Function *view_post_fade; View_Post_Fade_Function *view_post_fade;
Create_View_Variable_Function *create_view_variable;
View_Set_Variable_Function *view_set_variable;
View_Get_Variable_Function *view_get_variable;
View_Start_UI_Mode_Function *view_start_ui_mode; View_Start_UI_Mode_Function *view_start_ui_mode;
View_End_UI_Mode_Function *view_end_ui_mode; View_End_UI_Mode_Function *view_end_ui_mode;
View_Set_UI_Function *view_set_ui; View_Set_UI_Function *view_set_ui;
View_Get_UI_Copy_Function *view_get_ui_copy; View_Get_UI_Copy_Function *view_get_ui_copy;
Get_Global_Dynamic_Scope_Function *get_global_dynamic_scope;
Get_Intersected_Dynamic_Scope_Function *get_intersected_dynamic_scope;
Managed_Variable_Create_Function *managed_variable_create;
Managed_Variable_Get_ID_Function *managed_variable_get_id;
Managed_Variable_Create_Or_Get_ID_Function *managed_variable_create_or_get_id;
Managed_Variable_Set_Function *managed_variable_set;
Managed_Variable_Get_Function *managed_variable_get;
Get_User_Input_Function *get_user_input; Get_User_Input_Function *get_user_input;
Get_Command_Input_Function *get_command_input; Get_Command_Input_Function *get_command_input;
Get_Mouse_State_Function *get_mouse_state; Get_Mouse_State_Function *get_mouse_state;
Start_Query_Bar_Function *start_query_bar; Start_Query_Bar_Function *start_query_bar;
End_Query_Bar_Function *end_query_bar; End_Query_Bar_Function *end_query_bar;
Print_Message_Function *print_message; Print_Message_Function *print_message;
Get_Theme_Count_Function *get_theme_count;
Get_Theme_Name_Function *get_theme_name;
Create_Theme_Function *create_theme; Create_Theme_Function *create_theme;
Change_Theme_Function *change_theme; Change_Theme_Function *change_theme;
Change_Theme_By_Index_Function *change_theme_by_index;
Get_Largest_Face_ID_Function *get_largest_face_id; Get_Largest_Face_ID_Function *get_largest_face_id;
Set_Global_Face_Function *set_global_face; Set_Global_Face_Function *set_global_face;
Buffer_Set_Face_Function *buffer_set_face; Buffer_Set_Face_Function *buffer_set_face;
@ -307,6 +334,7 @@ Buffer_Get_Markers_Function *buffer_get_markers_;
Buffer_Remove_Markers_Function *buffer_remove_markers_; Buffer_Remove_Markers_Function *buffer_remove_markers_;
Buffer_Get_Setting_Function *buffer_get_setting_; Buffer_Get_Setting_Function *buffer_get_setting_;
Buffer_Set_Setting_Function *buffer_set_setting_; Buffer_Set_Setting_Function *buffer_set_setting_;
Buffer_Get_Dynamic_Scope_Function *buffer_get_dynamic_scope_;
Buffer_Token_Count_Function *buffer_token_count_; Buffer_Token_Count_Function *buffer_token_count_;
Buffer_Read_Tokens_Function *buffer_read_tokens_; Buffer_Read_Tokens_Function *buffer_read_tokens_;
Buffer_Get_Token_Index_Function *buffer_get_token_index_; Buffer_Get_Token_Index_Function *buffer_get_token_index_;
@ -323,6 +351,7 @@ Close_View_Function *close_view_;
Set_Active_View_Function *set_active_view_; Set_Active_View_Function *set_active_view_;
View_Get_Setting_Function *view_get_setting_; View_Get_Setting_Function *view_get_setting_;
View_Set_Setting_Function *view_set_setting_; View_Set_Setting_Function *view_set_setting_;
View_Get_Dynamic_Scope_Function *view_get_dynamic_scope_;
View_Set_Split_Proportion_Function *view_set_split_proportion_; View_Set_Split_Proportion_Function *view_set_split_proportion_;
View_Compute_Cursor_Function *view_compute_cursor_; View_Compute_Cursor_Function *view_compute_cursor_;
View_Set_Cursor_Function *view_set_cursor_; View_Set_Cursor_Function *view_set_cursor_;
@ -331,21 +360,28 @@ View_Set_Mark_Function *view_set_mark_;
View_Set_Highlight_Function *view_set_highlight_; View_Set_Highlight_Function *view_set_highlight_;
View_Set_Buffer_Function *view_set_buffer_; View_Set_Buffer_Function *view_set_buffer_;
View_Post_Fade_Function *view_post_fade_; View_Post_Fade_Function *view_post_fade_;
Create_View_Variable_Function *create_view_variable_;
View_Set_Variable_Function *view_set_variable_;
View_Get_Variable_Function *view_get_variable_;
View_Start_UI_Mode_Function *view_start_ui_mode_; View_Start_UI_Mode_Function *view_start_ui_mode_;
View_End_UI_Mode_Function *view_end_ui_mode_; View_End_UI_Mode_Function *view_end_ui_mode_;
View_Set_UI_Function *view_set_ui_; View_Set_UI_Function *view_set_ui_;
View_Get_UI_Copy_Function *view_get_ui_copy_; View_Get_UI_Copy_Function *view_get_ui_copy_;
Get_Global_Dynamic_Scope_Function *get_global_dynamic_scope_;
Get_Intersected_Dynamic_Scope_Function *get_intersected_dynamic_scope_;
Managed_Variable_Create_Function *managed_variable_create_;
Managed_Variable_Get_ID_Function *managed_variable_get_id_;
Managed_Variable_Create_Or_Get_ID_Function *managed_variable_create_or_get_id_;
Managed_Variable_Set_Function *managed_variable_set_;
Managed_Variable_Get_Function *managed_variable_get_;
Get_User_Input_Function *get_user_input_; Get_User_Input_Function *get_user_input_;
Get_Command_Input_Function *get_command_input_; Get_Command_Input_Function *get_command_input_;
Get_Mouse_State_Function *get_mouse_state_; Get_Mouse_State_Function *get_mouse_state_;
Start_Query_Bar_Function *start_query_bar_; Start_Query_Bar_Function *start_query_bar_;
End_Query_Bar_Function *end_query_bar_; End_Query_Bar_Function *end_query_bar_;
Print_Message_Function *print_message_; Print_Message_Function *print_message_;
Get_Theme_Count_Function *get_theme_count_;
Get_Theme_Name_Function *get_theme_name_;
Create_Theme_Function *create_theme_; Create_Theme_Function *create_theme_;
Change_Theme_Function *change_theme_; Change_Theme_Function *change_theme_;
Change_Theme_By_Index_Function *change_theme_by_index_;
Get_Largest_Face_ID_Function *get_largest_face_id_; Get_Largest_Face_ID_Function *get_largest_face_id_;
Set_Global_Face_Function *set_global_face_; Set_Global_Face_Function *set_global_face_;
Buffer_Set_Face_Function *buffer_set_face_; Buffer_Set_Face_Function *buffer_set_face_;
@ -409,6 +445,7 @@ app_links->buffer_get_markers_ = Buffer_Get_Markers;\
app_links->buffer_remove_markers_ = Buffer_Remove_Markers;\ app_links->buffer_remove_markers_ = Buffer_Remove_Markers;\
app_links->buffer_get_setting_ = Buffer_Get_Setting;\ app_links->buffer_get_setting_ = Buffer_Get_Setting;\
app_links->buffer_set_setting_ = Buffer_Set_Setting;\ app_links->buffer_set_setting_ = Buffer_Set_Setting;\
app_links->buffer_get_dynamic_scope_ = Buffer_Get_Dynamic_Scope;\
app_links->buffer_token_count_ = Buffer_Token_Count;\ app_links->buffer_token_count_ = Buffer_Token_Count;\
app_links->buffer_read_tokens_ = Buffer_Read_Tokens;\ app_links->buffer_read_tokens_ = Buffer_Read_Tokens;\
app_links->buffer_get_token_index_ = Buffer_Get_Token_Index;\ app_links->buffer_get_token_index_ = Buffer_Get_Token_Index;\
@ -425,6 +462,7 @@ app_links->close_view_ = Close_View;\
app_links->set_active_view_ = Set_Active_View;\ app_links->set_active_view_ = Set_Active_View;\
app_links->view_get_setting_ = View_Get_Setting;\ app_links->view_get_setting_ = View_Get_Setting;\
app_links->view_set_setting_ = View_Set_Setting;\ app_links->view_set_setting_ = View_Set_Setting;\
app_links->view_get_dynamic_scope_ = View_Get_Dynamic_Scope;\
app_links->view_set_split_proportion_ = View_Set_Split_Proportion;\ app_links->view_set_split_proportion_ = View_Set_Split_Proportion;\
app_links->view_compute_cursor_ = View_Compute_Cursor;\ app_links->view_compute_cursor_ = View_Compute_Cursor;\
app_links->view_set_cursor_ = View_Set_Cursor;\ app_links->view_set_cursor_ = View_Set_Cursor;\
@ -433,21 +471,28 @@ app_links->view_set_mark_ = View_Set_Mark;\
app_links->view_set_highlight_ = View_Set_Highlight;\ app_links->view_set_highlight_ = View_Set_Highlight;\
app_links->view_set_buffer_ = View_Set_Buffer;\ app_links->view_set_buffer_ = View_Set_Buffer;\
app_links->view_post_fade_ = View_Post_Fade;\ app_links->view_post_fade_ = View_Post_Fade;\
app_links->create_view_variable_ = Create_View_Variable;\
app_links->view_set_variable_ = View_Set_Variable;\
app_links->view_get_variable_ = View_Get_Variable;\
app_links->view_start_ui_mode_ = View_Start_UI_Mode;\ app_links->view_start_ui_mode_ = View_Start_UI_Mode;\
app_links->view_end_ui_mode_ = View_End_UI_Mode;\ app_links->view_end_ui_mode_ = View_End_UI_Mode;\
app_links->view_set_ui_ = View_Set_UI;\ app_links->view_set_ui_ = View_Set_UI;\
app_links->view_get_ui_copy_ = View_Get_UI_Copy;\ app_links->view_get_ui_copy_ = View_Get_UI_Copy;\
app_links->get_global_dynamic_scope_ = Get_Global_Dynamic_Scope;\
app_links->get_intersected_dynamic_scope_ = Get_Intersected_Dynamic_Scope;\
app_links->managed_variable_create_ = Managed_Variable_Create;\
app_links->managed_variable_get_id_ = Managed_Variable_Get_ID;\
app_links->managed_variable_create_or_get_id_ = Managed_Variable_Create_Or_Get_ID;\
app_links->managed_variable_set_ = Managed_Variable_Set;\
app_links->managed_variable_get_ = Managed_Variable_Get;\
app_links->get_user_input_ = Get_User_Input;\ app_links->get_user_input_ = Get_User_Input;\
app_links->get_command_input_ = Get_Command_Input;\ app_links->get_command_input_ = Get_Command_Input;\
app_links->get_mouse_state_ = Get_Mouse_State;\ app_links->get_mouse_state_ = Get_Mouse_State;\
app_links->start_query_bar_ = Start_Query_Bar;\ app_links->start_query_bar_ = Start_Query_Bar;\
app_links->end_query_bar_ = End_Query_Bar;\ app_links->end_query_bar_ = End_Query_Bar;\
app_links->print_message_ = Print_Message;\ app_links->print_message_ = Print_Message;\
app_links->get_theme_count_ = Get_Theme_Count;\
app_links->get_theme_name_ = Get_Theme_Name;\
app_links->create_theme_ = Create_Theme;\ app_links->create_theme_ = Create_Theme;\
app_links->change_theme_ = Change_Theme;\ app_links->change_theme_ = Change_Theme;\
app_links->change_theme_by_index_ = Change_Theme_By_Index;\
app_links->get_largest_face_id_ = Get_Largest_Face_ID;\ app_links->get_largest_face_id_ = Get_Largest_Face_ID;\
app_links->set_global_face_ = Set_Global_Face;\ app_links->set_global_face_ = Set_Global_Face;\
app_links->buffer_set_face_ = Buffer_Set_Face;\ app_links->buffer_set_face_ = Buffer_Set_Face;\
@ -503,6 +548,7 @@ static inline bool32 buffer_get_markers(Application_Links *app, Buffer_Summary *
static inline bool32 buffer_remove_markers(Application_Links *app, Buffer_Summary *buffer, Marker_Handle marker){return(app->buffer_remove_markers(app, buffer, marker));} static inline bool32 buffer_remove_markers(Application_Links *app, Buffer_Summary *buffer, Marker_Handle marker){return(app->buffer_remove_markers(app, buffer, marker));}
static inline bool32 buffer_get_setting(Application_Links *app, Buffer_Summary *buffer, Buffer_Setting_ID setting, int32_t *value_out){return(app->buffer_get_setting(app, buffer, setting, value_out));} static inline bool32 buffer_get_setting(Application_Links *app, Buffer_Summary *buffer, Buffer_Setting_ID setting, int32_t *value_out){return(app->buffer_get_setting(app, buffer, setting, value_out));}
static inline bool32 buffer_set_setting(Application_Links *app, Buffer_Summary *buffer, Buffer_Setting_ID setting, int32_t value){return(app->buffer_set_setting(app, buffer, setting, value));} static inline bool32 buffer_set_setting(Application_Links *app, Buffer_Summary *buffer, Buffer_Setting_ID setting, int32_t value){return(app->buffer_set_setting(app, buffer, setting, value));}
static inline Dynamic_Scope buffer_get_dynamic_scope(Application_Links *app, Buffer_ID buffer_id){return(app->buffer_get_dynamic_scope(app, buffer_id));}
static inline int32_t buffer_token_count(Application_Links *app, Buffer_Summary *buffer){return(app->buffer_token_count(app, buffer));} static inline int32_t buffer_token_count(Application_Links *app, Buffer_Summary *buffer){return(app->buffer_token_count(app, buffer));}
static inline bool32 buffer_read_tokens(Application_Links *app, Buffer_Summary *buffer, int32_t start_token, int32_t end_token, Cpp_Token *tokens_out){return(app->buffer_read_tokens(app, buffer, start_token, end_token, tokens_out));} static inline bool32 buffer_read_tokens(Application_Links *app, Buffer_Summary *buffer, int32_t start_token, int32_t end_token, Cpp_Token *tokens_out){return(app->buffer_read_tokens(app, buffer, start_token, end_token, tokens_out));}
static inline bool32 buffer_get_token_index(Application_Links *app, Buffer_Summary *buffer, int32_t pos, Cpp_Get_Token_Result *get_result){return(app->buffer_get_token_index(app, buffer, pos, get_result));} static inline bool32 buffer_get_token_index(Application_Links *app, Buffer_Summary *buffer, int32_t pos, Cpp_Get_Token_Result *get_result){return(app->buffer_get_token_index(app, buffer, pos, get_result));}
@ -519,6 +565,7 @@ static inline bool32 close_view(Application_Links *app, View_Summary *view){retu
static inline bool32 set_active_view(Application_Links *app, View_Summary *view){return(app->set_active_view(app, view));} static inline bool32 set_active_view(Application_Links *app, View_Summary *view){return(app->set_active_view(app, view));}
static inline bool32 view_get_setting(Application_Links *app, View_Summary *view, View_Setting_ID setting, int32_t *value_out){return(app->view_get_setting(app, view, setting, value_out));} static inline bool32 view_get_setting(Application_Links *app, View_Summary *view, View_Setting_ID setting, int32_t *value_out){return(app->view_get_setting(app, view, setting, value_out));}
static inline bool32 view_set_setting(Application_Links *app, View_Summary *view, View_Setting_ID setting, int32_t value){return(app->view_set_setting(app, view, setting, value));} static inline bool32 view_set_setting(Application_Links *app, View_Summary *view, View_Setting_ID setting, int32_t value){return(app->view_set_setting(app, view, setting, value));}
static inline Dynamic_Scope view_get_dynamic_scope(Application_Links *app, View_ID view_id){return(app->view_get_dynamic_scope(app, view_id));}
static inline bool32 view_set_split_proportion(Application_Links *app, View_Summary *view, float t){return(app->view_set_split_proportion(app, view, t));} static inline bool32 view_set_split_proportion(Application_Links *app, View_Summary *view, float t){return(app->view_set_split_proportion(app, view, t));}
static inline bool32 view_compute_cursor(Application_Links *app, View_Summary *view, Buffer_Seek seek, Full_Cursor *cursor_out){return(app->view_compute_cursor(app, view, seek, cursor_out));} static inline bool32 view_compute_cursor(Application_Links *app, View_Summary *view, Buffer_Seek seek, Full_Cursor *cursor_out){return(app->view_compute_cursor(app, view, seek, cursor_out));}
static inline bool32 view_set_cursor(Application_Links *app, View_Summary *view, Buffer_Seek seek, bool32 set_preferred_x){return(app->view_set_cursor(app, view, seek, set_preferred_x));} static inline bool32 view_set_cursor(Application_Links *app, View_Summary *view, Buffer_Seek seek, bool32 set_preferred_x){return(app->view_set_cursor(app, view, seek, set_preferred_x));}
@ -527,21 +574,28 @@ static inline bool32 view_set_mark(Application_Links *app, View_Summary *view, B
static inline bool32 view_set_highlight(Application_Links *app, View_Summary *view, int32_t start, int32_t end, bool32 turn_on){return(app->view_set_highlight(app, view, start, end, turn_on));} static inline bool32 view_set_highlight(Application_Links *app, View_Summary *view, int32_t start, int32_t end, bool32 turn_on){return(app->view_set_highlight(app, view, start, end, turn_on));}
static inline bool32 view_set_buffer(Application_Links *app, View_Summary *view, Buffer_ID buffer_id, Set_Buffer_Flag flags){return(app->view_set_buffer(app, view, buffer_id, flags));} static inline bool32 view_set_buffer(Application_Links *app, View_Summary *view, Buffer_ID buffer_id, Set_Buffer_Flag flags){return(app->view_set_buffer(app, view, buffer_id, flags));}
static inline bool32 view_post_fade(Application_Links *app, View_Summary *view, float seconds, int32_t start, int32_t end, int_color color){return(app->view_post_fade(app, view, seconds, start, end, color));} static inline bool32 view_post_fade(Application_Links *app, View_Summary *view, float seconds, int32_t start, int32_t end, int_color color){return(app->view_post_fade(app, view, seconds, start, end, color));}
static inline int32_t create_view_variable(Application_Links *app, char *null_terminated_name, uint64_t default_value){return(app->create_view_variable(app, null_terminated_name, default_value));}
static inline bool32 view_set_variable(Application_Links *app, View_Summary *view, int32_t location, uint64_t value){return(app->view_set_variable(app, view, location, value));}
static inline bool32 view_get_variable(Application_Links *app, View_Summary *view, int32_t location, uint64_t *value_out){return(app->view_get_variable(app, view, location, value_out));}
static inline int32_t view_start_ui_mode(Application_Links *app, View_Summary *view){return(app->view_start_ui_mode(app, view));} static inline int32_t view_start_ui_mode(Application_Links *app, View_Summary *view){return(app->view_start_ui_mode(app, view));}
static inline int32_t view_end_ui_mode(Application_Links *app, View_Summary *view){return(app->view_end_ui_mode(app, view));} static inline int32_t view_end_ui_mode(Application_Links *app, View_Summary *view){return(app->view_end_ui_mode(app, view));}
static inline bool32 view_set_ui(Application_Links *app, View_Summary *view, UI_Control *control){return(app->view_set_ui(app, view, control));} static inline bool32 view_set_ui(Application_Links *app, View_Summary *view, UI_Control *control){return(app->view_set_ui(app, view, control));}
static inline UI_Control view_get_ui_copy(Application_Links *app, View_Summary *view, struct Partition *part){return(app->view_get_ui_copy(app, view, part));} static inline UI_Control view_get_ui_copy(Application_Links *app, View_Summary *view, struct Partition *part){return(app->view_get_ui_copy(app, view, part));}
static inline Dynamic_Scope get_global_dynamic_scope(Application_Links *app){return(app->get_global_dynamic_scope(app));}
static inline Dynamic_Scope get_intersected_dynamic_scope(Application_Links *app, Dynamic_Scope *intersected_scopes, int32_t count){return(app->get_intersected_dynamic_scope(app, intersected_scopes, count));}
static inline Managed_Variable_ID managed_variable_create(Application_Links *app, char *null_terminated_name, uint64_t default_value){return(app->managed_variable_create(app, null_terminated_name, default_value));}
static inline Managed_Variable_ID managed_variable_get_id(Application_Links *app, char *null_terminated_name){return(app->managed_variable_get_id(app, null_terminated_name));}
static inline int32_t managed_variable_create_or_get_id(Application_Links *app, char *null_terminated_name, uint64_t default_value){return(app->managed_variable_create_or_get_id(app, null_terminated_name, default_value));}
static inline bool32 managed_variable_set(Application_Links *app, Dynamic_Scope scope, Managed_Variable_ID location, uint64_t value){return(app->managed_variable_set(app, scope, location, value));}
static inline bool32 managed_variable_get(Application_Links *app, Dynamic_Scope scope, Managed_Variable_ID location, uint64_t *value_out){return(app->managed_variable_get(app, scope, location, value_out));}
static inline User_Input get_user_input(Application_Links *app, Input_Type_Flag get_type, Input_Type_Flag abort_type){return(app->get_user_input(app, get_type, abort_type));} static inline User_Input get_user_input(Application_Links *app, Input_Type_Flag get_type, Input_Type_Flag abort_type){return(app->get_user_input(app, get_type, abort_type));}
static inline User_Input get_command_input(Application_Links *app){return(app->get_command_input(app));} static inline User_Input get_command_input(Application_Links *app){return(app->get_command_input(app));}
static inline Mouse_State get_mouse_state(Application_Links *app){return(app->get_mouse_state(app));} static inline Mouse_State get_mouse_state(Application_Links *app){return(app->get_mouse_state(app));}
static inline bool32 start_query_bar(Application_Links *app, Query_Bar *bar, uint32_t flags){return(app->start_query_bar(app, bar, flags));} static inline bool32 start_query_bar(Application_Links *app, Query_Bar *bar, uint32_t flags){return(app->start_query_bar(app, bar, flags));}
static inline void end_query_bar(Application_Links *app, Query_Bar *bar, uint32_t flags){(app->end_query_bar(app, bar, flags));} static inline void end_query_bar(Application_Links *app, Query_Bar *bar, uint32_t flags){(app->end_query_bar(app, bar, flags));}
static inline void print_message(Application_Links *app, char *str, int32_t len){(app->print_message(app, str, len));} static inline void print_message(Application_Links *app, char *str, int32_t len){(app->print_message(app, str, len));}
static inline int32_t get_theme_count(Application_Links *app){return(app->get_theme_count(app));}
static inline String get_theme_name(Application_Links *app, struct Partition *arena, int32_t index){return(app->get_theme_name(app, arena, index));}
static inline void create_theme(Application_Links *app, Theme *theme, char *name, int32_t len){(app->create_theme(app, theme, name, len));} static inline void create_theme(Application_Links *app, Theme *theme, char *name, int32_t len){(app->create_theme(app, theme, name, len));}
static inline void change_theme(Application_Links *app, char *name, int32_t len){(app->change_theme(app, name, len));} static inline void change_theme(Application_Links *app, char *name, int32_t len){(app->change_theme(app, name, len));}
static inline bool32 change_theme_by_index(Application_Links *app, int32_t index){return(app->change_theme_by_index(app, index));}
static inline Face_ID get_largest_face_id(Application_Links *app){return(app->get_largest_face_id(app));} static inline Face_ID get_largest_face_id(Application_Links *app){return(app->get_largest_face_id(app));}
static inline bool32 set_global_face(Application_Links *app, Face_ID id, bool32 apply_to_all_buffers){return(app->set_global_face(app, id, apply_to_all_buffers));} static inline bool32 set_global_face(Application_Links *app, Face_ID id, bool32 apply_to_all_buffers){return(app->set_global_face(app, id, apply_to_all_buffers));}
static inline bool32 buffer_set_face(Application_Links *app, Buffer_Summary *buffer, Face_ID id){return(app->buffer_set_face(app, buffer, id));} static inline bool32 buffer_set_face(Application_Links *app, Buffer_Summary *buffer, Face_ID id){return(app->buffer_set_face(app, buffer, id));}
@ -597,6 +651,7 @@ static inline bool32 buffer_get_markers(Application_Links *app, Buffer_Summary *
static inline bool32 buffer_remove_markers(Application_Links *app, Buffer_Summary *buffer, Marker_Handle marker){return(app->buffer_remove_markers_(app, buffer, marker));} static inline bool32 buffer_remove_markers(Application_Links *app, Buffer_Summary *buffer, Marker_Handle marker){return(app->buffer_remove_markers_(app, buffer, marker));}
static inline bool32 buffer_get_setting(Application_Links *app, Buffer_Summary *buffer, Buffer_Setting_ID setting, int32_t *value_out){return(app->buffer_get_setting_(app, buffer, setting, value_out));} static inline bool32 buffer_get_setting(Application_Links *app, Buffer_Summary *buffer, Buffer_Setting_ID setting, int32_t *value_out){return(app->buffer_get_setting_(app, buffer, setting, value_out));}
static inline bool32 buffer_set_setting(Application_Links *app, Buffer_Summary *buffer, Buffer_Setting_ID setting, int32_t value){return(app->buffer_set_setting_(app, buffer, setting, value));} static inline bool32 buffer_set_setting(Application_Links *app, Buffer_Summary *buffer, Buffer_Setting_ID setting, int32_t value){return(app->buffer_set_setting_(app, buffer, setting, value));}
static inline Dynamic_Scope buffer_get_dynamic_scope(Application_Links *app, Buffer_ID buffer_id){return(app->buffer_get_dynamic_scope_(app, buffer_id));}
static inline int32_t buffer_token_count(Application_Links *app, Buffer_Summary *buffer){return(app->buffer_token_count_(app, buffer));} static inline int32_t buffer_token_count(Application_Links *app, Buffer_Summary *buffer){return(app->buffer_token_count_(app, buffer));}
static inline bool32 buffer_read_tokens(Application_Links *app, Buffer_Summary *buffer, int32_t start_token, int32_t end_token, Cpp_Token *tokens_out){return(app->buffer_read_tokens_(app, buffer, start_token, end_token, tokens_out));} static inline bool32 buffer_read_tokens(Application_Links *app, Buffer_Summary *buffer, int32_t start_token, int32_t end_token, Cpp_Token *tokens_out){return(app->buffer_read_tokens_(app, buffer, start_token, end_token, tokens_out));}
static inline bool32 buffer_get_token_index(Application_Links *app, Buffer_Summary *buffer, int32_t pos, Cpp_Get_Token_Result *get_result){return(app->buffer_get_token_index_(app, buffer, pos, get_result));} static inline bool32 buffer_get_token_index(Application_Links *app, Buffer_Summary *buffer, int32_t pos, Cpp_Get_Token_Result *get_result){return(app->buffer_get_token_index_(app, buffer, pos, get_result));}
@ -613,6 +668,7 @@ static inline bool32 close_view(Application_Links *app, View_Summary *view){retu
static inline bool32 set_active_view(Application_Links *app, View_Summary *view){return(app->set_active_view_(app, view));} static inline bool32 set_active_view(Application_Links *app, View_Summary *view){return(app->set_active_view_(app, view));}
static inline bool32 view_get_setting(Application_Links *app, View_Summary *view, View_Setting_ID setting, int32_t *value_out){return(app->view_get_setting_(app, view, setting, value_out));} static inline bool32 view_get_setting(Application_Links *app, View_Summary *view, View_Setting_ID setting, int32_t *value_out){return(app->view_get_setting_(app, view, setting, value_out));}
static inline bool32 view_set_setting(Application_Links *app, View_Summary *view, View_Setting_ID setting, int32_t value){return(app->view_set_setting_(app, view, setting, value));} static inline bool32 view_set_setting(Application_Links *app, View_Summary *view, View_Setting_ID setting, int32_t value){return(app->view_set_setting_(app, view, setting, value));}
static inline Dynamic_Scope view_get_dynamic_scope(Application_Links *app, View_ID view_id){return(app->view_get_dynamic_scope_(app, view_id));}
static inline bool32 view_set_split_proportion(Application_Links *app, View_Summary *view, float t){return(app->view_set_split_proportion_(app, view, t));} static inline bool32 view_set_split_proportion(Application_Links *app, View_Summary *view, float t){return(app->view_set_split_proportion_(app, view, t));}
static inline bool32 view_compute_cursor(Application_Links *app, View_Summary *view, Buffer_Seek seek, Full_Cursor *cursor_out){return(app->view_compute_cursor_(app, view, seek, cursor_out));} static inline bool32 view_compute_cursor(Application_Links *app, View_Summary *view, Buffer_Seek seek, Full_Cursor *cursor_out){return(app->view_compute_cursor_(app, view, seek, cursor_out));}
static inline bool32 view_set_cursor(Application_Links *app, View_Summary *view, Buffer_Seek seek, bool32 set_preferred_x){return(app->view_set_cursor_(app, view, seek, set_preferred_x));} static inline bool32 view_set_cursor(Application_Links *app, View_Summary *view, Buffer_Seek seek, bool32 set_preferred_x){return(app->view_set_cursor_(app, view, seek, set_preferred_x));}
@ -621,21 +677,28 @@ static inline bool32 view_set_mark(Application_Links *app, View_Summary *view, B
static inline bool32 view_set_highlight(Application_Links *app, View_Summary *view, int32_t start, int32_t end, bool32 turn_on){return(app->view_set_highlight_(app, view, start, end, turn_on));} static inline bool32 view_set_highlight(Application_Links *app, View_Summary *view, int32_t start, int32_t end, bool32 turn_on){return(app->view_set_highlight_(app, view, start, end, turn_on));}
static inline bool32 view_set_buffer(Application_Links *app, View_Summary *view, Buffer_ID buffer_id, Set_Buffer_Flag flags){return(app->view_set_buffer_(app, view, buffer_id, flags));} static inline bool32 view_set_buffer(Application_Links *app, View_Summary *view, Buffer_ID buffer_id, Set_Buffer_Flag flags){return(app->view_set_buffer_(app, view, buffer_id, flags));}
static inline bool32 view_post_fade(Application_Links *app, View_Summary *view, float seconds, int32_t start, int32_t end, int_color color){return(app->view_post_fade_(app, view, seconds, start, end, color));} static inline bool32 view_post_fade(Application_Links *app, View_Summary *view, float seconds, int32_t start, int32_t end, int_color color){return(app->view_post_fade_(app, view, seconds, start, end, color));}
static inline int32_t create_view_variable(Application_Links *app, char *null_terminated_name, uint64_t default_value){return(app->create_view_variable_(app, null_terminated_name, default_value));}
static inline bool32 view_set_variable(Application_Links *app, View_Summary *view, int32_t location, uint64_t value){return(app->view_set_variable_(app, view, location, value));}
static inline bool32 view_get_variable(Application_Links *app, View_Summary *view, int32_t location, uint64_t *value_out){return(app->view_get_variable_(app, view, location, value_out));}
static inline int32_t view_start_ui_mode(Application_Links *app, View_Summary *view){return(app->view_start_ui_mode_(app, view));} static inline int32_t view_start_ui_mode(Application_Links *app, View_Summary *view){return(app->view_start_ui_mode_(app, view));}
static inline int32_t view_end_ui_mode(Application_Links *app, View_Summary *view){return(app->view_end_ui_mode_(app, view));} static inline int32_t view_end_ui_mode(Application_Links *app, View_Summary *view){return(app->view_end_ui_mode_(app, view));}
static inline bool32 view_set_ui(Application_Links *app, View_Summary *view, UI_Control *control){return(app->view_set_ui_(app, view, control));} static inline bool32 view_set_ui(Application_Links *app, View_Summary *view, UI_Control *control){return(app->view_set_ui_(app, view, control));}
static inline UI_Control view_get_ui_copy(Application_Links *app, View_Summary *view, struct Partition *part){return(app->view_get_ui_copy_(app, view, part));} static inline UI_Control view_get_ui_copy(Application_Links *app, View_Summary *view, struct Partition *part){return(app->view_get_ui_copy_(app, view, part));}
static inline Dynamic_Scope get_global_dynamic_scope(Application_Links *app){return(app->get_global_dynamic_scope_(app));}
static inline Dynamic_Scope get_intersected_dynamic_scope(Application_Links *app, Dynamic_Scope *intersected_scopes, int32_t count){return(app->get_intersected_dynamic_scope_(app, intersected_scopes, count));}
static inline Managed_Variable_ID managed_variable_create(Application_Links *app, char *null_terminated_name, uint64_t default_value){return(app->managed_variable_create_(app, null_terminated_name, default_value));}
static inline Managed_Variable_ID managed_variable_get_id(Application_Links *app, char *null_terminated_name){return(app->managed_variable_get_id_(app, null_terminated_name));}
static inline int32_t managed_variable_create_or_get_id(Application_Links *app, char *null_terminated_name, uint64_t default_value){return(app->managed_variable_create_or_get_id_(app, null_terminated_name, default_value));}
static inline bool32 managed_variable_set(Application_Links *app, Dynamic_Scope scope, Managed_Variable_ID location, uint64_t value){return(app->managed_variable_set_(app, scope, location, value));}
static inline bool32 managed_variable_get(Application_Links *app, Dynamic_Scope scope, Managed_Variable_ID location, uint64_t *value_out){return(app->managed_variable_get_(app, scope, location, value_out));}
static inline User_Input get_user_input(Application_Links *app, Input_Type_Flag get_type, Input_Type_Flag abort_type){return(app->get_user_input_(app, get_type, abort_type));} static inline User_Input get_user_input(Application_Links *app, Input_Type_Flag get_type, Input_Type_Flag abort_type){return(app->get_user_input_(app, get_type, abort_type));}
static inline User_Input get_command_input(Application_Links *app){return(app->get_command_input_(app));} static inline User_Input get_command_input(Application_Links *app){return(app->get_command_input_(app));}
static inline Mouse_State get_mouse_state(Application_Links *app){return(app->get_mouse_state_(app));} static inline Mouse_State get_mouse_state(Application_Links *app){return(app->get_mouse_state_(app));}
static inline bool32 start_query_bar(Application_Links *app, Query_Bar *bar, uint32_t flags){return(app->start_query_bar_(app, bar, flags));} static inline bool32 start_query_bar(Application_Links *app, Query_Bar *bar, uint32_t flags){return(app->start_query_bar_(app, bar, flags));}
static inline void end_query_bar(Application_Links *app, Query_Bar *bar, uint32_t flags){(app->end_query_bar_(app, bar, flags));} static inline void end_query_bar(Application_Links *app, Query_Bar *bar, uint32_t flags){(app->end_query_bar_(app, bar, flags));}
static inline void print_message(Application_Links *app, char *str, int32_t len){(app->print_message_(app, str, len));} static inline void print_message(Application_Links *app, char *str, int32_t len){(app->print_message_(app, str, len));}
static inline int32_t get_theme_count(Application_Links *app){return(app->get_theme_count_(app));}
static inline String get_theme_name(Application_Links *app, struct Partition *arena, int32_t index){return(app->get_theme_name_(app, arena, index));}
static inline void create_theme(Application_Links *app, Theme *theme, char *name, int32_t len){(app->create_theme_(app, theme, name, len));} static inline void create_theme(Application_Links *app, Theme *theme, char *name, int32_t len){(app->create_theme_(app, theme, name, len));}
static inline void change_theme(Application_Links *app, char *name, int32_t len){(app->change_theme_(app, name, len));} static inline void change_theme(Application_Links *app, char *name, int32_t len){(app->change_theme_(app, name, len));}
static inline bool32 change_theme_by_index(Application_Links *app, int32_t index){return(app->change_theme_by_index_(app, index));}
static inline Face_ID get_largest_face_id(Application_Links *app){return(app->get_largest_face_id_(app));} static inline Face_ID get_largest_face_id(Application_Links *app){return(app->get_largest_face_id_(app));}
static inline bool32 set_global_face(Application_Links *app, Face_ID id, bool32 apply_to_all_buffers){return(app->set_global_face_(app, id, apply_to_all_buffers));} static inline bool32 set_global_face(Application_Links *app, Face_ID id, bool32 apply_to_all_buffers){return(app->set_global_face_(app, id, apply_to_all_buffers));}
static inline bool32 buffer_set_face(Application_Links *app, Buffer_Summary *buffer, Face_ID id){return(app->buffer_set_face_(app, buffer, id));} static inline bool32 buffer_set_face(Application_Links *app, Buffer_Summary *buffer, Face_ID id){return(app->buffer_set_face_(app, buffer, id));}

View File

@ -2,7 +2,7 @@
#define command_id(c) (fcoder_metacmd_ID_##c) #define command_id(c) (fcoder_metacmd_ID_##c)
#define command_metadata(c) (&fcoder_metacmd_table[command_id(c)]) #define command_metadata(c) (&fcoder_metacmd_table[command_id(c)])
#define command_metadata_by_id(id) (&fcoder_metacmd_table[id]) #define command_metadata_by_id(id) (&fcoder_metacmd_table[id])
#define command_one_past_last_id 201 #define command_one_past_last_id 202
#if defined(CUSTOM_COMMAND_SIG) #if defined(CUSTOM_COMMAND_SIG)
#define PROC_LINKS(x,y) x #define PROC_LINKS(x,y) x
#else #else
@ -146,6 +146,7 @@ CUSTOM_COMMAND_SIG(query_replace);
CUSTOM_COMMAND_SIG(query_replace_identifier); CUSTOM_COMMAND_SIG(query_replace_identifier);
CUSTOM_COMMAND_SIG(query_replace_selection); CUSTOM_COMMAND_SIG(query_replace_selection);
CUSTOM_COMMAND_SIG(redo); CUSTOM_COMMAND_SIG(redo);
CUSTOM_COMMAND_SIG(reload_themes);
CUSTOM_COMMAND_SIG(remap_interactive); CUSTOM_COMMAND_SIG(remap_interactive);
CUSTOM_COMMAND_SIG(rename_file_query); CUSTOM_COMMAND_SIG(rename_file_query);
CUSTOM_COMMAND_SIG(reopen); CUSTOM_COMMAND_SIG(reopen);
@ -221,8 +222,8 @@ char *source_name;
int32_t source_name_len; int32_t source_name_len;
int32_t line_number; int32_t line_number;
}; };
static Command_Metadata fcoder_metacmd_table[201] = { static Command_Metadata fcoder_metacmd_table[202] = {
{ PROC_LINKS(allow_mouse, 0), "allow_mouse", 11, "Shows the mouse and causes all mouse input to be processed normally.", 68, "w:\\4ed\\code\\4coder_default_framework.cpp", 43, 191 }, { PROC_LINKS(allow_mouse, 0), "allow_mouse", 11, "Shows the mouse and causes all mouse input to be processed normally.", 68, "w:\\4ed\\code\\4coder_default_framework.cpp", 43, 193 },
{ PROC_LINKS(auto_tab_line_at_cursor, 0), "auto_tab_line_at_cursor", 23, "Auto-indents the line on which the cursor sits.", 47, "w:\\4ed\\code\\4coder_auto_indent.cpp", 37, 722 }, { PROC_LINKS(auto_tab_line_at_cursor, 0), "auto_tab_line_at_cursor", 23, "Auto-indents the line on which the cursor sits.", 47, "w:\\4ed\\code\\4coder_auto_indent.cpp", 37, 722 },
{ PROC_LINKS(auto_tab_range, 0), "auto_tab_range", 14, "Auto-indents the range between the cursor and the mark.", 55, "w:\\4ed\\code\\4coder_auto_indent.cpp", 37, 733 }, { PROC_LINKS(auto_tab_range, 0), "auto_tab_range", 14, "Auto-indents the range between the cursor and the mark.", 55, "w:\\4ed\\code\\4coder_auto_indent.cpp", 37, 733 },
{ PROC_LINKS(auto_tab_whole_file, 0), "auto_tab_whole_file", 19, "Audo-indents the entire current buffer.", 39, "w:\\4ed\\code\\4coder_auto_indent.cpp", 37, 712 }, { PROC_LINKS(auto_tab_whole_file, 0), "auto_tab_whole_file", 19, "Audo-indents the entire current buffer.", 39, "w:\\4ed\\code\\4coder_auto_indent.cpp", 37, 712 },
@ -232,8 +233,8 @@ static Command_Metadata fcoder_metacmd_table[201] = {
{ PROC_LINKS(build_in_build_panel, 0), "build_in_build_panel", 20, "Looks for a build.bat, build.sh, or makefile in the current and parent directories. Runs the first that it finds and prints the output to *compilation*. Puts the *compilation* buffer in a panel at the footer of the current view.", 230, "w:\\4ed\\code\\4coder_build_commands.cpp", 40, 187 }, { PROC_LINKS(build_in_build_panel, 0), "build_in_build_panel", 20, "Looks for a build.bat, build.sh, or makefile in the current and parent directories. Runs the first that it finds and prints the output to *compilation*. Puts the *compilation* buffer in a panel at the footer of the current view.", 230, "w:\\4ed\\code\\4coder_build_commands.cpp", 40, 187 },
{ PROC_LINKS(build_search, 0), "build_search", 12, "Looks for a build.bat, build.sh, or makefile in the current and parent directories. Runs the first that it finds and prints the output to *compilation*.", 153, "w:\\4ed\\code\\4coder_build_commands.cpp", 40, 155 }, { PROC_LINKS(build_search, 0), "build_search", 12, "Looks for a build.bat, build.sh, or makefile in the current and parent directories. Runs the first that it finds and prints the output to *compilation*.", 153, "w:\\4ed\\code\\4coder_build_commands.cpp", 40, 155 },
{ PROC_LINKS(center_view, 0), "center_view", 11, "Centers the view vertically on the line on which the cursor sits.", 65, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 120 }, { PROC_LINKS(center_view, 0), "center_view", 11, "Centers the view vertically on the line on which the cursor sits.", 65, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 120 },
{ PROC_LINKS(change_active_panel, 0), "change_active_panel", 19, "Change the currently active panel, moving to the panel with the next highest view_id.", 85, "w:\\4ed\\code\\4coder_default_framework.cpp", 43, 133 }, { PROC_LINKS(change_active_panel, 0), "change_active_panel", 19, "Change the currently active panel, moving to the panel with the next highest view_id.", 85, "w:\\4ed\\code\\4coder_default_framework.cpp", 43, 135 },
{ PROC_LINKS(change_active_panel_backwards, 0), "change_active_panel_backwards", 29, "Change the currently active panel, moving to the panel with the next lowest view_id.", 84, "w:\\4ed\\code\\4coder_default_framework.cpp", 43, 143 }, { PROC_LINKS(change_active_panel_backwards, 0), "change_active_panel_backwards", 29, "Change the currently active panel, moving to the panel with the next lowest view_id.", 84, "w:\\4ed\\code\\4coder_default_framework.cpp", 43, 145 },
{ PROC_LINKS(change_to_build_panel, 0), "change_to_build_panel", 21, "If the special build panel is open, makes the build panel the active panel.", 75, "w:\\4ed\\code\\4coder_build_commands.cpp", 40, 209 }, { PROC_LINKS(change_to_build_panel, 0), "change_to_build_panel", 21, "If the special build panel is open, makes the build panel the active panel.", 75, "w:\\4ed\\code\\4coder_build_commands.cpp", 40, 209 },
{ PROC_LINKS(clean_all_lines, 0), "clean_all_lines", 15, "Removes trailing whitespace from all lines in the current buffer.", 65, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 368 }, { PROC_LINKS(clean_all_lines, 0), "clean_all_lines", 15, "Removes trailing whitespace from all lines in the current buffer.", 65, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 368 },
{ PROC_LINKS(click_set_cursor, 0), "click_set_cursor", 16, "Sets the cursor position to the mouse position.", 47, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 174 }, { PROC_LINKS(click_set_cursor, 0), "click_set_cursor", 16, "Sets the cursor position to the mouse position.", 47, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 174 },
@ -248,11 +249,11 @@ static Command_Metadata fcoder_metacmd_table[201] = {
{ PROC_LINKS(decrease_line_wrap, 0), "decrease_line_wrap", 18, "Decrases the current buffer's width for line wrapping.", 54, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 508 }, { PROC_LINKS(decrease_line_wrap, 0), "decrease_line_wrap", 18, "Decrases the current buffer's width for line wrapping.", 54, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 508 },
{ PROC_LINKS(delete_char, 0), "delete_char", 11, "Deletes the character to the right of the cursor.", 49, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 49 }, { PROC_LINKS(delete_char, 0), "delete_char", 11, "Deletes the character to the right of the cursor.", 49, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 49 },
{ PROC_LINKS(delete_current_scope, 0), "delete_current_scope", 20, "Deletes the braces surrounding the currently selected scope. Leaves the contents within the scope.", 99, "w:\\4ed\\code\\4coder_scope_commands.cpp", 40, 487 }, { PROC_LINKS(delete_current_scope, 0), "delete_current_scope", 20, "Deletes the braces surrounding the currently selected scope. Leaves the contents within the scope.", 99, "w:\\4ed\\code\\4coder_scope_commands.cpp", 40, 487 },
{ PROC_LINKS(delete_file_query, 0), "delete_file_query", 17, "Deletes the file of the current buffer if 4coder has the appropriate access rights. Will ask the user for confirmation first.", 125, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1012 }, { PROC_LINKS(delete_file_query, 0), "delete_file_query", 17, "Deletes the file of the current buffer if 4coder has the appropriate access rights. Will ask the user for confirmation first.", 125, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1024 },
{ PROC_LINKS(delete_line, 0), "delete_line", 11, "Delete the line the on which the cursor sits.", 45, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1262 }, { PROC_LINKS(delete_line, 0), "delete_line", 11, "Delete the line the on which the cursor sits.", 45, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1274 },
{ PROC_LINKS(delete_range, 0), "delete_range", 12, "Deletes the text in the range between the cursor and the mark.", 62, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 107 }, { PROC_LINKS(delete_range, 0), "delete_range", 12, "Deletes the text in the range between the cursor and the mark.", 62, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 107 },
{ PROC_LINKS(delete_word, 0), "delete_word", 11, "Delete characters between the cursor position and the first alphanumeric boundary to the right.", 95, "w:\\4ed\\code\\4coder_seek.cpp", 30, 1253 }, { PROC_LINKS(delete_word, 0), "delete_word", 11, "Delete characters between the cursor position and the first alphanumeric boundary to the right.", 95, "w:\\4ed\\code\\4coder_seek.cpp", 30, 1253 },
{ PROC_LINKS(duplicate_line, 0), "duplicate_line", 14, "Create a copy of the line on which the cursor sits.", 51, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1240 }, { PROC_LINKS(duplicate_line, 0), "duplicate_line", 14, "Create a copy of the line on which the cursor sits.", 51, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1252 },
{ PROC_LINKS(eol_dosify, 0), "eol_dosify", 10, "Puts the buffer in DOS line ending mode.", 40, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 561 }, { PROC_LINKS(eol_dosify, 0), "eol_dosify", 10, "Puts the buffer in DOS line ending mode.", 40, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 561 },
{ PROC_LINKS(eol_nixify, 0), "eol_nixify", 10, "Puts the buffer in NIX line ending mode.", 40, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 569 }, { PROC_LINKS(eol_nixify, 0), "eol_nixify", 10, "Puts the buffer in NIX line ending mode.", 40, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 569 },
{ PROC_LINKS(execute_any_cli, 0), "execute_any_cli", 15, "Queries for an output buffer name and system command, runs the system command as a CLI and prints the output to the specified buffer.", 133, "w:\\4ed\\code\\4coder_system_command.cpp", 40, 23 }, { PROC_LINKS(execute_any_cli, 0), "execute_any_cli", 15, "Queries for an output buffer name and system command, runs the system command as a CLI and prints the output to the specified buffer.", 133, "w:\\4ed\\code\\4coder_system_command.cpp", 40, 23 },
@ -262,21 +263,21 @@ static Command_Metadata fcoder_metacmd_table[201] = {
{ PROC_LINKS(goto_beginning_of_file, 0), "goto_beginning_of_file", 22, "Sets the cursor to the beginning of the file.", 45, "w:\\4ed\\code\\4coder_seek.cpp", 30, 1168 }, { PROC_LINKS(goto_beginning_of_file, 0), "goto_beginning_of_file", 22, "Sets the cursor to the beginning of the file.", 45, "w:\\4ed\\code\\4coder_seek.cpp", 30, 1168 },
{ PROC_LINKS(goto_end_of_file, 0), "goto_end_of_file", 16, "Sets the cursor to the end of the file.", 39, "w:\\4ed\\code\\4coder_seek.cpp", 30, 1175 }, { PROC_LINKS(goto_end_of_file, 0), "goto_end_of_file", 16, "Sets the cursor to the end of the file.", 39, "w:\\4ed\\code\\4coder_seek.cpp", 30, 1175 },
{ PROC_LINKS(goto_first_jump_direct, 0), "goto_first_jump_direct", 22, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer.", 95, "w:\\4ed\\code\\4coder_jump_direct.cpp", 37, 84 }, { PROC_LINKS(goto_first_jump_direct, 0), "goto_first_jump_direct", 22, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer.", 95, "w:\\4ed\\code\\4coder_jump_direct.cpp", 37, 84 },
{ PROC_LINKS(goto_first_jump_same_panel_sticky, 0), "goto_first_jump_same_panel_sticky", 33, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer and views the buffer in the panel where the jump list was.", 153, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 533 }, { PROC_LINKS(goto_first_jump_same_panel_sticky, 0), "goto_first_jump_same_panel_sticky", 33, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer and views the buffer in the panel where the jump list was.", 153, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 571 },
{ PROC_LINKS(goto_first_jump_sticky, 0), "goto_first_jump_sticky", 22, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer.", 95, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 515 }, { PROC_LINKS(goto_first_jump_sticky, 0), "goto_first_jump_sticky", 22, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer.", 95, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 553 },
{ PROC_LINKS(goto_jump_at_cursor_direct, 0), "goto_jump_at_cursor_direct", 26, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in another view and changes the active panel to the view containing the jump.", 187, "w:\\4ed\\code\\4coder_jump_direct.cpp", 37, 8 }, { PROC_LINKS(goto_jump_at_cursor_direct, 0), "goto_jump_at_cursor_direct", 26, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in another view and changes the active panel to the view containing the jump.", 187, "w:\\4ed\\code\\4coder_jump_direct.cpp", 37, 8 },
{ PROC_LINKS(goto_jump_at_cursor_same_panel_direct, 0), "goto_jump_at_cursor_same_panel_direct", 37, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in this view, losing the compilation output or jump list..", 168, "w:\\4ed\\code\\4coder_jump_direct.cpp", 37, 29 }, { PROC_LINKS(goto_jump_at_cursor_same_panel_direct, 0), "goto_jump_at_cursor_same_panel_direct", 37, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in this view, losing the compilation output or jump list..", 168, "w:\\4ed\\code\\4coder_jump_direct.cpp", 37, 29 },
{ PROC_LINKS(goto_jump_at_cursor_same_panel_sticky, 0), "goto_jump_at_cursor_same_panel_sticky", 37, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in this view, losing the compilation output or jump list.", 167, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 365 }, { PROC_LINKS(goto_jump_at_cursor_same_panel_sticky, 0), "goto_jump_at_cursor_same_panel_sticky", 37, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in this view, losing the compilation output or jump list.", 167, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 399 },
{ PROC_LINKS(goto_jump_at_cursor_sticky, 0), "goto_jump_at_cursor_sticky", 26, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in another view and changes the active panel to the view containing the jump.", 187, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 337 }, { PROC_LINKS(goto_jump_at_cursor_sticky, 0), "goto_jump_at_cursor_sticky", 26, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in another view and changes the active panel to the view containing the jump.", 187, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 371 },
{ PROC_LINKS(goto_line, 0), "goto_line", 9, "Queries the user for a number, and jumps the cursor to the corresponding line.", 78, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 585 }, { PROC_LINKS(goto_line, 0), "goto_line", 9, "Queries the user for a number, and jumps the cursor to the corresponding line.", 78, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 585 },
{ PROC_LINKS(goto_next_jump_direct, 0), "goto_next_jump_direct", 21, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, skipping sub jump locations.", 123, "w:\\4ed\\code\\4coder_jump_direct.cpp", 37, 48 }, { PROC_LINKS(goto_next_jump_direct, 0), "goto_next_jump_direct", 21, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, skipping sub jump locations.", 123, "w:\\4ed\\code\\4coder_jump_direct.cpp", 37, 48 },
{ PROC_LINKS(goto_next_jump_no_skips_direct, 0), "goto_next_jump_no_skips_direct", 30, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, and does not skip sub jump locations.", 132, "w:\\4ed\\code\\4coder_jump_direct.cpp", 37, 66 }, { PROC_LINKS(goto_next_jump_no_skips_direct, 0), "goto_next_jump_no_skips_direct", 30, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, and does not skip sub jump locations.", 132, "w:\\4ed\\code\\4coder_jump_direct.cpp", 37, 66 },
{ PROC_LINKS(goto_next_jump_no_skips_sticky, 0), "goto_next_jump_no_skips_sticky", 30, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, and does not skip sub jump locations.", 132, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 484 }, { PROC_LINKS(goto_next_jump_no_skips_sticky, 0), "goto_next_jump_no_skips_sticky", 30, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, and does not skip sub jump locations.", 132, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 522 },
{ PROC_LINKS(goto_next_jump_sticky, 0), "goto_next_jump_sticky", 21, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, skipping sub jump locations.", 123, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 454 }, { PROC_LINKS(goto_next_jump_sticky, 0), "goto_next_jump_sticky", 21, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, skipping sub jump locations.", 123, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 492 },
{ PROC_LINKS(goto_prev_jump_direct, 0), "goto_prev_jump_direct", 21, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, skipping sub jump locations.", 127, "w:\\4ed\\code\\4coder_jump_direct.cpp", 37, 57 }, { PROC_LINKS(goto_prev_jump_direct, 0), "goto_prev_jump_direct", 21, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, skipping sub jump locations.", 127, "w:\\4ed\\code\\4coder_jump_direct.cpp", 37, 57 },
{ PROC_LINKS(goto_prev_jump_no_skips_direct, 0), "goto_prev_jump_no_skips_direct", 30, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, and does not skip sub jump locations.", 136, "w:\\4ed\\code\\4coder_jump_direct.cpp", 37, 75 }, { PROC_LINKS(goto_prev_jump_no_skips_direct, 0), "goto_prev_jump_no_skips_direct", 30, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, and does not skip sub jump locations.", 136, "w:\\4ed\\code\\4coder_jump_direct.cpp", 37, 75 },
{ PROC_LINKS(goto_prev_jump_no_skips_sticky, 0), "goto_prev_jump_no_skips_sticky", 30, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, and does not skip sub jump locations.", 136, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 500 }, { PROC_LINKS(goto_prev_jump_no_skips_sticky, 0), "goto_prev_jump_no_skips_sticky", 30, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, and does not skip sub jump locations.", 136, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 538 },
{ PROC_LINKS(goto_prev_jump_sticky, 0), "goto_prev_jump_sticky", 21, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, skipping sub jump locations.", 127, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 470 }, { PROC_LINKS(goto_prev_jump_sticky, 0), "goto_prev_jump_sticky", 21, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, skipping sub jump locations.", 127, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 508 },
{ PROC_LINKS(hide_filebar, 0), "hide_filebar", 12, "Sets the current view to hide it's filebar.", 43, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 471 }, { PROC_LINKS(hide_filebar, 0), "hide_filebar", 12, "Sets the current view to hide it's filebar.", 43, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 471 },
{ PROC_LINKS(hide_scrollbar, 0), "hide_scrollbar", 14, "Sets the current view to hide it's scrollbar.", 45, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 457 }, { PROC_LINKS(hide_scrollbar, 0), "hide_scrollbar", 14, "Sets the current view to hide it's scrollbar.", 45, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 457 },
{ PROC_LINKS(highlight_next_scope_absolute, 0), "highlight_next_scope_absolute", 29, "Finds the first scope started by '{' after the cursor and puts the cursor and mark on the '{' and '}'.", 102, "w:\\4ed\\code\\4coder_scope_commands.cpp", 40, 363 }, { PROC_LINKS(highlight_next_scope_absolute, 0), "highlight_next_scope_absolute", 29, "Finds the first scope started by '{' after the cursor and puts the cursor and mark on the '{' and '}'.", 102, "w:\\4ed\\code\\4coder_scope_commands.cpp", 40, 363 },
@ -285,12 +286,12 @@ static Command_Metadata fcoder_metacmd_table[201] = {
{ PROC_LINKS(if0_off, 0), "if0_off", 7, "Surround the range between the cursor and mark with an '#if 0' and an '#endif'", 78, "w:\\4ed\\code\\4coder_combined_write_commands.cpp", 49, 82 }, { PROC_LINKS(if0_off, 0), "if0_off", 7, "Surround the range between the cursor and mark with an '#if 0' and an '#endif'", 78, "w:\\4ed\\code\\4coder_combined_write_commands.cpp", 49, 82 },
{ PROC_LINKS(increase_face_size, 0), "increase_face_size", 18, "Increase the size of the face used by the current buffer.", 57, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 519 }, { PROC_LINKS(increase_face_size, 0), "increase_face_size", 18, "Increase the size of the face used by the current buffer.", 57, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 519 },
{ PROC_LINKS(increase_line_wrap, 0), "increase_line_wrap", 18, "Increases the current buffer's width for line wrapping.", 55, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 497 }, { PROC_LINKS(increase_line_wrap, 0), "increase_line_wrap", 18, "Increases the current buffer's width for line wrapping.", 55, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 497 },
{ PROC_LINKS(interactive_kill_buffer, 0), "interactive_kill_buffer", 23, "Interactively kill an open buffer.", 34, "w:\\4ed\\code\\4coder_lists.cpp", 31, 608 }, { PROC_LINKS(interactive_kill_buffer, 0), "interactive_kill_buffer", 23, "Interactively kill an open buffer.", 34, "w:\\4ed\\code\\4coder_lists.cpp", 31, 647 },
{ PROC_LINKS(interactive_new, 0), "interactive_new", 15, "Interactively creates a new file.", 33, "w:\\4ed\\code\\4coder_lists.cpp", 31, 710 }, { PROC_LINKS(interactive_new, 0), "interactive_new", 15, "Interactively creates a new file.", 33, "w:\\4ed\\code\\4coder_lists.cpp", 31, 749 },
{ PROC_LINKS(interactive_open, 0), "interactive_open", 16, "Interactively opens a file.", 27, "w:\\4ed\\code\\4coder_lists.cpp", 31, 737 }, { PROC_LINKS(interactive_open, 0), "interactive_open", 16, "Interactively opens a file.", 27, "w:\\4ed\\code\\4coder_lists.cpp", 31, 776 },
{ PROC_LINKS(interactive_open_or_new, 0), "interactive_open_or_new", 23, "Interactively open a file out of the file system.", 49, "w:\\4ed\\code\\4coder_lists.cpp", 31, 677 }, { PROC_LINKS(interactive_open_or_new, 0), "interactive_open_or_new", 23, "Interactively open a file out of the file system.", 49, "w:\\4ed\\code\\4coder_lists.cpp", 31, 716 },
{ PROC_LINKS(interactive_switch_buffer, 0), "interactive_switch_buffer", 25, "Interactively switch to an open buffer.", 39, "w:\\4ed\\code\\4coder_lists.cpp", 31, 590 }, { PROC_LINKS(interactive_switch_buffer, 0), "interactive_switch_buffer", 25, "Interactively switch to an open buffer.", 39, "w:\\4ed\\code\\4coder_lists.cpp", 31, 629 },
{ PROC_LINKS(kill_buffer, 0), "kill_buffer", 11, "Kills the current buffer.", 25, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1432 }, { PROC_LINKS(kill_buffer, 0), "kill_buffer", 11, "Kills the current buffer.", 25, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1444 },
{ PROC_LINKS(left_adjust_view, 0), "left_adjust_view", 16, "Sets the left size of the view near the x position of the cursor.", 65, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 135 }, { PROC_LINKS(left_adjust_view, 0), "left_adjust_view", 16, "Sets the left size of the view near the x position of the cursor.", 65, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 135 },
{ PROC_LINKS(list_all_functions_current_buffer, 0), "list_all_functions_current_buffer", 33, "Creates a jump list of lines of the current buffer that appear to define or declare functions.", 94, "w:\\4ed\\code\\4coder_function_list.cpp", 39, 318 }, { PROC_LINKS(list_all_functions_current_buffer, 0), "list_all_functions_current_buffer", 33, "Creates a jump list of lines of the current buffer that appear to define or declare functions.", 94, "w:\\4ed\\code\\4coder_function_list.cpp", 39, 318 },
{ PROC_LINKS(list_all_locations, 0), "list_all_locations", 18, "Queries the user for a string and lists all exact case-sensitive matches found in all open buffers.", 99, "w:\\4ed\\code\\4coder_search.cpp", 32, 741 }, { PROC_LINKS(list_all_locations, 0), "list_all_locations", 18, "Queries the user for a string and lists all exact case-sensitive matches found in all open buffers.", 99, "w:\\4ed\\code\\4coder_search.cpp", 32, 741 },
@ -321,53 +322,54 @@ static Command_Metadata fcoder_metacmd_table[201] = {
{ PROC_LINKS(lister__write_character__file_path, 0), "lister__write_character__file_path", 34, "A lister mode command that inserts a character into the text field of a file system list.", 89, "w:\\4ed\\code\\4coder_lists.cpp", 31, 196 }, { PROC_LINKS(lister__write_character__file_path, 0), "lister__write_character__file_path", 34, "A lister mode command that inserts a character into the text field of a file system list.", 89, "w:\\4ed\\code\\4coder_lists.cpp", 31, 196 },
{ PROC_LINKS(lister__write_character__fixed_list, 0), "lister__write_character__fixed_list", 35, "A lister mode command that handles input for the fixed sure to kill list.", 73, "w:\\4ed\\code\\4coder_lists.cpp", 31, 256 }, { PROC_LINKS(lister__write_character__fixed_list, 0), "lister__write_character__fixed_list", 35, "A lister mode command that handles input for the fixed sure to kill list.", 73, "w:\\4ed\\code\\4coder_lists.cpp", 31, 256 },
{ PROC_LINKS(load_project, 0), "load_project", 12, "Looks for a project.4coder file in the current directory and tries to load it. Looks in parent directories until a project file is found or there are no more parents.", 167, "w:\\4ed\\code\\4coder_project_commands.cpp", 42, 1071 }, { PROC_LINKS(load_project, 0), "load_project", 12, "Looks for a project.4coder file in the current directory and tries to load it. Looks in parent directories until a project file is found or there are no more parents.", 167, "w:\\4ed\\code\\4coder_project_commands.cpp", 42, 1071 },
{ PROC_LINKS(make_directory_query, 0), "make_directory_query", 20, "Queries the user for a name and creates a new directory with the given name.", 76, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1120 }, { PROC_LINKS(make_directory_query, 0), "make_directory_query", 20, "Queries the user for a name and creates a new directory with the given name.", 76, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1132 },
{ PROC_LINKS(move_down, 0), "move_down", 9, "Moves the cursor down one line.", 31, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 250 }, { PROC_LINKS(move_down, 0), "move_down", 9, "Moves the cursor down one line.", 31, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 250 },
{ PROC_LINKS(move_down_10, 0), "move_down_10", 12, "Moves the cursor down ten lines.", 32, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 262 }, { PROC_LINKS(move_down_10, 0), "move_down_10", 12, "Moves the cursor down ten lines.", 32, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 262 },
{ PROC_LINKS(move_down_textual, 0), "move_down_textual", 17, "Moves down to the next line of actual text, regardless of line wrapping.", 72, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 268 }, { PROC_LINKS(move_down_textual, 0), "move_down_textual", 17, "Moves down to the next line of actual text, regardless of line wrapping.", 72, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 268 },
{ PROC_LINKS(move_left, 0), "move_left", 9, "Moves the cursor one character to the left.", 43, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 299 }, { PROC_LINKS(move_left, 0), "move_left", 9, "Moves the cursor one character to the left.", 43, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 299 },
{ PROC_LINKS(move_line_down, 0), "move_line_down", 14, "Swaps the line under the cursor with the line below it, and moves the cursor down with it.", 90, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1217 }, { PROC_LINKS(move_line_down, 0), "move_line_down", 14, "Swaps the line under the cursor with the line below it, and moves the cursor down with it.", 90, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1229 },
{ PROC_LINKS(move_line_up, 0), "move_line_up", 12, "Swaps the line under the cursor with the line above it, and moves the cursor up with it.", 88, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1153 }, { PROC_LINKS(move_line_up, 0), "move_line_up", 12, "Swaps the line under the cursor with the line above it, and moves the cursor up with it.", 88, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1165 },
{ PROC_LINKS(move_right, 0), "move_right", 10, "Moves the cursor one character to the right.", 44, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 308 }, { PROC_LINKS(move_right, 0), "move_right", 10, "Moves the cursor one character to the right.", 44, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 308 },
{ PROC_LINKS(move_up, 0), "move_up", 7, "Moves the cursor up one line.", 29, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 244 }, { PROC_LINKS(move_up, 0), "move_up", 7, "Moves the cursor up one line.", 29, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 244 },
{ PROC_LINKS(move_up_10, 0), "move_up_10", 10, "Moves the cursor up ten lines.", 30, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 256 }, { PROC_LINKS(move_up_10, 0), "move_up_10", 10, "Moves the cursor up ten lines.", 30, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 256 },
{ PROC_LINKS(newline_or_goto_position_direct, 0), "newline_or_goto_position_direct", 31, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor.", 106, "w:\\4ed\\code\\4coder_jump_direct.cpp", 37, 101 }, { PROC_LINKS(newline_or_goto_position_direct, 0), "newline_or_goto_position_direct", 31, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor.", 106, "w:\\4ed\\code\\4coder_jump_direct.cpp", 37, 101 },
{ PROC_LINKS(newline_or_goto_position_same_panel_direct, 0), "newline_or_goto_position_same_panel_direct", 42, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor_same_panel.", 117, "w:\\4ed\\code\\4coder_jump_direct.cpp", 37, 116 }, { PROC_LINKS(newline_or_goto_position_same_panel_direct, 0), "newline_or_goto_position_same_panel_direct", 42, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor_same_panel.", 117, "w:\\4ed\\code\\4coder_jump_direct.cpp", 37, 116 },
{ PROC_LINKS(newline_or_goto_position_same_panel_sticky, 0), "newline_or_goto_position_same_panel_sticky", 42, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor_same_panel.", 117, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 571 }, { PROC_LINKS(newline_or_goto_position_same_panel_sticky, 0), "newline_or_goto_position_same_panel_sticky", 42, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor_same_panel.", 117, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 609 },
{ PROC_LINKS(newline_or_goto_position_sticky, 0), "newline_or_goto_position_sticky", 31, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor.", 106, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 556 }, { PROC_LINKS(newline_or_goto_position_sticky, 0), "newline_or_goto_position_sticky", 31, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor.", 106, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 594 },
{ PROC_LINKS(open_all_code, 0), "open_all_code", 13, "Open all code in the current directory. File types are determined by extensions. An extension is considered code based on the extensions specified in 4coder.config.", 164, "w:\\4ed\\code\\4coder_project_commands.cpp", 42, 1055 }, { PROC_LINKS(open_all_code, 0), "open_all_code", 13, "Open all code in the current directory. File types are determined by extensions. An extension is considered code based on the extensions specified in 4coder.config.", 164, "w:\\4ed\\code\\4coder_project_commands.cpp", 42, 1055 },
{ PROC_LINKS(open_all_code_recursive, 0), "open_all_code_recursive", 23, "Works as open_all_code but also runs in all subdirectories.", 59, "w:\\4ed\\code\\4coder_project_commands.cpp", 42, 1062 }, { PROC_LINKS(open_all_code_recursive, 0), "open_all_code_recursive", 23, "Works as open_all_code but also runs in all subdirectories.", 59, "w:\\4ed\\code\\4coder_project_commands.cpp", 42, 1062 },
{ PROC_LINKS(open_color_tweaker, 0), "open_color_tweaker", 18, "Opens the 4coder colors and fonts selector menu.", 48, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1465 }, { PROC_LINKS(open_color_tweaker, 0), "open_color_tweaker", 18, "Opens the 4coder theme selector list.", 37, "w:\\4ed\\code\\4coder_lists.cpp", 31, 792 },
{ PROC_LINKS(open_file_in_quotes, 0), "open_file_in_quotes", 19, "Reads a filename from surrounding '\"' characters and attempts to open the corresponding file.", 94, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1339 }, { PROC_LINKS(open_file_in_quotes, 0), "open_file_in_quotes", 19, "Reads a filename from surrounding '\"' characters and attempts to open the corresponding file.", 94, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1351 },
{ PROC_LINKS(open_in_other, 0), "open_in_other", 13, "Interactively opens a file in the other panel.", 46, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1479 }, { PROC_LINKS(open_in_other, 0), "open_in_other", 13, "Interactively opens a file in the other panel.", 46, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1502 },
{ PROC_LINKS(open_long_braces, 0), "open_long_braces", 16, "At the cursor, insert a '{' and '}' separated by a blank line.", 62, "w:\\4ed\\code\\4coder_combined_write_commands.cpp", 49, 58 }, { PROC_LINKS(open_long_braces, 0), "open_long_braces", 16, "At the cursor, insert a '{' and '}' separated by a blank line.", 62, "w:\\4ed\\code\\4coder_combined_write_commands.cpp", 49, 58 },
{ PROC_LINKS(open_long_braces_break, 0), "open_long_braces_break", 22, "At the cursor, insert a '{' and '}break;' separated by a blank line.", 68, "w:\\4ed\\code\\4coder_combined_write_commands.cpp", 49, 74 }, { PROC_LINKS(open_long_braces_break, 0), "open_long_braces_break", 22, "At the cursor, insert a '{' and '}break;' separated by a blank line.", 68, "w:\\4ed\\code\\4coder_combined_write_commands.cpp", 49, 74 },
{ PROC_LINKS(open_long_braces_semicolon, 0), "open_long_braces_semicolon", 26, "At the cursor, insert a '{' and '};' separated by a blank line.", 63, "w:\\4ed\\code\\4coder_combined_write_commands.cpp", 49, 66 }, { PROC_LINKS(open_long_braces_semicolon, 0), "open_long_braces_semicolon", 26, "At the cursor, insert a '{' and '};' separated by a blank line.", 63, "w:\\4ed\\code\\4coder_combined_write_commands.cpp", 49, 66 },
{ PROC_LINKS(open_matching_file_cpp, 0), "open_matching_file_cpp", 22, "If the current file is a *.cpp or *.h, attempts to open the corresponding *.h or *.cpp file in the other view.", 110, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1375 }, { PROC_LINKS(open_matching_file_cpp, 0), "open_matching_file_cpp", 22, "If the current file is a *.cpp or *.h, attempts to open the corresponding *.h or *.cpp file in the other view.", 110, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1387 },
{ PROC_LINKS(open_panel_hsplit, 0), "open_panel_hsplit", 17, "Create a new panel by horizontally splitting the active panel.", 62, "w:\\4ed\\code\\4coder_default_framework.cpp", 43, 162 }, { PROC_LINKS(open_panel_hsplit, 0), "open_panel_hsplit", 17, "Create a new panel by horizontally splitting the active panel.", 62, "w:\\4ed\\code\\4coder_default_framework.cpp", 43, 164 },
{ PROC_LINKS(open_panel_vsplit, 0), "open_panel_vsplit", 17, "Create a new panel by vertically splitting the active panel.", 60, "w:\\4ed\\code\\4coder_default_framework.cpp", 43, 153 }, { PROC_LINKS(open_panel_vsplit, 0), "open_panel_vsplit", 17, "Create a new panel by vertically splitting the active panel.", 60, "w:\\4ed\\code\\4coder_default_framework.cpp", 43, 155 },
{ PROC_LINKS(page_down, 0), "page_down", 9, "Scrolls the view down one view height and moves the cursor down one view height.", 80, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 288 }, { PROC_LINKS(page_down, 0), "page_down", 9, "Scrolls the view down one view height and moves the cursor down one view height.", 80, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 288 },
{ PROC_LINKS(page_up, 0), "page_up", 7, "Scrolls the view up one view height and moves the cursor up one view height.", 76, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 279 }, { PROC_LINKS(page_up, 0), "page_up", 7, "Scrolls the view up one view height and moves the cursor up one view height.", 76, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 279 },
{ PROC_LINKS(paste, 0), "paste", 5, "At the cursor, insert the text at the top of the clipboard.", 59, "w:\\4ed\\code\\4coder_clipboard.cpp", 35, 46 }, { PROC_LINKS(paste, 0), "paste", 5, "At the cursor, insert the text at the top of the clipboard.", 59, "w:\\4ed\\code\\4coder_clipboard.cpp", 35, 46 },
{ PROC_LINKS(paste_and_indent, 0), "paste_and_indent", 16, "Paste from the top of clipboard and run auto-indent on the newly pasted text.", 77, "w:\\4ed\\code\\4coder_clipboard.cpp", 35, 130 }, { PROC_LINKS(paste_and_indent, 0), "paste_and_indent", 16, "Paste from the top of clipboard and run auto-indent on the newly pasted text.", 77, "w:\\4ed\\code\\4coder_clipboard.cpp", 35, 131 },
{ PROC_LINKS(paste_next, 0), "paste_next", 10, "If the previous command was paste or paste_next, replaces the paste range with the next text down on the clipboard, otherwise operates as the paste command.", 156, "w:\\4ed\\code\\4coder_clipboard.cpp", 35, 83 }, { PROC_LINKS(paste_next, 0), "paste_next", 10, "If the previous command was paste or paste_next, replaces the paste range with the next text down on the clipboard, otherwise operates as the paste command.", 156, "w:\\4ed\\code\\4coder_clipboard.cpp", 35, 83 },
{ PROC_LINKS(paste_next_and_indent, 0), "paste_next_and_indent", 21, "Paste the next item on the clipboard and run auto-indent on the newly pasted text.", 82, "w:\\4ed\\code\\4coder_clipboard.cpp", 35, 137 }, { PROC_LINKS(paste_next_and_indent, 0), "paste_next_and_indent", 21, "Paste the next item on the clipboard and run auto-indent on the newly pasted text.", 82, "w:\\4ed\\code\\4coder_clipboard.cpp", 35, 138 },
{ PROC_LINKS(place_in_scope, 0), "place_in_scope", 14, "Wraps the code contained in the range between cursor and mark with a new curly brace scope.", 91, "w:\\4ed\\code\\4coder_scope_commands.cpp", 40, 481 }, { PROC_LINKS(place_in_scope, 0), "place_in_scope", 14, "Wraps the code contained in the range between cursor and mark with a new curly brace scope.", 91, "w:\\4ed\\code\\4coder_scope_commands.cpp", 40, 481 },
{ PROC_LINKS(project_fkey_command, 0), "project_fkey_command", 20, "Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.", 175, "w:\\4ed\\code\\4coder_project_commands.cpp", 42, 1078 }, { PROC_LINKS(project_fkey_command, 0), "project_fkey_command", 20, "Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.", 175, "w:\\4ed\\code\\4coder_project_commands.cpp", 42, 1078 },
{ PROC_LINKS(project_go_to_root_directory, 0), "project_go_to_root_directory", 28, "Changes 4coder's hot directory to the root directory of the currently loaded project. With no loaded project nothing hapepns.", 125, "w:\\4ed\\code\\4coder_project_commands.cpp", 42, 1103 }, { PROC_LINKS(project_go_to_root_directory, 0), "project_go_to_root_directory", 28, "Changes 4coder's hot directory to the root directory of the currently loaded project. With no loaded project nothing hapepns.", 125, "w:\\4ed\\code\\4coder_project_commands.cpp", 42, 1103 },
{ PROC_LINKS(query_replace, 0), "query_replace", 13, "Queries the user for two strings, and incrementally replaces every occurence of the first string with the second string.", 120, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 912 }, { PROC_LINKS(query_replace, 0), "query_replace", 13, "Queries the user for two strings, and incrementally replaces every occurence of the first string with the second string.", 120, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 912 },
{ PROC_LINKS(query_replace_identifier, 0), "query_replace_identifier", 24, "Queries the user for a string, and incrementally replace every occurence of the word or token found at the cursor with the specified string.", 140, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 932 }, { PROC_LINKS(query_replace_identifier, 0), "query_replace_identifier", 24, "Queries the user for a string, and incrementally replace every occurence of the word or token found at the cursor with the specified string.", 140, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 932 },
{ PROC_LINKS(query_replace_selection, 0), "query_replace_selection", 23, "Queries the user for a string, and incrementally replace every occurence of the string found in the selected range with the specified string.", 141, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 950 }, { PROC_LINKS(query_replace_selection, 0), "query_replace_selection", 23, "Queries the user for a string, and incrementally replace every occurence of the string found in the selected range with the specified string.", 141, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 950 },
{ PROC_LINKS(redo, 0), "redo", 4, "Advances forewards through the undo history.", 44, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1447 }, { PROC_LINKS(redo, 0), "redo", 4, "Advances forewards through the undo history.", 44, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1459 },
{ PROC_LINKS(remap_interactive, 0), "remap_interactive", 17, "Switch to a named key binding map.", 34, "w:\\4ed\\code\\4coder_default_framework.cpp", 43, 211 }, { PROC_LINKS(reload_themes, 0), "reload_themes", 13, "Loads all the theme files in the theme folder, replacing duplicates with the new theme data.", 92, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1479 },
{ PROC_LINKS(rename_file_query, 0), "rename_file_query", 17, "Queries the user for a new name and renames the file of the current buffer, altering the buffer's name too.", 107, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1078 }, { PROC_LINKS(remap_interactive, 0), "remap_interactive", 17, "Switch to a named key binding map.", 34, "w:\\4ed\\code\\4coder_default_framework.cpp", 43, 213 },
{ PROC_LINKS(reopen, 0), "reopen", 6, "Reopen the current buffer from the hard drive.", 46, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1453 }, { PROC_LINKS(rename_file_query, 0), "rename_file_query", 17, "Queries the user for a new name and renames the file of the current buffer, altering the buffer's name too.", 107, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1090 },
{ PROC_LINKS(reopen, 0), "reopen", 6, "Reopen the current buffer from the hard drive.", 46, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1465 },
{ PROC_LINKS(replace_in_range, 0), "replace_in_range", 16, "Queries the user for two strings, and replaces all occurences of the first string in the range between the cursor and the mark with the second string.", 150, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 810 }, { PROC_LINKS(replace_in_range, 0), "replace_in_range", 16, "Queries the user for two strings, and replaces all occurences of the first string in the range between the cursor and the mark with the second string.", 150, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 810 },
{ PROC_LINKS(reverse_search, 0), "reverse_search", 14, "Begins an incremental search up through the current buffer for a user specified string.", 87, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 781 }, { PROC_LINKS(reverse_search, 0), "reverse_search", 14, "Begins an incremental search up through the current buffer for a user specified string.", 87, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 781 },
{ PROC_LINKS(reverse_search_identifier, 0), "reverse_search_identifier", 25, "Begins an incremental search up through the current buffer for the word or token under the cursor.", 98, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 799 }, { PROC_LINKS(reverse_search_identifier, 0), "reverse_search_identifier", 25, "Begins an incremental search up through the current buffer for the word or token under the cursor.", 98, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 799 },
{ PROC_LINKS(save, 0), "save", 4, "Saves the current buffer.", 25, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1459 }, { PROC_LINKS(save, 0), "save", 4, "Saves the current buffer.", 25, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1471 },
{ PROC_LINKS(save_all_dirty_buffers, 0), "save_all_dirty_buffers", 22, "Saves all buffers marked dirty (showing the '*' indicator).", 59, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 977 }, { PROC_LINKS(save_all_dirty_buffers, 0), "save_all_dirty_buffers", 22, "Saves all buffers marked dirty (showing the '*' indicator).", 59, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 994 },
{ PROC_LINKS(save_to_query, 0), "save_to_query", 13, "Queries the user for a name and saves the contents of the current buffer, altering the buffer's name too.", 105, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1038 }, { PROC_LINKS(save_to_query, 0), "save_to_query", 13, "Queries the user for a name and saves the contents of the current buffer, altering the buffer's name too.", 105, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1050 },
{ PROC_LINKS(scope_absorb_down, 0), "scope_absorb_down", 17, "If a scope is currently selected, and a statement or block statement is present below the current scope, the statement is moved into the scope.", 143, "w:\\4ed\\code\\4coder_scope_commands.cpp", 40, 738 }, { PROC_LINKS(scope_absorb_down, 0), "scope_absorb_down", 17, "If a scope is currently selected, and a statement or block statement is present below the current scope, the statement is moved into the scope.", 143, "w:\\4ed\\code\\4coder_scope_commands.cpp", 40, 738 },
{ PROC_LINKS(search, 0), "search", 6, "Begins an incremental search down through the current buffer for a user specified string.", 89, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 774 }, { PROC_LINKS(search, 0), "search", 6, "Begins an incremental search down through the current buffer for a user specified string.", 89, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 774 },
{ PROC_LINKS(search_identifier, 0), "search_identifier", 17, "Begins an incremental search down through the current buffer for the word or token under the cursor.", 100, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 788 }, { PROC_LINKS(search_identifier, 0), "search_identifier", 17, "Begins an incremental search down through the current buffer for the word or token under the cursor.", 100, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 788 },
@ -402,18 +404,18 @@ static Command_Metadata fcoder_metacmd_table[201] = {
{ PROC_LINKS(show_scrollbar, 0), "show_scrollbar", 14, "Sets the current view to show it's scrollbar.", 45, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 450 }, { PROC_LINKS(show_scrollbar, 0), "show_scrollbar", 14, "Sets the current view to show it's scrollbar.", 45, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 450 },
{ PROC_LINKS(snipe_token_or_word, 0), "snipe_token_or_word", 19, "Delete a single, whole token on or to the left of the cursor and post it to the clipboard.", 90, "w:\\4ed\\code\\4coder_seek.cpp", 30, 1259 }, { PROC_LINKS(snipe_token_or_word, 0), "snipe_token_or_word", 19, "Delete a single, whole token on or to the left of the cursor and post it to the clipboard.", 90, "w:\\4ed\\code\\4coder_seek.cpp", 30, 1259 },
{ PROC_LINKS(snipe_token_or_word_right, 0), "snipe_token_or_word_right", 25, "Delete a single, whole token on or to the right of the cursor and post it to the clipboard.", 91, "w:\\4ed\\code\\4coder_seek.cpp", 30, 1265 }, { PROC_LINKS(snipe_token_or_word_right, 0), "snipe_token_or_word_right", 25, "Delete a single, whole token on or to the right of the cursor and post it to the clipboard.", 91, "w:\\4ed\\code\\4coder_seek.cpp", 30, 1265 },
{ PROC_LINKS(suppress_mouse, 0), "suppress_mouse", 14, "Hides the mouse and causes all mosue input (clicks, position, wheel) to be ignored.", 83, "w:\\4ed\\code\\4coder_default_framework.cpp", 43, 185 }, { PROC_LINKS(suppress_mouse, 0), "suppress_mouse", 14, "Hides the mouse and causes all mosue input (clicks, position, wheel) to be ignored.", 83, "w:\\4ed\\code\\4coder_default_framework.cpp", 43, 187 },
{ PROC_LINKS(swap_buffers_between_panels, 0), "swap_buffers_between_panels", 27, "Set the other non-active panel to view the buffer that the active panel views, and switch to that panel.", 104, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1399 }, { PROC_LINKS(swap_buffers_between_panels, 0), "swap_buffers_between_panels", 27, "Set the other non-active panel to view the buffer that the active panel views, and switch to that panel.", 104, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1411 },
{ PROC_LINKS(to_lowercase, 0), "to_lowercase", 12, "Converts all ascii text in the range between the cursor and the mark to lowercase.", 82, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 348 }, { PROC_LINKS(to_lowercase, 0), "to_lowercase", 12, "Converts all ascii text in the range between the cursor and the mark to lowercase.", 82, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 348 },
{ PROC_LINKS(to_uppercase, 0), "to_uppercase", 12, "Converts all ascii text in the range between the cursor and the mark to uppercase.", 82, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 328 }, { PROC_LINKS(to_uppercase, 0), "to_uppercase", 12, "Converts all ascii text in the range between the cursor and the mark to uppercase.", 82, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 328 },
{ PROC_LINKS(toggle_filebar, 0), "toggle_filebar", 14, "Toggles the visibility status of the current view's filebar.", 60, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 478 }, { PROC_LINKS(toggle_filebar, 0), "toggle_filebar", 14, "Toggles the visibility status of the current view's filebar.", 60, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 478 },
{ PROC_LINKS(toggle_fullscreen, 0), "toggle_fullscreen", 17, "Toggle fullscreen mode on or off. The change(s) do not take effect until the next frame.", 89, "w:\\4ed\\code\\4coder_default_framework.cpp", 43, 203 }, { PROC_LINKS(toggle_fullscreen, 0), "toggle_fullscreen", 17, "Toggle fullscreen mode on or off. The change(s) do not take effect until the next frame.", 89, "w:\\4ed\\code\\4coder_default_framework.cpp", 43, 205 },
{ PROC_LINKS(toggle_line_wrap, 0), "toggle_line_wrap", 16, "Toggles the current buffer's line wrapping status.", 50, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 487 }, { PROC_LINKS(toggle_line_wrap, 0), "toggle_line_wrap", 16, "Toggles the current buffer's line wrapping status.", 50, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 487 },
{ PROC_LINKS(toggle_mouse, 0), "toggle_mouse", 12, "Toggles the mouse suppression mode, see suppress_mouse and allow_mouse.", 71, "w:\\4ed\\code\\4coder_default_framework.cpp", 43, 197 }, { PROC_LINKS(toggle_mouse, 0), "toggle_mouse", 12, "Toggles the mouse suppression mode, see suppress_mouse and allow_mouse.", 71, "w:\\4ed\\code\\4coder_default_framework.cpp", 43, 199 },
{ PROC_LINKS(toggle_show_whitespace, 0), "toggle_show_whitespace", 22, "Toggles the current buffer's whitespace visibility status.", 58, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 554 }, { PROC_LINKS(toggle_show_whitespace, 0), "toggle_show_whitespace", 22, "Toggles the current buffer's whitespace visibility status.", 58, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 554 },
{ PROC_LINKS(toggle_virtual_whitespace, 0), "toggle_virtual_whitespace", 25, "Toggles the current buffer's virtual whitespace status.", 55, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 543 }, { PROC_LINKS(toggle_virtual_whitespace, 0), "toggle_virtual_whitespace", 25, "Toggles the current buffer's virtual whitespace status.", 55, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 543 },
{ PROC_LINKS(undo, 0), "undo", 4, "Advances backwards through the undo history.", 44, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1441 }, { PROC_LINKS(undo, 0), "undo", 4, "Advances backwards through the undo history.", 44, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1453 },
{ PROC_LINKS(view_buffer_other_panel, 0), "view_buffer_other_panel", 23, "Set the other non-active panel to view the buffer that the active panel views, and switch to that panel.", 104, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1389 }, { PROC_LINKS(view_buffer_other_panel, 0), "view_buffer_other_panel", 23, "Set the other non-active panel to view the buffer that the active panel views, and switch to that panel.", 104, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1401 },
{ PROC_LINKS(word_complete, 0), "word_complete", 13, "Iteratively tries completing the word to the left of the cursor with other words in open buffers that have the same prefix string.", 130, "w:\\4ed\\code\\4coder_search.cpp", 32, 820 }, { PROC_LINKS(word_complete, 0), "word_complete", 13, "Iteratively tries completing the word to the left of the cursor with other words in open buffers that have the same prefix string.", 130, "w:\\4ed\\code\\4coder_search.cpp", 32, 820 },
{ PROC_LINKS(write_and_auto_tab, 0), "write_and_auto_tab", 18, "Inserts a character and auto-indents the line on which the cursor sits.", 71, "w:\\4ed\\code\\4coder_auto_indent.cpp", 37, 745 }, { PROC_LINKS(write_and_auto_tab, 0), "write_and_auto_tab", 18, "Inserts a character and auto-indents the line on which the cursor sits.", 71, "w:\\4ed\\code\\4coder_auto_indent.cpp", 37, 745 },
{ PROC_LINKS(write_block, 0), "write_block", 11, "At the cursor, insert a block comment.", 38, "w:\\4ed\\code\\4coder_combined_write_commands.cpp", 49, 106 }, { PROC_LINKS(write_block, 0), "write_block", 11, "At the cursor, insert a block comment.", 38, "w:\\4ed\\code\\4coder_combined_write_commands.cpp", 49, 106 },
@ -561,68 +563,69 @@ static int32_t fcoder_metacmd_ID_query_replace = 133;
static int32_t fcoder_metacmd_ID_query_replace_identifier = 134; static int32_t fcoder_metacmd_ID_query_replace_identifier = 134;
static int32_t fcoder_metacmd_ID_query_replace_selection = 135; static int32_t fcoder_metacmd_ID_query_replace_selection = 135;
static int32_t fcoder_metacmd_ID_redo = 136; static int32_t fcoder_metacmd_ID_redo = 136;
static int32_t fcoder_metacmd_ID_remap_interactive = 137; static int32_t fcoder_metacmd_ID_reload_themes = 137;
static int32_t fcoder_metacmd_ID_rename_file_query = 138; static int32_t fcoder_metacmd_ID_remap_interactive = 138;
static int32_t fcoder_metacmd_ID_reopen = 139; static int32_t fcoder_metacmd_ID_rename_file_query = 139;
static int32_t fcoder_metacmd_ID_replace_in_range = 140; static int32_t fcoder_metacmd_ID_reopen = 140;
static int32_t fcoder_metacmd_ID_reverse_search = 141; static int32_t fcoder_metacmd_ID_replace_in_range = 141;
static int32_t fcoder_metacmd_ID_reverse_search_identifier = 142; static int32_t fcoder_metacmd_ID_reverse_search = 142;
static int32_t fcoder_metacmd_ID_save = 143; static int32_t fcoder_metacmd_ID_reverse_search_identifier = 143;
static int32_t fcoder_metacmd_ID_save_all_dirty_buffers = 144; static int32_t fcoder_metacmd_ID_save = 144;
static int32_t fcoder_metacmd_ID_save_to_query = 145; static int32_t fcoder_metacmd_ID_save_all_dirty_buffers = 145;
static int32_t fcoder_metacmd_ID_scope_absorb_down = 146; static int32_t fcoder_metacmd_ID_save_to_query = 146;
static int32_t fcoder_metacmd_ID_search = 147; static int32_t fcoder_metacmd_ID_scope_absorb_down = 147;
static int32_t fcoder_metacmd_ID_search_identifier = 148; static int32_t fcoder_metacmd_ID_search = 148;
static int32_t fcoder_metacmd_ID_seek_alphanumeric_left = 149; static int32_t fcoder_metacmd_ID_search_identifier = 149;
static int32_t fcoder_metacmd_ID_seek_alphanumeric_or_camel_left = 150; static int32_t fcoder_metacmd_ID_seek_alphanumeric_left = 150;
static int32_t fcoder_metacmd_ID_seek_alphanumeric_or_camel_right = 151; static int32_t fcoder_metacmd_ID_seek_alphanumeric_or_camel_left = 151;
static int32_t fcoder_metacmd_ID_seek_alphanumeric_right = 152; static int32_t fcoder_metacmd_ID_seek_alphanumeric_or_camel_right = 152;
static int32_t fcoder_metacmd_ID_seek_beginning_of_line = 153; static int32_t fcoder_metacmd_ID_seek_alphanumeric_right = 153;
static int32_t fcoder_metacmd_ID_seek_beginning_of_textual_line = 154; static int32_t fcoder_metacmd_ID_seek_beginning_of_line = 154;
static int32_t fcoder_metacmd_ID_seek_end_of_line = 155; static int32_t fcoder_metacmd_ID_seek_beginning_of_textual_line = 155;
static int32_t fcoder_metacmd_ID_seek_end_of_textual_line = 156; static int32_t fcoder_metacmd_ID_seek_end_of_line = 156;
static int32_t fcoder_metacmd_ID_seek_token_left = 157; static int32_t fcoder_metacmd_ID_seek_end_of_textual_line = 157;
static int32_t fcoder_metacmd_ID_seek_token_right = 158; static int32_t fcoder_metacmd_ID_seek_token_left = 158;
static int32_t fcoder_metacmd_ID_seek_white_or_token_left = 159; static int32_t fcoder_metacmd_ID_seek_token_right = 159;
static int32_t fcoder_metacmd_ID_seek_white_or_token_right = 160; static int32_t fcoder_metacmd_ID_seek_white_or_token_left = 160;
static int32_t fcoder_metacmd_ID_seek_whitespace_down = 161; static int32_t fcoder_metacmd_ID_seek_white_or_token_right = 161;
static int32_t fcoder_metacmd_ID_seek_whitespace_down_end_line = 162; static int32_t fcoder_metacmd_ID_seek_whitespace_down = 162;
static int32_t fcoder_metacmd_ID_seek_whitespace_left = 163; static int32_t fcoder_metacmd_ID_seek_whitespace_down_end_line = 163;
static int32_t fcoder_metacmd_ID_seek_whitespace_right = 164; static int32_t fcoder_metacmd_ID_seek_whitespace_left = 164;
static int32_t fcoder_metacmd_ID_seek_whitespace_up = 165; static int32_t fcoder_metacmd_ID_seek_whitespace_right = 165;
static int32_t fcoder_metacmd_ID_seek_whitespace_up_end_line = 166; static int32_t fcoder_metacmd_ID_seek_whitespace_up = 166;
static int32_t fcoder_metacmd_ID_select_all = 167; static int32_t fcoder_metacmd_ID_seek_whitespace_up_end_line = 167;
static int32_t fcoder_metacmd_ID_set_bindings_choose = 168; static int32_t fcoder_metacmd_ID_select_all = 168;
static int32_t fcoder_metacmd_ID_set_bindings_default = 169; static int32_t fcoder_metacmd_ID_set_bindings_choose = 169;
static int32_t fcoder_metacmd_ID_set_bindings_mac_default = 170; static int32_t fcoder_metacmd_ID_set_bindings_default = 170;
static int32_t fcoder_metacmd_ID_set_mark = 171; static int32_t fcoder_metacmd_ID_set_bindings_mac_default = 171;
static int32_t fcoder_metacmd_ID_setup_build_bat = 172; static int32_t fcoder_metacmd_ID_set_mark = 172;
static int32_t fcoder_metacmd_ID_setup_build_bat_and_sh = 173; static int32_t fcoder_metacmd_ID_setup_build_bat = 173;
static int32_t fcoder_metacmd_ID_setup_build_sh = 174; static int32_t fcoder_metacmd_ID_setup_build_bat_and_sh = 174;
static int32_t fcoder_metacmd_ID_setup_new_project = 175; static int32_t fcoder_metacmd_ID_setup_build_sh = 175;
static int32_t fcoder_metacmd_ID_show_filebar = 176; static int32_t fcoder_metacmd_ID_setup_new_project = 176;
static int32_t fcoder_metacmd_ID_show_scrollbar = 177; static int32_t fcoder_metacmd_ID_show_filebar = 177;
static int32_t fcoder_metacmd_ID_snipe_token_or_word = 178; static int32_t fcoder_metacmd_ID_show_scrollbar = 178;
static int32_t fcoder_metacmd_ID_snipe_token_or_word_right = 179; static int32_t fcoder_metacmd_ID_snipe_token_or_word = 179;
static int32_t fcoder_metacmd_ID_suppress_mouse = 180; static int32_t fcoder_metacmd_ID_snipe_token_or_word_right = 180;
static int32_t fcoder_metacmd_ID_swap_buffers_between_panels = 181; static int32_t fcoder_metacmd_ID_suppress_mouse = 181;
static int32_t fcoder_metacmd_ID_to_lowercase = 182; static int32_t fcoder_metacmd_ID_swap_buffers_between_panels = 182;
static int32_t fcoder_metacmd_ID_to_uppercase = 183; static int32_t fcoder_metacmd_ID_to_lowercase = 183;
static int32_t fcoder_metacmd_ID_toggle_filebar = 184; static int32_t fcoder_metacmd_ID_to_uppercase = 184;
static int32_t fcoder_metacmd_ID_toggle_fullscreen = 185; static int32_t fcoder_metacmd_ID_toggle_filebar = 185;
static int32_t fcoder_metacmd_ID_toggle_line_wrap = 186; static int32_t fcoder_metacmd_ID_toggle_fullscreen = 186;
static int32_t fcoder_metacmd_ID_toggle_mouse = 187; static int32_t fcoder_metacmd_ID_toggle_line_wrap = 187;
static int32_t fcoder_metacmd_ID_toggle_show_whitespace = 188; static int32_t fcoder_metacmd_ID_toggle_mouse = 188;
static int32_t fcoder_metacmd_ID_toggle_virtual_whitespace = 189; static int32_t fcoder_metacmd_ID_toggle_show_whitespace = 189;
static int32_t fcoder_metacmd_ID_undo = 190; static int32_t fcoder_metacmd_ID_toggle_virtual_whitespace = 190;
static int32_t fcoder_metacmd_ID_view_buffer_other_panel = 191; static int32_t fcoder_metacmd_ID_undo = 191;
static int32_t fcoder_metacmd_ID_word_complete = 192; static int32_t fcoder_metacmd_ID_view_buffer_other_panel = 192;
static int32_t fcoder_metacmd_ID_write_and_auto_tab = 193; static int32_t fcoder_metacmd_ID_word_complete = 193;
static int32_t fcoder_metacmd_ID_write_block = 194; static int32_t fcoder_metacmd_ID_write_and_auto_tab = 194;
static int32_t fcoder_metacmd_ID_write_character = 195; static int32_t fcoder_metacmd_ID_write_block = 195;
static int32_t fcoder_metacmd_ID_write_hack = 196; static int32_t fcoder_metacmd_ID_write_character = 196;
static int32_t fcoder_metacmd_ID_write_note = 197; static int32_t fcoder_metacmd_ID_write_hack = 197;
static int32_t fcoder_metacmd_ID_write_todo = 198; static int32_t fcoder_metacmd_ID_write_note = 198;
static int32_t fcoder_metacmd_ID_write_underscore = 199; static int32_t fcoder_metacmd_ID_write_todo = 199;
static int32_t fcoder_metacmd_ID_write_zero_struct = 200; static int32_t fcoder_metacmd_ID_write_underscore = 200;
static int32_t fcoder_metacmd_ID_write_zero_struct = 201;
#endif #endif

View File

@ -44,8 +44,10 @@ struct Bind_Buffer{
#endif #endif
#define PtrDif(a,b) ((uint8_t*)(a) - (uint8_t*)(b)) #define PtrDif(a,b) ((uint8_t*)(a) - (uint8_t*)(b))
#define PtrAsInt(a) PtrDif(a,0) #define PtrAsInt(a) PtrDif(a,0)
#define HandleAsU64(a) (uint64_t)(PtrAsInt(a))
#define OffsetOfMember(S,m) PtrAsInt(&Member(S,m)) #define OffsetOfMember(S,m) PtrAsInt(&Member(S,m))
#define CastFromMember(S,m,ptr) (S*)( (uint8_t*)(ptr) - OffsetOfMember(S,m) ) #define CastFromMember(S,m,ptr) (S*)( (uint8_t*)(ptr) - OffsetOfMember(S,m) )
#define IntAsPtr(a) (void*)(((uint8_t*)0) + a)
#if !defined(max_f32) #if !defined(max_f32)
inline float inline float
@ -86,8 +88,8 @@ struct File_Name_Data{
struct File_Name_Path_Data{ struct File_Name_Path_Data{
String file_name; String file_name;
String path; String path;
String data; String data;
}; };
//////////////////////////////// ////////////////////////////////
@ -95,8 +97,8 @@ struct Buffer_Rect{
int32_t char0; int32_t char0;
int32_t line0; int32_t line0;
int32_t char1; int32_t char1;
int32_t line1; int32_t line1;
}; };
//////////////////////////////// ////////////////////////////////

View File

@ -11,7 +11,7 @@ CUSTOM_DOC("If the cursor is found to be on a jump location, parses the jump loc
Temp_Memory temp = begin_temp_memory(&global_part); Temp_Memory temp = begin_temp_memory(&global_part);
View_Summary view = get_active_view(app, AccessProtected); View_Summary view = get_active_view(app, AccessProtected);
Name_Based_Jump_Location location = {0}; Name_Line_Column_Location location = {0};
if (parse_jump_from_buffer_line(app, &global_part, view.buffer_id, view.cursor.line, false, &location)){ if (parse_jump_from_buffer_line(app, &global_part, view.buffer_id, view.cursor.line, false, &location)){
change_active_panel(app); change_active_panel(app);
View_Summary target_view = get_active_view(app, AccessAll); View_Summary target_view = get_active_view(app, AccessAll);
@ -32,7 +32,7 @@ CUSTOM_DOC("If the cursor is found to be on a jump location, parses the jump loc
Temp_Memory temp = begin_temp_memory(&global_part); Temp_Memory temp = begin_temp_memory(&global_part);
View_Summary view = get_active_view(app, AccessProtected); View_Summary view = get_active_view(app, AccessProtected);
Name_Based_Jump_Location location = {0}; Name_Line_Column_Location location = {0};
if (parse_jump_from_buffer_line(app, &global_part, view.buffer_id, view.cursor.line, false, &location)){ if (parse_jump_from_buffer_line(app, &global_part, view.buffer_id, view.cursor.line, false, &location)){
View_Summary target_view = view; View_Summary target_view = view;

View File

@ -87,15 +87,148 @@ sticky_jump_markers_cleanup(Application_Links *app, Marker_Handle handle, void *
} }
} }
// TODO(allen): what to do when a push returns 0? static Sticky_Jump_Array
parse_buffer_to_jump_array(Application_Links *app, Partition *arena, Buffer_Summary buffer){
Sticky_Jump_Array result = {0};
result.jumps = push_array(arena, Sticky_Jump, 0);
for (int32_t line = 1;; line += 1){
bool32 output_jump = false;
int32_t colon_index = 0;
bool32 is_sub_error = false;
Buffer_ID out_buffer_id = 0;
int32_t out_pos = 0;
Temp_Memory temp = begin_temp_memory(arena);
String line_str = {0};
if (read_line(app, arena, &buffer, line, &line_str)){
Name_Line_Column_Location location = {0};
if (parse_jump_location(line_str, &location, &colon_index, &is_sub_error)){
Buffer_Summary jump_buffer = {0};
if (open_file(app, &jump_buffer, location.file.str, location.file.size, false, true)){
if (jump_buffer.exists){
Partial_Cursor cursor = {0};
if (buffer_compute_cursor(app, &jump_buffer,
seek_line_char(location.line, location.column),
&cursor)){
out_buffer_id = jump_buffer.buffer_id;
out_pos = cursor.pos;
output_jump = true;
}
}
}
}
}
else{
end_temp_memory(temp);
break;
}
end_temp_memory(temp);
if (output_jump){
Sticky_Jump *jump = push_array(arena, Sticky_Jump, 1);
jump->list_line = line;
jump->list_colon_index = colon_index;
jump->is_sub_error = is_sub_error;
jump->jump_buffer_id = out_buffer_id;
jump->jump_pos = out_pos;
}
}
result.count = (int32_t)(push_array(arena, Sticky_Jump, 0) - result.jumps);
return(result);
}
static Range_Array
jump_array_mark_buffer_ranges(Partition *arena, Sticky_Jump_Array jumps){
Range_Array result = {0};
result.ranges = push_array(arena, Range, 0);
int32_t start_i = 0;
for (int32_t i = 1; i <= jumps.count; i += 1){
bool32 is_end = false;
if (i == jumps.count){
is_end = true;
}
else if (jumps.jumps[i].jump_buffer_id != jumps.jumps[start_i].jump_buffer_id){
is_end = true;
}
if (is_end){
Range *new_range = push_array(arena, Range, 1);
new_range->first = start_i;
new_range->one_past_last = i;
start_i = i;
}
}
result.count = (int32_t)(push_array(arena, Range, 0) - result.ranges);
return(result);
}
#if 1
static void static void
init_marker_list(Application_Links *app, Partition *part, General_Memory *general, int32_t buffer_id, init_marker_list(Application_Links *app, Partition *part, General_Memory *general, Buffer_ID buffer_id,
Marker_List *list){ Marker_List *list){
Buffer_Summary buffer = get_buffer(app, buffer_id, AccessAll); Buffer_Summary buffer = get_buffer(app, buffer_id, AccessAll);
Temp_Memory temp = begin_temp_memory(part); Temp_Memory temp = begin_temp_memory(part);
ID_Based_Jump_Location *location_list = (ID_Based_Jump_Location*)partition_current(part); Sticky_Jump_Array jumps = parse_buffer_to_jump_array(app, part, buffer);
uint32_t location_count = 0; Range_Array buffer_ranges = jump_array_mark_buffer_ranges(part, jumps);
Dynamic_Scope scope_array[2];
scope_array[0] = buffer_get_dynamic_scope(app, buffer_id);
List_Node_Handle list_sentinel = managed_list_node_alloc(app, scope_array[0]);
for (int32_t i = 0; i < buffer_ranges.count; i += 1){
Range range = buffer_ranges.ranges[i];
Buffer_ID target_buffer_id = jumps.jumps[range.first].jump_buffer_id;
int32_t jump_count = range.one_past_last - range.first;
scope_array[1] = buffer_get_dynamic_scope(app, target_buffer_id);
Dynamic_Scope scope = get_intersected_dynamic_scope(app, scope_array, ArrayCount(scope_array));
Marker_Handle marker_handle = buffer_add_markers(app, target_buffer_id, jump_count, &scope);
Temp_Memory marker_temp = begin_temp_memory(part);
Marker *markers = push_array(part, Marker, jump_count);
for (int32_t j = 0; j < jump_count; j += 1){
markers[j].pos = jumps.jumps[j + range.first].jump_pos;
markers[j].lean_right = false;
}
buffer_set_markers(app, handle, 0, jump_count, markers);
end_temp_memory(marker_temp);
int32_t line_details_mem_size = sizeof(Sticky_Jump_Line_Details)*jump_count;
Memory_Handle memory = managed_memory_alloc(app, scope, line_details_mem_size);
Temp_Memory details_temp = begin_temp_memory(part);
Sticky_Jump_Line_Details *details = push_array(part, Sticky_Jump_Line_Details, jump_count);
for (int32_t j = 0; j < jump_count; j += 1){
details[j].list_line = jumps.jumps[j + range.first].list_line;
details[j].list_colon_index = jumps.jumps[j + range.first].list_colon_index;
details[j].is_sub_error = jumps.jumps[j + range.first].is_sub_error;
}
managed_memory_set(app, memory, 0, details, line_details_mem_size);
end_temp_memory(details_temp);
List_Node_Handle node_handle = managed_list_node_alloc(app, scope, sizeof(Sticky_Jump_Node_Header));
managed_list_node_insert(app, list_sentinel, node_handle, ListInsert_Back);
Sticky_Jump_Node_Header node_header = {0};
node_header.memory = memory;
node_header.markers = marker_handle;
node_handle.count = jump_count;
managed_memory_set(app, node_handle, 0, &node_header, sizeof(node_header));
}
end_temp_memory(temp);
}
#else
static void
init_marker_list(Application_Links *app, Partition *part, General_Memory *general, Buffer_ID buffer_id,
Marker_List *list){
Buffer_Summary buffer = get_buffer(app, buffer_id, AccessAll);
Temp_Memory temp = begin_temp_memory(part);
Sticky_Jump_Array jumps = parse_buffer_to_jump_array(app, part, buffer);
Range_Array buffer_ranges = jump_array_mark_buffer_ranges(part, jumps);
list->dst_max = 64; list->dst_max = 64;
list->dst = gen_array(general, Sticky_Jump_Destination_Array, list->dst_max); list->dst = gen_array(general, Sticky_Jump_Destination_Array, list->dst_max);
@ -106,48 +239,17 @@ init_marker_list(Application_Links *app, Partition *part, General_Memory *genera
list->previous_size = buffer.size; list->previous_size = buffer.size;
uint32_t prev_jump_count = 0; uint32_t prev_jump_count = 0;
for (int32_t this_jump_line = 1;; ++this_jump_line){ for (int32_t i = 0; i < buffer_ranges.count; i += 1){
bool32 output_jump = false; Range range = buffer_ranges.ranges[i];
Name_Based_Jump_Location location = {0}; Buffer_ID target_buffer_id = jumps.jumps[range.first].jump_buffer_id;
bool32 is_sub_error = false; int32_t jump_count = range.one_past_last - range.first;
Temp_Memory temp_name = begin_temp_memory(part);
String line_str = {0};
if (read_line(app, part, &buffer, this_jump_line, &line_str)){
int32_t colon_index = 0;
if (parse_jump_location(line_str, &location, &colon_index, &is_sub_error)){
output_jump = true;
}
else{
end_temp_memory(temp_name);
}
}
else{
end_temp_memory(temp_name);
break;
}
if (output_jump){
Buffer_Summary jump_buffer = {0};
if (open_file(app, &jump_buffer, location.file.str, location.file.size, false, true)){
end_temp_memory(temp_name);
if (jump_buffer.buffer_id != 0){
ID_Based_Jump_Location id_location = {0};
id_location.buffer_id = jump_buffer.buffer_id;
id_location.line = location.line;
id_location.column = location.column;
if (location_count > 0){
ID_Based_Jump_Location *prev_parsed_loc = &location_list[location_count-1];
if (prev_parsed_loc->buffer_id != id_location.buffer_id){
Buffer_Summary location_buffer = get_buffer(app, prev_parsed_loc->buffer_id, AccessAll);
if (location_buffer.exists){
if (list->dst_count >= list->dst_max){ if (list->dst_count >= list->dst_max){
double_dst_max(general, list); double_dst_max(general, list);
} }
Marker_Handle new_handle = buffer_add_markers(app, &location_buffer, location_count, Buffer_Summary location_buffer = get_buffer(app, target_buffer_id, AccessAll);
Marker_Handle new_handle = buffer_add_markers(app, &location_buffer, jump_count,
sticky_jump_markers_cleanup, &list, sizeof(list)); sticky_jump_markers_cleanup, &list, sizeof(list));
list->dst[list->dst_count] = make_sticky_jump_destination_array(prev_jump_count, new_handle); list->dst[list->dst_count] = make_sticky_jump_destination_array(prev_jump_count, new_handle);
@ -155,82 +257,30 @@ init_marker_list(Application_Links *app, Partition *part, General_Memory *genera
prev_jump_count = list->jump_count; prev_jump_count = list->jump_count;
Marker *markers = push_array(part, Marker, location_count); Temp_Memory marker_temp = begin_temp_memory(part);
for (uint32_t i = 0; i < location_count; ++i){ Marker *markers = push_array(part, Marker, jump_count);
ID_Based_Jump_Location *write_loc = &location_list[i]; for (int32_t j = 0; j < jump_count; j += 1){
Partial_Cursor cursor = {0}; markers[j].pos = jumps.jumps[j + range.first].jump_pos;
Buffer_Seek seek = seek_line_char(write_loc->line, write_loc->column); markers[j].lean_right = false;
if (buffer_compute_cursor(app, &location_buffer, seek, &cursor)){
markers[i].pos = cursor.pos;
markers[i].lean_right = false;
}
} }
buffer_set_markers(app, &location_buffer, new_handle, 0, jump_count, markers);
end_temp_memory(marker_temp);
buffer_set_markers(app, &location_buffer, new_handle, 0, location_count, markers); for (int32_t j = range.first; j < range.one_past_last; j += 1){
location_count = 0;
reset_temp_memory(temp);
}
}
}
ID_Based_Jump_Location *new_id_location = push_struct(part, ID_Based_Jump_Location);
*new_id_location = id_location;
++location_count;
if (list->jump_count >= list->jump_max){ if (list->jump_count >= list->jump_max){
double_jump_max(general, list); double_jump_max(general, list);
} }
uint32_t flags = 0; uint32_t flags = 0;
if (is_sub_error){ if (jumps.jumps[j].is_sub_error){
flags |= JumpFlag_IsSubJump; flags |= JumpFlag_IsSubJump;
} }
list->jumps[list->jump_count] = make_sticky_jump_source(jumps.jumps[j].list_line, flags);
list->jumps[list->jump_count] = make_sticky_jump_source(this_jump_line, flags);
++list->jump_count; ++list->jump_count;
} }
} }
else{
end_temp_memory(temp_name);
}
}
}
if (location_count > 0){
ID_Based_Jump_Location *prev_parsed_loc = &location_list[location_count-1];
Buffer_Summary location_buffer = get_buffer(app, prev_parsed_loc->buffer_id, AccessAll);
if (list->dst_count >= list->dst_max){
double_dst_max(general, list);
}
Marker_Handle new_handle = buffer_add_markers(app, &location_buffer, location_count,
sticky_jump_markers_cleanup, &list, sizeof(list));
list->dst[list->dst_count] = make_sticky_jump_destination_array(prev_jump_count, new_handle);
++list->dst_count;
prev_jump_count = list->jump_count;
Marker *markers = push_array(part, Marker, location_count);
for (uint32_t i = 0; i < location_count; ++i){
ID_Based_Jump_Location *location = &location_list[i];
Partial_Cursor cursor = {0};
Buffer_Seek seek = seek_line_char(location->line, location->column);
if (buffer_compute_cursor(app, &location_buffer, seek, &cursor)){
markers[i].pos = cursor.pos;
markers[i].lean_right = false;
}
}
buffer_set_markers(app, &location_buffer, new_handle, 0, location_count, markers);
location_count = 0;
reset_temp_memory(temp);
}
end_temp_memory(temp); end_temp_memory(temp);
} }
#endif
static void static void
free_marker_list(General_Memory *general, Marker_List list){ free_marker_list(General_Memory *general, Marker_List list){
@ -405,8 +455,12 @@ goto_jump_in_order(Application_Links *app, Marker_List *list, View_Summary *jump
} }
static bool32 static bool32
jump_is_repeat(ID_Based_Jump_Location prev, ID_Pos_Jump_Location location){ jump_is_repeat(ID_Line_Column_Jump_Location prev, ID_Pos_Jump_Location location){
bool32 skip = false; bool32 skip = false;
// NOTE(allen): This looks wrong, but it is correct. The prev_location is a line column type
// because that is how the old-style direct jumps worked, and they are still supported. All code paths
// in the sticky jump system treat line as the field for pos and ignore column. When the time has
// passed and the direct jump legacy system is gone then this can be corrected.
if (prev.buffer_id == location.buffer_id && prev.line == location.pos){ if (prev.buffer_id == location.buffer_id && prev.line == location.pos){
skip = true; skip = true;
} }

View File

@ -7,6 +7,32 @@
#if !defined(FCODER_JUMP_STICKY_H) #if !defined(FCODER_JUMP_STICKY_H)
#define FCODER_JUMP_STICKY_H #define FCODER_JUMP_STICKY_H
struct Sticky_Jump_Line_Details{
int32_t list_line;
int32_t list_colon_index;
bool32 is_sub_error;
};
struct Sticky_Jump{
int32_t list_line;
int32_t list_colon_index;
bool32 is_sub_error;
Buffer_ID jump_buffer_id;
int32_t jump_pos;
};
struct Sticky_Jump_Array{
struct Sticky_Jump *jumps;
int32_t count;
};
struct Sticky_Jump_Node_Header{
Memory_Handle memory;
Marker_Handle markers;
int32_t first_index;
int32_t count;
};
enum Jump_Location_Flag{ enum Jump_Location_Flag{
JumpFlag_IsSubJump = 0x1, JumpFlag_IsSubJump = 0x1,
}; };

View File

@ -43,7 +43,7 @@ try_skip_rust_arrow(String line){
} }
static bool32 static bool32
parse_jump_location(String line, Name_Based_Jump_Location *location, int32_t *colon_char, bool32 *is_sub_error){ parse_jump_location(String line, Name_Line_Column_Location *location, int32_t *colon_char, bool32 *is_sub_error){
bool32 result = false; bool32 result = false;
*is_sub_error = (line.str[0] == ' '); *is_sub_error = (line.str[0] == ' ');
@ -161,7 +161,7 @@ parse_jump_location(String line, Name_Based_Jump_Location *location, int32_t *co
} }
static bool32 static bool32
parse_jump_location(String line, bool32 skip_sub_error, Name_Based_Jump_Location *location, int32_t *colon_char){ parse_jump_location(String line, bool32 skip_sub_error, Name_Line_Column_Location *location, int32_t *colon_char){
bool32 is_sub_error = false; bool32 is_sub_error = false;
bool32 result = parse_jump_location(line, location, colon_char, &is_sub_error); bool32 result = parse_jump_location(line, location, colon_char, &is_sub_error);
if (is_sub_error && skip_sub_error){ if (is_sub_error && skip_sub_error){
@ -173,7 +173,7 @@ parse_jump_location(String line, bool32 skip_sub_error, Name_Based_Jump_Location
static int32_t static int32_t
parse_jump_from_buffer_line(Application_Links *app, Partition *arena, parse_jump_from_buffer_line(Application_Links *app, Partition *arena,
int32_t buffer_id, int32_t line, int32_t buffer_id, int32_t line,
bool32 skip_sub_errors, Name_Based_Jump_Location *location){ bool32 skip_sub_errors, Name_Line_Column_Location *location){
int32_t result = false; int32_t result = false;
String line_str = {0}; String line_str = {0};
Buffer_Summary buffer = get_buffer(app, buffer_id, AccessAll); Buffer_Summary buffer = get_buffer(app, buffer_id, AccessAll);
@ -189,7 +189,7 @@ parse_jump_from_buffer_line(Application_Links *app, Partition *arena,
//////////////////////////////// ////////////////////////////////
static bool32 static bool32
get_jump_buffer(Application_Links *app, Buffer_Summary *buffer, Name_Based_Jump_Location *location){ get_jump_buffer(Application_Links *app, Buffer_Summary *buffer, Name_Line_Column_Location *location){
bool32 result = open_file(app, buffer, location->file.str, location->file.size, false, true); bool32 result = open_file(app, buffer, location->file.str, location->file.size, false, true);
return(result); return(result);
} }
@ -223,7 +223,7 @@ set_view_to_location(Application_Links *app, View_Summary *view, Buffer_Summary
} }
static void static void
jump_to_location(Application_Links *app, View_Summary *view, Buffer_Summary *buffer, Name_Based_Jump_Location location){ jump_to_location(Application_Links *app, View_Summary *view, Buffer_Summary *buffer, Name_Line_Column_Location location){
set_active_view(app, view); set_active_view(app, view);
set_view_to_location(app, view, buffer, seek_line_char(location.line, location.column)); set_view_to_location(app, view, buffer, seek_line_char(location.line, location.column));
if (auto_center_after_jumps){ if (auto_center_after_jumps){
@ -246,7 +246,7 @@ static bool32
seek_next_jump_in_buffer(Application_Links *app, Partition *part, seek_next_jump_in_buffer(Application_Links *app, Partition *part,
int32_t buffer_id, int32_t first_line, bool32 skip_sub_errors, int32_t buffer_id, int32_t first_line, bool32 skip_sub_errors,
int32_t direction, int32_t direction,
int32_t *line_out, int32_t *colon_index_out, Name_Based_Jump_Location *location_out){ int32_t *line_out, int32_t *colon_index_out, Name_Line_Column_Location *location_out){
Assert(direction == 1 || direction == -1); Assert(direction == 1 || direction == -1);
@ -276,9 +276,9 @@ seek_next_jump_in_buffer(Application_Links *app, Partition *part,
return(result); return(result);
} }
static ID_Based_Jump_Location static ID_Line_Column_Jump_Location
convert_name_based_to_id_based(Application_Links *app, Name_Based_Jump_Location loc){ convert_name_based_to_id_based(Application_Links *app, Name_Line_Column_Location loc){
ID_Based_Jump_Location result = {0}; ID_Line_Column_Jump_Location result = {0};
Buffer_Summary buffer = get_buffer_by_name(app, loc.file.str, loc.file.size, AccessAll); Buffer_Summary buffer = get_buffer_by_name(app, loc.file.str, loc.file.size, AccessAll);
if (buffer.exists){ if (buffer.exists){
@ -291,10 +291,10 @@ convert_name_based_to_id_based(Application_Links *app, Name_Based_Jump_Location
} }
static int32_t static int32_t
seek_next_jump_in_view(Application_Links *app, Partition *part, View_Summary *view, int32_t skip_sub_errors, int32_t direction, int32_t *line_out, int32_t *colon_index_out, Name_Based_Jump_Location *location_out){ seek_next_jump_in_view(Application_Links *app, Partition *part, View_Summary *view, int32_t skip_sub_errors, int32_t direction, int32_t *line_out, int32_t *colon_index_out, Name_Line_Column_Location *location_out){
int32_t result = false; int32_t result = false;
Name_Based_Jump_Location location = {0}; Name_Line_Column_Location location = {0};
int32_t line = view->cursor.line; int32_t line = view->cursor.line;
int32_t colon_index = 0; int32_t colon_index = 0;
if (seek_next_jump_in_buffer(app, part, view->buffer_id, line+direction, skip_sub_errors, direction, &line, &colon_index, &location)){ if (seek_next_jump_in_buffer(app, part, view->buffer_id, line+direction, skip_sub_errors, direction, &line, &colon_index, &location)){
@ -308,7 +308,7 @@ seek_next_jump_in_view(Application_Links *app, Partition *part, View_Summary *vi
} }
static bool32 static bool32
skip_this_jump(ID_Based_Jump_Location prev, ID_Based_Jump_Location jump){ skip_this_jump(ID_Line_Column_Jump_Location prev, ID_Line_Column_Jump_Location jump){
bool32 result = false; bool32 result = false;
if (prev.buffer_id != 0 && prev.buffer_id == jump.buffer_id && prev.line == jump.line && prev.column <= jump.column){ if (prev.buffer_id != 0 && prev.buffer_id == jump.buffer_id && prev.line == jump.line && prev.column <= jump.column){
result = true; result = true;
@ -317,12 +317,13 @@ skip_this_jump(ID_Based_Jump_Location prev, ID_Based_Jump_Location jump){
} }
static bool32 static bool32
advance_cursor_in_jump_view(Application_Links *app, Partition *part, View_Summary *view, int32_t skip_repeats, int32_t skip_sub_error, int32_t direction, Name_Based_Jump_Location *location_out){ advance_cursor_in_jump_view(Application_Links *app, Partition *part, View_Summary *view, int32_t skip_repeats, int32_t skip_sub_error, int32_t direction, Name_Line_Column_Location *location_out){
bool32 result = true; bool32 result = true;
Name_Based_Jump_Location location = {0}; Name_Line_Column_Location location = {0};
ID_Based_Jump_Location jump = {0}; ID_Line_Column_Jump_Location jump = {0};
int32_t line = 0, colon_index = 0; int32_t line = 0;
int32_t colon_index = 0;
do{ do{
Temp_Memory temp = begin_temp_memory(part); Temp_Memory temp = begin_temp_memory(part);
@ -340,7 +341,7 @@ advance_cursor_in_jump_view(Application_Links *app, Partition *part, View_Summar
if (result){ if (result){
*location_out = location; *location_out = location;
view_set_cursor(app, view, seek_line_char(line, colon_index+1), true); view_set_cursor(app, view, seek_line_char(line, colon_index + 1), true);
} }
prev_location = jump; prev_location = jump;
@ -354,7 +355,7 @@ seek_jump(Application_Links *app, Partition *part, bool32 skip_repeats, bool32 s
View_Summary view = get_view_for_locked_jump_buffer(app); View_Summary view = get_view_for_locked_jump_buffer(app);
if (view.exists){ if (view.exists){
Name_Based_Jump_Location location = {0}; Name_Line_Column_Location location = {0};
if (advance_cursor_in_jump_view(app, &global_part, &view, skip_repeats, skip_sub_errors, direction, &location)){ if (advance_cursor_in_jump_view(app, &global_part, &view, skip_repeats, skip_sub_errors, direction, &location)){
Buffer_Summary buffer = {0}; Buffer_Summary buffer = {0};

View File

@ -1,24 +0,0 @@
/*
4coder_jumping.h - Types used in jumping.
*/
// TOP
#if !defined(FCODER_JUMPING_H)
#define FCODER_JUMPING_H
struct ID_Pos_Jump_Location{
Buffer_ID buffer_id;
int32_t pos;
};
struct Name_Based_Jump_Location{
String file;
int32_t line;
int32_t column;
};
#endif
// BOTTOM

View File

@ -378,6 +378,45 @@ begin_integrated_lister__with_fixed_options(Application_Links *app, char *query_
view); view);
} }
static void
begin_integrated_lister__ui_list(Application_Links *app, char *query_string,
Lister_Handlers handlers, void *user_data,
Lister_UI_Option *options, int32_t option_count,
View_Summary *view){
Partition *scratch = &global_part;
General_Memory *general = &global_general;
view_start_ui_mode(app, view);
view_set_setting(app, view, ViewSetting_UICommandMap, default_lister_ui_map);
Lister_State *state = view_get_lister_state(view);
init_lister_state(state, general);
lister_first_init(&state->lister);
state->lister.theme_list = true;
for (int32_t i = 0; i < option_count; i += 1){
lister_add_ui_item(&state->arena, &state->lister,
make_string_slowly(options[i].string),
options[i].index,
options[i].user_data, 0);
}
lister_set_query_string(&state->lister, query_string);
state->lister.handlers = handlers;
state->lister.handlers.refresh = 0;
state->lister.user_data = user_data;
lister_update_ui(app, scratch, view, state);
}
static void
begin_integrated_lister__ui_list(Application_Links *app, char *query_string,
Lister_Activation_Function_Type *activate, void *user_data,
Lister_UI_Option *options, int32_t option_count,
View_Summary *view){
Lister_Handlers handlers = lister_get_default_handlers();
handlers.activate = activate;
begin_integrated_lister__ui_list(app, query_string,
handlers, user_data,
options, option_count,
view);
}
//////////////////////////////// ////////////////////////////////
static void static void
@ -394,7 +433,7 @@ generate_all_buffers_list(Application_Links *app, Partition *arena, Lister *list
case DirtyState_UnsavedChanges: status = make_lit_string(" *"); break; case DirtyState_UnsavedChanges: status = make_lit_string(" *"); break;
case DirtyState_UnloadedChanges: status = make_lit_string(" !"); break; case DirtyState_UnloadedChanges: status = make_lit_string(" !"); break;
} }
lister_add_item(arena, lister, buffer_name, status, (void*)buffer_id, 0); lister_add_item(arena, lister, buffer_name, status, IntAsPtr(buffer_id), 0);
} }
} }
@ -491,9 +530,9 @@ enum{
static Lister_Activation_Code static Lister_Activation_Code
activate_confirm_kill(Application_Links *app, View_Summary *view, String text_field, activate_confirm_kill(Application_Links *app, View_Summary *view, String text_field,
void *user_data, bool32 clicked){ void *user_data, bool32 clicked){
int32_t behavior = (int32_t)user_data; int32_t behavior = (int32_t)PtrAsInt(user_data);
Lister_State *state = view_get_lister_state(view); Lister_State *state = view_get_lister_state(view);
Buffer_ID buffer_id = (Buffer_ID)(state->lister.user_data); Buffer_ID buffer_id = (Buffer_ID)(PtrAsInt(state->lister.user_data));
switch (behavior){ switch (behavior){
case SureToKill_No: case SureToKill_No:
{}break; {}break;
@ -525,13 +564,13 @@ activate_confirm_kill(Application_Links *app, View_Summary *view, String text_fi
static void static void
do_gui_sure_to_kill(Application_Links *app, Buffer_Summary *buffer, View_Summary *view){ do_gui_sure_to_kill(Application_Links *app, Buffer_Summary *buffer, View_Summary *view){
Lister_Fixed_Option options[] = { Lister_Fixed_Option options[] = {
{"(N)o" , "", "Nn", (void*)SureToKill_No }, {"(N)o" , "", "Nn", IntAsPtr(SureToKill_No) },
{"(Y)es" , "", "Yy", (void*)SureToKill_Yes }, {"(Y)es" , "", "Yy", IntAsPtr(SureToKill_Yes) },
{"(S)ave and Kill", "", "Ss", (void*)SureToKill_Save}, {"(S)ave and Kill", "", "Ss", IntAsPtr(SureToKill_Save)},
}; };
int32_t option_count = sizeof(options)/sizeof(options[0]); int32_t option_count = sizeof(options)/sizeof(options[0]);
begin_integrated_lister__with_fixed_options(app, "There are unsaved changes, close anyway?", begin_integrated_lister__with_fixed_options(app, "There are unsaved changes, close anyway?",
activate_confirm_kill, (void*)buffer->buffer_id, activate_confirm_kill, IntAsPtr(buffer->buffer_id),
options, option_count, options, option_count,
view); view);
} }
@ -539,7 +578,7 @@ do_gui_sure_to_kill(Application_Links *app, Buffer_Summary *buffer, View_Summary
static Lister_Activation_Code static Lister_Activation_Code
activate_confirm_close_4coder(Application_Links *app, View_Summary *view, String text_field, activate_confirm_close_4coder(Application_Links *app, View_Summary *view, String text_field,
void *user_data, bool32 clicked){ void *user_data, bool32 clicked){
int32_t behavior = (int32_t)user_data; int32_t behavior = (int32_t)PtrAsInt(user_data);
switch (behavior){ switch (behavior){
case SureToKill_No: case SureToKill_No:
{}break; {}break;
@ -581,7 +620,7 @@ static Lister_Activation_Code
activate_switch_buffer(Application_Links *app, View_Summary *view, String text_field, activate_switch_buffer(Application_Links *app, View_Summary *view, String text_field,
void *user_data, bool32 activated_by_mouse){ void *user_data, bool32 activated_by_mouse){
if (user_data != 0){ if (user_data != 0){
Buffer_ID buffer_id = (Buffer_ID)(user_data); Buffer_ID buffer_id = (Buffer_ID)(PtrAsInt(user_data));
view_set_buffer(app, view, buffer_id, SetBuffer_KeepOriginalGUI); view_set_buffer(app, view, buffer_id, SetBuffer_KeepOriginalGUI);
} }
return(ListerActivation_Finished); return(ListerActivation_Finished);
@ -599,7 +638,7 @@ static Lister_Activation_Code
activate_kill_buffer(Application_Links *app, View_Summary *view, String text_field, activate_kill_buffer(Application_Links *app, View_Summary *view, String text_field,
void *user_data, bool32 activated_by_mouse){ void *user_data, bool32 activated_by_mouse){
if (user_data != 0){ if (user_data != 0){
Buffer_ID buffer_id = (Buffer_ID)(user_data); Buffer_ID buffer_id = (Buffer_ID)(PtrAsInt(user_data));
kill_buffer(app, buffer_identifier(buffer_id), view->view_id, 0); kill_buffer(app, buffer_identifier(buffer_id), view->view_id, 0);
} }
return(ListerActivation_Finished); return(ListerActivation_Finished);
@ -742,5 +781,38 @@ CUSTOM_DOC("Interactively opens a file.")
begin_integrated_lister__file_system_list(app, "Open: ", activate_open, 0, &view); begin_integrated_lister__file_system_list(app, "Open: ", activate_open, 0, &view);
} }
static Lister_Activation_Code
activate_select_theme(Application_Links *app, View_Summary *view, String text_field,
void *user_data, bool32 clicked){
Lister_Activation_Code result = ListerActivation_Finished;
change_theme_by_index(app, (int32_t)PtrAsInt(user_data));
return(result);
}
CUSTOM_COMMAND_SIG(open_color_tweaker)
CUSTOM_DOC("Opens the 4coder theme selector list.")
{
Partition *scratch = &global_part;
Temp_Memory temp = begin_temp_memory(scratch);
View_Summary view = get_active_view(app, AccessAll);
for (;view_end_ui_mode(app, &view););
int32_t theme_count = get_theme_count(app);
Lister_UI_Option *options = push_array(scratch, Lister_UI_Option, theme_count);
for (int32_t i = 0; i < theme_count; i += 1){
String name = get_theme_name(app, scratch, i);
options[i].string = name.str;
options[i].index = i;
options[i].user_data = IntAsPtr(i);
}
begin_integrated_lister__ui_list(app,
"Select a theme: ",
activate_select_theme, 0,
options, theme_count,
&view);
end_temp_memory(temp);
}
// BOTTOM // BOTTOM

View File

@ -62,6 +62,9 @@ CUSTOM_DOC("Execute a 'long form' command.")
else if (match(bar.string, make_lit_string("mkdir"))){ else if (match(bar.string, make_lit_string("mkdir"))){
make_directory_query(app); make_directory_query(app);
} }
else if (match(bar.string, make_lit_string("reload themes"))){
reload_themes(app);
}
else{ else{
print_message(app, literal("unrecognized command\n")); print_message(app, literal("unrecognized command\n"));
} }

View File

@ -828,12 +828,14 @@ CUSTOM_DOC("Iteratively tries completing the word to the left of the cursor with
if (buffer.exists){ if (buffer.exists){
int32_t do_init = false; int32_t do_init = false;
Dynamic_Scope scope = view_get_dynamic_scope(app, view.view_id);
uint64_t rewrite = 0; uint64_t rewrite = 0;
view_get_variable(app, &view, view_rewrite_loc, &rewrite); managed_variable_get(app, scope, view_rewrite_loc, &rewrite);
if (rewrite != RewriteWordComplete){ if (rewrite != RewriteWordComplete){
do_init = true; do_init = true;
} }
view_set_variable(app, &view, view_next_rewrite_loc, RewriteWordComplete); managed_variable_set(app, scope, view_next_rewrite_loc, RewriteWordComplete);
if (!complete_state.initialized){ if (!complete_state.initialized){
do_init = true; do_init = true;
} }

View File

@ -231,10 +231,18 @@ lister_get_clicked_item(Application_Links *app, View_Summary *view, Partition *s
static void static void
lister_update_ui(Application_Links *app, Partition *scratch, View_Summary *view, lister_update_ui(Application_Links *app, Partition *scratch, View_Summary *view,
Lister_State *state){ Lister_State *state){
bool32 is_theme_list = state->lister.theme_list;
int32_t x0 = 0; int32_t x0 = 0;
int32_t x1 = view->view_region.x1 - view->view_region.x0; int32_t x1 = view->view_region.x1 - view->view_region.x0;
int32_t line_height = (int32_t)view->line_height; int32_t line_height = (int32_t)view->line_height;
int32_t block_height = line_height*2; int32_t block_height = 0;
if (is_theme_list){
block_height = line_height*3 + 6;
}
else{
block_height = line_height*2;
}
Temp_Memory full_temp = begin_temp_memory(scratch); Temp_Memory full_temp = begin_temp_memory(scratch);
@ -266,11 +274,18 @@ lister_update_ui(Application_Links *app, Partition *scratch, View_Summary *view,
y_pos = item_rect.y1; y_pos = item_rect.y1;
UI_Item item = {0}; UI_Item item = {0};
if (!is_theme_list){
item.type = UIType_Option; item.type = UIType_Option;
item.activation_level = UIActivation_None;
item.coordinates = UICoordinates_Scrolled;
item.option.string = node->string; item.option.string = node->string;
item.option.status = node->status; item.option.status = node->status;
}
else{
item.type = UIType_ColorTheme;
item.color_theme.string = node->string;
item.color_theme.index = node->index;
}
item.activation_level = UIActivation_None;
item.coordinates = UICoordinates_Scrolled;
item.user_data = node->user_data; item.user_data = node->user_data;
item.rectangle = item_rect; item.rectangle = item_rect;
@ -405,6 +420,31 @@ lister_add_item(Partition *arena, Lister *lister,
user_data, extra_space)); user_data, extra_space));
} }
static void*
lister_add_ui_item(Partition *arena, Lister *lister,
Lister_Prealloced_String string, int32_t index,
void *user_data, int32_t extra_space){
Lister_Option_Node *node = push_array(arena, Lister_Option_Node, 1);
node->string = string.string;
node->index = index;
node->user_data = user_data;
zdll_push_back(lister->options.first, lister->options.last, node);
lister->options.count += 1;
void *result = push_array(arena, char, extra_space);
push_align(arena, 8);
return(result);
}
static void*
lister_add_ui_item(Partition *arena, Lister *lister,
String string, int32_t index,
void *user_data, int32_t extra_space){
return(lister_add_ui_item(arena, lister,
lister_prealloced(push_string_copy(arena, string)),
index,
user_data, extra_space));
}
static void* static void*
lister_get_user_data(Lister *lister, int32_t index){ lister_get_user_data(Lister *lister, int32_t index){
if (0 <= index && index < lister->options.count){ if (0 <= index && index < lister->options.count){

View File

@ -23,7 +23,10 @@ struct Lister_Option_Node{
Lister_Option_Node *next; Lister_Option_Node *next;
Lister_Option_Node *prev; Lister_Option_Node *prev;
String string; String string;
union{
String status; String status;
int32_t index;
};
void *user_data; void *user_data;
}; };
@ -55,6 +58,7 @@ struct Lister{
char key_string_space[256]; char key_string_space[256];
String key_string; String key_string;
Lister_Option_List options; Lister_Option_List options;
bool32 theme_list;
}; };
struct Lister_Prealloced_String{ struct Lister_Prealloced_String{
@ -81,6 +85,12 @@ struct Lister_Fixed_Option{
void *user_data; void *user_data;
}; };
struct Lister_UI_Option{
char *string;
int32_t index;
void *user_data;
};
#endif #endif
// BOTTOM // BOTTOM

View File

@ -192,7 +192,7 @@ do_feedback_message(System_Functions *system, Models *models, String value){
internal View* internal View*
panel_make_empty(System_Functions *system, Models *models, Panel *panel){ panel_make_empty(System_Functions *system, Models *models, Panel *panel){
Assert(panel->view == 0); Assert(panel->view == 0);
View_And_ID new_view = live_set_alloc_view(&models->mem.general, &models->live_set, panel); View_And_ID new_view = live_set_alloc_view(&models->mem.general, &models->lifetime_allocator, &models->live_set, panel);
view_set_file(system, models, new_view.view, models->scratch_buffer); view_set_file(system, models, new_view.view, models->scratch_buffer);
return(new_view.view); return(new_view.view);
} }
@ -1072,16 +1072,15 @@ App_Init_Sig(app_init){
{ {
setup_command_table(); setup_command_table();
Assert(models->config_api.get_bindings != 0); Assert(models->config_api.get_bindings != 0);
i32 wanted_size = models->config_api.get_bindings(models->app_links.memory, models->app_links.memory_size); i32 wanted_size = models->config_api.get_bindings(models->app_links.memory, models->app_links.memory_size);
Assert(wanted_size <= models->app_links.memory_size); Assert(wanted_size <= models->app_links.memory_size);
interpret_binding_buffer(models, models->app_links.memory, wanted_size); interpret_binding_buffer(models, models->app_links.memory, wanted_size);
memset(models->app_links.memory, 0, wanted_size); memset(models->app_links.memory, 0, wanted_size);
} }
dynamic_variables_init(&models->view_variable_layout); dynamic_variables_init(&models->variable_layout);
dynamic_variables_block_init(&models->mem.general, &models->dynamic_vars);
// NOTE(allen): file setup // NOTE(allen): file setup
working_set_init(&models->working_set, partition, &vars->models.mem.general); working_set_init(&models->working_set, partition, &vars->models.mem.general);
@ -1134,7 +1133,7 @@ App_Init_Sig(app_init){
General_Memory *general = &models->mem.general; General_Memory *general = &models->mem.general;
for (i32 i = 0; i < ArrayCount(init_files); ++i){ for (i32 i = 0; i < ArrayCount(init_files); ++i){
Editing_File *file = working_set_alloc_always(&models->working_set, general); Editing_File *file = working_set_alloc_always(&models->working_set, general, &models->lifetime_allocator);
buffer_bind_name(models, general, partition, &models->working_set, file, init_files[i].name); buffer_bind_name(models, general, partition, &models->working_set, file, init_files[i].name);
if (init_files[i].read_only){ if (init_files[i].read_only){

View File

@ -95,7 +95,6 @@ fill_view_summary(System_Functions *system, View_Summary *view, View *vptr, Live
} }
} }
inline void inline void
fill_view_summary(System_Functions *system, View_Summary *view, View *vptr, Command_Data *cmd){ fill_view_summary(System_Functions *system, View_Summary *view, View *vptr, Command_Data *cmd){
fill_view_summary(system, view, vptr, &cmd->models->live_set, &cmd->models->working_set); fill_view_summary(system, view, vptr, &cmd->models->live_set, &cmd->models->working_set);
@ -104,7 +103,6 @@ fill_view_summary(System_Functions *system, View_Summary *view, View *vptr, Comm
internal Editing_File* internal Editing_File*
get_file_from_identifier(System_Functions *system, Working_Set *working_set, Buffer_Identifier buffer){ get_file_from_identifier(System_Functions *system, Working_Set *working_set, Buffer_Identifier buffer){
Editing_File *file = 0; Editing_File *file = 0;
if (buffer.id){ if (buffer.id){
file = working_set_get_active_file(working_set, buffer.id); file = working_set_get_active_file(working_set, buffer.id);
} }
@ -112,22 +110,25 @@ get_file_from_identifier(System_Functions *system, Working_Set *working_set, Buf
String name = make_string(buffer.name, buffer.name_len); String name = make_string(buffer.name, buffer.name_len);
file = working_set_contains_name(working_set, name); file = working_set_contains_name(working_set, name);
} }
return(file);
}
internal Editing_File*
imp_get_file(Command_Data *cmd, Buffer_ID buffer_id){
Working_Set *working_set = &cmd->models->working_set;
Editing_File *file = working_set_get_active_file(working_set, buffer_id);
if (file != 0 && !file_is_ready(file)){
file = 0;
}
return(file); return(file);
} }
internal Editing_File* internal Editing_File*
imp_get_file(Command_Data *cmd, Buffer_Summary *buffer){ imp_get_file(Command_Data *cmd, Buffer_Summary *buffer){
Editing_File *file = 0; Editing_File *file = 0;
Working_Set *working_set = &cmd->models->working_set;;
if (buffer && buffer->exists){ if (buffer && buffer->exists){
file = working_set_get_active_file(working_set, buffer->buffer_id); file = imp_get_file(cmd, buffer->buffer_id);
if (file != 0 && !file_is_ready(file)){
file = 0;
} }
}
return(file); return(file);
} }
@ -135,7 +136,6 @@ internal View*
imp_get_view(Command_Data *cmd, View_ID view_id){ imp_get_view(Command_Data *cmd, View_ID view_id){
Live_Views *live_set = cmd->live_set; Live_Views *live_set = cmd->live_set;
View *vptr = 0; View *vptr = 0;
view_id = view_id - 1; view_id = view_id - 1;
if (view_id >= 0 && view_id < live_set->max){ if (view_id >= 0 && view_id < live_set->max){
vptr = live_set->views + view_id; vptr = live_set->views + view_id;
@ -143,18 +143,15 @@ imp_get_view(Command_Data *cmd, View_ID view_id){
vptr = 0; vptr = 0;
} }
} }
return(vptr); return(vptr);
} }
internal View* internal View*
imp_get_view(Command_Data *cmd, View_Summary *view){ imp_get_view(Command_Data *cmd, View_Summary *view){
View *vptr = 0; View *vptr = 0;
if (view != 0 && view->exists){
if (view && view->exists){
vptr = imp_get_view(cmd, view->view_id); vptr = imp_get_view(cmd, view->view_id);
} }
return(vptr); return(vptr);
} }
@ -290,7 +287,7 @@ DOC_SEE(Command_Line_Interface_Flag)
// NOTE(allen): If the buffer is specified by name but does not already exist, then create it. // NOTE(allen): If the buffer is specified by name but does not already exist, then create it.
if (file == 0 && buffer_id.name != 0){ if (file == 0 && buffer_id.name != 0){
file = working_set_alloc_always(working_set, general); file = working_set_alloc_always(working_set, general, &models->lifetime_allocator);
Assert(file != 0); Assert(file != 0);
String name = push_string(part, buffer_id.name, buffer_id.name_len); String name = push_string(part, buffer_id.name, buffer_id.name_len);
@ -928,10 +925,10 @@ DOC_RETURN(returns non-zero on success)
*/{ */{
Command_Data *cmd = (Command_Data*)app->cmd_context; Command_Data *cmd = (Command_Data*)app->cmd_context;
Editing_File *file = imp_get_file(cmd, buffer); Editing_File *file = imp_get_file(cmd, buffer);
bool32 result = 0; bool32 result = false;
if (file){ if (file != 0){
result = 1; result = true;
switch (setting){ switch (setting){
case BufferSetting_Lex: case BufferSetting_Lex:
{ {
@ -1198,6 +1195,19 @@ DOC_SEE(Buffer_Setting_ID)
return(result); return(result);
} }
API_EXPORT Dynamic_Scope
Buffer_Get_Dynamic_Scope(Application_Links *app, Buffer_ID buffer_id)
{
Command_Data *cmd = (Command_Data*)app->cmd_context;
Editing_File *file = imp_get_file(cmd, buffer_id);
Dynamic_Scope lifetime = {0};
if (file != 0){
lifetime.type = DynamicScopeType_Buffer;
lifetime.buffer_id = buffer_id;
}
return(lifetime);
}
API_EXPORT int32_t API_EXPORT int32_t
Buffer_Token_Count(Application_Links *app, Buffer_Summary *buffer) Buffer_Token_Count(Application_Links *app, Buffer_Summary *buffer)
/* /*
@ -1207,13 +1217,12 @@ If the buffer does not exist or if it is not a lexed buffer, the return is zero.
*/{ */{
Command_Data *cmd = (Command_Data*)app->cmd_context; Command_Data *cmd = (Command_Data*)app->cmd_context;
Editing_File *file = imp_get_file(cmd, buffer); Editing_File *file = imp_get_file(cmd, buffer);
int32_t count = 0; int32_t count = 0;
if (file != 0 &&
if (file && file->state.token_array.tokens && file->state.tokens_complete){ file->state.token_array.tokens &&
file->state.tokens_complete){
count = file->state.token_array.count; count = file->state.token_array.count;
} }
return(count); return(count);
} }
@ -1357,7 +1366,7 @@ DOC_SEE(Buffer_Create_Flag)
if (do_empty_buffer){ if (do_empty_buffer){
if ((flags & BufferCreate_NeverNew) == 0){ if ((flags & BufferCreate_NeverNew) == 0){
file = working_set_alloc_always(working_set, general); file = working_set_alloc_always(working_set, general, &models->lifetime_allocator);
if (file != 0){ if (file != 0){
if (has_canon_name){ if (has_canon_name){
buffer_bind_file(system, general, working_set, file, canon.name); buffer_bind_file(system, general, working_set, file, canon.name);
@ -1383,7 +1392,7 @@ DOC_SEE(Buffer_Create_Flag)
if (system->load_file(handle, buffer, size)){ if (system->load_file(handle, buffer, size)){
system->load_close(handle); system->load_close(handle);
file = working_set_alloc_always(working_set, general); file = working_set_alloc_always(working_set, general, &models->lifetime_allocator);
if (file != 0){ if (file != 0){
buffer_bind_file(system, general, working_set, file, canon.name); buffer_bind_file(system, general, working_set, file, canon.name);
buffer_bind_name(models, general, part, working_set, file, front_of_directory(fname)); buffer_bind_name(models, general, part, working_set, file, front_of_directory(fname));
@ -1495,7 +1504,7 @@ DOC_SEE(Buffer_Identifier)
buffer_unbind_file(system, working_set, file); buffer_unbind_file(system, working_set, file);
} }
file_free(system, &models->app_links, &models->mem.general, file); file_free(system, &models->app_links, &models->mem.general, file);
working_set_free_file(&models->mem.general, working_set, file); working_set_free_file(&models->mem.general, &models->lifetime_allocator, working_set, file);
File_Node *used = &working_set->used_sentinel; File_Node *used = &working_set->used_sentinel;
File_Node *node = used->next; File_Node *node = used->next;
@ -1740,7 +1749,7 @@ in the system, the call will fail.)
if (vptr != 0 && models->layout.panel_count > 1){ if (vptr != 0 && models->layout.panel_count > 1){
Panel *panel = vptr->transient.panel; Panel *panel = vptr->transient.panel;
live_set_free_view(&models->mem.general, &models->live_set, vptr); live_set_free_view(&models->mem.general, &models->lifetime_allocator, &models->live_set, vptr);
panel->view = 0; panel->view = 0;
Divider_And_ID div = layout_get_divider(&models->layout, panel->parent); Divider_And_ID div = layout_get_divider(&models->layout, panel->parent);
@ -1809,7 +1818,6 @@ in the system, the call will fail.)
layout_fix_all_panels(&models->layout); layout_fix_all_panels(&models->layout);
} }
return(result); return(result);
} }
@ -1818,11 +1826,9 @@ Set_Active_View(Application_Links *app, View_Summary *view)
/* /*
DOC_PARAM(view, The view parameter specifies which view to make active.) DOC_PARAM(view, The view parameter specifies which view to make active.)
DOC_RETURN(This call returns non-zero on success.) DOC_RETURN(This call returns non-zero on success.)
DOC(If the given view is open, it is set as the DOC(If the given view is open, it is set as the
active view, and takes subsequent commands and is returned active view, and takes subsequent commands and is returned
from get_active_view.) from get_active_view.)
DOC_SEE(get_active_view) DOC_SEE(get_active_view)
*/{ */{
Command_Data *cmd = (Command_Data*)app->cmd_context; Command_Data *cmd = (Command_Data*)app->cmd_context;
@ -1933,6 +1939,19 @@ DOC_SEE(View_Setting_ID)
return(result); return(result);
} }
API_EXPORT Dynamic_Scope
View_Get_Dynamic_Scope(Application_Links *app, View_ID view_id)
{
Command_Data *cmd = (Command_Data*)app->cmd_context;
View *view = imp_get_view(cmd, view_id);
Dynamic_Scope lifetime = {0};
if (view != 0){
lifetime.type = DynamicScopeType_View;
lifetime.view_id = view_id;
}
return(lifetime);
}
API_EXPORT bool32 API_EXPORT bool32
View_Set_Split_Proportion(Application_Links *app, View_Summary *view, float t) View_Set_Split_Proportion(Application_Links *app, View_Summary *view, float t)
/* /*
@ -2186,54 +2205,8 @@ DOC_SEE(int_color)
} }
API_EXPORT int32_t API_EXPORT int32_t
Create_View_Variable(Application_Links *app, char *null_terminated_name, uint64_t default_value){ View_Start_UI_Mode(Application_Links *app, View_Summary *view)
Command_Data *cmd = (Command_Data*)app->cmd_context; {
Models *models = cmd->models;
String name = make_string_slowly(null_terminated_name);
return(dynamic_variables_lookup_or_create(&models->mem.general,
&models->view_variable_layout, name, default_value));
}
API_EXPORT bool32
View_Set_Variable(Application_Links *app, View_Summary *view, int32_t location, uint64_t value){
Command_Data *cmd = (Command_Data*)app->cmd_context;
View *vptr = imp_get_view(cmd, view);
bool32 result = false;
if (vptr != 0){
Models *models = cmd->models;
u64 *ptr = 0;
if (dynamic_variables_get_ptr(&models->mem.general,
&models->view_variable_layout,
&vptr->transient.dynamic_vars,
location, &ptr)){
result = true;
*ptr = value;
}
}
return(result);
}
API_EXPORT bool32
View_Get_Variable(Application_Links *app, View_Summary *view, int32_t location, uint64_t *value_out){
Command_Data *cmd = (Command_Data*)app->cmd_context;
View *vptr = imp_get_view(cmd, view);
bool32 result = false;
if (vptr != 0){
Models *models = cmd->models;
u64 *ptr = 0;
if (dynamic_variables_get_ptr(&models->mem.general,
&models->view_variable_layout,
&vptr->transient.dynamic_vars,
location, &ptr)){
result = true;
*value_out = *ptr;
}
}
return(result);
}
API_EXPORT int32_t
View_Start_UI_Mode(Application_Links *app, View_Summary *view){
Command_Data *cmd = (Command_Data*)app->cmd_context; Command_Data *cmd = (Command_Data*)app->cmd_context;
View *vptr = imp_get_view(cmd, view); View *vptr = imp_get_view(cmd, view);
if (vptr != 0){ if (vptr != 0){
@ -2247,7 +2220,8 @@ View_Start_UI_Mode(Application_Links *app, View_Summary *view){
} }
API_EXPORT int32_t API_EXPORT int32_t
View_End_UI_Mode(Application_Links *app, View_Summary *view){ View_End_UI_Mode(Application_Links *app, View_Summary *view)
{
Command_Data *cmd = (Command_Data*)app->cmd_context; Command_Data *cmd = (Command_Data*)app->cmd_context;
View *vptr = imp_get_view(cmd, view); View *vptr = imp_get_view(cmd, view);
if (vptr != 0){ if (vptr != 0){
@ -2266,11 +2240,12 @@ View_End_UI_Mode(Application_Links *app, View_Summary *view){
} }
API_EXPORT bool32 API_EXPORT bool32
View_Set_UI(Application_Links *app, View_Summary *view, UI_Control *control){ View_Set_UI(Application_Links *app, View_Summary *view, UI_Control *control)
{
Command_Data *cmd = (Command_Data*)app->cmd_context; Command_Data *cmd = (Command_Data*)app->cmd_context;
View *vptr = imp_get_view(cmd, view);
Models *models = cmd->models; Models *models = cmd->models;
General_Memory *general = &models->mem.general; General_Memory *general = &models->mem.general;
View *vptr = imp_get_view(cmd, view);
if (vptr != 0){ if (vptr != 0){
if (vptr->transient.ui_control.items != 0){ if (vptr->transient.ui_control.items != 0){
general_memory_free(general, vptr->transient.ui_control.items); general_memory_free(general, vptr->transient.ui_control.items);
@ -2293,6 +2268,11 @@ View_Set_UI(Application_Links *app, View_Summary *view, UI_Control *control){
string_size += item->text_field.query.size; string_size += item->text_field.query.size;
string_size += item->text_field.string.size; string_size += item->text_field.string.size;
}break; }break;
case UIType_ColorTheme:
{
string_size += item->color_theme.string.size;
}break;
} }
} }
@ -2307,20 +2287,30 @@ View_Set_UI(Application_Links *app, View_Summary *view, UI_Control *control){
for (UI_Item *item = new_items, *one_past_last = new_items + count; for (UI_Item *item = new_items, *one_past_last = new_items + count;
item < one_past_last; item < one_past_last;
item += 1){ item += 1){
String *fixup[2]; String *fixup[2];
i32 fixup_count = 0;
int32_t fixup_count = 0;
switch (item->type){ switch (item->type){
case UIType_Option: case UIType_Option:
{ {
fixup[0] = &item->option.string; fixup[0] = &item->option.string;
fixup[1] = &item->option.status; fixup[1] = &item->option.status;
fixup_count = 2;
}break; }break;
case UIType_TextField: case UIType_TextField:
{ {
fixup[0] = &item->text_field.query; fixup[0] = &item->text_field.query;
fixup[1] = &item->text_field.string; fixup[1] = &item->text_field.string;
fixup_count = 2;
}break;
case UIType_ColorTheme:
{
fixup[0] = &item->color_theme.string;
fixup_count = 1;
}break; }break;
} }
for (i32 i = 0; i < fixup_count; i += 1){ for (i32 i = 0; i < fixup_count; i += 1){
String old = *fixup[i]; String old = *fixup[i];
char *new_str = push_array(&string_alloc, char, old.size); char *new_str = push_array(&string_alloc, char, old.size);
@ -2345,7 +2335,8 @@ View_Set_UI(Application_Links *app, View_Summary *view, UI_Control *control){
} }
API_EXPORT UI_Control API_EXPORT UI_Control
View_Get_UI_Copy(Application_Links *app, View_Summary *view, struct Partition *part){ View_Get_UI_Copy(Application_Links *app, View_Summary *view, struct Partition *part)
{
Command_Data *cmd = (Command_Data*)app->cmd_context; Command_Data *cmd = (Command_Data*)app->cmd_context;
View *vptr = imp_get_view(cmd, view); View *vptr = imp_get_view(cmd, view);
UI_Control result = {0}; UI_Control result = {0};
@ -2365,6 +2356,188 @@ View_Get_UI_Copy(Application_Links *app, View_Summary *view, struct Partition *p
return(result); return(result);
} }
API_EXPORT Dynamic_Scope
Get_Global_Dynamic_Scope(Application_Links *app)
{
Dynamic_Scope scope = {0};
scope.type = DynamicScopeType_Global;
return(scope);
}
API_EXPORT Dynamic_Scope
Get_Intersected_Dynamic_Scope(Application_Links *app, Dynamic_Scope *intersected_scopes, int32_t count)
{
Command_Data *cmd = (Command_Data*)app->cmd_context;
Models *models = cmd->models;
Partition *scratch = &models->mem.part;
Dynamic_Scope result = {0};
Temp_Memory temp = begin_temp_memory(scratch);
b32 filled_array = true;
Lifetime_Object **object_ptr_array = push_array(scratch, Lifetime_Object*, 0);
for (i32 i = 0; i < count; i += 1){
Dynamic_Scope handle = intersected_scopes[i];
switch (handle.type){
case DynamicScopeType_Global:
{
// NOTE(allen): (global_scope INTERSECT X) == X for all X, therefore we emit nothing when a global scope is in the key list.
}break;
case DynamicScopeType_Intersected:
{
Lifetime_Key *key = (Lifetime_Key*)IntAsPtr(handle.intersected_opaque_handle);
i32 member_count = key->count;
Lifetime_Object **key_member_ptr = key->members;
for (i32 j = 0; j < member_count; j += 1, key_member_ptr += 1){
Lifetime_Object **new_object_ptr = push_array(scratch, Lifetime_Object*, 1);
*new_object_ptr = *key_member_ptr;
}
}break;
case DynamicScopeType_Buffer:
{
Editing_File *file = imp_get_file(cmd, handle.buffer_id);
if (file == 0){
filled_array = false;
goto quit_loop;
}
Lifetime_Object **new_object_ptr = push_array(scratch, Lifetime_Object*, 1);
*new_object_ptr = file->lifetime_object;
}break;
case DynamicScopeType_View:
{
View *vptr = imp_get_view(cmd, handle.view_id);
if (vptr == 0){
filled_array = false;
goto quit_loop;
}
Lifetime_Object **new_object_ptr = push_array(scratch, Lifetime_Object*, 1);
*new_object_ptr = vptr->transient.lifetime_object;
}break;
}
}
quit_loop:;
if (filled_array){
i32 member_count = (i32)(push_array(scratch, Lifetime_Object*, 0) - object_ptr_array);
member_count = lifetime_sort_and_dedup_object_set(object_ptr_array, member_count);
General_Memory *general = &models->mem.general;
Lifetime_Allocator *lifetime_allocator = &models->lifetime_allocator;
Lifetime_Key *key = lifetime_get_or_create_intersection_key(general, lifetime_allocator, object_ptr_array, member_count);
result.type = DynamicScopeType_Intersected;
result.intersected_opaque_handle = (u64)(PtrAsInt(key));
}
end_temp_memory(temp);
return(result);
}
API_EXPORT Managed_Variable_ID
Managed_Variable_Create(Application_Links *app, char *null_terminated_name, uint64_t default_value)
{
Command_Data *cmd = (Command_Data*)app->cmd_context;
Models *models = cmd->models;
String name = make_string_slowly(null_terminated_name);
General_Memory *general = &models->mem.general;
Dynamic_Variable_Layout *layout = &models->variable_layout;
return(dynamic_variables_create(general, layout, name, default_value));
}
API_EXPORT Managed_Variable_ID
Managed_Variable_Get_ID(Application_Links *app, char *null_terminated_name)
{
Command_Data *cmd = (Command_Data*)app->cmd_context;
Models *models = cmd->models;
String name = make_string_slowly(null_terminated_name);
Dynamic_Variable_Layout *layout = &models->variable_layout;
return(dynamic_variables_lookup(layout, name));
}
API_EXPORT int32_t
Managed_Variable_Create_Or_Get_ID(Application_Links *app, char *null_terminated_name, uint64_t default_value)
{
Command_Data *cmd = (Command_Data*)app->cmd_context;
Models *models = cmd->models;
String name = make_string_slowly(null_terminated_name);
General_Memory *general = &models->mem.general;
Dynamic_Variable_Layout *layout = &models->variable_layout;
return(dynamic_variables_lookup_or_create(general, layout, name, default_value));
}
internal bool32
get_dynamic_variable(Command_Data *cmd, Dynamic_Scope handle, int32_t location, uint64_t **ptr_out){
Models *models = cmd->models;
General_Memory *general = &models->mem.general;
Dynamic_Variable_Layout *layout = &models->variable_layout;
Dynamic_Variable_Block *block = 0;
switch (handle.type){
case DynamicScopeType_Global:
{
block = &models->dynamic_vars;
}break;
case DynamicScopeType_Intersected:
{
Lifetime_Key *key = (Lifetime_Key*)IntAsPtr(handle.intersected_opaque_handle);
block = &key->dynamic_vars;
}break;
case DynamicScopeType_Buffer:
{
Editing_File *file = imp_get_file(cmd, handle.buffer_id);
if (file != 0){
block = &file->dynamic_vars;
}
}break;
case DynamicScopeType_View:
{
View *vptr = imp_get_view(cmd, handle.view_id);
if (vptr != 0){
block = &vptr->transient.dynamic_vars;
}
}break;
}
bool32 result = false;
if (layout != 0 && block != 0){
if (dynamic_variables_get_ptr(general, layout, block, location, ptr_out)){
result = true;
}
}
return(result);
}
API_EXPORT bool32
Managed_Variable_Set(Application_Links *app, Dynamic_Scope scope, Managed_Variable_ID location, uint64_t value)
{
Command_Data *cmd = (Command_Data*)app->cmd_context;
u64 *ptr = 0;
if (get_dynamic_variable(cmd, scope, location, &ptr)){
*ptr = value;
return(true);
}
return(false);
}
API_EXPORT bool32
Managed_Variable_Get(Application_Links *app, Dynamic_Scope scope, Managed_Variable_ID location, uint64_t *value_out)
{
Command_Data *cmd = (Command_Data*)app->cmd_context;
u64 *ptr = 0;
if (get_dynamic_variable(cmd, scope, location, &ptr)){
*value_out = *ptr;
return(true);
}
return(false);
}
API_EXPORT User_Input API_EXPORT User_Input
Get_User_Input(Application_Links *app, Input_Type_Flag get_type, Input_Type_Flag abort_type) Get_User_Input(Application_Links *app, Input_Type_Flag get_type, Input_Type_Flag abort_type)
/* /*
@ -2426,23 +2599,6 @@ DOC_SEE(Mouse_State)
return(mouse); return(mouse);
} }
/*
API_EXPORT Event_Message
Get_Event_Message (Application_Links *app){
Event_Message message = {0};
System_Functions *system = (System_Functions*)app->system_links;
Coroutine *coroutine = (Coroutine*)app->current_coroutine;
if (app->type_coroutine == Co_View){
Assert(coroutine);
system->yield_coroutine(coroutine);
message = *(Event_Message*)coroutine->in;
}
return(message);
}
*/
API_EXPORT bool32 API_EXPORT bool32
Start_Query_Bar(Application_Links *app, Query_Bar *bar, uint32_t flags) Start_Query_Bar(Application_Links *app, Query_Bar *bar, uint32_t flags)
/* /*
@ -2494,6 +2650,36 @@ DOC(This call posts a string to the *messages* buffer.)
do_feedback_message(cmd->system, models, make_string(str, len)); do_feedback_message(cmd->system, models, make_string(str, len));
} }
API_EXPORT int32_t
Get_Theme_Count(Application_Links *app)
{
Command_Data *cmd = (Command_Data*)app->cmd_context;
Style_Library *library = &cmd->models->styles;
return(library->count);
}
API_EXPORT String
Get_Theme_Name(Application_Links *app, struct Partition *arena, int32_t index)
{
Command_Data *cmd = (Command_Data*)app->cmd_context;
Style_Library *library = &cmd->models->styles;
String str = {0};
if (0 <= index && index < library->count){
Style *style = &library->styles[index];
char *mem = push_array(arena, char, style->name.size + 1);
if (mem != 0){
str.str = mem;
str.size = style->name.size;
str.memory_size = str.size + 1;
memcpy(str.str, style->name.str, str.size);
str.str[str.size] = 0;
}
}
return(str);
}
API_EXPORT void API_EXPORT void
Create_Theme(Application_Links *app, Theme *theme, char *name, int32_t len) Create_Theme(Application_Links *app, Theme *theme, char *name, int32_t len)
/* /*
@ -2508,10 +2694,11 @@ DOC(This call creates a new theme. If the given name is already the name of a s
b32 hit_existing_theme = false; b32 hit_existing_theme = false;
i32 count = library->count; i32 count = library->count;
Style *style = library->styles; Style *style = library->styles + 1;
for (i32 i = 0; i < count; ++i, ++style){ for (i32 i = 1; i < count; ++i, ++style){
if (match(style->name, theme_name)){ if (match(style->name, theme_name)){
style_set_colors(style, theme); style_set_colors(style, theme);
Print_Message(app, "DID THING\n", sizeof("DID THING\n") - 1);
hit_existing_theme = true; hit_existing_theme = true;
break; break;
} }
@ -2538,15 +2725,28 @@ DOC(This call changes 4coder's color pallet to one of the built in themes.)
String theme_name = make_string(name, len); String theme_name = make_string(name, len);
i32 count = styles->count; i32 count = styles->count;
Style *s = styles->styles; Style *s = styles->styles + 1;
for (i32 i = 0; i < count; ++i, ++s){ for (i32 i = 1; i < count; ++i, ++s){
if (match_ss(s->name, theme_name)){ if (match(s->name, theme_name)){
style_copy(&styles->styles[0], s); style_copy(&styles->styles[0], s);
break; break;
} }
} }
} }
API_EXPORT bool32
Change_Theme_By_Index(Application_Links *app, int32_t index)
{
Command_Data *cmd = (Command_Data*)app->cmd_context;
Style_Library *styles = &cmd->models->styles;
i32 count = styles->count;
if (0 <= index && index < count){
style_copy(&styles->styles[0], &styles->styles[index]);
return(true);
}
return(false);
}
API_EXPORT Face_ID API_EXPORT Face_ID
Get_Largest_Face_ID(Application_Links *app) Get_Largest_Face_ID(Application_Links *app)
/* /*

View File

@ -67,7 +67,9 @@ struct Models{
Live_Views live_set; Live_Views live_set;
Parse_Context_Memory parse_context_memory; Parse_Context_Memory parse_context_memory;
Dynamic_Variable_Layout view_variable_layout; Dynamic_Variable_Layout variable_layout;
Dynamic_Variable_Block dynamic_vars;
Lifetime_Allocator lifetime_allocator;
Editing_File *message_buffer; Editing_File *message_buffer;
Editing_File *scratch_buffer; Editing_File *scratch_buffer;
@ -95,6 +97,12 @@ struct Models{
//////////////////////////////// ////////////////////////////////
typedef i32 Lifetime_Object_Type;
enum{
LifetimeObject_File = 0,
LifetimeObject_View = 1,
};
enum App_State{ enum App_State{
APP_STATE_EDIT, APP_STATE_EDIT,
APP_STATE_RESIZING, APP_STATE_RESIZING,

View File

@ -43,6 +43,7 @@
#include "4ed_linked_node_macros.h" #include "4ed_linked_node_macros.h"
#include "4ed_log.h" #include "4ed_log.h"
#include "4ed_dynamic_variables.h"
#include "4ed_buffer_model.h" #include "4ed_buffer_model.h"
#include "4ed_translation.h" #include "4ed_translation.h"
@ -59,10 +60,10 @@
#include "4ed_cli.h" #include "4ed_cli.h"
#include "4ed_gui.h" #include "4ed_gui.h"
#include "4ed_layout.h" #include "4ed_layout.h"
#include "4ed_dynamic_variables.h"
#include "4ed_view.h" #include "4ed_view.h"
#include "4ed_app_models.h" #include "4ed_app_models.h"
#include "4ed_dynamic_variables.cpp"
#include "4ed_parse_context.cpp" #include "4ed_parse_context.cpp"
#include "4ed_font.cpp" #include "4ed_font.cpp"
#include "4ed_translation.cpp" #include "4ed_translation.cpp"
@ -79,7 +80,6 @@
#include "4ed_hot_directory.cpp" #include "4ed_hot_directory.cpp"
#include "4ed_cli.cpp" #include "4ed_cli.cpp"
#include "4ed_gui.cpp" #include "4ed_gui.cpp"
#include "4ed_dynamic_variables.cpp"
#include "4ed_layout.cpp" #include "4ed_layout.cpp"
#include "4coder_buffer_seek_constructors.cpp" #include "4coder_buffer_seek_constructors.cpp"
#include "4ed_view.cpp" #include "4ed_view.cpp"

View File

@ -71,6 +71,11 @@ typedef double f64;
#if !defined(Member) #if !defined(Member)
# define Member(T, m) (((T*)0)->m) # define Member(T, m) (((T*)0)->m)
#endif #endif
#define PtrDif(a,b) ((uint8_t*)(a) - (uint8_t*)(b))
#define PtrAsInt(a) PtrDif(a,0)
#define OffsetOfMember(S,m) PtrAsInt(&Member(S,m))
#define CastFromMember(S,m,ptr) (S*)( (uint8_t*)(ptr) - OffsetOfMember(S,m) )
#define IntAsPtr(a) (void*)(((uint8_t*)0) + a)
#define STR__(s) #s #define STR__(s) #s
#define STR_(s) STR__(s) #define STR_(s) STR__(s)
@ -178,41 +183,77 @@ max_f32_proc(void){
#define max_f32 max_f32_proc() #define max_f32 max_f32_proc()
#endif #endif
#define Bit_0 (1 << 0) global_const u32 bit_0 = (((u32)1) << 0);
#define Bit_1 (1 << 1) global_const u32 bit_1 = (((u32)1) << 1);
#define Bit_2 (1 << 2) global_const u32 bit_2 = (((u32)1) << 2);
#define Bit_3 (1 << 3) global_const u32 bit_3 = (((u32)1) << 3);
#define Bit_4 (1 << 4) global_const u32 bit_4 = (((u32)1) << 4);
#define Bit_5 (1 << 5) global_const u32 bit_5 = (((u32)1) << 5);
#define Bit_6 (1 << 6) global_const u32 bit_6 = (((u32)1) << 6);
#define Bit_7 (1 << 7) global_const u32 bit_7 = (((u32)1) << 7);
#define Bit_8 (1 << 8) global_const u32 bit_8 = (((u32)1) << 8);
#define Bit_9 (1 << 9) global_const u32 bit_9 = (((u32)1) << 9);
#define Bit_10 (1 << 10) global_const u32 bit_10 = (((u32)1) << 10);
#define Bit_11 (1 << 11) global_const u32 bit_11 = (((u32)1) << 11);
#define Bit_12 (1 << 12) global_const u32 bit_12 = (((u32)1) << 12);
#define Bit_13 (1 << 13) global_const u32 bit_13 = (((u32)1) << 13);
#define Bit_14 (1 << 14) global_const u32 bit_14 = (((u32)1) << 14);
#define Bit_15 (1 << 15) global_const u32 bit_15 = (((u32)1) << 15);
#define Bit_16 (1 << 16) global_const u32 bit_16 = (((u32)1) << 16);
#define Bit_17 (1 << 17) global_const u32 bit_17 = (((u32)1) << 17);
#define Bit_18 (1 << 18) global_const u32 bit_18 = (((u32)1) << 18);
#define Bit_19 (1 << 19) global_const u32 bit_19 = (((u32)1) << 19);
#define Bit_20 (1 << 20) global_const u32 bit_20 = (((u32)1) << 20);
#define Bit_21 (1 << 21) global_const u32 bit_21 = (((u32)1) << 21);
#define Bit_22 (1 << 22) global_const u32 bit_22 = (((u32)1) << 22);
#define Bit_23 (1 << 23) global_const u32 bit_23 = (((u32)1) << 23);
#define Bit_24 (1 << 24) global_const u32 bit_24 = (((u32)1) << 24);
#define Bit_25 (1 << 25) global_const u32 bit_25 = (((u32)1) << 25);
#define Bit_26 (1 << 26) global_const u32 bit_26 = (((u32)1) << 26);
#define Bit_27 (1 << 27) global_const u32 bit_27 = (((u32)1) << 27);
#define Bit_28 (1 << 28) global_const u32 bit_28 = (((u32)1) << 28);
#define Bit_29 (1 << 29) global_const u32 bit_29 = (((u32)1) << 29);
#define Bit_30 (1 << 30) global_const u32 bit_30 = (((u32)1) << 30);
#define Bit_31 (1 << 31) global_const u32 bit_31 = (((u32)1) << 31);
global_const u64 bit_32 = (((u64)1) << (0 + 32));
global_const u64 bit_33 = (((u64)1) << (1 + 32));
global_const u64 bit_34 = (((u64)1) << (2 + 32));
global_const u64 bit_35 = (((u64)1) << (3 + 32));
global_const u64 bit_36 = (((u64)1) << (4 + 32));
global_const u64 bit_37 = (((u64)1) << (5 + 32));
global_const u64 bit_38 = (((u64)1) << (6 + 32));
global_const u64 bit_39 = (((u64)1) << (7 + 32));
global_const u64 bit_40 = (((u64)1) << (8 + 32));
global_const u64 bit_41 = (((u64)1) << (9 + 32));
global_const u64 bit_42 = (((u64)1) << (10 + 32));
global_const u64 bit_43 = (((u64)1) << (11 + 32));
global_const u64 bit_44 = (((u64)1) << (12 + 32));
global_const u64 bit_45 = (((u64)1) << (13 + 32));
global_const u64 bit_46 = (((u64)1) << (14 + 32));
global_const u64 bit_47 = (((u64)1) << (15 + 32));
global_const u64 bit_48 = (((u64)1) << (16 + 32));
global_const u64 bit_49 = (((u64)1) << (17 + 32));
global_const u64 bit_50 = (((u64)1) << (18 + 32));
global_const u64 bit_51 = (((u64)1) << (19 + 32));
global_const u64 bit_52 = (((u64)1) << (20 + 32));
global_const u64 bit_53 = (((u64)1) << (21 + 32));
global_const u64 bit_54 = (((u64)1) << (22 + 32));
global_const u64 bit_55 = (((u64)1) << (23 + 32));
global_const u64 bit_56 = (((u64)1) << (24 + 32));
global_const u64 bit_57 = (((u64)1) << (25 + 32));
global_const u64 bit_58 = (((u64)1) << (26 + 32));
global_const u64 bit_59 = (((u64)1) << (27 + 32));
global_const u64 bit_60 = (((u64)1) << (28 + 32));
global_const u64 bit_61 = (((u64)1) << (29 + 32));
global_const u64 bit_62 = (((u64)1) << (30 + 32));
global_const u64 bit_63 = (((u64)1) << (31 + 32));
#endif #endif

View File

@ -15,9 +15,8 @@ dynamic_variables_init(Dynamic_Variable_Layout *layout){
layout->location_counter = 1; layout->location_counter = 1;
} }
internal i32 internal Managed_Variable_ID
dynamic_variables_lookup_or_create(General_Memory *general, Dynamic_Variable_Layout *layout, dynamic_variables_lookup(Dynamic_Variable_Layout *layout, String name){
String name, u64 default_value){
for (Dynamic_Variable_Slot *slot = layout->sentinel.next; for (Dynamic_Variable_Slot *slot = layout->sentinel.next;
slot != &layout->sentinel; slot != &layout->sentinel;
slot = slot->next){ slot = slot->next){
@ -25,6 +24,11 @@ dynamic_variables_lookup_or_create(General_Memory *general, Dynamic_Variable_Lay
return(slot->location); return(slot->location);
} }
} }
return(ManagedVariableIndex_ERROR);
}
internal Managed_Variable_ID
dynamic_variables_create__always(General_Memory *general, Dynamic_Variable_Layout *layout, String name, u64 default_value){
int32_t alloc_size = name.size + 1 + sizeof(Dynamic_Variable_Slot); int32_t alloc_size = name.size + 1 + sizeof(Dynamic_Variable_Slot);
void *ptr = general_memory_allocate(general, alloc_size); void *ptr = general_memory_allocate(general, alloc_size);
if (ptr != 0){ if (ptr != 0){
@ -39,7 +43,25 @@ dynamic_variables_lookup_or_create(General_Memory *general, Dynamic_Variable_Lay
dll_insert_back(&layout->sentinel, new_slot); dll_insert_back(&layout->sentinel, new_slot);
return(new_slot->location); return(new_slot->location);
} }
return(0); return(ManagedVariableIndex_ERROR);
}
internal Managed_Variable_ID
dynamic_variables_lookup_or_create(General_Memory *general, Dynamic_Variable_Layout *layout, String name, u64 default_value){
Managed_Variable_ID lookup_id = dynamic_variables_lookup(layout, name);
if (lookup_id != ManagedVariableIndex_ERROR){
return(lookup_id);
}
return(dynamic_variables_create__always(general, layout, name, default_value));
}
internal i32
dynamic_variables_create(General_Memory *general, Dynamic_Variable_Layout *layout, String name, u64 default_value){
Managed_Variable_ID lookup_id = dynamic_variables_lookup(layout, name);
if (lookup_id == ManagedVariableIndex_ERROR){
return(dynamic_variables_create__always(general, layout, name, default_value));
}
return(ManagedVariableIndex_ERROR);
} }
internal void internal void
@ -98,5 +120,364 @@ dynamic_variables_get_ptr(General_Memory *general,
return(result); return(result);
} }
////////////////////////////////
internal u64
lifetime__key_hash(Lifetime_Object **object_ptr_array, i32 count){
u64 hash = bit_1;
for (i32 i = 0; i < count; i += 1){
u64 x = (u64)(PtrAsInt(object_ptr_array[i]));
x >>= 3;
hash = (hash + ((hash << 37) ^ (((x) >> (x&1)))));
}
return(hash | bit_63);
}
internal Lifetime_Key*
lifetime__key_table_lookup(Lifetime_Key_Table *table, u64 hash, Lifetime_Object **object_ptr_array, i32 count){
u32 max = table->max;
if (max > 0 && table->count > 0){
u32 first_index = hash%max;
u32 index = first_index;
u64 *hashes = table->hashes;
umem set_size = count*sizeof(Lifetime_Object*);
for (;;){
if (hashes[index] == hash){
Lifetime_Key *key = table->keys[index];
if (key->count == count &&
memcmp(object_ptr_array, key->members, set_size) == 0){
return(key);
}
}
else if (hashes[index] == LifetimeKeyHash_Empty){
return(0);
}
index += 1;
if (index == max){
index = 0;
}
if (index == first_index){
return(0);
}
}
}
return(0);
}
internal Lifetime_Key_Table
lifetime__key_table_copy(General_Memory *general, Lifetime_Key_Table table, u32 new_max);
internal void
lifetime__key_table_insert(General_Memory *general, Lifetime_Key_Table *table, u64 hash, Lifetime_Key *key){
{
u32 max = table->max;
u32 count = table->count;
if (max == 0 || (count + 1)*6 > max*5){
Assert(general != 0);
Lifetime_Key_Table new_table = lifetime__key_table_copy(general, *table, max*2);
general_memory_free(general, table->mem_ptr);
*table = new_table;
}
}
{
u32 max = table->max;
if (max > 0 && table->count > 0){
u32 first_index = hash%max;
u32 index = first_index;
u64 *hashes = table->hashes;
for (;;){
if (hashes[index] == LifetimeKeyHash_Empty ||
hashes[index] == LifetimeKeyHash_Deleted){
hashes[index] = hash;
table->keys[index] = key;
return;
}
index += 1;
if (index == max){
index = 0;
}
if (index == first_index){
return;
}
}
}
}
}
internal void
lifetime__key_table_erase(Lifetime_Key_Table *table, Lifetime_Key *erase_key){
u32 max = table->max;
if (max > 0 && table->count > 0){
u64 hash = lifetime__key_hash(erase_key->members, erase_key->count);
u32 first_index = hash%max;
u32 index = first_index;
u64 *hashes = table->hashes;
for (;;){
if (hashes[index] == hash){
Lifetime_Key *key = table->keys[index];
if (erase_key == key){
hashes[index] = LifetimeKeyHash_Deleted;
table->keys[index] = 0;
}
}
else if (hashes[index] == LifetimeKeyHash_Empty){
return;
}
index += 1;
if (index == max){
index = 0;
}
if (index == first_index){
return;
}
}
}
}
internal Lifetime_Key_Table
lifetime__key_table_copy(General_Memory *general, Lifetime_Key_Table table, u32 new_max){
Lifetime_Key_Table new_table = {0};
new_table.max = clamp_bottom(table.max, new_max);
new_table.max = clamp_bottom(307, new_table.max);
i32 item_size = sizeof(*new_table.hashes) + sizeof(*new_table.keys);
new_table.mem_ptr = general_memory_allocate(general, item_size*new_table.max);
memset(new_table.mem_ptr, 0, item_size*new_table.max);
new_table.hashes = (u64*)(new_table.mem_ptr);
new_table.keys = (Lifetime_Key**)(new_table.hashes + new_table.max);
for (u32 i = 0; i < table.max; i += 1){
if ((table.hashes[i]&bit_63) != 0){
lifetime__key_table_insert(0, &new_table, table.hashes[i], table.keys[i]);
}
}
return(new_table);
}
internal void
lifetime__free_key(General_Memory *general, Lifetime_Allocator *lifetime_allocator,
Lifetime_Key *key, Lifetime_Object *skip_object){
// Deinit
dynamic_variables_block_free(general, &key->dynamic_vars);
// Remove From Objects
i32 count = key->count;
Lifetime_Object **object_ptr = key->members;
for (i32 i = 0; i < count; i += 1, object_ptr += 1){
if (*object_ptr == skip_object) continue;
Lifetime_Key_Ref_Node *delete_point_node = 0;
i32 delete_point_i = 0;
i32 key_i = 0;
Lifetime_Object *object = *object_ptr;
for (Lifetime_Key_Ref_Node *node = object->key_node_first;
node != 0;
node = node->next){
i32 one_past_last = clamp_top(ArrayCount(node->keys), object->key_count - key_i);
for (i32 j = 0; j < one_past_last; j += 1){
if (node->keys[j] == key){
delete_point_node = node;
delete_point_i = j;
goto double_break;
}
}
key_i += one_past_last;
}
double_break:;
Assert(delete_point_node != 0);
Lifetime_Key_Ref_Node *last_node = object->key_node_last;
Lifetime_Key *last_key = last_node->keys[object->key_count % lifetime_key_reference_per_node];
delete_point_node->keys[delete_point_i] = last_key;
object->key_count -= 1;
if ((object->key_count % lifetime_key_reference_per_node) == 0){
zdll_remove(object->key_node_first, object->key_node_last, last_node);
zdll_push_back(lifetime_allocator->free_key_references.first, lifetime_allocator->free_key_references.last, last_node);
}
}
// Free
lifetime__key_table_erase(&lifetime_allocator->key_table, key);
general_memory_free(general, key->members);
zdll_push_back(lifetime_allocator->free_keys.first, lifetime_allocator->free_keys.last, key);
}
internal Lifetime_Key_Ref_Node*
lifetime__alloc_key_reference_node(General_Memory *general, Lifetime_Allocator *lifetime_allocator){
Lifetime_Key_Ref_Node *result = lifetime_allocator->free_key_references.first;
if (result == 0){
i32 new_node_count = 32;
Lifetime_Key_Ref_Node *new_nodes = (Lifetime_Key_Ref_Node*)general_memory_allocate(general, sizeof(Lifetime_Key_Ref_Node)*new_node_count);
Lifetime_Key_Ref_Node *new_node_ptr = new_nodes;
for (i32 i = 0; i < new_node_count; i += 1, new_node_ptr += 1){
zdll_push_back(lifetime_allocator->free_key_references.first,
lifetime_allocator->free_key_references.last,
new_node_ptr);
}
lifetime_allocator->free_key_references.count += new_node_count;
result = lifetime_allocator->free_key_references.first;
}
zdll_remove(lifetime_allocator->free_key_references.first, lifetime_allocator->free_key_references.last,
result);
return(result);
}
internal void
lifetime__object_add_key(General_Memory *general, Lifetime_Allocator *lifetime_allocator,
Lifetime_Object *object, Lifetime_Key *key){
Lifetime_Key_Ref_Node *last_node = object->key_node_last;
b32 insert_on_new_node = false;
if (last_node == 0){
insert_on_new_node = true;
}
else{
i32 next_insert_slot = object->key_count%ArrayCount(last_node->keys);
if (next_insert_slot != 0){
last_node->keys[next_insert_slot] = key;
}
else{
insert_on_new_node = true;
}
}
if (insert_on_new_node){
Lifetime_Key_Ref_Node *new_node = lifetime__alloc_key_reference_node(general, lifetime_allocator);
zdll_push_back(object->key_node_first, object->key_node_last, new_node);
memset(new_node->keys, 0, sizeof(new_node->keys));
new_node->keys[0] = key;
object->key_count += 1;
}
}
internal Lifetime_Object*
lifetime_alloc_object(General_Memory *general, Lifetime_Allocator *lifetime_allocator, i32 user_type, void *user_back_ptr){
Lifetime_Object *object = lifetime_allocator->free_objects.first;
if (object == 0){
i32 new_object_count = 256;
Lifetime_Object *new_objects = (Lifetime_Object*)general_memory_allocate(general, sizeof(Lifetime_Object)*new_object_count);
Lifetime_Object *new_object_ptr = new_objects;
for (i32 i = 0; i < new_object_count; i += 1, new_object_ptr += 1){
zdll_push_back(lifetime_allocator->free_objects.first, lifetime_allocator->free_objects.last, new_object_ptr);
}
lifetime_allocator->free_objects.count += new_object_count;
object = lifetime_allocator->free_objects.first;
}
zdll_remove(lifetime_allocator->free_objects.first, lifetime_allocator->free_objects.last, object);
lifetime_allocator->free_objects.count -= 1;
memset(object, 0, sizeof(*object));
object->user_type = user_type;
object->user_back_ptr = user_back_ptr;
return(object);
}
internal void
lifetime_free_object(General_Memory *general, Lifetime_Allocator *lifetime_allocator,
Lifetime_Object *lifetime_object){
i32 key_i = 0;
for (Lifetime_Key_Ref_Node *node = lifetime_object->key_node_first;
node != 0;
node = node->next){
i32 one_past_last = clamp_top(ArrayCount(node->keys), lifetime_object->key_count - key_i);
for (i32 i = 0; i < one_past_last; i += 1){
lifetime__free_key(general, lifetime_allocator, node->keys[i], lifetime_object);
}
key_i += one_past_last;
}
if (lifetime_object->key_count > 0){
lifetime_object->key_node_last->next = lifetime_allocator->free_key_references.first;
lifetime_allocator->free_key_references.first = lifetime_object->key_node_first;
i32 node_count = (lifetime_object->key_count + (lifetime_key_reference_per_node - 1))/lifetime_key_reference_per_node;
lifetime_allocator->free_key_references.count += node_count;
}
zdll_push_back(lifetime_allocator->free_objects.first, lifetime_allocator->free_objects.last, lifetime_object);
}
internal i32
lifetime_sort_object_set__part(Lifetime_Object **ptr_array, i32 first, i32 one_past_last){
i32 pivot_index = one_past_last - 1;
Lifetime_Object *pivot = ptr_array[pivot_index];
i32 j = first;
for (i32 i = first; i < pivot_index; i += 1){
Lifetime_Object *object = ptr_array[i];
if (object < pivot){
Swap(Lifetime_Object*, ptr_array[i], ptr_array[j]);
j += 1;
}
}
Swap(Lifetime_Object*, ptr_array[j], ptr_array[pivot_index]);
return(j);
}
internal void
lifetime_sort_object_set__quick(Lifetime_Object **ptr_array, i32 first, i32 one_past_last){
if (first + 1 < one_past_last){
i32 pivot = lifetime_sort_object_set__part(ptr_array, first, one_past_last);
lifetime_sort_object_set__quick(ptr_array, first, pivot);
lifetime_sort_object_set__quick(ptr_array, pivot + 1, one_past_last);
}
}
internal i32
lifetime_sort_and_dedup_object_set(Lifetime_Object **ptr_array, i32 count){
lifetime_sort_object_set__quick(ptr_array, 0, count);
Lifetime_Object **ptr_write = ptr_array;
Lifetime_Object **ptr_read = ptr_array;
for (i32 i = 1; i < count; i += 1, ptr_read += 1){
if (ptr_write[-1] < *ptr_read){
ptr_write[0] = *ptr_read;
ptr_write += 1;
}
}
return((i32)(ptr_write - ptr_array));
}
internal Lifetime_Key*
lifetime_get_or_create_intersection_key(General_Memory *general, Lifetime_Allocator *lifetime_allocator, Lifetime_Object **object_ptr_array, i32 count){
u64 hash = lifetime__key_hash(object_ptr_array, count);
// Lookup
Lifetime_Key *existing_key = lifetime__key_table_lookup(&lifetime_allocator->key_table, hash,
object_ptr_array, count);
if (existing_key != 0){
return(existing_key);
}
// Allocate
Lifetime_Key *new_key = lifetime_allocator->free_keys.first;
if (new_key == 0){
i32 new_key_count = 256;
Lifetime_Key *new_keys = (Lifetime_Key*)general_memory_allocate(general, sizeof(Lifetime_Key)*new_key_count);
Lifetime_Key *new_key_ptr = new_keys;
for (i32 i = 0; i < new_key_count; i += 1, new_key_ptr += 1){
zdll_push_back(lifetime_allocator->free_keys.first, lifetime_allocator->free_keys.last, new_key_ptr);
}
lifetime_allocator->free_keys.count += new_key_count;
new_key = lifetime_allocator->free_keys.first;
}
zdll_remove(lifetime_allocator->free_keys.first, lifetime_allocator->free_keys.last, new_key);
// Add to Objects
Lifetime_Object **object_ptr = object_ptr_array;
for (i32 i = 0; i < count; i += 1, object_ptr += 1){
Lifetime_Object *object = *object_ptr;
lifetime__object_add_key(general, lifetime_allocator, object, new_key);
}
// Initialize
new_key->members = (Lifetime_Object**)general_memory_allocate(general, sizeof(Lifetime_Object*)*count);
memcpy(new_key->members, object_ptr_array, sizeof(Lifetime_Object*)*count);
new_key->count = count;
dynamic_variables_block_init(general, &new_key->dynamic_vars);
lifetime__key_table_insert(general, &lifetime_allocator->key_table, hash, new_key);
return(new_key);
}
// BOTTOM // BOTTOM

View File

@ -31,6 +31,82 @@ struct Dynamic_Variable_Block{
i32 max; i32 max;
}; };
////////////////////////////////
global_const i32 lifetime_key_reference_per_node = 32;
struct Lifetime_Key_Ref_Node{
Lifetime_Key_Ref_Node *next;
Lifetime_Key_Ref_Node *prev;
struct Lifetime_Key *keys[lifetime_key_reference_per_node];
};
struct Lifetime_Object{
union{
struct{
Lifetime_Object *next;
Lifetime_Object *prev;
};
struct{
Lifetime_Key_Ref_Node *key_node_first;
Lifetime_Key_Ref_Node *key_node_last;
i32 key_count;
i32 user_type;
void *user_back_ptr;
};
};
};
struct Lifetime_Key{
union{
struct{
Lifetime_Key *next;
Lifetime_Key *prev;
};
struct{
struct Lifetime_Object **members;
i32 count;
Dynamic_Variable_Block dynamic_vars;
};
};
};
global_const u64 LifetimeKeyHash_Empty = 0&(~bit_63);
global_const u64 LifetimeKeyHash_Deleted = max_u64&(~bit_63);
struct Lifetime_Key_Table{
void *mem_ptr;
u64 *hashes;
Lifetime_Key **keys;
u32 count;
u32 max;
};
struct Lifetime_Key_Ref_Node_List{
Lifetime_Key_Ref_Node *first;
Lifetime_Key_Ref_Node *last;
i32 count;
};
struct Lifetime_Object_List{
Lifetime_Object *first;
Lifetime_Object *last;
i32 count;
};
struct Lifetime_Key_List{
Lifetime_Key *first;
Lifetime_Key *last;
i32 count;
};
struct Lifetime_Allocator{
Lifetime_Key_Ref_Node_List free_key_references;
Lifetime_Object_List free_objects;
Lifetime_Key_List free_keys;
Lifetime_Key_Table key_table;
};
#endif #endif
// BOTTOM // BOTTOM

View File

@ -131,6 +131,8 @@ struct Editing_File{
b32 is_loading; b32 is_loading;
b32 is_dummy; b32 is_dummy;
Editing_File_State state; Editing_File_State state;
Dynamic_Variable_Block dynamic_vars;
Lifetime_Object *lifetime_object;
Editing_File_Markers markers; Editing_File_Markers markers;
Editing_File_Name base_name; Editing_File_Name base_name;
Editing_File_Name unique_name; Editing_File_Name unique_name;

View File

@ -17,6 +17,13 @@
#define dll_insert_back(p,n) (n)->prev=(p)->prev,(n)->next=(p),(p)->prev=(n),(n)->prev->next=(n) #define dll_insert_back(p,n) (n)->prev=(p)->prev,(n)->next=(p),(p)->prev=(n),(n)->prev->next=(n)
#define dll_remove(n) (n)->next->prev=(n)->prev,(n)->prev->next=(n)->next #define dll_remove(n) (n)->next->prev=(n)->prev,(n)->prev->next=(n)->next
#define zdll_push_back_(f,l,n) if(f==0){n->next=n->prev=0;f=l=n;}else{n->prev=l;n->next=0;l->next=n;l=n;}
#define zdll_push_back(f,l,n) do{ zdll_push_back_((f),(l),(n)) }while(0)
#define zdll_remove_front_(f,l,n) if(f==l){f=l=0;}else{f=f->next;f->prev=0;}
#define zdll_remove_back_(f,l,n) if(f==l){f=l=0;}else{l=l->prev;l->next=0;}
#define zdll_remove_(f,l,n) if(f==n){zdll_remove_front_(f,l,n);}else if(l==n){zdll_remove_back_(f,l,n);}else{dll_remove(n);}
#define zdll_remove(f,l,n) do{ zdll_remove_((f),(l),(n)) }while(0)
#define sll_clear(f,l) (f)=(l)=0 #define sll_clear(f,l) (f)=(l)=0
#define sll_push(f,l,n) if((f)==0&&(l)==0){(f)=(l)=(n);}else{(l)->next=(n);(l)=(n);}(l)->next=0 #define sll_push(f,l,n) if((f)==0&&(l)==0){(f)=(l)=(n);}else{(l)->next=(n);(l)=(n);}(l)->next=0
#define sll_pop(f,l) if((f)!=(l)){(f)=(f)->next;}else{(f)=(l)=0;} #define sll_pop(f,l) if((f)!=(l)){(f)=(f)->next;}else{(f)=(l)=0;}

View File

@ -40,7 +40,8 @@ style_set_name(Style *style, String name){
struct Style_Library{ struct Style_Library{
Style styles[64]; Style styles[64];
i32 count, max; i32 count;
i32 max;
}; };
#endif #endif

View File

@ -20,7 +20,7 @@ view_get_map(View *view){
} }
internal View_And_ID internal View_And_ID
live_set_alloc_view(General_Memory *general, Live_Views *live_set, Panel *panel){ live_set_alloc_view(General_Memory *general, Lifetime_Allocator *lifetime_allocator, Live_Views *live_set, Panel *panel){
Assert(live_set->count < live_set->max); Assert(live_set->count < live_set->max);
++live_set->count; ++live_set->count;
@ -29,7 +29,6 @@ live_set_alloc_view(General_Memory *general, Live_Views *live_set, Panel *panel)
result.id = (i32)(result.view - live_set->views); result.id = (i32)(result.view - live_set->views);
Assert(result.id == result.view->persistent.id); Assert(result.id == result.view->persistent.id);
//dll_remove(&result.view->transient));
result.view->transient.next->transient.prev = result.view->transient.prev; result.view->transient.next->transient.prev = result.view->transient.prev;
result.view->transient.prev->transient.next = result.view->transient.next; result.view->transient.prev->transient.next = result.view->transient.next;
memset(&result.view->transient, 0, sizeof(result.view->transient)); memset(&result.view->transient, 0, sizeof(result.view->transient));
@ -41,12 +40,13 @@ live_set_alloc_view(General_Memory *general, Live_Views *live_set, Panel *panel)
init_query_set(&result.view->transient.query_set); init_query_set(&result.view->transient.query_set);
dynamic_variables_block_init(general, &result.view->transient.dynamic_vars); dynamic_variables_block_init(general, &result.view->transient.dynamic_vars);
result.view->transient.lifetime_object = lifetime_alloc_object(general, lifetime_allocator, LifetimeObject_View, result.view);
return(result); return(result);
} }
inline void inline void
live_set_free_view(General_Memory *general, Live_Views *live_set, View *view){ live_set_free_view(General_Memory *general, Lifetime_Allocator *lifetime_allocator, Live_Views *live_set, View *view){
Assert(live_set->count > 0); Assert(live_set->count > 0);
--live_set->count; --live_set->count;
@ -54,7 +54,6 @@ live_set_free_view(General_Memory *general, Live_Views *live_set, View *view){
general_memory_free(general, view->transient.ui_control.items); general_memory_free(general, view->transient.ui_control.items);
} }
//dll_insert(&live_set->free_sentinel, view);
view->transient.next = live_set->free_sentinel.transient.next; view->transient.next = live_set->free_sentinel.transient.next;
view->transient.prev = &live_set->free_sentinel; view->transient.prev = &live_set->free_sentinel;
live_set->free_sentinel.transient.next = view; live_set->free_sentinel.transient.next = view;
@ -62,6 +61,7 @@ live_set_free_view(General_Memory *general, Live_Views *live_set, View *view){
view->transient.in_use = false; view->transient.in_use = false;
dynamic_variables_block_free(general, &view->transient.dynamic_vars); dynamic_variables_block_free(general, &view->transient.dynamic_vars);
lifetime_free_object(general, lifetime_allocator, view->transient.lifetime_object);
} }
//////////////////////////////// ////////////////////////////////

View File

@ -15,7 +15,6 @@
struct View_Persistent{ struct View_Persistent{
i32 id; i32 id;
Coroutine_Head *coroutine; Coroutine_Head *coroutine;
Event_Message message_passing_slot;
}; };
struct File_Viewing_Data{ struct File_Viewing_Data{
@ -38,6 +37,7 @@ struct View_Transient{
File_Viewing_Data file_data; File_Viewing_Data file_data;
Dynamic_Variable_Block dynamic_vars; Dynamic_Variable_Block dynamic_vars;
Lifetime_Object *lifetime_object;
i32_Rect file_region_prev; i32_Rect file_region_prev;
i32_Rect file_region; i32_Rect file_region;

View File

@ -241,6 +241,9 @@ do_render_file_view(System_Functions *system, View *view, Models *models, GUI_Sc
i32 line_height = view->transient.line_height; i32 line_height = view->transient.line_height;
Style *style = &models->styles.styles[0]; Style *style = &models->styles.styles[0];
Face_ID font_id = file->settings.font_id; Face_ID font_id = file->settings.font_id;
char font_name_space[256];
String font_name = make_fixed_width_string(font_name_space);
font_name.size = system->font.get_name_by_id(font_id, font_name.str, font_name.memory_size);
Font_Pointers font = system->font.get_pointers_by_id(font_id); Font_Pointers font = system->font.get_pointers_by_id(font_id);
if (!view->transient.hide_file_bar){ if (!view->transient.hide_file_bar){
@ -335,29 +338,36 @@ do_render_file_view(System_Functions *system, View *view, Models *models, GUI_Sc
draw_string(system, target, font_id, item->text_field.string, x, y, text1_color); draw_string(system, target, font_id, item->text_field.string, x, y, text1_color);
}break; }break;
case UIType_ThemePreview: case UIType_ColorTheme:
{ {
Style *preview_style = &models->styles.styles[item->theme_preview.theme_index]; Style *style_preview = &models->styles.styles[item->color_theme.index];
u32 back = preview_style->main.back_color; u32 margin_color = style_get_margin_color(item->activation_level, style_preview);
u32 margin_color = style_get_margin_color(item->activation_level, preview_style); u32 back = style_preview->main.back_color;
u32 text_color = preview_style->main.default_color; u32 text_color = style_preview->main.default_color;
u32 keyword_color = preview_style->main.keyword_color; u32 keyword_color = style_preview->main.keyword_color;
u32 int_constant_color = preview_style->main.int_constant_color; u32 int_constant_color = style_preview->main.int_constant_color;
u32 comment_color = preview_style->main.comment_color; u32 comment_color = style_preview->main.comment_color;
f32_Rect inner = get_inner_rect(item_rect, 3); f32_Rect inner = get_inner_rect(item_rect, 3);
draw_rectangle(target, inner, back);
draw_margin(target, item_rect, inner, margin_color); draw_margin(target, item_rect, inner, margin_color);
i32 start_y = (i32)inner.y0; draw_rectangle(target, inner, back);
i32 start_x = (i32)inner.x0;
i32 end_y = (i32)inner.y1; i32 y = (i32)inner.y0;
i32 y = start_y; i32 x = (i32)inner.x0;
i32 x = start_x; String str = item->color_theme.string;
x = ceil32(draw_string(system, target, font_id, preview_style->name.str, x, y, text_color)); if (str.str == 0){
str = style_preview->name;
}
x = ceil32(draw_string(system, target, font_id, str, x, y, text_color));
i32 font_x = (i32)(inner.x1 - font_string_width(system, target, font_id, font_name));
if (font_x > x + 10){
draw_string(system, target, font_id, font_name, font_x, y, text_color);
}
i32 height = font.metrics->height; i32 height = font.metrics->height;
x = start_x; x = (i32)inner.x0;
y += height; y += height;
if (y + height <= end_y){
x = ceil32(draw_string(system, target, font_id, "if", x, y, keyword_color)); x = ceil32(draw_string(system, target, font_id, "if", x, y, keyword_color));
x = ceil32(draw_string(system, target, font_id, "(x < ", x, y, text_color)); x = ceil32(draw_string(system, target, font_id, "(x < ", x, y, text_color));
x = ceil32(draw_string(system, target, font_id, "0", x, y, int_constant_color)); x = ceil32(draw_string(system, target, font_id, "0", x, y, int_constant_color));
@ -366,12 +376,9 @@ do_render_file_view(System_Functions *system, View *view, Models *models, GUI_Sc
x = ceil32(draw_string(system, target, font_id, "; } ", x, y, text_color)); x = ceil32(draw_string(system, target, font_id, "; } ", x, y, text_color));
x = ceil32(draw_string(system, target, font_id, "// comment", x, y, comment_color)); x = ceil32(draw_string(system, target, font_id, "// comment", x, y, comment_color));
x = start_x; x = (i32)inner.x0;
y += height; y += height;
if (y + height <= end_y){
draw_string(system, target, font_id, "[] () {}; * -> +-/ <>= ! && || % ^", x, y, text_color); draw_string(system, target, font_id, "[] () {}; * -> +-/ <>= ! && || % ^", x, y, text_color);
}
}
}break; }break;
} }
} }

View File

@ -66,8 +66,13 @@ working_set_extend_memory(Working_Set *working_set, Editing_File *new_space, i16
} }
internal Editing_File* internal Editing_File*
working_set_alloc(Working_Set *working_set){ working_set_alloc_always(Working_Set *working_set, General_Memory *general, Lifetime_Allocator *lifetime_allocator){
Editing_File *result = 0; Editing_File *result = 0;
if (working_set->file_count == working_set->file_max && working_set->array_count < working_set->array_max){
i16 new_count = (i16)clamp_top(working_set->file_max, max_i16);
Editing_File *new_chunk = gen_array(general, Editing_File, new_count);
working_set_extend_memory(working_set, new_chunk, new_count);
}
if (working_set->file_count < working_set->file_max){ if (working_set->file_count < working_set->file_max){
File_Node *node = working_set->free_sentinel.next; File_Node *node = working_set->free_sentinel.next;
@ -83,31 +88,24 @@ working_set_alloc(Working_Set *working_set){
result->settings.minimum_base_display_width = working_set->default_minimum_base_display_width; result->settings.minimum_base_display_width = working_set->default_minimum_base_display_width;
result->settings.wrap_indicator = WrapIndicator_Show_At_Wrap_Edge; result->settings.wrap_indicator = WrapIndicator_Show_At_Wrap_Edge;
init_file_markers_state(&result->markers); init_file_markers_state(&result->markers);
dynamic_variables_block_init(general, &result->dynamic_vars);
result->lifetime_object = lifetime_alloc_object(general, lifetime_allocator, LifetimeObject_File, result);
++working_set->file_count; ++working_set->file_count;
} }
return(result); return(result);
} }
internal Editing_File*
working_set_alloc_always(Working_Set *working_set, General_Memory *general){
Editing_File *result = 0;
if (working_set->file_count == working_set->file_max && working_set->array_count < working_set->array_max){
i16 new_count = (i16)clamp_top(working_set->file_max, max_i16);
Editing_File *new_chunk = gen_array(general, Editing_File, new_count);
working_set_extend_memory(working_set, new_chunk, new_count);
}
result = working_set_alloc(working_set);
return(result);
}
inline void inline void
working_set_free_file(General_Memory *general, Working_Set *working_set, Editing_File *file){ working_set_free_file(General_Memory *general, Lifetime_Allocator *lifetime_allocator, Working_Set *working_set, Editing_File *file){
if (working_set->sync_check_iter == &file->node){ if (working_set->sync_check_iter == &file->node){
working_set->sync_check_iter = working_set->sync_check_iter->next; working_set->sync_check_iter = working_set->sync_check_iter->next;
} }
file->is_dummy = 1; dynamic_variables_block_free(general, &file->dynamic_vars);
lifetime_free_object(general, lifetime_allocator, file->lifetime_object);
file->is_dummy = true;
dll_remove(&file->node); dll_remove(&file->node);
dll_insert(&working_set->free_sentinel, &file->node); dll_insert(&working_set->free_sentinel, &file->node);
--working_set->file_count; --working_set->file_count;
@ -581,7 +579,7 @@ open_file(System_Functions *system, Models *models, String filename){
General_Memory *general = &mem->general; General_Memory *general = &mem->general;
Partition *part = &mem->part; Partition *part = &mem->part;
file = working_set_alloc_always(working_set, general); file = working_set_alloc_always(working_set, general, &models->lifetime_allocator);
buffer_bind_file(system, general, working_set, file, canon_name.name); buffer_bind_file(system, general, working_set, file, canon_name.name);
buffer_bind_name(models, general, part, working_set, file, front_of_directory(filename)); buffer_bind_name(models, general, part, working_set, file, front_of_directory(filename));

View File

@ -930,8 +930,8 @@ win32_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
Control_Keys *controls = &win32vars.input_chunk.pers.controls; Control_Keys *controls = &win32vars.input_chunk.pers.controls;
b8 *control_keys = win32vars.input_chunk.pers.control_keys; b8 *control_keys = win32vars.input_chunk.pers.control_keys;
b8 down = ((lParam & Bit_31)?(0):(1)); b8 down = ((lParam & bit_31)?(0):(1));
b8 is_right = ((lParam & Bit_24)?(1):(0)); b8 is_right = ((lParam & bit_24)?(1):(0));
if (wParam != 255){ if (wParam != 255){
switch (wParam){ switch (wParam){
@ -970,7 +970,7 @@ win32_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
default: default:
{ {
b8 current_state = ((lParam & Bit_31)?(0):(1)); b8 current_state = ((lParam & bit_31)?(0):(1));
if (current_state){ if (current_state){
Key_Code key = keycode_lookup_table[(u8)wParam]; Key_Code key = keycode_lookup_table[(u8)wParam];

View File

@ -33,13 +33,13 @@ The following bindings apply in all situations.
\ITEM \STYLE{code} <ctrl ,> \END Change the currently active panel, moving to the panel with the next highest view_id. \ITEM \STYLE{code} <ctrl ,> \END Change the currently active panel, moving to the panel with the next highest view_id.
\ITEM \STYLE{code} <ctrl <> \END Change the currently active panel, moving to the panel with the next lowest view_id. \ITEM \STYLE{code} <ctrl <> \END Change the currently active panel, moving to the panel with the next lowest view_id.
\ITEM \STYLE{code} <ctrl n> \END Interactively creates a new file. \ITEM \STYLE{code} <ctrl n> \END Interactively creates a new file.
\ITEM \STYLE{code} <ctrl o> \END Interactively opens or creates a new file. \ITEM \STYLE{code} <ctrl o> \END Interactively open a file out of the file system.
\ITEM \STYLE{code} <alt o> \END Interactively opens a file in the other panel. \ITEM \STYLE{code} <alt o> \END Interactively opens a file in the other panel.
\ITEM \STYLE{code} <ctrl k> \END Interactively kill an open buffer. \ITEM \STYLE{code} <ctrl k> \END Interactively kill an open buffer.
\ITEM \STYLE{code} <ctrl i> \END Interactively switch to an open buffer. \ITEM \STYLE{code} <ctrl i> \END Interactively switch to an open buffer.
\ITEM \STYLE{code} <ctrl h> \END Changes 4coder's hot directory to the root directory of the currently loaded project. With no loaded project nothing hapepns. \ITEM \STYLE{code} <ctrl h> \END Changes 4coder's hot directory to the root directory of the currently loaded project. With no loaded project nothing hapepns.
\ITEM \STYLE{code} <ctrl S> \END Saves all buffers marked dirty (showing the '*' indicator). \ITEM \STYLE{code} <ctrl S> \END Saves all buffers marked dirty (showing the '*' indicator).
\ITEM \STYLE{code} <alt c> \END Opens the 4coder colors and fonts selector menu. \ITEM \STYLE{code} <alt c> \END Opens the 4coder theme selector list.
\ITEM \STYLE{code} <alt .> \END If the special build panel is open, makes the build panel the active panel. \ITEM \STYLE{code} <alt .> \END If the special build panel is open, makes the build panel the active panel.
\ITEM \STYLE{code} <alt ,> \END If the special build panel is open, closes it. \ITEM \STYLE{code} <alt ,> \END If the special build panel is open, closes it.
\ITEM \STYLE{code} <alt n> \END If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, and does not skip sub jump locations. \ITEM \STYLE{code} <alt n> \END If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, and does not skip sub jump locations.
@ -185,12 +185,12 @@ The following commands only apply in files where the lexer (syntax highlighting)
\SECTION{default-lister-ui-map} \SECTION{default-lister-ui-map}
These commands apply in 'lister mode' such as when you open a file. These commands apply in 'lister mode' such as when you open a file.
\LIST \LIST
\ITEM \STYLE{code} <any character> \END A list mode command that inserts a new character to the text field. \ITEM \STYLE{code} <any character> \END A lister mode command that dispatches to the lister's write character handler.
\ITEM \STYLE{code} <escape> \END A list mode command that quits the list without executing any actions. \ITEM \STYLE{code} <escape> \END A lister mode command that quits the list without executing any actions.
\ITEM \STYLE{code} <return> \END A list mode command that activates the list's action on the highlighted item. \ITEM \STYLE{code} <return> \END A lister mode command that activates the list's action on the highlighted item.
\ITEM \STYLE{code} <tab> \END A list mode command that activates the list's action on the highlighted item. \ITEM \STYLE{code} <tab> \END A lister mode command that activates the list's action on the highlighted item.
\ITEM \STYLE{code} <backspace> \END A list mode command that backspaces one character from the text field. \ITEM \STYLE{code} <backspace> \END A lister mode command that dispatches to the lister's backspace text field handler.
\ITEM \STYLE{code} <up> \END A list mode command that moves the highlighted item one up in the list. \ITEM \STYLE{code} <up> \END A lister mode command that dispatches to the lister's navigate up handler.
\ITEM \STYLE{code} <page up> \END A list mode command that moves the highlighted item one up in the list. \ITEM \STYLE{code} <page up> \END A lister mode command that dispatches to the lister's navigate up handler.
\ITEM \STYLE{code} <down> \END A list mode command that moves the highlighted item one down in the list. \ITEM \STYLE{code} <down> \END A lister mode command that dispatches to the lister's navigate down handler.
\ITEM \STYLE{code} <page down> \END A list mode command that moves the highlighted item one down in the list. \ITEM \STYLE{code} <page down> \END A lister mode command that dispatches to the lister's navigate down handler.

View File

@ -0,0 +1,38 @@
name = "sunlight";
Back = 0xFFDFD5D0;
Margin = 0xFFC7C7C7;
Margin_Hover = 0xFFBFBFBF;
Margin_Active = 0xFFB7B7B7;
List_Item = Margin;
List_Item_Hover = Margin_Hover;
List_Item_Active = Margin_Active;
Cursor = 0xFF222222;
At_Cursor = Back;
Mark = 0xFF797979;
Highlight = 0xFFFF9979;
At_Highlight = Back;
Default = 0xFF47474F;
Comment = 0xFF953FFF;
Keyword = 0xFF002255;
Str_Constant = Keyword;
Char_Constant = Str_Constant;
Int_Constant = Str_Constant;
Float_Constant = Str_Constant;
Bool_Constant = Str_Constant;
Include = Str_Constant;
Preproc = 0xFF000000;
Special_Character = 0xFFFF00FF;
Ghost_Character = 0xFF929292;
Paste = 0xFFFF0000;
Undo = 0xFF00FF00;
Highlight_Junk = 0xFFB7DFDF;
Highlight_White = 0xFFC7C7C7;
Bar = 0xFF909090;
Bar_Active = 0xFFC1C1C1;
Base = 0xFFFFFFFF;
Pop1 = 0xFFFF4F2F;
Pop2 = 0xFF00C5FF;