* This is only lightly tested and may break heavily. It is disabled by default
and must be explicitly enabled.
* In particular this is only known to work for Wayland use at capture time.
Wayland on replay is still unsupported. Known issues include: EGL pbuffer
surfaces are not implemented on Wayland, Wayland cannot get window dimensions,
and there are hangs/failures with GL and vulkan presentation with Wayland.
* On GL addressing modes are called wrap modes, and the wrap value is then known
as repeat. If we don't 'localise' this then it can be confusing to show that
it is "Wrap".
* Most cases don't have other text together with a ResourceId, so handle an
isolated ResourceId specially and manually render it.
* Further work - we could cache the name the same way as the RichResourceText
does. So far it doesn't seem to appear on profiling.
* This means it outputs natively/properly to stdout/stderr and its output can be
redirected with pipes.
* It does mean we need to be very careful whenever it's run internally to not
pop up a command window, which happens by default.
* This allows us to add rich text support much more easily into other itemviews
like RDTableView.
* We set it up for debug messages so that resource links in debug messages can
be linked.
* The GUIInvoke object takes a QObject, and uses QPointer to check that
it hasn't been deleted when the callback fires. This prevents delayed
callbacks from executing after the object has been deleted and
crashing.
* In most cases the pointer is just 'this'.
* For unsigned integers this notices UINT16/32/64_MAX and displays as
a text string for easier consumption.
* Also for numbers over a given threshold we display them as hex instead
of decimal.
* We remove the now unneeded name fields in buffer/texture descriptions
and some of the pipeline state structs.
* A single function will give the human-readable name for a resource id.
This will look up a custom set of renames, on top of the names from
the resource descriptions.
* This item delegate will forward on either to a specified other
delegate or to the base implementation. This allows chaining delegates
(i.e. having one built-in to the widget, which forwards to a user-set
delegate).
* Note that while this is public and uses std::string, because it's a
template with specialisations in a .inl the string never crosses a
module boundary - each including module has its own implementation.
* This will be used as part of the upcoming serialisation refactor.
* Some POD structs are still given ToStr implementations as we haven't
yet switched over the serialisation system to expect all structs to
have serialise functions.
In most of these cases, the open file dialog won't even display a file
without the proper extension, so this helps ensure the user doesn't
accidentally misplace their files. The one exception is *.rdc, which
could be found without the extension, but could not be opened.
* Any work that might use Qt needs to happen on the UI thread, so when
running a python script on the python thread we need to invoke across.
We wrap the main ICaptureContext interface to block invoke onto the UI
for any function calls that aren't just returning internal data.