diff --git a/4coder_API.html b/4coder_API.html
index 841bb06a..09f6f2d3 100644
--- a/4coder_API.html
+++ b/4coder_API.html
@@ -114,12 +114,6 @@ This is the documentation for alpha 4.0.9 super! The documentation has been made
view_post_fade
@@ -172,7 +166,7 @@ This is the documentation for alpha 4.0.9 super! The documentation has been made
§2.2.0: exec_command
void app->exec_command(
-
Application_Links *app,
int command_id
)
+
Application_Links *app,
uint64_t command_id
)
Parameters
command_id
@@ -733,22 +727,8 @@ cancels and dialogue shown in the view and displays the file.
-
-
§2.2.29: view_set_paste_rewrite_
-
void app->view_set_paste_rewrite_(
-
Application_Links *app,
View_Summary *view
)
-
-No documentation generated for this function, assume it is non-public.
-
-
-
§2.2.30: view_get_paste_rewrite_
-
int app->view_get_paste_rewrite_(
-
Application_Links *app,
View_Summary *view
)
-
-No documentation generated for this function, assume it is non-public.
-
See Also
-
§2.2.33: get_mouse_state
+
§2.2.31: get_mouse_state
Mouse_State app->get_mouse_state(
Application_Links *app
)
Return
returns the current mouse state
See Also
-
§2.2.34: start_query_bar
+
§2.2.32: start_query_bar
int app->start_query_bar(
Application_Links *app,
Query_Bar *bar,
unsigned int flags
)
@@ -793,7 +773,7 @@ If a get condition is met the user input is returned
Return
returns non-zero on success
Description
The memory pointed to by bar must remain valid until a call to end_query_bar or
until the command returns.
-
§2.2.35: end_query_bar
+
§2.2.33: end_query_bar
void app->end_query_bar(
Application_Links *app,
Query_Bar *bar,
unsigned int flags
)
@@ -807,7 +787,7 @@ until the command returns.
Description
bar must be a pointer previously passed to start_query_bar previously in the same command.
-
§2.2.36: print_message
+
§2.2.34: print_message
void app->print_message(
Application_Links *app,
char *str,
int len
)
@@ -821,7 +801,7 @@ until the command returns.
-
§2.2.37: change_theme
+
§2.2.35: change_theme
void app->change_theme(
Application_Links *app,
char *name,
int len
)
@@ -835,7 +815,7 @@ until the command returns.
-
§2.2.38: change_font
+
§2.2.36: change_font
void app->change_font(
Application_Links *app,
char *name,
int len
)
@@ -849,7 +829,7 @@ until the command returns.
-
§2.2.39: set_theme_colors
+
§2.2.37: set_theme_colors
void app->set_theme_colors(
Application_Links *app,
Theme_Color *colors,
int count
)
@@ -864,7 +844,7 @@ until the command returns.
Description
For each color struct in the array, the color in the style pallet is set to the color
code paired with the tag.
-
§2.2.40: get_theme_colors
+
§2.2.38: get_theme_colors
void app->get_theme_colors(
Application_Links *app,
Theme_Color *colors,
int count
)
@@ -879,7 +859,7 @@ code paired with the tag.
Description
For each color struct in the array, the color field of the struct is filled with the
color from the specified color in the pallet.
-
§2.2.41: directory_get_hot
+
§2.2.39: directory_get_hot
int app->directory_get_hot(
Application_Links *app,
char *out,
int capacity
)
@@ -897,7 +877,7 @@ accessed in the GUI. Whenever the GUI is opened it shows the hot directory.
In the future this will be deprecated and eliminated in favor of more flexible
directories controlled by the custom side.
-
§2.2.42: get_file_list
+
§2.2.40: get_file_list
File_List app->get_file_list(
Application_Links *app,
char *dir,
int len
)
@@ -913,7 +893,7 @@ directories controlled by the custom side.
the specified directory. The File_List returned should be passed to free_file_list
when it is no longer in use.
-
§2.2.43: free_file_list
+
§2.2.41: free_file_list
void app->free_file_list(
Application_Links *app,
File_List list
)
@@ -923,7 +903,7 @@ when it is no longer in use.
Description
after this call the file list passed in should not be read or written to
-
§2.2.44: file_exists
+
§2.2.42: file_exists
int app->file_exists(
Application_Links *app,
char *filename,
int len
)
@@ -937,7 +917,7 @@ when it is no longer in use.
Return
returns non-zero if the file exists, returns zero if the file does not exist
-
§2.2.45: directory_cd
+
§2.2.43: directory_cd
int app->directory_cd(
Application_Links *app,
char *dir,
int *len,
int capacity,
char *rel_path,
int rel_len
)
@@ -969,7 +949,7 @@ For instance if dir contains "C:/Users/MySelf" and rel is "Documents" the buffer
"C:/Users/MySelf/Documents" and len will contain the length of that string. This call can
also be used with rel set to ".." to traverse to parent folders.
-
§2.2.46: get_4ed_path
+
§2.2.44: get_4ed_path
int app->get_4ed_path(
Application_Links *app,
char *out,
int capacity
)
diff --git a/4coder_custom.h b/4coder_custom.h
index 82466a7b..77d99ae4 100644
--- a/4coder_custom.h
+++ b/4coder_custom.h
@@ -2,6 +2,8 @@
#ifndef FCODER_CUSTOM_H
#define FCODER_CUSTOM_H
+#include
+
#include "4coder_version.h"
#include "4coder_keycodes.h"
#include "4coder_style.h"
@@ -112,7 +114,9 @@ typedef struct Buffer_Identifier{
int id;
} Buffer_Identifier;
-enum Command_ID{
+typedef uint64_t Command_ID;
+
+enum{
cmdid_null,
cmdid_center_view,
@@ -177,6 +181,7 @@ enum Special_Hook_ID{
_hook_scroll_rule = hook_type_count,
_hook_new_file,
_hook_open_file,
+ _hook_command_caller,
};
// None of the members of *_Summary structs nor any of the data pointed
@@ -336,15 +341,23 @@ enum Input_Type_Flag{
#define OPEN_FILE_HOOK_SIG(name) int name(struct Application_Links *app, int buffer_id)
#define SCROLL_RULE_SIG(name) int name(float target_x, float target_y, float *scroll_x, float *scroll_y, int view_id, int is_new_target, float dt)
-extern "C"{
- typedef VIEW_ROUTINE_SIG(View_Routine_Function);
- typedef CUSTOM_COMMAND_SIG(Custom_Command_Function);
- typedef GET_BINDING_DATA(Get_Binding_Data_Function);
- typedef HOOK_SIG(Hook_Function);
-
- typedef OPEN_FILE_HOOK_SIG(Open_File_Hook_Function);
- typedef SCROLL_RULE_SIG(Scroll_Rule_Function);
-}
+typedef VIEW_ROUTINE_SIG(View_Routine_Function);
+typedef CUSTOM_COMMAND_SIG(Custom_Command_Function);
+typedef GET_BINDING_DATA(Get_Binding_Data_Function);
+typedef HOOK_SIG(Hook_Function);
+
+typedef OPEN_FILE_HOOK_SIG(Open_File_Hook_Function);
+typedef SCROLL_RULE_SIG(Scroll_Rule_Function);
+
+union Generic_Command{
+ Command_ID cmdid;
+ Custom_Command_Function *command;
+};
+
+#define COMMAND_CALLER_HOOK(name) int name(struct Application_Links *app, Generic_Command cmd)
+typedef COMMAND_CALLER_HOOK(Command_Caller_Hook_Function);
+
+
struct Application_Links;
#include "4coder_custom_api.h"
diff --git a/4coder_custom_api.h b/4coder_custom_api.h
index 803df366..685fc712 100644
--- a/4coder_custom_api.h
+++ b/4coder_custom_api.h
@@ -1,4 +1,4 @@
-#define EXEC_COMMAND_SIG(n) void n(Application_Links *app, int command_id)
+#define EXEC_COMMAND_SIG(n) void n(Application_Links *app, uint64_t command_id)
#define EXEC_SYSTEM_COMMAND_SIG(n) int n(Application_Links *app, View_Summary *view, Buffer_Identifier buffer, char *path, int path_len, char *command, int command_len, unsigned int flags)
#define CLIPBOARD_POST_SIG(n) void n(Application_Links *app, char *str, int len)
#define CLIPBOARD_COUNT_SIG(n) int n(Application_Links *app)
@@ -27,8 +27,6 @@
#define VIEW_SET_HIGHLIGHT_SIG(n) int n(Application_Links *app, View_Summary *view, int start, int end, int turn_on)
#define VIEW_SET_BUFFER_SIG(n) int n(Application_Links *app, View_Summary *view, int buffer_id, unsigned int flags)
#define VIEW_POST_FADE_SIG(n) int n(Application_Links *app, View_Summary *view, float seconds, int start, int end, unsigned int color)
-#define VIEW_SET_PASTE_REWRITE__SIG(n) void n(Application_Links *app, View_Summary *view)
-#define VIEW_GET_PASTE_REWRITE__SIG(n) int n(Application_Links *app, View_Summary *view)
#define GET_USER_INPUT_SIG(n) User_Input n(Application_Links *app, unsigned int get_type, unsigned int 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)
@@ -75,8 +73,6 @@ extern "C"{
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 VIEW_SET_PASTE_REWRITE__SIG(View_Set_Paste_Rewrite__Function);
- typedef VIEW_GET_PASTE_REWRITE__SIG(View_Get_Paste_Rewrite__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);
@@ -126,8 +122,6 @@ struct Application_Links{
View_Set_Highlight_Function *view_set_highlight;
View_Set_Buffer_Function *view_set_buffer;
View_Post_Fade_Function *view_post_fade;
- View_Set_Paste_Rewrite__Function *view_set_paste_rewrite_;
- View_Get_Paste_Rewrite__Function *view_get_paste_rewrite_;
Get_User_Input_Function *get_user_input;
Get_Command_Input_Function *get_command_input;
Get_Mouse_State_Function *get_mouse_state;
@@ -179,8 +173,6 @@ 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->view_set_paste_rewrite_ = View_Set_Paste_Rewrite_;\
-app_links->view_get_paste_rewrite_ = View_Get_Paste_Rewrite_;\
app_links->get_user_input = Get_User_Input;\
app_links->get_command_input = Get_Command_Input;\
app_links->get_mouse_state = Get_Mouse_State;\
diff --git a/4coder_default_bindings.cpp b/4coder_default_bindings.cpp
index 8337d8b9..132f6d53 100644
--- a/4coder_default_bindings.cpp
+++ b/4coder_default_bindings.cpp
@@ -148,12 +148,10 @@ HOOK_SIG(my_start){
}
OPEN_FILE_HOOK_SIG(my_file_settings){
- // NOTE(allen|a4): In hooks that want parameters, such as this file
- // opened hook. The file created hook is guaranteed to have only
- // and exactly one buffer parameter. In normal command callbacks
- // there are no parameter buffers.
+ // NOTE(allen|a4.0.8): The app->get_parameter_buffer was eliminated
+ // and instead the buffer is passed as an explicit parameter through
+ // the function call. That is where buffer_id comes from here.
unsigned int access = AccessProtected|AccessHidden;
- //Buffer_Summary buffer = app->get_parameter_buffer(app, 0, access);
Buffer_Summary buffer = app->get_buffer(app, buffer_id, access);
assert(buffer.exists);
@@ -184,6 +182,23 @@ OPEN_FILE_HOOK_SIG(my_file_settings){
return(0);
}
+// NOTE(allen|a4.0.9): All command calls can now go through this hook
+// If this hook is not implemented a default behavior of calling the
+// command is used. It is important to note that paste_next does not
+// work without this hook.
+COMMAND_CALLER_HOOK(my_command_caller){
+ View_Summary view = app->get_active_view(app, AccessAll);
+
+ view_paste_index[view.view_id].next_rewrite = false;
+
+ exec_command(app, cmd);
+
+ view_paste_index[view.view_id].rewrite =
+ view_paste_index[view.view_id].next_rewrite;
+
+ return(0);
+}
+
void
default_keys(Bind_Helper *context){
begin_map(context, mapid_global);
@@ -338,6 +353,7 @@ get_bindings(void *data, int size){
set_hook(context, hook_start, my_start);
set_open_file_hook(context, my_file_settings);
+ set_command_caller(context, my_command_caller);
set_scroll_rule(context, smooth_scroll_rule);
default_keys(context);
diff --git a/4coder_default_include.cpp b/4coder_default_include.cpp
index e1621e32..6c6e22d1 100644
--- a/4coder_default_include.cpp
+++ b/4coder_default_include.cpp
@@ -275,6 +275,8 @@ CUSTOM_COMMAND_SIG(cut){
}
struct View_Paste_Index{
+ int rewrite;
+ int next_rewrite;
int index;
};
@@ -287,10 +289,7 @@ CUSTOM_COMMAND_SIG(paste){
if (count > 0){
View_Summary view = app->get_active_view(app, access);
- // NOTE(allen): THIS is a very temporary poop-sauce
- // system that I just threw in to get this working.
- // Please don't start calling it anywhere.
- app->view_set_paste_rewrite_(app, &view);
+ view_paste_index[view.view_id].next_rewrite = true;
int paste_index = 0;
view_paste_index[view.view_id].index = paste_index;
@@ -329,8 +328,8 @@ CUSTOM_COMMAND_SIG(paste_next){
// NOTE(allen): THIS is a very temporary poop-sauce
// system that I just threw in to get this working.
// Please don't start calling it anywhere.
- if (app->view_get_paste_rewrite_(app, &view)){
- app->view_set_paste_rewrite_(app, &view);
+ if (view_paste_index[view.view_id].rewrite){
+ view_paste_index[view.view_id].next_rewrite = true;
int paste_index = view_paste_index[view.view_id].index + 1;
view_paste_index[view.view_id].index = paste_index;
diff --git a/4coder_helper.h b/4coder_helper.h
index 1aada635..00c9997b 100644
--- a/4coder_helper.h
+++ b/4coder_helper.h
@@ -196,6 +196,16 @@ set_new_file_hook(Bind_Helper *helper, Open_File_Hook_Function *func){
write_unit(helper, unit);
}
+inline void
+set_command_caller(Bind_Helper *helper, Command_Caller_Hook_Function *func){
+ Binding_Unit unit;
+ unit.type = unit_hook;
+ unit.hook.hook_id = _hook_command_caller;
+ unit.hook.func = (void*) func;
+
+ write_unit(helper, unit);
+}
+
inline void
set_scroll_rule(Bind_Helper *helper, Scroll_Rule_Function *func){
Binding_Unit unit;
@@ -263,6 +273,16 @@ exec_command(Application_Links *app, Custom_Command_Function *func){
func(app);
}
+inline void
+exec_command(Application_Links *app, Generic_Command cmd){
+ if (cmd.cmdid < cmdid_count){
+ exec_command(app, cmd.cmdid);
+ }
+ else{
+ exec_command(app, cmd.command);
+ }
+}
+
inline void
active_view_to_line(Application_Links *app, unsigned int access, int line_number){
View_Summary view;
diff --git a/4ed.cpp b/4ed.cpp
index 6e0e6d74..b4b29089 100644
--- a/4ed.cpp
+++ b/4ed.cpp
@@ -1005,12 +1005,24 @@ internal void
command_caller(Coroutine *coroutine){
Command_In *cmd_in = (Command_In*)coroutine->in;
Command_Data *cmd = cmd_in->cmd;
+ Models *models = cmd->models;
View *view = cmd->view;
- // TODO(allen): this isn't really super awesome, could have issues if
- // the file view get's change out under us.
view->next_mode = view_mode_zero();
- cmd_in->bind.function(cmd->system, cmd, cmd_in->bind);
+ if (models->command_caller){
+ Generic_Command generic;
+ if (cmd_in->bind.function == command_user_callback){
+ generic.command = cmd_in->bind.custom;
+ models->command_caller(&models->app_links, generic);
+ }
+ else{
+ generic.cmdid = (Command_ID)cmd_in->bind.custom_id;
+ models->command_caller(&models->app_links, generic);
+ }
+ }
+ else{
+ cmd_in->bind.function(cmd->system, cmd, cmd_in->bind);
+ }
view->mode = view->next_mode;
}
@@ -1773,6 +1785,10 @@ App_Init_Sig(app_init){
models->hook_new_file = (Open_File_Hook_Function*)unit->hook.func;
break;
+ case _hook_command_caller:
+ models->command_caller = (Command_Caller_Hook_Function*)unit->hook.func;
+ break;
+
case _hook_scroll_rule:
models->scroll_rule = (Scroll_Rule_Function*)unit->hook.func;
break;
diff --git a/4ed_api_implementation.cpp b/4ed_api_implementation.cpp
index 1cb66485..75ac0276 100644
--- a/4ed_api_implementation.cpp
+++ b/4ed_api_implementation.cpp
@@ -142,7 +142,7 @@ imp_get_view(Command_Data *cmd, View_Summary *view){
#define API_EXPORT
API_EXPORT void
-Exec_Command(Application_Links *app, int command_id)/*
+Exec_Command(Application_Links *app, uint64_t command_id)/*
DOC_PARAM(command_id, an integer id enumerated in 4coder_custom.h starting with cmdid)
DOC(Executes the command associated with the command_id passed in)
*/{
@@ -1331,6 +1331,7 @@ DOC_PARAM(color, the color to fade from)
return(result);
}
+/*
API_EXPORT void
View_Set_Paste_Rewrite_(Application_Links *app, View_Summary *view){
Command_Data *cmd = (Command_Data*)app->cmd_context;
@@ -1350,6 +1351,7 @@ View_Get_Paste_Rewrite_(Application_Links *app, View_Summary *view){
}
return(result);
}
+*/
API_EXPORT User_Input
Get_User_Input(Application_Links *app, unsigned int get_type, unsigned int abort_type)/*
diff --git a/4ed_app_models.h b/4ed_app_models.h
index 80c66a69..24a9865b 100644
--- a/4ed_app_models.h
+++ b/4ed_app_models.h
@@ -79,6 +79,7 @@ struct Models{
Open_File_Hook_Function *hook_open_file;
Open_File_Hook_Function *hook_new_file;
+ Command_Caller_Hook_Function *command_caller;
Scroll_Rule_Function *scroll_rule;
b32 keep_playing;
diff --git a/power/4coder_experiments.cpp b/power/4coder_experiments.cpp
index 93cb6c63..09435c06 100644
--- a/power/4coder_experiments.cpp
+++ b/power/4coder_experiments.cpp
@@ -273,6 +273,7 @@ get_bindings(void *data, int size){
set_hook(context, hook_start, experimental_start_hook);
set_open_file_hook(context, my_file_settings);
+ set_command_caller(context, my_command_caller);
set_scroll_rule(context, smooth_scroll_rule);