From e32d4644034f0a6df8dd06c985ccfe74e7dd48f4 Mon Sep 17 00:00:00 2001 From: "Felix (xq) Queißner" Date: Wed, 10 Jun 2020 00:57:05 +0200 Subject: Enables desktop services via protocols. --- src/browsertab.cpp | 25 +++++++++++++++++++------ src/protocolsetup.cpp | 10 +++++----- src/protocolsetup.hpp | 4 +++- src/settingsdialog.cpp | 7 +++++++ src/settingsdialog.ui | 34 +++++++++++++++++++++++++++++++++- 5 files changed, 67 insertions(+), 13 deletions(-) (limited to 'src') 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 + 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 @@ + + + + Unknown Scheme + + + + + + + + + Display error message + + + buttonGroup + + + + + + + Use OS default handler + + + buttonGroup + + + + + @@ -811,8 +842,9 @@ + - + -- cgit v1.2.3