aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFelix (xq) Queißner <git@mq32.de>2020-06-10 00:57:05 +0200
committerFelix (xq) Queißner <git@mq32.de>2020-06-10 00:57:05 +0200
commite32d4644034f0a6df8dd06c985ccfe74e7dd48f4 (patch)
tree24590a649f95a8da54ffa3dbb4081272aa8d74fe /src
parent656391ecc0555b3462266b886434ae0f120a401c (diff)
downloadkristall-e32d4644034f0a6df8dd06c985ccfe74e7dd48f4.tar.gz
Enables desktop services via protocols.
Diffstat (limited to 'src')
-rw-r--r--src/browsertab.cpp25
-rw-r--r--src/protocolsetup.cpp10
-rw-r--r--src/protocolsetup.hpp4
-rw-r--r--src/settingsdialog.cpp7
-rw-r--r--src/settingsdialog.ui34
5 files changed, 67 insertions, 13 deletions
diff --git a/src/browsertab.cpp b/src/browsertab.cpp
index 2cd4fff..086af38 100644
--- a/src/browsertab.cpp
+++ b/src/browsertab.cpp
@@ -76,9 +76,9 @@ BrowserTab::~BrowserTab()
void BrowserTab::navigateTo(const QUrl &url, PushToHistory mode)
{
- if(not mainWindow->protocols.isSchemeSupported(url.scheme()))
+ if(mainWindow->protocols.isSchemeSupported(url.scheme()) != ProtocolSetup::Enabled)
{
- QMessageBox::warning(this, "Kristall", "Unsupported uri scheme: " + url.scheme());
+ QMessageBox::warning(this, "Kristall", "URI scheme not supported or disabled: " + url.scheme());
return;
}
@@ -529,6 +529,8 @@ void BrowserTab::on_fav_button_clicked()
toggleIsFavourite(this->ui->fav_button->isChecked());
}
+#include <QDesktopServices>
+
void BrowserTab::on_text_browser_anchorClicked(const QUrl &url)
{
@@ -538,11 +540,22 @@ void BrowserTab::on_text_browser_anchorClicked(const QUrl &url)
if(real_url.isRelative())
real_url = this->current_location.resolved(url);
- if(not mainWindow->protocols.isSchemeSupported(real_url.scheme())) {
- QMessageBox::warning(this, "Kristall", QString("Unsupported url: %1").arg(real_url.toString()));
- }
- else {
+ auto support = mainWindow->protocols.isSchemeSupported(real_url.scheme());
+
+ if(support == ProtocolSetup::Enabled) {
this->navigateTo(real_url, PushAfterSuccess);
+ } else {
+ bool use_os_proxy = global_settings.value("use_os_scheme_handler").toBool();
+
+ if(use_os_proxy) {
+ if(not QDesktopServices::openUrl(url)) {
+ QMessageBox::warning(this, "Kristall", QString("Failed to start system URL handler for\r\n%1").arg(real_url.toString()));
+ }
+ } else if(support == ProtocolSetup::Disabled) {
+ QMessageBox::warning(this, "Kristall", QString("The requested url uses a scheme that has been disabled in the settings:\r\n%1").arg(real_url.toString()));
+ } else {
+ QMessageBox::warning(this, "Kristall", QString("The requested url cannot be processed by Kristall:\r\n%1").arg(real_url.toString()));
+ }
}
}
diff --git a/src/protocolsetup.cpp b/src/protocolsetup.cpp
index fcf971a..33b454e 100644
--- a/src/protocolsetup.cpp
+++ b/src/protocolsetup.cpp
@@ -27,17 +27,17 @@ void ProtocolSetup::load(QSettings &settings)
settings.endGroup();
}
-bool ProtocolSetup::isSchemeSupported(QString const & _scheme) const
+ProtocolSetup::ProtocolSupport ProtocolSetup::isSchemeSupported(QString const & _scheme) const
{
auto scheme = _scheme.toLower();
-#define MAC(X) if(scheme == #X) return this->X;
+#define MAC(X) if(scheme == #X) return this->X ? Enabled : Disabled;
PROTOCOLS(MAC)
#undef MAC
// built-in schemes:
- if(scheme == "about") return true;
- if(scheme == "file") return true;
+ if(scheme == "about") return Enabled;
+ if(scheme == "file") return Enabled;
- return false;
+ return Unsupported;
}
diff --git a/src/protocolsetup.hpp b/src/protocolsetup.hpp
index 3cf3ab1..db163de 100644
--- a/src/protocolsetup.hpp
+++ b/src/protocolsetup.hpp
@@ -22,7 +22,9 @@ struct ProtocolSetup
void load(QSettings & settings);
- bool isSchemeSupported(QString const & scheme) const;
+
+ enum ProtocolSupport { Disabled, Unsupported, Enabled };
+ ProtocolSupport isSchemeSupported(QString const & scheme) const;
};
#endif // PROTOCOLSETUP_HPP
diff --git a/src/settingsdialog.cpp b/src/settingsdialog.cpp
index c71225c..3581f03 100644
--- a/src/settingsdialog.cpp
+++ b/src/settingsdialog.cpp
@@ -50,6 +50,12 @@ SettingsDialog::SettingsDialog(QWidget *parent) :
this->ui->texthl_off->setChecked(true);
}
+ if(global_settings.value("use_os_scheme_handler").toBool()) {
+ this->ui->scheme_os_default->setChecked(true);
+ } else {
+ this->ui->scheme_error->setChecked(true);
+ }
+
int items = global_settings.beginReadArray("Themes");
this->predefined_styles.clear();
@@ -438,6 +444,7 @@ void SettingsDialog::on_SettingsDialog_accepted()
global_settings.setValue("gophermap_display", this->ui->gophermap_text->isChecked() ? "text" : "rendered");
global_settings.setValue("text_display", this->ui->fancypants_off->isChecked() ? "plain" : "fancy");
global_settings.setValue("text_decoration", this->ui->texthl_on->isChecked());
+ global_settings.setValue("use_os_scheme_handler", this->ui->scheme_os_default->isChecked());
global_settings.beginWriteArray("Themes", this->predefined_styles.size());
diff --git a/src/settingsdialog.ui b/src/settingsdialog.ui
index 02cccee..75b84fe 100644
--- a/src/settingsdialog.ui
+++ b/src/settingsdialog.ui
@@ -202,6 +202,37 @@
</item>
</layout>
</item>
+ <item row="6" column="0">
+ <widget class="QLabel" name="label_22">
+ <property name="text">
+ <string>Unknown Scheme</string>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="1">
+ <layout class="QHBoxLayout" name="horizontalLayout_7">
+ <item>
+ <widget class="QRadioButton" name="scheme_error">
+ <property name="text">
+ <string>Display error message</string>
+ </property>
+ <attribute name="buttonGroup">
+ <string notr="true">buttonGroup</string>
+ </attribute>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="scheme_os_default">
+ <property name="text">
+ <string>Use OS default handler</string>
+ </property>
+ <attribute name="buttonGroup">
+ <string notr="true">buttonGroup</string>
+ </attribute>
+ </widget>
+ </item>
+ </layout>
+ </item>
</layout>
</widget>
<widget class="QWidget" name="style_tab">
@@ -811,8 +842,9 @@
</connection>
</connections>
<buttongroups>
+ <buttongroup name="gophermapBtnGroup"/>
<buttongroup name="textHighlightsBtnGroup"/>
<buttongroup name="textRenderingBtnGroup"/>
- <buttongroup name="gophermapBtnGroup"/>
+ <buttongroup name="buttonGroup"/>
</buttongroups>
</ui>