metagenerating delayed action stuff

This commit is contained in:
Allen Webster 2016-02-27 12:34:13 -05:00
parent bc9dac52ae
commit 7774bd6da0
9 changed files with 340 additions and 121 deletions

View File

@ -140,13 +140,16 @@ struct File_View_Summary{
struct User_Input{ struct User_Input{
int type; int type;
int abort;
union{ union{
Key_Event_Data key; Key_Event_Data key;
Mouse_State mouse; Mouse_State mouse;
}; };
int abort; unsigned long long command;
}; };
#define CommandEqual(c1,c2) ((unsigned long long)(c1) == (unsigned long long)(c2))
struct Query_Bar{ struct Query_Bar{
String prompt; String prompt;
String string; String string;

View File

@ -1,30 +1,30 @@
enum Key_Code{ enum Key_Code{
key_back = 1, key_back = 1,
key_up = 2, key_up = 2,
key_down = 3, key_down = 3,
key_left = 4, key_left = 4,
key_right = 5, key_right = 5,
key_del = 6, key_del = 6,
key_insert = 7, key_insert = 7,
key_home = 8, key_home = 8,
key_end = 11, key_end = 11,
key_page_up = 12, key_page_up = 12,
key_page_down = 13, key_page_down = 13,
key_esc = 14, key_esc = 14,
key_f1 = 127, key_f1 = 127,
key_f2 = 128, key_f2 = 128,
key_f3 = 129, key_f3 = 129,
key_f4 = 130, key_f4 = 130,
key_f5 = 131, key_f5 = 131,
key_f6 = 132, key_f6 = 132,
key_f7 = 133, key_f7 = 133,
key_f8 = 134, key_f8 = 134,
key_f9 = 135, key_f9 = 135,
key_f10 = 136, key_f10 = 136,
key_f11 = 137, key_f11 = 137,
key_f12 = 138, key_f12 = 138,
key_f13 = 139, key_f13 = 139,
key_f14 = 140, key_f14 = 140,
key_f15 = 141, key_f15 = 141,
key_f16 = 142, key_f16 = 142,
}; };

52
4ed.cpp
View File

@ -255,47 +255,39 @@ COMMAND_DECL(write_character){
} }
COMMAND_DECL(seek_whitespace_right){ COMMAND_DECL(seek_whitespace_right){
#if BUFFER_EXPERIMENT_SCALPEL <= 3
ProfileMomentFunction(); ProfileMomentFunction();
REQ_FILE_VIEW(view); REQ_FILE_VIEW(view);
REQ_FILE(file, view); REQ_FILE(file, view);
i32 pos = buffer_seek_whitespace_right(&file->state.buffer, view->cursor.pos); i32 pos = buffer_seek_whitespace_right(&file->state.buffer, view->cursor.pos);
view_cursor_move(view, pos); view_cursor_move(view, pos);
#endif
} }
COMMAND_DECL(seek_whitespace_left){ COMMAND_DECL(seek_whitespace_left){
#if BUFFER_EXPERIMENT_SCALPEL <= 3
ProfileMomentFunction(); ProfileMomentFunction();
REQ_FILE_VIEW(view); REQ_FILE_VIEW(view);
REQ_FILE(file, view); REQ_FILE(file, view);
i32 pos = buffer_seek_whitespace_left(&file->state.buffer, view->cursor.pos); i32 pos = buffer_seek_whitespace_left(&file->state.buffer, view->cursor.pos);
view_cursor_move(view, pos); view_cursor_move(view, pos);
#endif
} }
COMMAND_DECL(seek_whitespace_up){ COMMAND_DECL(seek_whitespace_up){
#if BUFFER_EXPERIMENT_SCALPEL <= 3
ProfileMomentFunction(); ProfileMomentFunction();
REQ_FILE_VIEW(view); REQ_FILE_VIEW(view);
REQ_FILE(file, view); REQ_FILE(file, view);
i32 pos = buffer_seek_whitespace_up(&file->state.buffer, view->cursor.pos); i32 pos = buffer_seek_whitespace_up(&file->state.buffer, view->cursor.pos);
view_cursor_move(view, pos); view_cursor_move(view, pos);
#endif
} }
COMMAND_DECL(seek_whitespace_down){ COMMAND_DECL(seek_whitespace_down){
#if BUFFER_EXPERIMENT_SCALPEL <= 3
ProfileMomentFunction(); ProfileMomentFunction();
REQ_FILE_VIEW(view); REQ_FILE_VIEW(view);
REQ_FILE(file, view); REQ_FILE(file, view);
i32 pos = buffer_seek_whitespace_down(&file->state.buffer, view->cursor.pos); i32 pos = buffer_seek_whitespace_down(&file->state.buffer, view->cursor.pos);
view_cursor_move(view, pos); view_cursor_move(view, pos);
#endif
} }
internal i32 internal i32
@ -2183,6 +2175,22 @@ extern "C"{
return(result); return(result);
} }
BUFFER_SAVE_SIG(external_buffer_save){
Command_Data *cmd = (Command_Data*)context->data;
Editing_File *file;
Working_Set *working_set;
Delay *delay;
if (buffer->exists){
delay = cmd->delay;
working_set = cmd->working_set;
file = working_set->files + buffer->buffer_id;
if (!file->state.is_dummy && file_is_ready(file) && buffer_needs_save(file)){
}
}
}
GET_VIEW_MAX_INDEX_SIG(external_get_view_max_index){ GET_VIEW_MAX_INDEX_SIG(external_get_view_max_index){
Command_Data *cmd = (Command_Data*)context->data; Command_Data *cmd = (Command_Data*)context->data;
Live_Views *live_set = cmd->live_set; Live_Views *live_set = cmd->live_set;
@ -2390,7 +2398,7 @@ app_links_init(System_Functions *system){
app_links.buffer_seek_delimiter = external_buffer_seek_delimiter; app_links.buffer_seek_delimiter = external_buffer_seek_delimiter;
app_links.buffer_read_range = external_buffer_read_range; app_links.buffer_read_range = external_buffer_read_range;
app_links.buffer_replace_range = external_buffer_replace_range; app_links.buffer_replace_range = external_buffer_replace_range;
app_links.buffer_save = 0;//external_buffer_save; app_links.buffer_save = external_buffer_save;
app_links.get_view_max_index = external_get_view_max_index; app_links.get_view_max_index = external_get_view_max_index;
app_links.get_file_view = external_get_file_view; app_links.get_file_view = external_get_file_view;
@ -3889,6 +3897,7 @@ App_Step_Sig(app_step){
Delayed_Action *act = vars->delay.acts + i; Delayed_Action *act = vars->delay.acts + i;
String *string = &act->string; String *string = &act->string;
Panel *panel = act->panel; Panel *panel = act->panel;
Editing_File *file = act->file;
switch (act->type){ switch (act->type){
case DACT_OPEN: case DACT_OPEN:
@ -3901,23 +3910,28 @@ App_Step_Sig(app_step){
case DACT_SAVE_AS: case DACT_SAVE_AS:
{ {
View *view = panel->view; if (!file){
File_View *fview = view_to_file_view(view); View *view = panel->view;
File_View *fview = view_to_file_view(view);
if (!fview && view->is_minor) fview = view_to_file_view(view->major); if (!fview && view->is_minor) fview = view_to_file_view(view->major);
if (fview){
Editing_File *file = fview->file; if (fview){
if (file && !file->state.is_dummy){ file = working_set_lookup_file(working_set, *string);
i32 sys_id = file_save_and_set_names(system, exchange, mem, working_set, file, string->str);
app_push_file_binding(vars, sys_id, get_file_id(working_set, file));
} }
} }
if (file && !file->state.is_dummy){
i32 sys_id = file_save_and_set_names(system, exchange, mem, working_set, file, string->str);
app_push_file_binding(vars, sys_id, get_file_id(working_set, file));
}
}break; }break;
case DACT_SAVE: case DACT_SAVE:
{ {
Editing_File *file = working_set_lookup_file(working_set, *string); if (!file){
if (!file->state.is_dummy){ file = working_set_lookup_file(working_set, *string);
}
if (!file->state.is_dummy && buffer_needs_save(file)){
i32 sys_id = file_save(system, exchange, mem, file, file->name.source_path.str); i32 sys_id = file_save(system, exchange, mem, file, file->name.source_path.str);
app_push_file_binding(vars, sys_id, get_file_id(working_set, file)); app_push_file_binding(vars, sys_id, get_file_id(working_set, file));
} }

View File

@ -52,6 +52,7 @@
#include "4ed_style.cpp" #include "4ed_style.cpp"
#include "4ed_file.cpp" #include "4ed_file.cpp"
#include "4ed_gui.cpp" #include "4ed_gui.cpp"
#include "4ed_delay.cpp"
#include "4ed_file_view.cpp" #include "4ed_file_view.cpp"
#include "4ed_color_view.cpp" #include "4ed_color_view.cpp"
#include "4ed_interactive_view.cpp" #include "4ed_interactive_view.cpp"

74
4ed_delay.cpp Normal file
View File

@ -0,0 +1,74 @@
enum Action_Type{
DACT_OPEN,
DACT_SAVE_AS,
DACT_SAVE,
DACT_NEW,
DACT_SWITCH,
DACT_TRY_KILL,
DACT_KILL,
DACT_CLOSE_MINOR,
DACT_CLOSE_MAJOR,
DACT_THEME_OPTIONS,
DACT_KEYBOARD_OPTIONS,
};
struct Delayed_Action{
Action_Type type;
String string;
Panel* panel;
Editing_File* file;
};
struct Delay{
Delayed_Action* acts;
i32 count;
i32 max;
};
inline Delayed_Action*
delayed_action(Delay *delay, Action_Type type){
Delayed_Action *result;
Assert(delay->count < delay->max);
result = delay->acts + delay->count++;
*result = {};
result->type = type;
return(result);
}
inline Delayed_Action*
delayed_action(Delay *delay, Action_Type type, Panel* panel){
Delayed_Action *result;
result = delayed_action(delay, type);
result->panel = panel;
return(result);
}
inline Delayed_Action*
delayed_action(Delay *delay, Action_Type type, String string, Panel* panel){
Delayed_Action *result;
result = delayed_action(delay, type);
result->string = string;
result->panel = panel;
return(result);
}
inline Delayed_Action*
delayed_action(Delay *delay, Action_Type type, String string, Editing_File* file){
Delayed_Action *result;
result = delayed_action(delay, type);
result->string = string;
result->file = file;
return(result);
}
#define delayed_open(delay, ...) delayed_action(delay, DACT_OPEN, __VA_ARGS__)
#define delayed_save_as(delay, ...) delayed_action(delay, DACT_SAVE_AS, __VA_ARGS__)
#define delayed_save(delay, ...) delayed_action(delay, DACT_SAVE, __VA_ARGS__)
#define delayed_new(delay, ...) delayed_action(delay, DACT_NEW, __VA_ARGS__)
#define delayed_switch(delay, ...) delayed_action(delay, DACT_SWITCH, __VA_ARGS__)
#define delayed_try_kill(delay, ...) delayed_action(delay, DACT_TRY_KILL, __VA_ARGS__)
#define delayed_kill(delay, ...) delayed_action(delay, DACT_KILL, __VA_ARGS__)
#define delayed_close_minor(delay, ...) delayed_action(delay, DACT_CLOSE_MINOR, __VA_ARGS__)
#define delayed_close_major(delay, ...) delayed_action(delay, DACT_CLOSE_MAJOR, __VA_ARGS__)
#define delayed_theme_options(delay, ...) delayed_action(delay, DACT_THEME_OPTIONS, __VA_ARGS__)
#define delayed_keyboard_options(delay, ...) delayed_action(delay, DACT_KEYBOARD_OPTIONS, __VA_ARGS__)

View File

@ -374,5 +374,30 @@ hot_directory_first_match(Hot_Directory *hot_directory,
return result; return result;
} }
enum File_Sync_State{
SYNC_GOOD,
SYNC_BEHIND_OS,
SYNC_UNSAVED
};
inline File_Sync_State
buffer_get_sync(Editing_File *file){
File_Sync_State result = SYNC_GOOD;
if (file->state.last_4ed_write_time != file->state.last_sys_write_time)
result = SYNC_BEHIND_OS;
else if (file->state.last_4ed_edit_time > file->state.last_sys_write_time)
result = SYNC_UNSAVED;
return result;
}
inline b32
buffer_needs_save(Editing_File *file){
b32 result = 0;
if (file->settings.unimportant == 0)
if (buffer_get_sync(file) == SYNC_UNSAVED)
result = 1;
return(result);
}
// BOTTOM // BOTTOM

View File

@ -19,42 +19,6 @@ struct Incremental_Search{
i32 pos; i32 pos;
}; };
enum Action_Type{
DACT_OPEN,
DACT_SAVE_AS,
DACT_SAVE,
DACT_NEW,
DACT_SWITCH,
DACT_TRY_KILL,
DACT_KILL,
DACT_CLOSE_MINOR,
DACT_CLOSE_MAJOR,
DACT_THEME_OPTIONS,
DACT_KEYBOARD_OPTIONS
};
struct Delayed_Action{
Action_Type type;
String string;
Panel *panel;
};
struct Delay{
Delayed_Action acts[8];
i32 count, max;
};
inline void
delayed_action(Delay *delay, Action_Type type,
String string, Panel *panel){
Assert(delay->count < delay->max);
Delayed_Action action;
action.type = type;
action.string = string;
action.panel = panel;
delay->acts[delay->count++] = action;
}
enum File_View_Widget_Type{ enum File_View_Widget_Type{
FWIDG_NONE, FWIDG_NONE,
//FWIDG_SEARCH, //FWIDG_SEARCH,
@ -2959,31 +2923,6 @@ step_file_view(System_Functions *system, View *view_, i32_Rect rect,
return result; return result;
} }
enum File_Sync_State{
SYNC_GOOD,
SYNC_BEHIND_OS,
SYNC_UNSAVED
};
inline File_Sync_State
buffer_get_sync(Editing_File *file){
File_Sync_State result = SYNC_GOOD;
if (file->state.last_4ed_write_time != file->state.last_sys_write_time)
result = SYNC_BEHIND_OS;
else if (file->state.last_4ed_edit_time > file->state.last_sys_write_time)
result = SYNC_UNSAVED;
return result;
}
inline b32
buffer_needs_save(Editing_File *file){
b32 result = 0;
if (file->settings.unimportant == 0)
if (buffer_get_sync(file) == SYNC_UNSAVED)
result = 1;
return(result);
}
internal void internal void
draw_file_setup_bar(Style *style, i32 line_height, Interactive_Bar *bar, i32_Rect *rect){ draw_file_setup_bar(Style *style, i32 line_height, Interactive_Bar *bar, i32_Rect *rect){
bar->style = style->main.file_info_style; bar->style = style->main.file_info_style;

View File

@ -55,14 +55,13 @@ interactive_view_complete(Interactive_View *view){
Panel *panel = view->view_base.panel; Panel *panel = view->view_base.panel;
switch (view->action){ switch (view->action){
case INTV_OPEN: case INTV_OPEN:
delayed_action(view->delay, DACT_OPEN, delayed_open(view->delay, view->hot_directory->string, panel);
view->hot_directory->string, panel); break;
break;
case INTV_SAVE_AS: case INTV_SAVE_AS:
delayed_action(view->delay, DACT_SAVE_AS, view->hot_directory->string, panel); delayed_save_as(view->delay, view->hot_directory->string, panel);
delayed_action(view->delay, DACT_CLOSE_MINOR, {}, panel); delayed_close_minor(view->delay, panel);
break; break;
case INTV_NEW: case INTV_NEW:
delayed_action(view->delay, DACT_NEW, view->hot_directory->string, panel); delayed_action(view->delay, DACT_NEW, view->hot_directory->string, panel);

View File

@ -11,10 +11,43 @@
#define ArrayCount(a) (sizeof(a)/sizeof(*a)) #define ArrayCount(a) (sizeof(a)/sizeof(*a))
struct Struct_Field{
char *type;
char *name;
};
void to_lower(char *src, char *dst){
char *c, ch;
for (c = src; *c != 0; ++c){
ch = *c;
if (ch >= 'A' && ch <= 'Z'){
ch += ('a' - 'A');
}
*dst++ = ch;
}
*dst = 0;
}
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
void struct_begin(FILE *file, char *name){
fprintf(file, "struct %s{\n", name);
}
void struct_fields(FILE *file, Struct_Field *fields, int count){
int i;
for (i = 0; i < count; ++i){
fprintf(file, " %s %s;\n", fields[i].type, fields[i].name);
}
}
void struct_end(FILE *file){
fprintf(file, "};\n\n");
}
char *keys_that_need_codes[] = { char *keys_that_need_codes[] = {
"back", "back",
"up", "up",
@ -48,9 +81,9 @@ char *keys_that_need_codes[] = {
"f16", "f16",
}; };
void generate_keycode_enum(){ char* generate_keycode_enum(){
FILE *file; FILE *file;
char filename[] = "4coder_keycodes.h"; char *filename = "4coder_keycodes.h";
int i, count; int i, count;
unsigned char code = 1; unsigned char code = 1;
@ -66,17 +99,148 @@ void generate_keycode_enum(){
case '\t': code++; break; case '\t': code++; break;
case 0x20: code = 0x7F; break; case 0x20: code = 0x7F; break;
default: default:
fprintf(file, "key_%s = %d,\n", keys_that_need_codes[i++], code++); fprintf(file, " key_%s = %d,\n", keys_that_need_codes[i++], code++);
break; break;
} }
} }
fprintf(file, "};\n"); fprintf(file, "};\n");
fclose(file); fclose(file);
printf("gen success: %s\n", filename); return(filename);
}
char daction_enum_name[] = "Action_Type";
char *daction_enum[] = {
"OPEN",
"SAVE_AS",
"SAVE",
"NEW",
"SWITCH",
"TRY_KILL",
"KILL",
"CLOSE_MINOR",
"CLOSE_MAJOR",
"THEME_OPTIONS",
"KEYBOARD_OPTIONS"
};
char daction_name[] = "Delayed_Action";
Struct_Field daction_fields[] = {
{"Action_Type", "type"},
};
Struct_Field daction_fields_primary[] = {
{"String", "string"},
{"Panel*", "panel"},
{"Editing_File*", "file"},
};
enum Daction_Field_Handle{
dfph_null,
dfph_string,
dfph_panel,
dfph_file,
};
Daction_Field_Handle dact_param_sets[] = {
dfph_panel, dfph_null,
dfph_string, dfph_panel, dfph_null,
dfph_string, dfph_file, dfph_null
};
char delay_name[] = "Delay";
Struct_Field delay_fields[] = {
{"Delayed_Action*", "acts"},
{"i32", "count"},
{"i32", "max"},
};
// TODO(allen): Make delay buffer expandable (general memory probably)
char delayed_action_function_top[] =
"inline Delayed_Action*\n"
"delayed_action(Delay *delay, Action_Type type";
char delayed_action_function_bottom[] =
"){\n"
" Delayed_Action *result;\n"
" Assert(delay->count < delay->max);\n"
" result = delay->acts + delay->count++;\n"
" *result = {};\n"
" result->type = type;\n"
" return(result);\n"
"}\n\n";
char delayed_action_special_param[] = ", %s %s";
char delayed_action_specialized_middle[] =
"){\n"
" Delayed_Action *result;\n"
" result = delayed_action(delay, type);\n";
char delayed_action_special_line[] =
" result->%s = %s;\n";
char delayed_action_specialized_bottom[] =
" return(result);\n"
"}\n\n";
char delayed_action_macro[] =
"#define delayed_%s(delay, ...) delayed_action(delay, DACT_%s, __VA_ARGS__)\n";
char* generate_delayed_action(){
FILE *file;
char *filename = "4ed_delay.cpp";
char scratch[256];
int i,j;
file = fopen(filename, "wb");
fprintf(file, "enum %s{\n", daction_enum_name);
for (i = 0; i < ArrayCount(daction_enum); ++i){
fprintf(file, " DACT_%s,\n", daction_enum[i]);
}
fprintf(file, "};\n\n");
struct_begin(file, daction_name);
struct_fields(file, daction_fields, ArrayCount(daction_fields));
struct_fields(file, daction_fields_primary, ArrayCount(daction_fields_primary));
struct_end(file);
struct_begin(file, delay_name);
struct_fields(file, delay_fields, ArrayCount(delay_fields));
struct_end(file);
fprintf(file, "%s%s", delayed_action_function_top, delayed_action_function_bottom);
for (i = 0; i < ArrayCount(dact_param_sets); ++i){
j = i;
fprintf(file, "%s", delayed_action_function_top);
for (; dact_param_sets[i] != dfph_null; ++i){
Struct_Field field = daction_fields_primary[dact_param_sets[i] - 1];
fprintf(file, delayed_action_special_param, field.type, field.name);
}
fprintf(file, "%s", delayed_action_specialized_middle);
for (; dact_param_sets[j] != dfph_null; ++j){
Struct_Field field = daction_fields_primary[dact_param_sets[j] - 1];
fprintf(file, delayed_action_special_line, field.name, field.name);
}
fprintf(file, "%s", delayed_action_specialized_bottom);
}
for (i = 0; i < ArrayCount(daction_enum); ++i){
to_lower(daction_enum[i], scratch);
fprintf(file, delayed_action_macro, scratch, daction_enum[i]);
}
return(filename);
} }
int main(){ int main(){
generate_keycode_enum(); char *filename;
filename = generate_keycode_enum();
printf("gen success: %s\n", filename);
filename = generate_delayed_action();
printf("gen success: %s\n", filename);
} }
// BOTTOM // BOTTOM