mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-04-16 14:17:12 +02:00
Set service name for lib_base and lib_webview gtk integration
This commit is contained in:
parent
3cdd115317
commit
17cee8ec56
7 changed files with 53 additions and 45 deletions
|
@ -58,18 +58,17 @@ int Launcher::exec() {
|
|||
return GtkIntegration::Exec(
|
||||
GtkIntegration::Type::Base,
|
||||
QString::fromStdString(*(i + 1)),
|
||||
std::stoi(*(i + 2)));
|
||||
} else if (*i == "-webviewhelper" && std::distance(i, e) > 3) {
|
||||
QString::fromStdString(*(i + 2)));
|
||||
} else if (*i == "-webviewhelper" && std::distance(i, e) > 2) {
|
||||
return GtkIntegration::Exec(
|
||||
GtkIntegration::Type::Webview,
|
||||
QString::fromStdString(*(i + 1)),
|
||||
std::stoi(*(i + 2)),
|
||||
std::stoi(*(i + 3)));
|
||||
QString::fromStdString(*(i + 2)));
|
||||
} else if (*i == "-gtkintegration" && std::distance(i, e) > 2) {
|
||||
return GtkIntegration::Exec(
|
||||
GtkIntegration::Type::TDesktop,
|
||||
QString::fromStdString(*(i + 1)),
|
||||
std::stoi(*(i + 2)));
|
||||
QString::fromStdString(*(i + 2)));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -16,11 +16,11 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
|||
#include "base/platform/linux/base_linux_glibmm_helper.h"
|
||||
#include "base/platform/linux/base_linux_dbus_utilities.h"
|
||||
#include "base/platform/base_platform_info.h"
|
||||
#include "webview/platform/linux/webview_linux_webkit2gtk.h"
|
||||
#include "platform/linux/linux_gtk_integration_p.h"
|
||||
#include "platform/linux/linux_gdk_helper.h"
|
||||
#include "platform/linux/linux_gtk_open_with_dialog.h"
|
||||
#include "platform/linux/linux_wayland_integration.h"
|
||||
#include "webview/webview_interface.h"
|
||||
#include "window/window_controller.h"
|
||||
#include "core/application.h"
|
||||
|
||||
|
@ -42,6 +42,8 @@ using BaseGtkIntegration = base::Platform::GtkIntegration;
|
|||
namespace {
|
||||
|
||||
constexpr auto kService = "org.telegram.desktop.GtkIntegration-%1"_cs;
|
||||
constexpr auto kBaseService = "org.telegram.desktop.BaseGtkIntegration-%1"_cs;
|
||||
constexpr auto kWebviewService = "org.telegram.desktop.GtkIntegration.WebviewHelper-%1-%2"_cs;
|
||||
constexpr auto kObjectPath = "/org/telegram/desktop/GtkIntegration"_cs;
|
||||
constexpr auto kInterface = "org.telegram.desktop.GtkIntegration"_cs;
|
||||
constexpr auto kPropertiesInterface = "org.freedesktop.DBus.Properties"_cs;
|
||||
|
@ -66,6 +68,8 @@ constexpr auto kIntrospectionXML = R"INTROSPECTION(<node>
|
|||
</interface>
|
||||
</node>)INTROSPECTION"_cs;
|
||||
|
||||
Glib::ustring ServiceName;
|
||||
|
||||
bool GetImageFromClipboardSupported() {
|
||||
return (gtk_clipboard_get != nullptr)
|
||||
&& (gtk_clipboard_wait_for_contents != nullptr)
|
||||
|
@ -93,8 +97,7 @@ public:
|
|||
return Glib::RefPtr<Gio::DBus::Connection>();
|
||||
}
|
||||
}())
|
||||
, interfaceVTable(sigc::mem_fun(this, &Private::handleMethodCall))
|
||||
, serviceName(kService.utf16().arg(getpid()).toStdString()) {
|
||||
, interfaceVTable(sigc::mem_fun(this, &Private::handleMethodCall)) {
|
||||
}
|
||||
|
||||
void handleMethodCall(
|
||||
|
@ -109,7 +112,6 @@ public:
|
|||
const Glib::RefPtr<Gio::DBus::Connection> dbusConnection;
|
||||
const Gio::DBus::InterfaceVTable interfaceVTable;
|
||||
Glib::RefPtr<Gio::DBus::NodeInfo> introspectionData;
|
||||
Glib::ustring serviceName;
|
||||
Glib::ustring parentDBusName;
|
||||
bool remoting = true;
|
||||
uint registerId = 0;
|
||||
|
@ -303,7 +305,7 @@ void GtkIntegration::load(const QString &allowedBackends) {
|
|||
base::Platform::MakeGlibVariant(std::tuple{
|
||||
Glib::ustring(allowedBackends.toStdString()),
|
||||
}),
|
||||
_private->serviceName);
|
||||
ServiceName);
|
||||
} catch (...) {
|
||||
}
|
||||
|
||||
|
@ -344,9 +346,8 @@ void GtkIntegration::load(const QString &allowedBackends) {
|
|||
Loaded = true;
|
||||
}
|
||||
|
||||
int GtkIntegration::exec(const QString &parentDBusName, int ppid) {
|
||||
int GtkIntegration::exec(const QString &parentDBusName) {
|
||||
_private->remoting = false;
|
||||
_private->serviceName = kService.utf16().arg(ppid).toStdString();
|
||||
_private->parentDBusName = parentDBusName.toStdString();
|
||||
|
||||
_private->introspectionData = Gio::DBus::NodeInfo::create_for_xml(
|
||||
|
@ -357,7 +358,7 @@ int GtkIntegration::exec(const QString &parentDBusName, int ppid) {
|
|||
_private->introspectionData->lookup_interface(),
|
||||
_private->interfaceVTable);
|
||||
|
||||
const auto app = Gio::Application::create(_private->serviceName);
|
||||
const auto app = Gio::Application::create(ServiceName);
|
||||
app->hold();
|
||||
_private->parentServiceWatcherId = base::Platform::DBus::RegisterServiceWatcher(
|
||||
_private->dbusConnection,
|
||||
|
@ -406,7 +407,7 @@ bool GtkIntegration::showOpenWithDialog(const QString &filepath) const {
|
|||
Glib::ustring(parent.toStdString()),
|
||||
Glib::ustring(filepath.toStdString()),
|
||||
}),
|
||||
_private->serviceName);
|
||||
ServiceName);
|
||||
|
||||
const auto context = Glib::MainContext::create();
|
||||
const auto loop = Glib::MainLoop::create(context);
|
||||
|
@ -434,7 +435,7 @@ bool GtkIntegration::showOpenWithDialog(const QString &filepath) const {
|
|||
} catch (...) {
|
||||
}
|
||||
},
|
||||
_private->serviceName,
|
||||
ServiceName,
|
||||
std::string(kInterface),
|
||||
"OpenWithDialogResponse",
|
||||
std::string(kObjectPath));
|
||||
|
@ -505,7 +506,7 @@ QImage GtkIntegration::getImageFromClipboard() const {
|
|||
{},
|
||||
{},
|
||||
outFdList,
|
||||
_private->serviceName);
|
||||
ServiceName);
|
||||
|
||||
const auto streamSize = base::Platform::GlibVariantCast<int>(
|
||||
reply.get_child(1));
|
||||
|
@ -609,25 +610,22 @@ QString GtkIntegration::AllowedBackends() {
|
|||
int GtkIntegration::Exec(
|
||||
Type type,
|
||||
const QString &parentDBusName,
|
||||
int ppid,
|
||||
uint instanceNumber) {
|
||||
const QString &serviceName) {
|
||||
Glib::init();
|
||||
Gio::init();
|
||||
|
||||
if (type == Type::Base) {
|
||||
BaseGtkIntegration::SetServiceName(serviceName);
|
||||
if (const auto integration = BaseGtkIntegration::Instance()) {
|
||||
return integration->exec(parentDBusName, ppid);
|
||||
return integration->exec(parentDBusName);
|
||||
}
|
||||
} else if (type == Type::Webview) {
|
||||
if (const auto instance = Webview::CreateInstance({})) {
|
||||
return instance->exec(
|
||||
parentDBusName.toStdString(),
|
||||
ppid,
|
||||
instanceNumber);
|
||||
}
|
||||
Webview::WebKit2Gtk::SetServiceName(serviceName.toStdString());
|
||||
return Webview::WebKit2Gtk::Exec(parentDBusName.toStdString());
|
||||
} else if (type == Type::TDesktop) {
|
||||
ServiceName = serviceName.toStdString();
|
||||
if (const auto integration = Instance()) {
|
||||
return integration->exec(parentDBusName, ppid);
|
||||
return integration->exec(parentDBusName);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -635,10 +633,27 @@ int GtkIntegration::Exec(
|
|||
}
|
||||
|
||||
void GtkIntegration::Start(Type type) {
|
||||
if (type != Type::Base && type != Type::TDesktop) {
|
||||
if (type != Type::Base
|
||||
&& type != Type::Webview
|
||||
&& type != Type::TDesktop) {
|
||||
return;
|
||||
}
|
||||
|
||||
const auto d = QFile::encodeName(QDir(cWorkingDir()).absolutePath());
|
||||
char h[33] = { 0 };
|
||||
hashMd5Hex(d.constData(), d.size(), h);
|
||||
|
||||
if (type == Type::Base) {
|
||||
BaseGtkIntegration::SetServiceName(kBaseService.utf16().arg(h));
|
||||
} else if (type == Type::Webview) {
|
||||
Webview::WebKit2Gtk::SetServiceName(
|
||||
kWebviewService.utf16().arg(h).arg("%1").toStdString());
|
||||
|
||||
return;
|
||||
} else {
|
||||
ServiceName = kService.utf16().arg(h).toStdString();
|
||||
}
|
||||
|
||||
const auto dbusName = [] {
|
||||
try {
|
||||
static const auto connection = Gio::DBus::Connection::get_sync(
|
||||
|
@ -659,7 +674,9 @@ void GtkIntegration::Start(Type type) {
|
|||
? qsl("-basegtkintegration")
|
||||
: qsl("-gtkintegration"),
|
||||
dbusName,
|
||||
QString::number(getpid()),
|
||||
(type == Type::Base)
|
||||
? kBaseService.utf16().arg(h)
|
||||
: kService.utf16().arg(h),
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -672,18 +689,11 @@ void GtkIntegration::Autorestart(Type type) {
|
|||
static const auto connection = Gio::DBus::Connection::get_sync(
|
||||
Gio::DBus::BusType::BUS_TYPE_SESSION);
|
||||
|
||||
const auto baseServiceName = [] {
|
||||
if (const auto integration = BaseGtkIntegration::Instance()) {
|
||||
return integration->serviceName();
|
||||
}
|
||||
return QString();
|
||||
}();
|
||||
|
||||
base::Platform::DBus::RegisterServiceWatcher(
|
||||
connection,
|
||||
(type == Type::Base)
|
||||
? baseServiceName.toStdString()
|
||||
: kService.utf16().arg(getpid()).toStdString(),
|
||||
? Glib::ustring(BaseGtkIntegration::ServiceName().toStdString())
|
||||
: ServiceName,
|
||||
[=](
|
||||
const Glib::ustring &service,
|
||||
const Glib::ustring &oldOwner,
|
||||
|
|
|
@ -21,7 +21,7 @@ public:
|
|||
static GtkIntegration *Instance();
|
||||
|
||||
void load(const QString &allowedBackends);
|
||||
int exec(const QString &parentDBusName, int ppid);
|
||||
int exec(const QString &parentDBusName);
|
||||
|
||||
[[nodiscard]] bool showOpenWithDialog(const QString &filepath) const;
|
||||
|
||||
|
@ -32,8 +32,7 @@ public:
|
|||
static int Exec(
|
||||
Type type,
|
||||
const QString &parentDBusName,
|
||||
int ppid,
|
||||
uint instanceNumber = 0);
|
||||
const QString &serviceName);
|
||||
|
||||
static void Start(Type type);
|
||||
|
||||
|
|
|
@ -25,7 +25,7 @@ GtkIntegration *GtkIntegration::Instance() {
|
|||
void GtkIntegration::load(const QString &allowedBackends) {
|
||||
}
|
||||
|
||||
int GtkIntegration::exec(const QString &parentDBusName, int ppid) {
|
||||
int GtkIntegration::exec(const QString &parentDBusName) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -44,8 +44,7 @@ QString GtkIntegration::AllowedBackends() {
|
|||
int GtkIntegration:Exec(
|
||||
Type type,
|
||||
const QString &parentDBusName,
|
||||
int ppid,
|
||||
uint instanceNumber) {
|
||||
const QString &serviceName) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
|
@ -746,6 +746,7 @@ void start() {
|
|||
Glib::set_application_name(std::string(AppName));
|
||||
|
||||
GtkIntegration::Start(GtkIntegration::Type::Base);
|
||||
GtkIntegration::Start(GtkIntegration::Type::Webview);
|
||||
GtkIntegration::Start(GtkIntegration::Type::TDesktop);
|
||||
|
||||
#ifdef DESKTOP_APP_USE_PACKAGED_RLOTTIE
|
||||
|
|
|
@ -1 +1 @@
|
|||
Subproject commit f493a8174f993119de8d9a5170dc89641bfafbef
|
||||
Subproject commit b721f4d1302c5119d59ab35ddfd5abb90fab42ed
|
|
@ -1 +1 @@
|
|||
Subproject commit 794aba38bac729471afbcc3aca62400bafd55b4c
|
||||
Subproject commit 1a3206777c0bca6d9fb5b643131e6d2b028a336f
|
Loading…
Add table
Reference in a new issue