metagenerating delayed action stuff
This commit is contained in:
parent
bc9dac52ae
commit
7774bd6da0
|
@ -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;
|
||||||
|
|
|
@ -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
52
4ed.cpp
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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;
|
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
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
174
4ed_metagen.cpp
174
4ed_metagen.cpp
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue