implemented windows fullscreen (hacking alt tab), improved the next error part of the jump parsing

This commit is contained in:
Allen Webster 2016-08-31 20:26:52 -04:00
parent df236e44b5
commit 084d45b530
12 changed files with 407 additions and 223 deletions

View File

@ -102,7 +102,7 @@ CUSTOM_COMMAND_SIG(rewrite_as_single_caps){
CUSTOM_COMMAND_SIG(open_my_files){ CUSTOM_COMMAND_SIG(open_my_files){
uint32_t access = AccessAll; uint32_t access = AccessAll;
View_Summary view = app->get_active_view(app, access); 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){ CUSTOM_COMMAND_SIG(build_at_launch_location){
@ -160,6 +160,7 @@ CUSTOM_COMMAND_SIG(newline_or_goto_position){
if (buffer.lock_flags & AccessProtected){ if (buffer.lock_flags & AccessProtected){
exec_command(app, goto_jump_at_cursor); exec_command(app, goto_jump_at_cursor);
lock_jump_buffer(buffer);
} }
else{ else{
exec_command(app, write_character); exec_command(app, write_character);

View File

@ -15,8 +15,10 @@
// //
CUSTOM_COMMAND_SIG(build_in_build_panel){ CUSTOM_COMMAND_SIG(build_in_build_panel){
String comp_name = make_lit_string("*compilation*");
Buffer_Summary buffer = 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 build_view = {0};
View_Summary original_view = app->get_active_view(app, AccessAll); 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); 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")); app->buffer_set_font(app, &buffer, literal("Inconsolata"));
prev_location = null_location; 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 // 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)){ if (file_name_in_quotes(app, &file_name)){
exec_command(app, change_active_panel_build); exec_command(app, change_active_panel_build);
View_Summary view = app->get_active_view(app, AccessAll); 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);
} }
} }

View File

@ -19,6 +19,97 @@
# define DEF_TAB_WIDTH 4 # define DEF_TAB_WIDTH 4
#endif #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 // Memory
@ -1571,7 +1662,7 @@ CUSTOM_COMMAND_SIG(open_file_in_quotes_regular){
if (file_name_in_quotes(app, &file_name)){ if (file_name_in_quotes(app, &file_name)){
exec_command(app, change_active_panel_regular); exec_command(app, change_active_panel_regular);
View_Summary view = app->get_active_view(app, AccessAll); 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_table.cpp"
#include "4coder_search.cpp" #include "4coder_search.cpp"
#include "4coder_jump_parsing.cpp"
static void static void
generic_search_all_buffers(Application_Links *app, General_Memory *general, Partition *part, 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; 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){ 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_Unimportant, true);
app->buffer_set_setting(app, &search_buffer, BufferSetting_ReadOnly, true); app->buffer_set_setting(app, &search_buffer, BufferSetting_ReadOnly, true);
app->buffer_set_setting(app, &search_buffer, BufferSetting_WrapLine, false); 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); View_Summary view = app->get_active_view(app, AccessAll);
app->view_set_buffer(app, &view, search_buffer.buffer_id, 0); app->view_set_buffer(app, &view, search_buffer.buffer_id, 0);
lock_jump_buffer(search_name.str, search_name.size);
end_temp_memory(temp); end_temp_memory(temp);
} }

View File

@ -418,65 +418,4 @@ buffer_identifier(int32_t id){
return(identifier); 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 #endif

View File

@ -2,16 +2,24 @@
#ifndef FCODER_JUMP_PARSING #ifndef FCODER_JUMP_PARSING
#define FCODER_JUMP_PARSING #define FCODER_JUMP_PARSING
struct Jump_Location{ typedef struct Name_Based_Jump_Location{
String file; String file;
int32_t line; int32_t line;
int32_t column; 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 static void
jump_to_location(Application_Links *app, View_Summary *view, Jump_Location *l){ jump_to_location(Application_Links *app, View_Summary *view, Name_Based_Jump_Location *l){
view_open_file(app, view, l->file.str, l->file.size, false); 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); app->view_set_cursor(app, view, seek_line_char(l->line, l->column), true);
}
} }
static int32_t static int32_t
@ -30,8 +38,8 @@ ms_style_verify(String line, int32_t paren_pos){
} }
static int32_t static int32_t
parse_error(String line, Jump_Location *location, parse_jump_location(String line, Name_Based_Jump_Location *location,
int32_t skip_sub_errors, int32_t *colon_char){ int32_t skip_sub_errors, int32_t *colon_char){
int32_t result = false; int32_t result = false;
String original_line = line; String original_line = line;
@ -151,18 +159,19 @@ parse_error(String line, Jump_Location *location,
} }
static int32_t static int32_t
goto_error(Application_Links *app, parse_jump_from_buffer_line(Application_Links *app,
Partition *part, Partition *part,
View_Summary *view, int32_t line, int32_t buffer_id,
Jump_Location *location, int32_t line,
int32_t skip_sub_errors){ int32_t skip_sub_errors,
Name_Based_Jump_Location *location){
int32_t result = false; int32_t result = false;
String line_str = {0}; 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)){ if (read_line(app, part, &buffer, line, &line_str)){
int32_t colon_char = 0; 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; result = true;
} }
} }
@ -174,10 +183,10 @@ CUSTOM_COMMAND_SIG(goto_jump_at_cursor){
Temp_Memory temp = begin_temp_memory(&global_part); Temp_Memory temp = begin_temp_memory(&global_part);
View_Summary view = app->get_active_view(app, AccessProtected); View_Summary view = app->get_active_view(app, AccessProtected);
Jump_Location location = {0}; Name_Based_Jump_Location location = {0};
if (goto_error(app, &global_part, if (parse_jump_from_buffer_line(app, &global_part,
&view, view.cursor.line, view.buffer_id, view.cursor.line, false,
&location, false)){ &location)){
exec_command(app, change_active_panel); exec_command(app, change_active_panel);
view = app->get_active_view(app, AccessAll); view = app->get_active_view(app, AccessAll);
@ -185,38 +194,33 @@ CUSTOM_COMMAND_SIG(goto_jump_at_cursor){
} }
end_temp_memory(temp); end_temp_memory(temp);
} }
// //
// Error Jumping // 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 static int32_t
next_error(Application_Links *app, seek_next_jump_in_buffer(Application_Links *app,
Partition *part, Partition *part,
View_Summary *comp_out, int32_t *start_line, int32_t buffer_id,
Jump_Location *location, int32_t first_line,
int32_t skip_sub_errors, bool32 skip_sub_errors,
int32_t direction, int32_t direction,
int32_t *colon_char){ 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 result = false;
int32_t line = *start_line + direction; int32_t line = first_line;
String line_str = {0}; 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 (;;){ for (;;){
if (read_line(app, part, &buffer, line, &line_str)){ 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; result = true;
break; break;
} }
@ -231,79 +235,86 @@ next_error(Application_Links *app,
line = 0; line = 0;
} }
*start_line = line; *line_out = line;
return(result); return(result);
} }
static Prev_Jump static ID_Based_Jump_Location
jump_location_store(Application_Links *app, Jump_Location loc){ convert_name_based_to_id_based(Application_Links *app, Name_Based_Jump_Location loc){
Prev_Jump result = {0}; ID_Based_Jump_Location result = {0};
Buffer_Summary buffer = Buffer_Summary buffer =
app->get_buffer_by_name(app, loc.file.str, loc.file.size, AccessAll); app->get_buffer_by_name(app, loc.file.str, loc.file.size, AccessAll);
if (buffer.exists){ if (buffer.exists){
result.buffer_id = buffer.buffer_id; result.buffer_id = buffer.buffer_id;
result.line = loc.line; result.line = loc.line;
result.column = loc.column;
} }
return(result); return(result);
} }
static int32_t static int32_t
seek_error_internal(Application_Links *app, Partition *part, seek_next_jump_in_view(Application_Links *app,
int32_t skip_sub_errors, int32_t dir, Jump_Location *loc){ 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; int32_t result = false;
Jump_Location location = {0}; Name_Based_Jump_Location location = {0};
Buffer_Summary buffer = app->get_buffer_by_name(app, literal("*compilation*"), AccessAll); int32_t line = view->cursor.line;
if (buffer.exists){ int32_t colon_index = 0;
View_Summary view = get_first_view_with_buffer(app, buffer.buffer_id); if (seek_next_jump_in_buffer(app, part, view->buffer_id,
int32_t line = view.cursor.line; line+direction, skip_sub_errors, direction,
&line, &colon_index, &location)){
int32_t colon_char = 0; result = true;
if (next_error(app, part, &view, &line, &location, *line_out = line;
skip_sub_errors, dir, &colon_char)){ *colon_index_out = colon_index;
*location_out = 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);
app->view_set_cursor(app, &view, seek_line_char(line, colon_char+1), true);
result = true;
if (loc){
*loc = location;
}
}
} }
return(result); return(result);
} }
static int32_t 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; int32_t result = false;
if (prev.buffer_id != 0 && prev.buffer_id == jump.buffer_id && if (prev.buffer_id != 0 &&
prev.line == jump.line){ prev.buffer_id == jump.buffer_id &&
prev.line == jump.line &&
prev.column <= jump.column){
result = true; result = true;
} }
return(result); return(result);
} }
static ID_Based_Jump_Location prev_location = {0};
static int32_t static int32_t
seek_error_skip_repeats(Application_Links *app, Partition *part, advance_cursor_in_jump_view(Application_Links *app,
int32_t skip_sub_error, int32_t dir){ 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; 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{ do{
Temp_Memory temp = begin_temp_memory(part); Temp_Memory temp = begin_temp_memory(part);
if (seek_error_internal(app, part, skip_sub_error, dir, &location)){ if (seek_next_jump_in_view(app, part, view,
jump = jump_location_store(app, location); skip_sub_error, direction,
&line, &colon_index, &location)){
jump = convert_name_based_to_id_based(app, location);
result = true; result = true;
} }
else{ else{
@ -311,68 +322,121 @@ seek_error_skip_repeats(Application_Links *app, Partition *part,
result = false; result = false;
} }
end_temp_memory(temp); 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; prev_location = jump;
return(result); return(result);
} }
static int32_t static char locked_buffer_space[256];
seek_error_no_skip(Application_Links *app, Partition *part, static String locked_buffer = make_fixed_width_string(locked_buffer_space);
int32_t skip_sub_error, int32_t dir){
int32_t result = true; static void
Jump_Location location = {0}; unlock_jump_buffer(){
Prev_Jump jump = {0}; 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 (locked_buffer.size > 0){
if (seek_error_internal(app, part, skip_sub_error, dir, &location)){ Buffer_Summary buffer = app->get_buffer_by_name(app, locked_buffer.str, locked_buffer.size, AccessAll);
jump = jump_location_store(app, location); if (buffer.exists){
result = true; 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(view);
return(result);
} }
static int32_t static int32_t
seek_error(Application_Links *app, Partition *part, seek_error(Application_Links *app,
int32_t skip_sub_error, int32_t skip_same_line, int32_t dir){ Partition *part,
if (skip_same_line){ int32_t skip_repeats,
seek_error_skip_repeats(app, part, skip_sub_error, dir); int32_t skip_sub_errors,
} int32_t direction){
else{ int32_t result = 0;
seek_error_no_skip(app, part, skip_sub_error, dir);
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){ 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){ 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){ 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){ 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){ CUSTOM_COMMAND_SIG(goto_first_error){
Temp_Memory temp = begin_temp_memory(&global_part); 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}; View_Summary view = get_view_for_locked_jump_buffer(app);
prev_location = null_location; if (view.exists){
seek_error_internal(app, &global_part, true, 1, &location); app->view_set_cursor(app, &view, seek_pos(0), true);
prev_location = jump_location_store(app, location);
prev_location = null_location;
seek_error(app, &global_part, false, true, 1);
}
end_temp_memory(temp); end_temp_memory(temp);
} }

View File

@ -93,9 +93,9 @@ ENUM(uint64_t, Command_ID){
/* DOC(TODO) */ /* DOC(TODO) */
FLAGENUM(Memory_Protect_Flags){ FLAGENUM(Memory_Protect_Flags){
/* DOC(TODO) */ /* DOC(TODO) */
MemProtect_Read = 0x1, MemProtect_Read = 0x1,
/* DOC(TODO) */ /* DOC(TODO) */
MemProtect_Write = 0x2, MemProtect_Write = 0x2,
/* DOC(TODO) */ /* DOC(TODO) */
MemProtect_Execute = 0x4, MemProtect_Execute = 0x4,
}; };
@ -189,6 +189,9 @@ FLAGENUM(Buffer_Create_Flag){
/* DOC(When BufferCreate_AlwaysNew is set it indicates the buffer should be /* DOC(When BufferCreate_AlwaysNew is set it indicates the buffer should be
cleared to empty even if it's associated file already has content.) */ cleared to empty even if it's associated file already has content.) */
BufferCreate_AlwaysNew = 0x2, 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.) */ /* DOC(A Buffer_Kill_Flag field specifies how a buffer should be killed.) */

View File

@ -1046,7 +1046,7 @@ DOC_SEE(Buffer_Create_Flag)
system->load_close(handle); system->load_close(handle);
} }
else{ else if (!(flags & BufferCreate_NeverNew)){
file = working_set_alloc_always(working_set, general); file = working_set_alloc_always(working_set, general);
if (file){ if (file){
buffer_bind_name(general, working_set, file, fname); buffer_bind_name(general, working_set, file, fname);

View File

@ -83,13 +83,16 @@
; BEFORE I SHIP ; 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 ; [] tokens in the custom API
; [] auto indent on the custom side ; [] auto indent on the custom side
; [] expose dirty flags ; [] expose dirty flags
; [] option to not open *messages* every startup ; [] option to not open *messages* every startup
; [] command for resizing panels ; [] command for resizing panels
; [] control over how mouse effects panel focus ; [] control over how mouse effects panel focus
; [] full screen option
; [] API docs as text file ; [] API docs as text file
; [] user file bar string ; [] user file bar string
; [] mouse down/up distinction ; [] mouse down/up distinction
@ -98,7 +101,6 @@
; [] read only files ; [] read only files
; [] break down the build system and get away from the preproc hack ; [] break down the build system and get away from the preproc hack
; [] locking to a view for next position jumping ; [] locking to a view for next position jumping
; [] flag in create buffer to prevent making new files
; ;
; TODOS ; TODOS

10
build.c
View File

@ -1,7 +1,5 @@
/* /*
4coder development build rule. 4coder development build rule.
*/ */
// TOP // TOP
@ -266,7 +264,7 @@ buildsuper(char *code_path, char *out_path, char *filename){
static void static void
standard_build(char *cdir, uint32_t flags){ standard_build(char *cdir, uint32_t flags){
#if 1 #if 0
{ {
BEGIN_TIME_SECTION(); BEGIN_TIME_SECTION();
build(OPTS, cdir, "fsm_table_generator.cpp", build(OPTS, cdir, "fsm_table_generator.cpp",
@ -281,7 +279,7 @@ standard_build(char *cdir, uint32_t flags){
} }
#endif #endif
#if 1 #if 0
{ {
BEGIN_TIME_SECTION(); BEGIN_TIME_SECTION();
build(OPTS | DEBUG_INFO, cdir, "4ed_metagen.cpp", build(OPTS | DEBUG_INFO, cdir, "4ed_metagen.cpp",
@ -294,7 +292,9 @@ standard_build(char *cdir, uint32_t flags){
execute(cdir, META_DIR"/metagen"); execute(cdir, META_DIR"/metagen");
END_TIME_SECTION("run metagen"); END_TIME_SECTION("run metagen");
} }
#endif
#if 1
{ {
BEGIN_TIME_SECTION(); BEGIN_TIME_SECTION();
//buildsuper(cdir, BUILD_DIR, "../code/4coder_default_bindings.cpp"); //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"); //buildsuper(cdir, BUILD_DIR, "../4vim/4coder_chronal.cpp");
END_TIME_SECTION("build custom"); END_TIME_SECTION("build custom");
} }
#endif
#if 0
{ {
BEGIN_TIME_SECTION(); BEGIN_TIME_SECTION();
build(OPTS | INCLUDES | SHARED_CODE | flags, cdir, "4ed_app_target.cpp", build(OPTS | INCLUDES | SHARED_CODE | flags, cdir, "4ed_app_target.cpp",

View File

@ -128,11 +128,14 @@
#include "4coder_default_include.cpp" #include "4coder_default_include.cpp"
#include "4coder_jump_parsing.cpp" #include "4coder_jump_parsing.cpp"
#ifndef Assert #if !defined(Assert)
#define internal static
#define Assert assert #define Assert assert
#endif #endif
#if !defined(internal)
#define internal static
#endif
struct Parsed_Error struct Parsed_Error
{ {
int exists; 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 // NOTE(allen): This opens the file and puts it in &view
// This returns false if the open fails. // 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); 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. // was originally, so that new appends overwrite old ones.
dir.size = dir_size; dir.size = dir_size;
append(&dir, info->filename); 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; ++TotalOpenAttempts;
} }
} }

View File

@ -184,11 +184,11 @@ CUSTOM_COMMAND_SIG(multi_line_edit){
// TODO(allen): Both of these brace related commands would work better // TODO(allen): Both of these brace related commands would work better
// if the API exposed access to the tokens in a code file. // if the API exposed access to the tokens in a code file.
CUSTOM_COMMAND_SIG(mark_matching_brace){ CUSTOM_COMMAND_SIG(mark_matching_brace){
unsigned int access = AccessProtected; uint32_t access = AccessProtected;
View_Summary view = app->get_active_view(app, access); View_Summary view = app->get_active_view(app, access);
Buffer_Summary buffer = app->get_buffer(app, view.buffer_id, 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, // 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. // 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; Stream_Chunk chunk;
char chunk_space[(1 << 10)]; char chunk_space[(1 << 10)];
int result = 0; int32_t result = 0;
int found_result = 0; int32_t found_result = 0;
int i = start_pos; int32_t i = start_pos;
int still_looping = 1; int32_t still_looping = 1;
int nesting_counter = 0; int32_t nesting_counter = 0;
char at_cursor = 0; char at_cursor = 0;
if (init_stream_chunk(&chunk, app, &buffer, i, if (init_stream_chunk(&chunk, app, &buffer, i,
@ -404,8 +404,8 @@ get_bindings(void *data, int size){
end_map(context); end_map(context);
begin_map(context, my_code_map); begin_map(context, my_code_map);
bind(context, '/', MDFR_ALT, mark_matching_brace); bind(context, ']', MDFR_ALT, mark_matching_brace);
bind(context, '\'', MDFR_ALT, cursor_to_surrounding_scope); bind(context, '[', MDFR_ALT, cursor_to_surrounding_scope);
end_map(context); end_map(context);
BIND_4CODER_TESTS(context); BIND_4CODER_TESTS(context);

View File

@ -139,22 +139,23 @@ struct Win32_Input_Chunk_Persistent{
b8 control_keys[MDFR_INDEX_COUNT]; b8 control_keys[MDFR_INDEX_COUNT];
}; };
struct Win32_Input_Chunk{ typedef struct Win32_Input_Chunk{
Win32_Input_Chunk_Transient trans; Win32_Input_Chunk_Transient trans;
Win32_Input_Chunk_Persistent pers; Win32_Input_Chunk_Persistent pers;
}; } Win32_Input_Chunk;
struct Win32_Coroutine{ typedef struct Win32_Coroutine{
Coroutine coroutine; Coroutine coroutine;
Win32_Coroutine *next; Win32_Coroutine *next;
i32 done; i32 done;
}; } Win32_Coroutine;
#if FRED_INTERNAL #if FRED_INTERNAL
struct Sys_Bubble : public Bubble{ struct Sys_Bubble : public Bubble{
i32 line_number; i32 line_number;
char *file_name; char *file_name;
}; };
typedef struct Sys_Bubble Sys_Bubble;
#endif #endif
enum CV_ID{ enum CV_ID{
@ -169,12 +170,12 @@ enum CV_ID{
CV_COUNT CV_COUNT
}; };
struct Drive_Strings{ typedef struct Drive_Strings{
char *prefix_[26]; char *prefix_[26];
char **prefix; char **prefix;
}; } Drive_Strings;
struct Win32_Vars{ typedef struct Win32_Vars{
System_Functions system; System_Functions system;
App_Functions app; App_Functions app;
Custom_API custom_api; Custom_API custom_api;
@ -223,7 +224,7 @@ struct Win32_Vars{
CRITICAL_SECTION DEBUG_sysmem_lock; CRITICAL_SECTION DEBUG_sysmem_lock;
Sys_Bubble internal_bubble; Sys_Bubble internal_bubble;
#endif #endif
}; } Win32_Vars;
globalvar Win32_Vars win32vars; globalvar Win32_Vars win32vars;
globalvar Application_Memory memory_vars; globalvar Application_Memory memory_vars;
@ -271,7 +272,6 @@ internal
Sys_Get_Memory_Sig(system_get_memory_){ Sys_Get_Memory_Sig(system_get_memory_){
void *ptr = 0; void *ptr = 0;
if (size > 0){ if (size > 0){
#if FRED_INTERNAL #if FRED_INTERNAL
ptr = VirtualAlloc(0, size + sizeof(Sys_Bubble), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); ptr = VirtualAlloc(0, size + sizeof(Sys_Bubble), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
Sys_Bubble *bubble = (Sys_Bubble*)ptr; Sys_Bubble *bubble = (Sys_Bubble*)ptr;
@ -289,6 +289,7 @@ Sys_Get_Memory_Sig(system_get_memory_){
} }
return(ptr); return(ptr);
} }
internal internal
Sys_Free_Memory_Sig(system_free_memory){ Sys_Free_Memory_Sig(system_free_memory){
if (block){ 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 internal void
Win32SetCursorFromUpdate(Application_Mouse_Cursor cursor){ Win32SetCursorFromUpdate(Application_Mouse_Cursor cursor){
switch (cursor){ switch (cursor){
@ -1542,6 +1606,7 @@ Win32HighResolutionTime(){
internal LRESULT internal LRESULT
Win32Callback(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){ Win32Callback(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
LRESULT result = 0; LRESULT result = 0;
switch (uMsg){ switch (uMsg){
case WM_MENUCHAR: case WM_MENUCHAR:
case WM_SYSCHAR:break; 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_l = 0;
win32vars.input_chunk.pers.mouse_r = 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(); win32vars.input_chunk.pers.controls = control_keys_zero();
if (uMsg == WM_SETFOCUS){
Win32FixFullscreenLoseFocus(false);
}
}break; }break;
case WM_SIZE: case WM_SIZE:
@ -1828,11 +1895,18 @@ Win32Callback(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
win32vars.got_useful_event = 1; win32vars.got_useful_event = 1;
break; break;
case WM_CANCELMODE:
{
Win32FixFullscreenLoseFocus(true);
result = DefWindowProc(hwnd, uMsg, wParam, lParam);
}break;
default: default:
{ {
result = DefWindowProc(hwnd, uMsg, wParam, lParam); result = DefWindowProc(hwnd, uMsg, wParam, lParam);
}break; }break;
} }
return(result); return(result);
} }
@ -2071,7 +2145,7 @@ WinMain(HINSTANCE hInstance,
win32vars.custom_api.view_routine = (View_Routine_Function*)view_routine; win32vars.custom_api.view_routine = (View_Routine_Function*)view_routine;
} }
#endif #endif
// //
// Window and GL Initialization // Window and GL Initialization
@ -2105,20 +2179,15 @@ WinMain(HINSTANCE hInstance,
#define WINDOW_NAME "4coder-window: " VERSION #define WINDOW_NAME "4coder-window: " VERSION
i32 window_x; i32 window_x = CW_USEDEFAULT;
i32 window_y; i32 window_y = CW_USEDEFAULT;
i32 window_style;
if (win32vars.settings.set_window_pos){ if (win32vars.settings.set_window_pos){
window_x = win32vars.settings.window_x; window_x = win32vars.settings.window_x;
window_y = win32vars.settings.window_y; 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){ if (win32vars.settings.maximize_window){
window_style |= WS_MAXIMIZE; window_style |= WS_MAXIMIZE;
} }
@ -2238,7 +2307,6 @@ WinMain(HINSTANCE hInstance,
win32vars.count_per_usecond = 1; win32vars.count_per_usecond = 1;
} }
// //
// Main Loop // Main Loop
// //
@ -2259,6 +2327,7 @@ WinMain(HINSTANCE hInstance,
SetForegroundWindow(win32vars.window_handle); SetForegroundWindow(win32vars.window_handle);
SetActiveWindow(win32vars.window_handle); SetActiveWindow(win32vars.window_handle);
ShowWindow(win32vars.window_handle, SW_SHOW);
u64 timer_start = Win32HighResolutionTime(); u64 timer_start = Win32HighResolutionTime();
system_acquire_lock(FRAME_LOCK); system_acquire_lock(FRAME_LOCK);