metagenerating delayed action stuff
parent
bc9dac52ae
commit
7774bd6da0
|
@ -140,13 +140,16 @@ struct File_View_Summary{
|
|||
|
||||
struct User_Input{
|
||||
int type;
|
||||
int abort;
|
||||
union{
|
||||
Key_Event_Data key;
|
||||
Mouse_State mouse;
|
||||
};
|
||||
int abort;
|
||||
unsigned long long command;
|
||||
};
|
||||
|
||||
#define CommandEqual(c1,c2) ((unsigned long long)(c1) == (unsigned long long)(c2))
|
||||
|
||||
struct Query_Bar{
|
||||
String prompt;
|
||||
String string;
|
||||
|
|
40
4ed.cpp
40
4ed.cpp
|
@ -255,47 +255,39 @@ COMMAND_DECL(write_character){
|
|||
}
|
||||
|
||||
COMMAND_DECL(seek_whitespace_right){
|
||||
#if BUFFER_EXPERIMENT_SCALPEL <= 3
|
||||
ProfileMomentFunction();
|
||||
REQ_FILE_VIEW(view);
|
||||
REQ_FILE(file, view);
|
||||
|
||||
i32 pos = buffer_seek_whitespace_right(&file->state.buffer, view->cursor.pos);
|
||||
view_cursor_move(view, pos);
|
||||
#endif
|
||||
}
|
||||
|
||||
COMMAND_DECL(seek_whitespace_left){
|
||||
#if BUFFER_EXPERIMENT_SCALPEL <= 3
|
||||
ProfileMomentFunction();
|
||||
REQ_FILE_VIEW(view);
|
||||
REQ_FILE(file, view);
|
||||
|
||||
i32 pos = buffer_seek_whitespace_left(&file->state.buffer, view->cursor.pos);
|
||||
view_cursor_move(view, pos);
|
||||
#endif
|
||||
}
|
||||
|
||||
COMMAND_DECL(seek_whitespace_up){
|
||||
#if BUFFER_EXPERIMENT_SCALPEL <= 3
|
||||
ProfileMomentFunction();
|
||||
REQ_FILE_VIEW(view);
|
||||
REQ_FILE(file, view);
|
||||
|
||||
i32 pos = buffer_seek_whitespace_up(&file->state.buffer, view->cursor.pos);
|
||||
view_cursor_move(view, pos);
|
||||
#endif
|
||||
}
|
||||
|
||||
COMMAND_DECL(seek_whitespace_down){
|
||||
#if BUFFER_EXPERIMENT_SCALPEL <= 3
|
||||
ProfileMomentFunction();
|
||||
REQ_FILE_VIEW(view);
|
||||
REQ_FILE(file, view);
|
||||
|
||||
i32 pos = buffer_seek_whitespace_down(&file->state.buffer, view->cursor.pos);
|
||||
view_cursor_move(view, pos);
|
||||
#endif
|
||||
}
|
||||
|
||||
internal i32
|
||||
|
@ -2183,6 +2175,22 @@ extern "C"{
|
|||
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){
|
||||
Command_Data *cmd = (Command_Data*)context->data;
|
||||
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_read_range = external_buffer_read_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_file_view = external_get_file_view;
|
||||
|
@ -3889,6 +3897,7 @@ App_Step_Sig(app_step){
|
|||
Delayed_Action *act = vars->delay.acts + i;
|
||||
String *string = &act->string;
|
||||
Panel *panel = act->panel;
|
||||
Editing_File *file = act->file;
|
||||
|
||||
switch (act->type){
|
||||
case DACT_OPEN:
|
||||
|
@ -3901,23 +3910,28 @@ App_Step_Sig(app_step){
|
|||
|
||||
case DACT_SAVE_AS:
|
||||
{
|
||||
if (!file){
|
||||
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){
|
||||
Editing_File *file = fview->file;
|
||||
file = working_set_lookup_file(working_set, *string);
|
||||
}
|
||||
}
|
||||
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;
|
||||
|
||||
case DACT_SAVE:
|
||||
{
|
||||
Editing_File *file = working_set_lookup_file(working_set, *string);
|
||||
if (!file->state.is_dummy){
|
||||
if (!file){
|
||||
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);
|
||||
app_push_file_binding(vars, sys_id, get_file_id(working_set, file));
|
||||
}
|
||||
|
|
|
@ -52,6 +52,7 @@
|
|||
#include "4ed_style.cpp"
|
||||
#include "4ed_file.cpp"
|
||||
#include "4ed_gui.cpp"
|
||||
#include "4ed_delay.cpp"
|
||||
#include "4ed_file_view.cpp"
|
||||
#include "4ed_color_view.cpp"
|
||||
#include "4ed_interactive_view.cpp"
|
||||
|
|
|
@ -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__)
|
25
4ed_file.cpp
25
4ed_file.cpp
|
@ -374,5 +374,30 @@ hot_directory_first_match(Hot_Directory *hot_directory,
|
|||
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
|
||||
|
||||
|
|
|
@ -19,42 +19,6 @@ struct Incremental_Search{
|
|||
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{
|
||||
FWIDG_NONE,
|
||||
//FWIDG_SEARCH,
|
||||
|
@ -2959,31 +2923,6 @@ step_file_view(System_Functions *system, View *view_, i32_Rect rect,
|
|||
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
|
||||
draw_file_setup_bar(Style *style, i32 line_height, Interactive_Bar *bar, i32_Rect *rect){
|
||||
bar->style = style->main.file_info_style;
|
||||
|
|
|
@ -55,13 +55,12 @@ interactive_view_complete(Interactive_View *view){
|
|||
Panel *panel = view->view_base.panel;
|
||||
switch (view->action){
|
||||
case INTV_OPEN:
|
||||
delayed_action(view->delay, DACT_OPEN,
|
||||
view->hot_directory->string, panel);
|
||||
delayed_open(view->delay, view->hot_directory->string, panel);
|
||||
break;
|
||||
|
||||
case INTV_SAVE_AS:
|
||||
delayed_action(view->delay, DACT_SAVE_AS, view->hot_directory->string, panel);
|
||||
delayed_action(view->delay, DACT_CLOSE_MINOR, {}, panel);
|
||||
delayed_save_as(view->delay, view->hot_directory->string, panel);
|
||||
delayed_close_minor(view->delay, panel);
|
||||
break;
|
||||
|
||||
case INTV_NEW:
|
||||
|
|
172
4ed_metagen.cpp
172
4ed_metagen.cpp
|
@ -11,10 +11,43 @@
|
|||
|
||||
#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 <stdio.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[] = {
|
||||
"back",
|
||||
"up",
|
||||
|
@ -48,9 +81,9 @@ char *keys_that_need_codes[] = {
|
|||
"f16",
|
||||
};
|
||||
|
||||
void generate_keycode_enum(){
|
||||
char* generate_keycode_enum(){
|
||||
FILE *file;
|
||||
char filename[] = "4coder_keycodes.h";
|
||||
char *filename = "4coder_keycodes.h";
|
||||
int i, count;
|
||||
unsigned char code = 1;
|
||||
|
||||
|
@ -72,11 +105,142 @@ void generate_keycode_enum(){
|
|||
}
|
||||
fprintf(file, "};\n");
|
||||
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(){
|
||||
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
|
||||
|
|
Loading…
Reference in New Issue