Skip to content

Commit bc79e22

Browse files
committed
Make EnvironmentModification struct and pass around array directly
* The old 'store in opaque void*' is kept as entry point wrappers only for the C# UI.
1 parent 43eb507 commit bc79e22

17 files changed

Lines changed: 208 additions & 265 deletions

File tree

qrenderdoc/Code/Interface/QRDInterface.cpp

Lines changed: 22 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -4,69 +4,46 @@
44
#include <QStandardPaths>
55
#include "Code/QRDUtils.h"
66

7-
QString EnvironmentModification::GetTypeString() const
8-
{
9-
QString ret;
10-
11-
if(type == EnvMod::Append)
12-
ret = QString("Append, %1").arg(ToQStr(separator));
13-
else if(type == EnvMod::Prepend)
14-
ret = QString("Prepend, %1").arg(ToQStr(separator));
15-
else
16-
ret = "Set";
17-
18-
return ret;
19-
}
20-
21-
QString EnvironmentModification::GetDescription() const
22-
{
23-
QString ret;
24-
25-
if(type == EnvMod::Append)
26-
ret = QString("Append %1 with %2 using %3").arg(variable).arg(value).arg(ToQStr(separator));
27-
else if(type == EnvMod::Prepend)
28-
ret = QString("Prepend %1 with %2 using %3").arg(variable).arg(value).arg(ToQStr(separator));
29-
else
30-
ret = QString("Set %1 to %2").arg(variable).arg(value);
31-
32-
return ret;
33-
}
34-
35-
EnvironmentModification::operator QVariant() const
7+
QVariant EnvModToVariant(const EnvironmentModification &env)
368
{
379
QVariantMap ret;
38-
ret["variable"] = variable;
39-
ret["value"] = value;
40-
ret["type"] = ToQStr(type);
41-
ret["separator"] = ToQStr(separator);
10+
ret["variable"] = ToQStr(env.name);
11+
ret["value"] = ToQStr(env.value);
12+
ret["type"] = ToQStr(env.mod);
13+
ret["separator"] = ToQStr(env.sep);
4214
return ret;
4315
}
4416

45-
EnvironmentModification::EnvironmentModification(const QVariant &v)
17+
EnvironmentModification EnvModFromVariant(const QVariant &v)
4618
{
4719
QVariantMap data = v.toMap();
48-
variable = data["variable"].toString();
49-
value = data["value"].toString();
20+
21+
EnvironmentModification ret;
22+
23+
ret.name = data["variable"].toString().toUtf8().data();
24+
ret.value = data["value"].toString().toUtf8().data();
5025

5126
QString t = data["type"].toString();
5227

5328
if(t == ToQStr(EnvMod::Append))
54-
type = EnvMod::Append;
29+
ret.mod = EnvMod::Append;
5530
else if(t == ToQStr(EnvMod::Prepend))
56-
type = EnvMod::Prepend;
31+
ret.mod = EnvMod::Prepend;
5732
else
58-
type = EnvMod::Set;
33+
ret.mod = EnvMod::Set;
5934

6035
QString s = data["separator"].toString();
6136

6237
if(s == ToQStr(EnvSep::SemiColon))
63-
separator = EnvSep::SemiColon;
38+
ret.sep = EnvSep::SemiColon;
6439
else if(s == ToQStr(EnvSep::Colon))
65-
separator = EnvSep::Colon;
40+
ret.sep = EnvSep::Colon;
6641
else if(s == ToQStr(EnvSep::Platform))
67-
separator = EnvSep::Platform;
42+
ret.sep = EnvSep::Platform;
6843
else
69-
separator = EnvSep::NoSep;
44+
ret.sep = EnvSep::NoSep;
45+
46+
return ret;
7047
}
7148

7249
CaptureSettings::CaptureSettings()
@@ -88,7 +65,7 @@ CaptureSettings::operator QVariant() const
8865

8966
QVariantList env;
9067
for(int i = 0; i < Environment.size(); i++)
91-
env.push_back((QVariant)Environment[i]);
68+
env.push_back(EnvModToVariant(Environment[i]));
9269
ret["Environment"] = env;
9370

9471
QVariantMap opts;
@@ -122,7 +99,7 @@ CaptureSettings::CaptureSettings(const QVariant &v)
12299
QVariantList env = data["Environment"].toList();
123100
for(int i = 0; i < env.size(); i++)
124101
{
125-
EnvironmentModification e(env[i]);
102+
EnvironmentModification e = EnvModFromVariant(env[i]);
126103
Environment.push_back(e);
127104
}
128105

qrenderdoc/Code/Interface/QRDInterface.h

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -43,28 +43,6 @@ class QWidget;
4343

4444
struct ICaptureContext;
4545

46-
struct EnvironmentModification
47-
{
48-
EnvironmentModification()
49-
{
50-
type = EnvMod::Set;
51-
separator = EnvSep::NoSep;
52-
}
53-
54-
QString variable;
55-
QString value;
56-
57-
EnvMod type;
58-
EnvSep separator;
59-
60-
QString GetTypeString() const;
61-
QString GetDescription() const;
62-
63-
VARIANT_CAST(EnvironmentModification);
64-
};
65-
66-
DECLARE_REFLECTION_STRUCT(EnvironmentModification);
67-
6846
struct CaptureSettings
6947
{
7048
CaptureSettings();

qrenderdoc/Code/RenderManager.cpp

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -355,11 +355,7 @@ uint32_t RenderManager::ExecuteAndInject(const QString &exe, const QString &work
355355
const QList<EnvironmentModification> &env,
356356
const QString &logfile, CaptureOptions opts)
357357
{
358-
void *envList = RENDERDOC_MakeEnvironmentModificationList(env.size());
359-
360-
for(int i = 0; i < env.size(); i++)
361-
RENDERDOC_SetEnvironmentModification(envList, i, env[i].variable.toUtf8().data(),
362-
env[i].value.toUtf8().data(), env[i].type, env[i].separator);
358+
rdctype::array<EnvironmentModification> envList = env.toVector().toStdVector();
363359

364360
uint32_t ret = 0;
365361

@@ -376,8 +372,6 @@ uint32_t RenderManager::ExecuteAndInject(const QString &exe, const QString &work
376372
opts, false);
377373
}
378374

379-
RENDERDOC_FreeEnvironmentModificationList(envList);
380-
381375
return ret;
382376
}
383377

qrenderdoc/Windows/Dialogs/CaptureDialog.cpp

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,26 @@
3737
#define JSON_ID "rdocCaptureSettings"
3838
#define JSON_VER 1
3939

40+
static QString GetDescription(const EnvironmentModification &env)
41+
{
42+
QString ret;
43+
44+
if(env.mod == EnvMod::Append)
45+
ret = QString("Append %1 with %2 using %3")
46+
.arg(ToQStr(env.name))
47+
.arg(ToQStr(env.value))
48+
.arg(ToQStr(env.sep));
49+
else if(env.mod == EnvMod::Prepend)
50+
ret = QString("Prepend %1 with %2 using %3")
51+
.arg(ToQStr(env.name))
52+
.arg(ToQStr(env.value))
53+
.arg(ToQStr(env.sep));
54+
else
55+
ret = QString("Set %1 to %2").arg(ToQStr(env.name)).arg(ToQStr(env.value));
56+
57+
return ret;
58+
}
59+
4060
Q_DECLARE_METATYPE(CaptureSettings);
4161

4262
CaptureDialog::CaptureDialog(ICaptureContext &ctx, OnCaptureMethod captureCallback,
@@ -662,7 +682,7 @@ void CaptureDialog::SetEnvironmentModifications(const QList<EnvironmentModificat
662682
if(envModText != "")
663683
envModText += ", ";
664684

665-
envModText += mod.GetDescription();
685+
envModText += GetDescription(mod);
666686
}
667687

668688
ui->envVar->setText(envModText);

qrenderdoc/Windows/Dialogs/EnvironmentEditor.cpp

Lines changed: 33 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,20 @@
2929
#include "Code/QRDUtils.h"
3030
#include "ui_EnvironmentEditor.h"
3131

32+
static QString GetTypeString(const EnvironmentModification &env)
33+
{
34+
QString ret;
35+
36+
if(env.mod == EnvMod::Append)
37+
ret = QString("Append, %1").arg(ToQStr(env.sep));
38+
else if(env.mod == EnvMod::Prepend)
39+
ret = QString("Prepend, %1").arg(ToQStr(env.sep));
40+
else
41+
ret = "Set";
42+
43+
return ret;
44+
}
45+
3246
Q_DECLARE_METATYPE(EnvironmentModification);
3347

3448
EnvironmentEditor::EnvironmentEditor(QWidget *parent)
@@ -115,34 +129,34 @@ void EnvironmentEditor::on_variables_currentItemChanged(QTreeWidgetItem *current
115129

116130
EnvironmentModification mod = sel[0]->data(0, Qt::UserRole).value<EnvironmentModification>();
117131

118-
if(!mod.variable.isEmpty())
132+
if(!mod.value.empty())
119133
{
120-
ui->name->setText(mod.variable);
121-
ui->value->setText(mod.value);
122-
ui->separator->setCurrentIndex((int)mod.separator);
134+
ui->name->setText(ToQStr(mod.name));
135+
ui->value->setText(ToQStr(mod.value));
136+
ui->separator->setCurrentIndex((int)mod.sep);
123137

124-
if(mod.type == EnvMod::Set)
138+
if(mod.mod == EnvMod::Set)
125139
ui->setValue->setChecked(true);
126-
else if(mod.type == EnvMod::Append)
140+
else if(mod.mod == EnvMod::Append)
127141
ui->appendValue->setChecked(true);
128-
else if(mod.type == EnvMod::Prepend)
142+
else if(mod.mod == EnvMod::Prepend)
129143
ui->prependValue->setChecked(true);
130144
}
131145
}
132146

133147
void EnvironmentEditor::on_addUpdate_clicked()
134148
{
135149
EnvironmentModification mod;
136-
mod.variable = ui->name->text();
137-
mod.value = ui->value->text();
138-
mod.separator = (EnvSep)ui->separator->currentIndex();
150+
mod.name = ui->name->text().toUtf8().data();
151+
mod.value = ui->value->text().toUtf8().data();
152+
mod.sep = (EnvSep)ui->separator->currentIndex();
139153

140154
if(ui->appendValue->isChecked())
141-
mod.type = EnvMod::Append;
155+
mod.mod = EnvMod::Append;
142156
else if(ui->prependValue->isChecked())
143-
mod.type = EnvMod::Prepend;
157+
mod.mod = EnvMod::Prepend;
144158
else
145-
mod.type = EnvMod::Set;
159+
mod.mod = EnvMod::Set;
146160

147161
addModification(mod, false);
148162

@@ -174,7 +188,7 @@ int EnvironmentEditor::existingIndex()
174188

175189
void EnvironmentEditor::addModification(EnvironmentModification mod, bool silent)
176190
{
177-
if(mod.variable.trimmed() == "")
191+
if(mod.name.empty())
178192
{
179193
if(!silent)
180194
RDDialog::critical(this, tr("Invalid variable"),
@@ -189,15 +203,15 @@ void EnvironmentEditor::addModification(EnvironmentModification mod, bool silent
189203

190204
if(idx < 0)
191205
{
192-
node = makeTreeNode({mod.variable, mod.GetTypeString(), mod.value});
206+
node = makeTreeNode({ToQStr(mod.name), GetTypeString(mod), ToQStr(mod.value)});
193207
ui->variables->addTopLevelItem(node);
194208
}
195209
else
196210
{
197211
node = ui->variables->topLevelItem(idx);
198-
node->setText(0, mod.variable);
199-
node->setText(1, mod.GetTypeString());
200-
node->setText(2, mod.value);
212+
node->setText(0, ToQStr(mod.name));
213+
node->setText(1, GetTypeString(mod));
214+
node->setText(2, ToQStr(mod.value));
201215
}
202216

203217
node->setData(0, Qt::UserRole, QVariant::fromValue(mod));
@@ -225,7 +239,7 @@ QList<EnvironmentModification> EnvironmentEditor::modifications()
225239
EnvironmentModification mod =
226240
ui->variables->topLevelItem(i)->data(0, Qt::UserRole).value<EnvironmentModification>();
227241

228-
if(!mod.variable.isEmpty())
242+
if(!mod.name.empty())
229243
ret.push_back(mod);
230244
}
231245

qrenderdoc/Windows/MainWindow.cpp

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -371,20 +371,13 @@ void MainWindow::OnInjectTrigger(uint32_t PID, const QList<EnvironmentModificati
371371
if(!PromptCloseLog())
372372
return;
373373

374-
LambdaThread *th = new LambdaThread([this, PID, env, name, opts, callback]() {
375-
QString logfile = m_Ctx.TempLogFilename(name);
376-
377-
void *envList = RENDERDOC_MakeEnvironmentModificationList(env.size());
374+
rdctype::array<EnvironmentModification> envList = env.toVector().toStdVector();
378375

379-
for(int i = 0; i < env.size(); i++)
380-
RENDERDOC_SetEnvironmentModification(envList, i, env[i].variable.toUtf8().data(),
381-
env[i].value.toUtf8().data(), env[i].type,
382-
env[i].separator);
376+
LambdaThread *th = new LambdaThread([this, PID, envList, name, opts, callback]() {
377+
QString logfile = m_Ctx.TempLogFilename(name);
383378

384379
uint32_t ret = RENDERDOC_InjectIntoProcess(PID, envList, logfile.toUtf8().data(), opts, false);
385380

386-
RENDERDOC_FreeEnvironmentModificationList(envList);
387-
388381
GUIInvoke::call([this, PID, ret, callback]() {
389382
if(ret == 0)
390383
{

renderdoc/api/replay/control_types.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -487,3 +487,23 @@ struct TargetControlMessage
487487
};
488488

489489
DECLARE_REFLECTION_STRUCT(TargetControlMessage);
490+
491+
DOCUMENT("A modification to a single environment variable.");
492+
struct EnvironmentModification
493+
{
494+
EnvironmentModification() : mod(EnvMod::Set), sep(EnvSep::NoSep), name(""), value("") {}
495+
EnvironmentModification(EnvMod m, EnvSep s, const char *n, const char *v)
496+
: mod(m), sep(s), name(n), value(v)
497+
{
498+
}
499+
DOCUMENT("The :class:`modification <EnvMod>` to use.");
500+
EnvMod mod;
501+
DOCUMENT("The :class:`separator <EnvSep>` to use if needed.");
502+
EnvSep sep;
503+
DOCUMENT("The name of the environment variable.");
504+
rdctype::str name;
505+
DOCUMENT("The value to use with the modification specified in :data:`mod`.");
506+
rdctype::str value;
507+
};
508+
509+
DECLARE_REFLECTION_STRUCT(EnvironmentModification);

0 commit comments

Comments
 (0)