From d3c6ac6d0f23df56644008ccb6aa2c8fa37ab1b5 Mon Sep 17 00:00:00 2001 From: Jan-Marek Glogowski <glogow@fbihome.de> Date: Tue, 9 Jul 2019 15:28:29 +0000 Subject: tdf#125922 rename kde5 to kf5 + plasma5 Just as the gtk3 plugin isn't named GNOME, rename kde5 to kf5, as it is based on the KDE frameworks 5 libraries. This also includes: * a convenience alias to load the kf5 VCL plugin in case someone requests the kde5 plugin. * keep convenience kde5 configure switch, but warn about it * rename detected desktop from kde5 to plasma5 Change-Id: I6764a05b81a5edbf284484c234fee2649aacf735 Reviewed-on: https://gerrit.libreoffice.org/75313 Tested-by: Jenkins Reviewed-by: Jan-Marek Glogowski <glogow@fbihome.de> --- vcl/CustomTarget_kde5_moc.mk | 21 -- vcl/CustomTarget_kf5_moc.mk | 21 ++ vcl/Executable_lo_kde5filepicker.mk | 2 +- vcl/Library_vcl.mk | 2 +- vcl/Library_vclplug_kde5.mk | 102 ---------- vcl/Library_vclplug_kf5.mk | 102 ++++++++++ vcl/Module_vcl.mk | 12 +- vcl/README | 4 +- vcl/inc/unx/desktops.hxx | 2 +- vcl/inc/unx/gendata.hxx | 2 +- vcl/inc/vclpluginapi.h | 6 +- vcl/qa/cppunit/app/test_IconThemeSelector.cxx | 4 +- vcl/qt5/Qt5Frame.cxx | 4 +- vcl/source/app/IconThemeSelector.cxx | 2 +- vcl/source/app/salplug.cxx | 18 +- vcl/unx/generic/desktopdetect/desktopdetector.cxx | 21 +- vcl/unx/gtk3_kde5/kde5_filepicker.cxx | 4 +- vcl/unx/kde5/KDE5FilePicker.hxx | 65 ------- vcl/unx/kde5/KDE5FilePicker2.cxx | 210 -------------------- vcl/unx/kde5/KDE5SalFrame.cxx | 222 ---------------------- vcl/unx/kde5/KDE5SalFrame.hxx | 47 ----- vcl/unx/kde5/KDE5SalInstance.cxx | 101 ---------- vcl/unx/kde5/KDE5SalInstance.hxx | 36 ---- vcl/unx/kf5/KF5FilePicker.cxx | 210 ++++++++++++++++++++ vcl/unx/kf5/KF5FilePicker.hxx | 65 +++++++ vcl/unx/kf5/KF5SalFrame.cxx | 222 ++++++++++++++++++++++ vcl/unx/kf5/KF5SalFrame.hxx | 47 +++++ vcl/unx/kf5/KF5SalInstance.cxx | 101 ++++++++++ vcl/unx/kf5/KF5SalInstance.hxx | 36 ++++ 29 files changed, 844 insertions(+), 847 deletions(-) delete mode 100644 vcl/CustomTarget_kde5_moc.mk create mode 100644 vcl/CustomTarget_kf5_moc.mk delete mode 100644 vcl/Library_vclplug_kde5.mk create mode 100644 vcl/Library_vclplug_kf5.mk delete mode 100644 vcl/unx/kde5/KDE5FilePicker.hxx delete mode 100644 vcl/unx/kde5/KDE5FilePicker2.cxx delete mode 100644 vcl/unx/kde5/KDE5SalFrame.cxx delete mode 100644 vcl/unx/kde5/KDE5SalFrame.hxx delete mode 100644 vcl/unx/kde5/KDE5SalInstance.cxx delete mode 100644 vcl/unx/kde5/KDE5SalInstance.hxx create mode 100644 vcl/unx/kf5/KF5FilePicker.cxx create mode 100644 vcl/unx/kf5/KF5FilePicker.hxx create mode 100644 vcl/unx/kf5/KF5SalFrame.cxx create mode 100644 vcl/unx/kf5/KF5SalFrame.hxx create mode 100644 vcl/unx/kf5/KF5SalInstance.cxx create mode 100644 vcl/unx/kf5/KF5SalInstance.hxx (limited to 'vcl') diff --git a/vcl/CustomTarget_kde5_moc.mk b/vcl/CustomTarget_kde5_moc.mk deleted file mode 100644 index 8f9d65c27f31..000000000000 --- a/vcl/CustomTarget_kde5_moc.mk +++ /dev/null @@ -1,21 +0,0 @@ -# -*- 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_CustomTarget_CustomTarget,vcl/unx/kde5)) - -$(call gb_CustomTarget_get_target,vcl/unx/kde5) : \ - $(call gb_CustomTarget_get_workdir,vcl/unx/kde5)/KDE5FilePicker.moc - -$(call gb_CustomTarget_get_workdir,vcl/unx/kde5)/%.moc : \ - $(SRCDIR)/vcl/unx/kde5/%.hxx \ - | $(call gb_CustomTarget_get_workdir,vcl/unx/kde5)/.dir - $(call gb_Output_announce,$(subst $(WORKDIR)/,,$@),$(true),MOC,1) - $(MOC5) $< -o $@ - -# vim: set noet sw=4: diff --git a/vcl/CustomTarget_kf5_moc.mk b/vcl/CustomTarget_kf5_moc.mk new file mode 100644 index 000000000000..6247c58161fd --- /dev/null +++ b/vcl/CustomTarget_kf5_moc.mk @@ -0,0 +1,21 @@ +# -*- 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_CustomTarget_CustomTarget,vcl/unx/kf5)) + +$(call gb_CustomTarget_get_target,vcl/unx/kf5) : \ + $(call gb_CustomTarget_get_workdir,vcl/unx/kf5)/KF5FilePicker.moc + +$(call gb_CustomTarget_get_workdir,vcl/unx/kf5)/%.moc : \ + $(SRCDIR)/vcl/unx/kf5/%.hxx \ + | $(call gb_CustomTarget_get_workdir,vcl/unx/kf5)/.dir + $(call gb_Output_announce,$(subst $(WORKDIR)/,,$@),$(true),MOC,1) + $(MOC5) $< -o $@ + +# vim: set noet sw=4: diff --git a/vcl/Executable_lo_kde5filepicker.mk b/vcl/Executable_lo_kde5filepicker.mk index a34682966778..7d44b3fca120 100644 --- a/vcl/Executable_lo_kde5filepicker.mk +++ b/vcl/Executable_lo_kde5filepicker.mk @@ -68,7 +68,7 @@ $(eval $(call gb_Executable_use_libraries,lo_kde5filepicker,\ $(eval $(call gb_Executable_use_externals,lo_kde5filepicker,\ boost_headers \ epoxy \ - kde5 \ + kf5 \ dbus \ )) diff --git a/vcl/Library_vcl.mk b/vcl/Library_vcl.mk index 25f11f0cbaea..1c3f0b31eb2d 100644 --- a/vcl/Library_vcl.mk +++ b/vcl/Library_vcl.mk @@ -603,7 +603,7 @@ $(eval $(call gb_Library_add_libs,vcl,\ )) $(eval $(call gb_Library_add_exception_objects,vcl, \ - $(if $(or $(ENABLE_QT5),$(ENABLE_KDE5)),vcl/source/app/salplug) \ + $(if $(or $(ENABLE_QT5),$(ENABLE_KF5)),vcl/source/app/salplug) \ )) $(eval $(call gb_Library_use_externals,vcl,\ diff --git a/vcl/Library_vclplug_kde5.mk b/vcl/Library_vclplug_kde5.mk deleted file mode 100644 index 8b5804185b3e..000000000000 --- a/vcl/Library_vclplug_kde5.mk +++ /dev/null @@ -1,102 +0,0 @@ -# -*- 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/. -# -# 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 . -# - -$(eval $(call gb_Library_Library,vclplug_kde5)) - -$(eval $(call gb_Library_use_custom_headers,vclplug_kde5,vcl/unx/kde5)) - -$(eval $(call gb_Library_set_include,vclplug_kde5,\ - $$(INCLUDE) \ - -I$(SRCDIR)/vcl/inc \ - -I$(SRCDIR)/vcl/inc/qt5 \ -)) - -$(eval $(call gb_Library_add_defs,vclplug_kde5,\ - -DVCLPLUG_KDE5_IMPLEMENTATION \ -)) - -$(eval $(call gb_Library_use_sdk_api,vclplug_kde5)) - -$(eval $(call gb_Library_use_libraries,vclplug_kde5,\ - vclplug_qt5 \ - vcl \ - tl \ - utl \ - sot \ - ucbhelper \ - basegfx \ - comphelper \ - cppuhelper \ - i18nlangtag \ - i18nutil \ - $(if $(ENABLE_JAVA), \ - jvmaccess) \ - cppu \ - sal \ -)) - -$(eval $(call gb_Library_use_externals,vclplug_kde5,\ - boost_headers \ - cairo \ - graphite \ - harfbuzz \ - icuuc \ - kde5 \ - epoxy \ -)) - -ifneq ($(QT5_HAVE_GLIB),) -$(eval $(call gb_Library_add_cxxflags,vclplug_kde5,\ - $(QT5_GLIB_CFLAGS) \ -)) - -$(eval $(call gb_Library_add_libs,vclplug_kde5,\ - $(QT5_GLIB_LIBS) \ -)) -endif - -$(eval $(call gb_Library_add_cxxflags,vclplug_kde5,\ - $(KF5_CFLAGS) \ -)) -$(eval $(call gb_Library_add_libs,vclplug_kde5,\ - $(KF5_LIBS) \ -)) - -$(eval $(call gb_Library_add_exception_objects,vclplug_kde5,\ - vcl/unx/kde5/KDE5FilePicker2 \ - vcl/unx/kde5/KDE5SalFrame \ - vcl/unx/kde5/KDE5SalInstance \ -)) - -ifeq ($(OS),LINUX) -$(eval $(call gb_Library_add_libs,vclplug_kde5,\ - -lm \ - -ldl \ -)) -endif - -# Workaround for clang+icecream (clang's -frewrite-includes -# doesn't handle Qt5's QT_HAS_INCLUDE that Qt5 uses for <chrono>). -ifeq ($(COM_IS_CLANG),TRUE) -$(eval $(call gb_Library_add_cxxflags,vclplug_kde5, \ - -include chrono \ -)) -endif - -# vim: set noet sw=4 ts=4: diff --git a/vcl/Library_vclplug_kf5.mk b/vcl/Library_vclplug_kf5.mk new file mode 100644 index 000000000000..62dafe2c2536 --- /dev/null +++ b/vcl/Library_vclplug_kf5.mk @@ -0,0 +1,102 @@ +# -*- 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/. +# +# 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 . +# + +$(eval $(call gb_Library_Library,vclplug_kf5)) + +$(eval $(call gb_Library_use_custom_headers,vclplug_kf5,vcl/unx/kf5)) + +$(eval $(call gb_Library_set_include,vclplug_kf5,\ + $$(INCLUDE) \ + -I$(SRCDIR)/vcl/inc \ + -I$(SRCDIR)/vcl/inc/qt5 \ +)) + +$(eval $(call gb_Library_add_defs,vclplug_kf5,\ + -DVCLPLUG_KF5_IMPLEMENTATION \ +)) + +$(eval $(call gb_Library_use_sdk_api,vclplug_kf5)) + +$(eval $(call gb_Library_use_libraries,vclplug_kf5,\ + vclplug_qt5 \ + vcl \ + tl \ + utl \ + sot \ + ucbhelper \ + basegfx \ + comphelper \ + cppuhelper \ + i18nlangtag \ + i18nutil \ + $(if $(ENABLE_JAVA), \ + jvmaccess) \ + cppu \ + sal \ +)) + +$(eval $(call gb_Library_use_externals,vclplug_kf5,\ + boost_headers \ + cairo \ + graphite \ + harfbuzz \ + icuuc \ + kf5 \ + epoxy \ +)) + +ifneq ($(QT5_HAVE_GLIB),) +$(eval $(call gb_Library_add_cxxflags,vclplug_kf5,\ + $(QT5_GLIB_CFLAGS) \ +)) + +$(eval $(call gb_Library_add_libs,vclplug_kf5,\ + $(QT5_GLIB_LIBS) \ +)) +endif + +$(eval $(call gb_Library_add_cxxflags,vclplug_kf5,\ + $(KF5_CFLAGS) \ +)) +$(eval $(call gb_Library_add_libs,vclplug_kf5,\ + $(KF5_LIBS) \ +)) + +$(eval $(call gb_Library_add_exception_objects,vclplug_kf5,\ + vcl/unx/kf5/KF5FilePicker \ + vcl/unx/kf5/KF5SalFrame \ + vcl/unx/kf5/KF5SalInstance \ +)) + +ifeq ($(OS),LINUX) +$(eval $(call gb_Library_add_libs,vclplug_kf5,\ + -lm \ + -ldl \ +)) +endif + +# Workaround for clang+icecream (clang's -frewrite-includes +# doesn't handle Qt5's QT_HAS_INCLUDE that Qt5 uses for <chrono>). +ifeq ($(COM_IS_CLANG),TRUE) +$(eval $(call gb_Library_add_cxxflags,vclplug_kf5, \ + -include chrono \ +)) +endif + +# vim: set noet sw=4 ts=4: diff --git a/vcl/Module_vcl.mk b/vcl/Module_vcl.mk index 78604ab0e9c4..54e3fbd6b07f 100644 --- a/vcl/Module_vcl.mk +++ b/vcl/Module_vcl.mk @@ -77,10 +77,10 @@ $(eval $(call gb_Module_add_targets,vcl,\ Library_vclplug_gtk3 \ )) endif -ifneq ($(ENABLE_KDE5),) +ifneq ($(ENABLE_KF5),) $(eval $(call gb_Module_add_targets,vcl,\ - CustomTarget_kde5_moc \ - Library_vclplug_kde5 \ + CustomTarget_kf5_moc \ + Library_vclplug_kf5 \ )) endif ifneq ($(ENABLE_QT5),) @@ -119,10 +119,10 @@ $(eval $(call gb_Module_add_targets,vcl,\ Library_vclplug_qt5 \ )) endif -ifneq ($(ENABLE_KDE5),) +ifneq ($(ENABLE_KF5),) $(eval $(call gb_Module_add_targets,vcl,\ - CustomTarget_kde5_moc \ - Library_vclplug_kde5 \ + CustomTarget_kf5_moc \ + Library_vclplug_kf5 \ )) endif endif diff --git a/vcl/README b/vcl/README index d8da537939b3..6ee9dad11e80 100644 --- a/vcl/README +++ b/vcl/README @@ -38,8 +38,8 @@ unx/ + GTK2 support gtk3/ + GTK3 support - kde5/ - + KDE5 support + kf5/ + + KF5 support gtk3_kde5/ + GTK3 support with KDE5 file pickers (alternative to native kde5 one) generic/ diff --git a/vcl/inc/unx/desktops.hxx b/vcl/inc/unx/desktops.hxx index a4a6700b7e96..531e4c64272b 100644 --- a/vcl/inc/unx/desktops.hxx +++ b/vcl/inc/unx/desktops.hxx @@ -31,7 +31,7 @@ enum SAL_DLLPUBLIC_RTTI DesktopType { DESKTOP_UNITY, DESKTOP_XFCE, DESKTOP_MATE, - DESKTOP_KDE5, + DESKTOP_PLASMA5, DESKTOP_LXQT }; // keep in sync with desktop_strings[] in salplug.cxx diff --git a/vcl/inc/unx/gendata.hxx b/vcl/inc/unx/gendata.hxx index 15f201931792..d8f8149ad6a7 100644 --- a/vcl/inc/unx/gendata.hxx +++ b/vcl/inc/unx/gendata.hxx @@ -27,7 +27,7 @@ enum GenericUnixSalDataType { SAL_DATA_GTK, SAL_DATA_GTK3, - SAL_DATA_KDE5, + SAL_DATA_KF5, SAL_DATA_UNX, SAL_DATA_SVP, SAL_DATA_ANDROID, diff --git a/vcl/inc/vclpluginapi.h b/vcl/inc/vclpluginapi.h index 495c86b8e57b..589d7244ddaa 100644 --- a/vcl/inc/vclpluginapi.h +++ b/vcl/inc/vclpluginapi.h @@ -35,10 +35,10 @@ #define VCLPLUG_GTK_PUBLIC SAL_DLLPUBLIC_IMPORT #endif -#if defined VCLPLUG_KDE5_IMPLEMENTATION -#define VCLPLUG_KDE5_PUBLIC SAL_DLLPUBLIC_EXPORT +#if defined VCLPLUG_KF5_IMPLEMENTATION +#define VCLPLUG_KF5_PUBLIC SAL_DLLPUBLIC_EXPORT #else -#define VCLPLUG_KDE5_PUBLIC SAL_DLLPUBLIC_IMPORT +#define VCLPLUG_KF5_PUBLIC SAL_DLLPUBLIC_IMPORT #endif #if defined VCLPLUG_OSX_IMPLEMENTATION diff --git a/vcl/qa/cppunit/app/test_IconThemeSelector.cxx b/vcl/qa/cppunit/app/test_IconThemeSelector.cxx index 5ff3468655cc..cff9641cd033 100644 --- a/vcl/qa/cppunit/app/test_IconThemeSelector.cxx +++ b/vcl/qa/cppunit/app/test_IconThemeSelector.cxx @@ -75,8 +75,8 @@ IconThemeSelectorTest::BreezeIsReturnedForKde5Desktop() { std::vector<vcl::IconThemeInfo> themes = GetFakeInstalledThemes(); vcl::IconThemeSelector s; - OUString r = s.SelectIconThemeForDesktopEnvironment(themes, "kde5"); - CPPUNIT_ASSERT_EQUAL_MESSAGE("'breeze' theme is returned for kde5 desktop", OUString("breeze"), r); + OUString r = s.SelectIconThemeForDesktopEnvironment(themes, "plasma5"); + CPPUNIT_ASSERT_EQUAL_MESSAGE("'breeze' theme is returned for Plasma 5 desktop", OUString("breeze"), r); } void diff --git a/vcl/qt5/Qt5Frame.cxx b/vcl/qt5/Qt5Frame.cxx index 0bfd51c515da..142cb12aa199 100644 --- a/vcl/qt5/Qt5Frame.cxx +++ b/vcl/qt5/Qt5Frame.cxx @@ -1062,14 +1062,14 @@ KeyIndicatorState Qt5Frame::GetIndicatorState() { return KeyIndicatorState(); } void Qt5Frame::SimulateKeyPress(sal_uInt16 nKeyCode) { - SAL_WARN("vcl.kde5", "missing simulate keypress " << nKeyCode); + SAL_WARN("vcl.qt5", "missing simulate keypress " << nKeyCode); } void Qt5Frame::SetParent(SalFrame* pNewParent) { m_pParent = static_cast<Qt5Frame*>(pNewParent); } bool Qt5Frame::SetPluginParent(SystemParentData* /*pNewParent*/) { - //FIXME: no SetPluginParent impl. for kde5 + //FIXME: no SetPluginParent impl. for qt5 return false; } diff --git a/vcl/source/app/IconThemeSelector.cxx b/vcl/source/app/IconThemeSelector.cxx index 0ed454f2911b..ff2dcc52805a 100644 --- a/vcl/source/app/IconThemeSelector.cxx +++ b/vcl/source/app/IconThemeSelector.cxx @@ -55,7 +55,7 @@ IconThemeSelector::GetIconThemeForDesktopEnvironment(const OUString& desktopEnvi return OUString("colibre"); #else OUString r; - if ( desktopEnvironment.equalsIgnoreAsciiCase("kde5") || + if ( desktopEnvironment.equalsIgnoreAsciiCase("plasma5") || desktopEnvironment.equalsIgnoreAsciiCase("lxqt") ) { r = "breeze"; } diff --git a/vcl/source/app/salplug.cxx b/vcl/source/app/salplug.cxx index 4ec54849b21c..20604edb7f46 100644 --- a/vcl/source/app/salplug.cxx +++ b/vcl/source/app/salplug.cxx @@ -65,11 +65,14 @@ SalInstance* tryInstance( const OUString& rModuleBase, bool bForce = false ) #endif SalInstance* pInst = nullptr; + OUString aUsedModuleBase(rModuleBase); + if (aUsedModuleBase == "kde5") + aUsedModuleBase = "kf5"; OUString aModule( #ifdef SAL_DLLPREFIX SAL_DLLPREFIX #endif - "vclplug_" + rModuleBase + "lo" SAL_DLLEXTENSION ); + "vclplug_" + aUsedModuleBase + "lo" SAL_DLLEXTENSION ); osl::Module aMod; if (aMod.loadRelative(reinterpret_cast<oslGenericFunction>(&tryInstance), aModule, SAL_LOADMODULE_GLOBAL)) @@ -92,7 +95,7 @@ SalInstance* tryInstance( const OUString& rModuleBase, bool bForce = false ) * So make sure libgtk+ & co are still mapped into memory when * atk-bridge's atexit handler gets called. */ - if( rModuleBase == "gtk" || rModuleBase == "gtk3" || rModuleBase == "gtk3_kde5" || rModuleBase == "win" ) + if( aUsedModuleBase == "gtk" || aUsedModuleBase == "gtk3" || aUsedModuleBase == "gtk3_kde5" || aUsedModuleBase == "win" ) { pCloseModule = nullptr; } @@ -145,8 +148,8 @@ SalInstance* autodetect_plugin() { static const char* const pKDEFallbackList[] = { -#if ENABLE_KDE5 - "kde5", +#if ENABLE_KF5 + "kf5", #endif #if ENABLE_GTK3_KDE5 "gtk3_kde5", @@ -181,8 +184,7 @@ SalInstance* autodetect_plugin() desktop == DESKTOP_XFCE || desktop == DESKTOP_MATE ) pList = pStandardFallbackList; - else if( desktop == DESKTOP_KDE5 || - desktop == DESKTOP_LXQT ) + else if (desktop == DESKTOP_PLASMA5 || desktop == DESKTOP_LXQT) pList = pKDEFallbackList; SalInstance* pInst = nullptr; @@ -257,7 +259,7 @@ SalInstance *CreateSalInstance() #ifdef MACOSX "osx" #else - "gtk3", "gtk", "kde5", "gen" + "gtk3", "gtk", "kf5", "gen" #endif #endif }; @@ -314,7 +316,7 @@ const OUString& SalGetDesktopEnvironment() // Order to match desktops.hxx' DesktopType static const char * const desktop_strings[] = { "none", "unknown", "GNOME", "UNITY", - "XFCE", "MATE", "KDE5", "LXQT" }; + "XFCE", "MATE", "PLASMA5", "LXQT" }; static OUString aDesktopEnvironment; if( aDesktopEnvironment.isEmpty()) { diff --git a/vcl/unx/generic/desktopdetect/desktopdetector.cxx b/vcl/unx/generic/desktopdetect/desktopdetector.cxx index 2c453e051b5c..b2aea898e45c 100644 --- a/vcl/unx/generic/desktopdetect/desktopdetector.cxx +++ b/vcl/unx/generic/desktopdetect/desktopdetector.cxx @@ -115,15 +115,11 @@ static bool is_gnome_desktop( Display* pDisplay ) return ret; } - -static bool is_kde5_desktop() +static bool is_plasma5_desktop() { - static const char * pFullVersion = getenv( "KDE_FULL_SESSION" ); - static const char * pSessionVersion = getenv( "KDE_SESSION_VERSION" ); - if ( pFullVersion && pSessionVersion && strcmp(pSessionVersion, "5") == 0) - return true; - - return false; + static const char* pFullVersion = getenv("KDE_FULL_SESSION"); + static const char* pSessionVersion = getenv("KDE_SESSION_VERSION"); + return pFullVersion && pSessionVersion && (0 == strcmp(pSessionVersion, "5")); } extern "C" @@ -139,8 +135,8 @@ DESKTOP_DETECTOR_PUBLIC DesktopType get_desktop_environment() if ( aOver.equalsIgnoreAsciiCase( "lxqt" ) ) return DESKTOP_LXQT; - if ( aOver.equalsIgnoreAsciiCase( "kde5" ) ) - return DESKTOP_KDE5; + if (aOver.equalsIgnoreAsciiCase("plasma5") || aOver.equalsIgnoreAsciiCase("plasma")) + return DESKTOP_PLASMA5; if ( aOver.equalsIgnoreAsciiCase( "gnome" ) ) return DESKTOP_GNOME; if ( aOver.equalsIgnoreAsciiCase( "gnome-wayland" ) ) @@ -197,9 +193,8 @@ DESKTOP_DETECTOR_PUBLIC DesktopType get_desktop_environment() else if ( aDesktopSession.equalsIgnoreAsciiCase( "lxqt" ) ) return DESKTOP_LXQT; - - if ( is_kde5_desktop() ) - return DESKTOP_KDE5; + if (is_plasma5_desktop()) + return DESKTOP_PLASMA5; // tdf#121275 if we still can't tell, and WAYLAND_DISPLAY // is set, default to gtk3 diff --git a/vcl/unx/gtk3_kde5/kde5_filepicker.cxx b/vcl/unx/gtk3_kde5/kde5_filepicker.cxx index f4cb305e239c..2ee4dbd8e85c 100644 --- a/vcl/unx/gtk3_kde5/kde5_filepicker.cxx +++ b/vcl/unx/gtk3_kde5/kde5_filepicker.cxx @@ -68,7 +68,7 @@ void KDE5FilePicker::enableFolderMode() // and then confirming would return "foo" rather than "foo/bar"; // on the other hand, non-native file dialog needs 'QFileDialog::Directory' // and doesn't allow folder selection otherwise - if (Application::GetDesktopEnvironment() != "KDE5") + if (Application::GetDesktopEnvironment() != "PLASMA5") { _dialog->setFileMode(QFileDialog::Directory); } @@ -248,7 +248,7 @@ void KDE5FilePicker::setupCustomWidgets() // dialog there in order not to lose the custom controls and insert the custom // widget in the layout returned by QFileDialog::layout() // (which returns nullptr for native file dialogs) - if (Application::GetDesktopEnvironment() == "KDE5") + if (Application::GetDesktopEnvironment() == "PLASMA5") { qApp->installEventFilter(this); } diff --git a/vcl/unx/kde5/KDE5FilePicker.hxx b/vcl/unx/kde5/KDE5FilePicker.hxx deleted file mode 100644 index 786a99b00777..000000000000 --- a/vcl/unx/kde5/KDE5FilePicker.hxx +++ /dev/null @@ -1,65 +0,0 @@ -/* -*- 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 . - */ - -#pragma once - -#include <Qt5FilePicker.hxx> - -class QGridLayout; - -class KDE5FilePicker : public Qt5FilePicker -{ - Q_OBJECT - -protected: - //layout for extra custom controls - QGridLayout* _layout; - - bool allowRemoteUrls; - -public: - explicit KDE5FilePicker(css::uno::Reference<css::uno::XComponentContext> const& context, - QFileDialog::FileMode); - - // XExecutableDialog functions - virtual sal_Int16 SAL_CALL execute() override; - - // XFilePickerControlAccess functions - virtual void SAL_CALL setValue(sal_Int16 nControlId, sal_Int16 nControlAction, - const css::uno::Any& rValue) override; - virtual css::uno::Any SAL_CALL getValue(sal_Int16 nControlId, - sal_Int16 nControlAction) override; - virtual void SAL_CALL enableControl(sal_Int16 nControlId, sal_Bool bEnable) override; - virtual void SAL_CALL setLabel(sal_Int16 nControlId, const OUString& rLabel) override; - virtual OUString SAL_CALL getLabel(sal_Int16 nControlId) override; - - // XServiceInfo - virtual OUString SAL_CALL getImplementationName() override; - virtual sal_Bool SAL_CALL supportsService(const OUString& rServiceName) override; - virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override; - -private: - //add a custom control widget to the file dialog - void addCustomControl(sal_Int16 controlId) override; - -protected: - bool eventFilter(QObject* watched, QEvent* event) override; -}; - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/unx/kde5/KDE5FilePicker2.cxx b/vcl/unx/kde5/KDE5FilePicker2.cxx deleted file mode 100644 index cb778e2fd0f7..000000000000 --- a/vcl/unx/kde5/KDE5FilePicker2.cxx +++ /dev/null @@ -1,210 +0,0 @@ -/* -*- 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 "KDE5FilePicker.hxx" -#include <KDE5FilePicker.moc> - -#include <com/sun/star/ui/dialogs/ExtendedFilePickerElementIds.hpp> -#include <cppuhelper/supportsservice.hxx> -#include <osl/mutex.hxx> - -#include <qt5/Qt5Instance.hxx> - -#include <QtWidgets/QApplication> -#include <QtWidgets/QGridLayout> -#include <QtWidgets/QWidget> -#include <KFileWidget> - -using namespace ::com::sun::star; -using ::com::sun::star::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION; - -namespace -{ -uno::Sequence<OUString> FilePicker_getSupportedServiceNames() -{ - uno::Sequence<OUString> aRet(4); - aRet[0] = "com.sun.star.ui.dialogs.FilePicker"; - aRet[1] = "com.sun.star.ui.dialogs.SystemFilePicker"; - aRet[2] = "com.sun.star.ui.dialogs.KDE5FilePicker"; - aRet[3] = "com.sun.star.ui.dialogs.KDE5FolderPicker"; - return aRet; -} -} - -// KDE5FilePicker - -KDE5FilePicker::KDE5FilePicker(css::uno::Reference<css::uno::XComponentContext> const& context, - QFileDialog::FileMode eMode) - // Native kde5 filepicker does not add file extension automatically - : Qt5FilePicker(context, eMode, true, true) - , _layout(new QGridLayout(m_pExtraControls)) - , allowRemoteUrls(false) -{ - // use native dialog - m_pFileDialog->setOption(QFileDialog::DontUseNativeDialog, false); - - // only columns 0 and 1 are used by controls (s. Qt5FilePicker::addCustomControl); - // set stretch for (unused) column 2 in order for the controls to only take the space - // they actually need and avoid empty space in between - _layout->setColumnStretch(2, 1); - - // set layout so custom widgets show up in our native file dialog - setCustomControlWidgetLayout(_layout); - - m_pFileDialog->setSupportedSchemes({ - QStringLiteral("file"), QStringLiteral("ftp"), QStringLiteral("http"), - QStringLiteral("https"), QStringLiteral("webdav"), QStringLiteral("webdavs"), - QStringLiteral("smb"), - QStringLiteral(""), // this makes removable devices shown - }); - - // used to set the custom controls - qApp->installEventFilter(this); -} - -sal_Int16 SAL_CALL KDE5FilePicker::execute() -{ - SolarMutexGuard g; - auto* pSalInst(static_cast<Qt5Instance*>(GetSalData()->m_pInstance)); - assert(pSalInst); - if (!pSalInst->IsMainThread()) - { - sal_Int16 ret; - pSalInst->RunInMainThread([&ret, this] { ret = execute(); }); - return ret; - } - - if (!m_aNamedFilterList.isEmpty()) - m_pFileDialog->setNameFilters(m_aNamedFilterList); - if (!m_aCurrentFilter.isEmpty()) - m_pFileDialog->selectNameFilter(m_aCurrentFilter); - - m_pFileDialog->show(); - //block and wait for user input - return m_pFileDialog->exec() == QFileDialog::Accepted ? 1 : 0; -} - -// XFilePickerControlAccess -void SAL_CALL KDE5FilePicker::setValue(sal_Int16 controlId, sal_Int16 nControlAction, - const uno::Any& value) -{ - if (CHECKBOX_AUTOEXTENSION == controlId) - // We ignore this one and rely on QFileDialog to provide the functionality - return; - - Qt5FilePicker::setValue(controlId, nControlAction, value); -} - -uno::Any SAL_CALL KDE5FilePicker::getValue(sal_Int16 controlId, sal_Int16 nControlAction) -{ - SolarMutexGuard g; - auto* pSalInst(static_cast<Qt5Instance*>(GetSalData()->m_pInstance)); - assert(pSalInst); - if (!pSalInst->IsMainThread()) - { - uno::Any ret; - pSalInst->RunInMainThread([&ret, this, controlId, nControlAction]() { - ret = getValue(controlId, nControlAction); - }); - return ret; - } - - if (CHECKBOX_AUTOEXTENSION == controlId) - // We ignore this one and rely on QFileDialog to provide the function. - // Always return false, to pretend we do not support this, otherwise - // LO core would try to be smart and cut the extension in some places, - // interfering with QFileDialog's handling of it. QFileDialog also - // saves the value of the setting, so LO core is not needed for that either. - return uno::Any(false); - - return Qt5FilePicker::getValue(controlId, nControlAction); -} - -void SAL_CALL KDE5FilePicker::enableControl(sal_Int16 controlId, sal_Bool enable) -{ - if (CHECKBOX_AUTOEXTENSION == controlId) - // We ignore this one and rely on QFileDialog to provide the functionality - return; - - Qt5FilePicker::enableControl(controlId, enable); -} - -void SAL_CALL KDE5FilePicker::setLabel(sal_Int16 controlId, const OUString& label) -{ - if (CHECKBOX_AUTOEXTENSION == controlId) - // We ignore this one and rely on QFileDialog to provide the functionality - return; - - Qt5FilePicker::setLabel(controlId, label); -} - -OUString SAL_CALL KDE5FilePicker::getLabel(sal_Int16 controlId) -{ - // We ignore this one and rely on QFileDialog to provide the functionality - if (CHECKBOX_AUTOEXTENSION == controlId) - return ""; - - return Qt5FilePicker::getLabel(controlId); -} - -void KDE5FilePicker::addCustomControl(sal_Int16 controlId) -{ - // native kde5 filepicker has its own autoextension checkbox, - // therefore avoid adding yet another one - if (controlId == CHECKBOX_AUTOEXTENSION) - return; - - Qt5FilePicker::addCustomControl(controlId); -} - -// XServiceInfo -OUString SAL_CALL KDE5FilePicker::getImplementationName() -{ - return OUString("com.sun.star.ui.dialogs.KDE5FilePicker"); -} - -sal_Bool SAL_CALL KDE5FilePicker::supportsService(const OUString& ServiceName) -{ - return cppu::supportsService(this, ServiceName); -} - -uno::Sequence<OUString> SAL_CALL KDE5FilePicker::getSupportedServiceNames() -{ - return FilePicker_getSupportedServiceNames(); -} - -bool KDE5FilePicker::eventFilter(QObject* o, QEvent* e) -{ - if (e->type() == QEvent::Show && o->isWidgetType()) - { - auto* w = static_cast<QWidget*>(o); - if (!w->parentWidget() && w->isModal()) - { - if (auto* fileWidget = w->findChild<KFileWidget*>({}, Qt::FindDirectChildrenOnly)) - { - fileWidget->setCustomWidget(m_pExtraControls); - // remove event filter again; the only purpose was to set the custom widget here - qApp->removeEventFilter(this); - } - } - } - return QObject::eventFilter(o, e); -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/unx/kde5/KDE5SalFrame.cxx b/vcl/unx/kde5/KDE5SalFrame.cxx deleted file mode 100644 index efb08a74d832..000000000000 --- a/vcl/unx/kde5/KDE5SalFrame.cxx +++ /dev/null @@ -1,222 +0,0 @@ -/* -*- 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 <memory> -#include <QtGui/QColor> -#include <QtWidgets/QStyle> -#include <QtWidgets/QToolTip> -#include <QtWidgets/QApplication> -#include <QtWidgets/QMenuBar> - -#include <KConfig> -#include <KConfigGroup> -#include <KSharedConfig> - -#include "KDE5SalFrame.hxx" - -#include <tools/color.hxx> - -#include <vcl/font.hxx> -#include <vcl/settings.hxx> -#include <sal/log.hxx> - -#include <unx/fontmanager.hxx> - -#include <svdata.hxx> - -#include <boost/optional.hpp> - -KDE5SalFrame::KDE5SalFrame(KDE5SalFrame* pParent, SalFrameStyleFlags nState, bool bUseCairo) - : Qt5Frame(pParent, nState, bUseCairo) - , m_bGraphicsInUse(false) -{ -} - -/** Helper function to add information to Font from QFont. - - Mostly grabbed from the Gtk+ vclplug (salnativewidgets-gtk.cxx). -*/ -static vcl::Font toFont(const QFont& rQFont, const css::lang::Locale& rLocale) -{ - psp::FastPrintFontInfo aInfo; - QFontInfo qFontInfo(rQFont); - - // set family name - aInfo.m_aFamilyName = OUString(static_cast<const char*>(rQFont.family().toUtf8()), - strlen(static_cast<const char*>(rQFont.family().toUtf8())), - RTL_TEXTENCODING_UTF8); - - // set italic - aInfo.m_eItalic = (qFontInfo.italic() ? ITALIC_NORMAL : ITALIC_NONE); - - // set weight - int nWeight = qFontInfo.weight(); - if (nWeight <= QFont::Light) - aInfo.m_eWeight = WEIGHT_LIGHT; - else if (nWeight <= QFont::Normal) - aInfo.m_eWeight = WEIGHT_NORMAL; - else if (nWeight <= QFont::DemiBold) - aInfo.m_eWeight = WEIGHT_SEMIBOLD; - else if (nWeight <= QFont::Bold) - aInfo.m_eWeight = WEIGHT_BOLD; - else - aInfo.m_eWeight = WEIGHT_ULTRABOLD; - - // set width - int nStretch = rQFont.stretch(); - if (nStretch == 0) // QFont::AnyStretch since Qt 5.8 - aInfo.m_eWidth = WIDTH_DONTKNOW; - else if (nStretch <= QFont::UltraCondensed) - aInfo.m_eWidth = WIDTH_ULTRA_CONDENSED; - else if (nStretch <= QFont::ExtraCondensed) - aInfo.m_eWidth = WIDTH_EXTRA_CONDENSED; - else if (nStretch <= QFont::Condensed) - aInfo.m_eWidth = WIDTH_CONDENSED; - else if (nStretch <= QFont::SemiCondensed) - aInfo.m_eWidth = WIDTH_SEMI_CONDENSED; - else if (nStretch <= QFont::Unstretched) - aInfo.m_eWidth = WIDTH_NORMAL; - else if (nStretch <= QFont::SemiExpanded) - aInfo.m_eWidth = WIDTH_SEMI_EXPANDED; - else if (nStretch <= QFont::Expanded) - aInfo.m_eWidth = WIDTH_EXPANDED; - else if (nStretch <= QFont::ExtraExpanded) - aInfo.m_eWidth = WIDTH_EXTRA_EXPANDED; - else - aInfo.m_eWidth = WIDTH_ULTRA_EXPANDED; - - SAL_INFO("vcl.kde5", "font name BEFORE system match: \"" << aInfo.m_aFamilyName << "\""); - - // match font to e.g. resolve "Sans" - psp::PrintFontManager::get().matchFont(aInfo, rLocale); - - SAL_INFO("vcl.kde5", "font match " << (aInfo.m_nID != 0 ? "succeeded" : "failed") - << ", name AFTER: \"" << aInfo.m_aFamilyName << "\""); - - // font height - int nPointHeight = qFontInfo.pointSize(); - if (nPointHeight <= 0) - nPointHeight = rQFont.pointSize(); - - // Create the font - vcl::Font aFont(aInfo.m_aFamilyName, Size(0, nPointHeight)); - if (aInfo.m_eWeight != WEIGHT_DONTKNOW) - aFont.SetWeight(aInfo.m_eWeight); - if (aInfo.m_eWidth != WIDTH_DONTKNOW) - aFont.SetWidthType(aInfo.m_eWidth); - if (aInfo.m_eItalic != ITALIC_DONTKNOW) - aFont.SetItalic(aInfo.m_eItalic); - if (aInfo.m_ePitch != PITCH_DONTKNOW) - aFont.SetPitch(aInfo.m_ePitch); - - return aFont; -} - -/** Implementation of KDE integration's main method. -*/ -void KDE5SalFrame::UpdateSettings(AllSettings& rSettings) -{ - Qt5Frame::UpdateSettings(rSettings); - - StyleSettings style(rSettings.GetStyleSettings()); - bool bSetTitleFont = false; - - // WM settings - /*KConfig *pConfig = KGlobal::config().data(); - if ( pConfig ) - { - const char *pKey; - - { - KConfigGroup aWMGroup = pConfig->group( "WM" ); - - pKey = "titleFont"; - if (aWMGroup.hasKey(pKey)) - { - vcl::Font aFont = toFont(aWMGroup.readEntry(pKey, QFont()), - rSettings.GetUILanguageTag().getLocale()); - style.SetTitleFont( aFont ); - bSetTitleFont = true; - } - } - - KConfigGroup aIconsGroup = pConfig->group("Icons"); - - pKey = "Theme"; - if (aIconsGroup.hasKey(pKey)) - style.SetPreferredIconTheme( readEntryUntranslated(&aIconsGroup, pKey)); - - //toolbar - pKey = "toolbarFont"; - if (aIconsGroup.hasKey(pKey)) - { - vcl::Font aFont = toFont(aIconsGroup.readEntry(pKey, QFont()), - rSettings.GetUILanguageTag().getLocale()); - style.SetToolFont( aFont ); - } - }*/ - - // Font - vcl::Font aFont = toFont(QApplication::font(), rSettings.GetUILanguageTag().getLocale()); - - style.BatchSetFonts(aFont, aFont); - - aFont.SetWeight(WEIGHT_BOLD); - if (!bSetTitleFont) - { - style.SetTitleFont(aFont); - } - style.SetFloatTitleFont(aFont); - style.SetHelpFont(toFont(QToolTip::font(), rSettings.GetUILanguageTag().getLocale())); - - int flash_time = QApplication::cursorFlashTime(); - style.SetCursorBlinkTime(flash_time != 0 ? flash_time / 2 : STYLE_CURSOR_NOBLINKTIME); - - // Menu - std::unique_ptr<QMenuBar> pMenuBar = std::make_unique<QMenuBar>(); - aFont = toFont(pMenuBar->font(), rSettings.GetUILanguageTag().getLocale()); - style.SetMenuFont(aFont); - - rSettings.SetStyleSettings(style); -} - -SalGraphics* KDE5SalFrame::AcquireGraphics() -{ - if (m_bGraphicsInUse) - return nullptr; - - m_bGraphicsInUse = true; - - if (!m_pKDE5Graphics.get()) - { - m_pKDE5Graphics.reset(new Qt5SvpGraphics(this)); - Qt5Frame::InitQt5SvpGraphics(m_pKDE5Graphics.get()); - } - - return m_pKDE5Graphics.get(); -} - -void KDE5SalFrame::ReleaseGraphics(SalGraphics* pSalGraph) -{ - (void)pSalGraph; - assert(pSalGraph == m_pKDE5Graphics.get()); - m_bGraphicsInUse = false; -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/unx/kde5/KDE5SalFrame.hxx b/vcl/unx/kde5/KDE5SalFrame.hxx deleted file mode 100644 index cf3874af7c8c..000000000000 --- a/vcl/unx/kde5/KDE5SalFrame.hxx +++ /dev/null @@ -1,47 +0,0 @@ -/* -*- 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 . - */ - -#pragma once - -#include <memory> - -#include <qt5/Qt5Frame.hxx> -#include <qt5/Qt5SvpGraphics.hxx> - -class QWidget; - -class KDE5SalFrame : public Qt5Frame -{ -private: - std::unique_ptr<Qt5SvpGraphics> m_pKDE5Graphics; - bool m_bGraphicsInUse; - -public: - KDE5SalFrame(KDE5SalFrame* pParent, SalFrameStyleFlags nStyle, bool bUseCairo); - - virtual SalGraphics* AcquireGraphics() override; - virtual void ReleaseGraphics(SalGraphics* pGraphics) override; - virtual void UpdateSettings(AllSettings& rSettings) override; - - virtual LanguageType GetInputLanguage() override { return LANGUAGE_SYSTEM; } - virtual SalPointerState GetPointerState() override { return SalPointerState(); } - virtual KeyIndicatorState GetIndicatorState() override { return KeyIndicatorState(); } -}; - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/unx/kde5/KDE5SalInstance.cxx b/vcl/unx/kde5/KDE5SalInstance.cxx deleted file mode 100644 index b1b8eb59375f..000000000000 --- a/vcl/unx/kde5/KDE5SalInstance.cxx +++ /dev/null @@ -1,101 +0,0 @@ -/* -*- 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 <utility> - -#include <QtWidgets/QApplication> - -#include <sal/log.hxx> - -#include <Qt5Data.hxx> - -#include "KDE5FilePicker.hxx" -#include "KDE5SalFrame.hxx" -#include "KDE5SalInstance.hxx" - -using namespace com::sun::star; - -KDE5SalInstance::KDE5SalInstance(std::unique_ptr<QApplication>& pQApp) - : Qt5Instance(pQApp, true) -{ - ImplSVData* pSVData = ImplGetSVData(); - pSVData->maAppData.mxToolkitName = OUString("kde5"); -} - -SalFrame* KDE5SalInstance::CreateFrame(SalFrame* pParent, SalFrameStyleFlags nState) -{ - SalFrame* pRet(nullptr); - RunInMainThread(std::function([&pRet, pParent, nState]() { - pRet = new KDE5SalFrame(static_cast<KDE5SalFrame*>(pParent), nState, true); - })); - assert(pRet); - return pRet; -} - -bool KDE5SalInstance::hasNativeFileSelection() const -{ - if (Application::GetDesktopEnvironment() == "KDE5") - return true; - return Qt5Instance::hasNativeFileSelection(); -} - -Qt5FilePicker* -KDE5SalInstance::createPicker(css::uno::Reference<css::uno::XComponentContext> const& context, - QFileDialog::FileMode eMode) -{ - if (!IsMainThread()) - { - SolarMutexGuard g; - Qt5FilePicker* pPicker; - RunInMainThread(std::function([&, this]() { pPicker = createPicker(context, eMode); })); - assert(pPicker); - return pPicker; - } - - // In order to insert custom controls, KDE5FilePicker currently relies on KFileWidget - // being used in the native file picker, which is only the case for KDE Plasma. - // Therefore, return the plain qt5 one in order to not lose custom controls. - if (Application::GetDesktopEnvironment() == "KDE5") - return new KDE5FilePicker(context, eMode); - return Qt5Instance::createPicker(context, eMode); -} - -extern "C" { -VCLPLUG_KDE5_PUBLIC SalInstance* create_SalInstance() -{ - std::unique_ptr<char* []> pFakeArgv; - std::unique_ptr<int> pFakeArgc; - std::vector<FreeableCStr> aFakeArgvFreeable; - Qt5Instance::AllocFakeCmdlineArgs(pFakeArgv, pFakeArgc, aFakeArgvFreeable); - - std::unique_ptr<QApplication> pQApp - = Qt5Instance::CreateQApplication(*pFakeArgc, pFakeArgv.get()); - - KDE5SalInstance* pInstance = new KDE5SalInstance(pQApp); - pInstance->MoveFakeCmdlineArgs(pFakeArgv, pFakeArgc, aFakeArgvFreeable); - - new Qt5Data(pInstance); - - return pInstance; -} -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/unx/kde5/KDE5SalInstance.hxx b/vcl/unx/kde5/KDE5SalInstance.hxx deleted file mode 100644 index 4215ec483308..000000000000 --- a/vcl/unx/kde5/KDE5SalInstance.hxx +++ /dev/null @@ -1,36 +0,0 @@ -/* -*- 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 . - */ - -#pragma once - -#include <qt5/Qt5Instance.hxx> - -class KDE5SalInstance final : public Qt5Instance -{ - bool hasNativeFileSelection() const override; - Qt5FilePicker* createPicker(css::uno::Reference<css::uno::XComponentContext> const& context, - QFileDialog::FileMode) override; - - SalFrame* CreateFrame(SalFrame* pParent, SalFrameStyleFlags nStyle) override; - -public: - explicit KDE5SalInstance(std::unique_ptr<QApplication>& pQApp); -}; - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/unx/kf5/KF5FilePicker.cxx b/vcl/unx/kf5/KF5FilePicker.cxx new file mode 100644 index 000000000000..366ca89ffa54 --- /dev/null +++ b/vcl/unx/kf5/KF5FilePicker.cxx @@ -0,0 +1,210 @@ +/* -*- 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 "KF5FilePicker.hxx" +#include <KF5FilePicker.moc> + +#include <com/sun/star/ui/dialogs/ExtendedFilePickerElementIds.hpp> +#include <cppuhelper/supportsservice.hxx> +#include <osl/mutex.hxx> + +#include <qt5/Qt5Instance.hxx> + +#include <QtWidgets/QApplication> +#include <QtWidgets/QGridLayout> +#include <QtWidgets/QWidget> +#include <KFileWidget> + +using namespace ::com::sun::star; +using ::com::sun::star::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION; + +namespace +{ +uno::Sequence<OUString> FilePicker_getSupportedServiceNames() +{ + uno::Sequence<OUString> aRet(4); + aRet[0] = "com.sun.star.ui.dialogs.FilePicker"; + aRet[1] = "com.sun.star.ui.dialogs.SystemFilePicker"; + aRet[2] = "com.sun.star.ui.dialogs.KF5FilePicker"; + aRet[3] = "com.sun.star.ui.dialogs.KF5FolderPicker"; + return aRet; +} +} + +// KF5FilePicker + +KF5FilePicker::KF5FilePicker(css::uno::Reference<css::uno::XComponentContext> const& context, + QFileDialog::FileMode eMode) + // Native kf5 filepicker does not add file extension automatically + : Qt5FilePicker(context, eMode, true, true) + , _layout(new QGridLayout(m_pExtraControls)) + , allowRemoteUrls(false) +{ + // use native dialog + m_pFileDialog->setOption(QFileDialog::DontUseNativeDialog, false); + + // only columns 0 and 1 are used by controls (s. Qt5FilePicker::addCustomControl); + // set stretch for (unused) column 2 in order for the controls to only take the space + // they actually need and avoid empty space in between + _layout->setColumnStretch(2, 1); + + // set layout so custom widgets show up in our native file dialog + setCustomControlWidgetLayout(_layout); + + m_pFileDialog->setSupportedSchemes({ + QStringLiteral("file"), QStringLiteral("ftp"), QStringLiteral("http"), + QStringLiteral("https"), QStringLiteral("webdav"), QStringLiteral("webdavs"), + QStringLiteral("smb"), + QStringLiteral(""), // this makes removable devices shown + }); + + // used to set the custom controls + qApp->installEventFilter(this); +} + +sal_Int16 SAL_CALL KF5FilePicker::execute() +{ + SolarMutexGuard g; + auto* pSalInst(static_cast<Qt5Instance*>(GetSalData()->m_pInstance)); + assert(pSalInst); + if (!pSalInst->IsMainThread()) + { + sal_Int16 ret; + pSalInst->RunInMainThread([&ret, this] { ret = execute(); }); + return ret; + } + + if (!m_aNamedFilterList.isEmpty()) + m_pFileDialog->setNameFilters(m_aNamedFilterList); + if (!m_aCurrentFilter.isEmpty()) + m_pFileDialog->selectNameFilter(m_aCurrentFilter); + + m_pFileDialog->show(); + //block and wait for user input + return m_pFileDialog->exec() == QFileDialog::Accepted ? 1 : 0; +} + +// XFilePickerControlAccess +void SAL_CALL KF5FilePicker::setValue(sal_Int16 controlId, sal_Int16 nControlAction, + const uno::Any& value) +{ + if (CHECKBOX_AUTOEXTENSION == controlId) + // We ignore this one and rely on QFileDialog to provide the functionality + return; + + Qt5FilePicker::setValue(controlId, nControlAction, value); +} + +uno::Any SAL_CALL KF5FilePicker::getValue(sal_Int16 controlId, sal_Int16 nControlAction) +{ + SolarMutexGuard g; + auto* pSalInst(static_cast<Qt5Instance*>(GetSalData()->m_pInstance)); + assert(pSalInst); + if (!pSalInst->IsMainThread()) + { + uno::Any ret; + pSalInst->RunInMainThread([&ret, this, controlId, nControlAction]() { + ret = getValue(controlId, nControlAction); + }); + return ret; + } + + if (CHECKBOX_AUTOEXTENSION == controlId) + // We ignore this one and rely on QFileDialog to provide the function. + // Always return false, to pretend we do not support this, otherwise + // LO core would try to be smart and cut the extension in some places, + // interfering with QFileDialog's handling of it. QFileDialog also + // saves the value of the setting, so LO core is not needed for that either. + return uno::Any(false); + + return Qt5FilePicker::getValue(controlId, nControlAction); +} + +void SAL_CALL KF5FilePicker::enableControl(sal_Int16 controlId, sal_Bool enable) +{ + if (CHECKBOX_AUTOEXTENSION == controlId) + // We ignore this one and rely on QFileDialog to provide the functionality + return; + + Qt5FilePicker::enableControl(controlId, enable); +} + +void SAL_CALL KF5FilePicker::setLabel(sal_Int16 controlId, const OUString& label) +{ + if (CHECKBOX_AUTOEXTENSION == controlId) + // We ignore this one and rely on QFileDialog to provide the functionality + return; + + Qt5FilePicker::setLabel(controlId, label); +} + +OUString SAL_CALL KF5FilePicker::getLabel(sal_Int16 controlId) +{ + // We ignore this one and rely on QFileDialog to provide the functionality + if (CHECKBOX_AUTOEXTENSION == controlId) + return ""; + + return Qt5FilePicker::getLabel(controlId); +} + +void KF5FilePicker::addCustomControl(sal_Int16 controlId) +{ + // native kf5 filepicker has its own autoextension checkbox, + // therefore avoid adding yet another one + if (controlId == CHECKBOX_AUTOEXTENSION) + return; + + Qt5FilePicker::addCustomControl(controlId); +} + +// XServiceInfo +OUString SAL_CALL KF5FilePicker::getImplementationName() +{ + return OUString("com.sun.star.ui.dialogs.KF5FilePicker"); +} + +sal_Bool SAL_CALL KF5FilePicker::supportsService(const OUString& ServiceName) +{ + return cppu::supportsService(this, ServiceName); +} + +uno::Sequence<OUString> SAL_CALL KF5FilePicker::getSupportedServiceNames() +{ + return FilePicker_getSupportedServiceNames(); +} + +bool KF5FilePicker::eventFilter(QObject* o, QEvent* e) +{ + if (e->type() == QEvent::Show && o->isWidgetType()) + { + auto* w = static_cast<QWidget*>(o); + if (!w->parentWidget() && w->isModal()) + { + if (auto* fileWidget = w->findChild<KFileWidget*>({}, Qt::FindDirectChildrenOnly)) + { + fileWidget->setCustomWidget(m_pExtraControls); + // remove event filter again; the only purpose was to set the custom widget here + qApp->removeEventFilter(this); + } + } + } + return QObject::eventFilter(o, e); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/unx/kf5/KF5FilePicker.hxx b/vcl/unx/kf5/KF5FilePicker.hxx new file mode 100644 index 000000000000..6bfc7ee96077 --- /dev/null +++ b/vcl/unx/kf5/KF5FilePicker.hxx @@ -0,0 +1,65 @@ +/* -*- 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 . + */ + +#pragma once + +#include <Qt5FilePicker.hxx> + +class QGridLayout; + +class KF5FilePicker : public Qt5FilePicker +{ + Q_OBJECT + +protected: + //layout for extra custom controls + QGridLayout* _layout; + + bool allowRemoteUrls; + +public: + explicit KF5FilePicker(css::uno::Reference<css::uno::XComponentContext> const& context, + QFileDialog::FileMode); + + // XExecutableDialog functions + virtual sal_Int16 SAL_CALL execute() override; + + // XFilePickerControlAccess functions + virtual void SAL_CALL setValue(sal_Int16 nControlId, sal_Int16 nControlAction, + const css::uno::Any& rValue) override; + virtual css::uno::Any SAL_CALL getValue(sal_Int16 nControlId, + sal_Int16 nControlAction) override; + virtual void SAL_CALL enableControl(sal_Int16 nControlId, sal_Bool bEnable) override; + virtual void SAL_CALL setLabel(sal_Int16 nControlId, const OUString& rLabel) override; + virtual OUString SAL_CALL getLabel(sal_Int16 nControlId) override; + + // XServiceInfo + virtual OUString SAL_CALL getImplementationName() override; + virtual sal_Bool SAL_CALL supportsService(const OUString& rServiceName) override; + virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override; + +private: + //add a custom control widget to the file dialog + void addCustomControl(sal_Int16 controlId) override; + +protected: + bool eventFilter(QObject* watched, QEvent* event) override; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/unx/kf5/KF5SalFrame.cxx b/vcl/unx/kf5/KF5SalFrame.cxx new file mode 100644 index 000000000000..a212759aeb91 --- /dev/null +++ b/vcl/unx/kf5/KF5SalFrame.cxx @@ -0,0 +1,222 @@ +/* -*- 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 <memory> +#include <QtGui/QColor> +#include <QtWidgets/QStyle> +#include <QtWidgets/QToolTip> +#include <QtWidgets/QApplication> +#include <QtWidgets/QMenuBar> + +#include <KConfig> +#include <KConfigGroup> +#include <KSharedConfig> + +#include "KF5SalFrame.hxx" + +#include <tools/color.hxx> + +#include <vcl/font.hxx> +#include <vcl/settings.hxx> +#include <sal/log.hxx> + +#include <unx/fontmanager.hxx> + +#include <svdata.hxx> + +#include <boost/optional.hpp> + +KF5SalFrame::KF5SalFrame(KF5SalFrame* pParent, SalFrameStyleFlags nState, bool bUseCairo) + : Qt5Frame(pParent, nState, bUseCairo) + , m_bGraphicsInUse(false) +{ +} + +/** Helper function to add information to Font from QFont. + + Mostly grabbed from the Gtk+ vclplug (salnativewidgets-gtk.cxx). +*/ +static vcl::Font toFont(const QFont& rQFont, const css::lang::Locale& rLocale) +{ + psp::FastPrintFontInfo aInfo; + QFontInfo qFontInfo(rQFont); + + // set family name + aInfo.m_aFamilyName = OUString(static_cast<const char*>(rQFont.family().toUtf8()), + strlen(static_cast<const char*>(rQFont.family().toUtf8())), + RTL_TEXTENCODING_UTF8); + + // set italic + aInfo.m_eItalic = (qFontInfo.italic() ? ITALIC_NORMAL : ITALIC_NONE); + + // set weight + int nWeight = qFontInfo.weight(); + if (nWeight <= QFont::Light) + aInfo.m_eWeight = WEIGHT_LIGHT; + else if (nWeight <= QFont::Normal) + aInfo.m_eWeight = WEIGHT_NORMAL; + else if (nWeight <= QFont::DemiBold) + aInfo.m_eWeight = WEIGHT_SEMIBOLD; + else if (nWeight <= QFont::Bold) + aInfo.m_eWeight = WEIGHT_BOLD; + else + aInfo.m_eWeight = WEIGHT_ULTRABOLD; + + // set width + int nStretch = rQFont.stretch(); + if (nStretch == 0) // QFont::AnyStretch since Qt 5.8 + aInfo.m_eWidth = WIDTH_DONTKNOW; + else if (nStretch <= QFont::UltraCondensed) + aInfo.m_eWidth = WIDTH_ULTRA_CONDENSED; + else if (nStretch <= QFont::ExtraCondensed) + aInfo.m_eWidth = WIDTH_EXTRA_CONDENSED; + else if (nStretch <= QFont::Condensed) + aInfo.m_eWidth = WIDTH_CONDENSED; + else if (nStretch <= QFont::SemiCondensed) + aInfo.m_eWidth = WIDTH_SEMI_CONDENSED; + else if (nStretch <= QFont::Unstretched) + aInfo.m_eWidth = WIDTH_NORMAL; + else if (nStretch <= QFont::SemiExpanded) + aInfo.m_eWidth = WIDTH_SEMI_EXPANDED; + else if (nStretch <= QFont::Expanded) + aInfo.m_eWidth = WIDTH_EXPANDED; + else if (nStretch <= QFont::ExtraExpanded) + aInfo.m_eWidth = WIDTH_EXTRA_EXPANDED; + else + aInfo.m_eWidth = WIDTH_ULTRA_EXPANDED; + + SAL_INFO("vcl.kf5", "font name BEFORE system match: \"" << aInfo.m_aFamilyName << "\""); + + // match font to e.g. resolve "Sans" + psp::PrintFontManager::get().matchFont(aInfo, rLocale); + + SAL_INFO("vcl.kf5", "font match " << (aInfo.m_nID != 0 ? "succeeded" : "failed") + << ", name AFTER: \"" << aInfo.m_aFamilyName << "\""); + + // font height + int nPointHeight = qFontInfo.pointSize(); + if (nPointHeight <= 0) + nPointHeight = rQFont.pointSize(); + + // Create the font + vcl::Font aFont(aInfo.m_aFamilyName, Size(0, nPointHeight)); + if (aInfo.m_eWeight != WEIGHT_DONTKNOW) + aFont.SetWeight(aInfo.m_eWeight); + if (aInfo.m_eWidth != WIDTH_DONTKNOW) + aFont.SetWidthType(aInfo.m_eWidth); + if (aInfo.m_eItalic != ITALIC_DONTKNOW) + aFont.SetItalic(aInfo.m_eItalic); + if (aInfo.m_ePitch != PITCH_DONTKNOW) + aFont.SetPitch(aInfo.m_ePitch); + + return aFont; +} + +/** Implementation of KDE integration's main method. +*/ +void KF5SalFrame::UpdateSettings(AllSettings& rSettings) +{ + Qt5Frame::UpdateSettings(rSettings); + + StyleSettings style(rSettings.GetStyleSettings()); + bool bSetTitleFont = false; + + // WM settings + /*KConfig *pConfig = KGlobal::config().data(); + if ( pConfig ) + { + const char *pKey; + + { + KConfigGroup aWMGroup = pConfig->group( "WM" ); + + pKey = "titleFont"; + if (aWMGroup.hasKey(pKey)) + { + vcl::Font aFont = toFont(aWMGroup.readEntry(pKey, QFont()), + rSettings.GetUILanguageTag().getLocale()); + style.SetTitleFont( aFont ); + bSetTitleFont = true; + } + } + + KConfigGroup aIconsGroup = pConfig->group("Icons"); + + pKey = "Theme"; + if (aIconsGroup.hasKey(pKey)) + style.SetPreferredIconTheme( readEntryUntranslated(&aIconsGroup, pKey)); + + //toolbar + pKey = "toolbarFont"; + if (aIconsGroup.hasKey(pKey)) + { + vcl::Font aFont = toFont(aIconsGroup.readEntry(pKey, QFont()), + rSettings.GetUILanguageTag().getLocale()); + style.SetToolFont( aFont ); + } + }*/ + + // Font + vcl::Font aFont = toFont(QApplication::font(), rSettings.GetUILanguageTag().getLocale()); + + style.BatchSetFonts(aFont, aFont); + + aFont.SetWeight(WEIGHT_BOLD); + if (!bSetTitleFont) + { + style.SetTitleFont(aFont); + } + style.SetFloatTitleFont(aFont); + style.SetHelpFont(toFont(QToolTip::font(), rSettings.GetUILanguageTag().getLocale())); + + int flash_time = QApplication::cursorFlashTime(); + style.SetCursorBlinkTime(flash_time != 0 ? flash_time / 2 : STYLE_CURSOR_NOBLINKTIME); + + // Menu + std::unique_ptr<QMenuBar> pMenuBar = std::make_unique<QMenuBar>(); + aFont = toFont(pMenuBar->font(), rSettings.GetUILanguageTag().getLocale()); + style.SetMenuFont(aFont); + + rSettings.SetStyleSettings(style); +} + +SalGraphics* KF5SalFrame::AcquireGraphics() +{ + if (m_bGraphicsInUse) + return nullptr; + + m_bGraphicsInUse = true; + + if (!m_pKF5Graphics.get()) + { + m_pKF5Graphics.reset(new Qt5SvpGraphics(this)); + Qt5Frame::InitQt5SvpGraphics(m_pKF5Graphics.get()); + } + + return m_pKF5Graphics.get(); +} + +void KF5SalFrame::ReleaseGraphics(SalGraphics* pSalGraph) +{ + (void)pSalGraph; + assert(pSalGraph == m_pKF5Graphics.get()); + m_bGraphicsInUse = false; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/unx/kf5/KF5SalFrame.hxx b/vcl/unx/kf5/KF5SalFrame.hxx new file mode 100644 index 000000000000..091a5b019ca7 --- /dev/null +++ b/vcl/unx/kf5/KF5SalFrame.hxx @@ -0,0 +1,47 @@ +/* -*- 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 . + */ + +#pragma once + +#include <memory> + +#include <qt5/Qt5Frame.hxx> +#include <qt5/Qt5SvpGraphics.hxx> + +class QWidget; + +class KF5SalFrame : public Qt5Frame +{ +private: + std::unique_ptr<Qt5SvpGraphics> m_pKF5Graphics; + bool m_bGraphicsInUse; + +public: + KF5SalFrame(KF5SalFrame* pParent, SalFrameStyleFlags nStyle, bool bUseCairo); + + virtual SalGraphics* AcquireGraphics() override; + virtual void ReleaseGraphics(SalGraphics* pGraphics) override; + virtual void UpdateSettings(AllSettings& rSettings) override; + + virtual LanguageType GetInputLanguage() override { return LANGUAGE_SYSTEM; } + virtual SalPointerState GetPointerState() override { return SalPointerState(); } + virtual KeyIndicatorState GetIndicatorState() override { return KeyIndicatorState(); } +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/unx/kf5/KF5SalInstance.cxx b/vcl/unx/kf5/KF5SalInstance.cxx new file mode 100644 index 000000000000..da4906a70a49 --- /dev/null +++ b/vcl/unx/kf5/KF5SalInstance.cxx @@ -0,0 +1,101 @@ +/* -*- 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 <utility> + +#include <QtWidgets/QApplication> + +#include <sal/log.hxx> + +#include <Qt5Data.hxx> + +#include "KF5FilePicker.hxx" +#include "KF5SalFrame.hxx" +#include "KF5SalInstance.hxx" + +using namespace com::sun::star; + +KF5SalInstance::KF5SalInstance(std::unique_ptr<QApplication>& pQApp) + : Qt5Instance(pQApp, true) +{ + ImplSVData* pSVData = ImplGetSVData(); + pSVData->maAppData.mxToolkitName = OUString("kf5"); +} + +SalFrame* KF5SalInstance::CreateFrame(SalFrame* pParent, SalFrameStyleFlags nState) +{ + SalFrame* pRet(nullptr); + RunInMainThread(std::function([&pRet, pParent, nState]() { + pRet = new KF5SalFrame(static_cast<KF5SalFrame*>(pParent), nState, true); + })); + assert(pRet); + return pRet; +} + +bool KF5SalInstance::hasNativeFileSelection() const +{ + if (Application::GetDesktopEnvironment() == "PLASMA5") + return true; + return Qt5Instance::hasNativeFileSelection(); +} + +Qt5FilePicker* +KF5SalInstance::createPicker(css::uno::Reference<css::uno::XComponentContext> const& context, + QFileDialog::FileMode eMode) +{ + if (!IsMainThread()) + { + SolarMutexGuard g; + Qt5FilePicker* pPicker; + RunInMainThread(std::function([&, this]() { pPicker = createPicker(context, eMode); })); + assert(pPicker); + return pPicker; + } + + // In order to insert custom controls, KF5FilePicker currently relies on KFileWidget + // being used in the native file picker, which is only the case for KDE Plasma. + // Therefore, return the plain qt5 one in order to not lose custom controls. + if (Application::GetDesktopEnvironment() == "PLASMA5") + return new KF5FilePicker(context, eMode); + return Qt5Instance::createPicker(context, eMode); +} + +extern "C" { +VCLPLUG_KF5_PUBLIC SalInstance* create_SalInstance() +{ + std::unique_ptr<char* []> pFakeArgv; + std::unique_ptr<int> pFakeArgc; + std::vector<FreeableCStr> aFakeArgvFreeable; + Qt5Instance::AllocFakeCmdlineArgs(pFakeArgv, pFakeArgc, aFakeArgvFreeable); + + std::unique_ptr<QApplication> pQApp + = Qt5Instance::CreateQApplication(*pFakeArgc, pFakeArgv.get()); + + KF5SalInstance* pInstance = new KF5SalInstance(pQApp); + pInstance->MoveFakeCmdlineArgs(pFakeArgv, pFakeArgc, aFakeArgvFreeable); + + new Qt5Data(pInstance); + + return pInstance; +} +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/unx/kf5/KF5SalInstance.hxx b/vcl/unx/kf5/KF5SalInstance.hxx new file mode 100644 index 000000000000..5dd306da5231 --- /dev/null +++ b/vcl/unx/kf5/KF5SalInstance.hxx @@ -0,0 +1,36 @@ +/* -*- 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 . + */ + +#pragma once + +#include <qt5/Qt5Instance.hxx> + +class KF5SalInstance final : public Qt5Instance +{ + bool hasNativeFileSelection() const override; + Qt5FilePicker* createPicker(css::uno::Reference<css::uno::XComponentContext> const& context, + QFileDialog::FileMode) override; + + SalFrame* CreateFrame(SalFrame* pParent, SalFrameStyleFlags nStyle) override; + +public: + explicit KF5SalInstance(std::unique_ptr<QApplication>& pQApp); +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ -- cgit eter by accident Change-Id: Ief805410b3f7035e012e229e77f92d5832430f58 Reviewed-on: https://gerrit.libreoffice.org/11916 Reviewed-by: Noel Grandin <noelgrandin@gmail.com> Tested-by: Noel Grandin <noelgrandin@gmail.com> </td></tr> <tr class='logheader'><td><span title='2014-10-11 15:14:32 +0000'>2014-10-11</span></td><td class='logsubject'><a href='/cgit/lo/core/commit/sfx2/source/dialog/titledockwin.cxx?h=cd-5.3-27&id=cb7ede2d9970a4d162dc71922f578922c0d6235a'>convert vcl StateChangedType to enum class</a><span class='decoration'></span></td><td>Noel Grandin</td></tr> <tr class='nohover-highlight'><td/><td colspan='3' class='logmsg'> Change-Id: Ifa46523619ae7fb8d112525b8df594836e51bb8f Reviewed-on: https://gerrit.libreoffice.org/11843 Tested-by: LibreOffice gerrit bot <gerrit@libreoffice.org> Reviewed-by: Noel Grandin <noelgrandin@gmail.com> </td></tr>