Kaydet (Commit) f811979b authored tarafından Milian Wolff's avatar Milian Wolff Kaydeden (comit) Thorsten Behrens

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/47716Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarThorsten Behrens <Thorsten.Behrens@CIB.de>
üst 0e2e5d24
......@@ -297,6 +297,7 @@ $(eval $(call gb_Helper_register_libraries_for_install,OOOLIBS,gnome, \
$(eval $(call gb_Helper_register_libraries_for_install,OOOLIBS,kde, \
$(if $(ENABLE_KDE4),kde4be1) \
$(if $(ENABLE_KDE5),kde5be1) \
$(if $(USING_X11), \
$(if $(ENABLE_KDE4),vclplug_kde4) \
$(if $(ENABLE_KDE5),vclplug_kde5) \
......
......@@ -213,6 +213,9 @@ $(eval $(call gb_Rdb_add_components,services,\
$(if $(ENABLE_KDE4), \
shell/source/backends/kde4be/kde4be1 \
) \
$(if $(ENABLE_KDE5), \
shell/source/backends/kde5be/kde5be1 \
) \
$(if $(ENABLE_ONLINE_UPDATE), \
extensions/source/update/check/updchk.uno \
extensions/source/update/ui/updchk \
......
# -*- 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:
......@@ -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,\
......
......@@ -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);
......
This diff is collapsed.
/* -*- 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: */
/* -*- 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: */
<?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>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment