Author SHA1 Message Date
Ryan Fleury 616897c8d6 version tick 2024-01-19 18:46:58 -08:00
Ryan Fleury 6a7dd334ff d3d11 debug layer exceptions; decimal enum displays; local time display in filesystem lister 2024-01-19 18:42:05 -08:00
Ryan Fleury f48d8431c0 allow implicit namespacification of identifier mapping path in eval parser, based on namespace of the procedure (if any) that the instruction pointer is currently within 2024-01-19 18:29:11 -08:00
Ryan Fleury d88000ddeb if exe-embedded pdb path doesn't work, fall back on attempting to treat that same path as relative to the executable 2024-01-19 18:14:39 -08:00
Ryan Fleury 42993b3fb0 silently filter access violations in asan's shadow address space 2024-01-19 17:47:56 -08:00
Ryan Fleury 123c3104a5 tweak build script to allow clang builds of mule_main; fix clang build 2024-01-19 13:02:33 -08:00
Ryan Fleury f15bc3de73 fix accidentally mistaking missing files for not missing, given new implementation of os_properties_from_file_path 2024-01-19 12:39:18 -08:00
Ryan Fleury c2d315d896 register value committing; eliminate manual 'invalidation' controls for frontend caches, rely on memgen/reggen/run idxs from ctrl thread, which can be incremented solely at the ctrl thread's discretion 2024-01-19 12:17:42 -08:00
Ryan Fleury 25ef507201 eliminate some old win32 timer code; use LLD in clang builds; eliminate unnecessary Clang architecture flags; eliminate /MP from builds, since mostly unnecessary 2024-01-19 10:37:27 -08:00
Martins MozeikoandRyan Fleury f7897aecea fix build warnings for clang 2024-01-19 10:27:33 -08:00
Martins MozeikoandRyan Fleury b1e2ca0ff8 show dialog with call stack in crash handler 2024-01-19 10:27:33 -08:00
Ryan Fleury c4242cf162 non-helper os_properties_from_file_path - can use accelerated path here which just looks at path for properties, rather than having to open a handle; also tweak txti layer to gracefully fail if a write happened between its load of file data 2024-01-19 10:00:53 -08:00
Ryan Fleury b5e604e6c8 source view bottom bar -> warn if file timestamp is newer than currently-used debug info 2024-01-18 16:53:30 -08:00
Ryan Fleury 23572ca63f notes 2024-01-18 12:11:01 -08:00
Ryan Fleury cb4cc5a4f7 differentiate between commands whose fastpaths select entire initial input vs. ones who don't; use it in case of text searching 2024-01-18 11:05:24 -08:00
Ryan Fleury 279daaa84a when beginning a query with old input, select entire query string, to easily replace it if needed 2024-01-18 11:01:47 -08:00
Ryan Fleury ac521a8f60 do not use graphical error reporting in auto-launched conversion instances of the debugger; will fix repeated debug info conversion fatal error exception message boxes 2024-01-18 10:36:15 -08:00
Ryan Fleury 3567e6c53d txti layer -> open files in write-shared mode, to prevent locking file from e.g. an editor which is writing; also only enable change detection when ui is actively updating 2024-01-18 10:04:00 -08:00
Ryan Fleury d2d72bd7ab ctrl: eliminate possibility of threads getting stuck at spoof address at the event-pump layer - if we report other events first, the step is already cancelled anyways 2024-01-17 20:58:55 -08:00
Ryan Fleury 268ca9ab53 trap net building & stepping algorithm overview 2024-01-17 19:52:36 -08:00
Ryan Fleury dea5e88906 also look for wmainCRTStartup 2024-01-17 17:07:16 -08:00
Ryan Fleury 25c31b0d77 look for mainCRTStartup as one additional possibility of a default entry point 2024-01-17 17:01:25 -08:00
Ryan Fleury ea2066063a do the same for omit/only 2024-01-17 16:34:02 -08:00
Ryan Fleury bdecb6d522 disable hook-based list view rule, since it is currently unimplemented and visualization engine hooks need to mature before it is formally implemented in them 2024-01-17 16:31:26 -08:00
Tony LandRyan Fleury 739d0977b6 Disable hover if view is scrolling
Also set the first frame index to current index so that the hover popup
doesn't instantly appear once the scroll has ended.
2024-01-17 14:49:29 -08:00
Ryan Fleury 717572c202 non-virtual-inheritance case in mule_main 2024-01-17 13:56:54 -08:00
Ryan Fleury d3931fd3e2 base class -> derived class autocast in eval system; completion of first pass 2024-01-17 13:28:03 -08:00
Ryan Fleury a0a6fc0988 raddbg_from_pdb -> dont skip all members of struct simply because we currently do nothing with vfunctab 2024-01-17 10:36:23 -08:00
Ryan Fleury 7d8f0d478e checkpoint #2 of same... 2024-01-17 09:16:33 -08:00
Ryan Fleury d849b83acb checkpoint in implementing dynamic type resolution in the eval system, for taking a base-class-ptr & by-default patching in the appropriate debug-info-determined derived type 2024-01-16 17:33:17 -08:00
Ryan Fleury adbe42c907 add non-pure dynamic inheritance case 2024-01-16 17:12:51 -08:00
Martins MozeikoandRyan Fleury 99b2d9d6d0 minor d3d11 code improvements
1) automatically tries WARP driver if HW creation fails
2) HRESULT checks for swap chain creation or Present call (can fail if GPU driver crashes)
3) checks HRESULT of D3DCompile functions instead of using shader pointer as error condition
4) releases shader blob memory when not needed anymore
2024-01-16 17:09:07 -08:00
Ryan Fleury 5c179adb68 extend binary * voff -> symbol name lookup to include global variable vmap if scope vmap turns up short; extend address visualization rules to more ambitiously visualize what is being pointed at 2024-01-16 15:29:50 -08:00
Ryan Fleury de6c94ce8f set up nil udt in raddbg conversion - used for empty udt info for e.g. pure virtual structs 2024-01-16 15:05:06 -08:00
Ryan Fleury 743984c318 eliminate stray zero byte in output logs 2024-01-16 14:48:29 -08:00
Ryan Fleury a026ae41f1 import example of user-defined type node which does NOT have a udt entry - this is the cause of the virtual interface display bugs 2024-01-16 14:13:34 -08:00
Ryan Fleury 114dd96e50 data member offset sorting -> take into account base offset, when doing inheritance graph search; visualize inheritance chain for inherited members; use contextual base color in code labels, do not assume default code color implicitly 2024-01-16 14:01:37 -08:00
Ryan Fleury e2e1382508 use same type key -> members path in eval compiler as in eval visualization paths 2024-01-16 12:03:24 -08:00
Ryan Fleury 1c40afc067 import notes from email bugs; add non-virtual-but-still-multiple-inheritance example to mule_main; slightly increase loudness of exception/trap-caused stop ctrl events 2024-01-16 11:59:44 -08:00
Ryan Fleury 79677875c4 fix 64-bit address/value visualization in memory view bottom bar 2024-01-16 11:21:19 -08:00
Ryan Fleury c2e90225b9 type graph data member gathering -> follow single-inheritance base class members + sort members by offset 2024-01-16 11:12:08 -08:00
Ryan Fleury 057a6f3e8e eliminate duplicate binary dbgi parsing requests 2024-01-15 21:33:59 -08:00
Ryan Fleury a9ec1a05b1 notes 2024-01-15 20:30:11 -08:00
Ryan Fleury 2454d426ed eliminate dbgi layer evictor thread - exe and debug info eviction needs to be synchronous with control thread, to allow for HMH-style hotloading. this change moves all dbgi layer binary releasing to the caller thread of the refcount -> 0 dbgi_binary_close. 2024-01-15 20:13:49 -08:00
Ryan Fleury cf58137b0f todo notes 2024-01-15 15:38:12 -08:00
Ryan Fleury c40d0b3acc hot reloading mule 2024-01-15 13:04:25 -08:00
Ryan Fleury dd433c89ff fix ordering of local itypes within itype blocks in type name map; latter added itypes need to come *first* 2024-01-15 08:21:50 -08:00
Ryan Fleury d2ec1d6a3a interpret & visualize __fastfail events correctly 2024-01-14 21:36:39 -08:00
Ryan Fleury f736533933 further mule_main coverage 2024-01-14 20:28:15 -08:00
Ryan Fleury 8d82accc26 complete application of hash adjustment table in pdb -> raddbg converter 2024-01-14 18:12:45 -08:00
Ryan Fleury f61688fff5 checkpoint in implementing pdb hash adjustment table parsing & application 2024-01-14 17:20:35 -08:00
Ryan Fleury c88f715ac2 fix horizontal scroll in text containers causing repeated hidden animation 2024-01-14 14:53:45 -08:00
Ryan Fleury cac911fbf5 add info on converter to readme roadmap section 2024-01-14 11:34:18 -08:00
Ryan Fleury 1261aa55b0 include project short-to-medium-term roadmap in readme 2024-01-14 11:28:15 -08:00
Ryan Fleury 5fe3f56d33 line step into -> if call redirects to a function dispatch unconditional jump table, move stopper trap in trap net to unconditional jump destination, and skip the jump table entirely 2024-01-14 07:02:30 -08:00
Ryan Fleury 0c497abba6 only supply config defaults when doing user config application 2024-01-14 06:42:49 -08:00
Ryan Fleury 625e197bc1 eval parser -> prefer later type name matches to earlier 2024-01-13 21:14:58 -08:00
Ryan Fleury d40c9edb90 type graph -> fix edge case of last-incrementally-changed type's members being considered out-of-bounds of member info 2024-01-13 21:13:29 -08:00
Ryan Fleury a6a6eed091 accept enter for confirm acceptance 2024-01-13 20:06:19 -08:00
Ryan Fleury 032df717d8 if loading completely black theme from config, reset to default theme, for cases of busted config files 2024-01-13 17:21:38 -08:00
Ryan Fleury bcdc2f3026 more mule_module coverage; bugfix edge-case memory view range calculation causing flipped min/max 2024-01-13 16:37:34 -08:00
Jack PunterandRyan Fleury 3917218a4e Fix horizontal chunk movement
The current horizontal chunk motion (ctrl + left/right arrow by default) does not work like most other editors, subverting the users expectation. The behaviour of most editors from my experience is as follows:
1. Skip any leading whitespace in the motion
2. If the next char is:
    - Alphanumeric or `_`, move up until the next symbol that isn't one of those
    - not one of the above move either up until: the next whitespace character or the same rules as above if an alphanumeric or `_` is encountered before whitespace.

e.g. Assume the current cursor position and string `... |mystruct.member ...`
The current code will move to the end of the whole struct accessor: `... mystruct.member| ...`
Most other editors would move to the end of the struct name: `... mystruct|.member ...`
In this case the current behaviour may not seem _that_ agregious, but in other cases its much more annoying
especially if you're looking to copy into a watch window or something as in this case:
`|ui_nav_scanned_column_from_column(String8 string, ...)`
the cursor will move to: `ui_nav_scanned_column_from_column(String8| string, ...)`
which is almost certainly not what the user wanted.

This behaviour means that if you want to copy a symbol, you can consistantly achieve this by chunk moving to one end, pressing shift, then chunk moving to the other end without ever getting extra symbols/whitespace. This is currently not possible with existing chunk motions.
2024-01-13 15:33:07 -08:00
Ryan Fleury c0322437d6 arresting confirmation ui - use in exit-while-debugging 2024-01-13 14:48:02 -08:00
Ryan Fleury 096d85168a display d3d11 device creation error code if fail 2024-01-13 11:10:37 -08:00
Ryan Fleury 735f817b0b more texture format coverage in renderer/view-rules 2024-01-13 10:21:50 -08:00
Ryan Fleury e30c6553a4 Merge branch 'dev' of https://github.com/EpicGames/raddebugger into dev 2024-01-13 08:31:08 -08:00
Ryan Fleury f9ab53c0c4 further clangification - ignore unknown warning disabling, to keep build script reasonable for older versions of clang 2024-01-13 08:24:49 -08:00
Ryan Fleury d382053500 prevent bubble-up panel deletion case from assuming non-nil grandparent; also prevent from trampling over focus fallback path 2024-01-13 07:13:42 -08:00
Ryan Fleury b932e6236a os gfx stub backend 2024-01-12 20:30:38 -08:00
Ryan Fleury b9a7b64280 stub render backend for tests; hoist out raddbg code/entry points from build target file, to be called into by sanity tests 2024-01-12 20:06:38 -08:00
Ryan Fleury 2078af15f9 mc -> mdesk; I do not know what Monkey C is 2024-01-12 19:22:11 -08:00
Ryan Fleury 5410fac38e oops... fix first-time config initialization disaster! 2024-01-12 15:44:11 -08:00
Ryan Fleury ca8727c4af pipe parsed command line through render layer initialization; add new command line flags for render layer - (a) to disable API calls which require debug SDKs, and (b) to force software warp driver type 2024-01-12 14:42:24 -08:00
Ryan Fleury 6304ad6955 fix mule_main build 2024-01-12 13:56:21 -08:00
Ryan Fleury 1b4c188770 re-clangify build script 2024-01-12 13:52:19 -08:00
Ryan Fleury e40c980d83 re-ensure codebase c compatibility 2024-01-12 13:29:50 -08:00
72 changed files with 4292 additions and 2532 deletions
+71 -1
View File
@@ -99,6 +99,76 @@ raddbg.cpp
If everything worked correctly, there will be a `build` folder in the root If everything worked correctly, there will be a `build` folder in the root
level of the codebase, and it will contain a freshly-built `raddbg.exe`. level of the codebase, and it will contain a freshly-built `raddbg.exe`.
## Short-To-Medium-Term Roadmap
### The Initial Alpha Battle-Testing Phase
The first priority for the project is to ensure that the most crucial debugger
components are functioning extremely reliably for local, x64, Windows
debugging. This would include parts like debug info conversion, debug info
loading, process control, stepping, evaluation (correct usage of both location
info and type info), and a robust frontend which ensures the lower level parts
are usable.
We feel that the debugger has already come a long way in all of these respects,
but given the massive set of possible combinations of languages, build
settings, toolchains, used language features, and patterns of generated code,
there are still cases where the debugger has not been tested, and so there are
still issues. So, we feel that the top priority is eliminating these issues,
such that the debugging experience is rock solid.
Additionally, the debug info conversion process is not fast (nor wide) enough
to support extremely large projects. This is for two reasons: (a) the
PDB-to-RADDBG converter is an unoptimized reference implementation, and (b) the
debugger learns of new modules (and thus which PDBs to load) in a
serially-dependent way (this is necessarily the case for correct debugging
results). We expect that the conversion process' performance can be massively
improved, and also that some heuristics can be used to begin converting PDBs
to RADDBGs before the debugger knows those PDBs are needed, thus ensuring the
associated RADDBG files are ready instantaneously when the associated modules
are finally loaded by the debugger. Improving this situation is a major part of
this phase, as it will make the debugger much more usable for large projects.
### Local x64 Linux Debugging Phase
The next priority for the project is to take the rock solid x64 Windows
debugging experience, and port all of the relevant pieces to support local x64
Linux debugging also.
The debugger has been written to abstract over the parts that need to differ on
either Linux or Windows, and this is mainly going to be a task in building out
different backends for those abstraction layers.
The major parts of this phase are:
- Porting the `src/demon` layer to implement the Demon local process control
abstraction API.
- Porting the `src/unwind` layer to support x64 ELF unwinding (currently, there
is only an x64 PE unwinding implementation).
- Creating a DWARF-to-RADDBG converter (in the same way that we've built a PDB-
to-RADDBG converter). A partial implementation of this is in
`src/raddbg_convert/dwarf`.
- Porting the `src/render` layer to implement all of the rendering features the
frontend needs on a Linux-compatible API (the backend used on Windows is D3D11).
- Porting the `src/font_provider` layer to a Linux-compatible font
rasterization backend, like FreeType (the backend used on Windows is
DirectWrite).
- Porting the `src/os` layers to Linux. This includes core operating system
abstraction (virtual memory allocation, threading and synchronization
primitives, and so on), and graphical operating system abstraction (windows,
input events, and so on).
Once the above list is complete, and once every part is rock solid, the Windows
debugging experience we'll have worked diligently to create will also be
available natively on Linux machines.
### And Beyond!
There are several directions we might take after these two major phases,
like remote debugging, porting to different architectures, further improving
the debugger's features (like improving the visualization engine), and so on.
But for now, we're mostly focused on those first two phases.
## Top-Level Directory Descriptions ## Top-Level Directory Descriptions
- `data`: Small binary files which are used when building, either to embed - `data`: Small binary files which are used when building, either to embed
@@ -187,7 +257,7 @@ A list of the layers in the codebase and their associated namespaces is below:
- `hash_store` (`HS_`): Implements a cache for general data blobs, keyed by a - `hash_store` (`HS_`): Implements a cache for general data blobs, keyed by a
128-bit hash of the data. Used as a general data store by other layers. 128-bit hash of the data. Used as a general data store by other layers.
- `metagen` (`MG_`): A metaprogram which is used to generate primarily code and - `metagen` (`MG_`): A metaprogram which is used to generate primarily code and
data tables. Consumes Metadesk files, stored with the extension `.mc`, and data tables. Consumes Metadesk files, stored with the extension `.mdesk`, and
generates C code which is then included by hand-written C code. Currently, it generates C code which is then included by hand-written C code. Currently, it
does not analyze the codebase's hand-written C code, but in principle this is does not analyze the codebase's hand-written C code, but in principle this is
possible. This allows easier & less-error-prone management of large data possible. This allows easier & less-error-prone management of large data
+16 -11
View File
@@ -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] if "%asan%"=="1" set auto_compile_flags=%auto_compile_flags% -fsanitize=address && echo [asan enabled]
:: --- Compile/Link Line Definitions ------------------------------------------ :: --- Compile/Link Line Definitions ------------------------------------------
set cl_common= /I..\src\ /I..\local\ /nologo /FC /Z7 /MP set cl_common= /I..\src\ /I..\local\ /nologo /FC /Z7
set clang_common= -I..\src\ -I..\local\ -maes -mssse3 -msse4 -gcodeview -fdiagnostics-absolute-paths -Wall -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 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 /D_DEBUG %cl_common% set cl_debug= call cl /Od %cl_common% %auto_compile_flags%
set cl_release= call cl /O2 /DNDEBUG %cl_common% set cl_release= call cl /O2 /DNDEBUG %cl_common% %auto_compile_flags%
set clang_debug= call clang -g -O0 /D_DEBUG %clang_common% set clang_debug= call clang -g -O0 %clang_common% %auto_compile_flags%
set clang_release= call clang -g -O3 /DNDEBUG %clang_common% set clang_release= call clang -g -O3 -DNDEBUG %clang_common% %auto_compile_flags%
set cl_link= /link /natvis:"%~dp0\src\natvis\base.natvis" set cl_link= /link /MANIFEST:EMBED /INCREMENTAL:NO /natvis:"%~dp0\src\natvis\base.natvis"
set clang_link= -Xlinker /natvis:"%~dp0\src\natvis\base.natvis" set clang_link= -fuse-ld=lld -Xlinker /MANIFEST:EMBED -Xlinker /natvis:"%~dp0\src\natvis\base.natvis"
set cl_out= /out: set cl_out= /out:
set clang_out= -o set clang_out= -o
@@ -56,6 +56,10 @@ set clang_out= -o
set gfx=-DOS_FEATURE_GRAPHICAL=1 set gfx=-DOS_FEATURE_GRAPHICAL=1
set net=-DOS_FEATURE_SOCKET=1 set net=-DOS_FEATURE_SOCKET=1
set link_dll=-DLL 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 ---------------------------------------------- :: --- Choose Compile/Link Lines ----------------------------------------------
if "%msvc%"=="1" set compile_debug=%cl_debug% if "%msvc%"=="1" set compile_debug=%cl_debug%
@@ -68,7 +72,6 @@ if "%clang%"=="1" set compile_link=%clang_link%
if "%clang%"=="1" set out=%clang_out% if "%clang%"=="1" set out=%clang_out%
if "%debug%"=="1" set compile=%compile_debug% if "%debug%"=="1" set compile=%compile_debug%
if "%release%"=="1" set compile=%compile_release% if "%release%"=="1" set compile=%compile_release%
set compile=%compile% %auto_compile_flags%
:: --- Prep Directories ------------------------------------------------------- :: --- Prep Directories -------------------------------------------------------
if not exist build mkdir build if not exist build mkdir build
@@ -85,14 +88,16 @@ if not "%no_meta%"=="1" (
:: --- Build Everything (@build_targets) -------------------------------------- :: --- Build Everything (@build_targets) --------------------------------------
pushd build pushd build
if "%raddbg%"=="1" %compile% %gfx% ..\src\raddbg\raddbg.cpp %compile_link% %out%raddbg.exe 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_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_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 "%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 "%ryan_scratch%"=="1" %compile% ..\src\scratch\ryan_scratch.c %compile_link% %out%ryan_scratch.exe
if "%cpp_tests%"=="1" %compile% ..\src\scratch\i_hate_c_plus_plus.cpp %compile_link% %out%cpp_tests.exe
if "%look_at_raddbg%"=="1" %compile% ..\src\scratch\look_at_raddbg.c %compile_link% %out%look_at_raddbg.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 mule\mule_c.c mule_inline.obj mule_o2.obj 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
if "%mule_module%"=="1" %compile% ..\src\mule\mule_module.cpp %compile_link% %link_dll% %out%mule_module.dll if "%mule_module%"=="1" %compile% ..\src\mule\mule_module.cpp %compile_link% %link_dll% %out%mule_module.dll
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
popd popd
:: --- Unset ------------------------------------------------------------------ :: --- Unset ------------------------------------------------------------------
+20 -2
View File
@@ -18,9 +18,8 @@ patterns =
"*.bfs", "*.bfs",
"*.html", "*.html",
"*.txt", "*.txt",
"*.ds",
"*.md", "*.md",
"*.mc", "*.mdesk",
"*.asm", "*.asm",
}; };
@@ -55,6 +54,15 @@ commands =
.save_dirty_files = true, .save_dirty_files = true,
.cursor_at_end = false, .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 = .rjf_f3 =
{ {
.win = "pushd build && raddbg.exe && popd", .win = "pushd build && raddbg.exe && popd",
@@ -82,6 +90,15 @@ commands =
.save_dirty_files = true, .save_dirty_files = true,
.cursor_at_end = false, .cursor_at_end = false,
}, },
.build_raddbg_dump =
{
.win = "build raddbg_dump",
.linux = "",
.out = "*compilation*",
.footer_panel = true,
.save_dirty_files = true,
.cursor_at_end = false,
},
.build_mule_main = .build_mule_main =
{ {
.win = "build mule_main", .win = "build mule_main",
@@ -113,6 +130,7 @@ fkey_command_override =
.rjf = .rjf =
{ {
.F1 = "rjf_f1", .F1 = "rjf_f1",
.F2 = "rjf_f2",
.F3 = "rjf_f3", .F3 = "rjf_f3",
}, },
}; };
+1 -1
View File
@@ -22,7 +22,7 @@ arena_alloc__sized(U64 init_res, U64 init_cmt)
#if OS_WINDOWS #if OS_WINDOWS
cmt = res; cmt = res;
#else #else
cmt AlignPow2(init_cmt, page_size); cmt = AlignPow2(init_cmt, page_size);
#endif #endif
memory = os_reserve_large(res); memory = os_reserve_large(res);
+1
View File
@@ -43,6 +43,7 @@ CTRL_ExceptionCodeKindTable:
{Win32ProcedureNotFound win32_procedure_not_found 0xc06d007f 0 "(Win32) Procedure Not Found" } {Win32ProcedureNotFound win32_procedure_not_found 0xc06d007f 0 "(Win32) Procedure Not Found" }
{Win32SanitizerErrorDetected win32_sanitizer_error_detected 0xe073616e 1 "(Win32) Sanitizer Error Detected" } {Win32SanitizerErrorDetected win32_sanitizer_error_detected 0xe073616e 1 "(Win32) Sanitizer Error Detected" }
{Win32SanitizerRawAccessViolation win32_sanitizer_raw_access_violation 0xe0736171 0 "(Win32) Sanitizer Raw Access Violation" } {Win32SanitizerRawAccessViolation win32_sanitizer_raw_access_violation 0xe0736171 0 "(Win32) Sanitizer Raw Access Violation" }
{Win32DirectXDebugLayer win32_directx_debug_layer 0x0000087a 1 "(Win32) DirectX Debug Layer" }
} }
//////////////////////////////// ////////////////////////////////
+263 -43
View File
@@ -663,6 +663,13 @@ ctrl_memgen_idx(void)
return result; return result;
} }
internal U64
ctrl_reggen_idx(void)
{
U64 result = ins_atomic_u64_eval(&ctrl_state->reggen_idx);
return result;
}
//- rjf: halt everything //- rjf: halt everything
internal void internal void
@@ -1062,6 +1069,7 @@ internal B32
ctrl_thread_write_reg_block(CTRL_MachineID machine_id, CTRL_Handle thread, void *block) 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); B32 good = demon_write_regs(ctrl_demon_handle_from_ctrl(thread), block);
ins_atomic_u64_inc_eval(&ctrl_state->reggen_idx);
return good; return good;
} }
@@ -1102,6 +1110,146 @@ ctrl_tls_root_vaddr_from_thread(CTRL_MachineID machine_id, CTRL_Handle thread)
return result; 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 //- rjf: name -> register/alias hash tables, for eval
internal EVAL_String2NumMap * 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); Temp scratch = scratch_begin(&arena, 1);
//- rjf: loop -> try to get event, run, repeat //- 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;) ProfScope("loop -> try to get event, run, repeat") for(B32 got_event = 0; got_event == 0;)
{ {
//- rjf: get next event //- 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; 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; }break;
} }
} }
@@ -1437,7 +1647,6 @@ ctrl_thread__next_demon_event(Arena *arena, CTRL_Msg *msg, DEMON_RunCtrls *run_c
{ {
// rjf: prep spoof // rjf: prep spoof
B32 do_spoof = (spoof != 0 && run_ctrls->single_step_thread == 0); B32 do_spoof = (spoof != 0 && run_ctrls->single_step_thread == 0);
U64 spoof_old_ip_value = 0;
U64 size_of_spoof = 0; U64 size_of_spoof = 0;
if(do_spoof) ProfScope("prep spoof") 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); 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->run_idx);
ins_atomic_u64_inc_eval(&ctrl_state->memgen_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 //- rjf: push ctrl events associated with this demon event
CTRL_EventList evts = {0}; CTRL_EventList evts = {0};
ProfScope("push ctrl events associated with this demon event") switch(event->kind) ProfScope("push ctrl events associated with this demon event") switch(event->kind)
@@ -1821,6 +2043,8 @@ ctrl_thread__launch_and_init(CTRL_Msg *msg)
str8_lit("wmain"), str8_lit("wmain"),
str8_lit("WinMainCRTStartup"), str8_lit("WinMainCRTStartup"),
str8_lit("wWinMainCRTStartup"), str8_lit("wWinMainCRTStartup"),
str8_lit("mainCRTStartup"),
str8_lit("wmainCRTStartup"),
}; };
// rjf: find voff for one of the custom entry points attached to this msg // rjf: find voff for one of the custom entry points attached to this msg
@@ -2122,10 +2346,14 @@ ctrl_thread__run(CTRL_Msg *msg)
DEMON_Handle target_process = ctrl_demon_handle_from_ctrl(msg->parent); DEMON_Handle target_process = ctrl_demon_handle_from_ctrl(msg->parent);
U64 spoof_ip_vaddr = 911; U64 spoof_ip_vaddr = 911;
//////////////////////////////
//- rjf: gather processes //- rjf: gather processes
//
DEMON_HandleArray processes = demon_all_processes(scratch.arena); DEMON_HandleArray processes = demon_all_processes(scratch.arena);
//////////////////////////////
//- rjf: gather all initial breakpoints //- rjf: gather all initial breakpoints
//
DEMON_TrapChunkList user_traps = {0}; DEMON_TrapChunkList user_traps = {0};
{ {
// rjf: resolve module-dependent user bps // rjf: resolve module-dependent user bps
@@ -2147,6 +2375,7 @@ ctrl_thread__run(CTRL_Msg *msg)
} }
} }
//////////////////////////////
//- rjf: single step "stuck threads" //- rjf: single step "stuck threads"
// //
// "Stuck threads" are threads that are already on a User BP and would hit // "Stuck threads" are threads that are already on a User BP and would hit
@@ -2251,7 +2480,9 @@ ctrl_thread__run(CTRL_Msg *msg)
} }
} }
//////////////////////////////
//- rjf: resolve trap net //- rjf: resolve trap net
//
DEMON_TrapChunkList trap_net_traps = {0}; DEMON_TrapChunkList trap_net_traps = {0};
for(CTRL_TrapNode *node = msg->traps.first; for(CTRL_TrapNode *node = msg->traps.first;
node != 0; node != 0;
@@ -2261,14 +2492,18 @@ ctrl_thread__run(CTRL_Msg *msg)
demon_trap_chunk_list_push(scratch.arena, &trap_net_traps, 256, &trap); demon_trap_chunk_list_push(scratch.arena, &trap_net_traps, 256, &trap);
} }
//////////////////////////////
//- rjf: join user breakpoints and trap net traps //- rjf: join user breakpoints and trap net traps
//
DEMON_TrapChunkList joined_traps = {0}; 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, &user_traps);
demon_trap_chunk_list_concat_shallow_copy(scratch.arena, &joined_traps, &trap_net_traps); demon_trap_chunk_list_concat_shallow_copy(scratch.arena, &joined_traps, &trap_net_traps);
} }
//////////////////////////////
//- rjf: record start //- rjf: record start
//
if(stop_event == 0) if(stop_event == 0)
{ {
CTRL_EventList evts = {0}; CTRL_EventList evts = {0};
@@ -2277,31 +2512,37 @@ ctrl_thread__run(CTRL_Msg *msg)
ctrl_c2u_push_events(&evts); ctrl_c2u_push_events(&evts);
} }
//////////////////////////////
//- rjf: run loop //- rjf: run loop
//
if(stop_event == 0) if(stop_event == 0)
{ {
U64 sp_check_value = demon_read_sp(target_thread); U64 sp_check_value = demon_read_sp(target_thread);
B32 spoof_mode = 0; B32 spoof_mode = 0;
CTRL_Spoof spoof = {0}; CTRL_Spoof spoof = {0};
U64 spoof_1_return_ip = 0;
for(;;) for(;;)
{ {
//////////////////////////
//- rjf: choose low level traps //- rjf: choose low level traps
//
DEMON_TrapChunkList *trap_list = &joined_traps; DEMON_TrapChunkList *trap_list = &joined_traps;
if(spoof_mode) if(spoof_mode)
{ {
trap_list = &user_traps; trap_list = &user_traps;
} }
//////////////////////////
//- rjf: choose spoof //- rjf: choose spoof
//
CTRL_Spoof *run_spoof = 0; CTRL_Spoof *run_spoof = 0;
if(spoof_mode) if(spoof_mode)
{ {
run_spoof = &spoof; run_spoof = &spoof;
} }
//////////////////////////
//- rjf: setup run controls //- rjf: setup run controls
//
DEMON_RunCtrls run_ctrls = {0}; DEMON_RunCtrls run_ctrls = {0};
run_ctrls.ignore_previous_exception = 1; run_ctrls.ignore_previous_exception = 1;
run_ctrls.run_entity_count = msg->freeze_state_threads.count; run_ctrls.run_entity_count = msg->freeze_state_threads.count;
@@ -2315,12 +2556,16 @@ ctrl_thread__run(CTRL_Msg *msg)
idx += 1; 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); DEMON_Event *event = ctrl_thread__next_demon_event(scratch.arena, msg, &run_ctrls, run_spoof);
//////////////////////////
//- rjf: determine event handling //- rjf: determine event handling
//
B32 hard_stop = 0; B32 hard_stop = 0;
CTRL_EventCause hard_stop_cause = ctrl_event_cause_from_demon_event_kind(event->kind); CTRL_EventCause hard_stop_cause = ctrl_event_cause_from_demon_event_kind(event->kind);
B32 use_stepping_logic = 0; B32 use_stepping_logic = 0;
@@ -2354,7 +2599,9 @@ ctrl_thread__run(CTRL_Msg *msg)
}break; }break;
} }
//////////////////////////
//- rjf: unpack info about thread attached to event //- rjf: unpack info about thread attached to event
//
Architecture arch = demon_arch_from_object(event->thread); Architecture arch = demon_arch_from_object(event->thread);
U64 reg_size = regs_block_size_from_architecture(arch); U64 reg_size = regs_block_size_from_architecture(arch);
void *thread_regs_block = demon_read_regs(event->thread); void *thread_regs_block = demon_read_regs(event->thread);
@@ -2380,11 +2627,14 @@ ctrl_thread__run(CTRL_Msg *msg)
temp_end(temp); temp_end(temp);
} }
//////////////////////////////// //////////////////////////
//- rjf: stepping logic -// //- rjf: stepping logic
//
//{ //{
//////////////////////////
//- rjf: handle if hitting a spoof or baked in trap //- rjf: handle if hitting a spoof or baked in trap
//
B32 hit_spoof = 0; B32 hit_spoof = 0;
B32 exception_stop = 0; B32 exception_stop = 0;
if(use_stepping_logic) if(use_stepping_logic)
@@ -2409,28 +2659,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 //- rjf: handle spoof hit
if(hit_spoof) if(hit_spoof)
{ {
// rjf: restore 1 ip
demon_write_ip(target_thread, spoof_1_return_ip);
// rjf: clear spoof mode // rjf: clear spoof mode
spoof_mode = 0; spoof_mode = 0;
MemoryZeroStruct(&spoof); MemoryZeroStruct(&spoof);
@@ -2673,15 +2904,12 @@ ctrl_thread__run(CTRL_Msg *msg)
{ {
// rjf: setup spoof mode // rjf: setup spoof mode
begin_spoof_mode = 1; begin_spoof_mode = 1;
U64 spoof_sp = demon_read_sp(target_thread); U64 spoof_sp = demon_read_sp(target_thread);
spoof_mode = 1; spoof_mode = 1;
spoof.process = ctrl_handle_from_demon(target_process); spoof.process = ctrl_handle_from_demon(target_process);
spoof.thread = ctrl_handle_from_demon(target_thread);
spoof.vaddr = spoof_sp; spoof.vaddr = spoof_sp;
spoof.new_ip_value = spoof_ip_vaddr; 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 +2943,8 @@ ctrl_thread__run(CTRL_Msg *msg)
} }
//} //}
//- rjf: stepping logic -// //
//- rjf: stepping logic
//////////////////////////////// ////////////////////////////////
//- rjf: handle step past trap net //- rjf: handle step past trap net
@@ -2786,20 +3015,11 @@ ctrl_thread__run(CTRL_Msg *msg)
break; 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 //- rjf: record stop
//
if(stop_event != 0) if(stop_event != 0)
{ {
CTRL_EventList evts = {0}; CTRL_EventList evts = {0};
+30 -1
View File
@@ -46,6 +46,26 @@ struct CTRL_MachineIDHandlePairList
U64 count; 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 //~ rjf: Trap Types
@@ -85,6 +105,7 @@ typedef struct CTRL_Spoof CTRL_Spoof;
struct CTRL_Spoof struct CTRL_Spoof
{ {
CTRL_Handle process; CTRL_Handle process;
CTRL_Handle thread;
U64 vaddr; U64 vaddr;
U64 new_ip_value; U64 new_ip_value;
}; };
@@ -401,6 +422,7 @@ struct CTRL_State
CTRL_WakeupFunctionType *wakeup_hook; CTRL_WakeupFunctionType *wakeup_hook;
U64 run_idx; U64 run_idx;
U64 memgen_idx; U64 memgen_idx;
U64 reggen_idx;
// rjf: name -> register/alias hash tables for eval // rjf: name -> register/alias hash tables for eval
EVAL_String2NumMap arch_string2reg_tables[Architecture_COUNT]; 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 //- rjf: run index
internal U64 ctrl_run_idx(void); internal U64 ctrl_run_idx(void);
internal U64 ctrl_memgen_idx(void); internal U64 ctrl_memgen_idx(void);
internal U64 ctrl_reggen_idx(void);
//- rjf: halt everything //- rjf: halt everything
internal void ctrl_halt(void); internal void ctrl_halt(void);
@@ -538,7 +561,7 @@ internal Architecture ctrl_arch_from_handle(CTRL_MachineID machine, CTRL_Handle
//- rjf: process memory reading/writing //- rjf: process memory reading/writing
internal U64 ctrl_process_read(CTRL_MachineID machine_id, CTRL_Handle process, Rng1U64 range, void *dst); internal U64 ctrl_process_read(CTRL_MachineID machine_id, CTRL_Handle process, Rng1U64 range, void *dst);
internal String8 ctrl_query_cached_data_from_process_vaddr_range(Arena *arena, CTRL_MachineID machine_id, CTRL_Handle process, Rng1U64 range); internal String8 ctrl_query_cached_data_from_process_vaddr_range(Arena *arena, CTRL_MachineID machine_id, CTRL_Handle process, Rng1U64 range);
internal String8 ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(Arena *arena, CTRL_MachineID machine_id, CTRL_Handle process, U64 vaddr, U64 limit); internal String8 ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(Arena *arena, CTRL_MachineID machine_id, CTRL_Handle process, U64 vaddr, U64 limit, U64 endt_us);
internal B32 ctrl_process_write_data(CTRL_MachineID machine_id, CTRL_Handle process, U64 vaddr, String8 data); internal B32 ctrl_process_write_data(CTRL_MachineID machine_id, CTRL_Handle process, U64 vaddr, String8 data);
internal U128 ctrl_stored_hash_from_process_vaddr_range(CTRL_MachineID machine_id, CTRL_Handle process, Rng1U64 range, B32 zero_terminated); internal U128 ctrl_stored_hash_from_process_vaddr_range(CTRL_MachineID machine_id, CTRL_Handle process, Rng1U64 range, B32 zero_terminated);
@@ -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 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); 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 //- rjf: name -> register/alias hash tables, for eval
internal EVAL_String2NumMap *ctrl_string2reg_from_arch(Architecture arch); internal EVAL_String2NumMap *ctrl_string2reg_from_arch(Architecture arch);
internal EVAL_String2NumMap *ctrl_string2alias_from_arch(Architecture arch); internal EVAL_String2NumMap *ctrl_string2alias_from_arch(Architecture arch);
+5
View File
@@ -45,6 +45,7 @@ CTRL_ExceptionCodeKind_Win32ModuleNotFound,
CTRL_ExceptionCodeKind_Win32ProcedureNotFound, CTRL_ExceptionCodeKind_Win32ProcedureNotFound,
CTRL_ExceptionCodeKind_Win32SanitizerErrorDetected, CTRL_ExceptionCodeKind_Win32SanitizerErrorDetected,
CTRL_ExceptionCodeKind_Win32SanitizerRawAccessViolation, CTRL_ExceptionCodeKind_Win32SanitizerRawAccessViolation,
CTRL_ExceptionCodeKind_Win32DirectXDebugLayer,
CTRL_ExceptionCodeKind_COUNT CTRL_ExceptionCodeKind_COUNT
} CTRL_ExceptionCodeKind; } CTRL_ExceptionCodeKind;
@@ -87,6 +88,7 @@ U32 ctrl_exception_code_kind_code_table[] =
0xc06d007f, 0xc06d007f,
0xe073616e, 0xe073616e,
0xe0736171, 0xe0736171,
0x0000087a,
}; };
String8 ctrl_exception_code_kind_display_string_table[] = 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) Procedure Not Found"),
str8_lit_comp("(Win32) Sanitizer Error Detected"), str8_lit_comp("(Win32) Sanitizer Error Detected"),
str8_lit_comp("(Win32) Sanitizer Raw Access Violation"), str8_lit_comp("(Win32) Sanitizer Raw Access Violation"),
str8_lit_comp("(Win32) DirectX Debug Layer"),
}; };
String8 ctrl_exception_code_kind_lowercase_code_string_table[] = 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_procedure_not_found"),
str8_lit_comp("win32_sanitizer_error_detected"), str8_lit_comp("win32_sanitizer_error_detected"),
str8_lit_comp("win32_sanitizer_raw_access_violation"), str8_lit_comp("win32_sanitizer_raw_access_violation"),
str8_lit_comp("win32_directx_debug_layer"),
}; };
B8 ctrl_exception_code_kind_default_enable_table[] = B8 ctrl_exception_code_kind_default_enable_table[] =
@@ -210,6 +214,7 @@ B8 ctrl_exception_code_kind_default_enable_table[] =
0, 0,
1, 1,
0, 0,
1,
}; };
+1 -1
View File
@@ -33,7 +33,7 @@ struct DASM_InstChunkNode
U64 count; U64 count;
}; };
typedef struct DASM_InstChunkNode DASM_InstChunkNode; typedef struct DASM_InstChunkList DASM_InstChunkList;
struct DASM_InstChunkList struct DASM_InstChunkList
{ {
DASM_InstChunkNode *first; DASM_InstChunkNode *first;
+56 -75
View File
@@ -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->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; break;
} }
} }
B32 need_deletion = 0;
if(binary != 0 && binary->refcount>0) if(binary != 0 && binary->refcount>0)
{ {
binary->refcount -= 1; 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); scratch_end(scratch);
@@ -294,7 +318,7 @@ dbgi_parse_from_exe_path(DBGI_Scope *scope, String8 exe_path, U64 endt_us)
break; break;
} }
else if(!sent && 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)) dbgi_u2p_enqueue_exe_path(exe_path, endt_us))
{ {
sent = 1; sent = 1;
@@ -451,7 +475,7 @@ dbgi_parse_thread_entry_point(void *p)
break; 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; task_is_taken_by_other_thread = 1;
} }
@@ -475,7 +499,7 @@ dbgi_parse_thread_entry_point(void *p)
void *exe_file_base = 0; void *exe_file_base = 0;
if(do_task) 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_props = os_properties_from_file(exe_file);
exe_file_map = os_file_map_open(OS_AccessFlag_Read, 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)); 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 //- rjf: parse exe file info
Arena *parse_arena = 0; Arena *parse_arena = 0;
PE_BinInfo exe_pe_info = {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) if(do_task)
{ {
parse_arena = arena_alloc(); 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); 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_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[] = String8 possible_og_dbg_paths[] =
{ {
/* inferred: */ exe_dbg_path_embedded, /* inferred (treated as absolute): */ exe_dbg_path_embedded_absolute,
/* "foo.exe" -> "foo.pdb" */ push_str8f(scratch.arena, "%S.pdb", str8_chop_last_dot(exe_path)), /* inferred (treated as relative): */ exe_dbg_path_embedded_relative,
/* "foo.exe" -> "foo.exe.pdb" */ push_str8f(scratch.arena, "%S.pdb", exe_path), /* "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) 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}; FileProperties og_dbg_props = {0};
if(do_task) ProfScope("analyze O.G. dbg file") 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); OS_Handle file_map = os_file_map_open(OS_AccessFlag_Read, file);
FileProperties props = og_dbg_props = os_properties_from_file(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)); void *base = os_file_map_view_open(file_map, OS_AccessFlag_Read, r1u64(0, props.size));
@@ -633,6 +661,7 @@ dbgi_parse_thread_entry_point(void *p)
opts.consoleless = 1; opts.consoleless = 1;
str8_list_pushf(scratch.arena, &opts.cmd_line, "raddbg"); 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, "--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, "--capture");
str8_list_pushf(scratch.arena, &opts.cmd_line, "--exe:%S", exe_path); 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); str8_list_pushf(scratch.arena, &opts.cmd_line, "--pdb:%S", og_dbg_path);
@@ -685,7 +714,7 @@ dbgi_parse_thread_entry_point(void *p)
void *raddbg_file_base = 0; void *raddbg_file_base = 0;
if(do_task && raddbg_file_is_up_to_date) 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_map = os_file_map_open(OS_AccessFlag_Read, raddbg_file);
raddbg_file_props = os_properties_from_file(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)); raddbg_file_base = os_file_map_view_open(raddbg_file_map, OS_AccessFlag_Read, r1u64(0, raddbg_file_props.size));
@@ -708,8 +737,10 @@ dbgi_parse_thread_entry_point(void *p)
} }
} }
//- rjf: cache write, step 1: check if either EXE or raddbg file is new. if //- rjf: cache write, step 1: check if refcount is still nonzero, &
// so, clear all old results & store new top-level info // 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; B32 raddbg_or_exe_file_is_updated = 0;
if(do_task) ProfScope("cache write, step 1: check if raddbg is new & clear") if(do_task) ProfScope("cache write, step 1: check if raddbg is new & clear")
{ {
@@ -717,6 +748,11 @@ dbgi_parse_thread_entry_point(void *p)
{ {
if(str8_match(bin->exe_path, exe_path, 0)) 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 || if(bin->parse.dbg_props.modified != raddbg_file_props.modified ||
bin->parse.exe_props.modified != exe_file_props.modified) bin->parse.exe_props.modified != exe_file_props.modified)
{ {
@@ -751,7 +787,7 @@ dbgi_parse_thread_entry_point(void *p)
//- rjf: raddbg file or exe is not new? cache can stay unmodified, close //- rjf: raddbg file or exe is not new? cache can stay unmodified, close
// handles & skip to end. // 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_view_close(raddbg_file_map, raddbg_file_base);
os_file_map_close(raddbg_file_map); os_file_map_close(raddbg_file_map);
@@ -759,6 +795,7 @@ dbgi_parse_thread_entry_point(void *p)
os_file_map_view_close(exe_file_map, exe_file_base); os_file_map_view_close(exe_file_map, exe_file_base);
os_file_map_close(exe_file_map); os_file_map_close(exe_file_map);
os_file_close(exe_file); os_file_close(exe_file);
arena_release(parse_arena);
do_task = 0; do_task = 0;
} }
@@ -785,7 +822,11 @@ dbgi_parse_thread_entry_point(void *p)
String8 dbg_path = og_dbg_path; String8 dbg_path = og_dbg_path;
if(dbg_path.size == 0) 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) if(dbg_path.size == 0)
{ {
@@ -826,63 +867,3 @@ dbgi_parse_thread_entry_point(void *p)
scratch_end(scratch); 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);
}
}
-6
View File
@@ -198,7 +198,6 @@ struct DBGI_Shared
// rjf: threads // rjf: threads
U64 parse_thread_count; U64 parse_thread_count;
OS_Handle *parse_threads; 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); internal void dbgi_parse_thread_entry_point(void *p);
////////////////////////////////
//~ rjf: Evictor Thread
internal void dbgi_evictor_thread_entry_point(void *p);
#endif //DBGI_H #endif //DBGI_H
+11 -2
View File
@@ -861,6 +861,7 @@ demon_os_run(Arena *arena, DEMON_OS_RunCtrls *ctrls){
// init new entity // init new entity
DEMON_Entity *module = demon_ent_new(process, DEMON_EntityKind_Module, module_base); DEMON_Entity *module = demon_ent_new(process, DEMON_EntityKind_Module, module_base);
module->addr_range_dim = image_info.size;
demon_module_count += 1; demon_module_count += 1;
DEMON_W32_Ext *module_ext = demon_w32_ext_alloc(); DEMON_W32_Ext *module_ext = demon_w32_ext_alloc();
module->ext = module_ext; module->ext = module_ext;
@@ -957,7 +958,9 @@ demon_os_run(Arena *arena, DEMON_OS_RunCtrls *ctrls){
} }
// rjf: check if trap // rjf: check if trap
B32 is_trap = (!first_bp && exception->ExceptionCode == DEMON_W32_EXCEPTION_BREAKPOINT); B32 is_trap = (!first_bp &&
(exception->ExceptionCode == DEMON_W32_EXCEPTION_BREAKPOINT ||
exception->ExceptionCode == DEMON_W32_EXCEPTION_STACK_BUFFER_OVERRUN));
// rjf: check if this trap is currently registered // rjf: check if this trap is currently registered
B32 hit_user_trap = 0; B32 hit_user_trap = 0;
@@ -979,7 +982,8 @@ demon_os_run(Arena *arena, DEMON_OS_RunCtrls *ctrls){
// TODO(rjf): x86/x64 specific check // TODO(rjf): x86/x64 specific check
// TODO(rjf): do we need to check to make sure the instruction // TODO(rjf): do we need to check to make sure the instruction
// pointer has not changed? // pointer has not changed?
hit_explicit_trap = (instruction_byte == 0xCC); hit_explicit_trap = (instruction_byte == 0xCC ||
instruction_byte == 0xCD);
} }
} }
@@ -1038,6 +1042,11 @@ demon_os_run(Arena *arena, DEMON_OS_RunCtrls *ctrls){
e->kind = report_event_kind; e->kind = report_event_kind;
}break; }break;
case DEMON_W32_EXCEPTION_STACK_BUFFER_OVERRUN:
{
e->kind = DEMON_EventKind_Trap;
}break;
case DEMON_W32_EXCEPTION_SINGLE_STEP: case DEMON_W32_EXCEPTION_SINGLE_STEP:
{ {
e->kind = DEMON_EventKind_SingleStep; e->kind = DEMON_EventKind_SingleStep;
+248 -54
View File
@@ -2642,6 +2642,98 @@ df_debug_info_path_from_module(Arena *arena, DF_Entity *module)
//////////////////////////////// ////////////////////////////////
//~ rjf: Stepping "Trap Net" Builders //~ 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 internal CTRL_TrapList
df_trap_net_from_thread__step_over_inst(Arena *arena, DF_Entity *thread) df_trap_net_from_thread__step_over_inst(Arena *arena, DF_Entity *thread)
{ {
@@ -2998,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); String8 path = df_full_path_from_entity(scratch.arena, binary);
DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, path, 0); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, path, 0);
RADDBG_Parsed *rdbg = &dbgi->rdbg; 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); U64 scope_idx = raddbg_vmap_idx_from_voff(rdbg->scope_vmap, rdbg->scope_vmap_count, voff);
RADDBG_Scope *scope = &rdbg->scopes[scope_idx]; RADDBG_Scope *scope = &rdbg->scopes[scope_idx];
@@ -3008,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); U8 *name_ptr = raddbg_string_from_idx(rdbg, procedure->name_string_idx, &name_size);
result = push_str8_copy(arena, str8(name_ptr, 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); dbgi_scope_close(scope);
scratch_end(scratch); scratch_end(scratch);
} }
@@ -3618,14 +3718,6 @@ df_set_thread_rip(DF_Entity *thread, U64 vaddr)
{ {
B32 result = ctrl_thread_write_rip(thread->ctrl_machine_id, thread->ctrl_handle, 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 // rjf: early mutation of unwind cache for immediate frontend effect
if(result) if(result)
{ {
@@ -4047,6 +4139,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 //- rjf: lex & parse
EVAL_TokenArray tokens = eval_token_array_from_text(arena, string); EVAL_TokenArray tokens = eval_token_array_from_text(arena, string);
EVAL_ParseResult parse = eval_parse_expr_from_text_tokens(arena, parse_ctx, string, &tokens); EVAL_ParseResult parse = eval_parse_expr_from_text_tokens(arena, parse_ctx, string, &tokens);
@@ -4075,23 +4180,10 @@ df_eval_from_string(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_
bytecode = eval_bytecode_from_oplist(arena, &op_list); 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 //- rjf: evaluate
EVAL_Result eval = {0}; EVAL_Result eval = {0};
if(bytecode.size != 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); eval = eval_interpret(&machine, bytecode);
} }
@@ -4122,6 +4214,12 @@ df_eval_from_string(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_
result.errors = errors; 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); scratch_end(scratch);
ProfEnd(); ProfEnd();
return result; return result;
@@ -4196,10 +4294,83 @@ df_value_mode_eval_from_eval(TG_Graph *graph, RADDBG_Parsed *rdbg, DF_CtrlCtx *c
return eval; 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_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 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) 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(); ProfBeginFunction();
//- rjf: apply view rules
for(DF_CfgVal *val = cfg->first_val; val != 0 && val != &df_g_nil_cfg_val; val = val->linear_next) 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); DF_CoreViewRuleSpec *spec = df_core_view_rule_spec_from_string(val->string);
@@ -4555,18 +4726,22 @@ df_string_from_simple_typed_eval(Arena *arena, TG_Graph *graph, RADDBG_Parsed *r
} }
if(flags & DF_EvalVizStringFlag_ReadOnlyDisplayRules) if(flags & DF_EvalVizStringFlag_ReadOnlyDisplayRules)
{ {
result = push_str8f(arena, "0x%I64x%s%S%s", eval.imm_u64, if(constant_name.size != 0)
constant_name.size != 0 ? " (" : "", {
constant_name, result = push_str8f(arena, "0x%I64x (%S)", eval.imm_u64, constant_name);
constant_name.size != 0 ? ")" : ""); }
else if(constant_name.size != 0)
{
result = push_str8f(arena, "0x%I64x (%I64u)", eval.imm_u64, eval.imm_u64);
}
} }
else if(constant_name.size != 0) else if(constant_name.size != 0)
{ {
result = push_str8f(arena, "%S", constant_name); result = push_str8_copy(arena, constant_name);
} }
else 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); scratch_end(scratch);
}break; }break;
@@ -4692,8 +4867,17 @@ df_commit_eval_value(TG_Graph *graph, RADDBG_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx,
}break; }break;
case EVAL_EvalMode_Reg: case EVAL_EvalMode_Reg:
{ {
// TODO(rjf) DF_Unwind unwind = df_query_cached_unwind_from_thread(thread);
result = 0; 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; }break;
} }
} }
@@ -4877,6 +5061,7 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DBGI_Scope *scope, DF_EvalVie
////////////////////////////// //////////////////////////////
//- rjf: apply view rules & resolve eval //- 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); eval = df_eval_from_eval_cfg_table(arena, scope, ctrl_ctx, parse_ctx, eval, cfg_table);
////////////////////////////// //////////////////////////////
@@ -4976,6 +5161,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) 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); 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) if(spec->info.flags & DF_CoreViewRuleSpecInfoFlag_VizBlockProd)
{ {
expand_rule = DF_EvalVizExpandRule_ViewRule; expand_rule = DF_EvalVizExpandRule_ViewRule;
@@ -6160,8 +6354,11 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt)
{ {
Temp scratch = scratch_begin(&arena, 1); 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 //- rjf: consume & process events
B32 run_caches_invalidated = 0;
CTRL_EventList events = ctrl_c2u_pop_events(scratch.arena); CTRL_EventList events = ctrl_c2u_pop_events(scratch.arena);
for(CTRL_EventNode *event_n = events.first; event_n != 0; event_n = event_n->next) for(CTRL_EventNode *event_n = events.first; event_n != 0; event_n = event_n->next)
{ {
@@ -6181,7 +6378,6 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt)
{ {
df_state->ctrl_is_running = 0; df_state->ctrl_is_running = 0;
df_state->ctrl_soft_halt_issued = 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); DF_Entity *stop_thread = df_entity_from_ctrl_handle(event->machine_id, event->entity);
// rjf: gather stop info // rjf: gather stop info
@@ -6227,14 +6423,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, &params, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Error));
}
}break; }break;
//- rjf: entity creation/deletion //- rjf: entity creation/deletion
case CTRL_EventKind_NewProc: case CTRL_EventKind_NewProc:
{ {
run_caches_invalidated = 1;
// rjf: the first process? -> clear session output & reset all bp hit counts // 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); DF_EntityList existing_processes = df_query_cached_entity_list_with_kind(DF_EntityKind_Process);
if(existing_processes.count == 0) if(existing_processes.count == 0)
@@ -6262,8 +6464,6 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt)
case CTRL_EventKind_NewThread: case CTRL_EventKind_NewThread:
{ {
run_caches_invalidated = 1;
// rjf: create entity // rjf: create entity
DF_Entity *parent = df_entity_from_ctrl_handle(event->machine_id, event->parent); DF_Entity *parent = df_entity_from_ctrl_handle(event->machine_id, event->parent);
DF_Entity *entity = df_entity_alloc(0, parent, DF_EntityKind_Thread); DF_Entity *entity = df_entity_alloc(0, parent, DF_EntityKind_Thread);
@@ -6450,7 +6650,6 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt)
df_entity_equip_color_rgba(thread, color); df_entity_equip_color_rgba(thread, color);
} }
} }
run_caches_invalidated = 1;
}break; }break;
} }
} }
@@ -6463,16 +6662,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 //- 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; B32 good = 1;
DF_EntityList all_threads = df_query_cached_entity_list_with_kind(DF_EntityKind_Thread); DF_EntityList all_threads = df_query_cached_entity_list_with_kind(DF_EntityKind_Thread);
@@ -6497,27 +6690,28 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt)
break; 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 //- 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; DF_RunLocalsCache *cache = &df_state->locals_cache;
arena_clear(cache->arena); arena_clear(cache->arena);
cache->table_size = 0; cache->table_size = 0;
cache->table = 0; cache->table = 0;
df_state->locals_cache_reggen_idx = new_reggen_idx;
} }
//- rjf: clear members cache //- rjf: clear members cache
if(df_state->member_cache_invalidated && !df_ctrl_targets_running()) if(df_state->member_cache_reggen_idx && !df_ctrl_targets_running())
{ {
df_state->member_cache_invalidated = 0;
DF_RunLocalsCache *cache = &df_state->member_cache; DF_RunLocalsCache *cache = &df_state->member_cache;
arena_clear(cache->arena); arena_clear(cache->arena);
cache->table_size = 0; cache->table_size = 0;
cache->table = 0; cache->table = 0;
df_state->member_cache_reggen_idx = new_reggen_idx;
} }
scratch_end(scratch); scratch_end(scratch);
@@ -7137,7 +7331,7 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt)
FileProperties props = {0}; FileProperties props = {0};
String8 data = {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); props = os_properties_from_file(file);
data = os_string_from_file_range(scratch.arena, file, r1u64(0, props.size)); data = os_string_from_file_range(scratch.arena, file, r1u64(0, props.size));
os_file_close(file); os_file_close(file);
@@ -7183,7 +7377,7 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt)
{ {
DF_Entity *file_entity = cfg_files[src]; DF_Entity *file_entity = cfg_files[src];
String8 path = df_full_path_from_entity(scratch.arena, file_entity); 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); FileProperties props = os_properties_from_file(file);
String8 data = os_string_from_file_range(scratch.arena, file, r1u64(0, props.size)); String8 data = os_string_from_file_range(scratch.arena, file, r1u64(0, props.size));
if(data.size != 0) if(data.size != 0)
@@ -7212,7 +7406,7 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt)
{ {
for(DF_CfgSrc src = (DF_CfgSrc)0; src < DF_CfgSrc_COUNT; src = (DF_CfgSrc)(src+1)) for(DF_CfgSrc src = (DF_CfgSrc)0; src < DF_CfgSrc_COUNT; src = (DF_CfgSrc)(src+1))
{ {
cfg_load[src] = (load_cfg[src] && cfg_timestamps[src] != 0 && ((cfg_save[src] == 0 && df_state->cfg_cached_timestamp[src] != cfg_timestamps[src]) || cfg_files[src]->timestamp == 0)); cfg_load[src] = (load_cfg[src] && ((cfg_save[src] == 0 && df_state->cfg_cached_timestamp[src] != cfg_timestamps[src]) || cfg_files[src]->timestamp == 0));
cfg_load_any = cfg_load_any || cfg_load[src]; cfg_load_any = cfg_load_any || cfg_load[src];
} }
} }
+9 -5
View File
@@ -818,6 +818,7 @@ struct DF_EvalVizRow
String8 expr; String8 expr;
String8 display_value; String8 display_value;
String8 edit_value; String8 edit_value;
TG_KeyList inherited_type_key_chain;
// rjf: variable-size & hook info // rjf: variable-size & hook info
U64 size_in_rows; U64 size_in_rows;
@@ -858,8 +859,9 @@ enum
DF_CmdSpecFlag_OmitFromLists = (1<<0), DF_CmdSpecFlag_OmitFromLists = (1<<0),
DF_CmdSpecFlag_RunKeepsQuery = (1<<1), DF_CmdSpecFlag_RunKeepsQuery = (1<<1),
DF_CmdSpecFlag_QueryUsesOldInput = (1<<2), DF_CmdSpecFlag_QueryUsesOldInput = (1<<2),
DF_CmdSpecFlag_AppliesToView = (1<<3), DF_CmdSpecFlag_OldInputSelect = (1<<3),
DF_CmdSpecFlag_QueryIsCode = (1<<4), DF_CmdSpecFlag_AppliesToView = (1<<4),
DF_CmdSpecFlag_QueryIsCode = (1<<5),
}; };
typedef struct DF_CmdSpecInfo DF_CmdSpecInfo; typedef struct DF_CmdSpecInfo DF_CmdSpecInfo;
@@ -1128,11 +1130,12 @@ struct DF_State
DF_EntityListCache bin_file_cache; DF_EntityListCache bin_file_cache;
// rjf: per-run caches // rjf: per-run caches
B32 unwind_cache_invalidated; U64 unwind_cache_reggen_idx;
U64 unwind_cache_memgen_idx;
DF_RunUnwindCache unwind_cache; DF_RunUnwindCache unwind_cache;
B32 locals_cache_invalidated; U64 locals_cache_reggen_idx;
DF_RunLocalsCache locals_cache; DF_RunLocalsCache locals_cache;
B32 member_cache_invalidated; U64 member_cache_reggen_idx;
DF_RunLocalsCache member_cache; DF_RunLocalsCache member_cache;
// rjf: eval view cache // rjf: eval view cache
@@ -1562,6 +1565,7 @@ internal EVAL_ParseCtx df_eval_parse_ctx_from_module_voff(DBGI_Scope *scope, DF_
internal EVAL_ParseCtx df_eval_parse_ctx_from_src_loc(DBGI_Scope *scope, DF_Entity *file, TxtPt pt); 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_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_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); 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);
//////////////////////////////// ////////////////////////////////
@@ -80,22 +80,23 @@ DF_EntityKindTable:
@table(name, name_lower, c_type) @table(name, name_lower, c_type)
DF_CmdParamSlotTable: DF_CmdParamSlotTable:
{ {
{Window, window, `DF_Handle`} {Window, window, `DF_Handle`}
{Panel, panel, `DF_Handle`} {Panel, panel, `DF_Handle`}
{DestPanel, dest_panel, `DF_Handle`} {DestPanel, dest_panel, `DF_Handle`}
{PrevView, prev_view, `DF_Handle`} {PrevView, prev_view, `DF_Handle`}
{View, view, `DF_Handle`} {View, view, `DF_Handle`}
{Entity, entity, `DF_Handle`} {Entity, entity, `DF_Handle`}
{EntityList, entity_list, `DF_HandleList`} {EntityList, entity_list, `DF_HandleList`}
{String, string, `String8`} {String, string, `String8`}
{FilePath, file_path, `String8`} {FilePath, file_path, `String8`}
{TextPoint, text_point, `TxtPt`} {TextPoint, text_point, `TxtPt`}
{CmdSpec, cmd_spec, `struct DF_CmdSpec *`} {CmdSpec, cmd_spec, `struct DF_CmdSpec *`}
{VirtualAddr, vaddr, `U64`} {VirtualAddr, vaddr, `U64`}
{VirtualOff, voff, `U64`} {VirtualOff, voff, `U64`}
{Index, index, `U64`} {Index, index, `U64`}
{ID, id, `U64`} {ID, id, `U64`}
{PreferDisassembly, prefer_dasm, `B32`} {PreferDisassembly, prefer_dasm, `B32`}
{ForceConfirm, force_confirm,`B32`}
} }
@table(name, display_string, args_desc) @table(name, display_string, args_desc)
@@ -114,283 +115,287 @@ DF_CmdQueryRuleTable:
{ID "ID" "<id>" } {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 ) @table(name lister_omit keep_query old_input oi_select 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: DF_CoreCmdTable:
{ {
{Null 1 0 0 0 0 Null Null Null Null Null 0 0 Null "" "" "" "" } {Null 1 0 0 0 0 0 Null Null Null Null Null 0 0 Null "" "" "" "" }
//- rjf: exiting //- 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 0 0 0 0 0 Null Null Null Null Null 0 0 X "exit" "Exit" "Exits the debugger." "quit,close,abort" }
//- rjf: command fast path //- 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." "" } {CommandFastPath 1 0 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: notifications //- rjf: notifications
{Error 1 0 0 0 0 String Null Null Null Null 0 0 Null "error" "Error" "Notifies of an error." "" } {Error 1 0 0 0 0 0 String Null Null Null Null 0 0 Null "error" "Error" "Notifies of an error." "" }
//- rjf: low-level target control operations //- 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" } {LaunchAndRun 0 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" } {LaunchAndInit 0 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" } {Kill 0 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" } {KillAll 0 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" } {Detach 0 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." "" } {Continue 0 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" } {StepIntoInst 0 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" } {StepOverInst 0 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" } {StepIntoLine 0 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" } {StepOverLine 0 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." "" } {StepOut 0 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." "" } {RunToAddress 0 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." "" } {RunToModuleOffset 0 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" } {Halt 0 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." "" } {SoftHaltRefresh 0 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." "" } {SetThreadIP 1 0 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." "" }
//- rjf: high-level composite target control operations //- 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" } {Run 0 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" } {Restart 0 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." "" } {StepInto 0 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." "" } {StepOver 0 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." "" } {RunToCursor 0 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." "" } {SetNextStatement 0 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." "" }
//- rjf: solo stepping mode //- 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" } {EnableSoloSteppingMode 0 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" } {DisableSoloSteppingMode 0 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" }
//- rjf: debug control context management operations //- 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." "" } {SelectThread 0 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." "" } {SelectThreadWindow 0 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." "" } {SelectThreadView 0 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." "" } {SelectUnwind 1 0 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." "" } {UpOneFrame 0 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." "" } {DownOneFrame 0 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." "" } {FreezeThread 0 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." "" } {ThawThread 0 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." "" } {FreezeProcess 0 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." "" } {ThawProcess 0 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." "" } {FreezeMachine 1 0 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." "" } {ThawMachine 1 0 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." "" } {FreezeLocalMachine 0 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." "" } {ThawLocalMachine 0 0 0 0 0 0 Null Null Null Null Null 0 0 Machine "thaw_local_machine" "Thaw Local Machine" "Thaws the local machine." "" }
//- rjf: font sizes //- 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." "" } {IncUIFontScale 0 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." "" } {DecUIFontScale 0 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." "" } {IncCodeFontScale 0 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." "" } {DecCodeFontScale 0 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." "" }
//- rjf: windows //- 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." "" } {OpenWindow 0 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." "" } {CloseWindow 0 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." "" } {ToggleFullscreen 0 0 0 0 0 0 Window Null Null Null Null 0 0 Window "toggle_fullscreen" "Toggle Fullscreen" "Toggles fullscreen view on the active window." "" }
//- rjf: confirmations
{ConfirmAccept 1 0 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 0 Null Null Null Null Null 0 0 Null "confirm_cancel" "Confirm Cancel" "Cancels the active confirmation prompt." "" }
//- rjf: panel splitting //- 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" } {ResetToDefaultPanels 0 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" } {NewPanelRight 0 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" } {NewPanelDown 0 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" }
//- rjf: panel rotation //- 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 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." "" }
//- rjf: focused panel changing //- 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." "" } {NextPanel 0 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." "" } {PrevPanel 0 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." "" } {FocusPanel 1 0 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." "" } {FocusPanelRight 0 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." "" } {FocusPanelLeft 0 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." "" } {FocusPanelUp 0 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." "" } {FocusPanelDown 0 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." "" }
//- rjf: undo/redo //- rjf: undo/redo
{Undo 1 0 0 0 0 Null Null Null Null Null 0 0 Undo "undo" "Undo" "Undoes the previous action." "" } {Undo 1 0 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." "" } {Redo 1 0 0 0 0 0 Null Null Null Null Null 0 0 Redo "redo" "Redo" "Redoes the first previously undone action." "" }
//- rjf: focus history //- 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." "" } {GoBack 1 0 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." "" } {GoForward 1 0 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." "" }
//- rjf: panel removal //- 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 0 0 0 0 0 Window Panel Null Null Null 0 0 ClosePanel "close_panel" "Close Panel" "Closes the currently active panel." "" }
//- rjf: panel tab //- 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." "" } {NextTab 0 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." "" } {PrevTab 0 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." "" } {MoveTabRight 0 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." "" } {MoveTabLeft 0 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." "" } {CloseTab 0 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." "" } {MoveTab 1 0 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." "" } {TabBarTop 0 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." "" } {TabBarBottom 0 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." "" } {TabBarEnable 0 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." "" } {TabBarDisable 0 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." "" } {TabBarHistoryModeEnable 0 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." "" } {TabBarHistoryModeDisable 0 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." "" }
//- rjf: files //- 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." "" } {SetCurrentPath 0 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" } {Open 0 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" } {Reload 0 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" } {ReloadActive 0 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" } {Switch 0 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" }
//- rjf: override file links //- 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." "" } {SetFileOverrideLinkSrc 1 0 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." "" } {SetFileOverrideLinkDst 1 0 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." "" } {SetFileReplacementPath 1 0 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." "" }
//- rjf: setting config paths //- 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" } {LoadUser 0 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" } {LoadProfile 0 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" }
//- rjf: loading/applying stateful config changes //- 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." "" } {ApplyUserData 1 0 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." "" } {ApplyProfileData 1 0 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." "" }
//- rjf: writing config changes //- 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." "" } {WriteUserData 1 0 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." "" } {WriteProfileData 1 0 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." "" }
//- rjf: directional movement & text controls //- 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." "" } {MoveLeft 0 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." "" } {MoveRight 0 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." "" } {MoveUp 0 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." "" } {MoveDown 0 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." "" } {MoveLeftSelect 0 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." "" } {MoveRightSelect 0 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." "" } {MoveUpSelect 0 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." "" } {MoveDownSelect 0 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." "" } {MoveLeftChunk 0 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." "" } {MoveRightChunk 0 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." "" } {MoveUpChunk 0 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." "" } {MoveDownChunk 0 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." "" } {MoveUpPage 0 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." "" } {MoveDownPage 0 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." "" } {MoveUpWhole 0 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." "" } {MoveDownWhole 0 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." "" } {MoveLeftChunkSelect 0 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." "" } {MoveRightChunkSelect 0 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." "" } {MoveUpChunkSelect 0 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." "" } {MoveDownChunkSelect 0 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." "" } {MoveUpPageSelect 0 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." "" } {MoveDownPageSelect 0 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." "" } {MoveUpWholeSelect 0 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." "" } {MoveDownWholeSelect 0 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." "" } {MoveHome 0 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." "" } {MoveEnd 0 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." "" } {MoveHomeSelect 0 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." "" } {MoveEndSelect 0 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." "" } {SelectAll 0 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." "" } {DeleteSingle 0 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." "" } {DeleteChunk 0 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." "" } {BackspaceSingle 0 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." "" } {BackspaceChunk 0 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." "" } {Copy 0 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." "" } {Cut 0 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." "" } {Paste 0 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." "" } {InsertText 1 0 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." "" }
//- rjf: code navigation //- 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." "" } {GoToLine 0 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." "" } {GoToAddress 0 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." "" } {CenterCursor 0 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." "" } {ContainCursor 0 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." "" } {FindTextForward 0 1 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." "" } {FindTextBackward 0 1 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." "" } {FindNext 0 1 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." "" } {FindPrev 0 1 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." "" }
//- rjf: thread finding //- 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." "" } {FindThread 0 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." "" } {FindSelectedThread 0 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." "" }
//- rjf: name finding //- 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." "" } {GoToName 0 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." "" } {GoToNameAtCursor 0 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." "" }
//- rjf: watch expressions //- 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." "" } {ToggleWatchExpression 0 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." "" } {ToggleWatchExpressionAtCursor 0 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 //- 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." "" } {OpenFileMemory 0 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." "" } {OpenProcessMemory 0 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." "" } {OpenSelectedProcessMemory 0 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." "" }
//- rjf: memory view parameterization //- 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 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." "" }
//- rjf: disassembly view parameterization //- 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." "" } {ToggleAddressVisibility 0 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." "" } {ToggleCodeBytesVisibility 0 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." "" }
//- rjf: general entity operations //- 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." "" } {EnableEntity 1 0 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." "" } {DisableEntity 1 0 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." "" } {FreezeEntity 1 0 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." "" } {ThawEntity 1 0 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." "" } {RemoveEntity 1 0 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." "" } {NameEntity 1 0 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." "" } {EditEntity 1 0 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." "" } {DuplicateEntity 1 0 0 0 0 0 Null Null Null Null Null 0 0 Null "duplicate_entity" "Duplicate Entity" "Duplicates an entity." "" }
//- rjf: breakpoints //- 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." "" } {TextBreakpoint 1 0 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." "" } {AddressBreakpoint 0 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." "" } {FunctionBreakpoint 0 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." "" } {ToggleBreakpointAtCursor 0 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." "" } {RemoveBreakpoint 0 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." "" } {EnableBreakpoint 0 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." "" } {DisableBreakpoint 0 0 0 0 0 0 Entity Null Null Breakpoint Entity DF_EntityKind_Breakpoint 0 CheckHollow "disable_breakpoint" "Disable Breakpoint" "Disables a breakpoint." "" }
//- rjf: watches //- 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." "" } {ToggleWatchPin 1 0 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." "" } {ToggleWatchPinAtCursor 0 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." "" }
//- rjf: targets //- 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" } {AddTarget 0 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" } {RemoveTarget 0 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." "" } {EditTarget 0 0 0 0 0 0 Entity Null Null Target Entity DF_EntityKind_Target 0 Pencil "edit_target" "Edit Target" "Edits an existing target." "" }
//- rjf: ended processes //- 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 0 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." "" }
//- rjf: attaching //- 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." "" } {Attach 0 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." "" } {RegisterAsJITDebugger 0 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." "" }
//- rjf: catchall general entity activation paths (drag/drop, clicking) //- 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." "" } {EntityRefFastPath 1 0 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." "" } {SpawnEntityView 1 0 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." "" } {FindCodeLocation 0 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." "" }
//- rjf: view drivers //- 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." "" } {Commands 0 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." "" } {Target 1 0 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." "" } {Targets 0 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." "" } {FilePathMap 0 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." "" } {Scheduler 0 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" } {CallStack 0 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." "" } {Modules 0 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." "" } {PendingEntity 1 0 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." "" } {Code 1 0 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." "" } {Watch 0 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." "" } {Locals 0 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." "" } {Registers 0 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." "" } {Output 0 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." "" } {Memory 0 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" } {Disassembly 0 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." "" } {Breakpoints 0 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." "" } {WatchPins 0 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" } {ExceptionFilters 0 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" } {Theme 0 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." "" } {PickFile 1 0 0 0 1 0 FilePath Null Null Null FilePath 0 0 FileOutline "pick_file" "Pick File" "Opens the file browser to pick a file." "" }
//- rjf: core pass-through view result commands //- 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." "" } {ViewReturn 1 0 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: developer commands //- 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 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." "" }
} }
//////////////////////////////// ////////////////////////////////
@@ -1842,7 +1847,7 @@ df_g_cfg_src_apply_cmd_kind_table:
df_g_core_cmd_kind_spec_info_table: df_g_core_cmd_kind_spec_info_table:
{ {
@expand(DF_CoreCmdTable, a) @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_CmdSpecFlag_RunKeepsQuery*$(a.keep_query)) | (DF_CmdSpecFlag_QueryUsesOldInput*$(a.old_input)) | (DF_CmdSpecFlag_OldInputSelect*$(a.oi_select)) | (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)}},```;
} }
//- rjf: core view rule tables //- rjf: core view rule tables
+198 -196
View File
@@ -5,202 +5,204 @@
DF_CmdSpecInfo df_g_core_cmd_kind_spec_info_table[] = 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(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (DF_CmdSpecFlag_OmitFromLists*1) | (DF_CmdSpecFlag_RunKeepsQuery*0) | (DF_CmdSpecFlag_QueryUsesOldInput*0) | (DF_CmdSpecFlag_OldInputSelect*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("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_OldInputSelect*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("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_OldInputSelect*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("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_OldInputSelect*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_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_OldInputSelect*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("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_OldInputSelect*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"), 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_OldInputSelect*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("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_OldInputSelect*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("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_OldInputSelect*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("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_OldInputSelect*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_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_OldInputSelect*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_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_OldInputSelect*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_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_OldInputSelect*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_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_OldInputSelect*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("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_OldInputSelect*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_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_OldInputSelect*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("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_OldInputSelect*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("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_OldInputSelect*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("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_OldInputSelect*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("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_OldInputSelect*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("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_OldInputSelect*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("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_OldInputSelect*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_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_OldInputSelect*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("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_OldInputSelect*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("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_OldInputSelect*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("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_OldInputSelect*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("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_OldInputSelect*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("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_OldInputSelect*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"), 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_OldInputSelect*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_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_OldInputSelect*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_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_OldInputSelect*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("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_OldInputSelect*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("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_OldInputSelect*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("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_OldInputSelect*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("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_OldInputSelect*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("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_OldInputSelect*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("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_OldInputSelect*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("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_OldInputSelect*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("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_OldInputSelect*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("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_OldInputSelect*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("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_OldInputSelect*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("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_OldInputSelect*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("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_OldInputSelect*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("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_OldInputSelect*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("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_OldInputSelect*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("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_OldInputSelect*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("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_OldInputSelect*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("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_OldInputSelect*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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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"), 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("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_OldInputSelect*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_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("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_OldInputSelect*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_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"), 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_OldInputSelect*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_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_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_OldInputSelect*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_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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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_OldInputSelect*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_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_OldInputSelect*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"), 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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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_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_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_OldInputSelect*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_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_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_OldInputSelect*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_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_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_OldInputSelect*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("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_OldInputSelect*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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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_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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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_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("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_OldInputSelect*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("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_OldInputSelect*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_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("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_OldInputSelect*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_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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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_OldInputSelect*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("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_OldInputSelect*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("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_OldInputSelect*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_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_OldInputSelect*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_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_OldInputSelect*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_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_OldInputSelect*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_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_OldInputSelect*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_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_OldInputSelect*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_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_OldInputSelect*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_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_OldInputSelect*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_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_OldInputSelect*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_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_OldInputSelect*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_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_OldInputSelect*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_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_OldInputSelect*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_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_OldInputSelect*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_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_OldInputSelect*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_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_OldInputSelect*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_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_OldInputSelect*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_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_OldInputSelect*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_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_OldInputSelect*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_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_OldInputSelect*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_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_OldInputSelect*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_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_OldInputSelect*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_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_OldInputSelect*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_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_OldInputSelect*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_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_OldInputSelect*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_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_OldInputSelect*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_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_OldInputSelect*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("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_OldInputSelect*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("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_OldInputSelect*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("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_OldInputSelect*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("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_OldInputSelect*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("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_OldInputSelect*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("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_OldInputSelect*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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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_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("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_OldInputSelect*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_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_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_OldInputSelect*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_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_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_OldInputSelect*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_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_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_OldInputSelect*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_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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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_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("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_OldInputSelect*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_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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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_OldInputSelect*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("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_OldInputSelect*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("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_OldInputSelect*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("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("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_OldInputSelect*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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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("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("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_OldInputSelect*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_OldInputSelect*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_OldInputSelect*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}},
}; };
DF_CoreViewRuleSpecInfo df_g_core_view_rule_spec_info_table[] = DF_CoreViewRuleSpecInfo df_g_core_view_rule_spec_info_table[] =
+4
View File
@@ -104,6 +104,8 @@ DF_CoreCmdKind_DecCodeFontScale,
DF_CoreCmdKind_OpenWindow, DF_CoreCmdKind_OpenWindow,
DF_CoreCmdKind_CloseWindow, DF_CoreCmdKind_CloseWindow,
DF_CoreCmdKind_ToggleFullscreen, DF_CoreCmdKind_ToggleFullscreen,
DF_CoreCmdKind_ConfirmAccept,
DF_CoreCmdKind_ConfirmCancel,
DF_CoreCmdKind_ResetToDefaultPanels, DF_CoreCmdKind_ResetToDefaultPanels,
DF_CoreCmdKind_NewPanelRight, DF_CoreCmdKind_NewPanelRight,
DF_CoreCmdKind_NewPanelDown, DF_CoreCmdKind_NewPanelDown,
@@ -368,6 +370,7 @@ DF_CmdParamSlot_VirtualOff,
DF_CmdParamSlot_Index, DF_CmdParamSlot_Index,
DF_CmdParamSlot_ID, DF_CmdParamSlot_ID,
DF_CmdParamSlot_PreferDisassembly, DF_CmdParamSlot_PreferDisassembly,
DF_CmdParamSlot_ForceConfirm,
DF_CmdParamSlot_COUNT DF_CmdParamSlot_COUNT
} DF_CmdParamSlot; } DF_CmdParamSlot;
@@ -407,6 +410,7 @@ U64 voff;
U64 index; U64 index;
U64 id; U64 id;
B32 prefer_dasm; B32 prefer_dasm;
B32 force_confirm;
}; };
DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(array); DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(array);
+237 -48
View File
@@ -1145,6 +1145,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
{ {
ProfBeginFunction(); ProfBeginFunction();
B32 window_is_focused = os_window_is_focused(ws->os); B32 window_is_focused = os_window_is_focused(ws->os);
B32 confirm_open = df_gfx_state->confirm_active;
B32 hover_eval_is_open = (ws->hover_eval_string.size != 0 && ws->hover_eval_first_frame_idx+20 < ws->hover_eval_last_frame_idx && df_frame_index()-ws->hover_eval_last_frame_idx < 20); B32 hover_eval_is_open = (ws->hover_eval_string.size != 0 && ws->hover_eval_first_frame_idx+20 < ws->hover_eval_last_frame_idx && df_frame_index()-ws->hover_eval_last_frame_idx < 20);
B32 any_query_is_focused = !df_panel_is_nil(ws->focused_panel) && !df_view_is_nil(df_query_view_from_panel(ws->focused_panel)); B32 any_query_is_focused = !df_panel_is_nil(ws->focused_panel) && !df_view_is_nil(df_query_view_from_panel(ws->focused_panel));
if(!window_is_focused) if(!window_is_focused)
@@ -1257,6 +1258,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
DF_CmdQueryRule query_rule = spec->info.query_rule; DF_CmdQueryRule query_rule = spec->info.query_rule;
B32 applies_to_view = !!(spec->info.flags & DF_CmdSpecFlag_AppliesToView); B32 applies_to_view = !!(spec->info.flags & DF_CmdSpecFlag_AppliesToView);
B32 fill_with_input = !!(spec->info.flags & DF_CmdSpecFlag_QueryUsesOldInput); B32 fill_with_input = !!(spec->info.flags & DF_CmdSpecFlag_QueryUsesOldInput);
B32 select_old_input = !!(spec->info.flags & DF_CmdSpecFlag_OldInputSelect);
//- rjf: grab active input from panel //- rjf: grab active input from panel
B32 active_input_valid = 0; B32 active_input_valid = 0;
@@ -1328,6 +1330,10 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
{ {
DF_CmdParams params = df_cmd_params_from_panel(ws, panel); DF_CmdParams params = df_cmd_params_from_panel(ws, panel);
df_view_equip_command(view, spec, &params, default_input, &df_g_nil_cfg_node); df_view_equip_command(view, spec, &params, default_input, &df_g_nil_cfg_node);
if(select_old_input)
{
view->query_mark = txt_pt(1, 1);
}
} }
//- rjf: focus this panel //- rjf: focus this panel
@@ -1842,8 +1848,18 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
keep_child->size_pct_of_parent.v[split_axis] *= size_pct_of_parent.v[split_axis]; keep_child->size_pct_of_parent.v[split_axis] *= size_pct_of_parent.v[split_axis];
keep_child->size_pct_of_parent.v[axis2_flip(split_axis)] *= size_pct_of_parent.v[axis2_flip(split_axis)]; keep_child->size_pct_of_parent.v[axis2_flip(split_axis)] *= size_pct_of_parent.v[axis2_flip(split_axis)];
// rjf: reset focus, if needed
if(ws->focused_panel == discard_child)
{
ws->focused_panel = keep_child;
for(DF_Panel *grandchild = ws->focused_panel; !df_panel_is_nil(grandchild); grandchild = grandchild->first)
{
ws->focused_panel = grandchild;
}
}
// rjf: keep-child split-axis == grandparent split-axis? bubble keep-child up into grandparent's children // rjf: keep-child split-axis == grandparent split-axis? bubble keep-child up into grandparent's children
if(grandparent->split_axis == keep_child->split_axis && !df_panel_is_nil(keep_child->first)) if(!df_panel_is_nil(grandparent) && grandparent->split_axis == keep_child->split_axis && !df_panel_is_nil(keep_child->first))
{ {
df_panel_remove(grandparent, keep_child); df_panel_remove(grandparent, keep_child);
DF_Panel *prev = parent_prev; DF_Panel *prev = parent_prev;
@@ -1858,16 +1874,6 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
} }
df_panel_release(ws, keep_child); df_panel_release(ws, keep_child);
} }
// rjf: reset focus, if needed
if(ws->focused_panel == discard_child)
{
ws->focused_panel = keep_child;
for(DF_Panel *grandchild = ws->focused_panel; !df_panel_is_nil(grandchild); grandchild = grandchild->first)
{
ws->focused_panel = grandchild;
}
}
} }
// NOTE(rjf): Otherwise we can just remove this child. // NOTE(rjf): Otherwise we can just remove this child.
else else
@@ -3495,14 +3501,14 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
color.y *= 0.7f; color.y *= 0.7f;
color.z *= 0.7f; color.z *= 0.7f;
ui_set_next_background_color(color); ui_set_next_background_color(color);
if(is_frozen && df_icon_buttonf(DF_IconKind_Locked, "Thaw").clicked) if(is_frozen && df_icon_buttonf(DF_IconKind_Locked, "Thaw###freeze_thaw").clicked)
{ {
DF_CmdParams params = df_cmd_params_from_window(ws); DF_CmdParams params = df_cmd_params_from_window(ws);
params.entity = df_handle_from_entity(entity); params.entity = df_handle_from_entity(entity);
df_cmd_params_mark_slot(&params, DF_CmdParamSlot_Entity); df_cmd_params_mark_slot(&params, DF_CmdParamSlot_Entity);
df_push_cmd__root(&params, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_ThawEntity)); df_push_cmd__root(&params, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_ThawEntity));
} }
if(!is_frozen && df_icon_buttonf(DF_IconKind_Unlocked, "Freeze").clicked) if(!is_frozen && df_icon_buttonf(DF_IconKind_Unlocked, "Freeze###freeze_thaw").clicked)
{ {
DF_CmdParams params = df_cmd_params_from_window(ws); DF_CmdParams params = df_cmd_params_from_window(ws);
params.entity = df_handle_from_entity(entity); params.entity = df_handle_from_entity(entity);
@@ -3597,9 +3603,9 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
B32 is_selected = df_handle_match(ctrl_ctx.thread, df_handle_from_entity(entity)); B32 is_selected = df_handle_match(ctrl_ctx.thread, df_handle_from_entity(entity));
if(is_selected) if(is_selected)
{ {
df_icon_buttonf(DF_IconKind_Thread, "[Selected]"); df_icon_buttonf(DF_IconKind_Thread, "[Selected]###select_entity");
} }
else if(df_icon_buttonf(DF_IconKind_Thread, "Select").clicked) else if(df_icon_buttonf(DF_IconKind_Thread, "Select###select_entity").clicked)
{ {
DF_CmdParams params = df_cmd_params_from_window(ws); DF_CmdParams params = df_cmd_params_from_window(ws);
params.entity = df_handle_from_entity(entity); params.entity = df_handle_from_entity(entity);
@@ -3861,6 +3867,55 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
scratch_end(scratch); scratch_end(scratch);
} }
//- rjf: confirmation popup
{
if(df_gfx_state->confirm_t > 0.005f) UI_Focus(1) UI_TextAlignment(UI_TextAlign_Center)
{
Vec2F32 window_dim = dim_2f32(window_rect);
UI_Box *bg_box = &ui_g_nil_box;
UI_Rect(window_rect) UI_ChildLayoutAxis(Axis2_X)
{
Vec4F32 bg_color = ui_top_background_color();
bg_color.w *= df_gfx_state->confirm_t;
ui_set_next_blur_size(10*df_gfx_state->confirm_t);
ui_set_next_background_color(bg_color);
bg_box = ui_build_box_from_stringf(UI_BoxFlag_FixedSize|UI_BoxFlag_Floating|UI_BoxFlag_Clickable|UI_BoxFlag_Scroll|UI_BoxFlag_DefaultFocusNav|UI_BoxFlag_DrawBackgroundBlur|UI_BoxFlag_DrawBackground, "###confirm_popup_%p", ws);
}
if(df_gfx_state->confirm_active) UI_Parent(bg_box)
{
ui_ctx_menu_close();
UI_WidthFill UI_PrefHeight(ui_children_sum(1.f)) UI_Column UI_Padding(ui_pct(1, 0))
{
UI_FontSize(ui_top_font_size()*2.f) UI_PrefHeight(ui_em(3.f, 1.f)) ui_label(df_gfx_state->confirm_title);
UI_PrefHeight(ui_em(3.f, 1.f)) UI_TextColor(df_rgba_from_theme_color(DF_ThemeColor_WeakText)) ui_label(df_gfx_state->confirm_msg);
ui_spacer(ui_em(1.5f, 1.f));
UI_Row UI_Padding(ui_pct(1.f, 0.f)) UI_WidthFill UI_PrefHeight(ui_em(5.f, 1.f))
{
UI_CornerRadius00(ui_top_font_size()*0.25f)
UI_CornerRadius01(ui_top_font_size()*0.25f)
if(ui_buttonf("Cancel").clicked || os_key_press(ui_events(), ui_window(), 0, OS_Key_Esc))
{
DF_CmdParams p = df_cmd_params_zero();
df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_ConfirmCancel));
}
UI_CornerRadius10(ui_top_font_size()*0.25f)
UI_CornerRadius11(ui_top_font_size()*0.25f)
UI_BackgroundColor(df_rgba_from_theme_color(DF_ThemeColor_ActionBackground))
UI_TextColor(df_rgba_from_theme_color(DF_ThemeColor_ActionText))
UI_BorderColor(df_rgba_from_theme_color(DF_ThemeColor_ActionBorder))
if(ui_buttonf("OK").clicked || os_key_press(ui_events(), ui_window(), 0, OS_Key_Return))
{
DF_CmdParams p = df_cmd_params_zero();
df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_ConfirmAccept));
}
}
ui_spacer(ui_em(3.f, 1.f));
}
}
ui_signal_from_box(bg_box);
}
}
//- rjf: build auto-complete lister //- rjf: build auto-complete lister
ProfScope("build autocomplete lister") ProfScope("build autocomplete lister")
if(!ws->autocomp_force_closed && !ui_key_match(ws->autocomp_root_key, ui_key_zero()) && ws->autocomp_last_frame_idx+1 >= df_frame_index()) if(!ws->autocomp_force_closed && !ui_key_match(ws->autocomp_root_key, ui_key_zero()) && ws->autocomp_last_frame_idx+1 >= df_frame_index())
@@ -4032,6 +4087,32 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
//- rjf: build hover eval //- rjf: build hover eval
ProfScope("build hover eval") ProfScope("build hover eval")
{ {
// find panel/view pair that the mouse is on and disable hover if that view is scrolling
if(hover_eval_is_open)
{
for(DF_Panel *panel = ws->root_panel; !df_panel_is_nil(panel); panel = df_panel_rec_df_pre(panel).next)
{
if(!df_panel_is_nil(panel->first))
{
continue;
}
DF_View *view = df_selected_view_from_panel(panel);
if (!df_view_is_nil(view))
{
Rng2F32 panel_rect = df_rect_from_panel(content_rect, ws->root_panel, panel);
if(contains_2f32(panel_rect, ws->ui->mouse))
{
if(abs_f32(view->scroll_pos.x.off) > 0.01f ||
abs_f32(view->scroll_pos.y.off) > 0.01f)
{
hover_eval_is_open = 0;
ws->hover_eval_first_frame_idx = df_frame_index();
}
}
}
}
}
if(ws->hover_eval_string.size == 0) if(ws->hover_eval_string.size == 0)
{ {
ws->hover_eval_num_visible_rows_t = 0; ws->hover_eval_num_visible_rows_t = 0;
@@ -4122,7 +4203,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
} }
UI_PrefWidth(ui_em(30.f, 1.f)) UI_PrefWidth(ui_em(30.f, 1.f))
{ {
UI_PrefWidth(ui_text_dim(10, 1.f)) df_code_label(1.f, 1, row->expr); UI_PrefWidth(ui_text_dim(10, 1.f)) df_code_label(1.f, 1, df_rgba_from_theme_color(DF_ThemeColor_CodeDefault), row->expr);
ui_spacer(ui_em(1.5f, 1.f)); ui_spacer(ui_em(1.5f, 1.f));
if(row->flags & DF_EvalVizRowFlag_CanEditValue) if(row->flags & DF_EvalVizRowFlag_CanEditValue)
{ {
@@ -4147,7 +4228,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
} }
else else
{ {
df_code_label(1.f, 1, row->display_value); df_code_label(1.f, 1, df_rgba_from_theme_color(DF_ThemeColor_CodeDefault), row->display_value);
} }
} }
ui_spacer(ui_em(0.75f, 1.f)); ui_spacer(ui_em(0.75f, 1.f));
@@ -4453,7 +4534,8 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
UI_Key help_menu_key = ui_key_from_string(ui_key_zero(), str8_lit("_help_menu_key_")); UI_Key help_menu_key = ui_key_from_string(ui_key_zero(), str8_lit("_help_menu_key_"));
UI_CtxMenu(help_menu_key) UI_PrefWidth(ui_em(40.f, 1.f)) UI_CtxMenu(help_menu_key) UI_PrefWidth(ui_em(40.f, 1.f))
{ {
UI_Row UI_TextAlignment(UI_TextAlign_Center) UI_TextColor(df_rgba_from_theme_color(DF_ThemeColor_WeakText)) ui_label(str8_lit_comp(RADDBG_TITLE_STRING_LITERAL)); UI_Row UI_TextAlignment(UI_TextAlign_Center) UI_TextColor(df_rgba_from_theme_color(DF_ThemeColor_WeakText))
ui_label(str8_lit(RADDBG_TITLE_STRING_LITERAL));
ui_spacer(ui_em(0.25f, 1.f)); ui_spacer(ui_em(0.25f, 1.f));
UI_Row UI_Row
UI_PrefWidth(ui_text_dim(10, 1)) UI_PrefWidth(ui_text_dim(10, 1))
@@ -4939,7 +5021,8 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
}break; }break;
case CTRL_EventCause_InterruptedByTrap: case CTRL_EventCause_InterruptedByTrap:
{ {
icon = DF_IconKind_WarningBig;
explanation = push_str8f(scratch.arena, "%S interrupted by trap - 0x%x", thread_display_string, stop_event.exception_code);
}break; }break;
case CTRL_EventCause_InterruptedByHalt: case CTRL_EventCause_InterruptedByHalt:
{ {
@@ -4999,18 +5082,21 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
Vec4F32 tx_color = df_rgba_from_theme_color(DF_ThemeColor_FailureText); Vec4F32 tx_color = df_rgba_from_theme_color(DF_ThemeColor_FailureText);
F32 alpha_factor = Max(ws->error_t, 0.2f); F32 alpha_factor = Max(ws->error_t, 0.2f);
tx_color.w *= alpha_factor; tx_color.w *= alpha_factor;
ui_set_next_text_color(tx_color); String8 error_string = str8(ws->error_buffer, ws->error_string_size);
ui_set_next_pref_width(ui_children_sum(1)); if(error_string.size != 0)
UI_CornerRadius(4)
UI_Row
UI_PrefWidth(ui_text_dim(10, 1))
UI_TextAlignment(UI_TextAlign_Center)
{ {
String8 error_string = str8(ws->error_buffer, ws->error_string_size); ui_set_next_text_color(tx_color);
UI_Font(df_font_from_slot(DF_FontSlot_Icons)) ui_set_next_pref_width(ui_children_sum(1));
UI_FontSize(df_font_size_from_slot(ws, DF_FontSlot_Icons)) UI_CornerRadius(4)
ui_label(df_g_icon_kind_text_table[DF_IconKind_WarningBig]); UI_Row
ui_label(error_string); UI_PrefWidth(ui_text_dim(10, 1))
UI_TextAlignment(UI_TextAlign_Center)
{
UI_Font(df_font_from_slot(DF_FontSlot_Icons))
UI_FontSize(df_font_size_from_slot(ws, DF_FontSlot_Icons))
ui_label(df_g_icon_kind_text_table[DF_IconKind_WarningBig]);
ui_label(error_string);
}
} }
} }
} }
@@ -6760,7 +6846,7 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags
} }
// rjf: arrow // rjf: arrow
if(did_ptr_value && direct_type_has_content && (flags & DF_EvalVizStringFlag_ReadOnlyDisplayRules)) if(did_ptr_value && (direct_type_has_content || symbol_name.size != 0) && (flags & DF_EvalVizStringFlag_ReadOnlyDisplayRules))
{ {
String8 arrow = str8_lit(" -> "); String8 arrow = str8_lit(" -> ");
str8_list_push(arena, &list, arrow); str8_list_push(arena, &list, arrow);
@@ -6780,7 +6866,7 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags
} }
// rjf: special-case: symbols // rjf: special-case: symbols
else if(direct_type_has_content && (flags & DF_EvalVizStringFlag_ReadOnlyDisplayRules) && symbol_name.size != 0) else if((flags & DF_EvalVizStringFlag_ReadOnlyDisplayRules) && symbol_name.size != 0)
{ {
str8_list_push(arena, &list, symbol_name); str8_list_push(arena, &list, symbol_name);
space_taken += f_dim_from_tag_size_string(font, font_size, symbol_name).x; space_taken += f_dim_from_tag_size_string(font, font_size, symbol_name).x;
@@ -7140,6 +7226,7 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DBGI_Scope *scop
// rjf: apply view rules to eval // rjf: apply view rules to eval
{ {
member_eval = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, member_eval);
member_eval = df_eval_from_eval_cfg_table(arena, scope, ctrl_ctx, parse_ctx, member_eval, &view_rule_table); member_eval = df_eval_from_eval_cfg_table(arena, scope, ctrl_ctx, parse_ctx, member_eval, &view_rule_table);
} }
@@ -7152,6 +7239,7 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DBGI_Scope *scop
row->expr = push_str8_copy(arena, member->name); row->expr = push_str8_copy(arena, member->name);
row->display_value = str8_list_join(arena, &display_strings, 0); row->display_value = str8_list_join(arena, &display_strings, 0);
row->edit_value = str8_list_join(arena, &edit_strings, 0); row->edit_value = str8_list_join(arena, &edit_strings, 0);
row->inherited_type_key_chain = tg_key_list_copy(arena, &member->inheritance_key_chain);
row->value_ui_rule_node = value_ui_rule_node; row->value_ui_rule_node = value_ui_rule_node;
row->value_ui_rule_spec = value_ui_rule_spec; row->value_ui_rule_spec = value_ui_rule_spec;
row->expand_ui_rule_node = expand_ui_rule_node; row->expand_ui_rule_node = expand_ui_rule_node;
@@ -7219,6 +7307,7 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DBGI_Scope *scop
// rjf: apply view rules to eval // rjf: apply view rules to eval
{ {
elem_eval = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, elem_eval);
elem_eval = df_eval_from_eval_cfg_table(arena, scope, ctrl_ctx, parse_ctx, elem_eval, &view_rule_table); elem_eval = df_eval_from_eval_cfg_table(arena, scope, ctrl_ctx, parse_ctx, elem_eval, &view_rule_table);
} }
@@ -7298,6 +7387,7 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DBGI_Scope *scop
df_cfg_table_push_unparsed_string(scratch.arena, &view_rule_table, view_rule_string, DF_CfgSrc_User); df_cfg_table_push_unparsed_string(scratch.arena, &view_rule_table, view_rule_string, DF_CfgSrc_User);
// rjf: apply view rules to eval // rjf: apply view rules to eval
link_eval = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, link_eval);
link_eval = df_eval_from_eval_cfg_table(arena, scope, ctrl_ctx, parse_ctx, link_eval, &view_rule_table); link_eval = df_eval_from_eval_cfg_table(arena, scope, ctrl_ctx, parse_ctx, link_eval, &view_rule_table);
TG_Kind link_type_kind = tg_kind_from_key(link_eval.type_key); TG_Kind link_type_kind = tg_kind_from_key(link_eval.type_key);
@@ -7553,7 +7643,7 @@ df_text_search_thread_entry_point(void *p)
{ {
TCTX tctx_; TCTX tctx_;
tctx_init_and_equip(&tctx_); tctx_init_and_equip(&tctx_);
#if !DE2CTRL #if 0
// TODO(rjf): [ ] @de2ctrl text searcher -- wound up in DE_Hash // TODO(rjf): [ ] @de2ctrl text searcher -- wound up in DE_Hash
//- rjf: types //- rjf: types
@@ -8591,14 +8681,14 @@ df_entity_tooltips(DF_Entity *entity)
stop_condition = str8_lit("true"); stop_condition = str8_lit("true");
} }
UI_PrefWidth(ui_em(12.f, 1.f)) UI_TextColor(df_rgba_from_theme_color(DF_ThemeColor_WeakText)) ui_labelf("Stop Condition: "); UI_PrefWidth(ui_em(12.f, 1.f)) UI_TextColor(df_rgba_from_theme_color(DF_ThemeColor_WeakText)) ui_labelf("Stop Condition: ");
UI_PrefWidth(ui_text_dim(10, 1)) UI_Font(df_font_from_slot(DF_FontSlot_Code)) df_code_label(1.f, 1, stop_condition); UI_PrefWidth(ui_text_dim(10, 1)) UI_Font(df_font_from_slot(DF_FontSlot_Code)) df_code_label(1.f, 1, df_rgba_from_theme_color(DF_ThemeColor_CodeDefault), stop_condition);
} }
UI_PrefWidth(ui_children_sum(1)) UI_Row UI_PrefWidth(ui_children_sum(1)) UI_Row
{ {
U64 hit_count = entity->u64; U64 hit_count = entity->u64;
String8 hit_count_text = str8_from_u64(scratch.arena, hit_count, 10, 0, 0); String8 hit_count_text = str8_from_u64(scratch.arena, hit_count, 10, 0, 0);
UI_PrefWidth(ui_em(12.f, 1.f)) UI_TextColor(df_rgba_from_theme_color(DF_ThemeColor_WeakText)) ui_labelf("Hit Count: "); UI_PrefWidth(ui_em(12.f, 1.f)) UI_TextColor(df_rgba_from_theme_color(DF_ThemeColor_WeakText)) ui_labelf("Hit Count: ");
UI_PrefWidth(ui_text_dim(10, 1)) UI_Font(df_font_from_slot(DF_FontSlot_Code)) df_code_label(1.f, 1, hit_count_text); UI_PrefWidth(ui_text_dim(10, 1)) UI_Font(df_font_from_slot(DF_FontSlot_Code)) df_code_label(1.f, 1, df_rgba_from_theme_color(DF_ThemeColor_CodeDefault), hit_count_text);
} }
}break; }break;
case DF_EntityKind_WatchPin: UI_Font(df_font_from_slot(DF_FontSlot_Code)) case DF_EntityKind_WatchPin: UI_Font(df_font_from_slot(DF_FontSlot_Code))
@@ -8609,7 +8699,7 @@ df_entity_tooltips(DF_Entity *entity)
ui_set_next_text_color(color); ui_set_next_text_color(color);
} }
String8 display_string = df_display_string_from_entity(scratch.arena, entity); String8 display_string = df_display_string_from_entity(scratch.arena, entity);
UI_PrefWidth(ui_text_dim(10, 1)) df_code_label(1.f, 1, display_string); UI_PrefWidth(ui_text_dim(10, 1)) df_code_label(1.f, 1, df_rgba_from_theme_color(DF_ThemeColor_CodeDefault), display_string);
}break; }break;
} }
scratch_end(scratch); scratch_end(scratch);
@@ -9499,8 +9589,8 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_
ws->entity_ctx_menu_entity = df_handle_from_entity(pin); ws->entity_ctx_menu_entity = df_handle_from_entity(pin);
} }
} }
df_code_label(0.8f, 1, pin_expr); df_code_label(0.8f, 1, df_rgba_from_theme_color(DF_ThemeColor_CodeDefault), pin_expr);
df_code_label(0.6f, 1, eval_string); df_code_label(0.6f, 1, df_rgba_from_theme_color(DF_ThemeColor_CodeDefault), eval_string);
} }
UI_Signal pin_sig = ui_signal_from_box(pin_box); UI_Signal pin_sig = ui_signal_from_box(pin_box);
if(ui_key_match(pin_box_key, ui_hot_key())) if(ui_key_match(pin_box_key, ui_hot_key()))
@@ -10411,7 +10501,7 @@ df_help_label(String8 string)
} }
internal D_FancyStringList internal D_FancyStringList
df_fancy_string_list_from_code_string(Arena *arena, F32 alpha, B32 indirection_size_change, String8 string) df_fancy_string_list_from_code_string(Arena *arena, F32 alpha, B32 indirection_size_change, Vec4F32 base_color, String8 string)
{ {
Temp scratch = scratch_begin(&arena, 1); Temp scratch = scratch_begin(&arena, 1);
D_FancyStringList fancy_strings = {0}; D_FancyStringList fancy_strings = {0};
@@ -10440,6 +10530,17 @@ df_fancy_string_list_from_code_string(Arena *arena, F32 alpha, B32 indirection_s
}; };
d_fancy_string_list_push(arena, &fancy_strings, &fancy_string); d_fancy_string_list_push(arena, &fancy_strings, &fancy_string);
}break; }break;
case TXTI_TokenKind_Identifier:
{
D_FancyString fancy_string =
{
ui_top_font(),
token_string,
base_color,
ui_top_font_size() * (1.f - !!indirection_size_change*(indirection_counter/10.f)),
};
d_fancy_string_list_push(arena, &fancy_strings, &fancy_string);
}break;
case TXTI_TokenKind_Numeric: case TXTI_TokenKind_Numeric:
{ {
Vec4F32 token_color_rgba_alt = token_color_rgba; Vec4F32 token_color_rgba_alt = token_color_rgba;
@@ -10551,10 +10652,10 @@ df_fancy_string_list_from_code_string(Arena *arena, F32 alpha, B32 indirection_s
} }
internal void internal void
df_code_label(F32 alpha, B32 indirection_size_change, String8 string) df_code_label(F32 alpha, B32 indirection_size_change, Vec4F32 base_color, String8 string)
{ {
Temp scratch = scratch_begin(0, 0); Temp scratch = scratch_begin(0, 0);
D_FancyStringList fancy_strings = df_fancy_string_list_from_code_string(scratch.arena, alpha, indirection_size_change, string); D_FancyStringList fancy_strings = df_fancy_string_list_from_code_string(scratch.arena, alpha, indirection_size_change, base_color, string);
UI_Box *box = ui_build_box_from_key(UI_BoxFlag_DrawText, ui_key_zero()); UI_Box *box = ui_build_box_from_key(UI_BoxFlag_DrawText, ui_key_zero());
ui_box_equip_display_fancy_strings(box, &fancy_strings); ui_box_equip_display_fancy_strings(box, &fancy_strings);
scratch_end(scratch); scratch_end(scratch);
@@ -10760,11 +10861,11 @@ df_line_edit(DF_LineEditFlags flags, S32 depth, TxtPt *cursor, TxtPt *mark, U8 *
if(!(flags & DF_LineEditFlag_PreferDisplayString) && pre_edit_value.size != 0) if(!(flags & DF_LineEditFlag_PreferDisplayString) && pre_edit_value.size != 0)
{ {
display_string = pre_edit_value; display_string = pre_edit_value;
df_code_label(1.f, 1, display_string); df_code_label(1.f, 1, ui_top_text_color(), display_string);
} }
else if(flags & DF_LineEditFlag_DisplayStringIsCode) else if(flags & DF_LineEditFlag_DisplayStringIsCode)
{ {
df_code_label(1.f, 1, display_string); df_code_label(1.f, 1, ui_top_text_color(), display_string);
} }
else else
{ {
@@ -10793,7 +10894,7 @@ df_line_edit(DF_LineEditFlags flags, S32 depth, TxtPt *cursor, TxtPt *mark, U8 *
F32 total_editstr_width = total_text_width - !!(flags & (DF_LineEditFlag_Expander|DF_LineEditFlag_ExpanderSpace|DF_LineEditFlag_ExpanderPlaceholder)) * expander_size_px; F32 total_editstr_width = total_text_width - !!(flags & (DF_LineEditFlag_Expander|DF_LineEditFlag_ExpanderSpace|DF_LineEditFlag_ExpanderPlaceholder)) * expander_size_px;
ui_set_next_pref_width(ui_px(total_editstr_width+ui_top_font_size()*2, 0.f)); ui_set_next_pref_width(ui_px(total_editstr_width+ui_top_font_size()*2, 0.f));
UI_Box *editstr_box = ui_build_box_from_stringf(UI_BoxFlag_DrawText|UI_BoxFlag_DisableTextTrunc, "###editstr"); UI_Box *editstr_box = ui_build_box_from_stringf(UI_BoxFlag_DrawText|UI_BoxFlag_DisableTextTrunc, "###editstr");
D_FancyStringList code_fancy_strings = df_fancy_string_list_from_code_string(scratch.arena, 1.f, 0, edit_string); D_FancyStringList code_fancy_strings = df_fancy_string_list_from_code_string(scratch.arena, 1.f, 0, ui_top_text_color(), edit_string);
ui_box_equip_display_fancy_strings(editstr_box, &code_fancy_strings); ui_box_equip_display_fancy_strings(editstr_box, &code_fancy_strings);
UI_LineEditDrawData *draw_data = push_array(ui_build_arena(), UI_LineEditDrawData, 1); UI_LineEditDrawData *draw_data = push_array(ui_build_arena(), UI_LineEditDrawData, 1);
draw_data->edited_string = push_str8_copy(ui_build_arena(), edit_string); draw_data->edited_string = push_str8_copy(ui_build_arena(), edit_string);
@@ -10897,6 +10998,7 @@ df_gfx_init(OS_WindowRepaintFunctionType *window_repaint_entry_point, DF_StateDe
df_gfx_state->num_frames_requested = 2; df_gfx_state->num_frames_requested = 2;
df_gfx_state->hist = hist; df_gfx_state->hist = hist;
df_gfx_state->key_map_arena = arena_alloc(); df_gfx_state->key_map_arena = arena_alloc();
df_gfx_state->confirm_arena = arena_alloc();
df_gfx_state->view_spec_table_size = 256; df_gfx_state->view_spec_table_size = 256;
df_gfx_state->view_spec_table = push_array(arena, DF_ViewSpec *, df_gfx_state->view_spec_table_size); df_gfx_state->view_spec_table = push_array(arena, DF_ViewSpec *, df_gfx_state->view_spec_table_size);
df_gfx_state->view_rule_spec_table_size = 1024; df_gfx_state->view_rule_spec_table_size = 1024;
@@ -10941,6 +11043,17 @@ df_gfx_begin_frame(Arena *arena, DF_CmdList *cmds)
arena_clear(df_gfx_state->frame_arena); arena_clear(df_gfx_state->frame_arena);
df_gfx_state->hover_line_set_this_frame = 0; df_gfx_state->hover_line_set_this_frame = 0;
//- rjf: animate confirmation
{
F32 rate = 1 - pow_f32(2, (-10.f * df_dt()));
B32 confirm_open = df_gfx_state->confirm_active;
df_gfx_state->confirm_t += rate * ((F32)!!confirm_open-df_gfx_state->confirm_t);
if(abs_f32(df_gfx_state->confirm_t - (F32)!!confirm_open) > 0.005f)
{
df_gfx_request_frame();
}
}
//- rjf: capture is active? -> keep rendering //- rjf: capture is active? -> keep rendering
if(ProfIsCapturing()) if(ProfIsCapturing())
{ {
@@ -10990,6 +11103,22 @@ df_gfx_begin_frame(Arena *arena, DF_CmdList *cmds)
} }
}break; }break;
//- rjf: errors
case DF_CoreCmdKind_Error:
{
DF_Window *window = df_window_from_handle(params.window);
if(window == 0)
{
for(DF_Window *w = df_gfx_state->first_window; w != 0; w = w->next)
{
DF_CmdParams p = df_cmd_params_from_window(w);
p.string = push_str8_copy(arena, params.string);
df_cmd_params_mark_slot(&p, DF_CmdParamSlot_String);
df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Error));
}
}
}break;
//- rjf: windows //- rjf: windows
case DF_CoreCmdKind_OpenWindow: case DF_CoreCmdKind_OpenWindow:
{ {
@@ -11001,10 +11130,32 @@ df_gfx_begin_frame(Arena *arena, DF_CmdList *cmds)
DF_Window *ws = df_window_from_handle(params.window); DF_Window *ws = df_window_from_handle(params.window);
if(ws != 0) if(ws != 0)
{ {
DF_EntityList running_processes = df_query_cached_entity_list_with_kind(DF_EntityKind_Process);
// NOTE(rjf): if this is the last window, and targets are running, but
// this command is not force-confirmed, then we should query the user
// to ensure they want to close the debugger before exiting
UI_Key key = ui_key_from_string(ui_key_zero(), str8_lit("lossy_exit_confirmation"));
if(!ui_key_match(key, df_gfx_state->confirm_key) && running_processes.count != 0 && ws == df_gfx_state->first_window && ws == df_gfx_state->last_window && !params.force_confirm)
{
df_gfx_state->confirm_key = key;
df_gfx_state->confirm_active = 1;
arena_clear(df_gfx_state->confirm_arena);
MemoryZeroStruct(&df_gfx_state->confirm_cmds);
df_gfx_state->confirm_title = push_str8f(df_gfx_state->confirm_arena, "Are you sure you want to exit?");
df_gfx_state->confirm_msg = push_str8f(df_gfx_state->confirm_arena, "The debugger is still attached to %slive process%s.",
running_processes.count == 1 ? "a " : "",
running_processes.count == 1 ? "" : "es");
DF_CmdParams p = df_cmd_params_from_window(ws);
p.force_confirm = 1;
df_cmd_params_mark_slot(&p, DF_CmdParamSlot_ForceConfirm);
df_cmd_list_push(df_gfx_state->confirm_arena, &df_gfx_state->confirm_cmds, &p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_CloseWindow));
}
// NOTE(rjf): if this is the last window, and it is being closed, then // NOTE(rjf): if this is the last window, and it is being closed, then
// we need to auto-save, and provide one last chance to process saving // we need to auto-save, and provide one last chance to process saving
// commands. after doing so, we can retry. // commands. after doing so, we can retry.
if(ws == df_gfx_state->first_window && ws == df_gfx_state->last_window && df_gfx_state->last_window_queued_save == 0) else if(ws == df_gfx_state->first_window && ws == df_gfx_state->last_window && df_gfx_state->last_window_queued_save == 0)
{ {
df_gfx_state->last_window_queued_save = 1; df_gfx_state->last_window_queued_save = 1;
{ {
@@ -11046,6 +11197,22 @@ df_gfx_begin_frame(Arena *arena, DF_CmdList *cmds)
} }
}break; }break;
//- rjf: confirmations
case DF_CoreCmdKind_ConfirmAccept:
{
df_gfx_state->confirm_active = 0;
df_gfx_state->confirm_key = ui_key_zero();
for(DF_CmdNode *n = df_gfx_state->confirm_cmds.first; n != 0; n = n->next)
{
df_push_cmd__root(&n->cmd.params, n->cmd.spec);
}
}break;
case DF_CoreCmdKind_ConfirmCancel:
{
df_gfx_state->confirm_active = 0;
df_gfx_state->confirm_key = ui_key_zero();
}break;
//- rjf: commands with implications for graphical systems, but generated //- rjf: commands with implications for graphical systems, but generated
// without context needed - pick selected window & dispatch // without context needed - pick selected window & dispatch
case DF_CoreCmdKind_SelectThread: case DF_CoreCmdKind_SelectThread:
@@ -11433,7 +11600,10 @@ df_gfx_begin_frame(Arena *arena, DF_CmdList *cmds)
} }
//- rjf: apply keybindings //- rjf: apply keybindings
df_clear_bindings(); if(src == DF_CfgSrc_User)
{
df_clear_bindings();
}
DF_CfgVal *keybindings = df_cfg_val_from_string(table, str8_lit("keybindings")); DF_CfgVal *keybindings = df_cfg_val_from_string(table, str8_lit("keybindings"));
for(DF_CfgNode *keybinding_set = keybindings->first; for(DF_CfgNode *keybinding_set = keybindings->first;
keybinding_set != &df_g_nil_cfg_node; keybinding_set != &df_g_nil_cfg_node;
@@ -11528,8 +11698,27 @@ df_gfx_begin_frame(Arena *arena, DF_CmdList *cmds)
} }
} }
//- rjf: if theme colors are all zeroes, then set to default - config appears busted
{
B32 all_colors_are_zero = 1;
Vec4F32 zero_color = {0};
for(DF_ThemeColor c = (DF_ThemeColor)(DF_ThemeColor_Null+1); c < DF_ThemeColor_COUNT; c = (DF_ThemeColor)(c+1))
{
if(!MemoryMatchStruct(&df_gfx_state->cfg_theme_target.colors[c], &zero_color))
{
all_colors_are_zero = 0;
break;
}
}
if(all_colors_are_zero)
{
MemoryCopy(df_gfx_state->cfg_theme_target.colors, df_g_theme_preset_colors__default_dark, sizeof(df_g_theme_preset_colors__default_dark));
MemoryCopy(df_gfx_state->cfg_theme.colors, df_g_theme_preset_colors__default_dark, sizeof(df_g_theme_preset_colors__default_dark));
}
}
//- rjf: if config opened 0 windows, we need to do some sensible default //- rjf: if config opened 0 windows, we need to do some sensible default
if(df_gfx_state->first_window == 0) if(src == DF_CfgSrc_User && windows->first == &df_g_nil_cfg_node)
{ {
OS_Handle preferred_monitor = os_primary_monitor(); OS_Handle preferred_monitor = os_primary_monitor();
Vec2F32 monitor_dim = os_dim_from_monitor(preferred_monitor); Vec2F32 monitor_dim = os_dim_from_monitor(preferred_monitor);
@@ -11540,7 +11729,7 @@ df_gfx_begin_frame(Arena *arena, DF_CmdList *cmds)
} }
//- rjf: if config bound 0 keys, we need to do some sensible default //- rjf: if config bound 0 keys, we need to do some sensible default
if(df_gfx_state->key_map_total_count == 0) if(src == DF_CfgSrc_User && df_gfx_state->key_map_total_count == 0)
{ {
for(U64 idx = 0; idx < ArrayCount(df_g_default_binding_table); idx += 1) for(U64 idx = 0; idx < ArrayCount(df_g_default_binding_table); idx += 1)
{ {
+12 -3
View File
@@ -345,7 +345,7 @@ enum
#define DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_NAME(name) df_gfx_view_rule_row_ui__##name #define DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_NAME(name) df_gfx_view_rule_row_ui__##name
#define DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_DEF(name) DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_SIG(DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_NAME(name)) #define DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_DEF(name) DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_SIG(DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_NAME(name))
#define DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_SIG(name) void name(DF_Window *ws, DF_ExpandKey key, DF_Eval eval, DBGI_Scope *dbgi_scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, struct DF_CfgNode *cfg, Vec2F32 dim) #define DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_SIG(name) void name(struct DF_Window *ws, DF_ExpandKey key, DF_Eval eval, DBGI_Scope *dbgi_scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, struct DF_CfgNode *cfg, Vec2F32 dim)
#define DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_NAME(name) df_gfx_view_rule_block_ui__##name #define DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_NAME(name) df_gfx_view_rule_block_ui__##name
#define DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(name) DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_SIG(DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_NAME(name)) #define DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(name) DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_SIG(DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_NAME(name))
@@ -681,6 +681,15 @@ struct DF_GfxState
DF_CmdSpec *bind_change_cmd_spec; DF_CmdSpec *bind_change_cmd_spec;
DF_Binding bind_change_binding; DF_Binding bind_change_binding;
// rjf: confirmation popup state
UI_Key confirm_key;
B32 confirm_active;
F32 confirm_t;
Arena *confirm_arena;
DF_CmdList confirm_cmds;
String8 confirm_title;
String8 confirm_msg;
// rjf: string search state // rjf: string search state
Arena *string_search_arena; Arena *string_search_arena;
String8 string_search_string; String8 string_search_string;
@@ -1022,8 +1031,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 UI_Signal df_error_label(String8 string);
internal B32 df_help_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 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, String8 string); internal void df_code_label(F32 alpha, B32 indirection_size_change, Vec4F32 base_color, String8 string);
//////////////////////////////// ////////////////////////////////
//~ rjf: UI Widgets: Line Edit //~ rjf: UI Widgets: Line Edit
+1 -1
View File
@@ -32,7 +32,7 @@ struct DF_TxtTopologyInfo
//////////////////////////////// ////////////////////////////////
//~ rjf: Helpers //~ rjf: Helpers
internal Vec4F32 df_view_rule_hooks__rgba_from_eval(DF_Eval eval, TG_Graph *graph, RADDBG_Parsed *raddbg); internal Vec4F32 df_view_rule_hooks__rgba_from_eval(DF_Eval eval, TG_Graph *graph, RADDBG_Parsed *raddbg, DF_Entity *process);
internal void df_view_rule_hooks__eval_commit_rgba(DF_Eval eval, TG_Graph *graph, RADDBG_Parsed *raddbg, DF_CtrlCtx *ctrl_ctx, Vec4F32 rgba); internal void df_view_rule_hooks__eval_commit_rgba(DF_Eval eval, TG_Graph *graph, RADDBG_Parsed *raddbg, DF_CtrlCtx *ctrl_ctx, Vec4F32 rgba);
internal DF_BitmapTopologyInfo df_view_rule_hooks__bitmap_topology_info_from_cfg(DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_CfgNode *cfg); internal DF_BitmapTopologyInfo df_view_rule_hooks__bitmap_topology_info_from_cfg(DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_CfgNode *cfg);
internal DF_GeoTopologyInfo df_view_rule_hooks__geo_topology_info_from_cfg(DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_CfgNode *cfg); internal DF_GeoTopologyInfo df_view_rule_hooks__geo_topology_info_from_cfg(DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_CfgNode *cfg);
+115 -39
View File
@@ -1051,22 +1051,49 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW
// rjf: build // rjf: build
UI_Signal sig = {0}; UI_Signal sig = {0};
B32 next_expanded = row_expanded; B32 next_expanded = row_expanded;
UI_TableCell UI_Font(code_font) UI_TableCell UI_FocusHot(cell_selected) UI_FocusActive(cell_selected && ewv->input_editing)
UI_TextColor(row->depth > 0 ? df_rgba_from_theme_color(DF_ThemeColor_WeakText) : ui_top_text_color())
UI_FocusHot(cell_selected) UI_FocusActive(cell_selected && ewv->input_editing)
{ {
B32 expr_editing_active = ui_is_focus_active(); B32 expr_editing_active = ui_is_focus_active();
sig = df_line_editf((DF_LineEditFlag_CodeContents| B32 is_inherited = (row->inherited_type_key_chain.count != 0);
DF_LineEditFlag_NoBackground| UI_Font(code_font) UI_TextColor(row->depth > 0 ? df_rgba_from_theme_color(DF_ThemeColor_WeakText) : ui_top_text_color())
DF_LineEditFlag_DisableEdit*(!can_edit_expr)| {
DF_LineEditFlag_Expander*!!(row->flags & DF_EvalVizRowFlag_CanExpand)| if(is_inherited)
DF_LineEditFlag_ExpanderPlaceholder*(row->depth==0)| {
DF_LineEditFlag_ExpanderSpace*(row->depth!=0)), Vec4F32 inherited_bg_color = df_rgba_from_theme_color(DF_ThemeColor_Highlight1);
row->depth, inherited_bg_color.w *= 0.2f;
&ewv->input_cursor, &ewv->input_mark, ewv->input_buffer, sizeof(ewv->input_buffer), &ewv->input_size, &next_expanded, ui_set_next_background_color(inherited_bg_color);
row->expr, }
"###row_%I64x", row_hash); sig = df_line_editf((DF_LineEditFlag_CodeContents|
DF_LineEditFlag_NoBackground*(!is_inherited)|
DF_LineEditFlag_DisableEdit*(!can_edit_expr)|
DF_LineEditFlag_Expander*!!(row->flags & DF_EvalVizRowFlag_CanExpand)|
DF_LineEditFlag_ExpanderPlaceholder*(row->depth==0)|
DF_LineEditFlag_ExpanderSpace*(row->depth!=0)),
row->depth,
&ewv->input_cursor, &ewv->input_mark, ewv->input_buffer, sizeof(ewv->input_buffer), &ewv->input_size, &next_expanded,
row->expr,
"###row_%I64x", row_hash);
}
edit_commit = edit_commit || sig.commit; edit_commit = edit_commit || sig.commit;
if(sig.hovering && is_inherited) UI_Tooltip
{
String8List inheritance_chain_type_names = {0};
for(TG_KeyNode *n = row->inherited_type_key_chain.first; n != 0; n = n->next)
{
String8 inherited_type_name = tg_string_from_key(scratch.arena, parse_ctx.type_graph, parse_ctx.rdbg, n->v);
inherited_type_name = str8_skip_chop_whitespace(inherited_type_name);
str8_list_push(scratch.arena, &inheritance_chain_type_names, inherited_type_name);
}
StringJoin join = {0};
join.sep = str8_lit("::");
String8 inheritance_type = str8_list_join(scratch.arena, &inheritance_chain_type_names, &join);
ui_set_next_pref_width(ui_children_sum(1));
UI_Row
{
ui_labelf("Inherited from ");
UI_Font(df_font_from_slot(DF_FontSlot_Code)) df_code_label(1.f, 1.f, df_rgba_from_theme_color(DF_ThemeColor_CodeType), inheritance_type);
}
}
if(sig.hovering && DEV_eval_watch_key_tooltips) UI_Tooltip UI_Font(df_font_from_slot(DF_FontSlot_Code)) if(sig.hovering && DEV_eval_watch_key_tooltips) UI_Tooltip UI_Font(df_font_from_slot(DF_FontSlot_Code))
{ {
ui_labelf("Parent Key: %I64x, %I64x, %I64x", row->parent_key.uniquifier, row->parent_key.parent_hash, row->parent_key.child_num); ui_labelf("Parent Key: %I64x, %I64x, %I64x", row->parent_key.uniquifier, row->parent_key.parent_hash, row->parent_key.child_num);
@@ -1217,7 +1244,7 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW
UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clip|UI_BoxFlag_Clickable, "###val_%I64x", row_hash); UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clip|UI_BoxFlag_Clickable, "###val_%I64x", row_hash);
UI_Parent(box) UI_Parent(box)
{ {
df_code_label(1.f, 1, row->display_value); df_code_label(1.f, 1, df_rgba_from_theme_color(DF_ThemeColor_CodeDefault), row->display_value);
} }
sig = ui_signal_from_box(box); sig = ui_signal_from_box(box);
} }
@@ -1261,7 +1288,7 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW
UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clip|UI_BoxFlag_Clickable, "###type_%I64x", row_hash); UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clip|UI_BoxFlag_Clickable, "###type_%I64x", row_hash);
if(!tg_key_match(key, tg_key_zero())) UI_Parent(box) if(!tg_key_match(key, tg_key_zero())) UI_Parent(box)
{ {
df_code_label(1.f, 1, string); df_code_label(1.f, 1, df_rgba_from_theme_color(DF_ThemeColor_CodeType), string);
} }
UI_Signal sig = ui_signal_from_box(box); UI_Signal sig = ui_signal_from_box(box);
if(sig.pressed) if(sig.pressed)
@@ -2423,7 +2450,8 @@ DF_VIEW_UI_FUNCTION_DEF(FileSystem)
UI_TextColor(df_rgba_from_theme_color(DF_ThemeColor_WeakText)) UI_TextColor(df_rgba_from_theme_color(DF_ThemeColor_WeakText))
{ {
DateTime time = date_time_from_dense_time(file->props.modified); DateTime time = date_time_from_dense_time(file->props.modified);
String8 string = push_date_time_string(scratch.arena, &time); DateTime time_local = os_local_time_from_universal_time(&time);
String8 string = push_date_time_string(scratch.arena, &time_local);
ui_label(string); ui_label(string);
} }
@@ -4989,7 +5017,7 @@ DF_VIEW_UI_FUNCTION_DEF(Code)
//- rjf: search query -> matches //- rjf: search query -> matches
// //
DF_TextSearchMatchArray search_query_matches = {0}; DF_TextSearchMatchArray search_query_matches = {0};
#if !DE2CTRL #if 0
{ {
search_query_matches = df_text_search_match_array_from_entity_needle(scratch.arena, entity, search_query, entity_line_string_flags, tv->cursor); search_query_matches = df_text_search_match_array_from_entity_needle(scratch.arena, entity, search_query, entity_line_string_flags, tv->cursor);
df_text_search_match_array_sort_in_place(&search_query_matches); df_text_search_match_array_sort_in_place(&search_query_matches);
@@ -5153,7 +5181,7 @@ DF_VIEW_UI_FUNCTION_DEF(Code)
if(txti_buffer_is_ready) UI_Parent(container_box) if(txti_buffer_is_ready) UI_Parent(container_box)
{ {
//- rjf: build fractional space //- rjf: build fractional space
container_box->view_off.x = view->scroll_pos.x.idx + view->scroll_pos.x.off; container_box->view_off.x = container_box->view_off_target.x = view->scroll_pos.x.idx + view->scroll_pos.x.off;
container_box->view_off.y = container_box->view_off_target.y = code_line_height*mod_f32(view->scroll_pos.y.off, 1.f) + code_line_height*(view->scroll_pos.y.off < 0) - code_line_height*(view->scroll_pos.y.off == -1.f && view->scroll_pos.y.idx == 1); container_box->view_off.y = container_box->view_off_target.y = code_line_height*mod_f32(view->scroll_pos.y.off, 1.f) + code_line_height*(view->scroll_pos.y.off < 0) - code_line_height*(view->scroll_pos.y.off == -1.f && view->scroll_pos.y.idx == 1);
//- rjf: build code slice //- rjf: build code slice
@@ -5359,7 +5387,7 @@ DF_VIEW_UI_FUNCTION_DEF(Code)
if(search_query.size != 0 && next_match.line != 0) if(search_query.size != 0 && next_match.line != 0)
{ {
// TODO(rjf): [ ] @de2ctrl // TODO(rjf): [ ] @de2ctrl
#if !DE2CTRL #if 0
DF_TextSlice match_line_slice = df_text_slice_from_entity(scratch.arena, entity, r1s64(next_match.line, next_match.line), entity_line_string_flags); DF_TextSlice match_line_slice = df_text_slice_from_entity(scratch.arena, entity, r1s64(next_match.line, next_match.line), entity_line_string_flags);
String8 match_line = match_line_slice.visible_range_text; String8 match_line = match_line_slice.visible_range_text;
F32 match_advance = f_dim_from_tag_size_string(code_font, code_font_size, str8_prefix(match_line, next_match.column-1)).x; F32 match_advance = f_dim_from_tag_size_string(code_font, code_font_size, str8_prefix(match_line, next_match.column-1)).x;
@@ -5497,6 +5525,29 @@ DF_VIEW_UI_FUNCTION_DEF(Code)
ui_scroll_pt_clamp_idx(&view->scroll_pos.y, scroll_idx_rng[Axis2_Y]); ui_scroll_pt_clamp_idx(&view->scroll_pos.y, scroll_idx_rng[Axis2_Y]);
} }
//////////////////////////////
//- rjf: determine up-to-dateness of source file
//
B32 file_is_out_of_date = 0;
String8 out_of_date_binary_name = {0};
for(DF_EntityNode *n = code_slice_params.relevant_binaries.first; n != 0; n = n->next)
{
DF_Entity *binary = n->entity;
if(!df_entity_is_nil(binary))
{
String8 full_path = df_full_path_from_entity(scratch.arena, entity);
TXTI_Handle handle = txti_handle_from_path(full_path);
TXTI_BufferInfo info = txti_buffer_info_from_handle(scratch.arena, handle);
DBGI_Parse *parse = df_dbgi_parse_from_binary_file(scope, binary);
if(parse->exe_props.modified < info.timestamp)
{
file_is_out_of_date = 1;
out_of_date_binary_name = binary->name;
break;
}
}
}
////////////////////////////// //////////////////////////////
//- rjf: build bottom info bar //- rjf: build bottom info bar
// //
@@ -5506,26 +5557,47 @@ DF_VIEW_UI_FUNCTION_DEF(Code)
ui_set_next_fixed_y(code_area_dim.y + scroll_bar_dim); ui_set_next_fixed_y(code_area_dim.y + scroll_bar_dim);
ui_set_next_pref_width(ui_px(bottom_bar_dim.x, 1)); ui_set_next_pref_width(ui_px(bottom_bar_dim.x, 1));
ui_set_next_pref_height(ui_px(bottom_bar_dim.y, 1)); ui_set_next_pref_height(ui_px(bottom_bar_dim.y, 1));
ui_set_next_background_color(df_rgba_from_theme_color(DF_ThemeColor_AltBackground)); ui_set_next_background_color(df_rgba_from_theme_color(file_is_out_of_date ? DF_ThemeColor_FailureBackground : DF_ThemeColor_AltBackground));
ui_set_next_flags(UI_BoxFlag_DrawBackground); ui_set_next_flags(UI_BoxFlag_DrawBackground);
UI_Row UI_Row
UI_TextAlignment(UI_TextAlign_Center) UI_TextAlignment(UI_TextAlign_Center)
UI_PrefWidth(ui_text_dim(10, 1)) UI_PrefWidth(ui_text_dim(10, 1))
UI_TextColor(df_rgba_from_theme_color(DF_ThemeColor_WeakText)) UI_TextColor(df_rgba_from_theme_color(DF_ThemeColor_WeakText))
UI_Font(code_font)
{ {
String8 full_path = df_full_path_from_entity(scratch.arena, entity); String8 full_path = df_full_path_from_entity(scratch.arena, entity);
TXTI_Handle handle = txti_handle_from_path(full_path); TXTI_Handle handle = txti_handle_from_path(full_path);
TXTI_BufferInfo info = txti_buffer_info_from_handle(scratch.arena, handle); TXTI_BufferInfo info = txti_buffer_info_from_handle(scratch.arena, handle);
ui_label(full_path); if(file_is_out_of_date)
ui_spacer(ui_em(1.5f, 1)); {
ui_labelf("Row: %I64d, Col: %I64d", tv->cursor.line, tv->cursor.column); UI_Box *box = &ui_g_nil_box;
ui_spacer(ui_pct(1, 0)); UI_TextColor(df_rgba_from_theme_color(DF_ThemeColor_FailureText))
ui_labelf("(read only)"); UI_Font(df_font_from_slot(DF_FontSlot_Icons))
ui_labelf("%s", {
info.line_end_kind == TXTI_LineEndKind_LF ? "lf" : box = ui_build_box_from_stringf(UI_BoxFlag_DrawText|UI_BoxFlag_Clickable, "%S###file_ood_warning", df_g_icon_kind_text_table[DF_IconKind_WarningBig]);
info.line_end_kind == TXTI_LineEndKind_CRLF ? "crlf" : }
"bin"); UI_Signal sig = ui_signal_from_box(box);
if(sig.hovering) UI_Tooltip
{
UI_PrefWidth(ui_children_sum(1)) UI_Row UI_PrefWidth(ui_text_dim(1, 1))
{
ui_labelf("This file has changed since ", out_of_date_binary_name);
UI_TextColor(df_rgba_from_theme_color(DF_ThemeColor_Highlight0)) ui_label(out_of_date_binary_name);
ui_labelf(" was built.");
}
}
}
UI_Font(code_font)
{
ui_label(full_path);
ui_spacer(ui_em(1.5f, 1));
ui_labelf("Row: %I64d, Col: %I64d", tv->cursor.line, tv->cursor.column);
ui_spacer(ui_pct(1, 0));
ui_labelf("(read only)");
ui_labelf("%s",
info.line_end_kind == TXTI_LineEndKind_LF ? "lf" :
info.line_end_kind == TXTI_LineEndKind_CRLF ? "crlf" :
"bin");
}
} }
} }
@@ -6033,7 +6105,7 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly)
if(has_disasm) UI_Parent(container_box) if(has_disasm) UI_Parent(container_box)
{ {
//- rjf: build fractional space //- rjf: build fractional space
container_box->view_off.x = view->scroll_pos.x.idx + view->scroll_pos.x.off; container_box->view_off.x = container_box->view_off_target.x = view->scroll_pos.x.idx + view->scroll_pos.x.off;
container_box->view_off.y = container_box->view_off_target.y = code_line_height*mod_f32(view->scroll_pos.y.off, 1.f) + code_line_height*(view->scroll_pos.y.off < 0) - code_line_height*(view->scroll_pos.y.off == -1.f && view->scroll_pos.y.idx == 1); container_box->view_off.y = container_box->view_off_target.y = code_line_height*mod_f32(view->scroll_pos.y.off, 1.f) + code_line_height*(view->scroll_pos.y.off < 0) - code_line_height*(view->scroll_pos.y.off == -1.f && view->scroll_pos.y.idx == 1);
//- rjf: build code slice //- rjf: build code slice
@@ -6803,7 +6875,7 @@ DF_VIEW_UI_FUNCTION_DEF(Output)
//- rjf: search query -> matches //- rjf: search query -> matches
// //
DF_TextSearchMatchArray search_query_matches = {0}; DF_TextSearchMatchArray search_query_matches = {0};
#if !DE2CTRL #if 0
{ {
search_query_matches = df_text_search_match_array_from_entity_needle(scratch.arena, entity, search_query, entity_line_string_flags, tv->cursor); search_query_matches = df_text_search_match_array_from_entity_needle(scratch.arena, entity, search_query, entity_line_string_flags, tv->cursor);
df_text_search_match_array_sort_in_place(&search_query_matches); df_text_search_match_array_sort_in_place(&search_query_matches);
@@ -6967,7 +7039,7 @@ DF_VIEW_UI_FUNCTION_DEF(Output)
if(txti_buffer_is_ready) UI_Parent(container_box) if(txti_buffer_is_ready) UI_Parent(container_box)
{ {
//- rjf: build fractional space //- rjf: build fractional space
container_box->view_off.x = view->scroll_pos.x.idx + view->scroll_pos.x.off; container_box->view_off.x = container_box->view_off_target.x = view->scroll_pos.x.idx + view->scroll_pos.x.off;
container_box->view_off.y = container_box->view_off_target.y = code_line_height*mod_f32(view->scroll_pos.y.off, 1.f) + code_line_height*(view->scroll_pos.y.off < 0) - code_line_height*(view->scroll_pos.y.off == -1.f && view->scroll_pos.y.idx == 1); container_box->view_off.y = container_box->view_off_target.y = code_line_height*mod_f32(view->scroll_pos.y.off, 1.f) + code_line_height*(view->scroll_pos.y.off < 0) - code_line_height*(view->scroll_pos.y.off == -1.f && view->scroll_pos.y.idx == 1);
//- rjf: build code slice //- rjf: build code slice
@@ -7030,7 +7102,7 @@ DF_VIEW_UI_FUNCTION_DEF(Output)
if(search_query.size != 0 && next_match.line != 0) if(search_query.size != 0 && next_match.line != 0)
{ {
// TODO(rjf): [ ] @de2ctrl // TODO(rjf): [ ] @de2ctrl
#if !DE2CTRL #if 0
DF_TextSlice match_line_slice = df_text_slice_from_entity(scratch.arena, entity, r1s64(next_match.line, next_match.line), entity_line_string_flags); DF_TextSlice match_line_slice = df_text_slice_from_entity(scratch.arena, entity, r1s64(next_match.line, next_match.line), entity_line_string_flags);
String8 match_line = match_line_slice.visible_range_text; String8 match_line = match_line_slice.visible_range_text;
F32 match_advance = f_dim_from_tag_size_string(code_font, code_font_size, str8_prefix(match_line, next_match.column-1)).x; F32 match_advance = f_dim_from_tag_size_string(code_font, code_font_size, str8_prefix(match_line, next_match.column-1)).x;
@@ -7316,6 +7388,10 @@ DF_VIEW_UI_FUNCTION_DEF(Memory)
viz_range_rows.max = clamp_1s64(scroll_idx_rng, viz_range_rows.max); viz_range_rows.max = clamp_1s64(scroll_idx_rng, viz_range_rows.max);
viz_range_bytes.min = viz_range_rows.min*mv->num_columns; viz_range_bytes.min = viz_range_rows.min*mv->num_columns;
viz_range_bytes.max = (viz_range_rows.max+1)*mv->num_columns+1; viz_range_bytes.max = (viz_range_rows.max+1)*mv->num_columns+1;
if(viz_range_bytes.min > viz_range_bytes.max)
{
Swap(U64, viz_range_bytes.min, viz_range_bytes.max);
}
} }
////////////////////////////// //////////////////////////////
@@ -7719,7 +7795,7 @@ DF_VIEW_UI_FUNCTION_DEF(Memory)
UI_BoxFlag_AllowOverflowX| UI_BoxFlag_AllowOverflowX|
UI_BoxFlag_AllowOverflowY, UI_BoxFlag_AllowOverflowY,
"scrollable_box"); "scrollable_box");
scrollable_box->view_off.x = view->scroll_pos.x.idx + view->scroll_pos.x.off; container_box->view_off.x = container_box->view_off_target.x = view->scroll_pos.x.idx + view->scroll_pos.x.off;
scrollable_box->view_off.y = scrollable_box->view_off_target.y = floor_f32(row_height_px*mod_f32(view->scroll_pos.y.off, 1.f) + row_height_px*(view->scroll_pos.y.off < 0)); scrollable_box->view_off.y = scrollable_box->view_off_target.y = floor_f32(row_height_px*mod_f32(view->scroll_pos.y.off, 1.f) + row_height_px*(view->scroll_pos.y.off < 0));
} }
@@ -7924,7 +8000,7 @@ DF_VIEW_UI_FUNCTION_DEF(Memory)
} }
if(a->type_string.size != 0) if(a->type_string.size != 0)
{ {
df_code_label(1.f, 1, a->type_string); df_code_label(1.f, 1, df_rgba_from_theme_color(DF_ThemeColor_CodeType), a->type_string);
} }
UI_TextColor(df_rgba_from_theme_color(DF_ThemeColor_WeakText)) ui_label(str8_from_memory_size(scratch.arena, dim_1u64(a->vaddr_range))); UI_TextColor(df_rgba_from_theme_color(DF_ThemeColor_WeakText)) ui_label(str8_from_memory_size(scratch.arena, dim_1u64(a->vaddr_range)));
if(a->next != 0) if(a->next != 0)
@@ -8013,7 +8089,7 @@ DF_VIEW_UI_FUNCTION_DEF(Memory)
UI_PrefHeight(ui_px(row_height_px, 0.f)) UI_PrefHeight(ui_px(row_height_px, 0.f))
{ {
B32 cursor_in_range = (viz_range_bytes.min <= mv->cursor && mv->cursor+8 <= viz_range_bytes.max); B32 cursor_in_range = (viz_range_bytes.min <= mv->cursor && mv->cursor+8 <= viz_range_bytes.max);
ui_labelf("%016X", mv->cursor); ui_labelf("%016I64X", mv->cursor);
if(cursor_in_range) if(cursor_in_range)
{ {
U64 as_u8 = 0; U64 as_u8 = 0;
@@ -8028,7 +8104,7 @@ DF_VIEW_UI_FUNCTION_DEF(Memory)
ui_labelf("%02X (%I64u)", as_u8, as_u8); ui_labelf("%02X (%I64u)", as_u8, as_u8);
ui_labelf("%04X (%I64u)", as_u16, as_u16); ui_labelf("%04X (%I64u)", as_u16, as_u16);
ui_labelf("%08X (%I64u)", as_u32, as_u32); ui_labelf("%08X (%I64u)", as_u32, as_u32);
ui_labelf("%016X (%I64u)", as_u64, as_u64); ui_labelf("%016I64X (%I64u)", as_u64, as_u64);
} }
} }
} }
@@ -8193,7 +8269,7 @@ DF_VIEW_UI_FUNCTION_DEF(Breakpoints)
UI_Parent(box) UI_Parent(box)
{ {
String8 hit_count_string = str8_from_u64(scratch.arena, entity->u64, 10, 0, 0); String8 hit_count_string = str8_from_u64(scratch.arena, entity->u64, 10, 0, 0);
UI_Font(df_font_from_slot(DF_FontSlot_Code)) df_code_label(1.f, 1, hit_count_string); UI_Font(df_font_from_slot(DF_FontSlot_Code)) df_code_label(1.f, 1, df_rgba_from_theme_color(DF_ThemeColor_CodeDefault), hit_count_string);
} }
UI_Signal sig = ui_signal_from_box(box); UI_Signal sig = ui_signal_from_box(box);
if(sig.pressed) if(sig.pressed)
+3 -3
View File
@@ -942,14 +942,14 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdb
if (l_good && r_good){ if (l_good && r_good){
Temp scratch = scratch_begin(&arena, 1); 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 // lookup member
String8 member_name = exprr->name; String8 member_name = exprr->name;
TG_Member *match = 0; 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)) if(str8_match(member->name, member_name, 0))
{ {
match = member; match = member;
+49
View File
@@ -778,6 +778,7 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8
case EVAL_TokenKind_Identifier: case EVAL_TokenKind_Identifier:
{ {
B32 mapped_identifier = 0; B32 mapped_identifier = 0;
B32 identifier_type_is_possibly_dynamically_overridden = 0;
B32 identifier_looks_like_type_expr = 0; B32 identifier_looks_like_type_expr = 0;
RADDBG_LocationKind loc_kind = RADDBG_LocationKind_NULL; RADDBG_LocationKind loc_kind = RADDBG_LocationKind_NULL;
RADDBG_LocationRegister loc_reg = {0}; RADDBG_LocationRegister loc_reg = {0};
@@ -788,6 +789,35 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8
TG_Key type_key = zero_struct; TG_Key type_key = zero_struct;
String8 local_lookup_string = token_string; 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 //- rjf: try members
if(mapped_identifier == 0) if(mapped_identifier == 0)
{ {
@@ -808,6 +838,7 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8
ctx->rdbg->type_nodes != 0) ctx->rdbg->type_nodes != 0)
{ {
mapped_identifier = 1; mapped_identifier = 1;
identifier_type_is_possibly_dynamically_overridden = 1;
RADDBG_Local *local_var = &ctx->rdbg->locals[local_num-1]; RADDBG_Local *local_var = &ctx->rdbg->locals[local_num-1];
// rjf: grab location info // rjf: grab location info
@@ -886,6 +917,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); RADDBG_NameMapNode *node = raddbg_name_map_lookup(ctx->rdbg, &parsed_name_map, token_string.str, token_string.size);
U32 matches_count = 0; U32 matches_count = 0;
U32 *matches = raddbg_matches_from_map_node(ctx->rdbg, node, &matches_count); 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) if(matches_count != 0)
{ {
U32 match_idx = matches[0]; U32 match_idx = matches[0];
@@ -916,6 +953,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); RADDBG_NameMapNode *node = raddbg_name_map_lookup(ctx->rdbg, &parsed_name_map, token_string.str, token_string.size);
U32 matches_count = 0; U32 matches_count = 0;
U32 *matches = raddbg_matches_from_map_node(ctx->rdbg, node, &matches_count); 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) if(matches_count != 0)
{ {
U32 match_idx = matches[0]; U32 match_idx = matches[0];
@@ -946,6 +989,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); RADDBG_NameMapNode *node = raddbg_name_map_lookup(ctx->rdbg, &parsed_name_map, token_string.str, token_string.size);
U32 matches_count = 0; U32 matches_count = 0;
U32 *matches = raddbg_matches_from_map_node(ctx->rdbg, node, &matches_count); 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) if(matches_count != 0)
{ {
U32 match_idx = matches[0]; U32 match_idx = matches[0];
+1 -1
View File
@@ -86,7 +86,7 @@ int main(int argument_count, char **arguments)
{ {
String8 file_path = n->string; String8 file_path = n->string;
String8 file_ext = str8_skip_last_dot(file_path); String8 file_ext = str8_skip_last_dot(file_path);
if(str8_match(file_ext, str8_lit("mc"), 0)) if(str8_match(file_ext, str8_lit("mdesk"), 0))
{ {
String8 data = os_data_from_file_path(mg_arena, file_path); String8 data = os_data_from_file_path(mg_arena, file_path);
MD_TokenizeResult tokenize = md_tokenize_from_text(mg_arena, data); MD_TokenizeResult tokenize = md_tokenize_from_text(mg_arena, data);
+48
View File
@@ -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;
}
+13
View File
@@ -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;
}
+1 -1
View File
@@ -16,7 +16,7 @@
//////////////////////////////// ////////////////////////////////
// NOTE(allen): Inline Stepping // NOTE(allen): Inline Stepping
extern unsigned int fixed_frac_bits = 5; unsigned int fixed_frac_bits = 5;
static unsigned int bias = 7; static unsigned int bias = 7;
static FORCE_INLINE unsigned int static FORCE_INLINE unsigned int
+190 -2
View File
@@ -371,6 +371,9 @@ type_coverage_eval_tests(void){
stks *stks_first = &stks_test[0]; stks *stks_first = &stks_test[0];
stks *stks_ptr = stks_first + 8; stks *stks_ptr = stks_first + 8;
TestFunction *function = mule_get_module_function("dll_type_eval_tests");
function();
int x = (int)(Anonymous_D); int x = (int)(Anonymous_D);
} }
@@ -911,6 +914,18 @@ struct Template_Example3{
} }
}; };
struct SingleInheritanceBase
{
int x;
int y;
};
struct SingleInheritanceDerived : SingleInheritanceBase
{
int z;
int w;
};
struct Has_Members{ struct Has_Members{
int a; int a;
int b; int b;
@@ -1087,6 +1102,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{ struct OverloadedMethods{
int x; int x;
int cool_method(void){ int cool_method(void){
@@ -1242,6 +1337,12 @@ extended_type_coverage_eval_tests(void){
Template_Example3<void *, float> temp3_vi((void *)&temp3_if, 1.f); Template_Example3<void *, float> temp3_vi((void *)&temp3_if, 1.f);
Template_Example3<int, Template_Example2<int, float>> temp3_itif(123, temp_if); 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 = { Pointer_To_Member pointer_to_member = {
&Has_Members::a, &Has_Members::c, &Has_Members::bas, &Has_Members::a, &Has_Members::c, &Has_Members::bas,
&Has_Members::x, &Has_Members::z, &Has_Members::bas_f, &Has_Members::x, &Has_Members::z, &Has_Members::bas_f,
@@ -1276,6 +1377,45 @@ extended_type_coverage_eval_tests(void){
vinheritance_child.x = -1; vinheritance_child.x = -1;
vinheritance_child.y = -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; OverloadedMethods overloaded_methods;
{ {
overloaded_methods.x = 0; overloaded_methods.x = 0;
@@ -1314,7 +1454,53 @@ extended_type_coverage_eval_tests(void){
} }
//////////////////////////////// ////////////////////////////////
// NOTE(allen): C Type Coverage //~ rjf: Templated Function Eval Tests
typedef struct TemplateArg TemplateArg;
struct TemplateArg
{
int x;
int y;
int z;
float a;
float b;
float c;
char *name;
};
template<typename T> static T
templated_factorial(T t)
{
T result = t;
if(t > 1)
{
result *= templated_factorial<T>(t-1);
}
return result;
}
template<typename T> static T
compute_template_arg_info(T t)
{
int sum = t.x + t.y + t.z;
int size = sizeof(t);
float sum_f = t.a + t.b + t.c;
OutputDebugStringA(t.name);
return t;
}
static void
templated_function_eval_tests(void)
{
int int_factorial = templated_factorial<int>(10);
float float_factorial = templated_factorial<float>(10);
TemplateArg arg = {1, 2, 3, 4.f, 5.f, 6.f, "my template arg"};
compute_template_arg_info(arg);
int x = 0;
}
////////////////////////////////
//~ NOTE(allen): C Type Coverage
extern "C"{ extern "C"{
#include "mule_c.h" #include "mule_c.h"
@@ -1812,7 +1998,7 @@ control_flow_stepping_tests(void){
if (i <= 1) goto done; if (i <= 1) goto done;
if ((i&1) == 0) goto even_case; if ((i&1) == 0) goto even_case;
odd_case: // odd_case:
i = 3*i + 1; i = 3*i + 1;
even_case: even_case:
@@ -2340,6 +2526,8 @@ mule_main(int argc, char** argv){
extended_type_coverage_eval_tests(); extended_type_coverage_eval_tests();
templated_function_eval_tests();
c_type_coverage_eval_tests(); c_type_coverage_eval_tests();
c_type_with_bitfield_usage(); c_type_with_bitfield_usage();
+19 -15
View File
@@ -1,38 +1,42 @@
// Copyright (c) 2024 Epic Games Tools // Copyright (c) 2024 Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/) // Licensed under the MIT license (https://opensource.org/license/mit/)
/*
** Program to run in debugger organized to provide tests for
** stepping, breakpoints, evaluation, cross-module calls.
*/
////////////////////////////////
// NOTE(allen): Setup
#if _WIN32 #if _WIN32
#define export_function extern "C" __declspec(dllexport) #define export_function extern "C" __declspec(dllexport)
#else #else
#define export_function extern "C" #define export_function extern "C"
#endif #endif
////////////////////////////////
// NOTE(allen): TLS Eval
#if _WIN32 #if _WIN32
# define thread_var __declspec(thread) # define thread_var __declspec(thread)
#else #else
# define thread_var __thread # define thread_var __thread
#endif #endif
typedef struct Basics Basics;
struct Basics
{
int a;
int b;
int c;
int d;
};
thread_var float tls_a = 1.015625f; thread_var float tls_a = 1.015625f;
thread_var int tls_b = -100; thread_var int tls_b = -100;
export_function void export_function void
dll_tls_eval_test(void){ dll_tls_eval_test(void)
{
tls_a *= 1.5f; tls_a *= 1.5f;
tls_b *= -2; tls_b *= -2;
} }
export_function void
dll_type_eval_tests(void)
{
Basics basics1 = {1, 2, 3, 4};
Basics basics2 = {4, 5, 6, 7};
int x = 0;
(void)x;
}
+8
View File
@@ -1198,6 +1198,14 @@ os_file_path_exists(String8 path)
return 0; return 0;
} }
internal FileProperties
os_properties_from_file_path(String8 path)
{
FileProperties props = {0};
NotImplemented;
return props;
}
//- rjf: file maps //- rjf: file maps
internal OS_Handle internal OS_Handle
+2 -11
View File
@@ -86,7 +86,7 @@ os_relaunch_self(void){
internal String8 internal String8
os_data_from_file_path(Arena *arena, String8 path) 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); FileProperties props = os_properties_from_file(file);
String8 data = os_string_from_file_range(arena, file, r1u64(0, props.size)); String8 data = os_string_from_file_range(arena, file, r1u64(0, props.size));
os_file_close(file); os_file_close(file);
@@ -126,19 +126,10 @@ os_write_data_list_to_file_path(String8 path, String8List list)
return good; 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 internal OS_FileID
os_id_from_file_path(String8 path) 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_FileID id = os_id_from_file(file);
os_file_close(file); os_file_close(file);
return id; return id;
+6 -5
View File
@@ -10,10 +10,11 @@
typedef U32 OS_AccessFlags; typedef U32 OS_AccessFlags;
enum enum
{ {
OS_AccessFlag_Read = (1<<0), OS_AccessFlag_Read = (1<<0),
OS_AccessFlag_Write = (1<<1), OS_AccessFlag_Write = (1<<1),
OS_AccessFlag_Execute = (1<<2), OS_AccessFlag_Execute = (1<<2),
OS_AccessFlag_Shared = (1<<3), 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 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_to_file_path(String8 path, String8 data);
internal B32 os_write_data_list_to_file_path(String8 path, String8List list); 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 OS_FileID os_id_from_file_path(String8 path);
internal S64 os_file_id_compare(OS_FileID a, OS_FileID b); 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); 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 B32 os_copy_file_path(String8 dst, String8 src);
internal String8 os_full_path_from_path(Arena *arena, String8 path); internal String8 os_full_path_from_path(Arena *arena, String8 path);
internal B32 os_file_path_exists(String8 path); internal B32 os_file_path_exists(String8 path);
internal FileProperties os_properties_from_file_path(String8 path);
//- rjf: file maps //- rjf: file maps
internal OS_Handle os_file_map_open(OS_AccessFlags flags, OS_Handle file); internal OS_Handle os_file_map_open(OS_AccessFlags flags, OS_Handle file);
+27 -1
View File
@@ -6,6 +6,11 @@
#pragma comment(lib, "shell32") #pragma comment(lib, "shell32")
#pragma comment(lib, "advapi32") #pragma comment(lib, "advapi32")
#pragma comment(lib, "rpcrt4") #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 //~ 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_Read) {access_flags |= GENERIC_READ;}
if(flags & OS_AccessFlag_Write) {access_flags |= GENERIC_WRITE;} if(flags & OS_AccessFlag_Write) {access_flags |= GENERIC_WRITE;}
if(flags & OS_AccessFlag_Execute) {access_flags |= GENERIC_EXECUTE;} 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;} 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); HANDLE file = CreateFileW((WCHAR *)path16.str, access_flags, share_mode, 0, creation_disposition, FILE_ATTRIBUTE_NORMAL, 0);
if(file != INVALID_HANDLE_VALUE) if(file != INVALID_HANDLE_VALUE)
@@ -790,6 +796,26 @@ os_file_path_exists(String8 path)
return exists; 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 //- rjf: file maps
internal OS_Handle internal OS_Handle
-1
View File
@@ -152,7 +152,6 @@ internal void os_set_cursor(OS_Cursor cursor);
internal F32 os_double_click_time(void); internal F32 os_double_click_time(void);
internal F32 os_caret_blink_time(void); internal F32 os_caret_blink_time(void);
internal F32 os_default_refresh_rate(void); internal F32 os_default_refresh_rate(void);
internal B32 os_granular_sleep_enabled(void);
//////////////////////////////// ////////////////////////////////
//~ rjf: @os_hooks Native Messages & Panics (Implemented Per-OS) //~ rjf: @os_hooks Native Messages & Panics (Implemented Per-OS)
+223
View File
@@ -0,0 +1,223 @@
////////////////////////////////
//~ rjf: @os_hooks Main Initialization API (Implemented Per-OS)
internal void
os_graphical_init(void)
{
}
////////////////////////////////
//~ rjf: @os_hooks Clipboards (Implemented Per-OS)
internal void
os_set_clipboard_text(String8 string)
{
}
internal String8
os_get_clipboard_text(Arena *arena)
{
return str8_zero();
}
////////////////////////////////
//~ rjf: @os_hooks Windows (Implemented Per-OS)
internal OS_Handle
os_window_open(Vec2F32 resolution, String8 title)
{
OS_Handle handle = {1};
return handle;
}
internal void
os_window_close(OS_Handle window)
{
}
internal void
os_window_first_paint(OS_Handle window)
{
}
internal void
os_window_equip_repaint(OS_Handle window, OS_WindowRepaintFunctionType *repaint, void *user_data)
{
}
internal void
os_window_focus(OS_Handle window)
{
}
internal B32
os_window_is_focused(OS_Handle window)
{
return 0;
}
internal B32
os_window_is_fullscreen(OS_Handle window)
{
return 0;
}
internal void
os_window_set_fullscreen(OS_Handle window, B32 fullscreen)
{
}
internal B32
os_window_is_maximized(OS_Handle window)
{
return 0;
}
internal void
os_window_set_maximized(OS_Handle window, B32 maximized)
{
}
internal void
os_window_bring_to_front(OS_Handle window)
{
}
internal void
os_window_set_monitor(OS_Handle window, OS_Handle monitor)
{
}
internal Rng2F32
os_rect_from_window(OS_Handle window)
{
Rng2F32 rect = r2f32(v2f32(0, 0), v2f32(500, 500));
return rect;
}
internal Rng2F32
os_client_rect_from_window(OS_Handle window)
{
Rng2F32 rect = r2f32(v2f32(0, 0), v2f32(500, 500));
return rect;
}
internal F32
os_dpi_from_window(OS_Handle window)
{
return 96.f;
}
////////////////////////////////
//~ rjf: @os_hooks Monitors (Implemented Per-OS)
internal OS_HandleArray
os_push_monitors_array(Arena *arena)
{
OS_HandleArray arr = {0};
return arr;
}
internal OS_Handle
os_primary_monitor(void)
{
OS_Handle handle = {1};
return handle;
}
internal OS_Handle
os_monitor_from_window(OS_Handle window)
{
OS_Handle handle = {1};
return handle;
}
internal String8
os_name_from_monitor(Arena *arena, OS_Handle monitor)
{
return str8_zero();
}
internal Vec2F32
os_dim_from_monitor(OS_Handle monitor)
{
Vec2F32 v = v2f32(1000, 1000);
return v;
}
////////////////////////////////
//~ rjf: @os_hooks Events (Implemented Per-OS)
internal void
os_send_wakeup_event(void)
{
}
internal OS_EventList
os_get_events(Arena *arena, B32 wait)
{
OS_EventList evts = {0};
return evts;
}
internal OS_EventFlags
os_get_event_flags(void)
{
OS_EventFlags f = 0;
return f;
}
internal B32
os_key_is_down(OS_Key key)
{
return 0;
}
internal Vec2F32
os_mouse_from_window(OS_Handle window)
{
return v2f32(0, 0);
}
////////////////////////////////
//~ rjf: @os_hooks Cursors (Implemented Per-OS)
internal void
os_set_cursor(OS_Cursor cursor)
{
}
////////////////////////////////
//~ rjf: @os_hooks System Properties (Implemented Per-OS)
internal F32
os_double_click_time(void)
{
return 1.f;
}
internal F32
os_caret_blink_time(void)
{
return 1.f;
}
internal F32
os_default_refresh_rate(void)
{
return 60.f;
}
internal B32
os_granular_sleep_enabled(void)
{
return 1;
}
////////////////////////////////
//~ rjf: @os_hooks Native Messages & Panics (Implemented Per-OS)
internal void
os_graphical_message(B32 error, String8 title, String8 message)
{
}
+7
View File
@@ -0,0 +1,7 @@
// Copyright (c) 2024 Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
#ifndef OS_GFX_STUB_H
#define OS_GFX_STUB_H
#endif // OS_GFX_STUB_H
-10
View File
@@ -14,7 +14,6 @@ global Arena * w32_event_arena = 0;
global HCURSOR w32_hcursor = 0; global HCURSOR w32_hcursor = 0;
global B32 w32_resizing = 0; global B32 w32_resizing = 0;
global F32 w32_default_refresh_rate = 60.f; global F32 w32_default_refresh_rate = 60.f;
global B32 w32_granular_sleep_enabled = 0;
//////////////////////////////// ////////////////////////////////
//~ allen: Windows SDK Inconsistency Fixer //~ allen: Windows SDK Inconsistency Fixer
@@ -585,9 +584,6 @@ os_graphical_init(void)
} }
} }
//- rjf: try to enable granular sleep
w32_granular_sleep_enabled = (timeBeginPeriod(1) == TIMERR_NOERROR);
//- rjf: set initial cursor //- rjf: set initial cursor
os_set_cursor(OS_Cursor_Pointer); os_set_cursor(OS_Cursor_Pointer);
} }
@@ -1081,12 +1077,6 @@ os_default_refresh_rate(void)
return w32_default_refresh_rate; 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) //~ rjf: @os_hooks Native Messages & Panics (Implemented Per-OS)
-1
View File
@@ -6,7 +6,6 @@
#pragma comment(lib, "user32") #pragma comment(lib, "user32")
#pragma comment(lib, "gdi32") #pragma comment(lib, "gdi32")
#pragma comment(lib, "winmm")
//////////////////////////////// ////////////////////////////////
//~ rjf: Windows //~ rjf: Windows
+5 -1
View File
@@ -19,7 +19,7 @@
# if OS_FEATURE_SOCKET # if OS_FEATURE_SOCKET
# include "socket/win32/os_socket_win32.c" # include "socket/win32/os_socket_win32.c"
# endif # endif
# if OS_FEATURE_GRAPHICAL # if OS_FEATURE_GRAPHICAL && !OS_GFX_STUB
# include "gfx/win32/os_gfx_win32.c" # include "gfx/win32/os_gfx_win32.c"
# endif # endif
#elif OS_LINUX #elif OS_LINUX
@@ -27,3 +27,7 @@
#else #else
# error no OS layer setup # error no OS layer setup
#endif #endif
#if OS_GFX_STUB
#include "gfx/stub/os_gfx_stub.c"
#endif
+9 -1
View File
@@ -12,6 +12,10 @@
# define OS_FEATURE_GRAPHICAL 0 # define OS_FEATURE_GRAPHICAL 0
#endif #endif
#if !defined(OS_GFX_STUB)
# define OS_GFX_STUB 0
#endif
#include "core/os_core.h" #include "core/os_core.h"
#if OS_FEATURE_SOCKET #if OS_FEATURE_SOCKET
@@ -27,7 +31,7 @@
# if OS_FEATURE_SOCKET # if OS_FEATURE_SOCKET
# include "socket/win32/os_socket_win32.h" # include "socket/win32/os_socket_win32.h"
# endif # endif
# if OS_FEATURE_GRAPHICAL # if OS_FEATURE_GRAPHICAL && !OS_GFX_STUB
# include "gfx/win32/os_gfx_win32.h" # include "gfx/win32/os_gfx_win32.h"
# endif # endif
#elif OS_LINUX #elif OS_LINUX
@@ -36,4 +40,8 @@
# error no OS layer setup # error no OS layer setup
#endif #endif
#if OS_GFX_STUB
#include "gfx/stub/os_gfx_stub.h"
#endif
#endif //OS_SWITCH_H #endif //OS_SWITCH_H
+645
View File
@@ -0,0 +1,645 @@
// Copyright (c) 2024 Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
////////////////////////////////
//~ rjf: Frontend Entry Points
internal void
update_and_render(OS_Handle repaint_window_handle, void *user_data)
{
ProfTick(0);
ProfBeginFunction();
Temp scratch = scratch_begin(0, 0);
//- rjf: tick cache layers
txt_user_clock_tick();
geo_user_clock_tick();
tex_user_clock_tick();
//- rjf: pick target hz
// TODO(rjf): maximize target, given all windows and their monitors
F32 target_hz = os_default_refresh_rate();
if(frame_time_us_history_idx > 32)
{
// rjf: calculate average frame time out of the last N
U64 num_frames_in_history = Min(ArrayCount(frame_time_us_history), frame_time_us_history_idx);
U64 frame_time_history_sum_us = 0;
for(U64 idx = 0; idx < num_frames_in_history; idx += 1)
{
frame_time_history_sum_us += frame_time_us_history[idx];
}
U64 frame_time_history_avg_us = frame_time_history_sum_us/num_frames_in_history;
// rjf: pick among a number of sensible targets to snap to, given how well
// we've been performing
F32 possible_alternate_hz_targets[] = {target_hz, 60.f, 120.f, 144.f, 240.f};
F32 best_target_hz = target_hz;
S64 best_target_hz_frame_time_us_diff = max_S64;
for(U64 idx = 0; idx < ArrayCount(possible_alternate_hz_targets); idx += 1)
{
F32 candidate = possible_alternate_hz_targets[idx];
if(candidate <= target_hz)
{
U64 candidate_frame_time_us = 1000000/(U64)candidate;
S64 frame_time_us_diff = (S64)frame_time_history_avg_us - (S64)candidate_frame_time_us;
if(abs_s64(frame_time_us_diff) < best_target_hz_frame_time_us_diff)
{
best_target_hz = candidate;
best_target_hz_frame_time_us_diff = frame_time_us_diff;
}
}
}
target_hz = best_target_hz;
}
//- 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);
}
//- 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();
//- rjf: bind change
if(!df_gfx_state->confirm_active && df_gfx_state->bind_change_active)
{
if(os_key_press(&events, os_handle_zero(), 0, OS_Key_Esc))
{
df_gfx_state->bind_change_active = 0;
}
if(os_key_press(&events, os_handle_zero(), 0, OS_Key_Delete))
{
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();
df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(df_g_cfg_src_write_cmd_kind_table[DF_CfgSrc_User]));
}
for(OS_Event *event = events.first, *next = 0; event != 0; event = next)
{
if(event->kind == OS_EventKind_Press &&
event->key != OS_Key_Esc &&
event->key != OS_Key_Return &&
event->key != OS_Key_Backspace &&
event->key != OS_Key_Delete &&
event->key != OS_Key_LeftMouseButton &&
event->key != OS_Key_RightMouseButton &&
event->key != OS_Key_Ctrl &&
event->key != OS_Key_Alt &&
event->key != OS_Key_Shift)
{
df_gfx_state->bind_change_active = 0;
DF_Binding binding = zero_struct;
{
binding.key = event->key;
binding.flags = event->flags;
}
df_unbind_spec(df_gfx_state->bind_change_cmd_spec, df_gfx_state->bind_change_binding);
df_bind_spec(df_gfx_state->bind_change_cmd_spec, binding);
U32 codepoint = os_codepoint_from_event_flags_and_key(event->flags, event->key);
os_text(&events, os_handle_zero(), codepoint);
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]));
break;
}
}
}
//- rjf: take hotkeys
{
for(OS_Event *event = events.first, *next = 0;
event != 0;
event = next)
{
next = event->next;
DF_Window *window = df_window_from_os_handle(event->window);
DF_CmdParams params = window ? df_cmd_params_from_window(window) : df_cmd_params_from_gfx();
if(event->kind == OS_EventKind_Press)
{
DF_Binding binding = {event->key, event->flags};
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 *spec = spec_candidates.first->spec;
params.cmd_spec = spec;
df_cmd_params_mark_slot(&params, 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(&params, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_CommandFastPath));
if(event->flags & OS_EventFlag_Alt)
{
window->menu_bar_focus_press_started = 0;
}
}
df_gfx_request_frame();
}
else if(event->kind == OS_EventKind_Text)
{
String32 insertion32 = str32(&event->character, 1);
String8 insertion8 = str8_from_32(scratch.arena, insertion32);
DF_CmdSpec *spec = df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_InsertText);
params.string = insertion8;
df_cmd_params_mark_slot(&params, DF_CmdParamSlot_String);
df_push_cmd__root(&params, spec);
df_gfx_request_frame();
}
}
}
//- rjf: menu bar focus
{
for(OS_Event *event = events.first, *next = 0; event != 0; event = next)
{
next = event->next;
DF_Window *ws = df_window_from_os_handle(event->window);
if(ws == 0)
{
continue;
}
if(event->kind == OS_EventKind_Press && event->key == OS_Key_Alt && event->is_repeat == 0)
{
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)
{
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);
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);
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);
ws->menu_bar_focused = 0;
}
}
}
//- rjf: gather root-level commands
DF_CmdList cmds = df_core_gather_root_cmds(scratch.arena);
//- rjf: begin frame
df_core_begin_frame(scratch.arena, &cmds, dt);
df_gfx_begin_frame(scratch.arena, &cmds);
//- rjf: queue drop for drag/drop
if(df_drag_is_active())
{
for(OS_Event *event = events.first; event != 0; event = event->next)
{
if(event->kind == OS_EventKind_Release && event->key == OS_Key_LeftMouseButton)
{
df_queue_drag_drop();
break;
}
}
}
//- rjf: auto-focus moused-over windows while dragging
if(df_drag_is_active())
{
B32 over_focused_window = 0;
{
for(DF_Window *window = df_gfx_state->first_window; window != 0; window = window->next)
{
Vec2F32 mouse = os_mouse_from_window(window->os);
Rng2F32 rect = os_client_rect_from_window(window->os);
if(os_window_is_focused(window->os) && contains_2f32(rect, mouse))
{
over_focused_window = 1;
break;
}
}
}
if(!over_focused_window)
{
for(DF_Window *window = df_gfx_state->first_window; window != 0; window = window->next)
{
Vec2F32 mouse = os_mouse_from_window(window->os);
Rng2F32 rect = os_client_rect_from_window(window->os);
if(!os_window_is_focused(window->os) && contains_2f32(rect, mouse))
{
os_window_focus(window->os);
break;
}
}
}
}
//- rjf: update & render
{
d_begin_frame();
for(DF_Window *w = df_gfx_state->first_window; w != 0; w = w->next)
{
df_window_update_and_render(scratch.arena, &events, w, &cmds);
}
}
//- rjf: end frontend frame, send signals, etc.
df_gfx_end_frame();
df_core_end_frame();
//- rjf: submit rendering to all windows
{
r_begin_frame();
for(DF_Window *w = df_gfx_state->first_window; w != 0; w = w->next)
{
r_window_begin_frame(w->os, w->r);
d_submit_bucket(w->os, w->r, w->draw_bucket);
r_window_end_frame(w->os, w->r);
}
r_end_frame();
}
//- rjf: take window closing events
for(OS_Event *e = events.first; e; e = e->next)
{
if(e->kind == OS_EventKind_WindowClose)
{
for(DF_Window *w = df_gfx_state->first_window; w != 0; w = w->next)
{
if(os_handle_match(w->os, e->window))
{
DF_CmdParams params = df_cmd_params_from_window(w);
df_push_cmd__root(&params, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_CloseWindow));
break;
}
}
}
}
//- rjf: determine frame time, record into history
U64 end_time_us = os_now_microseconds();
U64 frame_time_us = end_time_us-begin_time_us;
frame_time_us_history[frame_time_us_history_idx%ArrayCount(frame_time_us_history)] = frame_time_us;
frame_time_us_history_idx += 1;
scratch_end(scratch);
ProfEnd();
}
internal CTRL_WAKEUP_FUNCTION_DEF(wakeup_hook)
{
os_send_wakeup_event();
}
internal void
entry_point(int argc, char **argv)
{
Temp scratch = scratch_begin(0, 0);
#if PROFILE_TELEMETRY
local_persist U8 tm_data[MB(64)];
tmLoadLibrary(TM_RELEASE);
tmSetMaxThreadCount(1024);
tmInitialize(sizeof(tm_data), (char *)tm_data);
#endif
ThreadName("[main]");
//- rjf: initialize basic dependencies
os_init(argc, argv);
//- rjf: parse command line arguments
CmdLine cmdln = cmd_line_from_string_list(scratch.arena, os_get_command_line_arguments());
ExecMode exec_mode = ExecMode_Normal;
String8 user_cfg_path = str8_lit("");
String8 profile_cfg_path = str8_lit("");
B32 capture = 0;
B32 auto_run = 0;
B32 auto_step = 0;
B32 jit_attach = 0;
U64 jit_pid = 0;
U64 jit_code = 0;
U64 jit_addr = 0;
{
if(cmd_line_has_flag(&cmdln, str8_lit("ipc")))
{
exec_mode = ExecMode_IPCSender;
}
else if(cmd_line_has_flag(&cmdln, str8_lit("convert")))
{
exec_mode = ExecMode_Converter;
}
else if(cmd_line_has_flag(&cmdln, str8_lit("?")) ||
cmd_line_has_flag(&cmdln, str8_lit("help")))
{
exec_mode = ExecMode_Help;
}
user_cfg_path = cmd_line_string(&cmdln, str8_lit("user"));
profile_cfg_path = cmd_line_string(&cmdln, str8_lit("profile"));
capture = cmd_line_has_flag(&cmdln, str8_lit("capture"));
auto_run = cmd_line_has_flag(&cmdln, str8_lit("auto_run"));
auto_step = cmd_line_has_flag(&cmdln, str8_lit("auto_step"));
String8 jit_pid_string = {0};
String8 jit_code_string = {0};
String8 jit_addr_string = {0};
jit_pid_string = cmd_line_string(&cmdln, str8_lit("jit_pid"));
jit_code_string = cmd_line_string(&cmdln, str8_lit("jit_code"));
jit_addr_string = cmd_line_string(&cmdln, str8_lit("jit_addr"));
try_u64_from_str8_c_rules(jit_pid_string, &jit_pid);
try_u64_from_str8_c_rules(jit_code_string, &jit_code);
try_u64_from_str8_c_rules(jit_addr_string, &jit_addr);
jit_attach = (jit_addr != 0);
}
//- rjf: auto-start capture
if(capture)
{
ProfBeginCapture("raddbg");
}
//- rjf: set default user/profile paths
{
String8 user_program_data_path = os_string_from_system_path(scratch.arena, OS_SystemPath_UserProgramData);
String8 user_data_folder = push_str8f(scratch.arena, "%S/%S", user_program_data_path, str8_lit("raddbg"));
os_make_directory(user_data_folder);
if(user_cfg_path.size == 0)
{
user_cfg_path = push_str8f(scratch.arena, "%S/default.raddbg_user", user_data_folder);
}
if(profile_cfg_path.size == 0)
{
profile_cfg_path = push_str8f(scratch.arena, "%S/default.raddbg_profile", user_data_folder);
}
}
//- rjf: dispatch to top-level codepath based on execution mode
switch(exec_mode)
{
//- rjf: normal execution
default:
case ExecMode_Normal:
{
//- rjf: set up shared memory for ipc
OS_Handle ipc_shared_memory = os_shared_memory_alloc(IPC_SHARED_MEMORY_BUFFER_SIZE, ipc_shared_memory_name);
void *ipc_shared_memory_base = os_shared_memory_view_open(ipc_shared_memory, r1u64(0, IPC_SHARED_MEMORY_BUFFER_SIZE));
OS_Handle ipc_semaphore = os_semaphore_alloc(1, 1, ipc_semaphore_name);
IPCInfo *ipc_info = (IPCInfo *)ipc_shared_memory_base;
ipc_info->msg_size = 0;
//- rjf: initialize stuff we depend on
{
hs_init();
txt_init();
dbgi_init();
txti_init();
demon_init();
ctrl_init(wakeup_hook);
dasm_init();
os_graphical_init();
fp_init();
r_init(&cmdln);
tex_init();
geo_init();
f_init();
DF_StateDeltaHistory *hist = df_state_delta_history_alloc();
df_core_init(user_cfg_path, profile_cfg_path, hist);
df_gfx_init(update_and_render, hist);
os_set_cursor(OS_Cursor_Pointer);
}
//- rjf: setup initial target from command line args
{
String8List args = cmdln.inputs;
if(args.node_count > 0 && args.first->string.size != 0)
{
Temp scratch = scratch_begin(0, 0);
DF_Entity *target = df_entity_alloc(0, df_entity_root(), DF_EntityKind_Target);
df_entity_equip_b32(target, 1);
df_entity_equip_cfg_src(target, DF_CfgSrc_CommandLine);
String8List passthrough_args_list = {0};
for(String8Node *n = args.first->next; n != 0; n = n->next)
{
str8_list_push(scratch.arena, &passthrough_args_list, n->string);
}
// rjf: equip exe
if(args.first->string.size != 0)
{
DF_Entity *exe = df_entity_alloc(0, target, DF_EntityKind_Executable);
df_entity_equip_name(0, exe, args.first->string);
}
// rjf: equip path
String8 path_part_of_arg = str8_chop_last_slash(args.first->string);
if(path_part_of_arg.size != 0)
{
String8 path = push_str8f(scratch.arena, "%S/", path_part_of_arg);
DF_Entity *execution_path = df_entity_alloc(0, target, DF_EntityKind_ExecutionPath);
df_entity_equip_name(0, execution_path, path);
}
// rjf: equip args
StringJoin join = {str8_lit(""), str8_lit(" "), str8_lit("")};
String8 args_str = str8_list_join(scratch.arena, &passthrough_args_list, &join);
if(args_str.size != 0)
{
DF_Entity *args_entity = df_entity_alloc(0, target, DF_EntityKind_Arguments);
df_entity_equip_name(0, args_entity, args_str);
}
scratch_end(scratch);
}
}
//- rjf: main application loop
{
for(;;)
{
//- rjf: get IPC messages & dispatch ui commands from them
{
if(os_semaphore_take(ipc_semaphore, max_U64))
{
if(ipc_info->msg_size != 0)
{
U8 *buffer = (U8 *)(ipc_info+1);
U64 msg_size = ipc_info->msg_size;
String8 cmd_string = str8(buffer, msg_size);
ipc_info->msg_size = 0;
DF_Window *dst_window = df_gfx_state->first_window;
for(DF_Window *window = dst_window; window != 0; window = window->next)
{
if(os_window_is_focused(window->os))
{
dst_window = window;
break;
}
}
if(dst_window != 0)
{
Temp scratch = scratch_begin(0, 0);
String8 cmd_spec_string = df_cmd_name_part_from_string(cmd_string);
DF_CmdSpec *cmd_spec = df_cmd_spec_from_string(cmd_spec_string);
if(!df_cmd_spec_is_nil(cmd_spec))
{
DF_CmdParams params = df_cmd_params_from_gfx();
DF_CtrlCtx ctrl_ctx = df_ctrl_ctx_from_window(dst_window);
String8 error = df_cmd_params_apply_spec_query(scratch.arena, &ctrl_ctx, &params, cmd_spec, df_cmd_arg_part_from_string(cmd_string));
if(error.size == 0)
{
df_push_cmd__root(&params, cmd_spec);
}
else
{
DF_CmdParams params = df_cmd_params_from_window(dst_window);
params.string = error;
df_cmd_params_mark_slot(&params, DF_CmdParamSlot_String);
df_push_cmd__root(&params, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Error));
}
}
scratch_end(scratch);
}
}
os_semaphore_drop(ipc_semaphore);
}
}
//- rjf: update & render frame
OS_Handle repaint_window = {0};
update_and_render(repaint_window, 0);
//- rjf: auto run
if(auto_run)
{
auto_run = 0;
DF_CmdParams params = df_cmd_params_from_gfx();
df_push_cmd__root(&params, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_LaunchAndRun));
}
//- rjf: auto step
if(auto_step)
{
auto_step = 0;
DF_CmdParams params = df_cmd_params_from_gfx();
df_push_cmd__root(&params, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_StepInto));
}
//- rjf: jit attach
if(jit_attach)
{
jit_attach = 0;
DF_CmdParams params = df_cmd_params_from_gfx();
df_cmd_params_mark_slot(&params, DF_CmdParamSlot_ID);
params.id = jit_pid;
df_push_cmd__root(&params, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Attach));
}
//- rjf: quit if no windows are left
if(df_gfx_state->first_window == 0)
{
break;
}
}
}
}break;
//- rjf: inter-process communication message sender
case ExecMode_IPCSender:
{
Temp scratch = scratch_begin(0, 0);
//- rjf: grab ipc shared memory
OS_Handle ipc_shared_memory = os_shared_memory_open(ipc_shared_memory_name);
void *ipc_shared_memory_base = os_shared_memory_view_open(ipc_shared_memory, r1u64(0, MB(16)));
if(ipc_shared_memory_base != 0)
{
OS_Handle ipc_semaphore = os_semaphore_open(ipc_semaphore_name);
IPCInfo *ipc_info = (IPCInfo *)ipc_shared_memory_base;
if(os_semaphore_take(ipc_semaphore, os_now_microseconds() + Million(6)))
{
U8 *buffer = (U8 *)(ipc_info+1);
U64 buffer_max = IPC_SHARED_MEMORY_BUFFER_SIZE - sizeof(IPCInfo);
StringJoin join = {str8_lit(""), str8_lit(" "), str8_lit("")};
String8 msg = str8_list_join(scratch.arena, &cmdln.inputs, &join);
ipc_info->msg_size = Min(buffer_max, msg.size);
MemoryCopy(buffer, msg.str, ipc_info->msg_size);
os_semaphore_drop(ipc_semaphore);
}
}
scratch_end(scratch);
}break;
//- rjf: built-in pdb/dwarf -> raddbg converter mode
case ExecMode_Converter:
{
Temp scratch = scratch_begin(0, 0);
//- rjf: parse arguments
PDBCONV_Params *params = pdb_convert_params_from_cmd_line(scratch.arena, &cmdln);
//- rjf: open output file
String8 output_name = push_str8_copy(scratch.arena, params->output_name);
OS_Handle out_file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_Write, output_name);
B32 out_file_is_good = !os_handle_match(out_file, os_handle_zero());
//- rjf: convert
PDBCONV_Out *out = 0;
if(out_file_is_good)
{
out = pdbconv_convert(scratch.arena, params);
}
//- rjf: bake file
if(out != 0 && params->output_name.size > 0)
{
String8List baked = {0};
cons_bake_file(scratch.arena, out->root, &baked);
U64 off = 0;
for(String8Node *node = baked.first; node != 0; node = node->next)
{
os_file_write(out_file, r1u64(off, off+node->string.size), node->string.str);
off += node->string.size;
}
}
//- rjf: close output file
os_file_close(out_file);
scratch_end(scratch);
}break;
//- rjf: help message box
case ExecMode_Help:
{
os_graphical_message(0,
str8_lit("The RAD Debugger - Help"),
str8_lit("The following options may be used when starting the RAD Debugger from the command line:\n\n"
"--user:<path>\n"
"Use to specify the location of a user file which should be used. User files are used to store settings for users, including window and panel setups, path mapping, and visual settings. If this file does not exist, it will be created as necessary. This file will be autosaved as user-related changes are made.\n\n"
"--profile:<path>\n"
"Use to specify the location of a profile file which should be used. Profile files are used to store settings for users and projects. If this file does not exist, it will be created as necessary. This file will be autosaved as profile-related changes are made.\n\n"
"--auto_step\n"
"This will step into all targets after the debugger initially starts.\n\n"
"--auto_run\n"
"This will run all targets after the debugger initially starts.\n\n"
"--ipc <command>\n"
"This will launch the debugger in the non-graphical IPC mode, which is used to communicate with another running instance of the debugger. The debugger instance will launch, send the specified command, then immediately terminate. This may be used by editors or other programs to control the debugger.\n\n"));
}break;
}
scratch_end(scratch);
}
File diff suppressed because it is too large Load Diff
+462
View File
@@ -0,0 +1,462 @@
// Copyright (c) 2024 Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
////////////////////////////////
//~ rjf: Hot, High Priority Tasks (Complete Unusability, Crashes, Fire-Worthy)
//
// [ ] ** Thread/process control bullet-proofing, including solo-step mode
//
// [ ] ** 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
// "Kill All". I have to close the debugger and restart it, AFAICT?
//
// [ ] ** I tried to debug a console program, and "step into" didn't seem to
// work. Instead, it just started running the program, but the program
// seemed to hang, and then the debugger pseudo-hung with a continual
// 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.
//
// [ ] ** Converter performance & heuristics for asynchronously doing it early
//
// [ ] disasm animation & go-to-address
//
// [ ] visualize remapped files (via path map)
////////////////////////////////
//~ rjf: Hot, Medium Priority Tasks (Low-Hanging-Fruit Features, UI Jank, Cleanup)
//
// [ ] ** 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
// global? I don't have any feedback here because it probably will make
// sense once I use the debugger more, but I just thought I'd make a note
// to say that I was confused about it after reading the manual, so
// perhaps you could elaborate a little more on it in there.
//
// [ ] ** "Find Name" may not be working as advertised. In the description, it
// says you can jump to a file, but if I type in the complete filename of
// a file in the project and hit return, it just turns red and says it
// couldn't find it. This happens even if the file is already open in a
// tab.
// [ ] "Find Name" would be a lot more useful if you could type partial
// things, and it displayed a list, more like what happens in a
// traditional text editor. Typing the entire name of a function to jump
// to it is too laborious.
//
// [ ] Right-clicking on a thread in the Scheduler window pops up a context
// menu, but you can't actually see it because the tooltip for the thread
// draws on top of it, so you can't see the menu.
//
// [ ] In a "hover watch" (where you hover over a variable and it shows a pop-
// up watch window), if you expand an item near the bottom of the listing,
// it will be clipped to the bottom of the listing instead of showing the
// actual items (ie., it doesn't resize the listing based on what's
// actually visible)
//
// [ ] ** Function breakpoints should show up in the source listing. Without
// them being visible, it is confusing when you run and you stop there,
// because you're like "wait why did it stop" and then you later remember
// that's because there was a function breakpoint there.
//
// [ ] ** One very nice feature of RemedyBG that I use all the time is the
// ability to put "$err, hr" into the watch window, which will just show
// the value of GetLastError() as a string. This is super useful for
// debugging, so you don't have to litter your own code with it.
//
// [ ] Tooltip Coverage:
// [ ] lock icon
// [ ] "rotation arrow" icon next to executables
//
// [ ] Using the word "symbol" in "Code (Symbol)" seems like a bad idea, since
// you're referring to non-identifier characters, but in a debugger
// "symbol" usually means something defined in the debug information.
//
// [ ] I LOVE ALT-W to add watch under cursor, but I would prefer to have it
// add what's under the MOUSE cursor instead of the keyboard cursor. Can
// we get a command for that so I can bind ALT-W to that instead?
//
// [ ] For theme editing, when you hove the mouse over a theme color entry and
// it highlights that entry, it might help to temporarily change that
// color to white (or the inverse of the background color, or whatever) so
// that the user can see what things on the screen use that theme color.
//
// [ ] I couldn't figure out how to affect the "dim" color in constants that
// have alternating bright/dim letters to show sections of a number. Is
// this in the theme colors somewhere?
//
// [ ] For breakpoint-on-function, it would be great if it showed a list of
// (partial) matches as you type, so you can stop typing once it gets the
// right function instead of having to type the entire function name.
//
// [ ] Hovering over a source tab that is clipped should probably display the
// full thing that was in that tab (like the whole filename, etc.). Right
// now, hovering does nothing AFAICT.
//
// [ ] ** I couldn't figure out how to really view threads in the debugger.
// The only place I found a thread list was in "The Scheduler", but it
// only lists threads by ID, which is hard to use. I can hover over them
// to get the stack, which helps, but it would be much nicer if the top
// function was displayed in the window by default next to the thread.
// [ ] ** It would be nice if thread listings displayed the name of the
// thread, instead of just the ID.
//
// [ ] ** Scrollbars are barely visible for me, for some reason. I could not
// find anything in the theme that would fill them with a solid, bright
// color. Instead they are just a thin outline and the same color as the
// scroll bar background.
//
// [ ] Dragging a window tab (like Locals or Registers or whatnot) and
// canceling with ESC should revert the window tab to where it was.
// Currently, it leaves the window tab reordered if you dragged over its
// window and shuffled its position.
//
// [ ] Many of the UI elements, like the menus, would like better if they had
// a little bit of margin. Having the text right next to the edges, and
// with no line spacing, makes it harder to read things quickly.
//
// [ ] Menus take too long to show up. I would prefer it if they were instant.
// The animation doesn't really provide any useful cues, since I know
// where the menu came from.
//
// [ ] Theme window should include font scaling. I was able to find the
// command for increasing the font scale, but I imagine most people
// wouldn't think to look there.
// [ ] I had to go into the user file to change the font. That should probably
// be in the theme window?
//
// [ ] The way the "commands" view worked was idiosyncratic. All the other
// views stay up, but that one goes away whenever I select a command for
// some reason.
// [ ] Also, I could not move the commands window anywhere AFAICT. It seems
// to just pop up over whatever window I currently have selected. This
// would make sense for a hotkey (which I assume is the way it was
// designed), but it seems like it should be permanent if you can select
// it from the View menu.
// [ ] If the command window is not wide enough, you cannot read the
// description of a command because it doesn't word-wrap, nor can you
// hover over it to get the description in a tooltip (AFAICT).
//
// [ ] It'd be nice to have a "goto byte" option for source views, for jumping
// to error messages that are byte-based instead of line-based.
//
// [ ] Pressing the left mouse button on the menu bar and dragging does not
// move through the menus as expected - instead, it opens the one you
// clicked down on, then does nothing until you release, at which point it
// opens the menu you released on.
// [ ] Similarly, pressing the left mouse button on a menu and dragging to an
// item, then releasing, does not trigger that item as expected. Instead,
// it is a nop, and it waits for you to click again on the item.
//
// [ ] Working with panels felt cumbersome. I couldn't figure out any way to
// quickly arrange the display without manually selecting "split panel"
// and "close panel" and stuff from the menu, which took a long time.
// - @polish @feature ui for dragging tab -> bundling panel split options
//
// [ ] I found the "context menu" convention to be confusing. For example, if
// I left-click on a tab, it selects the tab. If I right-click on a tab,
// it opens the context menu. However, if I left-click on a module, it
// opens the context window. It seems like maybe menus should be right,
// and left should do the default action, more consistently?
//
// [ ] Hovering over disassembly highlights blocks of instructions, which I
// assume correspond to source lines. But perhaps it should also highlight
// the source lines? The inverse hover works (you hover over source, and
// it highlights ASM), but ASM->source doesn't.
//
// [ ] It wasn't clear to me how you save a user or profile file. I can see
// how to load them, but not how you save them. Obviously I can just copy
// the files myself in the shell, but it seemed weird that there was no
// "save" option in the menus.
//
// [ ] @cleanup @feature double & triple click select in source views
// [ ] @feature hovering truncated text in UI for some amount of time -> show
// tooltip with full text
// [ ] @feature disasm keyboard navigation & copy/paste
// [ ] @feature debug info overrides (both path-based AND module-based)
// [ ] configure tab size
// [ ] run-to-line needs to work if no processes are running
// - place temp bp, attach "die on hit" flag or something like that?
// [ ] auto-scroll output window
//
// [ ] C++ single & multi inheritance member visualization in watch window
////////////////////////////////
//~ 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
//
// [ ] ** Hover-Eval-Popup-While-Scrolling is very annoying!
//
// [ ] ** 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
// click is already for context menus, can it not just be that double-
// clicking any column jumps to that stack frame?
//
// [ ] ** I find it really hard to read the code with the heavyweight lines
// running through it for breakpoints and stepping and things. Is there a
// way to turn the lines off? AFAICT they are based on thread and
// breakpoint color, so you can't really control the line drawing? I might
// be fine with them, but they would have to be much more light (like
// alpha 0.1 or something)
//
// [ ] It's confusing that ENTER is the way you expand and collapse things in
// the watch window, but then also how you edit them if they are not
// expandable? It seems like this should be consistent (one way to edit,
// one way to expand/collapse, that are distinct)
//
// [ ] I didn't understand the terminology "Equip With Color". Does that just
// mean specify the color used to display it? Is "Apply Color" perhaps a
// bit more user-friendly?
//
// [ ] The cursor feels a bit too huge vertically.
//
// [ ] The hex format for color values in the config file was a real
// mindbender. It's prefixed with "0x", so I was assuming it was either
// Windows Big Endian (0xAARRGGBB) or Mac Little Endian (0xAABBGGRR). To
// my surprise, it was neither - it was actually web format (RRGGBBAA),
// which I was not expecting because that is normally written with a
// number sign (#AARRGGBB) not an 0x.
//
// [ ] Clicking on either side of a scroll bar is idiosyncratic. Normally,
// that is "page up" / "page down", but here it is "smooth scroll upward"
// / "smooth scroll downward" for some reason?
//
// [ ] Hitting ESC during a color picker drag should abort the color picking
// and revert to the previous color. Currently, it just accepts the last
// drag result as the new color.
//
// [ ] It was not clear to me why a small "tab picker" appeared when I got to
// a certain number of tabs. It seemed to appear even if the tabs were
// quite large, and there was no need to a drop-down menu to pick them. It
// feels like either it should always be there, or it should only show up
// if at least one tab gets small enough to have its name cut off?
//
// [ ] 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
// expression
// [ ] default font size is too small for me - not only source code, but
// menus/tab/watch names (which don't resize). Maybe you could query
// Windows for initial font size?
// [ ] zooming behaves very strangely - sometimes it zooms source code,
// sometimes both source code and menu/tab/watch font size, sometimes
// just menu/tab/watch font size not source size.
// [ ] icon fonts glyphs sometimes disappear for specific font size, but they
// reappear if you go +1 higher or -1 lower. Mostly red triangle in watch
// values for "unknown identifier". But also yellow arrow in call stack
// disappears if font size gets too large.
// [ ] undo close tab would be nice. If not for everything, then at least
// just for source files
////////////////////////////////
//~ 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
// [ ] `text[:lang]` - interpret memory as text, in lang `lang`
// [ ] `disasm:arch` - interpret memory as machine code for isa `arch`
// [ ] `memory` - view memory in usual memory hex-editor view
// NOTE(rjf): When the visualization system is solid, layers like dasm, txti,
// and so on can be dispensed with, as things like the source view, disasm
// view, or memory view will simply be specializations of the general purpose
// viz system.
// [ ] view rule hook for standalone visualization ui, granted its own
// tab
//
// [ ] search-in-all-files
//
// [ ] Memory View
// [ ] memory view mutation controls
// [ ] memory view user-made annotations
//
// [ ] undo/redo
// [ ] proper "go back" + "go forward" history navigations
//
// [ ] globally disable/configure default view rule-like things (string
// viz for u8s in particular)
// [ ] globally disable/configure bp/ip lines in source view
//
// [ ] @feature processor/data breakpoints
// [ ] @feature automatically snap to search matches when searching source files
// [ ] @feature entity views: filtering & reordering
////////////////////////////////
//~ rjf: Cold, Clean-up Tasks That Probably Only Ryan Notices
// (E.G. Because They Are Code-Related Or Because Nobody Cares)
//
// [ ] @bug view-snapping in scroll-lists, accounting for mapping between
// visual positions & logical positions (variably sized rows in watch,
// table headers, etc.)
// [ ] @bug selected frame should be keyed by run_idx or something so that it
// can gracefully reset to the top frame when running
// [ ] @cleanup collapse DF_CfgNodes into just being MD trees, find another way
// to encode config source - don't need it at every node
// [ ] @cleanup straighten out index/number space & types & terminology for
// scroll lists
// [ ] @cleanup simplification pass over eval visualization pipeline & types,
// including view rule hooks
// [ ] @cleanup naming pass over eval visualization part of the frontend,
// "blocks" vs. "canvas" vs. "expansion" - etc.
// [ ] @cleanup central worker thread pool - eliminate per-layer thread pools
////////////////////////////////
//~ rjf: Cold, Unsorted Notes (Deferred Until Existing Lists Mostly Exhausted)
//
// [ ] @feature types -> auto view rules (don't statefully fill view rules
// given types, just query if no other view rule is present, & autofill
// when editing)
// [ ] @feature eval system -> somehow evaluate breakpoint hit counts? "meta"
// variables?
// [ ] @feature watch window labels
// [ ] @feature scheduler -> thread grid view?
//
// [ ] @feature disasm view improvement features
// [ ] interleaved src/dasm view
// [ ] visualize jump destinations in disasm
//
// [ ] @feature eval ui improvement features
// [ ] serializing eval view maps
// [ ] view rule editors in hover-eval
// [ ] view rule hook coverage
// [ ] `each:(expr addition)` - apply some additional expression to all
// elements in an array/linked list would be useful to look at only a
// subset of an array of complex structs
// [ ] `slider:(min max)` view rule
// [ ] `v2f32` view rule
// [ ] `v3` view rule
// [ ] `quat` view rule
// [ ] `matrix` view rule
// [ ] `audio` waveform view rule
// [ ] smart scopes - expression operators for "grab me the first type X"
// [ ] "pinning" watch expressions, to attach it to a particular ctrl_ctx
//
// [ ] @feature header file for target -> debugger communication; printf, log,
// etc.
// [ ] @feature just-in-time debugging
// [ ] @feature step-out-of-loop
//
//-[ ] long-term future notes from martins
// [ ] core dump saving/loading
// [ ] parallel call stacks view
// [ ] parallel watch view
// [ ] mixed native/interpreted/jit debugging
// - it seems python has a top-level linked list of interpreter states,
// which should allow the debugger to map native callstacks to python
// code
//
// [ ] fancy string runs can include "weakness" information for text truncation
// ... can prioritize certain parts of strings to be truncated before
// others. would be good for e.g. the middle of a path
// [ ] ui code maintenance, simplification, design, & robustness pass
// [ ] page-up & page-down correct handling in keyboard nav
// [ ] collapse context menus & command lister into same codepaths. filter by
// context. parameterize by context.
// [ ] collapse text cells & command lister & etc. into same codepath (?)
// [ ] nested context menus
// [ ] unified top-level cursor/typing/lister helper
// [ ] font selection lister
// [ ] font cache eviction (both for font tags, closing fp handles, and
// rasterizations)
// [ ] frontend speedup opportunities
// [ ] tables in UI -> currently building per-row, could probably cut down on
// # of boxes and # of draws by doing per-column in some cases?
// [ ] font cache layer -> can probably cache (string*font*size) -> (run) too
// (not just rasterization)... would save a *lot*, there is a ton of work
// just in looking up & stitching stuff repeatedly
// [ ] convert UI layout pass to not be naive recursive version
// [ ] (big change) parallelize window ui build codepaths per-panel
#ifndef RADDBG_H
#define RADDBG_H
////////////////////////////////
//~ rjf: Build Settings
#define RADDBG_VERSION_MAJOR 0
#define RADDBG_VERSION_MINOR 9
#define RADDBG_VERSION_PATCH 5
#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
typedef enum ExecMode
{
ExecMode_Normal,
ExecMode_IPCSender,
ExecMode_Converter,
ExecMode_Help,
}
ExecMode;
typedef struct IPCInfo IPCInfo;
struct IPCInfo
{
U64 msg_size;
};
////////////////////////////////
//~ rjf: Globals
#define IPC_SHARED_MEMORY_BUFFER_SIZE MB(16)
StaticAssert(IPC_SHARED_MEMORY_BUFFER_SIZE > sizeof(IPCInfo), ipc_buffer_size_requirement);
read_only global String8 ipc_shared_memory_name = str8_lit_comp("_raddbg_ipc_shared_memory_");
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;
////////////////////////////////
//~ rjf: Frontend Entry Points
internal void update_and_render(OS_Handle repaint_window_handle, void *user_data);
#endif // RADDBG_H
+362
View File
@@ -0,0 +1,362 @@
////////////////////////////////
//~ rjf: Includes
//- rjf: [h]
#include "base/base_inc.h"
#include "os/os_inc.h"
#include "mdesk/mdesk.h"
#include "hash_store/hash_store.h"
#include "text_cache/text_cache.h"
#include "path/path.h"
#include "txti/txti.h"
#include "coff/coff.h"
#include "pe/pe.h"
#include "raddbg_format/raddbg_format.h"
#include "raddbg_format/raddbg_format_parse.h"
#include "raddbg_cons/raddbg_cons.h"
#include "raddbg_convert/pdb/raddbg_coff.h"
#include "raddbg_convert/pdb/raddbg_codeview.h"
#include "raddbg_convert/pdb/raddbg_msf.h"
#include "raddbg_convert/pdb/raddbg_pdb.h"
#include "raddbg_convert/pdb/raddbg_coff_conversion.h"
#include "raddbg_convert/pdb/raddbg_codeview_conversion.h"
#include "raddbg_convert/pdb/raddbg_from_pdb.h"
#include "raddbg_convert/pdb/raddbg_codeview_stringize.h"
#include "raddbg_convert/pdb/raddbg_pdb_stringize.h"
#include "regs/regs.h"
#include "regs/raddbg/regs_raddbg.h"
#include "type_graph/type_graph.h"
#include "dbgi/dbgi.h"
#include "demon/demon_inc.h"
#include "eval/eval_compiler.h"
#include "eval/eval_machine.h"
#include "eval/eval_parser.h"
#include "unwind/unwind.h"
#include "ctrl/ctrl_inc.h"
#include "dasm/dasm.h"
#include "font_provider/font_provider_inc.h"
#include "render/render_inc.h"
#include "texture_cache/texture_cache.h"
#include "geo_cache/geo_cache.h"
#include "font_cache/font_cache.h"
#include "draw/draw.h"
#include "ui/ui_inc.h"
#include "df/df_inc.h"
#include "raddbg.h"
//- rjf: [c]
#include "base/base_inc.c"
#include "os/os_inc.c"
#include "mdesk/mdesk.c"
#include "hash_store/hash_store.c"
#include "text_cache/text_cache.c"
#include "path/path.c"
#include "txti/txti.c"
#include "coff/coff.c"
#include "pe/pe.c"
#include "raddbg_format/raddbg_format.c"
#include "raddbg_format/raddbg_format_parse.c"
#include "raddbg_cons/raddbg_cons.c"
#include "raddbg_convert/pdb/raddbg_msf.c"
#include "raddbg_convert/pdb/raddbg_codeview.c"
#include "raddbg_convert/pdb/raddbg_pdb.c"
#include "raddbg_convert/pdb/raddbg_coff_conversion.c"
#include "raddbg_convert/pdb/raddbg_codeview_conversion.c"
#include "raddbg_convert/pdb/raddbg_codeview_stringize.c"
#include "raddbg_convert/pdb/raddbg_pdb_stringize.c"
#include "raddbg_convert/pdb/raddbg_from_pdb.c"
#include "regs/regs.c"
#include "regs/raddbg/regs_raddbg.c"
#include "type_graph/type_graph.c"
#include "dbgi/dbgi.c"
#include "demon/demon_inc.c"
#include "eval/eval_compiler.c"
#include "eval/eval_machine.c"
#include "eval/eval_parser.c"
#include "unwind/unwind.c"
#include "ctrl/ctrl_inc.c"
#include "dasm/dasm.c"
#include "font_provider/font_provider_inc.c"
#include "render/render_inc.c"
#include "texture_cache/texture_cache.c"
#include "geo_cache/geo_cache.c"
#include "font_cache/font_cache.c"
#include "draw/draw.c"
#include "ui/ui_inc.c"
#include "df/df_inc.c"
#include "raddbg.c"
////////////////////////////////
//~ rjf: Low-Level Entry Points
//- rjf: windows
#if OS_WINDOWS
#include <dbghelp.h>
#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)
{
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_info)
{
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_info->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_info->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),
GetStdHandle(STD_OUTPUT_HANDLE),
GetStdHandle(STD_ERROR_HANDLE),
};
for(U64 idx = 0; idx < ArrayCount(output_handles); idx += 1)
{
B32 duplicate = 0;
for(U64 idx2 = 0; idx2 < idx; idx2 += 1)
{
if(output_handles[idx2] == output_handles[idx])
{
duplicate = 1;
break;
}
}
if(duplicate)
{
output_handles[idx] = 0;
}
}
for(U64 idx = 0; idx < ArrayCount(output_handles); idx += 1)
{
if(output_handles[idx] != 0)
{
CloseHandle(output_handles[idx]);
}
}
SetStdHandle(STD_INPUT_HANDLE, 0);
SetStdHandle(STD_OUTPUT_HANDLE, 0);
SetStdHandle(STD_ERROR_HANDLE, 0);
static TCTX main_thread_tctx = {0};
tctx_init_and_equip(&main_thread_tctx);
Arena *perm_arena = arena_alloc();
WCHAR *command_line = GetCommandLineW();
int argc;
WCHAR **argv_16 = CommandLineToArgvW(command_line, &argc);
char **argv = push_array(perm_arena, char *, argc);
for(int i = 0; i < argc; i += 1)
{
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;
}
entry_point(argc, argv);
return 0;
}
//- rjf: linux
#elif OS_LINUX
int main(int argument_count, char **arguments)
{
static TCTX main_thread_tctx = {0};
tctx_init_and_equip(&main_thread_tctx);
entry_point(argument_count, arguments);
return 0;
}
#endif
+5
View File
@@ -35,6 +35,11 @@ cons_root_new(CONS_RootParams *params){
result->scope_count += 1; result->scope_count += 1;
} }
// rjf: setup null UDT
{
cons__type_udt_from_any_type(result, result->nil_type);
}
// initialize maps // initialize maps
{ {
#define BKTCOUNT(x) ((x)?(u64_up_to_pow2(x)):(128)) #define BKTCOUNT(x) ((x)?(u64_up_to_pow2(x)):(128))
+10 -3
View File
@@ -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 // discard cases - we don't currently do anything with these
case CV_LeafKind_VFUNCTAB: 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 // unhandled or invalid cases
default: default:
@@ -1310,6 +1316,7 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){
case CV_LeafKind_STRUCTURE: case CV_LeafKind_STRUCTURE:
{ {
ProfBegin("CV_LeafKind_CLASS/CV_LeafKind_STRUCTURE"); ProfBegin("CV_LeafKind_CLASS/CV_LeafKind_STRUCTURE");
// TODO(allen): error if bad range // TODO(allen): error if bad range
if (sizeof(CV_LeafStruct) <= cap){ if (sizeof(CV_LeafStruct) <= cap){
CV_LeafStruct *lf_struct = (CV_LeafStruct*)first; CV_LeafStruct *lf_struct = (CV_LeafStruct*)first;
@@ -2935,7 +2942,7 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\
if (tpi != 0) ProfScope("parse tpi hash"){ if (tpi != 0) ProfScope("parse tpi hash"){
String8 hash_data = msf_data_from_stream(msf, tpi->hash_sn); String8 hash_data = msf_data_from_stream(msf, tpi->hash_sn);
String8 aux_data = msf_data_from_stream(msf, tpi->hash_sn_aux); String8 aux_data = msf_data_from_stream(msf, tpi->hash_sn_aux);
tpi_hash = pdb_tpi_hash_from_data(arena, tpi, hash_data, aux_data); tpi_hash = pdb_tpi_hash_from_data(arena, strtbl, tpi, hash_data, aux_data);
PARSE_CHECK_ERROR(tpi_hash, "TPI hash table"); PARSE_CHECK_ERROR(tpi_hash, "TPI hash table");
} }
@@ -2954,7 +2961,7 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\
if (ipi != 0) ProfScope("parse ipi hash"){ if (ipi != 0) ProfScope("parse ipi hash"){
String8 hash_data = msf_data_from_stream(msf, ipi->hash_sn); String8 hash_data = msf_data_from_stream(msf, ipi->hash_sn);
String8 aux_data = msf_data_from_stream(msf, ipi->hash_sn_aux); String8 aux_data = msf_data_from_stream(msf, ipi->hash_sn_aux);
ipi_hash = pdb_tpi_hash_from_data(arena, ipi, hash_data, aux_data); ipi_hash = pdb_tpi_hash_from_data(arena, strtbl, ipi, hash_data, aux_data);
PARSE_CHECK_ERROR(tpi_hash, "IPI hash table"); PARSE_CHECK_ERROR(tpi_hash, "IPI hash table");
} }
+79 -5
View File
@@ -303,7 +303,7 @@ pdb_tpi_from_data(Arena *arena, String8 data){
} }
static PDB_TpiHashParsed* static PDB_TpiHashParsed*
pdb_tpi_hash_from_data(Arena *arena, PDB_TpiParsed *tpi, String8 data, String8 aux_data){ pdb_tpi_hash_from_data(Arena *arena, PDB_Strtbl *strtbl, PDB_TpiParsed *tpi, String8 data, String8 aux_data){
ProfBegin("pdb_tpi_hash_from_data"); ProfBegin("pdb_tpi_hash_from_data");
PDB_TpiHashParsed *result = 0; PDB_TpiHashParsed *result = 0;
@@ -335,7 +335,11 @@ pdb_tpi_hash_from_data(Arena *arena, PDB_TpiParsed *tpi, String8 data, String8 a
block = push_array(arena, PDB_TpiHashBlock, 1); block = push_array(arena, PDB_TpiHashBlock, 1);
SLLStackPush(buckets[bucket_idx], block); SLLStackPush(buckets[bucket_idx], block);
} }
block->itypes[block->local_count] = itype; if(block->local_count != 0)
{
MemoryCopy(block->itypes+1, block->itypes, sizeof(CV_TypeId)*block->local_count);
}
block->itypes[0] = itype;
block->local_count += 1; block->local_count += 1;
} }
@@ -344,15 +348,85 @@ pdb_tpi_hash_from_data(Arena *arena, PDB_TpiParsed *tpi, String8 data, String8 a
itype += 1; itype += 1;
} }
//- rjf: compute bucket mask
U32 bucket_mask = 0;
if(IsPow2OrZero(bucket_count))
{
bucket_mask = bucket_count-1;
}
//- rjf: apply hash adjustments, to pull correct type IDs to the front of
// the chains
if(tpi->hash_adj_size != 0)
{
// NOTE(rjf): this table is laid out in the following format:
//
// pair_count: U32 -> # of name_index/type_index pairs
// slot_count: U32 -> # of slots in this hash table
// present_bit_array_count: U32 -> count for next array
// present_bit_array: U32[present_bit_array_count] -> 1 bit per slot, "is present"
// deleted_bit_array_count: U32 -> count for next array
// deleted_bit_array: U32[deleted_bit_array_count] -> 1 bit per slot, "is deleted"
// (U32, U32)[pair_count] -> array of name_index/type_index pairs
//
U8 *adjs = data.str + tpi->hash_adj_off;
U8 *adjs_opl = adjs + tpi->hash_adj_size;
U8 *adjs_cursor = adjs;
U32 pair_count = *(U32 *)adjs_cursor;
adjs_cursor += sizeof(U32);
U32 slot_count = *(U32 *)adjs_cursor;
adjs_cursor += sizeof(U32);
U32 present_bit_array_count = *(U32 *)adjs_cursor; // skip present_bit_array
adjs_cursor += sizeof(U32);
adjs_cursor += present_bit_array_count*sizeof(U32);
U32 deleted_bit_array_count = *(U32 *)adjs_cursor; // skip deleted_bit_array
adjs_cursor += sizeof(U32);
adjs_cursor += deleted_bit_array_count*sizeof(U32);
U32 adjs_stride = sizeof(U32)*2;
U32 pair_idx = 0;
for(;adjs_cursor < adjs_opl && pair_idx < pair_count;
adjs_cursor += adjs_stride, pair_idx += 1)
{
U32 name_off = ((U32 *)adjs_cursor)[0];
CV_TypeId type_id = ((CV_TypeId *)adjs_cursor)[1];
String8 string = pdb_strtbl_string_from_off(strtbl, name_off);
U32 hash = pdb_string_hash1(string);
U32 bucket_idx = ((bucket_mask != 0) ? hash&bucket_mask : hash%bucket_count);
PDB_TpiHashBlock *prev_block = 0;
for(PDB_TpiHashBlock *block = buckets[bucket_idx];
block != 0;
prev_block = block, block = block->next)
{
for(U32 local_idx = 0;
local_idx < block->local_count && local_idx < ArrayCount(block->itypes);
local_idx += 1)
{
if(block->itypes[local_idx] == type_id)
{
if(prev_block != 0)
{
prev_block->next = block->next;
block->next = buckets[bucket_idx];
buckets[bucket_idx] = block;
}
if(local_idx != 0)
{
Swap(CV_TypeId, block->itypes[0], block->itypes[local_idx]);
}
break;
}
}
}
}
}
// fill result // fill result
result = push_array(arena, PDB_TpiHashParsed, 1); result = push_array(arena, PDB_TpiHashParsed, 1);
result->data = data; result->data = data;
result->aux_data = aux_data; result->aux_data = aux_data;
result->buckets = buckets; result->buckets = buckets;
result->bucket_count = bucket_count; result->bucket_count = bucket_count;
if (IsPow2OrZero(bucket_count)){ result->bucket_mask = bucket_mask;
result->bucket_mask = bucket_count - 1;
}
} }
ProfEnd(); ProfEnd();
+1
View File
@@ -407,6 +407,7 @@ static PDB_Strtbl* pdb_strtbl_from_data(Arena *arena, String8 strtbl_da
static PDB_DbiParsed* pdb_dbi_from_data(Arena *arena, String8 dbi_data); static PDB_DbiParsed* pdb_dbi_from_data(Arena *arena, String8 dbi_data);
static PDB_TpiParsed* pdb_tpi_from_data(Arena *arena, String8 tpi_data); static PDB_TpiParsed* pdb_tpi_from_data(Arena *arena, String8 tpi_data);
static PDB_TpiHashParsed* pdb_tpi_hash_from_data(Arena *arena, static PDB_TpiHashParsed* pdb_tpi_hash_from_data(Arena *arena,
PDB_Strtbl *strtbl,
PDB_TpiParsed *tpi, PDB_TpiParsed *tpi,
String8 tpi_hash_data, String8 tpi_hash_data,
String8 tpi_hash_aux_data); String8 tpi_hash_aux_data);
@@ -190,6 +190,10 @@ str8_lit_comp(
" {\n" " {\n"
" border_sdf_t = 1;\n" " border_sdf_t = 1;\n"
" }\n" " }\n"
" if(border_sdf_t < 0.001f)\n"
" {\n"
" discard;\n"
" }\n"
" \n" " \n"
" // rjf: form+return final color\n" " // rjf: form+return final color\n"
" float4 final_color = albedo_sample;\n" " float4 final_color = albedo_sample;\n"
+72 -15
View File
@@ -131,7 +131,7 @@ r_d3d11_instance_buffer_from_size(U64 size)
//- rjf: top-level layer initialization //- rjf: top-level layer initialization
r_hook void r_hook void
r_init(void) r_init(CmdLine *cmdln)
{ {
ProfBeginFunction(); ProfBeginFunction();
HRESULT error = 0; HRESULT error = 0;
@@ -143,24 +143,57 @@ r_init(void)
//- rjf: create base device //- rjf: create base device
UINT creation_flags = D3D11_CREATE_DEVICE_BGRA_SUPPORT; UINT creation_flags = D3D11_CREATE_DEVICE_BGRA_SUPPORT;
#if !defined(NDEBUG) #if !defined(NDEBUG)
creation_flags |= D3D11_CREATE_DEVICE_DEBUG; if(!cmd_line_has_flag(cmdln, str8_lit("disable_d3d11_debug")))
{
creation_flags |= D3D11_CREATE_DEVICE_DEBUG;
}
#endif #endif
D3D_FEATURE_LEVEL feature_levels[] = { D3D_FEATURE_LEVEL_11_0 }; D3D_FEATURE_LEVEL feature_levels[] = { D3D_FEATURE_LEVEL_11_0 };
D3D_DRIVER_TYPE driver_type = D3D_DRIVER_TYPE_HARDWARE;
if(cmd_line_has_flag(cmdln, str8_lit("force_d3d11_software")))
{
driver_type = D3D_DRIVER_TYPE_WARP;
}
error = D3D11CreateDevice(0, error = D3D11CreateDevice(0,
D3D_DRIVER_TYPE_HARDWARE, driver_type,
0, 0,
creation_flags, creation_flags,
feature_levels, ArrayCount(feature_levels), feature_levels, ArrayCount(feature_levels),
D3D11_SDK_VERSION, D3D11_SDK_VERSION,
&r_d3d11_state->base_device, 0, &r_d3d11_state->base_device_ctx); &r_d3d11_state->base_device, 0, &r_d3d11_state->base_device_ctx);
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 (%lx). The process is terminating.", error);
os_graphical_message(1, str8_lit("Fatal Error"), str8_cstring(buffer));
os_exit_process(1);
}
//- rjf: enable break-on-error //- rjf: enable break-on-error
#if !defined(NDEBUG) #if !defined(NDEBUG)
ID3D11InfoQueue *info = 0; if(!cmd_line_has_flag(cmdln, str8_lit("disable_d3d11_debug")))
error = r_d3d11_state->base_device->QueryInterface(__uuidof(ID3D11InfoQueue), (void **)(&info)); {
error = info->SetBreakOnSeverity(D3D11_MESSAGE_SEVERITY_CORRUPTION, TRUE); ID3D11InfoQueue *info = 0;
error = info->SetBreakOnSeverity(D3D11_MESSAGE_SEVERITY_ERROR, TRUE); error = r_d3d11_state->base_device->QueryInterface(__uuidof(ID3D11InfoQueue), (void **)(&info));
info->Release(); if(SUCCEEDED(error))
{
error = info->SetBreakOnSeverity(D3D11_MESSAGE_SEVERITY_CORRUPTION, TRUE);
error = info->SetBreakOnSeverity(D3D11_MESSAGE_SEVERITY_ERROR, TRUE);
info->Release();
}
}
#endif #endif
//- rjf: get main device //- rjf: get main device
@@ -286,7 +319,7 @@ r_init(void)
&vshad_source_blob, &vshad_source_blob,
&vshad_source_errors); &vshad_source_errors);
String8 errors = {0}; String8 errors = {0};
if(vshad_source_errors) if(FAILED(error))
{ {
errors = str8((U8 *)vshad_source_errors->GetBufferPointer(), errors = str8((U8 *)vshad_source_errors->GetBufferPointer(),
(U64)vshad_source_errors->GetBufferSize()); (U64)vshad_source_errors->GetBufferSize());
@@ -307,6 +340,8 @@ r_init(void)
vshad_source_blob->GetBufferSize(), vshad_source_blob->GetBufferSize(),
&ilay); &ilay);
} }
vshad_source_blob->Release();
// rjf: store // rjf: store
r_d3d11_state->vshads[kind] = vshad; r_d3d11_state->vshads[kind] = vshad;
@@ -338,7 +373,7 @@ r_init(void)
&pshad_source_blob, &pshad_source_blob,
&pshad_source_errors); &pshad_source_errors);
String8 errors = {0}; String8 errors = {0};
if(pshad_source_errors) if(FAILED(error))
{ {
errors = str8((U8 *)pshad_source_errors->GetBufferPointer(), errors = str8((U8 *)pshad_source_errors->GetBufferPointer(),
(U64)pshad_source_errors->GetBufferSize()); (U64)pshad_source_errors->GetBufferSize());
@@ -349,6 +384,8 @@ r_init(void)
error = r_d3d11_state->device->CreatePixelShader(pshad_source_blob->GetBufferPointer(), pshad_source_blob->GetBufferSize(), 0, &pshad); error = r_d3d11_state->device->CreatePixelShader(pshad_source_blob->GetBufferPointer(), pshad_source_blob->GetBufferSize(), 0, &pshad);
} }
} }
pshad_source_blob->Release();
// rjf: store // rjf: store
r_d3d11_state->pshads[kind] = pshad; r_d3d11_state->pshads[kind] = pshad;
@@ -442,7 +479,14 @@ r_window_equip(OS_Handle handle)
swapchain_desc.AlphaMode = DXGI_ALPHA_MODE_UNSPECIFIED; swapchain_desc.AlphaMode = DXGI_ALPHA_MODE_UNSPECIFIED;
swapchain_desc.Flags = 0; 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 //- rjf: create framebuffer & view
window->swapchain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void **)(&window->framebuffer)); window->swapchain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void **)(&window->framebuffer));
@@ -531,9 +575,15 @@ r_tex2d_alloc(R_Tex2DKind kind, Vec2S32 size, R_Tex2DFormat format, void *data)
switch(format) switch(format)
{ {
default:{}break; default:{}break;
case R_Tex2DFormat_R8:{dxgi_format = DXGI_FORMAT_R8_UNORM;}break; case R_Tex2DFormat_R8: {dxgi_format = DXGI_FORMAT_R8_UNORM;}break;
case R_Tex2DFormat_RGBA8:{}break; case R_Tex2DFormat_RG8: {dxgi_format = DXGI_FORMAT_R8G8_UNORM;}break;
case R_Tex2DFormat_BGRA8:{dxgi_format = DXGI_FORMAT_B8G8R8A8_UNORM;}break; case R_Tex2DFormat_RGBA8: {dxgi_format = DXGI_FORMAT_R8G8B8A8_UNORM;}break;
case R_Tex2DFormat_BGRA8: {dxgi_format = DXGI_FORMAT_B8G8R8A8_UNORM;}break;
case R_Tex2DFormat_R16: {dxgi_format = DXGI_FORMAT_R16_UNORM;}break;
case R_Tex2DFormat_RGBA16:{dxgi_format = DXGI_FORMAT_R16G16B16A16_UNORM;}break;
case R_Tex2DFormat_R32: {dxgi_format = DXGI_FORMAT_R32_FLOAT;}break;
case R_Tex2DFormat_RG32: {dxgi_format = DXGI_FORMAT_R32G32_FLOAT;}break;
case R_Tex2DFormat_RGBA32:{dxgi_format = DXGI_FORMAT_R32G32B32A32_FLOAT;}break;
} }
} }
@@ -944,7 +994,14 @@ r_window_end_frame(OS_Handle window, R_Handle window_equip)
//////////////////////////// ////////////////////////////
//- rjf: present //- 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(); d_ctx->ClearState();
} }
ProfEnd(); ProfEnd();
@@ -189,6 +189,10 @@ ps_main(Vertex2Pixel vertex2pixel) : SV_TARGET
{ {
border_sdf_t = 1; border_sdf_t = 1;
} }
if(border_sdf_t < 0.001f)
{
discard;
}
// rjf: form+return final color // rjf: form+return final color
float4 final_color = albedo_sample; float4 final_color = albedo_sample;
+18
View File
@@ -9,8 +9,14 @@
typedef enum R_Tex2DFormat typedef enum R_Tex2DFormat
{ {
R_Tex2DFormat_R8, R_Tex2DFormat_R8,
R_Tex2DFormat_RG8,
R_Tex2DFormat_RGBA8, R_Tex2DFormat_RGBA8,
R_Tex2DFormat_BGRA8, R_Tex2DFormat_BGRA8,
R_Tex2DFormat_R16,
R_Tex2DFormat_RGBA16,
R_Tex2DFormat_R32,
R_Tex2DFormat_RG32,
R_Tex2DFormat_RGBA32,
R_Tex2DFormat_COUNT R_Tex2DFormat_COUNT
} R_Tex2DFormat; } R_Tex2DFormat;
@@ -55,15 +61,27 @@ R_PassKind_COUNT
String8 r_tex2d_format_display_string_table[] = String8 r_tex2d_format_display_string_table[] =
{ {
str8_lit_comp("R8"), str8_lit_comp("R8"),
str8_lit_comp("RG8"),
str8_lit_comp("RGBA8"), str8_lit_comp("RGBA8"),
str8_lit_comp("BGRA8"), str8_lit_comp("BGRA8"),
str8_lit_comp("R16"),
str8_lit_comp("RGBA16"),
str8_lit_comp("R32"),
str8_lit_comp("RG32"),
str8_lit_comp("RGBA32"),
}; };
U8 r_tex2d_format_bytes_per_pixel_table[] = U8 r_tex2d_format_bytes_per_pixel_table[] =
{ {
1, 1,
2,
4, 4,
4, 4,
2,
8,
4,
8,
16,
}; };
String8 r_tex2d_kind_display_string_table[] = String8 r_tex2d_kind_display_string_table[] =
+1 -1
View File
@@ -269,7 +269,7 @@ internal R_Pass *r_pass_from_kind(Arena *arena, R_PassList *list, R_PassKind kin
//~ rjf: Backend Hooks //~ rjf: Backend Hooks
//- rjf: top-level layer initialization //- rjf: top-level layer initialization
r_hook void r_init(void); r_hook void r_init(CmdLine *cmdln);
//- rjf: window setup/teardown //- rjf: window setup/teardown
r_hook R_Handle r_window_equip(OS_Handle window); r_hook R_Handle r_window_equip(OS_Handle window);
@@ -8,8 +8,14 @@
R_Tex2DFormatTable: R_Tex2DFormatTable:
{ {
{R8 "R8" 1} {R8 "R8" 1}
{RG8 "RG8" 2}
{RGBA8 "RGBA8" 4} {RGBA8 "RGBA8" 4}
{BGRA8 "BGRA8" 4} {BGRA8 "BGRA8" 4}
{R16 "R16" 2}
{RGBA16 "RGBA16" 8}
{R32 "R32" 4}
{RG32 "RG32" 8}
{RGBA32 "RGBA32" 16}
} }
@table(name, display_string) @table(name, display_string)
+3 -1
View File
@@ -4,7 +4,9 @@
#include "render_core.c" #include "render_core.c"
#if LANG_CPP #if LANG_CPP
# if R_BACKEND == R_BACKEND_D3D11 # if R_BACKEND == R_BACKEND_STUB
# include "stub/render_stub.c"
# elif R_BACKEND == R_BACKEND_D3D11
# include "d3d11/render_d3d11.cpp" # include "d3d11/render_d3d11.cpp"
# else # else
# error Renderer backend not specified. # error Renderer backend not specified.
+4 -1
View File
@@ -7,6 +7,7 @@
//////////////////////////////// ////////////////////////////////
//~ rjf: Backend Constants //~ rjf: Backend Constants
#define R_BACKEND_STUB 0
#define R_BACKEND_D3D11 1 #define R_BACKEND_D3D11 1
//////////////////////////////// ////////////////////////////////
@@ -25,7 +26,9 @@
//~ rjf: Backend Includes //~ rjf: Backend Includes
#if LANG_CPP #if LANG_CPP
# if R_BACKEND == R_BACKEND_D3D11 # if R_BACKEND == R_BACKEND_STUB
# include "stub/render_stub.h"
# elif R_BACKEND == R_BACKEND_D3D11
# include "d3d11/render_d3d11.h" # include "d3d11/render_d3d11.h"
# else # else
# error Renderer backend not specified. # error Renderer backend not specified.
+106
View File
@@ -0,0 +1,106 @@
// Copyright (c) 2024 Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
//- rjf: top-level layer initialization
r_hook void
r_init(CmdLine *cmdln)
{
}
//- rjf: window setup/teardown
r_hook R_Handle
r_window_equip(OS_Handle window)
{
R_Handle handle = {0};
handle.u64[0] = 1;
return handle;
}
r_hook void
r_window_unequip(OS_Handle window, R_Handle window_equip)
{
}
//- rjf: textures
r_hook R_Handle
r_tex2d_alloc(R_Tex2DKind kind, Vec2S32 size, R_Tex2DFormat format, void *data)
{
R_Handle handle = {0};
handle.u64[0] = 1;
return handle;
}
r_hook void
r_tex2d_release(R_Handle texture)
{
}
r_hook R_Tex2DKind
r_kind_from_tex2d(R_Handle texture)
{
return R_Tex2DKind_Static;
}
r_hook Vec2S32
r_size_from_tex2d(R_Handle texture)
{
return v2s32(1, 1);
}
r_hook R_Tex2DFormat
r_format_from_tex2d(R_Handle texture)
{
return R_Tex2DFormat_RGBA8;
}
r_hook void
r_fill_tex2d_region(R_Handle texture, Rng2S32 subrect, void *data)
{
}
//- rjf: buffers
r_hook R_Handle
r_buffer_alloc(R_BufferKind kind, U64 size, void *data)
{
R_Handle handle = {0};
handle.u64[0] = 1;
return handle;
}
r_hook void
r_buffer_release(R_Handle buffer)
{
}
//- rjf: frame markers
r_hook void
r_begin_frame(void)
{
}
r_hook void
r_end_frame(void)
{
}
r_hook void
r_window_begin_frame(OS_Handle window, R_Handle window_equip)
{
}
r_hook void
r_window_end_frame(OS_Handle window, R_Handle window_equip)
{
}
//- rjf: render pass submission
r_hook void
r_window_submit(OS_Handle window, R_Handle window_equip, R_PassList *passes)
{
}
+7
View File
@@ -0,0 +1,7 @@
// Copyright (c) 2024 Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
#ifndef RENDER_STUB_H
#define RENDER_STUB_H
#endif // RENDER_STUB_H
+20
View File
@@ -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;
}
+37 -295
View File
@@ -1,307 +1,49 @@
// Copyright (c) 2024 Epic Games Tools // Copyright (c) 2024 Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/) // Licensed under the MIT license (https://opensource.org/license/mit/)
#include "base/base_inc.h" // build with:
#include "os/os_inc.h" // cl /Zi /nologo look_at_raddbg.c
#include "mdesk/mdesk.h"
#include "base/base_inc.c" #include <windows.h>
#include "os/os_inc.c" #include <stdint.h>
#include "mdesk/mdesk.c" #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 enum MG_StrExprOpKind typedef struct Foo Foo;
struct Foo
{ {
MG_StrExprOpKind_Null, int x;
MG_StrExprOpKind_Prefix, int y;
MG_StrExprOpKind_Postfix, int z;
MG_StrExprOpKind_Binary,
MG_StrExprOpKind_COUNT
}
MG_StrExprOpKind;
typedef enum MG_StrExprOp
{
MG_StrExprOp_Null,
#define MG_StrExprOp_FirstString MG_StrExprOp_Dot
MG_StrExprOp_Dot,
MG_StrExprOp_ExpandIfTrue,
MG_StrExprOp_Concat,
MG_StrExprOp_BumpToColumn,
#define MG_StrExprOp_LastString MG_StrExprOp_BumpToColumn
#define MG_StrExprOp_FirstNumeric MG_StrExprOp_Add
MG_StrExprOp_Add,
MG_StrExprOp_Subtract,
MG_StrExprOp_Multiply,
MG_StrExprOp_Divide,
MG_StrExprOp_Modulo,
MG_StrExprOp_LeftShift,
MG_StrExprOp_RightShift,
MG_StrExprOp_BitwiseAnd,
MG_StrExprOp_BitwiseOr,
MG_StrExprOp_BitwiseXor,
MG_StrExprOp_BitwiseNegate,
MG_StrExprOp_BooleanAnd,
MG_StrExprOp_BooleanOr,
MG_StrExprOp_BooleanNot,
MG_StrExprOp_Equals,
MG_StrExprOp_DoesNotEqual,
#define MG_StrExprOp_LastNumeric MG_StrExprOp_DoesNotEqual
MG_StrExprOp_COUNT,
}
MG_StrExprOp;
read_only global String8 mg_str_expr_op_symbol_string_table[MG_StrExprOp_COUNT] =
{
str8_lit_comp(""),
str8_lit_comp("."), // MG_StrExprOp_Dot
str8_lit_comp("->"), // MG_StrExprOp_ExpandIfTrue
str8_lit_comp(".."), // MG_StrExprOp_Concat
str8_lit_comp("=>"), // MG_StrExprOp_BumpToColumn
str8_lit_comp("+"), // MG_StrExprOp_Add
str8_lit_comp("-"), // MG_StrExprOp_Subtract
str8_lit_comp("*"), // MG_StrExprOp_Multiply
str8_lit_comp("/"), // MG_StrExprOp_Divide
str8_lit_comp("%"), // MG_StrExprOp_Modulo
str8_lit_comp("<<"), // MG_StrExprOp_LeftShift
str8_lit_comp(">>"), // MG_StrExprOp_RightShift
str8_lit_comp("&"), // MG_StrExprOp_BitwiseAnd
str8_lit_comp("|"), // MG_StrExprOp_BitwiseOr
str8_lit_comp("^"), // MG_StrExprOp_BitwiseXor
str8_lit_comp("~"), // MG_StrExprOp_BitwiseNegate
str8_lit_comp("&&"), // MG_StrExprOp_BooleanAnd
str8_lit_comp("||"), // MG_StrExprOp_BooleanOr
str8_lit_comp("!"), // MG_StrExprOp_BooleanNot
str8_lit_comp("=="), // MG_StrExprOp_Equals
str8_lit_comp("!="), // MG_StrExprOp_DoesNotEqual
}; };
read_only global S8 mg_str_expr_op_precedence_table[MG_StrExprOp_COUNT] =
{
0,
20, // MG_StrExprOp_Dot
1, // MG_StrExprOp_ExpandIfTrue
2, // MG_StrExprOp_Concat
12, // MG_StrExprOp_BumpToColumn
5, // MG_StrExprOp_Add
5, // MG_StrExprOp_Subtract
6, // MG_StrExprOp_Multiply
6, // MG_StrExprOp_Divide
6, // MG_StrExprOp_Modulo
7, // MG_StrExprOp_LeftShift
7, // MG_StrExprOp_RightShift
8, // MG_StrExprOp_BitwiseAnd
10, // MG_StrExprOp_BitwiseOr
9, // MG_StrExprOp_BitwiseXor
11, // MG_StrExprOp_BitwiseNegate
3, // MG_StrExprOp_BooleanAnd
3, // MG_StrExprOp_BooleanOr
11, // MG_StrExprOp_BooleanNot
4, // MG_StrExprOp_Equals
4, // MG_StrExprOp_DoesNotEqual
};
read_only global MG_StrExprOpKind mg_str_expr_op_kind_table[MG_StrExprOp_COUNT] =
{
MG_StrExprOpKind_Null,
MG_StrExprOpKind_Binary, // MG_StrExprOp_Dot
MG_StrExprOpKind_Binary, // MG_StrExprOp_ExpandIfTrue
MG_StrExprOpKind_Binary, // MG_StrExprOp_Concat
MG_StrExprOpKind_Prefix, // MG_StrExprOp_BumpToColumn
MG_StrExprOpKind_Binary, // MG_StrExprOp_Add
MG_StrExprOpKind_Binary, // MG_StrExprOp_Subtract
MG_StrExprOpKind_Binary, // MG_StrExprOp_Multiply
MG_StrExprOpKind_Binary, // MG_StrExprOp_Divide
MG_StrExprOpKind_Binary, // MG_StrExprOp_Modulo
MG_StrExprOpKind_Binary, // MG_StrExprOp_LeftShift
MG_StrExprOpKind_Binary, // MG_StrExprOp_RightShift
MG_StrExprOpKind_Binary, // MG_StrExprOp_BitwiseAnd
MG_StrExprOpKind_Binary, // MG_StrExprOp_BitwiseOr
MG_StrExprOpKind_Binary, // MG_StrExprOp_BitwiseXor
MG_StrExprOpKind_Prefix, // MG_StrExprOp_BitwiseNegate
MG_StrExprOpKind_Binary, // MG_StrExprOp_BooleanAnd
MG_StrExprOpKind_Binary, // MG_StrExprOp_BooleanOr
MG_StrExprOpKind_Prefix, // MG_StrExprOp_BooleanNot
MG_StrExprOpKind_Binary, // MG_StrExprOp_Equals
MG_StrExprOpKind_Binary, // MG_StrExprOp_DoesNotEqual
};
typedef struct MG_StrExpr MG_StrExpr;
struct MG_StrExpr
{
MG_StrExpr *parent;
MG_StrExpr *left;
MG_StrExpr *right;
MG_StrExprOp op;
MD_Node *node;
};
typedef struct MG_StrExprParseResult MG_StrExprParseResult;
struct MG_StrExprParseResult
{
MG_StrExpr *root;
MD_MsgList msgs;
MD_Node *next_node;
};
global MG_StrExpr mg_str_expr_nil = {&mg_str_expr_nil, &mg_str_expr_nil, &mg_str_expr_nil};
internal MG_StrExpr *
mg_push_str_expr(Arena *arena, MG_StrExprOp op, MD_Node *node)
{
MG_StrExpr *expr = push_array(arena, MG_StrExpr, 1);
MemoryCopyStruct(expr, &mg_str_expr_nil);
expr->op = op;
expr->node = node;
return expr;
}
internal MG_StrExprParseResult
mg_str_expr_parse_from_first_opl__min_prec(Arena *arena, MD_Node *first, MD_Node *opl, S8 min_prec)
{
MG_StrExprParseResult parse = {&mg_str_expr_nil};
{
MD_Node *it = first;
//- rjf: consume prefix operators
MG_StrExpr *leafmost_op = &mg_str_expr_nil;
for(;it < opl && !md_node_is_nil(it);)
{
MG_StrExprOp found_op = MG_StrExprOp_Null;
for(MG_StrExprOp op = (MG_StrExprOp)(MG_StrExprOp_Null+1);
op < MG_StrExprOp_COUNT;
op = (MG_StrExprOp)(op+1))
{
if(mg_str_expr_op_kind_table[op] == MG_StrExprOpKind_Prefix &&
str8_match(it->string, mg_str_expr_op_symbol_string_table[op], 0) &&
mg_str_expr_op_precedence_table[op] >= min_prec)
{
found_op = op;
break;
}
}
if(found_op != MG_StrExprOp_Null)
{
MG_StrExpr *op_expr = mg_push_str_expr(arena, found_op, it);
if(leafmost_op == &mg_str_expr_nil)
{
leafmost_op = op_expr;
}
op_expr->left = parse.root;
parse.root = op_expr;
it = it->next;
}
else
{
break;
}
}
//- rjf: parse atom
{
MG_StrExpr *atom = &mg_str_expr_nil;
if(it->flags & MD_NodeFlag_Identifier|MD_NodeFlag_Numeric|MD_NodeFlag_StringLiteral &&
md_node_is_nil(it->first))
{
atom = mg_push_str_expr(arena, MG_StrExprOp_Null, it);
it = it->next;
}
else if(!md_node_is_nil(it->first))
{
MG_StrExprParseResult subparse = mg_str_expr_parse_from_first_opl__min_prec(arena, it->first, &md_nil_node, 0);
atom = subparse.root;
md_msg_list_concat_in_place(&parse.msgs, &subparse.msgs);
it = it->next;
}
if(leafmost_op != &mg_str_expr_nil)
{
leafmost_op->left = atom;
}
else
{
parse.root = atom;
}
}
//- rjf: parse binary operator extensions at this precedence level
for(;it < opl && !md_node_is_nil(it);)
{
// rjf: find binary op kind of `it`
MG_StrExprOp found_op = MG_StrExprOp_Null;
for(MG_StrExprOp op = (MG_StrExprOp)(MG_StrExprOp_Null+1);
op < MG_StrExprOp_COUNT;
op = (MG_StrExprOp)(op+1))
{
if(mg_str_expr_op_kind_table[op] == MG_StrExprOpKind_Binary &&
str8_match(it->string, mg_str_expr_op_symbol_string_table[op], 0) &&
mg_str_expr_op_precedence_table[op] >= min_prec)
{
found_op = op;
break;
}
}
// rjf: good found_op -> build binary expr
if(found_op != MG_StrExprOp_Null)
{
MG_StrExpr *op_expr = mg_push_str_expr(arena, found_op, it);
if(leafmost_op == &mg_str_expr_nil)
{
leafmost_op = op_expr;
}
op_expr->left = parse.root;
parse.root = op_expr;
it = it->next;
}
else
{
break;
}
// rjf: parse right hand side of binary operator
MG_StrExprParseResult subparse = mg_str_expr_parse_from_first_opl__min_prec(arena, it, opl, mg_str_expr_op_precedence_table[found_op]+1);
parse.root->right = subparse.root;
md_msg_list_concat_in_place(&parse.msgs, &subparse.msgs);
if(subparse.root == &mg_str_expr_nil)
{
md_msg_list_pushf(arena, &parse.msgs, it, MD_MsgKind_Error, "Missing right-hand-side of '%S'.", mg_str_expr_op_symbol_string_table[found_op]);
}
it = subparse.next_node;
}
// rjf: store next node for more caller-side parsing
parse.next_node = it;
}
return parse;
}
internal MG_StrExprParseResult
mg_str_expr_parse_from_first_opl(Arena *arena, MD_Node *first, MD_Node *opl)
{
MG_StrExprParseResult parse = mg_str_expr_parse_from_first_opl__min_prec(arena, first, opl, 0);
return parse;
}
internal MG_StrExprParseResult
mg_str_expr_parse_from_root(Arena *arena, MD_Node *root)
{
MG_StrExprParseResult parse = mg_str_expr_parse_from_first_opl__min_prec(arena, root->first, &md_nil_node, 0);
return parse;
}
int main(int argument_count, char **arguments) int main(int argument_count, char **arguments)
{ {
static TCTX main_thread_tctx = {0}; Foo foo = {123, 456, 789};
tctx_init_and_equip(&main_thread_tctx); HANDLE file = CreateFileA(arguments[1], GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
os_init(argument_count, arguments); DWORD size_hi32 = 0;
DWORD size_lo32 = GetFileSize(file, &size_hi32);
Arena *arena = arena_alloc(); HANDLE map = CreateFileMappingA(file, 0, PAGE_READONLY, 0, 0, 0);
String8 text = str8_lit("(a.vr == \"x\" -> \"DF_GFX_VIEW_RULE_VIZ_ROW_PROD_FUNCTION_DEF(\" .. a.name_lower .. \");\")"); uint64_t data_size = (size_lo32 | ((uint64_t)size_hi32 << 32));
MD_TokenizeResult tokenize = md_tokenize_from_text(arena, text); uint8_t *data = (uint8_t *)MapViewOfFile(map, FILE_MAP_READ, 0, 0, data_size);
MD_ParseResult base_parse = md_parse_from_text_tokens(arena, str8_lit(""), text, tokenize.tokens); RADDBG_Parsed rdbg = {0};
MG_StrExprParseResult strexpr_parse = mg_str_expr_parse_from_root(arena, base_parse.root->first); 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;
}
}
}
printf("%s -> %I64u foos\n", arguments[1], foo_count);
return 0; return 0;
} }
+178 -149
View File
@@ -923,6 +923,15 @@ txti_append(TXTI_Handle handle, String8 string)
os_condition_variable_broadcast(mut_thread->msg_cv); 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 //~ 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]; TXTI_Stripe *stripe = &txti_state->entity_map_stripes.v[stripe_idx];
//- rjf: load file if we need it //- rjf: load file if we need it
B32 load_valid = 0;
String8 file_contents = {0}; String8 file_contents = {0};
TXTI_LangKind lang_kind = TXTI_LangKind_Null; TXTI_LangKind lang_kind = TXTI_LangKind_Null;
U64 timestamp = 0; U64 timestamp = 0;
if(msg->kind == TXTI_MsgKind_Reload) if(msg->kind == TXTI_MsgKind_Reload)
{ {
OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_Shared, msg->string); FileProperties pre_load_props = os_properties_from_file_path(msg->string);
FileProperties props = os_properties_from_file(file); OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead|OS_AccessFlag_ShareWrite, msg->string);
timestamp = props.modified; file_contents = os_string_from_file_range(scratch.arena, file, r1u64(0, pre_load_props.size));
file_contents = os_string_from_file_range(scratch.arena, file, r1u64(0, props.size));
lang_kind = txti_lang_kind_from_extension(str8_skip_last_dot(msg->string)); lang_kind = txti_lang_kind_from_extension(str8_skip_last_dot(msg->string));
os_file_close(file); 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 //- rjf: nonzero lang kind -> unpack lang info
@@ -994,6 +1009,7 @@ txti_mut_thread_entry_point(void *p)
//- rjf: detect line end kind //- rjf: detect line end kind
TXTI_LineEndKind line_end_kind = TXTI_LineEndKind_Null; TXTI_LineEndKind line_end_kind = TXTI_LineEndKind_Null;
if(load_valid)
{ {
U64 lf_count = 0; U64 lf_count = 0;
U64 cr_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 //- rjf: obtain initial buffer_apply_gen, reset byte processing counters
U64 initial_buffer_apply_gen = 0; U64 initial_buffer_apply_gen = 0;
OS_MutexScopeR(stripe->rw_mutex) if(load_valid) OS_MutexScopeR(stripe->rw_mutex)
{ {
TXTI_Entity *entity = 0; TXTI_Entity *entity = 0;
for(TXTI_Entity *e = slot->first; e != 0; e = e->next) for(TXTI_Entity *e = slot->first; e != 0; e = e->next)
@@ -1043,16 +1059,56 @@ txti_mut_thread_entry_point(void *p)
} }
//- rjf: apply edits //- rjf: apply edits
for(U64 buffer_apply_idx = 0; if(load_valid)
buffer_apply_idx < TXTI_ENTITY_BUFFER_COUNT;
buffer_apply_idx += 1)
{ {
// rjf: last buffer we're going to edit? -> bump buffer_apply_gen, for(U64 buffer_apply_idx = 0;
// so that before we touch this last buffer, all readers of this buffer_apply_idx < TXTI_ENTITY_BUFFER_COUNT;
// entity will get the already-modified buffers. buffer_apply_idx += 1)
if(buffer_apply_idx == TXTI_ENTITY_BUFFER_COUNT-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; TXTI_Entity *entity = 0;
for(TXTI_Entity *e = slot->first; e != 0; e = e->next) for(TXTI_Entity *e = slot->first; e != 0; e = e->next)
@@ -1065,140 +1121,110 @@ txti_mut_thread_entry_point(void *p)
} }
if(entity != 0) if(entity != 0)
{ {
entity->buffer_apply_gen += 1; TXTI_Buffer *buffer = &entity->buffers[(initial_buffer_apply_gen+1+buffer_apply_idx)%TXTI_ENTITY_BUFFER_COUNT];
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;
// rjf: replace range // rjf: clear old analysis data
case TXTI_MsgKind_Append: ProfScope("append") arena_clear(buffer->analysis_arena);
{ buffer->lines_count = 0;
U8 *append_data_buffer = push_array_no_zero(buffer->data_arena, U8, msg->string.size); buffer->lines_ranges = 0;
MemoryCopy(append_data_buffer, msg->string.str, msg->string.size); buffer->lines_max_size = 0;
buffer->data.size += msg->string.size; MemoryZeroStruct(&buffer->tokens);
if(buffer->data.str == 0)
{
buffer->data.str = append_data_buffer;
}
}break;
// rjf: reload from disk // rjf: perform edit to buffer data
case TXTI_MsgKind_Reload: ProfScope("reload") switch(msg->kind)
{ {
arena_clear(buffer->data_arena); default:{}break;
buffer->data = push_str8_copy(buffer->data_arena, file_contents);
}break; // rjf: replace range
} case TXTI_MsgKind_Append: ProfScope("append")
// 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)); U8 *append_data_buffer = push_array_no_zero(buffer->data_arena, U8, msg->string.size);
byte_process_start_idx = idx; MemoryCopy(append_data_buffer, msg->string.str, msg->string.size);
} buffer->data.size += msg->string.size;
if(buffer->data.str[idx] == '\n' || buffer->data.str[idx] == '\r') if(buffer->data.str == 0 && msg->string.size != 0)
{
line_count += 1;
if(buffer->data.str[idx] == '\r')
{ {
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 // rjf: lex file contents
buffer->lines_count = line_count; if(lex_function != 0)
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') buffer->tokens = lex_function(buffer->analysis_arena, buffer_apply_idx == 0 ? &entity->bytes_processed : 0, buffer->data);
{ }
Rng1U64 line_range = r1u64(line_start_idx, idx);
U64 line_size = dim_1u64(line_range); // rjf: mark final process counter
buffer->lines_ranges[line_idx] = line_range; if(buffer_apply_idx == 0)
buffer->lines_max_size = Max(buffer->lines_max_size, line_size); {
line_idx += 1; ins_atomic_u64_eval_assign(&entity->bytes_processed, entity->bytes_to_process);
line_start_idx = idx+1; }
if(idx < buffer->data.size && buffer->data.str[idx] == '\r')
{ // rjf: mark task completion
line_start_idx += 1; if(buffer_apply_idx == TXTI_ENTITY_BUFFER_COUNT-1)
idx += 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 +1247,26 @@ txti_detector_thread_entry_point(void *p)
ProfThreadName("[txti] detector"); ProfThreadName("[txti] detector");
for(;;) for(;;)
{ {
U64 slots_per_stripe = txti_state->entity_map.slots_count/txti_state->entity_map_stripes.count; if(ins_atomic_u64_eval(&txti_state->detector_thread_enabled))
for(U64 stripe_idx = 0; stripe_idx < txti_state->entity_map_stripes.count; stripe_idx += 1)
{ {
TXTI_Stripe *stripe = &txti_state->entity_map_stripes.v[stripe_idx]; U64 slots_per_stripe = txti_state->entity_map.slots_count/txti_state->entity_map_stripes.count;
OS_MutexScopeR(stripe->rw_mutex) for(U64 slot_in_stripe_idx = 0; slot_in_stripe_idx < slots_per_stripe; slot_in_stripe_idx += 1) 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_Stripe *stripe = &txti_state->entity_map_stripes.v[stripe_idx];
TXTI_EntitySlot *slot = &txti_state->entity_map.slots[slot_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)
for(TXTI_Entity *entity = slot->first; entity != 0; entity = entity->next)
{ {
FileProperties props = os_properties_from_file_path(entity->path); U64 slot_idx = stripe_idx*slots_per_stripe + slot_in_stripe_idx;
U64 entity_timestamp = entity->timestamp; TXTI_EntitySlot *slot = &txti_state->entity_map.slots[slot_idx];
if(props.modified != entity_timestamp && ins_atomic_u64_eval(&entity->working_count) == 0) for(TXTI_Entity *entity = slot->first; entity != 0; entity = entity->next)
{ {
TXTI_Handle handle = {txti_hash_from_string(entity->path), entity->id}; FileProperties props = os_properties_from_file_path(entity->path);
txti_reload(handle, entity->path); U64 entity_timestamp = entity->timestamp;
ins_atomic_u64_inc_eval(&entity->working_count); 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);
}
} }
} }
} }
+4
View File
@@ -322,6 +322,7 @@ struct TXTI_State
TXTI_MutThread *mut_threads; TXTI_MutThread *mut_threads;
// rjf: detector thread // rjf: detector thread
U64 detector_thread_enabled;
OS_Handle detector_thread; 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_reload(TXTI_Handle handle, String8 path);
internal void txti_append(TXTI_Handle handle, String8 string); 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 //~ rjf: Mutator Threads
+94 -22
View File
@@ -15,6 +15,41 @@ tg_hash_from_string(U64 seed, String8 string)
return result; 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 //~ rjf: RADDBG <-> TG Enum Conversions
@@ -318,7 +353,7 @@ tg_type_from_graph_raddbg_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg
RADDBG_UDT *udt = &rdbg->udts[udt_idx]; RADDBG_UDT *udt = &rdbg->udts[udt_idx];
members_count = udt->member_count; members_count = udt->member_count;
members = push_array(arena, TG_Member, members_count); members = push_array(arena, TG_Member, members_count);
if(0 <= udt->member_first && udt->member_first+udt->member_count < rdbg->member_count) if(members_count != 0 && 0 <= udt->member_first && udt->member_first+udt->member_count <= rdbg->member_count)
{ {
for(U32 member_idx = udt->member_first; for(U32 member_idx = udt->member_first;
member_idx < udt->member_first+udt->member_count; member_idx < udt->member_first+udt->member_count;
@@ -742,7 +777,7 @@ tg_type_from_graph_raddbg_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg
// rjf: commit members // rjf: commit members
type->count = members.count; 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; U64 idx = 0;
for(TG_MemberNode *n = members.first; n != 0; n = n->next, idx += 1) for(TG_MemberNode *n = members.first; n != 0; n = n->next, idx += 1)
{ {
@@ -912,36 +947,73 @@ tg_members_from_graph_raddbg_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *r
internal TG_MemberArray internal TG_MemberArray
tg_data_members_from_graph_raddbg_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key) 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); 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); TG_Type *root_type = tg_type_from_graph_raddbg_key(scratch.arena, graph, rdbg, key);
if(type->members != 0) typedef struct Task Task;
struct Task
{ {
U64 data_member_count = 0; Task *next;
for(U64 member_idx = 0; member_idx < type->count; member_idx += 1) 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; if(type->members[member_idx].kind == TG_MemberKind_DataField)
} {
} TG_MemberNode *n = push_array(scratch.arena, TG_MemberNode, 1);
result.count = data_member_count; MemoryCopyStruct(&n->v, &type->members[member_idx]);
result.v = push_array_no_zero(arena, TG_Member, result.count); n->v.off += task->base_off;
U64 idx = 0; n->v.inheritance_key_chain = task->inheritance_chain;
for(U64 member_idx = 0; member_idx < type->count; member_idx += 1) SLLQueuePush(members_list.first, members_list.last, n);
{ members_list.count += 1;
if(type->members[member_idx].kind == TG_MemberKind_DataField) }
{ else if(type->members[member_idx].kind == TG_MemberKind_Base)
MemoryCopyStruct(&result.v[idx], &type->members[member_idx]); {
result.v[idx].name = push_str8_copy(arena, result.v[idx].name); Task *t = push_array(scratch.arena, Task, 1);
idx += 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); scratch_end(scratch);
return result; return members;
} }
internal void internal void
+19
View File
@@ -31,6 +31,21 @@ struct TG_Key
U64 u64[1]; // ext -> unique id; cons -> idx; reg -> code 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 //~ rjf: Graph Types
@@ -102,6 +117,7 @@ struct TG_Member
TG_Key type_key; TG_Key type_key;
String8 name; String8 name;
U64 off; U64 off;
TG_KeyList inheritance_key_chain;
}; };
typedef struct TG_MemberNode TG_MemberNode; typedef struct TG_MemberNode TG_MemberNode;
@@ -179,6 +195,9 @@ thread_static Arena *tg_build_arena = 0;
//~ rjf: Basic Helpers //~ rjf: Basic Helpers
internal U64 tg_hash_from_string(U64 seed, String8 string); 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 //~ rjf: RADDBG <-> TG Enum Conversions
View File
+22 -15
View File
@@ -115,11 +115,10 @@ ui_nav_eat_action_node(UI_NavActionList *list, UI_NavActionNode *node)
//////////////////////////////// ////////////////////////////////
//~ rjf: High Level Navigation Action => Text Operations //~ rjf: High Level Navigation Action => Text Operations
internal B32 internal B32
ui_nav_char_is_scan_boundary(U8 c) ui_nav_char_is_code_symbol(U8 c)
{ {
return char_is_space(c) || char_is_slash(c); return (char_is_alpha(c) || char_is_digit(c, 10) || c == '_');
} }
internal S64 internal S64
@@ -127,20 +126,26 @@ ui_nav_scanned_column_from_column(String8 string, S64 start_column, Side side)
{ {
S64 new_column = start_column; S64 new_column = start_column;
S64 delta = (!!side)*2 - 1; S64 delta = (!!side)*2 - 1;
B32 found_boundary = 0; B32 found_text = 0;
for(S64 col = start_column+delta; 1 <= col && col <= string.size+1; col += delta) B32 found_non_space = 0;
S64 start_off = delta < 0 ? delta : 0;
for(S64 col = start_column+start_off; 1 <= col && col <= string.size+1; col += delta)
{ {
U8 byte = (col <= string.size) ? string.str[col-1] : 0; U8 byte = (col <= string.size) ? string.str[col-1] : 0;
B32 is_boundary = (ui_nav_char_is_scan_boundary(byte) ^ !(side == Side_Max)); B32 is_non_space = !char_is_space(byte);
if((found_boundary && !is_boundary) || B32 is_name = ui_nav_char_is_code_symbol(byte);
(col == 1 || col == string.size+1))
if (((side == Side_Min) && (col == 1)) ||
((side == Side_Max) && (col == string.size+1)) ||
(found_non_space && !is_non_space) ||
(found_text && !is_name))
{ {
new_column = col + (!side && col != 1); new_column = col + (!side && col != 1);
break; break;
} } else if (!found_text && is_name) {
else if(!found_boundary && is_boundary) found_text = 1;
{ } else if (!found_non_space && is_non_space ) {
found_boundary = 1; found_non_space = 1;
} }
} }
return new_column; return new_column;
@@ -2568,8 +2573,10 @@ ui_signal_from_box(UI_Box *box)
} }
//- rjf: set hovering status //- rjf: set hovering status
result.hovering = mouse_is_over && (ui_key_match(ui_state->active_box_key[Side_Min], ui_key_zero()) || result.hovering = mouse_is_over && ((ui_key_match(ui_state->hot_box_key, ui_key_zero()) ||
ui_key_match(ui_state->active_box_key[Side_Min], box->key)); ui_key_match(ui_state->hot_box_key, box->key)) &&
(ui_key_match(ui_state->active_box_key[Side_Min], ui_key_zero()) ||
ui_key_match(ui_state->active_box_key[Side_Min], box->key)));
result.mouse_over = mouse_is_over; result.mouse_over = mouse_is_over;
//- rjf: clicking in default nav -> set navigation state to this box //- rjf: clicking in default nav -> set navigation state to this box