2016-02-24 05:16:08 +00:00
|
|
|
/*
|
|
|
|
* Mr. 4th Dimention - Allen Webster
|
|
|
|
*
|
|
|
|
* 23.02.2016
|
|
|
|
*
|
|
|
|
* Types shared by custom and application
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
// TOP
|
|
|
|
|
|
|
|
#ifndef FRED_BUFFER_TYPES_H
|
|
|
|
#define FRED_BUFFER_TYPES_H
|
|
|
|
|
2016-02-26 17:40:51 +00:00
|
|
|
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;
|
|
|
|
|
2016-02-27 07:44:17 +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;
|
|
|
|
|
2016-02-25 12:12:09 +00:00
|
|
|
|
2016-02-24 05:16:08 +00:00
|
|
|
typedef struct Full_Cursor{
|
|
|
|
int pos;
|
|
|
|
int line, character;
|
|
|
|
float unwrapped_x, unwrapped_y;
|
|
|
|
float wrapped_x, wrapped_y;
|
|
|
|
} Full_Cursor;
|
|
|
|
|
|
|
|
typedef enum{
|
|
|
|
buffer_seek_pos,
|
|
|
|
buffer_seek_wrapped_xy,
|
|
|
|
buffer_seek_unwrapped_xy,
|
|
|
|
buffer_seek_line_char
|
|
|
|
} Buffer_Seek_Type;
|
|
|
|
|
|
|
|
typedef struct Buffer_Seek{
|
|
|
|
Buffer_Seek_Type type;
|
|
|
|
union{
|
|
|
|
struct { int pos; };
|
|
|
|
struct { int round_down; float x, y; };
|
|
|
|
struct { int line, character; };
|
|
|
|
};
|
|
|
|
} Buffer_Seek;
|
|
|
|
|
|
|
|
static Buffer_Seek
|
|
|
|
seek_pos(int pos){
|
|
|
|
Buffer_Seek result;
|
|
|
|
result.type = buffer_seek_pos;
|
|
|
|
result.pos = pos;
|
|
|
|
return(result);
|
|
|
|
}
|
|
|
|
|
|
|
|
static Buffer_Seek
|
|
|
|
seek_wrapped_xy(float x, float y, int round_down){
|
|
|
|
Buffer_Seek result;
|
|
|
|
result.type = buffer_seek_wrapped_xy;
|
|
|
|
result.x = x;
|
|
|
|
result.y = y;
|
|
|
|
result.round_down = round_down;
|
|
|
|
return(result);
|
|
|
|
}
|
|
|
|
|
|
|
|
static Buffer_Seek
|
|
|
|
seek_unwrapped_xy(float x, float y, int round_down){
|
|
|
|
Buffer_Seek result;
|
|
|
|
result.type = buffer_seek_unwrapped_xy;
|
|
|
|
result.x = x;
|
|
|
|
result.y = y;
|
|
|
|
result.round_down = round_down;
|
|
|
|
return(result);
|
|
|
|
}
|
|
|
|
|
2016-02-25 00:04:08 +00:00
|
|
|
static Buffer_Seek
|
|
|
|
seek_xy(float x, float y, int round_down, int unwrapped){
|
|
|
|
Buffer_Seek result;
|
2016-02-25 12:12:09 +00:00
|
|
|
result.type = unwrapped?buffer_seek_unwrapped_xy:buffer_seek_wrapped_xy;
|
|
|
|
result.x = x;
|
|
|
|
result.y = y;
|
|
|
|
result.round_down = round_down;
|
2016-02-25 00:04:08 +00:00
|
|
|
return(result);
|
|
|
|
}
|
|
|
|
|
2016-02-24 05:16:08 +00:00
|
|
|
static Buffer_Seek
|
|
|
|
seek_line_char(int line, int character){
|
|
|
|
Buffer_Seek result;
|
|
|
|
result.type = buffer_seek_line_char;
|
|
|
|
result.line = line;
|
|
|
|
result.character = character;
|
|
|
|
return(result);
|
|
|
|
}
|
|
|
|
|
2016-02-26 17:40:51 +00:00
|
|
|
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{
|
2016-02-27 07:44:17 +00:00
|
|
|
range.min = p2;
|
|
|
|
range.max = p1;
|
2016-02-26 17:40:51 +00:00
|
|
|
}
|
|
|
|
return(range);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
enum Dynamic_Type{
|
|
|
|
dynamic_type_int,
|
|
|
|
dynamic_type_string,
|
|
|
|
// never below this
|
|
|
|
dynamic_type_count
|
|
|
|
};
|
|
|
|
|
|
|
|
struct Dynamic{
|
|
|
|
int type;
|
|
|
|
union{
|
|
|
|
struct{
|
|
|
|
int str_len;
|
|
|
|
char *str_value;
|
|
|
|
};
|
|
|
|
int int_value;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2016-02-24 05:16:08 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
// BOTTOM
|
|
|
|
|