* This option (in spite of large warnings) continues to be a pitfall for new and
experienced users alike, trying to use process injection without good reason
and getting into trouble when it breaks.
* This prevents unnecessary conversions back and forth between rdcstr and const
char * when going through interfaces. In the OS specific layer this is rarely
an issue because most of the implementations don't convert to rdcstr, but it
is convenient to be able to pass in an rdcstr directly. The few cases where
there's an unecessary construction of an rdcstr is acceptable.
* A couple of places in the public API need to return a string from a global
function, so can't return an rdcstr due to C ABI, so they still return a const
char *.
* Similarly const char * is kept for logging, to avoid a dependency on rdcstr
and because that's one place where unnecessary conversions/constructions may
be impactful.
* One automodule in a file for our modules is way too much, so we split it into
files. Unfortunately this means that only one file can have those classes and
functions be linkable from elsewhere.
* Instead we bite the bullet and manually curate the items into pages, and at
the same time subdivide the 'enums and data' page more which is a general
readability and usability win as well.
* We also add some previously not-included functions, and add a doc-build time
check to ensure that functions and classes aren't omitted from the
documentation in future
* If no capture is loaded after launching a program, the capture settings can
still be present and cause problems with future launches of applications
depending on the Android version.
* QNetworkAccessManager is supposed to be asynchronous and threaded internally,
but calling get() the first time can take multiple *seconds* while it
initialises proxy data and loads ssl libraries.
* Qt's threading rules are so strict it's impossible to feasibly move
QNetworkAccessManager to another thread.
* Instead we use Qt's cross-thread signals and slots to move the whole thing
into a wrapper object. It's stupid.
* Newer Qt versions will base64 the byte arrays even if we've already base64'd
them so they're safe. To prevent this we explicitly convert to QString
afterwards.
* If the UI was launched with a filename as a parameter to open the capture, it
will be added to the recent capture file list. Only later (relatively
speaking) if we make a capture connection will we realise that it is temporary
and potentially delete the file. If we do so, remove the capture from the
recent file list.
* In particular make it clear that crashes caught in the injected program may or
may not be a RenderDoc bug. Even if we could point the finger to a particular
DLL we can't necessarily tie that DLL to the responsibility of either us or
the application.
* The defaults can be configured from the settings menu, and there's a new "Open
Capture with Options" menu option to open a capture with different options
temporarily.
* This allows RemoteHost handles to still be valid and usable (if returning
empty data) when they are deleted/removed if the device is disconnected, as
well as providing better multi-thread access (they lock internally)
* We also add a new message specifically for when the install succeeds but we
can't verify it, to indicate the problem better than suggesting that
permission errors are at fault.
* We also only use GIT_COMMIT_HASH where necessary to avoid rebuilding many
files for no reason, including splitting version.cpp out into a separate
project as we do with VS since otherwise changing its preprocessor defines
rebuilds the whole renderdoc project.
* At the same time, move the git hash to be internal only so we don't have to
try to link version.cpp into other projects like renderdoccmd or qrenderdoc.
* The apk targets api level 21 which is 5.0, so it still won't install on
anything older.
* We pop up a big warning to the user the first time they try and select such a
remote host.
* 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.