diff --git a/4coder_default_bindings.cpp b/4coder_default_bindings.cpp index 2951774a..bd498f63 100644 --- a/4coder_default_bindings.cpp +++ b/4coder_default_bindings.cpp @@ -102,7 +102,7 @@ CUSTOM_COMMAND_SIG(rewrite_as_single_caps){ CUSTOM_COMMAND_SIG(open_my_files){ uint32_t access = AccessAll; View_Summary view = app->get_active_view(app, access); - view_open_file(app, &view, literal("w:/4ed/data/test/basic.cpp"), false); + view_open_file(app, &view, literal("w:/4ed/data/test/basic.cpp"), true); } CUSTOM_COMMAND_SIG(build_at_launch_location){ @@ -160,6 +160,7 @@ CUSTOM_COMMAND_SIG(newline_or_goto_position){ if (buffer.lock_flags & AccessProtected){ exec_command(app, goto_jump_at_cursor); + lock_jump_buffer(buffer); } else{ exec_command(app, write_character); diff --git a/4coder_default_building.cpp b/4coder_default_building.cpp index 8a83011d..94cb94f4 100644 --- a/4coder_default_building.cpp +++ b/4coder_default_building.cpp @@ -15,8 +15,10 @@ // CUSTOM_COMMAND_SIG(build_in_build_panel){ + String comp_name = make_lit_string("*compilation*"); + Buffer_Summary buffer = - app->get_buffer_by_name(app, literal("*compilation*"), AccessAll); + app->get_buffer_by_name(app, comp_name.str, comp_name.size, AccessAll); View_Summary build_view = {0}; View_Summary original_view = app->get_active_view(app, AccessAll); @@ -37,10 +39,12 @@ CUSTOM_COMMAND_SIG(build_in_build_panel){ execute_standard_build(app, &build_view, &original_buffer); - buffer = app->get_buffer_by_name(app, literal("*compilation*"), AccessAll); + buffer = app->get_buffer_by_name(app, comp_name.str, comp_name.size, AccessAll); app->buffer_set_font(app, &buffer, literal("Inconsolata")); prev_location = null_location; + + lock_jump_buffer(comp_name.str, comp_name.size); } // TODO(allen): This is a bit nasty. I want a system for picking @@ -133,7 +137,7 @@ CUSTOM_COMMAND_SIG(open_file_in_quotes_build){ if (file_name_in_quotes(app, &file_name)){ exec_command(app, change_active_panel_build); View_Summary view = app->get_active_view(app, AccessAll); - view_open_file(app, &view, expand_str(file_name), false); + view_open_file(app, &view, expand_str(file_name), true); } } diff --git a/4coder_default_include.cpp b/4coder_default_include.cpp index bfb287d3..82d72c3a 100644 --- a/4coder_default_include.cpp +++ b/4coder_default_include.cpp @@ -19,6 +19,97 @@ # define DEF_TAB_WIDTH 4 #endif +// +// Useful helper functions +// + +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){ + int32_t result = false; + Buffer_Summary buffer = + app->get_buffer_by_name(app, filename, filename_len, + AccessProtected|AccessHidden); + + if (buffer.exists){ + if (buffer_out) *buffer_out = buffer; + result = true; + } + else{ + Buffer_Create_Flag flags = 0; + if (background){ + flags |= BufferCreate_Background; + } + if (never_new){ + flags |= BufferCreate_NeverNew; + } + buffer = app->create_buffer(app, filename, filename_len, flags); + if (buffer.exists){ + if (buffer_out) *buffer_out = buffer; + result = true; + } + } + + return(result); +} + +static int32_t +view_open_file(Application_Links *app, + View_Summary *view, + char *filename, + int32_t filename_len, + int32_t never_new){ + int32_t result = false; + + if (view){ + Buffer_Summary buffer = {0}; + if (open_file(app, &buffer, filename, filename_len, false, never_new)){ + app->view_set_buffer(app, view, buffer.buffer_id, 0); + result = true; + } + } + + return(result); +} + +static int32_t +read_line(Application_Links *app, + Partition *part, + Buffer_Summary *buffer, + int32_t line, + String *str){ + + Partial_Cursor begin = {0}; + Partial_Cursor end = {0}; + + int32_t success = false; + + if (app->buffer_compute_cursor(app, buffer, + seek_line_char(line, 1), &begin)){ + if (app->buffer_compute_cursor(app, buffer, + seek_line_char(line, 65536), &end)){ + if (begin.line == line){ + if (0 <= begin.pos && begin.pos <= end.pos && end.pos <= buffer->size){ + int32_t size = (end.pos - begin.pos); + *str = make_string(push_array(part, char, size+1), size+1); + if (str->str){ + success = true; + app->buffer_read_range(app, buffer, begin.pos, end.pos, str->str); + str->size = size; + terminate_with_null(str); + } + } + } + } + } + + return(success); +} + // // Memory @@ -1571,7 +1662,7 @@ CUSTOM_COMMAND_SIG(open_file_in_quotes_regular){ if (file_name_in_quotes(app, &file_name)){ exec_command(app, change_active_panel_regular); View_Summary view = app->get_active_view(app, AccessAll); - view_open_file(app, &view, expand_str(file_name), false); + view_open_file(app, &view, expand_str(file_name), true); } } @@ -2241,6 +2332,7 @@ CUSTOM_COMMAND_SIG(eol_nixify){ #include "4coder_table.cpp" #include "4coder_search.cpp" +#include "4coder_jump_parsing.cpp" static void generic_search_all_buffers(Application_Links *app, General_Memory *general, Partition *part, @@ -2265,9 +2357,12 @@ generic_search_all_buffers(Application_Links *app, General_Memory *general, Part Search_Range *ranges = set.ranges; - Buffer_Summary search_buffer = app->get_buffer_by_name(app, literal("*search*"), AccessAll); + String search_name = make_lit_string("*search*"); + + Buffer_Summary search_buffer = app->get_buffer_by_name(app, search_name.str, search_name.size, + AccessAll); if (!search_buffer.exists){ - search_buffer = app->create_buffer(app, literal("*search*"), BufferCreate_AlwaysNew); + search_buffer = app->create_buffer(app, search_name.str, search_name.size, BufferCreate_AlwaysNew); app->buffer_set_setting(app, &search_buffer, BufferSetting_Unimportant, true); app->buffer_set_setting(app, &search_buffer, BufferSetting_ReadOnly, true); app->buffer_set_setting(app, &search_buffer, BufferSetting_WrapLine, false); @@ -2370,6 +2465,8 @@ generic_search_all_buffers(Application_Links *app, General_Memory *general, Part View_Summary view = app->get_active_view(app, AccessAll); app->view_set_buffer(app, &view, search_buffer.buffer_id, 0); + lock_jump_buffer(search_name.str, search_name.size); + end_temp_memory(temp); } diff --git a/4coder_helper.h b/4coder_helper.h index 76150d5e..e5c66b7e 100644 --- a/4coder_helper.h +++ b/4coder_helper.h @@ -418,65 +418,4 @@ buffer_identifier(int32_t id){ return(identifier); } -static int32_t -view_open_file(Application_Links *app, View_Summary *view, - char *filename, int32_t filename_len, int32_t do_in_background){ - int32_t result = false; - Buffer_Summary buffer = app->get_buffer_by_name(app, filename, filename_len, AccessProtected|AccessHidden); - if (buffer.exists){ - if (!do_in_background){ - if (view){ - app->view_set_buffer(app, view, buffer.buffer_id, 0); - } - } - result = true; - } - else{ - buffer = app->create_buffer(app, filename, filename_len, do_in_background); - if (!do_in_background){ - if (buffer.exists){ - if (view){ - app->view_set_buffer(app, view, buffer.buffer_id, 0); - result = true; - } - } - } - } - return(result); -} - -static int32_t -read_line(Application_Links *app, - Partition *part, - Buffer_Summary *buffer, - int32_t line, - String *str){ - - Partial_Cursor begin = {0}; - Partial_Cursor end = {0}; - - int32_t success = false; - - if (app->buffer_compute_cursor(app, buffer, - seek_line_char(line, 1), &begin)){ - if (app->buffer_compute_cursor(app, buffer, - seek_line_char(line, 65536), &end)){ - if (begin.line == line){ - if (0 <= begin.pos && begin.pos <= end.pos && end.pos <= buffer->size){ - int32_t size = (end.pos - begin.pos); - *str = make_string(push_array(part, char, size+1), size+1); - if (str->str){ - success = true; - app->buffer_read_range(app, buffer, begin.pos, end.pos, str->str); - str->size = size; - terminate_with_null(str); - } - } - } - } - } - - return(success); -} - #endif diff --git a/4coder_jump_parsing.cpp b/4coder_jump_parsing.cpp index 45bc81fa..92463b69 100644 --- a/4coder_jump_parsing.cpp +++ b/4coder_jump_parsing.cpp @@ -2,16 +2,24 @@ #ifndef FCODER_JUMP_PARSING #define FCODER_JUMP_PARSING -struct Jump_Location{ +typedef struct Name_Based_Jump_Location{ String file; int32_t line; int32_t column; -}; +} Name_Based_Jump_Location; + +typedef struct ID_Based_Jump_Location{ + int32_t buffer_id; + int32_t line; + int32_t column; +} ID_Based_Jump_Location; +static ID_Based_Jump_Location null_location = {0}; static void -jump_to_location(Application_Links *app, View_Summary *view, Jump_Location *l){ - view_open_file(app, view, l->file.str, l->file.size, false); - app->view_set_cursor(app, view, seek_line_char(l->line, l->column), true); +jump_to_location(Application_Links *app, View_Summary *view, Name_Based_Jump_Location *l){ + if (view_open_file(app, view, l->file.str, l->file.size, true)){ + app->view_set_cursor(app, view, seek_line_char(l->line, l->column), true); + } } static int32_t @@ -30,8 +38,8 @@ ms_style_verify(String line, int32_t paren_pos){ } static int32_t -parse_error(String line, Jump_Location *location, - int32_t skip_sub_errors, int32_t *colon_char){ +parse_jump_location(String line, Name_Based_Jump_Location *location, + int32_t skip_sub_errors, int32_t *colon_char){ int32_t result = false; String original_line = line; @@ -151,18 +159,19 @@ parse_error(String line, Jump_Location *location, } static int32_t -goto_error(Application_Links *app, - Partition *part, - View_Summary *view, int32_t line, - Jump_Location *location, - int32_t skip_sub_errors){ +parse_jump_from_buffer_line(Application_Links *app, + Partition *part, + int32_t buffer_id, + int32_t line, + int32_t skip_sub_errors, + Name_Based_Jump_Location *location){ int32_t result = false; String line_str = {0}; - Buffer_Summary buffer = app->get_buffer(app, view->buffer_id, AccessAll); + Buffer_Summary buffer = app->get_buffer(app, buffer_id, AccessAll); if (read_line(app, part, &buffer, line, &line_str)){ int32_t colon_char = 0; - if (parse_error(line_str, location, skip_sub_errors, &colon_char)){ + if (parse_jump_location(line_str, location, skip_sub_errors, &colon_char)){ result = true; } } @@ -174,10 +183,10 @@ CUSTOM_COMMAND_SIG(goto_jump_at_cursor){ Temp_Memory temp = begin_temp_memory(&global_part); View_Summary view = app->get_active_view(app, AccessProtected); - Jump_Location location = {0}; - if (goto_error(app, &global_part, - &view, view.cursor.line, - &location, false)){ + Name_Based_Jump_Location location = {0}; + if (parse_jump_from_buffer_line(app, &global_part, + view.buffer_id, view.cursor.line, false, + &location)){ exec_command(app, change_active_panel); view = app->get_active_view(app, AccessAll); @@ -185,38 +194,33 @@ CUSTOM_COMMAND_SIG(goto_jump_at_cursor){ } end_temp_memory(temp); - } + // // Error Jumping // -struct Prev_Jump{ - int32_t buffer_id; - int32_t line; -}; - -static Prev_Jump null_location = {0}; -static Prev_Jump prev_location = {0}; - -// TODO(allen): GIVE THESE THINGS NAMES I CAN FUCKING UNDERSTAND static int32_t -next_error(Application_Links *app, - Partition *part, - View_Summary *comp_out, int32_t *start_line, - Jump_Location *location, - int32_t skip_sub_errors, - int32_t direction, - int32_t *colon_char){ +seek_next_jump_in_buffer(Application_Links *app, + Partition *part, + int32_t buffer_id, + int32_t first_line, + bool32 skip_sub_errors, + int32_t direction, + int32_t *line_out, + int32_t *colon_index_out, + Name_Based_Jump_Location *location_out){ + + Assert(direction == 1 || direction == -1); int32_t result = false; - int32_t line = *start_line + direction; + int32_t line = first_line; String line_str = {0}; - Buffer_Summary buffer = app->get_buffer(app, comp_out->buffer_id, AccessAll); + Buffer_Summary buffer = app->get_buffer(app, buffer_id, AccessAll); for (;;){ if (read_line(app, part, &buffer, line, &line_str)){ - if (parse_error(line_str, location, skip_sub_errors, colon_char)){ + if (parse_jump_location(line_str, location_out, skip_sub_errors, colon_index_out)){ result = true; break; } @@ -231,79 +235,86 @@ next_error(Application_Links *app, line = 0; } - *start_line = line; + *line_out = line; return(result); } -static Prev_Jump -jump_location_store(Application_Links *app, Jump_Location loc){ - Prev_Jump result = {0}; +static ID_Based_Jump_Location +convert_name_based_to_id_based(Application_Links *app, Name_Based_Jump_Location loc){ + ID_Based_Jump_Location result = {0}; Buffer_Summary buffer = app->get_buffer_by_name(app, loc.file.str, loc.file.size, AccessAll); if (buffer.exists){ result.buffer_id = buffer.buffer_id; result.line = loc.line; + result.column = loc.column; } return(result); } static int32_t -seek_error_internal(Application_Links *app, Partition *part, - int32_t skip_sub_errors, int32_t dir, Jump_Location *loc){ +seek_next_jump_in_view(Application_Links *app, + Partition *part, + View_Summary *view, + int32_t skip_sub_errors, + int32_t direction, + int32_t *line_out, + int32_t *colon_index_out, + Name_Based_Jump_Location *location_out){ int32_t result = false; - Jump_Location location = {0}; - Buffer_Summary buffer = app->get_buffer_by_name(app, literal("*compilation*"), AccessAll); - if (buffer.exists){ - View_Summary view = get_first_view_with_buffer(app, buffer.buffer_id); - int32_t line = view.cursor.line; - - int32_t colon_char = 0; - if (next_error(app, part, &view, &line, &location, - skip_sub_errors, dir, &colon_char)){ - - View_Summary active_view = app->get_active_view(app, AccessAll); - if (active_view.view_id == view.view_id){ - exec_command(app, change_active_panel_regular); - active_view = app->get_active_view(app, AccessAll); - } - - jump_to_location(app, &active_view, &location); - app->view_set_cursor(app, &view, seek_line_char(line, colon_char+1), true); - result = true; - if (loc){ - *loc = location; - } - } + Name_Based_Jump_Location location = {0}; + int32_t line = view->cursor.line; + int32_t colon_index = 0; + if (seek_next_jump_in_buffer(app, part, view->buffer_id, + line+direction, skip_sub_errors, direction, + &line, &colon_index, &location)){ + result = true; + *line_out = line; + *colon_index_out = colon_index; + *location_out = location; } return(result); } - static int32_t -skip_this_jump(Prev_Jump prev, Prev_Jump jump){ +skip_this_jump(ID_Based_Jump_Location prev, ID_Based_Jump_Location jump){ int32_t result = false; - if (prev.buffer_id != 0 && prev.buffer_id == jump.buffer_id && - prev.line == jump.line){ + if (prev.buffer_id != 0 && + prev.buffer_id == jump.buffer_id && + prev.line == jump.line && + prev.column <= jump.column){ result = true; } return(result); } +static ID_Based_Jump_Location prev_location = {0}; + static int32_t -seek_error_skip_repeats(Application_Links *app, Partition *part, - int32_t skip_sub_error, int32_t dir){ +advance_cursor_in_jump_view(Application_Links *app, + Partition *part, + View_Summary *view, + int32_t skip_repeats, + int32_t skip_sub_error, + int32_t direction, + Name_Based_Jump_Location *location_out){ int32_t result = true; - Jump_Location location = {0}; - Prev_Jump jump = {0}; + + Name_Based_Jump_Location location = {0}; + ID_Based_Jump_Location jump = {0}; + int32_t line = 0, colon_index = 0; + do{ Temp_Memory temp = begin_temp_memory(part); - if (seek_error_internal(app, part, skip_sub_error, dir, &location)){ - jump = jump_location_store(app, location); + if (seek_next_jump_in_view(app, part, view, + skip_sub_error, direction, + &line, &colon_index, &location)){ + jump = convert_name_based_to_id_based(app, location); result = true; } else{ @@ -311,68 +322,121 @@ seek_error_skip_repeats(Application_Links *app, Partition *part, result = false; } end_temp_memory(temp); - }while(skip_this_jump(prev_location, jump)); + }while(skip_repeats && skip_this_jump(prev_location, jump)); + + if (result){ + *location_out = location; + app->view_set_cursor(app, view, seek_line_char(line, colon_index+1), true); + } + prev_location = jump; + return(result); } -static int32_t -seek_error_no_skip(Application_Links *app, Partition *part, - int32_t skip_sub_error, int32_t dir){ - int32_t result = true; - Jump_Location location = {0}; - Prev_Jump jump = {0}; +static char locked_buffer_space[256]; +static String locked_buffer = make_fixed_width_string(locked_buffer_space); + +static void +unlock_jump_buffer(){ + locked_buffer.size = 0; +} + +static void +lock_jump_buffer(char *name, int32_t size){ + copy(&locked_buffer, make_string(name, size)); +} + +static void +lock_jump_buffer(Buffer_Summary buffer){ + copy(&locked_buffer, make_string(buffer.buffer_name, buffer.buffer_name_len)); +} + +static View_Summary +get_view_for_locked_jump_buffer(Application_Links *app){ + View_Summary view = {0}; - Temp_Memory temp = begin_temp_memory(part); - if (seek_error_internal(app, part, skip_sub_error, dir, &location)){ - jump = jump_location_store(app, location); - result = true; + if (locked_buffer.size > 0){ + Buffer_Summary buffer = app->get_buffer_by_name(app, locked_buffer.str, locked_buffer.size, AccessAll); + if (buffer.exists){ + view = get_first_view_with_buffer(app, buffer.buffer_id); + } + else{ + unlock_jump_buffer(); + } } - else{ - result = false; - } - end_temp_memory(temp); - prev_location = jump; - return(result); + return(view); } static int32_t -seek_error(Application_Links *app, Partition *part, - int32_t skip_sub_error, int32_t skip_same_line, int32_t dir){ - if (skip_same_line){ - seek_error_skip_repeats(app, part, skip_sub_error, dir); - } - else{ - seek_error_no_skip(app, part, skip_sub_error, dir); +seek_error(Application_Links *app, + Partition *part, + int32_t skip_repeats, + int32_t skip_sub_errors, + int32_t direction){ + int32_t result = 0; + + View_Summary view = get_view_for_locked_jump_buffer(app); + if (view.exists){ + + Name_Based_Jump_Location location = {0}; + if (advance_cursor_in_jump_view(app, &global_part, &view, + skip_repeats, skip_sub_errors, direction, + &location)){ + View_Summary active_view = app->get_active_view(app, AccessAll); + if (active_view.view_id == view.view_id){ + exec_command(app, change_active_panel_regular); + active_view = app->get_active_view(app, AccessAll); + } + + jump_to_location(app, &active_view, &location); + result = 1; + } } + + return(result); } + CUSTOM_COMMAND_SIG(goto_next_error){ - seek_error_skip_repeats(app, &global_part, true, 1); + int32_t skip_repeats = true; + int32_t skip_sub_errors = true; + int32_t dir = 1; + seek_error(app, &global_part, skip_repeats, skip_sub_errors, dir); } CUSTOM_COMMAND_SIG(goto_prev_error){ - seek_error_skip_repeats(app, &global_part, true, -1); + int32_t skip_repeats = true; + int32_t skip_sub_errors = true; + int32_t dir = -1; + seek_error(app, &global_part, skip_repeats, skip_sub_errors, dir); } CUSTOM_COMMAND_SIG(goto_next_error_no_skips){ - seek_error_no_skip(app, &global_part, true, 1); + int32_t skip_repeats = false; + int32_t skip_sub_errors = true; + int32_t dir = 1; + seek_error(app, &global_part, skip_repeats, skip_sub_errors, dir); } CUSTOM_COMMAND_SIG(goto_prev_error_no_skips){ - seek_error_no_skip(app, &global_part, true, -1); + int32_t skip_repeats = false; + int32_t skip_sub_errors = true; + int32_t dir = -1; + seek_error(app, &global_part, skip_repeats, skip_sub_errors, dir); } CUSTOM_COMMAND_SIG(goto_first_error){ Temp_Memory temp = begin_temp_memory(&global_part); - View_Summary active_view = app->get_active_view(app, AccessAll); - app->view_set_cursor(app, &active_view, seek_pos(0), true); - Jump_Location location = {0}; - prev_location = null_location; - seek_error_internal(app, &global_part, true, 1, &location); - prev_location = jump_location_store(app, location); + View_Summary view = get_view_for_locked_jump_buffer(app); + if (view.exists){ + app->view_set_cursor(app, &view, seek_pos(0), true); + + prev_location = null_location; + seek_error(app, &global_part, false, true, 1); + } end_temp_memory(temp); } diff --git a/4coder_types.h b/4coder_types.h index 7495b47d..8d226a84 100644 --- a/4coder_types.h +++ b/4coder_types.h @@ -93,9 +93,9 @@ ENUM(uint64_t, Command_ID){ /* DOC(TODO) */ FLAGENUM(Memory_Protect_Flags){ /* DOC(TODO) */ - MemProtect_Read = 0x1, + MemProtect_Read = 0x1, /* DOC(TODO) */ - MemProtect_Write = 0x2, + MemProtect_Write = 0x2, /* DOC(TODO) */ MemProtect_Execute = 0x4, }; @@ -189,6 +189,9 @@ FLAGENUM(Buffer_Create_Flag){ /* DOC(When BufferCreate_AlwaysNew is set it indicates the buffer should be cleared to empty even if it's associated file already has content.) */ BufferCreate_AlwaysNew = 0x2, + /* DOC(When BufferCreate_NeverNew is set it indicates that the buffer should + only be created if it is an existing file or an open buffer.) */ + BufferCreate_NeverNew = 0x4, }; /* DOC(A Buffer_Kill_Flag field specifies how a buffer should be killed.) */ diff --git a/4ed_api_implementation.cpp b/4ed_api_implementation.cpp index 1e70a066..b23aa19a 100644 --- a/4ed_api_implementation.cpp +++ b/4ed_api_implementation.cpp @@ -1046,7 +1046,7 @@ DOC_SEE(Buffer_Create_Flag) system->load_close(handle); } - else{ + else if (!(flags & BufferCreate_NeverNew)){ file = working_set_alloc_always(working_set, general); if (file){ buffer_bind_name(general, working_set, file, fname); diff --git a/TODO.txt b/TODO.txt index fec89b07..b0b1ed10 100644 --- a/TODO.txt +++ b/TODO.txt @@ -83,13 +83,16 @@ ; BEFORE I SHIP ; +; [X] flag in create buffer to prevent making new files +; [X] full screen option +; [] add to APIs +; ; [] tokens in the custom API ; [] auto indent on the custom side ; [] expose dirty flags ; [] option to not open *messages* every startup ; [] command for resizing panels ; [] control over how mouse effects panel focus -; [] full screen option ; [] API docs as text file ; [] user file bar string ; [] mouse down/up distinction @@ -98,7 +101,6 @@ ; [] read only files ; [] break down the build system and get away from the preproc hack ; [] locking to a view for next position jumping -; [] flag in create buffer to prevent making new files ; ; TODOS diff --git a/build.c b/build.c index 8560e303..4eff48ed 100644 --- a/build.c +++ b/build.c @@ -1,7 +1,5 @@ /* - 4coder development build rule. - */ // TOP @@ -266,7 +264,7 @@ buildsuper(char *code_path, char *out_path, char *filename){ static void standard_build(char *cdir, uint32_t flags){ -#if 1 +#if 0 { BEGIN_TIME_SECTION(); build(OPTS, cdir, "fsm_table_generator.cpp", @@ -281,7 +279,7 @@ standard_build(char *cdir, uint32_t flags){ } #endif -#if 1 +#if 0 { BEGIN_TIME_SECTION(); build(OPTS | DEBUG_INFO, cdir, "4ed_metagen.cpp", @@ -294,7 +292,9 @@ standard_build(char *cdir, uint32_t flags){ execute(cdir, META_DIR"/metagen"); END_TIME_SECTION("run metagen"); } +#endif +#if 1 { BEGIN_TIME_SECTION(); //buildsuper(cdir, BUILD_DIR, "../code/4coder_default_bindings.cpp"); @@ -303,7 +303,9 @@ standard_build(char *cdir, uint32_t flags){ //buildsuper(cdir, BUILD_DIR, "../4vim/4coder_chronal.cpp"); END_TIME_SECTION("build custom"); } +#endif +#if 0 { BEGIN_TIME_SECTION(); build(OPTS | INCLUDES | SHARED_CODE | flags, cdir, "4ed_app_target.cpp", diff --git a/power/4coder_casey.cpp b/power/4coder_casey.cpp index 70acebbf..d314417b 100644 --- a/power/4coder_casey.cpp +++ b/power/4coder_casey.cpp @@ -128,11 +128,14 @@ #include "4coder_default_include.cpp" #include "4coder_jump_parsing.cpp" -#ifndef Assert -#define internal static +#if !defined(Assert) #define Assert assert #endif +#if !defined(internal) +#define internal static +#endif + struct Parsed_Error { int exists; @@ -514,7 +517,7 @@ SwitchToOrLoadFile(struct Application_Links *app, String FileName, bool CreateIf { // NOTE(allen): This opens the file and puts it in &view // This returns false if the open fails. - view_open_file(app, &view, expand_str(FileName), false); + view_open_file(app, &view, FileName.str, FileName.size, true); Result.buffer = app->get_buffer_by_name(app, FileName.str, FileName.size, access); @@ -1122,8 +1125,8 @@ OpenProject(Application_Links *app, char *ProjectFileName) // was originally, so that new appends overwrite old ones. dir.size = dir_size; append(&dir, info->filename); - - view_open_file(app, 0, dir.str, dir.size, true); + + open_file(app, 0, dir.str, dir.size, true, true); ++TotalOpenAttempts; } } diff --git a/power/4coder_experiments.cpp b/power/4coder_experiments.cpp index 4259cac4..73e8ac97 100644 --- a/power/4coder_experiments.cpp +++ b/power/4coder_experiments.cpp @@ -184,11 +184,11 @@ CUSTOM_COMMAND_SIG(multi_line_edit){ // TODO(allen): Both of these brace related commands would work better // if the API exposed access to the tokens in a code file. CUSTOM_COMMAND_SIG(mark_matching_brace){ - unsigned int access = AccessProtected; + uint32_t access = AccessProtected; View_Summary view = app->get_active_view(app, access); Buffer_Summary buffer = app->get_buffer(app, view.buffer_id, access); - int start_pos = view.cursor.pos; + int32_t start_pos = view.cursor.pos; // NOTE(allen): The user provides the memory that the chunk uses, // this chunk will then be filled at each step of the text stream loop. @@ -197,12 +197,12 @@ CUSTOM_COMMAND_SIG(mark_matching_brace){ Stream_Chunk chunk; char chunk_space[(1 << 10)]; - int result = 0; - int found_result = 0; + int32_t result = 0; + int32_t found_result = 0; - int i = start_pos; - int still_looping = 1; - int nesting_counter = 0; + int32_t i = start_pos; + int32_t still_looping = 1; + int32_t nesting_counter = 0; char at_cursor = 0; if (init_stream_chunk(&chunk, app, &buffer, i, @@ -404,8 +404,8 @@ get_bindings(void *data, int size){ end_map(context); begin_map(context, my_code_map); - bind(context, '/', MDFR_ALT, mark_matching_brace); - bind(context, '\'', MDFR_ALT, cursor_to_surrounding_scope); + bind(context, ']', MDFR_ALT, mark_matching_brace); + bind(context, '[', MDFR_ALT, cursor_to_surrounding_scope); end_map(context); BIND_4CODER_TESTS(context); diff --git a/win32_4ed.cpp b/win32_4ed.cpp index 7fd7df5e..9a83e41e 100644 --- a/win32_4ed.cpp +++ b/win32_4ed.cpp @@ -139,22 +139,23 @@ struct Win32_Input_Chunk_Persistent{ b8 control_keys[MDFR_INDEX_COUNT]; }; -struct Win32_Input_Chunk{ +typedef struct Win32_Input_Chunk{ Win32_Input_Chunk_Transient trans; Win32_Input_Chunk_Persistent pers; -}; +} Win32_Input_Chunk; -struct Win32_Coroutine{ +typedef struct Win32_Coroutine{ Coroutine coroutine; Win32_Coroutine *next; i32 done; -}; +} Win32_Coroutine; #if FRED_INTERNAL struct Sys_Bubble : public Bubble{ i32 line_number; char *file_name; }; +typedef struct Sys_Bubble Sys_Bubble; #endif enum CV_ID{ @@ -169,12 +170,12 @@ enum CV_ID{ CV_COUNT }; -struct Drive_Strings{ +typedef struct Drive_Strings{ char *prefix_[26]; char **prefix; -}; +} Drive_Strings; -struct Win32_Vars{ +typedef struct Win32_Vars{ System_Functions system; App_Functions app; Custom_API custom_api; @@ -223,7 +224,7 @@ struct Win32_Vars{ CRITICAL_SECTION DEBUG_sysmem_lock; Sys_Bubble internal_bubble; #endif -}; +} Win32_Vars; globalvar Win32_Vars win32vars; globalvar Application_Memory memory_vars; @@ -271,7 +272,6 @@ internal Sys_Get_Memory_Sig(system_get_memory_){ void *ptr = 0; if (size > 0){ - #if FRED_INTERNAL ptr = VirtualAlloc(0, size + sizeof(Sys_Bubble), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); Sys_Bubble *bubble = (Sys_Bubble*)ptr; @@ -289,6 +289,7 @@ Sys_Get_Memory_Sig(system_get_memory_){ } return(ptr); } + internal Sys_Free_Memory_Sig(system_free_memory){ if (block){ @@ -1510,6 +1511,69 @@ Win32Resize(i32 width, i32 height){ } } +/* +NOTE(casey): This follows Raymond Chen's prescription +for fullscreen toggling, see: +http://blogs.msdn.com/b/oldnewthing/archive/2010/04/12/9994016.aspx +*/ + +static b32 full_screen = 0; +static WINDOWPLACEMENT GlobalWindowPosition = {sizeof(GlobalWindowPosition)}; + +internal void +Win32ToggleFullscreen(void){ + HWND Window = win32vars.window_handle; + LONG_PTR Style = GetWindowLongPtr(Window, GWL_STYLE); + if (Style & WS_OVERLAPPEDWINDOW){ + MONITORINFO MonitorInfo = {sizeof(MonitorInfo)}; + if(GetWindowPlacement(Window, &GlobalWindowPosition) && + GetMonitorInfo(MonitorFromWindow(Window, MONITOR_DEFAULTTOPRIMARY), &MonitorInfo)) + { + SetWindowLongPtr(Window, GWL_STYLE, Style & ~WS_OVERLAPPEDWINDOW); + SetWindowPos(Window, HWND_TOP, + MonitorInfo.rcMonitor.left, MonitorInfo.rcMonitor.top, + MonitorInfo.rcMonitor.right - MonitorInfo.rcMonitor.left, + MonitorInfo.rcMonitor.bottom - MonitorInfo.rcMonitor.top, + SWP_NOOWNERZORDER | SWP_FRAMECHANGED); + full_screen = 1; + } + } + else{ + SetWindowLongPtr(Window, GWL_STYLE, Style | WS_OVERLAPPEDWINDOW); + SetWindowPlacement(Window, &GlobalWindowPosition); + SetWindowPos(Window, 0, 0, 0, 0, 0, + SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | + SWP_NOOWNERZORDER | SWP_FRAMECHANGED); + full_screen = 0; + } +} + +internal void +Win32FixFullscreenLoseFocus(b32 lose_focus){ + if (full_screen){ + + HWND Window = win32vars.window_handle; + LONG_PTR Style = GetWindowLongPtr(Window, GWL_STYLE); + + MONITORINFO MonitorInfo = {sizeof(MonitorInfo)}; + if(GetMonitorInfo(MonitorFromWindow(Window, MONITOR_DEFAULTTOPRIMARY), &MonitorInfo)) + { + if (lose_focus){ + SetWindowLongPtr(Window, GWL_STYLE, Style | WS_OVERLAPPEDWINDOW); + } + else{ + SetWindowLongPtr(Window, GWL_STYLE, Style & ~WS_OVERLAPPEDWINDOW); + } + + SetWindowPos(Window, HWND_TOP, + MonitorInfo.rcMonitor.left, MonitorInfo.rcMonitor.top, + MonitorInfo.rcMonitor.right - MonitorInfo.rcMonitor.left, + MonitorInfo.rcMonitor.bottom - MonitorInfo.rcMonitor.top, + SWP_NOOWNERZORDER | SWP_FRAMECHANGED); + } + } +} + internal void Win32SetCursorFromUpdate(Application_Mouse_Cursor cursor){ switch (cursor){ @@ -1542,6 +1606,7 @@ Win32HighResolutionTime(){ internal LRESULT Win32Callback(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){ LRESULT result = 0; + switch (uMsg){ case WM_MENUCHAR: case WM_SYSCHAR:break; @@ -1792,9 +1857,11 @@ Win32Callback(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){ win32vars.input_chunk.pers.mouse_l = 0; win32vars.input_chunk.pers.mouse_r = 0; - b8 *control_keys = win32vars.input_chunk.pers.control_keys; - for (i32 i = 0; i < MDFR_INDEX_COUNT; ++i) control_keys[i] = 0; win32vars.input_chunk.pers.controls = control_keys_zero(); + + if (uMsg == WM_SETFOCUS){ + Win32FixFullscreenLoseFocus(false); + } }break; case WM_SIZE: @@ -1828,11 +1895,18 @@ Win32Callback(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){ win32vars.got_useful_event = 1; break; + case WM_CANCELMODE: + { + Win32FixFullscreenLoseFocus(true); + result = DefWindowProc(hwnd, uMsg, wParam, lParam); + }break; + default: { result = DefWindowProc(hwnd, uMsg, wParam, lParam); }break; } + return(result); } @@ -2071,7 +2145,7 @@ WinMain(HINSTANCE hInstance, win32vars.custom_api.view_routine = (View_Routine_Function*)view_routine; } #endif - + // // Window and GL Initialization @@ -2105,20 +2179,15 @@ WinMain(HINSTANCE hInstance, #define WINDOW_NAME "4coder-window: " VERSION - i32 window_x; - i32 window_y; - i32 window_style; + i32 window_x = CW_USEDEFAULT; + i32 window_y = CW_USEDEFAULT; if (win32vars.settings.set_window_pos){ window_x = win32vars.settings.window_x; window_y = win32vars.settings.window_y; } - else{ - window_x = CW_USEDEFAULT; - window_y = CW_USEDEFAULT; - } - window_style = WS_OVERLAPPEDWINDOW | WS_VISIBLE; + i32 window_style = WS_OVERLAPPEDWINDOW; if (win32vars.settings.maximize_window){ window_style |= WS_MAXIMIZE; } @@ -2238,7 +2307,6 @@ WinMain(HINSTANCE hInstance, win32vars.count_per_usecond = 1; } - // // Main Loop // @@ -2259,6 +2327,7 @@ WinMain(HINSTANCE hInstance, SetForegroundWindow(win32vars.window_handle); SetActiveWindow(win32vars.window_handle); + ShowWindow(win32vars.window_handle, SW_SHOW); u64 timer_start = Win32HighResolutionTime(); system_acquire_lock(FRAME_LOCK);