4coder/4coder_custom.h

459 lines
9.2 KiB
C
Raw Normal View History

2016-02-01 05:03:42 +00:00
2016-03-24 01:05:28 +00:00
#ifndef FCODER_CUSTOM_H
#define FCODER_CUSTOM_H
2016-03-04 06:06:11 +00:00
#include "4coder_version.h"
2016-02-25 23:52:11 +00:00
#include "4coder_keycodes.h"
2016-03-04 23:10:00 +00:00
#include "4coder_style.h"
#include "4coder_rect.h"
#include "4coder_mem.h"
#include "4coder_buffer_types.h"
#include "4coder_gui.h"
2016-03-03 19:27:09 +00:00
#ifndef FRED_STRING_STRUCT
#define FRED_STRING_STRUCT
typedef struct String{
char *str;
int size;
int memory_size;
} String;
typedef struct Offset_String{
int offset;
int size;
} Offset_String;
#endif
typedef unsigned char Code;
typedef enum{
MDFR_SHIFT_INDEX,
MDFR_CONTROL_INDEX,
MDFR_ALT_INDEX,
MDFR_CAPS_INDEX,
// always last
MDFR_INDEX_COUNT
} Key_Control;
typedef struct Key_Event_Data{
Code keycode;
Code character;
Code character_no_caps_lock;
char modifiers[MDFR_INDEX_COUNT];
} Key_Event_Data;
inline Key_Event_Data
key_event_data_zero(){
Key_Event_Data data={0};
return(data);
}
2016-03-03 19:27:09 +00:00
typedef struct Mouse_State{
char l, r;
char press_l, press_r;
char release_l, release_r;
char wheel;
char out_of_window;
int x, y;
} Mouse_State;
typedef union Range{
struct{
int min, max;
};
struct{
int start, end;
};
} Range;
inline Range
make_range(int p1, int p2){
Range range;
if (p1 < p2){
range.min = p1;
range.max = p2;
}
else{
range.min = p2;
range.max = p1;
}
return(range);
}
typedef enum Dynamic_Type{
dynamic_type_int,
dynamic_type_string,
// never below this
dynamic_type_count
} Dynamic_Type;
typedef struct Dynamic{
int type;
union{
struct{
int str_len;
char *str_value;
};
int int_value;
};
} Dynamic;
inline Dynamic
dynamic_int(int x){
Dynamic result;
result.type = dynamic_type_int;
result.int_value = x;
return result;
}
inline Dynamic
dynamic_string(const char *string, int len){
Dynamic result;
result.type = dynamic_type_string;
result.str_len = len;
result.str_value = (char*)(string);
return result;
}
inline int
dynamic_to_int(Dynamic *dynamic){
int result = 0;
if (dynamic->type == dynamic_type_int){
result = dynamic->int_value;
}
return result;
}
inline char*
dynamic_to_string(Dynamic *dynamic, int *len){
char *result = 0;
if (dynamic->type == dynamic_type_string){
result = dynamic->str_value;
*len = dynamic->str_len;
}
return result;
}
inline int
dynamic_to_bool(Dynamic *dynamic){
int result = 0;
if (dynamic->type == dynamic_type_int){
result = (dynamic->int_value != 0);
}
else{
result = 1;
}
return result;
}
typedef struct File_Info{
String filename;
int folder;
} File_Info;
typedef struct File_List{
// Ignore this, it's for internal stuff.
void *block;
// The list of files and folders.
File_Info *infos;
int count;
// Ignore this, it's for internal stuff.
int block_size;
} File_List;
2016-03-07 05:13:20 +00:00
#define MDFR_NONE 0x0
#define MDFR_CTRL 0x1
#define MDFR_ALT 0x2
#define MDFR_SHIFT 0x4
2016-02-01 05:03:42 +00:00
enum Command_ID{
cmdid_null,
2016-03-04 23:10:00 +00:00
cmdid_seek_left,
cmdid_seek_right,
2016-03-21 22:27:27 +00:00
cmdid_center_view,
2016-02-20 21:36:16 +00:00
cmdid_word_complete,
2016-02-01 05:03:42 +00:00
cmdid_copy,
cmdid_cut,
cmdid_paste,
cmdid_paste_next,
2016-02-01 05:03:42 +00:00
cmdid_undo,
cmdid_redo,
cmdid_history_backward,
cmdid_history_forward,
2016-02-01 05:03:42 +00:00
cmdid_interactive_new,
cmdid_interactive_open,
cmdid_reopen,
cmdid_save,
cmdid_interactive_switch_buffer,
cmdid_interactive_kill_buffer,
cmdid_kill_buffer,
cmdid_change_active_panel,
2016-02-01 05:03:42 +00:00
cmdid_to_uppercase,
cmdid_to_lowercase,
cmdid_toggle_line_wrap,
2016-02-01 05:03:42 +00:00
cmdid_toggle_show_whitespace,
2016-02-01 05:03:42 +00:00
cmdid_eol_dosify,
cmdid_eol_nixify,
cmdid_clean_all_lines,
2016-02-01 05:03:42 +00:00
cmdid_auto_tab_range,
2016-02-01 05:03:42 +00:00
cmdid_open_panel_vsplit,
cmdid_open_panel_hsplit,
cmdid_close_panel,
2016-02-01 05:03:42 +00:00
cmdid_page_up,
cmdid_page_down,
cmdid_open_color_tweaker,
cmdid_open_config,
2016-02-01 05:03:42 +00:00
cmdid_open_menu,
cmdid_open_debug,
cmdid_hide_scrollbar,
cmdid_show_scrollbar,
2016-02-01 05:03:42 +00:00
cmdid_set_settings,
2016-02-28 20:30:51 +00:00
cmdid_command_line,
2016-02-01 05:03:42 +00:00
//
cmdid_count
};
enum Param_ID{
par_range_start,
par_range_end,
2016-02-01 05:03:42 +00:00
par_name,
2016-02-28 20:30:51 +00:00
par_buffer_id,
par_do_in_background,
2016-03-04 23:10:00 +00:00
par_flags,
2016-02-01 05:03:42 +00:00
par_lex_as_cpp_file,
par_wrap_lines,
par_key_mapid,
par_show_whitespace,
2016-02-01 05:03:42 +00:00
par_cli_path,
par_cli_command,
par_clear_blank_lines,
par_use_tabs,
2016-03-24 01:05:28 +00:00
par_save_update_name,
2016-02-01 05:03:42 +00:00
// never below this
par_type_count
};
2016-03-04 06:06:11 +00:00
#define CLI_OverlapWithConflict 0x1
#define CLI_AlwaysBindToView 0x2
// These are regular hooks, any of them can be set to any function
// that matches the HOOK_SIG pattern.
2016-02-01 05:03:42 +00:00
enum Hook_ID{
hook_start,
hook_open_file,
2016-03-20 03:09:00 +00:00
hook_new_file,
hook_file_out_of_sync,
2016-02-01 05:03:42 +00:00
// never below this
hook_type_count
};
2016-03-04 06:06:11 +00:00
// These are for special hooks, each must bind to specialized signatures
// that do not necessarily have access to the app pointer.
enum Special_Hook_ID{
_hook_scroll_rule = hook_type_count,
};
// None of the members of *_Summary structs nor any of the data pointed
// to by the members should be modified, I would have made them all
// const... but that causes a lot problems for C++ reasons.
2016-02-01 05:03:42 +00:00
struct Buffer_Summary{
int exists;
int ready;
2016-02-26 17:40:51 +00:00
int buffer_id;
2016-02-01 05:03:42 +00:00
int size;
int file_name_len;
int buffer_name_len;
2016-02-25 00:04:08 +00:00
char *file_name;
char *buffer_name;
2016-02-01 05:03:42 +00:00
2016-02-26 17:40:51 +00:00
int buffer_cursor_pos;
2016-02-01 05:03:42 +00:00
int is_lexed;
int map_id;
};
inline Buffer_Summary
buffer_summary_zero(){
Buffer_Summary summary={0};
return(summary);
}
2016-02-01 05:03:42 +00:00
2016-03-03 04:10:45 +00:00
struct View_Summary{
int exists;
int view_id;
2016-02-26 17:40:51 +00:00
int buffer_id;
2016-03-04 23:10:00 +00:00
int locked_buffer_id;
int hidden_buffer_id;
Full_Cursor cursor;
Full_Cursor mark;
2016-02-25 00:04:08 +00:00
float preferred_x;
float line_height;
2016-02-25 00:04:08 +00:00
int unwrapped_lines;
int show_whitespace;
};
inline View_Summary
view_summary_zero(){
View_Summary summary={0};
return(summary);
}
enum User_Input_Type{
2016-05-25 15:22:56 +00:00
UserInputNone,
UserInputKey,
UserInputMouse
};
2016-02-26 17:40:51 +00:00
struct User_Input{
2016-02-27 07:44:17 +00:00
int type;
2016-02-27 17:34:13 +00:00
int abort;
2016-02-27 07:44:17 +00:00
union{
Key_Event_Data key;
Mouse_State mouse;
};
2016-02-27 17:34:13 +00:00
unsigned long long command;
2016-02-26 17:40:51 +00:00
};
2016-02-27 17:34:13 +00:00
#define CommandEqual(c1,c2) ((unsigned long long)(c1) == (unsigned long long)(c2))
2016-02-27 07:44:17 +00:00
struct Query_Bar{
2016-02-26 17:40:51 +00:00
String prompt;
String string;
};
enum Event_Message_Type{
2016-05-25 15:22:56 +00:00
EM_No_Message,
EM_Open_View,
EM_Frame,
EM_Close_View
};
struct Event_Message{
int type;
};
2016-03-05 04:10:55 +00:00
struct Theme_Color{
Style_Tag tag;
unsigned int color;
};
#define VIEW_ROUTINE_SIG(name) void name(struct Application_Links *app, int view_id)
2016-02-25 23:52:11 +00:00
#define GET_BINDING_DATA(name) int name(void *data, int size)
#define CUSTOM_COMMAND_SIG(name) void name(struct Application_Links *app)
2016-03-07 05:13:20 +00:00
#define HOOK_SIG(name) int name(struct Application_Links *app)
2016-03-03 00:50:04 +00:00
#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)
2016-02-01 05:03:42 +00:00
extern "C"{
typedef VIEW_ROUTINE_SIG(View_Routine_Function);
2016-02-01 05:03:42 +00:00
typedef CUSTOM_COMMAND_SIG(Custom_Command_Function);
typedef GET_BINDING_DATA(Get_Binding_Data_Function);
typedef HOOK_SIG(Hook_Function);
2016-03-03 00:50:04 +00:00
typedef SCROLL_RULE_SIG(Scroll_Rule_Function);
2016-02-01 05:03:42 +00:00
}
struct Application_Links;
#include "4coder_custom_api.h"
// Boundry type flags
#define BoundryWhitespace 0x1
#define BoundryToken 0x2
#define BoundryAlphanumeric 0x4
#define BoundryCamelCase 0x8
// Input type flags
#define EventOnAnyKey 0x1
#define EventOnEsc 0x2
#define EventOnLeftButton 0x4
#define EventOnRightButton 0x8
#define EventOnWheel 0x10
#define EventOnButton (EventOnLeftButton | EventOnRightButton | EventOnWheel)
// NOTE(allen): These don't work so much, so let's pretend they're not here for now.
#define EventOnMouseMove 0x20
#define EventOnMouse (EventOnButton | EventOnMouseMove)
2016-02-01 05:03:42 +00:00
2016-03-07 05:13:20 +00:00
#define _GET_VERSION_SIG(n) int n(int maj, int min, int patch)
typedef _GET_VERSION_SIG(_Get_Version_Function);
extern "C" _GET_VERSION_SIG(get_alpha_4coder_version){
int result = (maj == MAJOR && min == MINOR && patch == PATCH);
return(result);
}
2016-02-01 05:03:42 +00:00
struct Custom_API{
View_Routine_Function *view_routine;
2016-02-01 05:03:42 +00:00
Get_Binding_Data_Function *get_bindings;
2016-03-07 05:13:20 +00:00
_Get_Version_Function *get_alpha_4coder_version;
2016-02-01 05:03:42 +00:00
};
// NOTE(allen): definitions for the buffer that communicates to 4ed.exe
enum Binding_Unit_Type{
unit_header,
unit_map_begin,
unit_binding,
unit_callback,
unit_inherit,
unit_hook
};
enum Map_ID{
mapid_global = (1 << 24),
mapid_file,
2016-02-22 02:45:41 +00:00
2016-02-01 05:03:42 +00:00
// NOTE(allen): mapid_nomap will remain empty even if you attempt to fill it
// it is for setting a map's parent to nothing, in cases where you don't want
// to inherit from global (which is the default).
mapid_nomap
};
struct Binding_Unit{
Binding_Unit_Type type;
union{
struct{ int total_size; int user_map_count; int error; } header;
struct{ int mapid; int replace; int bind_count; } map_begin;
2016-02-01 05:03:42 +00:00
struct{ int mapid; } map_inherit;
struct{
short code;
unsigned char modifiers;
int command_id;
} binding;
struct{
short code;
unsigned char modifiers;
Custom_Command_Function *func;
} callback;
struct{
int hook_id;
2016-03-04 06:06:11 +00:00
void *func;
2016-02-01 05:03:42 +00:00
} hook;
};
};
2016-03-24 01:05:28 +00:00
#endif