From 9a54ae50c1703330c90dfd61231323f5615da495 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 22 Jan 2025 14:23:39 -0800 Subject: [PATCH] old config code elimination --- src/raddbg/generated/raddbg.meta.c | 16 +- src/raddbg/generated/raddbg.meta.h | 8 +- src/raddbg/raddbg.mdesk | 11 - src/raddbg/raddbg_core.c | 1281 ++++++++-------------------- src/raddbg/raddbg_core.h | 149 ++-- src/raddbg/raddbg_views.c | 140 +-- 6 files changed, 413 insertions(+), 1192 deletions(-) diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index b9eabc32..c628a0ff 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -28,14 +28,6 @@ RD_CmdKind_Null, RD_CmdKind_Null, }; -RD_CmdKind rd_cfg_src_apply_cmd_kind_table[4] = -{ -RD_CmdKind_ApplyUserData, -RD_CmdKind_ApplyProjectData, -RD_CmdKind_Null, -RD_CmdKind_Null, -}; - RD_VocabularyInfo rd_vocabulary_info_table[41] = { {str8_lit_comp("auto_view_rule"), str8_lit_comp("auto_view_rules"), str8_lit_comp("Auto View Rule"), str8_lit_comp("Auto View Rules"), RD_IconKind_Binoculars}, @@ -289,7 +281,7 @@ Rng1U64 rd_reg_slot_range_table[40] = {OffsetOf(RD_Regs, os_event), OffsetOf(RD_Regs, os_event) + sizeof(OS_Event *)}, }; -RD_CmdKindInfo rd_cmd_kind_info_table[216] = +RD_CmdKindInfo rd_cmd_kind_info_table[213] = { {0}, { str8_lit_comp("launch_and_run"), str8_lit_comp("Starts debugging a new instance of a target, then runs."), str8_lit_comp("launch,start,run,target"), str8_lit_comp(""), str8_lit_comp("Launch and Run"), RD_IconKind_Play, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Entity, str8_lit_comp(""), RD_EntityKind_Target, CTRL_EntityKind_Null}}, @@ -385,8 +377,6 @@ RD_CmdKindInfo rd_cmd_kind_info_table[216] = { str8_lit_comp("open_user"), str8_lit_comp("Opens a user file path, immediately loading it, and begins autosaving to it."), str8_lit_comp("load,user,project,layout"), str8_lit_comp(""), str8_lit_comp("Open User"), RD_IconKind_Person, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, { str8_lit_comp("open_project"), str8_lit_comp("Opens a project file path, immediately loading it, and begins autosaving to it."), str8_lit_comp("project,project,session"), str8_lit_comp(""), str8_lit_comp("Open Project"), RD_IconKind_Briefcase, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, { str8_lit_comp("open_recent_project"), str8_lit_comp("Opens a recently used project file."), str8_lit_comp("project,project,session"), str8_lit_comp(""), str8_lit_comp("Open Recent Project"), RD_IconKind_Briefcase, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Entity, str8_lit_comp(""), RD_EntityKind_RecentProject, CTRL_EntityKind_Null}}, -{ str8_lit_comp("apply_user_data"), str8_lit_comp("Applies user data from the active user file."), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("Apply User Data"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, -{ str8_lit_comp("apply_project_data"), str8_lit_comp("Applies project data from the active project file."), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("Apply Project Data"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, { str8_lit_comp("write_user_data"), str8_lit_comp("Writes user data to the active user file."), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("Write User Data"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, { str8_lit_comp("write_project_data"), str8_lit_comp("Writes project data to the active project file."), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("Write Project Data"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, { str8_lit_comp("edit"), str8_lit_comp("Edits the current selection."), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("Edit"), RD_IconKind_Pencil, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, @@ -497,7 +487,6 @@ RD_CmdKindInfo rd_cmd_kind_info_table[216] = { str8_lit_comp("disasm"), str8_lit_comp("Opens the disassembly view."), str8_lit_comp("disasm"), str8_lit_comp(""), str8_lit_comp("Disassembly"), RD_IconKind_Glasses, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, { str8_lit_comp("output"), str8_lit_comp("Opens an output view."), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("Output"), RD_IconKind_List, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, { str8_lit_comp("memory"), str8_lit_comp("Opens a memory view."), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("Memory"), RD_IconKind_Grid, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, -{ str8_lit_comp("exception_filters"), str8_lit_comp("Opens the exception filters view."), str8_lit_comp("exceptions,filters"), str8_lit_comp(""), str8_lit_comp("Exception Filters"), RD_IconKind_Gear, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, { str8_lit_comp("settings"), str8_lit_comp("Opens the settings view."), str8_lit_comp("theme,color,scheme,options"), str8_lit_comp(""), str8_lit_comp("Settings"), RD_IconKind_Gear, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, { str8_lit_comp("pick_file"), str8_lit_comp("Opens the file browser to pick a file."), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("Pick File"), RD_IconKind_FileOutline, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, { str8_lit_comp("pick_folder"), str8_lit_comp("Opens the file browser to pick a folder."), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("Pick Folder"), RD_IconKind_FolderOpenFilled, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*1)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, @@ -874,12 +863,11 @@ EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(types), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(procedures), }; -RD_ViewRuleInfo rd_view_rule_kind_info_table[29] = +RD_ViewRuleInfo rd_view_rule_kind_info_table[28] = { {{0}, {0}, {0}, {0}, RD_IconKind_Null, 0, EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), RD_VIEW_RULE_UI_FUNCTION_NAME(null)}, {str8_lit_comp("empty"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), RD_IconKind_Null, (RD_ViewRuleInfoFlag_ShowInDocs*0|RD_ViewRuleInfoFlag_CanFilter*0|RD_ViewRuleInfoFlag_FilterIsCode*0|RD_ViewRuleInfoFlag_TypingAutomaticallyFilters*0|RD_ViewRuleInfoFlag_CanUseInWatchTable*0|RD_ViewRuleInfoFlag_CanFillValueCell*0|RD_ViewRuleInfoFlag_CanExpand*0), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), RD_VIEW_RULE_UI_FUNCTION_NAME(empty)}, {str8_lit_comp("getting_started"), str8_lit_comp(""), str8_lit_comp("Getting Started"), str8_lit_comp(""), RD_IconKind_QuestionMark, (RD_ViewRuleInfoFlag_ShowInDocs*0|RD_ViewRuleInfoFlag_CanFilter*0|RD_ViewRuleInfoFlag_FilterIsCode*0|RD_ViewRuleInfoFlag_TypingAutomaticallyFilters*0|RD_ViewRuleInfoFlag_CanUseInWatchTable*0|RD_ViewRuleInfoFlag_CanFillValueCell*0|RD_ViewRuleInfoFlag_CanExpand*0), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), RD_VIEW_RULE_UI_FUNCTION_NAME(getting_started)}, -{str8_lit_comp("exception_filters"), str8_lit_comp("An interface which controls whether or not the debugger will halt attached processes upon encountering specific exception codes for the first time."), str8_lit_comp("Exception Filters"), str8_lit_comp(""), RD_IconKind_Gear, (RD_ViewRuleInfoFlag_ShowInDocs*1|RD_ViewRuleInfoFlag_CanFilter*0|RD_ViewRuleInfoFlag_FilterIsCode*0|RD_ViewRuleInfoFlag_TypingAutomaticallyFilters*0|RD_ViewRuleInfoFlag_CanUseInWatchTable*0|RD_ViewRuleInfoFlag_CanFillValueCell*0|RD_ViewRuleInfoFlag_CanExpand*0), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), RD_VIEW_RULE_UI_FUNCTION_NAME(exception_filters)}, {str8_lit_comp("settings"), str8_lit_comp("An interface to modify general settings for the debugger's appearance and behavior."), str8_lit_comp("Settings"), str8_lit_comp(""), RD_IconKind_Gear, (RD_ViewRuleInfoFlag_ShowInDocs*1|RD_ViewRuleInfoFlag_CanFilter*0|RD_ViewRuleInfoFlag_FilterIsCode*0|RD_ViewRuleInfoFlag_TypingAutomaticallyFilters*0|RD_ViewRuleInfoFlag_CanUseInWatchTable*0|RD_ViewRuleInfoFlag_CanFillValueCell*0|RD_ViewRuleInfoFlag_CanExpand*0), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), RD_VIEW_RULE_UI_FUNCTION_NAME(settings)}, {str8_lit_comp("pending_file"), str8_lit_comp(""), str8_lit_comp("Pending File"), str8_lit_comp(""), RD_IconKind_FileOutline, (RD_ViewRuleInfoFlag_ShowInDocs*0|RD_ViewRuleInfoFlag_CanFilter*0|RD_ViewRuleInfoFlag_FilterIsCode*0|RD_ViewRuleInfoFlag_TypingAutomaticallyFilters*0|RD_ViewRuleInfoFlag_CanUseInWatchTable*0|RD_ViewRuleInfoFlag_CanFillValueCell*0|RD_ViewRuleInfoFlag_CanExpand*0), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), RD_VIEW_RULE_UI_FUNCTION_NAME(pending_file)}, {str8_lit_comp("watch"), str8_lit_comp("The familiar 'watch window' debugger interface. Allows the inputting of a number of expressions. Each expression in the table is evaluated within the context of the selected thread's selected call stack frame. If applicable (depending on visualization rules and the expression's type), these expressions may be hierarchically expanded, which displays children as more rows in the table. The values of these expressions may also be edited, and if possible, can be used to write to registers or memory in attached processes. Also contains a new *view rule* column, not found in other major debuggers, which allows per-row specification of various visualization rules. These view rules may be used to visualize and inspect the evaluation of expressions in a variety of ways. To learn more, read the 'View Rules' section."), str8_lit_comp("Watch"), str8_lit_comp(""), RD_IconKind_Binoculars, (RD_ViewRuleInfoFlag_ShowInDocs*1|RD_ViewRuleInfoFlag_CanFilter*1|RD_ViewRuleInfoFlag_FilterIsCode*1|RD_ViewRuleInfoFlag_TypingAutomaticallyFilters*1|RD_ViewRuleInfoFlag_CanUseInWatchTable*0|RD_ViewRuleInfoFlag_CanFillValueCell*0|RD_ViewRuleInfoFlag_CanExpand*0), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), RD_VIEW_RULE_UI_FUNCTION_NAME(watch)}, diff --git a/src/raddbg/generated/raddbg.meta.h b/src/raddbg/generated/raddbg.meta.h index b9cc15ed..ca29430a 100644 --- a/src/raddbg/generated/raddbg.meta.h +++ b/src/raddbg/generated/raddbg.meta.h @@ -188,8 +188,6 @@ RD_CmdKind_SetFileReplacementPath, RD_CmdKind_OpenUser, RD_CmdKind_OpenProject, RD_CmdKind_OpenRecentProject, -RD_CmdKind_ApplyUserData, -RD_CmdKind_ApplyProjectData, RD_CmdKind_WriteUserData, RD_CmdKind_WriteProjectData, RD_CmdKind_Edit, @@ -300,7 +298,6 @@ RD_CmdKind_PendingFile, RD_CmdKind_Disassembly, RD_CmdKind_Output, RD_CmdKind_Memory, -RD_CmdKind_ExceptionFilters, RD_CmdKind_Settings, RD_CmdKind_PickFile, RD_CmdKind_PickFolder, @@ -392,7 +389,6 @@ typedef enum RD_ViewRuleKind RD_ViewRuleKind_Null, RD_ViewRuleKind_Empty, RD_ViewRuleKind_GettingStarted, -RD_ViewRuleKind_ExceptionFilters, RD_ViewRuleKind_Settings, RD_ViewRuleKind_PendingFile, RD_ViewRuleKind_Watch, @@ -755,7 +751,6 @@ EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(color_rgba); EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(geo3d); RD_VIEW_RULE_UI_FUNCTION_DEF(empty); RD_VIEW_RULE_UI_FUNCTION_DEF(getting_started); -RD_VIEW_RULE_UI_FUNCTION_DEF(exception_filters); RD_VIEW_RULE_UI_FUNCTION_DEF(settings); RD_VIEW_RULE_UI_FUNCTION_DEF(pending_file); RD_VIEW_RULE_UI_FUNCTION_DEF(watch); @@ -785,7 +780,6 @@ C_LINKAGE_BEGIN extern String8 rd_cfg_src_string_table[4]; extern RD_CmdKind rd_cfg_src_load_cmd_kind_table[4]; extern RD_CmdKind rd_cfg_src_write_cmd_kind_table[4]; -extern RD_CmdKind rd_cfg_src_apply_cmd_kind_table[4]; extern RD_VocabularyInfo rd_vocabulary_info_table[41]; extern RD_CfgNameSchemaPair rd_cfg_name_schema_pair_table[5]; extern String8 d_entity_kind_display_string_table[27]; @@ -805,7 +799,7 @@ extern EV_ViewRuleExprExpandInfoHookFunctionType * rd_collection_expr_expand_inf extern EV_ViewRuleExprExpandRangeInfoHookFunctionType * rd_collection_expr_expand_range_info_hook_function_table[18]; extern EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_id_from_num_hook_function_table[18]; extern EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_num_from_id_hook_function_table[18]; -extern RD_ViewRuleInfo rd_view_rule_kind_info_table[29]; +extern RD_ViewRuleInfo rd_view_rule_kind_info_table[28]; extern RD_IconKind rd_entity_kind_icon_kind_table[27]; extern String8 rd_theme_preset_display_string_table[9]; extern String8 rd_theme_preset_code_string_table[9]; diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index bf18be82..747cb0e7 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -43,11 +43,6 @@ RD_CfgSrcTable: @expand(RD_CfgSrcTable a) `RD_CmdKind_$(a.write_cmd)`, } -@data(RD_CmdKind) rd_cfg_src_apply_cmd_kind_table: -{ - @expand(RD_CfgSrcTable a) `RD_CmdKind_$(a.apply_cmd)`; -} - //////////////////////////////// //~ rjf: Vocabulary Maps @@ -419,10 +414,6 @@ RD_CmdTable: // | | | | {OpenProject 1 1 FilePath null Nil Null 1 0 0 0 0 1 Briefcase "open_project" "Open Project" "Opens a project file path, immediately loading it, and begins autosaving to it." "project,project,session" "" } {OpenRecentProject 1 1 Entity null RecentProject Null 0 0 0 0 0 1 Briefcase "open_recent_project" "Open Recent Project" "Opens a recently used project file." "project,project,session" "" } - //- rjf: loading/applying stateful config changes - {ApplyUserData 0 0 Null null Nil Null 0 0 0 0 0 0 Null "apply_user_data" "Apply User Data" "Applies user data from the active user file." "" "" } - {ApplyProjectData 0 0 Null null Nil Null 0 0 0 0 0 0 Null "apply_project_data" "Apply Project Data" "Applies project data from the active project file." "" "" } - //- rjf: writing config changes {WriteUserData 0 1 Null null Nil Null 0 0 0 0 0 0 Null "write_user_data" "Write User Data" "Writes user data to the active user file." "" "" } {WriteProjectData 0 1 Null null Nil Null 0 0 0 0 0 0 Null "write_project_data" "Write Project Data" "Writes project data to the active project file." "" "" } @@ -568,7 +559,6 @@ RD_CmdTable: // | | | | {Disassembly 1 1 Null null Nil Null 0 0 0 0 0 0 Glasses "disasm" "Disassembly" "Opens the disassembly view." "disasm" "" } {Output 1 1 Null null Nil Null 0 0 0 0 0 0 List "output" "Output" "Opens an output view." "" "" } {Memory 1 1 Null null Nil Null 0 0 0 0 0 0 Grid "memory" "Memory" "Opens a memory view." "" "" } - {ExceptionFilters 1 1 Null null Nil Null 0 0 0 0 0 0 Gear "exception_filters" "Exception Filters" "Opens the exception filters view." "exceptions,filters" "" } {Settings 1 1 Null null Nil Null 0 0 0 0 0 0 Gear "settings" "Settings" "Opens the settings view." "theme,color,scheme,options" "" } //- rjf: queries @@ -999,7 +989,6 @@ RD_ViewRuleTable: { GettingStarted getting_started "Getting Started" "" QuestionMark 0 0 0 0 0 0 0 "" } //- rjf: meta (settings) - { ExceptionFilters exception_filters "Exception Filters" "" Gear 0 0 0 0 0 0 1 "An interface which controls whether or not the debugger will halt attached processes upon encountering specific exception codes for the first time." } { Settings settings "Settings" "" Gear 0 0 0 0 0 0 1 "An interface to modify general settings for the debugger's appearance and behavior." } //- rjf: temporary view for loading files - must analyze file before picking viewer diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 1523a494..ac7f2240 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -1150,7 +1150,7 @@ internal B32 rd_cfg_is_project_filtered(RD_Cfg *cfg) { RD_Cfg *project = rd_cfg_child_from_string(cfg, str8_lit("project")); - B32 result = path_match_normalized(rd_state->cfg_paths[RD_CfgSrc_Project], project->first->string); + B32 result = path_match_normalized(rd_state->project_path, project->first->string); return result; } @@ -2262,6 +2262,30 @@ rd_title_fstrs_from_ctrl_entity(Arena *arena, CTRL_Entity *entity, Vec4F32 secon //////////////////////////////// //~ rjf: Evaluation Spaces +//- rjf: cfg <-> eval space + +internal RD_Cfg * +rd_cfg_from_eval_space(E_Space space) +{ + RD_Cfg *cfg = &rd_nil_cfg; + if(space.kind == RD_EvalSpaceKind_MetaCfg) + { + RD_Handle handle = {space.u64s[0], space.u64s[1]}; + cfg = rd_cfg_from_handle(handle); + } + return cfg; +} + +internal E_Space +rd_eval_space_from_cfg(RD_Cfg *cfg) +{ + E_Space space = e_space_make(RD_EvalSpaceKind_MetaCfg); + RD_Handle handle = rd_handle_from_cfg(cfg); + space.u64s[0] = handle.u64[0]; + space.u64s[1] = handle.u64[1]; + return space; +} + //- rjf: entity <-> eval space internal RD_Entity * @@ -3537,7 +3561,7 @@ rd_window_frame(void) //- rjf: compute ui palettes from theme // { - RD_Theme *current = &rd_state->cfg_theme; + RD_Theme *current = rd_state->theme; for EachEnumVal(RD_PaletteCode, code) { ws->cfg_palettes[code].null = v4f32(1, 0, 1, 1); @@ -5482,7 +5506,6 @@ rd_window_frame(void) rd_cmd_kind_info_table[RD_CmdKind_FilePathMap].string, rd_cmd_kind_info_table[RD_CmdKind_AutoViewRules].string, rd_cmd_kind_info_table[RD_CmdKind_Settings].string, - rd_cmd_kind_info_table[RD_CmdKind_ExceptionFilters].string, rd_cmd_kind_info_table[RD_CmdKind_GettingStarted].string, }; U32 codepoints[] = @@ -5505,7 +5528,6 @@ rd_window_frame(void) 'h', 'p', 'v', - 'e', 'g', 0, }; @@ -5991,7 +6013,7 @@ rd_window_frame(void) os_window_push_custom_title_bar_client_area(ws->os, user_box->rect); UI_Parent(user_box) UI_PrefWidth(ui_text_dim(10, 0)) UI_TextAlignment(UI_TextAlign_Center) { - String8 user_path = rd_cfg_path_from_src(RD_CfgSrc_User); + String8 user_path = rd_state->user_path; user_path = str8_chop_last_dot(user_path); RD_Font(RD_FontSlot_Icons) UI_TextRasterFlags(rd_raster_flags_from_slot(RD_FontSlot_Icons)) @@ -6025,7 +6047,7 @@ rd_window_frame(void) os_window_push_custom_title_bar_client_area(ws->os, prof_box->rect); UI_Parent(prof_box) UI_PrefWidth(ui_text_dim(10, 0)) UI_TextAlignment(UI_TextAlign_Center) { - String8 prof_path = rd_cfg_path_from_src(RD_CfgSrc_Project); + String8 prof_path = rd_state->project_path; prof_path = str8_chop_last_dot(prof_path); RD_Font(RD_FontSlot_Icons) ui_label(rd_icon_kind_text_table[RD_IconKind_Briefcase]); @@ -10461,7 +10483,7 @@ rd_push_search_string(Arena *arena) internal Vec4F32 rd_rgba_from_theme_color(RD_ThemeColor color) { - return rd_state->cfg_theme.colors[color]; + return rd_state->theme->colors[color]; } internal RD_ThemeColor @@ -10599,7 +10621,51 @@ rd_palette_from_code(RD_PaletteCode code) internal FNT_Tag rd_font_from_slot(RD_FontSlot slot) { - FNT_Tag result = rd_state->cfg_font_tags[slot]; + // rjf: determine key name for this font slot + String8 key = {0}; + switch(slot) + { + default:{}break; + case RD_FontSlot_Main:{key = str8_lit("main_font");}break; + case RD_FontSlot_Code:{key = str8_lit("code_font");}break; + } + + // rjf: determine font name + String8 font_name = {0}; + if(key.size != 0) + { + RD_Cfg *seed_cfg = &rd_nil_cfg; + if(seed_cfg == &rd_nil_cfg) { seed_cfg = rd_cfg_from_handle(rd_regs()->view); } + if(seed_cfg == &rd_nil_cfg) { seed_cfg = rd_cfg_from_handle(rd_regs()->panel); } + if(seed_cfg == &rd_nil_cfg) { seed_cfg = rd_cfg_from_handle(rd_regs()->window); } + for(RD_Cfg *cfg = seed_cfg; cfg != &rd_nil_cfg; cfg = cfg->parent) + { + RD_Cfg *font_root = rd_cfg_child_from_string(cfg, key); + if(font_root != &rd_nil_cfg) + { + font_name = font_root->first->string; + break; + } + } + } + + // rjf: map name -> tag + FNT_Tag result = {0}; + if(font_name.size == 0) + { + switch(slot) + { + default: + case RD_FontSlot_Main: {result = fnt_tag_from_static_data_string(&rd_default_main_font_bytes);}break; + case RD_FontSlot_Code: {result = fnt_tag_from_static_data_string(&rd_default_code_font_bytes);}break; + case RD_FontSlot_Icons:{result = fnt_tag_from_static_data_string(&rd_icon_font_bytes);}break; + } + } + else + { + // TODO(rjf): need to handle "system font names" here. + result = fnt_tag_from_path(font_name); + } return result; } @@ -11433,14 +11499,6 @@ rd_frame_arena(void) return rd_state->frame_arenas[rd_state->frame_index%ArrayCount(rd_state->frame_arenas)]; } -//- rjf: config paths - -internal String8 -rd_cfg_path_from_src(RD_CfgSrc src) -{ - return rd_state->cfg_paths[src]; -} - //- rjf: entity cache queries internal RD_EntityList @@ -11467,14 +11525,6 @@ rd_query_cached_entity_list_with_kind(RD_EntityKind kind) return result; } -//- rjf: config state - -internal RD_CfgTable * -rd_cfg_table(void) -{ - return &rd_state->cfg_table; -} - //////////////////////////////// //~ rjf: Registers @@ -11682,6 +11732,8 @@ rd_init(CmdLine *cmdln) rd_state->arena = arena; rd_state->quit_after_success = (cmd_line_has_flag(cmdln, str8_lit("quit_after_success")) || cmd_line_has_flag(cmdln, str8_lit("q"))); + rd_state->user_path_arena = arena_alloc(); + rd_state->project_path_arena = arena_alloc(); for(U64 idx = 0; idx < ArrayCount(rd_state->frame_arenas); idx += 1) { rd_state->frame_arenas[idx] = arena_alloc(); @@ -11715,8 +11767,6 @@ rd_init(CmdLine *cmdln) rd_state->string_search_arena = arena_alloc(); rd_state->eval_viz_view_cache_slots_count = 1024; rd_state->eval_viz_view_cache_slots = push_array(arena, RD_EvalVizViewCacheSlot, rd_state->eval_viz_view_cache_slots_count); - rd_state->cfg_main_font_path_arena = arena_alloc(); - rd_state->cfg_code_font_path_arena = arena_alloc(); rd_state->bind_change_arena = arena_alloc(); rd_state->drag_drop_arena = arena_alloc(); rd_state->drag_drop_regs = push_array(rd_state->drag_drop_arena, RD_Regs, 1); @@ -11749,48 +11799,29 @@ rd_init(CmdLine *cmdln) Temp scratch = scratch_begin(0, 0); // rjf: unpack command line arguments - String8 user_cfg_path = cmd_line_string(cmdln, str8_lit("user")); - String8 project_cfg_path = cmd_line_string(cmdln, str8_lit("project")); - if(project_cfg_path.size == 0) - { - project_cfg_path = cmd_line_string(cmdln, str8_lit("profile")); - } + String8 user_path = cmd_line_string(cmdln, str8_lit("user")); + String8 project_path = cmd_line_string(cmdln, str8_lit("project")); { String8 user_program_data_path = os_get_process_info()->user_program_data_path; String8 user_data_folder = push_str8f(scratch.arena, "%S/%S", user_program_data_path, str8_lit("raddbg")); os_make_directory(user_data_folder); - if(user_cfg_path.size == 0) + if(user_path.size == 0) { - user_cfg_path = push_str8f(scratch.arena, "%S/default.raddbg_user", user_data_folder); + user_path = push_str8f(scratch.arena, "%S/default.raddbg_user", user_data_folder); } - if(project_cfg_path.size == 0) + if(project_path.size == 0) { - project_cfg_path = push_str8f(scratch.arena, "%S/default.raddbg_project", user_data_folder); + project_path = push_str8f(scratch.arena, "%S/default.raddbg_project", user_data_folder); } } - // rjf: set up config path state - String8 cfg_src_paths[RD_CfgSrc_COUNT] = {user_cfg_path, project_cfg_path}; - for(RD_CfgSrc src = (RD_CfgSrc)0; src < RD_CfgSrc_COUNT; src = (RD_CfgSrc)(src+1)) - { - rd_state->cfg_path_arenas[src] = arena_alloc(); - rd_cmd(rd_cfg_src_load_cmd_kind_table[src], .file_path = path_normalized_from_string(scratch.arena, cfg_src_paths[src])); - } + // rjf: do initial load + rd_cmd(RD_CmdKind_OpenUser, .file_path = user_path); + rd_cmd(RD_CmdKind_OpenProject, .file_path = project_path); - // rjf: set up config table arena - rd_state->cfg_arena = arena_alloc(); scratch_end(scratch); } - // rjf: set up initial exception filtering rules - for(CTRL_ExceptionCodeKind k = (CTRL_ExceptionCodeKind)0; k < CTRL_ExceptionCodeKind_COUNT; k = (CTRL_ExceptionCodeKind)(k+1)) - { - if(ctrl_exception_code_kind_default_enable_table[k]) - { - rd_state->ctrl_exception_code_filters[k/64] |= 1ull<<(k%64); - } - } - // rjf: unpack icon image data { Temp scratch = scratch_begin(0, 0); @@ -12146,7 +12177,6 @@ rd_frame(void) rd_request_frame(); // TODO(rjf): @cfg_bindchange rd_unbind_name(rd_state->bind_change_cmd_name, rd_state->bind_change_binding); rd_state->bind_change_active = 0; - rd_cmd(rd_cfg_src_write_cmd_kind_table[RD_CfgSrc_User]); } for(OS_Event *event = events.first, *next = 0; event != 0; event = next) { @@ -12173,7 +12203,6 @@ rd_frame(void) U32 codepoint = os_codepoint_from_modifiers_and_key(event->modifiers, event->key); os_text(&events, event->window, codepoint); os_eat_event(&events, event); - rd_cmd(rd_cfg_src_write_cmd_kind_table[RD_CfgSrc_User]); rd_request_frame(); break; } @@ -12183,6 +12212,7 @@ rd_frame(void) ////////////////////////////// //- rjf: build key map from config // + ProfScope("build key map from config") { //- rjf: set up table rd_state->key_map = push_array(rd_frame_arena(), RD_KeyMap, 1); @@ -12251,9 +12281,11 @@ rd_frame(void) } } - //- rjf: iterate all commands - if they are not found in the map, then use - // the default binding. + //- rjf: iterate default bindings - if their commands are not found in the + // map, then use the default binding. + // // TODO(rjf): @dynamic_cmds + // for EachElement(idx, rd_default_binding_table) { String8 name = rd_default_binding_table[idx].string; @@ -12283,6 +12315,110 @@ rd_frame(void) } } + ////////////////////////////// + //- rjf: build theme from config + // + ProfScope("build theme from config") + { + rd_state->theme_target = push_array(rd_frame_arena(), RD_Theme, 1); + RD_Theme *theme = rd_state->theme_target; + + //- rjf: gather globally-applying config options + RD_CfgList preset_roots = rd_cfg_top_level_list_from_string(scratch.arena, str8_lit("color_preset")); + RD_CfgList colors_roots = rd_cfg_top_level_list_from_string(scratch.arena, str8_lit("colors")); + + //- rjf: assume default-dark + MemoryCopy(theme->colors, rd_theme_preset_colors_table[RD_ThemePreset_DefaultDark], sizeof(rd_theme_preset_colors__default_dark)); + + //- rjf: apply explicitly-specified presets + for(RD_CfgNode *n = preset_roots.first; n != 0; n = n->next) + { + RD_Cfg *preset = n->v; + String8 preset_name = preset->first->string; + RD_ThemePreset preset_kind = (RD_ThemePreset)0; + B32 found_preset_kind = 0; + for(RD_ThemePreset p = (RD_ThemePreset)0; p < RD_ThemePreset_COUNT; p = (RD_ThemePreset)(p+1)) + { + if(str8_match(preset_name, rd_theme_preset_code_string_table[p], StringMatchFlag_CaseInsensitive)) + { + found_preset_kind = 1; + preset_kind = p; + break; + } + } + if(found_preset_kind) + { + MemoryCopy(theme->colors, rd_theme_preset_colors_table[preset_kind], sizeof(rd_theme_preset_colors__default_dark)); + } + } + + //- rjf: apply explicitly-specified color codes + for(RD_CfgNode *n = colors_roots.first; n != 0; n = n->next) + { + RD_Cfg *colors = n->v; + for(RD_Cfg *color = colors->first; color != &rd_nil_cfg; color = color->next) + { + String8 name = color->string; + RD_ThemeColor color_code = RD_ThemeColor_Null; + for(RD_ThemeColor c = RD_ThemeColor_Null; c < RD_ThemeColor_COUNT; c = (RD_ThemeColor)(c+1)) + { + if(str8_match(rd_theme_color_cfg_string_table[c], name, StringMatchFlag_CaseInsensitive)) + { + color_code = c; + break; + } + } + if(color_code != RD_ThemeColor_Null) + { + U64 color_val = 0; + if(try_u64_from_str8_c_rules(color->first->string, &color_val)) + { + Vec4F32 color_rgba = rgba_from_u32((U32)color_val); + theme->colors[color_code] = color_rgba; + } + } + } + } + } + + ////////////////////////////// + //- rjf: animate theme + // + { + RD_Theme *last = rd_state->theme; + rd_state->theme = push_array(rd_frame_arena(), RD_Theme, 1); + RD_Theme *current = rd_state->theme; + RD_Theme *target = rd_state->theme_target; + if(last) + { + MemoryCopyStruct(current, last); + } + if(rd_state->frame_index <= 2) + { + MemoryCopyStruct(current, target); + } + else + { + F32 rate = 1 - pow_f32(2, (-50.f * rd_state->frame_dt)); + for(RD_ThemeColor color = RD_ThemeColor_Null; + color < RD_ThemeColor_COUNT; + color = (RD_ThemeColor)(color+1)) + { + if(abs_f32(target->colors[color].x - current->colors[color].x) > 0.01f || + abs_f32(target->colors[color].y - current->colors[color].y) > 0.01f || + abs_f32(target->colors[color].z - current->colors[color].z) > 0.01f || + abs_f32(target->colors[color].w - current->colors[color].w) > 0.01f) + { + rd_request_frame(); + } + current->colors[color].x += (target->colors[color].x - current->colors[color].x) * rate; + current->colors[color].y += (target->colors[color].y - current->colors[color].y) * rate; + current->colors[color].z += (target->colors[color].z - current->colors[color].z) * rate; + current->colors[color].w += (target->colors[color].w - current->colors[color].w) * rate; + } + } + } + ////////////////////////////// //- rjf: consume events // @@ -12528,7 +12664,39 @@ rd_frame(void) } } + //- rjf: add macros for evallable config trees + { + String8 evallable_names[] = + { + str8_lit("breakpoint"), + str8_lit("watch_pin"), + str8_lit("target"), + str8_lit("file_path_map"), + str8_lit("auto_view_rule"), + }; + for EachElement(idx, evallable_names) + { + // rjf: determine schema string for this name + String8 schema_string = {0}; + for EachElement(schema_idx, rd_cfg_name_schema_pair_table) + { + if(str8_match(evallable_names[idx], rd_cfg_name_schema_pair_table[idx].name, 0)) + { + schema_string = rd_cfg_name_schema_pair_table[idx].schema; + break; + } + } + + // rjf: parse schema + MD_Node *schema = md_tree_from_string(scratch.arena, schema_string)->first; + + // rjf: form evaluation type from schema + + } + } + //- rjf: add macros for all evallable debugger frontend entities +#if 0 // TODO(rjf): @cfg { RD_EntityKind evallable_kinds[] = { @@ -12565,6 +12733,7 @@ rd_frame(void) } } } +#endif //- rjf: add macros for all evallable control entities { @@ -12961,241 +13130,105 @@ rd_frame(void) case RD_CmdKind_OpenUser: case RD_CmdKind_OpenProject: { - //- TODO(rjf): @cfg load & apply user/project data to the cfg data structure + String8 file_root_key = (kind == RD_CmdKind_OpenUser ? str8_lit("user") : str8_lit("project")); + RD_Cfg *file_root = rd_cfg_child_from_string(rd_state->root_cfg, file_root_key); + + //- rjf: load the new file's data + String8 file_path = rd_regs()->file_path; + String8 file_data = os_data_from_file_path(scratch.arena, file_path); + + //- rjf: determine if the file is good + B32 file_is_okay = 0; { - String8 file_root_key = (kind == RD_CmdKind_OpenUser ? str8_lit("user") : str8_lit("project")); - RD_Cfg *file_root = rd_cfg_child_from_string(rd_state->root_cfg, file_root_key); - - //- rjf: eliminate all old state under this file tree - for(RD_Cfg *tln = file_root->first, *next = &rd_nil_cfg; - tln != &rd_nil_cfg; - tln = next) - { - next = tln->next; - rd_cfg_release(tln); - } - - //- rjf: load & parse the new file, generate cfg entities for it - String8 file_path = rd_regs()->file_path; - String8 file_data = os_data_from_file_path(scratch.arena, file_path); - RD_CfgList file_cfg_list = rd_cfg_tree_list_from_string(scratch.arena, file_data); - - //- rjf: insert the new cfg entities into this file tree - for(RD_CfgNode *n = file_cfg_list.first; n != 0; n = n->next) - { - rd_cfg_insert_child(file_root, file_root->last, n->v); - } - - //- rjf: if config did not open any windows for the user, then we need to open a sensible default - { - if(str8_match(file_root_key, str8_lit("user"), 0)) - { - RD_CfgList all_user_windows = rd_cfg_child_list_from_string(scratch.arena, file_root, str8_lit("window")); - if(all_user_windows.count == 0) - { - OS_Handle monitor = os_primary_monitor(); - String8 monitor_name = os_name_from_monitor(scratch.arena, monitor); - Vec2F32 monitor_dim = os_dim_from_monitor(monitor); - F32 monitor_dpi = os_dpi_from_monitor(monitor); - Vec2F32 window_dim = v2f32(monitor_dim.x*4/5, monitor_dim.y*4/5); - RD_Cfg *new_window = rd_cfg_new(file_root, str8_lit("window")); - RD_Cfg *size = rd_cfg_new(new_window, str8_lit("size")); - rd_cfg_newf(size, "%f", window_dim.x); - rd_cfg_newf(size, "%f", window_dim.y); - F32 line_height_guess = 11.f * (monitor_dpi / 96.f); - F32 num_lines_in_monitor_height = monitor_dim.y / line_height_guess; - if(num_lines_in_monitor_height < 100) - { - rd_cmd(RD_CmdKind_ResetToCompactPanels, .window = rd_handle_from_cfg(new_window)); - } - else - { - rd_cmd(RD_CmdKind_ResetToDefaultPanels, .window = rd_handle_from_cfg(new_window)); - } - } - } - } - } - - // TODO(rjf): dear lord this is so overcomplicated, this needs to be collapsed down & simplified ASAP - - B32 load_cfg[RD_CfgSrc_COUNT] = {0}; - RD_CfgSrc cfg_src = (RD_CfgSrc)0; - for(RD_CfgSrc src = (RD_CfgSrc)0; src < RD_CfgSrc_COUNT; src = (RD_CfgSrc)(src+1)) - { - load_cfg[src] = (kind == rd_cfg_src_load_cmd_kind_table[src]); - if(load_cfg[src]) - { - cfg_src = src; - } - } - - //- rjf: normalize path - String8 new_path = path_normalized_from_string(scratch.arena, rd_regs()->file_path); - - //- rjf: path -> data - FileProperties props = {0}; - String8 data = {0}; - { - OS_Handle file = os_file_open(OS_AccessFlag_ShareRead|OS_AccessFlag_Read, new_path); - props = os_properties_from_file(file); - data = os_string_from_file_range(scratch.arena, file, r1u64(0, props.size)); - os_file_close(file); - } - - //- rjf: investigate file path/data - B32 file_is_okay = 1; - if(props.modified != 0 && data.size != 0 && !str8_match(str8_prefix(data, 9), str8_lit("// raddbg"), 0) && rd_state->cfg_cached_timestamp[cfg_src] != 0) - { - file_is_okay = 0; - } - - //- rjf: set new config paths - if(file_is_okay) - { - for(RD_CfgSrc src = (RD_CfgSrc)0; src < RD_CfgSrc_COUNT; src = (RD_CfgSrc)(src+1)) - { - if(load_cfg[src]) - { - arena_clear(rd_state->cfg_path_arenas[src]); - rd_state->cfg_paths[src] = push_str8_copy(rd_state->cfg_path_arenas[src], new_path); - } - } - } - - //- rjf: get config file properties - FileProperties cfg_props[RD_CfgSrc_COUNT] = {0}; - if(file_is_okay) - { - for(RD_CfgSrc src = (RD_CfgSrc)0; src < RD_CfgSrc_COUNT; src = (RD_CfgSrc)(src+1)) - { - String8 path = rd_cfg_path_from_src(src); - cfg_props[src] = os_properties_from_file_path(path); - } - } - - //- rjf: load files - String8 cfg_data[RD_CfgSrc_COUNT] = {0}; - U64 cfg_timestamps[RD_CfgSrc_COUNT] = {0}; - if(file_is_okay) - { - for(RD_CfgSrc src = (RD_CfgSrc)0; src < RD_CfgSrc_COUNT; src = (RD_CfgSrc)(src+1)) - { - String8 path = rd_cfg_path_from_src(src); - OS_Handle file = os_file_open(OS_AccessFlag_ShareRead|OS_AccessFlag_Read, path); - FileProperties props = os_properties_from_file(file); - String8 data = os_string_from_file_range(scratch.arena, file, r1u64(0, props.size)); - if(props.modified != 0) - { - cfg_data[src] = data; - cfg_timestamps[src] = props.modified; - } - os_file_close(file); - } - } - - //- rjf: determine if we need to save config - B32 cfg_save[RD_CfgSrc_COUNT] = {0}; - if(file_is_okay) - { - for(RD_CfgSrc src = (RD_CfgSrc)0; src < RD_CfgSrc_COUNT; src = (RD_CfgSrc)(src+1)) - { - cfg_save[src] = (load_cfg[src] && cfg_props[src].created == 0); - } - } - - //- rjf: determine if we need to reload config - B32 cfg_load[RD_CfgSrc_COUNT] = {0}; - B32 cfg_load_any = 0; - if(file_is_okay) - { - for(RD_CfgSrc src = (RD_CfgSrc)0; src < RD_CfgSrc_COUNT; src = (RD_CfgSrc)(src+1)) - { - cfg_load[src] = (load_cfg[src] && ((cfg_save[src] == 0 && rd_state->cfg_cached_timestamp[src] != cfg_timestamps[src]) || cfg_props[src].created == 0)); - cfg_load_any = cfg_load_any || cfg_load[src]; - } - } - - //- rjf: load => build new config table - if(cfg_load_any) - { - arena_clear(rd_state->cfg_arena); - MemoryZeroStruct(&rd_state->cfg_table); - for(RD_CfgSrc src = (RD_CfgSrc)0; src < RD_CfgSrc_COUNT; src = (RD_CfgSrc)(src+1)) - { - rd_cfg_table_push_unparsed_string(rd_state->cfg_arena, &rd_state->cfg_table, cfg_data[src], src); - } - } - - //- rjf: load => dispatch apply - // - // NOTE(rjf): must happen before `save`. we need to create a default before saving, which - // occurs in the 'apply' path. - // - if(file_is_okay) - { - for(RD_CfgSrc src = (RD_CfgSrc)0; src < RD_CfgSrc_COUNT; src = (RD_CfgSrc)(src+1)) - { - if(cfg_load[src]) - { - RD_CmdKind cmd_kind = rd_cfg_src_apply_cmd_kind_table[src]; - rd_cmd(cmd_kind); - rd_state->cfg_cached_timestamp[src] = cfg_timestamps[src]; - } - } - } - - //- rjf: save => dispatch write - if(file_is_okay) - { - for(RD_CfgSrc src = (RD_CfgSrc)0; src < RD_CfgSrc_COUNT; src = (RD_CfgSrc)(src+1)) - { - if(cfg_save[src]) - { - RD_CmdKind cmd_kind = rd_cfg_src_write_cmd_kind_table[src]; - rd_cmd(cmd_kind); - } - } + FileProperties file_props = os_properties_from_file_path(file_path); + file_is_okay = ((file_props.size == 0 && file_props.created == 0) || + str8_match(str8_prefix(file_data, 9), str8_lit("// raddbg"), 0)); } //- rjf: bad file -> alert user if(!file_is_okay) { - log_user_errorf("\"%S\" appears to refer to an existing file which is not a RADDBG config file. This would overwrite the file.", new_path); + log_user_errorf("\"%S\" appears to refer to an existing file which is not a RADDBG config file. This would overwrite the file.", file_path); } - }break; - - //- rjf: loading/applying stateful config changes - case RD_CmdKind_ApplyUserData: - case RD_CmdKind_ApplyProjectData: - { - RD_CfgTable *table = rd_cfg_table(); - OS_HandleArray monitors = os_push_monitors_array(scratch.arena); - //- rjf: get config source - RD_CfgSrc src = RD_CfgSrc_User; - for(RD_CfgSrc s = (RD_CfgSrc)0; s < RD_CfgSrc_COUNT; s = (RD_CfgSrc)(s+1)) + //- rjf: eliminate all old state under this file tree + if(file_is_okay) { - if(kind == rd_cfg_src_apply_cmd_kind_table[s]) + rd_cfg_release_all_children(file_root); + } + + //- rjf: parse the new file, generate cfg entities for it + RD_CfgList file_cfg_list = {0}; + if(file_is_okay) + { + file_cfg_list = rd_cfg_tree_list_from_string(scratch.arena, file_data); + } + + //- rjf: store path + if(file_is_okay) + { + switch(kind) { - src = s; - break; + default:{}break; + case RD_CmdKind_OpenUser: + { + arena_clear(rd_state->user_path_arena); + rd_state->user_path = push_str8_copy(rd_state->user_path_arena, file_path); + }break; + case RD_CmdKind_OpenProject: + { + arena_clear(rd_state->project_path_arena); + rd_state->project_path = push_str8_copy(rd_state->project_path_arena, file_path); + }break; } } - //- rjf: get paths - String8 cfg_path = rd_cfg_path_from_src(src); - String8 cfg_folder = str8_chop_last_slash(cfg_path); + //- rjf: insert the new cfg entities into this file tree + if(file_is_okay) + { + for(RD_CfgNode *n = file_cfg_list.first; n != 0; n = n->next) + { + rd_cfg_insert_child(file_root, file_root->last, n->v); + } + } - //- rjf: keep track of recent projects - if(src == RD_CfgSrc_Project) + //- rjf: if config did not open any windows for the user, then we need to open a sensible default + if(file_is_okay && kind == RD_CmdKind_OpenUser) + { + RD_CfgList all_user_windows = rd_cfg_child_list_from_string(scratch.arena, file_root, str8_lit("window")); + if(all_user_windows.count == 0) + { + OS_Handle monitor = os_primary_monitor(); + String8 monitor_name = os_name_from_monitor(scratch.arena, monitor); + Vec2F32 monitor_dim = os_dim_from_monitor(monitor); + F32 monitor_dpi = os_dpi_from_monitor(monitor); + Vec2F32 window_dim = v2f32(monitor_dim.x*4/5, monitor_dim.y*4/5); + RD_Cfg *new_window = rd_cfg_new(file_root, str8_lit("window")); + RD_Cfg *size = rd_cfg_new(new_window, str8_lit("size")); + rd_cfg_newf(size, "%f", window_dim.x); + rd_cfg_newf(size, "%f", window_dim.y); + F32 line_height_guess = 11.f * (monitor_dpi / 96.f); + F32 num_lines_in_monitor_height = monitor_dim.y / line_height_guess; + if(num_lines_in_monitor_height < 100) + { + rd_cmd(RD_CmdKind_ResetToCompactPanels, .window = rd_handle_from_cfg(new_window)); + } + else + { + rd_cmd(RD_CmdKind_ResetToDefaultPanels, .window = rd_handle_from_cfg(new_window)); + } + } + } + + //- rjf: record recently-opened projects in the user + if(file_is_okay && kind == RD_CmdKind_OpenProject) { RD_Cfg *user = rd_cfg_child_from_string(rd_state->root_cfg, str8_lit("user")); RD_CfgList recent_projects = rd_cfg_child_list_from_string(scratch.arena, user, str8_lit("recent_project")); RD_Cfg *recent_project = &rd_nil_cfg; for(RD_CfgNode *n = recent_projects.first; n != 0; n = n->next) { - if(path_match_normalized(n->v->string, cfg_path)) + if(path_match_normalized(n->v->string, file_path)) { recent_project = n->v; break; @@ -13204,7 +13237,7 @@ rd_frame(void) if(recent_project == &rd_nil_cfg) { recent_project = rd_cfg_new(user, str8_lit("recent_project")); - rd_cfg_new(recent_project, path_normalized_from_string(scratch.arena, cfg_path)); + rd_cfg_new(recent_project, path_normalized_from_string(scratch.arena, file_path)); } rd_cfg_unhook(user, recent_project); rd_cfg_insert_child(user, &rd_nil_cfg, recent_project); @@ -13214,636 +13247,6 @@ rd_frame(void) rd_cfg_release(recent_projects.last->v); } } - - //- rjf: apply all entities - { - for EachEnumVal(RD_EntityKind, k) - { - RD_EntityKindFlags k_flags = rd_entity_kind_flags_table[k]; - if(k_flags & RD_EntityKindFlag_IsSerializedToConfig) - { - RD_CfgVal *k_val = rd_cfg_val_from_string(table, d_entity_kind_name_lower_table[k]); - for(RD_CfgTree *k_tree = k_val->first; - k_tree != &d_nil_cfg_tree; - k_tree = k_tree->next) - { - if(k_tree->source != src) - { - continue; - } - RD_Entity *entity = rd_entity_alloc(rd_entity_root(), k); - rd_entity_equip_cfg_src(entity, k_tree->source); - - // rjf: iterate config tree - typedef struct Task Task; - struct Task - { - Task *next; - RD_Entity *entity; - MD_Node *n; - }; - Task start_task = {0, entity, k_tree->root}; - Task *first_task = &start_task; - Task *last_task = first_task; - for(Task *t = first_task; t != 0; t = t->next) - { - MD_Node *node = t->n; - for MD_EachNode(child, node->first) - { - // rjf: standalone string literals under an entity -> name - if(child->flags & MD_NodeFlag_StringLiteral && child->first == &md_nil_node) - { - String8 string = raw_from_escaped_str8(scratch.arena, child->string); - // TODO(rjf): @hack - hardcoding in the "EntityKind_Location" here - this is because - // i am assuming an entity *kind* can 'know' about the 'pathness' of a string. this is - // not the case. post-0.9.12 i need to fix this. - if(rd_entity_kind_flags_table[t->entity->kind] & RD_EntityKindFlag_NameIsPath && - t->entity->kind != RD_EntityKind_Location) - { - string = path_absolute_dst_from_relative_dst_src(scratch.arena, string, cfg_folder); - } - rd_entity_equip_name(t->entity, string); - } - - // rjf: standalone string literals under an entity, with a numeric child -> name & text location - if(child->flags & MD_NodeFlag_StringLiteral && child->first->flags & MD_NodeFlag_Numeric && child->first->first == &md_nil_node) - { - String8 string = raw_from_escaped_str8(scratch.arena, child->string); - if(rd_entity_kind_flags_table[t->entity->kind] & RD_EntityKindFlag_NameIsPath) - { - string = path_absolute_dst_from_relative_dst_src(scratch.arena, string, cfg_folder); - } - rd_entity_equip_name(t->entity, string); - S64 line = 0; - try_s64_from_str8_c_rules(child->first->string, &line); - TxtPt pt = txt_pt(line, 1); - rd_entity_equip_txt_pt(t->entity, pt); - } - - // rjf: standalone hex literals under an entity -> vaddr - if(child->flags & MD_NodeFlag_Numeric && child->first == &md_nil_node && str8_match(str8_substr(child->string, r1u64(0, 2)), str8_lit("0x"), 0)) - { - U64 vaddr = 0; - try_u64_from_str8_c_rules(child->string, &vaddr); - rd_entity_equip_vaddr(t->entity, vaddr); - } - - // rjf: specifically named entity equipment - if((str8_match(child->string, str8_lit("name"), StringMatchFlag_CaseInsensitive) || - str8_match(child->string, str8_lit("label"), StringMatchFlag_CaseInsensitive)) && - child->first != &md_nil_node) - { - String8 string = raw_from_escaped_str8(scratch.arena, child->first->string); - // TODO(rjf): @hack - hardcoding in the "EntityKind_Location" here - this is because - // i am assuming an entity *kind* can 'know' about the 'pathness' of a string. this is - // not the case. post-0.9.12 i need to fix this. - if(rd_entity_kind_flags_table[t->entity->kind] & RD_EntityKindFlag_NameIsPath && - (t->entity->kind != RD_EntityKind_Location || !md_node_is_nil(md_child_from_string(node, str8_lit("line"), 0)))) - { - string = path_absolute_dst_from_relative_dst_src(scratch.arena, string, cfg_folder); - } - rd_entity_equip_name(t->entity, string); - } - if((str8_match(child->string, str8_lit("active"), StringMatchFlag_CaseInsensitive) || - str8_match(child->string, str8_lit("enabled"), StringMatchFlag_CaseInsensitive)) && - child->first != &md_nil_node) - { - rd_entity_equip_disabled(t->entity, !str8_match(child->first->string, str8_lit("1"), 0)); - } - if(str8_match(child->string, str8_lit("disabled"), StringMatchFlag_CaseInsensitive) && child->first != &md_nil_node) - { - rd_entity_equip_disabled(t->entity, str8_match(child->first->string, str8_lit("1"), 0)); - } - if(str8_match(child->string, str8_lit("debug_subprocesses"), StringMatchFlag_CaseInsensitive) && child->first != &md_nil_node) - { - t->entity->debug_subprocesses = str8_match(child->first->string, str8_lit("1"), 0); - } - if(str8_match(child->string, str8_lit("hsva"), StringMatchFlag_CaseInsensitive) && child->first != &md_nil_node) - { - Vec4F32 hsva = {0}; - hsva.x = (F32)f64_from_str8(child->first->string); - hsva.y = (F32)f64_from_str8(child->first->next->string); - hsva.z = (F32)f64_from_str8(child->first->next->next->string); - hsva.w = (F32)f64_from_str8(child->first->next->next->next->string); - rd_entity_equip_color_hsva(t->entity, hsva); - } - if(str8_match(child->string, str8_lit("color"), StringMatchFlag_CaseInsensitive) && child->first != &md_nil_node) - { - Vec4F32 rgba = rgba_from_hex_string_4f32(child->first->string); - Vec4F32 hsva = hsva_from_rgba(rgba); - rd_entity_equip_color_hsva(t->entity, hsva); - } - if(str8_match(child->string, str8_lit("line"), StringMatchFlag_CaseInsensitive) && child->first != &md_nil_node) - { - S64 line = 0; - try_s64_from_str8_c_rules(child->first->string, &line); - TxtPt pt = txt_pt(line, 1); - rd_entity_equip_txt_pt(t->entity, pt); - } - if((str8_match(child->string, str8_lit("vaddr"), StringMatchFlag_CaseInsensitive) || - str8_match(child->string, str8_lit("addr"), StringMatchFlag_CaseInsensitive)) && - child->first != &md_nil_node) - { - U64 vaddr = 0; - try_u64_from_str8_c_rules(child->first->string, &vaddr); - rd_entity_equip_vaddr(t->entity, vaddr); - } - - // rjf: sub-entity -> create new task - RD_EntityKind sub_entity_kind = RD_EntityKind_Nil; - for EachEnumVal(RD_EntityKind, k2) - { - if(child->flags & MD_NodeFlag_Identifier && child->first != &md_nil_node && - (str8_match(child->string, d_entity_kind_name_lower_table[k2], StringMatchFlag_CaseInsensitive) || - (k2 == RD_EntityKind_Executable && str8_match(child->string, str8_lit("exe"), StringMatchFlag_CaseInsensitive)))) - { - Task *task = push_array(scratch.arena, Task, 1); - task->next = t->next; - task->entity = rd_entity_alloc(t->entity, k2); - task->n = child; - t->next = task; - break; - } - } - } - } - } - } - } - } - - //- rjf: apply exception code filters - RD_CfgVal *filter_tables = rd_cfg_val_from_string(table, str8_lit("exception_code_filters")); - for(RD_CfgTree *table = filter_tables->first; - table != &d_nil_cfg_tree; - table = table->next) - { - for MD_EachNode(rule, table->root->first) - { - String8 name = rule->string; - String8 val_string = rule->first->string; - U64 val = 0; - if(try_u64_from_str8_c_rules(val_string, &val)) - { - CTRL_ExceptionCodeKind kind = CTRL_ExceptionCodeKind_Null; - for(CTRL_ExceptionCodeKind k = (CTRL_ExceptionCodeKind)(CTRL_ExceptionCodeKind_Null+1); - k < CTRL_ExceptionCodeKind_COUNT; - k = (CTRL_ExceptionCodeKind)(k+1)) - { - if(str8_match(name, ctrl_exception_code_kind_lowercase_code_string_table[k], 0)) - { - kind = k; - break; - } - } - if(kind != CTRL_ExceptionCodeKind_Null) - { - if(val) - { - rd_state->ctrl_exception_code_filters[kind/64] |= (1ull<<(kind%64)); - } - else - { - rd_state->ctrl_exception_code_filters[kind/64] &= ~(1ull<<(kind%64)); - } - } - } - } - } - - //- rjf: apply fonts - { - FNT_Tag defaults[RD_FontSlot_COUNT] = - { - fnt_tag_from_static_data_string(&rd_default_main_font_bytes), - fnt_tag_from_static_data_string(&rd_default_code_font_bytes), - fnt_tag_from_static_data_string(&rd_icon_font_bytes), - }; - MemoryZeroArray(rd_state->cfg_font_tags); - { - RD_CfgVal *code_font_val = rd_cfg_val_from_string(table, str8_lit("code_font")); - RD_CfgVal *main_font_val = rd_cfg_val_from_string(table, str8_lit("main_font")); - MD_Node *code_font_node = code_font_val->last->root; - MD_Node *main_font_node = main_font_val->last->root; - String8 code_font_relative_path = code_font_node->first->string; - String8 main_font_relative_path = main_font_node->first->string; - if(!md_node_is_nil(code_font_node)) - { - arena_clear(rd_state->cfg_code_font_path_arena); - rd_state->cfg_code_font_path = raw_from_escaped_str8(rd_state->cfg_code_font_path_arena, code_font_relative_path); - } - if(!md_node_is_nil(main_font_node)) - { - arena_clear(rd_state->cfg_main_font_path_arena); - rd_state->cfg_main_font_path = raw_from_escaped_str8(rd_state->cfg_main_font_path_arena, main_font_relative_path); - } - String8 code_font_path = path_absolute_dst_from_relative_dst_src(scratch.arena, code_font_relative_path, cfg_folder); - String8 main_font_path = path_absolute_dst_from_relative_dst_src(scratch.arena, main_font_relative_path, cfg_folder); - if(os_file_path_exists(code_font_path) && !md_node_is_nil(code_font_node) && code_font_relative_path.size != 0) - { - rd_state->cfg_font_tags[RD_FontSlot_Code] = fnt_tag_from_path(code_font_path); - } - if(os_file_path_exists(main_font_path) && !md_node_is_nil(main_font_node) && main_font_relative_path.size != 0) - { - rd_state->cfg_font_tags[RD_FontSlot_Main] = fnt_tag_from_path(main_font_path); - } - } - for(RD_FontSlot slot = (RD_FontSlot)0; slot < RD_FontSlot_COUNT; slot = (RD_FontSlot)(slot+1)) - { - if(fnt_tag_match(fnt_tag_zero(), rd_state->cfg_font_tags[slot])) - { - rd_state->cfg_font_tags[slot] = defaults[slot]; - } - } - } - - //- rjf: build windows & panel layouts - RD_CfgVal *windows = rd_cfg_val_from_string(table, str8_lit("window")); - for(RD_CfgTree *window_tree = windows->first; - window_tree != &d_nil_cfg_tree; - window_tree = window_tree->next) - { - // rjf: skip wrong source - if(window_tree->source != src) - { - continue; - } - - // rjf: grab metadata - B32 is_fullscreen = 0; - B32 is_maximized = 0; - Axis2 top_level_split_axis = Axis2_X; - OS_Handle preferred_monitor = os_primary_monitor(); - Vec2F32 size = {0}; - F32 dpi = 0.f; - RD_SettingVal setting_vals[RD_SettingCode_COUNT] = {0}; - { - for MD_EachNode(n, window_tree->root->first) - { - if(n->flags & MD_NodeFlag_Identifier && - md_node_is_nil(n->first) && - str8_match(n->string, str8_lit("split_x"), StringMatchFlag_CaseInsensitive)) - { - top_level_split_axis = Axis2_X; - } - if(n->flags & MD_NodeFlag_Identifier && - md_node_is_nil(n->first) && - str8_match(n->string, str8_lit("split_y"), StringMatchFlag_CaseInsensitive)) - { - top_level_split_axis = Axis2_Y; - } - if(n->flags & MD_NodeFlag_Identifier && - md_node_is_nil(n->first) && - str8_match(n->string, str8_lit("fullscreen"), StringMatchFlag_CaseInsensitive)) - { - is_fullscreen = 1; - } - if(n->flags & MD_NodeFlag_Identifier && - md_node_is_nil(n->first) && - str8_match(n->string, str8_lit("maximized"), StringMatchFlag_CaseInsensitive)) - { - is_maximized = 1; - } - } - MD_Node *monitor_node = md_child_from_string(window_tree->root, str8_lit("monitor"), 0); - String8 preferred_monitor_name = monitor_node->first->string; - for(U64 idx = 0; idx < monitors.count; idx += 1) - { - String8 monitor_name = os_name_from_monitor(scratch.arena, monitors.v[idx]); - if(str8_match(monitor_name, preferred_monitor_name, StringMatchFlag_CaseInsensitive)) - { - preferred_monitor = monitors.v[idx]; - break; - } - } - Vec2F32 preferred_monitor_size = os_dim_from_monitor(preferred_monitor); - MD_Node *size_node = md_child_from_string(window_tree->root, str8_lit("size"), 0); - { - String8 x_string = size_node->first->string; - String8 y_string = size_node->first->next->string; - U64 x_u64 = 0; - U64 y_u64 = 0; - if(!try_u64_from_str8_c_rules(x_string, &x_u64)) - { - x_u64 = (U64)(preferred_monitor_size.x*2/3); - } - if(!try_u64_from_str8_c_rules(y_string, &y_u64)) - { - y_u64 = (U64)(preferred_monitor_size.y*2/3); - } - size.x = (F32)x_u64; - size.y = (F32)y_u64; - } - MD_Node *dpi_node = md_child_from_string(window_tree->root, str8_lit("dpi"), 0); - String8 dpi_string = md_string_from_children(scratch.arena, dpi_node); - dpi = f64_from_str8(dpi_string); - for EachEnumVal(RD_SettingCode, code) - { - MD_Node *code_node = md_child_from_string(window_tree->root, rd_setting_code_lower_string_table[code], 0); - if(!md_node_is_nil(code_node)) - { - S64 val_s64 = 0; - try_s64_from_str8_c_rules(code_node->first->string, &val_s64); - setting_vals[code].set = 1; - setting_vals[code].s32 = (S32)val_s64; - setting_vals[code].s32 = clamp_1s32(rd_setting_code_s32_range_table[code], setting_vals[code].s32); - } - } - } - } - - //- rjf: apply keybindings -#if 0 // TODO(rjf): @cfg - if(src == RD_CfgSrc_User) - { - rd_clear_bindings(); - } - RD_CfgVal *keybindings = rd_cfg_val_from_string(table, str8_lit("keybindings")); - for(RD_CfgTree *keybinding_set = keybindings->first; - keybinding_set != &d_nil_cfg_tree; - keybinding_set = keybinding_set->next) - { - for MD_EachNode(keybind, keybinding_set->root->first) - { - String8 cmd_name = {0}; - OS_Key key = OS_Key_Null; - MD_Node *ctrl_node = &md_nil_node; - MD_Node *shift_node = &md_nil_node; - MD_Node *alt_node = &md_nil_node; - for MD_EachNode(child, keybind->first) - { - if(str8_match(child->string, str8_lit("ctrl"), 0)) - { - ctrl_node = child; - } - else if(str8_match(child->string, str8_lit("shift"), 0)) - { - shift_node = child; - } - else if(str8_match(child->string, str8_lit("alt"), 0)) - { - alt_node = child; - } - else - { - OS_Key k = OS_Key_Null; - for EachEnumVal(OS_Key, key) - { - if(str8_match(child->string, os_g_key_cfg_string_table[key], StringMatchFlag_CaseInsensitive)) - { - k = key; - break; - } - } - if(k != OS_Key_Null) - { - key = k; - } - else - { - cmd_name = child->string; - for(U64 idx = 0; idx < ArrayCount(rd_binding_version_remap_old_name_table); idx += 1) - { - if(str8_match(rd_binding_version_remap_old_name_table[idx], child->string, StringMatchFlag_CaseInsensitive)) - { - String8 new_name = rd_binding_version_remap_new_name_table[idx]; - cmd_name = new_name; - } - } - } - } - } - if(cmd_name.size != 0 && key != OS_Key_Null) - { - OS_Modifiers flags = 0; - if(!md_node_is_nil(ctrl_node)) { flags |= OS_Modifier_Ctrl; } - if(!md_node_is_nil(shift_node)) { flags |= OS_Modifier_Shift; } - if(!md_node_is_nil(alt_node)) { flags |= OS_Modifier_Alt; } - RD_Binding binding = {key, flags}; - rd_bind_name(cmd_name, binding); - } - } - } -#endif - - //- rjf: reset theme to default - MemoryCopy(rd_state->cfg_theme_target.colors, rd_theme_preset_colors__default_dark, sizeof(rd_theme_preset_colors__default_dark)); - MemoryCopy(rd_state->cfg_theme.colors, rd_theme_preset_colors__default_dark, sizeof(rd_theme_preset_colors__default_dark)); - - //- rjf: apply theme presets - RD_CfgVal *color_preset = rd_cfg_val_from_string(table, str8_lit("color_preset")); - B32 preset_applied = 0; - if(color_preset != &d_nil_cfg_val) - { - String8 color_preset_name = color_preset->last->root->first->string; - RD_ThemePreset preset = (RD_ThemePreset)0; - B32 found_preset = 0; - for(RD_ThemePreset p = (RD_ThemePreset)0; p < RD_ThemePreset_COUNT; p = (RD_ThemePreset)(p+1)) - { - if(str8_match(color_preset_name, rd_theme_preset_code_string_table[p], StringMatchFlag_CaseInsensitive)) - { - found_preset = 1; - preset = p; - break; - } - } - if(found_preset) - { - preset_applied = 1; - MemoryCopy(rd_state->cfg_theme_target.colors, rd_theme_preset_colors_table[preset], sizeof(rd_theme_preset_colors__default_dark)); - MemoryCopy(rd_state->cfg_theme.colors, rd_theme_preset_colors_table[preset], sizeof(rd_theme_preset_colors__default_dark)); - } - } - - //- rjf: apply individual theme colors - B8 theme_color_hit[RD_ThemeColor_COUNT] = {0}; - RD_CfgVal *colors = rd_cfg_val_from_string(table, str8_lit("colors")); - for(RD_CfgTree *colors_set = colors->first; - colors_set != &d_nil_cfg_tree; - colors_set = colors_set->next) - { - for MD_EachNode(color, colors_set->root->first) - { - String8 saved_color_name = color->string; - String8List candidate_color_names = {0}; - str8_list_push(scratch.arena, &candidate_color_names, saved_color_name); - for(U64 idx = 0; idx < ArrayCount(rd_theme_color_version_remap_old_name_table); idx += 1) - { - if(str8_match(rd_theme_color_version_remap_old_name_table[idx], saved_color_name, StringMatchFlag_CaseInsensitive)) - { - str8_list_push(scratch.arena, &candidate_color_names, rd_theme_color_version_remap_new_name_table[idx]); - } - } - for(String8Node *name_n = candidate_color_names.first; name_n != 0; name_n = name_n->next) - { - String8 name = name_n->string; - RD_ThemeColor color_code = RD_ThemeColor_Null; - for(RD_ThemeColor c = RD_ThemeColor_Null; c < RD_ThemeColor_COUNT; c = (RD_ThemeColor)(c+1)) - { - if(str8_match(rd_theme_color_cfg_string_table[c], name, StringMatchFlag_CaseInsensitive)) - { - color_code = c; - break; - } - } - if(color_code != RD_ThemeColor_Null) - { - theme_color_hit[color_code] = 1; - MD_Node *hex_cfg = color->first; - String8 hex_string = hex_cfg->string; - U64 hex_val = 0; - try_u64_from_str8_c_rules(hex_string, &hex_val); - Vec4F32 color_rgba = rgba_from_u32((U32)hex_val); - rd_state->cfg_theme_target.colors[color_code] = color_rgba; - if(rd_state->frame_index <= 2) - { - rd_state->cfg_theme.colors[color_code] = color_rgba; - } - } - } - } - } - - //- rjf: no preset -> autofill all missing colors from the preset with the most similar background - if(!preset_applied) - { - RD_ThemePreset closest_preset = RD_ThemePreset_DefaultDark; - F32 closest_preset_bg_distance = 100000000; - for(RD_ThemePreset p = (RD_ThemePreset)0; p < RD_ThemePreset_COUNT; p = (RD_ThemePreset)(p+1)) - { - Vec4F32 cfg_bg = rd_state->cfg_theme_target.colors[RD_ThemeColor_BaseBackground]; - Vec4F32 pre_bg = rd_theme_preset_colors_table[p][RD_ThemeColor_BaseBackground]; - Vec4F32 diff = sub_4f32(cfg_bg, pre_bg); - Vec3F32 diff3 = diff.xyz; - F32 distance = length_3f32(diff3); - if(distance < closest_preset_bg_distance) - { - closest_preset = p; - closest_preset_bg_distance = distance; - } - } - for(RD_ThemeColor c = (RD_ThemeColor)(RD_ThemeColor_Null+1); - c < RD_ThemeColor_COUNT; - c = (RD_ThemeColor)(c+1)) - { - if(!theme_color_hit[c]) - { - rd_state->cfg_theme_target.colors[c] = rd_state->cfg_theme.colors[c] = rd_theme_preset_colors_table[closest_preset][c]; - } - } - } - - //- rjf: if theme colors are all zeroes, then set to default - config appears busted - { - B32 all_colors_are_zero = 1; - Vec4F32 zero_color = {0}; - for(RD_ThemeColor c = (RD_ThemeColor)(RD_ThemeColor_Null+1); c < RD_ThemeColor_COUNT; c = (RD_ThemeColor)(c+1)) - { - if(!MemoryMatchStruct(&rd_state->cfg_theme_target.colors[c], &zero_color)) - { - all_colors_are_zero = 0; - break; - } - } - if(all_colors_are_zero) - { - MemoryCopy(rd_state->cfg_theme_target.colors, rd_theme_preset_colors__default_dark, sizeof(rd_theme_preset_colors__default_dark)); - MemoryCopy(rd_state->cfg_theme.colors, rd_theme_preset_colors__default_dark, sizeof(rd_theme_preset_colors__default_dark)); - } - } - - //- rjf: apply settings - B8 setting_codes_hit[RD_SettingCode_COUNT] = {0}; - MemoryZero(&rd_state->cfg_setting_vals[src][0], sizeof(RD_SettingVal)*RD_SettingCode_COUNT); - for EachEnumVal(RD_SettingCode, code) - { - String8 name = rd_setting_code_lower_string_table[code]; - RD_CfgVal *code_cfg_val = rd_cfg_val_from_string(table, name); - RD_CfgTree *code_tree = code_cfg_val->last; - if(code_tree->source == src) - { - MD_Node *val_node = code_tree->root->first; - S64 val = 0; - if(try_s64_from_str8_c_rules(val_node->string, &val)) - { - rd_state->cfg_setting_vals[src][code].set = 1; - rd_state->cfg_setting_vals[src][code].s32 = (S32)val; - } - setting_codes_hit[code] = !md_node_is_nil(val_node); - } - } - - //- rjf: if config applied 0 settings, we need to do some sensible default - if(src == RD_CfgSrc_User) - { - for EachEnumVal(RD_SettingCode, code) - { - if(!setting_codes_hit[code]) - { - rd_state->cfg_setting_vals[src][code] = rd_setting_code_default_val_table[code]; - } - } - } - - //- rjf: if config opened 0 windows, we need to do some sensible default -#if 0 // TODO(rjf): @cfg - if(src == RD_CfgSrc_User && windows->first == &d_nil_cfg_tree) - { - OS_Handle preferred_monitor = os_primary_monitor(); - Vec2F32 monitor_dim = os_dim_from_monitor(preferred_monitor); - Vec2F32 window_dim = v2f32(monitor_dim.x*4/5, monitor_dim.y*4/5); - RD_Window *ws = rd_window_open(window_dim, preferred_monitor, RD_CfgSrc_User); - F32 font_size = (F32)ws->setting_vals[RD_SettingCode_MainFontSize].s32; - F32 num_lines_in_monitor_height = monitor_dim.y / font_size; - if(num_lines_in_monitor_height < 100) - { - rd_cmd(RD_CmdKind_ResetToCompactPanels, .window = rd_handle_from_window(ws)); - } - else - { - rd_cmd(RD_CmdKind_ResetToDefaultPanels, .window = rd_handle_from_window(ws)); - } - } -#endif - - //- rjf: if config bound 0 keys, we need to do some sensible default -#if 0 // TODO(rjf): @cfg - if(src == RD_CfgSrc_User && rd_state->key_map_total_count == 0) - { - for(U64 idx = 0; idx < ArrayCount(rd_default_binding_table); idx += 1) - { - RD_StringBindingPair *pair = &rd_default_binding_table[idx]; - rd_bind_name(pair->string, pair->binding); - } - } -#endif - - //- rjf: always ensure that the meta controls have bindings -#if 0 // TODO(rjf): @cfg - if(src == RD_CfgSrc_User) - { - struct - { - String8 name; - OS_Key fallback_key; - } - meta_ctrls[] = - { - { rd_cmd_kind_info_table[RD_CmdKind_Edit].string, OS_Key_F2 }, - { rd_cmd_kind_info_table[RD_CmdKind_Accept].string, OS_Key_Return }, - { rd_cmd_kind_info_table[RD_CmdKind_Cancel].string, OS_Key_Esc }, - }; - for(U64 idx = 0; idx < ArrayCount(meta_ctrls); idx += 1) - { - RD_BindingList bindings = rd_bindings_from_name(scratch.arena, meta_ctrls[idx].name); - if(bindings.count == 0) - { - RD_Binding binding = {meta_ctrls[idx].fallback_key, 0}; - rd_bind_name(meta_ctrls[idx].name, binding); - } - } - } -#endif }break; //- rjf: writing config changes @@ -17008,7 +16411,50 @@ X(getting_started) // U64 exception_code_filters[(CTRL_ExceptionCodeKind_COUNT+63)/64] = {0}; { - MemoryCopyArray(exception_code_filters, rd_state->ctrl_exception_code_filters); + Temp scratch = scratch_begin(0, 0); + for(CTRL_ExceptionCodeKind k = (CTRL_ExceptionCodeKind)0; k < CTRL_ExceptionCodeKind_COUNT; k = (CTRL_ExceptionCodeKind)(k+1)) + { + if(ctrl_exception_code_kind_default_enable_table[k]) + { + exception_code_filters[k/64] |= 1ull<<(k%64); + } + } + RD_CfgList exception_code_filters_roots = rd_cfg_top_level_list_from_string(scratch.arena, str8_lit("exception_code_filters")); + for(RD_CfgNode *n = exception_code_filters_roots.first; n != 0; n = n->next) + { + for(RD_Cfg *rule = n->v->first; rule != &rd_nil_cfg; rule = rule->next) + { + String8 name = rule->string; + String8 val_string = rule->first->string; + U64 val = 0; + if(try_u64_from_str8_c_rules(val_string, &val)) + { + CTRL_ExceptionCodeKind kind = CTRL_ExceptionCodeKind_Null; + for(CTRL_ExceptionCodeKind k = (CTRL_ExceptionCodeKind)(CTRL_ExceptionCodeKind_Null+1); + k < CTRL_ExceptionCodeKind_COUNT; + k = (CTRL_ExceptionCodeKind)(k+1)) + { + if(str8_match(name, ctrl_exception_code_kind_lowercase_code_string_table[k], 0)) + { + kind = k; + break; + } + } + if(kind != CTRL_ExceptionCodeKind_Null) + { + if(val) + { + exception_code_filters[kind/64] |= (1ull<<(kind%64)); + } + else + { + exception_code_filters[kind/64] &= ~(1ull<<(kind%64)); + } + } + } + } + } + scratch_end(scratch); } //////////////////////////// @@ -17173,31 +16619,6 @@ X(getting_started) } } - ////////////////////////////// - //- rjf: animate theme - // - { - RD_Theme *current = &rd_state->cfg_theme; - RD_Theme *target = &rd_state->cfg_theme_target; - F32 rate = 1 - pow_f32(2, (-50.f * rd_state->frame_dt)); - for(RD_ThemeColor color = RD_ThemeColor_Null; - color < RD_ThemeColor_COUNT; - color = (RD_ThemeColor)(color+1)) - { - if(abs_f32(target->colors[color].x - current->colors[color].x) > 0.01f || - abs_f32(target->colors[color].y - current->colors[color].y) > 0.01f || - abs_f32(target->colors[color].z - current->colors[color].z) > 0.01f || - abs_f32(target->colors[color].w - current->colors[color].w) > 0.01f) - { - rd_request_frame(); - } - current->colors[color].x += (target->colors[color].x - current->colors[color].x) * rate; - current->colors[color].y += (target->colors[color].y - current->colors[color].y) * rate; - current->colors[color].z += (target->colors[color].z - current->colors[color].z) * rate; - current->colors[color].w += (target->colors[color].w - current->colors[color].w) * rate; - } - } - //////////////////////////// //- rjf: rotate command slots, bump command gen counter // diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index 460e58d3..f1da382d 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -39,21 +39,6 @@ struct RD_Binding OS_Modifiers modifiers; }; -typedef struct RD_BindingNode RD_BindingNode; -struct RD_BindingNode -{ - RD_BindingNode *next; - RD_Binding binding; -}; - -typedef struct RD_BindingList RD_BindingList; -struct RD_BindingList -{ - RD_BindingNode *first; - RD_BindingNode *last; - U64 count; -}; - typedef struct RD_StringBindingPair RD_StringBindingPair; struct RD_StringBindingPair { @@ -61,6 +46,47 @@ struct RD_StringBindingPair RD_Binding binding; }; +typedef struct RD_KeyMapNode RD_KeyMapNode; +struct RD_KeyMapNode +{ + RD_KeyMapNode *name_hash_next; + RD_KeyMapNode *binding_hash_next; + struct RD_Cfg *cfg; + String8 name; + RD_Binding binding; +}; + +typedef struct RD_KeyMapNodePtr RD_KeyMapNodePtr; +struct RD_KeyMapNodePtr +{ + RD_KeyMapNodePtr *next; + RD_KeyMapNode *v; +}; + +typedef struct RD_KeyMapNodePtrList RD_KeyMapNodePtrList; +struct RD_KeyMapNodePtrList +{ + RD_KeyMapNodePtr *first; + RD_KeyMapNodePtr *last; + U64 count; +}; + +typedef struct RD_KeyMapSlot RD_KeyMapSlot; +struct RD_KeyMapSlot +{ + RD_KeyMapNode *first; + RD_KeyMapNode *last; +}; + +typedef struct RD_KeyMap RD_KeyMap; +struct RD_KeyMap +{ + U64 name_slots_count; + RD_KeyMapSlot *name_slots; + U64 binding_slots_count; + RD_KeyMapSlot *binding_slots; +}; + //////////////////////////////// //~ rjf: Evaluation Spaces @@ -68,6 +94,7 @@ typedef U64 RD_EvalSpaceKind; enum { RD_EvalSpaceKind_CtrlEntity = E_SpaceKind_FirstUserDefined, + RD_EvalSpaceKind_MetaCfg, RD_EvalSpaceKind_MetaEntity, RD_EvalSpaceKind_MetaCtrlEntity, RD_EvalSpaceKind_MetaCollection, @@ -148,7 +175,7 @@ enum typedef RD_VIEW_RULE_UI_FUNCTION_SIG(RD_ViewRuleUIFunctionType); //////////////////////////////// -//~ rjf: View Types +//~ rjf: View State Types typedef struct RD_ArenaExt RD_ArenaExt; struct RD_ArenaExt @@ -355,50 +382,6 @@ struct RD_Location String8 name; }; -//////////////////////////////// -//~ rjf: Key Map Types - -typedef struct RD_KeyMapNode RD_KeyMapNode; -struct RD_KeyMapNode -{ - RD_KeyMapNode *name_hash_next; - RD_KeyMapNode *binding_hash_next; - RD_Cfg *cfg; - String8 name; - RD_Binding binding; -}; - -typedef struct RD_KeyMapNodePtr RD_KeyMapNodePtr; -struct RD_KeyMapNodePtr -{ - RD_KeyMapNodePtr *next; - RD_KeyMapNode *v; -}; - -typedef struct RD_KeyMapNodePtrList RD_KeyMapNodePtrList; -struct RD_KeyMapNodePtrList -{ - RD_KeyMapNodePtr *first; - RD_KeyMapNodePtr *last; - U64 count; -}; - -typedef struct RD_KeyMapSlot RD_KeyMapSlot; -struct RD_KeyMapSlot -{ - RD_KeyMapNode *first; - RD_KeyMapNode *last; -}; - -typedef struct RD_KeyMap RD_KeyMap; -struct RD_KeyMap -{ - U64 name_slots_count; - RD_KeyMapSlot *name_slots; - U64 binding_slots_count; - RD_KeyMapSlot *binding_slots; -}; - //////////////////////////////// //~ rjf: New Panel Types (Queried From Config) @@ -816,6 +799,12 @@ struct RD_State B32 quit; B32 quit_after_success; + // rjf: config bucket paths + Arena *user_path_arena; + String8 user_path; + Arena *project_path_arena; + String8 project_path; + // rjf: log Log *log; String8 log_path; @@ -841,6 +830,10 @@ struct RD_State // rjf: key map (constructed from-scratch each frame) RD_KeyMap *key_map; + // rjf: theme target (constructed from-scratch each frame) + RD_Theme *theme; + RD_Theme *theme_target; + // rjf: registers stack RD_RegsNode base_regs; RD_RegsNode *top_regs; @@ -937,38 +930,12 @@ struct RD_State U64 kind_alloc_gens[RD_EntityKind_COUNT]; RD_EntityListCache kind_caches[RD_EntityKind_COUNT]; - // rjf: key map table -#if 0 // TODO(rjf): @cfg - Arena *key_map_arena; - U64 key_map_table_size; - RD_KeyMapSlot *key_map_table; - RD_KeyMapNode *free_key_map_node; - U64 key_map_total_count; -#endif - // rjf: bind change Arena *bind_change_arena; B32 bind_change_active; String8 bind_change_cmd_name; RD_Binding bind_change_binding; - // rjf: config reading state - Arena *cfg_path_arenas[RD_CfgSrc_COUNT]; - String8 cfg_paths[RD_CfgSrc_COUNT]; - U64 cfg_cached_timestamp[RD_CfgSrc_COUNT]; - Arena *cfg_arena; - RD_CfgTable cfg_table; - U64 ctrl_exception_code_filters[(CTRL_ExceptionCodeKind_COUNT+63)/64]; - - // rjf: running theme state - RD_Theme cfg_theme_target; - RD_Theme cfg_theme; - Arena *cfg_main_font_path_arena; - Arena *cfg_code_font_path_arena; - String8 cfg_main_font_path; - String8 cfg_code_font_path; - FNT_Tag cfg_font_tags[RD_FontSlot_COUNT]; // derivative from font paths - // rjf: global settings RD_SettingVal cfg_setting_vals[RD_CfgSrc_COUNT][RD_SettingCode_COUNT]; @@ -1231,6 +1198,10 @@ internal DR_FancyStringList rd_title_fstrs_from_ctrl_entity(Arena *arena, CTRL_E //////////////////////////////// //~ rjf: Evaluation Spaces +//- rjf: cfg <-> eval space +internal RD_Cfg *rd_cfg_from_eval_space(E_Space space); +internal E_Space rd_eval_space_from_cfg(RD_Cfg *cfg); + //- rjf: entity <-> eval space internal RD_Entity *rd_entity_from_eval_space(E_Space space); internal E_Space rd_eval_space_from_entity(RD_Entity *entity); @@ -1414,15 +1385,9 @@ internal void rd_request_frame(void); //- rjf: per-frame arena internal Arena *rd_frame_arena(void); -//- rjf: config paths -internal String8 rd_cfg_path_from_src(RD_CfgSrc src); - //- rjf: entity cache queries internal RD_EntityList rd_query_cached_entity_list_with_kind(RD_EntityKind kind); -//- rjf: config state -internal RD_CfgTable *rd_cfg_table(void); - //////////////////////////////// //~ rjf: Registers diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index dd7a4025..a190700b 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -6050,144 +6050,6 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(geo3d) scratch_end(scratch); } -//////////////////////////////// -//~ rjf: exception_filters @view_hook_impl - -RD_VIEW_RULE_UI_FUNCTION_DEF(exception_filters) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(0, 0); - F32 row_height_px = floor_f32(ui_top_font_size()*2.5f); - UI_ScrollPt2 scroll_pos = rd_view_scroll_pos(); - String8 query = string; - - //- rjf: get state - typedef struct RD_ExceptionFiltersViewState RD_ExceptionFiltersViewState; - struct RD_ExceptionFiltersViewState - { - Vec2S64 cursor; - }; - RD_ExceptionFiltersViewState *sv = rd_view_state(RD_ExceptionFiltersViewState); - - //- rjf: get list of options - typedef struct RD_ExceptionFiltersOption RD_ExceptionFiltersOption; - struct RD_ExceptionFiltersOption - { - String8 name; - FuzzyMatchRangeList matches; - B32 is_enabled; - CTRL_ExceptionCodeKind exception_code_kind; - }; - typedef struct RD_ExceptionFiltersOptionChunkNode RD_ExceptionFiltersOptionChunkNode; - struct RD_ExceptionFiltersOptionChunkNode - { - RD_ExceptionFiltersOptionChunkNode *next; - RD_ExceptionFiltersOption *v; - U64 cap; - U64 count; - }; - typedef struct RD_ExceptionFiltersOptionChunkList RD_ExceptionFiltersOptionChunkList; - struct RD_ExceptionFiltersOptionChunkList - { - RD_ExceptionFiltersOptionChunkNode *first; - RD_ExceptionFiltersOptionChunkNode *last; - U64 option_count; - U64 node_count; - }; - typedef struct RD_ExceptionFiltersOptionArray RD_ExceptionFiltersOptionArray; - struct RD_ExceptionFiltersOptionArray - { - RD_ExceptionFiltersOption *v; - U64 count; - }; - RD_ExceptionFiltersOptionChunkList opts_list = {0}; - for(CTRL_ExceptionCodeKind k = (CTRL_ExceptionCodeKind)(CTRL_ExceptionCodeKind_Null+1); - k < CTRL_ExceptionCodeKind_COUNT; - k = (CTRL_ExceptionCodeKind)(k+1)) - { - RD_ExceptionFiltersOptionChunkNode *node = opts_list.last; - String8 name = push_str8f(scratch.arena, "0x%x %S", ctrl_exception_code_kind_code_table[k], ctrl_exception_code_kind_display_string_table[k]); - FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, query, name); - if(matches.count >= matches.needle_part_count) - { - if(node == 0 || node->count >= node->cap) - { - node = push_array(scratch.arena, RD_ExceptionFiltersOptionChunkNode, 1); - node->cap = 256; - node->v = push_array_no_zero(scratch.arena, RD_ExceptionFiltersOption, node->cap); - SLLQueuePush(opts_list.first, opts_list.last, node); - opts_list.node_count += 1; - } - node->v[node->count].name = name; - node->v[node->count].matches = matches; - node->v[node->count].is_enabled = !!(rd_state->ctrl_exception_code_filters[k/64] & (1ull<<(k%64))); - node->v[node->count].exception_code_kind = k; - node->count += 1; - opts_list.option_count += 1; - } - } - RD_ExceptionFiltersOptionArray opts = {0}; - { - opts.count = opts_list.option_count; - opts.v = push_array_no_zero(scratch.arena, RD_ExceptionFiltersOption, opts.count); - U64 idx = 0; - for(RD_ExceptionFiltersOptionChunkNode *n = opts_list.first; n != 0; n = n->next) - { - MemoryCopy(opts.v+idx, n->v, n->count*sizeof(RD_ExceptionFiltersOption)); - idx += n->count; - } - } - - //- rjf: build option table - Rng1S64 visible_row_range = {0}; - UI_ScrollListParams scroll_list_params = {0}; - { - Vec2F32 rect_dim = dim_2f32(rect); - scroll_list_params.flags = UI_ScrollListFlag_All; - scroll_list_params.row_height_px = row_height_px; - scroll_list_params.dim_px = rect_dim; - scroll_list_params.cursor_range = r2s64(v2s64(0, 0), v2s64(0, opts.count)); - scroll_list_params.item_range = r1s64(0, opts.count); - scroll_list_params.cursor_min_is_empty_selection[Axis2_Y] = 1; - } - UI_ScrollListSignal scroll_list_sig = {0}; - UI_Focus(UI_FocusKind_On) - UI_ScrollList(&scroll_list_params, - &scroll_pos.y, - &sv->cursor, - 0, - &visible_row_range, - &scroll_list_sig) - UI_Focus(UI_FocusKind_Null) - { - for(S64 row = visible_row_range.min; row <= visible_row_range.max && row < opts.count; row += 1) - UI_FocusHot(sv->cursor.y == row+1 ? UI_FocusKind_On : UI_FocusKind_Off) - { - RD_ExceptionFiltersOption *opt = &opts.v[row]; - UI_Signal sig = rd_icon_buttonf(opt->is_enabled ? RD_IconKind_CheckFilled : RD_IconKind_CheckHollow, &opt->matches, "%S", opt->name); - if(ui_clicked(sig)) - { - if(opt->exception_code_kind != CTRL_ExceptionCodeKind_Null) - { - CTRL_ExceptionCodeKind k = opt->exception_code_kind; - if(opt->is_enabled) - { - rd_state->ctrl_exception_code_filters[k/64] &= ~(1ull<<(k%64)); - } - else - { - rd_state->ctrl_exception_code_filters[k/64] |= (1ull<<(k%64)); - } - } - } - } - } - - rd_store_view_scroll_pos(scroll_pos); - scratch_end(scratch); - ProfEnd(); -} - //////////////////////////////// //~ rjf: settings @view_hook_impl @@ -6264,6 +6126,7 @@ rd_qsort_compare_settings_item(RD_SettingsItem *a, RD_SettingsItem *b) RD_VIEW_RULE_UI_FUNCTION_DEF(settings) { +#if 0 ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); F32 row_height_px = floor_f32(ui_top_font_size()*2.5f); @@ -6888,4 +6751,5 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(settings) rd_store_view_scroll_pos(scroll_pos); scratch_end(scratch); ProfEnd(); +#endif }