diff --git a/rsrc/misc.png b/rsrc/misc.png
new file mode 100644
index 00000000..05c8a388
Binary files /dev/null and b/rsrc/misc.png differ
diff --git a/rsrc/misc.svg b/rsrc/misc.svg
new file mode 100644
index 00000000..8fe52efc
--- /dev/null
+++ b/rsrc/misc.svg
@@ -0,0 +1,91 @@
+
+
diff --git a/rsrc/misc@2x.png b/rsrc/misc@2x.png
new file mode 100644
index 00000000..f15cf190
Binary files /dev/null and b/rsrc/misc@2x.png differ
diff --git a/rsrc/resources.qrc b/rsrc/resources.qrc
index 8930fa0a..c0dbc702 100644
--- a/rsrc/resources.qrc
+++ b/rsrc/resources.qrc
@@ -60,5 +60,7 @@
update@2x.png
window.png
window@2x.png
+ misc.png
+ misc@2x.png
diff --git a/src/dialogs/SettingsDialog.cpp b/src/dialogs/SettingsDialog.cpp
index 9bec649c..20507d78 100644
--- a/src/dialogs/SettingsDialog.cpp
+++ b/src/dialogs/SettingsDialog.cpp
@@ -601,6 +601,30 @@ public:
}
};
+class MiscPanel : public QWidget
+{
+public:
+ MiscPanel(QWidget *parent = nullptr)
+ : QWidget(parent)
+ {
+ Settings *settings = Settings::instance();
+
+ QLineEdit *sshConfigPathBox = new QLineEdit(settings->value("ssh/configFilePath").toString(), this);
+ connect(sshConfigPathBox, &QLineEdit::textChanged, [](const QString &text) {
+ Settings::instance()->setValue("ssh/configFilePath", text);
+ });
+
+ QLineEdit *sshKeyPathBox = new QLineEdit(settings->value("ssh/keyFilePath").toString(), this);
+ connect(sshKeyPathBox, &QLineEdit::textChanged, [](const QString &text) {
+ Settings::instance()->setValue("ssh/keyFilePath", text);
+ });
+
+ QFormLayout *layout = new QFormLayout(this);
+ layout->addRow(tr("Path to SSH config file:"), sshConfigPathBox);
+ layout->addRow(tr("Path to default / fallback SSH key file:"), sshKeyPathBox);
+ }
+};
+
#ifdef Q_OS_UNIX
class TerminalPanel : public QWidget
{
@@ -800,6 +824,14 @@ SettingsDialog::SettingsDialog(Index index, QWidget *parent)
stack->addWidget(new TerminalPanel(this));
#endif
+ // Add misc panel.
+ QAction *misc = toolbar->addAction(QIcon(":/misc.png"), tr("Misc"));
+ misc->setData(Misc);
+ misc->setActionGroup(actions);
+ misc->setCheckable(true);
+
+ stack->addWidget(new MiscPanel(this));
+
// Hook up edit button.
connect(edit, &QPushButton::clicked, stack, [stack] {
// Update on save.
diff --git a/src/dialogs/SettingsDialog.h b/src/dialogs/SettingsDialog.h
index a9ee77f9..c4372116 100644
--- a/src/dialogs/SettingsDialog.h
+++ b/src/dialogs/SettingsDialog.h
@@ -24,7 +24,8 @@ public:
Editor,
Update,
Plugins,
- Terminal
+ Terminal,
+ Misc
};
SettingsDialog(Index index, QWidget *parent = nullptr);
diff --git a/src/git/Remote.cpp b/src/git/Remote.cpp
index d18b7b0f..66025d6c 100644
--- a/src/git/Remote.cpp
+++ b/src/git/Remote.cpp
@@ -38,6 +38,22 @@ const QStringList kKeyKinds = {"ed25519", "rsa", "dsa"};
bool keyFile(QString &key)
{
QDir dir = QDir::home();
+
+ QString filePath = Settings::instance()->value("ssh/keyFilePath").toString();
+ if (!filePath.isEmpty()) {
+ QFileInfo file(filePath);
+
+ if (!file.isAbsolute())
+ file.setFile(dir.absolutePath() + '/' + file.filePath());
+
+ if (file.exists()) {
+ key = file.absoluteFilePath();
+ return true;
+ } else {
+ return false;
+ }
+ }
+
if (!dir.cd(".ssh"))
return false;
@@ -136,11 +152,22 @@ public:
ConfigFile()
{
+ QString filePath = Settings::instance()->value("ssh/configFilePath").toString();
QDir dir = QDir::home();
- if (!dir.cd(".ssh"))
- return;
- mFile.reset(new QFile(dir.filePath("config")));
+ if (filePath.isEmpty()) {
+ if (!dir.cd(".ssh"))
+ return;
+
+ filePath = dir.absoluteFilePath("config");
+ }
+
+ QFileInfo file(filePath);
+
+ if (!file.isAbsolute())
+ file.setFile(dir.absolutePath() + '/' + file.filePath());
+
+ mFile.reset(new QFile(file.absoluteFilePath()));
if (!mFile->open(QFile::ReadOnly))
return;