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){
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);

View File

@ -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);
}
}

View File

@ -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);
}

View File

@ -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

View File

@ -2,17 +2,25 @@
#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);
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
ms_style_verify(String line, int32_t paren_pos){
@ -30,7 +38,7 @@ ms_style_verify(String line, int32_t paren_pos){
}
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 result = false;
@ -151,18 +159,19 @@ parse_error(String line, Jump_Location *location,
}
static int32_t
goto_error(Application_Links *app,
parse_jump_from_buffer_line(Application_Links *app,
Partition *part,
View_Summary *view, int32_t line,
Jump_Location *location,
int32_t skip_sub_errors){
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,
seek_next_jump_in_buffer(Application_Links *app,
Partition *part,
View_Summary *comp_out, int32_t *start_line,
Jump_Location *location,
int32_t skip_sub_errors,
int32_t buffer_id,
int32_t first_line,
bool32 skip_sub_errors,
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 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);
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;
if (loc){
*loc = location;
}
}
*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);
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;
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};
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{
result = false;
unlock_jump_buffer();
}
}
return(view);
}
static int32_t
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;
}
}
end_temp_memory(temp);
prev_location = jump;
return(result);
}
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);
}
}
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};
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_internal(app, &global_part, true, 1, &location);
prev_location = jump_location_store(app, location);
seek_error(app, &global_part, false, true, 1);
}
end_temp_memory(temp);
}

View File

@ -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.) */

View File

@ -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);

View File

@ -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
View File

@ -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",

View File

@ -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);
@ -1123,7 +1126,7 @@ OpenProject(Application_Links *app, char *ProjectFileName)
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;
}
}

View File

@ -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);

View File

@ -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);
}
@ -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);