public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
From: "Andreas Sturmlechner" <asturm@gentoo.org>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] repo/gentoo:master commit in: www-client/falkon/files/, www-client/falkon/
Date: Sun,  9 Dec 2018 20:32:57 +0000 (UTC)	[thread overview]
Message-ID: <1544387567.50c1efe4e4631026b9a04a726c36e10c7d99c729.asturm@gentoo> (raw)

commit:     50c1efe4e4631026b9a04a726c36e10c7d99c729
Author:     Andreas Sturmlechner <asturm <AT> gentoo <DOT> org>
AuthorDate: Sun Dec  9 20:29:31 2018 +0000
Commit:     Andreas Sturmlechner <asturm <AT> gentoo <DOT> org>
CommitDate: Sun Dec  9 20:32:47 2018 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=50c1efe4

www-client/falkon: Enable webinspector, fix mouse navigation

Disable finding PySide2 as long as it is not a thing in Gentoo.

mouse navigation:
KDE-Bug: https://bugs.kde.org/show_bug.cgi?id=395828

webinspector:
Reported-by: nekoexmachina in #gentoo-kde
Package-Manager: Portage-2.3.52, Repoman-2.3.12
Signed-off-by: Andreas Sturmlechner <asturm <AT> gentoo.org>

 www-client/falkon/falkon-3.0.1-r1.ebuild           |  79 +++++++++++++++
 .../falkon/files/falkon-3.0.1-page-actions.patch   |  53 +++++++++++
 .../files/falkon-3.0.1-pyside2-release.patch       |  26 +++++
 .../files/falkon-3.0.1-qiodevice-main-thread.patch | 106 +++++++++++++++++++++
 .../files/falkon-3.0.1-qtwebengine-version.patch   |  72 ++++++++++++++
 .../falkon/files/falkon-3.0.1-webinspector.patch   | 102 ++++++++++++++++++++
 6 files changed, 438 insertions(+)

diff --git a/www-client/falkon/falkon-3.0.1-r1.ebuild b/www-client/falkon/falkon-3.0.1-r1.ebuild
new file mode 100644
index 00000000000..71fb406ee4a
--- /dev/null
+++ b/www-client/falkon/falkon-3.0.1-r1.ebuild
@@ -0,0 +1,79 @@
+# Copyright 1999-2018 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=6
+
+KDE_TEST="true"
+VIRTUALX_REQUIRED="test"
+inherit kde5
+
+DESCRIPTION="Cross-platform web browser using QtWebEngine"
+HOMEPAGE="https://www.falkon.org/"
+if [[ ${KDE_BUILD_TYPE} != live ]]; then
+	SRC_URI="mirror://kde/stable/${PN}/${PV}/${P}.tar.xz"
+fi
+
+LICENSE="GPL-3"
+SLOT="0"
+KEYWORDS="~amd64 ~x86"
+IUSE="dbus gnome-keyring kwallet libressl +X"
+
+COMMON_DEPEND="
+	$(add_qt_dep qtdeclarative 'widgets')
+	$(add_qt_dep qtgui)
+	$(add_qt_dep qtnetwork 'ssl')
+	$(add_qt_dep qtprintsupport)
+	$(add_qt_dep qtsql 'sqlite')
+	$(add_qt_dep qtwebchannel)
+	$(add_qt_dep qtwebengine 'widgets')
+	$(add_qt_dep qtwidgets)
+	dbus? ( $(add_qt_dep qtdbus) )
+	gnome-keyring? ( gnome-base/gnome-keyring )
+	kwallet? ( $(add_frameworks_dep kwallet) )
+	libressl? ( dev-libs/libressl:= )
+	!libressl? ( dev-libs/openssl:0= )
+	X? (
+		$(add_qt_dep qtx11extras)
+		x11-libs/libxcb:=
+		x11-libs/xcb-util
+	)
+"
+DEPEND="${COMMON_DEPEND}
+	$(add_qt_dep linguist-tools)
+	$(add_qt_dep qtconcurrent)
+	gnome-keyring? ( virtual/pkgconfig )
+"
+if [[ ${KDE_BUILD_TYPE} != live ]]; then
+	DEPEND+=" $(add_frameworks_dep ki18n)"
+fi
+RDEPEND="${COMMON_DEPEND}
+	!www-client/qupzilla
+	$(add_qt_dep qtsvg)
+"
+
+PATCHES=(
+	"${FILESDIR}/${P}-pyside2-release.patch"
+	"${FILESDIR}/${P}-qiodevice-main-thread.patch"
+	"${FILESDIR}/${P}-page-actions.patch"
+	"${FILESDIR}/${P}-qtwebengine-version.patch"
+	"${FILESDIR}/${P}-webinspector.patch"
+)
+
+src_configure() {
+	local mycmakeargs=(
+		-DCMAKE_DISABLE_FIND_PACKAGE_PySide2=ON
+		-DCMAKE_DISABLE_FIND_PACKAGE_Shiboken2=ON
+		-DCMAKE_DISABLE_FIND_PACKAGE_PythonLibs=ON
+		-DDISABLE_DBUS=$(usex !dbus)
+		-DBUILD_KEYRING=$(usex gnome-keyring)
+		$(cmake-utils_use_find_package kwallet KF5Wallet)
+		-DNO_X11=$(usex !X)
+	)
+	kde5_src_configure
+}
+
+pkg_postinst() {
+	kde5_pkg_postinst
+	elog "If you were previously using QupZilla, you can manually migrate your profiles"
+	elog "by moving the config directory from ~/.config/qupzilla to ~/.config/falkon"
+}

diff --git a/www-client/falkon/files/falkon-3.0.1-page-actions.patch b/www-client/falkon/files/falkon-3.0.1-page-actions.patch
new file mode 100644
index 00000000000..be48f000817
--- /dev/null
+++ b/www-client/falkon/files/falkon-3.0.1-page-actions.patch
@@ -0,0 +1,53 @@
+From 53e0a43762523185fb98bf705f85cf0dfa27247f Mon Sep 17 00:00:00 2001
+From: David Rosca <nowrep@gmail.com>
+Date: Sun, 8 Jul 2018 20:34:58 +0200
+Subject: NavigationBar: Correctly reconnect to page actions
+
+BUG: 395828
+FIXED-IN: 3.0.2
+---
+ src/lib/navigation/navigationbar.cpp | 27 ++++++++++++++++-----------
+ 1 file changed, 16 insertions(+), 11 deletions(-)
+
+diff --git a/src/lib/navigation/navigationbar.cpp b/src/lib/navigation/navigationbar.cpp
+index 0339b55..622622d 100644
+--- a/src/lib/navigation/navigationbar.cpp
++++ b/src/lib/navigation/navigationbar.cpp
+@@ -230,19 +230,24 @@ void NavigationBar::setCurrentView(TabbedWebView *view)
+         return;
+     }
+ 
+-    auto updateButton = [](ToolButton *button, QAction *action) {
+-        button->setEnabled(action->isEnabled());
++    auto connectPageActions = [this](QWebEnginePage *page) {
++        auto updateButton = [](ToolButton *button, QAction *action) {
++            button->setEnabled(action->isEnabled());
++        };
++        auto updateBackButton = std::bind(updateButton, m_buttonBack, page->action(QWebEnginePage::Back));
++        auto updateForwardButton = std::bind(updateButton, m_buttonForward, page->action(QWebEnginePage::Forward));
++
++        updateBackButton();
++        updateForwardButton();
++
++        disconnect(m_backConnection);
++        disconnect(m_forwardConnection);
++        m_backConnection = connect(page->action(QWebEnginePage::Back), &QAction::changed, this, updateBackButton);
++        m_forwardConnection = connect(page->action(QWebEnginePage::Forward), &QAction::changed, this, updateForwardButton);
+     };
+-    auto updateBackButton = std::bind(updateButton, m_buttonBack, view->pageAction(QWebEnginePage::Back));
+-    auto updateForwardButton = std::bind(updateButton, m_buttonForward, view->pageAction(QWebEnginePage::Forward));
+ 
+-    updateBackButton();
+-    updateForwardButton();
+-
+-    disconnect(m_backConnection);
+-    disconnect(m_forwardConnection);
+-    m_backConnection = connect(view->pageAction(QWebEnginePage::Back), &QAction::changed, this, updateBackButton);
+-    m_forwardConnection = connect(view->pageAction(QWebEnginePage::Forward), &QAction::changed, this, updateForwardButton);
++    connectPageActions(view->page());
++    connect(view, &TabbedWebView::pageChanged, this, connectPageActions);
+ }
+ 
+ void NavigationBar::showReloadButton()
+-- 
+cgit v1.1

diff --git a/www-client/falkon/files/falkon-3.0.1-pyside2-release.patch b/www-client/falkon/files/falkon-3.0.1-pyside2-release.patch
new file mode 100644
index 00000000000..13ebb423af9
--- /dev/null
+++ b/www-client/falkon/files/falkon-3.0.1-pyside2-release.patch
@@ -0,0 +1,26 @@
+From 4c83ba3d6c609a704a31c419b5d89dd1947aa11a Mon Sep 17 00:00:00 2001
+From: David Rosca <nowrep@gmail.com>
+Date: Mon, 18 Jun 2018 13:39:46 +0200
+Subject: PyFalkon: Fix build with PySide2 release
+
+---
+ src/plugins/PyFalkon/pyfalkon_global.h | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/src/plugins/PyFalkon/pyfalkon_global.h b/src/plugins/PyFalkon/pyfalkon_global.h
+index d41da24..0305b67 100644
+--- a/src/plugins/PyFalkon/pyfalkon_global.h
++++ b/src/plugins/PyFalkon/pyfalkon_global.h
+@@ -19,6 +19,10 @@
+ // Make "signals:", "slots:" visible as access specifiers
+ #define QT_ANNOTATE_ACCESS_SPECIFIER(a) __attribute__((annotate(#a)))
+ 
++// PYSIDE-711
++#include <QHstsPolicy>
++#include <QWebEngineContextMenuData>
++
+ // 3rdparty
+ #include "lineedit.h"
+ #include "squeezelabelv1.h"
+-- 
+cgit v1.1

diff --git a/www-client/falkon/files/falkon-3.0.1-qiodevice-main-thread.patch b/www-client/falkon/files/falkon-3.0.1-qiodevice-main-thread.patch
new file mode 100644
index 00000000000..2606dc50885
--- /dev/null
+++ b/www-client/falkon/files/falkon-3.0.1-qiodevice-main-thread.patch
@@ -0,0 +1,106 @@
+From a7d2f8757919b4db63867ecbb4fb64c11d64f453 Mon Sep 17 00:00:00 2001
+From: David Rosca <nowrep@gmail.com>
+Date: Sun, 22 Jul 2018 15:17:04 +0200
+Subject: FalkonSchemeHandler: Make sure to load data on main thread
+
+QIODevice::read is called on WebEngine IO thread.
+---
+ .../network/schemehandlers/falkonschemehandler.cpp | 41 +++++++++++-----------
+ .../network/schemehandlers/falkonschemehandler.h   |  2 ++
+ 2 files changed, 23 insertions(+), 20 deletions(-)
+
+diff --git a/src/lib/network/schemehandlers/falkonschemehandler.cpp b/src/lib/network/schemehandlers/falkonschemehandler.cpp
+index 5706c04..4e01897 100644
+--- a/src/lib/network/schemehandlers/falkonschemehandler.cpp
++++ b/src/lib/network/schemehandlers/falkonschemehandler.cpp
+@@ -89,8 +89,7 @@ FalkonSchemeReply::FalkonSchemeReply(QWebEngineUrlRequestJob *job, QObject *pare
+ {
+     m_pageName = m_job->requestUrl().path();
+ 
+-    open(QIODevice::ReadOnly);
+-    m_buffer.open(QIODevice::ReadWrite);
++    QTimer::singleShot(0, this, &FalkonSchemeReply::loadPage);
+ }
+ 
+ void FalkonSchemeReply::loadPage()
+@@ -98,38 +97,40 @@ void FalkonSchemeReply::loadPage()
+     if (m_loaded)
+         return;
+ 
+-    QTextStream stream(&m_buffer);
+-    stream.setCodec("UTF-8");
++    QString contents;
+ 
+     if (m_pageName == QLatin1String("about")) {
+-        stream << aboutPage();
+-    }
+-    else if (m_pageName == QLatin1String("start")) {
+-        stream << startPage();
+-    }
+-    else if (m_pageName == QLatin1String("speeddial")) {
+-        stream << speeddialPage();
+-    }
+-    else if (m_pageName == QLatin1String("config")) {
+-        stream << configPage();
+-    }
+-    else if (m_pageName == QLatin1String("restore")) {
+-        stream << restorePage();
++        contents = aboutPage();
++    } else if (m_pageName == QLatin1String("start")) {
++        contents = startPage();
++    } else if (m_pageName == QLatin1String("speeddial")) {
++        contents = speeddialPage();
++    } else if (m_pageName == QLatin1String("config")) {
++        contents = configPage();
++    } else if (m_pageName == QLatin1String("restore")) {
++        contents = restorePage();
+     }
+ 
+-    stream.flush();
+-    m_buffer.reset();
++    QMutexLocker lock(&m_mutex);
++    m_buffer.setData(contents.toUtf8());
++    m_buffer.open(QIODevice::ReadOnly);
++    lock.unlock();
++
++    open(QIODevice::ReadOnly);
++    emit readyRead();
++
+     m_loaded = true;
+ }
+ 
+ qint64 FalkonSchemeReply::bytesAvailable() const
+ {
++    QMutexLocker lock(&m_mutex);
+     return m_buffer.bytesAvailable();
+ }
+ 
+ qint64 FalkonSchemeReply::readData(char *data, qint64 maxSize)
+ {
+-    loadPage();
++    QMutexLocker lock(&m_mutex);
+     return m_buffer.read(data, maxSize);
+ }
+ 
+diff --git a/src/lib/network/schemehandlers/falkonschemehandler.h b/src/lib/network/schemehandlers/falkonschemehandler.h
+index 2c071a7..b92969d 100644
+--- a/src/lib/network/schemehandlers/falkonschemehandler.h
++++ b/src/lib/network/schemehandlers/falkonschemehandler.h
+@@ -18,6 +18,7 @@
+ #ifndef FALKONSCHEMEHANDLER_H
+ #define FALKONSCHEMEHANDLER_H
+ 
++#include <QMutex>
+ #include <QBuffer>
+ #include <QIODevice>
+ #include <QWebEngineUrlSchemeHandler>
+@@ -60,6 +61,7 @@ private:
+     QBuffer m_buffer;
+     QString m_pageName;
+     QWebEngineUrlRequestJob *m_job;
++    mutable QMutex m_mutex;
+ };
+ 
+ #endif // FALKONSCHEMEHANDLER_H
+-- 
+cgit v1.1

diff --git a/www-client/falkon/files/falkon-3.0.1-qtwebengine-version.patch b/www-client/falkon/files/falkon-3.0.1-qtwebengine-version.patch
new file mode 100644
index 00000000000..7634c30f616
--- /dev/null
+++ b/www-client/falkon/files/falkon-3.0.1-qtwebengine-version.patch
@@ -0,0 +1,72 @@
+Combined diffs:
+
+From d06a0d60e0ff3e9e3d5dbaec17b3447fca665b92 Mon Sep 17 00:00:00 2001
+From: Kevin Kofler <kevin.kofler@chello.at>
+Date: Sat, 12 May 2018 03:15:56 +0200
+Subject: Fix the fix for #391300 to require only QtWebEngine 5.10, not Qt 5.10
+
+QtWebEngine can be newer than the rest of Qt (e.g., on Fedora 27).
+
+From 9f0f688ee8ed7d454713db5418c9a86f80fd5850 Mon Sep 17 00:00:00 2001
+From: David Rosca <nowrep@gmail.com>
+Date: Mon, 14 May 2018 13:53:05 +0200
+Subject: Use QTWEBENGINE_VERSION instead of QT_VERSION
+
+Fixes build against separate QtWebEngine releases.
+
+* asturm@gentoo.org: Make #ifdef obsolete by requiring Qt 5.11.0.
+
+--- b/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -45,7 +45,7 @@
+ 
+ # Mandatory: Qt5
+-set(QT_MIN_VERSION "5.9.0")
++set(QT_MIN_VERSION "5.11.0")
+-find_package(Qt5 ${QT_MIN_VERSION} REQUIRED COMPONENTS Core Widgets Network Sql QuickWidgets PrintSupport WebEngineWidgets WebChannel)
++find_package(Qt5 ${QT_MIN_VERSION} REQUIRED COMPONENTS Core Widgets Network Sql QuickWidgets PrintSupport WebEngine WebEngineWidgets WebChannel)
+ if (BUILD_TESTING)
+     find_package(Qt5 ${QT_MIN_VERSION} REQUIRED COMPONENTS Test)
+ endif()
+--- a/src/lib/CMakeLists.txt
++++ b/src/lib/CMakeLists.txt
+@@ -297,6 +297,9 @@ qt5_add_resources(SRCS
+ 
+ add_library(FalkonPrivate SHARED ${SRCS})
+ 
++get_property(QT_WEBENGINE_INCLUDE_DIRS TARGET Qt5::WebEngine PROPERTY INTERFACE_INCLUDE_DIRECTORIES)
++target_include_directories(FalkonPrivate SYSTEM PUBLIC ${QT_WEBENGINE_INCLUDE_DIRS})
++
+ target_link_libraries(FalkonPrivate
+     Qt5::Widgets
+     Qt5::WebEngineWidgets
+--- a/src/lib/app/qzcommon.h
++++ b/src/lib/app/qzcommon.h
+@@ -20,6 +20,7 @@
+ 
+ #include <QDebug>
+ #include <QFlags>
++#include <QtWebEngineVersion>
+ 
+ #ifdef FALKON_SHAREDLIBRARY
+ #define FALKON_EXPORT Q_DECL_EXPORT
+--- a/src/lib/webengine/webview.cpp	2018-12-09 17:12:29.659899904 +0100
++++ b/src/lib/webengine/webview.cpp	2018-12-09 17:21:26.083044301 +0100
+@@ -495,7 +495,6 @@
+ 
+ void WebView::savePageAs()
+ {
+-#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)
+     page()->runJavaScript(QSL("document.contentType"), WebPage::SafeJsWorld, [this](const QVariant &res) {
+         const QSet<QString> webPageTypes = {
+             QSL("text/html"),
+@@ -507,9 +506,6 @@
+             page()->download(url());
+         }
+     });
+-#else
+-    triggerPageAction(QWebEnginePage::SavePage);
+-#endif
+ }
+ 
+ void WebView::copyImageToClipboard()

diff --git a/www-client/falkon/files/falkon-3.0.1-webinspector.patch b/www-client/falkon/files/falkon-3.0.1-webinspector.patch
new file mode 100644
index 00000000000..9cfea7e42dc
--- /dev/null
+++ b/www-client/falkon/files/falkon-3.0.1-webinspector.patch
@@ -0,0 +1,102 @@
+From 48ca42d645b155069a57eaede3e560874ed07bc7 Mon Sep 17 00:00:00 2001
+From: David Rosca <nowrep@gmail.com>
+Date: Thu, 1 Mar 2018 15:14:15 +0100
+Subject: WebInspector: Don't require remote debugging with QtWebEngine 5.11
+
+---
+ src/lib/webengine/webinspector.cpp | 11 ++++++++++-
+ src/lib/webengine/webinspector.h   | 11 ++++-------
+ 2 files changed, 14 insertions(+), 8 deletions(-)
+
+* asturm@gentoo.org: Make #ifdef obsolete by requiring Qt 5.11.0.
+
+ diff -u b/src/lib/webengine/webinspector.cpp b/src/lib/webengine/webinspector.cpp
+--- b/src/lib/webengine/webinspector.cpp
++++ b/src/lib/webengine/webinspector.cpp
+@@ -19,6 +19,8 @@
+ #include "mainapplication.h"
+ #include "networkmanager.h"
+ #include "settings.h"
++#include "webview.h"
++#include "webpage.h"
+ 
+ #include <QJsonArray>
+ #include <QJsonObject>
+@@ -60,27 +62,13 @@
+     }
+ }
+ 
+-void WebInspector::setView(QWebEngineView *view)
++void WebInspector::setView(WebView *view)
+ {
+     m_view = view;
+     Q_ASSERT(isEnabled());
+ 
+-    int port = qEnvironmentVariableIntValue("QTWEBENGINE_REMOTE_DEBUGGING");
+-    QUrl inspectorUrl = QUrl(QSL("http://localhost:%1").arg(port));
+-    int index = s_views.indexOf(m_view);
+-
+-    QNetworkReply *reply = mApp->networkManager()->get(QNetworkRequest(inspectorUrl.resolved(QUrl("json/list"))));
+-    connect(reply, &QNetworkReply::finished, this, [=]() {
+-        QJsonArray clients = QJsonDocument::fromJson(reply->readAll()).array();
+-        QUrl pageUrl;
+-        if (clients.size() > index) {
+-            QJsonObject object = clients.at(index).toObject();
+-            pageUrl = inspectorUrl.resolved(QUrl(object.value(QSL("devtoolsFrontendUrl")).toString()));
+-        }
+-        load(pageUrl);
+-        pushView(this);
+-        show();
+-    });
++    page()->setInspectedPage(m_view->page());
++    connect(m_view, &WebView::pageChanged, this, &WebInspector::deleteLater);
+ }
+ 
+ void WebInspector::inspectElement()
+@@ -90,9 +78,6 @@
+ 
+ bool WebInspector::isEnabled()
+ {
+-    if (!qEnvironmentVariableIsSet("QTWEBENGINE_REMOTE_DEBUGGING")) {
+-        return false;
+-    }
+     if (!mApp->webSettings()->testAttribute(QWebEngineSettings::JavascriptEnabled)) {
+         return false;
+     }
+--- a/src/lib/webengine/webinspector.h
++++ b/src/lib/webengine/webinspector.h
+@@ -15,14 +15,13 @@
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ * ============================================================ */
+-#ifndef WEBINSPECTORDOCKWIDGET_H
+-#define WEBINSPECTORDOCKWIDGET_H
++#pragma once
+ 
+ #include <QWebEngineView>
+ 
+ #include "qzcommon.h"
+ 
+-class ToolButton;
++class WebView;
+ 
+ class FALKON_EXPORT WebInspector : public QWebEngineView
+ {
+@@ -32,7 +31,7 @@ public:
+     explicit WebInspector(QWidget *parent = Q_NULLPTR);
+     ~WebInspector();
+ 
+-    void setView(QWebEngineView *view);
++    void setView(WebView *view);
+     void inspectElement();
+ 
+     static bool isEnabled();
+@@ -53,7 +52,5 @@ private:
+     int m_height;
+     QSize m_windowSize;
+     bool m_inspectElement = false;
+-    QWebEngineView *m_view;
++    WebView *m_view;
+ };
+-
+-#endif // WEBINSPECTORDOCKWIDGET_H


             reply	other threads:[~2018-12-09 20:33 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-12-09 20:32 Andreas Sturmlechner [this message]
  -- strict thread matches above, loose matches on Subject: below --
2019-03-20 12:29 [gentoo-commits] repo/gentoo:master commit in: www-client/falkon/files/, www-client/falkon/ Andreas Sturmlechner
2020-04-18 19:33 Andreas Sturmlechner
2022-05-22 19:29 Andreas Sturmlechner

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1544387567.50c1efe4e4631026b9a04a726c36e10c7d99c729.asturm@gentoo \
    --to=asturm@gentoo.org \
    --cc=gentoo-commits@lists.gentoo.org \
    --cc=gentoo-dev@lists.gentoo.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox