implemented windows fullscreen (hacking alt tab), improved the next error part of the jump parsing
This commit is contained in:
parent
df236e44b5
commit
084d45b530
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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.) */
|
||||
|
|
|
@ -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);
|
||||
|
|
6
TODO.txt
6
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
|
||||
|
|
10
build.c
10
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",
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
111
win32_4ed.cpp
111
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);
|
||||
|
|
Loading…
Reference in New Issue