Progress towards a new dynamic scope API
This commit is contained in:
commit
0f23470717
|
@ -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.) */
|
||||
UNION Range{
|
||||
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;
|
||||
/* 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;
|
||||
};
|
||||
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;
|
||||
/* 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;
|
||||
};
|
||||
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.) */
|
||||
|
@ -688,16 +699,29 @@ STRUCT Query_Bar{
|
|||
String string;
|
||||
};
|
||||
|
||||
/* DOC(This feature is not implemented.) */
|
||||
STRUCT Event_Message{
|
||||
/* DOC(This feature is not implemented.) */
|
||||
int32_t type;
|
||||
TYPEDEF int32_t Managed_Variable_ID;
|
||||
static Managed_Variable_ID ManagedVariableIndex_ERROR = -1;
|
||||
|
||||
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){
|
||||
UIType_Option = 0,
|
||||
UIType_TextField = 1,
|
||||
UIType_ThemePreview = 2,
|
||||
UIType_ColorTheme = 2,
|
||||
};
|
||||
|
||||
ENUM(int8_t, UI_Activation_Level){
|
||||
|
@ -727,8 +751,9 @@ STRUCT UI_Item{
|
|||
String string;
|
||||
} text_field;
|
||||
struct{
|
||||
int32_t theme_index;
|
||||
} theme_preview;
|
||||
String string;
|
||||
int32_t index;
|
||||
} color_theme;
|
||||
};
|
||||
void *user_data;
|
||||
i32_Rect rectangle;
|
||||
|
@ -840,7 +865,7 @@ STRUCT Buffer_Batch_Edit{
|
|||
TYPEDEF void Custom_Command_Function(struct Application_Links *app);
|
||||
|
||||
#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
|
||||
|
||||
#if !defined(META_PASS)
|
||||
|
|
|
@ -974,16 +974,28 @@ CUSTOM_DOC("Queries the user for a string, and incrementally replace every occur
|
|||
|
||||
////////////////////////////////
|
||||
|
||||
CUSTOM_COMMAND_SIG(save_all_dirty_buffers)
|
||||
CUSTOM_DOC("Saves all buffers marked dirty (showing the '*' indicator).")
|
||||
{
|
||||
static void
|
||||
save_all_dirty_buffers_with_postfix(Application_Links *app, String postfix){
|
||||
for (Buffer_Summary buffer = get_buffer_first(app, AccessOpen);
|
||||
buffer.exists;
|
||||
get_buffer_next(app, &buffer, AccessOpen)){
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
|
@ -1462,20 +1474,31 @@ CUSTOM_DOC("Saves the current buffer.")
|
|||
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_DOC("Interactively opens a file in the other panel.")
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
if (count > 0){
|
||||
View_Summary view = get_active_view(app, access);
|
||||
|
||||
view_set_variable(app, &view, view_next_rewrite_loc, RewritePaste);
|
||||
Dynamic_Scope scope = view_get_dynamic_scope(app, view.view_id);
|
||||
managed_variable_set(app, scope, view_next_rewrite_loc, RewritePaste);
|
||||
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);
|
||||
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);
|
||||
if (count > 0){
|
||||
View_Summary view = get_active_view(app, access);
|
||||
Dynamic_Scope scope = view_get_dynamic_scope(app, view.view_id);
|
||||
|
||||
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){
|
||||
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;
|
||||
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;
|
||||
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);
|
||||
char *str = 0;
|
||||
|
|
|
@ -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);
|
||||
for (uint32_t i = 0; i < list.count; ++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);
|
||||
if (!match(file_extension(info_file_name), "4coder")) continue;
|
||||
char file_name_space[512];
|
||||
String file_name = make_fixed_width_string(file_name_space);
|
||||
copy(&file_name, path);
|
||||
|
|
|
@ -56,13 +56,15 @@ new_view_settings(Application_Links *app, View_Summary *view){
|
|||
|
||||
static void
|
||||
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
|
||||
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;
|
||||
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);
|
||||
}
|
||||
|
||||
|
@ -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_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_next_rewrite_loc = create_view_variable(app, "DEFAULT.next_rewrite", (uint64_t)0);
|
||||
view_paste_index_loc = create_view_variable(app, "DEFAULT.paste_index" , (uint64_t)0);
|
||||
view_is_passive_loc = create_view_variable(app, "DEFAULT.is_passive" , (uint64_t)false);
|
||||
view_rewrite_loc = managed_variable_create_or_get_id(app, "DEFAULT.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 = managed_variable_create_or_get_id(app, "DEFAULT.paste_index" , (uint64_t)0);
|
||||
view_is_passive_loc = managed_variable_create_or_get_id(app, "DEFAULT.is_passive" , (uint64_t)false);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
@ -23,11 +23,28 @@ enum Rewrite_Type{
|
|||
|
||||
////////////////////////////////
|
||||
|
||||
struct ID_Based_Jump_Location{
|
||||
int32_t buffer_id;
|
||||
struct ID_Line_Column_Jump_Location{
|
||||
Buffer_ID buffer_id;
|
||||
int32_t line;
|
||||
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;
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
|
||||
|
|
|
@ -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 int32_t view_rewrite_loc = 0;
|
||||
static int32_t view_next_rewrite_loc = 0;
|
||||
static int32_t view_paste_index_loc = 0;
|
||||
static int32_t view_is_passive_loc = 0;
|
||||
static Managed_Variable_ID view_rewrite_loc = 0;
|
||||
static Managed_Variable_ID view_next_rewrite_loc = 0;
|
||||
static Managed_Variable_ID view_paste_index_loc = 0;
|
||||
static Managed_Variable_ID view_is_passive_loc = 0;
|
||||
|
||||
|
||||
static char out_buffer_space[1024];
|
||||
|
@ -44,7 +44,7 @@ static char hot_directory_space[1024];
|
|||
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};
|
||||
|
|
|
@ -42,12 +42,13 @@ START_HOOK_SIG(default_start){
|
|||
// also relies on this particular command caller hook.
|
||||
COMMAND_CALLER_HOOK(default_command_caller){
|
||||
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);
|
||||
uint64_t next_rewrite = 0;
|
||||
view_get_variable(app, &view, view_next_rewrite_loc, &next_rewrite);
|
||||
view_set_variable(app, &view, view_rewrite_loc, next_rewrite);
|
||||
managed_variable_get(app, scope, view_next_rewrite_loc, &next_rewrite);
|
||||
managed_variable_set(app, scope, view_rewrite_loc, next_rewrite);
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
|
|
@ -30,7 +30,6 @@
|
|||
#include "4coder_auto_indent.h"
|
||||
#include "4coder_search.h"
|
||||
#include "4coder_build_commands.h"
|
||||
#include "4coder_jumping.h"
|
||||
#include "4coder_jump_sticky.h"
|
||||
#include "4coder_project_commands.h"
|
||||
#include "4coder_function_list.h"
|
||||
|
|
|
@ -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_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_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_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)
|
||||
|
@ -41,6 +42,7 @@ struct Application_Links;
|
|||
#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_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_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)
|
||||
|
@ -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_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 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_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_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_COMMAND_INPUT_SIG(n) User_Input 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 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 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 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 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)
|
||||
|
@ -118,6 +127,7 @@ typedef BUFFER_GET_MARKERS_SIG(Buffer_Get_Markers_Function);
|
|||
typedef BUFFER_REMOVE_MARKERS_SIG(Buffer_Remove_Markers_Function);
|
||||
typedef BUFFER_GET_SETTING_SIG(Buffer_Get_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_READ_TOKENS_SIG(Buffer_Read_Tokens_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 VIEW_GET_SETTING_SIG(View_Get_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_COMPUTE_CURSOR_SIG(View_Compute_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_BUFFER_SIG(View_Set_Buffer_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_END_UI_MODE_SIG(View_End_UI_Mode_Function);
|
||||
typedef VIEW_SET_UI_SIG(View_Set_UI_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_COMMAND_INPUT_SIG(Get_Command_Input_Function);
|
||||
typedef GET_MOUSE_STATE_SIG(Get_Mouse_State_Function);
|
||||
typedef START_QUERY_BAR_SIG(Start_Query_Bar_Function);
|
||||
typedef END_QUERY_BAR_SIG(End_Query_Bar_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 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 SET_GLOBAL_FACE_SIG(Set_Global_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_Get_Setting_Function *buffer_get_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_Read_Tokens_Function *buffer_read_tokens;
|
||||
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;
|
||||
View_Get_Setting_Function *view_get_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_Compute_Cursor_Function *view_compute_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_Buffer_Function *view_set_buffer;
|
||||
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_End_UI_Mode_Function *view_end_ui_mode;
|
||||
View_Set_UI_Function *view_set_ui;
|
||||
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_Command_Input_Function *get_command_input;
|
||||
Get_Mouse_State_Function *get_mouse_state;
|
||||
Start_Query_Bar_Function *start_query_bar;
|
||||
End_Query_Bar_Function *end_query_bar;
|
||||
Print_Message_Function *print_message;
|
||||
Get_Theme_Count_Function *get_theme_count;
|
||||
Get_Theme_Name_Function *get_theme_name;
|
||||
Create_Theme_Function *create_theme;
|
||||
Change_Theme_Function *change_theme;
|
||||
Change_Theme_By_Index_Function *change_theme_by_index;
|
||||
Get_Largest_Face_ID_Function *get_largest_face_id;
|
||||
Set_Global_Face_Function *set_global_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_Get_Setting_Function *buffer_get_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_Read_Tokens_Function *buffer_read_tokens_;
|
||||
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_;
|
||||
View_Get_Setting_Function *view_get_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_Compute_Cursor_Function *view_compute_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_Buffer_Function *view_set_buffer_;
|
||||
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_End_UI_Mode_Function *view_end_ui_mode_;
|
||||
View_Set_UI_Function *view_set_ui_;
|
||||
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_Command_Input_Function *get_command_input_;
|
||||
Get_Mouse_State_Function *get_mouse_state_;
|
||||
Start_Query_Bar_Function *start_query_bar_;
|
||||
End_Query_Bar_Function *end_query_bar_;
|
||||
Print_Message_Function *print_message_;
|
||||
Get_Theme_Count_Function *get_theme_count_;
|
||||
Get_Theme_Name_Function *get_theme_name_;
|
||||
Create_Theme_Function *create_theme_;
|
||||
Change_Theme_Function *change_theme_;
|
||||
Change_Theme_By_Index_Function *change_theme_by_index_;
|
||||
Get_Largest_Face_ID_Function *get_largest_face_id_;
|
||||
Set_Global_Face_Function *set_global_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_get_setting_ = Buffer_Get_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_read_tokens_ = Buffer_Read_Tokens;\
|
||||
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->view_get_setting_ = View_Get_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_compute_cursor_ = View_Compute_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_buffer_ = View_Set_Buffer;\
|
||||
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_end_ui_mode_ = View_End_UI_Mode;\
|
||||
app_links->view_set_ui_ = View_Set_UI;\
|
||||
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_command_input_ = Get_Command_Input;\
|
||||
app_links->get_mouse_state_ = Get_Mouse_State;\
|
||||
app_links->start_query_bar_ = Start_Query_Bar;\
|
||||
app_links->end_query_bar_ = End_Query_Bar;\
|
||||
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->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->set_global_face_ = Set_Global_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_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 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 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));}
|
||||
|
@ -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 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 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_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));}
|
||||
|
@ -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_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 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_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 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_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 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 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 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 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));}
|
||||
|
@ -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_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 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 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));}
|
||||
|
@ -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 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 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_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));}
|
||||
|
@ -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_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 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_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 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_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 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 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 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 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));}
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
#define command_id(c) (fcoder_metacmd_ID_##c)
|
||||
#define command_metadata(c) (&fcoder_metacmd_table[command_id(c)])
|
||||
#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)
|
||||
#define PROC_LINKS(x,y) x
|
||||
#else
|
||||
|
@ -146,6 +146,7 @@ CUSTOM_COMMAND_SIG(query_replace);
|
|||
CUSTOM_COMMAND_SIG(query_replace_identifier);
|
||||
CUSTOM_COMMAND_SIG(query_replace_selection);
|
||||
CUSTOM_COMMAND_SIG(redo);
|
||||
CUSTOM_COMMAND_SIG(reload_themes);
|
||||
CUSTOM_COMMAND_SIG(remap_interactive);
|
||||
CUSTOM_COMMAND_SIG(rename_file_query);
|
||||
CUSTOM_COMMAND_SIG(reopen);
|
||||
|
@ -221,8 +222,8 @@ char *source_name;
|
|||
int32_t source_name_len;
|
||||
int32_t line_number;
|
||||
};
|
||||
static Command_Metadata fcoder_metacmd_table[201] = {
|
||||
{ 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 },
|
||||
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, 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_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 },
|
||||
|
@ -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_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(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_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, 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, 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(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 },
|
||||
|
@ -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(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_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_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_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, 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_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_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 },
|
||||
|
@ -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_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_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_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_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, 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_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_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_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, 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_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_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_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_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, 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_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_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_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, 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_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 },
|
||||
|
@ -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(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(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_new, 0), "interactive_new", 15, "Interactively creates a new file.", 33, "w:\\4ed\\code\\4coder_lists.cpp", 31, 710 },
|
||||
{ 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_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_switch_buffer, 0), "interactive_switch_buffer", 25, "Interactively switch to an open buffer.", 39, "w:\\4ed\\code\\4coder_lists.cpp", 31, 590 },
|
||||
{ PROC_LINKS(kill_buffer, 0), "kill_buffer", 11, "Kills the current buffer.", 25, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1432 },
|
||||
{ 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, 749 },
|
||||
{ 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, 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, 629 },
|
||||
{ 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(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 },
|
||||
|
@ -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__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(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_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_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_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_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, 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_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(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_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_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_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, 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_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_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_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_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, 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, 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_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_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_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_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_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, 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, 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_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_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_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(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(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_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(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(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(reopen, 0), "reopen", 6, "Reopen the current buffer from the hard drive.", 46, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1453 },
|
||||
{ PROC_LINKS(redo, 0), "redo", 4, "Advances forewards through the undo history.", 44, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1459 },
|
||||
{ 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(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(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(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(save, 0), "save", 4, "Saves the current buffer.", 25, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1459 },
|
||||
{ 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_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, 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, 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, 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(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 },
|
||||
|
@ -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(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(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(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(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, 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_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_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_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_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(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(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, 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(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 },
|
||||
|
@ -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_selection = 135;
|
||||
static int32_t fcoder_metacmd_ID_redo = 136;
|
||||
static int32_t fcoder_metacmd_ID_remap_interactive = 137;
|
||||
static int32_t fcoder_metacmd_ID_rename_file_query = 138;
|
||||
static int32_t fcoder_metacmd_ID_reopen = 139;
|
||||
static int32_t fcoder_metacmd_ID_replace_in_range = 140;
|
||||
static int32_t fcoder_metacmd_ID_reverse_search = 141;
|
||||
static int32_t fcoder_metacmd_ID_reverse_search_identifier = 142;
|
||||
static int32_t fcoder_metacmd_ID_save = 143;
|
||||
static int32_t fcoder_metacmd_ID_save_all_dirty_buffers = 144;
|
||||
static int32_t fcoder_metacmd_ID_save_to_query = 145;
|
||||
static int32_t fcoder_metacmd_ID_scope_absorb_down = 146;
|
||||
static int32_t fcoder_metacmd_ID_search = 147;
|
||||
static int32_t fcoder_metacmd_ID_search_identifier = 148;
|
||||
static int32_t fcoder_metacmd_ID_seek_alphanumeric_left = 149;
|
||||
static int32_t fcoder_metacmd_ID_seek_alphanumeric_or_camel_left = 150;
|
||||
static int32_t fcoder_metacmd_ID_seek_alphanumeric_or_camel_right = 151;
|
||||
static int32_t fcoder_metacmd_ID_seek_alphanumeric_right = 152;
|
||||
static int32_t fcoder_metacmd_ID_seek_beginning_of_line = 153;
|
||||
static int32_t fcoder_metacmd_ID_seek_beginning_of_textual_line = 154;
|
||||
static int32_t fcoder_metacmd_ID_seek_end_of_line = 155;
|
||||
static int32_t fcoder_metacmd_ID_seek_end_of_textual_line = 156;
|
||||
static int32_t fcoder_metacmd_ID_seek_token_left = 157;
|
||||
static int32_t fcoder_metacmd_ID_seek_token_right = 158;
|
||||
static int32_t fcoder_metacmd_ID_seek_white_or_token_left = 159;
|
||||
static int32_t fcoder_metacmd_ID_seek_white_or_token_right = 160;
|
||||
static int32_t fcoder_metacmd_ID_seek_whitespace_down = 161;
|
||||
static int32_t fcoder_metacmd_ID_seek_whitespace_down_end_line = 162;
|
||||
static int32_t fcoder_metacmd_ID_seek_whitespace_left = 163;
|
||||
static int32_t fcoder_metacmd_ID_seek_whitespace_right = 164;
|
||||
static int32_t fcoder_metacmd_ID_seek_whitespace_up = 165;
|
||||
static int32_t fcoder_metacmd_ID_seek_whitespace_up_end_line = 166;
|
||||
static int32_t fcoder_metacmd_ID_select_all = 167;
|
||||
static int32_t fcoder_metacmd_ID_set_bindings_choose = 168;
|
||||
static int32_t fcoder_metacmd_ID_set_bindings_default = 169;
|
||||
static int32_t fcoder_metacmd_ID_set_bindings_mac_default = 170;
|
||||
static int32_t fcoder_metacmd_ID_set_mark = 171;
|
||||
static int32_t fcoder_metacmd_ID_setup_build_bat = 172;
|
||||
static int32_t fcoder_metacmd_ID_setup_build_bat_and_sh = 173;
|
||||
static int32_t fcoder_metacmd_ID_setup_build_sh = 174;
|
||||
static int32_t fcoder_metacmd_ID_setup_new_project = 175;
|
||||
static int32_t fcoder_metacmd_ID_show_filebar = 176;
|
||||
static int32_t fcoder_metacmd_ID_show_scrollbar = 177;
|
||||
static int32_t fcoder_metacmd_ID_snipe_token_or_word = 178;
|
||||
static int32_t fcoder_metacmd_ID_snipe_token_or_word_right = 179;
|
||||
static int32_t fcoder_metacmd_ID_suppress_mouse = 180;
|
||||
static int32_t fcoder_metacmd_ID_swap_buffers_between_panels = 181;
|
||||
static int32_t fcoder_metacmd_ID_to_lowercase = 182;
|
||||
static int32_t fcoder_metacmd_ID_to_uppercase = 183;
|
||||
static int32_t fcoder_metacmd_ID_toggle_filebar = 184;
|
||||
static int32_t fcoder_metacmd_ID_toggle_fullscreen = 185;
|
||||
static int32_t fcoder_metacmd_ID_toggle_line_wrap = 186;
|
||||
static int32_t fcoder_metacmd_ID_toggle_mouse = 187;
|
||||
static int32_t fcoder_metacmd_ID_toggle_show_whitespace = 188;
|
||||
static int32_t fcoder_metacmd_ID_toggle_virtual_whitespace = 189;
|
||||
static int32_t fcoder_metacmd_ID_undo = 190;
|
||||
static int32_t fcoder_metacmd_ID_view_buffer_other_panel = 191;
|
||||
static int32_t fcoder_metacmd_ID_word_complete = 192;
|
||||
static int32_t fcoder_metacmd_ID_write_and_auto_tab = 193;
|
||||
static int32_t fcoder_metacmd_ID_write_block = 194;
|
||||
static int32_t fcoder_metacmd_ID_write_character = 195;
|
||||
static int32_t fcoder_metacmd_ID_write_hack = 196;
|
||||
static int32_t fcoder_metacmd_ID_write_note = 197;
|
||||
static int32_t fcoder_metacmd_ID_write_todo = 198;
|
||||
static int32_t fcoder_metacmd_ID_write_underscore = 199;
|
||||
static int32_t fcoder_metacmd_ID_write_zero_struct = 200;
|
||||
static int32_t fcoder_metacmd_ID_reload_themes = 137;
|
||||
static int32_t fcoder_metacmd_ID_remap_interactive = 138;
|
||||
static int32_t fcoder_metacmd_ID_rename_file_query = 139;
|
||||
static int32_t fcoder_metacmd_ID_reopen = 140;
|
||||
static int32_t fcoder_metacmd_ID_replace_in_range = 141;
|
||||
static int32_t fcoder_metacmd_ID_reverse_search = 142;
|
||||
static int32_t fcoder_metacmd_ID_reverse_search_identifier = 143;
|
||||
static int32_t fcoder_metacmd_ID_save = 144;
|
||||
static int32_t fcoder_metacmd_ID_save_all_dirty_buffers = 145;
|
||||
static int32_t fcoder_metacmd_ID_save_to_query = 146;
|
||||
static int32_t fcoder_metacmd_ID_scope_absorb_down = 147;
|
||||
static int32_t fcoder_metacmd_ID_search = 148;
|
||||
static int32_t fcoder_metacmd_ID_search_identifier = 149;
|
||||
static int32_t fcoder_metacmd_ID_seek_alphanumeric_left = 150;
|
||||
static int32_t fcoder_metacmd_ID_seek_alphanumeric_or_camel_left = 151;
|
||||
static int32_t fcoder_metacmd_ID_seek_alphanumeric_or_camel_right = 152;
|
||||
static int32_t fcoder_metacmd_ID_seek_alphanumeric_right = 153;
|
||||
static int32_t fcoder_metacmd_ID_seek_beginning_of_line = 154;
|
||||
static int32_t fcoder_metacmd_ID_seek_beginning_of_textual_line = 155;
|
||||
static int32_t fcoder_metacmd_ID_seek_end_of_line = 156;
|
||||
static int32_t fcoder_metacmd_ID_seek_end_of_textual_line = 157;
|
||||
static int32_t fcoder_metacmd_ID_seek_token_left = 158;
|
||||
static int32_t fcoder_metacmd_ID_seek_token_right = 159;
|
||||
static int32_t fcoder_metacmd_ID_seek_white_or_token_left = 160;
|
||||
static int32_t fcoder_metacmd_ID_seek_white_or_token_right = 161;
|
||||
static int32_t fcoder_metacmd_ID_seek_whitespace_down = 162;
|
||||
static int32_t fcoder_metacmd_ID_seek_whitespace_down_end_line = 163;
|
||||
static int32_t fcoder_metacmd_ID_seek_whitespace_left = 164;
|
||||
static int32_t fcoder_metacmd_ID_seek_whitespace_right = 165;
|
||||
static int32_t fcoder_metacmd_ID_seek_whitespace_up = 166;
|
||||
static int32_t fcoder_metacmd_ID_seek_whitespace_up_end_line = 167;
|
||||
static int32_t fcoder_metacmd_ID_select_all = 168;
|
||||
static int32_t fcoder_metacmd_ID_set_bindings_choose = 169;
|
||||
static int32_t fcoder_metacmd_ID_set_bindings_default = 170;
|
||||
static int32_t fcoder_metacmd_ID_set_bindings_mac_default = 171;
|
||||
static int32_t fcoder_metacmd_ID_set_mark = 172;
|
||||
static int32_t fcoder_metacmd_ID_setup_build_bat = 173;
|
||||
static int32_t fcoder_metacmd_ID_setup_build_bat_and_sh = 174;
|
||||
static int32_t fcoder_metacmd_ID_setup_build_sh = 175;
|
||||
static int32_t fcoder_metacmd_ID_setup_new_project = 176;
|
||||
static int32_t fcoder_metacmd_ID_show_filebar = 177;
|
||||
static int32_t fcoder_metacmd_ID_show_scrollbar = 178;
|
||||
static int32_t fcoder_metacmd_ID_snipe_token_or_word = 179;
|
||||
static int32_t fcoder_metacmd_ID_snipe_token_or_word_right = 180;
|
||||
static int32_t fcoder_metacmd_ID_suppress_mouse = 181;
|
||||
static int32_t fcoder_metacmd_ID_swap_buffers_between_panels = 182;
|
||||
static int32_t fcoder_metacmd_ID_to_lowercase = 183;
|
||||
static int32_t fcoder_metacmd_ID_to_uppercase = 184;
|
||||
static int32_t fcoder_metacmd_ID_toggle_filebar = 185;
|
||||
static int32_t fcoder_metacmd_ID_toggle_fullscreen = 186;
|
||||
static int32_t fcoder_metacmd_ID_toggle_line_wrap = 187;
|
||||
static int32_t fcoder_metacmd_ID_toggle_mouse = 188;
|
||||
static int32_t fcoder_metacmd_ID_toggle_show_whitespace = 189;
|
||||
static int32_t fcoder_metacmd_ID_toggle_virtual_whitespace = 190;
|
||||
static int32_t fcoder_metacmd_ID_undo = 191;
|
||||
static int32_t fcoder_metacmd_ID_view_buffer_other_panel = 192;
|
||||
static int32_t fcoder_metacmd_ID_word_complete = 193;
|
||||
static int32_t fcoder_metacmd_ID_write_and_auto_tab = 194;
|
||||
static int32_t fcoder_metacmd_ID_write_block = 195;
|
||||
static int32_t fcoder_metacmd_ID_write_character = 196;
|
||||
static int32_t fcoder_metacmd_ID_write_hack = 197;
|
||||
static int32_t fcoder_metacmd_ID_write_note = 198;
|
||||
static int32_t fcoder_metacmd_ID_write_todo = 199;
|
||||
static int32_t fcoder_metacmd_ID_write_underscore = 200;
|
||||
static int32_t fcoder_metacmd_ID_write_zero_struct = 201;
|
||||
#endif
|
||||
|
|
|
@ -44,8 +44,10 @@ struct Bind_Buffer{
|
|||
#endif
|
||||
#define PtrDif(a,b) ((uint8_t*)(a) - (uint8_t*)(b))
|
||||
#define PtrAsInt(a) PtrDif(a,0)
|
||||
#define HandleAsU64(a) (uint64_t)(PtrAsInt(a))
|
||||
#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)
|
||||
|
||||
#if !defined(max_f32)
|
||||
inline float
|
||||
|
@ -86,8 +88,8 @@ struct File_Name_Data{
|
|||
struct File_Name_Path_Data{
|
||||
String file_name;
|
||||
String path;
|
||||
String data;
|
||||
};
|
||||
String data;
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
|
||||
|
@ -95,8 +97,8 @@ struct Buffer_Rect{
|
|||
int32_t char0;
|
||||
int32_t line0;
|
||||
int32_t char1;
|
||||
int32_t line1;
|
||||
};
|
||||
int32_t line1;
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
|
||||
|
|
|
@ -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);
|
||||
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)){
|
||||
change_active_panel(app);
|
||||
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);
|
||||
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)){
|
||||
View_Summary target_view = view;
|
||||
|
||||
|
|
|
@ -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
|
||||
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){
|
||||
Buffer_Summary buffer = get_buffer(app, buffer_id, AccessAll);
|
||||
|
||||
Temp_Memory temp = begin_temp_memory(part);
|
||||
ID_Based_Jump_Location *location_list = (ID_Based_Jump_Location*)partition_current(part);
|
||||
uint32_t location_count = 0;
|
||||
Sticky_Jump_Array jumps = parse_buffer_to_jump_array(app, part, buffer);
|
||||
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 = 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;
|
||||
|
||||
uint32_t prev_jump_count = 0;
|
||||
for (int32_t this_jump_line = 1;; ++this_jump_line){
|
||||
bool32 output_jump = false;
|
||||
Name_Based_Jump_Location location = {0};
|
||||
bool32 is_sub_error = false;
|
||||
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;
|
||||
|
||||
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){
|
||||
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));
|
||||
|
||||
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;
|
||||
|
||||
Marker *markers = push_array(part, Marker, location_count);
|
||||
for (uint32_t i = 0; i < location_count; ++i){
|
||||
ID_Based_Jump_Location *write_loc = &location_list[i];
|
||||
Partial_Cursor cursor = {0};
|
||||
Buffer_Seek seek = seek_line_char(write_loc->line, write_loc->column);
|
||||
if (buffer_compute_cursor(app, &location_buffer, seek, &cursor)){
|
||||
markers[i].pos = cursor.pos;
|
||||
markers[i].lean_right = false;
|
||||
}
|
||||
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, &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);
|
||||
|
||||
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;
|
||||
|
||||
for (int32_t j = range.first; j < range.one_past_last; j += 1){
|
||||
if (list->jump_count >= list->jump_max){
|
||||
double_jump_max(general, list);
|
||||
}
|
||||
|
||||
uint32_t flags = 0;
|
||||
if (is_sub_error){
|
||||
if (jumps.jumps[j].is_sub_error){
|
||||
flags |= JumpFlag_IsSubJump;
|
||||
}
|
||||
|
||||
list->jumps[list->jump_count] = make_sticky_jump_source(this_jump_line, flags);
|
||||
list->jumps[list->jump_count] = make_sticky_jump_source(jumps.jumps[j].list_line, flags);
|
||||
++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);
|
||||
}
|
||||
#endif
|
||||
|
||||
static void
|
||||
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
|
||||
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;
|
||||
// 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){
|
||||
skip = true;
|
||||
}
|
||||
|
|
|
@ -7,6 +7,32 @@
|
|||
#if !defined(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{
|
||||
JumpFlag_IsSubJump = 0x1,
|
||||
};
|
||||
|
|
|
@ -43,7 +43,7 @@ try_skip_rust_arrow(String line){
|
|||
}
|
||||
|
||||
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;
|
||||
*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
|
||||
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 result = parse_jump_location(line, location, colon_char, &is_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
|
||||
parse_jump_from_buffer_line(Application_Links *app, Partition *arena,
|
||||
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;
|
||||
String line_str = {0};
|
||||
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
|
||||
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);
|
||||
return(result);
|
||||
}
|
||||
|
@ -223,7 +223,7 @@ set_view_to_location(Application_Links *app, View_Summary *view, Buffer_Summary
|
|||
}
|
||||
|
||||
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_view_to_location(app, view, buffer, seek_line_char(location.line, location.column));
|
||||
if (auto_center_after_jumps){
|
||||
|
@ -246,7 +246,7 @@ static bool32
|
|||
seek_next_jump_in_buffer(Application_Links *app, Partition *part,
|
||||
int32_t buffer_id, int32_t first_line, bool32 skip_sub_errors,
|
||||
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);
|
||||
|
||||
|
@ -276,9 +276,9 @@ seek_next_jump_in_buffer(Application_Links *app, Partition *part,
|
|||
return(result);
|
||||
}
|
||||
|
||||
static ID_Based_Jump_Location
|
||||
convert_name_based_to_id_based(Application_Links *app, Name_Based_Jump_Location loc){
|
||||
ID_Based_Jump_Location result = {0};
|
||||
static ID_Line_Column_Jump_Location
|
||||
convert_name_based_to_id_based(Application_Links *app, Name_Line_Column_Location loc){
|
||||
ID_Line_Column_Jump_Location result = {0};
|
||||
Buffer_Summary buffer = get_buffer_by_name(app, loc.file.str, loc.file.size, AccessAll);
|
||||
|
||||
if (buffer.exists){
|
||||
|
@ -291,10 +291,10 @@ convert_name_based_to_id_based(Application_Links *app, Name_Based_Jump_Location
|
|||
}
|
||||
|
||||
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;
|
||||
|
||||
Name_Based_Jump_Location location = {0};
|
||||
Name_Line_Column_Location location = {0};
|
||||
int32_t line = view->cursor.line;
|
||||
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)){
|
||||
|
@ -308,7 +308,7 @@ seek_next_jump_in_view(Application_Links *app, Partition *part, View_Summary *vi
|
|||
}
|
||||
|
||||
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;
|
||||
if (prev.buffer_id != 0 && prev.buffer_id == jump.buffer_id && prev.line == jump.line && prev.column <= jump.column){
|
||||
result = true;
|
||||
|
@ -317,12 +317,13 @@ skip_this_jump(ID_Based_Jump_Location prev, ID_Based_Jump_Location jump){
|
|||
}
|
||||
|
||||
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;
|
||||
|
||||
Name_Based_Jump_Location location = {0};
|
||||
ID_Based_Jump_Location jump = {0};
|
||||
int32_t line = 0, colon_index = 0;
|
||||
Name_Line_Column_Location location = {0};
|
||||
ID_Line_Column_Jump_Location jump = {0};
|
||||
int32_t line = 0;
|
||||
int32_t colon_index = 0;
|
||||
|
||||
do{
|
||||
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){
|
||||
*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;
|
||||
|
@ -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);
|
||||
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)){
|
||||
|
||||
Buffer_Summary buffer = {0};
|
||||
|
|
|
@ -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
|
||||
|
|
@ -378,6 +378,45 @@ begin_integrated_lister__with_fixed_options(Application_Links *app, char *query_
|
|||
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
|
||||
|
@ -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_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
|
||||
activate_confirm_kill(Application_Links *app, View_Summary *view, String text_field,
|
||||
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);
|
||||
Buffer_ID buffer_id = (Buffer_ID)(state->lister.user_data);
|
||||
Buffer_ID buffer_id = (Buffer_ID)(PtrAsInt(state->lister.user_data));
|
||||
switch (behavior){
|
||||
case SureToKill_No:
|
||||
{}break;
|
||||
|
@ -525,13 +564,13 @@ activate_confirm_kill(Application_Links *app, View_Summary *view, String text_fi
|
|||
static void
|
||||
do_gui_sure_to_kill(Application_Links *app, Buffer_Summary *buffer, View_Summary *view){
|
||||
Lister_Fixed_Option options[] = {
|
||||
{"(N)o" , "", "Nn", (void*)SureToKill_No },
|
||||
{"(Y)es" , "", "Yy", (void*)SureToKill_Yes },
|
||||
{"(S)ave and Kill", "", "Ss", (void*)SureToKill_Save},
|
||||
{"(N)o" , "", "Nn", IntAsPtr(SureToKill_No) },
|
||||
{"(Y)es" , "", "Yy", IntAsPtr(SureToKill_Yes) },
|
||||
{"(S)ave and Kill", "", "Ss", IntAsPtr(SureToKill_Save)},
|
||||
};
|
||||
int32_t option_count = sizeof(options)/sizeof(options[0]);
|
||||
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,
|
||||
view);
|
||||
}
|
||||
|
@ -539,7 +578,7 @@ do_gui_sure_to_kill(Application_Links *app, Buffer_Summary *buffer, View_Summary
|
|||
static Lister_Activation_Code
|
||||
activate_confirm_close_4coder(Application_Links *app, View_Summary *view, String text_field,
|
||||
void *user_data, bool32 clicked){
|
||||
int32_t behavior = (int32_t)user_data;
|
||||
int32_t behavior = (int32_t)PtrAsInt(user_data);
|
||||
switch (behavior){
|
||||
case SureToKill_No:
|
||||
{}break;
|
||||
|
@ -581,7 +620,7 @@ static Lister_Activation_Code
|
|||
activate_switch_buffer(Application_Links *app, View_Summary *view, String text_field,
|
||||
void *user_data, bool32 activated_by_mouse){
|
||||
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);
|
||||
}
|
||||
return(ListerActivation_Finished);
|
||||
|
@ -599,7 +638,7 @@ static Lister_Activation_Code
|
|||
activate_kill_buffer(Application_Links *app, View_Summary *view, String text_field,
|
||||
void *user_data, bool32 activated_by_mouse){
|
||||
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);
|
||||
}
|
||||
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);
|
||||
}
|
||||
|
||||
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
|
||||
|
||||
|
|
|
@ -62,6 +62,9 @@ CUSTOM_DOC("Execute a 'long form' command.")
|
|||
else if (match(bar.string, make_lit_string("mkdir"))){
|
||||
make_directory_query(app);
|
||||
}
|
||||
else if (match(bar.string, make_lit_string("reload themes"))){
|
||||
reload_themes(app);
|
||||
}
|
||||
else{
|
||||
print_message(app, literal("unrecognized command\n"));
|
||||
}
|
||||
|
|
|
@ -828,12 +828,14 @@ CUSTOM_DOC("Iteratively tries completing the word to the left of the cursor with
|
|||
if (buffer.exists){
|
||||
int32_t do_init = false;
|
||||
|
||||
Dynamic_Scope scope = view_get_dynamic_scope(app, view.view_id);
|
||||
|
||||
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){
|
||||
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){
|
||||
do_init = true;
|
||||
}
|
||||
|
|
|
@ -231,10 +231,18 @@ lister_get_clicked_item(Application_Links *app, View_Summary *view, Partition *s
|
|||
static void
|
||||
lister_update_ui(Application_Links *app, Partition *scratch, View_Summary *view,
|
||||
Lister_State *state){
|
||||
bool32 is_theme_list = state->lister.theme_list;
|
||||
|
||||
int32_t x0 = 0;
|
||||
int32_t x1 = view->view_region.x1 - view->view_region.x0;
|
||||
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);
|
||||
|
||||
|
@ -266,11 +274,18 @@ lister_update_ui(Application_Links *app, Partition *scratch, View_Summary *view,
|
|||
y_pos = item_rect.y1;
|
||||
|
||||
UI_Item item = {0};
|
||||
if (!is_theme_list){
|
||||
item.type = UIType_Option;
|
||||
item.activation_level = UIActivation_None;
|
||||
item.coordinates = UICoordinates_Scrolled;
|
||||
item.option.string = node->string;
|
||||
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.rectangle = item_rect;
|
||||
|
||||
|
@ -405,6 +420,31 @@ lister_add_item(Partition *arena, Lister *lister,
|
|||
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*
|
||||
lister_get_user_data(Lister *lister, int32_t index){
|
||||
if (0 <= index && index < lister->options.count){
|
||||
|
|
|
@ -23,7 +23,10 @@ struct Lister_Option_Node{
|
|||
Lister_Option_Node *next;
|
||||
Lister_Option_Node *prev;
|
||||
String string;
|
||||
union{
|
||||
String status;
|
||||
int32_t index;
|
||||
};
|
||||
void *user_data;
|
||||
};
|
||||
|
||||
|
@ -55,6 +58,7 @@ struct Lister{
|
|||
char key_string_space[256];
|
||||
String key_string;
|
||||
Lister_Option_List options;
|
||||
bool32 theme_list;
|
||||
};
|
||||
|
||||
struct Lister_Prealloced_String{
|
||||
|
@ -81,6 +85,12 @@ struct Lister_Fixed_Option{
|
|||
void *user_data;
|
||||
};
|
||||
|
||||
struct Lister_UI_Option{
|
||||
char *string;
|
||||
int32_t index;
|
||||
void *user_data;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
// BOTTOM
|
||||
|
|
9
4ed.cpp
9
4ed.cpp
|
@ -192,7 +192,7 @@ do_feedback_message(System_Functions *system, Models *models, String value){
|
|||
internal View*
|
||||
panel_make_empty(System_Functions *system, Models *models, Panel *panel){
|
||||
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);
|
||||
return(new_view.view);
|
||||
}
|
||||
|
@ -1072,16 +1072,15 @@ App_Init_Sig(app_init){
|
|||
|
||||
{
|
||||
setup_command_table();
|
||||
|
||||
Assert(models->config_api.get_bindings != 0);
|
||||
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);
|
||||
interpret_binding_buffer(models, models->app_links.memory, 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
|
||||
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;
|
||||
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);
|
||||
|
||||
if (init_files[i].read_only){
|
||||
|
|
|
@ -95,7 +95,6 @@ fill_view_summary(System_Functions *system, View_Summary *view, View *vptr, Live
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
inline void
|
||||
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);
|
||||
|
@ -104,7 +103,6 @@ fill_view_summary(System_Functions *system, View_Summary *view, View *vptr, Comm
|
|||
internal Editing_File*
|
||||
get_file_from_identifier(System_Functions *system, Working_Set *working_set, Buffer_Identifier buffer){
|
||||
Editing_File *file = 0;
|
||||
|
||||
if (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);
|
||||
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);
|
||||
}
|
||||
|
||||
internal Editing_File*
|
||||
imp_get_file(Command_Data *cmd, Buffer_Summary *buffer){
|
||||
Editing_File *file = 0;
|
||||
Working_Set *working_set = &cmd->models->working_set;;
|
||||
|
||||
if (buffer && buffer->exists){
|
||||
file = working_set_get_active_file(working_set, buffer->buffer_id);
|
||||
if (file != 0 && !file_is_ready(file)){
|
||||
file = 0;
|
||||
file = imp_get_file(cmd, buffer->buffer_id);
|
||||
}
|
||||
}
|
||||
|
||||
return(file);
|
||||
}
|
||||
|
||||
|
@ -135,7 +136,6 @@ internal View*
|
|||
imp_get_view(Command_Data *cmd, View_ID view_id){
|
||||
Live_Views *live_set = cmd->live_set;
|
||||
View *vptr = 0;
|
||||
|
||||
view_id = view_id - 1;
|
||||
if (view_id >= 0 && view_id < live_set->max){
|
||||
vptr = live_set->views + view_id;
|
||||
|
@ -143,18 +143,15 @@ imp_get_view(Command_Data *cmd, View_ID view_id){
|
|||
vptr = 0;
|
||||
}
|
||||
}
|
||||
|
||||
return(vptr);
|
||||
}
|
||||
|
||||
internal View*
|
||||
imp_get_view(Command_Data *cmd, View_Summary *view){
|
||||
View *vptr = 0;
|
||||
|
||||
if (view && view->exists){
|
||||
if (view != 0 && view->exists){
|
||||
vptr = imp_get_view(cmd, view->view_id);
|
||||
}
|
||||
|
||||
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.
|
||||
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);
|
||||
|
||||
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;
|
||||
Editing_File *file = imp_get_file(cmd, buffer);
|
||||
bool32 result = 0;
|
||||
bool32 result = false;
|
||||
|
||||
if (file){
|
||||
result = 1;
|
||||
if (file != 0){
|
||||
result = true;
|
||||
switch (setting){
|
||||
case BufferSetting_Lex:
|
||||
{
|
||||
|
@ -1198,6 +1195,19 @@ DOC_SEE(Buffer_Setting_ID)
|
|||
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
|
||||
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;
|
||||
Editing_File *file = imp_get_file(cmd, buffer);
|
||||
|
||||
int32_t count = 0;
|
||||
|
||||
if (file && file->state.token_array.tokens && file->state.tokens_complete){
|
||||
if (file != 0 &&
|
||||
file->state.token_array.tokens &&
|
||||
file->state.tokens_complete){
|
||||
count = file->state.token_array.count;
|
||||
}
|
||||
|
||||
return(count);
|
||||
}
|
||||
|
||||
|
@ -1357,7 +1366,7 @@ DOC_SEE(Buffer_Create_Flag)
|
|||
|
||||
if (do_empty_buffer){
|
||||
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 (has_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)){
|
||||
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){
|
||||
buffer_bind_file(system, general, working_set, file, canon.name);
|
||||
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);
|
||||
}
|
||||
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 *node = used->next;
|
||||
|
@ -1740,7 +1749,7 @@ in the system, the call will fail.)
|
|||
if (vptr != 0 && models->layout.panel_count > 1){
|
||||
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;
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
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_RETURN(This call returns non-zero on success.)
|
||||
|
||||
DOC(If the given view is open, it is set as the
|
||||
active view, and takes subsequent commands and is returned
|
||||
from get_active_view.)
|
||||
|
||||
DOC_SEE(get_active_view)
|
||||
*/{
|
||||
Command_Data *cmd = (Command_Data*)app->cmd_context;
|
||||
|
@ -1933,6 +1939,19 @@ DOC_SEE(View_Setting_ID)
|
|||
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
|
||||
View_Set_Split_Proportion(Application_Links *app, View_Summary *view, float t)
|
||||
/*
|
||||
|
@ -2186,54 +2205,8 @@ DOC_SEE(int_color)
|
|||
}
|
||||
|
||||
API_EXPORT int32_t
|
||||
Create_View_Variable(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);
|
||||
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){
|
||||
View_Start_UI_Mode(Application_Links *app, View_Summary *view)
|
||||
{
|
||||
Command_Data *cmd = (Command_Data*)app->cmd_context;
|
||||
View *vptr = imp_get_view(cmd, view);
|
||||
if (vptr != 0){
|
||||
|
@ -2247,7 +2220,8 @@ View_Start_UI_Mode(Application_Links *app, View_Summary *view){
|
|||
}
|
||||
|
||||
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;
|
||||
View *vptr = imp_get_view(cmd, view);
|
||||
if (vptr != 0){
|
||||
|
@ -2266,11 +2240,12 @@ View_End_UI_Mode(Application_Links *app, View_Summary *view){
|
|||
}
|
||||
|
||||
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;
|
||||
View *vptr = imp_get_view(cmd, view);
|
||||
Models *models = cmd->models;
|
||||
General_Memory *general = &models->mem.general;
|
||||
View *vptr = imp_get_view(cmd, view);
|
||||
if (vptr != 0){
|
||||
if (vptr->transient.ui_control.items != 0){
|
||||
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.string.size;
|
||||
}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;
|
||||
item < one_past_last;
|
||||
item += 1){
|
||||
|
||||
String *fixup[2];
|
||||
i32 fixup_count = 0;
|
||||
|
||||
int32_t fixup_count = 0;
|
||||
switch (item->type){
|
||||
case UIType_Option:
|
||||
{
|
||||
fixup[0] = &item->option.string;
|
||||
fixup[1] = &item->option.status;
|
||||
fixup_count = 2;
|
||||
}break;
|
||||
case UIType_TextField:
|
||||
{
|
||||
fixup[0] = &item->text_field.query;
|
||||
fixup[1] = &item->text_field.string;
|
||||
fixup_count = 2;
|
||||
}break;
|
||||
case UIType_ColorTheme:
|
||||
{
|
||||
fixup[0] = &item->color_theme.string;
|
||||
fixup_count = 1;
|
||||
}break;
|
||||
}
|
||||
|
||||
for (i32 i = 0; i < fixup_count; i += 1){
|
||||
String old = *fixup[i];
|
||||
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
|
||||
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;
|
||||
View *vptr = imp_get_view(cmd, view);
|
||||
UI_Control result = {0};
|
||||
|
@ -2365,6 +2356,188 @@ View_Get_UI_Copy(Application_Links *app, View_Summary *view, struct Partition *p
|
|||
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
|
||||
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);
|
||||
}
|
||||
|
||||
/*
|
||||
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
|
||||
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));
|
||||
}
|
||||
|
||||
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
|
||||
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;
|
||||
i32 count = library->count;
|
||||
Style *style = library->styles;
|
||||
for (i32 i = 0; i < count; ++i, ++style){
|
||||
Style *style = library->styles + 1;
|
||||
for (i32 i = 1; i < count; ++i, ++style){
|
||||
if (match(style->name, theme_name)){
|
||||
style_set_colors(style, theme);
|
||||
Print_Message(app, "DID THING\n", sizeof("DID THING\n") - 1);
|
||||
hit_existing_theme = true;
|
||||
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);
|
||||
|
||||
i32 count = styles->count;
|
||||
Style *s = styles->styles;
|
||||
for (i32 i = 0; i < count; ++i, ++s){
|
||||
if (match_ss(s->name, theme_name)){
|
||||
Style *s = styles->styles + 1;
|
||||
for (i32 i = 1; i < count; ++i, ++s){
|
||||
if (match(s->name, theme_name)){
|
||||
style_copy(&styles->styles[0], s);
|
||||
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
|
||||
Get_Largest_Face_ID(Application_Links *app)
|
||||
/*
|
||||
|
|
|
@ -67,7 +67,9 @@ struct Models{
|
|||
Live_Views live_set;
|
||||
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 *scratch_buffer;
|
||||
|
@ -95,6 +97,12 @@ struct Models{
|
|||
|
||||
////////////////////////////////
|
||||
|
||||
typedef i32 Lifetime_Object_Type;
|
||||
enum{
|
||||
LifetimeObject_File = 0,
|
||||
LifetimeObject_View = 1,
|
||||
};
|
||||
|
||||
enum App_State{
|
||||
APP_STATE_EDIT,
|
||||
APP_STATE_RESIZING,
|
||||
|
|
|
@ -43,6 +43,7 @@
|
|||
|
||||
#include "4ed_linked_node_macros.h"
|
||||
#include "4ed_log.h"
|
||||
#include "4ed_dynamic_variables.h"
|
||||
|
||||
#include "4ed_buffer_model.h"
|
||||
#include "4ed_translation.h"
|
||||
|
@ -59,10 +60,10 @@
|
|||
#include "4ed_cli.h"
|
||||
#include "4ed_gui.h"
|
||||
#include "4ed_layout.h"
|
||||
#include "4ed_dynamic_variables.h"
|
||||
#include "4ed_view.h"
|
||||
#include "4ed_app_models.h"
|
||||
|
||||
#include "4ed_dynamic_variables.cpp"
|
||||
#include "4ed_parse_context.cpp"
|
||||
#include "4ed_font.cpp"
|
||||
#include "4ed_translation.cpp"
|
||||
|
@ -79,7 +80,6 @@
|
|||
#include "4ed_hot_directory.cpp"
|
||||
#include "4ed_cli.cpp"
|
||||
#include "4ed_gui.cpp"
|
||||
#include "4ed_dynamic_variables.cpp"
|
||||
#include "4ed_layout.cpp"
|
||||
#include "4coder_buffer_seek_constructors.cpp"
|
||||
#include "4ed_view.cpp"
|
||||
|
|
105
4ed_defines.h
105
4ed_defines.h
|
@ -71,6 +71,11 @@ typedef double f64;
|
|||
#if !defined(Member)
|
||||
# define Member(T, m) (((T*)0)->m)
|
||||
#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) STR__(s)
|
||||
|
@ -178,41 +183,77 @@ max_f32_proc(void){
|
|||
#define max_f32 max_f32_proc()
|
||||
#endif
|
||||
|
||||
#define Bit_0 (1 << 0)
|
||||
#define Bit_1 (1 << 1)
|
||||
#define Bit_2 (1 << 2)
|
||||
#define Bit_3 (1 << 3)
|
||||
#define Bit_4 (1 << 4)
|
||||
#define Bit_5 (1 << 5)
|
||||
#define Bit_6 (1 << 6)
|
||||
#define Bit_7 (1 << 7)
|
||||
global_const u32 bit_0 = (((u32)1) << 0);
|
||||
global_const u32 bit_1 = (((u32)1) << 1);
|
||||
global_const u32 bit_2 = (((u32)1) << 2);
|
||||
global_const u32 bit_3 = (((u32)1) << 3);
|
||||
global_const u32 bit_4 = (((u32)1) << 4);
|
||||
global_const u32 bit_5 = (((u32)1) << 5);
|
||||
global_const u32 bit_6 = (((u32)1) << 6);
|
||||
global_const u32 bit_7 = (((u32)1) << 7);
|
||||
|
||||
#define Bit_8 (1 << 8)
|
||||
#define Bit_9 (1 << 9)
|
||||
#define Bit_10 (1 << 10)
|
||||
#define Bit_11 (1 << 11)
|
||||
#define Bit_12 (1 << 12)
|
||||
#define Bit_13 (1 << 13)
|
||||
#define Bit_14 (1 << 14)
|
||||
#define Bit_15 (1 << 15)
|
||||
global_const u32 bit_8 = (((u32)1) << 8);
|
||||
global_const u32 bit_9 = (((u32)1) << 9);
|
||||
global_const u32 bit_10 = (((u32)1) << 10);
|
||||
global_const u32 bit_11 = (((u32)1) << 11);
|
||||
global_const u32 bit_12 = (((u32)1) << 12);
|
||||
global_const u32 bit_13 = (((u32)1) << 13);
|
||||
global_const u32 bit_14 = (((u32)1) << 14);
|
||||
global_const u32 bit_15 = (((u32)1) << 15);
|
||||
|
||||
#define Bit_16 (1 << 16)
|
||||
#define Bit_17 (1 << 17)
|
||||
#define Bit_18 (1 << 18)
|
||||
#define Bit_19 (1 << 19)
|
||||
#define Bit_20 (1 << 20)
|
||||
#define Bit_21 (1 << 21)
|
||||
#define Bit_22 (1 << 22)
|
||||
#define Bit_23 (1 << 23)
|
||||
global_const u32 bit_16 = (((u32)1) << 16);
|
||||
global_const u32 bit_17 = (((u32)1) << 17);
|
||||
global_const u32 bit_18 = (((u32)1) << 18);
|
||||
global_const u32 bit_19 = (((u32)1) << 19);
|
||||
global_const u32 bit_20 = (((u32)1) << 20);
|
||||
global_const u32 bit_21 = (((u32)1) << 21);
|
||||
global_const u32 bit_22 = (((u32)1) << 22);
|
||||
global_const u32 bit_23 = (((u32)1) << 23);
|
||||
|
||||
#define Bit_24 (1 << 24)
|
||||
#define Bit_25 (1 << 25)
|
||||
#define Bit_26 (1 << 26)
|
||||
#define Bit_27 (1 << 27)
|
||||
#define Bit_28 (1 << 28)
|
||||
#define Bit_29 (1 << 29)
|
||||
#define Bit_30 (1 << 30)
|
||||
#define Bit_31 (1 << 31)
|
||||
global_const u32 bit_24 = (((u32)1) << 24);
|
||||
global_const u32 bit_25 = (((u32)1) << 25);
|
||||
global_const u32 bit_26 = (((u32)1) << 26);
|
||||
global_const u32 bit_27 = (((u32)1) << 27);
|
||||
global_const u32 bit_28 = (((u32)1) << 28);
|
||||
global_const u32 bit_29 = (((u32)1) << 29);
|
||||
global_const u32 bit_30 = (((u32)1) << 30);
|
||||
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
|
||||
|
||||
|
|
|
@ -15,9 +15,8 @@ dynamic_variables_init(Dynamic_Variable_Layout *layout){
|
|||
layout->location_counter = 1;
|
||||
}
|
||||
|
||||
internal i32
|
||||
dynamic_variables_lookup_or_create(General_Memory *general, Dynamic_Variable_Layout *layout,
|
||||
String name, u64 default_value){
|
||||
internal Managed_Variable_ID
|
||||
dynamic_variables_lookup(Dynamic_Variable_Layout *layout, String name){
|
||||
for (Dynamic_Variable_Slot *slot = layout->sentinel.next;
|
||||
slot != &layout->sentinel;
|
||||
slot = slot->next){
|
||||
|
@ -25,6 +24,11 @@ dynamic_variables_lookup_or_create(General_Memory *general, Dynamic_Variable_Lay
|
|||
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);
|
||||
void *ptr = general_memory_allocate(general, alloc_size);
|
||||
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);
|
||||
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
|
||||
|
@ -98,5 +120,364 @@ dynamic_variables_get_ptr(General_Memory *general,
|
|||
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
|
||||
|
||||
|
|
|
@ -31,6 +31,82 @@ struct Dynamic_Variable_Block{
|
|||
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
|
||||
|
||||
// BOTTOM
|
||||
|
|
|
@ -131,6 +131,8 @@ struct Editing_File{
|
|||
b32 is_loading;
|
||||
b32 is_dummy;
|
||||
Editing_File_State state;
|
||||
Dynamic_Variable_Block dynamic_vars;
|
||||
Lifetime_Object *lifetime_object;
|
||||
Editing_File_Markers markers;
|
||||
Editing_File_Name base_name;
|
||||
Editing_File_Name unique_name;
|
||||
|
|
|
@ -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_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_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;}
|
||||
|
|
|
@ -40,7 +40,8 @@ style_set_name(Style *style, String name){
|
|||
|
||||
struct Style_Library{
|
||||
Style styles[64];
|
||||
i32 count, max;
|
||||
i32 count;
|
||||
i32 max;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -20,7 +20,7 @@ view_get_map(View *view){
|
|||
}
|
||||
|
||||
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);
|
||||
++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);
|
||||
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.prev->transient.next = result.view->transient.next;
|
||||
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);
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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);
|
||||
--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);
|
||||
}
|
||||
|
||||
//dll_insert(&live_set->free_sentinel, view);
|
||||
view->transient.next = live_set->free_sentinel.transient.next;
|
||||
view->transient.prev = &live_set->free_sentinel;
|
||||
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;
|
||||
|
||||
dynamic_variables_block_free(general, &view->transient.dynamic_vars);
|
||||
lifetime_free_object(general, lifetime_allocator, view->transient.lifetime_object);
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
|
|
|
@ -15,7 +15,6 @@
|
|||
struct View_Persistent{
|
||||
i32 id;
|
||||
Coroutine_Head *coroutine;
|
||||
Event_Message message_passing_slot;
|
||||
};
|
||||
|
||||
struct File_Viewing_Data{
|
||||
|
@ -38,6 +37,7 @@ struct View_Transient{
|
|||
|
||||
File_Viewing_Data file_data;
|
||||
Dynamic_Variable_Block dynamic_vars;
|
||||
Lifetime_Object *lifetime_object;
|
||||
|
||||
i32_Rect file_region_prev;
|
||||
i32_Rect file_region;
|
||||
|
|
|
@ -241,6 +241,9 @@ do_render_file_view(System_Functions *system, View *view, Models *models, GUI_Sc
|
|||
i32 line_height = view->transient.line_height;
|
||||
Style *style = &models->styles.styles[0];
|
||||
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);
|
||||
|
||||
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);
|
||||
}break;
|
||||
|
||||
case UIType_ThemePreview:
|
||||
case UIType_ColorTheme:
|
||||
{
|
||||
Style *preview_style = &models->styles.styles[item->theme_preview.theme_index];
|
||||
u32 back = preview_style->main.back_color;
|
||||
u32 margin_color = style_get_margin_color(item->activation_level, preview_style);
|
||||
u32 text_color = preview_style->main.default_color;
|
||||
u32 keyword_color = preview_style->main.keyword_color;
|
||||
u32 int_constant_color = preview_style->main.int_constant_color;
|
||||
u32 comment_color = preview_style->main.comment_color;
|
||||
Style *style_preview = &models->styles.styles[item->color_theme.index];
|
||||
u32 margin_color = style_get_margin_color(item->activation_level, style_preview);
|
||||
u32 back = style_preview->main.back_color;
|
||||
u32 text_color = style_preview->main.default_color;
|
||||
u32 keyword_color = style_preview->main.keyword_color;
|
||||
u32 int_constant_color = style_preview->main.int_constant_color;
|
||||
u32 comment_color = style_preview->main.comment_color;
|
||||
|
||||
f32_Rect inner = get_inner_rect(item_rect, 3);
|
||||
draw_rectangle(target, inner, back);
|
||||
|
||||
draw_margin(target, item_rect, inner, margin_color);
|
||||
i32 start_y = (i32)inner.y0;
|
||||
i32 start_x = (i32)inner.x0;
|
||||
i32 end_y = (i32)inner.y1;
|
||||
i32 y = start_y;
|
||||
i32 x = start_x;
|
||||
x = ceil32(draw_string(system, target, font_id, preview_style->name.str, x, y, text_color));
|
||||
draw_rectangle(target, inner, back);
|
||||
|
||||
i32 y = (i32)inner.y0;
|
||||
i32 x = (i32)inner.x0;
|
||||
String str = item->color_theme.string;
|
||||
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;
|
||||
x = start_x;
|
||||
x = (i32)inner.x0;
|
||||
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, "(x < ", x, y, text_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, "// comment", x, y, comment_color));
|
||||
|
||||
x = start_x;
|
||||
x = (i32)inner.x0;
|
||||
y += height;
|
||||
if (y + height <= end_y){
|
||||
draw_string(system, target, font_id, "[] () {}; * -> +-/ <>= ! && || % ^", x, y, text_color);
|
||||
}
|
||||
}
|
||||
}break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -66,8 +66,13 @@ working_set_extend_memory(Working_Set *working_set, Editing_File *new_space, i16
|
|||
}
|
||||
|
||||
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;
|
||||
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){
|
||||
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.wrap_indicator = WrapIndicator_Show_At_Wrap_Edge;
|
||||
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;
|
||||
}
|
||||
|
||||
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
|
||||
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){
|
||||
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_insert(&working_set->free_sentinel, &file->node);
|
||||
--working_set->file_count;
|
||||
|
@ -581,7 +579,7 @@ open_file(System_Functions *system, Models *models, String filename){
|
|||
General_Memory *general = &mem->general;
|
||||
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_name(models, general, part, working_set, file, front_of_directory(filename));
|
||||
|
||||
|
|
|
@ -930,8 +930,8 @@ win32_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
|
|||
Control_Keys *controls = &win32vars.input_chunk.pers.controls;
|
||||
b8 *control_keys = win32vars.input_chunk.pers.control_keys;
|
||||
|
||||
b8 down = ((lParam & Bit_31)?(0):(1));
|
||||
b8 is_right = ((lParam & Bit_24)?(1):(0));
|
||||
b8 down = ((lParam & bit_31)?(0):(1));
|
||||
b8 is_right = ((lParam & bit_24)?(1):(0));
|
||||
|
||||
if (wParam != 255){
|
||||
switch (wParam){
|
||||
|
@ -970,7 +970,7 @@ win32_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
|
|||
|
||||
default:
|
||||
{
|
||||
b8 current_state = ((lParam & Bit_31)?(0):(1));
|
||||
b8 current_state = ((lParam & bit_31)?(0):(1));
|
||||
|
||||
if (current_state){
|
||||
Key_Code key = keycode_lookup_table[(u8)wParam];
|
||||
|
|
|
@ -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 lowest view_id.
|
||||
\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} <ctrl k> \END Interactively kill 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 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, 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.
|
||||
|
@ -185,12 +185,12 @@ The following commands only apply in files where the lexer (syntax highlighting)
|
|||
\SECTION{default-lister-ui-map}
|
||||
These commands apply in 'lister mode' such as when you open a file.
|
||||
\LIST
|
||||
\ITEM \STYLE{code} <any character> \END A list mode command that inserts a new character to the text field.
|
||||
\ITEM \STYLE{code} <escape> \END A list 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} <tab> \END A list 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} <up> \END A list mode command that moves the highlighted item one up in the list.
|
||||
\ITEM \STYLE{code} <page up> \END A list mode command that moves the highlighted item one up in the list.
|
||||
\ITEM \STYLE{code} <down> \END A list mode command that moves the highlighted item one down in the list.
|
||||
\ITEM \STYLE{code} <page down> \END A list mode command that moves the highlighted item one down in the list.
|
||||
\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 lister mode command that quits the list without executing any actions.
|
||||
\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 lister mode command that activates the list's action on the highlighted item.
|
||||
\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 lister mode command that dispatches to the lister's navigate up handler.
|
||||
\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 lister mode command that dispatches to the lister's navigate down handler.
|
||||
\ITEM \STYLE{code} <page down> \END A lister mode command that dispatches to the lister's navigate down handler.
|
||||
|
|
|
@ -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;
|
Loading…
Reference in New Issue