progress on the project system
parent
8cd14b79ca
commit
cd6bed08e5
|
@ -123,8 +123,8 @@ HOOK_SIG(my_start){
|
|||
|
||||
process_config_file(app);
|
||||
|
||||
change_theme(app, literal("4coder"));
|
||||
change_font(app, literal("Liberation Sans"), true);
|
||||
change_theme(app, default_theme_name.str, default_theme_name.size);
|
||||
change_font(app, default_font_name.str, default_font_name.size, 1);
|
||||
|
||||
exec_command(app, open_panel_vsplit);
|
||||
exec_command(app, hide_scrollbar);
|
||||
|
@ -168,34 +168,14 @@ HOOK_SIG(my_view_adjust){
|
|||
new_wrap_width = (int32_t)(new_wrap_width * .9f);
|
||||
|
||||
int32_t new_min_base_width = (int32_t)(new_wrap_width * .77f);
|
||||
if (automatically_adjust_wrapping){
|
||||
adjust_all_buffer_wrap_widths(app, new_wrap_width, new_min_base_width);
|
||||
}
|
||||
|
||||
// no meaning for return
|
||||
return(0);
|
||||
}
|
||||
|
||||
// TODO(allen): delete this
|
||||
CUSTOM_COMMAND_SIG(weird_buffer_test){
|
||||
for (Buffer_Summary buffer = get_buffer_first(app, AccessAll);
|
||||
buffer.exists;
|
||||
get_buffer_next(app, &buffer, AccessAll)){
|
||||
print_message(app, literal("filename:"));
|
||||
if (buffer.file_name){
|
||||
print_message(app, buffer.file_name, buffer.file_name_len);
|
||||
}
|
||||
else{
|
||||
print_message(app, literal("*NULL*"));
|
||||
}
|
||||
print_message(app, literal("buffername:"));
|
||||
if (buffer.buffer_name){
|
||||
print_message(app, buffer.buffer_name, buffer.buffer_name_len);
|
||||
}
|
||||
else{
|
||||
print_message(app, literal("*NULL*"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// NOTE(allen|a4.0.12): This is for testing it may be removed and replaced with a better test for the buffer_get_font when you eventally read this and wonder what it's about.
|
||||
CUSTOM_COMMAND_SIG(write_name_of_font){
|
||||
View_Summary view = get_active_view(app, AccessOpen);
|
||||
|
@ -257,11 +237,9 @@ OPEN_FILE_HOOK_SIG(my_file_settings){
|
|||
if (treat_as_code && enable_code_wrapping && buffer.size < (1 << 18)){
|
||||
// NOTE(allen|a4.0.12): There is a little bit of grossness going on here.
|
||||
// If we set BufferSetting_Lex to true, it will launch a lexing job.
|
||||
// If a lexing job is active when we set BufferSetting_VirtualWhitespace on
|
||||
// that call can fail.
|
||||
// If a lexing job is active when we set BufferSetting_VirtualWhitespace on that call can fail.
|
||||
// Unfortunantely without tokens virtual whitespace doesn't really make sense.
|
||||
// So for now I have it automatically turning on lexing when virtual whitespace
|
||||
// is turned on.
|
||||
// So for now I have it automatically turning on lexing when virtual whitespace is turned on.
|
||||
// Cleaning some of that up is a goal for future versions.
|
||||
buffer_set_setting(app, &buffer, BufferSetting_WrapLine, 1);
|
||||
buffer_set_setting(app, &buffer, BufferSetting_VirtualWhitespace, 1);
|
||||
|
@ -280,7 +258,7 @@ OPEN_FILE_HOOK_SIG(my_file_settings){
|
|||
//
|
||||
// Right now it only has access to the mouse state, but it will be
|
||||
// extended to have access to the key presses soon.
|
||||
static int32_t suppressing_mouse = false;
|
||||
static bool32 suppressing_mouse = false;
|
||||
|
||||
INPUT_FILTER_SIG(my_suppress_mouse_filter){
|
||||
if (suppressing_mouse){
|
||||
|
@ -293,11 +271,11 @@ INPUT_FILTER_SIG(my_suppress_mouse_filter){
|
|||
static void
|
||||
set_mouse_suppression(Application_Links *app, int32_t suppress){
|
||||
if (suppress){
|
||||
suppressing_mouse = true;
|
||||
suppressing_mouse = 1;
|
||||
show_mouse_cursor(app, MouseCursorShow_Never);
|
||||
}
|
||||
else{
|
||||
suppressing_mouse = false;
|
||||
suppressing_mouse = 0;
|
||||
show_mouse_cursor(app, MouseCursorShow_Always);
|
||||
}
|
||||
}
|
||||
|
@ -351,7 +329,6 @@ default_keys(Bind_Helper *context){
|
|||
bind(context, key_f2, MDFR_NONE, toggle_mouse);
|
||||
bind(context, key_page_up, MDFR_CTRL, toggle_fullscreen);
|
||||
bind(context, 'E', MDFR_ALT, exit_4coder);
|
||||
bind(context, 'K', MDFR_ALT, weird_buffer_test);
|
||||
|
||||
end_map(context);
|
||||
|
||||
|
|
|
@ -24,8 +24,7 @@
|
|||
//
|
||||
|
||||
static int32_t
|
||||
open_file(Application_Links *app, Buffer_Summary *buffer_out, char *filename,
|
||||
int32_t filename_len, int32_t background, int32_t never_new){
|
||||
open_file(Application_Links *app, Buffer_Summary *buffer_out, char *filename, int32_t filename_len, int32_t background, int32_t never_new){
|
||||
int32_t result = false;
|
||||
Buffer_Summary buffer =
|
||||
get_buffer_by_name(app, filename, filename_len,
|
||||
|
@ -54,8 +53,7 @@ open_file(Application_Links *app, Buffer_Summary *buffer_out, char *filename,
|
|||
}
|
||||
|
||||
static int32_t
|
||||
view_open_file(Application_Links *app, View_Summary *view, char *filename,
|
||||
int32_t filename_len, int32_t never_new){
|
||||
view_open_file(Application_Links *app, View_Summary *view, char *filename, int32_t filename_len, int32_t never_new){
|
||||
int32_t result = 0;
|
||||
|
||||
if (view){
|
||||
|
@ -70,8 +68,7 @@ view_open_file(Application_Links *app, View_Summary *view, char *filename,
|
|||
}
|
||||
|
||||
static int32_t
|
||||
read_line(Application_Links *app, Partition *part, Buffer_Summary *buffer,
|
||||
int32_t line, String *str){
|
||||
read_line(Application_Links *app, Partition *part, Buffer_Summary *buffer, int32_t line, String *str){
|
||||
|
||||
Partial_Cursor begin = {0};
|
||||
Partial_Cursor end = {0};
|
||||
|
@ -3444,11 +3441,272 @@ COMMAND_CALLER_HOOK(default_command_caller){
|
|||
return(0);
|
||||
}
|
||||
|
||||
struct Config_Line{
|
||||
Cpp_Token id_token;
|
||||
Cpp_Token subscript_token;
|
||||
Cpp_Token eq_token;
|
||||
Cpp_Token val_token;
|
||||
int32_t val_array_start;
|
||||
int32_t val_array_end;
|
||||
int32_t val_array_count;
|
||||
bool32 read_success;
|
||||
};
|
||||
|
||||
struct Config_Item{
|
||||
Config_Line line;
|
||||
char *mem;
|
||||
String id;
|
||||
int32_t subscript_index;
|
||||
bool32 has_subscript;
|
||||
};
|
||||
|
||||
struct Config_Array_Reader{
|
||||
char *mem;
|
||||
int32_t i;
|
||||
int32_t val_array_end;
|
||||
bool32 good;
|
||||
};
|
||||
|
||||
static Cpp_Token
|
||||
read_config_token(Cpp_Token_Array array, int32_t *i_ptr){
|
||||
Cpp_Token token = {0};
|
||||
|
||||
int32_t i = *i_ptr;
|
||||
|
||||
for (; i < array.count; ++i){
|
||||
Cpp_Token comment_token = array.tokens[i];
|
||||
if (comment_token.type != CPP_TOKEN_COMMENT){
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (i < array.count){
|
||||
token = array.tokens[i];
|
||||
}
|
||||
|
||||
i = *i_ptr;
|
||||
|
||||
return(token);
|
||||
}
|
||||
|
||||
static Config_Line
|
||||
read_config_line(Cpp_Token_Array array, int32_t *i_ptr){
|
||||
Config_Line config_line = {0};
|
||||
|
||||
int32_t i = *i_ptr;
|
||||
|
||||
config_line.id_token = read_config_token(array, &i);
|
||||
if (config_line.id_token.type == CPP_TOKEN_IDENTIFIER){
|
||||
++i;
|
||||
if (i < array.count){
|
||||
Cpp_Token token = read_config_token(array, &i);
|
||||
|
||||
bool32 subscript_success = 1;
|
||||
if (token.type == CPP_TOKEN_BRACE_OPEN){
|
||||
subscript_success = 0;
|
||||
++i;
|
||||
if (i < array.count){
|
||||
config_line.subscript_token = read_config_token(array, &i);
|
||||
if (config_line.subscript_token.type == CPP_TOKEN_INTEGER_CONSTANT){
|
||||
++i;
|
||||
if (i < array.count){
|
||||
token = read_config_token(array, &i);
|
||||
if (token.type == CPP_TOKEN_BRACE_CLOSE){
|
||||
++i;
|
||||
if (i < array.count){
|
||||
token = read_config_token(array, &i);
|
||||
subscript_success = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (subscript_success){
|
||||
if (token.type == CPP_TOKEN_EQ){
|
||||
config_line.eq_token = read_config_token(array, &i);
|
||||
++i;
|
||||
if (i < array.count){
|
||||
Cpp_Token val_token = read_config_token(array, &i);
|
||||
|
||||
bool32 array_success = 1;
|
||||
if (val_token.type == CPP_TOKEN_BRACE_OPEN){
|
||||
array_success = 0;
|
||||
++i;
|
||||
if (i < array.count){
|
||||
config_line.val_array_start = i;
|
||||
|
||||
bool32 expecting_array_item = 1;
|
||||
for (; i < array.count; ++i){
|
||||
Cpp_Token array_token = read_config_token(array, &i);
|
||||
if (array_token.type != CPP_TOKEN_BRACE_CLOSE){
|
||||
config_line.val_array_end = i;
|
||||
array_success = 1;
|
||||
break;
|
||||
}
|
||||
else{
|
||||
if (array_token.type == CPP_TOKEN_COMMA){
|
||||
if (!expecting_array_item){
|
||||
expecting_array_item = 1;
|
||||
}
|
||||
else{
|
||||
break;
|
||||
}
|
||||
}
|
||||
else{
|
||||
if (expecting_array_item){
|
||||
expecting_array_item = 0;
|
||||
++config_line.val_array_count;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (array_success){
|
||||
config_line.val_token = val_token;
|
||||
++i;
|
||||
if (i < array.count){
|
||||
Cpp_Token semicolon_token = read_config_token(array, &i);
|
||||
if (semicolon_token.type == CPP_TOKEN_SEMICOLON){
|
||||
config_line.read_success = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!config_line.read_success){
|
||||
for (; i < array.count; ++i){
|
||||
Cpp_Token token = read_config_token(array, &i);
|
||||
if (token.type == CPP_TOKEN_SEMICOLON){
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
*i_ptr = i;
|
||||
|
||||
return(config_line);
|
||||
}
|
||||
|
||||
static Config_Item
|
||||
get_config_item(Config_Line line, char *mem){
|
||||
Config_Item item = {0};
|
||||
item.line = line;
|
||||
item.mem = mem;
|
||||
item.id = make_string(mem + line.id_token.start,line.id_token.size);
|
||||
|
||||
if (line.subscript_token.size != 0){
|
||||
String subscript_str = make_string(mem + line.subscript_token.start,line.subscript_token.size);
|
||||
item.subscript_index = str_to_int_s(subscript_str);
|
||||
item.has_subscript = 1;
|
||||
}
|
||||
|
||||
return(item);
|
||||
}
|
||||
|
||||
static bool32
|
||||
config_var(Config_Item item, char *var_name, int32_t *subscript, uint32_t token_type, void *var_out){
|
||||
bool32 result = 0;
|
||||
bool32 subscript_succes = 1;
|
||||
if (item.line.val_token.type == token_type){
|
||||
if ((var_name == 0 && item.id.size == 0) || match(item.id, var_name)){
|
||||
if (subscript){
|
||||
if (item.has_subscript){
|
||||
*subscript = item.subscript_index;
|
||||
}
|
||||
else{
|
||||
subscript_succes = 0;
|
||||
}
|
||||
}
|
||||
if (subscript_succes){
|
||||
if (var_out){
|
||||
switch (token_type){
|
||||
case CPP_TOKEN_BOOLEAN_CONSTANT:
|
||||
{
|
||||
*(bool32*)var_out = (item.mem[item.line.val_token.start] == 't');
|
||||
}break;
|
||||
|
||||
case CPP_TOKEN_INTEGER_CONSTANT:
|
||||
{
|
||||
String val = make_string(item.mem + item.line.val_token.start, item.line.val_token.size);
|
||||
*(int32_t*)var_out = str_to_int(val);
|
||||
}break;
|
||||
|
||||
case CPP_TOKEN_STRING_CONSTANT:
|
||||
{
|
||||
*(String*)var_out = make_string(item.mem + item.line.val_token.start + 1,item.line.val_token.size - 2);
|
||||
}break;
|
||||
|
||||
case CPP_TOKEN_BRACE_OPEN:
|
||||
{
|
||||
Config_Array_Reader *array_reader = (Config_Array_Reader*)var_out;
|
||||
array_reader->mem = item.mem;
|
||||
array_reader->i = item.line.val_array_start;
|
||||
array_reader->val_array_end = item.line.val_array_end;
|
||||
array_reader->good = 1;
|
||||
}break;
|
||||
}
|
||||
}
|
||||
result = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
return(result);
|
||||
}
|
||||
|
||||
static bool32
|
||||
config_bool_var(Config_Item item, char *var_name, int32_t *subscript, bool32 *var_out){
|
||||
bool32 result = config_var(item, var_name, subscript, CPP_TOKEN_BOOLEAN_CONSTANT, var_out);
|
||||
return(result);
|
||||
}
|
||||
|
||||
static bool32
|
||||
config_int_var(Config_Item item, char *var_name, int32_t *subscript, int32_t *var_out){
|
||||
bool32 result = config_var(item, var_name, subscript, CPP_TOKEN_INTEGER_CONSTANT, var_out);
|
||||
return(result);
|
||||
}
|
||||
|
||||
static bool32
|
||||
config_string_var(Config_Item item, char *var_name, int32_t *subscript, String *var_out){
|
||||
bool32 result = config_var(item, var_name, subscript, CPP_TOKEN_STRING_CONSTANT, var_out);
|
||||
return(result);
|
||||
}
|
||||
|
||||
static bool32
|
||||
config_array_var(Config_Item item, char *var_name, int32_t *subscript, Config_Array_Reader *array_reader){
|
||||
bool32 result = config_var(item, var_name, subscript, CPP_TOKEN_BRACE_OPEN, array_reader);
|
||||
return(result);
|
||||
}
|
||||
|
||||
static bool32
|
||||
config_array_next_item(Config_Array_Reader *array_reader, Config_Item *item){
|
||||
|
||||
|
||||
bool32 result = (array_reader->good);
|
||||
return(result);
|
||||
}
|
||||
|
||||
static bool32
|
||||
config_array_good(Config_Array_Reader *array_reader){
|
||||
bool32 result = (array_reader->good);
|
||||
return(result);
|
||||
}
|
||||
|
||||
// NOTE(allen|a4.0.12): A primordial config system (actually really hate this but it seems best at least right now... arg)
|
||||
|
||||
static bool32 enable_code_wrapping = 1;
|
||||
static bool32 automatically_adjust_wrapping = 1;
|
||||
static int32_t default_wrap_width = 672;
|
||||
static int32_t default_min_base_width = 550;
|
||||
static String default_theme_name = make_lit_string("4coder");
|
||||
static String default_font_name = make_lit_string("Liberation Sans");
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
|
@ -3464,8 +3722,29 @@ adjust_all_buffer_wrap_widths(Application_Links *app, int32_t wrap_widths, int32
|
|||
default_min_base_width = min_base_width;
|
||||
}
|
||||
|
||||
static bool32
|
||||
file_handle_dump(Partition *part, FILE *file, char **mem_ptr, int32_t *size_ptr){
|
||||
bool32 success = 0;
|
||||
|
||||
fseek(file, 0, SEEK_END);
|
||||
int32_t size = ftell(file);
|
||||
char *mem = (char*)push_block(part, size+1);
|
||||
fseek(file, 0, SEEK_SET);
|
||||
int32_t check_size = (int32_t)fread(mem, 1, size, file);
|
||||
if (check_size == size){
|
||||
mem[size] = 0;
|
||||
success = 1;
|
||||
}
|
||||
|
||||
*mem_ptr = mem;
|
||||
*size_ptr = size;
|
||||
|
||||
return(success);
|
||||
}
|
||||
|
||||
static void
|
||||
process_config_file(Application_Links *app){
|
||||
Partition *part = &global_part;
|
||||
FILE *file = fopen("config.4coder", "rb");
|
||||
|
||||
if (!file){
|
||||
|
@ -3478,15 +3757,13 @@ process_config_file(Application_Links *app){
|
|||
}
|
||||
|
||||
if (file){
|
||||
Temp_Memory temp = begin_temp_memory(&global_part);
|
||||
Temp_Memory temp = begin_temp_memory(part);
|
||||
|
||||
fseek(file, 0, SEEK_END);
|
||||
int32_t size = ftell(file);
|
||||
char *mem = (char*)push_block(&global_part, size+1);
|
||||
fseek(file, 0, SEEK_SET);
|
||||
int32_t check_size = (int32_t)fread(mem, 1, size, file);
|
||||
if (check_size == size){
|
||||
mem[size] = 0;
|
||||
char *mem = 0;
|
||||
int32_t size = 0;
|
||||
bool32 file_read_success = file_handle_dump(part, file, &mem, &size);
|
||||
|
||||
if (file_read_success){
|
||||
fclose(file);
|
||||
|
||||
Cpp_Token_Array array;
|
||||
|
@ -3498,79 +3775,159 @@ process_config_file(Application_Links *app){
|
|||
Cpp_Lex_Result result = cpp_lex_step(&S, mem, size+1, HAS_NULL_TERM, &array, NO_OUT_LIMIT);
|
||||
|
||||
if (result == LexResult_Finished){
|
||||
|
||||
int32_t new_wrap_width = default_wrap_width;
|
||||
int32_t new_min_base_width = default_min_base_width;
|
||||
|
||||
for (int32_t i = 0; i < array.count; ++i){
|
||||
int32_t read_setting_failed = 1;
|
||||
Cpp_Token id_token = array.tokens[i];
|
||||
if (id_token.type == CPP_TOKEN_IDENTIFIER){
|
||||
++i;
|
||||
if (i < array.count){
|
||||
Cpp_Token eq_token = array.tokens[i];
|
||||
if (eq_token.type == CPP_TOKEN_EQ){
|
||||
++i;
|
||||
if (i < array.count){
|
||||
Cpp_Token val_token = array.tokens[i];
|
||||
++i;
|
||||
if (i < array.count){
|
||||
Cpp_Token semicolon_token = array.tokens[i];
|
||||
if (semicolon_token.type == CPP_TOKEN_SEMICOLON){
|
||||
read_setting_failed = 0;
|
||||
Config_Line config_line = read_config_line(array, &i);
|
||||
|
||||
String id = make_string(mem + id_token.start, id_token.size);
|
||||
if (config_line.read_success){
|
||||
Config_Item item = get_config_item(config_line, mem);
|
||||
|
||||
if (match(id, "enable_code_wrapping")){
|
||||
if (val_token.type == CPP_TOKEN_BOOLEAN_CONSTANT){
|
||||
String val = make_string(mem + val_token.start, val_token.size);
|
||||
if (val.str[0] == 't'){
|
||||
enable_code_wrapping = 1;
|
||||
}
|
||||
else{
|
||||
enable_code_wrapping = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (match(id, "default_wrap_width")){
|
||||
if (val_token.type == CPP_TOKEN_INTEGER_CONSTANT){
|
||||
String val = make_string(mem + val_token.start, val_token.size);
|
||||
new_wrap_width = str_to_int(val);
|
||||
}
|
||||
}
|
||||
else if (match(id, "default_min_base_width")){
|
||||
if (val_token.type == CPP_TOKEN_INTEGER_CONSTANT){
|
||||
String val = make_string(mem + val_token.start, val_token.size);
|
||||
new_min_base_width = str_to_int(val);
|
||||
}
|
||||
}
|
||||
config_bool_var(item, "enable_code_wrapping", 0, &enable_code_wrapping);
|
||||
config_bool_var(item, "automatically_adjust_wrapping", 0, &automatically_adjust_wrapping);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
config_int_var(item, "default_wrap_width", 0, &new_wrap_width);
|
||||
config_int_var(item, "default_min_base_width", 0, &new_min_base_width);
|
||||
|
||||
config_string_var(item, "default_theme_name", 0, &default_theme_name);
|
||||
config_string_var(item, "default_font_name", 0, &default_font_name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (read_setting_failed){
|
||||
for (; i < array.count; ++i){
|
||||
Cpp_Token token = array.tokens[i];
|
||||
if (token.type == CPP_TOKEN_SEMICOLON){
|
||||
break;
|
||||
}
|
||||
adjust_all_buffer_wrap_widths(app, new_wrap_width, new_min_base_width);
|
||||
}
|
||||
}
|
||||
|
||||
end_temp_memory(temp);
|
||||
}
|
||||
else{
|
||||
print_message(app, literal("Did not find config.4coder, using default settings"));
|
||||
}
|
||||
}
|
||||
|
||||
// NOTE(allen): Project system setup
|
||||
|
||||
static char *loaded_project = 0;
|
||||
|
||||
CUSTOM_COMMAND_SIG(load_project){
|
||||
Partition *part = &global_part;
|
||||
|
||||
char project_file_space[512];
|
||||
String project_name = make_fixed_width_string(project_file_space);
|
||||
project_name.size = directory_get_hot(app, project_name.str, project_name.memory_size);
|
||||
if (project_name.size >= project_name.memory_size){
|
||||
project_name.size = 0;
|
||||
}
|
||||
|
||||
if (project_name.size != 0){
|
||||
append_sc(&project_name, "/project.4coder");
|
||||
terminate_with_null(&project_name);
|
||||
|
||||
FILE *file = fopen(project_name.str, "rb");
|
||||
if (file){
|
||||
Temp_Memory temp = begin_temp_memory(part);
|
||||
|
||||
char *mem = 0;
|
||||
int32_t size = 0;
|
||||
bool32 file_read_success = file_handle_dump(part, file, &mem, &size);
|
||||
if (file_read_success){
|
||||
fclose(file);
|
||||
|
||||
Cpp_Token_Array array;
|
||||
array.count = 0;
|
||||
array.max_count = (1 << 20)/sizeof(Cpp_Token);
|
||||
array.tokens = push_array(&global_part, Cpp_Token, array.max_count);
|
||||
|
||||
Cpp_Lex_Data S = cpp_lex_data_init();
|
||||
Cpp_Lex_Result result = cpp_lex_step(&S, mem, size+1, HAS_NULL_TERM, &array, NO_OUT_LIMIT);
|
||||
|
||||
if (result == LexResult_Finished){
|
||||
for (int32_t i = 0; i < array.count; ++i){
|
||||
Config_Line config_line = read_config_line(array, &i);
|
||||
if (config_line.read_success){
|
||||
Config_Item item = get_config_item(config_line, mem);
|
||||
|
||||
{
|
||||
String str = {0};
|
||||
if (config_string_var(item, "extensions", 0, &str)){
|
||||
// TODO(allen)
|
||||
}
|
||||
}
|
||||
|
||||
adjust_all_buffer_wrap_widths(app, new_wrap_width, new_min_base_width);
|
||||
}
|
||||
{
|
||||
#if WIN
|
||||
#define FKEY_COMMAND "fkey_command_wnd"
|
||||
#else
|
||||
#define FKEY_COMMAND "fkey_command_linux"
|
||||
#endif
|
||||
|
||||
end_temp_memory(temp);
|
||||
}
|
||||
else{
|
||||
print_message(app, literal("Did not find config.4coder, using default settings"));
|
||||
int32_t index = 0;
|
||||
Config_Array_Reader array_reader = {0};
|
||||
if (config_array_var(item, FKEY_COMMAND, &index, &array_reader)){
|
||||
if (index >= 1 && index <= 16){
|
||||
Config_Item array_item = {0};
|
||||
int32_t item_index = 0;
|
||||
|
||||
for (config_array_next_item(&array_reader, &array_item);
|
||||
config_array_good(&array_reader);
|
||||
config_array_next_item(&array_reader, &array_item)){
|
||||
if (item_index >= 2){
|
||||
break;
|
||||
}
|
||||
|
||||
switch (item_index){
|
||||
case 0:
|
||||
{
|
||||
if (config_int_var(array_item, 0, 0, 0)){
|
||||
// TODO(allen)
|
||||
}
|
||||
String str = {0};
|
||||
if (config_string_var(array_item, 0, 0, &str)){
|
||||
// TODO(allen)
|
||||
}
|
||||
}break;
|
||||
|
||||
case 1:
|
||||
{
|
||||
if (config_int_var(array_item, 0, 0, 0)){
|
||||
// TODO(allen)
|
||||
}
|
||||
String str = {0};
|
||||
if (config_string_var(array_item, 0, 0, &str)){
|
||||
// TODO(allen)
|
||||
}
|
||||
}break;
|
||||
}
|
||||
|
||||
item_index++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
end_temp_memory(temp);
|
||||
}
|
||||
else{
|
||||
char message_space[512];
|
||||
String message = make_fixed_width_string(message_space);
|
||||
append_sc(&message, "Did not find project.4coder. ");
|
||||
if (loaded_project != 0){
|
||||
append_sc(&message, "Continuing with: ");
|
||||
append_sc(&message, loaded_project);
|
||||
}
|
||||
else{
|
||||
append_sc(&message, "Continuing without a project");
|
||||
}
|
||||
print_message(app, message.str, message.size);
|
||||
}
|
||||
}
|
||||
else{
|
||||
print_message(app, literal("Failed trying to get project file name"));
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -245,6 +245,31 @@ get_rect(View_Summary *view){
|
|||
return(rect);
|
||||
}
|
||||
|
||||
inline i32_Rect
|
||||
get_line_x_rect(View_Summary *view){
|
||||
i32_Rect rect = {0};
|
||||
|
||||
if (view->unwrapped_lines){
|
||||
rect.x0 = (int32_t)view->mark.unwrapped_x;
|
||||
rect.x1 = (int32_t)view->cursor.unwrapped_x;
|
||||
}
|
||||
else{
|
||||
rect.x0 = (int32_t)view->mark.wrapped_x;
|
||||
rect.x1 = (int32_t)view->cursor.wrapped_x;
|
||||
}
|
||||
rect.y0 = view->mark.line;
|
||||
rect.y1 = view->cursor.line;
|
||||
|
||||
if (rect.y0 > rect.y1){
|
||||
Swap(int32_t, rect.y0, rect.y1);
|
||||
}
|
||||
if (rect.x0 > rect.x1){
|
||||
Swap(int32_t, rect.x0, rect.x1);
|
||||
}
|
||||
|
||||
return(rect);
|
||||
}
|
||||
|
||||
inline void
|
||||
exec_command(Application_Links *app, Custom_Command_Function *func){
|
||||
func(app);
|
||||
|
|
|
@ -49,7 +49,7 @@ seek_unwrapped_xy(float x, float y, int32_t round_down){
|
|||
}
|
||||
|
||||
static Buffer_Seek
|
||||
seek_xy(float x, float y, int32_t round_down, int32_t unwrapped){
|
||||
seek_xy(float x, float y, bool32 round_down, bool32 unwrapped){
|
||||
Buffer_Seek result;
|
||||
result.type = unwrapped?buffer_seek_unwrapped_xy:buffer_seek_wrapped_xy;
|
||||
result.x = x;
|
||||
|
|
12
4ed.cpp
12
4ed.cpp
|
@ -2557,11 +2557,15 @@ App_Step_Sig(app_step){
|
|||
if (input->first_step){
|
||||
String welcome =
|
||||
make_lit_string("Welcome to " VERSION "\n"
|
||||
"If you're new to 4coder there's no tutorial yet :(\n"
|
||||
"you can use the key combo <ctrl o> to look for a file\n"
|
||||
"and if you load README.txt you'll find all the key combos there are.\n"
|
||||
"If you're new to 4coder there are some tutorials at http://4coder.net/tutorials.html\n"
|
||||
"\n"
|
||||
"New in alpha 4.0.12:\n"
|
||||
"Newest features:\n"
|
||||
"-Option to have wrap widths automatically adjust based on average view width\n"
|
||||
"-The 'config.4coder' file can now be placed with the 4ed executable file\n"
|
||||
"-New options in 'config.4coder' to specify the font and color theme\n"
|
||||
"-New built in project configuration system\n"
|
||||
"\n"
|
||||
"New in alpha 4.0.12 and 4.0.13:\n"
|
||||
"-Text files wrap lines at whitespace when possible\n"
|
||||
"-New code wrapping feature is on by default\n"
|
||||
"-Introduced a 'config.4coder' for setting several wrapping options:"
|
||||
|
|
|
@ -2157,8 +2157,9 @@ directories controlled on the custom side.
|
|||
Hot_Directory *hot = &cmd->models->hot_directory;
|
||||
i32 copy_max = capacity - 1;
|
||||
hot_directory_clean_end(hot);
|
||||
if (copy_max > hot->string.size)
|
||||
if (copy_max > hot->string.size){
|
||||
copy_max = hot->string.size;
|
||||
}
|
||||
memcpy(out, hot->string.str, copy_max);
|
||||
out[copy_max] = 0;
|
||||
return(hot->string.size);
|
||||
|
|
|
@ -1270,7 +1270,10 @@ stickieness_guess(Cpp_Token_Type type, Cpp_Token_Type other_type, u16 flags, u16
|
|||
type == CPP_TOKEN_BRACKET_OPEN ||
|
||||
type == CPP_TOKEN_BRACKET_CLOSE){
|
||||
if (on_left){
|
||||
guess = 0;
|
||||
guess = 20;
|
||||
if (other_is_words){
|
||||
guess = 100;
|
||||
}
|
||||
}
|
||||
else{
|
||||
guess = 100;
|
||||
|
|
|
@ -18,22 +18,26 @@ CUSTOM_COMMAND_SIG(kill_rect){
|
|||
View_Summary view = get_active_view(app, AccessOpen);
|
||||
Buffer_Summary buffer = get_buffer(app, view.buffer_id, AccessOpen);
|
||||
|
||||
Buffer_Rect rect = get_rect(&view);
|
||||
i32_Rect rect = get_line_x_rect(&view);
|
||||
|
||||
for (int32_t line = rect.line1; line >= rect.line0; --line){
|
||||
bool32 unwrapped = view.unwrapped_lines;
|
||||
|
||||
for (int32_t line = rect.y1; line >= rect.y0; --line){
|
||||
int32_t start = 0;
|
||||
int32_t end = 0;
|
||||
|
||||
int32_t success = 1;
|
||||
bool32 success = 1;
|
||||
Full_Cursor cursor = {0};
|
||||
|
||||
float y = (line-1) * view.line_height;
|
||||
|
||||
if (success){
|
||||
success = view_compute_cursor(app, &view, seek_line_char(line, rect.char0), &cursor);
|
||||
success = view_compute_cursor(app, &view, seek_xy((float)rect.x0, y, 0, unwrapped), &cursor);
|
||||
}
|
||||
start = cursor.pos;
|
||||
|
||||
if (success){
|
||||
success = view_compute_cursor(app, &view, seek_line_char(line, rect.char1), &cursor);
|
||||
success = view_compute_cursor(app, &view, seek_xy((float)rect.x1, y, 0, unwrapped), &cursor);
|
||||
}
|
||||
end = cursor.pos;
|
||||
|
||||
|
@ -607,58 +611,12 @@ CUSTOM_COMMAND_SIG(write_explicit_enum_values){
|
|||
end_temp_memory(temp);
|
||||
}
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#define SETTINGS_FILE ".4coder_settings"
|
||||
HOOK_SIG(experimental_start){
|
||||
init_memory(app);
|
||||
|
||||
process_config_file(app);
|
||||
|
||||
char theme_name[128];
|
||||
char font_name[128];
|
||||
|
||||
FILE *file = fopen(SETTINGS_FILE, "rb");
|
||||
|
||||
if (!file){
|
||||
char module_path[512];
|
||||
int len = get_4ed_path(app, module_path, 448);
|
||||
memcpy(module_path+len, SETTINGS_FILE, sizeof(SETTINGS_FILE));
|
||||
file = fopen(module_path, "rb");
|
||||
}
|
||||
|
||||
if (file){
|
||||
fscanf(file, "%127s\n%127s", theme_name, font_name);
|
||||
|
||||
String theme = make_string_slowly(theme_name);
|
||||
String font = make_string_slowly(font_name);
|
||||
|
||||
replace_char(&theme, '#', ' ');
|
||||
replace_char(&font, '#', ' ');
|
||||
|
||||
fclose(file);
|
||||
|
||||
int theme_len = (int)strlen(theme_name);
|
||||
int font_len = (int)strlen(font_name);
|
||||
|
||||
change_theme(app, theme_name, theme_len);
|
||||
change_font(app, font_name, font_len, true);
|
||||
}
|
||||
|
||||
exec_command(app, open_panel_vsplit);
|
||||
exec_command(app, hide_scrollbar);
|
||||
exec_command(app, change_active_panel);
|
||||
exec_command(app, hide_scrollbar);
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
extern "C" int
|
||||
get_bindings(void *data, int size){
|
||||
Bind_Helper context_ = begin_bind_helper(data, size);
|
||||
Bind_Helper *context = &context_;
|
||||
|
||||
set_hook(context, hook_start, experimental_start);
|
||||
set_hook(context, hook_start, my_start);
|
||||
set_hook(context, hook_view_size_change, my_view_adjust);
|
||||
|
||||
set_open_file_hook(context, my_file_settings);
|
||||
|
|
|
@ -0,0 +1,35 @@
|
|||
extensions=".c.cpp.h.hpp";
|
||||
|
||||
fkey_command_wnd[1] = {"build.bat", "*compilation*"};
|
||||
fkey_command_wnd[2] = {"..\\misc\\run.bat", 0};
|
||||
fkey_command_wnd[3] = {"site\\build.bat", "*compilation*"};
|
||||
fkey_command_wnd[4] = {0, 0};
|
||||
fkey_command_wnd[5] = {0, 0};
|
||||
fkey_command_wnd[6] = {0, 0};
|
||||
fkey_command_wnd[7] = {0, 0};
|
||||
fkey_command_wnd[8] = {0, 0};
|
||||
fkey_command_wnd[9] = {0, 0};
|
||||
fkey_command_wnd[10] = {0, 0};
|
||||
fkey_command_wnd[11] = {0, 0};
|
||||
fkey_command_wnd[12] = {"package.bat", "*compilation*"};
|
||||
fkey_command_wnd[13] = {0, 0};
|
||||
fkey_command_wnd[14] = {0, 0};
|
||||
fkey_command_wnd[15] = {0, 0};
|
||||
fkey_command_wnd[16] = {0, 0};
|
||||
|
||||
fkey_command_linux[1] = {"make", "*compilation*"};
|
||||
fkey_command_linux[2] = {"../build/4ed", 0};
|
||||
fkey_command_linux[3] = {"site/build.sh", "*compilation*"};
|
||||
fkey_command_linux[4] = {0, 0};
|
||||
fkey_command_linux[5] = {0, 0};
|
||||
fkey_command_linux[6] = {0, 0};
|
||||
fkey_command_linux[7] = {0, 0};
|
||||
fkey_command_linux[8] = {0, 0};
|
||||
fkey_command_linux[9] = {0, 0};
|
||||
fkey_command_linux[10] = {0, 0};
|
||||
fkey_command_linux[11] = {0, 0};
|
||||
fkey_command_linux[12] = {"package.sh", "*compilation*"};
|
||||
fkey_command_linux[13] = {0, 0};
|
||||
fkey_command_linux[14] = {0, 0};
|
||||
fkey_command_linux[15] = {0, 0};
|
||||
fkey_command_linux[16] = {0, 0};
|
Loading…
Reference in New Issue