mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-09-22 17:20:05 +00:00
Compare commits
143
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
56332b729f | ||
|
|
55e06d0652 | ||
|
|
0d1ccd7264 | ||
|
|
4ddb4d0fed | ||
|
|
26b8603a59 | ||
|
|
8789e763fd | ||
|
|
f30d9ceaa9 | ||
|
|
f3ca6ff9b3 | ||
|
|
d98a04ad22 | ||
|
|
69f77456b8 | ||
|
|
3edc67e19e | ||
|
|
d07ae91cb4 | ||
|
|
77190c4aa0 | ||
|
|
959550151a | ||
|
|
be252406bd | ||
|
|
2b265e7ced | ||
|
|
00ee0e58db | ||
|
|
fd0feefcf2 | ||
|
|
04def874eb | ||
|
|
94b1888073 | ||
|
|
140c8a3fee | ||
|
|
e3651c1ef4 | ||
|
|
1da1239c7c | ||
|
|
44fa806334 | ||
|
|
d4474b5a31 | ||
|
|
74fa729a58 | ||
|
|
02aa04f242 | ||
|
|
0e1869e6c9 | ||
|
|
ca9d9791d3 | ||
|
|
56df75cc20 | ||
|
|
fa981597ea | ||
|
|
87cd790f70 | ||
|
|
4e561b1b38 | ||
|
|
37a0d9e148 | ||
|
|
bac2e99f12 | ||
|
|
d5e0054a13 | ||
|
|
3b86b6f7a0 | ||
|
|
a514ec1ac7 | ||
|
|
68eacca361 | ||
|
|
bb97c185bd | ||
|
|
40fc63ca06 | ||
|
|
2c8e17be3b | ||
|
|
bae91cd40c | ||
|
|
82f86d654f | ||
|
|
e56eb077d0 | ||
|
|
abb2dd713e | ||
|
|
f50ffd17aa | ||
|
|
804a8406b9 | ||
|
|
8bf8112edd | ||
|
|
0c674066e0 | ||
|
|
7c3de4fe5b | ||
|
|
a975bf5412 | ||
|
|
1d225703ca | ||
|
|
6e5f518cf3 | ||
|
|
6a91505317 | ||
|
|
e222996b19 | ||
|
|
1705fdd421 | ||
|
|
a77d457f51 | ||
|
|
9a2ae21b89 | ||
|
|
834f4f7d20 | ||
|
|
90e1443627 | ||
|
|
ebac4ce636 | ||
|
|
e92119ebf3 | ||
|
|
aade379dce | ||
|
|
bc16710904 | ||
|
|
27deda390f | ||
|
|
89c5d22f7f | ||
|
|
7e5a80c560 | ||
|
|
4870d066b2 | ||
|
|
f4ec1e2d77 | ||
|
|
e354dc3fc7 | ||
|
|
a9e17c42d7 | ||
|
|
c018ffa317 | ||
|
|
9c6e20b391 | ||
|
|
3e413e1a2e | ||
|
|
6488a13a2e | ||
|
|
cc5ebcc756 | ||
|
|
6979d03f09 | ||
|
|
d079c679f8 | ||
|
|
b16453d7b0 | ||
|
|
a94e1b1928 | ||
|
|
58a0084024 | ||
|
|
c02e033499 | ||
|
|
fb7db06671 | ||
|
|
dc108d72c1 | ||
|
|
b283225d03 | ||
|
|
014074e3ce | ||
|
|
2a27b5af51 | ||
|
|
921b555346 | ||
|
|
f75ee24a2b | ||
|
|
862ae81b0e | ||
|
|
f11b128a07 | ||
|
|
d172b3a059 | ||
|
|
c9944d23cc | ||
|
|
f3db75a05b | ||
|
|
0bc96a086a | ||
|
|
e7046cb9d7 | ||
|
|
616897c8d6 | ||
|
|
6a7dd334ff | ||
|
|
f48d8431c0 | ||
|
|
d88000ddeb | ||
|
|
42993b3fb0 | ||
|
|
123c3104a5 | ||
|
|
f15bc3de73 | ||
|
|
c2d315d896 | ||
|
|
25ef507201 | ||
|
|
f7897aecea | ||
|
|
b1e2ca0ff8 | ||
|
|
c4242cf162 | ||
|
|
b5e604e6c8 | ||
|
|
23572ca63f | ||
|
|
cb4cc5a4f7 | ||
|
|
279daaa84a | ||
|
|
ac521a8f60 | ||
|
|
3567e6c53d | ||
|
|
d2d72bd7ab | ||
|
|
268ca9ab53 | ||
|
|
dea5e88906 | ||
|
|
25c31b0d77 | ||
|
|
ea2066063a | ||
|
|
bdecb6d522 | ||
|
|
739d0977b6 | ||
|
|
717572c202 | ||
|
|
d3931fd3e2 | ||
|
|
a0a6fc0988 | ||
|
|
7d8f0d478e | ||
|
|
d849b83acb | ||
|
|
adbe42c907 | ||
|
|
99b2d9d6d0 | ||
|
|
5c179adb68 | ||
|
|
de6c94ce8f | ||
|
|
743984c318 | ||
|
|
a026ae41f1 | ||
|
|
114dd96e50 | ||
|
|
e2e1382508 | ||
|
|
1c40afc067 | ||
|
|
79677875c4 | ||
|
|
c2e90225b9 | ||
|
|
057a6f3e8e | ||
|
|
a9ec1a05b1 | ||
|
|
2454d426ed | ||
|
|
cf58137b0f | ||
|
|
c40d0b3acc |
@@ -0,0 +1,28 @@
|
||||
name: builds
|
||||
|
||||
on:
|
||||
push:
|
||||
paths-ignore:
|
||||
- '**.md'
|
||||
pull_request:
|
||||
paths-ignore:
|
||||
- '**.md'
|
||||
|
||||
jobs:
|
||||
build-windows-2022:
|
||||
runs-on: windows-2022
|
||||
strategy:
|
||||
fail-fast: false
|
||||
steps:
|
||||
- name: checkout
|
||||
uses: actions/checkout@v2
|
||||
- name: build (vs 2022)
|
||||
shell: cmd
|
||||
run: |
|
||||
call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x64
|
||||
call build raddbg msvc debug
|
||||
call build raddbg_from_pdb msvc debug
|
||||
call build raddbg_from_dwarf msvc debug
|
||||
call build raddbg clang debug
|
||||
call build raddbg_from_pdb clang debug
|
||||
call build raddbg_from_dwarf clang debug
|
||||
@@ -41,14 +41,14 @@ if "%telemetry%"=="1" set auto_compile_flags=%auto_compile_flags% -DPROFILE_TELE
|
||||
if "%asan%"=="1" set auto_compile_flags=%auto_compile_flags% -fsanitize=address && echo [asan enabled]
|
||||
|
||||
:: --- Compile/Link Line Definitions ------------------------------------------
|
||||
set cl_common= /I..\src\ /I..\local\ /nologo /FC /Z7 /MP
|
||||
set clang_common= -I..\src\ -I..\local\ -maes -mssse3 -msse4 -gcodeview -fdiagnostics-absolute-paths -Wall -Wno-unknown-warning-option -Wno-missing-braces -Wno-unused-function -Wno-writable-strings -Wno-unused-value -Wno-unused-variable -Wno-unused-local-typedef -Wno-deprecated-register -Wno-deprecated-declarations -Wno-unused-but-set-variable -Wno-single-bit-bitfield-constant-conversion -Xclang -flto-visibility-public-std -D_USE_MATH_DEFINES -Dstrdup=_strdup -Dgnu_printf=printf
|
||||
set cl_debug= call cl /Od /D_DEBUG %cl_common%
|
||||
set cl_release= call cl /O2 /DNDEBUG %cl_common%
|
||||
set clang_debug= call clang -g -O0 -D_DEBUG %clang_common%
|
||||
set clang_release= call clang -g -O3 -DNDEBUG %clang_common%
|
||||
set cl_link= /link /natvis:"%~dp0\src\natvis\base.natvis"
|
||||
set clang_link= -Xlinker /natvis:"%~dp0\src\natvis\base.natvis"
|
||||
set cl_common= /I..\src\ /I..\local\ /nologo /FC /Z7
|
||||
set clang_common= -I..\src\ -I..\local\ -gcodeview -fdiagnostics-absolute-paths -Wall -Wno-unknown-warning-option -Wno-missing-braces -Wno-unused-function -Wno-writable-strings -Wno-unused-value -Wno-unused-variable -Wno-unused-local-typedef -Wno-deprecated-register -Wno-deprecated-declarations -Wno-unused-but-set-variable -Wno-single-bit-bitfield-constant-conversion -Xclang -flto-visibility-public-std -D_USE_MATH_DEFINES -Dstrdup=_strdup -Dgnu_printf=printf
|
||||
set cl_debug= call cl /Od %cl_common% %auto_compile_flags%
|
||||
set cl_release= call cl /O2 /DNDEBUG %cl_common% %auto_compile_flags%
|
||||
set clang_debug= call clang -g -O0 %clang_common% %auto_compile_flags%
|
||||
set clang_release= call clang -g -O3 -DNDEBUG %clang_common% %auto_compile_flags%
|
||||
set cl_link= /link /MANIFEST:EMBED /INCREMENTAL:NO /natvis:"%~dp0\src\natvis\base.natvis" logo.res
|
||||
set clang_link= -fuse-ld=lld -Xlinker /MANIFEST:EMBED -Xlinker /natvis:"%~dp0\src\natvis\base.natvis" logo.res
|
||||
set cl_out= /out:
|
||||
set clang_out= -o
|
||||
|
||||
@@ -56,6 +56,10 @@ set clang_out= -o
|
||||
set gfx=-DOS_FEATURE_GRAPHICAL=1
|
||||
set net=-DOS_FEATURE_SOCKET=1
|
||||
set link_dll=-DLL
|
||||
if "%msvc%"=="1" set only_compile=/c
|
||||
if "%clang%"=="1" set only_compile=-c
|
||||
if "%msvc%"=="1" set EHsc=/EHsc
|
||||
if "%clang%"=="1" set EHsc=
|
||||
|
||||
:: --- Choose Compile/Link Lines ----------------------------------------------
|
||||
if "%msvc%"=="1" set compile_debug=%cl_debug%
|
||||
@@ -68,31 +72,37 @@ if "%clang%"=="1" set compile_link=%clang_link%
|
||||
if "%clang%"=="1" set out=%clang_out%
|
||||
if "%debug%"=="1" set compile=%compile_debug%
|
||||
if "%release%"=="1" set compile=%compile_release%
|
||||
set compile=%compile% %auto_compile_flags%
|
||||
|
||||
:: --- Prep Directories -------------------------------------------------------
|
||||
if not exist build mkdir build
|
||||
if not exist local mkdir local
|
||||
|
||||
:: --- Produce Logo Icon File -------------------------------------------------
|
||||
pushd build
|
||||
rc /nologo /fo logo.res ..\data\logo.rc
|
||||
popd
|
||||
|
||||
:: --- Build & Run Metaprogram ------------------------------------------------
|
||||
if "%no_meta%"=="1" echo [skipping metagen]
|
||||
if not "%no_meta%"=="1" (
|
||||
pushd build
|
||||
%compile_debug% ..\src\metagen\metagen_main.c %compile_link% %out%metagen.exe
|
||||
metagen.exe
|
||||
%compile_debug% ..\src\metagen\metagen_main.c %compile_link% %out%metagen.exe || exit /b 1
|
||||
metagen.exe || exit /b 1
|
||||
popd
|
||||
)
|
||||
|
||||
:: --- Build Everything (@build_targets) --------------------------------------
|
||||
pushd build
|
||||
if "%raddbg%"=="1" %compile% %gfx% ..\src\raddbg\raddbg_main.cpp %compile_link% %out%raddbg.exe
|
||||
if "%raddbg_from_pdb%"=="1" %compile% ..\src\raddbg_convert\pdb\raddbg_from_pdb_main.c %compile_link% %out%raddbg_from_pdb.exe
|
||||
if "%raddbg_from_dwarf%"=="1" %compile% ..\src\raddbg_convert\dwarf\raddbg_from_dwarf.c %compile_link% %out%raddbg_from_dwarf.exe
|
||||
if "%raddbg_dump%"=="1" %compile% ..\src\raddbg_dump\raddbg_dump.c %compile_link% %out%raddbg_dump.exe
|
||||
if "%ryan_scratch%"=="1" %compile% ..\src\scratch\ryan_scratch.c %compile_link% %out%ryan_scratch.exe
|
||||
if "%look_at_raddbg%"=="1" %compile% ..\src\scratch\look_at_raddbg.c %compile_link% %out%look_at_raddbg.exe
|
||||
if "%mule_main%"=="1" del vc*.pdb mule*.pdb && %cl_release% /c ..\src\mule\mule_inline.cpp && %cl_release% /c ..\src\mule\mule_o2.cpp && %cl_debug% /EHsc ..\src\mule\mule_main.cpp ..\src\mule\mule_c.c mule_inline.obj mule_o2.obj
|
||||
if "%mule_module%"=="1" %compile% ..\src\mule\mule_module.cpp %compile_link% %link_dll% %out%mule_module.dll
|
||||
if "%raddbg%"=="1" %compile% %gfx% ..\src\raddbg\raddbg_main.cpp %compile_link% %out%raddbg.exe || exit /b 1
|
||||
if "%raddbg_from_pdb%"=="1" %compile% ..\src\raddbg_convert\pdb\raddbg_from_pdb_main.c %compile_link% %out%raddbg_from_pdb.exe || exit /b 1
|
||||
if "%raddbg_from_dwarf%"=="1" %compile% ..\src\raddbg_convert\dwarf\raddbg_from_dwarf.c %compile_link% %out%raddbg_from_dwarf.exe || exit /b 1
|
||||
if "%raddbg_dump%"=="1" %compile% ..\src\raddbg_dump\raddbg_dump.c %compile_link% %out%raddbg_dump.exe || exit /b 1
|
||||
if "%ryan_scratch%"=="1" %compile% ..\src\scratch\ryan_scratch.c %compile_link% %out%ryan_scratch.exe || exit /b 1
|
||||
if "%cpp_tests%"=="1" %compile% ..\src\scratch\i_hate_c_plus_plus.cpp %compile_link% %out%cpp_tests.exe || exit /b 1
|
||||
if "%look_at_raddbg%"=="1" %compile% ..\src\scratch\look_at_raddbg.c %compile_link% %out%look_at_raddbg.exe || exit /b 1
|
||||
if "%mule_main%"=="1" del vc*.pdb mule*.pdb && %compile_release% %only_compile% ..\src\mule\mule_inline.cpp && %compile_release% %only_compile% ..\src\mule\mule_o2.cpp && %compile_debug% %EHsc% ..\src\mule\mule_main.cpp ..\src\mule\mule_c.c mule_inline.obj mule_o2.obj || exit /b 1
|
||||
if "%mule_module%"=="1" %compile% ..\src\mule\mule_module.cpp %compile_link% %link_dll% %out%mule_module.dll || exit /b 1
|
||||
if "%mule_hotload%"=="1" %compile% ..\src\mule\mule_hotload_main.c %compile_link% %out%mule_hotload.exe & %compile% ..\src\mule\mule_hotload_module_main.c %compile_link% %link_dll% %out%mule_hotload_module.dll || exit /b 1
|
||||
popd
|
||||
|
||||
:: --- Unset ------------------------------------------------------------------
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 7.5 KiB |
@@ -0,0 +1 @@
|
||||
1 ICON DISCARDABLE "logo.ico"
|
||||
@@ -54,6 +54,15 @@ commands =
|
||||
.save_dirty_files = true,
|
||||
.cursor_at_end = false,
|
||||
},
|
||||
.rjf_f2 =
|
||||
{
|
||||
.win = "build raddbg_from_pdb",
|
||||
.linux = "",
|
||||
.out = "*compilation*",
|
||||
.footer_panel = true,
|
||||
.save_dirty_files = true,
|
||||
.cursor_at_end = false,
|
||||
},
|
||||
.rjf_f3 =
|
||||
{
|
||||
.win = "pushd build && raddbg.exe && popd",
|
||||
@@ -121,6 +130,7 @@ fkey_command_override =
|
||||
.rjf =
|
||||
{
|
||||
.F1 = "rjf_f1",
|
||||
.F2 = "rjf_f2",
|
||||
.F3 = "rjf_f3",
|
||||
},
|
||||
};
|
||||
|
||||
@@ -22,7 +22,7 @@ arena_alloc__sized(U64 init_res, U64 init_cmt)
|
||||
#if OS_WINDOWS
|
||||
cmt = res;
|
||||
#else
|
||||
cmt AlignPow2(init_cmt, page_size);
|
||||
cmt = AlignPow2(init_cmt, page_size);
|
||||
#endif
|
||||
|
||||
memory = os_reserve_large(res);
|
||||
|
||||
@@ -170,9 +170,6 @@
|
||||
#define DeferLoop(begin, end) for(int _i_ = ((begin), 0); !_i_; _i_ += 1, (end))
|
||||
#define DeferLoopChecked(begin, end) for(int _i_ = 2 * !(begin); (_i_ == 2 ? ((end), 0) : !_i_); _i_ += 1, (end))
|
||||
|
||||
#define B8 S8
|
||||
#define B32 rrbool
|
||||
|
||||
#if LANG_CPP
|
||||
# define zero_struct {}
|
||||
#else
|
||||
|
||||
@@ -43,6 +43,7 @@ CTRL_ExceptionCodeKindTable:
|
||||
{Win32ProcedureNotFound win32_procedure_not_found 0xc06d007f 0 "(Win32) Procedure Not Found" }
|
||||
{Win32SanitizerErrorDetected win32_sanitizer_error_detected 0xe073616e 1 "(Win32) Sanitizer Error Detected" }
|
||||
{Win32SanitizerRawAccessViolation win32_sanitizer_raw_access_violation 0xe0736171 0 "(Win32) Sanitizer Raw Access Violation" }
|
||||
{Win32DirectXDebugLayer win32_directx_debug_layer 0x0000087a 1 "(Win32) DirectX Debug Layer" }
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
|
||||
+315
-43
@@ -663,6 +663,13 @@ ctrl_memgen_idx(void)
|
||||
return result;
|
||||
}
|
||||
|
||||
internal U64
|
||||
ctrl_reggen_idx(void)
|
||||
{
|
||||
U64 result = ins_atomic_u64_eval(&ctrl_state->reggen_idx);
|
||||
return result;
|
||||
}
|
||||
|
||||
//- rjf: halt everything
|
||||
|
||||
internal void
|
||||
@@ -1062,6 +1069,7 @@ internal B32
|
||||
ctrl_thread_write_reg_block(CTRL_MachineID machine_id, CTRL_Handle thread, void *block)
|
||||
{
|
||||
B32 good = demon_write_regs(ctrl_demon_handle_from_ctrl(thread), block);
|
||||
ins_atomic_u64_inc_eval(&ctrl_state->reggen_idx);
|
||||
return good;
|
||||
}
|
||||
|
||||
@@ -1102,6 +1110,146 @@ ctrl_tls_root_vaddr_from_thread(CTRL_MachineID machine_id, CTRL_Handle thread)
|
||||
return result;
|
||||
}
|
||||
|
||||
//- rjf: process * vaddr -> module
|
||||
|
||||
internal CTRL_Handle
|
||||
ctrl_module_from_process_vaddr(CTRL_MachineID machine_id, CTRL_Handle process, U64 vaddr)
|
||||
{
|
||||
CTRL_Handle handle = {0};
|
||||
{
|
||||
Temp scratch = scratch_begin(0, 0);
|
||||
DEMON_HandleArray modules = demon_modules_from_process(scratch.arena, ctrl_demon_handle_from_ctrl(process));
|
||||
for(U64 idx = 0; idx < modules.count; idx += 1)
|
||||
{
|
||||
DEMON_Handle m = modules.handles[idx];
|
||||
Rng1U64 m_vaddr_rng = demon_vaddr_range_from_module(m);
|
||||
if(contains_1u64(m_vaddr_rng, vaddr))
|
||||
{
|
||||
handle = ctrl_handle_from_demon(m);
|
||||
break;
|
||||
}
|
||||
}
|
||||
scratch_end(scratch);
|
||||
}
|
||||
return handle;
|
||||
}
|
||||
|
||||
//- rjf: unwinding
|
||||
|
||||
internal CTRL_Unwind
|
||||
ctrl_unwind_from_process_thread(Arena *arena, CTRL_MachineID machine_id, CTRL_Handle process, CTRL_Handle thread)
|
||||
{
|
||||
ProfBeginFunction();
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
DBGI_Scope *scope = dbgi_scope_open();
|
||||
Architecture arch = demon_arch_from_object(ctrl_demon_handle_from_ctrl(thread));
|
||||
U64 arch_reg_block_size = regs_block_size_from_architecture(arch);
|
||||
CTRL_Unwind unwind = {0};
|
||||
unwind.error = 1;
|
||||
switch(arch)
|
||||
{
|
||||
default:{}break;
|
||||
case Architecture_x64:
|
||||
{
|
||||
// rjf: grab initial register block
|
||||
void *regs_block = push_array(scratch.arena, U8, arch_reg_block_size);
|
||||
B32 regs_block_good = 0;
|
||||
{
|
||||
void *regs_raw = ctrl_reg_block_from_thread(machine_id, thread);
|
||||
if(regs_raw != 0)
|
||||
{
|
||||
MemoryCopy(regs_block, regs_raw, arch_reg_block_size);
|
||||
regs_block_good = 1;
|
||||
}
|
||||
}
|
||||
|
||||
// rjf: grab initial memory view
|
||||
B32 stack_memview_good = 0;
|
||||
UNW_MemView stack_memview = {0};
|
||||
if(regs_block_good)
|
||||
{
|
||||
U64 stack_base_unrounded = demon_stack_base_vaddr_from_thread(ctrl_demon_handle_from_ctrl(thread));
|
||||
U64 stack_top_unrounded = regs_rsp_from_arch_block(arch, regs_block);
|
||||
U64 stack_base = AlignPow2(stack_base_unrounded, KB(4));
|
||||
U64 stack_top = AlignDownPow2(stack_top_unrounded, KB(4));
|
||||
U64 stack_size = stack_base - stack_top;
|
||||
if(stack_base >= stack_top)
|
||||
{
|
||||
String8 stack_memory = {0};
|
||||
stack_memory.str = push_array_no_zero(scratch.arena, U8, stack_size);
|
||||
stack_memory.size = ctrl_process_read(machine_id, process, r1u64(stack_top, stack_top+stack_size), stack_memory.str);
|
||||
if(stack_memory.size != 0)
|
||||
{
|
||||
stack_memview_good = 1;
|
||||
stack_memview.data = stack_memory.str;
|
||||
stack_memview.addr_first = stack_top;
|
||||
stack_memview.addr_opl = stack_base;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// rjf: loop & unwind
|
||||
UNW_MemView memview = stack_memview;
|
||||
if(stack_memview_good) for(;;)
|
||||
{
|
||||
unwind.error = 0;
|
||||
|
||||
// rjf: regs -> rip*module*binary
|
||||
U64 rip = regs_rip_from_arch_block(arch, regs_block);
|
||||
CTRL_Handle module = ctrl_module_from_process_vaddr(machine_id, process, rip);
|
||||
|
||||
// rjf: cancel on 0 rip
|
||||
if(rip == 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
// rjf: binary -> all the binary info
|
||||
String8 binary_full_path = demon_full_path_from_module(scratch.arena, ctrl_demon_handle_from_ctrl(module));
|
||||
DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, binary_full_path, 0);
|
||||
String8 binary_data = str8((U8 *)dbgi->exe_base, dbgi->exe_props.size);
|
||||
|
||||
// rjf: cancel on bad data
|
||||
if(binary_data.size == 0)
|
||||
{
|
||||
unwind.error = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
// rjf: valid step -> push frame
|
||||
CTRL_UnwindFrame *frame = push_array(arena, CTRL_UnwindFrame, 1);
|
||||
frame->rip = rip;
|
||||
frame->regs = push_array_no_zero(arena, U8, arch_reg_block_size);
|
||||
MemoryCopy(frame->regs, regs_block, arch_reg_block_size);
|
||||
SLLQueuePush(unwind.first, unwind.last, frame);
|
||||
unwind.count += 1;
|
||||
|
||||
// rjf: unwind one step
|
||||
UNW_Result unwind_step = unw_pe_x64(binary_data, &dbgi->pe, demon_vaddr_range_from_module(ctrl_demon_handle_from_ctrl(module)).min, &memview, (UNW_X64_Regs *)regs_block);
|
||||
|
||||
// rjf: cancel on bad step
|
||||
if(unwind_step.dead != 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
if(unwind_step.missed_read != 0)
|
||||
{
|
||||
unwind.error = 1;
|
||||
break;
|
||||
}
|
||||
if(unwind_step.stack_pointer == 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}break;
|
||||
}
|
||||
dbgi_scope_close(scope);
|
||||
scratch_end(scratch);
|
||||
ProfEnd();
|
||||
return unwind;
|
||||
}
|
||||
|
||||
//- rjf: name -> register/alias hash tables, for eval
|
||||
|
||||
internal EVAL_String2NumMap *
|
||||
@@ -1366,6 +1514,7 @@ ctrl_thread__next_demon_event(Arena *arena, CTRL_Msg *msg, DEMON_RunCtrls *run_c
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
|
||||
//- rjf: loop -> try to get event, run, repeat
|
||||
U64 spoof_old_ip_value = 0;
|
||||
ProfScope("loop -> try to get event, run, repeat") for(B32 got_event = 0; got_event == 0;)
|
||||
{
|
||||
//- rjf: get next event
|
||||
@@ -1410,6 +1559,67 @@ ctrl_thread__next_demon_event(Arena *arena, CTRL_Msg *msg, DEMON_RunCtrls *run_c
|
||||
should_filter_event = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// rjf: special case: be gracious with ASan modules or symbols if
|
||||
// they do their cute little 0xc0000005 exception trick...
|
||||
if(!should_filter_event && ev->code == 0xc0000005 &&
|
||||
(spoof == 0 || ev->instruction_pointer != spoof->new_ip_value))
|
||||
{
|
||||
DBGI_Scope *scope = dbgi_scope_open();
|
||||
DEMON_HandleArray modules = demon_modules_from_process(scratch.arena, ev->process);
|
||||
if(modules.count != 0)
|
||||
{
|
||||
// rjf: determine base address of asan shadow space
|
||||
U64 asan_shadow_base_vaddr = 0;
|
||||
B32 asan_shadow_variable_exists_but_is_zero = 0;
|
||||
CTRL_Handle module = ctrl_handle_from_demon(modules.handles[0]);
|
||||
String8 module_path = demon_full_path_from_module(scratch.arena, ctrl_demon_handle_from_ctrl(module));
|
||||
DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, module_path, max_U64);
|
||||
RADDBG_Parsed *rdbg = &dbgi->rdbg;
|
||||
RADDBG_NameMap *unparsed_map = raddbg_name_map_from_kind(rdbg, RADDBG_NameMapKind_GlobalVariables);
|
||||
if(rdbg->global_variables != 0 && unparsed_map != 0)
|
||||
{
|
||||
RADDBG_ParsedNameMap map = {0};
|
||||
raddbg_name_map_parse(rdbg, unparsed_map, &map);
|
||||
String8 name = str8_lit("__asan_shadow_memory_dynamic_address");
|
||||
RADDBG_NameMapNode *node = raddbg_name_map_lookup(rdbg, &map, name.str, name.size);
|
||||
if(node != 0)
|
||||
{
|
||||
U32 id_count = 0;
|
||||
U32 *ids = raddbg_matches_from_map_node(rdbg, node, &id_count);
|
||||
if(id_count > 0 && 0 < ids[0] && ids[0] < rdbg->global_variable_count)
|
||||
{
|
||||
RADDBG_GlobalVariable *global_var = &rdbg->global_variables[ids[0]];
|
||||
U64 global_var_voff = global_var->voff;
|
||||
U64 global_var_vaddr = global_var->voff + demon_base_vaddr_from_module(ctrl_demon_handle_from_ctrl(module));
|
||||
Architecture arch = demon_arch_from_object(ev->thread);
|
||||
U64 addr_size = bit_size_from_arch(arch)/8;
|
||||
ctrl_process_read(CTRL_MachineID_Client, ctrl_handle_from_demon(ev->process), r1u64(global_var_vaddr, global_var_vaddr+addr_size), &asan_shadow_base_vaddr);
|
||||
asan_shadow_variable_exists_but_is_zero = (asan_shadow_base_vaddr == 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// rjf: determine if this was a read/write to the shadow space
|
||||
B32 violation_in_shadow_space = 0;
|
||||
if(asan_shadow_base_vaddr != 0)
|
||||
{
|
||||
U64 asan_shadow_space_size = TB(128)/8;
|
||||
if(asan_shadow_base_vaddr <= ev->address && ev->address < asan_shadow_base_vaddr+asan_shadow_space_size)
|
||||
{
|
||||
violation_in_shadow_space = 1;
|
||||
}
|
||||
}
|
||||
|
||||
// rjf: filter event if this violation occurred in asan's shadow space
|
||||
if(violation_in_shadow_space || asan_shadow_variable_exists_but_is_zero)
|
||||
{
|
||||
should_filter_event = 1;
|
||||
}
|
||||
}
|
||||
|
||||
dbgi_scope_close(scope);
|
||||
}
|
||||
}break;
|
||||
}
|
||||
}
|
||||
@@ -1437,7 +1647,6 @@ ctrl_thread__next_demon_event(Arena *arena, CTRL_Msg *msg, DEMON_RunCtrls *run_c
|
||||
{
|
||||
// rjf: prep spoof
|
||||
B32 do_spoof = (spoof != 0 && run_ctrls->single_step_thread == 0);
|
||||
U64 spoof_old_ip_value = 0;
|
||||
U64 size_of_spoof = 0;
|
||||
if(do_spoof) ProfScope("prep spoof")
|
||||
{
|
||||
@@ -1479,14 +1688,27 @@ ctrl_thread__next_demon_event(Arena *arena, CTRL_Msg *msg, DEMON_RunCtrls *run_c
|
||||
demon_write_memory(ctrl_demon_handle_from_ctrl(spoof->process), spoof->vaddr, &spoof_old_ip_value, size_of_spoof);
|
||||
}
|
||||
|
||||
// rjf: inc run idx & memgen idx
|
||||
// rjf: inc generation counters
|
||||
{
|
||||
ins_atomic_u64_inc_eval(&ctrl_state->run_idx);
|
||||
ins_atomic_u64_inc_eval(&ctrl_state->memgen_idx);
|
||||
ins_atomic_u64_inc_eval(&ctrl_state->reggen_idx);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//- rjf: irrespective of what event came back, we should ALWAYS check the
|
||||
// spoof's thread and see if it hit the spoof address, because we may have
|
||||
// simply been sent other debug events first
|
||||
if(spoof != 0)
|
||||
{
|
||||
U64 spoof_thread_rip = demon_read_ip(ctrl_demon_handle_from_ctrl(spoof->thread));
|
||||
if(spoof_thread_rip == spoof->new_ip_value)
|
||||
{
|
||||
demon_write_ip(ctrl_demon_handle_from_ctrl(spoof->thread), spoof_old_ip_value);
|
||||
}
|
||||
}
|
||||
|
||||
//- rjf: push ctrl events associated with this demon event
|
||||
CTRL_EventList evts = {0};
|
||||
ProfScope("push ctrl events associated with this demon event") switch(event->kind)
|
||||
@@ -1649,6 +1871,14 @@ ctrl_thread__launch_and_handshake(CTRL_Msg *msg)
|
||||
}
|
||||
U32 id = demon_launch_process(&opts);
|
||||
|
||||
//- rjf: record start
|
||||
{
|
||||
CTRL_EventList evts = {0};
|
||||
CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts);
|
||||
event->kind = CTRL_EventKind_Started;
|
||||
ctrl_c2u_push_events(&evts);
|
||||
}
|
||||
|
||||
//- rjf: run to handshake
|
||||
DEMON_Event *stop_event = 0;
|
||||
if(id != 0)
|
||||
@@ -1698,6 +1928,24 @@ ctrl_thread__launch_and_handshake(CTRL_Msg *msg)
|
||||
ctrl_c2u_push_events(&evts);
|
||||
}
|
||||
|
||||
//- rjf: record stop
|
||||
{
|
||||
CTRL_EventList evts = {0};
|
||||
CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts);
|
||||
event->kind = CTRL_EventKind_Stopped;
|
||||
if(stop_event != 0)
|
||||
{
|
||||
event->cause = ctrl_event_cause_from_demon_event_kind(stop_event->kind);
|
||||
event->machine_id = CTRL_MachineID_Client;
|
||||
event->entity = ctrl_handle_from_demon(stop_event->thread);
|
||||
event->parent = ctrl_handle_from_demon(stop_event->process);
|
||||
event->exception_code = stop_event->code;
|
||||
event->vaddr_rng = r1u64(stop_event->address, stop_event->address);
|
||||
event->rip_vaddr = stop_event->instruction_pointer;
|
||||
}
|
||||
ctrl_c2u_push_events(&evts);
|
||||
}
|
||||
|
||||
//- rjf: push request resolution event
|
||||
{
|
||||
CTRL_EventList evts = {0};
|
||||
@@ -1731,6 +1979,14 @@ ctrl_thread__launch_and_init(CTRL_Msg *msg)
|
||||
}
|
||||
U32 id = demon_launch_process(&opts);
|
||||
|
||||
//- rjf: record start
|
||||
{
|
||||
CTRL_EventList evts = {0};
|
||||
CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts);
|
||||
event->kind = CTRL_EventKind_Started;
|
||||
ctrl_c2u_push_events(&evts);
|
||||
}
|
||||
|
||||
//- rjf: run to initialization (entry point)
|
||||
DEMON_Event *stop_event = 0;
|
||||
if(id != 0)
|
||||
@@ -1821,6 +2077,8 @@ ctrl_thread__launch_and_init(CTRL_Msg *msg)
|
||||
str8_lit("wmain"),
|
||||
str8_lit("WinMainCRTStartup"),
|
||||
str8_lit("wWinMainCRTStartup"),
|
||||
str8_lit("mainCRTStartup"),
|
||||
str8_lit("wmainCRTStartup"),
|
||||
};
|
||||
|
||||
// rjf: find voff for one of the custom entry points attached to this msg
|
||||
@@ -1944,6 +2202,24 @@ ctrl_thread__launch_and_init(CTRL_Msg *msg)
|
||||
ctrl_c2u_push_events(&evts);
|
||||
}
|
||||
|
||||
//- rjf: record stop
|
||||
{
|
||||
CTRL_EventList evts = {0};
|
||||
CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts);
|
||||
event->kind = CTRL_EventKind_Stopped;
|
||||
if(stop_event != 0)
|
||||
{
|
||||
event->cause = ctrl_event_cause_from_demon_event_kind(stop_event->kind);
|
||||
event->machine_id = CTRL_MachineID_Client;
|
||||
event->entity = ctrl_handle_from_demon(stop_event->thread);
|
||||
event->parent = ctrl_handle_from_demon(stop_event->process);
|
||||
event->exception_code = stop_event->code;
|
||||
event->vaddr_rng = r1u64(stop_event->address, stop_event->address);
|
||||
event->rip_vaddr = stop_event->instruction_pointer;
|
||||
}
|
||||
ctrl_c2u_push_events(&evts);
|
||||
}
|
||||
|
||||
//- rjf: push request resolution event
|
||||
{
|
||||
CTRL_EventList evts = {0};
|
||||
@@ -2122,10 +2398,14 @@ ctrl_thread__run(CTRL_Msg *msg)
|
||||
DEMON_Handle target_process = ctrl_demon_handle_from_ctrl(msg->parent);
|
||||
U64 spoof_ip_vaddr = 911;
|
||||
|
||||
//////////////////////////////
|
||||
//- rjf: gather processes
|
||||
//
|
||||
DEMON_HandleArray processes = demon_all_processes(scratch.arena);
|
||||
|
||||
//////////////////////////////
|
||||
//- rjf: gather all initial breakpoints
|
||||
//
|
||||
DEMON_TrapChunkList user_traps = {0};
|
||||
{
|
||||
// rjf: resolve module-dependent user bps
|
||||
@@ -2147,6 +2427,7 @@ ctrl_thread__run(CTRL_Msg *msg)
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////
|
||||
//- rjf: single step "stuck threads"
|
||||
//
|
||||
// "Stuck threads" are threads that are already on a User BP and would hit
|
||||
@@ -2251,7 +2532,9 @@ ctrl_thread__run(CTRL_Msg *msg)
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////
|
||||
//- rjf: resolve trap net
|
||||
//
|
||||
DEMON_TrapChunkList trap_net_traps = {0};
|
||||
for(CTRL_TrapNode *node = msg->traps.first;
|
||||
node != 0;
|
||||
@@ -2261,14 +2544,18 @@ ctrl_thread__run(CTRL_Msg *msg)
|
||||
demon_trap_chunk_list_push(scratch.arena, &trap_net_traps, 256, &trap);
|
||||
}
|
||||
|
||||
//////////////////////////////
|
||||
//- rjf: join user breakpoints and trap net traps
|
||||
//
|
||||
DEMON_TrapChunkList joined_traps = {0};
|
||||
{
|
||||
demon_trap_chunk_list_concat_shallow_copy(scratch.arena, &joined_traps, &user_traps);
|
||||
demon_trap_chunk_list_concat_shallow_copy(scratch.arena, &joined_traps, &trap_net_traps);
|
||||
}
|
||||
|
||||
//////////////////////////////
|
||||
//- rjf: record start
|
||||
//
|
||||
if(stop_event == 0)
|
||||
{
|
||||
CTRL_EventList evts = {0};
|
||||
@@ -2277,31 +2564,37 @@ ctrl_thread__run(CTRL_Msg *msg)
|
||||
ctrl_c2u_push_events(&evts);
|
||||
}
|
||||
|
||||
//////////////////////////////
|
||||
//- rjf: run loop
|
||||
//
|
||||
if(stop_event == 0)
|
||||
{
|
||||
U64 sp_check_value = demon_read_sp(target_thread);
|
||||
B32 spoof_mode = 0;
|
||||
CTRL_Spoof spoof = {0};
|
||||
U64 spoof_1_return_ip = 0;
|
||||
|
||||
for(;;)
|
||||
{
|
||||
//////////////////////////
|
||||
//- rjf: choose low level traps
|
||||
//
|
||||
DEMON_TrapChunkList *trap_list = &joined_traps;
|
||||
if(spoof_mode)
|
||||
{
|
||||
trap_list = &user_traps;
|
||||
}
|
||||
|
||||
//////////////////////////
|
||||
//- rjf: choose spoof
|
||||
//
|
||||
CTRL_Spoof *run_spoof = 0;
|
||||
if(spoof_mode)
|
||||
{
|
||||
run_spoof = &spoof;
|
||||
}
|
||||
|
||||
//////////////////////////
|
||||
//- rjf: setup run controls
|
||||
//
|
||||
DEMON_RunCtrls run_ctrls = {0};
|
||||
run_ctrls.ignore_previous_exception = 1;
|
||||
run_ctrls.run_entity_count = msg->freeze_state_threads.count;
|
||||
@@ -2315,12 +2608,16 @@ ctrl_thread__run(CTRL_Msg *msg)
|
||||
idx += 1;
|
||||
}
|
||||
}
|
||||
run_ctrls.traps = *trap_list;
|
||||
run_ctrls.traps = *trap_list;
|
||||
|
||||
//- rjf: get an event
|
||||
//////////////////////////
|
||||
//- rjf: get next event
|
||||
//
|
||||
DEMON_Event *event = ctrl_thread__next_demon_event(scratch.arena, msg, &run_ctrls, run_spoof);
|
||||
|
||||
//////////////////////////
|
||||
//- rjf: determine event handling
|
||||
//
|
||||
B32 hard_stop = 0;
|
||||
CTRL_EventCause hard_stop_cause = ctrl_event_cause_from_demon_event_kind(event->kind);
|
||||
B32 use_stepping_logic = 0;
|
||||
@@ -2354,7 +2651,9 @@ ctrl_thread__run(CTRL_Msg *msg)
|
||||
}break;
|
||||
}
|
||||
|
||||
//////////////////////////
|
||||
//- rjf: unpack info about thread attached to event
|
||||
//
|
||||
Architecture arch = demon_arch_from_object(event->thread);
|
||||
U64 reg_size = regs_block_size_from_architecture(arch);
|
||||
void *thread_regs_block = demon_read_regs(event->thread);
|
||||
@@ -2380,11 +2679,14 @@ ctrl_thread__run(CTRL_Msg *msg)
|
||||
temp_end(temp);
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
//- rjf: stepping logic -//
|
||||
//////////////////////////
|
||||
//- rjf: stepping logic
|
||||
//
|
||||
//{
|
||||
|
||||
//////////////////////////
|
||||
//- rjf: handle if hitting a spoof or baked in trap
|
||||
//
|
||||
B32 hit_spoof = 0;
|
||||
B32 exception_stop = 0;
|
||||
if(use_stepping_logic)
|
||||
@@ -2409,28 +2711,9 @@ ctrl_thread__run(CTRL_Msg *msg)
|
||||
}
|
||||
}
|
||||
|
||||
//- TODO(rjf): Jeff is hitting a bug where a spoof IP (911) has been
|
||||
// hit by a thread, !!!BUT!!! we seemingly don't catch that until a
|
||||
// subsequent run of this loop, probably because there are other
|
||||
// events in the queue that we report first, losing all state about
|
||||
// spoof mode.
|
||||
//
|
||||
// I'm throwing in some detection for this case, so that we can diagnose
|
||||
// it further from there.
|
||||
//
|
||||
if(event->kind == DEMON_EventKind_Exception &&
|
||||
event->instruction_pointer == 911 &&
|
||||
(hit_spoof == 0 || spoof_mode == 0))
|
||||
{
|
||||
os_graphical_message(1, str8_lit("RADDBG INTERNAL DEVELOPMENT MESSAGE"), str8_lit("a bad, rare bug that Jeff found has been detected to occur - attach with debugger now"));
|
||||
}
|
||||
|
||||
//- rjf: handle spoof hit
|
||||
if(hit_spoof)
|
||||
{
|
||||
// rjf: restore 1 ip
|
||||
demon_write_ip(target_thread, spoof_1_return_ip);
|
||||
|
||||
// rjf: clear spoof mode
|
||||
spoof_mode = 0;
|
||||
MemoryZeroStruct(&spoof);
|
||||
@@ -2673,15 +2956,12 @@ ctrl_thread__run(CTRL_Msg *msg)
|
||||
{
|
||||
// rjf: setup spoof mode
|
||||
begin_spoof_mode = 1;
|
||||
|
||||
U64 spoof_sp = demon_read_sp(target_thread);
|
||||
spoof_mode = 1;
|
||||
spoof.process = ctrl_handle_from_demon(target_process);
|
||||
spoof.thread = ctrl_handle_from_demon(target_thread);
|
||||
spoof.vaddr = spoof_sp;
|
||||
spoof.new_ip_value = spoof_ip_vaddr;
|
||||
|
||||
// rjf: remember 1 return ip
|
||||
demon_read_memory(target_process, &spoof_1_return_ip, spoof_sp, sizeof(spoof_1_return_ip));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2715,7 +2995,8 @@ ctrl_thread__run(CTRL_Msg *msg)
|
||||
}
|
||||
|
||||
//}
|
||||
//- rjf: stepping logic -//
|
||||
//
|
||||
//- rjf: stepping logic
|
||||
////////////////////////////////
|
||||
|
||||
//- rjf: handle step past trap net
|
||||
@@ -2786,20 +3067,11 @@ ctrl_thread__run(CTRL_Msg *msg)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//- rjf: unstick silently-hit spoofs
|
||||
if(stop_event != 0 && stop_event->thread != target_thread && spoof_mode != 0)
|
||||
{
|
||||
U64 target_thread_rip = demon_read_ip(target_thread);
|
||||
if(target_thread_rip == spoof.new_ip_value)
|
||||
{
|
||||
// rjf: restore 1 ip
|
||||
demon_write_ip(target_thread, spoof_1_return_ip);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////
|
||||
//- rjf: record stop
|
||||
//
|
||||
if(stop_event != 0)
|
||||
{
|
||||
CTRL_EventList evts = {0};
|
||||
|
||||
@@ -46,6 +46,26 @@ struct CTRL_MachineIDHandlePairList
|
||||
U64 count;
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Unwind Types
|
||||
|
||||
typedef struct CTRL_UnwindFrame CTRL_UnwindFrame;
|
||||
struct CTRL_UnwindFrame
|
||||
{
|
||||
CTRL_UnwindFrame *next;
|
||||
U64 rip;
|
||||
void *regs;
|
||||
};
|
||||
|
||||
typedef struct CTRL_Unwind CTRL_Unwind;
|
||||
struct CTRL_Unwind
|
||||
{
|
||||
CTRL_UnwindFrame *first;
|
||||
CTRL_UnwindFrame *last;
|
||||
U64 count;
|
||||
B32 error;
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Trap Types
|
||||
|
||||
@@ -85,6 +105,7 @@ typedef struct CTRL_Spoof CTRL_Spoof;
|
||||
struct CTRL_Spoof
|
||||
{
|
||||
CTRL_Handle process;
|
||||
CTRL_Handle thread;
|
||||
U64 vaddr;
|
||||
U64 new_ip_value;
|
||||
};
|
||||
@@ -401,6 +422,7 @@ struct CTRL_State
|
||||
CTRL_WakeupFunctionType *wakeup_hook;
|
||||
U64 run_idx;
|
||||
U64 memgen_idx;
|
||||
U64 reggen_idx;
|
||||
|
||||
// rjf: name -> register/alias hash tables for eval
|
||||
EVAL_String2NumMap arch_string2reg_tables[Architecture_COUNT];
|
||||
@@ -522,6 +544,7 @@ internal CTRL_Event ctrl_event_from_serialized_string(Arena *arena, String8 stri
|
||||
//- rjf: run index
|
||||
internal U64 ctrl_run_idx(void);
|
||||
internal U64 ctrl_memgen_idx(void);
|
||||
internal U64 ctrl_reggen_idx(void);
|
||||
|
||||
//- rjf: halt everything
|
||||
internal void ctrl_halt(void);
|
||||
@@ -549,6 +572,12 @@ internal U64 ctrl_rip_from_thread(CTRL_MachineID machine_id, CTRL_Handle thread)
|
||||
internal B32 ctrl_thread_write_rip(CTRL_MachineID machine_id, CTRL_Handle thread, U64 rip);
|
||||
internal U64 ctrl_tls_root_vaddr_from_thread(CTRL_MachineID machine_id, CTRL_Handle thread);
|
||||
|
||||
//- rjf: process * vaddr -> module
|
||||
internal CTRL_Handle ctrl_module_from_process_vaddr(CTRL_MachineID machine_id, CTRL_Handle process, U64 vaddr);
|
||||
|
||||
//- rjf: unwinding
|
||||
internal CTRL_Unwind ctrl_unwind_from_thread(Arena *arena, CTRL_MachineID machine_id, CTRL_Handle thread);
|
||||
|
||||
//- rjf: name -> register/alias hash tables, for eval
|
||||
internal EVAL_String2NumMap *ctrl_string2reg_from_arch(Architecture arch);
|
||||
internal EVAL_String2NumMap *ctrl_string2alias_from_arch(Architecture arch);
|
||||
|
||||
@@ -45,6 +45,7 @@ CTRL_ExceptionCodeKind_Win32ModuleNotFound,
|
||||
CTRL_ExceptionCodeKind_Win32ProcedureNotFound,
|
||||
CTRL_ExceptionCodeKind_Win32SanitizerErrorDetected,
|
||||
CTRL_ExceptionCodeKind_Win32SanitizerRawAccessViolation,
|
||||
CTRL_ExceptionCodeKind_Win32DirectXDebugLayer,
|
||||
CTRL_ExceptionCodeKind_COUNT
|
||||
} CTRL_ExceptionCodeKind;
|
||||
|
||||
@@ -87,6 +88,7 @@ U32 ctrl_exception_code_kind_code_table[] =
|
||||
0xc06d007f,
|
||||
0xe073616e,
|
||||
0xe0736171,
|
||||
0x0000087a,
|
||||
};
|
||||
|
||||
String8 ctrl_exception_code_kind_display_string_table[] =
|
||||
@@ -128,6 +130,7 @@ str8_lit_comp("(Win32) Module Not Found"),
|
||||
str8_lit_comp("(Win32) Procedure Not Found"),
|
||||
str8_lit_comp("(Win32) Sanitizer Error Detected"),
|
||||
str8_lit_comp("(Win32) Sanitizer Raw Access Violation"),
|
||||
str8_lit_comp("(Win32) DirectX Debug Layer"),
|
||||
};
|
||||
|
||||
String8 ctrl_exception_code_kind_lowercase_code_string_table[] =
|
||||
@@ -169,6 +172,7 @@ str8_lit_comp("win32_module_not_found"),
|
||||
str8_lit_comp("win32_procedure_not_found"),
|
||||
str8_lit_comp("win32_sanitizer_error_detected"),
|
||||
str8_lit_comp("win32_sanitizer_raw_access_violation"),
|
||||
str8_lit_comp("win32_directx_debug_layer"),
|
||||
};
|
||||
|
||||
B8 ctrl_exception_code_kind_default_enable_table[] =
|
||||
@@ -210,6 +214,7 @@ B8 ctrl_exception_code_kind_default_enable_table[] =
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
1,
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -263,6 +263,7 @@ internal DASM_InstArray
|
||||
dasm_inst_array_from_handle(Arena *arena, DASM_Handle handle, U64 endt_us)
|
||||
{
|
||||
DASM_InstArray result = {0};
|
||||
if(handle.u64[0] != 0 || handle.u64[1] != 0)
|
||||
{
|
||||
U64 hash = handle.u64[0];
|
||||
U64 id = handle.u64[1];
|
||||
|
||||
+82
-75
@@ -44,7 +44,6 @@ dbgi_init(void)
|
||||
{
|
||||
dbgi_shared->parse_threads[idx] = os_launch_thread(dbgi_parse_thread_entry_point, (void *)idx, 0);
|
||||
}
|
||||
dbgi_shared->evictor_thread = os_launch_thread(dbgi_evictor_thread_entry_point, 0, 0);
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
@@ -253,9 +252,34 @@ dbgi_binary_close(String8 exe_path)
|
||||
break;
|
||||
}
|
||||
}
|
||||
B32 need_deletion = 0;
|
||||
if(binary != 0 && binary->refcount>0)
|
||||
{
|
||||
binary->refcount -= 1;
|
||||
need_deletion = (binary->refcount == 0);
|
||||
}
|
||||
if(need_deletion) for(;;)
|
||||
{
|
||||
os_rw_mutex_drop_w(stripe->rw_mutex);
|
||||
for(U64 start_t = os_now_microseconds();
|
||||
os_now_microseconds() <= start_t + 250;);
|
||||
os_rw_mutex_take_w(stripe->rw_mutex);
|
||||
if(binary->refcount == 0 && ins_atomic_u64_eval(&binary->scope_touch_count) == 0)
|
||||
{
|
||||
if(binary->parse.arena != 0) { arena_release(binary->parse.arena); }
|
||||
if(binary->parse.exe_base != 0) { os_file_map_view_close(binary->exe_file_map, binary->parse.exe_base); }
|
||||
if(!os_handle_match(os_handle_zero(), binary->exe_file_map)) { os_file_map_close(binary->exe_file_map); }
|
||||
if(!os_handle_match(os_handle_zero(), binary->exe_file)) { os_file_close(binary->exe_file); }
|
||||
if(binary->parse.dbg_base != 0) { os_file_map_view_close(binary->dbg_file_map, binary->parse.dbg_base); }
|
||||
if(!os_handle_match(os_handle_zero(), binary->dbg_file_map)) { os_file_map_close(binary->dbg_file_map); }
|
||||
if(!os_handle_match(os_handle_zero(), binary->dbg_file)) { os_file_close(binary->dbg_file); }
|
||||
binary->exe_file_map = binary->exe_file = os_handle_zero();
|
||||
binary->dbg_file_map = binary->dbg_file = os_handle_zero();
|
||||
MemoryZeroStruct(&binary->parse);
|
||||
binary->last_time_enqueued_for_parse_us = 0;
|
||||
binary->gen = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
scratch_end(scratch);
|
||||
@@ -294,7 +318,7 @@ dbgi_parse_from_exe_path(DBGI_Scope *scope, String8 exe_path, U64 endt_us)
|
||||
break;
|
||||
}
|
||||
else if(!sent &&
|
||||
os_now_microseconds() >= ins_atomic_u64_eval(&binary->last_time_enqueued_for_parse_us)+1000000 &&
|
||||
ins_atomic_u64_eval(&binary->last_time_enqueued_for_parse_us) == 0 &&
|
||||
dbgi_u2p_enqueue_exe_path(exe_path, endt_us))
|
||||
{
|
||||
sent = 1;
|
||||
@@ -451,7 +475,7 @@ dbgi_parse_thread_entry_point(void *p)
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(binary == 0 || binary->flags&DBGI_BinaryFlag_ParseInFlight)
|
||||
if(binary == 0 || binary->flags&DBGI_BinaryFlag_ParseInFlight || binary->refcount == 0)
|
||||
{
|
||||
task_is_taken_by_other_thread = 1;
|
||||
}
|
||||
@@ -475,7 +499,7 @@ dbgi_parse_thread_entry_point(void *p)
|
||||
void *exe_file_base = 0;
|
||||
if(do_task)
|
||||
{
|
||||
exe_file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_Shared, exe_path);
|
||||
exe_file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, exe_path);
|
||||
exe_file_props = os_properties_from_file(exe_file);
|
||||
exe_file_map = os_file_map_open(OS_AccessFlag_Read, exe_file);
|
||||
exe_file_base = os_file_map_view_open(exe_file_map, OS_AccessFlag_Read, r1u64(0, exe_file_props.size));
|
||||
@@ -484,7 +508,8 @@ dbgi_parse_thread_entry_point(void *p)
|
||||
//- rjf: parse exe file info
|
||||
Arena *parse_arena = 0;
|
||||
PE_BinInfo exe_pe_info = {0};
|
||||
String8 exe_dbg_path_embedded = {0};
|
||||
String8 exe_dbg_path_embedded_absolute = {0};
|
||||
String8 exe_dbg_path_embedded_relative = {0};
|
||||
if(do_task)
|
||||
{
|
||||
parse_arena = arena_alloc();
|
||||
@@ -492,7 +517,9 @@ dbgi_parse_thread_entry_point(void *p)
|
||||
{
|
||||
String8 exe_data = str8((U8 *)exe_file_base, exe_file_props.size);
|
||||
exe_pe_info = pe_bin_info_from_data(parse_arena, exe_data);
|
||||
exe_dbg_path_embedded = str8_cstring_capped((char *)exe_data.str+exe_pe_info.dbg_path_off, (char *)exe_data.str+exe_pe_info.dbg_path_off+Min(exe_data.size-exe_pe_info.dbg_path_off, 4096));
|
||||
exe_dbg_path_embedded_absolute = str8_cstring_capped((char *)exe_data.str+exe_pe_info.dbg_path_off, (char *)exe_data.str+exe_pe_info.dbg_path_off+Min(exe_data.size-exe_pe_info.dbg_path_off, 4096));
|
||||
String8 exe_folder = str8_chop_last_slash(exe_path);
|
||||
exe_dbg_path_embedded_relative = push_str8f(scratch.arena, "%S/%S", exe_folder, exe_dbg_path_embedded_absolute);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -509,9 +536,10 @@ dbgi_parse_thread_entry_point(void *p)
|
||||
{
|
||||
String8 possible_og_dbg_paths[] =
|
||||
{
|
||||
/* inferred: */ exe_dbg_path_embedded,
|
||||
/* "foo.exe" -> "foo.pdb" */ push_str8f(scratch.arena, "%S.pdb", str8_chop_last_dot(exe_path)),
|
||||
/* "foo.exe" -> "foo.exe.pdb" */ push_str8f(scratch.arena, "%S.pdb", exe_path),
|
||||
/* inferred (treated as absolute): */ exe_dbg_path_embedded_absolute,
|
||||
/* inferred (treated as relative): */ exe_dbg_path_embedded_relative,
|
||||
/* "foo.exe" -> "foo.pdb" */ push_str8f(scratch.arena, "%S.pdb", str8_chop_last_dot(exe_path)),
|
||||
/* "foo.exe" -> "foo.exe.pdb" */ push_str8f(scratch.arena, "%S.pdb", exe_path),
|
||||
};
|
||||
for(U64 idx = 0; idx < ArrayCount(possible_og_dbg_paths); idx += 1)
|
||||
{
|
||||
@@ -534,7 +562,7 @@ dbgi_parse_thread_entry_point(void *p)
|
||||
FileProperties og_dbg_props = {0};
|
||||
if(do_task) ProfScope("analyze O.G. dbg file")
|
||||
{
|
||||
OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_Shared, og_dbg_path);
|
||||
OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, og_dbg_path);
|
||||
OS_Handle file_map = os_file_map_open(OS_AccessFlag_Read, file);
|
||||
FileProperties props = og_dbg_props = os_properties_from_file(file);
|
||||
void *base = os_file_map_view_open(file_map, OS_AccessFlag_Read, r1u64(0, props.size));
|
||||
@@ -610,6 +638,32 @@ dbgi_parse_thread_entry_point(void *p)
|
||||
}
|
||||
}
|
||||
|
||||
//- rjf: if raddbg file is up to date based on timestamp, check the
|
||||
// encoding generation number, to see if we need to regenerate it
|
||||
// regardless
|
||||
if(do_task && raddbg_file_is_up_to_date)
|
||||
{
|
||||
OS_Handle file = {0};
|
||||
OS_Handle file_map = {0};
|
||||
FileProperties file_props = {0};
|
||||
void *file_base = 0;
|
||||
file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, raddbg_path);
|
||||
file_map = os_file_map_open(OS_AccessFlag_Read, file);
|
||||
file_props = os_properties_from_file(file);
|
||||
file_base = os_file_map_view_open(file_map, OS_AccessFlag_Read, r1u64(0, file_props.size));
|
||||
if(sizeof(RADDBG_Header) <= file_props.size)
|
||||
{
|
||||
RADDBG_Header *header = (RADDBG_Header*)file_base;
|
||||
if(header->encoding_version != RADDBG_ENCODING_VERSION)
|
||||
{
|
||||
raddbg_file_is_up_to_date = 0;
|
||||
}
|
||||
}
|
||||
os_file_map_view_close(file_map, file_base);
|
||||
os_file_map_close(file_map);
|
||||
os_file_close(file);
|
||||
}
|
||||
|
||||
//- rjf: raddbg file not up-to-date? we need to generate it
|
||||
if(do_task)
|
||||
{
|
||||
@@ -633,6 +687,7 @@ dbgi_parse_thread_entry_point(void *p)
|
||||
opts.consoleless = 1;
|
||||
str8_list_pushf(scratch.arena, &opts.cmd_line, "raddbg");
|
||||
str8_list_pushf(scratch.arena, &opts.cmd_line, "--convert");
|
||||
str8_list_pushf(scratch.arena, &opts.cmd_line, "--quiet");
|
||||
//str8_list_pushf(scratch.arena, &opts.cmd_line, "--capture");
|
||||
str8_list_pushf(scratch.arena, &opts.cmd_line, "--exe:%S", exe_path);
|
||||
str8_list_pushf(scratch.arena, &opts.cmd_line, "--pdb:%S", og_dbg_path);
|
||||
@@ -685,7 +740,7 @@ dbgi_parse_thread_entry_point(void *p)
|
||||
void *raddbg_file_base = 0;
|
||||
if(do_task && raddbg_file_is_up_to_date)
|
||||
{
|
||||
raddbg_file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_Shared, raddbg_path);
|
||||
raddbg_file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, raddbg_path);
|
||||
raddbg_file_map = os_file_map_open(OS_AccessFlag_Read, raddbg_file);
|
||||
raddbg_file_props = os_properties_from_file(raddbg_file);
|
||||
raddbg_file_base = os_file_map_view_open(raddbg_file_map, OS_AccessFlag_Read, r1u64(0, raddbg_file_props.size));
|
||||
@@ -708,8 +763,10 @@ dbgi_parse_thread_entry_point(void *p)
|
||||
}
|
||||
}
|
||||
|
||||
//- rjf: cache write, step 1: check if either EXE or raddbg file is new. if
|
||||
// so, clear all old results & store new top-level info
|
||||
//- rjf: cache write, step 1: check if refcount is still nonzero, &
|
||||
// either EXE or raddbg file is new. if so, clear all old results &
|
||||
// store new top-level info
|
||||
B32 binary_refcount_is_zero = 0;
|
||||
B32 raddbg_or_exe_file_is_updated = 0;
|
||||
if(do_task) ProfScope("cache write, step 1: check if raddbg is new & clear")
|
||||
{
|
||||
@@ -717,6 +774,11 @@ dbgi_parse_thread_entry_point(void *p)
|
||||
{
|
||||
if(str8_match(bin->exe_path, exe_path, 0))
|
||||
{
|
||||
if(bin->refcount == 0)
|
||||
{
|
||||
binary_refcount_is_zero = 1;
|
||||
break;
|
||||
}
|
||||
if(bin->parse.dbg_props.modified != raddbg_file_props.modified ||
|
||||
bin->parse.exe_props.modified != exe_file_props.modified)
|
||||
{
|
||||
@@ -751,7 +813,7 @@ dbgi_parse_thread_entry_point(void *p)
|
||||
|
||||
//- rjf: raddbg file or exe is not new? cache can stay unmodified, close
|
||||
// handles & skip to end.
|
||||
if(do_task) if(!raddbg_or_exe_file_is_updated) if(raddbg_file_is_up_to_date)
|
||||
if(do_task) if((!raddbg_or_exe_file_is_updated && raddbg_file_is_up_to_date) || binary_refcount_is_zero)
|
||||
{
|
||||
os_file_map_view_close(raddbg_file_map, raddbg_file_base);
|
||||
os_file_map_close(raddbg_file_map);
|
||||
@@ -759,6 +821,7 @@ dbgi_parse_thread_entry_point(void *p)
|
||||
os_file_map_view_close(exe_file_map, exe_file_base);
|
||||
os_file_map_close(exe_file_map);
|
||||
os_file_close(exe_file);
|
||||
arena_release(parse_arena);
|
||||
do_task = 0;
|
||||
}
|
||||
|
||||
@@ -785,7 +848,11 @@ dbgi_parse_thread_entry_point(void *p)
|
||||
String8 dbg_path = og_dbg_path;
|
||||
if(dbg_path.size == 0)
|
||||
{
|
||||
dbg_path = exe_dbg_path_embedded;
|
||||
dbg_path = exe_dbg_path_embedded_absolute;
|
||||
}
|
||||
if(dbg_path.size == 0)
|
||||
{
|
||||
dbg_path = exe_dbg_path_embedded_relative;
|
||||
}
|
||||
if(dbg_path.size == 0)
|
||||
{
|
||||
@@ -826,63 +893,3 @@ dbgi_parse_thread_entry_point(void *p)
|
||||
scratch_end(scratch);
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Evictor Thread
|
||||
|
||||
internal void
|
||||
dbgi_evictor_thread_entry_point(void *p)
|
||||
{
|
||||
TCTX tctx_;
|
||||
tctx_init_and_equip(&tctx_);
|
||||
ProfThreadName("[dbgi] evictor");
|
||||
for(;;)
|
||||
{
|
||||
ProfBegin("eviction scan");
|
||||
U64 slots_per_stripe = dbgi_shared->binary_slots_count/dbgi_shared->binary_stripes_count;
|
||||
for(U64 stripe_idx = 0; stripe_idx < dbgi_shared->binary_stripes_count; stripe_idx += 1)
|
||||
{
|
||||
DBGI_BinaryStripe *stripe = &dbgi_shared->binary_stripes[stripe_idx];
|
||||
for(U64 slot_in_stripe_idx = 0; slot_in_stripe_idx < slots_per_stripe; slot_in_stripe_idx += 1)
|
||||
{
|
||||
U64 slot_idx = slots_per_stripe*stripe_idx + slot_in_stripe_idx;
|
||||
DBGI_BinarySlot *slot = &dbgi_shared->binary_slots[slot_idx];
|
||||
B32 slot_needs_work = 0;
|
||||
OS_MutexScopeR(stripe->rw_mutex)
|
||||
{
|
||||
for(DBGI_Binary *bin = slot->first; bin != 0; bin = bin->next)
|
||||
{
|
||||
if(bin->refcount == 0 && bin->scope_touch_count == 0 && bin->flags == 0 && bin->gen > 1)
|
||||
{
|
||||
slot_needs_work = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(slot_needs_work) ProfScope("eviction task (slot %I64u)", slot_idx) OS_MutexScopeW(stripe->rw_mutex)
|
||||
{
|
||||
for(DBGI_Binary *bin = slot->first; bin != 0; bin = bin->next)
|
||||
{
|
||||
if(bin->refcount == 0 && bin->scope_touch_count == 0 && bin->flags == 0)
|
||||
{
|
||||
if(bin->parse.arena != 0) { arena_release(bin->parse.arena); }
|
||||
if(bin->parse.exe_base != 0) { os_file_map_view_close(bin->exe_file_map, bin->parse.exe_base); }
|
||||
if(!os_handle_match(os_handle_zero(), bin->exe_file_map)) { os_file_map_close(bin->exe_file_map); }
|
||||
if(!os_handle_match(os_handle_zero(), bin->exe_file)) { os_file_close(bin->exe_file); }
|
||||
if(bin->parse.dbg_base != 0) { os_file_map_view_close(bin->dbg_file_map, bin->parse.dbg_base); }
|
||||
if(!os_handle_match(os_handle_zero(), bin->dbg_file_map)) { os_file_map_close(bin->dbg_file_map); }
|
||||
if(!os_handle_match(os_handle_zero(), bin->dbg_file)) { os_file_close(bin->dbg_file); }
|
||||
bin->exe_file_map = bin->exe_file = os_handle_zero();
|
||||
bin->dbg_file_map = bin->dbg_file = os_handle_zero();
|
||||
MemoryZeroStruct(&bin->parse);
|
||||
bin->last_time_enqueued_for_parse_us = 0;
|
||||
bin->gen = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
ProfEnd();
|
||||
os_sleep_milliseconds(250);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -198,7 +198,6 @@ struct DBGI_Shared
|
||||
// rjf: threads
|
||||
U64 parse_thread_count;
|
||||
OS_Handle *parse_threads;
|
||||
OS_Handle evictor_thread;
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
@@ -254,9 +253,4 @@ internal DBGI_EventList dbgi_p2u_pop_events(Arena *arena, U64 endt_us);
|
||||
|
||||
internal void dbgi_parse_thread_entry_point(void *p);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Evictor Thread
|
||||
|
||||
internal void dbgi_evictor_thread_entry_point(void *p);
|
||||
|
||||
#endif //DBGI_H
|
||||
|
||||
@@ -861,6 +861,7 @@ demon_os_run(Arena *arena, DEMON_OS_RunCtrls *ctrls){
|
||||
|
||||
// init new entity
|
||||
DEMON_Entity *module = demon_ent_new(process, DEMON_EntityKind_Module, module_base);
|
||||
module->addr_range_dim = image_info.size;
|
||||
demon_module_count += 1;
|
||||
DEMON_W32_Ext *module_ext = demon_w32_ext_alloc();
|
||||
module->ext = module_ext;
|
||||
@@ -1338,10 +1339,25 @@ demon_os_launch_process(OS_LaunchOptions *options){
|
||||
AllocConsole();
|
||||
if (CreateProcessW(0, (WCHAR*)cmd16.str, 0, 0, 1, access_flags, (WCHAR*)env16.str, (WCHAR*)dir16.str,
|
||||
&startup_info, &process_info)){
|
||||
CloseHandle(process_info.hProcess);
|
||||
CloseHandle(process_info.hThread);
|
||||
result = process_info.dwProcessId;
|
||||
demon_w32_new_process_pending = 1;
|
||||
// check if we are 32-bit app, and just close it immediately
|
||||
BOOL is_wow = 0;
|
||||
IsWow64Process(process_info.hProcess, &is_wow);
|
||||
if ( is_wow ){
|
||||
MessageBox(0,"Sorry, The RAD Debugger only debugs 64-bit applications currently.","Process error",MB_OK|MB_ICONSTOP);
|
||||
DebugActiveProcessStop(process_info.dwProcessId);
|
||||
TerminateProcess(process_info.hProcess,0xffffffff);
|
||||
CloseHandle(process_info.hProcess);
|
||||
CloseHandle(process_info.hThread);
|
||||
}
|
||||
else{
|
||||
CloseHandle(process_info.hProcess);
|
||||
CloseHandle(process_info.hThread);
|
||||
result = process_info.dwProcessId;
|
||||
demon_w32_new_process_pending = 1;
|
||||
}
|
||||
}
|
||||
else{
|
||||
MessageBox(0,"Error starting process.","Process error",MB_OK|MB_ICONSTOP);
|
||||
}
|
||||
FreeConsole();
|
||||
|
||||
|
||||
+359
-142
@@ -1042,20 +1042,23 @@ df_cmd_params_apply_spec_query(Arena *arena, DF_CtrlCtx *ctrl_ctx, DF_CmdParams
|
||||
{
|
||||
String8 error = {0};
|
||||
B32 prefer_imm = 0;
|
||||
switch(spec->info.query_rule)
|
||||
switch(spec->info.query.slot)
|
||||
{
|
||||
default:
|
||||
case DF_CmdQueryRule_String:
|
||||
case DF_CmdParamSlot_String:
|
||||
{
|
||||
params->string = push_str8_copy(arena, query);
|
||||
df_cmd_params_mark_slot(params, DF_CmdParamSlot_String);
|
||||
}break;
|
||||
case DF_CmdQueryRule_FilePath:
|
||||
case DF_CmdParamSlot_FilePath:
|
||||
{
|
||||
params->file_path = push_str8_copy(arena, query);
|
||||
String8TxtPtPair pair = str8_txt_pt_pair_from_string(query);
|
||||
params->file_path = push_str8_copy(arena, pair.string);
|
||||
params->text_point = pair.pt;
|
||||
df_cmd_params_mark_slot(params, DF_CmdParamSlot_FilePath);
|
||||
df_cmd_params_mark_slot(params, DF_CmdParamSlot_TextPoint);
|
||||
}break;
|
||||
case DF_CmdQueryRule_TextPoint:
|
||||
case DF_CmdParamSlot_TextPoint:
|
||||
{
|
||||
U64 v = 0;
|
||||
if(try_u64_from_str8_c_rules(query, &v))
|
||||
@@ -1064,19 +1067,15 @@ df_cmd_params_apply_spec_query(Arena *arena, DF_CtrlCtx *ctrl_ctx, DF_CmdParams
|
||||
params->text_point.line = v;
|
||||
df_cmd_params_mark_slot(params, DF_CmdParamSlot_TextPoint);
|
||||
}
|
||||
else
|
||||
{
|
||||
error = str8_lit("Couldn't interpret as a line number.");
|
||||
}
|
||||
}break;
|
||||
case DF_CmdQueryRule_FilePathAndTextPoint:
|
||||
{
|
||||
String8TxtPtPair pair = str8_txt_pt_pair_from_string(query);
|
||||
params->file_path = push_str8_copy(arena, pair.string);
|
||||
params->text_point = pair.pt;
|
||||
df_cmd_params_mark_slot(params, DF_CmdParamSlot_FilePath);
|
||||
df_cmd_params_mark_slot(params, DF_CmdParamSlot_TextPoint);
|
||||
}break;
|
||||
case DF_CmdQueryRule_VirtualAddr: prefer_imm = 0; goto use_numeric_eval;
|
||||
case DF_CmdQueryRule_VirtualOff: prefer_imm = 0; goto use_numeric_eval;
|
||||
case DF_CmdQueryRule_Index: prefer_imm = 1; goto use_numeric_eval;
|
||||
case DF_CmdQueryRule_ID: prefer_imm = 1; goto use_numeric_eval;
|
||||
case DF_CmdParamSlot_VirtualAddr: prefer_imm = 0; goto use_numeric_eval;
|
||||
case DF_CmdParamSlot_VirtualOff: prefer_imm = 0; goto use_numeric_eval;
|
||||
case DF_CmdParamSlot_Index: prefer_imm = 1; goto use_numeric_eval;
|
||||
case DF_CmdParamSlot_ID: prefer_imm = 1; goto use_numeric_eval;
|
||||
use_numeric_eval:
|
||||
{
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
@@ -1084,9 +1083,7 @@ df_cmd_params_apply_spec_query(Arena *arena, DF_CtrlCtx *ctrl_ctx, DF_CmdParams
|
||||
DF_Entity *thread = df_entity_from_handle(ctrl_ctx->thread);
|
||||
U64 vaddr = df_query_cached_rip_from_thread_unwind(thread, ctrl_ctx->unwind_count);
|
||||
DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process);
|
||||
DF_Entity *module = df_module_from_process_vaddr(process, vaddr);
|
||||
U64 voff = df_voff_from_vaddr(module, vaddr);
|
||||
EVAL_ParseCtx parse_ctx = df_eval_parse_ctx_from_module_voff(scope, module, voff);
|
||||
EVAL_ParseCtx parse_ctx = df_eval_parse_ctx_from_process_vaddr(scope, process, vaddr);
|
||||
DF_Eval eval = df_eval_from_string(scratch.arena, scope, ctrl_ctx, &parse_ctx, query);
|
||||
if(eval.errors.count == 0)
|
||||
{
|
||||
@@ -1097,25 +1094,25 @@ df_cmd_params_apply_spec_query(Arena *arena, DF_CtrlCtx *ctrl_ctx, DF_CmdParams
|
||||
prefer_imm = 1;
|
||||
}
|
||||
U64 u64 = !prefer_imm && eval.offset ? eval.offset : eval.imm_u64;
|
||||
switch(spec->info.query_rule)
|
||||
switch(spec->info.query.slot)
|
||||
{
|
||||
default:{}break;
|
||||
case DF_CmdQueryRule_VirtualAddr:
|
||||
case DF_CmdParamSlot_VirtualAddr:
|
||||
{
|
||||
params->vaddr = u64;
|
||||
df_cmd_params_mark_slot(params, DF_CmdParamSlot_VirtualAddr);
|
||||
}break;
|
||||
case DF_CmdQueryRule_VirtualOff:
|
||||
case DF_CmdParamSlot_VirtualOff:
|
||||
{
|
||||
params->voff = u64;
|
||||
df_cmd_params_mark_slot(params, DF_CmdParamSlot_VirtualOff);
|
||||
}break;
|
||||
case DF_CmdQueryRule_Index:
|
||||
case DF_CmdParamSlot_Index:
|
||||
{
|
||||
params->index = u64;
|
||||
df_cmd_params_mark_slot(params, DF_CmdParamSlot_Index);
|
||||
}break;
|
||||
case DF_CmdQueryRule_ID:
|
||||
case DF_CmdParamSlot_ID:
|
||||
{
|
||||
params->id = u64;
|
||||
df_cmd_params_mark_slot(params, DF_CmdParamSlot_ID);
|
||||
@@ -1140,11 +1137,7 @@ df_cmd_list_push(Arena *arena, DF_CmdList *cmds, DF_CmdParams *params, DF_CmdSpe
|
||||
{
|
||||
DF_CmdNode *n = push_array(arena, DF_CmdNode, 1);
|
||||
n->cmd.spec = spec;
|
||||
MemoryCopyStruct(&n->cmd.params, params);
|
||||
n->cmd.params.entity_list = df_push_handle_list_copy(arena, params->entity_list);
|
||||
n->cmd.params.string = push_str8_copy(arena, params->string);
|
||||
n->cmd.params.file_path = push_str8_copy(arena, params->file_path);
|
||||
if(n->cmd.params.cmd_spec == 0) {n->cmd.params.cmd_spec = &df_g_nil_cmd_spec;}
|
||||
n->cmd.params = df_cmd_params_copy(arena, params);
|
||||
DLLPushBack(cmds->first, cmds->last, n);
|
||||
cmds->count += 1;
|
||||
}
|
||||
@@ -2092,6 +2085,10 @@ df_entity_from_path(String8 path, DF_EntityFromPathFlags flags)
|
||||
next_parent->timestamp = file_properties.modified;
|
||||
next_parent->flags |= DF_EntityFlag_IsFolder * !!(file_properties.flags & FilePropertyFlag_IsFolder);
|
||||
next_parent->flags |= DF_EntityFlag_IsMissing * !!(file_properties.created == 0);
|
||||
if(path_part_n->next != 0)
|
||||
{
|
||||
next_parent->flags |= DF_EntityFlag_IsFolder;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -2147,6 +2144,10 @@ df_entity_from_path(String8 path, DF_EntityFromPathFlags flags)
|
||||
next_parent->timestamp = file_properties.modified;
|
||||
next_parent->flags |= DF_EntityFlag_IsFolder * !!(file_properties.flags & FilePropertyFlag_IsFolder);
|
||||
next_parent->flags |= DF_EntityFlag_IsMissing * !!(file_properties.created == 0);
|
||||
if(path_part_n->next != 0)
|
||||
{
|
||||
next_parent->flags |= DF_EntityFlag_IsFolder;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -2503,9 +2504,8 @@ df_register_cmd_specs(DF_CmdSpecInfoArray specs)
|
||||
info_copy->search_tags = push_str8_copy(df_state->arena, info->search_tags);
|
||||
info_copy->display_name = push_str8_copy(df_state->arena, info->display_name);
|
||||
info_copy->flags = info->flags;
|
||||
info_copy->query_rule = info->query_rule;
|
||||
info_copy->query = info->query;
|
||||
info_copy->canonical_icon_kind = info->canonical_icon_kind;
|
||||
MemoryCopyArray(info_copy->query_info_u64, info->query_info_u64);
|
||||
spec->registrar_index = registrar_idx;
|
||||
spec->ordering_index = idx;
|
||||
}
|
||||
@@ -2642,6 +2642,98 @@ df_debug_info_path_from_module(Arena *arena, DF_Entity *module)
|
||||
////////////////////////////////
|
||||
//~ rjf: Stepping "Trap Net" Builders
|
||||
|
||||
// NOTE(rjf): Stepping Algorithm Overview (2024/01/17)
|
||||
//
|
||||
// The basic idea behind all stepping algorithms in the debugger are setting up
|
||||
// a "trap net". A "trap net" is just a collection of high-level traps that are
|
||||
// meant to "catch" a thread after letting it run. This trap net is submitted
|
||||
// when the debugger frontend sends a "run" command (it is just empty if doing
|
||||
// an actual 'run' or 'continue'). The debugger control thread then uses this
|
||||
// trap net to program a state machine, to appropriately respond to a variety
|
||||
// of debug events which it is passed from the OS.
|
||||
//
|
||||
// These are "high-level traps" because they can have specific behavioral info
|
||||
// attached to them. These are encoded via the `CTRL_TrapFlags` type, which
|
||||
// allow expression of the following behaviors:
|
||||
//
|
||||
// - end-stepping: when this trap is hit, it will end the stepping operation,
|
||||
// and the target will not continue.
|
||||
// - ignore-stack-pointer-check: when a trap in the trap net is hit, it will
|
||||
// by-default be ignored if the thread's stack pointer has changed. this
|
||||
// flag disables that behavior, for when the stack pointer is expected to
|
||||
// change (e.g. step-out).
|
||||
// - single-step-after-hit: when a trap with this flag is hit, the debugger
|
||||
// will immediately single-step the thread which hit it.
|
||||
// - save-stack-pointer: when a trap with this flag is hit, it will rewrite
|
||||
// the stack pointer which is used to compare against, when deciding
|
||||
// whether or not to filter a trap (based on stack pointer changes).
|
||||
// - begin-spoof-mode: this enables "spoof mode". "spoof mode" is a special
|
||||
// mode that disables the trap net entirely, and lets the thread run
|
||||
// freely - but it catches the thread not with a trap, but a false return
|
||||
// address. the debugger will overwrite a specific return address on the
|
||||
// stack. this address will be overwritten with an address which does NOT
|
||||
// point to a valid page, such that when the thread returns out of a
|
||||
// particular call frame, the debugger will receive a debug event, at
|
||||
// which point it can move the thread back to the correct return address,
|
||||
// and resume with the trap net enabled. this is used in "step over"
|
||||
// operations, because it avoids target <-> debugger "roundtrips" (e.g.
|
||||
// target being stopped, debugger being called with debug events, then
|
||||
// target resumes when debugger's control thread is done running) for
|
||||
// recursions. (it doesn't make a difference with non-recursive calls,
|
||||
// but the debugger can't detect the difference).
|
||||
//
|
||||
// Each stepping command prepares its trap net differently.
|
||||
//
|
||||
// --- Instruction Step Into --------------------------------------------------
|
||||
// In this case, no trap net is prepared, and only a low-level single-step is
|
||||
// performed.
|
||||
//
|
||||
// --- Instruction Step Over --------------------------------------------------
|
||||
// To build a trap net for an instruction-level step-over, the next instruction
|
||||
// at the thread's current instruction pointer is decoded. If it is a call
|
||||
// instruction, or if it is a repeating instruction, then a trap with the
|
||||
// 'end-stepping' behavior is placed at the instruction immediately following
|
||||
// the 'call' instruction.
|
||||
//
|
||||
// --- Line Step Into ---------------------------------------------------------
|
||||
// For a source-line step-into, the thread's instruction pointer is first used
|
||||
// to look up into the debug info's line info, to find the machine code in the
|
||||
// thread's current source line. Every instruction in this range is decoded.
|
||||
// Traps are then built in the following way:
|
||||
//
|
||||
// - 'call' instruction -> if can decode call destination address, place
|
||||
// "end-stepping | ignore-stack-pointer-check" trap at destination. if
|
||||
// can't, "end-stepping | single-step-after | ignore-stack-pointer-check"
|
||||
// trap at call.
|
||||
// - 'jmp' (both unconditional & conditional) -> if can decode jump destination
|
||||
// address, AND if jump leaves the line, place "end-stepping | ignore-
|
||||
// stack-pointer-check" trap at destination. if can't, "end-stepping |
|
||||
// single-step-after | ignore-stack-pointer-check" trap at jmp. if jump
|
||||
// stays within the line, do nothing.
|
||||
// - 'return' -> place "end-stepping | single-step-after" trap at return inst.
|
||||
// - "end-stepping" trap is placed at the first address after the line, to
|
||||
// catch all steps which simply proceed linearly through the instruction
|
||||
// stream.
|
||||
//
|
||||
// --- Line Step Over ---------------------------------------------------------
|
||||
// For a source-line step-over, the thread's instruction pointer is first used
|
||||
// to look up into the debug info's line info, to find the machine code in the
|
||||
// thread's current source line. Every instruction in this range is decoded.
|
||||
// Traps are then built in the following way:
|
||||
//
|
||||
// - 'call' instruction -> place "single-step-after | begin-spoof-mode" trap at
|
||||
// call instruction.
|
||||
// - 'jmp' (both unconditional & conditional) -> if can decode jump destination
|
||||
// address, AND if jump leaves the line, place "end-stepping" trap at
|
||||
// destination. if can't, "end-stepping | single-step-after" trap at jmp.
|
||||
// if jump stays within the line, do nothing.
|
||||
// - 'return' -> place "end-stepping | single-step-after" trap at return inst.
|
||||
// - "end-stepping" trap is placed at the first address after the line, to
|
||||
// catch all steps which simply proceed linearly through the instruction
|
||||
// stream.
|
||||
// - for any instructions which may change the stack pointer, traps are placed
|
||||
// at them with the "save-stack-pointer | single-step-after" behaviors.
|
||||
|
||||
internal CTRL_TrapList
|
||||
df_trap_net_from_thread__step_over_inst(Arena *arena, DF_Entity *thread)
|
||||
{
|
||||
@@ -2869,23 +2961,6 @@ df_trap_net_from_thread__step_into_line(Arena *arena, DF_Entity *thread)
|
||||
{
|
||||
trap_addr = point->jump_dest_vaddr;
|
||||
flags &= ~CTRL_TrapFlag_SingleStepAfterHit;
|
||||
|
||||
// rjf: read instruction one layer deep after a jump and determine if
|
||||
// it is just jumping to an unconditional jump (e.g. a function
|
||||
// dispatch table) - if so, then just follow one more layer
|
||||
String8 dst_machine_code = {0};
|
||||
dst_machine_code.str = push_array_no_zero(scratch.arena, U8, max_instruction_size_from_arch(arch));
|
||||
dst_machine_code.size = ctrl_process_read(process->ctrl_machine_id, process->ctrl_handle, r1u64(trap_addr, trap_addr+max_instruction_size_from_arch(arch)), dst_machine_code.str);
|
||||
if(dst_machine_code.size != 0)
|
||||
{
|
||||
DF_Inst inst = df_single_inst_from_machine_code(scratch.arena, arch, 0, dst_machine_code);
|
||||
if((inst.flags & DF_InstFlag_UnconditionalJump ||
|
||||
inst.flags & DF_InstFlag_Call) &&
|
||||
inst.rel_voff != 0)
|
||||
{
|
||||
trap_addr = (U64)(trap_addr + (S64)((S32)inst.rel_voff));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3015,7 +3090,7 @@ df_symbol_name_from_binary_voff(Arena *arena, DF_Entity *binary, U64 voff)
|
||||
String8 path = df_full_path_from_entity(scratch.arena, binary);
|
||||
DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, path, 0);
|
||||
RADDBG_Parsed *rdbg = &dbgi->rdbg;
|
||||
if(rdbg->scope_vmap != 0)
|
||||
if(result.size == 0 && rdbg->scope_vmap != 0)
|
||||
{
|
||||
U64 scope_idx = raddbg_vmap_idx_from_voff(rdbg->scope_vmap, rdbg->scope_vmap_count, voff);
|
||||
RADDBG_Scope *scope = &rdbg->scopes[scope_idx];
|
||||
@@ -3025,6 +3100,14 @@ df_symbol_name_from_binary_voff(Arena *arena, DF_Entity *binary, U64 voff)
|
||||
U8 *name_ptr = raddbg_string_from_idx(rdbg, procedure->name_string_idx, &name_size);
|
||||
result = push_str8_copy(arena, str8(name_ptr, name_size));
|
||||
}
|
||||
if(result.size == 0 && rdbg->global_vmap != 0)
|
||||
{
|
||||
U64 global_idx = raddbg_vmap_idx_from_voff(rdbg->global_vmap, rdbg->global_vmap_count, voff);
|
||||
RADDBG_GlobalVariable *global_var = &rdbg->global_variables[global_idx];
|
||||
U64 name_size = 0;
|
||||
U8 *name_ptr = raddbg_string_from_idx(rdbg, global_var->name_string_idx, &name_size);
|
||||
result = push_str8_copy(arena, str8(name_ptr, name_size));
|
||||
}
|
||||
dbgi_scope_close(scope);
|
||||
scratch_end(scratch);
|
||||
}
|
||||
@@ -3536,13 +3619,6 @@ df_push_unwind_from_thread(Arena *arena, DF_Entity *thread)
|
||||
DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, binary_full_path, 0);
|
||||
String8 binary_data = str8((U8 *)dbgi->exe_base, dbgi->exe_props.size);
|
||||
|
||||
// rjf: cancel on bad data
|
||||
if(binary_data.size == 0)
|
||||
{
|
||||
unwind.error = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
// rjf: valid step -> push frame
|
||||
DF_UnwindFrame *frame = push_array(arena, DF_UnwindFrame, 1);
|
||||
frame->rip = rip;
|
||||
@@ -3635,14 +3711,6 @@ df_set_thread_rip(DF_Entity *thread, U64 vaddr)
|
||||
{
|
||||
B32 result = ctrl_thread_write_rip(thread->ctrl_machine_id, thread->ctrl_handle, vaddr);
|
||||
|
||||
// rjf: invalidate unwind/locals cache
|
||||
if(result)
|
||||
{
|
||||
df_state->unwind_cache_invalidated = 1;
|
||||
df_state->locals_cache_invalidated = 1;
|
||||
df_state->member_cache_invalidated = 1;
|
||||
}
|
||||
|
||||
// rjf: early mutation of unwind cache for immediate frontend effect
|
||||
if(result)
|
||||
{
|
||||
@@ -3737,6 +3805,10 @@ df_push_ctrl_msg(CTRL_Msg *msg)
|
||||
{
|
||||
CTRL_Msg *dst = ctrl_msg_list_push(df_state->ctrl_msg_arena, &df_state->ctrl_msgs);
|
||||
ctrl_msg_deep_copy(df_state->ctrl_msg_arena, dst, msg);
|
||||
if(dst->kind == CTRL_MsgKind_LaunchAndInit)
|
||||
{
|
||||
df_state->ctrl_is_running = 1;
|
||||
}
|
||||
if(df_state->ctrl_soft_halt_issued == 0 && df_ctrl_targets_running())
|
||||
{
|
||||
df_state->ctrl_soft_halt_issued = 1;
|
||||
@@ -3892,17 +3964,19 @@ df_eval_memory_read(void *u, void *out, U64 addr, U64 size)
|
||||
}
|
||||
|
||||
internal EVAL_ParseCtx
|
||||
df_eval_parse_ctx_from_module_voff(DBGI_Scope *scope, DF_Entity *module, U64 voff)
|
||||
df_eval_parse_ctx_from_process_vaddr(DBGI_Scope *scope, DF_Entity *process, U64 vaddr)
|
||||
{
|
||||
Temp scratch = scratch_begin(0, 0);
|
||||
|
||||
//- rjf: extract info
|
||||
DF_Entity *module = df_module_from_process_vaddr(process, vaddr);
|
||||
U64 voff = df_voff_from_vaddr(module, vaddr);
|
||||
DF_Entity *binary = df_binary_file_from_module(module);
|
||||
String8 binary_path = df_full_path_from_entity(scratch.arena, binary);
|
||||
DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, binary_path, 0);
|
||||
RADDBG_Parsed *rdbg = &dbgi->rdbg;
|
||||
Architecture arch = df_architecture_from_entity(module);
|
||||
EVAL_String2NumMap *reg_map = ctrl_string2reg_from_arch (arch);
|
||||
Architecture arch = df_architecture_from_entity(process);
|
||||
EVAL_String2NumMap *reg_map = ctrl_string2reg_from_arch(arch);
|
||||
EVAL_String2NumMap *reg_alias_map = ctrl_string2alias_from_arch(arch);
|
||||
EVAL_String2NumMap *locals_map = df_query_cached_locals_map_from_binary_voff(binary, voff);
|
||||
EVAL_String2NumMap *member_map = df_query_cached_member_map_from_binary_voff(binary, voff);
|
||||
@@ -4013,7 +4087,10 @@ df_eval_parse_ctx_from_src_loc(DBGI_Scope *scope, DF_Entity *file, TxtPt pt)
|
||||
if(modules.count != 0)
|
||||
{
|
||||
DF_Entity *module = modules.first->entity;
|
||||
ctx = df_eval_parse_ctx_from_module_voff(scope, module, src2dasm->voff_range.min);
|
||||
DF_Entity *process = df_entity_ancestor_from_kind(module, DF_EntityKind_Process);
|
||||
U64 voff = src2dasm->voff_range.min;
|
||||
U64 vaddr = df_vaddr_from_voff(module, voff);
|
||||
ctx = df_eval_parse_ctx_from_process_vaddr(scope, process, vaddr);
|
||||
good_ctx = 1;
|
||||
break;
|
||||
}
|
||||
@@ -4064,6 +4141,19 @@ df_eval_from_string(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_
|
||||
}
|
||||
}
|
||||
|
||||
//- rjf: unpack module info & produce eval machine
|
||||
DF_Entity *module = df_module_from_process_vaddr(process, thread_unwind_ip_vaddr);
|
||||
U64 module_base = df_base_vaddr_from_module(module);
|
||||
U64 tls_base = df_tls_base_vaddr_from_thread(thread);
|
||||
EVAL_Machine machine = {0};
|
||||
machine.u = (void *)thread->parent;
|
||||
machine.arch = arch;
|
||||
machine.memory_read = df_eval_memory_read;
|
||||
machine.reg_data = thread_unwind_regs_block;
|
||||
machine.reg_size = reg_size;
|
||||
machine.module_base = &module_base;
|
||||
machine.tls_base = &tls_base;
|
||||
|
||||
//- rjf: lex & parse
|
||||
EVAL_TokenArray tokens = eval_token_array_from_text(arena, string);
|
||||
EVAL_ParseResult parse = eval_parse_expr_from_text_tokens(arena, parse_ctx, string, &tokens);
|
||||
@@ -4092,23 +4182,10 @@ df_eval_from_string(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_
|
||||
bytecode = eval_bytecode_from_oplist(arena, &op_list);
|
||||
}
|
||||
|
||||
//- rjf: grab thread/module
|
||||
DF_Entity *module = df_module_from_process_vaddr(process, thread_unwind_ip_vaddr);
|
||||
|
||||
//- rjf: evaluate
|
||||
EVAL_Result eval = {0};
|
||||
if(bytecode.size != 0)
|
||||
{
|
||||
U64 module_base = df_base_vaddr_from_module(module);
|
||||
U64 tls_base = df_tls_base_vaddr_from_thread(thread);
|
||||
EVAL_Machine machine = {0};
|
||||
machine.u = (void *)thread->parent;
|
||||
machine.arch = arch;
|
||||
machine.memory_read = df_eval_memory_read;
|
||||
machine.reg_data = thread_unwind_regs_block;
|
||||
machine.reg_size = reg_size;
|
||||
machine.module_base = &module_base;
|
||||
machine.tls_base = &tls_base;
|
||||
eval = eval_interpret(&machine, bytecode);
|
||||
}
|
||||
|
||||
@@ -4139,6 +4216,12 @@ df_eval_from_string(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_
|
||||
result.errors = errors;
|
||||
}
|
||||
|
||||
//- rjf: apply dynamic type overrides
|
||||
if(parse.expr != 0 && parse.expr->kind != EVAL_ExprKind_Cast)
|
||||
{
|
||||
result = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, result);
|
||||
}
|
||||
|
||||
scratch_end(scratch);
|
||||
ProfEnd();
|
||||
return result;
|
||||
@@ -4213,10 +4296,83 @@ df_value_mode_eval_from_eval(TG_Graph *graph, RADDBG_Parsed *rdbg, DF_CtrlCtx *c
|
||||
return eval;
|
||||
}
|
||||
|
||||
internal DF_Eval
|
||||
df_dynamically_typed_eval_from_eval(TG_Graph *graph, RADDBG_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF_Eval eval)
|
||||
{
|
||||
Temp scratch = scratch_begin(0, 0);
|
||||
DF_Entity *thread = df_entity_from_handle(ctrl_ctx->thread);
|
||||
Architecture arch = df_architecture_from_entity(thread);
|
||||
DF_Entity *process = thread->parent;
|
||||
U64 unwind_count = ctrl_ctx->unwind_count;
|
||||
U64 thread_rip_vaddr = df_query_cached_rip_from_thread_unwind(thread, unwind_count);
|
||||
DF_Entity *module = df_module_from_process_vaddr(process, thread_rip_vaddr);
|
||||
TG_Key type_key = eval.type_key;
|
||||
TG_Kind type_kind = tg_kind_from_key(type_key);
|
||||
if(type_kind == TG_Kind_Ptr)
|
||||
{
|
||||
TG_Key ptee_type_key = tg_unwrapped_direct_from_graph_raddbg_key(graph, rdbg, type_key);
|
||||
TG_Kind ptee_type_kind = tg_kind_from_key(ptee_type_key);
|
||||
if(ptee_type_kind == TG_Kind_Struct || ptee_type_kind == TG_Kind_Class)
|
||||
{
|
||||
TG_Type *ptee_type = tg_type_from_graph_raddbg_key(scratch.arena, graph, rdbg, ptee_type_key);
|
||||
B32 has_vtable = 0;
|
||||
for(U64 idx = 0; idx < ptee_type->count; idx += 1)
|
||||
{
|
||||
if(ptee_type->members[idx].kind == TG_MemberKind_VirtualMethod)
|
||||
{
|
||||
has_vtable = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(has_vtable)
|
||||
{
|
||||
U64 ptr_vaddr = eval.offset;
|
||||
U64 addr_size = bit_size_from_arch(arch)/8;
|
||||
String8 ptr_value_memory = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle,
|
||||
r1u64(ptr_vaddr, ptr_vaddr+addr_size));
|
||||
if(ptr_value_memory.size >= addr_size)
|
||||
{
|
||||
U64 class_base_vaddr = 0;
|
||||
MemoryCopy(&class_base_vaddr, ptr_value_memory.str, addr_size);
|
||||
String8 vtable_base_ptr_memory = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle,
|
||||
r1u64(class_base_vaddr, class_base_vaddr+addr_size));
|
||||
if(vtable_base_ptr_memory.size >= addr_size)
|
||||
{
|
||||
U64 vtable_vaddr = 0;
|
||||
MemoryCopy(&vtable_vaddr, vtable_base_ptr_memory.str, addr_size);
|
||||
U64 vtable_voff = df_voff_from_vaddr(module, vtable_vaddr);
|
||||
U64 global_idx = raddbg_vmap_idx_from_voff(rdbg->global_vmap, rdbg->global_vmap_count, vtable_voff);
|
||||
if(0 < global_idx && global_idx < rdbg->global_variable_count)
|
||||
{
|
||||
RADDBG_GlobalVariable *global_var = &rdbg->global_variables[global_idx];
|
||||
if(global_var->link_flags & RADDBG_LinkFlag_TypeScoped &&
|
||||
0 < global_var->container_idx && global_var->container_idx < rdbg->udt_count)
|
||||
{
|
||||
RADDBG_UDT *udt = &rdbg->udts[global_var->container_idx];
|
||||
if(0 < udt->self_type_idx && udt->self_type_idx < rdbg->type_node_count)
|
||||
{
|
||||
RADDBG_TypeNode *type = &rdbg->type_nodes[udt->self_type_idx];
|
||||
TG_Key derived_type_key = tg_key_ext(tg_kind_from_raddbg_type_kind(type->kind), (U64)udt->self_type_idx);
|
||||
TG_Key ptr_to_derived_type_key = tg_cons_type_make(graph, TG_Kind_Ptr, derived_type_key, 0);
|
||||
eval.type_key = ptr_to_derived_type_key;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
scratch_end(scratch);
|
||||
return eval;
|
||||
}
|
||||
|
||||
internal DF_Eval
|
||||
df_eval_from_eval_cfg_table(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_Eval eval, DF_CfgTable *cfg)
|
||||
{
|
||||
ProfBeginFunction();
|
||||
|
||||
//- rjf: apply view rules
|
||||
for(DF_CfgVal *val = cfg->first_val; val != 0 && val != &df_g_nil_cfg_val; val = val->linear_next)
|
||||
{
|
||||
DF_CoreViewRuleSpec *spec = df_core_view_rule_spec_from_string(val->string);
|
||||
@@ -4572,18 +4728,22 @@ df_string_from_simple_typed_eval(Arena *arena, TG_Graph *graph, RADDBG_Parsed *r
|
||||
}
|
||||
if(flags & DF_EvalVizStringFlag_ReadOnlyDisplayRules)
|
||||
{
|
||||
result = push_str8f(arena, "0x%I64x%s%S%s", eval.imm_u64,
|
||||
constant_name.size != 0 ? " (" : "",
|
||||
constant_name,
|
||||
constant_name.size != 0 ? ")" : "");
|
||||
if(constant_name.size != 0)
|
||||
{
|
||||
result = push_str8f(arena, "0x%I64x (%S)", eval.imm_u64, constant_name);
|
||||
}
|
||||
else
|
||||
{
|
||||
result = push_str8f(arena, "0x%I64x (%I64u)", eval.imm_u64, eval.imm_u64);
|
||||
}
|
||||
}
|
||||
else if(constant_name.size != 0)
|
||||
{
|
||||
result = push_str8f(arena, "%S", constant_name);
|
||||
result = push_str8_copy(arena, constant_name);
|
||||
}
|
||||
else
|
||||
{
|
||||
result = push_str8f(arena, "0x%I64x", eval.imm_u64);
|
||||
result = push_str8f(arena, "0x%I64x (%I64u)", eval.imm_u64, eval.imm_u64);
|
||||
}
|
||||
scratch_end(scratch);
|
||||
}break;
|
||||
@@ -4635,14 +4795,21 @@ df_commit_eval_value(TG_Graph *graph, RADDBG_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx,
|
||||
}break;
|
||||
|
||||
//- rjf: integers
|
||||
case TG_Kind_Char8:
|
||||
case TG_Kind_Char16:
|
||||
case TG_Kind_Char32:
|
||||
case TG_Kind_S8:
|
||||
case TG_Kind_S16:
|
||||
case TG_Kind_S32:
|
||||
case TG_Kind_S64:
|
||||
case TG_Kind_UChar8:
|
||||
case TG_Kind_UChar16:
|
||||
case TG_Kind_UChar32:
|
||||
case TG_Kind_U8:
|
||||
case TG_Kind_U16:
|
||||
case TG_Kind_U32:
|
||||
case TG_Kind_U64:
|
||||
case TG_Kind_Bool:
|
||||
if(TG_Kind_Char8 <= src_type_kind && src_type_kind <= TG_Kind_Bool)
|
||||
{
|
||||
DF_Eval value_eval = df_value_mode_eval_from_eval(graph, rdbg, ctrl_ctx, src_eval);
|
||||
@@ -4709,8 +4876,17 @@ df_commit_eval_value(TG_Graph *graph, RADDBG_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx,
|
||||
}break;
|
||||
case EVAL_EvalMode_Reg:
|
||||
{
|
||||
// TODO(rjf)
|
||||
result = 0;
|
||||
DF_Unwind unwind = df_query_cached_unwind_from_thread(thread);
|
||||
Architecture arch = df_architecture_from_entity(thread);
|
||||
U64 reg_block_size = regs_block_size_from_architecture(arch);
|
||||
if(unwind.first != 0 &&
|
||||
(0 <= dst_eval.offset && dst_eval.offset+commit_data.size < reg_block_size))
|
||||
{
|
||||
void *new_regs = push_array(scratch.arena, U8, reg_block_size);
|
||||
MemoryCopy(new_regs, unwind.first->regs, reg_block_size);
|
||||
MemoryCopy((U8 *)new_regs+dst_eval.offset, commit_data.str, commit_data.size);
|
||||
result = ctrl_thread_write_reg_block(thread->ctrl_machine_id, thread->ctrl_handle, new_regs);
|
||||
}
|
||||
}break;
|
||||
}
|
||||
}
|
||||
@@ -4894,6 +5070,7 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DBGI_Scope *scope, DF_EvalVie
|
||||
//////////////////////////////
|
||||
//- rjf: apply view rules & resolve eval
|
||||
//
|
||||
eval = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, eval);
|
||||
eval = df_eval_from_eval_cfg_table(arena, scope, ctrl_ctx, parse_ctx, eval, cfg_table);
|
||||
|
||||
//////////////////////////////
|
||||
@@ -4993,6 +5170,15 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DBGI_Scope *scope, DF_EvalVie
|
||||
for(DF_CfgVal *val = cfg_table->first_val; val != 0 && val != &df_g_nil_cfg_val; val = val->linear_next)
|
||||
{
|
||||
DF_CoreViewRuleSpec *spec = df_core_view_rule_spec_from_string(val->string);
|
||||
if(str8_match(spec->info.string, str8_lit("list"), 0) ||
|
||||
str8_match(spec->info.string, str8_lit("omit"), 0) ||
|
||||
str8_match(spec->info.string, str8_lit("only"), 0))
|
||||
{
|
||||
// TODO(rjf): "list" view rule needs to be formally moved into the visualization
|
||||
// engine hooks when the system is mature enough to support it
|
||||
// also "omit", "only"
|
||||
continue;
|
||||
}
|
||||
if(spec->info.flags & DF_CoreViewRuleSpecInfoFlag_VizBlockProd)
|
||||
{
|
||||
expand_rule = DF_EvalVizExpandRule_ViewRule;
|
||||
@@ -6177,8 +6363,11 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt)
|
||||
{
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
|
||||
//- rjf: grab next reggen/memgen
|
||||
U64 new_memgen_idx = ctrl_memgen_idx();
|
||||
U64 new_reggen_idx = ctrl_reggen_idx();
|
||||
|
||||
//- rjf: consume & process events
|
||||
B32 run_caches_invalidated = 0;
|
||||
CTRL_EventList events = ctrl_c2u_pop_events(scratch.arena);
|
||||
for(CTRL_EventNode *event_n = events.first; event_n != 0; event_n = event_n->next)
|
||||
{
|
||||
@@ -6198,7 +6387,6 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt)
|
||||
{
|
||||
df_state->ctrl_is_running = 0;
|
||||
df_state->ctrl_soft_halt_issued = 0;
|
||||
run_caches_invalidated = 1;
|
||||
DF_Entity *stop_thread = df_entity_from_ctrl_handle(event->machine_id, event->entity);
|
||||
|
||||
// rjf: gather stop info
|
||||
@@ -6244,14 +6432,20 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// rjf: exception or unexpected trap -> push error
|
||||
if(event->cause == CTRL_EventCause_InterruptedByException ||
|
||||
event->cause == CTRL_EventCause_InterruptedByTrap)
|
||||
{
|
||||
DF_CmdParams params = df_cmd_params_zero();
|
||||
df_cmd_list_push(arena, cmds, ¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Error));
|
||||
}
|
||||
}break;
|
||||
|
||||
//- rjf: entity creation/deletion
|
||||
|
||||
case CTRL_EventKind_NewProc:
|
||||
{
|
||||
run_caches_invalidated = 1;
|
||||
|
||||
// rjf: the first process? -> clear session output & reset all bp hit counts
|
||||
DF_EntityList existing_processes = df_query_cached_entity_list_with_kind(DF_EntityKind_Process);
|
||||
if(existing_processes.count == 0)
|
||||
@@ -6279,8 +6473,6 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt)
|
||||
|
||||
case CTRL_EventKind_NewThread:
|
||||
{
|
||||
run_caches_invalidated = 1;
|
||||
|
||||
// rjf: create entity
|
||||
DF_Entity *parent = df_entity_from_ctrl_handle(event->machine_id, event->parent);
|
||||
DF_Entity *entity = df_entity_alloc(0, parent, DF_EntityKind_Thread);
|
||||
@@ -6467,7 +6659,6 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt)
|
||||
df_entity_equip_color_rgba(thread, color);
|
||||
}
|
||||
}
|
||||
run_caches_invalidated = 1;
|
||||
}break;
|
||||
}
|
||||
}
|
||||
@@ -6480,16 +6671,10 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt)
|
||||
}
|
||||
}
|
||||
|
||||
//- rjf: invalidate per-run caches
|
||||
if(run_caches_invalidated)
|
||||
{
|
||||
df_state->unwind_cache_invalidated = 1;
|
||||
df_state->locals_cache_invalidated = 1;
|
||||
df_state->member_cache_invalidated = 1;
|
||||
}
|
||||
|
||||
//- rjf: refresh unwind cache
|
||||
if(df_state->unwind_cache_invalidated && !df_ctrl_targets_running()) ProfScope("per-thread unwind gather")
|
||||
if((df_state->unwind_cache_memgen_idx != new_memgen_idx ||
|
||||
df_state->unwind_cache_reggen_idx != new_reggen_idx) &&
|
||||
!df_ctrl_targets_running()) ProfScope("per-thread unwind gather")
|
||||
{
|
||||
B32 good = 1;
|
||||
DF_EntityList all_threads = df_query_cached_entity_list_with_kind(DF_EntityKind_Thread);
|
||||
@@ -6514,27 +6699,28 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt)
|
||||
break;
|
||||
}
|
||||
}
|
||||
df_state->unwind_cache_invalidated = !good;
|
||||
df_state->unwind_cache_memgen_idx = new_memgen_idx;
|
||||
df_state->unwind_cache_reggen_idx = new_reggen_idx;
|
||||
}
|
||||
|
||||
//- rjf: clear locals cache
|
||||
if(df_state->locals_cache_invalidated && !df_ctrl_targets_running())
|
||||
if(df_state->locals_cache_reggen_idx != new_reggen_idx && !df_ctrl_targets_running())
|
||||
{
|
||||
df_state->locals_cache_invalidated = 0;
|
||||
DF_RunLocalsCache *cache = &df_state->locals_cache;
|
||||
arena_clear(cache->arena);
|
||||
cache->table_size = 0;
|
||||
cache->table = 0;
|
||||
df_state->locals_cache_reggen_idx = new_reggen_idx;
|
||||
}
|
||||
|
||||
//- rjf: clear members cache
|
||||
if(df_state->member_cache_invalidated && !df_ctrl_targets_running())
|
||||
if(df_state->member_cache_reggen_idx != new_reggen_idx && !df_ctrl_targets_running())
|
||||
{
|
||||
df_state->member_cache_invalidated = 0;
|
||||
DF_RunLocalsCache *cache = &df_state->member_cache;
|
||||
arena_clear(cache->arena);
|
||||
cache->table_size = 0;
|
||||
cache->table = 0;
|
||||
df_state->member_cache_reggen_idx = new_reggen_idx;
|
||||
}
|
||||
|
||||
scratch_end(scratch);
|
||||
@@ -6625,13 +6811,18 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt)
|
||||
default:{}break;
|
||||
|
||||
//- rjf: command fast paths
|
||||
case DF_CoreCmdKind_CommandFastPath:
|
||||
case DF_CoreCmdKind_RunCommand:
|
||||
{
|
||||
DF_CmdSpec *spec = params.cmd_spec;
|
||||
DF_CmdQueryRule query_rule = spec->info.query_rule;
|
||||
if(query_rule == DF_CmdQueryRule_Null)
|
||||
if(spec != cmd->spec)
|
||||
{
|
||||
df_cmd_list_push(arena, cmds, ¶ms, spec);
|
||||
df_cmd_spec_counter_inc(spec);
|
||||
if(!(spec->info.query.flags & DF_CmdQueryFlag_Required) &&
|
||||
(spec->info.query.slot == DF_CmdParamSlot_Null ||
|
||||
df_cmd_params_has_slot(¶ms, spec->info.query.slot)))
|
||||
{
|
||||
df_cmd_list_push(arena, cmds, ¶ms, spec);
|
||||
}
|
||||
}
|
||||
}break;
|
||||
|
||||
@@ -6802,14 +6993,17 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt)
|
||||
}break;
|
||||
case DF_CoreCmdKind_Detach:
|
||||
{
|
||||
DF_Entity *entity = df_entity_from_handle(params.entity);
|
||||
if(entity->kind == DF_EntityKind_Process)
|
||||
for(DF_HandleNode *n = params.entity_list.first; n != 0; n = n->next)
|
||||
{
|
||||
CTRL_Msg msg = {CTRL_MsgKind_Detach};
|
||||
msg.machine_id = entity->ctrl_machine_id;
|
||||
msg.entity = entity->ctrl_handle;
|
||||
MemoryCopyArray(msg.exception_code_filters, df_state->ctrl_exception_code_filters);
|
||||
df_push_ctrl_msg(&msg);
|
||||
DF_Entity *entity = df_entity_from_handle(n->handle);
|
||||
if(entity->kind == DF_EntityKind_Process)
|
||||
{
|
||||
CTRL_Msg msg = {CTRL_MsgKind_Detach};
|
||||
msg.machine_id = entity->ctrl_machine_id;
|
||||
msg.entity = entity->ctrl_handle;
|
||||
MemoryCopyArray(msg.exception_code_filters, df_state->ctrl_exception_code_filters);
|
||||
df_push_ctrl_msg(&msg);
|
||||
}
|
||||
}
|
||||
}break;
|
||||
case DF_CoreCmdKind_Continue:
|
||||
@@ -6910,17 +7104,6 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt)
|
||||
}
|
||||
}
|
||||
}break;
|
||||
case DF_CoreCmdKind_RunToModuleOffset:
|
||||
{
|
||||
DF_Entity *thread = df_entity_from_handle(params.entity);
|
||||
DF_Entity *module = df_module_from_thread(thread);
|
||||
U64 voff = params.voff;
|
||||
U64 vaddr = df_vaddr_from_voff(module, voff);
|
||||
DF_CmdParams params = df_cmd_params_zero();
|
||||
params.vaddr = vaddr;
|
||||
df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_VirtualAddr);
|
||||
df_cmd_list_push(arena, cmds, ¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_RunToAddress));
|
||||
}break;
|
||||
case DF_CoreCmdKind_Halt:
|
||||
if(df_ctrl_targets_running())
|
||||
{
|
||||
@@ -6953,7 +7136,7 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt)
|
||||
DF_CmdParams params = df_cmd_params_zero();
|
||||
df_cmd_list_push(arena, cmds, ¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Continue));
|
||||
}
|
||||
else
|
||||
else if(!df_ctrl_targets_running())
|
||||
{
|
||||
DF_CmdParams params = df_cmd_params_zero();
|
||||
df_cmd_list_push(arena, cmds, ¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_LaunchAndRun));
|
||||
@@ -7008,7 +7191,7 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt)
|
||||
}
|
||||
df_cmd_list_push(arena, cmds, ¶ms, df_cmd_spec_from_core_cmd_kind(step_cmd_kind));
|
||||
}
|
||||
else
|
||||
else if(!df_ctrl_targets_running())
|
||||
{
|
||||
DF_EntityList targets = df_push_active_target_list(scratch.arena);
|
||||
DF_CmdParams p = params;
|
||||
@@ -7154,7 +7337,7 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt)
|
||||
FileProperties props = {0};
|
||||
String8 data = {0};
|
||||
{
|
||||
OS_Handle file = os_file_open(OS_AccessFlag_Shared|OS_AccessFlag_Read, new_path);
|
||||
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);
|
||||
@@ -7200,7 +7383,7 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt)
|
||||
{
|
||||
DF_Entity *file_entity = cfg_files[src];
|
||||
String8 path = df_full_path_from_entity(scratch.arena, file_entity);
|
||||
OS_Handle file = os_file_open(OS_AccessFlag_Shared|OS_AccessFlag_Read, path);
|
||||
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(data.size != 0)
|
||||
@@ -7696,17 +7879,51 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt)
|
||||
}break;
|
||||
case DF_CoreCmdKind_SetFileReplacementPath:
|
||||
{
|
||||
// NOTE(rjf):
|
||||
//
|
||||
// C:/foo/bar/baz.c
|
||||
// D:/foo/bar/baz.c
|
||||
// -> override C: -> D:
|
||||
//
|
||||
// C:/1/2/foo/bar.c
|
||||
// C:/2/3/foo/bar.c
|
||||
// -> override C:/1/2 -> C:2/3
|
||||
//
|
||||
// C:/foo/bar/baz.c
|
||||
// D:/1/2/3.c
|
||||
// -> override C:/foo/bar/baz.c -> D:/1/2/3.c
|
||||
|
||||
//- rjf: grab src file & chosen replacement
|
||||
DF_Entity *file = df_entity_from_handle(params.entity);
|
||||
DF_Entity *replacement = df_entity_from_path(params.file_path, DF_EntityFromPathFlag_OpenAsNeeded|DF_EntityFromPathFlag_OpenMissing);
|
||||
if(!df_entity_is_nil(file) && !df_entity_is_nil(replacement))
|
||||
|
||||
//- rjf: find
|
||||
DF_Entity *first_diff_src = file;
|
||||
DF_Entity *first_diff_dst = replacement;
|
||||
for(;!df_entity_is_nil(first_diff_src) && !df_entity_is_nil(first_diff_dst);)
|
||||
{
|
||||
DF_Entity *link = df_entity_child_from_name_and_kind(file->parent, file->name, DF_EntityKind_OverrideFileLink);
|
||||
if(!str8_match(first_diff_src->name, first_diff_dst->name, StringMatchFlag_CaseInsensitive) ||
|
||||
first_diff_src->parent->kind != DF_EntityKind_File ||
|
||||
first_diff_src->parent->parent->kind != DF_EntityKind_File ||
|
||||
first_diff_dst->parent->kind != DF_EntityKind_File ||
|
||||
first_diff_dst->parent->parent->kind != DF_EntityKind_File)
|
||||
{
|
||||
break;
|
||||
}
|
||||
first_diff_src = first_diff_src->parent;
|
||||
first_diff_dst = first_diff_dst->parent;
|
||||
}
|
||||
|
||||
//- rjf: override first different
|
||||
if(!df_entity_is_nil(first_diff_src) && !df_entity_is_nil(first_diff_dst))
|
||||
{
|
||||
DF_Entity *link = df_entity_child_from_name_and_kind(first_diff_src->parent, first_diff_src->name, DF_EntityKind_OverrideFileLink);
|
||||
if(df_entity_is_nil(link))
|
||||
{
|
||||
link = df_entity_alloc(0, file->parent, DF_EntityKind_OverrideFileLink);
|
||||
df_entity_equip_name(0, link, file->name);
|
||||
link = df_entity_alloc(0, first_diff_src->parent, DF_EntityKind_OverrideFileLink);
|
||||
df_entity_equip_name(0, link, first_diff_src->name);
|
||||
}
|
||||
df_entity_equip_entity_handle(link, df_handle_from_entity(replacement));
|
||||
df_entity_equip_entity_handle(link, df_handle_from_entity(first_diff_dst));
|
||||
}
|
||||
}break;
|
||||
|
||||
|
||||
+27
-11
@@ -818,6 +818,7 @@ struct DF_EvalVizRow
|
||||
String8 expr;
|
||||
String8 display_value;
|
||||
String8 edit_value;
|
||||
TG_KeyList inherited_type_key_chain;
|
||||
|
||||
// rjf: variable-size & hook info
|
||||
U64 size_in_rows;
|
||||
@@ -852,14 +853,29 @@ struct DF_EvalVizWindowedRowList
|
||||
////////////////////////////////
|
||||
//~ rjf: Command Specification Types
|
||||
|
||||
typedef U32 DF_CmdQueryFlags;
|
||||
enum
|
||||
{
|
||||
DF_CmdQueryFlag_AllowFiles = (1<<0),
|
||||
DF_CmdQueryFlag_AllowFolders = (1<<1),
|
||||
DF_CmdQueryFlag_CodeInput = (1<<2),
|
||||
DF_CmdQueryFlag_KeepOldInput = (1<<3),
|
||||
DF_CmdQueryFlag_SelectOldInput = (1<<4),
|
||||
DF_CmdQueryFlag_Required = (1<<5),
|
||||
};
|
||||
|
||||
typedef struct DF_CmdQuery DF_CmdQuery;
|
||||
struct DF_CmdQuery
|
||||
{
|
||||
DF_CmdParamSlot slot;
|
||||
DF_EntityKind entity_kind;
|
||||
DF_CmdQueryFlags flags;
|
||||
};
|
||||
|
||||
typedef U32 DF_CmdSpecFlags;
|
||||
enum
|
||||
{
|
||||
DF_CmdSpecFlag_OmitFromLists = (1<<0),
|
||||
DF_CmdSpecFlag_RunKeepsQuery = (1<<1),
|
||||
DF_CmdSpecFlag_QueryUsesOldInput = (1<<2),
|
||||
DF_CmdSpecFlag_AppliesToView = (1<<3),
|
||||
DF_CmdSpecFlag_QueryIsCode = (1<<4),
|
||||
};
|
||||
|
||||
typedef struct DF_CmdSpecInfo DF_CmdSpecInfo;
|
||||
@@ -870,10 +886,8 @@ struct DF_CmdSpecInfo
|
||||
String8 search_tags;
|
||||
String8 display_name;
|
||||
DF_CmdSpecFlags flags;
|
||||
DF_CmdParamSlot query_slots[4];
|
||||
DF_CmdQueryRule query_rule;
|
||||
DF_CmdQuery query;
|
||||
DF_IconKind canonical_icon_kind;
|
||||
U64 query_info_u64[2];
|
||||
};
|
||||
|
||||
typedef struct DF_CmdSpec DF_CmdSpec;
|
||||
@@ -1128,11 +1142,12 @@ struct DF_State
|
||||
DF_EntityListCache bin_file_cache;
|
||||
|
||||
// rjf: per-run caches
|
||||
B32 unwind_cache_invalidated;
|
||||
U64 unwind_cache_reggen_idx;
|
||||
U64 unwind_cache_memgen_idx;
|
||||
DF_RunUnwindCache unwind_cache;
|
||||
B32 locals_cache_invalidated;
|
||||
U64 locals_cache_reggen_idx;
|
||||
DF_RunLocalsCache locals_cache;
|
||||
B32 member_cache_invalidated;
|
||||
U64 member_cache_reggen_idx;
|
||||
DF_RunLocalsCache member_cache;
|
||||
|
||||
// rjf: eval view cache
|
||||
@@ -1558,10 +1573,11 @@ internal CTRL_Event df_ctrl_last_stop_event(void);
|
||||
//~ rjf: Evaluation
|
||||
|
||||
internal B32 df_eval_memory_read(void *u, void *out, U64 addr, U64 size);
|
||||
internal EVAL_ParseCtx df_eval_parse_ctx_from_module_voff(DBGI_Scope *scope, DF_Entity *module, U64 voff);
|
||||
internal EVAL_ParseCtx df_eval_parse_ctx_from_process_vaddr(DBGI_Scope *scope, DF_Entity *process, U64 vaddr);
|
||||
internal EVAL_ParseCtx df_eval_parse_ctx_from_src_loc(DBGI_Scope *scope, DF_Entity *file, TxtPt pt);
|
||||
internal DF_Eval df_eval_from_string(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, String8 string);
|
||||
internal DF_Eval df_value_mode_eval_from_eval(TG_Graph *graph, RADDBG_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF_Eval eval);
|
||||
internal DF_Eval df_dynamically_typed_eval_from_eval(TG_Graph *graph, RADDBG_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF_Eval eval);
|
||||
internal DF_Eval df_eval_from_eval_cfg_table(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_Eval eval, DF_CfgTable *cfg);
|
||||
|
||||
////////////////////////////////
|
||||
|
||||
+208
-233
@@ -91,6 +91,7 @@ DF_CmdParamSlotTable:
|
||||
{FilePath, file_path, `String8`}
|
||||
{TextPoint, text_point, `TxtPt`}
|
||||
{CmdSpec, cmd_spec, `struct DF_CmdSpec *`}
|
||||
{ViewSpec, view_spec, `struct DF_ViewSpec *`}
|
||||
{VirtualAddr, vaddr, `U64`}
|
||||
{VirtualOff, voff, `U64`}
|
||||
{Index, index, `U64`}
|
||||
@@ -99,303 +100,284 @@ DF_CmdParamSlotTable:
|
||||
{ForceConfirm, force_confirm,`B32`}
|
||||
}
|
||||
|
||||
@table(name, display_string, args_desc)
|
||||
DF_CmdQueryRuleTable:
|
||||
@table(name lister_omit q_slot q_ent_kind q_allow_files q_allow_folders q_keep_oi q_select_oi q_is_code q_required canonical_icon string display_name desc search_tags )
|
||||
// / | | \___ ______________________________________________/ | | | | |
|
||||
// / | | \ / | | | | |
|
||||
DF_CoreCmdTable:// | | | | | | | | |
|
||||
{
|
||||
{Null "" "" }
|
||||
{Entity "" "" }
|
||||
{String "" "" }
|
||||
{SearchString "" "" }
|
||||
{FilePath "File Path" "<file path>" }
|
||||
{TextPoint "Text Point" "<line>[:column]" }
|
||||
{FilePathAndTextPoint "Source Location" "<file path>[:line[:column]]" }
|
||||
{VirtualAddr "Virtual Address" "<address>" }
|
||||
{VirtualOff "Virtual Offset" "<offset>" }
|
||||
{Index "Index" "<index>" }
|
||||
{ID "ID" "<id>" }
|
||||
}
|
||||
|
||||
@table(name lister_omit keep_query old_input apply_to_view query_is_code query_slot0 query_slot1 query_slot2 query_entity_filter query_rule query_info_0_u64 query_info_1_u64 canonical_icon string display_name desc search_tags )
|
||||
DF_CoreCmdTable:
|
||||
{
|
||||
{Null 1 0 0 0 0 Null Null Null Null Null 0 0 Null "" "" "" "" }
|
||||
{Null 1 Null Nil 0 0 0 0 0 0 Null "" "" "" "" }
|
||||
|
||||
//- rjf: exiting
|
||||
{Exit 0 0 0 0 0 Null Null Null Null Null 0 0 X "exit" "Exit" "Exits the debugger." "quit,close,abort" }
|
||||
{Exit 0 Null Nil 0 0 0 0 0 0 X "exit" "Exit" "Exits the debugger." "quit,close,abort" }
|
||||
|
||||
//- rjf: command fast path
|
||||
{CommandFastPath 1 0 0 0 0 CmdSpec Null Null Null Null 0 0 Null "command_fast_path" "Command Fast Path" "Performs the fast path for the command named by the argument." "" }
|
||||
//- rjf: command runner
|
||||
{RunCommand 0 CmdSpec Nil 0 0 0 0 0 0 Null "run_command" "Run Command" "Runs a command from the command palette." "help,cmd" }
|
||||
|
||||
//- rjf: notifications
|
||||
{Error 1 0 0 0 0 String Null Null Null Null 0 0 Null "error" "Error" "Notifies of an error." "" }
|
||||
{Error 1 Null Nil 0 0 0 0 0 0 Null "error" "Error" "Notifies of an error." "" }
|
||||
|
||||
//- rjf: low-level target control operations
|
||||
{LaunchAndRun 0 0 0 0 0 EntityList Null Null Target Entity DF_EntityKind_Target 0 Play "launch_and_run" "Launch and Run" "Starts debugging a new instance of a target, then runs." "launch,start,run,target" }
|
||||
{LaunchAndInit 0 0 0 0 0 EntityList Null Null Target Entity DF_EntityKind_Target 0 PlayStepForward "launch_and_init" "Launch and Initialize" "Starts debugging a new instance of a target, then stops at the program's entry point." "launch,start,entry,point" }
|
||||
{Kill 0 0 0 0 0 EntityList Null Null Process Entity DF_EntityKind_Process 0 Stop "kill" "Kill" "Kills the specified existing debugged process(es)." "stop,kill" }
|
||||
{KillAll 0 0 0 0 0 Null Null Null Null Null 0 0 Stop "kill_all" "Kill All" "Kills all debugged child processes." "stop,kill,all" }
|
||||
{Detach 0 0 0 0 0 EntityList Null Null Process Entity DF_EntityKind_Process 0 Null "detach" "Detach" "Detaches the specified debugged process." "detach" }
|
||||
{Continue 0 0 0 0 0 Null Null Null Null Null 0 0 Play "continue" "Continue" "Continues all halted threads." "" }
|
||||
{StepIntoInst 0 0 0 0 0 Entity Null Null Null Null 0 0 StepInto "step_into_inst" "Step Into (Assembly)" "Performs a step that goes into calls, at the instruction level." "single,step,thread" }
|
||||
{StepOverInst 0 0 0 0 0 Entity Null Null Null Null 0 0 StepOver "step_over_inst" "Step Over (Assembly)" "Performs a step that skips calls, at the instruction level." "single,step,thread" }
|
||||
{StepIntoLine 0 0 0 0 0 Entity Null Null Null Null 0 0 StepInto "step_into_line" "Step Into (Line)" "Performs a step that goes into calls, at the source code line level." "step,thread" }
|
||||
{StepOverLine 0 0 0 0 0 Entity Null Null Null Null 0 0 StepOver "step_over_line" "Step Over (Line)" "Performs a step that skips calls, at the source code line level." "step,thread" }
|
||||
{StepOut 0 0 0 0 0 Entity Null Null Null Null 0 0 StepOut "step_out" "Step Out" "Runs to the end of the current function and exits it." "" }
|
||||
{RunToAddress 0 0 0 0 0 Entity VirtualAddr Null Thread VirtualAddr 0 0 PlayStepForward "run_to_address" "Run To Address" "Runs the selected thread to the specified address." "" }
|
||||
{RunToModuleOffset 0 0 0 0 0 Entity VirtualOff Null Thread VirtualOff 0 0 PlayStepForward "run_to_module_offset" "Run To Module Offset" "Runs the selected thread to the specified offset within the current module." "" }
|
||||
{Halt 0 0 0 0 0 Null Null Null Null Null 0 0 Pause "halt" "Halt" "Halts all running processes." "pause" }
|
||||
{SoftHaltRefresh 0 0 0 0 0 Null Null Null Null Null 0 0 Refresh "soft_halt_refresh" "Soft Halt Refresh" "Interrupts all running processes to collect data, and then resumes them." "" }
|
||||
{SetThreadIP 1 0 0 0 0 Entity VirtualAddr Null Null Null 0 0 Null "set_thread_ip" "Set Thread IP" "Sets the passed thread's instruction pointer at the passed address." "" }
|
||||
{LaunchAndRun 0 EntityList Target 0 0 0 0 0 1 Play "launch_and_run" "Launch and Run" "Starts debugging a new instance of a target, then runs." "launch,start,run,target" }
|
||||
{LaunchAndInit 0 EntityList Target 0 0 0 0 0 1 PlayStepForward "launch_and_init" "Launch and Initialize" "Starts debugging a new instance of a target, then stops at the program's entry point." "launch,start,entry,point" }
|
||||
{Kill 0 EntityList Process 0 0 0 0 0 1 Stop "kill" "Kill" "Kills the specified existing debugged process(es)." "stop,kill" }
|
||||
{KillAll 0 Null Nil 0 0 0 0 0 0 Stop "kill_all" "Kill All" "Kills all debugged child processes." "stop,kill,all" }
|
||||
{Detach 0 EntityList Process 0 0 0 0 0 1 Null "detach" "Detach" "Detaches the specified debugged process." "detach" }
|
||||
{Continue 0 Null Nil 0 0 0 0 0 0 Play "continue" "Continue" "Continues all halted threads." "" }
|
||||
{StepIntoInst 0 Null Nil 0 0 0 0 0 0 StepInto "step_into_inst" "Step Into (Assembly)" "Performs a step that goes into calls, at the instruction level." "single,step,thread" }
|
||||
{StepOverInst 0 Null Nil 0 0 0 0 0 0 StepOver "step_over_inst" "Step Over (Assembly)" "Performs a step that skips calls, at the instruction level." "single,step,thread" }
|
||||
{StepIntoLine 0 Null Nil 0 0 0 0 0 0 StepInto "step_into_line" "Step Into (Line)" "Performs a step that goes into calls, at the source code line level." "step,thread" }
|
||||
{StepOverLine 0 Null Nil 0 0 0 0 0 0 StepOver "step_over_line" "Step Over (Line)" "Performs a step that skips calls, at the source code line level." "step,thread" }
|
||||
{StepOut 0 Null Nil 0 0 0 0 0 0 StepOut "step_out" "Step Out" "Runs to the end of the current function and exits it." "" }
|
||||
{RunToAddress 0 VirtualAddr Nil 0 0 0 0 1 1 PlayStepForward "run_to_address" "Run To Address" "Runs the selected thread to the specified address." "" }
|
||||
{Halt 0 Null Nil 0 0 0 0 0 0 Pause "halt" "Halt" "Halts all running processes." "pause" }
|
||||
{SoftHaltRefresh 0 Null Nil 0 0 0 0 0 0 Refresh "soft_halt_refresh" "Soft Halt Refresh" "Interrupts all running processes to collect data, and then resumes them." "" }
|
||||
{SetThreadIP 1 VirtualAddr Nil 0 0 0 0 1 1 Null "set_thread_ip" "Set Thread IP" "Sets the passed thread's instruction pointer at the passed address." "" }
|
||||
|
||||
//- rjf: high-level composite target control operations
|
||||
{Run 0 0 0 0 0 Null Null Null Null Null 0 0 Play "run" "Run" "Runs all targets after starting them if they have not been started yet." "play" }
|
||||
{Restart 0 0 0 0 0 Null Null Null Null Null 0 0 Redo "restart" "Restart" "Kills all running processes, then restarts the targets which were used to launch all current processes (if any)." "restart,retry" }
|
||||
{StepInto 0 0 0 0 0 Entity Null Null Thread Null 0 0 StepInto "step_into" "Step Into" "Steps once, possibly into function calls, for either line or instructions." "" }
|
||||
{StepOver 0 0 0 0 0 Entity Null Null Thread Null 0 0 StepOver "step_over" "Step Over" "Steps once, always over function calls, for either line or instructions." "" }
|
||||
{RunToCursor 0 0 0 0 0 Entity View Null Thread Null 0 0 Play "run_to_cursor" "Run To Cursor" "Runs the selected thread to the current cursor." "" }
|
||||
{SetNextStatement 0 0 0 0 0 Entity View Null Thread Null 0 0 RightArrow "set_next_statement" "Set Next Statement" "Sets the selected thread's instruction pointer to the cursor's position." "" }
|
||||
{Run 0 Null Nil 0 0 0 0 0 0 Play "run" "Run" "Runs all targets after starting them if they have not been started yet." "play" }
|
||||
{Restart 0 Null Nil 0 0 0 0 0 0 Redo "restart" "Restart" "Kills all running processes, then restarts the targets which were used to launch all current processes (if any)." "restart,retry" }
|
||||
{StepInto 0 Null Nil 0 0 0 0 0 0 StepInto "step_into" "Step Into" "Steps once, possibly into function calls, for either line or instructions." "" }
|
||||
{StepOver 0 Null Nil 0 0 0 0 0 0 StepOver "step_over" "Step Over" "Steps once, always over function calls, for either line or instructions." "" }
|
||||
{RunToCursor 0 Null Nil 0 0 0 0 0 0 Play "run_to_cursor" "Run To Cursor" "Runs the selected thread to the current cursor." "" }
|
||||
{SetNextStatement 0 Null Nil 0 0 0 0 0 0 RightArrow "set_next_statement" "Set Next Statement" "Sets the selected thread's instruction pointer to the cursor's position." "" }
|
||||
|
||||
//- rjf: solo stepping mode
|
||||
{EnableSoloSteppingMode 0 0 0 0 0 Null Null Null Null Null 0 0 Thread "enable_solo_stepping_mode" "Enable Solo Stepping Mode" "Enables 'solo stepping mode', which suspends all non-selected threads before stepping." "solo,stepping,mode,suspend" }
|
||||
{DisableSoloSteppingMode 0 0 0 0 0 Null Null Null Null Null 0 0 Thread "disable_solo_stepping_mode" "Disable Solo Stepping Mode" "Disables 'solo stepping mode', which suspends all non-selected threads before stepping." "solo,stepping,mode,suspend" }
|
||||
{EnableSoloSteppingMode 0 Null Nil 0 0 0 0 0 0 Thread "enable_solo_stepping_mode" "Enable Solo Stepping Mode" "Enables 'solo stepping mode', which suspends all non-selected threads before stepping." "solo,stepping,mode,suspend" }
|
||||
{DisableSoloSteppingMode 0 Null Nil 0 0 0 0 0 0 Thread "disable_solo_stepping_mode" "Disable Solo Stepping Mode" "Disables 'solo stepping mode', which suspends all non-selected threads before stepping." "solo,stepping,mode,suspend" }
|
||||
|
||||
//- rjf: debug control context management operations
|
||||
{SelectThread 0 0 0 0 0 Entity Null Null Thread Entity DF_EntityKind_Thread 0 Null "select_thread" "Select Thread" "Selects a thread." "" }
|
||||
{SelectThreadWindow 0 0 0 0 0 Entity Window Null Thread Entity DF_EntityKind_Thread 0 Null "select_thread_window" "Select Thread On Window" "Selects a thread for the active window, overriding the global selected thread." "" }
|
||||
{SelectThreadView 0 0 0 0 0 Entity View Null Thread Entity DF_EntityKind_Thread 0 Null "select_thread_view" "Select Thread On View" "Selects a thread for the active view, overriding the global and per-window selected threads." "" }
|
||||
{SelectUnwind 1 0 0 0 0 Index Null Null Null Null 0 0 Null "select_unwind" "Select Unwind" "Selects an unwind frame number for the selected thread." "" }
|
||||
{UpOneFrame 0 0 0 0 0 Null Null Null Null Null 0 0 UpArrow "up_one_frame" "Up One Frame" "Selects the callstack frame above the currently selected." "" }
|
||||
{DownOneFrame 0 0 0 0 0 Null Null Null Null Null 0 0 DownArrow "down_one_frame" "Down One Frame" "Selects the callstack frame below the currently selected." "" }
|
||||
{FreezeThread 0 0 0 0 0 Entity Null Null Thread Entity DF_EntityKind_Thread 0 Locked "freeze_thread" "Freeze Thread" "Freezes the passed thread." "" }
|
||||
{ThawThread 0 0 0 0 0 Entity Null Null Thread Entity DF_EntityKind_Thread 0 Unlocked "thaw_thread" "Thaw Thread" "Thaws the passed thread." "" }
|
||||
{FreezeProcess 0 0 0 0 0 Entity Null Null Process Entity DF_EntityKind_Process 0 Locked "freeze_process" "Freeze Process" "Freezes the passed process." "" }
|
||||
{ThawProcess 0 0 0 0 0 Entity Null Null Process Entity DF_EntityKind_Process 0 Unlocked "thaw_process" "Thaw Process" "Thaws the passed process." "" }
|
||||
{FreezeMachine 1 0 0 0 0 Entity Null Null Machine Entity DF_EntityKind_Machine 0 Locked "freeze_machine" "Freeze Machine" "Freezes the passed machine." "" }
|
||||
{ThawMachine 1 0 0 0 0 Entity Null Null Machine Entity DF_EntityKind_Machine 0 Unlocked "thaw_machine" "Thaw Machine" "Thaws the passed machine." "" }
|
||||
{FreezeLocalMachine 0 0 0 0 0 Null Null Null Null Null 0 0 Machine "freeze_local_machine" "Freeze Local Machine" "Freezes the local machine." "" }
|
||||
{ThawLocalMachine 0 0 0 0 0 Null Null Null Null Null 0 0 Machine "thaw_local_machine" "Thaw Local Machine" "Thaws the local machine." "" }
|
||||
{SelectThread 0 Entity Thread 0 0 0 0 0 1 Null "select_thread" "Select Thread" "Selects a thread." "" }
|
||||
{SelectThreadWindow 0 Entity Thread 0 0 0 0 0 1 Null "select_thread_window" "Select Thread On Window" "Selects a thread for the active window, overriding the global selected thread." "" }
|
||||
{SelectThreadView 0 Entity Thread 0 0 0 0 0 1 Null "select_thread_view" "Select Thread On View" "Selects a thread for the active view, overriding the global and per-window selected threads." "" }
|
||||
{SelectUnwind 1 Null Nil 0 0 0 0 0 0 Null "select_unwind" "Select Unwind" "Selects an unwind frame number for the selected thread." "" }
|
||||
{UpOneFrame 0 Null Nil 0 0 0 0 0 0 UpArrow "up_one_frame" "Up One Frame" "Selects the callstack frame above the currently selected." "" }
|
||||
{DownOneFrame 0 Null Nil 0 0 0 0 0 0 DownArrow "down_one_frame" "Down One Frame" "Selects the callstack frame below the currently selected." "" }
|
||||
{FreezeThread 0 Entity Thread 0 0 0 0 0 1 Locked "freeze_thread" "Freeze Thread" "Freezes the passed thread." "" }
|
||||
{ThawThread 0 Entity Thread 0 0 0 0 0 1 Unlocked "thaw_thread" "Thaw Thread" "Thaws the passed thread." "" }
|
||||
{FreezeProcess 0 Entity Process 0 0 0 0 0 1 Locked "freeze_process" "Freeze Process" "Freezes the passed process." "" }
|
||||
{ThawProcess 0 Entity Process 0 0 0 0 0 1 Unlocked "thaw_process" "Thaw Process" "Thaws the passed process." "" }
|
||||
{FreezeMachine 1 Entity Machine 0 0 0 0 0 1 Locked "freeze_machine" "Freeze Machine" "Freezes the passed machine." "" }
|
||||
{ThawMachine 1 Entity Machine 0 0 0 0 0 1 Unlocked "thaw_machine" "Thaw Machine" "Thaws the passed machine." "" }
|
||||
{FreezeLocalMachine 0 Null Nil 0 0 0 0 0 0 Machine "freeze_local_machine" "Freeze Local Machine" "Freezes the local machine." "" }
|
||||
{ThawLocalMachine 0 Null Nil 0 0 0 0 0 0 Machine "thaw_local_machine" "Thaw Local Machine" "Thaws the local machine." "" }
|
||||
|
||||
//- rjf: font sizes
|
||||
{IncUIFontScale 0 0 0 0 0 Window Null Null Null Null 0 0 Null "inc_ui_font_scale" "Increase UI Font Scale" "Increases the font size used for UI." "" }
|
||||
{DecUIFontScale 0 0 0 0 0 Window Null Null Null Null 0 0 Null "dec_ui_font_scale" "Decrease UI Font Scale" "Decreases the font size used for UI." "" }
|
||||
{IncCodeFontScale 0 0 0 0 0 Window Null Null Null Null 0 0 Null "inc_code_font_scale" "Increase Code Font Scale" "Increases the font size used for code." "" }
|
||||
{DecCodeFontScale 0 0 0 0 0 Window Null Null Null Null 0 0 Null "dec_code_font_scale" "Decrease Code Font Scale" "Decreases the font size used for code." "" }
|
||||
{IncUIFontScale 0 Null Nil 0 0 0 0 0 0 Null "inc_ui_font_scale" "Increase UI Font Scale" "Increases the font size used for UI." "" }
|
||||
{DecUIFontScale 0 Null Nil 0 0 0 0 0 0 Null "dec_ui_font_scale" "Decrease UI Font Scale" "Decreases the font size used for UI." "" }
|
||||
{IncCodeFontScale 0 Null Nil 0 0 0 0 0 0 Null "inc_code_font_scale" "Increase Code Font Scale" "Increases the font size used for code." "" }
|
||||
{DecCodeFontScale 0 Null Nil 0 0 0 0 0 0 Null "dec_code_font_scale" "Decrease Code Font Scale" "Decreases the font size used for code." "" }
|
||||
|
||||
//- rjf: windows
|
||||
{OpenWindow 0 0 0 0 0 Null Null Null Null Null 0 0 Window "open_window" "Open New Window" "Opens a new window." "" }
|
||||
{CloseWindow 0 0 0 0 0 Window Null Null Null Null 0 0 Window "close_window" "Close Window" "Closes an opened window." "" }
|
||||
{ToggleFullscreen 0 0 0 0 0 Window Null Null Null Null 0 0 Window "toggle_fullscreen" "Toggle Fullscreen" "Toggles fullscreen view on the active window." "" }
|
||||
{OpenWindow 0 Null Nil 0 0 0 0 0 0 Window "open_window" "Open New Window" "Opens a new window." "" }
|
||||
{CloseWindow 0 Null Nil 0 0 0 0 0 0 Window "close_window" "Close Window" "Closes an opened window." "" }
|
||||
{ToggleFullscreen 0 Null Nil 0 0 0 0 0 0 Window "toggle_fullscreen" "Toggle Fullscreen" "Toggles fullscreen view on the active window." "" }
|
||||
|
||||
//- rjf: confirmations
|
||||
{ConfirmAccept 1 0 0 0 0 Null Null Null Null Null 0 0 Null "confirm_accept" "Confirm Accept" "Accepts the active confirmation prompt." "" }
|
||||
{ConfirmCancel 1 0 0 0 0 Null Null Null Null Null 0 0 Null "confirm_cancel" "Confirm Cancel" "Cancels the active confirmation prompt." "" }
|
||||
{ConfirmAccept 1 Null Nil 0 0 0 0 0 0 Null "confirm_accept" "Confirm Accept" "Accepts the active confirmation prompt." "" }
|
||||
{ConfirmCancel 1 Null Nil 0 0 0 0 0 0 Null "confirm_cancel" "Confirm Cancel" "Cancels the active confirmation prompt." "" }
|
||||
|
||||
//- rjf: panel splitting
|
||||
{ResetToDefaultPanels 0 0 0 0 0 Window Null Null Null Null 0 0 Window "reset_to_default_panels" "Reset To Default Panel Layout" "Resets the window to the default panel layout." "panel" }
|
||||
{NewPanelRight 0 0 0 0 0 Window Panel Null Null Null 0 0 XSplit "new_panel_right" "Split Panel Vertically" "Creates a new panel to the right of the active panel." "panel" }
|
||||
{NewPanelDown 0 0 0 0 0 Window Panel Null Null Null 0 0 YSplit "new_panel_down" "Split Panel Horizontally" "Creates a new panel at the bottom of the active panel." "panel" }
|
||||
{ResetToDefaultPanels 0 Null Nil 0 0 0 0 0 0 Window "reset_to_default_panels" "Reset To Default Panel Layout" "Resets the window to the default panel layout." "panel" }
|
||||
{NewPanelRight 0 Null Nil 0 0 0 0 0 0 XSplit "new_panel_right" "Split Panel Vertically" "Creates a new panel to the right of the active panel." "panel" }
|
||||
{NewPanelDown 0 Null Nil 0 0 0 0 0 0 YSplit "new_panel_down" "Split Panel Horizontally" "Creates a new panel at the bottom of the active panel." "panel" }
|
||||
|
||||
//- rjf: panel rotation
|
||||
{RotatePanelColumns 0 0 0 0 0 Window Panel Null Null Null 0 0 Null "rotate_panel_columns" "Rotate Panel Columns" "Rotates all panels at the closest column level of the panel hierarchy." "" }
|
||||
{RotatePanelColumns 0 Null Nil 0 0 0 0 0 0 Null "rotate_panel_columns" "Rotate Panel Columns" "Rotates all panels at the closest column level of the panel hierarchy." "" }
|
||||
|
||||
//- rjf: focused panel changing
|
||||
{NextPanel 0 0 0 0 0 Window Null Null Null Null 0 0 RightArrow "next_panel" "Focus Next Panel" "Cycles the active panel forward." "" }
|
||||
{PrevPanel 0 0 0 0 0 Window Null Null Null Null 0 0 LeftArrow "prev_panel" "Focus Previous Panel" "Cycles the active panel backwards." "" }
|
||||
{FocusPanel 1 0 0 0 0 Window Panel Null Null Null 0 0 Null "focus_panel" "Focus Panel" "Focuses a new panel." "" }
|
||||
{FocusPanelRight 0 0 0 0 0 Window Null Null Null Null 0 0 RightArrow "focus_panel_right" "Focus Panel Right" "Focuses a panel rightward of the currently focused panel." "" }
|
||||
{FocusPanelLeft 0 0 0 0 0 Window Null Null Null Null 0 0 LeftArrow "focus_panel_left" "Focus Panel Left" "Focuses a panel leftward of the currently focused panel." "" }
|
||||
{FocusPanelUp 0 0 0 0 0 Window Null Null Null Null 0 0 UpArrow "focus_panel_up" "Focus Panel Up" "Focuses a panel upward of the currently focused panel." "" }
|
||||
{FocusPanelDown 0 0 0 0 0 Window Null Null Null Null 0 0 DownArrow "focus_panel_down" "Focus Panel Down" "Focuses a panel downward of the currently focused panel." "" }
|
||||
{NextPanel 0 Null Nil 0 0 0 0 0 0 RightArrow "next_panel" "Focus Next Panel" "Cycles the active panel forward." "" }
|
||||
{PrevPanel 0 Null Nil 0 0 0 0 0 0 LeftArrow "prev_panel" "Focus Previous Panel" "Cycles the active panel backwards." "" }
|
||||
{FocusPanel 1 Null Nil 0 0 0 0 0 0 Null "focus_panel" "Focus Panel" "Focuses a new panel." "" }
|
||||
{FocusPanelRight 0 Null Nil 0 0 0 0 0 0 RightArrow "focus_panel_right" "Focus Panel Right" "Focuses a panel rightward of the currently focused panel." "" }
|
||||
{FocusPanelLeft 0 Null Nil 0 0 0 0 0 0 LeftArrow "focus_panel_left" "Focus Panel Left" "Focuses a panel leftward of the currently focused panel." "" }
|
||||
{FocusPanelUp 0 Null Nil 0 0 0 0 0 0 UpArrow "focus_panel_up" "Focus Panel Up" "Focuses a panel upward of the currently focused panel." "" }
|
||||
{FocusPanelDown 0 Null Nil 0 0 0 0 0 0 DownArrow "focus_panel_down" "Focus Panel Down" "Focuses a panel downward of the currently focused panel." "" }
|
||||
|
||||
//- rjf: undo/redo
|
||||
{Undo 1 0 0 0 0 Null Null Null Null Null 0 0 Undo "undo" "Undo" "Undoes the previous action." "" }
|
||||
{Redo 1 0 0 0 0 Null Null Null Null Null 0 0 Redo "redo" "Redo" "Redoes the first previously undone action." "" }
|
||||
{Undo 1 Null Nil 0 0 0 0 0 0 Undo "undo" "Undo" "Undoes the previous action." "" }
|
||||
{Redo 1 Null Nil 0 0 0 0 0 0 Redo "redo" "Redo" "Redoes the first previously undone action." "" }
|
||||
|
||||
//- rjf: focus history
|
||||
{GoBack 1 0 0 0 0 Window Panel Null Null Null 0 0 LeftArrow "go_back" "Go Back" "Returns to the previously selected panel and tab in recorded history." "" }
|
||||
{GoForward 1 0 0 0 0 Window Panel Null Null Null 0 0 RightArrow "go_forward" "Go Forward" "Returns to the next selected panel and tab in recorded history." "" }
|
||||
{GoBack 1 Null Nil 0 0 0 0 0 0 LeftArrow "go_back" "Go Back" "Returns to the previously selected panel and tab in recorded history." "" }
|
||||
{GoForward 1 Null Nil 0 0 0 0 0 0 RightArrow "go_forward" "Go Forward" "Returns to the next selected panel and tab in recorded history." "" }
|
||||
|
||||
//- rjf: panel removal
|
||||
{ClosePanel 0 0 0 0 0 Window Panel Null Null Null 0 0 ClosePanel "close_panel" "Close Panel" "Closes the currently active panel." "" }
|
||||
{ClosePanel 0 Null Nil 0 0 0 0 0 0 ClosePanel "close_panel" "Close Panel" "Closes the currently active panel." "" }
|
||||
|
||||
//- rjf: panel tab
|
||||
{NextTab 0 0 0 0 0 Null Null Null Null Null 0 0 RightArrow "next_tab" "Focus Next Tab" "Focuses the next tab on the active panel." "" }
|
||||
{PrevTab 0 0 0 0 0 Null Null Null Null Null 0 0 LeftArrow "prev_tab" "Focus Previous Tab" "Focuses the previous tab on the active panel." "" }
|
||||
{MoveTabRight 0 0 0 0 0 Null Null Null Null Null 0 0 RightArrow "move_tab_right" "Move Tab Right" "Moves the selected tab right one slot." "" }
|
||||
{MoveTabLeft 0 0 0 0 0 Null Null Null Null Null 0 0 LeftArrow "move_tab_left" "Move Tab Left" "Moves the selected tab left one slot." "" }
|
||||
{CloseTab 0 0 0 0 0 Null Null Null Null Null 0 0 X "close_tab" "Close Tab" "Closes the currently opened tab." "" }
|
||||
{MoveTab 1 0 0 0 0 Null Null Null Null Null 0 0 Null "move_tab" "Move Tab" "Moves a tab to a new panel." "" }
|
||||
{TabBarTop 0 0 0 0 0 Null Null Null Null Null 0 0 UpArrow "tab_bar_top" "Anchor Tab Bar To Top" "Anchors a panel's tab bar to the top of the panel." "" }
|
||||
{TabBarBottom 0 0 0 0 0 Null Null Null Null Null 0 0 DownArrow "tab_bar_bottom" "Anchor Tab Bar To Bottom" "Anchors a panel's tab bar to the bottom of the panel." "" }
|
||||
{TabBarEnable 0 0 0 0 0 Null Null Null Null Null 0 0 Null "tab_bar_enable" "Enable Tab Bar" "Enables a panel's tab bar." "" }
|
||||
{TabBarDisable 0 0 0 0 0 Null Null Null Null Null 0 0 Null "tab_bar_disable" "Disable Tab Bar" "Disables a panel's tab bar." "" }
|
||||
{TabBarHistoryModeEnable 0 0 0 0 0 Null Null Null Null Null 0 0 Null "tab_bar_history_mode_enable" "Enable Tab Bar History Mode" "Enables history mode for a panel's tab bar, which orders and manages tabs as recorded history of views." "" }
|
||||
{TabBarHistoryModeDisable 0 0 0 0 0 Null Null Null Null Null 0 0 Null "tab_bar_history_mode_disable""Disable Tab Bar History Mode" "Disables history mode for a panel's tab bar." "" }
|
||||
{NextTab 0 Null Nil 0 0 0 0 0 0 RightArrow "next_tab" "Focus Next Tab" "Focuses the next tab on the active panel." "" }
|
||||
{PrevTab 0 Null Nil 0 0 0 0 0 0 LeftArrow "prev_tab" "Focus Previous Tab" "Focuses the previous tab on the active panel." "" }
|
||||
{MoveTabRight 0 Null Nil 0 0 0 0 0 0 RightArrow "move_tab_right" "Move Tab Right" "Moves the selected tab right one slot." "" }
|
||||
{MoveTabLeft 0 Null Nil 0 0 0 0 0 0 LeftArrow "move_tab_left" "Move Tab Left" "Moves the selected tab left one slot." "" }
|
||||
{OpenTab 1 Null Nil 0 0 0 0 0 0 Null "open_tab" "Open Tab" "Opens a new tab with the parameterized view specification." "" }
|
||||
{CloseTab 0 Null Nil 0 0 0 0 0 0 X "close_tab" "Close Tab" "Closes the currently opened tab." "" }
|
||||
{MoveTab 1 Null Nil 0 0 0 0 0 0 Null "move_tab" "Move Tab" "Moves a tab to a new panel." "" }
|
||||
{TabBarTop 0 Null Nil 0 0 0 0 0 0 UpArrow "tab_bar_top" "Anchor Tab Bar To Top" "Anchors a panel's tab bar to the top of the panel." "" }
|
||||
{TabBarBottom 0 Null Nil 0 0 0 0 0 0 DownArrow "tab_bar_bottom" "Anchor Tab Bar To Bottom" "Anchors a panel's tab bar to the bottom of the panel." "" }
|
||||
|
||||
//- rjf: files
|
||||
{SetCurrentPath 0 0 0 0 0 FilePath Null Null Null FilePath 0 0 FileOutline "set_current_path" "Set Current Path" "Sets the debugger's current path, which is used as a starting point when browsing for files." "" }
|
||||
{Open 0 0 0 0 0 FilePath Null Null Null FilePath 0 0 FileOutline "open" "Open" "Opens a file." "code,source,file" }
|
||||
{Reload 0 0 0 0 0 Entity Null Null File Entity DF_EntityKind_File 0 FileOutline "reload" "Reload" "Reloads a loaded file." "code,source,file,reload" }
|
||||
{ReloadActive 0 0 0 0 0 Window Panel Null Null Null 0 0 FileOutline "reload_active" "Reload Active File" "Reloads the active file." "code,source,file,reload" }
|
||||
{Switch 0 0 0 0 0 Window Panel Entity File Entity DF_EntityKind_File DF_EntityFlag_IsFolder FileOutline "switch" "Switch" "Switches to a loaded file." "code,source,file" }
|
||||
{SetCurrentPath 1 Null Nil 0 0 0 0 0 0 FileOutline "set_current_path" "Set Current Path" "Sets the debugger's current path, which is used as a starting point when browsing for files." "" }
|
||||
{Open 0 FilePath Nil 1 0 0 0 0 1 FileOutline "open" "Open" "Opens a file." "code,source,file" }
|
||||
{Reload 0 Entity File 0 0 0 0 0 1 FileOutline "reload" "Reload" "Reloads a loaded file." "code,source,file,reload" }
|
||||
{ReloadActive 0 Null Nil 0 0 0 0 0 0 FileOutline "reload_active" "Reload Active File" "Reloads the active file." "code,source,file,reload" }
|
||||
{Switch 0 Entity File 0 0 0 0 0 1 FileOutline "switch" "Switch" "Switches to a loaded file." "code,source,file" }
|
||||
{SwitchToPartnerFile 0 Null Nil 0 0 0 0 0 0 FileOutline "switch_to_partner_file" "Switch To Partner File" "Switches to the focused file's partner; or from header to implementation or vice versa." "code,source,file" }
|
||||
|
||||
//- rjf: override file links
|
||||
{SetFileOverrideLinkSrc 1 0 0 0 0 Null Null Null Null Null 0 0 Null "set_file_override_link_src" "Set File Override Link Source" "Sets the source path for an override file link." "" }
|
||||
{SetFileOverrideLinkDst 1 0 0 0 0 Null Null Null Null Null 0 0 Null "set_file_override_link_dst" "Set File Override Link Destination" "Sets the destination path for an override file link." "" }
|
||||
{SetFileReplacementPath 1 0 0 0 0 Null Null Null Null Null 0 0 Null "set_file_replacement_path" "Set File Replacement Path" "Sets the path which should be used as the replacement for the passed file." "" }
|
||||
{SetFileOverrideLinkSrc 1 Null Nil 0 0 0 0 0 0 Null "set_file_override_link_src" "Set File Override Link Source" "Sets the source path for an override file link." "" }
|
||||
{SetFileOverrideLinkDst 1 Null Nil 0 0 0 0 0 0 Null "set_file_override_link_dst" "Set File Override Link Destination" "Sets the destination path for an override file link." "" }
|
||||
{SetFileReplacementPath 1 Null Nil 0 0 0 0 0 0 Null "set_file_replacement_path" "Set File Replacement Path" "Sets the path which should be used as the replacement for the passed file." "" }
|
||||
|
||||
//- rjf: setting config paths
|
||||
{LoadUser 0 0 0 0 0 FilePath Null Null Null FilePath 0 0 Person "load_user" "Load User" "Loads and applies a user file." "load,user,profile,layout" }
|
||||
{LoadProfile 0 0 0 0 0 FilePath Null Null Null FilePath 0 0 Briefcase "load_profile" "Load Profile" "Loads and applies a profile file." "profile,project,session" }
|
||||
{LoadUser 0 FilePath Nil 1 0 0 0 0 1 Person "load_user" "Load User" "Loads and applies a user file." "load,user,profile,layout" }
|
||||
{LoadProfile 0 FilePath Nil 1 0 0 0 0 1 Briefcase "load_profile" "Load Profile" "Loads and applies a profile file." "profile,project,session" }
|
||||
|
||||
//- rjf: loading/applying stateful config changes
|
||||
{ApplyUserData 1 0 0 0 0 Null Null Null Null Null 0 0 Null "apply_user_data" "Apply User Data" "Applies user data from the active user file." "" }
|
||||
{ApplyProfileData 1 0 0 0 0 Null Null Null Null Null 0 0 Null "apply_profile_data" "Apply Profile Data" "Applies profile data from the active profile file." "" }
|
||||
{ApplyUserData 1 Null Nil 0 0 0 0 0 0 Null "apply_user_data" "Apply User Data" "Applies user data from the active user file." "" }
|
||||
{ApplyProfileData 1 Null Nil 0 0 0 0 0 0 Null "apply_profile_data" "Apply Profile Data" "Applies profile data from the active profile file." "" }
|
||||
|
||||
//- rjf: writing config changes
|
||||
{WriteUserData 1 0 0 0 0 Null Null Null Null Null 0 0 Null "write_user_data" "Write User Data" "Writes user data to the active user file." "" }
|
||||
{WriteProfileData 1 0 0 0 0 Null Null Null Null Null 0 0 Null "write_profile_data" "Write Profile Data" "Writes profile data to the active profile file." "" }
|
||||
{WriteUserData 1 Null Nil 0 0 0 0 0 0 Null "write_user_data" "Write User Data" "Writes user data to the active user file." "" }
|
||||
{WriteProfileData 1 Null Nil 0 0 0 0 0 0 Null "write_profile_data" "Write Profile Data" "Writes profile data to the active profile file." "" }
|
||||
|
||||
//- rjf: directional movement & text controls
|
||||
{MoveLeft 0 0 0 0 0 Null Null Null Null Null 0 0 Null "move_left" "Move Left" "Moves the cursor or selection left." "" }
|
||||
{MoveRight 0 0 0 0 0 Null Null Null Null Null 0 0 Null "move_right" "Move Right" "Moves the cursor or selection right." "" }
|
||||
{MoveUp 0 0 0 0 0 Null Null Null Null Null 0 0 Null "move_up" "Move Up" "Moves the cursor or selection up." "" }
|
||||
{MoveDown 0 0 0 0 0 Null Null Null Null Null 0 0 Null "move_down" "Move Down" "Moves the cursor or selection down." "" }
|
||||
{MoveLeftSelect 0 0 0 0 0 Null Null Null Null Null 0 0 Null "move_left_select" "Move Left Select" "Moves the cursor or selection left, while selecting." "" }
|
||||
{MoveRightSelect 0 0 0 0 0 Null Null Null Null Null 0 0 Null "move_right_select" "Move Right Select" "Moves the cursor or selection right, while selecting." "" }
|
||||
{MoveUpSelect 0 0 0 0 0 Null Null Null Null Null 0 0 Null "move_up_select" "Move Up Select" "Moves the cursor or selection up, while selecting." "" }
|
||||
{MoveDownSelect 0 0 0 0 0 Null Null Null Null Null 0 0 Null "move_down_select" "Move Down Select" "Moves the cursor or selection down, while selecting." "" }
|
||||
{MoveLeftChunk 0 0 0 0 0 Null Null Null Null Null 0 0 Null "move_left_chunk" "Move Left Select" "Moves the cursor or selection left one chunk." "" }
|
||||
{MoveRightChunk 0 0 0 0 0 Null Null Null Null Null 0 0 Null "move_right_chunk" "Move Right Select" "Moves the cursor or selection right one chunk." "" }
|
||||
{MoveUpChunk 0 0 0 0 0 Null Null Null Null Null 0 0 Null "move_up_chunk" "Move Up Chunk" "Moves the cursor or selection up one chunk." "" }
|
||||
{MoveDownChunk 0 0 0 0 0 Null Null Null Null Null 0 0 Null "move_down_chunk" "Move Down Chunk" "Moves the cursor or selection down one chunk." "" }
|
||||
{MoveUpPage 0 0 0 0 0 Null Null Null Null Null 0 0 Null "move_up_page" "Move Up Page" "Moves the cursor or selection up one page." "" }
|
||||
{MoveDownPage 0 0 0 0 0 Null Null Null Null Null 0 0 Null "move_down_page" "Move Down Page" "Moves the cursor or selection down one page." "" }
|
||||
{MoveUpWhole 0 0 0 0 0 Null Null Null Null Null 0 0 Null "move_up_whole" "Move Up Whole" "Moves the cursor or selection to the beginning of the relevant content." "" }
|
||||
{MoveDownWhole 0 0 0 0 0 Null Null Null Null Null 0 0 Null "move_down_whole" "Move Down Whole" "Moves the cursor or selection to the end of the relevant content." "" }
|
||||
{MoveLeftChunkSelect 0 0 0 0 0 Null Null Null Null Null 0 0 Null "move_left_chunk_select" "Move Left Chunk Select" "Moves the cursor or selection left one chunk." "" }
|
||||
{MoveRightChunkSelect 0 0 0 0 0 Null Null Null Null Null 0 0 Null "move_right_chunk_select" "Move Right Chunk Select" "Moves the cursor or selection right one chunk." "" }
|
||||
{MoveUpChunkSelect 0 0 0 0 0 Null Null Null Null Null 0 0 Null "move_up_chunk_select" "Move Up Chunk Select" "Moves the cursor or selection up one chunk." "" }
|
||||
{MoveDownChunkSelect 0 0 0 0 0 Null Null Null Null Null 0 0 Null "move_down_chunk_select" "Move Down Chunk Select" "Moves the cursor or selection down one chunk." "" }
|
||||
{MoveUpPageSelect 0 0 0 0 0 Null Null Null Null Null 0 0 Null "move_up_page_select" "Move Up Page Select" "Moves the cursor or selection up one page, while selecting." "" }
|
||||
{MoveDownPageSelect 0 0 0 0 0 Null Null Null Null Null 0 0 Null "move_down_page_select" "Move Down Page Select" "Moves the cursor or selection down one page, while selecting." "" }
|
||||
{MoveUpWholeSelect 0 0 0 0 0 Null Null Null Null Null 0 0 Null "move_up_whole_select" "Move Up Whole Select" "Moves the cursor or selection to the beginning of the relevant content, while selecting." "" }
|
||||
{MoveDownWholeSelect 0 0 0 0 0 Null Null Null Null Null 0 0 Null "move_down_whole_select" "Move Down Whole Select" "Moves the cursor or selection to the end of the relevant content, while selecting." "" }
|
||||
{MoveHome 0 0 0 0 0 Null Null Null Null Null 0 0 Null "move_home" "Move Home" "Moves the cursor to the beginning of the line." "" }
|
||||
{MoveEnd 0 0 0 0 0 Null Null Null Null Null 0 0 Null "move_end" "Move End" "Moves the cursor to the end of the line." "" }
|
||||
{MoveHomeSelect 0 0 0 0 0 Null Null Null Null Null 0 0 Null "move_home_select" "Move Home Select" "Moves the cursor to the beginning of the line, while selecting." "" }
|
||||
{MoveEndSelect 0 0 0 0 0 Null Null Null Null Null 0 0 Null "move_end_select" "Move End Select" "Moves the cursor to the end of the line, while selecting." "" }
|
||||
{SelectAll 0 0 0 0 0 Null Null Null Null Null 0 0 Null "select_all" "Select All" "Selects everything possible." "" }
|
||||
{DeleteSingle 0 0 0 0 0 Null Null Null Null Null 0 0 Null "delete_single" "Delete Single" "Deletes a single element to the right of the cursor, or the active selection." "" }
|
||||
{DeleteChunk 0 0 0 0 0 Null Null Null Null Null 0 0 Null "delete_chunk" "Delete Chunk" "Deletes a chunk to the right of the cursor, or the active selection." "" }
|
||||
{BackspaceSingle 0 0 0 0 0 Null Null Null Null Null 0 0 Null "backspace_single" "Backspace Single" "Deletes a single element to the left of the cursor, or the active selection." "" }
|
||||
{BackspaceChunk 0 0 0 0 0 Null Null Null Null Null 0 0 Null "backspace_chunk" "Backspace Chunk" "Deletes a chunk to the left of the cursor, or the active selection." "" }
|
||||
{Copy 0 0 0 0 0 Null Null Null Null Null 0 0 Clipboard "copy" "Copy" "Copies the active selection to the clipboard." "" }
|
||||
{Cut 0 0 0 0 0 Null Null Null Null Null 0 0 Clipboard "cut" "Cut" "Copies the active selection to the clipboard, then deletes it." "" }
|
||||
{Paste 0 0 0 0 0 Null Null Null Null Null 0 0 Clipboard "paste" "Paste" "Pastes the current contents of the clipboard." "" }
|
||||
{InsertText 1 0 0 0 0 Null Null Null Null Null 0 0 Null "insert_text" "Insert Text" "Inserts the text that was used to cause this command." "" }
|
||||
{MoveLeft 0 Null Nil 0 0 0 0 0 0 Null "move_left" "Move Left" "Moves the cursor or selection left." "" }
|
||||
{MoveRight 0 Null Nil 0 0 0 0 0 0 Null "move_right" "Move Right" "Moves the cursor or selection right." "" }
|
||||
{MoveUp 0 Null Nil 0 0 0 0 0 0 Null "move_up" "Move Up" "Moves the cursor or selection up." "" }
|
||||
{MoveDown 0 Null Nil 0 0 0 0 0 0 Null "move_down" "Move Down" "Moves the cursor or selection down." "" }
|
||||
{MoveLeftSelect 0 Null Nil 0 0 0 0 0 0 Null "move_left_select" "Move Left Select" "Moves the cursor or selection left, while selecting." "" }
|
||||
{MoveRightSelect 0 Null Nil 0 0 0 0 0 0 Null "move_right_select" "Move Right Select" "Moves the cursor or selection right, while selecting." "" }
|
||||
{MoveUpSelect 0 Null Nil 0 0 0 0 0 0 Null "move_up_select" "Move Up Select" "Moves the cursor or selection up, while selecting." "" }
|
||||
{MoveDownSelect 0 Null Nil 0 0 0 0 0 0 Null "move_down_select" "Move Down Select" "Moves the cursor or selection down, while selecting." "" }
|
||||
{MoveLeftChunk 0 Null Nil 0 0 0 0 0 0 Null "move_left_chunk" "Move Left Select" "Moves the cursor or selection left one chunk." "" }
|
||||
{MoveRightChunk 0 Null Nil 0 0 0 0 0 0 Null "move_right_chunk" "Move Right Select" "Moves the cursor or selection right one chunk." "" }
|
||||
{MoveUpChunk 0 Null Nil 0 0 0 0 0 0 Null "move_up_chunk" "Move Up Chunk" "Moves the cursor or selection up one chunk." "" }
|
||||
{MoveDownChunk 0 Null Nil 0 0 0 0 0 0 Null "move_down_chunk" "Move Down Chunk" "Moves the cursor or selection down one chunk." "" }
|
||||
{MoveUpPage 0 Null Nil 0 0 0 0 0 0 Null "move_up_page" "Move Up Page" "Moves the cursor or selection up one page." "" }
|
||||
{MoveDownPage 0 Null Nil 0 0 0 0 0 0 Null "move_down_page" "Move Down Page" "Moves the cursor or selection down one page." "" }
|
||||
{MoveUpWhole 0 Null Nil 0 0 0 0 0 0 Null "move_up_whole" "Move Up Whole" "Moves the cursor or selection to the beginning of the relevant content." "" }
|
||||
{MoveDownWhole 0 Null Nil 0 0 0 0 0 0 Null "move_down_whole" "Move Down Whole" "Moves the cursor or selection to the end of the relevant content." "" }
|
||||
{MoveLeftChunkSelect 0 Null Nil 0 0 0 0 0 0 Null "move_left_chunk_select" "Move Left Chunk Select" "Moves the cursor or selection left one chunk." "" }
|
||||
{MoveRightChunkSelect 0 Null Nil 0 0 0 0 0 0 Null "move_right_chunk_select" "Move Right Chunk Select" "Moves the cursor or selection right one chunk." "" }
|
||||
{MoveUpChunkSelect 0 Null Nil 0 0 0 0 0 0 Null "move_up_chunk_select" "Move Up Chunk Select" "Moves the cursor or selection up one chunk." "" }
|
||||
{MoveDownChunkSelect 0 Null Nil 0 0 0 0 0 0 Null "move_down_chunk_select" "Move Down Chunk Select" "Moves the cursor or selection down one chunk." "" }
|
||||
{MoveUpPageSelect 0 Null Nil 0 0 0 0 0 0 Null "move_up_page_select" "Move Up Page Select" "Moves the cursor or selection up one page, while selecting." "" }
|
||||
{MoveDownPageSelect 0 Null Nil 0 0 0 0 0 0 Null "move_down_page_select" "Move Down Page Select" "Moves the cursor or selection down one page, while selecting." "" }
|
||||
{MoveUpWholeSelect 0 Null Nil 0 0 0 0 0 0 Null "move_up_whole_select" "Move Up Whole Select" "Moves the cursor or selection to the beginning of the relevant content, while selecting." "" }
|
||||
{MoveDownWholeSelect 0 Null Nil 0 0 0 0 0 0 Null "move_down_whole_select" "Move Down Whole Select" "Moves the cursor or selection to the end of the relevant content, while selecting." "" }
|
||||
{MoveHome 0 Null Nil 0 0 0 0 0 0 Null "move_home" "Move Home" "Moves the cursor to the beginning of the line." "" }
|
||||
{MoveEnd 0 Null Nil 0 0 0 0 0 0 Null "move_end" "Move End" "Moves the cursor to the end of the line." "" }
|
||||
{MoveHomeSelect 0 Null Nil 0 0 0 0 0 0 Null "move_home_select" "Move Home Select" "Moves the cursor to the beginning of the line, while selecting." "" }
|
||||
{MoveEndSelect 0 Null Nil 0 0 0 0 0 0 Null "move_end_select" "Move End Select" "Moves the cursor to the end of the line, while selecting." "" }
|
||||
{SelectAll 0 Null Nil 0 0 0 0 0 0 Null "select_all" "Select All" "Selects everything possible." "" }
|
||||
{DeleteSingle 0 Null Nil 0 0 0 0 0 0 Null "delete_single" "Delete Single" "Deletes a single element to the right of the cursor, or the active selection." "" }
|
||||
{DeleteChunk 0 Null Nil 0 0 0 0 0 0 Null "delete_chunk" "Delete Chunk" "Deletes a chunk to the right of the cursor, or the active selection." "" }
|
||||
{BackspaceSingle 0 Null Nil 0 0 0 0 0 0 Null "backspace_single" "Backspace Single" "Deletes a single element to the left of the cursor, or the active selection." "" }
|
||||
{BackspaceChunk 0 Null Nil 0 0 0 0 0 0 Null "backspace_chunk" "Backspace Chunk" "Deletes a chunk to the left of the cursor, or the active selection." "" }
|
||||
{Copy 0 Null Nil 0 0 0 0 0 0 Clipboard "copy" "Copy" "Copies the active selection to the clipboard." "" }
|
||||
{Cut 0 Null Nil 0 0 0 0 0 0 Clipboard "cut" "Cut" "Copies the active selection to the clipboard, then deletes it." "" }
|
||||
{Paste 0 Null Nil 0 0 0 0 0 0 Clipboard "paste" "Paste" "Pastes the current contents of the clipboard." "" }
|
||||
{InsertText 1 Null Nil 0 0 0 0 0 0 Null "insert_text" "Insert Text" "Inserts the text that was used to cause this command." "" }
|
||||
|
||||
//- rjf: code navigation
|
||||
{GoToLine 0 0 0 1 0 TextPoint Null Null Null TextPoint 0 0 Null "goto_line" "Go To Line" "Jumps to a line number in the current code file." "" }
|
||||
{GoToAddress 0 0 0 1 1 VirtualAddr Null Null Null VirtualAddr 0 0 Null "goto_address" "Go To Address" "Jumps to an address in the current memory or disassembly view." "" }
|
||||
{CenterCursor 0 0 0 0 0 Null Null Null Null Null 0 0 Null "center_cursor" "Center Cursor" "Snaps the current code view to center the cursor." "" }
|
||||
{ContainCursor 0 0 0 0 0 Null Null Null Null Null 0 0 Null "contain_cursor" "Contain Cursor" "Snaps the current code view to contain the cursor." "" }
|
||||
{FindTextForward 0 1 1 1 1 String Null Null Null SearchString 0 0 Find "find_text_forward" "Find Text (Forward)" "Searches the current code file forward (from the cursor) for a string." "" }
|
||||
{FindTextBackward 0 1 1 1 1 String Null Null Null SearchString 0 0 Find "find_text_backward" "Find Text (Backwards)" "Searches the current code file backwards (from the cursor) for a string." "" }
|
||||
{FindNext 0 1 1 1 0 String Null Null Null Null 0 0 Find "find_next" "Find Next" "Searches the current code file forward (from the cursor) for the last searched string." "" }
|
||||
{FindPrev 0 1 1 1 0 String Null Null Null Null 0 0 Find "find_prev" "Find Previous" "Searches the current code file backwards (from the cursor) for the last searched string." "" }
|
||||
{GoToLine 0 TextPoint Nil 0 0 0 0 1 1 Null "goto_line" "Go To Line" "Jumps to a line number in the current code file." "" }
|
||||
{GoToAddress 0 VirtualAddr Nil 0 0 0 0 1 1 Null "goto_address" "Go To Address" "Jumps to an address in the current memory or disassembly view." "" }
|
||||
{CenterCursor 0 Null Nil 0 0 0 0 0 0 Null "center_cursor" "Center Cursor" "Snaps the current code view to center the cursor." "" }
|
||||
{ContainCursor 0 Null Nil 0 0 0 0 0 0 Null "contain_cursor" "Contain Cursor" "Snaps the current code view to contain the cursor." "" }
|
||||
{FindTextForward 0 String Nil 0 0 1 1 1 1 Find "find_text_forward" "Find Text (Forward)" "Searches the current code file forward (from the cursor) for a string." "" }
|
||||
{FindTextBackward 0 String Nil 0 0 1 1 1 1 Find "find_text_backward" "Find Text (Backwards)" "Searches the current code file backwards (from the cursor) for a string." "" }
|
||||
{FindNext 0 Null Nil 0 0 1 0 0 0 Find "find_next" "Find Next" "Searches the current code file forward (from the cursor) for the last searched string." "" }
|
||||
{FindPrev 0 Null Nil 0 0 1 0 0 0 Find "find_prev" "Find Previous" "Searches the current code file backwards (from the cursor) for the last searched string." "" }
|
||||
|
||||
//- rjf: thread finding
|
||||
{FindThread 0 0 0 0 0 Entity Null Null Thread Entity DF_EntityKind_Thread 0 Find "find_thread" "Find Thread" "Jumps to the passed thread in either source code, disassembly, or both if they're already open." "" }
|
||||
{FindSelectedThread 0 0 0 0 0 Null Null Null Null Null 0 0 Find "find_selected_thread" "Find Selected Thread" "Jumps to the selected thread in either source code, disassembly, or both if they're already open." "" }
|
||||
{FindThread 0 Entity Thread 0 0 0 0 0 1 Find "find_thread" "Find Thread" "Jumps to the passed thread in either source code, disassembly, or both if they're already open." "" }
|
||||
{FindSelectedThread 0 Null Nil 0 0 0 0 0 0 Find "find_selected_thread" "Find Selected Thread" "Jumps to the selected thread in either source code, disassembly, or both if they're already open." "" }
|
||||
|
||||
//- rjf: name finding
|
||||
{GoToName 0 0 0 0 1 Null Null Null Null String 0 0 Null "goto_name" "Go To Name" "Searches for the passed string as a file, a symbol in debug info, and more, then jumps to it if possible." "" }
|
||||
{GoToNameAtCursor 0 0 0 0 0 Null Null Null Null Null 0 0 Null "goto_name_at_cursor" "Go To Name At Cursor" "Searches for the text at the cursor as a file, a symbol in debug info, and more, then jumps to it if possible." "" }
|
||||
{GoToName 0 String Nil 0 0 0 0 1 1 Null "goto_name" "Go To Name" "Searches for the passed string as a file, a symbol in debug info, and more, then jumps to it if possible." "" }
|
||||
{GoToNameAtCursor 0 Null Nil 0 0 0 0 0 0 Null "goto_name_at_cursor" "Go To Name At Cursor" "Searches for the text at the cursor as a file, a symbol in debug info, and more, then jumps to it if possible." "" }
|
||||
|
||||
//- rjf: watch expressions
|
||||
{ToggleWatchExpression 0 0 0 0 0 Null Null Null Null Null 0 0 Binoculars "toggle_watch_expr" "Toggle Watch Expression" "Adds or removes an expression to an opened watch view." "" }
|
||||
{ToggleWatchExpressionAtCursor 0 0 0 0 0 Null Null Null Null Null 0 0 Binoculars "toggle_watch_expr_at_cursor" "Toggle Watch Expression At Cursor" "Adds or removes the expression that the cursor or selection is currently over to an opened watch view." "" }
|
||||
|
||||
//- rjf: memory openers
|
||||
{OpenFileMemory 0 0 0 0 0 Entity Null Null File Entity DF_EntityKind_File 0 Grid "open_file_memory" "Open File Memory" "Opens a memory view for the passed file." "" }
|
||||
{OpenProcessMemory 0 0 0 0 0 Entity Null Null Process Entity DF_EntityKind_Process 0 Grid "open_process_memory" "Open Process Memory" "Opens a memory view for the passed process." "" }
|
||||
{OpenSelectedProcessMemory 0 0 0 0 0 Null Null Null Null Null 0 0 Grid "open_selected_process_memory""Open Selected Process Memory" "Opens a memory view for the selected process." "" }
|
||||
{ToggleWatchExpression 0 Null Nil 0 0 0 0 0 0 Binoculars "toggle_watch_expr" "Toggle Watch Expression" "Adds or removes an expression to an opened watch view." "" }
|
||||
{ToggleWatchExpressionAtCursor 0 Null Nil 0 0 0 0 0 0 Binoculars "toggle_watch_expr_at_cursor" "Toggle Watch Expression At Cursor" "Adds or removes the expression that the cursor or selection is currently over to an opened watch view." "" }
|
||||
|
||||
//- rjf: memory view parameterization
|
||||
{SetColumns 0 0 0 1 0 Index Null Null Null Index 0 0 Thumbnails "set_columns" "Set Columns" "Sets the number of columns for a memory view." "" }
|
||||
{SetColumns 0 Index Nil 0 0 0 0 1 1 Thumbnails "set_columns" "Set Columns" "Sets the number of columns for a memory view." "" }
|
||||
|
||||
//- rjf: disassembly view parameterization
|
||||
{ToggleAddressVisibility 0 0 0 1 0 Null Null Null Null Null 0 0 Thumbnails "toggle_address_visibility" "Toggle Address Visibility" "Toggles the visibility of addresses in a disassembly view." "" }
|
||||
{ToggleCodeBytesVisibility 0 0 0 1 0 Null Null Null Null Null 0 0 Thumbnails "toggle_code_bytes_visibility""Toggle Code Bytes Visibility" "Toggles the visibility of machine code bytes in a disassembly view." "" }
|
||||
{ToggleAddressVisibility 0 Null Nil 0 0 0 0 0 0 Thumbnails "toggle_address_visibility" "Toggle Address Visibility" "Toggles the visibility of addresses in a disassembly view." "" }
|
||||
{ToggleCodeBytesVisibility 0 Null Nil 0 0 0 0 0 0 Thumbnails "toggle_code_bytes_visibility""Toggle Code Bytes Visibility" "Toggles the visibility of machine code bytes in a disassembly view." "" }
|
||||
|
||||
//- rjf: general entity operations
|
||||
{EnableEntity 1 0 0 0 0 Null Null Null Null Null 0 0 Null "enable_entity" "Enable Entity" "Enables an entity." "" }
|
||||
{DisableEntity 1 0 0 0 0 Null Null Null Null Null 0 0 Null "disable_entity" "Disable Entity" "Disables an entity." "" }
|
||||
{FreezeEntity 1 0 0 0 0 Null Null Null Null Null 0 0 Null "freeze_entity" "Freeze Entity" "Freezes an entity." "" }
|
||||
{ThawEntity 1 0 0 0 0 Null Null Null Null Null 0 0 Null "thaw_entity" "Thaw Entity" "Thaws an entity." "" }
|
||||
{RemoveEntity 1 0 0 0 0 Null Null Null Null Null 0 0 Null "remove_entity" "Remove Entity" "Removes an entity." "" }
|
||||
{NameEntity 1 0 0 0 0 Entity String Null Null Null 0 0 Null "name_entity" "Name Entity" "Equips an entity with a name." "" }
|
||||
{EditEntity 1 0 0 0 0 Null Null Null Null Null 0 0 Null "edit_entity" "Edit Entity" "Opens the editor for an entity." "" }
|
||||
{DuplicateEntity 1 0 0 0 0 Null Null Null Null Null 0 0 Null "duplicate_entity" "Duplicate Entity" "Duplicates an entity." "" }
|
||||
{EnableEntity 1 Null Nil 0 0 0 0 0 0 Null "enable_entity" "Enable Entity" "Enables an entity." "" }
|
||||
{DisableEntity 1 Null Nil 0 0 0 0 0 0 Null "disable_entity" "Disable Entity" "Disables an entity." "" }
|
||||
{FreezeEntity 1 Null Nil 0 0 0 0 0 0 Null "freeze_entity" "Freeze Entity" "Freezes an entity." "" }
|
||||
{ThawEntity 1 Null Nil 0 0 0 0 0 0 Null "thaw_entity" "Thaw Entity" "Thaws an entity." "" }
|
||||
{RemoveEntity 1 Null Nil 0 0 0 0 0 0 Null "remove_entity" "Remove Entity" "Removes an entity." "" }
|
||||
{NameEntity 1 Null Nil 0 0 0 0 0 0 Null "name_entity" "Name Entity" "Equips an entity with a name." "" }
|
||||
{EditEntity 1 Null Nil 0 0 0 0 0 0 Null "edit_entity" "Edit Entity" "Opens the editor for an entity." "" }
|
||||
{DuplicateEntity 1 Null Nil 0 0 0 0 0 0 Null "duplicate_entity" "Duplicate Entity" "Duplicates an entity." "" }
|
||||
|
||||
//- rjf: breakpoints
|
||||
{TextBreakpoint 1 0 0 0 0 Null Null Null Null Null 0 0 CircleFilled "text_breakpoint" "Text Breakpoint" "Places or removes a breakpoint on the specified line of source code." "" }
|
||||
{AddressBreakpoint 0 0 0 0 1 VirtualAddr Null Null Null VirtualAddr 0 0 CircleFilled "address_breakpoint" "Address Breakpoint" "Places or removes a breakpoint on the specified address." "" }
|
||||
{FunctionBreakpoint 0 0 0 0 1 String Null Null Null String 0 0 CircleFilled "function_breakpoint" "Function Breakpoint" "Places or removes a breakpoint on the first address(es) of the specified function." "" }
|
||||
{ToggleBreakpointAtCursor 0 0 0 0 0 Null Null Null Null Null 0 0 CircleFilled "toggle_breakpoint_cursor" "Toggle Breakpoint At Cursor" "Places or removes a breakpoint on the line on which the active cursor sits." "" }
|
||||
{RemoveBreakpoint 0 0 0 0 0 Entity Null Null Breakpoint Entity DF_EntityKind_Breakpoint 0 Trash "remove_breakpoint" "Remove Breakpoint" "Removes an existing breakpoint." "" }
|
||||
{EnableBreakpoint 0 0 0 0 0 Entity Null Null Breakpoint Entity DF_EntityKind_Breakpoint 0 CheckFilled "enable_breakpoint" "Enable Breakpoint" "Enables a breakpoint." "" }
|
||||
{DisableBreakpoint 0 0 0 0 0 Entity Null Null Breakpoint Entity DF_EntityKind_Breakpoint 0 CheckHollow "disable_breakpoint" "Disable Breakpoint" "Disables a breakpoint." "" }
|
||||
{TextBreakpoint 1 Null Nil 0 0 0 0 0 0 CircleFilled "text_breakpoint" "Text Breakpoint" "Places or removes a breakpoint on the specified line of source code." "" }
|
||||
{AddressBreakpoint 0 VirtualAddr Nil 0 0 0 0 1 1 CircleFilled "address_breakpoint" "Address Breakpoint" "Places or removes a breakpoint on the specified address." "" }
|
||||
{FunctionBreakpoint 0 String Nil 0 0 0 0 1 1 CircleFilled "function_breakpoint" "Function Breakpoint" "Places or removes a breakpoint on the first address(es) of the specified function." "" }
|
||||
{ToggleBreakpointAtCursor 0 Null Nil 0 0 0 0 0 0 CircleFilled "toggle_breakpoint_cursor" "Toggle Breakpoint At Cursor" "Places or removes a breakpoint on the line on which the active cursor sits." "" }
|
||||
{RemoveBreakpoint 0 Entity Breakpoint 0 0 0 0 0 1 Trash "remove_breakpoint" "Remove Breakpoint" "Removes an existing breakpoint." "" }
|
||||
{EnableBreakpoint 0 Entity Breakpoint 0 0 0 0 0 1 CheckFilled "enable_breakpoint" "Enable Breakpoint" "Enables a breakpoint." "" }
|
||||
{DisableBreakpoint 0 Entity Breakpoint 0 0 0 0 0 1 CheckHollow "disable_breakpoint" "Disable Breakpoint" "Disables a breakpoint." "" }
|
||||
|
||||
//- rjf: watches
|
||||
{ToggleWatchPin 1 0 0 0 1 Entity TextPoint String Null String 0 0 Binoculars "toggle_watch_pin" "Toggle Watch Pin" "Places or removes a watch pin on a textual location on a particular entity." "" }
|
||||
{ToggleWatchPinAtCursor 0 0 0 1 1 String Null Null Null String 0 0 Binoculars "toggle_watch_pin_at_cursor" "Toggle Watch Pin At Cursor" "Places or removes a watch pin at the cursor on the currently active file." "" }
|
||||
{ToggleWatchPin 1 Null Nil 0 0 0 0 0 0 Binoculars "toggle_watch_pin" "Toggle Watch Pin" "Places or removes a watch pin on a textual location on a particular entity." "" }
|
||||
{ToggleWatchPinAtCursor 0 String Nil 0 0 0 0 1 1 Binoculars "toggle_watch_pin_at_cursor" "Toggle Watch Pin At Cursor" "Places or removes a watch pin at the cursor on the currently active file." "" }
|
||||
|
||||
//- rjf: targets
|
||||
{AddTarget 0 0 0 0 0 FilePath Null Null Null FilePath 0 0 Target "add_target" "Add Target" "Adds a new target." "application,executable,debug" }
|
||||
{RemoveTarget 0 0 0 0 0 Entity Null Null Target Entity DF_EntityKind_Target 0 Trash "remove_target" "Remove Target" "Removes an existing target." "delete,remove,target" }
|
||||
{EditTarget 0 0 0 0 0 Entity Null Null Target Entity DF_EntityKind_Target 0 Pencil "edit_target" "Edit Target" "Edits an existing target." "" }
|
||||
{AddTarget 0 FilePath Nil 1 0 0 0 0 1 Target "add_target" "Add Target" "Adds a new target." "application,executable,debug" }
|
||||
{RemoveTarget 0 Entity Target 0 0 0 0 0 1 Trash "remove_target" "Remove Target" "Removes an existing target." "delete,remove,target" }
|
||||
{EditTarget 0 Entity Target 0 0 0 0 0 1 Pencil "edit_target" "Edit Target" "Edits an existing target." "" }
|
||||
|
||||
//- rjf: ended processes
|
||||
{RetryEndedProcess 1 0 0 0 0 Entity Null Null EndedProcess Entity DF_EntityKind_EndedProcess 0 Null "retry_ended_process" "Retry Ended Process" "Launches a new process with the same options as the passed ended process." "" }
|
||||
{RetryEndedProcess 1 Entity Process 0 0 0 0 0 0 Null "retry_ended_process" "Retry Ended Process" "Launches a new process with the same options as the passed ended process." "" }
|
||||
|
||||
//- rjf: attaching
|
||||
{Attach 0 0 0 0 0 String Null Null Null String 0 0 Null "attach" "Attach" "Attaches to a process that is already running on the local machine." "" }
|
||||
{RegisterAsJITDebugger 0 0 0 0 0 Null Null Null Null Null 0 0 Null "register_as_jit_debugger" "Register As Just-In-Time (JIT) Debugger" "Registers the RAD debugger as the just-in-time (JIT) debugger used by the operating system." "" }
|
||||
{Attach 0 ID Nil 0 0 0 0 1 1 Null "attach" "Attach" "Attaches to a process that is already running on the local machine." "" }
|
||||
{RegisterAsJITDebugger 0 Null Nil 0 0 0 0 0 0 Null "register_as_jit_debugger" "Register As Just-In-Time (JIT) Debugger" "Registers the RAD debugger as the just-in-time (JIT) debugger used by the operating system." "" }
|
||||
|
||||
//- rjf: catchall general entity activation paths (drag/drop, clicking)
|
||||
{EntityRefFastPath 1 0 0 0 0 Null Null Null Null Null 0 0 Null "entity_ref_fast_path" "Entity Reference Fast Path" "Activates the default behavior when clicking an entity reference." "" }
|
||||
{SpawnEntityView 1 0 0 0 0 Null Null Null Null Null 0 0 Null "spawn_entity_view" "Spawn Entity View" "Spawns a new view, given an entity and other parameterizations." "" }
|
||||
{FindCodeLocation 0 0 0 0 0 FilePath TextPoint Null Null FilePathAndTextPoint 0 0 FileOutline "find_code_location" "Find Code Location" "Finds a specific source code location given file, line, and column coordinates. Opens the file if necessary." "" }
|
||||
{EntityRefFastPath 1 Null Nil 0 0 0 0 0 0 Null "entity_ref_fast_path" "Entity Reference Fast Path" "Activates the default behavior when clicking an entity reference." "" }
|
||||
{SpawnEntityView 1 Null Nil 0 0 0 0 0 0 Null "spawn_entity_view" "Spawn Entity View" "Spawns a new view, given an entity and other parameterizations." "" }
|
||||
{FindCodeLocation 1 FilePath Nil 0 0 0 0 0 1 FileOutline "find_code_location" "Find Code Location" "Finds a specific source code location given file, line, and column coordinates. Opens the file if necessary." "" }
|
||||
|
||||
//- rjf: view drivers
|
||||
{Commands 0 0 0 0 0 Null Null Null Null String 0 0 List "commands" "Commands" "Opens the list of all commands." "" }
|
||||
{Target 1 0 0 0 0 Null Null Null Null Null 0 0 Target "target_editor" "Target" "Opens the editor for a target." "" }
|
||||
{Targets 0 0 0 0 0 Null Null Null Null Null 0 0 Target "targets" "Targets" "Opens the list of all targets." "" }
|
||||
{FilePathMap 0 0 0 0 0 Null Null Null Null Null 0 0 FileOutline "file_path_map" "File Path Map" "Opens the file path mapping editor." "" }
|
||||
{Scheduler 0 0 0 0 0 Null Null Null Null Null 0 0 Scheduler "scheduler" "Scheduler" "Opens the scheduler view, for process and thread controls." "" }
|
||||
{CallStack 0 0 0 0 0 Null Null Null Null Null 0 0 Thread "call_stack" "Call Stack" "Opens the call stack view." "callstack,thread" }
|
||||
{Modules 0 0 0 0 0 Null Null Null Null Null 0 0 Module "modules" "Modules" "Opens the modules view." "" }
|
||||
{PendingEntity 1 0 0 0 0 Null Null Null Null Null 0 0 FileOutline "pending_entity" "Pending Entity" "Opens a view which waits for the passed entity to be completely loaded, then replaces itself with a new view." "" }
|
||||
{Code 1 0 0 0 0 Null Null Null Null Null 0 0 FileOutline "code" "Code" "Opens the code view for an already-loaded file." "" }
|
||||
{Watch 0 0 0 0 0 Null Null Null Null Null 0 0 Binoculars "watch" "Watch" "Opens a watch view." "" }
|
||||
{Locals 0 0 0 0 0 Null Null Null Null Null 0 0 Binoculars "locals" "Locals" "Opens a locals view." "" }
|
||||
{Registers 0 0 0 0 0 Null Null Null Null Null 0 0 Binoculars "registers" "Registers" "Opens a registers view for the currently selected thread." "" }
|
||||
{Output 0 0 0 0 0 Null Null Null Null Null 0 0 List "output" "Output" "Opens an output view." "" }
|
||||
{Memory 0 0 0 0 0 Null Null Null Null Null 0 0 Grid "memory" "Memory" "Opens a memory view." "" }
|
||||
{Disassembly 0 0 0 0 0 Null Null Null Null Null 0 0 Glasses "disassembly" "Disassembly" "Opens the disassembly view." "disasm" }
|
||||
{Breakpoints 0 0 0 0 0 Null Null Null Null Null 0 0 CircleFilled "breakpoints" "Breakpoints" "Opens the breakpoints view." "" }
|
||||
{WatchPins 0 0 0 0 0 Null Null Null Null Null 0 0 Pin "watch_pins" "Watch Pins" "Opens the watch pins view." "" }
|
||||
{ExceptionFilters 0 0 0 0 0 Null Null Null Null Null 0 0 Gear "exception_filters" "Exception Filters" "Opens the exception filters view." "exceptions,filters" }
|
||||
{Theme 0 0 0 0 0 Null Null Null Null Null 0 0 Palette "theme" "Theme" "Opens the theme view." "theme,color,scheme,palette" }
|
||||
{PickFile 1 0 0 1 0 FilePath Null Null Null FilePath 0 0 FileOutline "pick_file" "Pick File" "Opens the file browser to pick a file." "" }
|
||||
{Commands 0 Null Nil 0 0 0 0 0 0 List "commands" "Commands" "Opens the list of all commands." "" }
|
||||
{Target 1 Null Nil 0 0 0 0 0 0 Target "target" "Target" "Opens the editor for a target." "" }
|
||||
{Targets 0 Null Nil 0 0 0 0 0 0 Target "targets" "Targets" "Opens the list of all targets." "" }
|
||||
{FilePathMap 0 Null Nil 0 0 0 0 0 0 FileOutline "file_path_map" "File Path Map" "Opens the file path mapping editor." "" }
|
||||
{Scheduler 0 Null Nil 0 0 0 0 0 0 Scheduler "scheduler" "Scheduler" "Opens the scheduler view, for process and thread controls." "" }
|
||||
{CallStack 0 Null Nil 0 0 0 0 0 0 Thread "call_stack" "Call Stack" "Opens the call stack view." "callstack,thread" }
|
||||
{Modules 0 Null Nil 0 0 0 0 0 0 Module "modules" "Modules" "Opens the modules view." "" }
|
||||
{PendingEntity 1 Null Nil 0 0 0 0 0 0 FileOutline "pending_entity" "Pending Entity" "Opens a view which waits for the passed entity to be completely loaded, then replaces itself with a new view." "" }
|
||||
{Code 1 Null Nil 0 0 0 0 0 0 FileOutline "code" "Code" "Opens the code view for an already-loaded file." "" }
|
||||
{Watch 0 Null Nil 0 0 0 0 0 0 Binoculars "watch" "Watch" "Opens a watch view." "" }
|
||||
{Locals 0 Null Nil 0 0 0 0 0 0 Binoculars "locals" "Locals" "Opens a locals view." "" }
|
||||
{Registers 0 Null Nil 0 0 0 0 0 0 Binoculars "registers" "Registers" "Opens a registers view for the currently selected thread." "" }
|
||||
{Output 0 Null Nil 0 0 0 0 0 0 List "output" "Output" "Opens an output view." "" }
|
||||
{Memory 0 Null Nil 0 0 0 0 0 0 Grid "memory" "Memory" "Opens a memory view." "" }
|
||||
{Disassembly 0 Null Nil 0 0 0 0 0 0 Glasses "disassembly" "Disassembly" "Opens the disassembly view." "disasm" }
|
||||
{Breakpoints 0 Null Nil 0 0 0 0 0 0 CircleFilled "breakpoints" "Breakpoints" "Opens the breakpoints view." "" }
|
||||
{WatchPins 0 Null Nil 0 0 0 0 0 0 Pin "watch_pins" "Watch Pins" "Opens the watch pins view." "" }
|
||||
{ExceptionFilters 0 Null Nil 0 0 0 0 0 0 Gear "exception_filters" "Exception Filters" "Opens the exception filters view." "exceptions,filters" }
|
||||
{Theme 0 Null Nil 0 0 0 0 0 0 Palette "theme" "Theme" "Opens the theme view." "theme,color,scheme,palette" }
|
||||
{PickFile 1 FilePath Nil 1 0 0 0 0 1 FileOutline "pick_file" "Pick File" "Opens the file browser to pick a file." "" }
|
||||
{PickFolder 1 FilePath Nil 0 1 0 0 0 1 FolderOpenFilled "pick_folder" "Pick Folder" "Opens the file browser to pick a folder." "" }
|
||||
{PickFileOrFolder 1 FilePath Nil 1 1 0 0 0 1 FileOutline "pick_file_or_folder" "Pick File/Folder" "Opens the file browser to pick a file or folder." "" }
|
||||
|
||||
//- rjf: core pass-through view result commands
|
||||
{ViewReturn 1 0 0 0 0 Null Null Null Null Null 0 0 Null "complete_view" "Complete View" "Completes a view, passing all parameters to a new command matching the passed command spec." "" }
|
||||
//- rjf: query completion
|
||||
{CompleteQuery 1 Null Nil 0 0 0 0 0 0 Null "complete_query" "Complete Query" "Completes a query." "" }
|
||||
{CancelQuery 1 Null Nil 0 0 0 0 0 0 Null "cancel_query" "Cancel Query" "Cancels a query." "" }
|
||||
|
||||
//- rjf: developer commands
|
||||
{ToggleDevMenu 0 0 0 0 0 Null Null Null Null Null 0 0 Null "toggle_dev_menu" "Toggle Developer Menu" "Opens and closes the developer menu." "" }
|
||||
{ToggleDevMenu 0 Null Nil 0 0 0 0 0 0 Null "toggle_dev_menu" "Toggle Developer Menu" "Opens and closes the developer menu." "" }
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
@@ -1757,19 +1739,12 @@ DF_CmdParamSlot:
|
||||
`};`;
|
||||
}
|
||||
|
||||
@table_gen_enum
|
||||
DF_CmdQueryRule:
|
||||
@table_gen_data(type:Rng1U64, fallback:0)
|
||||
df_g_cmd_param_slot_range_table:
|
||||
{
|
||||
@expand(DF_CmdQueryRuleTable a)
|
||||
`DF_CmdQueryRule_$(a.name),`;
|
||||
`DF_CmdQueryRule_COUNT`;
|
||||
}
|
||||
|
||||
@table_gen_data(type: String8, fallback: `{0}`)
|
||||
df_g_cmd_query_rule_kind_arg_desc_table:
|
||||
{
|
||||
@expand(DF_CmdQueryRuleTable a)
|
||||
`str8_lit_comp("$(a.args_desc)"),`;
|
||||
`{0},`
|
||||
@expand(DF_CmdParamSlotTable a)
|
||||
`{OffsetOf(DF_CmdParams, $(a.name_lower)), OffsetOf(DF_CmdParams, $(a.name_lower)) + sizeof($(a.c_type))},`
|
||||
}
|
||||
|
||||
//- rjf: entity kind tables
|
||||
@@ -1847,7 +1822,7 @@ df_g_cfg_src_apply_cmd_kind_table:
|
||||
df_g_core_cmd_kind_spec_info_table:
|
||||
{
|
||||
@expand(DF_CoreCmdTable, a)
|
||||
```{ str8_lit_comp("$(a.string)"), str8_lit_comp("$(a.desc)"), str8_lit_comp("$(a.search_tags)"), str8_lit_comp("$(a.display_name)"), (DF_CmdSpecFlag_OmitFromLists*$(a.lister_omit)) | (DF_CmdSpecFlag_RunKeepsQuery*$(a.keep_query)) | (DF_CmdSpecFlag_QueryUsesOldInput*$(a.old_input)) | (DF_CmdSpecFlag_AppliesToView*$(a.apply_to_view)) | (DF_CmdSpecFlag_QueryIsCode*$(a.query_is_code)), {DF_CmdParamSlot_$(a.query_slot0), DF_CmdParamSlot_$(a.query_slot1), DF_CmdParamSlot_$(a.query_slot2)}, DF_CmdQueryRule_$(a.query_rule), DF_IconKind_$(a.canonical_icon), {$(a.query_info_0_u64), $(a.query_info_1_u64)}},```;
|
||||
```{ str8_lit_comp("$(a.string)"), str8_lit_comp("$(a.desc)"), str8_lit_comp("$(a.search_tags)"), str8_lit_comp("$(a.display_name)"), (DF_CmdSpecFlag_OmitFromLists*$(a.lister_omit)), {DF_CmdParamSlot_$(a.q_slot), DF_EntityKind_$(a.q_ent_kind), (DF_CmdQueryFlag_AllowFiles*$(a.q_allow_files))|(DF_CmdQueryFlag_AllowFolders*$(a.q_allow_folders))|(DF_CmdQueryFlag_CodeInput*$(a.q_is_code))|(DF_CmdQueryFlag_KeepOldInput*$(a.q_keep_oi))|(DF_CmdQueryFlag_SelectOldInput*$(a.q_select_oi))|(DF_CmdQueryFlag_Required*$(a.q_required))}, DF_IconKind_$(a.canonical_icon)},```;
|
||||
}
|
||||
|
||||
//- rjf: core view rule tables
|
||||
|
||||
@@ -5,204 +5,201 @@
|
||||
|
||||
DF_CmdSpecInfo df_g_core_cmd_kind_spec_info_table[] =
|
||||
{
|
||||
{ str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (DF_CmdSpecFlag_OmitFromLists*1) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("exit"), str8_lit_comp("Exits the debugger."), str8_lit_comp("quit,close,abort"), str8_lit_comp("Exit"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_X, {0, 0}},
|
||||
{ str8_lit_comp("command_fast_path"), str8_lit_comp("Performs the fast path for the command named by the argument."), str8_lit_comp(""), str8_lit_comp("Command Fast Path"), (DF_CmdSpecFlag_OmitFromLists*1) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_CmdSpec, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("error"), str8_lit_comp("Notifies of an error."), str8_lit_comp(""), str8_lit_comp("Error"), (DF_CmdSpecFlag_OmitFromLists*1) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_String, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 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("Launch and Run"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_EntityList, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Entity, DF_IconKind_Play, {DF_EntityKind_Target, 0}},
|
||||
{ str8_lit_comp("launch_and_init"), str8_lit_comp("Starts debugging a new instance of a target, then stops at the program's entry point."), str8_lit_comp("launch,start,entry,point"), str8_lit_comp("Launch and Initialize"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_EntityList, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Entity, DF_IconKind_PlayStepForward, {DF_EntityKind_Target, 0}},
|
||||
{ str8_lit_comp("kill"), str8_lit_comp("Kills the specified existing debugged process(es)."), str8_lit_comp("stop,kill"), str8_lit_comp("Kill"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_EntityList, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Entity, DF_IconKind_Stop, {DF_EntityKind_Process, 0}},
|
||||
{ str8_lit_comp("kill_all"), str8_lit_comp("Kills all debugged child processes."), str8_lit_comp("stop,kill,all"), str8_lit_comp("Kill All"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Stop, {0, 0}},
|
||||
{ str8_lit_comp("detach"), str8_lit_comp("Detaches the specified debugged process."), str8_lit_comp("detach"), str8_lit_comp("Detach"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_EntityList, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Entity, DF_IconKind_Null, {DF_EntityKind_Process, 0}},
|
||||
{ str8_lit_comp("continue"), str8_lit_comp("Continues all halted threads."), str8_lit_comp(""), str8_lit_comp("Continue"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Play, {0, 0}},
|
||||
{ str8_lit_comp("step_into_inst"), str8_lit_comp("Performs a step that goes into calls, at the instruction level."), str8_lit_comp("single,step,thread"), str8_lit_comp("Step Into (Assembly)"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Entity, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_StepInto, {0, 0}},
|
||||
{ str8_lit_comp("step_over_inst"), str8_lit_comp("Performs a step that skips calls, at the instruction level."), str8_lit_comp("single,step,thread"), str8_lit_comp("Step Over (Assembly)"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Entity, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_StepOver, {0, 0}},
|
||||
{ str8_lit_comp("step_into_line"), str8_lit_comp("Performs a step that goes into calls, at the source code line level."), str8_lit_comp("step,thread"), str8_lit_comp("Step Into (Line)"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Entity, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_StepInto, {0, 0}},
|
||||
{ str8_lit_comp("step_over_line"), str8_lit_comp("Performs a step that skips calls, at the source code line level."), str8_lit_comp("step,thread"), str8_lit_comp("Step Over (Line)"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Entity, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_StepOver, {0, 0}},
|
||||
{ str8_lit_comp("step_out"), str8_lit_comp("Runs to the end of the current function and exits it."), str8_lit_comp(""), str8_lit_comp("Step Out"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Entity, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_StepOut, {0, 0}},
|
||||
{ str8_lit_comp("run_to_address"), str8_lit_comp("Runs the selected thread to the specified address."), str8_lit_comp(""), str8_lit_comp("Run To Address"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Entity, DF_CmdParamSlot_VirtualAddr, DF_CmdParamSlot_Null}, DF_CmdQueryRule_VirtualAddr, DF_IconKind_PlayStepForward, {0, 0}},
|
||||
{ str8_lit_comp("run_to_module_offset"), str8_lit_comp("Runs the selected thread to the specified offset within the current module."), str8_lit_comp(""), str8_lit_comp("Run To Module Offset"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Entity, DF_CmdParamSlot_VirtualOff, DF_CmdParamSlot_Null}, DF_CmdQueryRule_VirtualOff, DF_IconKind_PlayStepForward, {0, 0}},
|
||||
{ str8_lit_comp("halt"), str8_lit_comp("Halts all running processes."), str8_lit_comp("pause"), str8_lit_comp("Halt"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Pause, {0, 0}},
|
||||
{ str8_lit_comp("soft_halt_refresh"), str8_lit_comp("Interrupts all running processes to collect data, and then resumes them."), str8_lit_comp(""), str8_lit_comp("Soft Halt Refresh"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Refresh, {0, 0}},
|
||||
{ str8_lit_comp("set_thread_ip"), str8_lit_comp("Sets the passed thread's instruction pointer at the passed address."), str8_lit_comp(""), str8_lit_comp("Set Thread IP"), (DF_CmdSpecFlag_OmitFromLists*1) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Entity, DF_CmdParamSlot_VirtualAddr, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("run"), str8_lit_comp("Runs all targets after starting them if they have not been started yet."), str8_lit_comp("play"), str8_lit_comp("Run"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Play, {0, 0}},
|
||||
{ str8_lit_comp("restart"), str8_lit_comp("Kills all running processes, then restarts the targets which were used to launch all current processes (if any)."), str8_lit_comp("restart,retry"), str8_lit_comp("Restart"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Redo, {0, 0}},
|
||||
{ str8_lit_comp("step_into"), str8_lit_comp("Steps once, possibly into function calls, for either line or instructions."), str8_lit_comp(""), str8_lit_comp("Step Into"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Entity, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_StepInto, {0, 0}},
|
||||
{ str8_lit_comp("step_over"), str8_lit_comp("Steps once, always over function calls, for either line or instructions."), str8_lit_comp(""), str8_lit_comp("Step Over"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Entity, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_StepOver, {0, 0}},
|
||||
{ str8_lit_comp("run_to_cursor"), str8_lit_comp("Runs the selected thread to the current cursor."), str8_lit_comp(""), str8_lit_comp("Run To Cursor"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Entity, DF_CmdParamSlot_View, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Play, {0, 0}},
|
||||
{ str8_lit_comp("set_next_statement"), str8_lit_comp("Sets the selected thread's instruction pointer to the cursor's position."), str8_lit_comp(""), str8_lit_comp("Set Next Statement"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Entity, DF_CmdParamSlot_View, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_RightArrow, {0, 0}},
|
||||
{ str8_lit_comp("enable_solo_stepping_mode"), str8_lit_comp("Enables 'solo stepping mode', which suspends all non-selected threads before stepping."), str8_lit_comp("solo,stepping,mode,suspend"), str8_lit_comp("Enable Solo Stepping Mode"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Thread, {0, 0}},
|
||||
{ str8_lit_comp("disable_solo_stepping_mode"), str8_lit_comp("Disables 'solo stepping mode', which suspends all non-selected threads before stepping."), str8_lit_comp("solo,stepping,mode,suspend"), str8_lit_comp("Disable Solo Stepping Mode"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Thread, {0, 0}},
|
||||
{ str8_lit_comp("select_thread"), str8_lit_comp("Selects a thread."), str8_lit_comp(""), str8_lit_comp("Select Thread"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Entity, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Entity, DF_IconKind_Null, {DF_EntityKind_Thread, 0}},
|
||||
{ str8_lit_comp("select_thread_window"), str8_lit_comp("Selects a thread for the active window, overriding the global selected thread."), str8_lit_comp(""), str8_lit_comp("Select Thread On Window"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Entity, DF_CmdParamSlot_Window, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Entity, DF_IconKind_Null, {DF_EntityKind_Thread, 0}},
|
||||
{ str8_lit_comp("select_thread_view"), str8_lit_comp("Selects a thread for the active view, overriding the global and per-window selected threads."), str8_lit_comp(""), str8_lit_comp("Select Thread On View"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Entity, DF_CmdParamSlot_View, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Entity, DF_IconKind_Null, {DF_EntityKind_Thread, 0}},
|
||||
{ str8_lit_comp("select_unwind"), str8_lit_comp("Selects an unwind frame number for the selected thread."), str8_lit_comp(""), str8_lit_comp("Select Unwind"), (DF_CmdSpecFlag_OmitFromLists*1) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Index, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("up_one_frame"), str8_lit_comp("Selects the callstack frame above the currently selected."), str8_lit_comp(""), str8_lit_comp("Up One Frame"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_UpArrow, {0, 0}},
|
||||
{ str8_lit_comp("down_one_frame"), str8_lit_comp("Selects the callstack frame below the currently selected."), str8_lit_comp(""), str8_lit_comp("Down One Frame"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_DownArrow, {0, 0}},
|
||||
{ str8_lit_comp("freeze_thread"), str8_lit_comp("Freezes the passed thread."), str8_lit_comp(""), str8_lit_comp("Freeze Thread"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Entity, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Entity, DF_IconKind_Locked, {DF_EntityKind_Thread, 0}},
|
||||
{ str8_lit_comp("thaw_thread"), str8_lit_comp("Thaws the passed thread."), str8_lit_comp(""), str8_lit_comp("Thaw Thread"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Entity, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Entity, DF_IconKind_Unlocked, {DF_EntityKind_Thread, 0}},
|
||||
{ str8_lit_comp("freeze_process"), str8_lit_comp("Freezes the passed process."), str8_lit_comp(""), str8_lit_comp("Freeze Process"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Entity, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Entity, DF_IconKind_Locked, {DF_EntityKind_Process, 0}},
|
||||
{ str8_lit_comp("thaw_process"), str8_lit_comp("Thaws the passed process."), str8_lit_comp(""), str8_lit_comp("Thaw Process"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Entity, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Entity, DF_IconKind_Unlocked, {DF_EntityKind_Process, 0}},
|
||||
{ str8_lit_comp("freeze_machine"), str8_lit_comp("Freezes the passed machine."), str8_lit_comp(""), str8_lit_comp("Freeze Machine"), (DF_CmdSpecFlag_OmitFromLists*1) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Entity, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Entity, DF_IconKind_Locked, {DF_EntityKind_Machine, 0}},
|
||||
{ str8_lit_comp("thaw_machine"), str8_lit_comp("Thaws the passed machine."), str8_lit_comp(""), str8_lit_comp("Thaw Machine"), (DF_CmdSpecFlag_OmitFromLists*1) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Entity, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Entity, DF_IconKind_Unlocked, {DF_EntityKind_Machine, 0}},
|
||||
{ str8_lit_comp("freeze_local_machine"), str8_lit_comp("Freezes the local machine."), str8_lit_comp(""), str8_lit_comp("Freeze Local Machine"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Machine, {0, 0}},
|
||||
{ str8_lit_comp("thaw_local_machine"), str8_lit_comp("Thaws the local machine."), str8_lit_comp(""), str8_lit_comp("Thaw Local Machine"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Machine, {0, 0}},
|
||||
{ str8_lit_comp("inc_ui_font_scale"), str8_lit_comp("Increases the font size used for UI."), str8_lit_comp(""), str8_lit_comp("Increase UI Font Scale"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Window, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("dec_ui_font_scale"), str8_lit_comp("Decreases the font size used for UI."), str8_lit_comp(""), str8_lit_comp("Decrease UI Font Scale"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Window, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("inc_code_font_scale"), str8_lit_comp("Increases the font size used for code."), str8_lit_comp(""), str8_lit_comp("Increase Code Font Scale"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Window, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("dec_code_font_scale"), str8_lit_comp("Decreases the font size used for code."), str8_lit_comp(""), str8_lit_comp("Decrease Code Font Scale"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Window, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("open_window"), str8_lit_comp("Opens a new window."), str8_lit_comp(""), str8_lit_comp("Open New Window"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Window, {0, 0}},
|
||||
{ str8_lit_comp("close_window"), str8_lit_comp("Closes an opened window."), str8_lit_comp(""), str8_lit_comp("Close Window"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Window, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Window, {0, 0}},
|
||||
{ str8_lit_comp("toggle_fullscreen"), str8_lit_comp("Toggles fullscreen view on the active window."), str8_lit_comp(""), str8_lit_comp("Toggle Fullscreen"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Window, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Window, {0, 0}},
|
||||
{ str8_lit_comp("confirm_accept"), str8_lit_comp("Accepts the active confirmation prompt."), str8_lit_comp(""), str8_lit_comp("Confirm Accept"), (DF_CmdSpecFlag_OmitFromLists*1) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("confirm_cancel"), str8_lit_comp("Cancels the active confirmation prompt."), str8_lit_comp(""), str8_lit_comp("Confirm Cancel"), (DF_CmdSpecFlag_OmitFromLists*1) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("reset_to_default_panels"), str8_lit_comp("Resets the window to the default panel layout."), str8_lit_comp("panel"), str8_lit_comp("Reset To Default Panel Layout"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Window, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Window, {0, 0}},
|
||||
{ str8_lit_comp("new_panel_right"), str8_lit_comp("Creates a new panel to the right of the active panel."), str8_lit_comp("panel"), str8_lit_comp("Split Panel Vertically"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Window, DF_CmdParamSlot_Panel, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_XSplit, {0, 0}},
|
||||
{ str8_lit_comp("new_panel_down"), str8_lit_comp("Creates a new panel at the bottom of the active panel."), str8_lit_comp("panel"), str8_lit_comp("Split Panel Horizontally"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Window, DF_CmdParamSlot_Panel, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_YSplit, {0, 0}},
|
||||
{ str8_lit_comp("rotate_panel_columns"), str8_lit_comp("Rotates all panels at the closest column level of the panel hierarchy."), str8_lit_comp(""), str8_lit_comp("Rotate Panel Columns"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Window, DF_CmdParamSlot_Panel, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("next_panel"), str8_lit_comp("Cycles the active panel forward."), str8_lit_comp(""), str8_lit_comp("Focus Next Panel"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Window, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_RightArrow, {0, 0}},
|
||||
{ str8_lit_comp("prev_panel"), str8_lit_comp("Cycles the active panel backwards."), str8_lit_comp(""), str8_lit_comp("Focus Previous Panel"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Window, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_LeftArrow, {0, 0}},
|
||||
{ str8_lit_comp("focus_panel"), str8_lit_comp("Focuses a new panel."), str8_lit_comp(""), str8_lit_comp("Focus Panel"), (DF_CmdSpecFlag_OmitFromLists*1) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Window, DF_CmdParamSlot_Panel, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("focus_panel_right"), str8_lit_comp("Focuses a panel rightward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp("Focus Panel Right"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Window, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_RightArrow, {0, 0}},
|
||||
{ str8_lit_comp("focus_panel_left"), str8_lit_comp("Focuses a panel leftward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp("Focus Panel Left"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Window, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_LeftArrow, {0, 0}},
|
||||
{ str8_lit_comp("focus_panel_up"), str8_lit_comp("Focuses a panel upward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp("Focus Panel Up"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Window, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_UpArrow, {0, 0}},
|
||||
{ str8_lit_comp("focus_panel_down"), str8_lit_comp("Focuses a panel downward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp("Focus Panel Down"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Window, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_DownArrow, {0, 0}},
|
||||
{ str8_lit_comp("undo"), str8_lit_comp("Undoes the previous action."), str8_lit_comp(""), str8_lit_comp("Undo"), (DF_CmdSpecFlag_OmitFromLists*1) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Undo, {0, 0}},
|
||||
{ str8_lit_comp("redo"), str8_lit_comp("Redoes the first previously undone action."), str8_lit_comp(""), str8_lit_comp("Redo"), (DF_CmdSpecFlag_OmitFromLists*1) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Redo, {0, 0}},
|
||||
{ str8_lit_comp("go_back"), str8_lit_comp("Returns to the previously selected panel and tab in recorded history."), str8_lit_comp(""), str8_lit_comp("Go Back"), (DF_CmdSpecFlag_OmitFromLists*1) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Window, DF_CmdParamSlot_Panel, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_LeftArrow, {0, 0}},
|
||||
{ str8_lit_comp("go_forward"), str8_lit_comp("Returns to the next selected panel and tab in recorded history."), str8_lit_comp(""), str8_lit_comp("Go Forward"), (DF_CmdSpecFlag_OmitFromLists*1) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Window, DF_CmdParamSlot_Panel, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_RightArrow, {0, 0}},
|
||||
{ str8_lit_comp("close_panel"), str8_lit_comp("Closes the currently active panel."), str8_lit_comp(""), str8_lit_comp("Close Panel"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Window, DF_CmdParamSlot_Panel, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_ClosePanel, {0, 0}},
|
||||
{ str8_lit_comp("next_tab"), str8_lit_comp("Focuses the next tab on the active panel."), str8_lit_comp(""), str8_lit_comp("Focus Next Tab"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_RightArrow, {0, 0}},
|
||||
{ str8_lit_comp("prev_tab"), str8_lit_comp("Focuses the previous tab on the active panel."), str8_lit_comp(""), str8_lit_comp("Focus Previous Tab"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_LeftArrow, {0, 0}},
|
||||
{ str8_lit_comp("move_tab_right"), str8_lit_comp("Moves the selected tab right one slot."), str8_lit_comp(""), str8_lit_comp("Move Tab Right"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_RightArrow, {0, 0}},
|
||||
{ str8_lit_comp("move_tab_left"), str8_lit_comp("Moves the selected tab left one slot."), str8_lit_comp(""), str8_lit_comp("Move Tab Left"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_LeftArrow, {0, 0}},
|
||||
{ str8_lit_comp("close_tab"), str8_lit_comp("Closes the currently opened tab."), str8_lit_comp(""), str8_lit_comp("Close Tab"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_X, {0, 0}},
|
||||
{ str8_lit_comp("move_tab"), str8_lit_comp("Moves a tab to a new panel."), str8_lit_comp(""), str8_lit_comp("Move Tab"), (DF_CmdSpecFlag_OmitFromLists*1) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("tab_bar_top"), str8_lit_comp("Anchors a panel's tab bar to the top of the panel."), str8_lit_comp(""), str8_lit_comp("Anchor Tab Bar To Top"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_UpArrow, {0, 0}},
|
||||
{ str8_lit_comp("tab_bar_bottom"), str8_lit_comp("Anchors a panel's tab bar to the bottom of the panel."), str8_lit_comp(""), str8_lit_comp("Anchor Tab Bar To Bottom"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_DownArrow, {0, 0}},
|
||||
{ str8_lit_comp("tab_bar_enable"), str8_lit_comp("Enables a panel's tab bar."), str8_lit_comp(""), str8_lit_comp("Enable Tab Bar"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("tab_bar_disable"), str8_lit_comp("Disables a panel's tab bar."), str8_lit_comp(""), str8_lit_comp("Disable Tab Bar"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("tab_bar_history_mode_enable"), str8_lit_comp("Enables history mode for a panel's tab bar, which orders and manages tabs as recorded history of views."), str8_lit_comp(""), str8_lit_comp("Enable Tab Bar History Mode"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("tab_bar_history_mode_disable"), str8_lit_comp("Disables history mode for a panel's tab bar."), str8_lit_comp(""), str8_lit_comp("Disable Tab Bar History Mode"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("set_current_path"), str8_lit_comp("Sets the debugger's current path, which is used as a starting point when browsing for files."), str8_lit_comp(""), str8_lit_comp("Set Current Path"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_FilePath, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_FilePath, DF_IconKind_FileOutline, {0, 0}},
|
||||
{ str8_lit_comp("open"), str8_lit_comp("Opens a file."), str8_lit_comp("code,source,file"), str8_lit_comp("Open"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_FilePath, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_FilePath, DF_IconKind_FileOutline, {0, 0}},
|
||||
{ str8_lit_comp("reload"), str8_lit_comp("Reloads a loaded file."), str8_lit_comp("code,source,file,reload"), str8_lit_comp("Reload"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Entity, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Entity, DF_IconKind_FileOutline, {DF_EntityKind_File, 0}},
|
||||
{ str8_lit_comp("reload_active"), str8_lit_comp("Reloads the active file."), str8_lit_comp("code,source,file,reload"), str8_lit_comp("Reload Active File"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Window, DF_CmdParamSlot_Panel, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_FileOutline, {0, 0}},
|
||||
{ str8_lit_comp("switch"), str8_lit_comp("Switches to a loaded file."), str8_lit_comp("code,source,file"), str8_lit_comp("Switch"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Window, DF_CmdParamSlot_Panel, DF_CmdParamSlot_Entity}, DF_CmdQueryRule_Entity, DF_IconKind_FileOutline, {DF_EntityKind_File, DF_EntityFlag_IsFolder}},
|
||||
{ str8_lit_comp("set_file_override_link_src"), str8_lit_comp("Sets the source path for an override file link."), str8_lit_comp(""), str8_lit_comp("Set File Override Link Source"), (DF_CmdSpecFlag_OmitFromLists*1) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("set_file_override_link_dst"), str8_lit_comp("Sets the destination path for an override file link."), str8_lit_comp(""), str8_lit_comp("Set File Override Link Destination"), (DF_CmdSpecFlag_OmitFromLists*1) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("set_file_replacement_path"), str8_lit_comp("Sets the path which should be used as the replacement for the passed file."), str8_lit_comp(""), str8_lit_comp("Set File Replacement Path"), (DF_CmdSpecFlag_OmitFromLists*1) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("load_user"), str8_lit_comp("Loads and applies a user file."), str8_lit_comp("load,user,profile,layout"), str8_lit_comp("Load User"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_FilePath, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_FilePath, DF_IconKind_Person, {0, 0}},
|
||||
{ str8_lit_comp("load_profile"), str8_lit_comp("Loads and applies a profile file."), str8_lit_comp("profile,project,session"), str8_lit_comp("Load Profile"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_FilePath, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_FilePath, DF_IconKind_Briefcase, {0, 0}},
|
||||
{ str8_lit_comp("apply_user_data"), str8_lit_comp("Applies user data from the active user file."), str8_lit_comp(""), str8_lit_comp("Apply User Data"), (DF_CmdSpecFlag_OmitFromLists*1) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("apply_profile_data"), str8_lit_comp("Applies profile data from the active profile file."), str8_lit_comp(""), str8_lit_comp("Apply Profile Data"), (DF_CmdSpecFlag_OmitFromLists*1) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("write_user_data"), str8_lit_comp("Writes user data to the active user file."), str8_lit_comp(""), str8_lit_comp("Write User Data"), (DF_CmdSpecFlag_OmitFromLists*1) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("write_profile_data"), str8_lit_comp("Writes profile data to the active profile file."), str8_lit_comp(""), str8_lit_comp("Write Profile Data"), (DF_CmdSpecFlag_OmitFromLists*1) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("move_left"), str8_lit_comp("Moves the cursor or selection left."), str8_lit_comp(""), str8_lit_comp("Move Left"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("move_right"), str8_lit_comp("Moves the cursor or selection right."), str8_lit_comp(""), str8_lit_comp("Move Right"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("move_up"), str8_lit_comp("Moves the cursor or selection up."), str8_lit_comp(""), str8_lit_comp("Move Up"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("move_down"), str8_lit_comp("Moves the cursor or selection down."), str8_lit_comp(""), str8_lit_comp("Move Down"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("move_left_select"), str8_lit_comp("Moves the cursor or selection left, while selecting."), str8_lit_comp(""), str8_lit_comp("Move Left Select"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("move_right_select"), str8_lit_comp("Moves the cursor or selection right, while selecting."), str8_lit_comp(""), str8_lit_comp("Move Right Select"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("move_up_select"), str8_lit_comp("Moves the cursor or selection up, while selecting."), str8_lit_comp(""), str8_lit_comp("Move Up Select"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("move_down_select"), str8_lit_comp("Moves the cursor or selection down, while selecting."), str8_lit_comp(""), str8_lit_comp("Move Down Select"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("move_left_chunk"), str8_lit_comp("Moves the cursor or selection left one chunk."), str8_lit_comp(""), str8_lit_comp("Move Left Select"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("move_right_chunk"), str8_lit_comp("Moves the cursor or selection right one chunk."), str8_lit_comp(""), str8_lit_comp("Move Right Select"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("move_up_chunk"), str8_lit_comp("Moves the cursor or selection up one chunk."), str8_lit_comp(""), str8_lit_comp("Move Up Chunk"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("move_down_chunk"), str8_lit_comp("Moves the cursor or selection down one chunk."), str8_lit_comp(""), str8_lit_comp("Move Down Chunk"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("move_up_page"), str8_lit_comp("Moves the cursor or selection up one page."), str8_lit_comp(""), str8_lit_comp("Move Up Page"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("move_down_page"), str8_lit_comp("Moves the cursor or selection down one page."), str8_lit_comp(""), str8_lit_comp("Move Down Page"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("move_up_whole"), str8_lit_comp("Moves the cursor or selection to the beginning of the relevant content."), str8_lit_comp(""), str8_lit_comp("Move Up Whole"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("move_down_whole"), str8_lit_comp("Moves the cursor or selection to the end of the relevant content."), str8_lit_comp(""), str8_lit_comp("Move Down Whole"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("move_left_chunk_select"), str8_lit_comp("Moves the cursor or selection left one chunk."), str8_lit_comp(""), str8_lit_comp("Move Left Chunk Select"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("move_right_chunk_select"), str8_lit_comp("Moves the cursor or selection right one chunk."), str8_lit_comp(""), str8_lit_comp("Move Right Chunk Select"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("move_up_chunk_select"), str8_lit_comp("Moves the cursor or selection up one chunk."), str8_lit_comp(""), str8_lit_comp("Move Up Chunk Select"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("move_down_chunk_select"), str8_lit_comp("Moves the cursor or selection down one chunk."), str8_lit_comp(""), str8_lit_comp("Move Down Chunk Select"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("move_up_page_select"), str8_lit_comp("Moves the cursor or selection up one page, while selecting."), str8_lit_comp(""), str8_lit_comp("Move Up Page Select"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("move_down_page_select"), str8_lit_comp("Moves the cursor or selection down one page, while selecting."), str8_lit_comp(""), str8_lit_comp("Move Down Page Select"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("move_up_whole_select"), str8_lit_comp("Moves the cursor or selection to the beginning of the relevant content, while selecting."), str8_lit_comp(""), str8_lit_comp("Move Up Whole Select"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("move_down_whole_select"), str8_lit_comp("Moves the cursor or selection to the end of the relevant content, while selecting."), str8_lit_comp(""), str8_lit_comp("Move Down Whole Select"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("move_home"), str8_lit_comp("Moves the cursor to the beginning of the line."), str8_lit_comp(""), str8_lit_comp("Move Home"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("move_end"), str8_lit_comp("Moves the cursor to the end of the line."), str8_lit_comp(""), str8_lit_comp("Move End"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("move_home_select"), str8_lit_comp("Moves the cursor to the beginning of the line, while selecting."), str8_lit_comp(""), str8_lit_comp("Move Home Select"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("move_end_select"), str8_lit_comp("Moves the cursor to the end of the line, while selecting."), str8_lit_comp(""), str8_lit_comp("Move End Select"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("select_all"), str8_lit_comp("Selects everything possible."), str8_lit_comp(""), str8_lit_comp("Select All"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("delete_single"), str8_lit_comp("Deletes a single element to the right of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp("Delete Single"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("delete_chunk"), str8_lit_comp("Deletes a chunk to the right of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp("Delete Chunk"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("backspace_single"), str8_lit_comp("Deletes a single element to the left of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp("Backspace Single"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("backspace_chunk"), str8_lit_comp("Deletes a chunk to the left of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp("Backspace Chunk"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("copy"), str8_lit_comp("Copies the active selection to the clipboard."), str8_lit_comp(""), str8_lit_comp("Copy"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Clipboard, {0, 0}},
|
||||
{ str8_lit_comp("cut"), str8_lit_comp("Copies the active selection to the clipboard, then deletes it."), str8_lit_comp(""), str8_lit_comp("Cut"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Clipboard, {0, 0}},
|
||||
{ str8_lit_comp("paste"), str8_lit_comp("Pastes the current contents of the clipboard."), str8_lit_comp(""), str8_lit_comp("Paste"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Clipboard, {0, 0}},
|
||||
{ str8_lit_comp("insert_text"), str8_lit_comp("Inserts the text that was used to cause this command."), str8_lit_comp(""), str8_lit_comp("Insert Text"), (DF_CmdSpecFlag_OmitFromLists*1) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("goto_line"), str8_lit_comp("Jumps to a line number in the current code file."), str8_lit_comp(""), str8_lit_comp("Go To Line"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*1) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_TextPoint, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_TextPoint, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("goto_address"), str8_lit_comp("Jumps to an address in the current memory or disassembly view."), str8_lit_comp(""), str8_lit_comp("Go To Address"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*1) | (DF_CmdSpecFlag_QueryIsCode*1), {DF_CmdParamSlot_VirtualAddr, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_VirtualAddr, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("center_cursor"), str8_lit_comp("Snaps the current code view to center the cursor."), str8_lit_comp(""), str8_lit_comp("Center Cursor"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("contain_cursor"), str8_lit_comp("Snaps the current code view to contain the cursor."), str8_lit_comp(""), str8_lit_comp("Contain Cursor"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("find_text_forward"), str8_lit_comp("Searches the current code file forward (from the cursor) for a string."), str8_lit_comp(""), str8_lit_comp("Find Text (Forward)"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*1) | (DF_CmdSpecFlag_QueryUsesOldInput*1) | (DF_CmdSpecFlag_AppliesToView*1) | (DF_CmdSpecFlag_QueryIsCode*1), {DF_CmdParamSlot_String, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_SearchString, DF_IconKind_Find, {0, 0}},
|
||||
{ str8_lit_comp("find_text_backward"), str8_lit_comp("Searches the current code file backwards (from the cursor) for a string."), str8_lit_comp(""), str8_lit_comp("Find Text (Backwards)"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*1) | (DF_CmdSpecFlag_QueryUsesOldInput*1) | (DF_CmdSpecFlag_AppliesToView*1) | (DF_CmdSpecFlag_QueryIsCode*1), {DF_CmdParamSlot_String, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_SearchString, DF_IconKind_Find, {0, 0}},
|
||||
{ str8_lit_comp("find_next"), str8_lit_comp("Searches the current code file forward (from the cursor) for the last searched string."), str8_lit_comp(""), str8_lit_comp("Find Next"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*1) | (DF_CmdSpecFlag_QueryUsesOldInput*1) | (DF_CmdSpecFlag_AppliesToView*1) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_String, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Find, {0, 0}},
|
||||
{ str8_lit_comp("find_prev"), str8_lit_comp("Searches the current code file backwards (from the cursor) for the last searched string."), str8_lit_comp(""), str8_lit_comp("Find Previous"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*1) | (DF_CmdSpecFlag_QueryUsesOldInput*1) | (DF_CmdSpecFlag_AppliesToView*1) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_String, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Find, {0, 0}},
|
||||
{ str8_lit_comp("find_thread"), str8_lit_comp("Jumps to the passed thread in either source code, disassembly, or both if they're already open."), str8_lit_comp(""), str8_lit_comp("Find Thread"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Entity, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Entity, DF_IconKind_Find, {DF_EntityKind_Thread, 0}},
|
||||
{ str8_lit_comp("find_selected_thread"), str8_lit_comp("Jumps to the selected thread in either source code, disassembly, or both if they're already open."), str8_lit_comp(""), str8_lit_comp("Find Selected Thread"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Find, {0, 0}},
|
||||
{ str8_lit_comp("goto_name"), str8_lit_comp("Searches for the passed string as a file, a symbol in debug info, and more, then jumps to it if possible."), str8_lit_comp(""), str8_lit_comp("Go To Name"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*1), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_String, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("goto_name_at_cursor"), str8_lit_comp("Searches for the text at the cursor as a file, a symbol in debug info, and more, then jumps to it if possible."), str8_lit_comp(""), str8_lit_comp("Go To Name At Cursor"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("toggle_watch_expr"), str8_lit_comp("Adds or removes an expression to an opened watch view."), str8_lit_comp(""), str8_lit_comp("Toggle Watch Expression"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Binoculars, {0, 0}},
|
||||
{ str8_lit_comp("toggle_watch_expr_at_cursor"), str8_lit_comp("Adds or removes the expression that the cursor or selection is currently over to an opened watch view."), str8_lit_comp(""), str8_lit_comp("Toggle Watch Expression At Cursor"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Binoculars, {0, 0}},
|
||||
{ str8_lit_comp("open_file_memory"), str8_lit_comp("Opens a memory view for the passed file."), str8_lit_comp(""), str8_lit_comp("Open File Memory"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Entity, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Entity, DF_IconKind_Grid, {DF_EntityKind_File, 0}},
|
||||
{ str8_lit_comp("open_process_memory"), str8_lit_comp("Opens a memory view for the passed process."), str8_lit_comp(""), str8_lit_comp("Open Process Memory"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Entity, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Entity, DF_IconKind_Grid, {DF_EntityKind_Process, 0}},
|
||||
{ str8_lit_comp("open_selected_process_memory"), str8_lit_comp("Opens a memory view for the selected process."), str8_lit_comp(""), str8_lit_comp("Open Selected Process Memory"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Grid, {0, 0}},
|
||||
{ str8_lit_comp("set_columns"), str8_lit_comp("Sets the number of columns for a memory view."), str8_lit_comp(""), str8_lit_comp("Set Columns"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*1) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Index, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Index, DF_IconKind_Thumbnails, {0, 0}},
|
||||
{ str8_lit_comp("toggle_address_visibility"), str8_lit_comp("Toggles the visibility of addresses in a disassembly view."), str8_lit_comp(""), str8_lit_comp("Toggle Address Visibility"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*1) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Thumbnails, {0, 0}},
|
||||
{ str8_lit_comp("toggle_code_bytes_visibility"), str8_lit_comp("Toggles the visibility of machine code bytes in a disassembly view."), str8_lit_comp(""), str8_lit_comp("Toggle Code Bytes Visibility"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*1) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Thumbnails, {0, 0}},
|
||||
{ str8_lit_comp("enable_entity"), str8_lit_comp("Enables an entity."), str8_lit_comp(""), str8_lit_comp("Enable Entity"), (DF_CmdSpecFlag_OmitFromLists*1) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("disable_entity"), str8_lit_comp("Disables an entity."), str8_lit_comp(""), str8_lit_comp("Disable Entity"), (DF_CmdSpecFlag_OmitFromLists*1) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("freeze_entity"), str8_lit_comp("Freezes an entity."), str8_lit_comp(""), str8_lit_comp("Freeze Entity"), (DF_CmdSpecFlag_OmitFromLists*1) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("thaw_entity"), str8_lit_comp("Thaws an entity."), str8_lit_comp(""), str8_lit_comp("Thaw Entity"), (DF_CmdSpecFlag_OmitFromLists*1) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("remove_entity"), str8_lit_comp("Removes an entity."), str8_lit_comp(""), str8_lit_comp("Remove Entity"), (DF_CmdSpecFlag_OmitFromLists*1) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("name_entity"), str8_lit_comp("Equips an entity with a name."), str8_lit_comp(""), str8_lit_comp("Name Entity"), (DF_CmdSpecFlag_OmitFromLists*1) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Entity, DF_CmdParamSlot_String, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("edit_entity"), str8_lit_comp("Opens the editor for an entity."), str8_lit_comp(""), str8_lit_comp("Edit Entity"), (DF_CmdSpecFlag_OmitFromLists*1) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("duplicate_entity"), str8_lit_comp("Duplicates an entity."), str8_lit_comp(""), str8_lit_comp("Duplicate Entity"), (DF_CmdSpecFlag_OmitFromLists*1) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("text_breakpoint"), str8_lit_comp("Places or removes a breakpoint on the specified line of source code."), str8_lit_comp(""), str8_lit_comp("Text Breakpoint"), (DF_CmdSpecFlag_OmitFromLists*1) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_CircleFilled, {0, 0}},
|
||||
{ str8_lit_comp("address_breakpoint"), str8_lit_comp("Places or removes a breakpoint on the specified address."), str8_lit_comp(""), str8_lit_comp("Address Breakpoint"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*1), {DF_CmdParamSlot_VirtualAddr, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_VirtualAddr, DF_IconKind_CircleFilled, {0, 0}},
|
||||
{ str8_lit_comp("function_breakpoint"), str8_lit_comp("Places or removes a breakpoint on the first address(es) of the specified function."), str8_lit_comp(""), str8_lit_comp("Function Breakpoint"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*1), {DF_CmdParamSlot_String, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_String, DF_IconKind_CircleFilled, {0, 0}},
|
||||
{ str8_lit_comp("toggle_breakpoint_cursor"), str8_lit_comp("Places or removes a breakpoint on the line on which the active cursor sits."), str8_lit_comp(""), str8_lit_comp("Toggle Breakpoint At Cursor"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_CircleFilled, {0, 0}},
|
||||
{ str8_lit_comp("remove_breakpoint"), str8_lit_comp("Removes an existing breakpoint."), str8_lit_comp(""), str8_lit_comp("Remove Breakpoint"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Entity, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Entity, DF_IconKind_Trash, {DF_EntityKind_Breakpoint, 0}},
|
||||
{ str8_lit_comp("enable_breakpoint"), str8_lit_comp("Enables a breakpoint."), str8_lit_comp(""), str8_lit_comp("Enable Breakpoint"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Entity, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Entity, DF_IconKind_CheckFilled, {DF_EntityKind_Breakpoint, 0}},
|
||||
{ str8_lit_comp("disable_breakpoint"), str8_lit_comp("Disables a breakpoint."), str8_lit_comp(""), str8_lit_comp("Disable Breakpoint"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Entity, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Entity, DF_IconKind_CheckHollow, {DF_EntityKind_Breakpoint, 0}},
|
||||
{ str8_lit_comp("toggle_watch_pin"), str8_lit_comp("Places or removes a watch pin on a textual location on a particular entity."), str8_lit_comp(""), str8_lit_comp("Toggle Watch Pin"), (DF_CmdSpecFlag_OmitFromLists*1) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*1), {DF_CmdParamSlot_Entity, DF_CmdParamSlot_TextPoint, DF_CmdParamSlot_String}, DF_CmdQueryRule_String, DF_IconKind_Binoculars, {0, 0}},
|
||||
{ str8_lit_comp("toggle_watch_pin_at_cursor"), str8_lit_comp("Places or removes a watch pin at the cursor on the currently active file."), str8_lit_comp(""), str8_lit_comp("Toggle Watch Pin At Cursor"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*1) | (DF_CmdSpecFlag_QueryIsCode*1), {DF_CmdParamSlot_String, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_String, DF_IconKind_Binoculars, {0, 0}},
|
||||
{ str8_lit_comp("add_target"), str8_lit_comp("Adds a new target."), str8_lit_comp("application,executable,debug"), str8_lit_comp("Add Target"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_FilePath, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_FilePath, DF_IconKind_Target, {0, 0}},
|
||||
{ str8_lit_comp("remove_target"), str8_lit_comp("Removes an existing target."), str8_lit_comp("delete,remove,target"), str8_lit_comp("Remove Target"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Entity, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Entity, DF_IconKind_Trash, {DF_EntityKind_Target, 0}},
|
||||
{ str8_lit_comp("edit_target"), str8_lit_comp("Edits an existing target."), str8_lit_comp(""), str8_lit_comp("Edit Target"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Entity, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Entity, DF_IconKind_Pencil, {DF_EntityKind_Target, 0}},
|
||||
{ str8_lit_comp("retry_ended_process"), str8_lit_comp("Launches a new process with the same options as the passed ended process."), str8_lit_comp(""), str8_lit_comp("Retry Ended Process"), (DF_CmdSpecFlag_OmitFromLists*1) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Entity, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Entity, DF_IconKind_Null, {DF_EntityKind_EndedProcess, 0}},
|
||||
{ str8_lit_comp("attach"), str8_lit_comp("Attaches to a process that is already running on the local machine."), str8_lit_comp(""), str8_lit_comp("Attach"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_String, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_String, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("register_as_jit_debugger"), str8_lit_comp("Registers the RAD debugger as the just-in-time (JIT) debugger used by the operating system."), str8_lit_comp(""), str8_lit_comp("Register As Just-In-Time (JIT) Debugger"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("entity_ref_fast_path"), str8_lit_comp("Activates the default behavior when clicking an entity reference."), str8_lit_comp(""), str8_lit_comp("Entity Reference Fast Path"), (DF_CmdSpecFlag_OmitFromLists*1) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("spawn_entity_view"), str8_lit_comp("Spawns a new view, given an entity and other parameterizations."), str8_lit_comp(""), str8_lit_comp("Spawn Entity View"), (DF_CmdSpecFlag_OmitFromLists*1) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("find_code_location"), str8_lit_comp("Finds a specific source code location given file, line, and column coordinates. Opens the file if necessary."), str8_lit_comp(""), str8_lit_comp("Find Code Location"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_FilePath, DF_CmdParamSlot_TextPoint, DF_CmdParamSlot_Null}, DF_CmdQueryRule_FilePathAndTextPoint, DF_IconKind_FileOutline, {0, 0}},
|
||||
{ str8_lit_comp("commands"), str8_lit_comp("Opens the list of all commands."), str8_lit_comp(""), str8_lit_comp("Commands"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_String, DF_IconKind_List, {0, 0}},
|
||||
{ str8_lit_comp("target_editor"), str8_lit_comp("Opens the editor for a target."), str8_lit_comp(""), str8_lit_comp("Target"), (DF_CmdSpecFlag_OmitFromLists*1) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Target, {0, 0}},
|
||||
{ str8_lit_comp("targets"), str8_lit_comp("Opens the list of all targets."), str8_lit_comp(""), str8_lit_comp("Targets"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Target, {0, 0}},
|
||||
{ str8_lit_comp("file_path_map"), str8_lit_comp("Opens the file path mapping editor."), str8_lit_comp(""), str8_lit_comp("File Path Map"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_FileOutline, {0, 0}},
|
||||
{ str8_lit_comp("scheduler"), str8_lit_comp("Opens the scheduler view, for process and thread controls."), str8_lit_comp(""), str8_lit_comp("Scheduler"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Scheduler, {0, 0}},
|
||||
{ str8_lit_comp("call_stack"), str8_lit_comp("Opens the call stack view."), str8_lit_comp("callstack,thread"), str8_lit_comp("Call Stack"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Thread, {0, 0}},
|
||||
{ str8_lit_comp("modules"), str8_lit_comp("Opens the modules view."), str8_lit_comp(""), str8_lit_comp("Modules"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Module, {0, 0}},
|
||||
{ str8_lit_comp("pending_entity"), str8_lit_comp("Opens a view which waits for the passed entity to be completely loaded, then replaces itself with a new view."), str8_lit_comp(""), str8_lit_comp("Pending Entity"), (DF_CmdSpecFlag_OmitFromLists*1) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_FileOutline, {0, 0}},
|
||||
{ str8_lit_comp("code"), str8_lit_comp("Opens the code view for an already-loaded file."), str8_lit_comp(""), str8_lit_comp("Code"), (DF_CmdSpecFlag_OmitFromLists*1) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_FileOutline, {0, 0}},
|
||||
{ str8_lit_comp("watch"), str8_lit_comp("Opens a watch view."), str8_lit_comp(""), str8_lit_comp("Watch"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Binoculars, {0, 0}},
|
||||
{ str8_lit_comp("locals"), str8_lit_comp("Opens a locals view."), str8_lit_comp(""), str8_lit_comp("Locals"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Binoculars, {0, 0}},
|
||||
{ str8_lit_comp("registers"), str8_lit_comp("Opens a registers view for the currently selected thread."), str8_lit_comp(""), str8_lit_comp("Registers"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Binoculars, {0, 0}},
|
||||
{ str8_lit_comp("output"), str8_lit_comp("Opens an output view."), str8_lit_comp(""), str8_lit_comp("Output"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_List, {0, 0}},
|
||||
{ str8_lit_comp("memory"), str8_lit_comp("Opens a memory view."), str8_lit_comp(""), str8_lit_comp("Memory"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Grid, {0, 0}},
|
||||
{ str8_lit_comp("disassembly"), str8_lit_comp("Opens the disassembly view."), str8_lit_comp("disasm"), str8_lit_comp("Disassembly"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Glasses, {0, 0}},
|
||||
{ str8_lit_comp("breakpoints"), str8_lit_comp("Opens the breakpoints view."), str8_lit_comp(""), str8_lit_comp("Breakpoints"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_CircleFilled, {0, 0}},
|
||||
{ str8_lit_comp("watch_pins"), str8_lit_comp("Opens the watch pins view."), str8_lit_comp(""), str8_lit_comp("Watch Pins"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Pin, {0, 0}},
|
||||
{ str8_lit_comp("exception_filters"), str8_lit_comp("Opens the exception filters view."), str8_lit_comp("exceptions,filters"), str8_lit_comp("Exception Filters"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Gear, {0, 0}},
|
||||
{ str8_lit_comp("theme"), str8_lit_comp("Opens the theme view."), str8_lit_comp("theme,color,scheme,palette"), str8_lit_comp("Theme"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Palette, {0, 0}},
|
||||
{ str8_lit_comp("pick_file"), str8_lit_comp("Opens the file browser to pick a file."), str8_lit_comp(""), str8_lit_comp("Pick File"), (DF_CmdSpecFlag_OmitFromLists*1) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*1) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_FilePath, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_FilePath, DF_IconKind_FileOutline, {0, 0}},
|
||||
{ str8_lit_comp("complete_view"), str8_lit_comp("Completes a view, passing all parameters to a new command matching the passed command spec."), str8_lit_comp(""), str8_lit_comp("Complete View"), (DF_CmdSpecFlag_OmitFromLists*1) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp("toggle_dev_menu"), str8_lit_comp("Opens and closes the developer menu."), str8_lit_comp(""), str8_lit_comp("Toggle Developer Menu"), (DF_CmdSpecFlag_OmitFromLists*0) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_AppliesToView*0) | (DF_CmdSpecFlag_QueryIsCode*0), {DF_CmdParamSlot_Null, DF_CmdParamSlot_Null, DF_CmdParamSlot_Null}, DF_CmdQueryRule_Null, DF_IconKind_Null, {0, 0}},
|
||||
{ str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("exit"), str8_lit_comp("Exits the debugger."), str8_lit_comp("quit,close,abort"), str8_lit_comp("Exit"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_X},
|
||||
{ str8_lit_comp("run_command"), str8_lit_comp("Runs a command from the command palette."), str8_lit_comp("help,cmd"), str8_lit_comp("Run Command"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_CmdSpec, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("error"), str8_lit_comp("Notifies of an error."), str8_lit_comp(""), str8_lit_comp("Error"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ 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("Launch and Run"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_EntityList, DF_EntityKind_Target, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Play},
|
||||
{ str8_lit_comp("launch_and_init"), str8_lit_comp("Starts debugging a new instance of a target, then stops at the program's entry point."), str8_lit_comp("launch,start,entry,point"), str8_lit_comp("Launch and Initialize"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_EntityList, DF_EntityKind_Target, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_PlayStepForward},
|
||||
{ str8_lit_comp("kill"), str8_lit_comp("Kills the specified existing debugged process(es)."), str8_lit_comp("stop,kill"), str8_lit_comp("Kill"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_EntityList, DF_EntityKind_Process, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Stop},
|
||||
{ str8_lit_comp("kill_all"), str8_lit_comp("Kills all debugged child processes."), str8_lit_comp("stop,kill,all"), str8_lit_comp("Kill All"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Stop},
|
||||
{ str8_lit_comp("detach"), str8_lit_comp("Detaches the specified debugged process."), str8_lit_comp("detach"), str8_lit_comp("Detach"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_EntityList, DF_EntityKind_Process, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("continue"), str8_lit_comp("Continues all halted threads."), str8_lit_comp(""), str8_lit_comp("Continue"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Play},
|
||||
{ str8_lit_comp("step_into_inst"), str8_lit_comp("Performs a step that goes into calls, at the instruction level."), str8_lit_comp("single,step,thread"), str8_lit_comp("Step Into (Assembly)"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_StepInto},
|
||||
{ str8_lit_comp("step_over_inst"), str8_lit_comp("Performs a step that skips calls, at the instruction level."), str8_lit_comp("single,step,thread"), str8_lit_comp("Step Over (Assembly)"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_StepOver},
|
||||
{ str8_lit_comp("step_into_line"), str8_lit_comp("Performs a step that goes into calls, at the source code line level."), str8_lit_comp("step,thread"), str8_lit_comp("Step Into (Line)"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_StepInto},
|
||||
{ str8_lit_comp("step_over_line"), str8_lit_comp("Performs a step that skips calls, at the source code line level."), str8_lit_comp("step,thread"), str8_lit_comp("Step Over (Line)"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_StepOver},
|
||||
{ str8_lit_comp("step_out"), str8_lit_comp("Runs to the end of the current function and exits it."), str8_lit_comp(""), str8_lit_comp("Step Out"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_StepOut},
|
||||
{ str8_lit_comp("run_to_address"), str8_lit_comp("Runs the selected thread to the specified address."), str8_lit_comp(""), str8_lit_comp("Run To Address"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_VirtualAddr, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*1)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_PlayStepForward},
|
||||
{ str8_lit_comp("halt"), str8_lit_comp("Halts all running processes."), str8_lit_comp("pause"), str8_lit_comp("Halt"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Pause},
|
||||
{ str8_lit_comp("soft_halt_refresh"), str8_lit_comp("Interrupts all running processes to collect data, and then resumes them."), str8_lit_comp(""), str8_lit_comp("Soft Halt Refresh"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Refresh},
|
||||
{ str8_lit_comp("set_thread_ip"), str8_lit_comp("Sets the passed thread's instruction pointer at the passed address."), str8_lit_comp(""), str8_lit_comp("Set Thread IP"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_VirtualAddr, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*1)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("run"), str8_lit_comp("Runs all targets after starting them if they have not been started yet."), str8_lit_comp("play"), str8_lit_comp("Run"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Play},
|
||||
{ str8_lit_comp("restart"), str8_lit_comp("Kills all running processes, then restarts the targets which were used to launch all current processes (if any)."), str8_lit_comp("restart,retry"), str8_lit_comp("Restart"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Redo},
|
||||
{ str8_lit_comp("step_into"), str8_lit_comp("Steps once, possibly into function calls, for either line or instructions."), str8_lit_comp(""), str8_lit_comp("Step Into"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_StepInto},
|
||||
{ str8_lit_comp("step_over"), str8_lit_comp("Steps once, always over function calls, for either line or instructions."), str8_lit_comp(""), str8_lit_comp("Step Over"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_StepOver},
|
||||
{ str8_lit_comp("run_to_cursor"), str8_lit_comp("Runs the selected thread to the current cursor."), str8_lit_comp(""), str8_lit_comp("Run To Cursor"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Play},
|
||||
{ str8_lit_comp("set_next_statement"), str8_lit_comp("Sets the selected thread's instruction pointer to the cursor's position."), str8_lit_comp(""), str8_lit_comp("Set Next Statement"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_RightArrow},
|
||||
{ str8_lit_comp("enable_solo_stepping_mode"), str8_lit_comp("Enables 'solo stepping mode', which suspends all non-selected threads before stepping."), str8_lit_comp("solo,stepping,mode,suspend"), str8_lit_comp("Enable Solo Stepping Mode"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Thread},
|
||||
{ str8_lit_comp("disable_solo_stepping_mode"), str8_lit_comp("Disables 'solo stepping mode', which suspends all non-selected threads before stepping."), str8_lit_comp("solo,stepping,mode,suspend"), str8_lit_comp("Disable Solo Stepping Mode"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Thread},
|
||||
{ str8_lit_comp("select_thread"), str8_lit_comp("Selects a thread."), str8_lit_comp(""), str8_lit_comp("Select Thread"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Entity, DF_EntityKind_Thread, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("select_thread_window"), str8_lit_comp("Selects a thread for the active window, overriding the global selected thread."), str8_lit_comp(""), str8_lit_comp("Select Thread On Window"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Entity, DF_EntityKind_Thread, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("select_thread_view"), str8_lit_comp("Selects a thread for the active view, overriding the global and per-window selected threads."), str8_lit_comp(""), str8_lit_comp("Select Thread On View"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Entity, DF_EntityKind_Thread, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("select_unwind"), str8_lit_comp("Selects an unwind frame number for the selected thread."), str8_lit_comp(""), str8_lit_comp("Select Unwind"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("up_one_frame"), str8_lit_comp("Selects the callstack frame above the currently selected."), str8_lit_comp(""), str8_lit_comp("Up One Frame"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_UpArrow},
|
||||
{ str8_lit_comp("down_one_frame"), str8_lit_comp("Selects the callstack frame below the currently selected."), str8_lit_comp(""), str8_lit_comp("Down One Frame"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_DownArrow},
|
||||
{ str8_lit_comp("freeze_thread"), str8_lit_comp("Freezes the passed thread."), str8_lit_comp(""), str8_lit_comp("Freeze Thread"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Entity, DF_EntityKind_Thread, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Locked},
|
||||
{ str8_lit_comp("thaw_thread"), str8_lit_comp("Thaws the passed thread."), str8_lit_comp(""), str8_lit_comp("Thaw Thread"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Entity, DF_EntityKind_Thread, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Unlocked},
|
||||
{ str8_lit_comp("freeze_process"), str8_lit_comp("Freezes the passed process."), str8_lit_comp(""), str8_lit_comp("Freeze Process"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Entity, DF_EntityKind_Process, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Locked},
|
||||
{ str8_lit_comp("thaw_process"), str8_lit_comp("Thaws the passed process."), str8_lit_comp(""), str8_lit_comp("Thaw Process"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Entity, DF_EntityKind_Process, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Unlocked},
|
||||
{ str8_lit_comp("freeze_machine"), str8_lit_comp("Freezes the passed machine."), str8_lit_comp(""), str8_lit_comp("Freeze Machine"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Entity, DF_EntityKind_Machine, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Locked},
|
||||
{ str8_lit_comp("thaw_machine"), str8_lit_comp("Thaws the passed machine."), str8_lit_comp(""), str8_lit_comp("Thaw Machine"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Entity, DF_EntityKind_Machine, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Unlocked},
|
||||
{ str8_lit_comp("freeze_local_machine"), str8_lit_comp("Freezes the local machine."), str8_lit_comp(""), str8_lit_comp("Freeze Local Machine"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Machine},
|
||||
{ str8_lit_comp("thaw_local_machine"), str8_lit_comp("Thaws the local machine."), str8_lit_comp(""), str8_lit_comp("Thaw Local Machine"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Machine},
|
||||
{ str8_lit_comp("inc_ui_font_scale"), str8_lit_comp("Increases the font size used for UI."), str8_lit_comp(""), str8_lit_comp("Increase UI Font Scale"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("dec_ui_font_scale"), str8_lit_comp("Decreases the font size used for UI."), str8_lit_comp(""), str8_lit_comp("Decrease UI Font Scale"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("inc_code_font_scale"), str8_lit_comp("Increases the font size used for code."), str8_lit_comp(""), str8_lit_comp("Increase Code Font Scale"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("dec_code_font_scale"), str8_lit_comp("Decreases the font size used for code."), str8_lit_comp(""), str8_lit_comp("Decrease Code Font Scale"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("open_window"), str8_lit_comp("Opens a new window."), str8_lit_comp(""), str8_lit_comp("Open New Window"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Window},
|
||||
{ str8_lit_comp("close_window"), str8_lit_comp("Closes an opened window."), str8_lit_comp(""), str8_lit_comp("Close Window"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Window},
|
||||
{ str8_lit_comp("toggle_fullscreen"), str8_lit_comp("Toggles fullscreen view on the active window."), str8_lit_comp(""), str8_lit_comp("Toggle Fullscreen"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Window},
|
||||
{ str8_lit_comp("confirm_accept"), str8_lit_comp("Accepts the active confirmation prompt."), str8_lit_comp(""), str8_lit_comp("Confirm Accept"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("confirm_cancel"), str8_lit_comp("Cancels the active confirmation prompt."), str8_lit_comp(""), str8_lit_comp("Confirm Cancel"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("reset_to_default_panels"), str8_lit_comp("Resets the window to the default panel layout."), str8_lit_comp("panel"), str8_lit_comp("Reset To Default Panel Layout"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Window},
|
||||
{ str8_lit_comp("new_panel_right"), str8_lit_comp("Creates a new panel to the right of the active panel."), str8_lit_comp("panel"), str8_lit_comp("Split Panel Vertically"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_XSplit},
|
||||
{ str8_lit_comp("new_panel_down"), str8_lit_comp("Creates a new panel at the bottom of the active panel."), str8_lit_comp("panel"), str8_lit_comp("Split Panel Horizontally"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_YSplit},
|
||||
{ str8_lit_comp("rotate_panel_columns"), str8_lit_comp("Rotates all panels at the closest column level of the panel hierarchy."), str8_lit_comp(""), str8_lit_comp("Rotate Panel Columns"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("next_panel"), str8_lit_comp("Cycles the active panel forward."), str8_lit_comp(""), str8_lit_comp("Focus Next Panel"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_RightArrow},
|
||||
{ str8_lit_comp("prev_panel"), str8_lit_comp("Cycles the active panel backwards."), str8_lit_comp(""), str8_lit_comp("Focus Previous Panel"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_LeftArrow},
|
||||
{ str8_lit_comp("focus_panel"), str8_lit_comp("Focuses a new panel."), str8_lit_comp(""), str8_lit_comp("Focus Panel"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("focus_panel_right"), str8_lit_comp("Focuses a panel rightward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp("Focus Panel Right"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_RightArrow},
|
||||
{ str8_lit_comp("focus_panel_left"), str8_lit_comp("Focuses a panel leftward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp("Focus Panel Left"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_LeftArrow},
|
||||
{ str8_lit_comp("focus_panel_up"), str8_lit_comp("Focuses a panel upward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp("Focus Panel Up"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_UpArrow},
|
||||
{ str8_lit_comp("focus_panel_down"), str8_lit_comp("Focuses a panel downward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp("Focus Panel Down"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_DownArrow},
|
||||
{ str8_lit_comp("undo"), str8_lit_comp("Undoes the previous action."), str8_lit_comp(""), str8_lit_comp("Undo"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Undo},
|
||||
{ str8_lit_comp("redo"), str8_lit_comp("Redoes the first previously undone action."), str8_lit_comp(""), str8_lit_comp("Redo"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Redo},
|
||||
{ str8_lit_comp("go_back"), str8_lit_comp("Returns to the previously selected panel and tab in recorded history."), str8_lit_comp(""), str8_lit_comp("Go Back"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_LeftArrow},
|
||||
{ str8_lit_comp("go_forward"), str8_lit_comp("Returns to the next selected panel and tab in recorded history."), str8_lit_comp(""), str8_lit_comp("Go Forward"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_RightArrow},
|
||||
{ str8_lit_comp("close_panel"), str8_lit_comp("Closes the currently active panel."), str8_lit_comp(""), str8_lit_comp("Close Panel"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_ClosePanel},
|
||||
{ str8_lit_comp("next_tab"), str8_lit_comp("Focuses the next tab on the active panel."), str8_lit_comp(""), str8_lit_comp("Focus Next Tab"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_RightArrow},
|
||||
{ str8_lit_comp("prev_tab"), str8_lit_comp("Focuses the previous tab on the active panel."), str8_lit_comp(""), str8_lit_comp("Focus Previous Tab"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_LeftArrow},
|
||||
{ str8_lit_comp("move_tab_right"), str8_lit_comp("Moves the selected tab right one slot."), str8_lit_comp(""), str8_lit_comp("Move Tab Right"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_RightArrow},
|
||||
{ str8_lit_comp("move_tab_left"), str8_lit_comp("Moves the selected tab left one slot."), str8_lit_comp(""), str8_lit_comp("Move Tab Left"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_LeftArrow},
|
||||
{ str8_lit_comp("open_tab"), str8_lit_comp("Opens a new tab with the parameterized view specification."), str8_lit_comp(""), str8_lit_comp("Open Tab"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("close_tab"), str8_lit_comp("Closes the currently opened tab."), str8_lit_comp(""), str8_lit_comp("Close Tab"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_X},
|
||||
{ str8_lit_comp("move_tab"), str8_lit_comp("Moves a tab to a new panel."), str8_lit_comp(""), str8_lit_comp("Move Tab"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("tab_bar_top"), str8_lit_comp("Anchors a panel's tab bar to the top of the panel."), str8_lit_comp(""), str8_lit_comp("Anchor Tab Bar To Top"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_UpArrow},
|
||||
{ str8_lit_comp("tab_bar_bottom"), str8_lit_comp("Anchors a panel's tab bar to the bottom of the panel."), str8_lit_comp(""), str8_lit_comp("Anchor Tab Bar To Bottom"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_DownArrow},
|
||||
{ str8_lit_comp("set_current_path"), str8_lit_comp("Sets the debugger's current path, which is used as a starting point when browsing for files."), str8_lit_comp(""), str8_lit_comp("Set Current Path"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_FileOutline},
|
||||
{ str8_lit_comp("open"), str8_lit_comp("Opens a file."), str8_lit_comp("code,source,file"), str8_lit_comp("Open"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_FilePath, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*1)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_FileOutline},
|
||||
{ str8_lit_comp("reload"), str8_lit_comp("Reloads a loaded file."), str8_lit_comp("code,source,file,reload"), str8_lit_comp("Reload"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Entity, DF_EntityKind_File, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_FileOutline},
|
||||
{ str8_lit_comp("reload_active"), str8_lit_comp("Reloads the active file."), str8_lit_comp("code,source,file,reload"), str8_lit_comp("Reload Active File"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_FileOutline},
|
||||
{ str8_lit_comp("switch"), str8_lit_comp("Switches to a loaded file."), str8_lit_comp("code,source,file"), str8_lit_comp("Switch"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Entity, DF_EntityKind_File, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_FileOutline},
|
||||
{ str8_lit_comp("switch_to_partner_file"), str8_lit_comp("Switches to the focused file's partner; or from header to implementation or vice versa."), str8_lit_comp("code,source,file"), str8_lit_comp("Switch To Partner File"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_FileOutline},
|
||||
{ str8_lit_comp("set_file_override_link_src"), str8_lit_comp("Sets the source path for an override file link."), str8_lit_comp(""), str8_lit_comp("Set File Override Link Source"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("set_file_override_link_dst"), str8_lit_comp("Sets the destination path for an override file link."), str8_lit_comp(""), str8_lit_comp("Set File Override Link Destination"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("set_file_replacement_path"), str8_lit_comp("Sets the path which should be used as the replacement for the passed file."), str8_lit_comp(""), str8_lit_comp("Set File Replacement Path"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("load_user"), str8_lit_comp("Loads and applies a user file."), str8_lit_comp("load,user,profile,layout"), str8_lit_comp("Load User"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_FilePath, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*1)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Person},
|
||||
{ str8_lit_comp("load_profile"), str8_lit_comp("Loads and applies a profile file."), str8_lit_comp("profile,project,session"), str8_lit_comp("Load Profile"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_FilePath, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*1)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Briefcase},
|
||||
{ str8_lit_comp("apply_user_data"), str8_lit_comp("Applies user data from the active user file."), str8_lit_comp(""), str8_lit_comp("Apply User Data"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("apply_profile_data"), str8_lit_comp("Applies profile data from the active profile file."), str8_lit_comp(""), str8_lit_comp("Apply Profile Data"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("write_user_data"), str8_lit_comp("Writes user data to the active user file."), str8_lit_comp(""), str8_lit_comp("Write User Data"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("write_profile_data"), str8_lit_comp("Writes profile data to the active profile file."), str8_lit_comp(""), str8_lit_comp("Write Profile Data"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("move_left"), str8_lit_comp("Moves the cursor or selection left."), str8_lit_comp(""), str8_lit_comp("Move Left"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("move_right"), str8_lit_comp("Moves the cursor or selection right."), str8_lit_comp(""), str8_lit_comp("Move Right"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("move_up"), str8_lit_comp("Moves the cursor or selection up."), str8_lit_comp(""), str8_lit_comp("Move Up"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("move_down"), str8_lit_comp("Moves the cursor or selection down."), str8_lit_comp(""), str8_lit_comp("Move Down"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("move_left_select"), str8_lit_comp("Moves the cursor or selection left, while selecting."), str8_lit_comp(""), str8_lit_comp("Move Left Select"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("move_right_select"), str8_lit_comp("Moves the cursor or selection right, while selecting."), str8_lit_comp(""), str8_lit_comp("Move Right Select"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("move_up_select"), str8_lit_comp("Moves the cursor or selection up, while selecting."), str8_lit_comp(""), str8_lit_comp("Move Up Select"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("move_down_select"), str8_lit_comp("Moves the cursor or selection down, while selecting."), str8_lit_comp(""), str8_lit_comp("Move Down Select"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("move_left_chunk"), str8_lit_comp("Moves the cursor or selection left one chunk."), str8_lit_comp(""), str8_lit_comp("Move Left Select"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("move_right_chunk"), str8_lit_comp("Moves the cursor or selection right one chunk."), str8_lit_comp(""), str8_lit_comp("Move Right Select"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("move_up_chunk"), str8_lit_comp("Moves the cursor or selection up one chunk."), str8_lit_comp(""), str8_lit_comp("Move Up Chunk"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("move_down_chunk"), str8_lit_comp("Moves the cursor or selection down one chunk."), str8_lit_comp(""), str8_lit_comp("Move Down Chunk"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("move_up_page"), str8_lit_comp("Moves the cursor or selection up one page."), str8_lit_comp(""), str8_lit_comp("Move Up Page"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("move_down_page"), str8_lit_comp("Moves the cursor or selection down one page."), str8_lit_comp(""), str8_lit_comp("Move Down Page"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("move_up_whole"), str8_lit_comp("Moves the cursor or selection to the beginning of the relevant content."), str8_lit_comp(""), str8_lit_comp("Move Up Whole"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("move_down_whole"), str8_lit_comp("Moves the cursor or selection to the end of the relevant content."), str8_lit_comp(""), str8_lit_comp("Move Down Whole"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("move_left_chunk_select"), str8_lit_comp("Moves the cursor or selection left one chunk."), str8_lit_comp(""), str8_lit_comp("Move Left Chunk Select"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("move_right_chunk_select"), str8_lit_comp("Moves the cursor or selection right one chunk."), str8_lit_comp(""), str8_lit_comp("Move Right Chunk Select"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("move_up_chunk_select"), str8_lit_comp("Moves the cursor or selection up one chunk."), str8_lit_comp(""), str8_lit_comp("Move Up Chunk Select"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("move_down_chunk_select"), str8_lit_comp("Moves the cursor or selection down one chunk."), str8_lit_comp(""), str8_lit_comp("Move Down Chunk Select"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("move_up_page_select"), str8_lit_comp("Moves the cursor or selection up one page, while selecting."), str8_lit_comp(""), str8_lit_comp("Move Up Page Select"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("move_down_page_select"), str8_lit_comp("Moves the cursor or selection down one page, while selecting."), str8_lit_comp(""), str8_lit_comp("Move Down Page Select"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("move_up_whole_select"), str8_lit_comp("Moves the cursor or selection to the beginning of the relevant content, while selecting."), str8_lit_comp(""), str8_lit_comp("Move Up Whole Select"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("move_down_whole_select"), str8_lit_comp("Moves the cursor or selection to the end of the relevant content, while selecting."), str8_lit_comp(""), str8_lit_comp("Move Down Whole Select"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("move_home"), str8_lit_comp("Moves the cursor to the beginning of the line."), str8_lit_comp(""), str8_lit_comp("Move Home"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("move_end"), str8_lit_comp("Moves the cursor to the end of the line."), str8_lit_comp(""), str8_lit_comp("Move End"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("move_home_select"), str8_lit_comp("Moves the cursor to the beginning of the line, while selecting."), str8_lit_comp(""), str8_lit_comp("Move Home Select"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("move_end_select"), str8_lit_comp("Moves the cursor to the end of the line, while selecting."), str8_lit_comp(""), str8_lit_comp("Move End Select"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("select_all"), str8_lit_comp("Selects everything possible."), str8_lit_comp(""), str8_lit_comp("Select All"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("delete_single"), str8_lit_comp("Deletes a single element to the right of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp("Delete Single"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("delete_chunk"), str8_lit_comp("Deletes a chunk to the right of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp("Delete Chunk"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("backspace_single"), str8_lit_comp("Deletes a single element to the left of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp("Backspace Single"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("backspace_chunk"), str8_lit_comp("Deletes a chunk to the left of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp("Backspace Chunk"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("copy"), str8_lit_comp("Copies the active selection to the clipboard."), str8_lit_comp(""), str8_lit_comp("Copy"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Clipboard},
|
||||
{ str8_lit_comp("cut"), str8_lit_comp("Copies the active selection to the clipboard, then deletes it."), str8_lit_comp(""), str8_lit_comp("Cut"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Clipboard},
|
||||
{ str8_lit_comp("paste"), str8_lit_comp("Pastes the current contents of the clipboard."), str8_lit_comp(""), str8_lit_comp("Paste"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Clipboard},
|
||||
{ str8_lit_comp("insert_text"), str8_lit_comp("Inserts the text that was used to cause this command."), str8_lit_comp(""), str8_lit_comp("Insert Text"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("goto_line"), str8_lit_comp("Jumps to a line number in the current code file."), str8_lit_comp(""), str8_lit_comp("Go To Line"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_TextPoint, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*1)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("goto_address"), str8_lit_comp("Jumps to an address in the current memory or disassembly view."), str8_lit_comp(""), str8_lit_comp("Go To Address"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_VirtualAddr, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*1)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("center_cursor"), str8_lit_comp("Snaps the current code view to center the cursor."), str8_lit_comp(""), str8_lit_comp("Center Cursor"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("contain_cursor"), str8_lit_comp("Snaps the current code view to contain the cursor."), str8_lit_comp(""), str8_lit_comp("Contain Cursor"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("find_text_forward"), str8_lit_comp("Searches the current code file forward (from the cursor) for a string."), str8_lit_comp(""), str8_lit_comp("Find Text (Forward)"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_String, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*1)|(DF_CmdQueryFlag_KeepOldInput*1)|(DF_CmdQueryFlag_SelectOldInput*1)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Find},
|
||||
{ str8_lit_comp("find_text_backward"), str8_lit_comp("Searches the current code file backwards (from the cursor) for a string."), str8_lit_comp(""), str8_lit_comp("Find Text (Backwards)"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_String, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*1)|(DF_CmdQueryFlag_KeepOldInput*1)|(DF_CmdQueryFlag_SelectOldInput*1)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Find},
|
||||
{ str8_lit_comp("find_next"), str8_lit_comp("Searches the current code file forward (from the cursor) for the last searched string."), str8_lit_comp(""), str8_lit_comp("Find Next"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*1)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Find},
|
||||
{ str8_lit_comp("find_prev"), str8_lit_comp("Searches the current code file backwards (from the cursor) for the last searched string."), str8_lit_comp(""), str8_lit_comp("Find Previous"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*1)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Find},
|
||||
{ str8_lit_comp("find_thread"), str8_lit_comp("Jumps to the passed thread in either source code, disassembly, or both if they're already open."), str8_lit_comp(""), str8_lit_comp("Find Thread"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Entity, DF_EntityKind_Thread, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Find},
|
||||
{ str8_lit_comp("find_selected_thread"), str8_lit_comp("Jumps to the selected thread in either source code, disassembly, or both if they're already open."), str8_lit_comp(""), str8_lit_comp("Find Selected Thread"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Find},
|
||||
{ str8_lit_comp("goto_name"), str8_lit_comp("Searches for the passed string as a file, a symbol in debug info, and more, then jumps to it if possible."), str8_lit_comp(""), str8_lit_comp("Go To Name"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_String, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*1)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("goto_name_at_cursor"), str8_lit_comp("Searches for the text at the cursor as a file, a symbol in debug info, and more, then jumps to it if possible."), str8_lit_comp(""), str8_lit_comp("Go To Name At Cursor"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("toggle_watch_expr"), str8_lit_comp("Adds or removes an expression to an opened watch view."), str8_lit_comp(""), str8_lit_comp("Toggle Watch Expression"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Binoculars},
|
||||
{ str8_lit_comp("toggle_watch_expr_at_cursor"), str8_lit_comp("Adds or removes the expression that the cursor or selection is currently over to an opened watch view."), str8_lit_comp(""), str8_lit_comp("Toggle Watch Expression At Cursor"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Binoculars},
|
||||
{ str8_lit_comp("set_columns"), str8_lit_comp("Sets the number of columns for a memory view."), str8_lit_comp(""), str8_lit_comp("Set Columns"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Index, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*1)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Thumbnails},
|
||||
{ str8_lit_comp("toggle_address_visibility"), str8_lit_comp("Toggles the visibility of addresses in a disassembly view."), str8_lit_comp(""), str8_lit_comp("Toggle Address Visibility"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Thumbnails},
|
||||
{ str8_lit_comp("toggle_code_bytes_visibility"), str8_lit_comp("Toggles the visibility of machine code bytes in a disassembly view."), str8_lit_comp(""), str8_lit_comp("Toggle Code Bytes Visibility"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Thumbnails},
|
||||
{ str8_lit_comp("enable_entity"), str8_lit_comp("Enables an entity."), str8_lit_comp(""), str8_lit_comp("Enable Entity"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("disable_entity"), str8_lit_comp("Disables an entity."), str8_lit_comp(""), str8_lit_comp("Disable Entity"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("freeze_entity"), str8_lit_comp("Freezes an entity."), str8_lit_comp(""), str8_lit_comp("Freeze Entity"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("thaw_entity"), str8_lit_comp("Thaws an entity."), str8_lit_comp(""), str8_lit_comp("Thaw Entity"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("remove_entity"), str8_lit_comp("Removes an entity."), str8_lit_comp(""), str8_lit_comp("Remove Entity"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("name_entity"), str8_lit_comp("Equips an entity with a name."), str8_lit_comp(""), str8_lit_comp("Name Entity"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("edit_entity"), str8_lit_comp("Opens the editor for an entity."), str8_lit_comp(""), str8_lit_comp("Edit Entity"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("duplicate_entity"), str8_lit_comp("Duplicates an entity."), str8_lit_comp(""), str8_lit_comp("Duplicate Entity"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("text_breakpoint"), str8_lit_comp("Places or removes a breakpoint on the specified line of source code."), str8_lit_comp(""), str8_lit_comp("Text Breakpoint"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_CircleFilled},
|
||||
{ str8_lit_comp("address_breakpoint"), str8_lit_comp("Places or removes a breakpoint on the specified address."), str8_lit_comp(""), str8_lit_comp("Address Breakpoint"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_VirtualAddr, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*1)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_CircleFilled},
|
||||
{ str8_lit_comp("function_breakpoint"), str8_lit_comp("Places or removes a breakpoint on the first address(es) of the specified function."), str8_lit_comp(""), str8_lit_comp("Function Breakpoint"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_String, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*1)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_CircleFilled},
|
||||
{ str8_lit_comp("toggle_breakpoint_cursor"), str8_lit_comp("Places or removes a breakpoint on the line on which the active cursor sits."), str8_lit_comp(""), str8_lit_comp("Toggle Breakpoint At Cursor"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_CircleFilled},
|
||||
{ str8_lit_comp("remove_breakpoint"), str8_lit_comp("Removes an existing breakpoint."), str8_lit_comp(""), str8_lit_comp("Remove Breakpoint"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Entity, DF_EntityKind_Breakpoint, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Trash},
|
||||
{ str8_lit_comp("enable_breakpoint"), str8_lit_comp("Enables a breakpoint."), str8_lit_comp(""), str8_lit_comp("Enable Breakpoint"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Entity, DF_EntityKind_Breakpoint, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_CheckFilled},
|
||||
{ str8_lit_comp("disable_breakpoint"), str8_lit_comp("Disables a breakpoint."), str8_lit_comp(""), str8_lit_comp("Disable Breakpoint"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Entity, DF_EntityKind_Breakpoint, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_CheckHollow},
|
||||
{ str8_lit_comp("toggle_watch_pin"), str8_lit_comp("Places or removes a watch pin on a textual location on a particular entity."), str8_lit_comp(""), str8_lit_comp("Toggle Watch Pin"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Binoculars},
|
||||
{ str8_lit_comp("toggle_watch_pin_at_cursor"), str8_lit_comp("Places or removes a watch pin at the cursor on the currently active file."), str8_lit_comp(""), str8_lit_comp("Toggle Watch Pin At Cursor"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_String, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*1)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Binoculars},
|
||||
{ str8_lit_comp("add_target"), str8_lit_comp("Adds a new target."), str8_lit_comp("application,executable,debug"), str8_lit_comp("Add Target"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_FilePath, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*1)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Target},
|
||||
{ str8_lit_comp("remove_target"), str8_lit_comp("Removes an existing target."), str8_lit_comp("delete,remove,target"), str8_lit_comp("Remove Target"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Entity, DF_EntityKind_Target, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Trash},
|
||||
{ str8_lit_comp("edit_target"), str8_lit_comp("Edits an existing target."), str8_lit_comp(""), str8_lit_comp("Edit Target"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Entity, DF_EntityKind_Target, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Pencil},
|
||||
{ str8_lit_comp("retry_ended_process"), str8_lit_comp("Launches a new process with the same options as the passed ended process."), str8_lit_comp(""), str8_lit_comp("Retry Ended Process"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Entity, DF_EntityKind_Process, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("attach"), str8_lit_comp("Attaches to a process that is already running on the local machine."), str8_lit_comp(""), str8_lit_comp("Attach"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_ID, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*1)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("register_as_jit_debugger"), str8_lit_comp("Registers the RAD debugger as the just-in-time (JIT) debugger used by the operating system."), str8_lit_comp(""), str8_lit_comp("Register As Just-In-Time (JIT) Debugger"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("entity_ref_fast_path"), str8_lit_comp("Activates the default behavior when clicking an entity reference."), str8_lit_comp(""), str8_lit_comp("Entity Reference Fast Path"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("spawn_entity_view"), str8_lit_comp("Spawns a new view, given an entity and other parameterizations."), str8_lit_comp(""), str8_lit_comp("Spawn Entity View"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("find_code_location"), str8_lit_comp("Finds a specific source code location given file, line, and column coordinates. Opens the file if necessary."), str8_lit_comp(""), str8_lit_comp("Find Code Location"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_FilePath, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_FileOutline},
|
||||
{ str8_lit_comp("commands"), str8_lit_comp("Opens the list of all commands."), str8_lit_comp(""), str8_lit_comp("Commands"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_List},
|
||||
{ str8_lit_comp("target"), str8_lit_comp("Opens the editor for a target."), str8_lit_comp(""), str8_lit_comp("Target"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Target},
|
||||
{ str8_lit_comp("targets"), str8_lit_comp("Opens the list of all targets."), str8_lit_comp(""), str8_lit_comp("Targets"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Target},
|
||||
{ str8_lit_comp("file_path_map"), str8_lit_comp("Opens the file path mapping editor."), str8_lit_comp(""), str8_lit_comp("File Path Map"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_FileOutline},
|
||||
{ str8_lit_comp("scheduler"), str8_lit_comp("Opens the scheduler view, for process and thread controls."), str8_lit_comp(""), str8_lit_comp("Scheduler"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Scheduler},
|
||||
{ str8_lit_comp("call_stack"), str8_lit_comp("Opens the call stack view."), str8_lit_comp("callstack,thread"), str8_lit_comp("Call Stack"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Thread},
|
||||
{ str8_lit_comp("modules"), str8_lit_comp("Opens the modules view."), str8_lit_comp(""), str8_lit_comp("Modules"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Module},
|
||||
{ str8_lit_comp("pending_entity"), str8_lit_comp("Opens a view which waits for the passed entity to be completely loaded, then replaces itself with a new view."), str8_lit_comp(""), str8_lit_comp("Pending Entity"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_FileOutline},
|
||||
{ str8_lit_comp("code"), str8_lit_comp("Opens the code view for an already-loaded file."), str8_lit_comp(""), str8_lit_comp("Code"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_FileOutline},
|
||||
{ str8_lit_comp("watch"), str8_lit_comp("Opens a watch view."), str8_lit_comp(""), str8_lit_comp("Watch"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Binoculars},
|
||||
{ str8_lit_comp("locals"), str8_lit_comp("Opens a locals view."), str8_lit_comp(""), str8_lit_comp("Locals"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Binoculars},
|
||||
{ str8_lit_comp("registers"), str8_lit_comp("Opens a registers view for the currently selected thread."), str8_lit_comp(""), str8_lit_comp("Registers"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Binoculars},
|
||||
{ str8_lit_comp("output"), str8_lit_comp("Opens an output view."), str8_lit_comp(""), str8_lit_comp("Output"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_List},
|
||||
{ str8_lit_comp("memory"), str8_lit_comp("Opens a memory view."), str8_lit_comp(""), str8_lit_comp("Memory"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Grid},
|
||||
{ str8_lit_comp("disassembly"), str8_lit_comp("Opens the disassembly view."), str8_lit_comp("disasm"), str8_lit_comp("Disassembly"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Glasses},
|
||||
{ str8_lit_comp("breakpoints"), str8_lit_comp("Opens the breakpoints view."), str8_lit_comp(""), str8_lit_comp("Breakpoints"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_CircleFilled},
|
||||
{ str8_lit_comp("watch_pins"), str8_lit_comp("Opens the watch pins view."), str8_lit_comp(""), str8_lit_comp("Watch Pins"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Pin},
|
||||
{ str8_lit_comp("exception_filters"), str8_lit_comp("Opens the exception filters view."), str8_lit_comp("exceptions,filters"), str8_lit_comp("Exception Filters"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Gear},
|
||||
{ str8_lit_comp("theme"), str8_lit_comp("Opens the theme view."), str8_lit_comp("theme,color,scheme,palette"), str8_lit_comp("Theme"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Palette},
|
||||
{ str8_lit_comp("pick_file"), str8_lit_comp("Opens the file browser to pick a file."), str8_lit_comp(""), str8_lit_comp("Pick File"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_FilePath, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*1)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_FileOutline},
|
||||
{ str8_lit_comp("pick_folder"), str8_lit_comp("Opens the file browser to pick a folder."), str8_lit_comp(""), str8_lit_comp("Pick Folder"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_FilePath, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*1)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_FolderOpenFilled},
|
||||
{ str8_lit_comp("pick_file_or_folder"), str8_lit_comp("Opens the file browser to pick a file or folder."), str8_lit_comp(""), str8_lit_comp("Pick File/Folder"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_FilePath, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*1)|(DF_CmdQueryFlag_AllowFolders*1)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_FileOutline},
|
||||
{ str8_lit_comp("complete_query"), str8_lit_comp("Completes a query."), str8_lit_comp(""), str8_lit_comp("Complete Query"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("cancel_query"), str8_lit_comp("Cancels a query."), str8_lit_comp(""), str8_lit_comp("Cancel Query"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
{ str8_lit_comp("toggle_dev_menu"), str8_lit_comp("Opens and closes the developer menu."), str8_lit_comp(""), str8_lit_comp("Toggle Developer Menu"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
|
||||
};
|
||||
|
||||
DF_CoreViewRuleSpecInfo df_g_core_view_rule_spec_info_table[] =
|
||||
|
||||
@@ -57,7 +57,7 @@ typedef enum DF_CoreCmdKind
|
||||
{
|
||||
DF_CoreCmdKind_Null,
|
||||
DF_CoreCmdKind_Exit,
|
||||
DF_CoreCmdKind_CommandFastPath,
|
||||
DF_CoreCmdKind_RunCommand,
|
||||
DF_CoreCmdKind_Error,
|
||||
DF_CoreCmdKind_LaunchAndRun,
|
||||
DF_CoreCmdKind_LaunchAndInit,
|
||||
@@ -71,7 +71,6 @@ DF_CoreCmdKind_StepIntoLine,
|
||||
DF_CoreCmdKind_StepOverLine,
|
||||
DF_CoreCmdKind_StepOut,
|
||||
DF_CoreCmdKind_RunToAddress,
|
||||
DF_CoreCmdKind_RunToModuleOffset,
|
||||
DF_CoreCmdKind_Halt,
|
||||
DF_CoreCmdKind_SoftHaltRefresh,
|
||||
DF_CoreCmdKind_SetThreadIP,
|
||||
@@ -126,19 +125,17 @@ DF_CoreCmdKind_NextTab,
|
||||
DF_CoreCmdKind_PrevTab,
|
||||
DF_CoreCmdKind_MoveTabRight,
|
||||
DF_CoreCmdKind_MoveTabLeft,
|
||||
DF_CoreCmdKind_OpenTab,
|
||||
DF_CoreCmdKind_CloseTab,
|
||||
DF_CoreCmdKind_MoveTab,
|
||||
DF_CoreCmdKind_TabBarTop,
|
||||
DF_CoreCmdKind_TabBarBottom,
|
||||
DF_CoreCmdKind_TabBarEnable,
|
||||
DF_CoreCmdKind_TabBarDisable,
|
||||
DF_CoreCmdKind_TabBarHistoryModeEnable,
|
||||
DF_CoreCmdKind_TabBarHistoryModeDisable,
|
||||
DF_CoreCmdKind_SetCurrentPath,
|
||||
DF_CoreCmdKind_Open,
|
||||
DF_CoreCmdKind_Reload,
|
||||
DF_CoreCmdKind_ReloadActive,
|
||||
DF_CoreCmdKind_Switch,
|
||||
DF_CoreCmdKind_SwitchToPartnerFile,
|
||||
DF_CoreCmdKind_SetFileOverrideLinkSrc,
|
||||
DF_CoreCmdKind_SetFileOverrideLinkDst,
|
||||
DF_CoreCmdKind_SetFileReplacementPath,
|
||||
@@ -199,9 +196,6 @@ DF_CoreCmdKind_GoToName,
|
||||
DF_CoreCmdKind_GoToNameAtCursor,
|
||||
DF_CoreCmdKind_ToggleWatchExpression,
|
||||
DF_CoreCmdKind_ToggleWatchExpressionAtCursor,
|
||||
DF_CoreCmdKind_OpenFileMemory,
|
||||
DF_CoreCmdKind_OpenProcessMemory,
|
||||
DF_CoreCmdKind_OpenSelectedProcessMemory,
|
||||
DF_CoreCmdKind_SetColumns,
|
||||
DF_CoreCmdKind_ToggleAddressVisibility,
|
||||
DF_CoreCmdKind_ToggleCodeBytesVisibility,
|
||||
@@ -251,7 +245,10 @@ DF_CoreCmdKind_WatchPins,
|
||||
DF_CoreCmdKind_ExceptionFilters,
|
||||
DF_CoreCmdKind_Theme,
|
||||
DF_CoreCmdKind_PickFile,
|
||||
DF_CoreCmdKind_ViewReturn,
|
||||
DF_CoreCmdKind_PickFolder,
|
||||
DF_CoreCmdKind_PickFileOrFolder,
|
||||
DF_CoreCmdKind_CompleteQuery,
|
||||
DF_CoreCmdKind_CancelQuery,
|
||||
DF_CoreCmdKind_ToggleDevMenu,
|
||||
DF_CoreCmdKind_COUNT
|
||||
} DF_CoreCmdKind;
|
||||
@@ -365,6 +362,7 @@ DF_CmdParamSlot_String,
|
||||
DF_CmdParamSlot_FilePath,
|
||||
DF_CmdParamSlot_TextPoint,
|
||||
DF_CmdParamSlot_CmdSpec,
|
||||
DF_CmdParamSlot_ViewSpec,
|
||||
DF_CmdParamSlot_VirtualAddr,
|
||||
DF_CmdParamSlot_VirtualOff,
|
||||
DF_CmdParamSlot_Index,
|
||||
@@ -374,22 +372,6 @@ DF_CmdParamSlot_ForceConfirm,
|
||||
DF_CmdParamSlot_COUNT
|
||||
} DF_CmdParamSlot;
|
||||
|
||||
typedef enum DF_CmdQueryRule
|
||||
{
|
||||
DF_CmdQueryRule_Null,
|
||||
DF_CmdQueryRule_Entity,
|
||||
DF_CmdQueryRule_String,
|
||||
DF_CmdQueryRule_SearchString,
|
||||
DF_CmdQueryRule_FilePath,
|
||||
DF_CmdQueryRule_TextPoint,
|
||||
DF_CmdQueryRule_FilePathAndTextPoint,
|
||||
DF_CmdQueryRule_VirtualAddr,
|
||||
DF_CmdQueryRule_VirtualOff,
|
||||
DF_CmdQueryRule_Index,
|
||||
DF_CmdQueryRule_ID,
|
||||
DF_CmdQueryRule_COUNT
|
||||
} DF_CmdQueryRule;
|
||||
|
||||
typedef struct DF_CmdParams DF_CmdParams;
|
||||
struct DF_CmdParams
|
||||
{
|
||||
@@ -405,6 +387,7 @@ String8 string;
|
||||
String8 file_path;
|
||||
TxtPt text_point;
|
||||
struct DF_CmdSpec * cmd_spec;
|
||||
struct DF_ViewSpec * view_spec;
|
||||
U64 vaddr;
|
||||
U64 voff;
|
||||
U64 index;
|
||||
@@ -1519,19 +1502,27 @@ struct {B32 *value_ptr; String8 name;} DEV_toggle_table[] =
|
||||
{&DEV_scratch_mouse_draw, str8_lit_comp("scratch_mouse_draw")},
|
||||
{&DEV_updating_indicator, str8_lit_comp("updating_indicator")},
|
||||
};
|
||||
String8 df_g_cmd_query_rule_kind_arg_desc_table[] =
|
||||
Rng1U64 df_g_cmd_param_slot_range_table[] =
|
||||
{
|
||||
str8_lit_comp(""),
|
||||
str8_lit_comp(""),
|
||||
str8_lit_comp(""),
|
||||
str8_lit_comp(""),
|
||||
str8_lit_comp("<file path>"),
|
||||
str8_lit_comp("<line>[:column]"),
|
||||
str8_lit_comp("<file path>[:line[:column]]"),
|
||||
str8_lit_comp("<address>"),
|
||||
str8_lit_comp("<offset>"),
|
||||
str8_lit_comp("<index>"),
|
||||
str8_lit_comp("<id>"),
|
||||
{0},
|
||||
{OffsetOf(DF_CmdParams, window), OffsetOf(DF_CmdParams, window) + sizeof(DF_Handle)},
|
||||
{OffsetOf(DF_CmdParams, panel), OffsetOf(DF_CmdParams, panel) + sizeof(DF_Handle)},
|
||||
{OffsetOf(DF_CmdParams, dest_panel), OffsetOf(DF_CmdParams, dest_panel) + sizeof(DF_Handle)},
|
||||
{OffsetOf(DF_CmdParams, prev_view), OffsetOf(DF_CmdParams, prev_view) + sizeof(DF_Handle)},
|
||||
{OffsetOf(DF_CmdParams, view), OffsetOf(DF_CmdParams, view) + sizeof(DF_Handle)},
|
||||
{OffsetOf(DF_CmdParams, entity), OffsetOf(DF_CmdParams, entity) + sizeof(DF_Handle)},
|
||||
{OffsetOf(DF_CmdParams, entity_list), OffsetOf(DF_CmdParams, entity_list) + sizeof(DF_HandleList)},
|
||||
{OffsetOf(DF_CmdParams, string), OffsetOf(DF_CmdParams, string) + sizeof(String8)},
|
||||
{OffsetOf(DF_CmdParams, file_path), OffsetOf(DF_CmdParams, file_path) + sizeof(String8)},
|
||||
{OffsetOf(DF_CmdParams, text_point), OffsetOf(DF_CmdParams, text_point) + sizeof(TxtPt)},
|
||||
{OffsetOf(DF_CmdParams, cmd_spec), OffsetOf(DF_CmdParams, cmd_spec) + sizeof(struct DF_CmdSpec *)},
|
||||
{OffsetOf(DF_CmdParams, view_spec), OffsetOf(DF_CmdParams, view_spec) + sizeof(struct DF_ViewSpec *)},
|
||||
{OffsetOf(DF_CmdParams, vaddr), OffsetOf(DF_CmdParams, vaddr) + sizeof(U64)},
|
||||
{OffsetOf(DF_CmdParams, voff), OffsetOf(DF_CmdParams, voff) + sizeof(U64)},
|
||||
{OffsetOf(DF_CmdParams, index), OffsetOf(DF_CmdParams, index) + sizeof(U64)},
|
||||
{OffsetOf(DF_CmdParams, id), OffsetOf(DF_CmdParams, id) + sizeof(U64)},
|
||||
{OffsetOf(DF_CmdParams, prefer_dasm), OffsetOf(DF_CmdParams, prefer_dasm) + sizeof(B32)},
|
||||
{OffsetOf(DF_CmdParams, force_confirm), OffsetOf(DF_CmdParams, force_confirm) + sizeof(B32)},
|
||||
};
|
||||
|
||||
DF_IconKind df_g_entity_kind_icon_kind_table[] =
|
||||
|
||||
+1378
-1378
File diff suppressed because it is too large
Load Diff
+34
-37
@@ -176,6 +176,7 @@ struct DF_ViewSpecInfo
|
||||
String8 name;
|
||||
String8 display_string;
|
||||
DF_NameKind name_kind;
|
||||
DF_IconKind icon_kind;
|
||||
DF_ViewSetupFunctionType *setup_hook;
|
||||
DF_ViewStringFromStateFunctionType *string_from_state_hook;
|
||||
DF_ViewCmdFunctionType *cmd_hook;
|
||||
@@ -213,10 +214,6 @@ struct DF_View
|
||||
DF_View *next;
|
||||
DF_View *prev;
|
||||
|
||||
// rjf: call stack links (views can call into other views)
|
||||
DF_View *callee_view;
|
||||
DF_View *caller_view;
|
||||
|
||||
// rjf: allocation info
|
||||
U64 generation;
|
||||
|
||||
@@ -241,15 +238,15 @@ struct DF_View
|
||||
DF_ArenaExt *last_arena_ext;
|
||||
void *user_data;
|
||||
|
||||
// rjf: command data
|
||||
DF_CmdSpec *cmd_spec;
|
||||
DF_Handle cmd_entity;
|
||||
// rjf: view kind info
|
||||
DF_ViewSpec *spec;
|
||||
DF_Handle entity;
|
||||
|
||||
// rjf: query -> params data
|
||||
String8 query;
|
||||
TxtPt query_cursor;
|
||||
TxtPt query_mark;
|
||||
U8 query_buffer[1024];
|
||||
U64 query_string_size;
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
@@ -277,18 +274,13 @@ struct DF_Panel
|
||||
Vec2F32 size_pct_of_parent_target;
|
||||
|
||||
// rjf: tab params
|
||||
B32 hide_tab_bar;
|
||||
B32 history_tab_bar_mode;
|
||||
Side tab_side;
|
||||
|
||||
// rjf: query view stack
|
||||
DF_View *query_view_stack_top;
|
||||
|
||||
// rjf: stable view stacks (tabs)
|
||||
DF_View *first_stable_view;
|
||||
DF_View *last_stable_view;
|
||||
U64 stable_view_count;
|
||||
DF_View *selected_stable_view;
|
||||
DF_View *first_tab_view;
|
||||
DF_View *last_tab_view;
|
||||
U64 tab_view_count;
|
||||
DF_Handle selected_tab_view;
|
||||
};
|
||||
|
||||
typedef struct DF_PanelRec DF_PanelRec;
|
||||
@@ -572,6 +564,15 @@ struct DF_Window
|
||||
F32 autocomp_num_visible_rows_t;
|
||||
S64 autocomp_cursor_num;
|
||||
|
||||
// rjf: query view stack
|
||||
Arena *query_cmd_arena;
|
||||
DF_CmdSpec *query_cmd_spec;
|
||||
DF_CmdParams query_cmd_params;
|
||||
DF_View *query_view_stack_top;
|
||||
B32 query_view_selected;
|
||||
F32 query_view_selected_t;
|
||||
F32 query_view_t;
|
||||
|
||||
// rjf: hover eval stable state
|
||||
TxtPt hover_eval_txt_cursor;
|
||||
TxtPt hover_eval_txt_mark;
|
||||
@@ -661,7 +662,6 @@ struct DF_GfxState
|
||||
{
|
||||
// rjf: arenas
|
||||
Arena *arena;
|
||||
Arena *frame_arena;
|
||||
|
||||
// rjf: frame request state
|
||||
U64 num_frames_requested;
|
||||
@@ -707,9 +707,8 @@ struct DF_GfxState
|
||||
DF_ViewRuleBlockSlot *view_rule_block_slots;
|
||||
DF_ViewRuleBlockNode *free_view_rule_block_node;
|
||||
|
||||
// rjf: cmd -> view table
|
||||
U64 cmd2view_slot_count;
|
||||
DF_String2ViewSlot *cmd2view_slots;
|
||||
// rjf: cmd param slot -> view spec table
|
||||
DF_ViewSpec *cmd_param_slot_view_spec_table[DF_CmdParamSlot_COUNT];
|
||||
|
||||
// rjf: windows
|
||||
OS_WindowRepaintFunctionType *repaint_hook;
|
||||
@@ -753,6 +752,7 @@ read_only global DF_ViewSpec df_g_nil_view_spec =
|
||||
{0},
|
||||
{0},
|
||||
DF_NameKind_Null,
|
||||
DF_IconKind_Null,
|
||||
DF_VIEW_SETUP_FUNCTION_NAME(Null),
|
||||
DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Null),
|
||||
DF_VIEW_CMD_FUNCTION_NAME(Null),
|
||||
@@ -767,8 +767,6 @@ read_only global DF_GfxViewRuleSpec df_g_nil_gfx_view_rule_spec =
|
||||
|
||||
read_only global DF_View df_g_nil_view =
|
||||
{
|
||||
&df_g_nil_view,
|
||||
&df_g_nil_view,
|
||||
&df_g_nil_view,
|
||||
&df_g_nil_view,
|
||||
0,
|
||||
@@ -783,7 +781,7 @@ read_only global DF_View df_g_nil_view =
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
&df_g_nil_cmd_spec,
|
||||
&df_g_nil_view_spec,
|
||||
{0},
|
||||
};
|
||||
|
||||
@@ -812,7 +810,11 @@ internal DF_FuzzyMatchRangeList df_fuzzy_match_find(Arena *arena, String8List ne
|
||||
internal B32 df_view_is_nil(DF_View *view);
|
||||
internal DF_Handle df_handle_from_view(DF_View *view);
|
||||
internal DF_View *df_view_from_handle(DF_Handle handle);
|
||||
internal DF_View *df_view_caller_root_from_view(DF_View *view);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: View Spec Type Functions
|
||||
|
||||
internal DF_GfxViewKind df_gfx_view_kind_from_string(String8 string);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Panel Type Functions
|
||||
@@ -840,12 +842,8 @@ internal Rng2F32 df_rect_from_panel_child(Rng2F32 parent_rect, DF_Panel *parent,
|
||||
internal Rng2F32 df_rect_from_panel(Rng2F32 root_rect, DF_Panel *root, DF_Panel *panel);
|
||||
|
||||
//- rjf: view ownership insertion/removal
|
||||
internal void df_panel_history_new_branch(DF_Panel *panel);
|
||||
internal void df_panel_insert_stable_view(DF_Panel *panel, DF_View *prev_view, DF_View *view);
|
||||
internal void df_panel_remove_stable_view(DF_Panel *panel, DF_View *view);
|
||||
internal DF_View *df_selected_view_stack_from_panel(DF_Panel *panel);
|
||||
internal DF_View *df_selected_view_from_panel(DF_Panel *panel);
|
||||
internal DF_View *df_query_view_from_panel(DF_Panel *panel);
|
||||
internal void df_panel_insert_tab_view(DF_Panel *panel, DF_View *prev_view, DF_View *view);
|
||||
internal void df_panel_remove_tab_view(DF_Panel *panel, DF_View *view);
|
||||
|
||||
//- rjf: icons & display strings
|
||||
internal String8 df_display_string_from_view(Arena *arena, DF_CtrlCtx ctrl_ctx, DF_View *view);
|
||||
@@ -871,6 +869,7 @@ internal B32 df_prefer_dasm_from_window(DF_Window *window);
|
||||
internal DF_CmdParams df_cmd_params_from_window(DF_Window *window);
|
||||
internal DF_CmdParams df_cmd_params_from_panel(DF_Window *window, DF_Panel *panel);
|
||||
internal DF_CmdParams df_cmd_params_from_view(DF_Window *window, DF_Panel *panel, DF_View *view);
|
||||
internal DF_CmdParams df_cmd_params_copy(Arena *arena, DF_CmdParams *src);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Global Cross-Window UI Interaction State Functions
|
||||
@@ -889,10 +888,9 @@ internal U64 df_get_hovered_line_info_voff(void);
|
||||
//~ rjf: View Spec State Functions
|
||||
|
||||
internal void df_register_view_specs(DF_ViewSpecInfoArray specs);
|
||||
internal void df_register_cmd2view(String8 cmd_name, String8 view_name);
|
||||
internal DF_ViewSpec *df_view_spec_from_string(String8 string);
|
||||
internal DF_ViewSpec *df_view_spec_from_gfx_view_kind(DF_GfxViewKind gfx_view_kind);
|
||||
internal DF_ViewSpec *df_view_spec_from_cmd_spec(DF_CmdSpec *cmd_spec);
|
||||
internal DF_ViewSpec *df_view_spec_from_cmd_param_slot(DF_CmdParamSlot slot);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: View Rule Spec State Functions
|
||||
@@ -904,9 +902,8 @@ internal DF_GfxViewRuleSpec *df_gfx_view_rule_spec_from_string(String8 string);
|
||||
//~ rjf: View State Functions
|
||||
|
||||
internal DF_View *df_view_alloc(void);
|
||||
internal void df_view_release_single(DF_View *view);
|
||||
internal void df_view_release(DF_View *view);
|
||||
internal void df_view_equip_command(DF_View *view, DF_CmdSpec *spec, DF_CmdParams *params, String8 default_query, DF_CfgNode *cfg_root);
|
||||
internal void df_view_equip_spec(DF_View *view, DF_ViewSpec *spec, DF_Entity *entity, String8 default_query, DF_CfgNode *cfg_root);
|
||||
internal void df_view_equip_loading_info(DF_View *view, B32 is_loading, U64 progress_v, U64 progress_target);
|
||||
internal void df_view_clear_user_state(DF_View *view);
|
||||
internal void *df_view_get_or_push_user_state(DF_View *view, U64 size);
|
||||
@@ -1031,8 +1028,8 @@ internal B32 df_do_dasm_controls(DASM_Handle handle, U64 line_count_per_page, Tx
|
||||
|
||||
internal UI_Signal df_error_label(String8 string);
|
||||
internal B32 df_help_label(String8 string);
|
||||
internal D_FancyStringList df_fancy_string_list_from_code_string(Arena *arena, F32 alpha, B32 indirection_size_change, String8 string);
|
||||
internal void df_code_label(F32 alpha, B32 indirection_size_change, String8 string);
|
||||
internal D_FancyStringList df_fancy_string_list_from_code_string(Arena *arena, F32 alpha, B32 indirection_size_change, Vec4F32 base_color, String8 string);
|
||||
internal void df_code_label(F32 alpha, B32 indirection_size_change, Vec4F32 base_color, String8 string);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: UI Widgets: Line Edit
|
||||
|
||||
+87
-28
@@ -83,6 +83,7 @@ DF_DefaultBindingTable:
|
||||
{ "open" O ctrl 0 0 }
|
||||
{ "reload_active" R ctrl shift 0 }
|
||||
{ "switch" I ctrl 0 0 }
|
||||
{ "switch_to_partner_file" O 0 0 alt }
|
||||
|
||||
//- rjf: setting config paths
|
||||
{ "load_user" O ctrl shift alt }
|
||||
@@ -156,44 +157,52 @@ DF_DefaultBindingTable:
|
||||
{ "attach" F6 0 shift 0 }
|
||||
|
||||
//- rjf: view drivers
|
||||
{ "commands" F1 0 0 0 }
|
||||
{ "scheduler" S 0 0 alt }
|
||||
{ "run_command" F1 0 0 0 }
|
||||
|
||||
//- rjf: developer commands
|
||||
{ "clear_diag_log" D ctrl 0 alt }
|
||||
{ "open_diag_log" D ctrl 0 0 }
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Binding Version Remap Table
|
||||
|
||||
@table(old_name new_name)
|
||||
DF_BindingVersionRemapTable:
|
||||
{
|
||||
{"commands" "run_command"}
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Gfx Layer View Kinds
|
||||
|
||||
@table(name, name_lower, display_string, name_kind, parameterized_by_entity, can_serialize, can_serialize_entity_path, inc_in_docs, docs_desc)
|
||||
@table(name, name_lower, display_string, name_kind, icon, parameterized_by_entity, can_serialize, can_serialize_entity_path, inc_in_docs, docs_desc)
|
||||
DF_GfxViewTable:
|
||||
{
|
||||
{ Null "null" "" Null 0 0 0 0 "" }
|
||||
{ Empty "empty" "" Null 0 0 0 0 "" }
|
||||
{ Commands "commands" "Commands" Null 0 0 0 0 "" }
|
||||
{ FileSystem "file_system" "File System" Null 0 0 0 0 "" }
|
||||
{ SystemProcesses "system_processes" "System Processes" Null 0 0 0 0 "" }
|
||||
{ EntityLister "entity_lister" "Entity List" EntityKindName 0 0 0 0 "" }
|
||||
{ Target "target" "Target" EntityName 1 0 0 0 "" }
|
||||
{ Targets "targets" "Targets" Null 0 1 0 1 "Displays a list of all targets, as well as controls for enabling, disabling, launching, editing, or deleting each target. For more information on targets, read the `Targets` section." }
|
||||
{ FilePathMap "file_path_map" "File Path Map" Null 0 1 0 1 "Displays a table of *path maps*. Each path map is a pair of file or folder paths, one being a 'source' path, and one being a 'destination' path. These pairs are used by the debugger when automatically searching for specific files - for instance, when attempting to snap to a source code location specified by debug info. If debug info refers to a path on the machine on which a target executable was originally built, but that path is not valid on the debugger machine, but some alternative path exists, then path maps may be used to redirect the debugger from the debug info's specified paths to the associated appropriate debugger machine file paths." }
|
||||
{ Scheduler "scheduler" "Scheduler" Null 0 1 0 1 "Displays all processes and threads to which the debugger is currently attached, and contains controls for selecting and freezing threads." }
|
||||
{ CallStack "call_stack" "Call Stack" Null 0 1 0 1 "Displays the call stack of the currently selected thread. Each frame in the call stack contains the associated module, function name, and return address. Allows selection of a particular call stack frame other than the top." }
|
||||
{ Modules "modules" "Modules" Null 0 1 0 1 "Displays a table of all modules currently loaded by any process to which the debugger is attached. This table displays each module's name, virtual address range in the containing process' address space, and which debug info file is being used by the debugger for the associated module." }
|
||||
{ PendingEntity "pending_entity" "Pending Entity" EntityName 1 0 0 0 "" }
|
||||
{ Code "code" "Code" EntityName 1 1 1 0 "" }
|
||||
{ Disassembly "disassembly" "Disassembly" Null 0 1 0 1 "Displays disassembled instructions in a textual form from the selected thread's containing process virtual address space." }
|
||||
{ Watch "watch" "Watch" Null 0 1 0 1 "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." }
|
||||
{ Locals "locals" "Locals" Null 0 1 0 1 "Nearly identical to `Watch`, but automatically filled with local variables found within the selected call stack frame of the selected thread, according to the associated debug info. View rules and evaluation values can be edited, like in `Watch`, but unlike `Watch`, expressions cannot be edited or added to the table." }
|
||||
{ Registers "registers" "Registers" Null 0 1 0 1 "Nearly identical to `Watch`, but automatically filled with all register names according to the selected thread's architecture. View rules and evaluation values can be edited, like in `Watch`, but unlike `Watch`, expressions cannot be edited or added to the table." }
|
||||
{ Output "output" "Output" Null 0 1 0 1 "Displays textual output from the selected thread's containing process." }
|
||||
{ Memory "memory" "Memory" Null 0 1 1 1 "A familiar hex-editor-like interface for viewing memory of attached processes." }
|
||||
{ Breakpoints "breakpoints" "Breakpoints" Null 0 1 0 1 "Displays a table of all breakpoints, containing information about each breakpoint's name, location, and hit count. Also contains per-breakpoint controls for enabling, deleting, or editing each breakpoint. For more information on breakpoints and their features, read the 'Breakpoints' section." }
|
||||
{ WatchPins "watch_pins" "Watch Pins" Null 0 1 0 1 "Displays a table of all watch pins (watched expressions, like those found in `Watch`, but instead of being within a table, being pinned to some source code location, like breakpoints). This table contains each pin's name, location, and controls for editing or deleting each pin." }
|
||||
{ ExceptionFilters "exception_filters" "Exception Filters" Null 0 1 0 1 "An interface which controls whether or not the debugger will halt attached processes upon encountering specific exception codes for the first time." }
|
||||
{ Theme "theme" "Theme" Null 0 1 0 1 "An interface for modifying the colors used in the debugger's UI. Allows selecting a theme preset, loading a theme from a file, and modifying individual colors within a theme." }
|
||||
{ Null "null" "" Null Null 0 0 0 0 "" }
|
||||
{ Empty "empty" "" Null Null 0 0 0 0 "" }
|
||||
{ Commands "commands" "Commands" Null List 0 0 0 0 "" }
|
||||
{ FileSystem "file_system" "File System" Null FileOutline 0 0 0 0 "" }
|
||||
{ SystemProcesses "system_processes" "System Processes" Null Null 0 0 0 0 "" }
|
||||
{ EntityLister "entity_lister" "Entity List" EntityKindName Null 0 0 0 0 "" }
|
||||
{ Target "target" "Target" EntityName Target 1 0 0 0 "" }
|
||||
{ Targets "targets" "Targets" Null Target 0 1 0 1 "Displays a list of all targets, as well as controls for enabling, disabling, launching, editing, or deleting each target. For more information on targets, read the `Targets` section." }
|
||||
{ FilePathMap "file_path_map" "File Path Map" Null FileOutline 0 1 0 1 "Displays a table of *path maps*. Each path map is a pair of file or folder paths, one being a 'source' path, and one being a 'destination' path. These pairs are used by the debugger when automatically searching for specific files - for instance, when attempting to snap to a source code location specified by debug info. If debug info refers to a path on the machine on which a target executable was originally built, but that path is not valid on the debugger machine, but some alternative path exists, then path maps may be used to redirect the debugger from the debug info's specified paths to the associated appropriate debugger machine file paths." }
|
||||
{ Scheduler "scheduler" "Scheduler" Null Scheduler 0 1 0 1 "Displays all processes and threads to which the debugger is currently attached, and contains controls for selecting and freezing threads." }
|
||||
{ CallStack "call_stack" "Call Stack" Null Thread 0 1 0 1 "Displays the call stack of the currently selected thread. Each frame in the call stack contains the associated module, function name, and return address. Allows selection of a particular call stack frame other than the top." }
|
||||
{ Modules "modules" "Modules" Null Module 0 1 0 1 "Displays a table of all modules currently loaded by any process to which the debugger is attached. This table displays each module's name, virtual address range in the containing process' address space, and which debug info file is being used by the debugger for the associated module." }
|
||||
{ PendingEntity "pending_entity" "Pending Entity" EntityName FileOutline 1 0 0 0 "" }
|
||||
{ Code "code" "Code" EntityName FileOutline 1 1 1 0 "" }
|
||||
{ Disassembly "disassembly" "Disassembly" Null Glasses 0 1 0 1 "Displays disassembled instructions in a textual form from the selected thread's containing process virtual address space." }
|
||||
{ Watch "watch" "Watch" Null Binoculars 0 1 0 1 "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." }
|
||||
{ Locals "locals" "Locals" Null Binoculars 0 1 0 1 "Nearly identical to `Watch`, but automatically filled with local variables found within the selected call stack frame of the selected thread, according to the associated debug info. View rules and evaluation values can be edited, like in `Watch`, but unlike `Watch`, expressions cannot be edited or added to the table." }
|
||||
{ Registers "registers" "Registers" Null Binoculars 0 1 0 1 "Nearly identical to `Watch`, but automatically filled with all register names according to the selected thread's architecture. View rules and evaluation values can be edited, like in `Watch`, but unlike `Watch`, expressions cannot be edited or added to the table." }
|
||||
{ Output "output" "Output" Null List 0 1 0 1 "Displays textual output from the selected thread's containing process." }
|
||||
{ Memory "memory" "Memory" Null Grid 0 1 1 1 "A familiar hex-editor-like interface for viewing memory of attached processes." }
|
||||
{ Breakpoints "breakpoints" "Breakpoints" Null CircleFilled 0 1 0 1 "Displays a table of all breakpoints, containing information about each breakpoint's name, location, and hit count. Also contains per-breakpoint controls for enabling, deleting, or editing each breakpoint. For more information on breakpoints and their features, read the 'Breakpoints' section." }
|
||||
{ WatchPins "watch_pins" "Watch Pins" Null Pin 0 1 0 1 "Displays a table of all watch pins (watched expressions, like those found in `Watch`, but instead of being within a table, being pinned to some source code location, like breakpoints). This table contains each pin's name, location, and controls for editing or deleting each pin." }
|
||||
{ ExceptionFilters "exception_filters" "Exception Filters" Null Gear 0 1 0 1 "An interface which controls whether or not the debugger will halt attached processes upon encountering specific exception codes for the first time." }
|
||||
{ Theme "theme" "Theme" Null Palette 0 1 0 1 "An interface for modifying the colors used in the debugger's UI. Allows selecting a theme preset, loading a theme from a file, and modifying individual colors within a theme." }
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
@@ -259,6 +268,19 @@ DF_CmdSpec2ViewSpecMap:
|
||||
{"open_diag_log" "entity_lister" DiagLog }
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Command Parameter Slot -> View
|
||||
|
||||
@table(slot view_spec)
|
||||
DF_CmdParamSlot2ViewSpecMap:
|
||||
{
|
||||
{Entity "entity_lister" }
|
||||
{EntityList "entity_lister" }
|
||||
{FilePath "file_system" }
|
||||
{CmdSpec "commands" }
|
||||
{ID "system_processes" }
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Built-In Graphical View Rule Extensions
|
||||
//
|
||||
@@ -344,6 +366,15 @@ DF_ThemeTable:
|
||||
{DropShadow "Drop Shadow" drop_shadow }
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Theme Color Version Remap Table
|
||||
|
||||
@table(old_name new_name)
|
||||
DF_ThemeColorVersionRemapTable:
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Theme Presets
|
||||
|
||||
@@ -530,6 +561,20 @@ df_g_cmd2view_table_dst:
|
||||
@expand(DF_CmdSpec2ViewSpecMap a) `str8_lit_comp("$(a.view)"),`
|
||||
}
|
||||
|
||||
//- rjf: cmd param slot -> view spec tables
|
||||
|
||||
@table_gen_data(type: DF_CmdParamSlot, fallback:`DF_CmdParamSlot_Null`)
|
||||
df_g_cmd_param_slot_2_view_spec_src_map:
|
||||
{
|
||||
@expand(DF_CmdParamSlot2ViewSpecMap a) `DF_CmdParamSlot_$(a.slot),`
|
||||
}
|
||||
|
||||
@table_gen_data(type: String8, fallback:`{0}`)
|
||||
df_g_cmd_param_slot_2_view_spec_dst_map:
|
||||
{
|
||||
@expand(DF_CmdParamSlot2ViewSpecMap a) `str8_lit_comp("$(a.view_spec)"),`
|
||||
}
|
||||
|
||||
//- rjf: default bindings table
|
||||
|
||||
@table_gen_data(type: DF_StringBindingPair, fallback: `{0}`)
|
||||
@@ -538,6 +583,20 @@ df_g_default_binding_table:
|
||||
@expand(DF_DefaultBindingTable a) ```{str8_lit_comp("$(a.name)"), {OS_Key_$(a.key), 0 $(a.ctrl != 0 -> `|OS_EventFlag_Ctrl`) $(a.shift != 0 -> `|OS_EventFlag_Shift`) $(a.alt != 0 -> `|OS_EventFlag_Alt`)}},```;
|
||||
}
|
||||
|
||||
//- rjf: binding version remap tables
|
||||
|
||||
@table_gen_data(type: String8, fallback: `{0}`)
|
||||
df_g_binding_version_remap_old_name_table:
|
||||
{
|
||||
@expand(DF_BindingVersionRemapTable a) `str8_lit_comp("$(a.old_name)"),`
|
||||
}
|
||||
|
||||
@table_gen_data(type: String8, fallback: `{0}`)
|
||||
df_g_binding_version_remap_new_name_table:
|
||||
{
|
||||
@expand(DF_BindingVersionRemapTable a) `str8_lit_comp("$(a.new_name)"),`
|
||||
}
|
||||
|
||||
//- rjf: view hook forward declares
|
||||
|
||||
@table_gen
|
||||
@@ -577,7 +636,7 @@ df_g_gfx_view_rule_spec_info_table:
|
||||
@table_gen_data(type: DF_ViewSpecInfo, fallback: `{0}`)
|
||||
df_g_gfx_view_kind_spec_info_table:
|
||||
{
|
||||
@expand(DF_GfxViewTable a) ```{(0|$(a.parameterized_by_entity)*DF_ViewSpecFlag_ParameterizedByEntity|$(a.can_serialize)*DF_ViewSpecFlag_CanSerialize|$(a.can_serialize_entity_path)*DF_ViewSpecFlag_CanSerializeEntityPath), str8_lit_comp("$(a.name_lower)"), str8_lit_comp("$(a.display_string)"), DF_NameKind_$(a.name_kind), DF_VIEW_SETUP_FUNCTION_NAME($(a.name)), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME($(a.name)), DF_VIEW_CMD_FUNCTION_NAME($(a.name)), DF_VIEW_UI_FUNCTION_NAME($(a.name))},```;
|
||||
@expand(DF_GfxViewTable a) ```{(0|$(a.parameterized_by_entity)*DF_ViewSpecFlag_ParameterizedByEntity|$(a.can_serialize)*DF_ViewSpecFlag_CanSerialize|$(a.can_serialize_entity_path)*DF_ViewSpecFlag_CanSerializeEntityPath), str8_lit_comp("$(a.name_lower)"), str8_lit_comp("$(a.display_string)"), DF_NameKind_$(a.name_kind), DF_IconKind_$(a.icon), DF_VIEW_SETUP_FUNCTION_NAME($(a.name)), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME($(a.name)), DF_VIEW_CMD_FUNCTION_NAME($(a.name)), DF_VIEW_UI_FUNCTION_NAME($(a.name))},```;
|
||||
}
|
||||
|
||||
//- rjf: theme color string tables
|
||||
|
||||
@@ -31,7 +31,7 @@ df_view_rule_hooks__rgba_from_eval(DF_Eval eval, TG_Graph *graph, RADDBG_Parsed
|
||||
U64 array_total_size_capped = ClampTop(array_total_size, 64);
|
||||
Rng1U64 array_memory_vaddr_rng = r1u64(eval.offset, eval.offset + array_total_size_capped);
|
||||
String8 array_memory = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, array_memory_vaddr_rng);
|
||||
TG_Key element_type_key = tg_direct_from_graph_raddbg_key(graph, raddbg, type_key);
|
||||
TG_Key element_type_key = tg_unwrapped_direct_from_graph_raddbg_key(graph, raddbg, type_key);
|
||||
TG_Kind element_type_kind = tg_kind_from_key(element_type_key);
|
||||
U64 element_type_size = tg_byte_size_from_graph_raddbg_key(graph, raddbg, element_type_key);
|
||||
for(U64 element_idx = 0; element_idx < 4; element_idx += 1)
|
||||
@@ -128,7 +128,7 @@ df_view_rule_hooks__eval_commit_rgba(DF_Eval eval, TG_Graph *graph, RADDBG_Parse
|
||||
U64 array_total_size_capped = ClampTop(array_total_size, 64);
|
||||
Rng1U64 array_memory_vaddr_rng = r1u64(eval.offset, eval.offset + array_total_size_capped);
|
||||
String8 array_memory = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, array_memory_vaddr_rng);
|
||||
TG_Key element_type_key = tg_direct_from_graph_raddbg_key(graph, raddbg, type_key);
|
||||
TG_Key element_type_key = tg_unwrapped_direct_from_graph_raddbg_key(graph, raddbg, type_key);
|
||||
TG_Kind element_type_kind = tg_kind_from_key(element_type_key);
|
||||
U64 element_type_size = tg_byte_size_from_graph_raddbg_key(graph, raddbg, element_type_key);
|
||||
for(U64 element_idx = 0; element_idx < 4; element_idx += 1)
|
||||
|
||||
+493
-422
File diff suppressed because it is too large
Load Diff
@@ -386,7 +386,7 @@ struct DF_MemoryViewState
|
||||
Arena *last_viewed_memory_cache_arena;
|
||||
U8 *last_viewed_memory_cache_buffer;
|
||||
Rng1U64 last_viewed_memory_cache_range;
|
||||
U64 last_viewed_memory_cache_run_idx;
|
||||
U64 last_viewed_memory_cache_memgen_idx;
|
||||
|
||||
// rjf: control state
|
||||
U64 cursor;
|
||||
@@ -430,9 +430,7 @@ internal void df_process_info_array_sort_by_strength__in_place(DF_ProcessInfoArr
|
||||
////////////////////////////////
|
||||
//~ rjf: Entity Lister
|
||||
|
||||
internal DF_EntityListerItemList df_entity_lister_item_list_from_needle(Arena *arena, DF_EntityKind kind,
|
||||
DF_EntityFlags omit_flags,
|
||||
String8 needle);
|
||||
internal DF_EntityListerItemList df_entity_lister_item_list_from_needle(Arena *arena, DF_EntityKind kind, DF_EntityFlags omit_flags, String8 needle);
|
||||
internal DF_EntityListerItemArray df_entity_lister_item_array_from_list(Arena *arena, DF_EntityListerItemList list);
|
||||
internal void df_entity_lister_item_array_sort_by_strength__in_place(DF_EntityListerItemArray array);
|
||||
|
||||
|
||||
@@ -879,6 +879,24 @@ str8_lit_comp("entity_lister"),
|
||||
str8_lit_comp("entity_lister"),
|
||||
};
|
||||
|
||||
DF_CmdParamSlot df_g_cmd_param_slot_2_view_spec_src_map[] =
|
||||
{
|
||||
DF_CmdParamSlot_Entity,
|
||||
DF_CmdParamSlot_EntityList,
|
||||
DF_CmdParamSlot_FilePath,
|
||||
DF_CmdParamSlot_CmdSpec,
|
||||
DF_CmdParamSlot_ID,
|
||||
};
|
||||
|
||||
String8 df_g_cmd_param_slot_2_view_spec_dst_map[] =
|
||||
{
|
||||
str8_lit_comp("entity_lister"),
|
||||
str8_lit_comp("entity_lister"),
|
||||
str8_lit_comp("file_system"),
|
||||
str8_lit_comp("commands"),
|
||||
str8_lit_comp("system_processes"),
|
||||
};
|
||||
|
||||
DF_StringBindingPair df_g_default_binding_table[] =
|
||||
{
|
||||
{str8_lit_comp("kill_all"), {OS_Key_F5, 0 |OS_EventFlag_Shift }},
|
||||
@@ -922,6 +940,7 @@ DF_StringBindingPair df_g_default_binding_table[] =
|
||||
{str8_lit_comp("open"), {OS_Key_O, 0 |OS_EventFlag_Ctrl }},
|
||||
{str8_lit_comp("reload_active"), {OS_Key_R, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift }},
|
||||
{str8_lit_comp("switch"), {OS_Key_I, 0 |OS_EventFlag_Ctrl }},
|
||||
{str8_lit_comp("switch_to_partner_file"), {OS_Key_O, 0 |OS_EventFlag_Alt}},
|
||||
{str8_lit_comp("load_user"), {OS_Key_O, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift |OS_EventFlag_Alt}},
|
||||
{str8_lit_comp("load_profile"), {OS_Key_O, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Alt}},
|
||||
{str8_lit_comp("move_left"), {OS_Key_Left, 0 }},
|
||||
@@ -975,38 +994,47 @@ DF_StringBindingPair df_g_default_binding_table[] =
|
||||
{str8_lit_comp("toggle_breakpoint_cursor"), {OS_Key_F9, 0 }},
|
||||
{str8_lit_comp("add_target"), {OS_Key_T, 0 |OS_EventFlag_Ctrl }},
|
||||
{str8_lit_comp("attach"), {OS_Key_F6, 0 |OS_EventFlag_Shift }},
|
||||
{str8_lit_comp("commands"), {OS_Key_F1, 0 }},
|
||||
{str8_lit_comp("scheduler"), {OS_Key_S, 0 |OS_EventFlag_Alt}},
|
||||
{str8_lit_comp("run_command"), {OS_Key_F1, 0 }},
|
||||
{str8_lit_comp("clear_diag_log"), {OS_Key_D, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Alt}},
|
||||
{str8_lit_comp("open_diag_log"), {OS_Key_D, 0 |OS_EventFlag_Ctrl }},
|
||||
};
|
||||
|
||||
String8 df_g_binding_version_remap_old_name_table[] =
|
||||
{
|
||||
str8_lit_comp("commands"),
|
||||
};
|
||||
|
||||
String8 df_g_binding_version_remap_new_name_table[] =
|
||||
{
|
||||
str8_lit_comp("run_command"),
|
||||
};
|
||||
|
||||
DF_ViewSpecInfo df_g_gfx_view_kind_spec_info_table[] =
|
||||
{
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath), str8_lit_comp("null"), str8_lit_comp(""), DF_NameKind_Null, DF_VIEW_SETUP_FUNCTION_NAME(Null), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Null), DF_VIEW_CMD_FUNCTION_NAME(Null), DF_VIEW_UI_FUNCTION_NAME(Null)},
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath), str8_lit_comp("empty"), str8_lit_comp(""), DF_NameKind_Null, DF_VIEW_SETUP_FUNCTION_NAME(Empty), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Empty), DF_VIEW_CMD_FUNCTION_NAME(Empty), DF_VIEW_UI_FUNCTION_NAME(Empty)},
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath), str8_lit_comp("commands"), str8_lit_comp("Commands"), DF_NameKind_Null, DF_VIEW_SETUP_FUNCTION_NAME(Commands), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Commands), DF_VIEW_CMD_FUNCTION_NAME(Commands), DF_VIEW_UI_FUNCTION_NAME(Commands)},
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath), str8_lit_comp("file_system"), str8_lit_comp("File System"), DF_NameKind_Null, DF_VIEW_SETUP_FUNCTION_NAME(FileSystem), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(FileSystem), DF_VIEW_CMD_FUNCTION_NAME(FileSystem), DF_VIEW_UI_FUNCTION_NAME(FileSystem)},
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath), str8_lit_comp("system_processes"), str8_lit_comp("System Processes"), DF_NameKind_Null, DF_VIEW_SETUP_FUNCTION_NAME(SystemProcesses), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(SystemProcesses), DF_VIEW_CMD_FUNCTION_NAME(SystemProcesses), DF_VIEW_UI_FUNCTION_NAME(SystemProcesses)},
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath), str8_lit_comp("entity_lister"), str8_lit_comp("Entity List"), DF_NameKind_EntityKindName, DF_VIEW_SETUP_FUNCTION_NAME(EntityLister), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(EntityLister), DF_VIEW_CMD_FUNCTION_NAME(EntityLister), DF_VIEW_UI_FUNCTION_NAME(EntityLister)},
|
||||
{(0|1*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath), str8_lit_comp("target"), str8_lit_comp("Target"), DF_NameKind_EntityName, DF_VIEW_SETUP_FUNCTION_NAME(Target), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Target), DF_VIEW_CMD_FUNCTION_NAME(Target), DF_VIEW_UI_FUNCTION_NAME(Target)},
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath), str8_lit_comp("targets"), str8_lit_comp("Targets"), DF_NameKind_Null, DF_VIEW_SETUP_FUNCTION_NAME(Targets), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Targets), DF_VIEW_CMD_FUNCTION_NAME(Targets), DF_VIEW_UI_FUNCTION_NAME(Targets)},
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath), str8_lit_comp("file_path_map"), str8_lit_comp("File Path Map"), DF_NameKind_Null, DF_VIEW_SETUP_FUNCTION_NAME(FilePathMap), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(FilePathMap), DF_VIEW_CMD_FUNCTION_NAME(FilePathMap), DF_VIEW_UI_FUNCTION_NAME(FilePathMap)},
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath), str8_lit_comp("scheduler"), str8_lit_comp("Scheduler"), DF_NameKind_Null, DF_VIEW_SETUP_FUNCTION_NAME(Scheduler), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Scheduler), DF_VIEW_CMD_FUNCTION_NAME(Scheduler), DF_VIEW_UI_FUNCTION_NAME(Scheduler)},
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath), str8_lit_comp("call_stack"), str8_lit_comp("Call Stack"), DF_NameKind_Null, DF_VIEW_SETUP_FUNCTION_NAME(CallStack), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(CallStack), DF_VIEW_CMD_FUNCTION_NAME(CallStack), DF_VIEW_UI_FUNCTION_NAME(CallStack)},
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath), str8_lit_comp("modules"), str8_lit_comp("Modules"), DF_NameKind_Null, DF_VIEW_SETUP_FUNCTION_NAME(Modules), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Modules), DF_VIEW_CMD_FUNCTION_NAME(Modules), DF_VIEW_UI_FUNCTION_NAME(Modules)},
|
||||
{(0|1*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath), str8_lit_comp("pending_entity"), str8_lit_comp("Pending Entity"), DF_NameKind_EntityName, DF_VIEW_SETUP_FUNCTION_NAME(PendingEntity), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(PendingEntity), DF_VIEW_CMD_FUNCTION_NAME(PendingEntity), DF_VIEW_UI_FUNCTION_NAME(PendingEntity)},
|
||||
{(0|1*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|1*DF_ViewSpecFlag_CanSerializeEntityPath), str8_lit_comp("code"), str8_lit_comp("Code"), DF_NameKind_EntityName, DF_VIEW_SETUP_FUNCTION_NAME(Code), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Code), DF_VIEW_CMD_FUNCTION_NAME(Code), DF_VIEW_UI_FUNCTION_NAME(Code)},
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath), str8_lit_comp("disassembly"), str8_lit_comp("Disassembly"), DF_NameKind_Null, DF_VIEW_SETUP_FUNCTION_NAME(Disassembly), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Disassembly), DF_VIEW_CMD_FUNCTION_NAME(Disassembly), DF_VIEW_UI_FUNCTION_NAME(Disassembly)},
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath), str8_lit_comp("watch"), str8_lit_comp("Watch"), DF_NameKind_Null, DF_VIEW_SETUP_FUNCTION_NAME(Watch), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Watch), DF_VIEW_CMD_FUNCTION_NAME(Watch), DF_VIEW_UI_FUNCTION_NAME(Watch)},
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath), str8_lit_comp("locals"), str8_lit_comp("Locals"), DF_NameKind_Null, DF_VIEW_SETUP_FUNCTION_NAME(Locals), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Locals), DF_VIEW_CMD_FUNCTION_NAME(Locals), DF_VIEW_UI_FUNCTION_NAME(Locals)},
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath), str8_lit_comp("registers"), str8_lit_comp("Registers"), DF_NameKind_Null, DF_VIEW_SETUP_FUNCTION_NAME(Registers), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Registers), DF_VIEW_CMD_FUNCTION_NAME(Registers), DF_VIEW_UI_FUNCTION_NAME(Registers)},
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath), str8_lit_comp("output"), str8_lit_comp("Output"), DF_NameKind_Null, DF_VIEW_SETUP_FUNCTION_NAME(Output), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Output), DF_VIEW_CMD_FUNCTION_NAME(Output), DF_VIEW_UI_FUNCTION_NAME(Output)},
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|1*DF_ViewSpecFlag_CanSerializeEntityPath), str8_lit_comp("memory"), str8_lit_comp("Memory"), DF_NameKind_Null, DF_VIEW_SETUP_FUNCTION_NAME(Memory), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Memory), DF_VIEW_CMD_FUNCTION_NAME(Memory), DF_VIEW_UI_FUNCTION_NAME(Memory)},
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath), str8_lit_comp("breakpoints"), str8_lit_comp("Breakpoints"), DF_NameKind_Null, DF_VIEW_SETUP_FUNCTION_NAME(Breakpoints), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Breakpoints), DF_VIEW_CMD_FUNCTION_NAME(Breakpoints), DF_VIEW_UI_FUNCTION_NAME(Breakpoints)},
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath), str8_lit_comp("watch_pins"), str8_lit_comp("Watch Pins"), DF_NameKind_Null, DF_VIEW_SETUP_FUNCTION_NAME(WatchPins), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(WatchPins), DF_VIEW_CMD_FUNCTION_NAME(WatchPins), DF_VIEW_UI_FUNCTION_NAME(WatchPins)},
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath), str8_lit_comp("exception_filters"), str8_lit_comp("Exception Filters"), DF_NameKind_Null, DF_VIEW_SETUP_FUNCTION_NAME(ExceptionFilters), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(ExceptionFilters), DF_VIEW_CMD_FUNCTION_NAME(ExceptionFilters), DF_VIEW_UI_FUNCTION_NAME(ExceptionFilters)},
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath), str8_lit_comp("theme"), str8_lit_comp("Theme"), DF_NameKind_Null, DF_VIEW_SETUP_FUNCTION_NAME(Theme), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Theme), DF_VIEW_CMD_FUNCTION_NAME(Theme), DF_VIEW_UI_FUNCTION_NAME(Theme)},
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath), str8_lit_comp("null"), str8_lit_comp(""), DF_NameKind_Null, DF_IconKind_Null, DF_VIEW_SETUP_FUNCTION_NAME(Null), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Null), DF_VIEW_CMD_FUNCTION_NAME(Null), DF_VIEW_UI_FUNCTION_NAME(Null)},
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath), str8_lit_comp("empty"), str8_lit_comp(""), DF_NameKind_Null, DF_IconKind_Null, DF_VIEW_SETUP_FUNCTION_NAME(Empty), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Empty), DF_VIEW_CMD_FUNCTION_NAME(Empty), DF_VIEW_UI_FUNCTION_NAME(Empty)},
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath), str8_lit_comp("commands"), str8_lit_comp("Commands"), DF_NameKind_Null, DF_IconKind_List, DF_VIEW_SETUP_FUNCTION_NAME(Commands), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Commands), DF_VIEW_CMD_FUNCTION_NAME(Commands), DF_VIEW_UI_FUNCTION_NAME(Commands)},
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath), str8_lit_comp("file_system"), str8_lit_comp("File System"), DF_NameKind_Null, DF_IconKind_FileOutline, DF_VIEW_SETUP_FUNCTION_NAME(FileSystem), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(FileSystem), DF_VIEW_CMD_FUNCTION_NAME(FileSystem), DF_VIEW_UI_FUNCTION_NAME(FileSystem)},
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath), str8_lit_comp("system_processes"), str8_lit_comp("System Processes"), DF_NameKind_Null, DF_IconKind_Null, DF_VIEW_SETUP_FUNCTION_NAME(SystemProcesses), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(SystemProcesses), DF_VIEW_CMD_FUNCTION_NAME(SystemProcesses), DF_VIEW_UI_FUNCTION_NAME(SystemProcesses)},
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath), str8_lit_comp("entity_lister"), str8_lit_comp("Entity List"), DF_NameKind_EntityKindName, DF_IconKind_Null, DF_VIEW_SETUP_FUNCTION_NAME(EntityLister), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(EntityLister), DF_VIEW_CMD_FUNCTION_NAME(EntityLister), DF_VIEW_UI_FUNCTION_NAME(EntityLister)},
|
||||
{(0|1*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath), str8_lit_comp("target"), str8_lit_comp("Target"), DF_NameKind_EntityName, DF_IconKind_Target, DF_VIEW_SETUP_FUNCTION_NAME(Target), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Target), DF_VIEW_CMD_FUNCTION_NAME(Target), DF_VIEW_UI_FUNCTION_NAME(Target)},
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath), str8_lit_comp("targets"), str8_lit_comp("Targets"), DF_NameKind_Null, DF_IconKind_Target, DF_VIEW_SETUP_FUNCTION_NAME(Targets), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Targets), DF_VIEW_CMD_FUNCTION_NAME(Targets), DF_VIEW_UI_FUNCTION_NAME(Targets)},
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath), str8_lit_comp("file_path_map"), str8_lit_comp("File Path Map"), DF_NameKind_Null, DF_IconKind_FileOutline, DF_VIEW_SETUP_FUNCTION_NAME(FilePathMap), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(FilePathMap), DF_VIEW_CMD_FUNCTION_NAME(FilePathMap), DF_VIEW_UI_FUNCTION_NAME(FilePathMap)},
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath), str8_lit_comp("scheduler"), str8_lit_comp("Scheduler"), DF_NameKind_Null, DF_IconKind_Scheduler, DF_VIEW_SETUP_FUNCTION_NAME(Scheduler), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Scheduler), DF_VIEW_CMD_FUNCTION_NAME(Scheduler), DF_VIEW_UI_FUNCTION_NAME(Scheduler)},
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath), str8_lit_comp("call_stack"), str8_lit_comp("Call Stack"), DF_NameKind_Null, DF_IconKind_Thread, DF_VIEW_SETUP_FUNCTION_NAME(CallStack), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(CallStack), DF_VIEW_CMD_FUNCTION_NAME(CallStack), DF_VIEW_UI_FUNCTION_NAME(CallStack)},
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath), str8_lit_comp("modules"), str8_lit_comp("Modules"), DF_NameKind_Null, DF_IconKind_Module, DF_VIEW_SETUP_FUNCTION_NAME(Modules), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Modules), DF_VIEW_CMD_FUNCTION_NAME(Modules), DF_VIEW_UI_FUNCTION_NAME(Modules)},
|
||||
{(0|1*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath), str8_lit_comp("pending_entity"), str8_lit_comp("Pending Entity"), DF_NameKind_EntityName, DF_IconKind_FileOutline, DF_VIEW_SETUP_FUNCTION_NAME(PendingEntity), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(PendingEntity), DF_VIEW_CMD_FUNCTION_NAME(PendingEntity), DF_VIEW_UI_FUNCTION_NAME(PendingEntity)},
|
||||
{(0|1*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|1*DF_ViewSpecFlag_CanSerializeEntityPath), str8_lit_comp("code"), str8_lit_comp("Code"), DF_NameKind_EntityName, DF_IconKind_FileOutline, DF_VIEW_SETUP_FUNCTION_NAME(Code), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Code), DF_VIEW_CMD_FUNCTION_NAME(Code), DF_VIEW_UI_FUNCTION_NAME(Code)},
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath), str8_lit_comp("disassembly"), str8_lit_comp("Disassembly"), DF_NameKind_Null, DF_IconKind_Glasses, DF_VIEW_SETUP_FUNCTION_NAME(Disassembly), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Disassembly), DF_VIEW_CMD_FUNCTION_NAME(Disassembly), DF_VIEW_UI_FUNCTION_NAME(Disassembly)},
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath), str8_lit_comp("watch"), str8_lit_comp("Watch"), DF_NameKind_Null, DF_IconKind_Binoculars, DF_VIEW_SETUP_FUNCTION_NAME(Watch), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Watch), DF_VIEW_CMD_FUNCTION_NAME(Watch), DF_VIEW_UI_FUNCTION_NAME(Watch)},
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath), str8_lit_comp("locals"), str8_lit_comp("Locals"), DF_NameKind_Null, DF_IconKind_Binoculars, DF_VIEW_SETUP_FUNCTION_NAME(Locals), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Locals), DF_VIEW_CMD_FUNCTION_NAME(Locals), DF_VIEW_UI_FUNCTION_NAME(Locals)},
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath), str8_lit_comp("registers"), str8_lit_comp("Registers"), DF_NameKind_Null, DF_IconKind_Binoculars, DF_VIEW_SETUP_FUNCTION_NAME(Registers), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Registers), DF_VIEW_CMD_FUNCTION_NAME(Registers), DF_VIEW_UI_FUNCTION_NAME(Registers)},
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath), str8_lit_comp("output"), str8_lit_comp("Output"), DF_NameKind_Null, DF_IconKind_List, DF_VIEW_SETUP_FUNCTION_NAME(Output), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Output), DF_VIEW_CMD_FUNCTION_NAME(Output), DF_VIEW_UI_FUNCTION_NAME(Output)},
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|1*DF_ViewSpecFlag_CanSerializeEntityPath), str8_lit_comp("memory"), str8_lit_comp("Memory"), DF_NameKind_Null, DF_IconKind_Grid, DF_VIEW_SETUP_FUNCTION_NAME(Memory), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Memory), DF_VIEW_CMD_FUNCTION_NAME(Memory), DF_VIEW_UI_FUNCTION_NAME(Memory)},
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath), str8_lit_comp("breakpoints"), str8_lit_comp("Breakpoints"), DF_NameKind_Null, DF_IconKind_CircleFilled, DF_VIEW_SETUP_FUNCTION_NAME(Breakpoints), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Breakpoints), DF_VIEW_CMD_FUNCTION_NAME(Breakpoints), DF_VIEW_UI_FUNCTION_NAME(Breakpoints)},
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath), str8_lit_comp("watch_pins"), str8_lit_comp("Watch Pins"), DF_NameKind_Null, DF_IconKind_Pin, DF_VIEW_SETUP_FUNCTION_NAME(WatchPins), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(WatchPins), DF_VIEW_CMD_FUNCTION_NAME(WatchPins), DF_VIEW_UI_FUNCTION_NAME(WatchPins)},
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath), str8_lit_comp("exception_filters"), str8_lit_comp("Exception Filters"), DF_NameKind_Null, DF_IconKind_Gear, DF_VIEW_SETUP_FUNCTION_NAME(ExceptionFilters), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(ExceptionFilters), DF_VIEW_CMD_FUNCTION_NAME(ExceptionFilters), DF_VIEW_UI_FUNCTION_NAME(ExceptionFilters)},
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath), str8_lit_comp("theme"), str8_lit_comp("Theme"), DF_NameKind_Null, DF_IconKind_Palette, DF_VIEW_SETUP_FUNCTION_NAME(Theme), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Theme), DF_VIEW_CMD_FUNCTION_NAME(Theme), DF_VIEW_UI_FUNCTION_NAME(Theme)},
|
||||
};
|
||||
|
||||
String8 df_g_theme_color_display_string_table[] =
|
||||
|
||||
+8
-4
@@ -468,7 +468,11 @@ d_truncated_fancy_run_list(Vec2F32 p, D_FancyRunList *list, F32 max_x, F_Run tra
|
||||
}
|
||||
if(fr->underline_thickness > 0)
|
||||
{
|
||||
d_rect(r2f32p(p.x+pre_advance, p.y+fr->run.descent-fr->underline_thickness/2, p.x+advance, p.y+fr->run.descent+fr->underline_thickness/2), fr->color, 0, 0, 1.f);
|
||||
d_rect(r2f32p(p.x+pre_advance,
|
||||
p.y+fr->run.descent+fr->run.descent/8,
|
||||
p.x+advance + (advance-pre_advance)/8,
|
||||
p.y+fr->run.descent+fr->run.descent/8+fr->underline_thickness),
|
||||
fr->color, 0, 0, 1.f);
|
||||
}
|
||||
if(fr->strikethrough_thickness > 0)
|
||||
{
|
||||
@@ -528,7 +532,7 @@ d_text_run(Vec2F32 p, Vec4F32 color, F_Run run)
|
||||
p.y + piece->offset.y,
|
||||
p.x + piece->offset.x + advance + size.x,
|
||||
p.y + piece->offset.y + size.y);
|
||||
if(!r_handle_match(texture, r_handle_zero()))
|
||||
if(size.x != 0 && size.y != 0 && !r_handle_match(texture, r_handle_zero()))
|
||||
{
|
||||
d_img(dst, src, texture, color, 0, 0, 0);
|
||||
}
|
||||
@@ -598,7 +602,7 @@ d_truncated_text_run(Vec2F32 p, Vec4F32 color, F32 max_x, F_Run text_run, F_Run
|
||||
p.y + piece->offset.y,
|
||||
p.x + piece->offset.x + advance + size.x,
|
||||
p.y + piece->offset.y + size.y);
|
||||
if(!r_handle_match(texture, r_handle_zero()))
|
||||
if(size.x != 0 && size.y != 0 && !r_handle_match(texture, r_handle_zero()))
|
||||
{
|
||||
d_img(dst, src, texture, color, 0, 0, 0);
|
||||
}
|
||||
@@ -625,7 +629,7 @@ d_truncated_text_run(Vec2F32 p, Vec4F32 color, F32 max_x, F_Run text_run, F_Run
|
||||
ellipses_p.y + piece->offset.y,
|
||||
ellipses_p.x + piece->offset.x + advance + size.x,
|
||||
ellipses_p.y + piece->offset.y + size.y);
|
||||
if(!r_handle_match(texture, r_handle_zero()))
|
||||
if(size.x != 0 && size.y != 0 && !r_handle_match(texture, r_handle_zero()))
|
||||
{
|
||||
d_img(dst, src, texture, ellipses_color, 0, 0, 0);
|
||||
}
|
||||
|
||||
+34
-51
@@ -356,27 +356,6 @@ eval_type_group_from_kind(TG_Kind kind){
|
||||
return(result);
|
||||
}
|
||||
|
||||
internal TG_Key
|
||||
eval_type_unwrap(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key)
|
||||
{
|
||||
TG_Key result = key;
|
||||
for(B32 good = 1; good;)
|
||||
{
|
||||
TG_Kind kind = tg_kind_from_key(result);
|
||||
if((TG_Kind_FirstIncomplete <= kind && kind <= TG_Kind_LastIncomplete) ||
|
||||
kind == TG_Kind_Modifier ||
|
||||
kind == TG_Kind_Alias)
|
||||
{
|
||||
result = tg_direct_from_graph_raddbg_key(graph, rdbg, result);
|
||||
}
|
||||
else
|
||||
{
|
||||
good = 0;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
internal TG_Key
|
||||
eval_type_unwrap_enum(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key)
|
||||
{
|
||||
@@ -435,8 +414,8 @@ eval_type_match(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key l, TG_Key r){
|
||||
B32 result = 0;
|
||||
|
||||
// unwrap
|
||||
TG_Key lu = eval_type_unwrap(graph, rdbg, l);
|
||||
TG_Key ru = eval_type_unwrap(graph, rdbg, r);
|
||||
TG_Key lu = tg_unwrapped_from_graph_raddbg_key(graph, rdbg, l);
|
||||
TG_Key ru = tg_unwrapped_from_graph_raddbg_key(graph, rdbg, r);
|
||||
|
||||
if (tg_key_match(lu, ru)){
|
||||
result = 1;
|
||||
@@ -802,8 +781,8 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdb
|
||||
EVAL_IRTreeAndType r = eval_irtree_and_type_from_expr(arena, graph, rdbg, exprr, eout);
|
||||
|
||||
if (l.tree->op != 0 && r.tree->op != 0){
|
||||
TG_Key l_restype = eval_type_unwrap(graph, rdbg, l.type_key);
|
||||
TG_Key r_restype = eval_type_unwrap(graph, rdbg, r.type_key);
|
||||
TG_Key l_restype = tg_unwrapped_from_graph_raddbg_key(graph, rdbg, l.type_key);
|
||||
TG_Key r_restype = tg_unwrapped_from_graph_raddbg_key(graph, rdbg, r.type_key);
|
||||
TG_Kind l_restype_kind = tg_kind_from_key(l_restype);
|
||||
TG_Kind r_restype_kind = tg_kind_from_key(r_restype);
|
||||
|
||||
@@ -816,7 +795,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdb
|
||||
eval_errorf(arena, eout, EVAL_ErrorKind_MalformedInput, exprr->location, "Cannot index with this type.");
|
||||
}
|
||||
else{
|
||||
direct_type = tg_direct_from_graph_raddbg_key(graph, rdbg, l_restype);
|
||||
direct_type = tg_unwrapped_direct_from_graph_raddbg_key(graph, rdbg, l_restype);
|
||||
direct_type_size = tg_byte_size_from_graph_raddbg_key(graph, rdbg, direct_type);
|
||||
if (l_restype_kind == TG_Kind_Ptr){
|
||||
if (direct_type_size == 0){
|
||||
@@ -881,14 +860,14 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdb
|
||||
EVAL_IRTreeAndType l = eval_irtree_and_type_from_expr(arena, graph, rdbg, exprl, eout);
|
||||
|
||||
if (l.tree->op != 0 && !tg_key_match(tg_key_zero(), l.type_key)){
|
||||
TG_Key l_restype = eval_type_unwrap(graph, rdbg, l.type_key);
|
||||
TG_Key l_restype = tg_unwrapped_from_graph_raddbg_key(graph, rdbg, l.type_key);
|
||||
TG_Kind l_restype_kind = tg_kind_from_key(l_restype);
|
||||
|
||||
// determine which type to use
|
||||
TG_Key check_type_key = l_restype;
|
||||
TG_Kind check_type_kind = l_restype_kind;
|
||||
if (l_restype_kind == TG_Kind_Ptr){
|
||||
check_type_key = tg_direct_from_graph_raddbg_key(graph, rdbg, l_restype);
|
||||
if (l_restype_kind == TG_Kind_Ptr || l_restype_kind == TG_Kind_LRef || l_restype_kind == TG_Kind_RRef){
|
||||
check_type_key = tg_unwrapped_direct_from_graph_raddbg_key(graph, rdbg, l_restype);
|
||||
check_type_kind = tg_kind_from_key(check_type_key);
|
||||
}
|
||||
|
||||
@@ -912,7 +891,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdb
|
||||
|
||||
// determine how to treat left
|
||||
B32 l_good = 0;
|
||||
if (l_restype_kind == TG_Kind_Ptr){
|
||||
if (l_restype_kind == TG_Kind_Ptr || l_restype_kind == TG_Kind_LRef || l_restype_kind == TG_Kind_RRef){
|
||||
l_good = 1;
|
||||
l_resolve = 1;
|
||||
}
|
||||
@@ -942,14 +921,14 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdb
|
||||
|
||||
if (l_good && r_good){
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
TG_Type *check_type = tg_type_from_graph_raddbg_key(scratch.arena, graph, rdbg, check_type_key);
|
||||
TG_MemberArray check_type_members = tg_data_members_from_graph_raddbg_key(scratch.arena, graph, rdbg, check_type_key);
|
||||
|
||||
// lookup member
|
||||
String8 member_name = exprr->name;
|
||||
TG_Member *match = 0;
|
||||
for(U64 member_idx = 0; member_idx < check_type->count; member_idx += 1)
|
||||
for(U64 member_idx = 0; member_idx < check_type_members.count; member_idx += 1)
|
||||
{
|
||||
TG_Member *member = &check_type->members[member_idx];
|
||||
TG_Member *member = &check_type_members.v[member_idx];
|
||||
if(str8_match(member->name, member_name, 0))
|
||||
{
|
||||
match = member;
|
||||
@@ -999,15 +978,17 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdb
|
||||
EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdbg, exprc, eout);
|
||||
|
||||
if (c.tree->op != 0){
|
||||
TG_Key c_restype = eval_type_unwrap(graph, rdbg, c.type_key);
|
||||
TG_Key c_restype = tg_unwrapped_from_graph_raddbg_key(graph, rdbg, c.type_key);
|
||||
TG_Kind c_restype_kind = tg_kind_from_key(c_restype);
|
||||
TG_Key c_restype_direct = tg_direct_from_graph_raddbg_key(graph, rdbg, c_restype);
|
||||
TG_Key c_restype_direct = tg_unwrapped_direct_from_graph_raddbg_key(graph, rdbg, c_restype);
|
||||
U64 c_restype_direct_size = tg_byte_size_from_graph_raddbg_key(graph, rdbg, c_restype_direct);
|
||||
|
||||
// analyze situation
|
||||
B32 can_generate = 0;
|
||||
B32 c_resolve = 0;
|
||||
if (c_restype_kind == TG_Kind_Ptr){
|
||||
if (c_restype_kind == TG_Kind_Ptr ||
|
||||
c_restype_kind == TG_Kind_LRef ||
|
||||
c_restype_kind == TG_Kind_RRef){
|
||||
if (c_restype_direct_size == 0){
|
||||
eval_errorf(arena, eout, EVAL_ErrorKind_MalformedInput, exprc->location, "Cannot dereference pointers of zero-sized types.");
|
||||
}
|
||||
@@ -1054,7 +1035,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdb
|
||||
EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdbg, exprc, eout);
|
||||
if(c.tree->op != 0 && !tg_key_match(c.type_key, tg_key_zero()))
|
||||
{
|
||||
TG_Key c_restype = eval_type_unwrap(graph, rdbg, c.type_key);
|
||||
TG_Key c_restype = tg_unwrapped_from_graph_raddbg_key(graph, rdbg, c.type_key);
|
||||
TG_Kind c_restype_kind = tg_kind_from_key(c_restype);
|
||||
|
||||
// analyze situation
|
||||
@@ -1089,7 +1070,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdb
|
||||
|
||||
if(cast_type_kind != TG_Kind_Null && c.tree->op != 0)
|
||||
{
|
||||
TG_Key c_restype = eval_type_unwrap(graph, rdbg, c.type_key);
|
||||
TG_Key c_restype = tg_unwrapped_from_graph_raddbg_key(graph, rdbg, c.type_key);
|
||||
TG_Kind c_restype_kind = tg_kind_from_key(c_restype);
|
||||
U64 c_restype_byte_size = tg_byte_size_from_graph_raddbg_key(graph, rdbg, c_restype);
|
||||
U64 cast_type_byte_size = tg_byte_size_from_graph_raddbg_key(graph, rdbg, cast_type_key);
|
||||
@@ -1181,7 +1162,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdb
|
||||
|
||||
EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdbg, exprc, eout);
|
||||
if (c.tree->op != 0){
|
||||
TG_Key c_restype = eval_type_unwrap(graph, rdbg, c.type_key);
|
||||
TG_Key c_restype = tg_unwrapped_from_graph_raddbg_key(graph, rdbg, c.type_key);
|
||||
TG_Key p_type = eval_type_promote(graph, rdbg, c_restype);
|
||||
TG_Kind c_restype_kind = tg_kind_from_key(c_restype);
|
||||
|
||||
@@ -1237,8 +1218,8 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdb
|
||||
EVAL_IRTreeAndType r = eval_irtree_and_type_from_expr(arena, graph, rdbg, exprr, eout);
|
||||
|
||||
if (l.tree->op != 0 && r.tree->op != 0){
|
||||
TG_Key l_restype = eval_type_unwrap(graph, rdbg, l.type_key);
|
||||
TG_Key r_restype = eval_type_unwrap(graph, rdbg, r.type_key);
|
||||
TG_Key l_restype = tg_unwrapped_from_graph_raddbg_key(graph, rdbg, l.type_key);
|
||||
TG_Key r_restype = tg_unwrapped_from_graph_raddbg_key(graph, rdbg, r.type_key);
|
||||
TG_Kind l_restype_kind = tg_kind_from_key(l_restype);
|
||||
TG_Kind r_restype_kind = tg_kind_from_key(r_restype);
|
||||
|
||||
@@ -1286,8 +1267,8 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdb
|
||||
arith_path = EVAL_ArithPath_PtrAdd;
|
||||
}
|
||||
if (l_is_pointer_like && r_is_pointer_like){
|
||||
TG_Key l_restype_direct = tg_direct_from_graph_raddbg_key(graph, rdbg, l_restype);
|
||||
TG_Key r_restype_direct = tg_direct_from_graph_raddbg_key(graph, rdbg, r_restype);
|
||||
TG_Key l_restype_direct = tg_unwrapped_direct_from_graph_raddbg_key(graph, rdbg, l_restype);
|
||||
TG_Key r_restype_direct = tg_unwrapped_direct_from_graph_raddbg_key(graph, rdbg, r_restype);
|
||||
U64 l_restype_direct_byte_size = tg_byte_size_from_graph_raddbg_key(graph, rdbg, l_restype_direct);
|
||||
U64 r_restype_direct_byte_size = tg_byte_size_from_graph_raddbg_key(graph, rdbg, r_restype_direct);
|
||||
if (l_restype_direct_byte_size == r_restype_direct_byte_size){
|
||||
@@ -1358,7 +1339,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdb
|
||||
ptr_is_decay = r_is_decay;
|
||||
}
|
||||
|
||||
TG_Key direct = tg_direct_from_graph_raddbg_key(graph, rdbg, ptr->type_key);
|
||||
TG_Key direct = tg_unwrapped_direct_from_graph_raddbg_key(graph, rdbg, ptr->type_key);
|
||||
U64 direct_type_size = tg_byte_size_from_graph_raddbg_key(graph, rdbg, direct);
|
||||
|
||||
// generate ir tree
|
||||
@@ -1387,7 +1368,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdb
|
||||
|
||||
case EVAL_ArithPath_PtrSub:
|
||||
{
|
||||
TG_Key direct = tg_direct_from_graph_raddbg_key(graph, rdbg, l_restype);
|
||||
TG_Key direct = tg_unwrapped_direct_from_graph_raddbg_key(graph, rdbg, l_restype);
|
||||
U64 direct_type_size = tg_byte_size_from_graph_raddbg_key(graph, rdbg, direct);
|
||||
|
||||
// generate ir tree
|
||||
@@ -1429,9 +1410,9 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdb
|
||||
|
||||
if (l.tree->op != 0 && r.tree->op != 0 && c.tree->op != 0){
|
||||
|
||||
TG_Key c_restype = eval_type_unwrap(graph, rdbg, c.type_key);
|
||||
TG_Key l_restype = eval_type_unwrap(graph, rdbg, l.type_key);
|
||||
TG_Key r_restype = eval_type_unwrap(graph, rdbg, r.type_key);
|
||||
TG_Key c_restype = tg_unwrapped_from_graph_raddbg_key(graph, rdbg, c.type_key);
|
||||
TG_Key l_restype = tg_unwrapped_from_graph_raddbg_key(graph, rdbg, l.type_key);
|
||||
TG_Key r_restype = tg_unwrapped_from_graph_raddbg_key(graph, rdbg, r.type_key);
|
||||
TG_Kind c_restype_kind = tg_kind_from_key(c_restype);
|
||||
TG_Kind l_restype_kind = tg_kind_from_key(l_restype);
|
||||
TG_Kind r_restype_kind = tg_kind_from_key(r_restype);
|
||||
@@ -1541,6 +1522,11 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdb
|
||||
}break;
|
||||
|
||||
case EVAL_ExprKind_TypeIdent:
|
||||
{
|
||||
result.tree = &eval_irtree_nil;
|
||||
result.type_key = expr->type_key;
|
||||
result.mode = EVAL_EvalMode_NULL;
|
||||
}break;
|
||||
case EVAL_ExprKind_Ptr:
|
||||
case EVAL_ExprKind_Array:
|
||||
case EVAL_ExprKind_Func:
|
||||
@@ -1619,6 +1605,3 @@ eval_oplist_from_irtree(Arena *arena, EVAL_IRTree *tree, EVAL_OpList *out){
|
||||
}break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -164,7 +164,6 @@ internal EVAL_Expr* eval_expr_leaf_type(Arena *arena, void *location, TG_Key typ
|
||||
|
||||
internal RADDBG_EvalTypeGroup eval_type_group_from_kind(TG_Kind kind);
|
||||
|
||||
internal TG_Key eval_type_unwrap(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key);
|
||||
internal TG_Key eval_type_unwrap_enum(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key);
|
||||
internal TG_Key eval_type_promote(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key);
|
||||
internal TG_Key eval_type_coerce(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key l, TG_Key r);
|
||||
|
||||
+125
-15
@@ -96,7 +96,7 @@ eval_string2num_map_insert(Arena *arena, EVAL_String2NumMap *map, String8 string
|
||||
{
|
||||
EVAL_String2NumMapNode *node = push_array(arena, EVAL_String2NumMapNode, 1);
|
||||
SLLQueuePush(map->slots[slot_idx].first, map->slots[slot_idx].last, node);
|
||||
node->string = string;
|
||||
node->string = push_str8_copy(arena, string);
|
||||
node->num = num;
|
||||
}
|
||||
}
|
||||
@@ -132,34 +132,79 @@ eval_num_from_string(EVAL_String2NumMap *map, String8 string)
|
||||
internal EVAL_String2NumMap *
|
||||
eval_push_locals_map_from_raddbg_voff(Arena *arena, RADDBG_Parsed *rdbg, U64 voff)
|
||||
{
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
|
||||
//- rjf: gather scopes to walk
|
||||
typedef struct Task Task;
|
||||
struct Task
|
||||
{
|
||||
Task *next;
|
||||
RADDBG_Scope *scope;
|
||||
};
|
||||
Task *first_task = 0;
|
||||
Task *last_task = 0;
|
||||
|
||||
//- rjf: voff -> tightest scope
|
||||
RADDBG_Scope *tightest_scope = 0;
|
||||
if(rdbg->scope_vmap != 0 && rdbg->scopes != 0)
|
||||
{
|
||||
U64 scope_idx = raddbg_vmap_idx_from_voff(rdbg->scope_vmap, rdbg->scope_vmap_count, voff);
|
||||
tightest_scope = &rdbg->scopes[scope_idx];
|
||||
RADDBG_Scope *scope = &rdbg->scopes[scope_idx];
|
||||
Task *task = push_array(scratch.arena, Task, 1);
|
||||
task->scope = scope;
|
||||
SLLQueuePush(first_task, last_task, task);
|
||||
tightest_scope = scope;
|
||||
}
|
||||
|
||||
//- rjf: voff-1 -> scope
|
||||
if(voff > 0 && rdbg->scope_vmap != 0 && rdbg->scopes != 0)
|
||||
{
|
||||
U64 scope_idx = raddbg_vmap_idx_from_voff(rdbg->scope_vmap, rdbg->scope_vmap_count, voff-1);
|
||||
RADDBG_Scope *scope = &rdbg->scopes[scope_idx];
|
||||
if(scope != tightest_scope)
|
||||
{
|
||||
Task *task = push_array(scratch.arena, Task, 1);
|
||||
task->scope = scope;
|
||||
SLLQueuePush(first_task, last_task, task);
|
||||
}
|
||||
}
|
||||
|
||||
//- rjf: tightest scope -> walk up the tree & build tasks for each parent scope
|
||||
if(tightest_scope != 0)
|
||||
{
|
||||
for(RADDBG_Scope *scope = &rdbg->scopes[tightest_scope->parent_scope_idx];
|
||||
scope != 0 && scope != &rdbg->scopes[0];
|
||||
scope = &rdbg->scopes[scope->parent_scope_idx])
|
||||
{
|
||||
Task *task = push_array(scratch.arena, Task, 1);
|
||||
task->scope = scope;
|
||||
SLLQueuePush(first_task, last_task, task);
|
||||
}
|
||||
}
|
||||
|
||||
//- rjf: build blank map
|
||||
EVAL_String2NumMap *map = push_array(arena, EVAL_String2NumMap, 1);
|
||||
*map = eval_string2num_map_make(arena, 1024);
|
||||
|
||||
//- rjf: tightest scope -> walk up the tree & accumulate all locals
|
||||
for(RADDBG_Scope *scope = tightest_scope;
|
||||
scope != 0 && scope != &rdbg->scopes[0];
|
||||
scope = &rdbg->scopes[scope->parent_scope_idx])
|
||||
//- rjf: accumulate locals for all tasks
|
||||
for(Task *task = first_task; task != 0; task = task->next)
|
||||
{
|
||||
U32 local_opl_idx = scope->local_first + scope->local_count;
|
||||
for(U32 local_idx = scope->local_first; local_idx < local_opl_idx; local_idx += 1)
|
||||
RADDBG_Scope *scope = task->scope;
|
||||
if(scope != 0)
|
||||
{
|
||||
RADDBG_Local *local_var = &rdbg->locals[local_idx];
|
||||
U64 local_name_size = 0;
|
||||
U8 *local_name_str = raddbg_string_from_idx(rdbg, local_var->name_string_idx, &local_name_size);
|
||||
String8 name = push_str8_copy(arena, str8(local_name_str, local_name_size));
|
||||
eval_string2num_map_insert(arena, map, name, (U64)local_idx+1);
|
||||
U32 local_opl_idx = scope->local_first + scope->local_count;
|
||||
for(U32 local_idx = scope->local_first; local_idx < local_opl_idx; local_idx += 1)
|
||||
{
|
||||
RADDBG_Local *local_var = &rdbg->locals[local_idx];
|
||||
U64 local_name_size = 0;
|
||||
U8 *local_name_str = raddbg_string_from_idx(rdbg, local_var->name_string_idx, &local_name_size);
|
||||
String8 name = push_str8_copy(arena, str8(local_name_str, local_name_size));
|
||||
eval_string2num_map_insert(arena, map, name, (U64)local_idx+1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
scratch_end(scratch);
|
||||
return map;
|
||||
}
|
||||
|
||||
@@ -778,6 +823,7 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8
|
||||
case EVAL_TokenKind_Identifier:
|
||||
{
|
||||
B32 mapped_identifier = 0;
|
||||
B32 identifier_type_is_possibly_dynamically_overridden = 0;
|
||||
B32 identifier_looks_like_type_expr = 0;
|
||||
RADDBG_LocationKind loc_kind = RADDBG_LocationKind_NULL;
|
||||
RADDBG_LocationRegister loc_reg = {0};
|
||||
@@ -788,6 +834,35 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8
|
||||
TG_Key type_key = zero_struct;
|
||||
String8 local_lookup_string = token_string;
|
||||
|
||||
//- rjf: form namespaceify fallback
|
||||
String8 namespaceified_token_string = token_string;
|
||||
if(ctx->rdbg->procedures != 0 && ctx->rdbg->scopes != 0 && ctx->rdbg->scope_vmap != 0)
|
||||
{
|
||||
U64 scope_idx = raddbg_vmap_idx_from_voff(ctx->rdbg->scope_vmap, ctx->rdbg->scope_vmap_count, ctx->ip_voff);
|
||||
RADDBG_Scope *scope = &ctx->rdbg->scopes[scope_idx];
|
||||
U64 proc_idx = scope->proc_idx;
|
||||
RADDBG_Procedure *procedure = &ctx->rdbg->procedures[proc_idx];
|
||||
U64 name_size = 0;
|
||||
U8 *name_ptr = raddbg_string_from_idx(ctx->rdbg, procedure->name_string_idx, &name_size);
|
||||
String8 name = str8(name_ptr, name_size);
|
||||
U64 past_scope_resolution_pos = 0;
|
||||
for(;;)
|
||||
{
|
||||
U64 past_next_dbl_colon_pos = str8_find_needle(name, past_scope_resolution_pos, str8_lit("::"), 0)+2;
|
||||
U64 past_next_dot_pos = str8_find_needle(name, past_scope_resolution_pos, str8_lit("."), 0)+1;
|
||||
U64 past_next_scope_resolution_pos = Min(past_next_dbl_colon_pos, past_next_dot_pos);
|
||||
if(past_next_scope_resolution_pos < name.size)
|
||||
{
|
||||
past_scope_resolution_pos = past_next_scope_resolution_pos;
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
namespaceified_token_string = push_str8f(scratch.arena, "%S%S", str8_prefix(name, past_scope_resolution_pos), token_string);
|
||||
}
|
||||
|
||||
//- rjf: try members
|
||||
if(mapped_identifier == 0)
|
||||
{
|
||||
@@ -808,6 +883,7 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8
|
||||
ctx->rdbg->type_nodes != 0)
|
||||
{
|
||||
mapped_identifier = 1;
|
||||
identifier_type_is_possibly_dynamically_overridden = 1;
|
||||
RADDBG_Local *local_var = &ctx->rdbg->locals[local_num-1];
|
||||
|
||||
// rjf: grab location info
|
||||
@@ -826,7 +902,19 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8
|
||||
case RADDBG_LocationKind_ValBytecodeStream:
|
||||
{
|
||||
U8 *bytecode_base = ctx->rdbg->location_data + block->location_data_off + sizeof(RADDBG_LocationKind);
|
||||
loc_bytecode = str8_cstring((char *)bytecode_base);
|
||||
U64 bytecode_size = 0;
|
||||
for(U64 idx = 0; idx < ctx->rdbg->location_data_size; idx += 1)
|
||||
{
|
||||
U8 op = bytecode_base[idx];
|
||||
if(op == 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
U8 ctrlbits = raddbg_eval_opcode_ctrlbits[op];
|
||||
U32 p_size = RADDBG_DECODEN_FROM_CTRLBITS(ctrlbits);
|
||||
bytecode_size += 1+p_size;
|
||||
}
|
||||
loc_bytecode = str8(bytecode_base, bytecode_size);
|
||||
}break;
|
||||
case RADDBG_LocationKind_AddrRegisterPlusU16:
|
||||
case RADDBG_LocationKind_AddrAddrRegisterPlusU16:
|
||||
@@ -886,9 +974,19 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8
|
||||
RADDBG_NameMapNode *node = raddbg_name_map_lookup(ctx->rdbg, &parsed_name_map, token_string.str, token_string.size);
|
||||
U32 matches_count = 0;
|
||||
U32 *matches = raddbg_matches_from_map_node(ctx->rdbg, node, &matches_count);
|
||||
if(matches_count == 0)
|
||||
{
|
||||
node = raddbg_name_map_lookup(ctx->rdbg, &parsed_name_map, namespaceified_token_string.str, namespaceified_token_string.size);
|
||||
matches_count = 0;
|
||||
matches = raddbg_matches_from_map_node(ctx->rdbg, node, &matches_count);
|
||||
}
|
||||
if(matches_count != 0)
|
||||
{
|
||||
U32 match_idx = matches[0];
|
||||
// NOTE(rjf): apparently, PDBs can be produced such that they
|
||||
// also keep stale *GLOBAL VARIABLE SYMBOLS* around too. I
|
||||
// don't know of a magic hash table fixup path in PDBs, so
|
||||
// in this case, I'm going to prefer the latest-added global.
|
||||
U32 match_idx = matches[matches_count-1];
|
||||
RADDBG_GlobalVariable *global_var = &ctx->rdbg->global_variables[match_idx];
|
||||
EVAL_OpList oplist = {0};
|
||||
eval_oplist_push_op(arena, &oplist, RADDBG_EvalOp_ModuleOff, global_var->voff);
|
||||
@@ -916,6 +1014,12 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8
|
||||
RADDBG_NameMapNode *node = raddbg_name_map_lookup(ctx->rdbg, &parsed_name_map, token_string.str, token_string.size);
|
||||
U32 matches_count = 0;
|
||||
U32 *matches = raddbg_matches_from_map_node(ctx->rdbg, node, &matches_count);
|
||||
if(matches_count == 0)
|
||||
{
|
||||
node = raddbg_name_map_lookup(ctx->rdbg, &parsed_name_map, namespaceified_token_string.str, namespaceified_token_string.size);
|
||||
matches_count = 0;
|
||||
matches = raddbg_matches_from_map_node(ctx->rdbg, node, &matches_count);
|
||||
}
|
||||
if(matches_count != 0)
|
||||
{
|
||||
U32 match_idx = matches[0];
|
||||
@@ -946,6 +1050,12 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8
|
||||
RADDBG_NameMapNode *node = raddbg_name_map_lookup(ctx->rdbg, &parsed_name_map, token_string.str, token_string.size);
|
||||
U32 matches_count = 0;
|
||||
U32 *matches = raddbg_matches_from_map_node(ctx->rdbg, node, &matches_count);
|
||||
if(matches_count == 0)
|
||||
{
|
||||
node = raddbg_name_map_lookup(ctx->rdbg, &parsed_name_map, namespaceified_token_string.str, namespaceified_token_string.size);
|
||||
matches_count = 0;
|
||||
matches = raddbg_matches_from_map_node(ctx->rdbg, node, &matches_count);
|
||||
}
|
||||
if(matches_count != 0)
|
||||
{
|
||||
U32 match_idx = matches[0];
|
||||
|
||||
@@ -749,6 +749,7 @@ f_push_run_from_string(Arena *arena, F_Tag tag, F32 size, F_RunFlags flags, Stri
|
||||
{
|
||||
info->subrect = chosen_atlas_region;
|
||||
info->atlas_num = chosen_atlas_num;
|
||||
info->raster_dim = raster.atlas_dim;
|
||||
info->advance = raster.advance;
|
||||
}
|
||||
}
|
||||
@@ -782,10 +783,10 @@ f_push_run_from_string(Arena *arena, F_Tag tag, F32 size, F_RunFlags flags, Stri
|
||||
F_Piece *piece = f_piece_chunk_list_push_new(arena, &piece_chunks, string.size);
|
||||
{
|
||||
piece->texture = atlas ? atlas->texture : r_handle_zero();
|
||||
piece->subrect = r2s16p(info->subrect.x0 + 1,
|
||||
info->subrect.y0 + 1,
|
||||
info->subrect.x1 - 1,
|
||||
info->subrect.y1 - 1);
|
||||
piece->subrect = r2s16p(info->subrect.x0,
|
||||
info->subrect.y0,
|
||||
info->subrect.x0 + info->raster_dim.x,
|
||||
info->subrect.y0 + info->raster_dim.y);
|
||||
piece->advance = info->advance;
|
||||
piece->decode_size = piece_substring.size;
|
||||
piece->offset = v2s16(0, -hash2style_node->ascent - 4);
|
||||
|
||||
@@ -102,6 +102,7 @@ typedef struct F_RasterCacheInfo F_RasterCacheInfo;
|
||||
struct F_RasterCacheInfo
|
||||
{
|
||||
Rng2S16 subrect;
|
||||
Vec2S16 raster_dim;
|
||||
S16 atlas_num;
|
||||
F32 advance;
|
||||
};
|
||||
|
||||
@@ -420,7 +420,7 @@ fp_raster(Arena *arena, FP_Handle font_handle, F32 size, FP_RasterMode mode, Str
|
||||
U64 in_pitch = (U64)dib.dsBm.bmWidthBytes;
|
||||
U8 *out_data = (U8 *)result.atlas;
|
||||
U64 out_pitch = atlas_dim.x * 4;
|
||||
|
||||
U64 color_sum = 0;
|
||||
U8 *in_line = (U8 *)in_data;
|
||||
U8 *out_line = out_data;
|
||||
for(U64 y = 0; y < atlas_dim.y; y += 1)
|
||||
@@ -434,12 +434,17 @@ fp_raster(Arena *arena, FP_Handle font_handle, F32 size, FP_RasterMode mode, Str
|
||||
out_pixel[1] = 255;
|
||||
out_pixel[2] = 255;
|
||||
out_pixel[3] = in_pixel_byte;
|
||||
color_sum += in_pixel_byte;
|
||||
in_pixel += 4;
|
||||
out_pixel += 4;
|
||||
}
|
||||
in_line += in_pitch;
|
||||
out_line += out_pitch;
|
||||
}
|
||||
if(color_sum == 0)
|
||||
{
|
||||
result.atlas_dim = v2s16(0, 0);
|
||||
}
|
||||
}
|
||||
render_target->Release();
|
||||
}
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
#include <stdint.h>
|
||||
#include <windows.h>
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int lib_loaded = 0;
|
||||
HANDLE lib = {0};
|
||||
FILETIME lib_last_filetime = {0};
|
||||
int (*get_number)(void) = 0;
|
||||
for(;;)
|
||||
{
|
||||
//- rjf: hot-load dll
|
||||
{
|
||||
HANDLE file = CreateFileA("mule_hotload_module.dll", GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
|
||||
FILETIME modified = {0};
|
||||
if(GetFileTime(file, 0, 0, &modified) &&
|
||||
CompareFileTime(&lib_last_filetime, &modified) == -1)
|
||||
{
|
||||
for(int reloaded = 0; !reloaded;)
|
||||
{
|
||||
if(lib_loaded)
|
||||
{
|
||||
FreeLibrary(lib);
|
||||
lib_loaded = 0;
|
||||
}
|
||||
BOOL copy_worked = CopyFile("mule_hotload_module.dll", "mule_hotload_module_temp.dll", 0);
|
||||
lib = LoadLibraryA("mule_hotload_module_temp.dll");
|
||||
if(lib != INVALID_HANDLE_VALUE)
|
||||
{
|
||||
reloaded = 1;
|
||||
lib_last_filetime = modified;
|
||||
get_number = (int(*)(void))GetProcAddress(lib, "get_number");
|
||||
lib_loaded = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
CloseHandle(file);
|
||||
}
|
||||
int number = get_number();
|
||||
printf("got a number: %i\n", number);
|
||||
if(number == 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
Sleep(1000);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
__declspec(dllexport) int
|
||||
get_number(void)
|
||||
{
|
||||
int sum = 0;
|
||||
for(int i = 0; i < 100; i += 1)
|
||||
{
|
||||
sum += i;
|
||||
sum += i;
|
||||
sum += 1;
|
||||
}
|
||||
sum = 1000;
|
||||
return sum;
|
||||
}
|
||||
@@ -16,7 +16,7 @@
|
||||
////////////////////////////////
|
||||
// NOTE(allen): Inline Stepping
|
||||
|
||||
extern unsigned int fixed_frac_bits = 5;
|
||||
unsigned int fixed_frac_bits = 5;
|
||||
static unsigned int bias = 7;
|
||||
|
||||
static FORCE_INLINE unsigned int
|
||||
|
||||
+140
-1
@@ -355,6 +355,8 @@ type_coverage_eval_tests(void){
|
||||
Has_A_Post_Forward_Reference r2 = {0};
|
||||
|
||||
Basics &basics_ref = basics;
|
||||
const Basics *basics_const_ptr = &basics;
|
||||
const Basics &basics_const_ref = basics;
|
||||
|
||||
union
|
||||
{
|
||||
@@ -914,6 +916,18 @@ struct Template_Example3{
|
||||
}
|
||||
};
|
||||
|
||||
struct SingleInheritanceBase
|
||||
{
|
||||
int x;
|
||||
int y;
|
||||
};
|
||||
|
||||
struct SingleInheritanceDerived : SingleInheritanceBase
|
||||
{
|
||||
int z;
|
||||
int w;
|
||||
};
|
||||
|
||||
struct Has_Members{
|
||||
int a;
|
||||
int b;
|
||||
@@ -1090,6 +1104,86 @@ struct Vinheritance_Child : Vinheritance_MidLeft, Vinheritance_MidRight{
|
||||
};
|
||||
};
|
||||
|
||||
struct Minheritance_Base{
|
||||
int x;
|
||||
int y;
|
||||
};
|
||||
|
||||
struct Minheritance_MidLeft : Minheritance_Base{
|
||||
float left;
|
||||
};
|
||||
|
||||
struct Minheritance_MidRight : Minheritance_Base{
|
||||
float right;
|
||||
};
|
||||
|
||||
struct Minheritance_Child : Minheritance_MidLeft, Minheritance_MidRight{
|
||||
char *name;
|
||||
};
|
||||
|
||||
struct Pure
|
||||
{
|
||||
virtual ~Pure() = default;
|
||||
virtual void Foo() = 0;
|
||||
};
|
||||
|
||||
struct PureChild : Pure
|
||||
{
|
||||
virtual ~PureChild() = default;
|
||||
virtual void Foo() {a += 1;}
|
||||
double a = 0;
|
||||
};
|
||||
|
||||
struct Base
|
||||
{
|
||||
int x;
|
||||
int y;
|
||||
int z;
|
||||
virtual ~Base() = default;
|
||||
virtual void Foo() = 0;
|
||||
};
|
||||
|
||||
struct Derived : Base
|
||||
{
|
||||
int r;
|
||||
int g;
|
||||
int b;
|
||||
int a;
|
||||
virtual ~Derived() = default;
|
||||
virtual void Foo() {a += 1;}
|
||||
};
|
||||
|
||||
struct DerivedA : Base
|
||||
{
|
||||
float a;
|
||||
float b;
|
||||
virtual void Foo() {a += 1;}
|
||||
virtual ~DerivedA() = default;
|
||||
};
|
||||
|
||||
struct DerivedB : Base
|
||||
{
|
||||
double c;
|
||||
double d;
|
||||
virtual void Foo() {c += 1;}
|
||||
virtual ~DerivedB() = default;
|
||||
};
|
||||
|
||||
struct NonVirtualBase
|
||||
{
|
||||
int x;
|
||||
int y;
|
||||
int z;
|
||||
};
|
||||
|
||||
struct NonVirtualDerived : NonVirtualBase
|
||||
{
|
||||
int r;
|
||||
int g;
|
||||
int b;
|
||||
int a;
|
||||
};
|
||||
|
||||
struct OverloadedMethods{
|
||||
int x;
|
||||
int cool_method(void){
|
||||
@@ -1245,6 +1339,12 @@ extended_type_coverage_eval_tests(void){
|
||||
Template_Example3<void *, float> temp3_vi((void *)&temp3_if, 1.f);
|
||||
Template_Example3<int, Template_Example2<int, float>> temp3_itif(123, temp_if);
|
||||
|
||||
SingleInheritanceDerived sid;
|
||||
sid.x = 123;
|
||||
sid.y = 456;
|
||||
sid.z = 789;
|
||||
sid.w = 999;
|
||||
|
||||
Pointer_To_Member pointer_to_member = {
|
||||
&Has_Members::a, &Has_Members::c, &Has_Members::bas,
|
||||
&Has_Members::x, &Has_Members::z, &Has_Members::bas_f,
|
||||
@@ -1279,6 +1379,45 @@ extended_type_coverage_eval_tests(void){
|
||||
vinheritance_child.x = -1;
|
||||
vinheritance_child.y = -1;
|
||||
|
||||
Minheritance_Child minheritance_child;
|
||||
minheritance_child.name = "foobar";
|
||||
minheritance_child.left = 10.5f;
|
||||
minheritance_child.right = 13.0f;
|
||||
minheritance_child.Minheritance_MidLeft::x = -1;
|
||||
minheritance_child.Minheritance_MidLeft::y = -1;
|
||||
minheritance_child.Minheritance_MidRight::x = +1;
|
||||
minheritance_child.Minheritance_MidRight::y = +1;
|
||||
|
||||
Pure *child = new PureChild();
|
||||
child->Foo();
|
||||
child->Foo();
|
||||
child->Foo();
|
||||
delete child;
|
||||
|
||||
Base *derived = new Derived();
|
||||
derived->Foo();
|
||||
derived->Foo();
|
||||
derived->Foo();
|
||||
delete derived;
|
||||
|
||||
NonVirtualBase *non_virtual_derived = new NonVirtualDerived();
|
||||
non_virtual_derived->x += 1;
|
||||
non_virtual_derived->x += 1;
|
||||
non_virtual_derived->x += 1;
|
||||
|
||||
Base *base_array[1024] = {0};
|
||||
for(int i = 0; i < sizeof(base_array)/sizeof(base_array[0]); i += 1)
|
||||
{
|
||||
if((i & 1) == 1)
|
||||
{
|
||||
base_array[i] = new DerivedA();
|
||||
}
|
||||
else
|
||||
{
|
||||
base_array[i] = new DerivedB();
|
||||
}
|
||||
}
|
||||
|
||||
OverloadedMethods overloaded_methods;
|
||||
{
|
||||
overloaded_methods.x = 0;
|
||||
@@ -1861,7 +2000,7 @@ control_flow_stepping_tests(void){
|
||||
if (i <= 1) goto done;
|
||||
if ((i&1) == 0) goto even_case;
|
||||
|
||||
odd_case:
|
||||
// odd_case:
|
||||
i = 3*i + 1;
|
||||
|
||||
even_case:
|
||||
|
||||
@@ -1198,6 +1198,14 @@ os_file_path_exists(String8 path)
|
||||
return 0;
|
||||
}
|
||||
|
||||
internal FileProperties
|
||||
os_properties_from_file_path(String8 path)
|
||||
{
|
||||
FileProperties props = {0};
|
||||
NotImplemented;
|
||||
return props;
|
||||
}
|
||||
|
||||
//- rjf: file maps
|
||||
|
||||
internal OS_Handle
|
||||
|
||||
+2
-11
@@ -86,7 +86,7 @@ os_relaunch_self(void){
|
||||
internal String8
|
||||
os_data_from_file_path(Arena *arena, String8 path)
|
||||
{
|
||||
OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_Shared, path);
|
||||
OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, path);
|
||||
FileProperties props = os_properties_from_file(file);
|
||||
String8 data = os_string_from_file_range(arena, file, r1u64(0, props.size));
|
||||
os_file_close(file);
|
||||
@@ -126,19 +126,10 @@ os_write_data_list_to_file_path(String8 path, String8List list)
|
||||
return good;
|
||||
}
|
||||
|
||||
internal FileProperties
|
||||
os_properties_from_file_path(String8 path)
|
||||
{
|
||||
OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_Shared, path);
|
||||
FileProperties props = os_properties_from_file(file);
|
||||
os_file_close(file);
|
||||
return props;
|
||||
}
|
||||
|
||||
internal OS_FileID
|
||||
os_id_from_file_path(String8 path)
|
||||
{
|
||||
OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_Shared, path);
|
||||
OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, path);
|
||||
OS_FileID id = os_id_from_file(file);
|
||||
os_file_close(file);
|
||||
return id;
|
||||
|
||||
@@ -10,10 +10,11 @@
|
||||
typedef U32 OS_AccessFlags;
|
||||
enum
|
||||
{
|
||||
OS_AccessFlag_Read = (1<<0),
|
||||
OS_AccessFlag_Write = (1<<1),
|
||||
OS_AccessFlag_Execute = (1<<2),
|
||||
OS_AccessFlag_Shared = (1<<3),
|
||||
OS_AccessFlag_Read = (1<<0),
|
||||
OS_AccessFlag_Write = (1<<1),
|
||||
OS_AccessFlag_Execute = (1<<2),
|
||||
OS_AccessFlag_ShareRead = (1<<3),
|
||||
OS_AccessFlag_ShareWrite = (1<<4),
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
@@ -175,7 +176,6 @@ internal void os_relaunch_self(void);
|
||||
internal String8 os_data_from_file_path(Arena *arena, String8 path);
|
||||
internal B32 os_write_data_to_file_path(String8 path, String8 data);
|
||||
internal B32 os_write_data_list_to_file_path(String8 path, String8List list);
|
||||
internal FileProperties os_properties_from_file_path(String8 path);
|
||||
internal OS_FileID os_id_from_file_path(String8 path);
|
||||
internal S64 os_file_id_compare(OS_FileID a, OS_FileID b);
|
||||
internal String8 os_string_from_file_range(Arena *arena, OS_Handle file, Rng1U64 range);
|
||||
@@ -259,6 +259,7 @@ internal B32 os_delete_file_at_path(String8 path);
|
||||
internal B32 os_copy_file_path(String8 dst, String8 src);
|
||||
internal String8 os_full_path_from_path(Arena *arena, String8 path);
|
||||
internal B32 os_file_path_exists(String8 path);
|
||||
internal FileProperties os_properties_from_file_path(String8 path);
|
||||
|
||||
//- rjf: file maps
|
||||
internal OS_Handle os_file_map_open(OS_AccessFlags flags, OS_Handle file);
|
||||
|
||||
@@ -6,6 +6,11 @@
|
||||
#pragma comment(lib, "shell32")
|
||||
#pragma comment(lib, "advapi32")
|
||||
#pragma comment(lib, "rpcrt4")
|
||||
#pragma comment(lib, "shlwapi")
|
||||
#pragma comment(lib, "comctl32")
|
||||
|
||||
// this is required for loading correct comctl32 dll file
|
||||
#pragma comment(linker,"\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
|
||||
|
||||
////////////////////////////////
|
||||
//~ allen: Definitions For Symbols That Are Sometimes Missing in Older Windows SDKs
|
||||
@@ -612,7 +617,8 @@ os_file_open(OS_AccessFlags flags, String8 path)
|
||||
if(flags & OS_AccessFlag_Read) {access_flags |= GENERIC_READ;}
|
||||
if(flags & OS_AccessFlag_Write) {access_flags |= GENERIC_WRITE;}
|
||||
if(flags & OS_AccessFlag_Execute) {access_flags |= GENERIC_EXECUTE;}
|
||||
if(flags & OS_AccessFlag_Shared) {share_mode = (!!(flags & OS_AccessFlag_Write)*FILE_SHARE_WRITE)|FILE_SHARE_READ;}
|
||||
if(flags & OS_AccessFlag_ShareRead) {share_mode |= FILE_SHARE_READ;}
|
||||
if(flags & OS_AccessFlag_ShareWrite) {share_mode |= FILE_SHARE_WRITE;}
|
||||
if(flags & OS_AccessFlag_Write) {creation_disposition = CREATE_ALWAYS;}
|
||||
HANDLE file = CreateFileW((WCHAR *)path16.str, access_flags, share_mode, 0, creation_disposition, FILE_ATTRIBUTE_NORMAL, 0);
|
||||
if(file != INVALID_HANDLE_VALUE)
|
||||
@@ -790,6 +796,26 @@ os_file_path_exists(String8 path)
|
||||
return exists;
|
||||
}
|
||||
|
||||
internal FileProperties
|
||||
os_properties_from_file_path(String8 path)
|
||||
{
|
||||
WIN32_FIND_DATAW find_data = {0};
|
||||
Temp scratch = scratch_begin(0, 0);
|
||||
String16 path16 = str16_from_8(scratch.arena, path);
|
||||
HANDLE handle = FindFirstFileW((WCHAR *)path16.str, &find_data);
|
||||
FileProperties props = {0};
|
||||
if(handle != INVALID_HANDLE_VALUE)
|
||||
{
|
||||
props.size = Compose64Bit(find_data.nFileSizeHigh, find_data.nFileSizeLow);
|
||||
w32_dense_time_from_file_time(&props.created, &find_data.ftCreationTime);
|
||||
w32_dense_time_from_file_time(&props.modified, &find_data.ftLastWriteTime);
|
||||
props.flags = w32_file_property_flags_from_dwFileAttributes(find_data.dwFileAttributes);
|
||||
}
|
||||
FindClose(handle);
|
||||
scratch_end(scratch);
|
||||
return props;
|
||||
}
|
||||
|
||||
//- rjf: file maps
|
||||
|
||||
internal OS_Handle
|
||||
|
||||
@@ -189,3 +189,35 @@ os_text(OS_EventList *events, OS_Handle window, U32 character)
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
internal OS_EventList
|
||||
os_event_list_copy(Arena *arena, OS_EventList *src)
|
||||
{
|
||||
OS_EventList dst = {0};
|
||||
for(OS_Event *s = src->first; s != 0; s = s->next)
|
||||
{
|
||||
OS_Event *d = push_array(arena, OS_Event, 1);
|
||||
MemoryCopyStruct(d, s);
|
||||
d->strings = str8_list_copy(arena, &s->strings);
|
||||
DLLPushBack(dst.first, dst.last, d);
|
||||
dst.count += 1;
|
||||
}
|
||||
return dst;
|
||||
}
|
||||
|
||||
internal void
|
||||
os_event_list_concat_in_place(OS_EventList *dst, OS_EventList *to_push)
|
||||
{
|
||||
if(dst->last && to_push->first)
|
||||
{
|
||||
dst->last->next = to_push->first;
|
||||
to_push->first->prev = dst->last;
|
||||
dst->last = to_push->last;
|
||||
dst->count += to_push->count;
|
||||
}
|
||||
else if(!dst->last && to_push->first)
|
||||
{
|
||||
MemoryCopyStruct(dst, to_push);
|
||||
}
|
||||
MemoryZeroStruct(to_push);
|
||||
}
|
||||
|
||||
+4
-1
@@ -63,6 +63,7 @@ struct OS_Event
|
||||
{
|
||||
OS_Event *next;
|
||||
OS_Event *prev;
|
||||
U64 timestamp_us;
|
||||
OS_Handle window;
|
||||
OS_EventKind kind;
|
||||
OS_EventFlags flags;
|
||||
@@ -71,6 +72,7 @@ struct OS_Event
|
||||
B32 right_sided;
|
||||
U32 character;
|
||||
U32 repeat_count;
|
||||
Vec2F32 pos;
|
||||
Vec2F32 delta;
|
||||
String8List strings;
|
||||
};
|
||||
@@ -92,6 +94,8 @@ internal void os_eat_event(OS_EventList *events, OS_Event *event);
|
||||
internal B32 os_key_press(OS_EventList *events, OS_Handle window, OS_EventFlags flags, OS_Key key);
|
||||
internal B32 os_key_release(OS_EventList *events, OS_Handle window, OS_EventFlags flags, OS_Key key);
|
||||
internal B32 os_text(OS_EventList *events, OS_Handle window, U32 character);
|
||||
internal OS_EventList os_event_list_copy(Arena *arena, OS_EventList *src);
|
||||
internal void os_event_list_concat_in_place(OS_EventList *dst, OS_EventList *to_push);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: @os_hooks Main Initialization API (Implemented Per-OS)
|
||||
@@ -152,7 +156,6 @@ internal void os_set_cursor(OS_Cursor cursor);
|
||||
internal F32 os_double_click_time(void);
|
||||
internal F32 os_caret_blink_time(void);
|
||||
internal F32 os_default_refresh_rate(void);
|
||||
internal B32 os_granular_sleep_enabled(void);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: @os_hooks Native Messages & Panics (Implemented Per-OS)
|
||||
|
||||
@@ -14,7 +14,6 @@ global Arena * w32_event_arena = 0;
|
||||
global HCURSOR w32_hcursor = 0;
|
||||
global B32 w32_resizing = 0;
|
||||
global F32 w32_default_refresh_rate = 60.f;
|
||||
global B32 w32_granular_sleep_enabled = 0;
|
||||
|
||||
////////////////////////////////
|
||||
//~ allen: Windows SDK Inconsistency Fixer
|
||||
@@ -112,9 +111,11 @@ w32_push_event(OS_EventKind kind, W32_Window *window)
|
||||
{
|
||||
OS_Event *result = push_array(w32_event_arena, OS_Event, 1);
|
||||
DLLPushBack(w32_event_list.first, w32_event_list.last, result);
|
||||
result->timestamp_us = os_now_microseconds();
|
||||
result->kind = kind;
|
||||
result->window = os_window_from_w32_window(window);
|
||||
result->flags = os_get_event_flags();
|
||||
w32_event_list.count += 1;
|
||||
return(result);
|
||||
}
|
||||
|
||||
@@ -416,6 +417,8 @@ w32_wnd_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||
event->key = OS_Key_RightMouseButton;
|
||||
}break;
|
||||
}
|
||||
event->pos.x = (F32)LOWORD(lParam);
|
||||
event->pos.y = (F32)HIWORD(lParam);
|
||||
if(release)
|
||||
{
|
||||
ReleaseCapture();
|
||||
@@ -572,6 +575,7 @@ os_graphical_init(void)
|
||||
wndclass.hInstance = w32_h_instance;
|
||||
wndclass.lpszClassName = L"graphical-window";
|
||||
wndclass.hCursor = LoadCursorA(0, IDC_ARROW);
|
||||
wndclass.hIcon = LoadIcon(w32_h_instance, MAKEINTRESOURCE(1));
|
||||
ATOM wndatom = RegisterClassExW(&wndclass);
|
||||
(void)wndatom;
|
||||
}
|
||||
@@ -585,9 +589,6 @@ os_graphical_init(void)
|
||||
}
|
||||
}
|
||||
|
||||
//- rjf: try to enable granular sleep
|
||||
w32_granular_sleep_enabled = (timeBeginPeriod(1) == TIMERR_NOERROR);
|
||||
|
||||
//- rjf: set initial cursor
|
||||
os_set_cursor(OS_Cursor_Pointer);
|
||||
}
|
||||
@@ -1081,12 +1082,6 @@ os_default_refresh_rate(void)
|
||||
return w32_default_refresh_rate;
|
||||
}
|
||||
|
||||
internal B32
|
||||
os_granular_sleep_enabled(void)
|
||||
{
|
||||
return w32_granular_sleep_enabled;
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: @os_hooks Native Messages & Panics (Implemented Per-OS)
|
||||
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
|
||||
#pragma comment(lib, "user32")
|
||||
#pragma comment(lib, "gdi32")
|
||||
#pragma comment(lib, "winmm")
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Windows
|
||||
|
||||
+43
-43
@@ -236,56 +236,56 @@ pe_bin_info_from_data(Arena *arena, String8 data)
|
||||
internal U64
|
||||
pe_intel_pdata_off_from_voff__binary_search(String8 data, PE_BinInfo *bin, U64 voff)
|
||||
{
|
||||
// TODO(allen): cleanup pass.
|
||||
Assert(bin->arch == Architecture_x86 || bin->arch == Architecture_x64);
|
||||
Rng1U64 range = bin->data_dir_franges[PE_DataDirectoryIndex_EXCEPTIONS];
|
||||
U64 pdata_off = range.min;
|
||||
U64 pdata_count = (range.max - range.min)/sizeof(PE_IntelPdata);
|
||||
|
||||
U64 result = 0;
|
||||
|
||||
// check if this bin includes a pdata array
|
||||
if(pdata_count > 0)
|
||||
if(bin->arch != Architecture_Null && PE_DataDirectoryIndex_EXCEPTIONS < bin->data_dir_count)
|
||||
{
|
||||
PE_IntelPdata *pdata_array = (PE_IntelPdata*)(data.str + pdata_off);
|
||||
if(voff >= pdata_array[0].voff_first)
|
||||
Rng1U64 range = bin->data_dir_franges[PE_DataDirectoryIndex_EXCEPTIONS];
|
||||
U64 pdata_off = range.min;
|
||||
U64 pdata_count = (range.max - range.min)/sizeof(PE_IntelPdata);
|
||||
|
||||
// check if this bin includes a pdata array
|
||||
if(pdata_count > 0 && 0 <= pdata_off && pdata_off < data.size)
|
||||
{
|
||||
// binary search:
|
||||
// find max index s.t. pdata_array[index].voff_first <= voff
|
||||
// we assume (i < j) -> (pdata_array[i].voff_first < pdata_array[j].voff_first)
|
||||
U64 index = pdata_count;
|
||||
U64 min = 0;
|
||||
U64 opl = pdata_count;
|
||||
for(;;)
|
||||
PE_IntelPdata *pdata_array = (PE_IntelPdata*)(data.str + pdata_off);
|
||||
if(voff >= pdata_array[0].voff_first)
|
||||
{
|
||||
U64 mid = (min + opl)/2;
|
||||
PE_IntelPdata *pdata = pdata_array + mid;
|
||||
if(voff < pdata->voff_first)
|
||||
// binary search:
|
||||
// find max index s.t. pdata_array[index].voff_first <= voff
|
||||
// we assume (i < j) -> (pdata_array[i].voff_first < pdata_array[j].voff_first)
|
||||
U64 index = pdata_count;
|
||||
U64 min = 0;
|
||||
U64 opl = pdata_count;
|
||||
for(;;)
|
||||
{
|
||||
opl = mid;
|
||||
U64 mid = (min + opl)/2;
|
||||
PE_IntelPdata *pdata = pdata_array + mid;
|
||||
if(voff < pdata->voff_first)
|
||||
{
|
||||
opl = mid;
|
||||
}
|
||||
else if(pdata->voff_first < voff)
|
||||
{
|
||||
min = mid;
|
||||
}
|
||||
else
|
||||
{
|
||||
index = mid;
|
||||
break;
|
||||
}
|
||||
if(min + 1 >= opl)
|
||||
{
|
||||
index = min;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if(pdata->voff_first < voff)
|
||||
|
||||
// if we are in range fill result
|
||||
{
|
||||
min = mid;
|
||||
}
|
||||
else
|
||||
{
|
||||
index = mid;
|
||||
break;
|
||||
}
|
||||
if(min + 1 >= opl)
|
||||
{
|
||||
index = min;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// if we are in range fill result
|
||||
{
|
||||
PE_IntelPdata *pdata = pdata_array + index;
|
||||
if(pdata->voff_first <= voff && voff < pdata->voff_one_past_last)
|
||||
{
|
||||
result = pdata_off + index*sizeof(PE_IntelPdata);
|
||||
PE_IntelPdata *pdata = pdata_array + index;
|
||||
if(pdata->voff_first <= voff && voff < pdata->voff_one_past_last)
|
||||
{
|
||||
result = pdata_off + index*sizeof(PE_IntelPdata);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+68
-8
@@ -55,13 +55,25 @@ update_and_render(OS_Handle repaint_window_handle, void *user_data)
|
||||
//- rjf: target Hz -> delta time
|
||||
F32 dt = 1.f/target_hz;
|
||||
|
||||
//- rjf: last frame before sleep -> disable txti change detection
|
||||
if(df_gfx_state->num_frames_requested == 0)
|
||||
{
|
||||
txti_set_external_change_detection_enabled(0);
|
||||
}
|
||||
|
||||
//- rjf: get events from the OS
|
||||
OS_EventList events = {0};
|
||||
if(os_handle_match(repaint_window_handle, os_handle_zero()))
|
||||
{
|
||||
events = os_get_events(scratch.arena, df_gfx_state->num_frames_requested == 0);
|
||||
OS_EventList leftover_events_copy = os_event_list_copy(scratch.arena, &leftover_events);
|
||||
OS_EventList new_events = os_get_events(scratch.arena, df_gfx_state->num_frames_requested == 0);
|
||||
os_event_list_concat_in_place(&events, &leftover_events_copy);
|
||||
os_event_list_concat_in_place(&events, &new_events);
|
||||
}
|
||||
|
||||
//- rjf: enable txti change detection
|
||||
txti_set_external_change_detection_enabled(1);
|
||||
|
||||
//- rjf: begin measuring actual per-frame work
|
||||
U64 begin_time_us = os_now_microseconds();
|
||||
|
||||
@@ -70,10 +82,12 @@ update_and_render(OS_Handle repaint_window_handle, void *user_data)
|
||||
{
|
||||
if(os_key_press(&events, os_handle_zero(), 0, OS_Key_Esc))
|
||||
{
|
||||
df_gfx_request_frame();
|
||||
df_gfx_state->bind_change_active = 0;
|
||||
}
|
||||
if(os_key_press(&events, os_handle_zero(), 0, OS_Key_Delete))
|
||||
{
|
||||
df_gfx_request_frame();
|
||||
df_unbind_spec(df_gfx_state->bind_change_cmd_spec, df_gfx_state->bind_change_binding);
|
||||
df_gfx_state->bind_change_active = 0;
|
||||
DF_CmdParams p = df_cmd_params_from_gfx();
|
||||
@@ -105,6 +119,7 @@ update_and_render(OS_Handle repaint_window_handle, void *user_data)
|
||||
os_eat_event(&events, event);
|
||||
DF_CmdParams p = df_cmd_params_from_gfx();
|
||||
df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(df_g_cfg_src_write_cmd_kind_table[DF_CfgSrc_User]));
|
||||
df_gfx_request_frame();
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -125,12 +140,16 @@ update_and_render(OS_Handle repaint_window_handle, void *user_data)
|
||||
DF_CmdSpecList spec_candidates = df_cmd_spec_list_from_binding(scratch.arena, binding);
|
||||
if(spec_candidates.first != 0 && !df_cmd_spec_is_nil(spec_candidates.first->spec))
|
||||
{
|
||||
DF_CmdSpec *run_spec = df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_RunCommand);
|
||||
DF_CmdSpec *spec = spec_candidates.first->spec;
|
||||
params.cmd_spec = spec;
|
||||
df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_CmdSpec);
|
||||
if(run_spec != spec)
|
||||
{
|
||||
params.cmd_spec = spec;
|
||||
df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_CmdSpec);
|
||||
}
|
||||
U32 hit_char = os_codepoint_from_event_flags_and_key(event->flags, event->key);
|
||||
os_eat_event(&events, event);
|
||||
df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_CommandFastPath));
|
||||
df_push_cmd__root(¶ms, run_spec);
|
||||
if(event->flags & OS_EventFlag_Alt)
|
||||
{
|
||||
window->menu_bar_focus_press_started = 0;
|
||||
@@ -147,6 +166,7 @@ update_and_render(OS_Handle repaint_window_handle, void *user_data)
|
||||
df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_String);
|
||||
df_push_cmd__root(¶ms, spec);
|
||||
df_gfx_request_frame();
|
||||
os_eat_event(&events, event);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -161,32 +181,44 @@ update_and_render(OS_Handle repaint_window_handle, void *user_data)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
B32 take = 0;
|
||||
if(event->kind == OS_EventKind_Press && event->key == OS_Key_Alt && event->is_repeat == 0)
|
||||
{
|
||||
take = 1;
|
||||
df_gfx_request_frame();
|
||||
ws->menu_bar_focused_on_press = ws->menu_bar_focused;
|
||||
ws->menu_bar_key_held = 1;
|
||||
ws->menu_bar_focus_press_started = 1;
|
||||
}
|
||||
if(event->kind == OS_EventKind_Release && event->key == OS_Key_Alt && event->is_repeat == 0)
|
||||
{
|
||||
take = 1;
|
||||
df_gfx_request_frame();
|
||||
ws->menu_bar_key_held = 0;
|
||||
}
|
||||
if(ws->menu_bar_focused && event->kind == OS_EventKind_Press && event->key == OS_Key_Alt && event->is_repeat == 0)
|
||||
{
|
||||
os_eat_event(&events, event);
|
||||
take = 1;
|
||||
df_gfx_request_frame();
|
||||
ws->menu_bar_focused = 0;
|
||||
}
|
||||
else if(ws->menu_bar_focus_press_started && !ws->menu_bar_focused && event->kind == OS_EventKind_Release && event->key == OS_Key_Alt && event->is_repeat == 0)
|
||||
{
|
||||
os_eat_event(&events, event);
|
||||
take = 1;
|
||||
df_gfx_request_frame();
|
||||
ws->menu_bar_focused = !ws->menu_bar_focused_on_press;
|
||||
ws->menu_bar_focus_press_started = 0;
|
||||
}
|
||||
else if(event->kind == OS_EventKind_Press && event->key == OS_Key_Esc && ws->menu_bar_focused && !ui_any_ctx_menu_is_open())
|
||||
{
|
||||
os_eat_event(&events, event);
|
||||
take = 1;
|
||||
df_gfx_request_frame();
|
||||
ws->menu_bar_focused = 0;
|
||||
}
|
||||
if(take)
|
||||
{
|
||||
os_eat_event(&events, event);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -267,8 +299,9 @@ update_and_render(OS_Handle repaint_window_handle, void *user_data)
|
||||
}
|
||||
|
||||
//- rjf: take window closing events
|
||||
for(OS_Event *e = events.first; e; e = e->next)
|
||||
for(OS_Event *e = events.first, *next = 0; e; e = next)
|
||||
{
|
||||
next = e->next;
|
||||
if(e->kind == OS_EventKind_WindowClose)
|
||||
{
|
||||
for(DF_Window *w = df_gfx_state->first_window; w != 0; w = w->next)
|
||||
@@ -280,6 +313,30 @@ update_and_render(OS_Handle repaint_window_handle, void *user_data)
|
||||
break;
|
||||
}
|
||||
}
|
||||
os_eat_event(&events, e);
|
||||
}
|
||||
}
|
||||
|
||||
//- rjf: gather leftover events for subsequent frame
|
||||
if(events.count != 0)
|
||||
{
|
||||
arena_clear(leftover_events_arena);
|
||||
leftover_events = os_event_list_copy(leftover_events_arena, &events);
|
||||
for(OS_Event *ev = leftover_events.first, *next = 0; ev != 0; ev = next)
|
||||
{
|
||||
next = ev->next;
|
||||
if(ev->timestamp_us+1000000 < os_now_microseconds() ||
|
||||
ev->kind == OS_EventKind_Text ||
|
||||
(ev->kind == OS_EventKind_Press && ev->key != OS_Key_LeftMouseButton) ||
|
||||
(ev->kind == OS_EventKind_Press && ev->key != OS_Key_RightMouseButton) ||
|
||||
(ev->kind == OS_EventKind_Press && ev->key != OS_Key_MiddleMouseButton) ||
|
||||
(ev->kind == OS_EventKind_Release && ev->key != OS_Key_LeftMouseButton) ||
|
||||
(ev->kind == OS_EventKind_Release && ev->key != OS_Key_RightMouseButton) ||
|
||||
(ev->kind == OS_EventKind_Release && ev->key != OS_Key_MiddleMouseButton) ||
|
||||
(ev->kind == OS_EventKind_Scroll))
|
||||
{
|
||||
os_eat_event(&leftover_events, ev);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -391,6 +448,9 @@ entry_point(int argc, char **argv)
|
||||
IPCInfo *ipc_info = (IPCInfo *)ipc_shared_memory_base;
|
||||
ipc_info->msg_size = 0;
|
||||
|
||||
//- rjf: set up leftover event arena
|
||||
leftover_events_arena = arena_alloc();
|
||||
|
||||
//- rjf: initialize stuff we depend on
|
||||
{
|
||||
hs_init();
|
||||
|
||||
+69
-42
@@ -1,24 +1,53 @@
|
||||
// Copyright (c) 2024 Epic Games Tools
|
||||
// Licensed under the MIT license (https://opensource.org/license/mit/)
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Frontend/UI Pass Tasks
|
||||
//
|
||||
// [ ] source view -> floating margin/line-nums
|
||||
// [ ] theme colors -> more explicit about e.g. opaque backgrounds vs. floating
|
||||
// & scrollbars etc.
|
||||
// [ ] drag/drop tab cleanup
|
||||
// [ ] target/breakpoint/watch-pin reordering
|
||||
// [ ] watch window reordering
|
||||
// [x] query views, cleanup & floating - maybe merge "applies to view" vs. not
|
||||
// [ ] standard way to filter
|
||||
// [ ] visualize remapped files (via path map)
|
||||
// [ ] hovering truncated string for a short time -> tooltip with full wrapped
|
||||
// string
|
||||
// [ ] theme lister -> fonts & font sizes
|
||||
// [ ] font lister
|
||||
// [ ] per-panel font size overrides
|
||||
//
|
||||
// [ ] For the Scheduler window, it would be nice if you could dim or
|
||||
// folderize threads that are not your threads - eg., if a thread doesn't
|
||||
// have any resolved stack pointers in your executable code, then you can
|
||||
// ignore it when you are focusing on your own code. I don't know what the
|
||||
// best way to detect this is, other than by walking the call stack... one
|
||||
// way might be to just have a way to separate threads you've named from
|
||||
// threads you haven't? Or, there could even be a debugger-specific API
|
||||
// that you use to tag them. Just some way that would make it easier to
|
||||
// focus on your own threads.
|
||||
//
|
||||
// [ ] autocomplete lister should respect position in edited expression,
|
||||
// tabbing through should autocomplete but not exit, etc.
|
||||
//
|
||||
// [ ] it would be nice to have "show in explorer" for right click on source
|
||||
// file tab (opens explorer & selects the file)
|
||||
// [x] it would be nice if Alt+o in source file would switch between .h and
|
||||
// .c/cpp file (just look for same name in same folder)
|
||||
//
|
||||
// [ ] what's up with decimal number coloring where every group of 3 are in
|
||||
// different color? can I turn it off? And why sometimes digits in number
|
||||
// start with brighter color, but sometimes with darker - shouldn't it
|
||||
// always have the same color ordering?
|
||||
//
|
||||
// [ ] middle mouse button on tab should close it
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Hot, High Priority Tasks (Complete Unusability, Crashes, Fire-Worthy)
|
||||
//
|
||||
// [ ] ** Thread/process control bullet-proofing, including solo-step mode
|
||||
// [ ] ** ASAN targets
|
||||
// [ ] ** while typing, "Alt" Windows menu things should not happen
|
||||
//
|
||||
// [ ] ** I can't seem to get the .raddbg files to update consistently, or
|
||||
// something. I can't seem to reproduce it reliably, but sometimes when I
|
||||
// rebuild, for example, it seems to keep using the old PDB data
|
||||
// effectively - like it doesn't think it needs to update the raddbg file,
|
||||
// or something? But if I manually delete the raddbg file and relaunch,
|
||||
// then it will have the new debug info. It would be nice if there was
|
||||
// some kind of way to interrogate this in the debugger so I can send a
|
||||
// more constructive report, like some way to get a hash of the PDB that
|
||||
// is thinks it has converted to the RAD format, and then a way I can hash
|
||||
// the PDB on the drive, or something, so I can figure out if they are
|
||||
// mismatching for sure?
|
||||
//
|
||||
// [ ] ** In solo-stepping mode, if I step over something like CreateFileA, it
|
||||
// pseudo-hangs the debugger. I can't seem to do anything else, including
|
||||
@@ -30,20 +59,33 @@
|
||||
// progress bar in the disassembly window. I had to close and restart. Is
|
||||
// console app debugging not working yet, perhaps?
|
||||
//
|
||||
// [ ] Setting the code_font/main_font values to a font name doesn't work.
|
||||
// Should probably make note that you have to set it to a path to a TTF,
|
||||
// since that's not normally how Windows fonts work.
|
||||
|
||||
// [ ] Setting the code_font/main_font values to a font name doesn't work.
|
||||
// Should probably make note that you have to set it to a path to a TTF,
|
||||
// since that's not normally how Windows fonts work.
|
||||
//
|
||||
// [ ] ** Converter performance & heuristics for asynchronously doing it early
|
||||
//
|
||||
// [ ] disasm animation & go-to-address
|
||||
//
|
||||
// [ ] visualize mismatched source code and debug info
|
||||
// [ ] visualize remapped files (via path map)
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Hot, Medium Priority Tasks (Low-Hanging-Fruit Features, UI Jank, Cleanup)
|
||||
//
|
||||
// [ ] Watch Window Type Evaluation
|
||||
// [ ] Globals, Thread-Locals, Types Views
|
||||
// [ ] Watch Window Filtering
|
||||
//
|
||||
// [ ] investigate /DEBUG:FASTLINK - can we somehow alert that we do not
|
||||
// support it?
|
||||
//
|
||||
// [ ] escaping in config files - breakpoint labels etc.
|
||||
// [ ] focus changing between query bar & panel content via mouse
|
||||
//
|
||||
// [ ] ** while typing, "Alt" Windows menu things should not happen
|
||||
//
|
||||
// [ ] visualize conversion failures
|
||||
//
|
||||
// [ ] I was a little confused about what a profile file was. I understood
|
||||
// what the user file was, but the profile file sounded like it should
|
||||
// perhaps be per-project, yet it sounded like it was meant to be somewhat
|
||||
@@ -202,6 +244,10 @@
|
||||
////////////////////////////////
|
||||
//~ rjf: Hot, Low Priority Tasks (UI Opinions, Less-Serious Jank, Preferences, Cleanup)
|
||||
//
|
||||
// [ ] ** Directory picking is kind of busted, as it goes through the same
|
||||
// path as file picking, and this doesn't give the user a clean path to
|
||||
// actually pick a folder, just navigate with them
|
||||
//
|
||||
// [ ] ** In the call stack, I would like to be able to click quickly and move
|
||||
// around the stack. Right now, you can do that with the first and third
|
||||
// column, but the second column drops down a context menu. Since right
|
||||
@@ -250,21 +296,12 @@
|
||||
// [ ] can it ignore stepping into _RTC_CheckStackVars generated functions?
|
||||
// [ ] mouse back button should make view to go back after I double clicked
|
||||
// on function to open it
|
||||
// [ ] middle mouse button on tab should close it
|
||||
// [ ] pressing random keyboard keys in source code advances text cursor like
|
||||
// you were inputting text, very strange.
|
||||
// [ ] Alt+8 to switch to disassembly would be nice (regardless on which
|
||||
// panel was previous, don't want to use ctrl+, multiple times)
|
||||
// Alt+8 for disasm and Alt+6 for memory view are shortcuts I often use
|
||||
// in VS
|
||||
// [ ] what's up with decimal number coloring where every group of 3 are in
|
||||
// different color? can I turn it off? And why sometimes digits in number
|
||||
// start with brighter color, but sometimes with darker - shouldn't it
|
||||
// always have the same color ordering?
|
||||
// [ ] it would be nice to have "show in explorer" for right click on source
|
||||
// file tab (opens explorer & selects the file)
|
||||
// [ ] it would be nice if Alt+o in source file would switch between .h and
|
||||
// .c/cpp file (just look for same name in same folder)
|
||||
// [ ] in watch window when I enter some new expression and then click mouse
|
||||
// away from cell, then it should behave the same as if I pressed enter.
|
||||
// Currently it does the same as if I have pressed esc and I have lost my
|
||||
@@ -285,19 +322,6 @@
|
||||
////////////////////////////////
|
||||
//~ rjf: Hot, Feature Tasks (Not really "low priority" but less urgent than fixes)
|
||||
//
|
||||
// [ ] For the Scheduler window, it would be nice if you could dim or
|
||||
// folderize threads that are not your threads - eg., if a thread doesn't
|
||||
// have any resolved stack pointers in your executable code, then you can
|
||||
// ignore it when you are focusing on your own code. I don't know what the
|
||||
// best way to detect this is, other than by walking the call stack... one
|
||||
// way might be to just have a way to separate threads you've named from
|
||||
// threads you haven't? Or, there could even be a debugger-specific API
|
||||
// that you use to tag them. Just some way that would make it easier to
|
||||
// focus on your own threads.
|
||||
//
|
||||
// [ ] autocomplete lister should respect position in edited expression,
|
||||
// tabbing through should autocomplete but not exit, etc.
|
||||
//
|
||||
// [ ] Fancy View Rules
|
||||
// [ ] table column boundaries should be checked against *AFTER* table
|
||||
// contents, not before
|
||||
@@ -422,13 +446,14 @@
|
||||
|
||||
#define RADDBG_VERSION_MAJOR 0
|
||||
#define RADDBG_VERSION_MINOR 9
|
||||
#define RADDBG_VERSION_PATCH 3
|
||||
#define RADDBG_VERSION_PATCH 6
|
||||
#define RADDBG_VERSION_STRING_LITERAL Stringify(RADDBG_VERSION_MAJOR) "." Stringify(RADDBG_VERSION_MINOR) "." Stringify(RADDBG_VERSION_PATCH)
|
||||
#if defined(NDEBUG)
|
||||
# define RADDBG_TITLE_STRING_LITERAL "The RAD Debugger (" RADDBG_VERSION_STRING_LITERAL " ALPHA) - " __DATE__ ""
|
||||
#else
|
||||
# define RADDBG_TITLE_STRING_LITERAL "The RAD Debugger (" RADDBG_VERSION_STRING_LITERAL " ALPHA) - " __DATE__ " [Debug]"
|
||||
#endif
|
||||
#define RADDBG_GITHUB_ISSUES "https://github.com/EpicGames/raddebugger/issues"
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Top-Level Execution Types
|
||||
@@ -457,6 +482,8 @@ read_only global String8 ipc_shared_memory_name = str8_lit_comp("_raddbg_ipc_sha
|
||||
read_only global String8 ipc_semaphore_name = str8_lit_comp("_raddbg_ipc_semaphore_");
|
||||
global U64 frame_time_us_history[64] = {0};
|
||||
global U64 frame_time_us_history_idx = 0;
|
||||
global Arena *leftover_events_arena = 0;
|
||||
global OS_EventList leftover_events = {0};
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Frontend Entry Points
|
||||
|
||||
+202
-16
@@ -92,17 +92,209 @@
|
||||
//- rjf: windows
|
||||
#if OS_WINDOWS
|
||||
|
||||
global DWORD g_saved_exception_code = 0;
|
||||
#include <dbghelp.h>
|
||||
|
||||
internal DWORD
|
||||
win32_exception_filter(DWORD dwExceptionCode)
|
||||
#undef OS_WINDOWS // shlwapi uses its own OS_WINDOWS include inside
|
||||
#include <shlwapi.h>
|
||||
|
||||
internal B32 g_is_quiet = 0;
|
||||
|
||||
internal HRESULT WINAPI
|
||||
win32_dialog_callback(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam, LONG_PTR data)
|
||||
{
|
||||
g_saved_exception_code = dwExceptionCode;
|
||||
return EXCEPTION_EXECUTE_HANDLER;
|
||||
if(msg == TDN_HYPERLINK_CLICKED)
|
||||
{
|
||||
ShellExecuteW(NULL, L"open", (LPWSTR)lparam, NULL, NULL, SW_SHOWNORMAL);
|
||||
}
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
internal LONG WINAPI
|
||||
win32_exception_filter(EXCEPTION_POINTERS* exception_ptrs)
|
||||
{
|
||||
if(g_is_quiet)
|
||||
{
|
||||
ExitProcess(1);
|
||||
}
|
||||
|
||||
static volatile LONG first = 0;
|
||||
if(InterlockedCompareExchange(&first, 1, 0) != 0)
|
||||
{
|
||||
// prevent failures in other threads to popup same message box
|
||||
// this handler just shows first thread that crashes
|
||||
// we are terminating afterwards anyway
|
||||
for (;;) Sleep(1000);
|
||||
}
|
||||
|
||||
WCHAR buffer[4096] = {0};
|
||||
int buflen = 0;
|
||||
|
||||
DWORD exception_code = exception_ptrs->ExceptionRecord->ExceptionCode;
|
||||
buflen += wnsprintfW(buffer + buflen, sizeof(buffer) - buflen, L"A fatal exception (code 0x%x) occurred. The process is terminating.\n", exception_code);
|
||||
|
||||
// load dbghelp dynamically just in case if it is missing
|
||||
HMODULE dbghelp = LoadLibraryA("dbghelp.dll");
|
||||
if(dbghelp)
|
||||
{
|
||||
DWORD (WINAPI *dbg_SymSetOptions)(DWORD SymOptions);
|
||||
BOOL (WINAPI *dbg_SymInitializeW)(HANDLE hProcess, PCWSTR UserSearchPath, BOOL fInvadeProcess);
|
||||
BOOL (WINAPI *dbg_StackWalk64)(DWORD MachineType, HANDLE hProcess, HANDLE hThread,
|
||||
LPSTACKFRAME64 StackFrame, PVOID ContextRecord, PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine,
|
||||
PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine, PGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine,
|
||||
PTRANSLATE_ADDRESS_ROUTINE64 TranslateAddress);
|
||||
PVOID (WINAPI *dbg_SymFunctionTableAccess64)(HANDLE hProcess, DWORD64 AddrBase);
|
||||
DWORD64 (WINAPI *dbg_SymGetModuleBase64)(HANDLE hProcess, DWORD64 qwAddr);
|
||||
BOOL (WINAPI *dbg_SymFromAddrW)(HANDLE hProcess, DWORD64 Address, PDWORD64 Displacement, PSYMBOL_INFOW Symbol);
|
||||
BOOL (WINAPI *dbg_SymGetLineFromAddrW64)(HANDLE hProcess, DWORD64 dwAddr, PDWORD pdwDisplacement, PIMAGEHLP_LINEW64 Line);
|
||||
BOOL (WINAPI *dbg_SymGetModuleInfoW64)(HANDLE hProcess, DWORD64 qwAddr, PIMAGEHLP_MODULEW64 ModuleInfo);
|
||||
|
||||
*(FARPROC*)&dbg_SymSetOptions = GetProcAddress(dbghelp, "SymSetOptions");
|
||||
*(FARPROC*)&dbg_SymInitializeW = GetProcAddress(dbghelp, "SymInitializeW");
|
||||
*(FARPROC*)&dbg_StackWalk64 = GetProcAddress(dbghelp, "StackWalk64");
|
||||
*(FARPROC*)&dbg_SymFunctionTableAccess64 = GetProcAddress(dbghelp, "SymFunctionTableAccess64");
|
||||
*(FARPROC*)&dbg_SymGetModuleBase64 = GetProcAddress(dbghelp, "SymGetModuleBase64");
|
||||
*(FARPROC*)&dbg_SymFromAddrW = GetProcAddress(dbghelp, "SymFromAddrW");
|
||||
*(FARPROC*)&dbg_SymGetLineFromAddrW64 = GetProcAddress(dbghelp, "SymGetLineFromAddrW64");
|
||||
*(FARPROC*)&dbg_SymGetModuleInfoW64 = GetProcAddress(dbghelp, "SymGetModuleInfoW64");
|
||||
|
||||
if(dbg_SymSetOptions && dbg_SymInitializeW && dbg_StackWalk64 && dbg_SymFunctionTableAccess64 && dbg_SymGetModuleBase64 && dbg_SymFromAddrW && dbg_SymGetLineFromAddrW64 && dbg_SymGetModuleInfoW64)
|
||||
{
|
||||
HANDLE process = GetCurrentProcess();
|
||||
HANDLE thread = GetCurrentThread();
|
||||
CONTEXT* context = exception_ptrs->ContextRecord;
|
||||
|
||||
dbg_SymSetOptions(SYMOPT_EXACT_SYMBOLS | SYMOPT_FAIL_CRITICAL_ERRORS | SYMOPT_LOAD_LINES | SYMOPT_UNDNAME);
|
||||
if(dbg_SymInitializeW(process, L"", TRUE))
|
||||
{
|
||||
// check that raddbg.pdb file is good
|
||||
B32 raddbg_pdb_valid = 0;
|
||||
{
|
||||
IMAGEHLP_MODULEW64 module = {0};
|
||||
module.SizeOfStruct = sizeof(module);
|
||||
if(dbg_SymGetModuleInfoW64(process, (DWORD64)&win32_exception_filter, &module))
|
||||
{
|
||||
raddbg_pdb_valid = (module.SymType == SymPdb);
|
||||
}
|
||||
}
|
||||
|
||||
if(!raddbg_pdb_valid)
|
||||
{
|
||||
buflen += wnsprintfW(buffer + buflen, sizeof(buffer) - buflen,
|
||||
L"\nraddbg.pdb debug file is not valid or not found. Please rebuild binary to get call stack.\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
STACKFRAME64 frame = {0};
|
||||
DWORD image_type;
|
||||
#if defined(_M_AMD64)
|
||||
image_type = IMAGE_FILE_MACHINE_AMD64;
|
||||
frame.AddrPC.Offset = context->Rip;
|
||||
frame.AddrPC.Mode = AddrModeFlat;
|
||||
frame.AddrFrame.Offset = context->Rbp;
|
||||
frame.AddrFrame.Mode = AddrModeFlat;
|
||||
frame.AddrStack.Offset = context->Rsp;
|
||||
frame.AddrStack.Mode = AddrModeFlat;
|
||||
#elif defined(_M_ARM64)
|
||||
image_type = IMAGE_FILE_MACHINE_ARM64;
|
||||
frame.AddrPC.Offset = context->Pc;
|
||||
frame.AddrPC.Mode = AddrModeFlat;
|
||||
frame.AddrFrame.Offset = context->Fp;
|
||||
frame.AddrFrame.Mode = AddrModeFlat;
|
||||
frame.AddrStack.Offset = context->Sp;
|
||||
frame.AddrStack.Mode = AddrModeFlat;
|
||||
#else
|
||||
# error Architecture not supported!
|
||||
#endif
|
||||
|
||||
for(U32 idx=0; ;idx++)
|
||||
{
|
||||
const U32 max_frames = 32;
|
||||
if(idx == max_frames)
|
||||
{
|
||||
buflen += wnsprintfW(buffer + buflen, sizeof(buffer) - buflen, L"...");
|
||||
break;
|
||||
}
|
||||
|
||||
if(!dbg_StackWalk64(image_type, process, thread, &frame, context, 0, dbg_SymFunctionTableAccess64, dbg_SymGetModuleBase64, 0))
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
U64 address = frame.AddrPC.Offset;
|
||||
if(address == 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
if(idx==0)
|
||||
{
|
||||
buflen += wnsprintfW(buffer + buflen, sizeof(buffer) - buflen,
|
||||
L"\nPress Ctrl+C to copy this text to clipboard, then create a new issue in\n"
|
||||
L"<a href=\"%S\">%S</a>\n\n", RADDBG_GITHUB_ISSUES, RADDBG_GITHUB_ISSUES);
|
||||
buflen += wnsprintfW(buffer + buflen, sizeof(buffer) - buflen, L"Call stack:\n");
|
||||
}
|
||||
|
||||
buflen += wnsprintfW(buffer + buflen, sizeof(buffer) - buflen, L"%u. [0x%I64x]", idx, address);
|
||||
|
||||
struct {
|
||||
SYMBOL_INFOW info;
|
||||
WCHAR name[MAX_SYM_NAME];
|
||||
} symbol = {0};
|
||||
|
||||
symbol.info.SizeOfStruct = sizeof(symbol.info);
|
||||
symbol.info.MaxNameLen = MAX_SYM_NAME;
|
||||
|
||||
DWORD64 displacement = 0;
|
||||
if(dbg_SymFromAddrW(process, address, &displacement, &symbol.info))
|
||||
{
|
||||
buflen += wnsprintfW(buffer + buflen, sizeof(buffer) - buflen, L" %s +%u", symbol.info.Name, (DWORD)displacement);
|
||||
|
||||
IMAGEHLP_LINEW64 line = {0};
|
||||
line.SizeOfStruct = sizeof(line);
|
||||
|
||||
DWORD line_displacement = 0;
|
||||
if(dbg_SymGetLineFromAddrW64(process, address, &line_displacement, &line))
|
||||
{
|
||||
buflen += wnsprintfW(buffer + buflen, sizeof(buffer) - buflen, L", %s line %u", PathFindFileNameW(line.FileName), line.LineNumber);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
IMAGEHLP_MODULEW64 module = {0};
|
||||
module.SizeOfStruct = sizeof(module);
|
||||
if(dbg_SymGetModuleInfoW64(process, address, &module))
|
||||
{
|
||||
buflen += wnsprintfW(buffer + buflen, sizeof(buffer) - buflen, L" %s", module.ModuleName);
|
||||
}
|
||||
}
|
||||
|
||||
buflen += wnsprintfW(buffer + buflen, sizeof(buffer) - buflen, L"\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// remove last newline
|
||||
buffer[buflen] = 0;
|
||||
|
||||
TASKDIALOGCONFIG dialog = {0};
|
||||
dialog.cbSize = sizeof(dialog);
|
||||
dialog.dwFlags = TDF_SIZE_TO_CONTENT | TDF_ENABLE_HYPERLINKS | TDF_ALLOW_DIALOG_CANCELLATION;
|
||||
dialog.pszMainIcon = TD_ERROR_ICON;
|
||||
dialog.dwCommonButtons = TDCBF_CLOSE_BUTTON;
|
||||
dialog.pszWindowTitle = L"Fatal Exception";
|
||||
dialog.pszContent = buffer;
|
||||
dialog.pfCallback = &win32_dialog_callback;
|
||||
TaskDialogIndirect(&dialog, 0, 0, 0);
|
||||
|
||||
ExitProcess(1);
|
||||
}
|
||||
|
||||
int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
|
||||
{
|
||||
SetUnhandledExceptionFilter(&win32_exception_filter);
|
||||
|
||||
HANDLE output_handles[3] =
|
||||
{
|
||||
GetStdHandle(STD_INPUT_HANDLE),
|
||||
@@ -146,19 +338,13 @@ int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int n
|
||||
{
|
||||
String16 arg16 = str16_cstring((U16 *)argv_16[i]);
|
||||
String8 arg8 = str8_from_16(perm_arena, arg16);
|
||||
if(str8_match(arg8, str8_lit("--quiet"), StringMatchFlag_CaseInsensitive))
|
||||
{
|
||||
g_is_quiet = 1;
|
||||
}
|
||||
argv[i] = (char *)arg8.str;
|
||||
}
|
||||
__try
|
||||
{
|
||||
entry_point(argc, argv);
|
||||
}
|
||||
__except(win32_exception_filter(GetExceptionCode()))
|
||||
{
|
||||
char buffer[256] = {0};
|
||||
raddbg_snprintf(buffer, sizeof(buffer), "A fatal exception (code 0x%x) occurred. The process is terminating.", (U32)g_saved_exception_code);
|
||||
os_graphical_message(1, str8_lit("Fatal Exception"), str8_cstring(buffer));
|
||||
ExitProcess(1);
|
||||
}
|
||||
entry_point(argc, argv);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -35,6 +35,11 @@ cons_root_new(CONS_RootParams *params){
|
||||
result->scope_count += 1;
|
||||
}
|
||||
|
||||
// rjf: setup null UDT
|
||||
{
|
||||
cons__type_udt_from_any_type(result, result->nil_type);
|
||||
}
|
||||
|
||||
// initialize maps
|
||||
{
|
||||
#define BKTCOUNT(x) ((x)?(u64_up_to_pow2(x)):(128))
|
||||
|
||||
@@ -1868,7 +1868,7 @@ typedef struct CV_SymDefrangeRegister{
|
||||
|
||||
// (SymKind: DEFRANGE_FRAMEPOINTER_REL)
|
||||
typedef struct CV_SymDefrangeFramepointerRel{
|
||||
U32 off;
|
||||
S32 off;
|
||||
CV_LvarAddrRange range;
|
||||
// CV_LvarAddrGap[] gaps (rest of data)
|
||||
} CV_SymDefrangeFramepointerRel;
|
||||
@@ -1884,7 +1884,7 @@ typedef struct CV_SymDefrangeSubfieldRegister{
|
||||
|
||||
// (SymKind: DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE)
|
||||
typedef struct CV_SymDefrangeFramepointerRelFullScope{
|
||||
U32 off;
|
||||
S32 off;
|
||||
} CV_SymDefrangeFramepointerRelFullScope;
|
||||
|
||||
// (SymKind: DEFRANGE_REGISTER_REL)
|
||||
@@ -1897,7 +1897,7 @@ enum{
|
||||
typedef struct CV_SymDefrangeRegisterRel{
|
||||
CV_Reg reg;
|
||||
CV_DefrangeRegisterRelFlags flags;
|
||||
U32 reg_off;
|
||||
S32 reg_off;
|
||||
CV_LvarAddrRange range;
|
||||
// CV_LvarAddGap[] gaps (rest of data)
|
||||
} CV_SymDefrangeRegisterRel;
|
||||
|
||||
@@ -763,7 +763,13 @@ pdbconv_type_equip_members(PDBCONV_Ctx *ctx, CONS_Type *owner_type, CV_TypeId fi
|
||||
|
||||
// discard cases - we don't currently do anything with these
|
||||
case CV_LeafKind_VFUNCTAB:
|
||||
{}break;
|
||||
{
|
||||
// TODO(rjf): error if bad range
|
||||
if(list_item_off + sizeof(CV_LeafVFuncTab) <= cap)
|
||||
{
|
||||
list_item_opl_off = list_item_off + sizeof(CV_LeafVFuncTab);
|
||||
}
|
||||
}break;
|
||||
|
||||
// unhandled or invalid cases
|
||||
default:
|
||||
@@ -1310,6 +1316,7 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){
|
||||
case CV_LeafKind_STRUCTURE:
|
||||
{
|
||||
ProfBegin("CV_LeafKind_CLASS/CV_LeafKind_STRUCTURE");
|
||||
|
||||
// TODO(allen): error if bad range
|
||||
if (sizeof(CV_LeafStruct) <= cap){
|
||||
CV_LeafStruct *lf_struct = (CV_LeafStruct*)first;
|
||||
@@ -2100,7 +2107,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){
|
||||
// set location case
|
||||
CONS_Location *loc =
|
||||
pdbconv_location_from_addr_reg_off(ctx, register_code, byte_size, byte_pos,
|
||||
var_off, extra_indirection_to_value);
|
||||
(S64)(S32)var_off, extra_indirection_to_value);
|
||||
|
||||
CONS_LocationSet *locset = cons_location_set_from_local(ctx->root, local_var);
|
||||
cons_location_set_add_case(ctx->root, locset, 0, max_U64, loc);
|
||||
@@ -2268,12 +2275,11 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){
|
||||
B32 extra_indirection = 0;
|
||||
U32 byte_size = ctx->addr_size;
|
||||
U32 byte_pos = 0;
|
||||
U64 var_off = defrange_fprel->off;
|
||||
S64 var_off = (S64)defrange_fprel->off;
|
||||
CONS_Location *location =
|
||||
pdbconv_location_from_addr_reg_off(ctx, fp_register_code, byte_size, byte_pos,
|
||||
var_off, extra_indirection);
|
||||
|
||||
|
||||
// extract range info
|
||||
CV_LvarAddrRange *range = &defrange_fprel->range;
|
||||
CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_fprel + 1);
|
||||
@@ -2345,7 +2351,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){
|
||||
B32 extra_indirection = 0;
|
||||
U32 byte_size = ctx->addr_size;
|
||||
U32 byte_pos = 0;
|
||||
U64 var_off = defrange_fprel_full_scope->off;
|
||||
S64 var_off = (S64)defrange_fprel_full_scope->off;
|
||||
CONS_Location *location =
|
||||
pdbconv_location_from_addr_reg_off(ctx, fp_register_code, byte_size, byte_pos,
|
||||
var_off, extra_indirection);
|
||||
@@ -2378,7 +2384,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){
|
||||
U32 byte_pos = 0;
|
||||
|
||||
B32 extra_indirection_to_value = 0;
|
||||
U64 var_off = defrange_register_rel->reg_off;
|
||||
S64 var_off = defrange_register_rel->reg_off;
|
||||
|
||||
// setup location
|
||||
CONS_Location *location =
|
||||
@@ -2663,17 +2669,17 @@ pdbconv_known_global_insert(Arena *arena, PDBCONV_KnownGlobalSet *set, String8 n
|
||||
static CONS_Location*
|
||||
pdbconv_location_from_addr_reg_off(PDBCONV_Ctx *ctx,
|
||||
RADDBG_RegisterCode reg_code,
|
||||
U32 reg_byte_pos,
|
||||
U32 reg_byte_size,
|
||||
U64 offset,
|
||||
U32 reg_byte_pos,
|
||||
S64 offset,
|
||||
B32 extra_indirection){
|
||||
CONS_Location *result = 0;
|
||||
if (offset <= max_U16){
|
||||
if (0 <= offset && offset <= (S64)max_U16){
|
||||
if (extra_indirection){
|
||||
result = cons_location_addr_addr_reg_plus_u16(ctx->root, reg_code, offset);
|
||||
result = cons_location_addr_addr_reg_plus_u16(ctx->root, reg_code, (U16)offset);
|
||||
}
|
||||
else{
|
||||
result = cons_location_addr_reg_plus_u16(ctx->root, reg_code, offset);
|
||||
result = cons_location_addr_reg_plus_u16(ctx->root, reg_code, (U16)offset);
|
||||
}
|
||||
}
|
||||
else{
|
||||
@@ -2682,7 +2688,7 @@ pdbconv_location_from_addr_reg_off(PDBCONV_Ctx *ctx,
|
||||
CONS_EvalBytecode bytecode = {0};
|
||||
U32 regread_param = RADDBG_EncodeRegReadParam(reg_code, reg_byte_size, reg_byte_pos);
|
||||
cons_bytecode_push_op(arena, &bytecode, RADDBG_EvalOp_RegRead, regread_param);
|
||||
cons_bytecode_push_uconst(arena, &bytecode, offset);
|
||||
cons_bytecode_push_sconst(arena, &bytecode, offset);
|
||||
cons_bytecode_push_op(arena, &bytecode, RADDBG_EvalOp_Add, 0);
|
||||
if (extra_indirection){
|
||||
cons_bytecode_push_op(arena, &bytecode, RADDBG_EvalOp_MemRead, ctx->addr_size);
|
||||
|
||||
@@ -219,9 +219,9 @@ static void pdbconv_known_global_insert(Arena *arena, PDBCONV_KnownGlobalSet *se
|
||||
// location info helpers
|
||||
static CONS_Location* pdbconv_location_from_addr_reg_off(PDBCONV_Ctx *ctx,
|
||||
RADDBG_RegisterCode reg_code,
|
||||
U32 reg_byte_pos,
|
||||
U32 reg_byte_size,
|
||||
U64 offset,
|
||||
U32 reg_byte_pos,
|
||||
S64 offset,
|
||||
B32 extra_indirection);
|
||||
|
||||
static CV_EncodedFramePtrReg pdbconv_cv_encoded_fp_reg_from_proc(PDBCONV_Ctx *ctx,
|
||||
|
||||
@@ -64,17 +64,14 @@ str8_lit_comp(
|
||||
"struct Vertex2Pixel\n"
|
||||
"{\n"
|
||||
" float4 position : SV_POSITION;\n"
|
||||
" float2 rect_half_size_px : PSIZE;\n"
|
||||
" nointerpolation float2 rect_half_size_px : PSIZE;\n"
|
||||
" float2 texcoord_pct : TEX;\n"
|
||||
" float2 cornercoord_pct : COLC;\n"
|
||||
" float4 color00 : COL0;\n"
|
||||
" float4 color01 : COL1;\n"
|
||||
" float4 color10 : COL2;\n"
|
||||
" float4 color11 : COL3;\n"
|
||||
" float2 sdf_sample_pos : SDF;\n"
|
||||
" float4 tint : TINT;\n"
|
||||
" float corner_radius_px : CRAD;\n"
|
||||
" float border_thickness_px : BTHC;\n"
|
||||
" float softness_px : SFT;\n"
|
||||
" float omit_texture : OTX;\n"
|
||||
" nointerpolation float border_thickness_px : BTHC;\n"
|
||||
" nointerpolation float softness_px : SFT;\n"
|
||||
" nointerpolation float omit_texture : OTX;\n"
|
||||
"};\n"
|
||||
"\n"
|
||||
"Texture2D main_t2d : register(t0);\n"
|
||||
@@ -105,24 +102,17 @@ str8_lit_comp(
|
||||
" //- rjf: prep per-vertex arrays to sample from (p: position, t: texcoord, c: colorcoord, r: cornerradius)\n"
|
||||
" float2 dst_p_verts_px[] =\n"
|
||||
" {\n"
|
||||
" mul(xform, float3(dst_p0_px.x, dst_p1_px.y, 1)).xy * float2(1, -1) + float2(0, viewport_size_px.y),\n"
|
||||
" mul(xform, float3(dst_p0_px.x, dst_p0_px.y, 1)).xy * float2(1, -1) + float2(0, viewport_size_px.y),\n"
|
||||
" mul(xform, float3(dst_p1_px.x, dst_p1_px.y, 1)).xy * float2(1, -1) + float2(0, viewport_size_px.y),\n"
|
||||
" mul(xform, float3(dst_p1_px.x, dst_p0_px.y, 1)).xy * float2(1, -1) + float2(0, viewport_size_px.y),\n"
|
||||
" float2(dst_p0_px.x, dst_p1_px.y),\n"
|
||||
" float2(dst_p0_px.x, dst_p0_px.y),\n"
|
||||
" float2(dst_p1_px.x, dst_p1_px.y),\n"
|
||||
" float2(dst_p1_px.x, dst_p0_px.y),\n"
|
||||
" };\n"
|
||||
" float2 src_p_verts_pct[] =\n"
|
||||
" float2 src_p_verts_px[] =\n"
|
||||
" {\n"
|
||||
" float2(src_p0_px.x/texture_t2d_size_px.x, src_p1_px.y/texture_t2d_size_px.y),\n"
|
||||
" float2(src_p0_px.x/texture_t2d_size_px.x, src_p0_px.y/texture_t2d_size_px.y),\n"
|
||||
" float2(src_p1_px.x/texture_t2d_size_px.x, src_p1_px.y/texture_t2d_size_px.y),\n"
|
||||
" float2(src_p1_px.x/texture_t2d_size_px.x, src_p0_px.y/texture_t2d_size_px.y),\n"
|
||||
" };\n"
|
||||
" float2 dst_c_verts_pct[] =\n"
|
||||
" {\n"
|
||||
" float2(0, 1),\n"
|
||||
" float2(0, 0),\n"
|
||||
" float2(1, 1),\n"
|
||||
" float2(1, 0),\n"
|
||||
" float2(src_p0_px.x, src_p1_px.y),\n"
|
||||
" float2(src_p0_px.x, src_p0_px.y),\n"
|
||||
" float2(src_p1_px.x, src_p1_px.y),\n"
|
||||
" float2(src_p1_px.x, src_p0_px.y),\n"
|
||||
" };\n"
|
||||
" float dst_r_verts_px[] =\n"
|
||||
" {\n"
|
||||
@@ -131,21 +121,27 @@ str8_lit_comp(
|
||||
" cpu2vertex.corner_radii_px.w,\n"
|
||||
" cpu2vertex.corner_radii_px.z,\n"
|
||||
" };\n"
|
||||
" float4 src_color[] = {\n"
|
||||
" cpu2vertex.color01,\n"
|
||||
" cpu2vertex.color00,\n"
|
||||
" cpu2vertex.color11,\n"
|
||||
" cpu2vertex.color10,\n"
|
||||
" };\n"
|
||||
" float2 dst_verts_pct = float2((cpu2vertex.vertex_id >> 1) ? 1.f : 0.f,\n"
|
||||
" (cpu2vertex.vertex_id & 1) ? 0.f : 1.f);\n"
|
||||
" \n"
|
||||
" // rjf: fill vertex -> pixel data\n"
|
||||
" Vertex2Pixel vertex2pixel;\n"
|
||||
" {\n"
|
||||
" vertex2pixel.position.x = 2 * dst_p_verts_px[cpu2vertex.vertex_id].x / viewport_size_px.x - 1.f;\n"
|
||||
" vertex2pixel.position.y = 2 * dst_p_verts_px[cpu2vertex.vertex_id].y / viewport_size_px.y - 1.f;\n"
|
||||
" float2 xformed_pos = mul(xform, float3(dst_p_verts_px[cpu2vertex.vertex_id], 1.f)).xy;\n"
|
||||
" xformed_pos.y = viewport_size_px.y - xformed_pos.y;\n"
|
||||
" vertex2pixel.position.xy = 2.f * xformed_pos/viewport_size_px - 1.f;\n"
|
||||
" vertex2pixel.position.z = 0.f;\n"
|
||||
" vertex2pixel.position.w = 1.f;\n"
|
||||
" vertex2pixel.rect_half_size_px = dst_size_px/2 * xform_scale;\n"
|
||||
" vertex2pixel.texcoord_pct = src_p_verts_pct[cpu2vertex.vertex_id];\n"
|
||||
" vertex2pixel.cornercoord_pct = dst_c_verts_pct[cpu2vertex.vertex_id];\n"
|
||||
" vertex2pixel.color00 = cpu2vertex.color00;\n"
|
||||
" vertex2pixel.color01 = cpu2vertex.color01;\n"
|
||||
" vertex2pixel.color10 = cpu2vertex.color10;\n"
|
||||
" vertex2pixel.color11 = cpu2vertex.color11;\n"
|
||||
" vertex2pixel.rect_half_size_px = dst_size_px / 2.f * xform_scale;\n"
|
||||
" vertex2pixel.texcoord_pct = src_p_verts_px[cpu2vertex.vertex_id] / texture_t2d_size_px;\n"
|
||||
" vertex2pixel.sdf_sample_pos = (2.f * dst_verts_pct - 1.f) * vertex2pixel.rect_half_size_px;\n"
|
||||
" vertex2pixel.tint = src_color[cpu2vertex.vertex_id];\n"
|
||||
" vertex2pixel.corner_radius_px = dst_r_verts_px[cpu2vertex.vertex_id];\n"
|
||||
" vertex2pixel.border_thickness_px = border_thickness_px;\n"
|
||||
" vertex2pixel.softness_px = softness_px;\n"
|
||||
@@ -160,9 +156,7 @@ str8_lit_comp(
|
||||
"ps_main(Vertex2Pixel vertex2pixel) : SV_TARGET\n"
|
||||
"{\n"
|
||||
" // rjf: blend corner colors to produce final tint\n"
|
||||
" float4 top_color = (1-vertex2pixel.cornercoord_pct.x)*vertex2pixel.color00 + (vertex2pixel.cornercoord_pct.x)*vertex2pixel.color10;\n"
|
||||
" float4 bot_color = (1-vertex2pixel.cornercoord_pct.x)*vertex2pixel.color01 + (vertex2pixel.cornercoord_pct.x)*vertex2pixel.color11;\n"
|
||||
" float4 tint = (1-vertex2pixel.cornercoord_pct.y)*top_color + (vertex2pixel.cornercoord_pct.y)*bot_color;\n"
|
||||
" float4 tint = vertex2pixel.tint;\n"
|
||||
" \n"
|
||||
" // rjf: sample texture\n"
|
||||
" float4 albedo_sample = float4(1, 1, 1, 1);\n"
|
||||
@@ -172,8 +166,7 @@ str8_lit_comp(
|
||||
" }\n"
|
||||
" \n"
|
||||
" // rjf: determine SDF sample position\n"
|
||||
" float2 sdf_sample_pos = float2((2*vertex2pixel.cornercoord_pct.x-1)*vertex2pixel.rect_half_size_px.x,\n"
|
||||
" (2*vertex2pixel.cornercoord_pct.y-1)*vertex2pixel.rect_half_size_px.y);\n"
|
||||
" float2 sdf_sample_pos = vertex2pixel.sdf_sample_pos;\n"
|
||||
" \n"
|
||||
" // rjf: sample for corners\n"
|
||||
" float corner_sdf_s = rect_sdf(sdf_sample_pos,\n"
|
||||
@@ -190,6 +183,10 @@ str8_lit_comp(
|
||||
" {\n"
|
||||
" border_sdf_t = 1;\n"
|
||||
" }\n"
|
||||
" if(border_sdf_t < 0.001f)\n"
|
||||
" {\n"
|
||||
" discard;\n"
|
||||
" }\n"
|
||||
" \n"
|
||||
" // rjf: form+return final color\n"
|
||||
" float4 final_color = albedo_sample;\n"
|
||||
@@ -209,10 +206,14 @@ str8_lit_comp(
|
||||
"cbuffer Globals : register(b0)\n"
|
||||
"{\n"
|
||||
" float4 rect;\n"
|
||||
" float2 viewport_size;\n"
|
||||
" float blur_size;\n"
|
||||
" float is_vertical;\n"
|
||||
" float4 corner_radii_px;\n"
|
||||
" float2 direction;\n"
|
||||
" float2 viewport_size;\n"
|
||||
" uint blur_count;\n"
|
||||
"}\n"
|
||||
"\n"
|
||||
"cbuffer Kernel : register(b1)\n"
|
||||
"{\n"
|
||||
" float4 kernel[32];\n"
|
||||
"}\n"
|
||||
"\n"
|
||||
@@ -225,7 +226,8 @@ str8_lit_comp(
|
||||
"{\n"
|
||||
" float4 position : SV_POSITION;\n"
|
||||
" float2 texcoord : TEX;\n"
|
||||
" float2 cornercoord : CRN;\n"
|
||||
" float2 sdf_sample_pos : SDF;\n"
|
||||
" nointerpolation float2 rect_half_size : RHS;\n"
|
||||
" float corner_radius : RAD;\n"
|
||||
"};\n"
|
||||
"\n"
|
||||
@@ -242,12 +244,12 @@ str8_lit_comp(
|
||||
"Vertex2Pixel\n"
|
||||
"vs_main(CPU2Vertex c2v)\n"
|
||||
"{\n"
|
||||
" float4 vertex_positions__scrn[] =\n"
|
||||
" float2 vertex_positions__scrn[] =\n"
|
||||
" {\n"
|
||||
" float4(rect.x, rect.w, 0, 1) * float4(1, -1, 1, 1) + float4(0, viewport_size.y, 0, 0),\n"
|
||||
" float4(rect.x, rect.y, 0, 1) * float4(1, -1, 1, 1) + float4(0, viewport_size.y, 0, 0),\n"
|
||||
" float4(rect.z, rect.w, 0, 1) * float4(1, -1, 1, 1) + float4(0, viewport_size.y, 0, 0),\n"
|
||||
" float4(rect.z, rect.y, 0, 1) * float4(1, -1, 1, 1) + float4(0, viewport_size.y, 0, 0),\n"
|
||||
" rect.xw,\n"
|
||||
" rect.xy,\n"
|
||||
" rect.zw,\n"
|
||||
" rect.zy,\n"
|
||||
" };\n"
|
||||
" float corner_radii__px[] =\n"
|
||||
" {\n"
|
||||
@@ -256,22 +258,21 @@ str8_lit_comp(
|
||||
" corner_radii_px.w,\n"
|
||||
" corner_radii_px.z,\n"
|
||||
" };\n"
|
||||
" float2 cornercoords__pct[] =\n"
|
||||
" {\n"
|
||||
" float2(0, 1),\n"
|
||||
" float2(0, 0),\n"
|
||||
" float2(1, 1),\n"
|
||||
" float2(1, 0),\n"
|
||||
" };\n"
|
||||
" float4 vertex_position__scrn = vertex_positions__scrn[c2v.vertex_id];\n"
|
||||
" float4 vertex_position__clip = float4(2*vertex_position__scrn.x/viewport_size.x - 1,\n"
|
||||
" 2*vertex_position__scrn.y/viewport_size.y - 1,\n"
|
||||
" 0, 1);\n"
|
||||
" float2 cornercoords__pct = float2(\n"
|
||||
" (c2v.vertex_id >> 1) ? 1.f : 0.f,\n"
|
||||
" (c2v.vertex_id & 1) ? 0.f : 1.f);\n"
|
||||
" \n"
|
||||
" float2 vertex_position__pct = vertex_positions__scrn[c2v.vertex_id] / viewport_size;\n"
|
||||
" float2 vertex_position__scr = 2.f * vertex_position__pct - 1.f;\n"
|
||||
" \n"
|
||||
" float2 rect_half_size = float2((rect.z-rect.x)/2, (rect.w-rect.y)/2);\n"
|
||||
" \n"
|
||||
" Vertex2Pixel v2p;\n"
|
||||
" {\n"
|
||||
" v2p.position = vertex_position__clip;\n"
|
||||
" v2p.texcoord = float2(vertex_position__scrn.x/viewport_size.x, 1 - vertex_position__scrn.y/viewport_size.y);\n"
|
||||
" v2p.cornercoord = cornercoords__pct[c2v.vertex_id];\n"
|
||||
" v2p.position = float4(vertex_position__scr.x, -vertex_position__scr.y, 0.f, 1.f);\n"
|
||||
" v2p.texcoord = vertex_position__pct;\n"
|
||||
" v2p.sdf_sample_pos = (2.f * cornercoords__pct - 1.f) * rect_half_size;\n"
|
||||
" v2p.rect_half_size = rect_half_size - 2.f;\n"
|
||||
" v2p.corner_radius = corner_radii__px[c2v.vertex_id];\n"
|
||||
" }\n"
|
||||
" return v2p;\n"
|
||||
@@ -283,32 +284,28 @@ str8_lit_comp(
|
||||
"ps_main(Vertex2Pixel v2p) : SV_TARGET\n"
|
||||
"{\n"
|
||||
" // rjf: blend weighted texture samples into color\n"
|
||||
" float4 color = stage_t2d.Sample(stage_sampler, v2p.texcoord) * kernel[0].x;\n"
|
||||
" color.a = kernel[0].x;\n"
|
||||
" for(float i = 1; i < blur_size; i += 1)\n"
|
||||
" float3 color = kernel[0].x * stage_t2d.Sample(stage_sampler, v2p.texcoord).rgb;\n"
|
||||
" \n"
|
||||
" for(uint i = 1; i < blur_count; i += 1)\n"
|
||||
" {\n"
|
||||
" float weight = ((float[4])kernel[uint(i)/4])[uint(i)%4];\n"
|
||||
" float4 min_sample = stage_t2d.Sample(stage_sampler, v2p.texcoord - float2(!is_vertical*i/viewport_size.x, is_vertical*i/viewport_size.y));\n"
|
||||
" float4 max_sample = stage_t2d.Sample(stage_sampler, v2p.texcoord + float2(!is_vertical*i/viewport_size.x, is_vertical*i/viewport_size.y));\n"
|
||||
" min_sample.a = 1;\n"
|
||||
" max_sample.a = 1;\n"
|
||||
" color += min_sample*weight;\n"
|
||||
" color += max_sample*weight;\n"
|
||||
" float weight = kernel[i].x;\n"
|
||||
" float offset = kernel[i].y;\n"
|
||||
" color += weight * stage_t2d.Sample(stage_sampler, v2p.texcoord - offset * direction).rgb;\n"
|
||||
" color += weight * stage_t2d.Sample(stage_sampler, v2p.texcoord + offset * direction).rgb;\n"
|
||||
" }\n"
|
||||
" \n"
|
||||
" // rjf: determine SDF sample position\n"
|
||||
" float2 rect_half_size = float2((rect.z-rect.x)/2, (rect.w-rect.y)/2);\n"
|
||||
" float2 sdf_sample_pos = float2((2*v2p.cornercoord.x-1)*rect_half_size.x,\n"
|
||||
" (2*v2p.cornercoord.y-1)*rect_half_size.y);\n"
|
||||
" \n"
|
||||
" // rjf: sample for corners\n"
|
||||
" float corner_sdf_s = rect_sdf(sdf_sample_pos, rect_half_size - float2(2.f, 2.f), v2p.corner_radius);\n"
|
||||
" float corner_sdf_s = rect_sdf(v2p.sdf_sample_pos, v2p.rect_half_size, v2p.corner_radius);\n"
|
||||
" float corner_sdf_t = 1-smoothstep(0, 2, corner_sdf_s);\n"
|
||||
" \n"
|
||||
" // rjf: weight output color by sdf\n"
|
||||
" color.a *= corner_sdf_t;\n"
|
||||
" // this is doing alpha testing, leave blurring only where mostly opaque pixels are\n"
|
||||
" if (corner_sdf_t < 0.9f)\n"
|
||||
" {\n"
|
||||
" discard;\n"
|
||||
" }\n"
|
||||
" \n"
|
||||
" return color;\n"
|
||||
" return float4(color, 1.f);\n"
|
||||
"}\n"
|
||||
""
|
||||
);
|
||||
|
||||
@@ -161,10 +161,22 @@ r_init(CmdLine *cmdln)
|
||||
feature_levels, ArrayCount(feature_levels),
|
||||
D3D11_SDK_VERSION,
|
||||
&r_d3d11_state->base_device, 0, &r_d3d11_state->base_device_ctx);
|
||||
if(!SUCCEEDED(error))
|
||||
if(FAILED(error) && driver_type == D3D_DRIVER_TYPE_HARDWARE)
|
||||
{
|
||||
// try with WARP driver as backup solution in case HW device is not available
|
||||
error = D3D11CreateDevice(0,
|
||||
D3D_DRIVER_TYPE_WARP,
|
||||
0,
|
||||
creation_flags,
|
||||
feature_levels, ArrayCount(feature_levels),
|
||||
D3D11_SDK_VERSION,
|
||||
&r_d3d11_state->base_device, 0, &r_d3d11_state->base_device_ctx);
|
||||
}
|
||||
|
||||
if(FAILED(error))
|
||||
{
|
||||
char buffer[256] = {0};
|
||||
raddbg_snprintf(buffer, sizeof(buffer), "D3D11 device creation failure (%x). The process is terminating.", error);
|
||||
raddbg_snprintf(buffer, sizeof(buffer), "D3D11 device creation failure (%lx). The process is terminating.", error);
|
||||
os_graphical_message(1, str8_lit("Fatal Error"), str8_cstring(buffer));
|
||||
os_exit_process(1);
|
||||
}
|
||||
@@ -220,6 +232,15 @@ r_init(CmdLine *cmdln)
|
||||
error = r_d3d11_state->device->CreateBlendState(&desc, &r_d3d11_state->main_blend_state);
|
||||
}
|
||||
|
||||
{
|
||||
D3D11_BLEND_DESC desc = {0};
|
||||
{
|
||||
desc.RenderTarget[0].BlendEnable = FALSE;
|
||||
desc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
|
||||
}
|
||||
error = r_d3d11_state->device->CreateBlendState(&desc, &r_d3d11_state->no_blend_state);
|
||||
}
|
||||
|
||||
//- rjf: create nearest-neighbor sampler
|
||||
{
|
||||
D3D11_SAMPLER_DESC desc = zero_struct;
|
||||
@@ -307,7 +328,7 @@ r_init(CmdLine *cmdln)
|
||||
&vshad_source_blob,
|
||||
&vshad_source_errors);
|
||||
String8 errors = {0};
|
||||
if(vshad_source_errors)
|
||||
if(FAILED(error))
|
||||
{
|
||||
errors = str8((U8 *)vshad_source_errors->GetBufferPointer(),
|
||||
(U64)vshad_source_errors->GetBufferSize());
|
||||
@@ -328,6 +349,8 @@ r_init(CmdLine *cmdln)
|
||||
vshad_source_blob->GetBufferSize(),
|
||||
&ilay);
|
||||
}
|
||||
|
||||
vshad_source_blob->Release();
|
||||
|
||||
// rjf: store
|
||||
r_d3d11_state->vshads[kind] = vshad;
|
||||
@@ -359,7 +382,7 @@ r_init(CmdLine *cmdln)
|
||||
&pshad_source_blob,
|
||||
&pshad_source_errors);
|
||||
String8 errors = {0};
|
||||
if(pshad_source_errors)
|
||||
if(FAILED(error))
|
||||
{
|
||||
errors = str8((U8 *)pshad_source_errors->GetBufferPointer(),
|
||||
(U64)pshad_source_errors->GetBufferSize());
|
||||
@@ -370,6 +393,8 @@ r_init(CmdLine *cmdln)
|
||||
error = r_d3d11_state->device->CreatePixelShader(pshad_source_blob->GetBufferPointer(), pshad_source_blob->GetBufferSize(), 0, &pshad);
|
||||
}
|
||||
}
|
||||
|
||||
pshad_source_blob->Release();
|
||||
|
||||
// rjf: store
|
||||
r_d3d11_state->pshads[kind] = pshad;
|
||||
@@ -463,7 +488,14 @@ r_window_equip(OS_Handle handle)
|
||||
swapchain_desc.AlphaMode = DXGI_ALPHA_MODE_UNSPECIFIED;
|
||||
swapchain_desc.Flags = 0;
|
||||
}
|
||||
r_d3d11_state->dxgi_factory->CreateSwapChainForHwnd(r_d3d11_state->device, hwnd, &swapchain_desc, 0, 0, &window->swapchain);
|
||||
HRESULT error = r_d3d11_state->dxgi_factory->CreateSwapChainForHwnd(r_d3d11_state->device, hwnd, &swapchain_desc, 0, 0, &window->swapchain);
|
||||
if(FAILED(error))
|
||||
{
|
||||
char buffer[256] = {0};
|
||||
raddbg_snprintf(buffer, sizeof(buffer), "DXGI swap chain creation failure (%lx). The process is terminating.", error);
|
||||
os_graphical_message(1, str8_lit("Fatal Error"), str8_cstring(buffer));
|
||||
os_exit_process(1);
|
||||
}
|
||||
|
||||
//- rjf: create framebuffer & view
|
||||
window->swapchain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void **)(&window->framebuffer));
|
||||
@@ -971,7 +1003,14 @@ r_window_end_frame(OS_Handle window, R_Handle window_equip)
|
||||
////////////////////////////
|
||||
//- rjf: present
|
||||
//
|
||||
wnd->swapchain->Present(1, 0);
|
||||
HRESULT error = wnd->swapchain->Present(1, 0);
|
||||
if(FAILED(error))
|
||||
{
|
||||
char buffer[256] = {0};
|
||||
raddbg_snprintf(buffer, sizeof(buffer), "D3D11 present failure (%lx). The process is terminating.", error);
|
||||
os_graphical_message(1, str8_lit("Fatal Error"), str8_cstring(buffer));
|
||||
os_exit_process(1);
|
||||
}
|
||||
d_ctx->ClearState();
|
||||
}
|
||||
ProfEnd();
|
||||
@@ -1153,99 +1192,140 @@ r_window_submit(OS_Handle window, R_Handle window_equip, R_PassList *passes)
|
||||
case R_PassKind_Blur:
|
||||
{
|
||||
R_PassParams_Blur *params = pass->params_blur;
|
||||
ID3D11SamplerState *sampler = r_d3d11_state->samplers[R_Tex2DSampleKind_Nearest];
|
||||
ID3D11SamplerState *sampler = r_d3d11_state->samplers[R_Tex2DSampleKind_Linear];
|
||||
ID3D11VertexShader *vshad = r_d3d11_state->vshads[R_D3D11_VShadKind_Blur];
|
||||
ID3D11PixelShader *pshad = r_d3d11_state->pshads[R_D3D11_PShadKind_Blur];
|
||||
ID3D11Buffer *uniforms_buffer = r_d3d11_state->uniform_type_kind_buffers[R_D3D11_VShadKind_Blur];
|
||||
|
||||
//- rjf: perform blur on each axis
|
||||
ID3D11RenderTargetView *rtvs[Axis2_COUNT] =
|
||||
|
||||
// rjf: setup output merger
|
||||
d_ctx->OMSetDepthStencilState(r_d3d11_state->noop_depth_stencil, 0);
|
||||
d_ctx->OMSetBlendState(r_d3d11_state->no_blend_state, 0, 0xffffffff);
|
||||
|
||||
// rjf: set up viewport
|
||||
Vec2S32 resolution = wnd->last_resolution;
|
||||
D3D11_VIEWPORT viewport = { 0.0f, 0.0f, (F32)resolution.x, (F32)resolution.y, 0.0f, 1.0f };
|
||||
d_ctx->RSSetViewports(1, &viewport);
|
||||
d_ctx->RSSetState(r_d3d11_state->main_rasterizer);
|
||||
|
||||
// rjf: setup input assembly
|
||||
d_ctx->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
|
||||
d_ctx->IASetInputLayout(0);
|
||||
|
||||
// rjf: setup shaders
|
||||
d_ctx->VSSetShader(vshad, 0, 0);
|
||||
d_ctx->VSSetConstantBuffers(0, 1, &uniforms_buffer);
|
||||
d_ctx->PSSetShader(pshad, 0, 0);
|
||||
d_ctx->PSSetSamplers(0, 1, &sampler);
|
||||
|
||||
// rjf: setup scissor rect
|
||||
{
|
||||
wnd->stage_scratch_color_rtv,
|
||||
wnd->stage_color_rtv,
|
||||
};
|
||||
ID3D11ShaderResourceView *srvs[Axis2_COUNT] =
|
||||
{
|
||||
wnd->stage_color_srv,
|
||||
wnd->stage_scratch_color_srv,
|
||||
};
|
||||
for(Axis2 axis = (Axis2)0; axis < Axis2_COUNT; axis = (Axis2)(axis+1))
|
||||
{
|
||||
// rjf: setup output merger
|
||||
d_ctx->OMSetRenderTargets(1, &rtvs[axis], 0);
|
||||
d_ctx->OMSetDepthStencilState(r_d3d11_state->noop_depth_stencil, 0);
|
||||
d_ctx->OMSetBlendState(r_d3d11_state->main_blend_state, 0, 0xffffffff);
|
||||
|
||||
// rjf: set up viewport
|
||||
Vec2S32 resolution = wnd->last_resolution;
|
||||
D3D11_VIEWPORT viewport = { 0.0f, 0.0f, (F32)resolution.x, (F32)resolution.y, 0.0f, 1.0f };
|
||||
d_ctx->RSSetViewports(1, &viewport);
|
||||
d_ctx->RSSetState(r_d3d11_state->main_rasterizer);
|
||||
|
||||
// rjf: setup input assembly
|
||||
d_ctx->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
|
||||
d_ctx->IASetInputLayout(0);
|
||||
|
||||
// rjf: set up uniforms
|
||||
{
|
||||
F32 stdev = (params->blur_size-1.f)/2.f;
|
||||
F32 one_over_root_2pi_stdev2 = 1/sqrt_f32(2*pi32*stdev*stdev);
|
||||
F32 euler32 = 2.718281828459045f;
|
||||
R_D3D11_Uniforms_Blur uniforms = {0};
|
||||
uniforms.viewport_size = v2f32(resolution.x, resolution.y);
|
||||
uniforms.rect = params->rect;
|
||||
uniforms.blur_size = params->blur_size;
|
||||
uniforms.is_vertical = (F32)!!axis;
|
||||
MemoryCopyArray(uniforms.corner_radii.v, params->corner_radii);
|
||||
F32 kernel_x = 0;
|
||||
uniforms.kernel[0].v[0] = 1.f;
|
||||
if(stdev > 0.f)
|
||||
{
|
||||
for(U64 idx = 0; idx < ArrayCount(uniforms.kernel); idx += 1)
|
||||
{
|
||||
for(U64 v_idx = 0; v_idx < ArrayCount(uniforms.kernel[idx].v); v_idx += 1)
|
||||
{
|
||||
uniforms.kernel[idx].v[v_idx] = one_over_root_2pi_stdev2*pow_f32(euler32, -kernel_x*kernel_x/(2.f*stdev*stdev));
|
||||
kernel_x += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(uniforms.kernel[0].v[0] > 1.f)
|
||||
{
|
||||
MemoryZeroArray(uniforms.kernel);
|
||||
uniforms.kernel[0].v[0] = 1.f;
|
||||
}
|
||||
D3D11_MAPPED_SUBRESOURCE sub_rsrc = {0};
|
||||
r_d3d11_state->device_ctx->Map(uniforms_buffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &sub_rsrc);
|
||||
MemoryCopy((U8 *)sub_rsrc.pData, &uniforms, sizeof(uniforms));
|
||||
r_d3d11_state->device_ctx->Unmap(uniforms_buffer, 0);
|
||||
}
|
||||
|
||||
// rjf: setup shaders
|
||||
d_ctx->VSSetShader(vshad, 0, 0);
|
||||
d_ctx->VSSetConstantBuffers(0, 1, &uniforms_buffer);
|
||||
d_ctx->PSSetShader(pshad, 0, 0);
|
||||
d_ctx->PSSetConstantBuffers(0, 1, &uniforms_buffer);
|
||||
d_ctx->PSSetShaderResources(0, 1, &srvs[axis]);
|
||||
d_ctx->PSSetSamplers(0, 1, &sampler);
|
||||
|
||||
// rjf: setup scissor rect
|
||||
{
|
||||
D3D11_RECT rect = {0};
|
||||
D3D11_RECT rect = { 0 };
|
||||
rect.left = 0;
|
||||
rect.right = (LONG)wnd->last_resolution.x;
|
||||
rect.top = 0;
|
||||
rect.bottom = (LONG)wnd->last_resolution.y;
|
||||
d_ctx->RSSetScissorRects(1, &rect);
|
||||
}
|
||||
|
||||
// rjf: draw
|
||||
d_ctx->Draw(4, 0);
|
||||
|
||||
// rjf: unset srv
|
||||
ID3D11ShaderResourceView *srv = 0;
|
||||
d_ctx->PSSetShaderResources(0, 1, &srv);
|
||||
}
|
||||
|
||||
// rjf: set up uniforms
|
||||
R_D3D11_Uniforms_Blur uniforms = { 0 };
|
||||
{
|
||||
F32 weights[ArrayCount(uniforms.kernel)*2] = {0};
|
||||
|
||||
F32 blur_size = Min(params->blur_size, ArrayCount(weights));
|
||||
U64 blur_count = (U64)round_f32(blur_size);
|
||||
|
||||
F32 stdev = (blur_size-1.f)/2.f;
|
||||
F32 one_over_root_2pi_stdev2 = 1/sqrt_f32(2*pi32*stdev*stdev);
|
||||
F32 euler32 = 2.718281828459045f;
|
||||
|
||||
weights[0] = 1.f;
|
||||
if(stdev > 0.f)
|
||||
{
|
||||
for(U64 idx = 0; idx < blur_count; idx += 1)
|
||||
{
|
||||
F32 kernel_x = (F32)idx;
|
||||
weights[idx] = one_over_root_2pi_stdev2*pow_f32(euler32, -kernel_x*kernel_x/(2.f*stdev*stdev));
|
||||
}
|
||||
}
|
||||
if(weights[0] > 1.f)
|
||||
{
|
||||
MemoryZeroArray(weights);
|
||||
weights[0] = 1.f;
|
||||
}
|
||||
else
|
||||
{
|
||||
// prepare weights & offsets for bilinear lookup
|
||||
// blur filter wants to calculate w0*pixel[pos] + w1*pixel[pos+1] + ...
|
||||
// with bilinear filter we can do this calulation by doing only w*sample(pos+t) = w*((1-t)*pixel[pos] + t*pixel[pos+1])
|
||||
// we can see w0=w*(1-t) and w1=w*t
|
||||
// thus w=w0+w1 and t=w1/w
|
||||
for (U64 idx = 1; idx < blur_count; idx += 2)
|
||||
{
|
||||
F32 w0 = weights[idx + 0];
|
||||
F32 w1 = weights[idx + 1];
|
||||
F32 w = w0 + w1;
|
||||
F32 t = w1 / w;
|
||||
|
||||
// each kernel element is float2(weight, offset)
|
||||
// weights & offsets are adjusted for bilinear sampling
|
||||
// zw elements are not used, a bit of waste but it allows for simpler shader code
|
||||
uniforms.kernel[(idx+1)/2] = v4f32(w, (F32)idx + t, 0, 0);
|
||||
}
|
||||
}
|
||||
uniforms.kernel[0].x = weights[0];
|
||||
|
||||
// technically we need just direction be different
|
||||
// but there are 256 bytes of usable space anyway for each constant buffer chunk
|
||||
|
||||
uniforms.passes[Axis2_X].viewport_size = v2f32(resolution.x, resolution.y);
|
||||
uniforms.passes[Axis2_X].rect = params->rect;
|
||||
uniforms.passes[Axis2_X].direction = v2f32(1.f / resolution.x, 0);
|
||||
uniforms.passes[Axis2_X].blur_count = 1 + blur_count / 2; // 2x smaller because of bilinear sampling
|
||||
MemoryCopyArray(uniforms.passes[Axis2_X].corner_radii.v, params->corner_radii);
|
||||
|
||||
uniforms.passes[Axis2_Y].viewport_size = v2f32(resolution.x, resolution.y);
|
||||
uniforms.passes[Axis2_Y].rect = params->rect;
|
||||
uniforms.passes[Axis2_Y].direction = v2f32(0, 1.f / resolution.y);
|
||||
uniforms.passes[Axis2_Y].blur_count = 1 + blur_count / 2; // 2x smaller because of bilinear sampling
|
||||
MemoryCopyArray(uniforms.passes[Axis2_Y].corner_radii.v, params->corner_radii);
|
||||
|
||||
D3D11_MAPPED_SUBRESOURCE sub_rsrc = {0};
|
||||
r_d3d11_state->device_ctx->Map(uniforms_buffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &sub_rsrc);
|
||||
MemoryCopy((U8 *)sub_rsrc.pData, &uniforms, sizeof(uniforms));
|
||||
r_d3d11_state->device_ctx->Unmap(uniforms_buffer, 0);
|
||||
}
|
||||
|
||||
ID3D11Buffer* uniforms_buffers[] = { uniforms_buffer, uniforms_buffer };
|
||||
|
||||
U32 uniform_offset[Axis2_COUNT][2] =
|
||||
{
|
||||
{ 0 * sizeof(R_D3D11_Uniforms_BlurPass) / 16, OffsetOf(R_D3D11_Uniforms_Blur, kernel) / 16 },
|
||||
{ 1 * sizeof(R_D3D11_Uniforms_BlurPass) / 16, OffsetOf(R_D3D11_Uniforms_Blur, kernel) / 16 },
|
||||
};
|
||||
|
||||
U32 uniform_count[Axis2_COUNT][2] =
|
||||
{
|
||||
{ sizeof(R_D3D11_Uniforms_BlurPass) / 16, sizeof(uniforms.kernel) / 16 },
|
||||
{ sizeof(R_D3D11_Uniforms_BlurPass) / 16, sizeof(uniforms.kernel) / 16 },
|
||||
};
|
||||
|
||||
// rjf: for unsetting srv
|
||||
ID3D11ShaderResourceView* srv = 0;
|
||||
|
||||
// horizontal pass
|
||||
d_ctx->OMSetRenderTargets(1, &wnd->stage_scratch_color_rtv, 0);
|
||||
d_ctx->PSSetConstantBuffers1(0, ArrayCount(uniforms_buffers), uniforms_buffers, uniform_offset[Axis2_X], uniform_count[Axis2_X]);
|
||||
d_ctx->PSSetShaderResources(0, 1, &wnd->stage_color_srv);
|
||||
d_ctx->Draw(4, 0);
|
||||
d_ctx->PSSetShaderResources(0, 1, &srv);
|
||||
|
||||
// vertical pass
|
||||
d_ctx->OMSetRenderTargets(1, &wnd->stage_color_rtv, 0);
|
||||
d_ctx->PSSetConstantBuffers1(0, ArrayCount(uniforms_buffers), uniforms_buffers, uniform_offset[Axis2_Y], uniform_count[Axis2_Y]);
|
||||
d_ctx->PSSetShaderResources(0, 1, &wnd->stage_scratch_color_srv);
|
||||
d_ctx->Draw(4, 0);
|
||||
d_ctx->PSSetShaderResources(0, 1, &srv);
|
||||
}break;
|
||||
|
||||
|
||||
|
||||
@@ -32,13 +32,20 @@ struct R_D3D11_Uniforms_Rect
|
||||
Vec2F32 xform_scale;
|
||||
};
|
||||
|
||||
struct R_D3D11_Uniforms_Blur
|
||||
struct R_D3D11_Uniforms_BlurPass
|
||||
{
|
||||
Rng2F32 rect;
|
||||
Vec2F32 viewport_size;
|
||||
F32 blur_size;
|
||||
F32 is_vertical;
|
||||
Vec4F32 corner_radii;
|
||||
Vec2F32 direction;
|
||||
Vec2F32 viewport_size;
|
||||
U32 blur_count;
|
||||
U8 _padding0_[204];
|
||||
};
|
||||
StaticAssert(sizeof(R_D3D11_Uniforms_BlurPass) % 256 == 0, NotAligned); // constant count/offset must be aligned to 256 bytes
|
||||
|
||||
struct R_D3D11_Uniforms_Blur
|
||||
{
|
||||
R_D3D11_Uniforms_BlurPass passes[Axis2_COUNT];
|
||||
Vec4F32 kernel[32];
|
||||
};
|
||||
|
||||
@@ -127,6 +134,7 @@ struct R_D3D11_State
|
||||
IDXGIFactory2 *dxgi_factory;
|
||||
ID3D11RasterizerState1 *main_rasterizer;
|
||||
ID3D11BlendState *main_blend_state;
|
||||
ID3D11BlendState *no_blend_state;
|
||||
ID3D11SamplerState *samplers[R_Tex2DSampleKind_COUNT];
|
||||
ID3D11DepthStencilState *noop_depth_stencil;
|
||||
ID3D11DepthStencilState *plain_depth_stencil;
|
||||
|
||||
@@ -63,17 +63,14 @@ struct CPU2Vertex
|
||||
struct Vertex2Pixel
|
||||
{
|
||||
float4 position : SV_POSITION;
|
||||
float2 rect_half_size_px : PSIZE;
|
||||
nointerpolation float2 rect_half_size_px : PSIZE;
|
||||
float2 texcoord_pct : TEX;
|
||||
float2 cornercoord_pct : COLC;
|
||||
float4 color00 : COL0;
|
||||
float4 color01 : COL1;
|
||||
float4 color10 : COL2;
|
||||
float4 color11 : COL3;
|
||||
float2 sdf_sample_pos : SDF;
|
||||
float4 tint : TINT;
|
||||
float corner_radius_px : CRAD;
|
||||
float border_thickness_px : BTHC;
|
||||
float softness_px : SFT;
|
||||
float omit_texture : OTX;
|
||||
nointerpolation float border_thickness_px : BTHC;
|
||||
nointerpolation float softness_px : SFT;
|
||||
nointerpolation float omit_texture : OTX;
|
||||
};
|
||||
|
||||
Texture2D main_t2d : register(t0);
|
||||
@@ -104,24 +101,17 @@ vs_main(CPU2Vertex cpu2vertex)
|
||||
//- rjf: prep per-vertex arrays to sample from (p: position, t: texcoord, c: colorcoord, r: cornerradius)
|
||||
float2 dst_p_verts_px[] =
|
||||
{
|
||||
mul(xform, float3(dst_p0_px.x, dst_p1_px.y, 1)).xy * float2(1, -1) + float2(0, viewport_size_px.y),
|
||||
mul(xform, float3(dst_p0_px.x, dst_p0_px.y, 1)).xy * float2(1, -1) + float2(0, viewport_size_px.y),
|
||||
mul(xform, float3(dst_p1_px.x, dst_p1_px.y, 1)).xy * float2(1, -1) + float2(0, viewport_size_px.y),
|
||||
mul(xform, float3(dst_p1_px.x, dst_p0_px.y, 1)).xy * float2(1, -1) + float2(0, viewport_size_px.y),
|
||||
float2(dst_p0_px.x, dst_p1_px.y),
|
||||
float2(dst_p0_px.x, dst_p0_px.y),
|
||||
float2(dst_p1_px.x, dst_p1_px.y),
|
||||
float2(dst_p1_px.x, dst_p0_px.y),
|
||||
};
|
||||
float2 src_p_verts_pct[] =
|
||||
float2 src_p_verts_px[] =
|
||||
{
|
||||
float2(src_p0_px.x/texture_t2d_size_px.x, src_p1_px.y/texture_t2d_size_px.y),
|
||||
float2(src_p0_px.x/texture_t2d_size_px.x, src_p0_px.y/texture_t2d_size_px.y),
|
||||
float2(src_p1_px.x/texture_t2d_size_px.x, src_p1_px.y/texture_t2d_size_px.y),
|
||||
float2(src_p1_px.x/texture_t2d_size_px.x, src_p0_px.y/texture_t2d_size_px.y),
|
||||
};
|
||||
float2 dst_c_verts_pct[] =
|
||||
{
|
||||
float2(0, 1),
|
||||
float2(0, 0),
|
||||
float2(1, 1),
|
||||
float2(1, 0),
|
||||
float2(src_p0_px.x, src_p1_px.y),
|
||||
float2(src_p0_px.x, src_p0_px.y),
|
||||
float2(src_p1_px.x, src_p1_px.y),
|
||||
float2(src_p1_px.x, src_p0_px.y),
|
||||
};
|
||||
float dst_r_verts_px[] =
|
||||
{
|
||||
@@ -130,21 +120,27 @@ vs_main(CPU2Vertex cpu2vertex)
|
||||
cpu2vertex.corner_radii_px.w,
|
||||
cpu2vertex.corner_radii_px.z,
|
||||
};
|
||||
float4 src_color[] = {
|
||||
cpu2vertex.color01,
|
||||
cpu2vertex.color00,
|
||||
cpu2vertex.color11,
|
||||
cpu2vertex.color10,
|
||||
};
|
||||
float2 dst_verts_pct = float2((cpu2vertex.vertex_id >> 1) ? 1.f : 0.f,
|
||||
(cpu2vertex.vertex_id & 1) ? 0.f : 1.f);
|
||||
|
||||
// rjf: fill vertex -> pixel data
|
||||
Vertex2Pixel vertex2pixel;
|
||||
{
|
||||
vertex2pixel.position.x = 2 * dst_p_verts_px[cpu2vertex.vertex_id].x / viewport_size_px.x - 1.f;
|
||||
vertex2pixel.position.y = 2 * dst_p_verts_px[cpu2vertex.vertex_id].y / viewport_size_px.y - 1.f;
|
||||
float2 xformed_pos = mul(xform, float3(dst_p_verts_px[cpu2vertex.vertex_id], 1.f)).xy;
|
||||
xformed_pos.y = viewport_size_px.y - xformed_pos.y;
|
||||
vertex2pixel.position.xy = 2.f * xformed_pos/viewport_size_px - 1.f;
|
||||
vertex2pixel.position.z = 0.f;
|
||||
vertex2pixel.position.w = 1.f;
|
||||
vertex2pixel.rect_half_size_px = dst_size_px/2 * xform_scale;
|
||||
vertex2pixel.texcoord_pct = src_p_verts_pct[cpu2vertex.vertex_id];
|
||||
vertex2pixel.cornercoord_pct = dst_c_verts_pct[cpu2vertex.vertex_id];
|
||||
vertex2pixel.color00 = cpu2vertex.color00;
|
||||
vertex2pixel.color01 = cpu2vertex.color01;
|
||||
vertex2pixel.color10 = cpu2vertex.color10;
|
||||
vertex2pixel.color11 = cpu2vertex.color11;
|
||||
vertex2pixel.rect_half_size_px = dst_size_px / 2.f * xform_scale;
|
||||
vertex2pixel.texcoord_pct = src_p_verts_px[cpu2vertex.vertex_id] / texture_t2d_size_px;
|
||||
vertex2pixel.sdf_sample_pos = (2.f * dst_verts_pct - 1.f) * vertex2pixel.rect_half_size_px;
|
||||
vertex2pixel.tint = src_color[cpu2vertex.vertex_id];
|
||||
vertex2pixel.corner_radius_px = dst_r_verts_px[cpu2vertex.vertex_id];
|
||||
vertex2pixel.border_thickness_px = border_thickness_px;
|
||||
vertex2pixel.softness_px = softness_px;
|
||||
@@ -159,9 +155,7 @@ float4
|
||||
ps_main(Vertex2Pixel vertex2pixel) : SV_TARGET
|
||||
{
|
||||
// rjf: blend corner colors to produce final tint
|
||||
float4 top_color = (1-vertex2pixel.cornercoord_pct.x)*vertex2pixel.color00 + (vertex2pixel.cornercoord_pct.x)*vertex2pixel.color10;
|
||||
float4 bot_color = (1-vertex2pixel.cornercoord_pct.x)*vertex2pixel.color01 + (vertex2pixel.cornercoord_pct.x)*vertex2pixel.color11;
|
||||
float4 tint = (1-vertex2pixel.cornercoord_pct.y)*top_color + (vertex2pixel.cornercoord_pct.y)*bot_color;
|
||||
float4 tint = vertex2pixel.tint;
|
||||
|
||||
// rjf: sample texture
|
||||
float4 albedo_sample = float4(1, 1, 1, 1);
|
||||
@@ -171,8 +165,7 @@ ps_main(Vertex2Pixel vertex2pixel) : SV_TARGET
|
||||
}
|
||||
|
||||
// rjf: determine SDF sample position
|
||||
float2 sdf_sample_pos = float2((2*vertex2pixel.cornercoord_pct.x-1)*vertex2pixel.rect_half_size_px.x,
|
||||
(2*vertex2pixel.cornercoord_pct.y-1)*vertex2pixel.rect_half_size_px.y);
|
||||
float2 sdf_sample_pos = vertex2pixel.sdf_sample_pos;
|
||||
|
||||
// rjf: sample for corners
|
||||
float corner_sdf_s = rect_sdf(sdf_sample_pos,
|
||||
@@ -189,6 +182,10 @@ ps_main(Vertex2Pixel vertex2pixel) : SV_TARGET
|
||||
{
|
||||
border_sdf_t = 1;
|
||||
}
|
||||
if(border_sdf_t < 0.001f)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
|
||||
// rjf: form+return final color
|
||||
float4 final_color = albedo_sample;
|
||||
@@ -208,10 +205,14 @@ ps_main(Vertex2Pixel vertex2pixel) : SV_TARGET
|
||||
cbuffer Globals : register(b0)
|
||||
{
|
||||
float4 rect;
|
||||
float2 viewport_size;
|
||||
float blur_size;
|
||||
float is_vertical;
|
||||
float4 corner_radii_px;
|
||||
float2 direction;
|
||||
float2 viewport_size;
|
||||
uint blur_count;
|
||||
}
|
||||
|
||||
cbuffer Kernel : register(b1)
|
||||
{
|
||||
float4 kernel[32];
|
||||
}
|
||||
|
||||
@@ -224,7 +225,8 @@ struct Vertex2Pixel
|
||||
{
|
||||
float4 position : SV_POSITION;
|
||||
float2 texcoord : TEX;
|
||||
float2 cornercoord : CRN;
|
||||
float2 sdf_sample_pos : SDF;
|
||||
nointerpolation float2 rect_half_size : RHS;
|
||||
float corner_radius : RAD;
|
||||
};
|
||||
|
||||
@@ -241,12 +243,12 @@ float rect_sdf(float2 sample_pos, float2 rect_half_size, float r)
|
||||
Vertex2Pixel
|
||||
vs_main(CPU2Vertex c2v)
|
||||
{
|
||||
float4 vertex_positions__scrn[] =
|
||||
float2 vertex_positions__scrn[] =
|
||||
{
|
||||
float4(rect.x, rect.w, 0, 1) * float4(1, -1, 1, 1) + float4(0, viewport_size.y, 0, 0),
|
||||
float4(rect.x, rect.y, 0, 1) * float4(1, -1, 1, 1) + float4(0, viewport_size.y, 0, 0),
|
||||
float4(rect.z, rect.w, 0, 1) * float4(1, -1, 1, 1) + float4(0, viewport_size.y, 0, 0),
|
||||
float4(rect.z, rect.y, 0, 1) * float4(1, -1, 1, 1) + float4(0, viewport_size.y, 0, 0),
|
||||
rect.xw,
|
||||
rect.xy,
|
||||
rect.zw,
|
||||
rect.zy,
|
||||
};
|
||||
float corner_radii__px[] =
|
||||
{
|
||||
@@ -255,22 +257,21 @@ vs_main(CPU2Vertex c2v)
|
||||
corner_radii_px.w,
|
||||
corner_radii_px.z,
|
||||
};
|
||||
float2 cornercoords__pct[] =
|
||||
{
|
||||
float2(0, 1),
|
||||
float2(0, 0),
|
||||
float2(1, 1),
|
||||
float2(1, 0),
|
||||
};
|
||||
float4 vertex_position__scrn = vertex_positions__scrn[c2v.vertex_id];
|
||||
float4 vertex_position__clip = float4(2*vertex_position__scrn.x/viewport_size.x - 1,
|
||||
2*vertex_position__scrn.y/viewport_size.y - 1,
|
||||
0, 1);
|
||||
float2 cornercoords__pct = float2(
|
||||
(c2v.vertex_id >> 1) ? 1.f : 0.f,
|
||||
(c2v.vertex_id & 1) ? 0.f : 1.f);
|
||||
|
||||
float2 vertex_position__pct = vertex_positions__scrn[c2v.vertex_id] / viewport_size;
|
||||
float2 vertex_position__scr = 2.f * vertex_position__pct - 1.f;
|
||||
|
||||
float2 rect_half_size = float2((rect.z-rect.x)/2, (rect.w-rect.y)/2);
|
||||
|
||||
Vertex2Pixel v2p;
|
||||
{
|
||||
v2p.position = vertex_position__clip;
|
||||
v2p.texcoord = float2(vertex_position__scrn.x/viewport_size.x, 1 - vertex_position__scrn.y/viewport_size.y);
|
||||
v2p.cornercoord = cornercoords__pct[c2v.vertex_id];
|
||||
v2p.position = float4(vertex_position__scr.x, -vertex_position__scr.y, 0.f, 1.f);
|
||||
v2p.texcoord = vertex_position__pct;
|
||||
v2p.sdf_sample_pos = (2.f * cornercoords__pct - 1.f) * rect_half_size;
|
||||
v2p.rect_half_size = rect_half_size - 2.f;
|
||||
v2p.corner_radius = corner_radii__px[c2v.vertex_id];
|
||||
}
|
||||
return v2p;
|
||||
@@ -282,32 +283,28 @@ float4
|
||||
ps_main(Vertex2Pixel v2p) : SV_TARGET
|
||||
{
|
||||
// rjf: blend weighted texture samples into color
|
||||
float4 color = stage_t2d.Sample(stage_sampler, v2p.texcoord) * kernel[0].x;
|
||||
color.a = kernel[0].x;
|
||||
for(float i = 1; i < blur_size; i += 1)
|
||||
float3 color = kernel[0].x * stage_t2d.Sample(stage_sampler, v2p.texcoord).rgb;
|
||||
|
||||
for(uint i = 1; i < blur_count; i += 1)
|
||||
{
|
||||
float weight = ((float[4])kernel[uint(i)/4])[uint(i)%4];
|
||||
float4 min_sample = stage_t2d.Sample(stage_sampler, v2p.texcoord - float2(!is_vertical*i/viewport_size.x, is_vertical*i/viewport_size.y));
|
||||
float4 max_sample = stage_t2d.Sample(stage_sampler, v2p.texcoord + float2(!is_vertical*i/viewport_size.x, is_vertical*i/viewport_size.y));
|
||||
min_sample.a = 1;
|
||||
max_sample.a = 1;
|
||||
color += min_sample*weight;
|
||||
color += max_sample*weight;
|
||||
float weight = kernel[i].x;
|
||||
float offset = kernel[i].y;
|
||||
color += weight * stage_t2d.Sample(stage_sampler, v2p.texcoord - offset * direction).rgb;
|
||||
color += weight * stage_t2d.Sample(stage_sampler, v2p.texcoord + offset * direction).rgb;
|
||||
}
|
||||
|
||||
// rjf: determine SDF sample position
|
||||
float2 rect_half_size = float2((rect.z-rect.x)/2, (rect.w-rect.y)/2);
|
||||
float2 sdf_sample_pos = float2((2*v2p.cornercoord.x-1)*rect_half_size.x,
|
||||
(2*v2p.cornercoord.y-1)*rect_half_size.y);
|
||||
|
||||
// rjf: sample for corners
|
||||
float corner_sdf_s = rect_sdf(sdf_sample_pos, rect_half_size - float2(2.f, 2.f), v2p.corner_radius);
|
||||
float corner_sdf_s = rect_sdf(v2p.sdf_sample_pos, v2p.rect_half_size, v2p.corner_radius);
|
||||
float corner_sdf_t = 1-smoothstep(0, 2, corner_sdf_s);
|
||||
|
||||
// rjf: weight output color by sdf
|
||||
color.a *= corner_sdf_t;
|
||||
// this is doing alpha testing, leave blurring only where mostly opaque pixels are
|
||||
if (corner_sdf_t < 0.9f)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
|
||||
return color;
|
||||
return float4(color, 1.f);
|
||||
}
|
||||
"""
|
||||
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
#include <fstream>
|
||||
|
||||
namespace SomeWeirdNamespace
|
||||
{
|
||||
int X = 0;
|
||||
int Y = 0;
|
||||
void Foo(void)
|
||||
{
|
||||
X = 123;
|
||||
Y = 456;
|
||||
int x = 0;
|
||||
}
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
std::fstream temp;
|
||||
SomeWeirdNamespace::Foo();
|
||||
return 0;
|
||||
}
|
||||
@@ -1,49 +1,17 @@
|
||||
// Copyright (c) 2024 Epic Games Tools
|
||||
// Licensed under the MIT license (https://opensource.org/license/mit/)
|
||||
|
||||
// build with:
|
||||
// cl /Zi /nologo look_at_raddbg.c
|
||||
|
||||
#include <windows.h>
|
||||
#include <stdint.h>
|
||||
#include "raddbg_format/raddbg_format.h"
|
||||
#include "raddbg_format/raddbg_format_parse.h"
|
||||
#include "raddbg_format/raddbg_format.c"
|
||||
#include "raddbg_format/raddbg_format_parse.c"
|
||||
|
||||
typedef struct Foo Foo;
|
||||
struct Foo
|
||||
int Foo(int x, int y)
|
||||
{
|
||||
int x;
|
||||
int y;
|
||||
int z;
|
||||
};
|
||||
return x + y;
|
||||
}
|
||||
|
||||
int main(int argument_count, char **arguments)
|
||||
int main(void)
|
||||
{
|
||||
Foo foo = {123, 456, 789};
|
||||
HANDLE file = CreateFileA(arguments[1], GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
|
||||
DWORD size_hi32 = 0;
|
||||
DWORD size_lo32 = GetFileSize(file, &size_hi32);
|
||||
HANDLE map = CreateFileMappingA(file, 0, PAGE_READONLY, 0, 0, 0);
|
||||
uint64_t data_size = (size_lo32 | ((uint64_t)size_hi32 << 32));
|
||||
uint8_t *data = (uint8_t *)MapViewOfFile(map, FILE_MAP_READ, 0, 0, data_size);
|
||||
RADDBG_Parsed rdbg = {0};
|
||||
RADDBG_ParseStatus parse_status = raddbg_parse(data, data_size, &rdbg);
|
||||
uint64_t foo_count = 0;
|
||||
for(uint64_t idx = 0; idx < rdbg.type_node_count; idx += 1)
|
||||
{
|
||||
RADDBG_TypeNode *type_node = &rdbg.type_nodes[idx];
|
||||
if(RADDBG_TypeKind_FirstUserDefined <= type_node->kind && type_node->kind <= RADDBG_TypeKind_LastUserDefined)
|
||||
{
|
||||
uint64_t name_size = 0;
|
||||
uint8_t *name = raddbg_string_from_idx(&rdbg, type_node->user_defined.name_string_idx, &name_size);
|
||||
if(name_size == 3 && name[0] == 'f' && name[1] == 'o' && name[2] == 'o')
|
||||
{
|
||||
foo_count += 1;
|
||||
}
|
||||
}
|
||||
int x = 23;
|
||||
int y = 45;
|
||||
Foo(x, y);
|
||||
}
|
||||
printf("%s -> %I64u foos\n", arguments[1], foo_count);
|
||||
return 0;
|
||||
}
|
||||
|
||||
+177
-149
@@ -923,6 +923,15 @@ txti_append(TXTI_Handle handle, String8 string)
|
||||
os_condition_variable_broadcast(mut_thread->msg_cv);
|
||||
}
|
||||
|
||||
//- rjf: buffer external change detection enabling/disabling
|
||||
|
||||
internal void
|
||||
txti_set_external_change_detection_enabled(B32 enabled)
|
||||
{
|
||||
U64 enabled_u64 = (U64)enabled;
|
||||
ins_atomic_u64_eval_assign(&txti_state->detector_thread_enabled, enabled_u64);
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Mutator Threads
|
||||
|
||||
@@ -967,17 +976,23 @@ txti_mut_thread_entry_point(void *p)
|
||||
TXTI_Stripe *stripe = &txti_state->entity_map_stripes.v[stripe_idx];
|
||||
|
||||
//- rjf: load file if we need it
|
||||
B32 load_valid = 0;
|
||||
String8 file_contents = {0};
|
||||
TXTI_LangKind lang_kind = TXTI_LangKind_Null;
|
||||
U64 timestamp = 0;
|
||||
if(msg->kind == TXTI_MsgKind_Reload)
|
||||
{
|
||||
OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_Shared, msg->string);
|
||||
FileProperties props = os_properties_from_file(file);
|
||||
timestamp = props.modified;
|
||||
file_contents = os_string_from_file_range(scratch.arena, file, r1u64(0, props.size));
|
||||
FileProperties pre_load_props = os_properties_from_file_path(msg->string);
|
||||
OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead|OS_AccessFlag_ShareWrite, msg->string);
|
||||
file_contents = os_string_from_file_range(scratch.arena, file, r1u64(0, pre_load_props.size));
|
||||
lang_kind = txti_lang_kind_from_extension(str8_skip_last_dot(msg->string));
|
||||
os_file_close(file);
|
||||
FileProperties post_load_props = os_properties_from_file_path(msg->string);
|
||||
load_valid = (post_load_props.modified == pre_load_props.modified);
|
||||
if(load_valid)
|
||||
{
|
||||
timestamp = pre_load_props.modified;
|
||||
}
|
||||
}
|
||||
|
||||
//- rjf: nonzero lang kind -> unpack lang info
|
||||
@@ -994,6 +1009,7 @@ txti_mut_thread_entry_point(void *p)
|
||||
|
||||
//- rjf: detect line end kind
|
||||
TXTI_LineEndKind line_end_kind = TXTI_LineEndKind_Null;
|
||||
if(load_valid)
|
||||
{
|
||||
U64 lf_count = 0;
|
||||
U64 cr_count = 0;
|
||||
@@ -1020,7 +1036,7 @@ txti_mut_thread_entry_point(void *p)
|
||||
|
||||
//- rjf: obtain initial buffer_apply_gen, reset byte processing counters
|
||||
U64 initial_buffer_apply_gen = 0;
|
||||
OS_MutexScopeR(stripe->rw_mutex)
|
||||
if(load_valid) OS_MutexScopeR(stripe->rw_mutex)
|
||||
{
|
||||
TXTI_Entity *entity = 0;
|
||||
for(TXTI_Entity *e = slot->first; e != 0; e = e->next)
|
||||
@@ -1043,16 +1059,55 @@ txti_mut_thread_entry_point(void *p)
|
||||
}
|
||||
|
||||
//- rjf: apply edits
|
||||
for(U64 buffer_apply_idx = 0;
|
||||
buffer_apply_idx < TXTI_ENTITY_BUFFER_COUNT;
|
||||
buffer_apply_idx += 1)
|
||||
{
|
||||
// rjf: last buffer we're going to edit? -> bump buffer_apply_gen,
|
||||
// so that before we touch this last buffer, all readers of this
|
||||
// entity will get the already-modified buffers.
|
||||
if(buffer_apply_idx == TXTI_ENTITY_BUFFER_COUNT-1)
|
||||
for(U64 buffer_apply_idx = 0;
|
||||
buffer_apply_idx < TXTI_ENTITY_BUFFER_COUNT;
|
||||
buffer_apply_idx += 1)
|
||||
{
|
||||
OS_MutexScopeW(stripe->rw_mutex)
|
||||
// rjf: last buffer we're going to edit? -> bump buffer_apply_gen,
|
||||
// so that before we touch this last buffer, all readers of this
|
||||
// entity will get the already-modified buffers.
|
||||
if(buffer_apply_idx == TXTI_ENTITY_BUFFER_COUNT-1)
|
||||
{
|
||||
OS_MutexScopeW(stripe->rw_mutex)
|
||||
{
|
||||
TXTI_Entity *entity = 0;
|
||||
for(TXTI_Entity *e = slot->first; e != 0; e = e->next)
|
||||
{
|
||||
if(e->id == id)
|
||||
{
|
||||
entity = e;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(entity != 0)
|
||||
{
|
||||
entity->buffer_apply_gen += 1;
|
||||
if(line_end_kind != TXTI_LineEndKind_Null)
|
||||
{
|
||||
entity->line_end_kind = line_end_kind;
|
||||
}
|
||||
if(lang_kind != TXTI_LangKind_Null)
|
||||
{
|
||||
entity->lang_kind = lang_kind;
|
||||
}
|
||||
if(timestamp != 0)
|
||||
{
|
||||
entity->timestamp = timestamp;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// rjf: apply edit to this buffer.
|
||||
//
|
||||
// NOTE(rjf): all edits can apply *with a shared mutex lock*,
|
||||
// because only the mutator thread for this buffer can touch the
|
||||
// non-currently-viewable buffers. we only need to have an
|
||||
// exclusive lock to bump the buffer_apply_gen (to change the
|
||||
// actively viewable buffer).
|
||||
//
|
||||
OS_MutexScopeR(stripe->rw_mutex)
|
||||
{
|
||||
TXTI_Entity *entity = 0;
|
||||
for(TXTI_Entity *e = slot->first; e != 0; e = e->next)
|
||||
@@ -1065,140 +1120,110 @@ txti_mut_thread_entry_point(void *p)
|
||||
}
|
||||
if(entity != 0)
|
||||
{
|
||||
entity->buffer_apply_gen += 1;
|
||||
if(line_end_kind != TXTI_LineEndKind_Null)
|
||||
{
|
||||
entity->line_end_kind = line_end_kind;
|
||||
}
|
||||
if(lang_kind != TXTI_LangKind_Null)
|
||||
{
|
||||
entity->lang_kind = lang_kind;
|
||||
}
|
||||
if(timestamp != 0)
|
||||
{
|
||||
entity->timestamp = timestamp;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// rjf: apply edit to this buffer.
|
||||
//
|
||||
// NOTE(rjf): all edits can apply *with a shared mutex lock*,
|
||||
// because only the mutator thread for this buffer can touch the
|
||||
// non-currently-viewable buffers. we only need to have an
|
||||
// exclusive lock to bump the buffer_apply_gen (to change the
|
||||
// actively viewable buffer).
|
||||
//
|
||||
OS_MutexScopeR(stripe->rw_mutex)
|
||||
{
|
||||
TXTI_Entity *entity = 0;
|
||||
for(TXTI_Entity *e = slot->first; e != 0; e = e->next)
|
||||
{
|
||||
if(e->id == id)
|
||||
{
|
||||
entity = e;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(entity != 0)
|
||||
{
|
||||
TXTI_Buffer *buffer = &entity->buffers[(initial_buffer_apply_gen+1+buffer_apply_idx)%TXTI_ENTITY_BUFFER_COUNT];
|
||||
|
||||
// rjf: clear old analysis data
|
||||
arena_clear(buffer->analysis_arena);
|
||||
buffer->lines_count = 0;
|
||||
buffer->lines_ranges = 0;
|
||||
buffer->lines_max_size = 0;
|
||||
MemoryZeroStruct(&buffer->tokens);
|
||||
|
||||
// rjf: perform edit to buffer data
|
||||
switch(msg->kind)
|
||||
{
|
||||
default:{}break;
|
||||
TXTI_Buffer *buffer = &entity->buffers[(initial_buffer_apply_gen+1+buffer_apply_idx)%TXTI_ENTITY_BUFFER_COUNT];
|
||||
|
||||
// rjf: replace range
|
||||
case TXTI_MsgKind_Append: ProfScope("append")
|
||||
{
|
||||
U8 *append_data_buffer = push_array_no_zero(buffer->data_arena, U8, msg->string.size);
|
||||
MemoryCopy(append_data_buffer, msg->string.str, msg->string.size);
|
||||
buffer->data.size += msg->string.size;
|
||||
if(buffer->data.str == 0)
|
||||
{
|
||||
buffer->data.str = append_data_buffer;
|
||||
}
|
||||
}break;
|
||||
// rjf: clear old analysis data
|
||||
arena_clear(buffer->analysis_arena);
|
||||
buffer->lines_count = 0;
|
||||
buffer->lines_ranges = 0;
|
||||
buffer->lines_max_size = 0;
|
||||
MemoryZeroStruct(&buffer->tokens);
|
||||
|
||||
// rjf: reload from disk
|
||||
case TXTI_MsgKind_Reload: ProfScope("reload")
|
||||
// rjf: perform edit to buffer data
|
||||
switch(msg->kind)
|
||||
{
|
||||
arena_clear(buffer->data_arena);
|
||||
buffer->data = push_str8_copy(buffer->data_arena, file_contents);
|
||||
}break;
|
||||
}
|
||||
|
||||
// rjf: parse & store line range info
|
||||
{
|
||||
// rjf: count # of lines
|
||||
U64 line_count = 1;
|
||||
U64 byte_process_start_idx = 0;
|
||||
for(U64 idx = 0; idx < buffer->data.size; idx += 1)
|
||||
{
|
||||
if(buffer_apply_idx == 0 && idx-byte_process_start_idx >= 1000)
|
||||
default:{}break;
|
||||
|
||||
// rjf: replace range
|
||||
case TXTI_MsgKind_Append: ProfScope("append")
|
||||
{
|
||||
ins_atomic_u64_add_eval(&entity->bytes_processed, (idx-byte_process_start_idx));
|
||||
byte_process_start_idx = idx;
|
||||
}
|
||||
if(buffer->data.str[idx] == '\n' || buffer->data.str[idx] == '\r')
|
||||
{
|
||||
line_count += 1;
|
||||
if(buffer->data.str[idx] == '\r')
|
||||
U8 *append_data_buffer = push_array_no_zero(buffer->data_arena, U8, msg->string.size);
|
||||
MemoryCopy(append_data_buffer, msg->string.str, msg->string.size);
|
||||
buffer->data.size += msg->string.size;
|
||||
if(buffer->data.str == 0 && msg->string.size != 0)
|
||||
{
|
||||
idx += 1;
|
||||
buffer->data.str = append_data_buffer;
|
||||
}
|
||||
}break;
|
||||
|
||||
// rjf: reload from disk
|
||||
case TXTI_MsgKind_Reload: ProfScope("reload")
|
||||
{
|
||||
arena_clear(buffer->data_arena);
|
||||
if(file_contents.size != 0)
|
||||
{
|
||||
buffer->data = push_str8_copy(buffer->data_arena, file_contents);
|
||||
}
|
||||
else
|
||||
{
|
||||
MemoryZeroStruct(&buffer->data);
|
||||
}
|
||||
}break;
|
||||
}
|
||||
|
||||
// rjf: parse & store line range info
|
||||
{
|
||||
// rjf: count # of lines
|
||||
U64 line_count = 1;
|
||||
U64 byte_process_start_idx = 0;
|
||||
for(U64 idx = 0; idx < buffer->data.size; idx += 1)
|
||||
{
|
||||
if(buffer_apply_idx == 0 && idx-byte_process_start_idx >= 1000)
|
||||
{
|
||||
ins_atomic_u64_add_eval(&entity->bytes_processed, (idx-byte_process_start_idx));
|
||||
byte_process_start_idx = idx;
|
||||
}
|
||||
if(buffer->data.str[idx] == '\n' || buffer->data.str[idx] == '\r')
|
||||
{
|
||||
line_count += 1;
|
||||
if(buffer->data.str[idx] == '\r')
|
||||
{
|
||||
idx += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// rjf: allocate & store line ranges
|
||||
buffer->lines_count = line_count;
|
||||
buffer->lines_ranges = push_array_no_zero(buffer->analysis_arena, Rng1U64, buffer->lines_count);
|
||||
U64 line_idx = 0;
|
||||
U64 line_start_idx = 0;
|
||||
for(U64 idx = 0; idx <= buffer->data.size; idx += 1)
|
||||
{
|
||||
if(idx == buffer->data.size || buffer->data.str[idx] == '\n' || buffer->data.str[idx] == '\r')
|
||||
{
|
||||
Rng1U64 line_range = r1u64(line_start_idx, idx);
|
||||
U64 line_size = dim_1u64(line_range);
|
||||
buffer->lines_ranges[line_idx] = line_range;
|
||||
buffer->lines_max_size = Max(buffer->lines_max_size, line_size);
|
||||
line_idx += 1;
|
||||
line_start_idx = idx+1;
|
||||
if(idx < buffer->data.size && buffer->data.str[idx] == '\r')
|
||||
{
|
||||
line_start_idx += 1;
|
||||
idx += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// rjf: allocate & store line ranges
|
||||
buffer->lines_count = line_count;
|
||||
buffer->lines_ranges = push_array_no_zero(buffer->analysis_arena, Rng1U64, buffer->lines_count);
|
||||
U64 line_idx = 0;
|
||||
U64 line_start_idx = 0;
|
||||
for(U64 idx = 0; idx <= buffer->data.size; idx += 1)
|
||||
// rjf: lex file contents
|
||||
if(lex_function != 0)
|
||||
{
|
||||
if(idx == buffer->data.size || buffer->data.str[idx] == '\n' || buffer->data.str[idx] == '\r')
|
||||
{
|
||||
Rng1U64 line_range = r1u64(line_start_idx, idx);
|
||||
U64 line_size = dim_1u64(line_range);
|
||||
buffer->lines_ranges[line_idx] = line_range;
|
||||
buffer->lines_max_size = Max(buffer->lines_max_size, line_size);
|
||||
line_idx += 1;
|
||||
line_start_idx = idx+1;
|
||||
if(idx < buffer->data.size && buffer->data.str[idx] == '\r')
|
||||
{
|
||||
line_start_idx += 1;
|
||||
idx += 1;
|
||||
}
|
||||
}
|
||||
buffer->tokens = lex_function(buffer->analysis_arena, buffer_apply_idx == 0 ? &entity->bytes_processed : 0, buffer->data);
|
||||
}
|
||||
|
||||
// rjf: mark final process counter
|
||||
if(buffer_apply_idx == 0)
|
||||
{
|
||||
ins_atomic_u64_eval_assign(&entity->bytes_processed, entity->bytes_to_process);
|
||||
}
|
||||
|
||||
// rjf: mark task completion
|
||||
if(buffer_apply_idx == TXTI_ENTITY_BUFFER_COUNT-1)
|
||||
{
|
||||
ins_atomic_u64_eval_assign(&entity->working_count, 0);
|
||||
}
|
||||
}
|
||||
|
||||
// rjf: lex file contents
|
||||
if(lex_function != 0)
|
||||
{
|
||||
buffer->tokens = lex_function(buffer->analysis_arena, buffer_apply_idx == 0 ? &entity->bytes_processed : 0, buffer->data);
|
||||
}
|
||||
|
||||
// rjf: mark final process counter
|
||||
if(buffer_apply_idx == 0)
|
||||
{
|
||||
ins_atomic_u64_eval_assign(&entity->bytes_processed, entity->bytes_to_process);
|
||||
}
|
||||
|
||||
// rjf: mark task completion
|
||||
if(buffer_apply_idx == TXTI_ENTITY_BUFFER_COUNT-1)
|
||||
{
|
||||
ins_atomic_u64_eval_assign(&entity->working_count, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1221,23 +1246,26 @@ txti_detector_thread_entry_point(void *p)
|
||||
ProfThreadName("[txti] detector");
|
||||
for(;;)
|
||||
{
|
||||
U64 slots_per_stripe = txti_state->entity_map.slots_count/txti_state->entity_map_stripes.count;
|
||||
for(U64 stripe_idx = 0; stripe_idx < txti_state->entity_map_stripes.count; stripe_idx += 1)
|
||||
if(ins_atomic_u64_eval(&txti_state->detector_thread_enabled))
|
||||
{
|
||||
TXTI_Stripe *stripe = &txti_state->entity_map_stripes.v[stripe_idx];
|
||||
OS_MutexScopeR(stripe->rw_mutex) for(U64 slot_in_stripe_idx = 0; slot_in_stripe_idx < slots_per_stripe; slot_in_stripe_idx += 1)
|
||||
U64 slots_per_stripe = txti_state->entity_map.slots_count/txti_state->entity_map_stripes.count;
|
||||
for(U64 stripe_idx = 0; stripe_idx < txti_state->entity_map_stripes.count; stripe_idx += 1)
|
||||
{
|
||||
U64 slot_idx = stripe_idx*slots_per_stripe + slot_in_stripe_idx;
|
||||
TXTI_EntitySlot *slot = &txti_state->entity_map.slots[slot_idx];
|
||||
for(TXTI_Entity *entity = slot->first; entity != 0; entity = entity->next)
|
||||
TXTI_Stripe *stripe = &txti_state->entity_map_stripes.v[stripe_idx];
|
||||
OS_MutexScopeR(stripe->rw_mutex) for(U64 slot_in_stripe_idx = 0; slot_in_stripe_idx < slots_per_stripe; slot_in_stripe_idx += 1)
|
||||
{
|
||||
FileProperties props = os_properties_from_file_path(entity->path);
|
||||
U64 entity_timestamp = entity->timestamp;
|
||||
if(props.modified != entity_timestamp && ins_atomic_u64_eval(&entity->working_count) == 0)
|
||||
U64 slot_idx = stripe_idx*slots_per_stripe + slot_in_stripe_idx;
|
||||
TXTI_EntitySlot *slot = &txti_state->entity_map.slots[slot_idx];
|
||||
for(TXTI_Entity *entity = slot->first; entity != 0; entity = entity->next)
|
||||
{
|
||||
TXTI_Handle handle = {txti_hash_from_string(entity->path), entity->id};
|
||||
txti_reload(handle, entity->path);
|
||||
ins_atomic_u64_inc_eval(&entity->working_count);
|
||||
FileProperties props = os_properties_from_file_path(entity->path);
|
||||
U64 entity_timestamp = entity->timestamp;
|
||||
if(props.modified != entity_timestamp && ins_atomic_u64_eval(&entity->working_count) == 0)
|
||||
{
|
||||
TXTI_Handle handle = {txti_hash_from_string(entity->path), entity->id};
|
||||
txti_reload(handle, entity->path);
|
||||
ins_atomic_u64_inc_eval(&entity->working_count);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -322,6 +322,7 @@ struct TXTI_State
|
||||
TXTI_MutThread *mut_threads;
|
||||
|
||||
// rjf: detector thread
|
||||
U64 detector_thread_enabled;
|
||||
OS_Handle detector_thread;
|
||||
};
|
||||
|
||||
@@ -379,6 +380,9 @@ internal TxtRng txti_expr_range_from_handle_pt(TXTI_Handle handle, TxtPt pt);
|
||||
internal void txti_reload(TXTI_Handle handle, String8 path);
|
||||
internal void txti_append(TXTI_Handle handle, String8 string);
|
||||
|
||||
//- rjf: buffer external change detection enabling/disabling
|
||||
internal void txti_set_external_change_detection_enabled(B32 enabled);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Mutator Threads
|
||||
|
||||
|
||||
+102
-21
@@ -15,6 +15,41 @@ tg_hash_from_string(U64 seed, String8 string)
|
||||
return result;
|
||||
}
|
||||
|
||||
internal int
|
||||
tg_qsort_compare_members_offset(TG_Member *a, TG_Member *b)
|
||||
{
|
||||
int result = 0;
|
||||
if(a->off < b->off)
|
||||
{
|
||||
result = -1;
|
||||
}
|
||||
else if(a->off > b->off)
|
||||
{
|
||||
result = +1;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
internal void
|
||||
tg_key_list_push(Arena *arena, TG_KeyList *list, TG_Key key)
|
||||
{
|
||||
TG_KeyNode *n = push_array(arena, TG_KeyNode, 1);
|
||||
n->v = key;
|
||||
SLLQueuePush(list->first, list->last, n);
|
||||
list->count += 1;
|
||||
}
|
||||
|
||||
internal TG_KeyList
|
||||
tg_key_list_copy(Arena *arena, TG_KeyList *src)
|
||||
{
|
||||
TG_KeyList dst = {0};
|
||||
for(TG_KeyNode *n = src->first; n != 0; n = n->next)
|
||||
{
|
||||
tg_key_list_push(arena, &dst, n->v);
|
||||
}
|
||||
return dst;
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: RADDBG <-> TG Enum Conversions
|
||||
|
||||
@@ -742,7 +777,7 @@ tg_type_from_graph_raddbg_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg
|
||||
|
||||
// rjf: commit members
|
||||
type->count = members.count;
|
||||
type->members = push_array_no_zero(arena, TG_Member, 1);
|
||||
type->members = push_array_no_zero(arena, TG_Member, members.count);
|
||||
U64 idx = 0;
|
||||
for(TG_MemberNode *n = members.first; n != 0; n = n->next, idx += 1)
|
||||
{
|
||||
@@ -775,6 +810,15 @@ tg_direct_from_graph_raddbg_key(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key
|
||||
return result;
|
||||
}
|
||||
|
||||
internal TG_Key
|
||||
tg_unwrapped_direct_from_graph_raddbg_key(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key)
|
||||
{
|
||||
key = tg_unwrapped_from_graph_raddbg_key(graph, rdbg, key);
|
||||
key = tg_direct_from_graph_raddbg_key(graph, rdbg, key);
|
||||
key = tg_unwrapped_from_graph_raddbg_key(graph, rdbg, key);
|
||||
return key;
|
||||
}
|
||||
|
||||
internal TG_Key
|
||||
tg_owner_from_graph_raddbg_key(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key)
|
||||
{
|
||||
@@ -912,36 +956,73 @@ tg_members_from_graph_raddbg_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *r
|
||||
internal TG_MemberArray
|
||||
tg_data_members_from_graph_raddbg_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key)
|
||||
{
|
||||
TG_MemberArray result = {0};
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
TG_MemberList members_list = {0};
|
||||
B32 members_need_offset_sort = 0;
|
||||
{
|
||||
TG_Type *type = tg_type_from_graph_raddbg_key(scratch.arena, graph, rdbg, key);
|
||||
if(type->members != 0)
|
||||
TG_Type *root_type = tg_type_from_graph_raddbg_key(scratch.arena, graph, rdbg, key);
|
||||
typedef struct Task Task;
|
||||
struct Task
|
||||
{
|
||||
U64 data_member_count = 0;
|
||||
for(U64 member_idx = 0; member_idx < type->count; member_idx += 1)
|
||||
Task *next;
|
||||
U64 base_off;
|
||||
TG_KeyList inheritance_chain;
|
||||
TG_Key type_key;
|
||||
TG_Type *type;
|
||||
};
|
||||
Task start_task = {0, 0, {0}, key, root_type};
|
||||
Task *first_task = &start_task;
|
||||
Task *last_task = &start_task;
|
||||
for(Task *task = first_task; task != 0; task = task->next)
|
||||
{
|
||||
TG_Type *type = task->type;
|
||||
if(type->members != 0)
|
||||
{
|
||||
if(type->members[member_idx].kind == TG_MemberKind_DataField)
|
||||
for(U64 member_idx = 0; member_idx < type->count; member_idx += 1)
|
||||
{
|
||||
data_member_count += 1;
|
||||
}
|
||||
}
|
||||
result.count = data_member_count;
|
||||
result.v = push_array_no_zero(arena, TG_Member, result.count);
|
||||
U64 idx = 0;
|
||||
for(U64 member_idx = 0; member_idx < type->count; member_idx += 1)
|
||||
{
|
||||
if(type->members[member_idx].kind == TG_MemberKind_DataField)
|
||||
{
|
||||
MemoryCopyStruct(&result.v[idx], &type->members[member_idx]);
|
||||
result.v[idx].name = push_str8_copy(arena, result.v[idx].name);
|
||||
idx += 1;
|
||||
if(type->members[member_idx].kind == TG_MemberKind_DataField)
|
||||
{
|
||||
TG_MemberNode *n = push_array(scratch.arena, TG_MemberNode, 1);
|
||||
MemoryCopyStruct(&n->v, &type->members[member_idx]);
|
||||
n->v.off += task->base_off;
|
||||
n->v.inheritance_key_chain = task->inheritance_chain;
|
||||
SLLQueuePush(members_list.first, members_list.last, n);
|
||||
members_list.count += 1;
|
||||
}
|
||||
else if(type->members[member_idx].kind == TG_MemberKind_Base)
|
||||
{
|
||||
Task *t = push_array(scratch.arena, Task, 1);
|
||||
t->base_off = type->members[member_idx].off + task->base_off;
|
||||
t->inheritance_chain = tg_key_list_copy(scratch.arena, &task->inheritance_chain);
|
||||
tg_key_list_push(scratch.arena, &t->inheritance_chain, type->members[member_idx].type_key);
|
||||
t->type_key = type->members[member_idx].type_key;
|
||||
t->type = tg_type_from_graph_raddbg_key(scratch.arena, graph, rdbg, type->members[member_idx].type_key);
|
||||
SLLQueuePush(first_task, last_task, t);
|
||||
members_need_offset_sort = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
TG_MemberArray members = {0};
|
||||
{
|
||||
members.count = members_list.count;
|
||||
members.v = push_array(arena, TG_Member, members.count);
|
||||
U64 idx = 0;
|
||||
for(TG_MemberNode *n = members_list.first; n != 0; n = n->next)
|
||||
{
|
||||
MemoryCopyStruct(&members.v[idx], &n->v);
|
||||
members.v[idx].name = push_str8_copy(arena, members.v[idx].name);
|
||||
members.v[idx].inheritance_key_chain = tg_key_list_copy(arena, &members.v[idx].inheritance_key_chain);
|
||||
idx += 1;
|
||||
}
|
||||
}
|
||||
if(members_need_offset_sort)
|
||||
{
|
||||
qsort(members.v, members.count, sizeof(TG_Member), (int (*)(const void *, const void *))tg_qsort_compare_members_offset);
|
||||
}
|
||||
scratch_end(scratch);
|
||||
return result;
|
||||
return members;
|
||||
}
|
||||
|
||||
internal void
|
||||
|
||||
@@ -31,6 +31,21 @@ struct TG_Key
|
||||
U64 u64[1]; // ext -> unique id; cons -> idx; reg -> code
|
||||
};
|
||||
|
||||
typedef struct TG_KeyNode TG_KeyNode;
|
||||
struct TG_KeyNode
|
||||
{
|
||||
TG_KeyNode *next;
|
||||
TG_Key v;
|
||||
};
|
||||
|
||||
typedef struct TG_KeyList TG_KeyList;
|
||||
struct TG_KeyList
|
||||
{
|
||||
TG_KeyNode *first;
|
||||
TG_KeyNode *last;
|
||||
U64 count;
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Graph Types
|
||||
|
||||
@@ -102,6 +117,7 @@ struct TG_Member
|
||||
TG_Key type_key;
|
||||
String8 name;
|
||||
U64 off;
|
||||
TG_KeyList inheritance_key_chain;
|
||||
};
|
||||
|
||||
typedef struct TG_MemberNode TG_MemberNode;
|
||||
@@ -179,6 +195,9 @@ thread_static Arena *tg_build_arena = 0;
|
||||
//~ rjf: Basic Helpers
|
||||
|
||||
internal U64 tg_hash_from_string(U64 seed, String8 string);
|
||||
internal int tg_qsort_compare_members_offset(TG_Member *a, TG_Member *b);
|
||||
internal void tg_key_list_push(Arena *arena, TG_KeyList *list, TG_Key key);
|
||||
internal TG_KeyList tg_key_list_copy(Arena *arena, TG_KeyList *src);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: RADDBG <-> TG Enum Conversions
|
||||
@@ -207,6 +226,7 @@ internal TG_Key tg_cons_type_make(TG_Graph *graph, TG_Kind kind, TG_Key direct_t
|
||||
|
||||
internal TG_Type *tg_type_from_graph_raddbg_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key);
|
||||
internal TG_Key tg_direct_from_graph_raddbg_key(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key);
|
||||
internal TG_Key tg_unwrapped_direct_from_graph_raddbg_key(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key);
|
||||
internal TG_Key tg_owner_from_graph_raddbg_key(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key);
|
||||
internal TG_Key tg_ptee_from_graph_raddbg_key(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key);
|
||||
internal TG_Key tg_unwrapped_from_graph_raddbg_key(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key);
|
||||
|
||||
+170
-130
@@ -3,133 +3,173 @@
|
||||
|
||||
//- GENERATED CODE
|
||||
|
||||
internal UI_Box * ui_push_parent(UI_Box * v) {return UI_StackPush(parent, v);}
|
||||
internal Axis2 ui_push_child_layout_axis(Axis2 v) {return UI_StackPush(child_layout_axis, v);}
|
||||
internal F32 ui_push_fixed_x(F32 v) {return UI_StackPush(fixed_x, v);}
|
||||
internal F32 ui_push_fixed_y(F32 v) {return UI_StackPush(fixed_y, v);}
|
||||
internal F32 ui_push_fixed_width(F32 v) {return UI_StackPush(fixed_width, v);}
|
||||
internal F32 ui_push_fixed_height(F32 v) {return UI_StackPush(fixed_height, v);}
|
||||
internal UI_Size ui_push_pref_width(UI_Size v) {return UI_StackPush(pref_width, v);}
|
||||
internal UI_Size ui_push_pref_height(UI_Size v) {return UI_StackPush(pref_height, v);}
|
||||
internal UI_BoxFlags ui_push_flags(UI_BoxFlags v) {return UI_StackPush(flags, v);}
|
||||
internal U32 ui_push_fastpath_codepoint(U32 v) {return UI_StackPush(fastpath_codepoint, v);}
|
||||
internal Vec4F32 ui_push_background_color(Vec4F32 v) {return UI_StackPush(background_color, v);}
|
||||
internal Vec4F32 ui_push_text_color(Vec4F32 v) {return UI_StackPush(text_color, v);}
|
||||
internal Vec4F32 ui_push_border_color(Vec4F32 v) {return UI_StackPush(border_color, v);}
|
||||
internal Vec4F32 ui_push_overlay_color(Vec4F32 v) {return UI_StackPush(overlay_color, v);}
|
||||
internal Vec4F32 ui_push_text_select_color(Vec4F32 v) {return UI_StackPush(text_select_color, v);}
|
||||
internal Vec4F32 ui_push_text_cursor_color(Vec4F32 v) {return UI_StackPush(text_cursor_color, v);}
|
||||
internal OS_Cursor ui_push_hover_cursor(OS_Cursor v) {return UI_StackPush(hover_cursor, v);}
|
||||
internal F_Tag ui_push_font(F_Tag v) {return UI_StackPush(font, v);}
|
||||
internal F32 ui_push_font_size(F32 v) {return UI_StackPush(font_size, v);}
|
||||
internal F32 ui_push_corner_radius_00(F32 v) {return UI_StackPush(corner_radius_00, v);}
|
||||
internal F32 ui_push_corner_radius_01(F32 v) {return UI_StackPush(corner_radius_01, v);}
|
||||
internal F32 ui_push_corner_radius_10(F32 v) {return UI_StackPush(corner_radius_10, v);}
|
||||
internal F32 ui_push_corner_radius_11(F32 v) {return UI_StackPush(corner_radius_11, v);}
|
||||
internal F32 ui_push_blur_size(F32 v) {return UI_StackPush(blur_size, v);}
|
||||
internal F32 ui_push_text_padding(F32 v) {return UI_StackPush(text_padding, v);}
|
||||
internal UI_TextAlign ui_push_text_alignment(UI_TextAlign v) {return UI_StackPush(text_alignment, v);}
|
||||
internal UI_Box * ui_pop_parent(void) {UI_Box * popped; return UI_StackPop(parent, popped);}
|
||||
internal Axis2 ui_pop_child_layout_axis(void) {Axis2 popped; return UI_StackPop(child_layout_axis, popped);}
|
||||
internal F32 ui_pop_fixed_x(void) {F32 popped; return UI_StackPop(fixed_x, popped);}
|
||||
internal F32 ui_pop_fixed_y(void) {F32 popped; return UI_StackPop(fixed_y, popped);}
|
||||
internal F32 ui_pop_fixed_width(void) {F32 popped; return UI_StackPop(fixed_width, popped);}
|
||||
internal F32 ui_pop_fixed_height(void) {F32 popped; return UI_StackPop(fixed_height, popped);}
|
||||
internal UI_Size ui_pop_pref_width(void) {UI_Size popped; return UI_StackPop(pref_width, popped);}
|
||||
internal UI_Size ui_pop_pref_height(void) {UI_Size popped; return UI_StackPop(pref_height, popped);}
|
||||
internal UI_BoxFlags ui_pop_flags(void) {UI_BoxFlags popped; return UI_StackPop(flags, popped);}
|
||||
internal U32 ui_pop_fastpath_codepoint(void) {U32 popped; return UI_StackPop(fastpath_codepoint, popped);}
|
||||
internal Vec4F32 ui_pop_background_color(void) {Vec4F32 popped; return UI_StackPop(background_color, popped);}
|
||||
internal Vec4F32 ui_pop_text_color(void) {Vec4F32 popped; return UI_StackPop(text_color, popped);}
|
||||
internal Vec4F32 ui_pop_border_color(void) {Vec4F32 popped; return UI_StackPop(border_color, popped);}
|
||||
internal Vec4F32 ui_pop_overlay_color(void) {Vec4F32 popped; return UI_StackPop(overlay_color, popped);}
|
||||
internal Vec4F32 ui_pop_text_select_color(void) {Vec4F32 popped; return UI_StackPop(text_select_color, popped);}
|
||||
internal Vec4F32 ui_pop_text_cursor_color(void) {Vec4F32 popped; return UI_StackPop(text_cursor_color, popped);}
|
||||
internal OS_Cursor ui_pop_hover_cursor(void) {OS_Cursor popped; return UI_StackPop(hover_cursor, popped);}
|
||||
internal F_Tag ui_pop_font(void) {F_Tag popped; return UI_StackPop(font, popped);}
|
||||
internal F32 ui_pop_font_size(void) {F32 popped; return UI_StackPop(font_size, popped);}
|
||||
internal F32 ui_pop_corner_radius_00(void) {F32 popped; return UI_StackPop(corner_radius_00, popped);}
|
||||
internal F32 ui_pop_corner_radius_01(void) {F32 popped; return UI_StackPop(corner_radius_01, popped);}
|
||||
internal F32 ui_pop_corner_radius_10(void) {F32 popped; return UI_StackPop(corner_radius_10, popped);}
|
||||
internal F32 ui_pop_corner_radius_11(void) {F32 popped; return UI_StackPop(corner_radius_11, popped);}
|
||||
internal F32 ui_pop_blur_size(void) {F32 popped; return UI_StackPop(blur_size, popped);}
|
||||
internal F32 ui_pop_text_padding(void) {F32 popped; return UI_StackPop(text_padding, popped);}
|
||||
internal UI_TextAlign ui_pop_text_alignment(void) {UI_TextAlign popped; return UI_StackPop(text_alignment, popped);}
|
||||
internal UI_Box * ui_top_parent(void) {return UI_StackTop(parent);}
|
||||
internal Axis2 ui_top_child_layout_axis(void) {return UI_StackTop(child_layout_axis);}
|
||||
internal F32 ui_top_fixed_x(void) {return UI_StackTop(fixed_x);}
|
||||
internal F32 ui_top_fixed_y(void) {return UI_StackTop(fixed_y);}
|
||||
internal F32 ui_top_fixed_width(void) {return UI_StackTop(fixed_width);}
|
||||
internal F32 ui_top_fixed_height(void) {return UI_StackTop(fixed_height);}
|
||||
internal UI_Size ui_top_pref_width(void) {return UI_StackTop(pref_width);}
|
||||
internal UI_Size ui_top_pref_height(void) {return UI_StackTop(pref_height);}
|
||||
internal UI_BoxFlags ui_top_flags(void) {return UI_StackTop(flags);}
|
||||
internal U32 ui_top_fastpath_codepoint(void) {return UI_StackTop(fastpath_codepoint);}
|
||||
internal Vec4F32 ui_top_background_color(void) {return UI_StackTop(background_color);}
|
||||
internal Vec4F32 ui_top_text_color(void) {return UI_StackTop(text_color);}
|
||||
internal Vec4F32 ui_top_border_color(void) {return UI_StackTop(border_color);}
|
||||
internal Vec4F32 ui_top_overlay_color(void) {return UI_StackTop(overlay_color);}
|
||||
internal Vec4F32 ui_top_text_select_color(void) {return UI_StackTop(text_select_color);}
|
||||
internal Vec4F32 ui_top_text_cursor_color(void) {return UI_StackTop(text_cursor_color);}
|
||||
internal OS_Cursor ui_top_hover_cursor(void) {return UI_StackTop(hover_cursor);}
|
||||
internal F_Tag ui_top_font(void) {return UI_StackTop(font);}
|
||||
internal F32 ui_top_font_size(void) {return UI_StackTop(font_size);}
|
||||
internal F32 ui_top_corner_radius_00(void) {return UI_StackTop(corner_radius_00);}
|
||||
internal F32 ui_top_corner_radius_01(void) {return UI_StackTop(corner_radius_01);}
|
||||
internal F32 ui_top_corner_radius_10(void) {return UI_StackTop(corner_radius_10);}
|
||||
internal F32 ui_top_corner_radius_11(void) {return UI_StackTop(corner_radius_11);}
|
||||
internal F32 ui_top_blur_size(void) {return UI_StackTop(blur_size);}
|
||||
internal F32 ui_top_text_padding(void) {return UI_StackTop(text_padding);}
|
||||
internal UI_TextAlign ui_top_text_alignment(void) {return UI_StackTop(text_alignment);}
|
||||
internal UI_Box * ui_bottom_parent(void) {return UI_StackBottom(parent);}
|
||||
internal Axis2 ui_bottom_child_layout_axis(void) {return UI_StackBottom(child_layout_axis);}
|
||||
internal F32 ui_bottom_fixed_x(void) {return UI_StackBottom(fixed_x);}
|
||||
internal F32 ui_bottom_fixed_y(void) {return UI_StackBottom(fixed_y);}
|
||||
internal F32 ui_bottom_fixed_width(void) {return UI_StackBottom(fixed_width);}
|
||||
internal F32 ui_bottom_fixed_height(void) {return UI_StackBottom(fixed_height);}
|
||||
internal UI_Size ui_bottom_pref_width(void) {return UI_StackBottom(pref_width);}
|
||||
internal UI_Size ui_bottom_pref_height(void) {return UI_StackBottom(pref_height);}
|
||||
internal UI_BoxFlags ui_bottom_flags(void) {return UI_StackBottom(flags);}
|
||||
internal U32 ui_bottom_fastpath_codepoint(void) {return UI_StackBottom(fastpath_codepoint);}
|
||||
internal Vec4F32 ui_bottom_background_color(void) {return UI_StackBottom(background_color);}
|
||||
internal Vec4F32 ui_bottom_text_color(void) {return UI_StackBottom(text_color);}
|
||||
internal Vec4F32 ui_bottom_border_color(void) {return UI_StackBottom(border_color);}
|
||||
internal Vec4F32 ui_bottom_overlay_color(void) {return UI_StackBottom(overlay_color);}
|
||||
internal Vec4F32 ui_bottom_text_select_color(void) {return UI_StackBottom(text_select_color);}
|
||||
internal Vec4F32 ui_bottom_text_cursor_color(void) {return UI_StackBottom(text_cursor_color);}
|
||||
internal OS_Cursor ui_bottom_hover_cursor(void) {return UI_StackBottom(hover_cursor);}
|
||||
internal F_Tag ui_bottom_font(void) {return UI_StackBottom(font);}
|
||||
internal F32 ui_bottom_font_size(void) {return UI_StackBottom(font_size);}
|
||||
internal F32 ui_bottom_corner_radius_00(void) {return UI_StackBottom(corner_radius_00);}
|
||||
internal F32 ui_bottom_corner_radius_01(void) {return UI_StackBottom(corner_radius_01);}
|
||||
internal F32 ui_bottom_corner_radius_10(void) {return UI_StackBottom(corner_radius_10);}
|
||||
internal F32 ui_bottom_corner_radius_11(void) {return UI_StackBottom(corner_radius_11);}
|
||||
internal F32 ui_bottom_blur_size(void) {return UI_StackBottom(blur_size);}
|
||||
internal F32 ui_bottom_text_padding(void) {return UI_StackBottom(text_padding);}
|
||||
internal UI_TextAlign ui_bottom_text_alignment(void) {return UI_StackBottom(text_alignment);}
|
||||
internal UI_Box * ui_set_next_parent(UI_Box * v) {return UI_StackSetNext(parent, v);}
|
||||
internal Axis2 ui_set_next_child_layout_axis(Axis2 v) {return UI_StackSetNext(child_layout_axis, v);}
|
||||
internal F32 ui_set_next_fixed_x(F32 v) {return UI_StackSetNext(fixed_x, v);}
|
||||
internal F32 ui_set_next_fixed_y(F32 v) {return UI_StackSetNext(fixed_y, v);}
|
||||
internal F32 ui_set_next_fixed_width(F32 v) {return UI_StackSetNext(fixed_width, v);}
|
||||
internal F32 ui_set_next_fixed_height(F32 v) {return UI_StackSetNext(fixed_height, v);}
|
||||
internal UI_Size ui_set_next_pref_width(UI_Size v) {return UI_StackSetNext(pref_width, v);}
|
||||
internal UI_Size ui_set_next_pref_height(UI_Size v) {return UI_StackSetNext(pref_height, v);}
|
||||
internal UI_BoxFlags ui_set_next_flags(UI_BoxFlags v) {return UI_StackSetNext(flags, v);}
|
||||
internal U32 ui_set_next_fastpath_codepoint(U32 v) {return UI_StackSetNext(fastpath_codepoint, v);}
|
||||
internal Vec4F32 ui_set_next_background_color(Vec4F32 v) {return UI_StackSetNext(background_color, v);}
|
||||
internal Vec4F32 ui_set_next_text_color(Vec4F32 v) {return UI_StackSetNext(text_color, v);}
|
||||
internal Vec4F32 ui_set_next_border_color(Vec4F32 v) {return UI_StackSetNext(border_color, v);}
|
||||
internal Vec4F32 ui_set_next_overlay_color(Vec4F32 v) {return UI_StackSetNext(overlay_color, v);}
|
||||
internal Vec4F32 ui_set_next_text_select_color(Vec4F32 v) {return UI_StackSetNext(text_select_color, v);}
|
||||
internal Vec4F32 ui_set_next_text_cursor_color(Vec4F32 v) {return UI_StackSetNext(text_cursor_color, v);}
|
||||
internal OS_Cursor ui_set_next_hover_cursor(OS_Cursor v) {return UI_StackSetNext(hover_cursor, v);}
|
||||
internal F_Tag ui_set_next_font(F_Tag v) {return UI_StackSetNext(font, v);}
|
||||
internal F32 ui_set_next_font_size(F32 v) {return UI_StackSetNext(font_size, v);}
|
||||
internal F32 ui_set_next_corner_radius_00(F32 v) {return UI_StackSetNext(corner_radius_00, v);}
|
||||
internal F32 ui_set_next_corner_radius_01(F32 v) {return UI_StackSetNext(corner_radius_01, v);}
|
||||
internal F32 ui_set_next_corner_radius_10(F32 v) {return UI_StackSetNext(corner_radius_10, v);}
|
||||
internal F32 ui_set_next_corner_radius_11(F32 v) {return UI_StackSetNext(corner_radius_11, v);}
|
||||
internal F32 ui_set_next_blur_size(F32 v) {return UI_StackSetNext(blur_size, v);}
|
||||
internal F32 ui_set_next_text_padding(F32 v) {return UI_StackSetNext(text_padding, v);}
|
||||
internal UI_TextAlign ui_set_next_text_alignment(UI_TextAlign v) {return UI_StackSetNext(text_alignment, v);}
|
||||
#if 0
|
||||
#define UI_Parent(v) DeferLoop(ui_push_parent(v), ui_pop_parent())
|
||||
#define UI_ChildLayoutAxis(v) DeferLoop(ui_push_child_layout_axis(v), ui_pop_child_layout_axis())
|
||||
#define UI_FixedX(v) DeferLoop(ui_push_fixed_x(v), ui_pop_fixed_x())
|
||||
#define UI_FixedY(v) DeferLoop(ui_push_fixed_y(v), ui_pop_fixed_y())
|
||||
#define UI_FixedWidth(v) DeferLoop(ui_push_fixed_width(v), ui_pop_fixed_width())
|
||||
#define UI_FixedHeight(v) DeferLoop(ui_push_fixed_height(v), ui_pop_fixed_height())
|
||||
#define UI_PrefWidth(v) DeferLoop(ui_push_pref_width(v), ui_pop_pref_width())
|
||||
#define UI_PrefHeight(v) DeferLoop(ui_push_pref_height(v), ui_pop_pref_height())
|
||||
#define UI_Flags(v) DeferLoop(ui_push_flags(v), ui_pop_flags())
|
||||
#define UI_FocusHot(v) DeferLoop(ui_push_focus_hot(v), ui_pop_focus_hot())
|
||||
#define UI_FocusActive(v) DeferLoop(ui_push_focus_active(v), ui_pop_focus_active())
|
||||
#define UI_FastpathCodepoint(v) DeferLoop(ui_push_fastpath_codepoint(v), ui_pop_fastpath_codepoint())
|
||||
#define UI_BackgroundColor(v) DeferLoop(ui_push_background_color(v), ui_pop_background_color())
|
||||
#define UI_TextColor(v) DeferLoop(ui_push_text_color(v), ui_pop_text_color())
|
||||
#define UI_BorderColor(v) DeferLoop(ui_push_border_color(v), ui_pop_border_color())
|
||||
#define UI_OverlayColor(v) DeferLoop(ui_push_overlay_color(v), ui_pop_overlay_color())
|
||||
#define UI_TextSelectColor(v) DeferLoop(ui_push_text_select_color(v), ui_pop_text_select_color())
|
||||
#define UI_TextCursorColor(v) DeferLoop(ui_push_text_cursor_color(v), ui_pop_text_cursor_color())
|
||||
#define UI_HoverCursor(v) DeferLoop(ui_push_hover_cursor(v), ui_pop_hover_cursor())
|
||||
#define UI_Font(v) DeferLoop(ui_push_font(v), ui_pop_font())
|
||||
#define UI_FontSize(v) DeferLoop(ui_push_font_size(v), ui_pop_font_size())
|
||||
#define UI_CornerRadius00(v) DeferLoop(ui_push_corner_radius_00(v), ui_pop_corner_radius_00())
|
||||
#define UI_CornerRadius01(v) DeferLoop(ui_push_corner_radius_01(v), ui_pop_corner_radius_01())
|
||||
#define UI_CornerRadius10(v) DeferLoop(ui_push_corner_radius_10(v), ui_pop_corner_radius_10())
|
||||
#define UI_CornerRadius11(v) DeferLoop(ui_push_corner_radius_11(v), ui_pop_corner_radius_11())
|
||||
#define UI_BlurSize(v) DeferLoop(ui_push_blur_size(v), ui_pop_blur_size())
|
||||
#define UI_TextPadding(v) DeferLoop(ui_push_text_padding(v), ui_pop_text_padding())
|
||||
#define UI_TextAlignment(v) DeferLoop(ui_push_text_alignment(v), ui_pop_text_alignment())
|
||||
#endif
|
||||
internal UI_Box * ui_top_parent(void) { UI_StackTopImpl(ui_state, Parent, parent) }
|
||||
internal Axis2 ui_top_child_layout_axis(void) { UI_StackTopImpl(ui_state, ChildLayoutAxis, child_layout_axis) }
|
||||
internal F32 ui_top_fixed_x(void) { UI_StackTopImpl(ui_state, FixedX, fixed_x) }
|
||||
internal F32 ui_top_fixed_y(void) { UI_StackTopImpl(ui_state, FixedY, fixed_y) }
|
||||
internal F32 ui_top_fixed_width(void) { UI_StackTopImpl(ui_state, FixedWidth, fixed_width) }
|
||||
internal F32 ui_top_fixed_height(void) { UI_StackTopImpl(ui_state, FixedHeight, fixed_height) }
|
||||
internal UI_Size ui_top_pref_width(void) { UI_StackTopImpl(ui_state, PrefWidth, pref_width) }
|
||||
internal UI_Size ui_top_pref_height(void) { UI_StackTopImpl(ui_state, PrefHeight, pref_height) }
|
||||
internal UI_BoxFlags ui_top_flags(void) { UI_StackTopImpl(ui_state, Flags, flags) }
|
||||
internal UI_FocusKind ui_top_focus_hot(void) { UI_StackTopImpl(ui_state, FocusHot, focus_hot) }
|
||||
internal UI_FocusKind ui_top_focus_active(void) { UI_StackTopImpl(ui_state, FocusActive, focus_active) }
|
||||
internal U32 ui_top_fastpath_codepoint(void) { UI_StackTopImpl(ui_state, FastpathCodepoint, fastpath_codepoint) }
|
||||
internal Vec4F32 ui_top_background_color(void) { UI_StackTopImpl(ui_state, BackgroundColor, background_color) }
|
||||
internal Vec4F32 ui_top_text_color(void) { UI_StackTopImpl(ui_state, TextColor, text_color) }
|
||||
internal Vec4F32 ui_top_border_color(void) { UI_StackTopImpl(ui_state, BorderColor, border_color) }
|
||||
internal Vec4F32 ui_top_overlay_color(void) { UI_StackTopImpl(ui_state, OverlayColor, overlay_color) }
|
||||
internal Vec4F32 ui_top_text_select_color(void) { UI_StackTopImpl(ui_state, TextSelectColor, text_select_color) }
|
||||
internal Vec4F32 ui_top_text_cursor_color(void) { UI_StackTopImpl(ui_state, TextCursorColor, text_cursor_color) }
|
||||
internal OS_Cursor ui_top_hover_cursor(void) { UI_StackTopImpl(ui_state, HoverCursor, hover_cursor) }
|
||||
internal F_Tag ui_top_font(void) { UI_StackTopImpl(ui_state, Font, font) }
|
||||
internal F32 ui_top_font_size(void) { UI_StackTopImpl(ui_state, FontSize, font_size) }
|
||||
internal F32 ui_top_corner_radius_00(void) { UI_StackTopImpl(ui_state, CornerRadius00, corner_radius_00) }
|
||||
internal F32 ui_top_corner_radius_01(void) { UI_StackTopImpl(ui_state, CornerRadius01, corner_radius_01) }
|
||||
internal F32 ui_top_corner_radius_10(void) { UI_StackTopImpl(ui_state, CornerRadius10, corner_radius_10) }
|
||||
internal F32 ui_top_corner_radius_11(void) { UI_StackTopImpl(ui_state, CornerRadius11, corner_radius_11) }
|
||||
internal F32 ui_top_blur_size(void) { UI_StackTopImpl(ui_state, BlurSize, blur_size) }
|
||||
internal F32 ui_top_text_padding(void) { UI_StackTopImpl(ui_state, TextPadding, text_padding) }
|
||||
internal UI_TextAlign ui_top_text_alignment(void) { UI_StackTopImpl(ui_state, TextAlignment, text_alignment) }
|
||||
internal UI_Box * ui_bottom_parent(void) { UI_StackBottomImpl(ui_state, Parent, parent) }
|
||||
internal Axis2 ui_bottom_child_layout_axis(void) { UI_StackBottomImpl(ui_state, ChildLayoutAxis, child_layout_axis) }
|
||||
internal F32 ui_bottom_fixed_x(void) { UI_StackBottomImpl(ui_state, FixedX, fixed_x) }
|
||||
internal F32 ui_bottom_fixed_y(void) { UI_StackBottomImpl(ui_state, FixedY, fixed_y) }
|
||||
internal F32 ui_bottom_fixed_width(void) { UI_StackBottomImpl(ui_state, FixedWidth, fixed_width) }
|
||||
internal F32 ui_bottom_fixed_height(void) { UI_StackBottomImpl(ui_state, FixedHeight, fixed_height) }
|
||||
internal UI_Size ui_bottom_pref_width(void) { UI_StackBottomImpl(ui_state, PrefWidth, pref_width) }
|
||||
internal UI_Size ui_bottom_pref_height(void) { UI_StackBottomImpl(ui_state, PrefHeight, pref_height) }
|
||||
internal UI_BoxFlags ui_bottom_flags(void) { UI_StackBottomImpl(ui_state, Flags, flags) }
|
||||
internal UI_FocusKind ui_bottom_focus_hot(void) { UI_StackBottomImpl(ui_state, FocusHot, focus_hot) }
|
||||
internal UI_FocusKind ui_bottom_focus_active(void) { UI_StackBottomImpl(ui_state, FocusActive, focus_active) }
|
||||
internal U32 ui_bottom_fastpath_codepoint(void) { UI_StackBottomImpl(ui_state, FastpathCodepoint, fastpath_codepoint) }
|
||||
internal Vec4F32 ui_bottom_background_color(void) { UI_StackBottomImpl(ui_state, BackgroundColor, background_color) }
|
||||
internal Vec4F32 ui_bottom_text_color(void) { UI_StackBottomImpl(ui_state, TextColor, text_color) }
|
||||
internal Vec4F32 ui_bottom_border_color(void) { UI_StackBottomImpl(ui_state, BorderColor, border_color) }
|
||||
internal Vec4F32 ui_bottom_overlay_color(void) { UI_StackBottomImpl(ui_state, OverlayColor, overlay_color) }
|
||||
internal Vec4F32 ui_bottom_text_select_color(void) { UI_StackBottomImpl(ui_state, TextSelectColor, text_select_color) }
|
||||
internal Vec4F32 ui_bottom_text_cursor_color(void) { UI_StackBottomImpl(ui_state, TextCursorColor, text_cursor_color) }
|
||||
internal OS_Cursor ui_bottom_hover_cursor(void) { UI_StackBottomImpl(ui_state, HoverCursor, hover_cursor) }
|
||||
internal F_Tag ui_bottom_font(void) { UI_StackBottomImpl(ui_state, Font, font) }
|
||||
internal F32 ui_bottom_font_size(void) { UI_StackBottomImpl(ui_state, FontSize, font_size) }
|
||||
internal F32 ui_bottom_corner_radius_00(void) { UI_StackBottomImpl(ui_state, CornerRadius00, corner_radius_00) }
|
||||
internal F32 ui_bottom_corner_radius_01(void) { UI_StackBottomImpl(ui_state, CornerRadius01, corner_radius_01) }
|
||||
internal F32 ui_bottom_corner_radius_10(void) { UI_StackBottomImpl(ui_state, CornerRadius10, corner_radius_10) }
|
||||
internal F32 ui_bottom_corner_radius_11(void) { UI_StackBottomImpl(ui_state, CornerRadius11, corner_radius_11) }
|
||||
internal F32 ui_bottom_blur_size(void) { UI_StackBottomImpl(ui_state, BlurSize, blur_size) }
|
||||
internal F32 ui_bottom_text_padding(void) { UI_StackBottomImpl(ui_state, TextPadding, text_padding) }
|
||||
internal UI_TextAlign ui_bottom_text_alignment(void) { UI_StackBottomImpl(ui_state, TextAlignment, text_alignment) }
|
||||
internal UI_Box * ui_push_parent(UI_Box * v) { UI_StackPushImpl(ui_state, Parent, parent, UI_Box *, v) }
|
||||
internal Axis2 ui_push_child_layout_axis(Axis2 v) { UI_StackPushImpl(ui_state, ChildLayoutAxis, child_layout_axis, Axis2, v) }
|
||||
internal F32 ui_push_fixed_x(F32 v) { UI_StackPushImpl(ui_state, FixedX, fixed_x, F32, v) }
|
||||
internal F32 ui_push_fixed_y(F32 v) { UI_StackPushImpl(ui_state, FixedY, fixed_y, F32, v) }
|
||||
internal F32 ui_push_fixed_width(F32 v) { UI_StackPushImpl(ui_state, FixedWidth, fixed_width, F32, v) }
|
||||
internal F32 ui_push_fixed_height(F32 v) { UI_StackPushImpl(ui_state, FixedHeight, fixed_height, F32, v) }
|
||||
internal UI_Size ui_push_pref_width(UI_Size v) { UI_StackPushImpl(ui_state, PrefWidth, pref_width, UI_Size, v) }
|
||||
internal UI_Size ui_push_pref_height(UI_Size v) { UI_StackPushImpl(ui_state, PrefHeight, pref_height, UI_Size, v) }
|
||||
internal UI_BoxFlags ui_push_flags(UI_BoxFlags v) { UI_StackPushImpl(ui_state, Flags, flags, UI_BoxFlags, v) }
|
||||
internal UI_FocusKind ui_push_focus_hot(UI_FocusKind v) { UI_StackPushImpl(ui_state, FocusHot, focus_hot, UI_FocusKind, v) }
|
||||
internal UI_FocusKind ui_push_focus_active(UI_FocusKind v) { UI_StackPushImpl(ui_state, FocusActive, focus_active, UI_FocusKind, v) }
|
||||
internal U32 ui_push_fastpath_codepoint(U32 v) { UI_StackPushImpl(ui_state, FastpathCodepoint, fastpath_codepoint, U32, v) }
|
||||
internal Vec4F32 ui_push_background_color(Vec4F32 v) { UI_StackPushImpl(ui_state, BackgroundColor, background_color, Vec4F32, v) }
|
||||
internal Vec4F32 ui_push_text_color(Vec4F32 v) { UI_StackPushImpl(ui_state, TextColor, text_color, Vec4F32, v) }
|
||||
internal Vec4F32 ui_push_border_color(Vec4F32 v) { UI_StackPushImpl(ui_state, BorderColor, border_color, Vec4F32, v) }
|
||||
internal Vec4F32 ui_push_overlay_color(Vec4F32 v) { UI_StackPushImpl(ui_state, OverlayColor, overlay_color, Vec4F32, v) }
|
||||
internal Vec4F32 ui_push_text_select_color(Vec4F32 v) { UI_StackPushImpl(ui_state, TextSelectColor, text_select_color, Vec4F32, v) }
|
||||
internal Vec4F32 ui_push_text_cursor_color(Vec4F32 v) { UI_StackPushImpl(ui_state, TextCursorColor, text_cursor_color, Vec4F32, v) }
|
||||
internal OS_Cursor ui_push_hover_cursor(OS_Cursor v) { UI_StackPushImpl(ui_state, HoverCursor, hover_cursor, OS_Cursor, v) }
|
||||
internal F_Tag ui_push_font(F_Tag v) { UI_StackPushImpl(ui_state, Font, font, F_Tag, v) }
|
||||
internal F32 ui_push_font_size(F32 v) { UI_StackPushImpl(ui_state, FontSize, font_size, F32, v) }
|
||||
internal F32 ui_push_corner_radius_00(F32 v) { UI_StackPushImpl(ui_state, CornerRadius00, corner_radius_00, F32, v) }
|
||||
internal F32 ui_push_corner_radius_01(F32 v) { UI_StackPushImpl(ui_state, CornerRadius01, corner_radius_01, F32, v) }
|
||||
internal F32 ui_push_corner_radius_10(F32 v) { UI_StackPushImpl(ui_state, CornerRadius10, corner_radius_10, F32, v) }
|
||||
internal F32 ui_push_corner_radius_11(F32 v) { UI_StackPushImpl(ui_state, CornerRadius11, corner_radius_11, F32, v) }
|
||||
internal F32 ui_push_blur_size(F32 v) { UI_StackPushImpl(ui_state, BlurSize, blur_size, F32, v) }
|
||||
internal F32 ui_push_text_padding(F32 v) { UI_StackPushImpl(ui_state, TextPadding, text_padding, F32, v) }
|
||||
internal UI_TextAlign ui_push_text_alignment(UI_TextAlign v) { UI_StackPushImpl(ui_state, TextAlignment, text_alignment, UI_TextAlign, v) }
|
||||
internal UI_Box * ui_pop_parent(void) { UI_StackPopImpl(ui_state, Parent, parent) }
|
||||
internal Axis2 ui_pop_child_layout_axis(void) { UI_StackPopImpl(ui_state, ChildLayoutAxis, child_layout_axis) }
|
||||
internal F32 ui_pop_fixed_x(void) { UI_StackPopImpl(ui_state, FixedX, fixed_x) }
|
||||
internal F32 ui_pop_fixed_y(void) { UI_StackPopImpl(ui_state, FixedY, fixed_y) }
|
||||
internal F32 ui_pop_fixed_width(void) { UI_StackPopImpl(ui_state, FixedWidth, fixed_width) }
|
||||
internal F32 ui_pop_fixed_height(void) { UI_StackPopImpl(ui_state, FixedHeight, fixed_height) }
|
||||
internal UI_Size ui_pop_pref_width(void) { UI_StackPopImpl(ui_state, PrefWidth, pref_width) }
|
||||
internal UI_Size ui_pop_pref_height(void) { UI_StackPopImpl(ui_state, PrefHeight, pref_height) }
|
||||
internal UI_BoxFlags ui_pop_flags(void) { UI_StackPopImpl(ui_state, Flags, flags) }
|
||||
internal UI_FocusKind ui_pop_focus_hot(void) { UI_StackPopImpl(ui_state, FocusHot, focus_hot) }
|
||||
internal UI_FocusKind ui_pop_focus_active(void) { UI_StackPopImpl(ui_state, FocusActive, focus_active) }
|
||||
internal U32 ui_pop_fastpath_codepoint(void) { UI_StackPopImpl(ui_state, FastpathCodepoint, fastpath_codepoint) }
|
||||
internal Vec4F32 ui_pop_background_color(void) { UI_StackPopImpl(ui_state, BackgroundColor, background_color) }
|
||||
internal Vec4F32 ui_pop_text_color(void) { UI_StackPopImpl(ui_state, TextColor, text_color) }
|
||||
internal Vec4F32 ui_pop_border_color(void) { UI_StackPopImpl(ui_state, BorderColor, border_color) }
|
||||
internal Vec4F32 ui_pop_overlay_color(void) { UI_StackPopImpl(ui_state, OverlayColor, overlay_color) }
|
||||
internal Vec4F32 ui_pop_text_select_color(void) { UI_StackPopImpl(ui_state, TextSelectColor, text_select_color) }
|
||||
internal Vec4F32 ui_pop_text_cursor_color(void) { UI_StackPopImpl(ui_state, TextCursorColor, text_cursor_color) }
|
||||
internal OS_Cursor ui_pop_hover_cursor(void) { UI_StackPopImpl(ui_state, HoverCursor, hover_cursor) }
|
||||
internal F_Tag ui_pop_font(void) { UI_StackPopImpl(ui_state, Font, font) }
|
||||
internal F32 ui_pop_font_size(void) { UI_StackPopImpl(ui_state, FontSize, font_size) }
|
||||
internal F32 ui_pop_corner_radius_00(void) { UI_StackPopImpl(ui_state, CornerRadius00, corner_radius_00) }
|
||||
internal F32 ui_pop_corner_radius_01(void) { UI_StackPopImpl(ui_state, CornerRadius01, corner_radius_01) }
|
||||
internal F32 ui_pop_corner_radius_10(void) { UI_StackPopImpl(ui_state, CornerRadius10, corner_radius_10) }
|
||||
internal F32 ui_pop_corner_radius_11(void) { UI_StackPopImpl(ui_state, CornerRadius11, corner_radius_11) }
|
||||
internal F32 ui_pop_blur_size(void) { UI_StackPopImpl(ui_state, BlurSize, blur_size) }
|
||||
internal F32 ui_pop_text_padding(void) { UI_StackPopImpl(ui_state, TextPadding, text_padding) }
|
||||
internal UI_TextAlign ui_pop_text_alignment(void) { UI_StackPopImpl(ui_state, TextAlignment, text_alignment) }
|
||||
internal UI_Box * ui_set_next_parent(UI_Box * v) { UI_StackSetNextImpl(ui_state, Parent, parent, UI_Box *, v) }
|
||||
internal Axis2 ui_set_next_child_layout_axis(Axis2 v) { UI_StackSetNextImpl(ui_state, ChildLayoutAxis, child_layout_axis, Axis2, v) }
|
||||
internal F32 ui_set_next_fixed_x(F32 v) { UI_StackSetNextImpl(ui_state, FixedX, fixed_x, F32, v) }
|
||||
internal F32 ui_set_next_fixed_y(F32 v) { UI_StackSetNextImpl(ui_state, FixedY, fixed_y, F32, v) }
|
||||
internal F32 ui_set_next_fixed_width(F32 v) { UI_StackSetNextImpl(ui_state, FixedWidth, fixed_width, F32, v) }
|
||||
internal F32 ui_set_next_fixed_height(F32 v) { UI_StackSetNextImpl(ui_state, FixedHeight, fixed_height, F32, v) }
|
||||
internal UI_Size ui_set_next_pref_width(UI_Size v) { UI_StackSetNextImpl(ui_state, PrefWidth, pref_width, UI_Size, v) }
|
||||
internal UI_Size ui_set_next_pref_height(UI_Size v) { UI_StackSetNextImpl(ui_state, PrefHeight, pref_height, UI_Size, v) }
|
||||
internal UI_BoxFlags ui_set_next_flags(UI_BoxFlags v) { UI_StackSetNextImpl(ui_state, Flags, flags, UI_BoxFlags, v) }
|
||||
internal UI_FocusKind ui_set_next_focus_hot(UI_FocusKind v) { UI_StackSetNextImpl(ui_state, FocusHot, focus_hot, UI_FocusKind, v) }
|
||||
internal UI_FocusKind ui_set_next_focus_active(UI_FocusKind v) { UI_StackSetNextImpl(ui_state, FocusActive, focus_active, UI_FocusKind, v) }
|
||||
internal U32 ui_set_next_fastpath_codepoint(U32 v) { UI_StackSetNextImpl(ui_state, FastpathCodepoint, fastpath_codepoint, U32, v) }
|
||||
internal Vec4F32 ui_set_next_background_color(Vec4F32 v) { UI_StackSetNextImpl(ui_state, BackgroundColor, background_color, Vec4F32, v) }
|
||||
internal Vec4F32 ui_set_next_text_color(Vec4F32 v) { UI_StackSetNextImpl(ui_state, TextColor, text_color, Vec4F32, v) }
|
||||
internal Vec4F32 ui_set_next_border_color(Vec4F32 v) { UI_StackSetNextImpl(ui_state, BorderColor, border_color, Vec4F32, v) }
|
||||
internal Vec4F32 ui_set_next_overlay_color(Vec4F32 v) { UI_StackSetNextImpl(ui_state, OverlayColor, overlay_color, Vec4F32, v) }
|
||||
internal Vec4F32 ui_set_next_text_select_color(Vec4F32 v) { UI_StackSetNextImpl(ui_state, TextSelectColor, text_select_color, Vec4F32, v) }
|
||||
internal Vec4F32 ui_set_next_text_cursor_color(Vec4F32 v) { UI_StackSetNextImpl(ui_state, TextCursorColor, text_cursor_color, Vec4F32, v) }
|
||||
internal OS_Cursor ui_set_next_hover_cursor(OS_Cursor v) { UI_StackSetNextImpl(ui_state, HoverCursor, hover_cursor, OS_Cursor, v) }
|
||||
internal F_Tag ui_set_next_font(F_Tag v) { UI_StackSetNextImpl(ui_state, Font, font, F_Tag, v) }
|
||||
internal F32 ui_set_next_font_size(F32 v) { UI_StackSetNextImpl(ui_state, FontSize, font_size, F32, v) }
|
||||
internal F32 ui_set_next_corner_radius_00(F32 v) { UI_StackSetNextImpl(ui_state, CornerRadius00, corner_radius_00, F32, v) }
|
||||
internal F32 ui_set_next_corner_radius_01(F32 v) { UI_StackSetNextImpl(ui_state, CornerRadius01, corner_radius_01, F32, v) }
|
||||
internal F32 ui_set_next_corner_radius_10(F32 v) { UI_StackSetNextImpl(ui_state, CornerRadius10, corner_radius_10, F32, v) }
|
||||
internal F32 ui_set_next_corner_radius_11(F32 v) { UI_StackSetNextImpl(ui_state, CornerRadius11, corner_radius_11, F32, v) }
|
||||
internal F32 ui_set_next_blur_size(F32 v) { UI_StackSetNextImpl(ui_state, BlurSize, blur_size, F32, v) }
|
||||
internal F32 ui_set_next_text_padding(F32 v) { UI_StackSetNextImpl(ui_state, TextPadding, text_padding, F32, v) }
|
||||
internal UI_TextAlign ui_set_next_text_alignment(UI_TextAlign v) { UI_StackSetNextImpl(ui_state, TextAlignment, text_alignment, UI_TextAlign, v) }
|
||||
|
||||
+243
-163
@@ -6,142 +6,188 @@
|
||||
#ifndef UI_META_H
|
||||
#define UI_META_H
|
||||
|
||||
#define UI_StackDecls struct{\
|
||||
struct { UI_Box * active; UI_Box * v[64]; U64 count; B32 auto_pop; } parent;\
|
||||
struct { Axis2 active; Axis2 v[64]; U64 count; B32 auto_pop; } child_layout_axis;\
|
||||
struct { F32 active; F32 v[64]; U64 count; B32 auto_pop; } fixed_x;\
|
||||
struct { F32 active; F32 v[64]; U64 count; B32 auto_pop; } fixed_y;\
|
||||
struct { F32 active; F32 v[64]; U64 count; B32 auto_pop; } fixed_width;\
|
||||
struct { F32 active; F32 v[64]; U64 count; B32 auto_pop; } fixed_height;\
|
||||
struct { UI_Size active; UI_Size v[64]; U64 count; B32 auto_pop; } pref_width;\
|
||||
struct { UI_Size active; UI_Size v[64]; U64 count; B32 auto_pop; } pref_height;\
|
||||
struct { UI_BoxFlags active; UI_BoxFlags v[64]; U64 count; B32 auto_pop; } flags;\
|
||||
struct { U32 active; U32 v[64]; U64 count; B32 auto_pop; } fastpath_codepoint;\
|
||||
struct { Vec4F32 active; Vec4F32 v[64]; U64 count; B32 auto_pop; } background_color;\
|
||||
struct { Vec4F32 active; Vec4F32 v[64]; U64 count; B32 auto_pop; } text_color;\
|
||||
struct { Vec4F32 active; Vec4F32 v[64]; U64 count; B32 auto_pop; } border_color;\
|
||||
struct { Vec4F32 active; Vec4F32 v[64]; U64 count; B32 auto_pop; } overlay_color;\
|
||||
struct { Vec4F32 active; Vec4F32 v[64]; U64 count; B32 auto_pop; } text_select_color;\
|
||||
struct { Vec4F32 active; Vec4F32 v[64]; U64 count; B32 auto_pop; } text_cursor_color;\
|
||||
struct { OS_Cursor active; OS_Cursor v[64]; U64 count; B32 auto_pop; } hover_cursor;\
|
||||
struct { F_Tag active; F_Tag v[64]; U64 count; B32 auto_pop; } font;\
|
||||
struct { F32 active; F32 v[64]; U64 count; B32 auto_pop; } font_size;\
|
||||
struct { F32 active; F32 v[64]; U64 count; B32 auto_pop; } corner_radius_00;\
|
||||
struct { F32 active; F32 v[64]; U64 count; B32 auto_pop; } corner_radius_01;\
|
||||
struct { F32 active; F32 v[64]; U64 count; B32 auto_pop; } corner_radius_10;\
|
||||
struct { F32 active; F32 v[64]; U64 count; B32 auto_pop; } corner_radius_11;\
|
||||
struct { F32 active; F32 v[64]; U64 count; B32 auto_pop; } blur_size;\
|
||||
struct { F32 active; F32 v[64]; U64 count; B32 auto_pop; } text_padding;\
|
||||
struct { UI_TextAlign active; UI_TextAlign v[64]; U64 count; B32 auto_pop; } text_alignment;\
|
||||
typedef struct UI_ParentNode UI_ParentNode; struct UI_ParentNode{UI_ParentNode *next; UI_Box * v;};
|
||||
typedef struct UI_ChildLayoutAxisNode UI_ChildLayoutAxisNode; struct UI_ChildLayoutAxisNode{UI_ChildLayoutAxisNode *next; Axis2 v;};
|
||||
typedef struct UI_FixedXNode UI_FixedXNode; struct UI_FixedXNode{UI_FixedXNode *next; F32 v;};
|
||||
typedef struct UI_FixedYNode UI_FixedYNode; struct UI_FixedYNode{UI_FixedYNode *next; F32 v;};
|
||||
typedef struct UI_FixedWidthNode UI_FixedWidthNode; struct UI_FixedWidthNode{UI_FixedWidthNode *next; F32 v;};
|
||||
typedef struct UI_FixedHeightNode UI_FixedHeightNode; struct UI_FixedHeightNode{UI_FixedHeightNode *next; F32 v;};
|
||||
typedef struct UI_PrefWidthNode UI_PrefWidthNode; struct UI_PrefWidthNode{UI_PrefWidthNode *next; UI_Size v;};
|
||||
typedef struct UI_PrefHeightNode UI_PrefHeightNode; struct UI_PrefHeightNode{UI_PrefHeightNode *next; UI_Size v;};
|
||||
typedef struct UI_FlagsNode UI_FlagsNode; struct UI_FlagsNode{UI_FlagsNode *next; UI_BoxFlags v;};
|
||||
typedef struct UI_FocusHotNode UI_FocusHotNode; struct UI_FocusHotNode{UI_FocusHotNode *next; UI_FocusKind v;};
|
||||
typedef struct UI_FocusActiveNode UI_FocusActiveNode; struct UI_FocusActiveNode{UI_FocusActiveNode *next; UI_FocusKind v;};
|
||||
typedef struct UI_FastpathCodepointNode UI_FastpathCodepointNode; struct UI_FastpathCodepointNode{UI_FastpathCodepointNode *next; U32 v;};
|
||||
typedef struct UI_BackgroundColorNode UI_BackgroundColorNode; struct UI_BackgroundColorNode{UI_BackgroundColorNode *next; Vec4F32 v;};
|
||||
typedef struct UI_TextColorNode UI_TextColorNode; struct UI_TextColorNode{UI_TextColorNode *next; Vec4F32 v;};
|
||||
typedef struct UI_BorderColorNode UI_BorderColorNode; struct UI_BorderColorNode{UI_BorderColorNode *next; Vec4F32 v;};
|
||||
typedef struct UI_OverlayColorNode UI_OverlayColorNode; struct UI_OverlayColorNode{UI_OverlayColorNode *next; Vec4F32 v;};
|
||||
typedef struct UI_TextSelectColorNode UI_TextSelectColorNode; struct UI_TextSelectColorNode{UI_TextSelectColorNode *next; Vec4F32 v;};
|
||||
typedef struct UI_TextCursorColorNode UI_TextCursorColorNode; struct UI_TextCursorColorNode{UI_TextCursorColorNode *next; Vec4F32 v;};
|
||||
typedef struct UI_HoverCursorNode UI_HoverCursorNode; struct UI_HoverCursorNode{UI_HoverCursorNode *next; OS_Cursor v;};
|
||||
typedef struct UI_FontNode UI_FontNode; struct UI_FontNode{UI_FontNode *next; F_Tag v;};
|
||||
typedef struct UI_FontSizeNode UI_FontSizeNode; struct UI_FontSizeNode{UI_FontSizeNode *next; F32 v;};
|
||||
typedef struct UI_CornerRadius00Node UI_CornerRadius00Node; struct UI_CornerRadius00Node{UI_CornerRadius00Node *next; F32 v;};
|
||||
typedef struct UI_CornerRadius01Node UI_CornerRadius01Node; struct UI_CornerRadius01Node{UI_CornerRadius01Node *next; F32 v;};
|
||||
typedef struct UI_CornerRadius10Node UI_CornerRadius10Node; struct UI_CornerRadius10Node{UI_CornerRadius10Node *next; F32 v;};
|
||||
typedef struct UI_CornerRadius11Node UI_CornerRadius11Node; struct UI_CornerRadius11Node{UI_CornerRadius11Node *next; F32 v;};
|
||||
typedef struct UI_BlurSizeNode UI_BlurSizeNode; struct UI_BlurSizeNode{UI_BlurSizeNode *next; F32 v;};
|
||||
typedef struct UI_TextPaddingNode UI_TextPaddingNode; struct UI_TextPaddingNode{UI_TextPaddingNode *next; F32 v;};
|
||||
typedef struct UI_TextAlignmentNode UI_TextAlignmentNode; struct UI_TextAlignmentNode{UI_TextAlignmentNode *next; UI_TextAlign v;};
|
||||
#define UI_DeclStackNils \
|
||||
struct\
|
||||
{\
|
||||
UI_ParentNode parent_nil_stack_top;\
|
||||
UI_ChildLayoutAxisNode child_layout_axis_nil_stack_top;\
|
||||
UI_FixedXNode fixed_x_nil_stack_top;\
|
||||
UI_FixedYNode fixed_y_nil_stack_top;\
|
||||
UI_FixedWidthNode fixed_width_nil_stack_top;\
|
||||
UI_FixedHeightNode fixed_height_nil_stack_top;\
|
||||
UI_PrefWidthNode pref_width_nil_stack_top;\
|
||||
UI_PrefHeightNode pref_height_nil_stack_top;\
|
||||
UI_FlagsNode flags_nil_stack_top;\
|
||||
UI_FocusHotNode focus_hot_nil_stack_top;\
|
||||
UI_FocusActiveNode focus_active_nil_stack_top;\
|
||||
UI_FastpathCodepointNode fastpath_codepoint_nil_stack_top;\
|
||||
UI_BackgroundColorNode background_color_nil_stack_top;\
|
||||
UI_TextColorNode text_color_nil_stack_top;\
|
||||
UI_BorderColorNode border_color_nil_stack_top;\
|
||||
UI_OverlayColorNode overlay_color_nil_stack_top;\
|
||||
UI_TextSelectColorNode text_select_color_nil_stack_top;\
|
||||
UI_TextCursorColorNode text_cursor_color_nil_stack_top;\
|
||||
UI_HoverCursorNode hover_cursor_nil_stack_top;\
|
||||
UI_FontNode font_nil_stack_top;\
|
||||
UI_FontSizeNode font_size_nil_stack_top;\
|
||||
UI_CornerRadius00Node corner_radius_00_nil_stack_top;\
|
||||
UI_CornerRadius01Node corner_radius_01_nil_stack_top;\
|
||||
UI_CornerRadius10Node corner_radius_10_nil_stack_top;\
|
||||
UI_CornerRadius11Node corner_radius_11_nil_stack_top;\
|
||||
UI_BlurSizeNode blur_size_nil_stack_top;\
|
||||
UI_TextPaddingNode text_padding_nil_stack_top;\
|
||||
UI_TextAlignmentNode text_alignment_nil_stack_top;\
|
||||
}
|
||||
#define UI_ZeroAllStacks(ui_state) do{\
|
||||
MemoryZeroStruct(&ui_state->parent);\
|
||||
MemoryZeroStruct(&ui_state->child_layout_axis);\
|
||||
MemoryZeroStruct(&ui_state->fixed_x);\
|
||||
MemoryZeroStruct(&ui_state->fixed_y);\
|
||||
MemoryZeroStruct(&ui_state->fixed_width);\
|
||||
MemoryZeroStruct(&ui_state->fixed_height);\
|
||||
MemoryZeroStruct(&ui_state->pref_width);\
|
||||
MemoryZeroStruct(&ui_state->pref_height);\
|
||||
MemoryZeroStruct(&ui_state->flags);\
|
||||
MemoryZeroStruct(&ui_state->fastpath_codepoint);\
|
||||
MemoryZeroStruct(&ui_state->background_color);\
|
||||
MemoryZeroStruct(&ui_state->text_color);\
|
||||
MemoryZeroStruct(&ui_state->border_color);\
|
||||
MemoryZeroStruct(&ui_state->overlay_color);\
|
||||
MemoryZeroStruct(&ui_state->text_select_color);\
|
||||
MemoryZeroStruct(&ui_state->text_cursor_color);\
|
||||
MemoryZeroStruct(&ui_state->hover_cursor);\
|
||||
MemoryZeroStruct(&ui_state->font);\
|
||||
MemoryZeroStruct(&ui_state->font_size);\
|
||||
MemoryZeroStruct(&ui_state->corner_radius_00);\
|
||||
MemoryZeroStruct(&ui_state->corner_radius_01);\
|
||||
MemoryZeroStruct(&ui_state->corner_radius_10);\
|
||||
MemoryZeroStruct(&ui_state->corner_radius_11);\
|
||||
MemoryZeroStruct(&ui_state->blur_size);\
|
||||
MemoryZeroStruct(&ui_state->text_padding);\
|
||||
MemoryZeroStruct(&ui_state->text_alignment);\
|
||||
} while(0)
|
||||
#define UI_AutoPopAllStacks(ui_state) do{\
|
||||
if(ui_state->parent.auto_pop) {ui_state->parent.auto_pop = 0; ui_pop_parent();}\
|
||||
if(ui_state->child_layout_axis.auto_pop) {ui_state->child_layout_axis.auto_pop = 0; ui_pop_child_layout_axis();}\
|
||||
if(ui_state->fixed_x.auto_pop) {ui_state->fixed_x.auto_pop = 0; ui_pop_fixed_x();}\
|
||||
if(ui_state->fixed_y.auto_pop) {ui_state->fixed_y.auto_pop = 0; ui_pop_fixed_y();}\
|
||||
if(ui_state->fixed_width.auto_pop) {ui_state->fixed_width.auto_pop = 0; ui_pop_fixed_width();}\
|
||||
if(ui_state->fixed_height.auto_pop) {ui_state->fixed_height.auto_pop = 0; ui_pop_fixed_height();}\
|
||||
if(ui_state->pref_width.auto_pop) {ui_state->pref_width.auto_pop = 0; ui_pop_pref_width();}\
|
||||
if(ui_state->pref_height.auto_pop) {ui_state->pref_height.auto_pop = 0; ui_pop_pref_height();}\
|
||||
if(ui_state->flags.auto_pop) {ui_state->flags.auto_pop = 0; ui_pop_flags();}\
|
||||
if(ui_state->fastpath_codepoint.auto_pop) {ui_state->fastpath_codepoint.auto_pop = 0; ui_pop_fastpath_codepoint();}\
|
||||
if(ui_state->background_color.auto_pop) {ui_state->background_color.auto_pop = 0; ui_pop_background_color();}\
|
||||
if(ui_state->text_color.auto_pop) {ui_state->text_color.auto_pop = 0; ui_pop_text_color();}\
|
||||
if(ui_state->border_color.auto_pop) {ui_state->border_color.auto_pop = 0; ui_pop_border_color();}\
|
||||
if(ui_state->overlay_color.auto_pop) {ui_state->overlay_color.auto_pop = 0; ui_pop_overlay_color();}\
|
||||
if(ui_state->text_select_color.auto_pop) {ui_state->text_select_color.auto_pop = 0; ui_pop_text_select_color();}\
|
||||
if(ui_state->text_cursor_color.auto_pop) {ui_state->text_cursor_color.auto_pop = 0; ui_pop_text_cursor_color();}\
|
||||
if(ui_state->hover_cursor.auto_pop) {ui_state->hover_cursor.auto_pop = 0; ui_pop_hover_cursor();}\
|
||||
if(ui_state->font.auto_pop) {ui_state->font.auto_pop = 0; ui_pop_font();}\
|
||||
if(ui_state->font_size.auto_pop) {ui_state->font_size.auto_pop = 0; ui_pop_font_size();}\
|
||||
if(ui_state->corner_radius_00.auto_pop) {ui_state->corner_radius_00.auto_pop = 0; ui_pop_corner_radius_00();}\
|
||||
if(ui_state->corner_radius_01.auto_pop) {ui_state->corner_radius_01.auto_pop = 0; ui_pop_corner_radius_01();}\
|
||||
if(ui_state->corner_radius_10.auto_pop) {ui_state->corner_radius_10.auto_pop = 0; ui_pop_corner_radius_10();}\
|
||||
if(ui_state->corner_radius_11.auto_pop) {ui_state->corner_radius_11.auto_pop = 0; ui_pop_corner_radius_11();}\
|
||||
if(ui_state->blur_size.auto_pop) {ui_state->blur_size.auto_pop = 0; ui_pop_blur_size();}\
|
||||
if(ui_state->text_padding.auto_pop) {ui_state->text_padding.auto_pop = 0; ui_pop_text_padding();}\
|
||||
if(ui_state->text_alignment.auto_pop) {ui_state->text_alignment.auto_pop = 0; ui_pop_text_alignment();}\
|
||||
} while(0)
|
||||
internal UI_Box * ui_push_parent(UI_Box * v);
|
||||
internal Axis2 ui_push_child_layout_axis(Axis2 v);
|
||||
internal F32 ui_push_fixed_x(F32 v);
|
||||
internal F32 ui_push_fixed_y(F32 v);
|
||||
internal F32 ui_push_fixed_width(F32 v);
|
||||
internal F32 ui_push_fixed_height(F32 v);
|
||||
internal UI_Size ui_push_pref_width(UI_Size v);
|
||||
internal UI_Size ui_push_pref_height(UI_Size v);
|
||||
internal UI_BoxFlags ui_push_flags(UI_BoxFlags v);
|
||||
internal U32 ui_push_fastpath_codepoint(U32 v);
|
||||
internal Vec4F32 ui_push_background_color(Vec4F32 v);
|
||||
internal Vec4F32 ui_push_text_color(Vec4F32 v);
|
||||
internal Vec4F32 ui_push_border_color(Vec4F32 v);
|
||||
internal Vec4F32 ui_push_overlay_color(Vec4F32 v);
|
||||
internal Vec4F32 ui_push_text_select_color(Vec4F32 v);
|
||||
internal Vec4F32 ui_push_text_cursor_color(Vec4F32 v);
|
||||
internal OS_Cursor ui_push_hover_cursor(OS_Cursor v);
|
||||
internal F_Tag ui_push_font(F_Tag v);
|
||||
internal F32 ui_push_font_size(F32 v);
|
||||
internal F32 ui_push_corner_radius_00(F32 v);
|
||||
internal F32 ui_push_corner_radius_01(F32 v);
|
||||
internal F32 ui_push_corner_radius_10(F32 v);
|
||||
internal F32 ui_push_corner_radius_11(F32 v);
|
||||
internal F32 ui_push_blur_size(F32 v);
|
||||
internal F32 ui_push_text_padding(F32 v);
|
||||
internal UI_TextAlign ui_push_text_alignment(UI_TextAlign v);
|
||||
internal UI_Box * ui_pop_parent(void);
|
||||
internal Axis2 ui_pop_child_layout_axis(void);
|
||||
internal F32 ui_pop_fixed_x(void);
|
||||
internal F32 ui_pop_fixed_y(void);
|
||||
internal F32 ui_pop_fixed_width(void);
|
||||
internal F32 ui_pop_fixed_height(void);
|
||||
internal UI_Size ui_pop_pref_width(void);
|
||||
internal UI_Size ui_pop_pref_height(void);
|
||||
internal UI_BoxFlags ui_pop_flags(void);
|
||||
internal U32 ui_pop_fastpath_codepoint(void);
|
||||
internal Vec4F32 ui_pop_background_color(void);
|
||||
internal Vec4F32 ui_pop_text_color(void);
|
||||
internal Vec4F32 ui_pop_border_color(void);
|
||||
internal Vec4F32 ui_pop_overlay_color(void);
|
||||
internal Vec4F32 ui_pop_text_select_color(void);
|
||||
internal Vec4F32 ui_pop_text_cursor_color(void);
|
||||
internal OS_Cursor ui_pop_hover_cursor(void);
|
||||
internal F_Tag ui_pop_font(void);
|
||||
internal F32 ui_pop_font_size(void);
|
||||
internal F32 ui_pop_corner_radius_00(void);
|
||||
internal F32 ui_pop_corner_radius_01(void);
|
||||
internal F32 ui_pop_corner_radius_10(void);
|
||||
internal F32 ui_pop_corner_radius_11(void);
|
||||
internal F32 ui_pop_blur_size(void);
|
||||
internal F32 ui_pop_text_padding(void);
|
||||
internal UI_TextAlign ui_pop_text_alignment(void);
|
||||
#define UI_InitStackNils(state) \
|
||||
state->parent_nil_stack_top.v = &ui_g_nil_box;\
|
||||
state->child_layout_axis_nil_stack_top.v = Axis2_X;\
|
||||
state->fixed_x_nil_stack_top.v = 0;\
|
||||
state->fixed_y_nil_stack_top.v = 0;\
|
||||
state->fixed_width_nil_stack_top.v = 0;\
|
||||
state->fixed_height_nil_stack_top.v = 0;\
|
||||
state->pref_width_nil_stack_top.v = ui_px(250.f, 1.f);\
|
||||
state->pref_height_nil_stack_top.v = ui_px(30.f, 1.f);\
|
||||
state->flags_nil_stack_top.v = 0;\
|
||||
state->focus_hot_nil_stack_top.v = UI_FocusKind_Null;\
|
||||
state->focus_active_nil_stack_top.v = UI_FocusKind_Null;\
|
||||
state->fastpath_codepoint_nil_stack_top.v = 0;\
|
||||
state->background_color_nil_stack_top.v = v4f32(1, 0, 1, 1);\
|
||||
state->text_color_nil_stack_top.v = v4f32(1, 0, 1, 1);\
|
||||
state->border_color_nil_stack_top.v = v4f32(1, 0, 1, 1);\
|
||||
state->overlay_color_nil_stack_top.v = v4f32(1, 0, 1, 1);\
|
||||
state->text_select_color_nil_stack_top.v = v4f32(1, 0, 1, 1);\
|
||||
state->text_cursor_color_nil_stack_top.v = v4f32(1, 0, 1, 1);\
|
||||
state->hover_cursor_nil_stack_top.v = OS_Cursor_Pointer;\
|
||||
state->font_nil_stack_top.v = f_tag_zero();\
|
||||
state->font_size_nil_stack_top.v = 24.f;\
|
||||
state->corner_radius_00_nil_stack_top.v = 0;\
|
||||
state->corner_radius_01_nil_stack_top.v = 0;\
|
||||
state->corner_radius_10_nil_stack_top.v = 0;\
|
||||
state->corner_radius_11_nil_stack_top.v = 0;\
|
||||
state->blur_size_nil_stack_top.v = 0;\
|
||||
state->text_padding_nil_stack_top.v = 2;\
|
||||
state->text_alignment_nil_stack_top.v = UI_TextAlign_Left;\
|
||||
|
||||
#define UI_DeclStacks \
|
||||
struct\
|
||||
{\
|
||||
struct { UI_ParentNode *top; UI_Box * bottom_val; UI_ParentNode *free; B32 auto_pop; } parent_stack;\
|
||||
struct { UI_ChildLayoutAxisNode *top; Axis2 bottom_val; UI_ChildLayoutAxisNode *free; B32 auto_pop; } child_layout_axis_stack;\
|
||||
struct { UI_FixedXNode *top; F32 bottom_val; UI_FixedXNode *free; B32 auto_pop; } fixed_x_stack;\
|
||||
struct { UI_FixedYNode *top; F32 bottom_val; UI_FixedYNode *free; B32 auto_pop; } fixed_y_stack;\
|
||||
struct { UI_FixedWidthNode *top; F32 bottom_val; UI_FixedWidthNode *free; B32 auto_pop; } fixed_width_stack;\
|
||||
struct { UI_FixedHeightNode *top; F32 bottom_val; UI_FixedHeightNode *free; B32 auto_pop; } fixed_height_stack;\
|
||||
struct { UI_PrefWidthNode *top; UI_Size bottom_val; UI_PrefWidthNode *free; B32 auto_pop; } pref_width_stack;\
|
||||
struct { UI_PrefHeightNode *top; UI_Size bottom_val; UI_PrefHeightNode *free; B32 auto_pop; } pref_height_stack;\
|
||||
struct { UI_FlagsNode *top; UI_BoxFlags bottom_val; UI_FlagsNode *free; B32 auto_pop; } flags_stack;\
|
||||
struct { UI_FocusHotNode *top; UI_FocusKind bottom_val; UI_FocusHotNode *free; B32 auto_pop; } focus_hot_stack;\
|
||||
struct { UI_FocusActiveNode *top; UI_FocusKind bottom_val; UI_FocusActiveNode *free; B32 auto_pop; } focus_active_stack;\
|
||||
struct { UI_FastpathCodepointNode *top; U32 bottom_val; UI_FastpathCodepointNode *free; B32 auto_pop; } fastpath_codepoint_stack;\
|
||||
struct { UI_BackgroundColorNode *top; Vec4F32 bottom_val; UI_BackgroundColorNode *free; B32 auto_pop; } background_color_stack;\
|
||||
struct { UI_TextColorNode *top; Vec4F32 bottom_val; UI_TextColorNode *free; B32 auto_pop; } text_color_stack;\
|
||||
struct { UI_BorderColorNode *top; Vec4F32 bottom_val; UI_BorderColorNode *free; B32 auto_pop; } border_color_stack;\
|
||||
struct { UI_OverlayColorNode *top; Vec4F32 bottom_val; UI_OverlayColorNode *free; B32 auto_pop; } overlay_color_stack;\
|
||||
struct { UI_TextSelectColorNode *top; Vec4F32 bottom_val; UI_TextSelectColorNode *free; B32 auto_pop; } text_select_color_stack;\
|
||||
struct { UI_TextCursorColorNode *top; Vec4F32 bottom_val; UI_TextCursorColorNode *free; B32 auto_pop; } text_cursor_color_stack;\
|
||||
struct { UI_HoverCursorNode *top; OS_Cursor bottom_val; UI_HoverCursorNode *free; B32 auto_pop; } hover_cursor_stack;\
|
||||
struct { UI_FontNode *top; F_Tag bottom_val; UI_FontNode *free; B32 auto_pop; } font_stack;\
|
||||
struct { UI_FontSizeNode *top; F32 bottom_val; UI_FontSizeNode *free; B32 auto_pop; } font_size_stack;\
|
||||
struct { UI_CornerRadius00Node *top; F32 bottom_val; UI_CornerRadius00Node *free; B32 auto_pop; } corner_radius_00_stack;\
|
||||
struct { UI_CornerRadius01Node *top; F32 bottom_val; UI_CornerRadius01Node *free; B32 auto_pop; } corner_radius_01_stack;\
|
||||
struct { UI_CornerRadius10Node *top; F32 bottom_val; UI_CornerRadius10Node *free; B32 auto_pop; } corner_radius_10_stack;\
|
||||
struct { UI_CornerRadius11Node *top; F32 bottom_val; UI_CornerRadius11Node *free; B32 auto_pop; } corner_radius_11_stack;\
|
||||
struct { UI_BlurSizeNode *top; F32 bottom_val; UI_BlurSizeNode *free; B32 auto_pop; } blur_size_stack;\
|
||||
struct { UI_TextPaddingNode *top; F32 bottom_val; UI_TextPaddingNode *free; B32 auto_pop; } text_padding_stack;\
|
||||
struct { UI_TextAlignmentNode *top; UI_TextAlign bottom_val; UI_TextAlignmentNode *free; B32 auto_pop; } text_alignment_stack;\
|
||||
}
|
||||
#define UI_InitStacks(state) \
|
||||
state->parent_stack.top = &state->parent_nil_stack_top; state->parent_stack.bottom_val = &ui_g_nil_box; state->parent_stack.free = 0; state->parent_stack.auto_pop = 0;\
|
||||
state->child_layout_axis_stack.top = &state->child_layout_axis_nil_stack_top; state->child_layout_axis_stack.bottom_val = Axis2_X; state->child_layout_axis_stack.free = 0; state->child_layout_axis_stack.auto_pop = 0;\
|
||||
state->fixed_x_stack.top = &state->fixed_x_nil_stack_top; state->fixed_x_stack.bottom_val = 0; state->fixed_x_stack.free = 0; state->fixed_x_stack.auto_pop = 0;\
|
||||
state->fixed_y_stack.top = &state->fixed_y_nil_stack_top; state->fixed_y_stack.bottom_val = 0; state->fixed_y_stack.free = 0; state->fixed_y_stack.auto_pop = 0;\
|
||||
state->fixed_width_stack.top = &state->fixed_width_nil_stack_top; state->fixed_width_stack.bottom_val = 0; state->fixed_width_stack.free = 0; state->fixed_width_stack.auto_pop = 0;\
|
||||
state->fixed_height_stack.top = &state->fixed_height_nil_stack_top; state->fixed_height_stack.bottom_val = 0; state->fixed_height_stack.free = 0; state->fixed_height_stack.auto_pop = 0;\
|
||||
state->pref_width_stack.top = &state->pref_width_nil_stack_top; state->pref_width_stack.bottom_val = ui_px(250.f, 1.f); state->pref_width_stack.free = 0; state->pref_width_stack.auto_pop = 0;\
|
||||
state->pref_height_stack.top = &state->pref_height_nil_stack_top; state->pref_height_stack.bottom_val = ui_px(30.f, 1.f); state->pref_height_stack.free = 0; state->pref_height_stack.auto_pop = 0;\
|
||||
state->flags_stack.top = &state->flags_nil_stack_top; state->flags_stack.bottom_val = 0; state->flags_stack.free = 0; state->flags_stack.auto_pop = 0;\
|
||||
state->focus_hot_stack.top = &state->focus_hot_nil_stack_top; state->focus_hot_stack.bottom_val = UI_FocusKind_Null; state->focus_hot_stack.free = 0; state->focus_hot_stack.auto_pop = 0;\
|
||||
state->focus_active_stack.top = &state->focus_active_nil_stack_top; state->focus_active_stack.bottom_val = UI_FocusKind_Null; state->focus_active_stack.free = 0; state->focus_active_stack.auto_pop = 0;\
|
||||
state->fastpath_codepoint_stack.top = &state->fastpath_codepoint_nil_stack_top; state->fastpath_codepoint_stack.bottom_val = 0; state->fastpath_codepoint_stack.free = 0; state->fastpath_codepoint_stack.auto_pop = 0;\
|
||||
state->background_color_stack.top = &state->background_color_nil_stack_top; state->background_color_stack.bottom_val = v4f32(1, 0, 1, 1); state->background_color_stack.free = 0; state->background_color_stack.auto_pop = 0;\
|
||||
state->text_color_stack.top = &state->text_color_nil_stack_top; state->text_color_stack.bottom_val = v4f32(1, 0, 1, 1); state->text_color_stack.free = 0; state->text_color_stack.auto_pop = 0;\
|
||||
state->border_color_stack.top = &state->border_color_nil_stack_top; state->border_color_stack.bottom_val = v4f32(1, 0, 1, 1); state->border_color_stack.free = 0; state->border_color_stack.auto_pop = 0;\
|
||||
state->overlay_color_stack.top = &state->overlay_color_nil_stack_top; state->overlay_color_stack.bottom_val = v4f32(1, 0, 1, 1); state->overlay_color_stack.free = 0; state->overlay_color_stack.auto_pop = 0;\
|
||||
state->text_select_color_stack.top = &state->text_select_color_nil_stack_top; state->text_select_color_stack.bottom_val = v4f32(1, 0, 1, 1); state->text_select_color_stack.free = 0; state->text_select_color_stack.auto_pop = 0;\
|
||||
state->text_cursor_color_stack.top = &state->text_cursor_color_nil_stack_top; state->text_cursor_color_stack.bottom_val = v4f32(1, 0, 1, 1); state->text_cursor_color_stack.free = 0; state->text_cursor_color_stack.auto_pop = 0;\
|
||||
state->hover_cursor_stack.top = &state->hover_cursor_nil_stack_top; state->hover_cursor_stack.bottom_val = OS_Cursor_Pointer; state->hover_cursor_stack.free = 0; state->hover_cursor_stack.auto_pop = 0;\
|
||||
state->font_stack.top = &state->font_nil_stack_top; state->font_stack.bottom_val = f_tag_zero(); state->font_stack.free = 0; state->font_stack.auto_pop = 0;\
|
||||
state->font_size_stack.top = &state->font_size_nil_stack_top; state->font_size_stack.bottom_val = 24.f; state->font_size_stack.free = 0; state->font_size_stack.auto_pop = 0;\
|
||||
state->corner_radius_00_stack.top = &state->corner_radius_00_nil_stack_top; state->corner_radius_00_stack.bottom_val = 0; state->corner_radius_00_stack.free = 0; state->corner_radius_00_stack.auto_pop = 0;\
|
||||
state->corner_radius_01_stack.top = &state->corner_radius_01_nil_stack_top; state->corner_radius_01_stack.bottom_val = 0; state->corner_radius_01_stack.free = 0; state->corner_radius_01_stack.auto_pop = 0;\
|
||||
state->corner_radius_10_stack.top = &state->corner_radius_10_nil_stack_top; state->corner_radius_10_stack.bottom_val = 0; state->corner_radius_10_stack.free = 0; state->corner_radius_10_stack.auto_pop = 0;\
|
||||
state->corner_radius_11_stack.top = &state->corner_radius_11_nil_stack_top; state->corner_radius_11_stack.bottom_val = 0; state->corner_radius_11_stack.free = 0; state->corner_radius_11_stack.auto_pop = 0;\
|
||||
state->blur_size_stack.top = &state->blur_size_nil_stack_top; state->blur_size_stack.bottom_val = 0; state->blur_size_stack.free = 0; state->blur_size_stack.auto_pop = 0;\
|
||||
state->text_padding_stack.top = &state->text_padding_nil_stack_top; state->text_padding_stack.bottom_val = 2; state->text_padding_stack.free = 0; state->text_padding_stack.auto_pop = 0;\
|
||||
state->text_alignment_stack.top = &state->text_alignment_nil_stack_top; state->text_alignment_stack.bottom_val = UI_TextAlign_Left; state->text_alignment_stack.free = 0; state->text_alignment_stack.auto_pop = 0;\
|
||||
|
||||
#define UI_AutoPopStacks(state) \
|
||||
if(state->parent_stack.auto_pop) { ui_pop_parent(); state->parent_stack.auto_pop = 0; }\
|
||||
if(state->child_layout_axis_stack.auto_pop) { ui_pop_child_layout_axis(); state->child_layout_axis_stack.auto_pop = 0; }\
|
||||
if(state->fixed_x_stack.auto_pop) { ui_pop_fixed_x(); state->fixed_x_stack.auto_pop = 0; }\
|
||||
if(state->fixed_y_stack.auto_pop) { ui_pop_fixed_y(); state->fixed_y_stack.auto_pop = 0; }\
|
||||
if(state->fixed_width_stack.auto_pop) { ui_pop_fixed_width(); state->fixed_width_stack.auto_pop = 0; }\
|
||||
if(state->fixed_height_stack.auto_pop) { ui_pop_fixed_height(); state->fixed_height_stack.auto_pop = 0; }\
|
||||
if(state->pref_width_stack.auto_pop) { ui_pop_pref_width(); state->pref_width_stack.auto_pop = 0; }\
|
||||
if(state->pref_height_stack.auto_pop) { ui_pop_pref_height(); state->pref_height_stack.auto_pop = 0; }\
|
||||
if(state->flags_stack.auto_pop) { ui_pop_flags(); state->flags_stack.auto_pop = 0; }\
|
||||
if(state->focus_hot_stack.auto_pop) { ui_pop_focus_hot(); state->focus_hot_stack.auto_pop = 0; }\
|
||||
if(state->focus_active_stack.auto_pop) { ui_pop_focus_active(); state->focus_active_stack.auto_pop = 0; }\
|
||||
if(state->fastpath_codepoint_stack.auto_pop) { ui_pop_fastpath_codepoint(); state->fastpath_codepoint_stack.auto_pop = 0; }\
|
||||
if(state->background_color_stack.auto_pop) { ui_pop_background_color(); state->background_color_stack.auto_pop = 0; }\
|
||||
if(state->text_color_stack.auto_pop) { ui_pop_text_color(); state->text_color_stack.auto_pop = 0; }\
|
||||
if(state->border_color_stack.auto_pop) { ui_pop_border_color(); state->border_color_stack.auto_pop = 0; }\
|
||||
if(state->overlay_color_stack.auto_pop) { ui_pop_overlay_color(); state->overlay_color_stack.auto_pop = 0; }\
|
||||
if(state->text_select_color_stack.auto_pop) { ui_pop_text_select_color(); state->text_select_color_stack.auto_pop = 0; }\
|
||||
if(state->text_cursor_color_stack.auto_pop) { ui_pop_text_cursor_color(); state->text_cursor_color_stack.auto_pop = 0; }\
|
||||
if(state->hover_cursor_stack.auto_pop) { ui_pop_hover_cursor(); state->hover_cursor_stack.auto_pop = 0; }\
|
||||
if(state->font_stack.auto_pop) { ui_pop_font(); state->font_stack.auto_pop = 0; }\
|
||||
if(state->font_size_stack.auto_pop) { ui_pop_font_size(); state->font_size_stack.auto_pop = 0; }\
|
||||
if(state->corner_radius_00_stack.auto_pop) { ui_pop_corner_radius_00(); state->corner_radius_00_stack.auto_pop = 0; }\
|
||||
if(state->corner_radius_01_stack.auto_pop) { ui_pop_corner_radius_01(); state->corner_radius_01_stack.auto_pop = 0; }\
|
||||
if(state->corner_radius_10_stack.auto_pop) { ui_pop_corner_radius_10(); state->corner_radius_10_stack.auto_pop = 0; }\
|
||||
if(state->corner_radius_11_stack.auto_pop) { ui_pop_corner_radius_11(); state->corner_radius_11_stack.auto_pop = 0; }\
|
||||
if(state->blur_size_stack.auto_pop) { ui_pop_blur_size(); state->blur_size_stack.auto_pop = 0; }\
|
||||
if(state->text_padding_stack.auto_pop) { ui_pop_text_padding(); state->text_padding_stack.auto_pop = 0; }\
|
||||
if(state->text_alignment_stack.auto_pop) { ui_pop_text_alignment(); state->text_alignment_stack.auto_pop = 0; }\
|
||||
|
||||
internal UI_Box * ui_top_parent(void);
|
||||
internal Axis2 ui_top_child_layout_axis(void);
|
||||
internal F32 ui_top_fixed_x(void);
|
||||
@@ -151,6 +197,8 @@ internal F32 ui_top_fixed_height(void);
|
||||
internal UI_Size ui_top_pref_width(void);
|
||||
internal UI_Size ui_top_pref_height(void);
|
||||
internal UI_BoxFlags ui_top_flags(void);
|
||||
internal UI_FocusKind ui_top_focus_hot(void);
|
||||
internal UI_FocusKind ui_top_focus_active(void);
|
||||
internal U32 ui_top_fastpath_codepoint(void);
|
||||
internal Vec4F32 ui_top_background_color(void);
|
||||
internal Vec4F32 ui_top_text_color(void);
|
||||
@@ -177,6 +225,8 @@ internal F32 ui_bottom_fixed_height(void);
|
||||
internal UI_Size ui_bottom_pref_width(void);
|
||||
internal UI_Size ui_bottom_pref_height(void);
|
||||
internal UI_BoxFlags ui_bottom_flags(void);
|
||||
internal UI_FocusKind ui_bottom_focus_hot(void);
|
||||
internal UI_FocusKind ui_bottom_focus_active(void);
|
||||
internal U32 ui_bottom_fastpath_codepoint(void);
|
||||
internal Vec4F32 ui_bottom_background_color(void);
|
||||
internal Vec4F32 ui_bottom_text_color(void);
|
||||
@@ -194,6 +244,62 @@ internal F32 ui_bottom_corner_radius_11(void);
|
||||
internal F32 ui_bottom_blur_size(void);
|
||||
internal F32 ui_bottom_text_padding(void);
|
||||
internal UI_TextAlign ui_bottom_text_alignment(void);
|
||||
internal UI_Box * ui_push_parent(UI_Box * v);
|
||||
internal Axis2 ui_push_child_layout_axis(Axis2 v);
|
||||
internal F32 ui_push_fixed_x(F32 v);
|
||||
internal F32 ui_push_fixed_y(F32 v);
|
||||
internal F32 ui_push_fixed_width(F32 v);
|
||||
internal F32 ui_push_fixed_height(F32 v);
|
||||
internal UI_Size ui_push_pref_width(UI_Size v);
|
||||
internal UI_Size ui_push_pref_height(UI_Size v);
|
||||
internal UI_BoxFlags ui_push_flags(UI_BoxFlags v);
|
||||
internal UI_FocusKind ui_push_focus_hot(UI_FocusKind v);
|
||||
internal UI_FocusKind ui_push_focus_active(UI_FocusKind v);
|
||||
internal U32 ui_push_fastpath_codepoint(U32 v);
|
||||
internal Vec4F32 ui_push_background_color(Vec4F32 v);
|
||||
internal Vec4F32 ui_push_text_color(Vec4F32 v);
|
||||
internal Vec4F32 ui_push_border_color(Vec4F32 v);
|
||||
internal Vec4F32 ui_push_overlay_color(Vec4F32 v);
|
||||
internal Vec4F32 ui_push_text_select_color(Vec4F32 v);
|
||||
internal Vec4F32 ui_push_text_cursor_color(Vec4F32 v);
|
||||
internal OS_Cursor ui_push_hover_cursor(OS_Cursor v);
|
||||
internal F_Tag ui_push_font(F_Tag v);
|
||||
internal F32 ui_push_font_size(F32 v);
|
||||
internal F32 ui_push_corner_radius_00(F32 v);
|
||||
internal F32 ui_push_corner_radius_01(F32 v);
|
||||
internal F32 ui_push_corner_radius_10(F32 v);
|
||||
internal F32 ui_push_corner_radius_11(F32 v);
|
||||
internal F32 ui_push_blur_size(F32 v);
|
||||
internal F32 ui_push_text_padding(F32 v);
|
||||
internal UI_TextAlign ui_push_text_alignment(UI_TextAlign v);
|
||||
internal UI_Box * ui_pop_parent(void);
|
||||
internal Axis2 ui_pop_child_layout_axis(void);
|
||||
internal F32 ui_pop_fixed_x(void);
|
||||
internal F32 ui_pop_fixed_y(void);
|
||||
internal F32 ui_pop_fixed_width(void);
|
||||
internal F32 ui_pop_fixed_height(void);
|
||||
internal UI_Size ui_pop_pref_width(void);
|
||||
internal UI_Size ui_pop_pref_height(void);
|
||||
internal UI_BoxFlags ui_pop_flags(void);
|
||||
internal UI_FocusKind ui_pop_focus_hot(void);
|
||||
internal UI_FocusKind ui_pop_focus_active(void);
|
||||
internal U32 ui_pop_fastpath_codepoint(void);
|
||||
internal Vec4F32 ui_pop_background_color(void);
|
||||
internal Vec4F32 ui_pop_text_color(void);
|
||||
internal Vec4F32 ui_pop_border_color(void);
|
||||
internal Vec4F32 ui_pop_overlay_color(void);
|
||||
internal Vec4F32 ui_pop_text_select_color(void);
|
||||
internal Vec4F32 ui_pop_text_cursor_color(void);
|
||||
internal OS_Cursor ui_pop_hover_cursor(void);
|
||||
internal F_Tag ui_pop_font(void);
|
||||
internal F32 ui_pop_font_size(void);
|
||||
internal F32 ui_pop_corner_radius_00(void);
|
||||
internal F32 ui_pop_corner_radius_01(void);
|
||||
internal F32 ui_pop_corner_radius_10(void);
|
||||
internal F32 ui_pop_corner_radius_11(void);
|
||||
internal F32 ui_pop_blur_size(void);
|
||||
internal F32 ui_pop_text_padding(void);
|
||||
internal UI_TextAlign ui_pop_text_alignment(void);
|
||||
internal UI_Box * ui_set_next_parent(UI_Box * v);
|
||||
internal Axis2 ui_set_next_child_layout_axis(Axis2 v);
|
||||
internal F32 ui_set_next_fixed_x(F32 v);
|
||||
@@ -203,6 +309,8 @@ internal F32 ui_set_next_fixed_height(F32 v);
|
||||
internal UI_Size ui_set_next_pref_width(UI_Size v);
|
||||
internal UI_Size ui_set_next_pref_height(UI_Size v);
|
||||
internal UI_BoxFlags ui_set_next_flags(UI_BoxFlags v);
|
||||
internal UI_FocusKind ui_set_next_focus_hot(UI_FocusKind v);
|
||||
internal UI_FocusKind ui_set_next_focus_active(UI_FocusKind v);
|
||||
internal U32 ui_set_next_fastpath_codepoint(U32 v);
|
||||
internal Vec4F32 ui_set_next_background_color(Vec4F32 v);
|
||||
internal Vec4F32 ui_set_next_text_color(Vec4F32 v);
|
||||
@@ -220,33 +328,5 @@ internal F32 ui_set_next_corner_radius_11(F32 v);
|
||||
internal F32 ui_set_next_blur_size(F32 v);
|
||||
internal F32 ui_set_next_text_padding(F32 v);
|
||||
internal UI_TextAlign ui_set_next_text_alignment(UI_TextAlign v);
|
||||
#if 0
|
||||
#define UI_Parent(v) DeferLoop(ui_push_parent(v), ui_pop_parent())
|
||||
#define UI_ChildLayoutAxis(v) DeferLoop(ui_push_child_layout_axis(v), ui_pop_child_layout_axis())
|
||||
#define UI_FixedX(v) DeferLoop(ui_push_fixed_x(v), ui_pop_fixed_x())
|
||||
#define UI_FixedY(v) DeferLoop(ui_push_fixed_y(v), ui_pop_fixed_y())
|
||||
#define UI_FixedWidth(v) DeferLoop(ui_push_fixed_width(v), ui_pop_fixed_width())
|
||||
#define UI_FixedHeight(v) DeferLoop(ui_push_fixed_height(v), ui_pop_fixed_height())
|
||||
#define UI_PrefWidth(v) DeferLoop(ui_push_pref_width(v), ui_pop_pref_width())
|
||||
#define UI_PrefHeight(v) DeferLoop(ui_push_pref_height(v), ui_pop_pref_height())
|
||||
#define UI_Flags(v) DeferLoop(ui_push_flags(v), ui_pop_flags())
|
||||
#define UI_FastpathCodepoint(v) DeferLoop(ui_push_fastpath_codepoint(v), ui_pop_fastpath_codepoint())
|
||||
#define UI_BackgroundColor(v) DeferLoop(ui_push_background_color(v), ui_pop_background_color())
|
||||
#define UI_TextColor(v) DeferLoop(ui_push_text_color(v), ui_pop_text_color())
|
||||
#define UI_BorderColor(v) DeferLoop(ui_push_border_color(v), ui_pop_border_color())
|
||||
#define UI_OverlayColor(v) DeferLoop(ui_push_overlay_color(v), ui_pop_overlay_color())
|
||||
#define UI_TextSelectColor(v) DeferLoop(ui_push_text_select_color(v), ui_pop_text_select_color())
|
||||
#define UI_TextCursorColor(v) DeferLoop(ui_push_text_cursor_color(v), ui_pop_text_cursor_color())
|
||||
#define UI_HoverCursor(v) DeferLoop(ui_push_hover_cursor(v), ui_pop_hover_cursor())
|
||||
#define UI_Font(v) DeferLoop(ui_push_font(v), ui_pop_font())
|
||||
#define UI_FontSize(v) DeferLoop(ui_push_font_size(v), ui_pop_font_size())
|
||||
#define UI_CornerRadius00(v) DeferLoop(ui_push_corner_radius_00(v), ui_pop_corner_radius_00())
|
||||
#define UI_CornerRadius01(v) DeferLoop(ui_push_corner_radius_01(v), ui_pop_corner_radius_01())
|
||||
#define UI_CornerRadius10(v) DeferLoop(ui_push_corner_radius_10(v), ui_pop_corner_radius_10())
|
||||
#define UI_CornerRadius11(v) DeferLoop(ui_push_corner_radius_11(v), ui_pop_corner_radius_11())
|
||||
#define UI_BlurSize(v) DeferLoop(ui_push_blur_size(v), ui_pop_blur_size())
|
||||
#define UI_TextPadding(v) DeferLoop(ui_push_text_padding(v), ui_pop_text_padding())
|
||||
#define UI_TextAlignment(v) DeferLoop(ui_push_text_alignment(v), ui_pop_text_alignment())
|
||||
#endif
|
||||
|
||||
#endif // UI_META_H
|
||||
|
||||
+98
-55
@@ -1,114 +1,157 @@
|
||||
// Copyright (c) 2024 Epic Games Tools
|
||||
// Licensed under the MIT license (https://opensource.org/license/mit/)
|
||||
|
||||
@table(name, name_lower, type)
|
||||
//- rjf: stack table
|
||||
|
||||
@table(name, name_lower, type, default)
|
||||
UI_StackTable:
|
||||
{
|
||||
//- rjf: parents
|
||||
{ Parent parent `UI_Box *` }
|
||||
{ Parent parent `UI_Box *` `&ui_g_nil_box` }
|
||||
|
||||
//- rjf: layout params
|
||||
{ ChildLayoutAxis child_layout_axis Axis2 }
|
||||
{ ChildLayoutAxis child_layout_axis Axis2 `Axis2_X` }
|
||||
|
||||
//- rjf: size/position
|
||||
{ FixedX fixed_x F32 }
|
||||
{ FixedY fixed_y F32 }
|
||||
{ FixedWidth fixed_width F32 }
|
||||
{ FixedHeight fixed_height F32 }
|
||||
{ PrefWidth pref_width UI_Size }
|
||||
{ PrefHeight pref_height UI_Size }
|
||||
{ FixedX fixed_x F32 0 }
|
||||
{ FixedY fixed_y F32 0 }
|
||||
{ FixedWidth fixed_width F32 0 }
|
||||
{ FixedHeight fixed_height F32 0 }
|
||||
{ PrefWidth pref_width UI_Size `ui_px(250.f, 1.f)`}
|
||||
{ PrefHeight pref_height UI_Size `ui_px(30.f, 1.f)` }
|
||||
|
||||
//- rjf: flags
|
||||
{ Flags flags UI_BoxFlags }
|
||||
{ Flags flags UI_BoxFlags 0 }
|
||||
|
||||
//- rjf: interaction
|
||||
{ FastpathCodepoint fastpath_codepoint U32 }
|
||||
{ FocusHot focus_hot UI_FocusKind UI_FocusKind_Null }
|
||||
{ FocusActive focus_active UI_FocusKind UI_FocusKind_Null }
|
||||
{ FastpathCodepoint fastpath_codepoint U32 0 }
|
||||
|
||||
//- rjf: colors
|
||||
{ BackgroundColor background_color Vec4F32 }
|
||||
{ TextColor text_color Vec4F32 }
|
||||
{ BorderColor border_color Vec4F32 }
|
||||
{ OverlayColor overlay_color Vec4F32 }
|
||||
{ TextSelectColor text_select_color Vec4F32 }
|
||||
{ TextCursorColor text_cursor_color Vec4F32 }
|
||||
{ BackgroundColor background_color Vec4F32 `v4f32(1, 0, 1, 1)`}
|
||||
{ TextColor text_color Vec4F32 `v4f32(1, 0, 1, 1)`}
|
||||
{ BorderColor border_color Vec4F32 `v4f32(1, 0, 1, 1)`}
|
||||
{ OverlayColor overlay_color Vec4F32 `v4f32(1, 0, 1, 1)`}
|
||||
{ TextSelectColor text_select_color Vec4F32 `v4f32(1, 0, 1, 1)`}
|
||||
{ TextCursorColor text_cursor_color Vec4F32 `v4f32(1, 0, 1, 1)`}
|
||||
|
||||
//- rjf: hover cursor
|
||||
{ HoverCursor hover_cursor OS_Cursor }
|
||||
{ HoverCursor hover_cursor OS_Cursor OS_Cursor_Pointer }
|
||||
|
||||
//- rjf: font
|
||||
{ Font font F_Tag }
|
||||
{ FontSize font_size F32 }
|
||||
{ Font font F_Tag `f_tag_zero()` }
|
||||
{ FontSize font_size F32 24.f }
|
||||
|
||||
//- rjf: corner radii
|
||||
{ CornerRadius00 corner_radius_00 F32 }
|
||||
{ CornerRadius01 corner_radius_01 F32 }
|
||||
{ CornerRadius10 corner_radius_10 F32 }
|
||||
{ CornerRadius11 corner_radius_11 F32 }
|
||||
{ CornerRadius00 corner_radius_00 F32 0 }
|
||||
{ CornerRadius01 corner_radius_01 F32 0 }
|
||||
{ CornerRadius10 corner_radius_10 F32 0 }
|
||||
{ CornerRadius11 corner_radius_11 F32 0 }
|
||||
|
||||
//- rjf: blur size
|
||||
{ BlurSize blur_size F32 }
|
||||
{ BlurSize blur_size F32 0 }
|
||||
|
||||
//- rjf: text parameters
|
||||
{ TextPadding text_padding F32 }
|
||||
{ TextAlignment text_alignment UI_TextAlign }
|
||||
{ TextPadding text_padding F32 2 }
|
||||
{ TextAlignment text_alignment UI_TextAlign UI_TextAlign_Left }
|
||||
}
|
||||
|
||||
//- rjf: declaring stack node types
|
||||
|
||||
@table_gen
|
||||
{
|
||||
`#define UI_StackDecls struct{\\`;
|
||||
@expand(UI_StackTable a)
|
||||
`struct { $(a.type) active; $(a.type) v[64]; U64 count; B32 auto_pop; } $(a.name_lower);\\`;
|
||||
`}`;
|
||||
@expand(UI_StackTable a) `typedef struct UI_$(a.name)Node UI_$(a.name)Node; struct UI_$(a.name)Node{UI_$(a.name)Node *next; $(a.type) v;};`
|
||||
}
|
||||
|
||||
//- rjf: declaring all default stack tops
|
||||
|
||||
@table_gen
|
||||
{
|
||||
`#define UI_ZeroAllStacks(ui_state) do{\\`;
|
||||
@expand(UI_StackTable a)
|
||||
`MemoryZeroStruct(&ui_state->$(a.name_lower));\\`;
|
||||
`} while(0)`;
|
||||
`#define UI_DeclStackNils \\`;
|
||||
`struct\\`;
|
||||
`{\\`;
|
||||
@expand(UI_StackTable a) `UI_$(a.name)Node $(a.name_lower)_nil_stack_top;\\`;
|
||||
`}`;
|
||||
}
|
||||
|
||||
//- rjf: initializing all default stack tops
|
||||
|
||||
@table_gen
|
||||
{
|
||||
`#define UI_AutoPopAllStacks(ui_state) do{\\`;
|
||||
@expand(UI_StackTable a)
|
||||
`if(ui_state->$(a.name_lower).auto_pop) {ui_state->$(a.name_lower).auto_pop = 0; ui_pop_$(a.name_lower)();}\\`;
|
||||
`} while(0)`;
|
||||
`#define UI_InitStackNils(state) \\`;
|
||||
@expand(UI_StackTable a) `state->$(a.name_lower)_nil_stack_top.v = $(a.default);\\`;
|
||||
``;
|
||||
}
|
||||
|
||||
//- rjf: declaring all stack nodes & free lists
|
||||
|
||||
@table_gen
|
||||
{
|
||||
`#define UI_DeclStacks \\`;
|
||||
`struct\\`;
|
||||
`{\\`;
|
||||
@expand(UI_StackTable a) `struct { UI_$(a.name)Node *top; $(a.type) bottom_val; UI_$(a.name)Node *free; B32 auto_pop; } $(a.name_lower)_stack;\\`;
|
||||
`}`;
|
||||
}
|
||||
|
||||
//- rjf: initing all stack nodes
|
||||
|
||||
@table_gen
|
||||
{
|
||||
`#define UI_InitStacks(state) \\`;
|
||||
@expand(UI_StackTable a) `state->$(a.name_lower)_stack.top = &state->$(a.name_lower)_nil_stack_top; state->$(a.name_lower)_stack.bottom_val = $(a.default); state->$(a.name_lower)_stack.free = 0; state->$(a.name_lower)_stack.auto_pop = 0;\\`;
|
||||
``;
|
||||
}
|
||||
|
||||
//- rjf: auto-popping all stacks
|
||||
|
||||
@table_gen
|
||||
{
|
||||
`#define UI_AutoPopStacks(state) \\`
|
||||
@expand(UI_StackTable a)
|
||||
`if(state->$(a.name_lower)_stack.auto_pop) { ui_pop_$(a.name_lower)(); state->$(a.name_lower)_stack.auto_pop = 0; }\\`;
|
||||
``;
|
||||
}
|
||||
|
||||
//- rjf: decls for the stack function operation headers
|
||||
|
||||
@table_gen
|
||||
{
|
||||
@expand(UI_StackTable a)
|
||||
`internal $(a.type) $(=>35) ui_push_$(a.name_lower)($(a.type) v);`;
|
||||
@expand(UI_StackTable a)
|
||||
`internal $(a.type) $(=>35) ui_pop_$(a.name_lower)(void);`;
|
||||
@expand(UI_StackTable a)
|
||||
`internal $(a.type) $(=>35) ui_top_$(a.name_lower)(void);`;
|
||||
@expand(UI_StackTable a)
|
||||
`internal $(a.type) $(=>35) ui_bottom_$(a.name_lower)(void);`;
|
||||
@expand(UI_StackTable a)
|
||||
`internal $(a.type) $(=>35) ui_set_next_$(a.name_lower)($(a.type) v);`;
|
||||
`internal $(a.type) $(=>35) ui_top_$(a.name_lower)(void);`
|
||||
@expand(UI_StackTable a)
|
||||
`internal $(a.type) $(=>35) ui_bottom_$(a.name_lower)(void);`
|
||||
@expand(UI_StackTable a)
|
||||
`internal $(a.type) $(=>35) ui_push_$(a.name_lower)($(a.type) v);`
|
||||
@expand(UI_StackTable a)
|
||||
`internal $(a.type) $(=>35) ui_pop_$(a.name_lower)(void);`
|
||||
@expand(UI_StackTable a)
|
||||
`internal $(a.type) $(=>35) ui_set_next_$(a.name_lower)($(a.type) v);`
|
||||
}
|
||||
|
||||
@table_gen
|
||||
//- rjf: defer-loop helpers
|
||||
|
||||
@table_gen @c_file
|
||||
{
|
||||
`#if 0`;
|
||||
@expand(UI_StackTable a)
|
||||
`#define UI_$(a.name)(v) $(=>35) DeferLoop(ui_push_$(a.name_lower)(v), ui_pop_$(a.name_lower)())`;
|
||||
`#define UI_$(a.name)(v) DeferLoop(ui_push_$(a.name_lower)(v), ui_pop_$(a.name_lower)())`
|
||||
`#endif`;
|
||||
}
|
||||
|
||||
//- rjf: decls for the stack operation implementations
|
||||
|
||||
@table_gen @c_file
|
||||
{
|
||||
@expand(UI_StackTable a)
|
||||
`internal $(a.type) ui_push_$(a.name_lower)($(a.type) v) {return UI_StackPush($(a.name_lower), v);}`;
|
||||
`internal $(a.type) ui_top_$(a.name_lower)(void) { UI_StackTopImpl(ui_state, $(a.name), $(a.name_lower)) }`;
|
||||
@expand(UI_StackTable a)
|
||||
`internal $(a.type) ui_pop_$(a.name_lower)(void) {$(a.type) popped; return UI_StackPop($(a.name_lower), popped);}`;
|
||||
`internal $(a.type) ui_bottom_$(a.name_lower)(void) { UI_StackBottomImpl(ui_state, $(a.name), $(a.name_lower)) }`;
|
||||
@expand(UI_StackTable a)
|
||||
`internal $(a.type) ui_top_$(a.name_lower)(void) {return UI_StackTop($(a.name_lower));}`;
|
||||
`internal $(a.type) ui_push_$(a.name_lower)($(a.type) v) { UI_StackPushImpl(ui_state, $(a.name), $(a.name_lower), $(a.type), v) }`;
|
||||
@expand(UI_StackTable a)
|
||||
`internal $(a.type) ui_bottom_$(a.name_lower)(void) {return UI_StackBottom($(a.name_lower));}`;
|
||||
`internal $(a.type) ui_pop_$(a.name_lower)(void) { UI_StackPopImpl(ui_state, $(a.name), $(a.name_lower)) }`;
|
||||
@expand(UI_StackTable a)
|
||||
`internal $(a.type) ui_set_next_$(a.name_lower)($(a.type) v) {return UI_StackSetNext($(a.name_lower), v);}`;
|
||||
`internal $(a.type) ui_set_next_$(a.name_lower)($(a.type) v) { UI_StackSetNextImpl(ui_state, $(a.name), $(a.name_lower), $(a.type), v) }`;
|
||||
}
|
||||
|
||||
@@ -163,14 +163,18 @@ internal UI_BOX_CUSTOM_DRAW(ui_line_edit_draw)
|
||||
internal UI_Signal
|
||||
ui_line_edit(TxtPt *cursor, TxtPt *mark, U8 *edit_buffer, U64 edit_buffer_size, U64 *edit_string_size_out, String8 pre_edit_value, String8 string)
|
||||
{
|
||||
//- rjf: build top-level box
|
||||
//- rjf: make key
|
||||
UI_Key key = ui_key_from_string(ui_active_seed_key(), string);
|
||||
|
||||
//- rjf: calculate focus
|
||||
B32 is_auto_focus_hot = ui_is_key_auto_focus_hot(key);
|
||||
B32 is_auto_focus_active = ui_is_key_auto_focus_active(key);
|
||||
if(is_auto_focus_hot) { ui_set_focus_hot(1); }
|
||||
if(is_auto_focus_active) { ui_set_focus_active(1); }
|
||||
ui_push_focus_hot(is_auto_focus_hot ? UI_FocusKind_On : UI_FocusKind_Null);
|
||||
ui_push_focus_active(is_auto_focus_active ? UI_FocusKind_On : UI_FocusKind_Null);
|
||||
B32 is_focus_hot = ui_is_focus_hot();
|
||||
B32 is_focus_active = ui_is_focus_active();
|
||||
|
||||
//- rjf: build top-level box
|
||||
ui_set_next_hover_cursor(is_focus_active ? OS_Cursor_IBar : OS_Cursor_HandPoint);
|
||||
UI_Box *box = ui_build_box_from_key(UI_BoxFlag_DrawBackground|
|
||||
UI_BoxFlag_DrawBorder|
|
||||
@@ -303,6 +307,10 @@ ui_line_edit(TxtPt *cursor, TxtPt *mark, U8 *edit_buffer, U64 edit_buffer_size,
|
||||
box->view_off_target.x += max_delta;
|
||||
}
|
||||
|
||||
//- rjf: pop focus
|
||||
ui_pop_focus_hot();
|
||||
ui_pop_focus_active();
|
||||
|
||||
return sig;
|
||||
}
|
||||
|
||||
@@ -1380,7 +1388,7 @@ ui_scroll_list_begin(UI_ScrollListParams *params, UI_ScrollPt *scroll_pt, Vec2S6
|
||||
}
|
||||
|
||||
//- rjf: build vertical scroll bar
|
||||
UI_Parent(container_box)
|
||||
UI_Parent(container_box) UI_Focus(UI_FocusKind_Null)
|
||||
{
|
||||
ui_set_next_fixed_width(ui_scroll_list_scroll_bar_dim_px);
|
||||
ui_set_next_fixed_height(ui_scroll_list_dim_px.y);
|
||||
|
||||
+118
-139
@@ -430,6 +430,7 @@ ui_state_alloc(void)
|
||||
ui->drag_state_arena = arena_alloc();
|
||||
ui->box_table_size = 4096;
|
||||
ui->box_table = push_array(arena, UI_BoxHashSlot, ui->box_table_size);
|
||||
UI_InitStackNils(ui);
|
||||
return ui;
|
||||
}
|
||||
|
||||
@@ -603,7 +604,7 @@ ui_begin_build(OS_EventList *events, OS_Handle window, UI_NavActionList *nav_act
|
||||
{
|
||||
//- rjf: reset per-build ui state
|
||||
{
|
||||
UI_ZeroAllStacks(ui_state);
|
||||
UI_InitStacks(ui_state);
|
||||
ui_state->root = &ui_g_nil_box;
|
||||
ui_state->ctx_menu_touched_this_frame = 0;
|
||||
ui_state->is_animating = 0;
|
||||
@@ -905,7 +906,8 @@ ui_begin_build(OS_EventList *events, OS_Handle window, UI_NavActionList *nav_act
|
||||
ui_state->ctx_menu_anchor_box_last_pos = anchor_box->rect.p0;
|
||||
}
|
||||
Vec2F32 anchor = add_2f32(ui_state->ctx_menu_anchor_box_last_pos, ui_state->ctx_menu_anchor_off);
|
||||
UI_FixedX(anchor.x) UI_FixedY(anchor.y) UI_PrefWidth(ui_children_sum(1.f)) UI_PrefHeight(ui_children_sum(1.f)) UI_Focus(ui_state->ctx_menu_open)
|
||||
UI_FixedX(anchor.x) UI_FixedY(anchor.y) UI_PrefWidth(ui_children_sum(1.f)) UI_PrefHeight(ui_children_sum(1.f))
|
||||
UI_Focus(UI_FocusKind_On)
|
||||
{
|
||||
ui_set_next_child_layout_axis(Axis2_Y);
|
||||
ui_state->ctx_menu_root = ui_build_box_from_stringf(UI_BoxFlag_Clickable|UI_BoxFlag_DrawDropShadow|(ui_state->ctx_menu_open*UI_BoxFlag_DefaultFocusNavY), "###ctx_menu_%I64x", window.u64[0]);
|
||||
@@ -961,15 +963,6 @@ ui_begin_build(OS_EventList *events, OS_Handle window, UI_NavActionList *nav_act
|
||||
{
|
||||
ui_state->time_since_last_click[side] += real_dt;
|
||||
}
|
||||
|
||||
|
||||
//- rjf: push initial stack values
|
||||
ui_push_pref_width(ui_px(150.f, 0.4f));
|
||||
ui_push_pref_height(ui_px(25.f, 1.f));
|
||||
ui_push_background_color(v4f32(0.1f, 0.1f, 0.1f, 0.8f));
|
||||
ui_push_text_color(v4f32(1, 1, 1, 0.8f));
|
||||
ui_push_border_color(v4f32(1, 1, 1, 0.1f));
|
||||
ui_push_corner_radius(0.f);
|
||||
}
|
||||
|
||||
internal void
|
||||
@@ -1666,12 +1659,16 @@ ui_begin_ctx_menu(UI_Key key)
|
||||
}
|
||||
ui_push_pref_width(ui_bottom_pref_width());
|
||||
ui_push_pref_height(ui_bottom_pref_height());
|
||||
ui_push_focus_hot(UI_FocusKind_Root);
|
||||
ui_push_focus_active(UI_FocusKind_Root);
|
||||
return result;
|
||||
}
|
||||
|
||||
internal void
|
||||
ui_end_ctx_menu(void)
|
||||
{
|
||||
ui_pop_focus_active();
|
||||
ui_pop_focus_hot();
|
||||
ui_pop_pref_width();
|
||||
ui_pop_pref_height();
|
||||
ui_pop_parent();
|
||||
@@ -1692,49 +1689,22 @@ ui_any_ctx_menu_is_open(void)
|
||||
|
||||
//- rjf: focus tree coloring
|
||||
|
||||
internal void
|
||||
ui_set_focus_active(B32 check)
|
||||
{
|
||||
ui_state->focus_active_is_set = check;
|
||||
ui_state->focus_active_is_possible = 1;
|
||||
}
|
||||
|
||||
internal void
|
||||
ui_unset_focus_active(void)
|
||||
{
|
||||
ui_state->focus_active_is_set = 0;
|
||||
ui_state->focus_active_is_possible = 0;
|
||||
}
|
||||
|
||||
internal void
|
||||
ui_set_focus_hot(B32 check)
|
||||
{
|
||||
ui_state->focus_hot_is_set = check;
|
||||
ui_state->focus_hot_is_possible = 1;
|
||||
}
|
||||
|
||||
internal void
|
||||
ui_unset_focus_hot(void)
|
||||
{
|
||||
ui_state->focus_hot_is_set = 0;
|
||||
ui_state->focus_hot_is_possible = 0;
|
||||
}
|
||||
|
||||
internal B32
|
||||
ui_is_focus_active(void)
|
||||
ui_is_focus_hot(void)
|
||||
{
|
||||
B32 result = ui_state->focus_active_is_set;
|
||||
B32 result = (ui_state->focus_hot_stack.top->v == UI_FocusKind_On);
|
||||
if(result)
|
||||
{
|
||||
for(UI_Box *box = ui_top_parent(); !ui_box_is_nil(box); box = box->parent)
|
||||
for(UI_FocusHotNode *n = ui_state->focus_hot_stack.top; n != 0; n = n->next)
|
||||
{
|
||||
if(box->flags & UI_BoxFlag_FocusActive)
|
||||
if(n->v == UI_FocusKind_Root)
|
||||
{
|
||||
result = !(box->flags & UI_BoxFlag_FocusActiveDisabled);
|
||||
if(result == 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
if(n->v == UI_FocusKind_Off)
|
||||
{
|
||||
result = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1742,20 +1712,21 @@ ui_is_focus_active(void)
|
||||
}
|
||||
|
||||
internal B32
|
||||
ui_is_focus_hot(void)
|
||||
ui_is_focus_active(void)
|
||||
{
|
||||
B32 result = ui_state->focus_hot_is_set;
|
||||
B32 result = (ui_state->focus_active_stack.top->v == UI_FocusKind_On);
|
||||
if(result)
|
||||
{
|
||||
for(UI_Box *box = ui_top_parent(); !ui_box_is_nil(box); box = box->parent)
|
||||
for(UI_FocusActiveNode *n = ui_state->focus_active_stack.top; n != 0; n = n->next)
|
||||
{
|
||||
if(box->flags & UI_BoxFlag_FocusHot)
|
||||
if(n->v == UI_FocusKind_Root)
|
||||
{
|
||||
result = !(box->flags & UI_BoxFlag_FocusHotDisabled);
|
||||
if(result == 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
if(n->v == UI_FocusKind_Off)
|
||||
{
|
||||
result = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1901,8 +1872,8 @@ ui_build_box_from_key(UI_BoxFlags flags, UI_Key key)
|
||||
//- rjf: fill box
|
||||
{
|
||||
box->key = key;
|
||||
box->flags = flags|ui_state->flags.active;
|
||||
box->fastpath_codepoint = ui_state->fastpath_codepoint.active;
|
||||
box->flags = flags|ui_state->flags_stack.top->v;
|
||||
box->fastpath_codepoint = ui_state->fastpath_codepoint_stack.top->v;
|
||||
|
||||
if(ui_is_focus_active() && (box->flags & UI_BoxFlag_DefaultFocusNav) && ui_key_match(ui_state->default_nav_root_key, ui_key_zero()))
|
||||
{
|
||||
@@ -1921,87 +1892,77 @@ ui_build_box_from_key(UI_BoxFlags flags, UI_Key key)
|
||||
box->first_disabled_build_index = ui_state->build_index;
|
||||
}
|
||||
|
||||
if(ui_state->fixed_x.count != 0)
|
||||
if(ui_state->fixed_x_stack.top != &ui_state->fixed_x_nil_stack_top)
|
||||
{
|
||||
box->flags |= UI_BoxFlag_FloatingX;
|
||||
box->fixed_position.x = ui_state->fixed_x.active;
|
||||
box->fixed_position.x = ui_state->fixed_x_stack.top->v;
|
||||
}
|
||||
if(ui_state->fixed_y.count != 0)
|
||||
if(ui_state->fixed_y_stack.top != &ui_state->fixed_y_nil_stack_top)
|
||||
{
|
||||
box->flags |= UI_BoxFlag_FloatingY;
|
||||
box->fixed_position.y = ui_state->fixed_y.active;
|
||||
box->fixed_position.y = ui_state->fixed_y_stack.top->v;
|
||||
}
|
||||
if(ui_state->fixed_width.count != 0)
|
||||
if(ui_state->fixed_width_stack.top != &ui_state->fixed_width_nil_stack_top)
|
||||
{
|
||||
box->flags |= UI_BoxFlag_FixedWidth;
|
||||
box->fixed_size.x = ui_state->fixed_width.active;
|
||||
box->fixed_size.x = ui_state->fixed_width_stack.top->v;
|
||||
}
|
||||
else
|
||||
{
|
||||
box->pref_size[Axis2_X] = ui_state->pref_width.active;
|
||||
box->pref_size[Axis2_X] = ui_state->pref_width_stack.top->v;
|
||||
}
|
||||
if(ui_state->fixed_height.count != 0)
|
||||
if(ui_state->fixed_height_stack.top != &ui_state->fixed_height_nil_stack_top)
|
||||
{
|
||||
box->flags |= UI_BoxFlag_FixedHeight;
|
||||
box->fixed_size.y = ui_state->fixed_height.active;
|
||||
box->fixed_size.y = ui_state->fixed_height_stack.top->v;
|
||||
}
|
||||
else
|
||||
{
|
||||
box->pref_size[Axis2_Y] = ui_state->pref_height.active;
|
||||
box->pref_size[Axis2_Y] = ui_state->pref_height_stack.top->v;
|
||||
}
|
||||
|
||||
B32 is_auto_focus_active = ui_is_key_auto_focus_active(key);
|
||||
B32 is_auto_focus_hot = ui_is_key_auto_focus_hot(key);
|
||||
if(is_auto_focus_active)
|
||||
{
|
||||
ui_state->focus_active_is_possible = ui_state->focus_active_is_set = 1;
|
||||
ui_set_next_focus_active(UI_FocusKind_On);
|
||||
}
|
||||
if(is_auto_focus_hot)
|
||||
{
|
||||
ui_state->focus_hot_is_possible = ui_state->focus_hot_is_set = 1;
|
||||
ui_set_next_focus_hot(UI_FocusKind_On);
|
||||
}
|
||||
box->flags |= UI_BoxFlag_FocusHot*!!(ui_state->focus_hot_is_possible);
|
||||
box->flags |= UI_BoxFlag_FocusActive*!!(ui_state->focus_active_is_possible);
|
||||
box->flags |= UI_BoxFlag_FocusHotDisabled*(!(ui_state->focus_hot_is_set) && ui_state->focus_hot_is_possible);
|
||||
box->flags |= UI_BoxFlag_FocusActiveDisabled*(!(ui_state->focus_active_is_set) && ui_state->focus_active_is_possible);
|
||||
if((box->flags & UI_BoxFlag_FocusHot && ~box->flags & UI_BoxFlag_FocusHotDisabled) ||
|
||||
(box->flags & UI_BoxFlag_FocusActive && ~box->flags & UI_BoxFlag_FocusActiveDisabled))
|
||||
box->flags |= UI_BoxFlag_FocusHot * (ui_state->focus_hot_stack.top->v == UI_FocusKind_On);
|
||||
box->flags |= UI_BoxFlag_FocusActive * (ui_state->focus_active_stack.top->v == UI_FocusKind_On);
|
||||
if(box->flags & UI_BoxFlag_FocusHot && !ui_is_focus_hot())
|
||||
{
|
||||
for(UI_Box *p = box->parent; !ui_box_is_nil(p); p = p->parent)
|
||||
{
|
||||
if(p->flags & (UI_BoxFlag_FocusHotDisabled|UI_BoxFlag_FocusActiveDisabled))
|
||||
{
|
||||
box->flags |= (UI_BoxFlag_FocusHotDisabled|UI_BoxFlag_FocusActiveDisabled);
|
||||
break;
|
||||
}
|
||||
}
|
||||
box->flags |= UI_BoxFlag_FocusHotDisabled;
|
||||
}
|
||||
if(box->flags & UI_BoxFlag_FocusActive && !ui_is_focus_active())
|
||||
{
|
||||
box->flags |= UI_BoxFlag_FocusActiveDisabled;
|
||||
}
|
||||
ui_state->focus_hot_is_set = 0;
|
||||
ui_state->focus_hot_is_possible = 0;
|
||||
ui_state->focus_active_is_set = 0;
|
||||
ui_state->focus_active_is_possible = 0;
|
||||
|
||||
box->text_align = ui_state->text_alignment.active;
|
||||
box->child_layout_axis = ui_state->child_layout_axis.active;
|
||||
box->background_color = ui_state->background_color.active;
|
||||
box->text_color = ui_state->text_color.active;
|
||||
box->border_color = ui_state->border_color.active;
|
||||
box->overlay_color = ui_state->overlay_color.active;
|
||||
box->font = ui_state->font.active;
|
||||
box->font_size = ui_state->font_size.active;
|
||||
box->corner_radii[Corner_00] = ui_state->corner_radius_00.active;
|
||||
box->corner_radii[Corner_01] = ui_state->corner_radius_01.active;
|
||||
box->corner_radii[Corner_10] = ui_state->corner_radius_10.active;
|
||||
box->corner_radii[Corner_11] = ui_state->corner_radius_11.active;
|
||||
box->blur_size = ui_state->blur_size.active;
|
||||
box->text_padding = ui_state->text_padding.active;
|
||||
box->hover_cursor = ui_state->hover_cursor.active;
|
||||
box->text_align = ui_state->text_alignment_stack.top->v;
|
||||
box->child_layout_axis = ui_state->child_layout_axis_stack.top->v;
|
||||
box->background_color = ui_state->background_color_stack.top->v;
|
||||
box->text_color = ui_state->text_color_stack.top->v;
|
||||
box->border_color = ui_state->border_color_stack.top->v;
|
||||
box->overlay_color = ui_state->overlay_color_stack.top->v;
|
||||
box->font = ui_state->font_stack.top->v;
|
||||
box->font_size = ui_state->font_size_stack.top->v;
|
||||
box->corner_radii[Corner_00] = ui_state->corner_radius_00_stack.top->v;
|
||||
box->corner_radii[Corner_01] = ui_state->corner_radius_01_stack.top->v;
|
||||
box->corner_radii[Corner_10] = ui_state->corner_radius_10_stack.top->v;
|
||||
box->corner_radii[Corner_11] = ui_state->corner_radius_11_stack.top->v;
|
||||
box->blur_size = ui_state->blur_size_stack.top->v;
|
||||
box->text_padding = ui_state->text_padding_stack.top->v;
|
||||
box->hover_cursor = ui_state->hover_cursor_stack.top->v;
|
||||
box->custom_draw = 0;
|
||||
}
|
||||
|
||||
//- rjf: auto-pop all stacks
|
||||
{
|
||||
UI_AutoPopAllStacks(ui_state);
|
||||
UI_AutoPopStacks(ui_state);
|
||||
}
|
||||
|
||||
//- rjf: return
|
||||
@@ -2070,14 +2031,14 @@ ui_box_equip_display_string(UI_Box *box, String8 string)
|
||||
ProfBeginFunction();
|
||||
box->string = push_str8_copy(ui_build_arena(), string);
|
||||
box->flags |= UI_BoxFlag_HasDisplayString;
|
||||
if(box->flags & UI_BoxFlag_DrawText && (!(box->flags & UI_BoxFlag_DrawTextFastpathCodepoint) || box->fastpath_codepoint == 0))
|
||||
if(box->flags & UI_BoxFlag_DrawText && (box->fastpath_codepoint == 0 || !(box->flags & UI_BoxFlag_DrawTextFastpathCodepoint)))
|
||||
{
|
||||
String8 display_string = ui_box_display_string(box);
|
||||
D_FancyStringNode fancy_string_n = {0, {box->font, display_string, box->text_color, box->font_size, 0, 0}};
|
||||
D_FancyStringList fancy_strings = {&fancy_string_n, &fancy_string_n, 1};
|
||||
box->display_string_runs = d_fancy_run_list_from_fancy_string_list(ui_build_arena(), &fancy_strings);
|
||||
}
|
||||
if(box->flags & UI_BoxFlag_DrawText && box->flags & UI_BoxFlag_DrawTextFastpathCodepoint && box->fastpath_codepoint != 0)
|
||||
else if(box->flags & UI_BoxFlag_DrawText && box->flags & UI_BoxFlag_DrawTextFastpathCodepoint && box->fastpath_codepoint != 0)
|
||||
{
|
||||
Temp scratch = scratch_begin(0, 0);
|
||||
String8 display_string = ui_box_display_string(box);
|
||||
@@ -2254,8 +2215,6 @@ ui_signal_from_box(UI_Box *box)
|
||||
UI_Signal result = {0};
|
||||
result.box = box;
|
||||
result.event_flags = os_get_event_flags();
|
||||
Vec2F32 mouse = ui_state->mouse;
|
||||
B32 mouse_is_over = contains_2f32(box->rect, mouse);
|
||||
B32 disabled = !!(box->flags & UI_BoxFlag_Disabled);
|
||||
B32 is_focused = !!(box->flags & UI_BoxFlag_FocusHot) && !(box->flags & UI_BoxFlag_FocusHotDisabled);
|
||||
|
||||
@@ -2287,6 +2246,14 @@ ui_signal_from_box(UI_Box *box)
|
||||
}
|
||||
}
|
||||
|
||||
//- rjf: unpack mouse position info
|
||||
Vec2F32 mouse = ui_state->mouse;
|
||||
if(left_press != 0) { mouse = left_press->pos; }
|
||||
if(left_release != 0) { mouse = left_release->pos; }
|
||||
if(right_press != 0) { mouse = right_press->pos; }
|
||||
if(right_release != 0) { mouse = right_release->pos; }
|
||||
B32 mouse_is_over = contains_2f32(box->rect, mouse);
|
||||
|
||||
//- rjf: check for parent that is clipping
|
||||
if(box->flags & (UI_BoxFlag_Clickable|UI_BoxFlag_ViewScroll) && mouse_is_over)
|
||||
{
|
||||
@@ -2476,7 +2443,8 @@ ui_signal_from_box(UI_Box *box)
|
||||
B32 keyboard_click = 0;
|
||||
if(!disabled && is_focused && box->flags & UI_BoxFlag_KeyboardClickable)
|
||||
{
|
||||
if(os_key_press(ui_events(), ui_window(), 0, OS_Key_Return))
|
||||
if(os_key_press(ui_events(), ui_window(), 0, OS_Key_Return) != 0 ||
|
||||
os_key_press(ui_events(), ui_window(), 0, OS_Key_Space) != 0)
|
||||
{
|
||||
keyboard_click = 1;
|
||||
result.clicked = 1;
|
||||
@@ -2603,35 +2571,6 @@ ui_signal_from_box(UI_Box *box)
|
||||
////////////////////////////////
|
||||
//~ rjf: Stacks
|
||||
|
||||
#define UI_StackPush(name, new_top)\
|
||||
(\
|
||||
(ui_state->name.v[ui_state->name.count] = ui_state->name.active),\
|
||||
(ui_state->name.active = new_top),\
|
||||
(ui_state->name.count += 1),\
|
||||
(ui_state->name.v[ui_state->name.count-1])\
|
||||
)
|
||||
#define UI_StackPop(name, popped)\
|
||||
(\
|
||||
(ui_state->name.count -= 1),\
|
||||
(popped = ui_state->name.active),\
|
||||
(ui_state->name.active = ui_state->name.v[ui_state->name.count]),\
|
||||
(popped)\
|
||||
)
|
||||
#define UI_StackSetNext(name, new_top)\
|
||||
(\
|
||||
(ui_state->name.auto_pop) ?\
|
||||
(ui_state->name.active = new_top) :\
|
||||
(\
|
||||
(ui_state->name.v[ui_state->name.count] = ui_state->name.active),\
|
||||
(ui_state->name.active = new_top),\
|
||||
(ui_state->name.count += 1),\
|
||||
(ui_state->name.auto_pop = 1),\
|
||||
(ui_state->name.v[ui_state->name.count-1])\
|
||||
)\
|
||||
)
|
||||
#define UI_StackTop(name) (ui_state->name.active)
|
||||
#define UI_StackBottom(name) (ui_state->name.count > 1 ? ui_state->name.v[1] : ui_state->name.active)
|
||||
|
||||
//- rjf: helpers
|
||||
|
||||
internal Rng2F32
|
||||
@@ -2710,4 +2649,44 @@ ui_pop_corner_radius(void)
|
||||
////////////////////////////////
|
||||
//~ rjf: Generated Code
|
||||
|
||||
#define UI_StackTopImpl(state, name_upper, name_lower) \
|
||||
return state->name_lower##_stack.top->v;
|
||||
|
||||
#define UI_StackBottomImpl(state, name_upper, name_lower) \
|
||||
return state->name_lower##_stack.bottom_val;
|
||||
|
||||
#define UI_StackPushImpl(state, name_upper, name_lower, type, new_value) \
|
||||
UI_##name_upper##Node *node = state->name_lower##_stack.free;\
|
||||
if(node != 0) {SLLStackPop(state->name_lower##_stack.free);}\
|
||||
else {node = push_array(ui_build_arena(), UI_##name_upper##Node, 1);}\
|
||||
type old_value = state->name_lower##_stack.top->v;\
|
||||
node->v = new_value;\
|
||||
SLLStackPush(state->name_lower##_stack.top, node);\
|
||||
if(node->next == &state->name_lower##_nil_stack_top)\
|
||||
{\
|
||||
state->name_lower##_stack.bottom_val = (new_value);\
|
||||
}\
|
||||
state->name_lower##_stack.auto_pop = 0;\
|
||||
return old_value;
|
||||
|
||||
#define UI_StackPopImpl(state, name_upper, name_lower) \
|
||||
UI_##name_upper##Node *popped = state->name_lower##_stack.top;\
|
||||
if(popped != &state->name_lower##_nil_stack_top)\
|
||||
{\
|
||||
SLLStackPop(state->name_lower##_stack.top);\
|
||||
SLLStackPush(state->name_lower##_stack.free, popped);\
|
||||
state->name_lower##_stack.auto_pop = 0;\
|
||||
}\
|
||||
return popped->v;\
|
||||
|
||||
#define UI_StackSetNextImpl(state, name_upper, name_lower, type, new_value) \
|
||||
UI_##name_upper##Node *node = state->name_lower##_stack.free;\
|
||||
if(node != 0) {SLLStackPop(state->name_lower##_stack.free);}\
|
||||
else {node = push_array(ui_build_arena(), UI_##name_upper##Node, 1);}\
|
||||
type old_value = state->name_lower##_stack.top->v;\
|
||||
node->v = new_value;\
|
||||
SLLStackPush(state->name_lower##_stack.top, node);\
|
||||
state->name_lower##_stack.auto_pop = 1;\
|
||||
return old_value;
|
||||
|
||||
#include "generated/ui.meta.c"
|
||||
|
||||
+107
-95
@@ -31,6 +31,19 @@ struct UI_IconInfo
|
||||
String8 icon_kind_text_map[UI_IconKind_COUNT];
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Focus Types
|
||||
|
||||
typedef enum UI_FocusKind
|
||||
{
|
||||
UI_FocusKind_Null,
|
||||
UI_FocusKind_Off,
|
||||
UI_FocusKind_On,
|
||||
UI_FocusKind_Root,
|
||||
UI_FocusKind_COUNT
|
||||
}
|
||||
UI_FocusKind;
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Navigation Types
|
||||
|
||||
@@ -412,14 +425,9 @@ struct UI_State
|
||||
F32 ctx_menu_open_t;
|
||||
UI_Key ctx_menu_key;
|
||||
|
||||
//- rjf: build phase focus masks
|
||||
B32 focus_hot_is_set;
|
||||
B32 focus_hot_is_possible;
|
||||
B32 focus_active_is_set;
|
||||
B32 focus_active_is_possible;
|
||||
|
||||
//- rjf: build phase stacks
|
||||
UI_StackDecls;
|
||||
UI_DeclStackNils;
|
||||
UI_DeclStacks;
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
@@ -558,12 +566,8 @@ internal B32 ui_ctx_menu_is_open(UI_Key key);
|
||||
internal B32 ui_any_ctx_menu_is_open(void);
|
||||
|
||||
//- rjf: focus tree coloring
|
||||
internal void ui_set_focus_active(B32 check);
|
||||
internal void ui_unset_focus_active(void);
|
||||
internal void ui_set_focus_hot(B32 check);
|
||||
internal void ui_unset_focus_hot(void);
|
||||
internal B32 ui_is_focus_active(void);
|
||||
internal B32 ui_is_focus_hot(void);
|
||||
internal B32 ui_is_focus_active(void);
|
||||
|
||||
//- rjf: implicit auto-managed tree-based focus state
|
||||
internal B32 ui_is_key_auto_focus_active(UI_Key key);
|
||||
@@ -601,58 +605,6 @@ internal UI_Signal ui_signal_from_box(UI_Box *box);
|
||||
//~ rjf: Stacks
|
||||
|
||||
//- rjf: base
|
||||
internal UI_Box * ui_push_parent(UI_Box * v);
|
||||
internal Axis2 ui_push_child_layout_axis(Axis2 v);
|
||||
internal F32 ui_push_fixed_x(F32 v);
|
||||
internal F32 ui_push_fixed_y(F32 v);
|
||||
internal F32 ui_push_fixed_width(F32 v);
|
||||
internal F32 ui_push_fixed_height(F32 v);
|
||||
internal UI_Size ui_push_pref_width(UI_Size v);
|
||||
internal UI_Size ui_push_pref_height(UI_Size v);
|
||||
internal UI_BoxFlags ui_push_flags(UI_BoxFlags v);
|
||||
internal U32 ui_push_fastpath_codepoint(U32 v);
|
||||
internal Vec4F32 ui_push_background_color(Vec4F32 v);
|
||||
internal Vec4F32 ui_push_text_color(Vec4F32 v);
|
||||
internal Vec4F32 ui_push_border_color(Vec4F32 v);
|
||||
internal Vec4F32 ui_push_overlay_color(Vec4F32 v);
|
||||
internal Vec4F32 ui_push_text_select_color(Vec4F32 v);
|
||||
internal Vec4F32 ui_push_text_cursor_color(Vec4F32 v);
|
||||
internal OS_Cursor ui_push_hover_cursor(OS_Cursor v);
|
||||
internal F_Tag ui_push_font(F_Tag v);
|
||||
internal F32 ui_push_font_size(F32 v);
|
||||
internal F32 ui_push_corner_radius_00(F32 v);
|
||||
internal F32 ui_push_corner_radius_01(F32 v);
|
||||
internal F32 ui_push_corner_radius_10(F32 v);
|
||||
internal F32 ui_push_corner_radius_11(F32 v);
|
||||
internal F32 ui_push_blur_size(F32 v);
|
||||
internal F32 ui_push_text_padding(F32 v);
|
||||
internal UI_TextAlign ui_push_text_alignment(UI_TextAlign v);
|
||||
internal UI_Box * ui_pop_parent(void);
|
||||
internal Axis2 ui_pop_child_layout_axis(void);
|
||||
internal F32 ui_pop_fixed_x(void);
|
||||
internal F32 ui_pop_fixed_y(void);
|
||||
internal F32 ui_pop_fixed_width(void);
|
||||
internal F32 ui_pop_fixed_height(void);
|
||||
internal UI_Size ui_pop_pref_width(void);
|
||||
internal UI_Size ui_pop_pref_height(void);
|
||||
internal UI_BoxFlags ui_pop_flags(void);
|
||||
internal U32 ui_pop_fastpath_codepoint(void);
|
||||
internal Vec4F32 ui_pop_background_color(void);
|
||||
internal Vec4F32 ui_pop_text_color(void);
|
||||
internal Vec4F32 ui_pop_border_color(void);
|
||||
internal Vec4F32 ui_pop_overlay_color(void);
|
||||
internal Vec4F32 ui_pop_text_select_color(void);
|
||||
internal Vec4F32 ui_pop_text_cursor_color(void);
|
||||
internal OS_Cursor ui_pop_hover_cursor(void);
|
||||
internal F_Tag ui_pop_font(void);
|
||||
internal F32 ui_pop_font_size(void);
|
||||
internal F32 ui_pop_corner_radius_00(void);
|
||||
internal F32 ui_pop_corner_radius_01(void);
|
||||
internal F32 ui_pop_corner_radius_10(void);
|
||||
internal F32 ui_pop_corner_radius_11(void);
|
||||
internal F32 ui_pop_blur_size(void);
|
||||
internal F32 ui_pop_text_padding(void);
|
||||
internal UI_TextAlign ui_pop_text_alignment(void);
|
||||
internal UI_Box * ui_top_parent(void);
|
||||
internal Axis2 ui_top_child_layout_axis(void);
|
||||
internal F32 ui_top_fixed_x(void);
|
||||
@@ -662,6 +614,8 @@ internal F32 ui_top_fixed_height(void);
|
||||
internal UI_Size ui_top_pref_width(void);
|
||||
internal UI_Size ui_top_pref_height(void);
|
||||
internal UI_BoxFlags ui_top_flags(void);
|
||||
internal UI_FocusKind ui_top_focus_hot(void);
|
||||
internal UI_FocusKind ui_top_focus_active(void);
|
||||
internal U32 ui_top_fastpath_codepoint(void);
|
||||
internal Vec4F32 ui_top_background_color(void);
|
||||
internal Vec4F32 ui_top_text_color(void);
|
||||
@@ -688,6 +642,8 @@ internal F32 ui_bottom_fixed_height(void);
|
||||
internal UI_Size ui_bottom_pref_width(void);
|
||||
internal UI_Size ui_bottom_pref_height(void);
|
||||
internal UI_BoxFlags ui_bottom_flags(void);
|
||||
internal UI_FocusKind ui_bottom_focus_hot(void);
|
||||
internal UI_FocusKind ui_bottom_focus_active(void);
|
||||
internal U32 ui_bottom_fastpath_codepoint(void);
|
||||
internal Vec4F32 ui_bottom_background_color(void);
|
||||
internal Vec4F32 ui_bottom_text_color(void);
|
||||
@@ -705,6 +661,62 @@ internal F32 ui_bottom_corner_radius_11(void);
|
||||
internal F32 ui_bottom_blur_size(void);
|
||||
internal F32 ui_bottom_text_padding(void);
|
||||
internal UI_TextAlign ui_bottom_text_alignment(void);
|
||||
internal UI_Box * ui_push_parent(UI_Box * v);
|
||||
internal Axis2 ui_push_child_layout_axis(Axis2 v);
|
||||
internal F32 ui_push_fixed_x(F32 v);
|
||||
internal F32 ui_push_fixed_y(F32 v);
|
||||
internal F32 ui_push_fixed_width(F32 v);
|
||||
internal F32 ui_push_fixed_height(F32 v);
|
||||
internal UI_Size ui_push_pref_width(UI_Size v);
|
||||
internal UI_Size ui_push_pref_height(UI_Size v);
|
||||
internal UI_BoxFlags ui_push_flags(UI_BoxFlags v);
|
||||
internal UI_FocusKind ui_push_focus_hot(UI_FocusKind v);
|
||||
internal UI_FocusKind ui_push_focus_active(UI_FocusKind v);
|
||||
internal U32 ui_push_fastpath_codepoint(U32 v);
|
||||
internal Vec4F32 ui_push_background_color(Vec4F32 v);
|
||||
internal Vec4F32 ui_push_text_color(Vec4F32 v);
|
||||
internal Vec4F32 ui_push_border_color(Vec4F32 v);
|
||||
internal Vec4F32 ui_push_overlay_color(Vec4F32 v);
|
||||
internal Vec4F32 ui_push_text_select_color(Vec4F32 v);
|
||||
internal Vec4F32 ui_push_text_cursor_color(Vec4F32 v);
|
||||
internal OS_Cursor ui_push_hover_cursor(OS_Cursor v);
|
||||
internal F_Tag ui_push_font(F_Tag v);
|
||||
internal F32 ui_push_font_size(F32 v);
|
||||
internal F32 ui_push_corner_radius_00(F32 v);
|
||||
internal F32 ui_push_corner_radius_01(F32 v);
|
||||
internal F32 ui_push_corner_radius_10(F32 v);
|
||||
internal F32 ui_push_corner_radius_11(F32 v);
|
||||
internal F32 ui_push_blur_size(F32 v);
|
||||
internal F32 ui_push_text_padding(F32 v);
|
||||
internal UI_TextAlign ui_push_text_alignment(UI_TextAlign v);
|
||||
internal UI_Box * ui_pop_parent(void);
|
||||
internal Axis2 ui_pop_child_layout_axis(void);
|
||||
internal F32 ui_pop_fixed_x(void);
|
||||
internal F32 ui_pop_fixed_y(void);
|
||||
internal F32 ui_pop_fixed_width(void);
|
||||
internal F32 ui_pop_fixed_height(void);
|
||||
internal UI_Size ui_pop_pref_width(void);
|
||||
internal UI_Size ui_pop_pref_height(void);
|
||||
internal UI_BoxFlags ui_pop_flags(void);
|
||||
internal UI_FocusKind ui_pop_focus_hot(void);
|
||||
internal UI_FocusKind ui_pop_focus_active(void);
|
||||
internal U32 ui_pop_fastpath_codepoint(void);
|
||||
internal Vec4F32 ui_pop_background_color(void);
|
||||
internal Vec4F32 ui_pop_text_color(void);
|
||||
internal Vec4F32 ui_pop_border_color(void);
|
||||
internal Vec4F32 ui_pop_overlay_color(void);
|
||||
internal Vec4F32 ui_pop_text_select_color(void);
|
||||
internal Vec4F32 ui_pop_text_cursor_color(void);
|
||||
internal OS_Cursor ui_pop_hover_cursor(void);
|
||||
internal F_Tag ui_pop_font(void);
|
||||
internal F32 ui_pop_font_size(void);
|
||||
internal F32 ui_pop_corner_radius_00(void);
|
||||
internal F32 ui_pop_corner_radius_01(void);
|
||||
internal F32 ui_pop_corner_radius_10(void);
|
||||
internal F32 ui_pop_corner_radius_11(void);
|
||||
internal F32 ui_pop_blur_size(void);
|
||||
internal F32 ui_pop_text_padding(void);
|
||||
internal UI_TextAlign ui_pop_text_alignment(void);
|
||||
internal UI_Box * ui_set_next_parent(UI_Box * v);
|
||||
internal Axis2 ui_set_next_child_layout_axis(Axis2 v);
|
||||
internal F32 ui_set_next_fixed_x(F32 v);
|
||||
@@ -714,6 +726,8 @@ internal F32 ui_set_next_fixed_height(F32 v);
|
||||
internal UI_Size ui_set_next_pref_width(UI_Size v);
|
||||
internal UI_Size ui_set_next_pref_height(UI_Size v);
|
||||
internal UI_BoxFlags ui_set_next_flags(UI_BoxFlags v);
|
||||
internal UI_FocusKind ui_set_next_focus_hot(UI_FocusKind v);
|
||||
internal UI_FocusKind ui_set_next_focus_active(UI_FocusKind v);
|
||||
internal U32 ui_set_next_fastpath_codepoint(U32 v);
|
||||
internal Vec4F32 ui_set_next_background_color(Vec4F32 v);
|
||||
internal Vec4F32 ui_set_next_text_color(Vec4F32 v);
|
||||
@@ -745,32 +759,34 @@ internal void ui_pop_corner_radius(void);
|
||||
//~ rjf: Macro Loop Wrappers
|
||||
|
||||
//- rjf: stacks (base)
|
||||
#define UI_Parent(v) DeferLoop(ui_push_parent(v), ui_pop_parent())
|
||||
#define UI_ChildLayoutAxis(v) DeferLoop(ui_push_child_layout_axis(v), ui_pop_child_layout_axis())
|
||||
#define UI_FixedX(v) DeferLoop(ui_push_fixed_x(v), ui_pop_fixed_x())
|
||||
#define UI_FixedY(v) DeferLoop(ui_push_fixed_y(v), ui_pop_fixed_y())
|
||||
#define UI_FixedWidth(v) DeferLoop(ui_push_fixed_width(v), ui_pop_fixed_width())
|
||||
#define UI_FixedHeight(v) DeferLoop(ui_push_fixed_height(v), ui_pop_fixed_height())
|
||||
#define UI_PrefWidth(v) DeferLoop(ui_push_pref_width(v), ui_pop_pref_width())
|
||||
#define UI_PrefHeight(v) DeferLoop(ui_push_pref_height(v), ui_pop_pref_height())
|
||||
#define UI_Flags(v) DeferLoop(ui_push_flags(v), ui_pop_flags())
|
||||
#define UI_FastpathCodepoint(v) DeferLoop(ui_push_fastpath_codepoint(v), ui_pop_fastpath_codepoint())
|
||||
#define UI_BackgroundColor(v) DeferLoop(ui_push_background_color(v), ui_pop_background_color())
|
||||
#define UI_TextColor(v) DeferLoop(ui_push_text_color(v), ui_pop_text_color())
|
||||
#define UI_BorderColor(v) DeferLoop(ui_push_border_color(v), ui_pop_border_color())
|
||||
#define UI_OverlayColor(v) DeferLoop(ui_push_overlay_color(v), ui_pop_overlay_color())
|
||||
#define UI_TextSelectColor(v) DeferLoop(ui_push_text_select_color(v), ui_pop_text_select_color())
|
||||
#define UI_TextCursorColor(v) DeferLoop(ui_push_text_cursor_color(v), ui_pop_text_cursor_color())
|
||||
#define UI_HoverCursor(v) DeferLoop(ui_push_hover_cursor(v), ui_pop_hover_cursor())
|
||||
#define UI_Font(v) DeferLoop(ui_push_font(v), ui_pop_font())
|
||||
#define UI_FontSize(v) DeferLoop(ui_push_font_size(v), ui_pop_font_size())
|
||||
#define UI_CornerRadius00(v) DeferLoop(ui_push_corner_radius_00(v), ui_pop_corner_radius_00())
|
||||
#define UI_CornerRadius01(v) DeferLoop(ui_push_corner_radius_01(v), ui_pop_corner_radius_01())
|
||||
#define UI_CornerRadius10(v) DeferLoop(ui_push_corner_radius_10(v), ui_pop_corner_radius_10())
|
||||
#define UI_CornerRadius11(v) DeferLoop(ui_push_corner_radius_11(v), ui_pop_corner_radius_11())
|
||||
#define UI_BlurSize(v) DeferLoop(ui_push_blur_size(v), ui_pop_blur_size())
|
||||
#define UI_TextPadding(v) DeferLoop(ui_push_text_padding(v), ui_pop_text_padding())
|
||||
#define UI_TextAlignment(v) DeferLoop(ui_push_text_alignment(v), ui_pop_text_alignment())
|
||||
#define UI_Parent(v) DeferLoop(ui_push_parent(v), ui_pop_parent())
|
||||
#define UI_ChildLayoutAxis(v) DeferLoop(ui_push_child_layout_axis(v), ui_pop_child_layout_axis())
|
||||
#define UI_FixedX(v) DeferLoop(ui_push_fixed_x(v), ui_pop_fixed_x())
|
||||
#define UI_FixedY(v) DeferLoop(ui_push_fixed_y(v), ui_pop_fixed_y())
|
||||
#define UI_FixedWidth(v) DeferLoop(ui_push_fixed_width(v), ui_pop_fixed_width())
|
||||
#define UI_FixedHeight(v) DeferLoop(ui_push_fixed_height(v), ui_pop_fixed_height())
|
||||
#define UI_PrefWidth(v) DeferLoop(ui_push_pref_width(v), ui_pop_pref_width())
|
||||
#define UI_PrefHeight(v) DeferLoop(ui_push_pref_height(v), ui_pop_pref_height())
|
||||
#define UI_Flags(v) DeferLoop(ui_push_flags(v), ui_pop_flags())
|
||||
#define UI_FocusHot(v) DeferLoop(ui_push_focus_hot(v), ui_pop_focus_hot())
|
||||
#define UI_FocusActive(v) DeferLoop(ui_push_focus_active(v), ui_pop_focus_active())
|
||||
#define UI_FastpathCodepoint(v) DeferLoop(ui_push_fastpath_codepoint(v), ui_pop_fastpath_codepoint())
|
||||
#define UI_BackgroundColor(v) DeferLoop(ui_push_background_color(v), ui_pop_background_color())
|
||||
#define UI_TextColor(v) DeferLoop(ui_push_text_color(v), ui_pop_text_color())
|
||||
#define UI_BorderColor(v) DeferLoop(ui_push_border_color(v), ui_pop_border_color())
|
||||
#define UI_OverlayColor(v) DeferLoop(ui_push_overlay_color(v), ui_pop_overlay_color())
|
||||
#define UI_TextSelectColor(v) DeferLoop(ui_push_text_select_color(v), ui_pop_text_select_color())
|
||||
#define UI_TextCursorColor(v) DeferLoop(ui_push_text_cursor_color(v), ui_pop_text_cursor_color())
|
||||
#define UI_HoverCursor(v) DeferLoop(ui_push_hover_cursor(v), ui_pop_hover_cursor())
|
||||
#define UI_Font(v) DeferLoop(ui_push_font(v), ui_pop_font())
|
||||
#define UI_FontSize(v) DeferLoop(ui_push_font_size(v), ui_pop_font_size())
|
||||
#define UI_CornerRadius00(v) DeferLoop(ui_push_corner_radius_00(v), ui_pop_corner_radius_00())
|
||||
#define UI_CornerRadius01(v) DeferLoop(ui_push_corner_radius_01(v), ui_pop_corner_radius_01())
|
||||
#define UI_CornerRadius10(v) DeferLoop(ui_push_corner_radius_10(v), ui_pop_corner_radius_10())
|
||||
#define UI_CornerRadius11(v) DeferLoop(ui_push_corner_radius_11(v), ui_pop_corner_radius_11())
|
||||
#define UI_BlurSize(v) DeferLoop(ui_push_blur_size(v), ui_pop_blur_size())
|
||||
#define UI_TextPadding(v) DeferLoop(ui_push_text_padding(v), ui_pop_text_padding())
|
||||
#define UI_TextAlignment(v) DeferLoop(ui_push_text_alignment(v), ui_pop_text_alignment())
|
||||
|
||||
//- rjf: stacks (compositions)
|
||||
#define UI_WidthFill UI_PrefWidth(ui_pct(1.f, 0.f))
|
||||
@@ -778,6 +794,7 @@ internal void ui_pop_corner_radius(void);
|
||||
#define UI_Rect(r) DeferLoop(ui_push_rect(r), ui_pop_rect())
|
||||
#define UI_PrefSize(axis, v) DeferLoop(ui_push_pref_size((axis), (v)), ui_pop_pref_size(axis))
|
||||
#define UI_CornerRadius(v) DeferLoop(ui_push_corner_radius(v), ui_pop_corner_radius())
|
||||
#define UI_Focus(kind) DeferLoop((ui_push_focus_hot(kind), ui_push_focus_active(kind)), (ui_pop_focus_hot(), ui_pop_focus_active()))
|
||||
|
||||
//- rjf: tooltip
|
||||
#define UI_TooltipBase DeferLoop(ui_tooltip_begin_base(), ui_tooltip_end_base())
|
||||
@@ -786,9 +803,4 @@ internal void ui_pop_corner_radius(void);
|
||||
//- rjf: context menu
|
||||
#define UI_CtxMenu(key) DeferLoopChecked(ui_begin_ctx_menu(key), ui_end_ctx_menu())
|
||||
|
||||
//- rjf: focus
|
||||
#define UI_FocusHot(is_focused) DeferLoop(ui_set_focus_hot(is_focused), ui_unset_focus_hot())
|
||||
#define UI_FocusActive(is_focused) DeferLoop(ui_set_focus_active(is_focused), ui_unset_focus_hot())
|
||||
#define UI_Focus(is_focused) UI_FocusHot(is_focused) UI_FocusActive(is_focused)
|
||||
|
||||
#endif // UI_H
|
||||
|
||||
+2
-1
@@ -248,7 +248,8 @@ unw_pe_x64(String8 bindata, PE_BinInfo *bin,
|
||||
|
||||
case UNW_PE_OpCode_SPARE_CODE:
|
||||
{
|
||||
Assert(!"Hit me!");
|
||||
result.dead = 1;
|
||||
// Assert(!"Hit me!");
|
||||
// TODO(allen): ???
|
||||
}break;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user