Log grapher wrapped up, more flexible key matching in listers, i64 in markers

This commit is contained in:
Allen Webster 2019-08-23 18:34:42 -07:00
parent 5f46a7611c
commit 8f8ad47f4e
31 changed files with 1516 additions and 931 deletions

View File

@ -615,7 +615,7 @@ DOC_SEE(buffer_add_markers)
*/
STRUCT Marker{
/* DOC(The current position of the marker measure in absolute byte positioning coordinates.) */
i32 pos;
i64 pos;
/* DOC(When a marker is inside a range that gets edited, by default the marker 'leans_left' which means it goes to the beginning of the edited range. If the field lean_right is set to true, the marker will lean right with edits and will go to the end of edited range.) */
b32 lean_right;
};

View File

@ -20,6 +20,12 @@
#define VERSION_TYPE
#endif
// string
#define VN__(a,b,c) #a "." #b "." #c
#define VN_(a,b,c) VN__(a,b,c)
#define VERSION_NUMBER VN_(MAJOR,MINOR,PATCH)
#define VERSION_STRING "alpha " VERSION_NUMBER
#define VERSION VERSION_STRING VERSION_TYPE
#define WINDOW_NAME "4coder: " VERSION

View File

@ -8,9 +8,9 @@
* This transition helper will be removed in a future version so it is recommended to get off sooner or laster.
*
* Tips on transitioning:
*
* Wrather than just try to inline this code everywhere, you can simplify things quite a lot by storing references
* to buffers and views and Buffer_ID and View_ID instead of Buffer_Summary and View_Summary.
*
* Wrather than just try to inline this code everywhere, you can simplify things quite a lot by storing references
* to buffers and views and Buffer_ID and View_ID instead of Buffer_Summary and View_Summary.
* Just get the summaries when you need information in those structures.
*
* You will make your code simpler if you stick to String as much as possible, but whenever you want to you can switch

View File

@ -762,10 +762,12 @@ view_set_vertical_focus(Application_Links *app, View_Summary *view, i32 y_top, i
view_set_vertical_focus(app, view==0?0:view->view_id, (f32)y_top, (f32)y_bot);
}
#if 0
static b32
advance_cursor_in_jump_view(Application_Links *app, View_Summary *view, i32 skip_repeats, i32 skip_sub_error, i32 direction, Name_Line_Column_Location *location_out){
return(advance_cursor_in_jump_view(app, view==0?0:view->view_id, skip_repeats, skip_sub_error, direction, location_out));
}
#endif
static Parsed_Jump
seek_next_jump_in_view(Application_Links *app, Arena *arena, View_Summary *view, i32 skip_sub_errors, i32 direction, i32 *line_out){

View File

@ -314,16 +314,9 @@ CUSTOM_DOC("Reads the scroll wheel value from the mouse state and scrolls accord
////////////////////////////////
static void
move_vertical(Application_Links *app, f32 line_multiplier){
View_ID view = get_active_view(app, AccessProtected);
Buffer_ID buffer = view_get_buffer(app, view, AccessProtected);
Face_ID face_id = get_face_id(app, buffer);
Face_Metrics metrics = get_face_metrics(app, face_id);
f32 delta_y = line_multiplier*metrics.line_height;
f32 new_y = get_view_y(app, view) + delta_y;
internal void
move_vertical_pixels(Application_Links *app, View_ID view, f32 pixels){
f32 new_y = get_view_y(app, view) + pixels;
f32 x = view_get_preferred_x(app, view);
view_set_cursor(app, view, seek_wrapped_xy(x, new_y, false), false);
@ -335,7 +328,7 @@ move_vertical(Application_Links *app, f32 line_multiplier){
GUI_Scroll_Vars scroll_vars = view_get_scroll_vars(app, view);
if (scroll_vars.target_y < full_scroll_y){
GUI_Scroll_Vars new_scroll_vars = scroll_vars;
new_scroll_vars.target_y += (i32)delta_y;
new_scroll_vars.target_y += (i32)pixels;
new_scroll_vars.target_y = clamp_top(new_scroll_vars.target_y, (i32)full_scroll_y);
view_set_scroll(app, view, new_scroll_vars);
}
@ -344,21 +337,34 @@ move_vertical(Application_Links *app, f32 line_multiplier){
no_mark_snap_to_cursor_if_shift(app, view);
}
static f32
get_page_jump(Application_Links *app, View_ID view){
Rect_f32 region = view_get_buffer_region(app, view);
internal void
move_vertical_pixels(Application_Links *app, f32 pixels){
View_ID view = get_active_view(app, AccessProtected);
move_vertical_pixels(app, view, pixels);
}
internal void
move_vertical_lines(Application_Links *app, View_ID view, f32 lines){
Buffer_ID buffer = view_get_buffer(app, view, AccessProtected);
Face_ID face_id = get_face_id(app, buffer);
Face_Metrics metrics = get_face_metrics(app, face_id);
f32 page_jump = 1.f;
if (metrics.line_height > 0.f){
f32 height = rect_height(region);
f32 line_count = height/metrics.line_height;
i32 line_count_rounded = (i32)line_count;
page_jump = (f32)line_count_rounded - 3.f;
page_jump = clamp_bot(1.f, page_jump);
}
return(page_jump);
f32 delta_y = lines*metrics.line_height;
move_vertical_pixels(app, delta_y);
}
internal void
move_vertical_lines(Application_Links *app, f32 lines){
View_ID view = get_active_view(app, AccessProtected);
move_vertical_lines(app, view, lines);
}
#define move_vertical move_vertical_lines
internal f32
get_page_jump(Application_Links *app, View_ID view){
Rect_f32 region = view_get_buffer_region(app, view);
return(rect_height(region)*.9f);
}
CUSTOM_COMMAND_SIG(move_up)
@ -400,7 +406,7 @@ CUSTOM_DOC("Scrolls the view up one view height and moves the cursor up one view
{
View_ID view = get_active_view(app, AccessProtected);
f32 page_jump = get_page_jump(app, view);
move_vertical(app, -page_jump);
move_vertical_pixels(app, -page_jump);
}
CUSTOM_COMMAND_SIG(page_down)
@ -408,7 +414,7 @@ CUSTOM_DOC("Scrolls the view down one view height and moves the cursor down one
{
View_ID view = get_active_view(app, AccessProtected);
f32 page_jump = get_page_jump(app, view);
move_vertical(app, page_jump);
move_vertical_pixels(app, page_jump);
}
internal void

View File

@ -1430,11 +1430,11 @@ operator!=(Vec4_f32 a, Vec4_f32 b){
static b32
operator==(Rect_i32 a, Rect_i32 b){
return(a.p0 == b.p0 && a.p0 == b.p0);
return(a.p0 == b.p0 && a.p1 == b.p1);
}
static b32
operator==(Rect_f32 a, Rect_f32 b){
return(a.p0 == b.p0 && a.p0 == b.p0);
return(a.p0 == b.p0 && a.p1 == b.p1);
}
static b32

View File

@ -464,7 +464,7 @@ union SNode{
#define dll_remove_multiple(n1,n2) (dll_remove_multiple_((n1),(n2)))
#define sll_stack_push_(h,n) n->next=h,h=n
#define sll_stack_pop_(h) h->next=0,h=h->next
#define sll_stack_pop_(h) h=h=h->next
#define sll_queue_push_multiple_(f,l,ff,ll) if(ll){if(f){l->next=ff;}else{f=ff;}l=ll;l->next=0;}
#define sll_queue_push_(f,l,n) sll_queue_push_multiple_(f,l,n,n)
#define sll_queue_pop_(f,l) if (f==l) { f=l=0; } else { f->next=0;f=f->next; }

View File

@ -131,7 +131,7 @@ CUSTOM_DOC("Looks for a build.bat, build.sh, or makefile in the current and pare
View_ID view = get_active_view(app, AccessAll);
Buffer_ID buffer = view_get_buffer(app, view, AccessAll);
standard_search_and_build(app, view, buffer);
memset(&prev_location, 0, sizeof(prev_location));
block_zero_struct(&prev_location);
lock_jump_buffer(app, string_u8_litexpr("*compilation*"));
}
@ -171,7 +171,7 @@ CUSTOM_DOC("Looks for a build.bat, build.sh, or makefile in the current and pare
standard_search_and_build(app, build_view, buffer);
set_fancy_compilation_buffer_font(app);
memset(&prev_location, 0, sizeof(prev_location));
block_zero_struct(&prev_location);
lock_jump_buffer(app, string_u8_litexpr("*compilation*"));
}

View File

@ -10,6 +10,7 @@
enum Default_Maps{
default_code_map,
default_lister_ui_map,
default_log_graph_map,
default_maps_count,
};
@ -32,7 +33,7 @@ typedef ID_Line_Column_Jump_Location ID_Based_Jump_Location;
struct ID_Pos_Jump_Location{
Buffer_ID buffer_id;
i32 pos;
i64 pos;
};
struct Name_Line_Column_Location{

View File

@ -5,12 +5,12 @@ the default 4coder behavior.
// TOP
static Named_Mapping *named_maps = 0;
static i32 named_map_count = 0;
global Named_Mapping *named_maps = 0;
global i32 named_map_count = 0;
static b32 allow_immediate_close_without_checking_for_changes = false;
global b32 allow_immediate_close_without_checking_for_changes = false;
static char *default_extensions[] = {
global char *default_extensions[] = {
"cpp",
"hpp",
"c",
@ -26,56 +26,56 @@ static char *default_extensions[] = {
#if !defined(AUTO_CENTER_AFTER_JUMPS)
#define AUTO_CENTER_AFTER_JUMPS true
#endif
static b32 auto_center_after_jumps = AUTO_CENTER_AFTER_JUMPS;
static u8 locked_buffer_space[256];
static String_Const_u8 locked_buffer = {};
global b32 auto_center_after_jumps = AUTO_CENTER_AFTER_JUMPS;
global u8 locked_buffer_space[256];
global String_Const_u8 locked_buffer = {};
static View_ID build_footer_panel_view_id = 0;
global View_ID build_footer_panel_view_id = 0;
static Managed_Variable_ID view_rewrite_loc = 0;
static Managed_Variable_ID view_next_rewrite_loc = 0;
static Managed_Variable_ID view_paste_index_loc = 0;
static Managed_Variable_ID view_is_passive_loc = 0;
static Managed_Variable_ID view_snap_mark_to_cursor = 0;
static Managed_Variable_ID view_ui_data = 0;
static Managed_Variable_ID view_highlight_range = 0;
static Managed_Variable_ID view_highlight_buffer = 0;
static Managed_Variable_ID view_render_hook = 0;
global Managed_Variable_ID view_rewrite_loc = 0;
global Managed_Variable_ID view_next_rewrite_loc = 0;
global Managed_Variable_ID view_paste_index_loc = 0;
global Managed_Variable_ID view_is_passive_loc = 0;
global Managed_Variable_ID view_snap_mark_to_cursor = 0;
global Managed_Variable_ID view_ui_data = 0;
global Managed_Variable_ID view_highlight_range = 0;
global Managed_Variable_ID view_highlight_buffer = 0;
global Managed_Variable_ID view_render_hook = 0;
static Managed_Variable_ID sticky_jump_marker_handle = 0;
global Managed_Variable_ID sticky_jump_marker_handle = 0;
static u8 out_buffer_space[1024];
static u8 command_space[1024];
static char hot_directory_space[1024];
global u8 out_buffer_space[1024];
global u8 command_space[1024];
global char hot_directory_space[1024];
static b32 highlight_line_at_cursor = true;
static b32 do_matching_enclosure_highlight = true;
static b32 do_matching_paren_highlight = true;
static b32 do_colored_comment_keywords = true;
static b32 suppressing_mouse = false;
global b32 highlight_line_at_cursor = true;
global b32 do_matching_enclosure_highlight = true;
global b32 do_matching_paren_highlight = true;
global b32 do_colored_comment_keywords = true;
global b32 suppressing_mouse = false;
static b32 cursor_is_hidden = false;
global b32 cursor_is_hidden = false;
static b32 show_fps_hud = false;
global b32 show_fps_hud = false;
static Heap global_heap;
global Heap global_heap;
enum{
FCoderMode_Original = 0,
FCoderMode_NotepadLike = 1,
};
static i32 fcoder_mode = FCoderMode_Original;
global i32 fcoder_mode = FCoderMode_Original;
static ID_Line_Column_Jump_Location prev_location = {};
global ID_Pos_Jump_Location prev_location = {};
static Arena global_config_arena = {};
static Config_Data global_config = {};
global Arena global_config_arena = {};
global Config_Data global_config = {};
static char previous_isearch_query[256] = {};
global char previous_isearch_query[256] = {};
// BOTTOM

View File

@ -742,27 +742,6 @@ default_buffer_render_caller(Application_Links *app, Frame_Info frame_info, View
//managed_scope_clear_self_all_dependent_scopes(app, render_scope);
}
static int_color
get_margin_color(i32 level){
int_color margin = 0;
switch (level){
default:
case UIActivation_None:
{
margin = Stag_List_Item;
}break;
case UIActivation_Hover:
{
margin = Stag_List_Item_Hover;
}break;
case UIActivation_Active:
{
margin = Stag_List_Item_Active;
}break;
}
return(margin);
}
static void
default_ui_render_caller(Application_Links *app, View_ID view_id, Rect_f32 rect_f32, Face_ID face_id){
UI_Data *ui_data = 0;

View File

@ -8,7 +8,6 @@
#define FCODER_DEFAULT_INCLUDE_CPP
// NOTE(allen): Defines before 4coder_default_include.cpp:
// USE_OLD_STYLE_JUMPS -> use "old style" direct jumps instead of sticky jumps
// REMOVE_TRANSITION_HELPER_31 -> does not include the transition helpers for the API changes in 4.0.31
// REMOVE_OLD_STRING -> does not include the old 4coder_string.h library.
// NOTE: You can only remove "old string" if you first remove the transition helper.
@ -66,7 +65,6 @@
#include "4coder_default_framework_variables.cpp"
#include "4coder_helper.cpp"
#include "4coder_log_parser.cpp"
#include "4coder_seek.cpp"
#include "4coder_fancy.cpp"
#include "4coder_ui_helper.cpp"
@ -79,9 +77,9 @@
#include "4coder_auto_indent.cpp"
#include "4coder_search.cpp"
#include "4coder_jumping.cpp"
#include "4coder_jump_direct.cpp"
#include "4coder_jump_sticky.cpp"
#include "4coder_jump_lister.cpp"
#include "4coder_log_parser.cpp"
#include "4coder_clipboard.cpp"
#include "4coder_system_command.cpp"
#include "4coder_build_commands.cpp"

View File

@ -198,8 +198,9 @@ fancy_string_list_single(Fancy_String *fancy_string){
return(list);
}
static Vec2
draw_fancy_string(Application_Links *app, Face_ID font_id, Fancy_String *string, Vec2 P, int_color fore, int_color back, u32 flags, Vec2 dP){
static Vec2_f32
draw_fancy_string(Application_Links *app, Face_ID font_id, Fancy_String *string, Vec2 P,
int_color fore, int_color back, u32 flags, Vec2 dP){
for (;string != 0;
string = string->next){
Face_ID use_font_id = (string->font_id) ? string->font_id : font_id;
@ -219,10 +220,40 @@ draw_fancy_string(Application_Links *app, Face_ID font_id, Fancy_String *string,
return(P);
}
static Vec2
draw_fancy_string(Application_Links *app, Face_ID font_id, Fancy_String *string, Vec2 P, int_color fore, int_color back){
static Vec2_f32
draw_fancy_string(Application_Links *app, Face_ID font_id, Fancy_String *string, Vec2 P,
int_color fore, int_color back){
return(draw_fancy_string(app, font_id, string, P, fore, back, 0, V2(1.f, 0.f)));
}
static f32
get_fancy_string_advance(Application_Links *app, Face_ID font_id, Fancy_String *string){
f32 advance = 0.f;
for (;string != 0;
string = string->next){
Face_ID use_font_id = (string->font_id) ? string->font_id : font_id;
f32 adv = get_string_advance(app, use_font_id, string->value);
Face_Metrics metrics = get_face_metrics(app, font_id);
advance += (string->pre_margin + string->post_margin)*metrics.typical_character_width + adv;
}
return(advance);
}
static void
draw_rectangle(Application_Links *app, Rect_f32 rect, Fancy_Color fancy_color){
int_color color = int_color_from(app, fancy_color);
draw_rectangle(app, rect, color);
}
////////////////////////////////
global Fancy_Color white = fancy_rgba(1.0f, 1.0f, 1.0f, 1.0f);
global Fancy_Color light_gray = fancy_rgba(0.7f, 0.7f, 0.7f, 1.0f);
global Fancy_Color gray = fancy_rgba(0.5f, 0.5f, 0.5f, 1.0f);
global Fancy_Color dark_gray = fancy_rgba(0.3f, 0.3f, 0.3f, 1.0f);
global Fancy_Color black = fancy_rgba(0.0f, 0.0f, 0.0f, 1.0f);
global Fancy_Color pink = fancy_rgba(1.0f, 0.0f, 1.0f, 1.0f);
global Fancy_Color green = fancy_rgba(0.0f, 1.0f, 0.0f, 1.0f);
// BOTTOM

File diff suppressed because it is too large Load Diff

View File

@ -15,9 +15,9 @@ bind(context, key_pause, MDFR_NONE, toggle_filebar);
bind(context, key_caps, MDFR_NONE, toggle_filebar);
bind(context, '.', MDFR_ALT, change_to_build_panel);
bind(context, ',', MDFR_ALT, close_build_panel);
bind(context, 'n', MDFR_ALT, goto_next_jump_sticky);
bind(context, 'N', MDFR_ALT, goto_prev_jump_sticky);
bind(context, 'M', MDFR_ALT, goto_first_jump_sticky);
bind(context, 'n', MDFR_ALT, goto_next_jump);
bind(context, 'N', MDFR_ALT, goto_prev_jump);
bind(context, 'M', MDFR_ALT, goto_first_jump);
bind(context, 'm', MDFR_ALT, build_in_build_panel);
bind(context, 'b', MDFR_ALT, toggle_filebar);
bind(context, 'z', MDFR_ALT, execute_any_cli);
@ -120,8 +120,8 @@ bind(context, 'y', MDFR_CTRL, redo);
bind(context, 'z', MDFR_CTRL, undo);
bind(context, '1', MDFR_CTRL, view_buffer_other_panel);
bind(context, '2', MDFR_CTRL, swap_buffers_between_panels);
bind(context, '\n', MDFR_NONE, newline_or_goto_position_sticky);
bind(context, '\n', MDFR_SHIFT, newline_or_goto_position_same_panel_sticky);
bind(context, '\n', MDFR_NONE, newline_or_goto_position);
bind(context, '\n', MDFR_SHIFT, newline_or_goto_position_same_panel);
bind(context, '>', MDFR_CTRL, view_jump_list_with_lister);
bind(context, ' ', MDFR_SHIFT, write_character);
end_map(context);
@ -200,9 +200,9 @@ bind(context, 'h', MDFR_CMND, project_go_to_root_directory);
bind(context, 'S', MDFR_CMND, save_all_dirty_buffers);
bind(context, '.', MDFR_CTRL, change_to_build_panel);
bind(context, ',', MDFR_CTRL, close_build_panel);
bind(context, 'n', MDFR_CTRL, goto_next_jump_sticky);
bind(context, 'N', MDFR_CTRL, goto_prev_jump_sticky);
bind(context, 'M', MDFR_CTRL, goto_first_jump_sticky);
bind(context, 'n', MDFR_CTRL, goto_next_jump);
bind(context, 'N', MDFR_CTRL, goto_prev_jump);
bind(context, 'M', MDFR_CTRL, goto_first_jump);
bind(context, 'm', MDFR_CTRL, build_in_build_panel);
bind(context, 'b', MDFR_CTRL, toggle_filebar);
bind(context, 'z', MDFR_CTRL, execute_any_cli);
@ -304,8 +304,8 @@ bind(context, 'y', MDFR_CMND, redo);
bind(context, 'z', MDFR_CMND, undo);
bind(context, '1', MDFR_CMND, view_buffer_other_panel);
bind(context, '2', MDFR_CMND, swap_buffers_between_panels);
bind(context, '\n', MDFR_NONE, newline_or_goto_position_sticky);
bind(context, '\n', MDFR_SHIFT, newline_or_goto_position_same_panel_sticky);
bind(context, '\n', MDFR_NONE, newline_or_goto_position);
bind(context, '\n', MDFR_SHIFT, newline_or_goto_position_same_panel);
bind(context, '>', MDFR_CMND, view_jump_list_with_lister);
bind(context, ' ', MDFR_SHIFT, write_character);
end_map(context);
@ -417,9 +417,9 @@ static Meta_Key_Bind fcoder_binds_for_default_mapid_global[43] = {
{0, 55313, 0, "toggle_filebar", 14, LINK_PROCS(toggle_filebar)},
{0, 46, 2, "change_to_build_panel", 21, LINK_PROCS(change_to_build_panel)},
{0, 44, 2, "close_build_panel", 17, LINK_PROCS(close_build_panel)},
{0, 110, 2, "goto_next_jump_sticky", 21, LINK_PROCS(goto_next_jump_sticky)},
{0, 78, 2, "goto_prev_jump_sticky", 21, LINK_PROCS(goto_prev_jump_sticky)},
{0, 77, 2, "goto_first_jump_sticky", 22, LINK_PROCS(goto_first_jump_sticky)},
{0, 110, 2, "goto_next_jump", 14, LINK_PROCS(goto_next_jump)},
{0, 78, 2, "goto_prev_jump", 14, LINK_PROCS(goto_prev_jump)},
{0, 77, 2, "goto_first_jump", 15, LINK_PROCS(goto_first_jump)},
{0, 109, 2, "build_in_build_panel", 20, LINK_PROCS(build_in_build_panel)},
{0, 98, 2, "toggle_filebar", 14, LINK_PROCS(toggle_filebar)},
{0, 122, 2, "execute_any_cli", 15, LINK_PROCS(execute_any_cli)},
@ -522,8 +522,8 @@ static Meta_Key_Bind fcoder_binds_for_default_mapid_file[78] = {
{0, 122, 1, "undo", 4, LINK_PROCS(undo)},
{0, 49, 1, "view_buffer_other_panel", 23, LINK_PROCS(view_buffer_other_panel)},
{0, 50, 1, "swap_buffers_between_panels", 27, LINK_PROCS(swap_buffers_between_panels)},
{0, 10, 0, "newline_or_goto_position_sticky", 31, LINK_PROCS(newline_or_goto_position_sticky)},
{0, 10, 8, "newline_or_goto_position_same_panel_sticky", 42, LINK_PROCS(newline_or_goto_position_same_panel_sticky)},
{0, 10, 0, "newline_or_goto_position", 24, LINK_PROCS(newline_or_goto_position)},
{0, 10, 8, "newline_or_goto_position_same_panel", 35, LINK_PROCS(newline_or_goto_position_same_panel)},
{0, 62, 1, "view_jump_list_with_lister", 26, LINK_PROCS(view_jump_list_with_lister)},
{0, 32, 8, "write_character", 15, LINK_PROCS(write_character)},
};
@ -605,9 +605,9 @@ static Meta_Key_Bind fcoder_binds_for_mac_default_mapid_global[40] = {
{0, 83, 4, "save_all_dirty_buffers", 22, LINK_PROCS(save_all_dirty_buffers)},
{0, 46, 1, "change_to_build_panel", 21, LINK_PROCS(change_to_build_panel)},
{0, 44, 1, "close_build_panel", 17, LINK_PROCS(close_build_panel)},
{0, 110, 1, "goto_next_jump_sticky", 21, LINK_PROCS(goto_next_jump_sticky)},
{0, 78, 1, "goto_prev_jump_sticky", 21, LINK_PROCS(goto_prev_jump_sticky)},
{0, 77, 1, "goto_first_jump_sticky", 22, LINK_PROCS(goto_first_jump_sticky)},
{0, 110, 1, "goto_next_jump", 14, LINK_PROCS(goto_next_jump)},
{0, 78, 1, "goto_prev_jump", 14, LINK_PROCS(goto_prev_jump)},
{0, 77, 1, "goto_first_jump", 15, LINK_PROCS(goto_first_jump)},
{0, 109, 1, "build_in_build_panel", 20, LINK_PROCS(build_in_build_panel)},
{0, 98, 1, "toggle_filebar", 14, LINK_PROCS(toggle_filebar)},
{0, 122, 1, "execute_any_cli", 15, LINK_PROCS(execute_any_cli)},
@ -709,8 +709,8 @@ static Meta_Key_Bind fcoder_binds_for_mac_default_mapid_file[77] = {
{0, 122, 4, "undo", 4, LINK_PROCS(undo)},
{0, 49, 4, "view_buffer_other_panel", 23, LINK_PROCS(view_buffer_other_panel)},
{0, 50, 4, "swap_buffers_between_panels", 27, LINK_PROCS(swap_buffers_between_panels)},
{0, 10, 0, "newline_or_goto_position_sticky", 31, LINK_PROCS(newline_or_goto_position_sticky)},
{0, 10, 8, "newline_or_goto_position_same_panel_sticky", 42, LINK_PROCS(newline_or_goto_position_same_panel_sticky)},
{0, 10, 0, "newline_or_goto_position", 24, LINK_PROCS(newline_or_goto_position)},
{0, 10, 8, "newline_or_goto_position_same_panel", 35, LINK_PROCS(newline_or_goto_position_same_panel)},
{0, 62, 4, "view_jump_list_with_lister", 26, LINK_PROCS(view_jump_list_with_lister)},
{0, 32, 8, "write_character", 15, LINK_PROCS(write_character)},
};

View File

@ -2482,6 +2482,29 @@ split_rect(f32_Rect rect, View_Split_Kind kind, Coordinate coord, Side from_side
////////////////////////////////
static int_color
get_margin_color(i32 level){
int_color margin = 0;
switch (level){
default:
case UIActivation_None:
{
margin = Stag_List_Item;
}break;
case UIActivation_Hover:
{
margin = Stag_List_Item_Hover;
}break;
case UIActivation_Active:
{
margin = Stag_List_Item_Active;
}break;
}
return(margin);
}
////////////////////////////////
internal f32
get_dpi_scaling_value(Application_Links *app){
// TODO(casey): Allen, this should return the multiplier for the display relative to whatever 4coder
@ -2492,6 +2515,13 @@ get_dpi_scaling_value(Application_Links *app){
////////////////////////////////
UI_QUIT_FUNCTION(ui_quit_clear_render_hook){
Managed_Scope scope = view_get_managed_scope(app, view);
managed_variable_set(app, scope, view_render_hook, 0);
}
////////////////////////////////
// TODO(allen): REWRITE THIS EXACTLY HOW YOU WANT IT --- start ---
internal Child_Process_Set_Target_Flags

View File

@ -1,138 +0,0 @@
/*
4coder_direct_jump.cpp - Commands and helpers for parsing jump locations from
compiler errors and jumping to them in the corresponding buffer.
*/
// TOP
CUSTOM_COMMAND_SIG(goto_jump_at_cursor_direct)
CUSTOM_DOC("If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in another view and changes the active panel to the view containing the jump.")
{
Arena *scratch = context_get_arena(app);
Temp_Memory temp = begin_temp(scratch);
View_ID view = get_active_view(app, AccessProtected);
Buffer_ID buffer = view_get_buffer(app, view, AccessProtected);
i64 pos = view_get_cursor_pos(app, view);
Full_Cursor cursor = view_compute_cursor(app, view, seek_pos(pos));
Parsed_Jump jump = parse_jump_from_buffer_line(app, scratch, buffer, cursor.line, false);
if (jump.success){
change_active_panel(app);
View_ID target_view = get_active_view(app, AccessAll);
if (get_jump_buffer(app, &buffer, &jump.location)){
switch_to_existing_view(app, target_view, buffer);
jump_to_location(app, target_view, buffer, jump.location);
}
}
end_temp(temp);
}
CUSTOM_COMMAND_SIG(goto_jump_at_cursor_same_panel_direct)
CUSTOM_DOC("If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in this view, losing the compilation output or jump list..")
{
Arena *scratch = context_get_arena(app);
Temp_Memory temp = begin_temp(scratch);
View_ID view = get_active_view(app, AccessProtected);
Buffer_ID buffer = view_get_buffer(app, view, AccessProtected);
i64 pos = view_get_cursor_pos(app, view);
Full_Cursor cursor = view_compute_cursor(app, view, seek_pos(pos));
Parsed_Jump jump = parse_jump_from_buffer_line(app, scratch, buffer, cursor.line, false);
if (jump.success){
View_ID target_view = view;
if (get_jump_buffer(app, &buffer, &jump.location)){
jump_to_location(app, target_view, buffer, jump.location);
}
}
end_temp(temp);
}
CUSTOM_COMMAND_SIG(goto_next_jump_direct)
CUSTOM_DOC("If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, skipping sub jump locations.")
{
b32 skip_repeats = true;
b32 skip_sub_errors = true;
i32 dir = 1;
seek_jump(app, skip_repeats, skip_sub_errors, dir);
}
CUSTOM_COMMAND_SIG(goto_prev_jump_direct)
CUSTOM_DOC("If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, skipping sub jump locations.")
{
b32 skip_repeats = true;
b32 skip_sub_errors = true;
i32 dir = -1;
seek_jump(app, skip_repeats, skip_sub_errors, dir);
}
CUSTOM_COMMAND_SIG(goto_next_jump_no_skips_direct)
CUSTOM_DOC("If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, and does not skip sub jump locations.")
{
b32 skip_repeats = false;
b32 skip_sub_errors = true;
i32 dir = 1;
seek_jump(app, skip_repeats, skip_sub_errors, dir);
}
CUSTOM_COMMAND_SIG(goto_prev_jump_no_skips_direct)
CUSTOM_DOC("If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, and does not skip sub jump locations.")
{
b32 skip_repeats = false;
b32 skip_sub_errors = true;
i32 dir = -1;
seek_jump(app, skip_repeats, skip_sub_errors, dir);
}
CUSTOM_COMMAND_SIG(goto_first_jump_direct)
CUSTOM_DOC("If a buffer containing jump locations has been locked in, goes to the first jump in the buffer.")
{
View_ID view = get_view_for_locked_jump_buffer(app);
if (view != 0){
view_set_cursor(app, view, seek_pos(0), true);
memset(&prev_location, 0, sizeof(prev_location));
seek_jump(app, false, true, 1);
}
}
//
// Insert Newline or Tigger Jump on Read Only Buffer
//
CUSTOM_COMMAND_SIG(newline_or_goto_position_direct)
CUSTOM_DOC("If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor.")
{
View_ID view = get_active_view(app, AccessProtected);
Buffer_ID buffer = view_get_buffer(app, view, AccessOpen);
if (buffer != 0){
write_character(app);
}
else{
buffer = view_get_buffer(app, view, AccessProtected);
if (buffer != 0){
goto_jump_at_cursor_direct(app);
lock_jump_buffer(app, buffer);
}
}
}
CUSTOM_COMMAND_SIG(newline_or_goto_position_same_panel_direct)
CUSTOM_DOC("If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor_same_panel.")
{
View_ID view = get_active_view(app, AccessProtected);
Buffer_ID buffer = view_get_buffer(app, view, AccessOpen);
if (buffer != 0){
write_character(app);
}
else{
buffer = view_get_buffer(app, view, AccessProtected);
if (buffer != 0){
goto_jump_at_cursor_same_panel_direct(app);
lock_jump_buffer(app, buffer);
}
}
}
// BOTTOM

View File

@ -5,12 +5,12 @@ compiler errors, sticking markers on jump locations, and jumping to them.
// TOP
static Marker_List_Node *marker_list_first = 0;
static Marker_List_Node *marker_list_last = 0;
global Marker_List_Node *marker_list_first = 0;
global Marker_List_Node *marker_list_last = 0;
////////////////////////////////
static i32
internal i32
binary_search(i64 *array, i32 stride, i32 count, i64 x){
u8 *raw = (u8*)array;
i32 i = 0;
@ -38,7 +38,7 @@ binary_search(i64 *array, i32 stride, i32 count, i64 x){
return(i);
}
static Sticky_Jump_Array
internal Sticky_Jump_Array
parse_buffer_to_jump_array(Application_Links *app, Arena *arena, Buffer_ID buffer){
Sticky_Jump_Node *jump_first = 0;;
Sticky_Jump_Node *jump_last = 0;
@ -101,7 +101,7 @@ parse_buffer_to_jump_array(Application_Links *app, Arena *arena, Buffer_ID buffe
return(result);
}
static void
internal void
init_marker_list(Application_Links *app, Heap *heap, Buffer_ID buffer, Marker_List *list){
Arena *scratch = context_get_arena(app);
Temp_Memory temp = begin_temp(scratch);
@ -185,17 +185,17 @@ init_marker_list(Application_Links *app, Heap *heap, Buffer_ID buffer, Marker_Li
end_temp(temp);
}
static void
internal void
delete_marker_list(Marker_List_Node *node){
zdll_remove(marker_list_first, marker_list_last, node);
}
static void
internal void
delete_marker_list(Marker_List *list){
delete_marker_list(CastFromMember(Marker_List_Node, list, list));
}
static Marker_List*
internal Marker_List*
make_new_marker_list_for_buffer(Heap *heap, i32 buffer_id){
Marker_List_Node *new_node = heap_array(heap, Marker_List_Node, 1);
zdll_push_back(marker_list_first, marker_list_last, new_node);
@ -205,7 +205,7 @@ make_new_marker_list_for_buffer(Heap *heap, i32 buffer_id){
return(result);
}
static Marker_List*
internal Marker_List*
get_marker_list_for_buffer(Buffer_ID buffer_id){
for (Marker_List_Node *node = marker_list_first;
node != 0;
@ -217,7 +217,7 @@ get_marker_list_for_buffer(Buffer_ID buffer_id){
return(0);
}
static Marker_List*
internal Marker_List*
get_or_make_list_for_buffer(Application_Links *app, Heap *heap, Buffer_ID buffer_id){
Marker_List *result = get_marker_list_for_buffer(buffer_id);
if (result != 0){
@ -239,7 +239,7 @@ get_or_make_list_for_buffer(Application_Links *app, Heap *heap, Buffer_ID buffer
return(result);
}
static b32
internal b32
get_stored_jump_from_list(Application_Links *app, Marker_List *list, i32 index,
Sticky_Jump_Stored *stored_out){
Sticky_Jump_Stored stored = {};
@ -252,7 +252,7 @@ get_stored_jump_from_list(Application_Links *app, Marker_List *list, i32 index,
return(false);
}
static Sticky_Jump_Stored*
internal Sticky_Jump_Stored*
get_all_stored_jumps_from_list(Application_Links *app, Arena *arena, Marker_List *list){
Sticky_Jump_Stored *stored = 0;
if (list != 0){
@ -268,7 +268,7 @@ get_all_stored_jumps_from_list(Application_Links *app, Arena *arena, Marker_List
return(stored);
}
static b32
internal b32
get_jump_from_list(Application_Links *app, Marker_List *list, i32 index, ID_Pos_Jump_Location *location){
b32 result = false;
Sticky_Jump_Stored stored = {};
@ -292,7 +292,7 @@ get_jump_from_list(Application_Links *app, Marker_List *list, i32 index, ID_Pos_
return(result);
}
static i64
internal i64
get_line_from_list(Application_Links *app, Marker_List *list, i32 index){
i64 result = 0;
if (list != 0){
@ -304,7 +304,7 @@ get_line_from_list(Application_Links *app, Marker_List *list, i32 index){
return(result);
}
static b32
internal b32
get_is_sub_error_from_list(Application_Links *app, Marker_List *list, i32 index){
b32 result = false;
if (list != 0){
@ -316,7 +316,7 @@ get_is_sub_error_from_list(Application_Links *app, Marker_List *list, i32 index)
return(result);
}
static i32
internal i32
get_index_nearest_from_list(Application_Links *app, Marker_List *list, i64 line){
i32 result = -1;
if (list != 0){
@ -331,7 +331,7 @@ get_index_nearest_from_list(Application_Links *app, Marker_List *list, i64 line)
return(result);
}
static i32
internal i32
get_index_exact_from_list(Application_Links *app, Marker_List *list, i64 line){
i32 result = -1;
if (list != 0){
@ -349,7 +349,7 @@ get_index_exact_from_list(Application_Links *app, Marker_List *list, i64 line){
return(result);
}
CUSTOM_COMMAND_SIG(goto_jump_at_cursor_sticky)
CUSTOM_COMMAND_SIG(goto_jump_at_cursor)
CUSTOM_DOC("If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in another view and changes the active panel to the view containing the jump.")
{
Heap *heap = &global_heap;
@ -376,7 +376,7 @@ CUSTOM_DOC("If the cursor is found to be on a jump location, parses the jump loc
}
}
CUSTOM_COMMAND_SIG(goto_jump_at_cursor_same_panel_sticky)
CUSTOM_COMMAND_SIG(goto_jump_at_cursor_same_panel)
CUSTOM_DOC("If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in this view, losing the compilation output or jump list.")
{
Heap *heap = &global_heap;
@ -401,7 +401,7 @@ CUSTOM_DOC("If the cursor is found to be on a jump location, parses the jump loc
}
}
static void
internal void
goto_jump_in_order(Application_Links *app, Marker_List *list, View_ID jump_view, ID_Pos_Jump_Location location){
Buffer_ID buffer = {};
if (get_jump_buffer(app, &buffer, &location)){
@ -412,26 +412,16 @@ goto_jump_in_order(Application_Links *app, Marker_List *list, View_ID jump_view,
}
switch_to_existing_view(app, target_view, buffer);
jump_to_location(app, target_view, buffer, location);
prev_location.buffer_id = location.buffer_id;
prev_location.line = location.pos;
prev_location.column = 0;
prev_location = location;
}
}
static b32
jump_is_repeat(ID_Line_Column_Jump_Location prev, ID_Pos_Jump_Location location){
b32 skip = false;
// NOTE(allen): This looks wrong, but it is correct. The prev_location is a line column type
// because that is how the old-style direct jumps worked, and they are still supported. All code paths
// in the sticky jump system treat line as the field for pos and ignore column. When the time has
// passed and the direct jump legacy system is gone then this can be corrected.
if (prev.buffer_id == location.buffer_id && prev.line == location.pos){
skip = true;
}
return(skip);
internal b32
jump_is_repeat(ID_Pos_Jump_Location prev, ID_Pos_Jump_Location location){
return(prev.buffer_id == location.buffer_id && prev.pos == location.pos);
}
static void
internal void
goto_next_filtered_jump(Application_Links *app, Marker_List *list, View_ID jump_view, i32 list_index, i32 direction, b32 skip_repeats, b32 skip_sub_errors){
Assert(direction == 1 || direction == -1);
@ -460,7 +450,7 @@ goto_next_filtered_jump(Application_Links *app, Marker_List *list, View_ID jump_
}
}
static Locked_Jump_State
internal Locked_Jump_State
get_locked_jump_state(Application_Links *app, Heap *heap){
Locked_Jump_State result = {};
result.view = get_view_for_locked_jump_buffer(app);
@ -475,7 +465,7 @@ get_locked_jump_state(Application_Links *app, Heap *heap){
return(result);
}
CUSTOM_COMMAND_SIG(goto_next_jump_sticky)
CUSTOM_COMMAND_SIG(goto_next_jump)
CUSTOM_DOC("If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, skipping sub jump locations.")
{
Heap *heap = &global_heap;
@ -492,7 +482,7 @@ CUSTOM_DOC("If a buffer containing jump locations has been locked in, goes to th
}
}
CUSTOM_COMMAND_SIG(goto_prev_jump_sticky)
CUSTOM_COMMAND_SIG(goto_prev_jump)
CUSTOM_DOC("If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, skipping sub jump locations."){
Heap *heap = &global_heap;
@ -505,7 +495,7 @@ CUSTOM_DOC("If a buffer containing jump locations has been locked in, goes to th
}
}
CUSTOM_COMMAND_SIG(goto_next_jump_no_skips_sticky)
CUSTOM_COMMAND_SIG(goto_next_jump_no_skips)
CUSTOM_DOC("If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, and does not skip sub jump locations.")
{
Heap *heap = &global_heap;
@ -522,7 +512,7 @@ CUSTOM_DOC("If a buffer containing jump locations has been locked in, goes to th
}
}
CUSTOM_COMMAND_SIG(goto_prev_jump_no_skips_sticky)
CUSTOM_COMMAND_SIG(goto_prev_jump_no_skips)
CUSTOM_DOC("If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, and does not skip sub jump locations.")
{
Heap *heap = &global_heap;
@ -536,7 +526,7 @@ CUSTOM_DOC("If a buffer containing jump locations has been locked in, goes to th
}
}
CUSTOM_COMMAND_SIG(goto_first_jump_sticky)
CUSTOM_COMMAND_SIG(goto_first_jump)
CUSTOM_DOC("If a buffer containing jump locations has been locked in, goes to the first jump in the buffer.")
{
Heap *heap = &global_heap;
@ -575,7 +565,7 @@ CUSTOM_DOC("If a buffer containing jump locations has been locked in, goes to th
// Insert Newline or Tigger Jump on Read Only Buffer
//
CUSTOM_COMMAND_SIG(newline_or_goto_position_sticky)
CUSTOM_COMMAND_SIG(newline_or_goto_position)
CUSTOM_DOC("If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor.")
{
View_ID view = get_active_view(app, AccessProtected);
@ -586,13 +576,13 @@ CUSTOM_DOC("If the buffer in the active view is writable, inserts a character, o
else{
buffer = view_get_buffer(app, view, AccessProtected);
if (buffer != 0){
goto_jump_at_cursor_sticky(app);
goto_jump_at_cursor(app);
lock_jump_buffer(app, buffer);
}
}
}
CUSTOM_COMMAND_SIG(newline_or_goto_position_same_panel_sticky)
CUSTOM_COMMAND_SIG(newline_or_goto_position_same_panel)
CUSTOM_DOC("If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor_same_panel.")
{
View_ID view = get_active_view(app, AccessProtected);
@ -603,7 +593,7 @@ CUSTOM_DOC("If the buffer in the active view is writable, inserts a character, o
else{
buffer = view_get_buffer(app, view, AccessProtected);
if (buffer != 0){
goto_jump_at_cursor_same_panel_sticky(app);
goto_jump_at_cursor_same_panel(app);
lock_jump_buffer(app, buffer);
}
}

View File

@ -324,6 +324,7 @@ skip_this_jump(ID_Line_Column_Jump_Location prev, ID_Line_Column_Jump_Location j
return(result);
}
#if 0
static b32
advance_cursor_in_jump_view(Application_Links *app, View_ID view, b32 skip_repeats, b32 skip_sub_error, Scan_Direction direction, Name_Line_Column_Location *location_out){
b32 result = true;
@ -360,7 +361,7 @@ advance_cursor_in_jump_view(Application_Links *app, View_ID view, b32 skip_repea
}
static b32
seek_jump(Application_Links *app, b32 skip_repeats, b32 skip_sub_errors, i32 direction){
seek_jump_(Application_Links *app, b32 skip_repeats, b32 skip_sub_errors, i32 direction){
b32 result = false;
View_ID view = get_view_for_locked_jump_buffer(app);
@ -383,41 +384,7 @@ seek_jump(Application_Links *app, b32 skip_repeats, b32 skip_sub_errors, i32 dir
return(result);
}
////////////////////////////////
#if defined(USE_OLD_STYLE_JUMPS)
#define goto_jump_at_cursor CUSTOM_ALIAS(goto_jump_at_cursor_direct)
#define goto_jump_at_cursor_same_panel CUSTOM_ALIAS(goto_jump_at_cursor_same_panel_direct)
#define goto_next_jump CUSTOM_ALIAS(goto_next_jump_direct)
#define goto_prev_jump CUSTOM_ALIAS(goto_prev_jump_direct)
#define goto_next_jump_no_skips CUSTOM_ALIAS(goto_next_jump_no_skips_direct)
#define goto_prev_jump_no_skips CUSTOM_ALIAS(goto_prev_jump_no_skips_direct)
#define goto_first_jump CUSTOM_ALIAS(goto_first_jump_direct)
#define newline_or_goto_position CUSTOM_ALIAS(newline_or_goto_position_direct)
#define newline_or_goto_position_same_panel CUSTOM_ALIAS(newline_or_goto_position_same_panel_direct)
#else
#define goto_jump_at_cursor CUSTOM_ALIAS(goto_jump_at_cursor_sticky)
#define goto_jump_at_cursor_same_panel CUSTOM_ALIAS(goto_jump_at_cursor_same_panel_sticky)
#define goto_next_jump CUSTOM_ALIAS(goto_next_jump_sticky)
#define goto_prev_jump CUSTOM_ALIAS(goto_prev_jump_sticky)
#define goto_next_jump_no_skips CUSTOM_ALIAS(goto_next_jump_no_skips_sticky)
#define goto_prev_jump_no_skips CUSTOM_ALIAS(goto_prev_jump_no_skips_sticky)
#define goto_first_jump CUSTOM_ALIAS(goto_first_jump_sticky)
#define newline_or_goto_position CUSTOM_ALIAS(newline_or_goto_position_sticky)
#define newline_or_goto_position_same_panel CUSTOM_ALIAS(newline_or_goto_position_same_panel_sticky)
#endif
#define seek_error CUSTOM_ALIAS(seek_jump)
#define goto_next_error CUSTOM_ALIAS(goto_next_jump)
#define goto_prev_error CUSTOM_ALIAS(goto_prev_jump)
#define goto_next_error_no_skips CUSTOM_ALIAS(goto_next_jump_no_skips)
#define goto_prev_error_no_skips CUSTOM_ALIAS(goto_prev_jump_no_skips)
#define goto_first_error CUSTOM_ALIAS(goto_first_jump)
// BOTTOM

View File

@ -136,6 +136,18 @@ log_parse__get_or_make_list_tag_value(Log_Parse *parse, Log_Tag *tag){
return(result);
}
internal Log_Event_List*
log_parse_get_list_tag_name(Log_Parse *parse, u64 name){
Log_Event_List *result = 0;
Table_Lookup lookup = table_lookup(&parse->tag_name_to_event_list_table, name);
if (lookup.found_match){
u64 val = 0;
table_read(&parse->tag_name_to_event_list_table, lookup, &val);
result = (Log_Event_List*)IntAsPtr(val);
}
return(result);
}
internal Log_Event_List*
log_parse__get_or_make_list_tag_name(Log_Parse *parse, Log_Tag *tag){
Log_Event_List *result = 0;
@ -354,65 +366,690 @@ log_event_array_from_list(Arena *arena, Log_Event_List list){
////////////////////////////////
CUSTOM_COMMAND_SIG(parse_the_log)
CUSTOM_DOC("Tests the log parser")
{
Buffer_ID log_buffer = get_buffer_by_name(app, string_u8_litexpr("*log*"), AccessAll);
Scratch_Block scratch(app);
String_Const_u8 log_text = push_whole_buffer(app, scratch, log_buffer);
Log_Parse parse = make_log_parse(scratch, log_text);
global View_ID log_view = 0;
global Arena log_arena = {};
global Log_Parse log_parse = {};
global Log_Graph log_graph = {};
global Log_Filter_Set log_filter_set = {};
global Log_Filter_Set log_preview_set = {};
u64 buffer_code = log_parse__string_code(&parse, string_u8_litexpr("buffer"),
LogParse_ExternalString);
u64 thread_code = log_parse__string_code(&parse, string_u8_litexpr("thread"),
LogParse_ExternalString);
Log_Tag_Value value = {};
value.kind = LogTagKind_Integer;
value.value_s = 10;
Log_Event_List *list = log_parse_get_list_tag_value(&parse, buffer_code, value);
Log_Event_Ptr_Array array = log_event_array_from_list(scratch, *list);
log_events_sort_by_tag(scratch, array, thread_code);
for (i32 i = 0; i < array.count; i += 1){
Log_Event *event = array.events[i];
String_Const_u8 src_name = log_parse__get_string(&parse, event->src_file_name);
String_Const_u8 event_name = log_parse__get_string(&parse, event->event_name);
u64 line_number = event->line_number;
List_String_Const_u8 line = {};
string_list_pushf(scratch, &line, "%.*s:%llu: %.*s",
string_expand(src_name), line_number, string_expand(event_name));
for (Log_Tag *node = event->first_tag;
node != 0;
node = node->next){
String_Const_u8 tag_name = log_parse__get_string(&parse, node->name);
switch (node->value.kind){
case LogTagKind_Integer:
{
string_list_pushf(scratch, &line, " [%.*s:%lld]",
string_expand(tag_name), node->value.value_s);
}break;
case LogTagKind_String:
{
String_Const_u8 string_value = log_parse__get_string(&parse, node->value.value);
string_list_pushf(scratch, &line, " [%.*s:%.*s]",
string_expand(tag_name), string_expand(string_value));
}break;
}
}
string_list_push(scratch, &line, string_u8_litexpr("\n"));
String_Const_u8 line_string = string_list_flatten(scratch, line);
print_message(app, line_string);
internal void
log_filter_set_init(Log_Filter_Set *set){
block_zero_struct(set);
for (i32 i = ArrayCount(set->filters_memory) - 1; i >= 0; i -= 1){
sll_stack_push(set->free_filters, &set->filters_memory[i]);
}
}
internal Log_Filter_Set*
log_filter_set_from_tab(Log_Graph_List_Tab tab){
Log_Filter_Set *result = 0;
switch (tab){
case LogTab_Filters:
{
result = &log_filter_set;
}break;
case LogTab_Previews:
{
result = &log_preview_set;
}break;
}
return(result);
}
internal Log_Filter*
log_filter_set__new_filter(Log_Filter_Set *set, Log_Filter *prototype){
Log_Filter *result = set->free_filters;
if (result != 0){
for (Log_Filter *filter = set->first;
filter != 0;
filter = filter->next){
if (filter->kind == prototype->kind &&
filter->tag_name_code == prototype->tag_name_code &&
block_match_struct(&filter->tag_value, &prototype->tag_value)){
result = 0;
break;
}
}
if (result != 0){
sll_stack_pop(set->free_filters);
block_copy_struct(result, prototype);
zdll_push_back(set->first, set->last, result);
set->count += 1;
set->alter_counter += 1;
}
}
return(result);
}
internal void
log_filter_set__free_filter(Log_Filter_Set *set, Log_Filter *filter){
zdll_remove(set->first, set->last, filter);
set->count -= 1;
set->alter_counter += 1;
sll_stack_push(set->free_filters, filter);
}
internal void
log_graph_fill(Application_Links *app, Rect_f32 layout_region, Face_ID face_id){
if (log_parse.arena != 0){
if (log_graph.holding_temp){
end_temp(log_graph.temp);
}
block_zero_struct(&log_graph);
log_graph.holding_temp = true;
log_graph.temp = begin_temp(&log_arena);
log_graph.layout_region = layout_region;
log_graph.face_id = face_id;
log_graph.filter_alter_counter = log_filter_set.alter_counter;
log_graph.preview_alter_counter = log_preview_set.alter_counter;
log_graph.tab = LogTab_Filters;
f32 details_h = rect_height(layout_region)*.22f;
details_h = clamp_top(details_h, 250.f);
Rect_f32 details_region = Rf32(layout_region.x0, layout_region.y0,
layout_region.x1, layout_region.y0 + details_h);
Rect_f32 event_list_region = Rf32(layout_region.x0, layout_region.y0 + details_h,
layout_region.x1, layout_region.y1);
log_graph.details_region = details_region;
log_graph.details_region.p0 -= layout_region.p0;
log_graph.details_region.p1 -= layout_region.p0;
u64 thread_code = log_parse__string_code(&log_parse, string_u8_litexpr("thread"),
LogParse_ExternalString);
if (log_filter_set.count == 0){
// NOTE(allen): everything goes into the filtered list
for (Log_Event *event = log_parse.first_event;
event != 0;
event = event->next){
Log_Event_Ptr_Node *node = push_array(&log_arena, Log_Event_Ptr_Node, 1);
node->event = event;
sll_queue_push(log_graph.filtered_list.first, log_graph.filtered_list.last, node);
log_graph.filtered_list.count += 1;
}
}
else{
for (Log_Filter *filter = log_filter_set.first;
filter != 0;
filter = filter->next){
Log_Event_List *filter_list = 0;
if (filter->kind == LogFilter_TagValue){
filter_list = log_parse_get_list_tag_value(&log_parse, filter->tag_name_code,
filter->tag_value);
}
else if (filter->kind == LogFilter_Tag){
filter_list = log_parse_get_list_tag_name(&log_parse, filter->tag_name_code);
}
// NOTE(allen): combine with existing result
if (filter == log_filter_set.first){
for (Log_Event_Ptr_Node *node = filter_list->first;
node != 0;
node = node->next){
Log_Event_Ptr_Node *new_node = push_array(&log_arena, Log_Event_Ptr_Node, 1);
new_node->event = node->event;
sll_queue_push(log_graph.filtered_list.first, log_graph.filtered_list.last, new_node);
log_graph.filtered_list.count += 1;
}
}
else{
Log_Event_Ptr_Node **fixup_ptr = &log_graph.filtered_list.first;
log_graph.filtered_list.last = 0;
for (Log_Event_Ptr_Node *node_a = log_graph.filtered_list.first, *next = 0;
node_a != 0;
node_a = next){
next = node_a->next;
b32 remove_node_a = true;
for (Log_Event_Ptr_Node *node_b = filter_list->first;
node_b != 0;
node_b = node_b->next){
if (node_a->event == node_b->event){
remove_node_a = false;
break;
}
}
if (remove_node_a){
*fixup_ptr = next;
}
else{
fixup_ptr = &node_a->next;
log_graph.filtered_list.last = node_a;
}
}
}
}
}
log_graph.event_array = log_event_array_from_list(&log_arena,
log_graph.filtered_list);
log_events_sort_by_tag(&log_arena, log_graph.event_array, thread_code);
b32 had_a_tag = true;
u64 thread_id_value = 0;
Log_Graph_Thread_Bucket *prev_bucket = 0;
for (i32 i = 0; i < log_graph.event_array.count; i += 1){
Table_u64_u64 *tag_table = &log_graph.event_array.events[i]->tag_name_to_tag_ptr_table;
Table_Lookup lookup = table_lookup(tag_table, thread_code);
b32 emit_next_bucket = false;
if (!lookup.found_match){
if (had_a_tag){
had_a_tag = false;
thread_id_value = 0;
emit_next_bucket = true;
}
}
else{
u64 read_val = 0;
table_read(tag_table, lookup, &read_val);
Log_Tag *tag = (Log_Tag*)IntAsPtr(read_val);
if (!had_a_tag){
had_a_tag = true;
thread_id_value = tag->value.value;
emit_next_bucket = true;
}
else if (thread_id_value != tag->value.value){
thread_id_value = tag->value.value;
emit_next_bucket = true;
}
}
if (emit_next_bucket){
Log_Graph_Thread_Bucket *bucket = push_array(&log_arena, Log_Graph_Thread_Bucket, 1);
sll_queue_push(log_graph.first_bucket, log_graph.last_bucket, bucket);
log_graph.bucket_count += 1;
bucket->range.first = i;
bucket->had_a_tag = had_a_tag;
bucket->thread_id_value = thread_id_value;
if (prev_bucket != 0){
prev_bucket->range.one_past_last = i;
}
prev_bucket = bucket;
}
}
if (prev_bucket != 0){
prev_bucket->range.one_past_last = log_graph.event_array.count;
}
Face_Metrics metrics = get_face_metrics(app, face_id);
f32 line_height = metrics.line_height;
f32 box_h = f32_floor32(line_height*1.5f);
f32 box_w = f32_floor32(rect_width(event_list_region)/log_graph.bucket_count);
f32 y_cursor = event_list_region.y0 - layout_region.y0;
if (log_graph.bucket_count > 0){
f32 y_bottom = 0.f;
for (;;){
i32 smallest_event_number = max_i32;
i32 bucket_with_next_event_index = -1;
Log_Graph_Thread_Bucket *bucket_with_next_event = 0;
Log_Event *next_event = 0;
i32 iteration_counter = 0;
for (Log_Graph_Thread_Bucket *bucket = log_graph.first_bucket;
bucket != 0;
bucket = bucket->next, iteration_counter += 1){
if (bucket->range.first < bucket->range.one_past_last){
Log_Event *event = log_graph.event_array.events[bucket->range.first];
if (event->event_number < smallest_event_number){
smallest_event_number = event->event_number;
bucket_with_next_event_index = iteration_counter;
bucket_with_next_event = bucket;
next_event = event;
}
}
}
if (bucket_with_next_event == 0){
break;
}
bucket_with_next_event->range.first += 1;
Log_Graph_Box *box_node = push_array(&log_arena, Log_Graph_Box, 1);
sll_queue_push(log_graph.first_box, log_graph.last_box, box_node);
log_graph.box_count += 1;
Rect_f32 rect = Rf32(box_w*bucket_with_next_event_index , y_cursor,
box_w*(bucket_with_next_event_index + 1), y_cursor + box_h);
box_node->rect = rect;
box_node->event = next_event;
y_bottom = Max(y_bottom, rect.y1);
y_cursor += box_h;
}
log_graph.max_y_scroll = clamp_bot(line_height, y_bottom - rect_height(event_list_region)*0.5f);
}
}
}
internal void
log_parse_fill(Application_Links *app, Buffer_ID buffer){
if (log_arena.base_allocator == 0){
log_arena = make_arena_app_links(app);
}
linalloc_clear(&log_arena);
block_zero_struct(&log_graph);
log_filter_set_init(&log_filter_set);
log_filter_set_init(&log_preview_set);
String_Const_u8 log_text = push_whole_buffer(app, &log_arena, buffer);
log_parse = make_log_parse(&log_arena, log_text);
}
internal void
log_graph_render__tag(Arena *arena, Fancy_String_List *line, Log_Parse *log_parse, Log_Tag *tag){
String_Const_u8 tag_name = log_parse__get_string(log_parse, tag->name);
push_fancy_stringf(arena, line, white, "[");
push_fancy_string(arena, line, green, tag_name);
push_fancy_stringf(arena, line, white, "=");
if (tag->value.kind == LogTagKind_Integer){
push_fancy_stringf(arena, line, pink, "0x%llx", tag->value.value_s);
}
else if (tag->value.kind == LogTagKind_String){
String_Const_u8 value = log_parse__get_string(log_parse, tag->value.value);
push_fancy_string(arena, line, pink, value);
}
push_fancy_stringf(arena, line, white, "]");
}
internal void
log_graph_render(Application_Links *app, View_ID view, Frame_Info frame_info, Rect_f32 inner){
if (log_parse.arena != 0){
Face_ID face_id = get_face_id(app, 0);
f32 y_scroll = log_graph.y_scroll;
Log_Event *selected_event = log_graph.selected_event;
if (!log_graph.holding_temp ||
inner != log_graph.layout_region ||
face_id != log_graph.face_id ||
log_filter_set.alter_counter != log_graph.filter_alter_counter){
log_graph_fill(app, inner, face_id);
}
log_graph.y_scroll = clamp(0.f, y_scroll, log_graph.max_y_scroll);
log_graph.selected_event = selected_event;
Mouse_State mouse = get_mouse_state(app);
Vec2_f32 m_p = V2f32(mouse.p) - inner.p0;
Face_Metrics metrics = get_face_metrics(app, log_graph.face_id);
f32 line_height = metrics.line_height;
Log_Event *hover_event = 0;
b32 in_details_region = (rect_contains_point(log_graph.details_region, m_p));
for (Log_Graph_Box *box_node = log_graph.first_box;
box_node != 0;
box_node = box_node->next){
Scratch_Block scratch(app);
Rect_f32 box = box_node->rect;
box.y0 -= log_graph.y_scroll;
box.y1 -= log_graph.y_scroll;
Rect_f32 box_inner = rect_inner(box, 3.f);
Fancy_Color margin_color = dark_gray;
if (!in_details_region && hover_event == 0 && rect_contains_point(box, m_p)){
margin_color = gray;
hover_event = box_node->event;
}
if (box_node->event == log_graph.selected_event){
margin_color = light_gray;
}
draw_rectangle(app, box , margin_color);
draw_rectangle(app, box_inner, black );
Log_Event *event = box_node->event;
String_Const_u8 event_name = log_parse__get_string(&log_parse, event->event_name);
Fancy_String_List line = {};
push_fancy_string(scratch, &line, white, event_name);
for (Log_Filter *filter = log_preview_set.first;
filter != 0;
filter = filter->next){
Table_u64_u64 *table = &event->tag_name_to_tag_ptr_table;
Table_Lookup lookup = table_lookup(table, filter->tag_name_code);
if (lookup.found_match){
u64 val = 0;
table_read(table, lookup, &val);
Log_Tag *tag = (Log_Tag*)IntAsPtr(val);
push_fancy_string(scratch, &line, string_u8_litexpr(" "));
log_graph_render__tag(scratch, &line, &log_parse, tag);
}
}
Vec2_f32 p = V2f32(box_inner.x0 + 3.f,
(f32_round32((box_inner.y0 + box_inner.y1 - line_height)*0.5f)));
draw_fancy_string(app, log_graph.face_id, line.first, p, 0, 0, 0, V2f32(1.f, 0.f));
}
{
Scratch_Block scratch(app);
Rect_f32 box = log_graph.details_region;
Rect_f32 box_inner = rect_inner(box, 3.f);
Log_Graph_List_Tab current_tab = log_graph.tab;
Log_Filter_Set *viewing_filter_set = log_filter_set_from_tab(current_tab);
draw_rectangle(app, box , dark_gray);
draw_rectangle(app, box_inner, black );
{
f32 y_cursor = box_inner.y0 + 3.f;
if (y_cursor + line_height > box_inner.y1) goto finish_list_display;
{
f32 x_cursor = box_inner.x0 + 3.f;
for (i32 i = LogTab_ERROR + 1; i < LogTab_COUNT; i += 1){
Fancy_Color color = (i == current_tab)?white:gray;
Fancy_String_List line = {};
switch (i){
case LogTab_Filters:
{
push_fancy_stringf(scratch, &line, color, "filters");
}break;
case LogTab_Previews:
{
push_fancy_stringf(scratch, &line, color, "previews");
}break;
}
Vec2_f32 p = V2f32(x_cursor, y_cursor);
f32 advance = get_fancy_string_advance(app, log_graph.face_id, line.first);
draw_fancy_string(app, log_graph.face_id, line.first, p,
Stag_Default, Stag_Back, 0, V2f32(1.f, 0.f));
x_cursor += advance + metrics.typical_character_width;
if (log_graph.has_unused_click){
Rect_f32 click_rect = Rf32(p.x, p.y, p.x + advance, p.y + line_height);
if (rect_contains_point(click_rect, log_graph.unused_click)){
log_graph.has_unused_click = false;
log_graph.tab = i;
}
}
}
}
if (viewing_filter_set != 0){
for (Log_Filter *filter = viewing_filter_set->first, *next = 0;
filter != 0;
filter = next){
next = filter->next;
y_cursor += line_height;
if (y_cursor + line_height > box_inner.y1) goto finish_list_display;
Fancy_String_List line = {};
if (filter->kind == LogFilter_TagValue){
push_fancy_stringf(scratch, &line, white, "val [");
String_Const_u8 tag_name = log_parse__get_string(&log_parse, filter->tag_name_code);
push_fancy_stringf(scratch, &line, green, "%.*s", string_expand(tag_name));
push_fancy_stringf(scratch, &line, white, "=");
if (filter->tag_value.kind == LogTagKind_Integer){
push_fancy_stringf(scratch, &line, pink, "0x%llx", filter->tag_value.value_s);
}
else if (filter->tag_value.kind == LogTagKind_String){
String_Const_u8 value = log_parse__get_string(&log_parse, filter->tag_value.value);
push_fancy_stringf(scratch, &line, pink, "%.*s", string_expand(value));
}
push_fancy_stringf(scratch, &line, white, "]");
}
else{
push_fancy_stringf(scratch, &line, white, "name [");
String_Const_u8 tag_name = log_parse__get_string(&log_parse, filter->tag_name_code);
push_fancy_stringf(scratch, &line, green, "%.*s", string_expand(tag_name));
push_fancy_stringf(scratch, &line, white, "]");
}
Vec2_f32 p = V2f32(box_inner.x0 + 3.f, y_cursor);
f32 advance = get_fancy_string_advance(app, log_graph.face_id, line.first);
draw_fancy_string(app, log_graph.face_id, line.first, p, Stag_Default, Stag_Back,
0, V2f32(1.f, 0.f));
if (log_graph.has_unused_click){
Rect_f32 click_rect = Rf32(p.x, p.y, p.x + advance, p.y + line_height);
if (rect_contains_point(click_rect, log_graph.unused_click)){
log_graph.has_unused_click = false;
log_filter_set__free_filter(viewing_filter_set, filter);
}
}
}
}
finish_list_display:;
}
Log_Event *view_event = (hover_event!=0)?hover_event:log_graph.selected_event;
if (view_event != 0){
f32 y_cursor = box_inner.y0 + 3.f;
if (y_cursor + line_height > box_inner.y1) goto finish_event_display;
{
Fancy_String_List line = {};
String_Const_u8 file_name = log_parse__get_string(&log_parse, view_event->src_file_name);
push_fancy_stringf(scratch, &line, green, "[%d] ", view_event->event_number);
push_fancy_stringf(scratch, &line, white, "%.*s:", string_expand(file_name));
push_fancy_stringf(scratch, &line, pink, "%llu", view_event->line_number);
Vec2_f32 right_p = V2f32(box_inner.x1 - 3.f, y_cursor);
f32 advance = get_fancy_string_advance(app, log_graph.face_id, line.first);
Vec2 p = V2f32(right_p.x - advance, right_p.y);
draw_fancy_string(app, log_graph.face_id, line.first, p, Stag_Default, Stag_Back,
0, V2(1.f, 0.f));
}
for (Log_Tag *tag = view_event->first_tag;
tag != 0;
tag = tag->next){
y_cursor += line_height;
if (y_cursor + line_height > box_inner.y1) goto finish_event_display;
{
Fancy_String_List line = {};
log_graph_render__tag(scratch, &line, &log_parse, tag);
Vec2_f32 right_p = V2f32(box_inner.x1 - 3.f, y_cursor);
f32 advance = get_fancy_string_advance(app, log_graph.face_id, line.first);
Vec2 p = V2f32(right_p.x - advance, right_p.y);
draw_fancy_string(app, log_graph.face_id, line.first, p,
Stag_Default, Stag_Back, 0, V2(1.f, 0.f));
if (log_graph.has_unused_click){
Rect_f32 click_rect = Rf32(p.x, p.y, right_p.x, p.y + line_height);
if (rect_contains_point(click_rect, log_graph.unused_click)){
log_graph.has_unused_click = false;
Log_Filter filter = {};
switch (log_graph.tab){
case LogTab_Filters:
{
filter.kind = LogFilter_TagValue;
filter.tag_name_code = tag->name;
filter.tag_value = tag->value;
}break;
case LogTab_Previews:
{
filter.kind = LogFilter_Tag;
filter.tag_name_code = tag->name;
}break;
}
if (filter.kind != LogTab_ERROR){
log_filter_set__new_filter(viewing_filter_set, &filter);
animate_in_n_milliseconds(app, 0);
}
}
}
}
}
finish_event_display:;
}
}
log_graph.has_unused_click = false;
}
}
CUSTOM_COMMAND_SIG(log_graph__escape)
CUSTOM_DOC("Ends the log grapher")
{
if (log_view != 0){
Managed_Scope scope = view_get_managed_scope(app, log_view);
managed_variable_set(app, scope, view_render_hook, 0);
view_end_ui_mode(app, log_view);
log_view = 0;
}
}
CUSTOM_COMMAND_SIG(log_graph__scroll_wheel)
CUSTOM_DOC("Scrolls the log graph")
{
if (log_view != 0){
Mouse_State mouse = get_mouse_state(app);
if (mouse.wheel != 0){
log_graph.y_scroll += mouse.wheel;
}
}
}
CUSTOM_COMMAND_SIG(log_graph__page_up)
CUSTOM_DOC("Scroll the log graph up one whole page")
{
if (log_view != 0){
log_graph.y_scroll -= get_page_jump(app, log_view);
}
}
CUSTOM_COMMAND_SIG(log_graph__page_down)
CUSTOM_DOC("Scroll the log graph down one whole page")
{
if (log_view != 0){
log_graph.y_scroll += get_page_jump(app, log_view);
}
}
internal Log_Graph_Box*
log_graph__get_box_at_point(Log_Graph *log_graph, Vec2_f32 p){
Log_Graph_Box *result = 0;
if (!rect_contains_point(log_graph->details_region, p)){
for (Log_Graph_Box *box_node = log_graph->first_box;
box_node != 0;
box_node = box_node->next){
Rect_f32 box = box_node->rect;
box.y0 -= log_graph->y_scroll;
box.y1 -= log_graph->y_scroll;
if (rect_contains_point(box, p)){
result = box_node;
break;
}
}
}
return(result);
}
internal Log_Graph_Box*
log_graph__get_box_at_mouse_point(Application_Links *app, Log_Graph *log_graph){
Mouse_State mouse = get_mouse_state(app);
Vec2_f32 m_p = V2f32(mouse.p) - log_graph->layout_region.p0;
return(log_graph__get_box_at_point(log_graph, m_p));
}
CUSTOM_COMMAND_SIG(log_graph__click_select_event)
CUSTOM_DOC("Select the event record at the mouse point in the log graph")
{
if (log_view != 0){
if (log_graph.holding_temp){
Mouse_State mouse = get_mouse_state(app);
Vec2_f32 m_p = V2f32(mouse.p) - log_graph.layout_region.p0;
Log_Graph_Box *box_node = log_graph__get_box_at_point(&log_graph, m_p);
if (box_node != 0){
log_graph.selected_event = box_node->event;
}
else{
log_graph.has_unused_click = true;
log_graph.unused_click = m_p;
}
}
}
}
CUSTOM_COMMAND_SIG(log_graph__click_jump_to_event_source)
CUSTOM_DOC("Jump to the code that logged the event record at the mouse point in the log graph")
{
if (log_view != 0){
if (log_graph.holding_temp){
Mouse_State mouse = get_mouse_state(app);
Vec2_f32 m_p = V2f32(mouse.p) - log_graph.layout_region.p0;
Log_Graph_Box *box_node = log_graph__get_box_at_point(&log_graph, m_p);
if (box_node != 0){
Log_Event *event = box_node->event;
log_graph.selected_event = event;
View_ID target_view = get_next_view_looped_primary_panels(app, log_view, AccessProtected);
if (target_view != 0){
String_Const_u8 file_name = log_parse__get_string(&log_parse, event->src_file_name);
Buffer_ID target_buffer = get_buffer_by_file_name(app, file_name, AccessAll);
if (target_buffer == 0){
target_buffer = get_buffer_by_name(app, file_name, AccessAll);
}
if (target_buffer != 0){
if (target_view == log_view){
view_end_ui_mode(app, target_view);
}
set_view_to_location(app, target_view, target_buffer,
seek_line_char(event->line_number, 1));
}
}
}
else{
log_graph.has_unused_click = true;
log_graph.unused_click = m_p;
}
}
}
}
internal void
fill_log_graph_command_map(Bind_Helper *context){
begin_map(context, default_log_graph_map);
bind(context, key_esc, MDFR_NONE, log_graph__escape);
bind(context, key_mouse_wheel, MDFR_NONE, log_graph__scroll_wheel);
bind(context, key_mouse_left, MDFR_NONE, log_graph__click_jump_to_event_source);
bind(context, key_mouse_right, MDFR_NONE, log_graph__click_select_event);
bind(context, key_page_up, MDFR_NONE, log_graph__page_up);
bind(context, key_page_down, MDFR_NONE, log_graph__page_down);
end_map(context);
}
CUSTOM_COMMAND_SIG(show_the_log_graph)
CUSTOM_DOC("Parser *log* and displays the 'log graph' UI")
{
Buffer_ID log_buffer = get_buffer_by_name(app, string_u8_litexpr("*log*"), AccessAll);
log_parse_fill(app, log_buffer);
if (log_view == 0){
log_view = get_active_view(app, AccessAll);
}
Managed_Scope scope = view_get_managed_scope(app, log_view);
u64 render_hook_value = (u64)PtrAsInt(log_graph_render);
managed_variable_set(app, scope, view_render_hook, render_hook_value);
view_set_setting(app, log_view, ViewSetting_UICommandMap, default_log_graph_map);
view_begin_ui_mode(app, log_view);
view_set_quit_ui_handler(app, log_view, ui_quit_clear_render_hook);
}
// BOTTOM

View File

@ -100,6 +100,77 @@ struct Log_Parse{
Table_u64_u64 tag_name_to_event_list_table;
};
////////////////////////////////
struct Log_Graph_Thread_Bucket{
Log_Graph_Thread_Bucket *next;
Range_i32 range;
b32 had_a_tag;
u64 thread_id_value;
};
struct Log_Graph_Box{
Log_Graph_Box *next;
Rect_f32 rect;
Log_Event *event;
};
typedef i32 Log_Filter_Kind;
enum{
LogFilter_ERROR,
LogFilter_TagValue,
LogFilter_Tag,
};
struct Log_Filter{
Log_Filter *next;
Log_Filter *prev;
Log_Filter_Kind kind;
u64 tag_name_code;
Log_Tag_Value tag_value;
};
struct Log_Filter_Set{
Log_Filter filters_memory[20];
Log_Filter *free_filters;
Log_Filter *first;
Log_Filter *last;
i32 count;
i32 alter_counter;
};
typedef i32 Log_Graph_List_Tab;
enum{
LogTab_ERROR,
LogTab_Filters,
LogTab_Previews,
LogTab_COUNT,
};
struct Log_Graph{
b32 holding_temp;
Temp_Memory temp;
Rect_f32 layout_region;
Face_ID face_id;
i32 filter_alter_counter;
i32 preview_alter_counter;
Log_Graph_List_Tab tab;
Rect_f32 details_region;
Log_Event_List filtered_list;
Log_Event_Ptr_Array event_array;
Log_Graph_Thread_Bucket *first_bucket;
Log_Graph_Thread_Bucket *last_bucket;
i32 bucket_count;
Log_Graph_Box *first_box;
Log_Graph_Box *last_box;
i32 box_count;
f32 y_scroll;
f32 max_y_scroll;
Log_Event *selected_event;
b32 has_unused_click;
Vec2_f32 unused_click;
};
#endif
// BOTTOM

View File

@ -17,11 +17,13 @@ in the set of default maps.
void
default_keys(Bind_Helper *context){
fill_keys_default(context);
fill_log_graph_command_map(context);
}
void
mac_default_keys(Bind_Helper *context){
fill_keys_mac_default(context);
fill_log_graph_command_map(context);
}

View File

@ -365,33 +365,42 @@ lister_update_ui(Application_Links *app, View_ID view, Lister_State *state){
Lister_Node_Ptr_Array substring_matches = {};
substring_matches.node_ptrs = push_array(scratch, Lister_Node*, node_count);
String_Const_u8 key = state->lister.data.key_string.string;
List_String_Const_u8 absolutes = {};
string_list_push(scratch, &absolutes, string_u8_litexpr(""));
List_String_Const_u8 splits = string_split(scratch, key, (u8*)"*", 1);
b32 has_wildcard = (splits.node_count > 1);
string_list_push(&absolutes, &splits);
string_list_push(scratch, &absolutes, string_u8_litexpr(""));
{
Temp_Memory temp = begin_temp(scratch);
String_Const_u8 key = state->lister.data.key_string.string;
key = push_string_copy(scratch, key);
string_mod_replace_character(key, '_', '*');
string_mod_replace_character(key, ' ', '*');
for (Lister_Node *node = state->lister.data.options.first;
node != 0;
node = node->next){
if (key.size == 0 ||
string_wildcard_match_insensitive(absolutes, node->string)){
List_String_Const_u8 absolutes = {};
string_list_push(scratch, &absolutes, string_u8_litexpr(""));
List_String_Const_u8 splits = string_split(scratch, key, (u8*)"*", 1);
b32 has_wildcard = (splits.node_count > 1);
string_list_push(&absolutes, &splits);
string_list_push(scratch, &absolutes, string_u8_litexpr(""));
for (Lister_Node *node = state->lister.data.options.first;
node != 0;
node = node->next){
String_Const_u8 node_string = node->string;
if (string_match_insensitive(node_string, key) && exact_matches.count == 0){
exact_matches.node_ptrs[exact_matches.count++] = node;
}
else if (!has_wildcard &&
string_match_insensitive(string_prefix(node_string, key.size), key) &&
node->string.size > key.size &&
node->string.str[key.size] == '.'){
before_extension_matches.node_ptrs[before_extension_matches.count++] = node;
}
else{
substring_matches.node_ptrs[substring_matches.count++] = node;
if (key.size == 0 || string_wildcard_match_insensitive(absolutes, node_string)){
if (string_match_insensitive(node_string, key) && exact_matches.count == 0){
exact_matches.node_ptrs[exact_matches.count++] = node;
}
else if (!has_wildcard &&
string_match_insensitive(string_prefix(node_string, key.size), key) &&
node->string.size > key.size &&
node->string.str[key.size] == '.'){
before_extension_matches.node_ptrs[before_extension_matches.count++] = node;
}
else{
substring_matches.node_ptrs[substring_matches.count++] = node;
}
}
}
end_temp(temp);
}
Lister_Node_Ptr_Array node_ptr_arrays[] = {

View File

@ -14,9 +14,9 @@
//
internal void
write_cursor_with_index(Cursor_With_Index *positions, i32 *count, i32 pos){
positions[(*count)].index = *count;
positions[(*count)].pos = pos;
write_cursor_with_index(Cursor_With_Index *positions, i32 *count, i64 pos){
positions[*count].index = *count;
positions[*count].pos = pos;
++(*count);
}
@ -29,7 +29,7 @@ write_cursor_with_index(Cursor_With_Index *positions, i32 *count, i32 pos){
internal void
buffer_quick_sort_cursors(Cursor_With_Index *positions, i32 start, i32 pivot){
i32 mid = start;
i32 pivot_pos = positions[pivot].pos;
i64 pivot_pos = positions[pivot].pos;
for (i32 i = mid; i < pivot; ++i){
if (positions[i].pos < pivot_pos){
CursorSwap__(positions[mid], positions[i]);

View File

@ -19,7 +19,7 @@ enum{
};
struct Cursor_With_Index{
i32 pos;
i64 pos;
i32 index;
};

View File

@ -167,7 +167,7 @@ edit_fix_markers(System_Functions *system, Models *models, Editing_File *file, E
panel = layout_get_next_open_panel(layout, panel)){
View *view = panel->view;
if (view->file == file){
i32 cursor_pos = cursors[cursor_count++].pos;
i64 cursor_pos = cursors[cursor_count++].pos;
Full_Cursor new_cursor = file_compute_cursor(models, file, seek_pos(cursor_pos));
File_Edit_Positions edit_pos = view_get_edit_pos(view);
@ -176,8 +176,8 @@ edit_fix_markers(System_Functions *system, Models *models, Editing_File *file, E
view->mark = cursors[cursor_count++].pos;
i32 line_height = (i32)face->height;
i32 top_left_pos = cursors[cursor_count++].pos;
i32 top_left_target_pos = cursors[cursor_count++].pos;
i64 top_left_pos = cursors[cursor_count++].pos;
i64 top_left_target_pos = cursors[cursor_count++].pos;
f32 new_y_val_aligned = 0;
if (view->temp_view_top_left_pos != top_left_pos){
Full_Cursor new_position_cursor = file_compute_cursor(models, file, seek_pos(top_left_pos));

View File

@ -482,7 +482,7 @@ file_create_from_string(System_Functions *system, Models *models, Editing_File *
String_Const_u8 name = SCu8(file->unique_name.name_space, file->unique_name.name_size);
name = string_escape(scratch, name);
LogEventF(log_string(M), scratch, file->id, 0, system->thread_get_id(),
"init file [last_write_time=0x%llx] [name=\"%.*s\"]",
"init file [lwt=0x%llx] [name=\"%.*s\"]",
attributes.last_write_time, string_expand(name));
end_temp(temp);
}

View File

@ -742,6 +742,7 @@ view_quit_ui(System_Functions *system, Models *models, View *view){
view->ui_mode = false;
if (view->ui_quit != 0){
view->ui_quit(&models->app_links, view_get_id(&models->live_set, view));
view->ui_quit = 0;
}
}

View File

@ -28,7 +28,7 @@ file_change_notification_check(System_Functions *system, Arena *scratch, Working
file_add_dirty_flag(file, DirtyState_UnloadedChanges);
if (file->external_mod_node.next == 0){
LogEventF(log_string(M), &working_set->arena, file->id, 0, system->thread_get_id(),
"external modification [last_write_time=0x%llx]", attributes.last_write_time);
"external modification [lwt=0x%llx]", attributes.last_write_time);
dll_insert_back(&working_set->has_external_mod_sentinel, &file->external_mod_node);
system->signal_step(0);
}

View File

@ -452,9 +452,9 @@ generate_remapping_code_and_data(Arena *arena){
bind(arena, mappings, '.', MDFR_ALT, change_to_build_panel);
bind(arena, mappings, ',', MDFR_ALT, close_build_panel);
bind(arena, mappings, 'n', MDFR_ALT, goto_next_jump_sticky);
bind(arena, mappings, 'N', MDFR_ALT, goto_prev_jump_sticky);
bind(arena, mappings, 'M', MDFR_ALT, goto_first_jump_sticky);
bind(arena, mappings, 'n', MDFR_ALT, goto_next_jump);
bind(arena, mappings, 'N', MDFR_ALT, goto_prev_jump);
bind(arena, mappings, 'M', MDFR_ALT, goto_first_jump);
bind(arena, mappings, 'm', MDFR_ALT, build_in_build_panel);
bind(arena, mappings, 'b', MDFR_ALT, toggle_filebar);
@ -579,8 +579,8 @@ generate_remapping_code_and_data(Arena *arena){
bind(arena, mappings, '1', MDFR_CTRL, view_buffer_other_panel);
bind(arena, mappings, '2', MDFR_CTRL, swap_buffers_between_panels);
bind(arena, mappings, '\n', MDFR_NONE, newline_or_goto_position_sticky);
bind(arena, mappings, '\n', MDFR_SHIFT, newline_or_goto_position_same_panel_sticky);
bind(arena, mappings, '\n', MDFR_NONE, newline_or_goto_position);
bind(arena, mappings, '\n', MDFR_SHIFT, newline_or_goto_position_same_panel);
bind(arena, mappings, '>', MDFR_CTRL, view_jump_list_with_lister);
bind(arena, mappings, ' ', MDFR_SHIFT, write_character);
@ -680,9 +680,9 @@ generate_remapping_code_and_data(Arena *arena){
bind(arena, mappings, '.', MDFR_CTRL, change_to_build_panel);
bind(arena, mappings, ',', MDFR_CTRL, close_build_panel);
bind(arena, mappings, 'n', MDFR_CTRL, goto_next_jump_sticky);
bind(arena, mappings, 'N', MDFR_CTRL, goto_prev_jump_sticky);
bind(arena, mappings, 'M', MDFR_CTRL, goto_first_jump_sticky);
bind(arena, mappings, 'n', MDFR_CTRL, goto_next_jump);
bind(arena, mappings, 'N', MDFR_CTRL, goto_prev_jump);
bind(arena, mappings, 'M', MDFR_CTRL, goto_first_jump);
bind(arena, mappings, 'm', MDFR_CTRL, build_in_build_panel);
bind(arena, mappings, 'b', MDFR_CTRL, toggle_filebar);
@ -806,8 +806,8 @@ generate_remapping_code_and_data(Arena *arena){
bind(arena, mappings, '1', MDFR_CMND, view_buffer_other_panel);
bind(arena, mappings, '2', MDFR_CMND, swap_buffers_between_panels);
bind(arena, mappings, '\n', MDFR_NONE, newline_or_goto_position_sticky);
bind(arena, mappings, '\n', MDFR_SHIFT, newline_or_goto_position_same_panel_sticky);
bind(arena, mappings, '\n', MDFR_NONE, newline_or_goto_position);
bind(arena, mappings, '\n', MDFR_SHIFT, newline_or_goto_position_same_panel);
bind(arena, mappings, '>', MDFR_CMND, view_jump_list_with_lister);
bind(arena, mappings, ' ', MDFR_SHIFT, write_character);

View File

@ -914,8 +914,10 @@ win32_thread_wrapper(void *ptr){
Win32_Object *object = (Win32_Object*)ptr;
Thread_Function *proc = object->thread.proc;
void *object_ptr = object->thread.ptr;
EnterCriticalSection(&win32vars.thread_launch_mutex);
win32vars.waiting_for_launch = false;
WakeConditionVariable(&win32vars.thread_launch_cv);
LeaveCriticalSection(&win32vars.thread_launch_mutex);
proc(object_ptr);
return(0);
}