diff options
author | Milian Wolff <milian.wolff@kdab.com> | 2018-01-10 17:12:00 +0100 |
---|---|---|
committer | Thorsten Behrens <Thorsten.Behrens@CIB.de> | 2018-01-23 13:38:32 +0100 |
commit | f811979b0865b15272ce4a62df3ebd0fa8896b55 (patch) | |
tree | 924ef82d5e3cef63709b7aca6fda3241028f4c82 /shell | |
parent | 0e2e5d247ababc8aeb0c041364938cd5cf9e55c2 (diff) |
Add KDE5 desktop backend
This is mostly a copy of the KDE4 backend ported to Qt5/KF5.
One difference is that this code will initialize the QApplication
on-demand, when it's not yet available. This will allow us to use
this desktop backend also within a vclplug that does not use Qt
itself, such as the upcoming Gtk3/KDE5 hybrid.
Change-Id: I5cf96ac5729608c82a58eead6723a38f014ba875
Reviewed-on: https://gerrit.libreoffice.org/47716
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Thorsten Behrens <Thorsten.Behrens@CIB.de>
Diffstat (limited to 'shell')
-rw-r--r-- | shell/Library_kde5be.mk | 32 | ||||
-rw-r--r-- | shell/Module_shell.mk | 6 | ||||
-rw-r--r-- | shell/source/backends/desktopbe/desktopbackend.cxx | 4 | ||||
-rw-r--r-- | shell/source/backends/kde5be/kde5access.cxx | 316 | ||||
-rw-r--r-- | shell/source/backends/kde5be/kde5access.hxx | 48 | ||||
-rw-r--r-- | shell/source/backends/kde5be/kde5backend.cxx | 252 | ||||
-rw-r--r-- | shell/source/backends/kde5be/kde5be1.component | 25 |
7 files changed, 683 insertions, 0 deletions
diff --git a/shell/Library_kde5be.mk b/shell/Library_kde5be.mk new file mode 100644 index 000000000000..b9c7c903a745 --- /dev/null +++ b/shell/Library_kde5be.mk @@ -0,0 +1,32 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +$(eval $(call gb_Library_Library,kde5be1)) + +$(eval $(call gb_Library_use_sdk_api,kde5be1)) + +$(eval $(call gb_Library_use_externals,kde5be1,\ + boost_headers \ + kde5 \ +)) + +$(eval $(call gb_Library_use_libraries,kde5be1,\ + cppu \ + cppuhelper \ + sal \ +)) + +$(eval $(call gb_Library_set_componentfile,kde5be1,shell/source/backends/kde5be/kde5be1)) + +$(eval $(call gb_Library_add_exception_objects,kde5be1,\ + shell/source/backends/kde5be/kde5access \ + shell/source/backends/kde5be/kde5backend \ +)) + +# vim: set shiftwidth=4 tabstop=4 noexpandtab: diff --git a/shell/Module_shell.mk b/shell/Module_shell.mk index d1a54b9cf9ea..5da2416b6662 100644 --- a/shell/Module_shell.mk +++ b/shell/Module_shell.mk @@ -36,6 +36,12 @@ $(eval $(call gb_Module_add_targets,shell,\ )) endif +ifeq ($(ENABLE_KDE5),TRUE) +$(eval $(call gb_Module_add_targets,shell,\ + Library_kde5be \ +)) +endif + ifeq ($(OS),WNT) $(eval $(call gb_Module_add_targets,shell,\ diff --git a/shell/source/backends/desktopbe/desktopbackend.cxx b/shell/source/backends/desktopbe/desktopbackend.cxx index b641d00456e8..275c9e459c90 100644 --- a/shell/source/backends/desktopbe/desktopbackend.cxx +++ b/shell/source/backends/desktopbe/desktopbackend.cxx @@ -307,6 +307,10 @@ css::uno::Reference< css::uno::XInterface > createInstance( backend = createBackend( context, "com.sun.star.configuration.backend.KDE4Backend"); + } else if ( desktop == "KDE5" ) { + backend = createBackend( + context, + "com.sun.star.configuration.backend.KDE5Backend"); } return backend.is() ? backend : static_cast< cppu::OWeakObject * >(new Default); diff --git a/shell/source/backends/kde5be/kde5access.cxx b/shell/source/backends/kde5be/kde5access.cxx new file mode 100644 index 000000000000..5c4c0a0173f1 --- /dev/null +++ b/shell/source/backends/kde5be/kde5access.cxx @@ -0,0 +1,316 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "sal/config.h" + +#include "kde5access.hxx" + +#include <QtGui/QFont> +#include <QtCore/QString> +#include <QtGui/QFontDatabase> +#include <QtCore/QStandardPaths> +#include <QtCore/QDir> +#include <QtCore/QUrl> + +#include <kprotocolmanager.h> + +#include <kemailsettings.h> +// #include <kglobalsettings.h> + +#include <com/sun/star/uno/Any.hxx> +#include <cppu/unotype.hxx> +#include <osl/diagnose.h> +#include <osl/file.h> +#include <rtl/string.h> +#include <rtl/ustring.hxx> + +namespace kde5access +{ +namespace +{ +namespace uno = css::uno; +} + +css::beans::Optional<css::uno::Any> getValue(OUString const& id) +{ + if (id == "ExternalMailer") + { + KEMailSettings aEmailSettings; + QString aClientProgram; + OUString sClientProgram; + + aClientProgram = aEmailSettings.getSetting(KEMailSettings::ClientProgram); + if (aClientProgram.isEmpty()) + aClientProgram = QStringLiteral("kmail"); + else + aClientProgram = aClientProgram.section(QLatin1Char(' '), 0, 0); + sClientProgram = reinterpret_cast<const sal_Unicode*>(aClientProgram.utf16()); + return css::beans::Optional<css::uno::Any>(true, uno::makeAny(sClientProgram)); + } + else if (id == "SourceViewFontHeight") + { + const QFont aFixedFont = QFontDatabase::systemFont(QFontDatabase::FixedFont); + const short nFontHeight = aFixedFont.pointSize(); + return css::beans::Optional<css::uno::Any>(true, uno::makeAny(nFontHeight)); + } + else if (id == "SourceViewFontName") + { + const QFont aFixedFont = QFontDatabase::systemFont(QFontDatabase::FixedFont); + const QString aFontName = aFixedFont.family(); + const OUString sFontName = reinterpret_cast<const sal_Unicode*>(aFontName.utf16()); + return css::beans::Optional<css::uno::Any>(true, uno::makeAny(sFontName)); + } + else if (id == "EnableATToolSupport") + { + /* does not make much sense without an accessibility bridge */ + bool ATToolSupport = false; + return css::beans::Optional<css::uno::Any>(true, + uno::makeAny(OUString::boolean(ATToolSupport))); + } + else if (id == "WorkPathVariable") + { + QString aDocumentsDir(QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)); + if (aDocumentsDir.isEmpty()) + aDocumentsDir = QDir::homePath(); + OUString sDocumentsDir; + OUString sDocumentsURL; + if (aDocumentsDir.endsWith(QLatin1Char('/'))) + aDocumentsDir.truncate(aDocumentsDir.length() - 1); + sDocumentsDir = reinterpret_cast<const sal_Unicode*>(aDocumentsDir.utf16()); + osl_getFileURLFromSystemPath(sDocumentsDir.pData, &sDocumentsURL.pData); + return css::beans::Optional<css::uno::Any>(true, uno::makeAny(sDocumentsURL)); + } + else if (id == "ooInetFTPProxyName") + { + QString aFTPProxy; + switch (KProtocolManager::proxyType()) + { + case KProtocolManager::ManualProxy: // Proxies are manually configured + aFTPProxy = KProtocolManager::proxyFor(QStringLiteral("FTP")); + break; + case KProtocolManager::PACProxy: // A proxy configuration URL has been given + case KProtocolManager::WPADProxy: // A proxy should be automatically discovered + case KProtocolManager:: + EnvVarProxy: // Use the proxy values set through environment variables + // In such cases, the proxy address is not stored in KDE, but determined dynamically. + // The proxy address may depend on the requested address, on the time of the day, on the speed of the wind... + // The best we can do here is to ask the current value for a given address. + aFTPProxy = KProtocolManager::proxyForUrl( + QUrl(QStringLiteral("ftp://ftp.libreoffice.org"))); + break; + default: // No proxy is used + break; + } + if (!aFTPProxy.isEmpty()) + { + QUrl aProxy(aFTPProxy); + OUString sProxy = reinterpret_cast<const sal_Unicode*>(aProxy.host().utf16()); + return css::beans::Optional<css::uno::Any>(true, uno::makeAny(sProxy)); + } + } + else if (id == "ooInetFTPProxyPort") + { + QString aFTPProxy; + switch (KProtocolManager::proxyType()) + { + case KProtocolManager::ManualProxy: // Proxies are manually configured + aFTPProxy = KProtocolManager::proxyFor(QStringLiteral("FTP")); + break; + case KProtocolManager::PACProxy: // A proxy configuration URL has been given + case KProtocolManager::WPADProxy: // A proxy should be automatically discovered + case KProtocolManager:: + EnvVarProxy: // Use the proxy values set through environment variables + // In such cases, the proxy address is not stored in KDE, but determined dynamically. + // The proxy address may depend on the requested address, on the time of the day, on the speed of the wind... + // The best we can do here is to ask the current value for a given address. + aFTPProxy = KProtocolManager::proxyForUrl( + QUrl(QStringLiteral("ftp://ftp.libreoffice.org"))); + break; + default: // No proxy is used + break; + } + if (!aFTPProxy.isEmpty()) + { + QUrl aProxy(aFTPProxy); + sal_Int32 nPort = aProxy.port(); + return css::beans::Optional<css::uno::Any>(true, uno::makeAny(nPort)); + } + } + else if (id == "ooInetHTTPProxyName") + { + QString aHTTPProxy; + switch (KProtocolManager::proxyType()) + { + case KProtocolManager::ManualProxy: // Proxies are manually configured + aHTTPProxy = KProtocolManager::proxyFor(QStringLiteral("HTTP")); + break; + case KProtocolManager::PACProxy: // A proxy configuration URL has been given + case KProtocolManager::WPADProxy: // A proxy should be automatically discovered + case KProtocolManager:: + EnvVarProxy: // Use the proxy values set through environment variables + // In such cases, the proxy address is not stored in KDE, but determined dynamically. + // The proxy address may depend on the requested address, on the time of the day, on the speed of the wind... + // The best we can do here is to ask the current value for a given address. + aHTTPProxy = KProtocolManager::proxyForUrl( + QUrl(QStringLiteral("ftp://ftp.libreoffice.org"))); + break; + default: // No proxy is used + break; + } + if (!aHTTPProxy.isEmpty()) + { + QUrl aProxy(aHTTPProxy); + OUString sProxy = reinterpret_cast<const sal_Unicode*>(aProxy.host().utf16()); + return css::beans::Optional<css::uno::Any>(true, uno::makeAny(sProxy)); + } + } + else if (id == "ooInetHTTPProxyPort") + { + QString aHTTPProxy; + switch (KProtocolManager::proxyType()) + { + case KProtocolManager::ManualProxy: // Proxies are manually configured + aHTTPProxy = KProtocolManager::proxyFor(QStringLiteral("HTTP")); + break; + case KProtocolManager::PACProxy: // A proxy configuration URL has been given + case KProtocolManager::WPADProxy: // A proxy should be automatically discovered + case KProtocolManager:: + EnvVarProxy: // Use the proxy values set through environment variables + // In such cases, the proxy address is not stored in KDE, but determined dynamically. + // The proxy address may depend on the requested address, on the time of the day, on the speed of the wind... + // The best we can do here is to ask the current value for a given address. + aHTTPProxy = KProtocolManager::proxyForUrl( + QUrl(QStringLiteral("ftp://ftp.libreoffice.org"))); + break; + default: // No proxy is used + break; + } + if (!aHTTPProxy.isEmpty()) + { + QUrl aProxy(aHTTPProxy); + sal_Int32 nPort = aProxy.port(); + return css::beans::Optional<css::uno::Any>(true, uno::makeAny(nPort)); + } + } + else if (id == "ooInetHTTPSProxyName") + { + QString aHTTPSProxy; + switch (KProtocolManager::proxyType()) + { + case KProtocolManager::ManualProxy: // Proxies are manually configured + aHTTPSProxy = KProtocolManager::proxyFor(QStringLiteral("HTTPS")); + break; + case KProtocolManager::PACProxy: // A proxy configuration URL has been given + case KProtocolManager::WPADProxy: // A proxy should be automatically discovered + case KProtocolManager:: + EnvVarProxy: // Use the proxy values set through environment variables + // In such cases, the proxy address is not stored in KDE, but determined dynamically. + // The proxy address may depend on the requested address, on the time of the day, on the speed of the wind... + // The best we can do here is to ask the current value for a given address. + aHTTPSProxy = KProtocolManager::proxyForUrl( + QUrl(QStringLiteral("ftp://ftp.libreoffice.org"))); + break; + default: // No proxy is used + break; + } + if (!aHTTPSProxy.isEmpty()) + { + QUrl aProxy(aHTTPSProxy); + OUString sProxy = reinterpret_cast<const sal_Unicode*>(aProxy.host().utf16()); + return css::beans::Optional<css::uno::Any>(true, uno::makeAny(sProxy)); + } + } + else if (id == "ooInetHTTPSProxyPort") + { + QString aHTTPSProxy; + switch (KProtocolManager::proxyType()) + { + case KProtocolManager::ManualProxy: // Proxies are manually configured + aHTTPSProxy = KProtocolManager::proxyFor(QStringLiteral("HTTPS")); + break; + case KProtocolManager::PACProxy: // A proxy configuration URL has been given + case KProtocolManager::WPADProxy: // A proxy should be automatically discovered + case KProtocolManager:: + EnvVarProxy: // Use the proxy values set through environment variables + // In such cases, the proxy address is not stored in KDE, but determined dynamically. + // The proxy address may depend on the requested address, on the time of the day, on the speed of the wind... + // The best we can do here is to ask the current value for a given address. + aHTTPSProxy = KProtocolManager::proxyForUrl( + QUrl(QStringLiteral("ftp://ftp.libreoffice.org"))); + break; + default: // No proxy is used + break; + } + if (!aHTTPSProxy.isEmpty()) + { + QUrl aProxy(aHTTPSProxy); + sal_Int32 nPort = aProxy.port(); + return css::beans::Optional<css::uno::Any>(true, uno::makeAny(nPort)); + } + } + else if (id == "ooInetNoProxy") + { + QString aNoProxyFor; + switch (KProtocolManager::proxyType()) + { + case KProtocolManager::ManualProxy: // Proxies are manually configured + case KProtocolManager::PACProxy: // A proxy configuration URL has been given + case KProtocolManager::WPADProxy: // A proxy should be automatically discovered + case KProtocolManager:: + EnvVarProxy: // Use the proxy values set through environment variables + aNoProxyFor = KProtocolManager::noProxyFor(); + break; + default: // No proxy is used + break; + } + if (!aNoProxyFor.isEmpty()) + { + OUString sNoProxyFor; + + aNoProxyFor = aNoProxyFor.replace(QLatin1Char(','), QLatin1Char(';')); + sNoProxyFor = reinterpret_cast<const sal_Unicode*>(aNoProxyFor.utf16()); + return css::beans::Optional<css::uno::Any>(true, uno::makeAny(sNoProxyFor)); + } + } + else if (id == "ooInetProxyType") + { + int nProxyType; + switch (KProtocolManager::proxyType()) + { + case KProtocolManager::ManualProxy: // Proxies are manually configured + case KProtocolManager::PACProxy: // A proxy configuration URL has been given + case KProtocolManager::WPADProxy: // A proxy should be automatically discovered + case KProtocolManager:: + EnvVarProxy: // Use the proxy values set through environment variables + nProxyType = 1; + break; + default: // No proxy is used + nProxyType = 0; + } + return css::beans::Optional<css::uno::Any>(true, uno::makeAny((sal_Int32)nProxyType)); + } + else + { + OSL_ASSERT(false); // this cannot happen + } + return css::beans::Optional<css::uno::Any>(); +} +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/shell/source/backends/kde5be/kde5access.hxx b/shell/source/backends/kde5be/kde5access.hxx new file mode 100644 index 000000000000..e1e8a11c8a94 --- /dev/null +++ b/shell/source/backends/kde5be/kde5access.hxx @@ -0,0 +1,48 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_SHELL_SOURCE_BACKENDS_KDE5BE_KDE5ACCESS_HXX +#define INCLUDED_SHELL_SOURCE_BACKENDS_KDE5BE_KDE5ACCESS_HXX + +#include <sal/config.h> + +#include <com/sun/star/beans/Optional.hpp> + +namespace com +{ +namespace sun +{ +namespace star +{ +namespace uno +{ +class Any; +} +} +} +} + +namespace kde5access +{ +css::beans::Optional<css::uno::Any> getValue(OUString const& id); +} + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/shell/source/backends/kde5be/kde5backend.cxx b/shell/source/backends/kde5be/kde5backend.cxx new file mode 100644 index 000000000000..c89869579159 --- /dev/null +++ b/shell/source/backends/kde5be/kde5backend.cxx @@ -0,0 +1,252 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include <sal/config.h> + +#include <QtWidgets/QApplication> + +#include <boost/noncopyable.hpp> +#include <com/sun/star/beans/Optional.hpp> +#include <com/sun/star/beans/PropertyVetoException.hpp> +#include <com/sun/star/beans/UnknownPropertyException.hpp> +#include <com/sun/star/beans/XPropertyChangeListener.hpp> +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/beans/XPropertySetInfo.hpp> +#include <com/sun/star/beans/XVetoableChangeListener.hpp> +#include <com/sun/star/lang/IllegalArgumentException.hpp> +#include <com/sun/star/lang/WrappedTargetException.hpp> +#include <com/sun/star/lang/XMultiComponentFactory.hpp> +#include <com/sun/star/lang/XServiceInfo.hpp> +#include <com/sun/star/uno/Any.hxx> +#include <com/sun/star/uno/Reference.hxx> +#include <com/sun/star/uno/RuntimeException.hpp> +#include <com/sun/star/uno/Sequence.hxx> +#include <com/sun/star/uno/XComponentContext.hpp> +#include <com/sun/star/uno/XCurrentContext.hpp> +#include <cppuhelper/factory.hxx> +#include <cppuhelper/implbase.hxx> +#include <cppuhelper/implementationentry.hxx> +#include <cppuhelper/weak.hxx> +#include <rtl/string.h> +#include <rtl/ustring.h> +#include <rtl/ustring.hxx> +#include <sal/types.h> +#include <uno/current_context.hxx> + +#include <osl/process.h> +#include <osl/thread.h> + +#include "kde5access.hxx" + +namespace +{ +OUString SAL_CALL getServiceImplementationName() +{ + return OUString("com.sun.star.comp.configuration.backend.KDE5Backend"); +} + +css::uno::Sequence<OUString> SAL_CALL getServiceSupportedServiceNames() +{ + OUString name("com.sun.star.configuration.backend.KDE5Backend"); + return css::uno::Sequence<OUString>(&name, 1); +} + +class Service : public cppu::WeakImplHelper<css::lang::XServiceInfo, css::beans::XPropertySet>, + private boost::noncopyable +{ +public: + Service(); + +private: + virtual ~Service() {} + + virtual OUString SAL_CALL getImplementationName() override + { + return getServiceImplementationName(); + } + + virtual sal_Bool SAL_CALL supportsService(OUString const& ServiceName) override + { + return ServiceName == getSupportedServiceNames()[0]; + } + + virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override + { + return getServiceSupportedServiceNames(); + } + + virtual css::uno::Reference<css::beans::XPropertySetInfo> SAL_CALL getPropertySetInfo() override + { + return css::uno::Reference<css::beans::XPropertySetInfo>(); + } + + virtual void SAL_CALL setPropertyValue(OUString const&, css::uno::Any const&) override; + + virtual css::uno::Any SAL_CALL getPropertyValue(OUString const& PropertyName) override; + + virtual void SAL_CALL addPropertyChangeListener( + OUString const&, css::uno::Reference<css::beans::XPropertyChangeListener> const&) override + { + } + + virtual void SAL_CALL removePropertyChangeListener( + OUString const&, css::uno::Reference<css::beans::XPropertyChangeListener> const&) override + { + } + + virtual void SAL_CALL addVetoableChangeListener( + OUString const&, css::uno::Reference<css::beans::XVetoableChangeListener> const&) override + { + } + + virtual void SAL_CALL removeVetoableChangeListener( + OUString const&, css::uno::Reference<css::beans::XVetoableChangeListener> const&) override + { + } + + bool enabled_; +}; + +OString getDisplayArg() +{ + OUString aParam; + const sal_uInt32 nParams = osl_getCommandArgCount(); + for (sal_uInt32 nIdx = 0; nIdx < nParams; ++nIdx) + { + osl_getCommandArg(nIdx, &aParam.pData); + if (aParam != "-display") + continue; + + ++nIdx; + osl_getCommandArg(nIdx, &aParam.pData); + return OUStringToOString(aParam, osl_getThreadTextEncoding()); + } + return {}; +} + +OString getExecutable() +{ + OUString aParam, aBin; + osl_getExecutableFile(&aParam.pData); + osl_getSystemPathFromFileURL(aParam.pData, &aBin.pData); + return OUStringToOString(aBin, osl_getThreadTextEncoding()); +} + +// init the QApplication when we load the kde5backend into a non-Qt vclplug (e.g. Gtk3KDE5) +// TODO: use a helper process to read these values without linking to Qt directly? +// TODO: share this code somehow with Qt5Instance.cxx? +void initQApp() +{ + const auto aDisplay = getDisplayArg(); + int nFakeArgc = aDisplay.isEmpty() ? 2 : 3; + char** pFakeArgv = new char*[nFakeArgc]; + + pFakeArgv[0] = strdup(getExecutable().getStr()); + pFakeArgv[1] = strdup("--nocrashhandler"); + if (aDisplay.isEmpty()) + pFakeArgv[2] = strdup(aDisplay.getStr()); + + char* session_manager = nullptr; + if (auto* session_manager_env = getenv("SESSION_MANAGER")) + { + session_manager = strdup(session_manager_env); + unsetenv("SESSION_MANAGER"); + } + + auto app = new QApplication(nFakeArgc, pFakeArgv); + QObject::connect(app, &QObject::destroyed, app, [nFakeArgc, pFakeArgv]() { + for (int i = 0; i < nFakeArgc; ++i) + delete pFakeArgv[i]; + delete[] pFakeArgv; + }); + + if (session_manager != nullptr) + { + // coverity[tainted_string] - trusted source for setenv + setenv("SESSION_MANAGER", session_manager, 1); + free(session_manager); + } + + QApplication::setQuitOnLastWindowClosed(false); +} + +Service::Service() + : enabled_(false) +{ + css::uno::Reference<css::uno::XCurrentContext> context(css::uno::getCurrentContext()); + if (context.is()) + { + if (!qApp) + { + initQApp(); + } + OUString desktop; + context->getValueByName("system.desktop-environment") >>= desktop; + enabled_ = desktop == "KDE5" && qApp != nullptr; + } +} + +void Service::setPropertyValue(OUString const&, css::uno::Any const&) +{ + throw css::lang::IllegalArgumentException(OUString("setPropertyValue not supported"), + static_cast<cppu::OWeakObject*>(this), -1); +} + +css::uno::Any Service::getPropertyValue(OUString const& PropertyName) +{ + if (PropertyName == "EnableATToolSupport" || PropertyName == "ExternalMailer" + || PropertyName == "SourceViewFontHeight" || PropertyName == "SourceViewFontName" + || PropertyName == "WorkPathVariable" || PropertyName == "ooInetFTPProxyName" + || PropertyName == "ooInetFTPProxyPort" || PropertyName == "ooInetHTTPProxyName" + || PropertyName == "ooInetHTTPProxyPort" || PropertyName == "ooInetHTTPSProxyName" + || PropertyName == "ooInetHTTPSProxyPort" || PropertyName == "ooInetNoProxy" + || PropertyName == "ooInetProxyType") + { + return css::uno::makeAny(enabled_ ? kde5access::getValue(PropertyName) + : css::beans::Optional<css::uno::Any>()); + } + else if (PropertyName == "givenname" || PropertyName == "sn" + || PropertyName == "TemplatePathVariable") + { + return css::uno::makeAny(css::beans::Optional<css::uno::Any>()); + //TODO: obtain values from KDE? + } + throw css::beans::UnknownPropertyException(PropertyName, static_cast<cppu::OWeakObject*>(this)); +} + +css::uno::Reference<css::uno::XInterface> + SAL_CALL createInstance(css::uno::Reference<css::uno::XComponentContext> const&) +{ + return static_cast<cppu::OWeakObject*>(new Service); +} + +static cppu::ImplementationEntry const services[] + = { { &createInstance, &getServiceImplementationName, &getServiceSupportedServiceNames, + &cppu::createSingleComponentFactory, nullptr, 0 }, + { nullptr, nullptr, nullptr, nullptr, nullptr, 0 } }; +} + +extern "C" SAL_DLLPUBLIC_EXPORT void* SAL_CALL kde5be1_component_getFactory(char const* pImplName, + void* pServiceManager, + void* pRegistryKey) +{ + return cppu::component_getFactoryHelper(pImplName, pServiceManager, pRegistryKey, services); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/shell/source/backends/kde5be/kde5be1.component b/shell/source/backends/kde5be/kde5be1.component new file mode 100644 index 000000000000..74111874cb6b --- /dev/null +++ b/shell/source/backends/kde5be/kde5be1.component @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + --> + +<component loader="com.sun.star.loader.SharedLibrary" environment="@CPPU_ENV@" + prefix="kde5be1" xmlns="http://openoffice.org/2010/uno-components"> + <implementation name="com.sun.star.comp.configuration.backend.KDE5Backend"> + <service name="com.sun.star.configuration.backend.KDE5Backend"/> + </implementation> +</component> |