[Libreoffice-commits] core.git: Branch 'feature/kde5' - 2950 commits - accessibility/inc accessibility/source android/Bootstrap android/.gitignore android/README android/source apple_remote/source autogen.sh avmedia/inc avmedia/Library_avmedia.mk avmedia/Library_avmediavlc.mk avmedia/Module_avmedia.mk avmedia/source basctl/inc basctl/source basctl/uiconfig basegfx/inc basegfx/source basegfx/test basic/inc basic/qa basic/source bean/com bean/native binaryurp/source bin/distro-install-desktop-integration bin/find-most-common-warn-messages.py bin/gen-boost-headers bin/get-bugzilla-attachments-by-mimetype bin/lint-ui.py bin/lo-all-static-libs bin/lo-commit-stat bin/lo-pack-sources bin/oss-fuzz-build.sh bin/update bin/update_pch bridges/CustomTarget_gcc3_ios_arm.mk bridges/inc bridges/Library_cpp_uno.mk bridges/Module_bridges.mk bridges/source canvas/Library_canvastools.mk canvas/source canvas/workben chart2/inc chart2/qa chart2/source chart2/uiconfig cli_ure/qa cli_ure/source cli_ure/version codemake r/source comphelper/inc comphelper/qa comphelper/source compilerplugins/clang compilerplugins/Makefile-clang.mk compilerplugins/Makefile.mk config_host/config_global.h.in config_host/config_gpgme.h.in config_host/config_kde5.h.in config_host/config_lgpl.h.in config_host/config_libepubgen.h.in config_host/config_vclplug.h.in config_host.mk.in configmgr/inc configmgr/source configure.ac connectivity/inc connectivity/Library_file.mk connectivity/qa connectivity/source connectivity/workben cppcanvas/inc cppcanvas/Library_cppcanvas.mk cppcanvas/source cppuhelper/source cppu/qa cppu/source cpputools/source cui/inc cui/Library_cui.mk cui/source cui/uiconfig dbaccess/inc dbaccess/Module_dbaccess.mk dbaccess/qa dbaccess/source dbaccess/uiconfig dbaccess/win32 desktop/CppunitTest_desktop_app.mk desktop/Executable_oosplash.mk desktop/inc desktop/Library_sofficeapp.mk desktop/qa desktop/source desktop/StaticLibrary_minidump.mk desktop/test desktop/unx desktop/util desktop/win32 dictionaries dis tro-configs/Jenkins distro-configs/LibreOfficeAndroidX86.conf distro-configs/LibreOfficeFlatpak.conf distro-configs/LibreOfficeiOS.conf download.lst drawinglayer/CppunitTest_drawinglayer_border.mk drawinglayer/inc drawinglayer/qa drawinglayer/source dtrans/source dtrans/test editeng/CppunitTest_editeng_core.mk editeng/inc editeng/Library_editeng.mk editeng/qa editeng/source embeddedobj/source embeddedobj/test embedserv/source emfio/CppunitTest_emfio_wmf_test.mk emfio/inc emfio/qa emfio/source eventattacher/source extensions/source extensions/test extensions/uiconfig external/apache-commons external/beanshell external/boost external/cairo external/coinmp external/collada2gltf external/ct2n external/curl external/epoxy external/expat external/firebird external/freetype external/gpgme external/harfbuzz external/hsqldb external/hunspell external/hyphen external/icu external/jfreereport external/jpeg-turbo external/languagetool external/lcms2 external/libabw external/libcdr external/libc mis external/libebook external/libepubgen external/libetonyek external/libexttextcat external/libfreehand external/libgltf external/libgpg-error external/libjpeg-turbo external/liblangtag external/libmariadb external/libmspub external/libmwaw external/libodfgen external/liborcus external/libpagemaker external/libpng external/libqxp external/librevenge external/libstaroffice external/libvisio external/libwpd external/libwpg external/libwps external/libxml2 external/libxmlsec external/libxslt external/libzmf external/mariadb-connector-c external/Module_external.mk external/more_fonts external/mysql-connector-cpp external/mysqlcppconn external/mythes external/nss external/openldap external/owncloud-android-lib external/pdfium external/poppler external/python3 external/redland external/rhino external/xmlsec extras/source filter/Configuration_filter.mk filter/Library_graphicfilter.mk filter/qa filter/source filter/uiconfig forms/inc forms/source formula/inc formula/source formula/uiconfi g fpicker/source fpicker/uiconfig framework/inc framework/Library_fwe.mk framework/qa framework/source .git-hooks/pre-commit .gitignore helpcompiler/inc helpcompiler/source helpcontent2 hwpfilter/inc hwpfilter/qa hwpfilter/source i18nlangtag/qa i18nlangtag/source i18npool/inc i18npool/qa i18npool/source i18nutil/source icon-themes/breeze icon-themes/breeze_dark icon-themes/breeze_svg icon-themes/crystal icon-themes/elementary icon-themes/galaxy icon-themes/hicontrast icon-themes/oxygen icon-themes/sifr icon-themes/sifr_dark icon-themes/sifr_svg icon-themes/tango idlc/inc idlc/source idl/inc idl/source include/apple_remote include/avmedia include/basegfx include/basic include/canvas include/codemaker include/com include/comphelper include/connectivity include/cppcanvas include/cppu include/cppuhelper include/default.rc include/drawinglayer include/editeng include/filter include/formula include/framework include/i18nlangtag include/i18nutil include/jvmaccess include/jvmfwk include/Lib reOfficeKit include/linguistic include/o3tl include/oox include/opencl include/osl include/prewin.h include/registry include/rtl include/sal include/salhelper include/sax include/sfx2 include/sot include/svl include/svtools include/svx include/systools include/test include/toolkit include/tools include/typelib include/ucbhelper include/uno include/unotest include/unotools include/vbahelper include/vcl include/xmloff include/xmlreader include/xmlsecurity instsetoo_native/CustomTarget_setup.mk instsetoo_native/inc_openoffice io/qa ios/CustomTarget_iOS.mk ios/CustomTarget_LibreOfficeLight_app.mk ios/CustomTarget_Lo_Xcconfig.mk ios/CustomTarget_Prototype_app.mk ios/DISCLAIMER_WARNING ios/experimental ios/.gitignore ios/LibreOfficeKit ios/LibreOfficeLight ios/loApp.xcconfig.in ios/loKit.xcconfig.in ios/lo.xcconfig.in ios/Module_ios.mk io/source ios/README javaunohelper/com javaunohelper/source javaunohelper/test jurt/com jurt/source jvmaccess/source jvmfwk/inc jvmfwk/plugins jvmfwk/sourc e l10ntools/inc l10ntools/source libreofficekit/Executable_gtktiledviewer.mk libreofficekit/Module_libreofficekit.mk libreofficekit/qa libreofficekit/source lingucomponent/Library_hyphen.mk lingucomponent/Library_lnth.mk lingucomponent/Library_MacOSXSpell.mk lingucomponent/Library_spell.mk lingucomponent/source linguistic/source logerrit lotuswordpro/inc lotuswordpro/Library_lwpft.mk lotuswordpro/source m4/libgcrypt.m4 Makefile.fetch Makefile.in mysqlc/Extension_mysql-connector-ooo.mk mysqlc/Library_mysqlc.mk mysqlc/source o3tl/qa odk/CustomTarget_build-examples.mk odk/docs odk/examples odk/qa odk/source offapi/com officecfg/qa officecfg/README officecfg/registry officecfg/util onlineupdate/Executable_test_updater_dialog.mk onlineupdate/Executable_updater.mk onlineupdate/Executable_update_service.mk onlineupdate/inc onlineupdate/Module_onlineupdate.mk onlineupdate/source onlineupdate/StaticLibrary_libmarverify.mk onlineupdate/workben oovbaapi/ooo oovbaapi/UnoApi_oovbaapi.mk oox/Cppu nitTest_oox_tokenmap.mk oox/inc oox/Library_oox.mk oox/qa oox/source opencl/inc opencl/source package/inc package/source postprocess/CustomTarget_fontconfig.mk postprocess/CustomTarget_images.mk postprocess/Module_postprocess.mk postprocess/Package_fontconfig.mk postprocess/qa postprocess/Rdb_services.mk pyuno/Module_pyuno.mk pyuno/PythonTest_pytests.mk pyuno/qa pyuno/source qadevOOo/Jar_OOoRunner.mk qadevOOo/objdsc qadevOOo/runner qadevOOo/tests readlicense_oo/docs readlicense_oo/license README.cross README.md registry/source registry/tools remotebridges/source reportbuilder/java reportdesign/inc reportdesign/Library_rptui.mk reportdesign/source reportdesign/uiconfig reportdesign/util RepositoryExternal.mk Repository.mk ridljar/com sal/cppunittester salhelper/qa salhelper/source sal/inc sal/osl sal/qa sal/rtl sal/test sal/textenc sal/util sax/qa sax/README sax/source scaddins/source sccomp/CppunitTest_sccomp_lpsolver.mk sccomp/CppunitTest_sccomp_solver.mk sccomp/Module_sccomp.mk sc comp/qa sccomp/source sc/CppunitTest_sc_arealinkobj.mk sc/CppunitTest_sc_arealinksobj.mk sc/CppunitTest_sc_cache_test.mk sc/CppunitTest_sc_databaserangeobj.mk sc/CppunitTest_sc_datapilotitemobj.mk sc/CppunitTest_sc_datapilottableobj.mk sc/CppunitTest_sc_dataprovider.mk sc/CppunitTest_sc_dataproviders_test.mk sc/CppunitTest_sc_datatransformation.mk sc/CppunitTest_sc_macros_test.mk sc/CppunitTest_sc_namedrangeobj.mk sc/CppunitTest_sc_namedrangesobj.mk sc/CppunitTest_sc_subsequent_filters_test.mk sc/CppunitTest_sc_subtotalfieldobj.mk sc/CppunitTest_sc_tablesheetobj.mk sc/inc sc/Library_scfilt.mk sc/Library_sc.mk sc/Library_vbaobj.mk sc/Module_sc.mk scp2/inc scp2/InstallScript_setup_osl.mk scp2/macros scp2/Module_scp2.mk scp2/source sc/qa sc/README sc/res scripting/source sc/sdi sc/source sc/uiconfig sc/UIConfig_scalc.mk sc/workben sd/CppunitTest_sd_activex_controls_tests.mk sd/CppunitTest_sd_import_tests_smartart.mk sdext/inc sdext/source sd/inc sd/Library_sdfilt.mk sd/Module_sd.mk sd/ qa sd/sdi sd/source sd/uiconfig sd/xsl setup_native/source sfx2/classification sfx2/CppunitTest_sfx2_misc.mk sfx2/doc sfx2/inc sfx2/Library_sfx.mk sfx2/Module_sfx2.mk sfx2/qa sfx2/sdi sfx2/source sfx2/uiconfig shell/inc shell/qa shell/source slideshow/inc slideshow/source slideshow/test smoketest/libtest.cxx smoketest/smoketest.cxx smoketest/smoketest_too.cxx solenv/bin solenv/clang-cl solenv/CompilerTest_compilerplugins_clang.mk solenv/flatpak-manifest.in solenv/gbuild solenv/gcc-wrappers solenv/gdb solenv/inc soltools/cpp soltools/mkdepend sot/inc sot/qa sot/source starmath/inc starmath/qa starmath/source starmath/uiconfig stoc/source stoc/test store/source svgio/inc svgio/qa svgio/source svl/inc svl/Library_svl.mk svl/qa svl/source svtools/inc svtools/langsupport svtools/Library_svt.mk svtools/qa svtools/source svtools/uiconfig svtools/UIConfig_svt.mk svx/inc svx/Library_svx.mk svx/sdi svx/source svx/uiconfig svx/UIConfig_svx.mk svx/util svx/workben sw/CppunitTest_sw_ooxmlexport1 0.mk sw/CppunitTest_sw_rtfimport.mk sw/CppunitTest_sw_uiwriter.mk sw/CppunitTest_sw_ww8export2.mk swext/mediawiki sw/inc sw/JunitTest_sw_complex.mk sw/Module_sw.mk sw/ooxmlexport_setup.mk sw/qa sw/README sw/sdi sw/source sw/uiconfig sw/UIConfig_sglobal.mk sw/UIConfig_swriter.mk sysui/CustomTarget_share.mk sysui/CustomTarget_solaris.mk sysui/desktop test/Library_subsequenttest.mk test/source testtools/source toolkit/inc toolkit/qa toolkit/source toolkit/test tools/inc tools/Library_tl.mk tools/qa tools/source translations ucbhelper/source ucb/Library_ucpcmis1.mk ucb/Library_ucpimage.mk ucb/Module_ucb.mk ucb/qa ucb/source udkapi/com uitest/libreoffice uitest/writer_tests UnoControls/source unodevtools/inc unodevtools/source unoidl/source unoil/climaker unotest/source unotools/inc unotools/qa unotools/source unoxml/inc unoxml/qa unoxml/source uui/inc uui/source vbahelper/inc vbahelper/source vcl/android vcl/backendtest vcl/commonfuzzer.mk vcl/CustomTarget_kde5_moc.mk vcl/Executable_602 fuzzer.mk vcl/Executable_bmpfuzzer.mk vcl/Executable_cgmfuzzer.mk vcl/Executable_dxffuzzer.mk vcl/Executable_epsfuzzer.mk vcl/Executable_fodpfuzzer.mk vcl/Executable_fodsfuzzer.mk vcl/Executable_fodtfuzzer.mk vcl/Executable_giffuzzer.mk vcl/Executable_hwpfuzzer.mk vcl/Executable_jpgfuzzer.mk vcl/Executable_lwpfuzzer.mk vcl/Executable_metfuzzer.mk vcl/Executable_olefuzzer.mk vcl/Executable_pcdfuzzer.mk vcl/Executable_pctfuzzer.mk vcl/Executable_pcxfuzzer.mk vcl/Executable_pngfuzzer.mk vcl/Executable_ppmfuzzer.mk vcl/Executable_pptfuzzer.mk vcl/Executable_psdfuzzer.mk vcl/Executable_qpwfuzzer.mk vcl/Executable_rasfuzzer.mk vcl/Executable_rtffuzzer.mk vcl/Executable_slkfuzzer.mk vcl/Executable_svmfuzzer.mk vcl/Executable_tgafuzzer.mk vcl/Executable_tiffuzzer.mk vcl/Executable_wmffuzzer.mk vcl/Executable_ww2fuzzer.mk vcl/Executable_ww6fuzzer.mk vcl/Executable_ww8fuzzer.mk vcl/Executable_xbmfuzzer.mk vcl/Executable_xpmfuzzer.mk vcl/headless vcl/inc vcl/ios vcl/Library_vcl.mk vcl/Library_ vclplug_kde5.mk vcl/Module_vcl.mk vcl/null vcl/opengl vcl/osx vcl/qa vcl/quartz vcl/README.scheduler vcl/source vcl/uiconfig vcl/unx vcl/win vcl/workben winaccessibility/inc winaccessibility/Library_uacccom.mk winaccessibility/Library_winaccessibility.mk winaccessibility/source wizards/com wizards/source writerfilter/inc writerfilter/qa writerfilter/source writerperfect/CppunitTest_writerperfect_epubexport.mk writerperfect/inc writerperfect/Library_wpftdraw.mk writerperfect/Library_wpftwriter.mk writerperfect/Module_writerperfect.mk writerperfect/qa writerperfect/source writerperfect/uiconfig writerperfect/UIConfig_writerperfect.mk writerperfect/UITest_writerperfect_epubexport.mk xmlhelp/source xmlhelp/util xmloff/inc xmloff/qa xmloff/source xmlreader/source xmlscript/inc xmlscript/source xmlscript/test xmlsecurity/inc xmlsecurity/Library_xmlsecurity.mk xmlsecurity/Library_xsec_xmlsec.mk xmlsecurity/Module_xmlsecurity.mk xmlsecurity/qa xmlsecurity/source xmlsecurity/uiconfig xmlsecu rity/workben

Katarina Behrens Katarina.Behrens at cib.de
Wed Oct 25 01:27:07 UTC 2017


Rebased ref, commits from common ancestor:
commit a555163e57e1a402ccd2a708304aabf212013706
Author: Katarina Behrens <Katarina.Behrens at cib.de>
Date:   Fri Oct 20 18:49:00 2017 +0200

    kde5: make VCLKDE5Application build again
    
    Change-Id: Ia1f4d1254583d04d1993e9a0ce8ad1f1aaa868d3

diff --git a/vcl/Library_vclplug_kde5.mk b/vcl/Library_vclplug_kde5.mk
index cfd6beb524ce..1fe5c784831f 100644
--- a/vcl/Library_vclplug_kde5.mk
+++ b/vcl/Library_vclplug_kde5.mk
@@ -83,6 +83,7 @@ $(eval $(call gb_Library_add_exception_objects,vclplug_kde5,\
     vcl/unx/kde5/KDE5SalGraphics \
     vcl/unx/kde5/KDE5SalInstance \
     vcl/unx/kde5/KDE5XLib \
+    vcl/unx/kde5/VCLKDE5Application \
     vcl/unx/kde5/main \
 ))
 
diff --git a/vcl/unx/kde5/KDE5XLib.hxx b/vcl/unx/kde5/KDE5XLib.hxx
index 152bba357f3b..4bd99ab3bbd7 100644
--- a/vcl/unx/kde5/KDE5XLib.hxx
+++ b/vcl/unx/kde5/KDE5XLib.hxx
@@ -22,6 +22,7 @@
 #include <memory>
 
 #include <unx/saldisp.hxx>
+#include <unx/salinst.h>
 
 //#include <fixx11h.h>
 //
@@ -31,16 +32,14 @@
 #include <QtCore/QTimer>
 #include <QtCore/QAbstractNativeEventFilter>
 
-#include <unx/salinst.h>
-
-class VCLKDEApplication;
+class VCLKDE5Application;
 
 class KDE5XLib : public QObject, public QAbstractNativeEventFilter, public SalXLib
 {
     Q_OBJECT
     private:
         bool m_bStartupDone;
-        std::unique_ptr<VCLKDEApplication> m_pApplication;
+        std::unique_ptr<VCLKDE5Application> m_pApplication;
         std::unique_ptr<char*[]> m_pFreeCmdLineArgs;
         std::unique_ptr<char*[]> m_pAppCmdLineArgs;
         int m_nFakeCmdLineArgs;
diff --git a/vcl/unx/kde5/VCLKDE5Application.cxx b/vcl/unx/kde5/VCLKDE5Application.cxx
index 15ff9a2dfdac..981a98a51399 100644
--- a/vcl/unx/kde5/VCLKDE5Application.cxx
+++ b/vcl/unx/kde5/VCLKDE5Application.cxx
@@ -24,8 +24,8 @@
 
 #include "KDE5SalDisplay.hxx"
 
-VCLKDE5Application::VCLKDE5Application() :
-    QApplication()
+VCLKDE5Application::VCLKDE5Application( int argc, char** argv) :
+    QApplication( argc, argv)
 {
 }
 
@@ -53,7 +53,8 @@ void VCLKDE5Application::postDialogCleanup()
     // (such as the auto-extension flag), but that doesn't update KGlobal::config()
     // (which is probably a KDE bug), so force reading the new configuration,
     // otherwise the next opening of the dialog would use the old settings.
-    KGlobal::config()->reparseConfiguration();
+    KConfig config;
+    config.reparseConfiguration();
     // HACK: If Qt owns clipboard or selection, give up on their ownership now. Otherwise
     // LO core might ask for the contents, but it would block while doing so (i.e. it
     // doesn't seem to have an equivalent of QClipboard's "useEventLoopWhenWaiting"),
diff --git a/vcl/unx/kde5/VCLKDE5Application.hxx b/vcl/unx/kde5/VCLKDE5Application.hxx
index 6d2b6f2fdae1..c9526d4e15b6 100644
--- a/vcl/unx/kde5/VCLKDE5Application.hxx
+++ b/vcl/unx/kde5/VCLKDE5Application.hxx
@@ -24,13 +24,15 @@
 
 #include <QtWidgets/QApplication>
 #include <QtCore/QAbstractNativeEventFilter>
+#include <KConfigCore/kconfig.h>
+
 
 #undef Region
 
-class VCLKDEApplication : public QApplication, public QAbstractNativeEventFilter
+class VCLKDE5Application : public QApplication, public QAbstractNativeEventFilter
 {
     public:
-        VCLKDEApplication();
+        VCLKDE5Application( int argv, char** argc);
         static void preDialogSetup();
         static void postDialogCleanup();
 };
commit 05daba4a7ebc5ceccf6f5c811f5eff151e420734
Author: Katarina Behrens <Katarina.Behrens at cib.de>
Date:   Thu Oct 19 22:25:49 2017 +0200

    kde5: fix glib detection for KF5
    
    Change-Id: Ibd25502384cd248f1070d26266222e18fb9e2e47

diff --git a/configure.ac b/configure.ac
index a47fc48f10e8..eb47dfbc83ca 100644
--- a/configure.ac
+++ b/configure.ac
@@ -10834,6 +10834,153 @@ AC_SUBST(KDE4_GLIB_LIBS)
 AC_SUBST(KDE4_HAVE_GLIB)
 
 dnl ===================================================================
+dnl KDE5 Integration
+dnl ===================================================================
+
+KF5_CFLAGS=""
+KF5_LIBS=""
+QMAKE5="qmake"
+KF5_CONFIG="kf5-config"
+MOC5="moc"
+KF5_GLIB_CFLAGS=""
+KF5_GLIB_LIBS=""
+KF5_HAVE_GLIB=""
+if test "$test_kde5" = "yes" -a "$ENABLE_KDE5" = "TRUE"; then
+    qt5_incdirs="$QT5INC /usr/include/qt5 /usr/include $x_includes"
+    qt5_libdirs="$QT5LIB /usr/lib/qt5 /usr/lib $x_libraries"
+
+    kf5_incdirs="$KF5INC /usr/include /usr/include/KF5 $x_includes"
+    kf5_libdirs="$KF5LIB /usr/lib /usr/lib/kf5 /usr/lib/kf5/devel $x_libraries"
+
+    if test -n "$supports_multilib"; then
+        qt5_libdirs="$qt5_libdirs /usr/lib64/qt5 /usr/lib64/qt /usr/lib64"
+        kf5_libdirs="$kf5_libdirs /usr/lib64 /usr/lib64/kf5 /usr/lib64/kf5/devel"
+    fi
+
+    qt5_test_include="QtWidgets/qapplication.h"
+    qt5_test_library="libQt5Widgets.so"
+    kf5_test_include="kcoreaddons_version.h"
+    kf5_test_library="libKF5CoreAddons.so"
+
+    dnl Check for qmake
+    AC_PATH_PROGS( QMAKE5, [qmake-qt5 qmake], no, [$QT5DIR/bin:$PATH] )
+    if test "$QMAKE5" != "no"; then
+        qt5_incdirs="`$QMAKE5 -query QT_INSTALL_HEADERS` $qt5_incdirs"
+        qt5_libdirs="`$QMAKE5 -query QT_INSTALL_LIBS` $qt5_libdirs"
+    fi
+
+    AC_MSG_CHECKING([for Qt5 headers])
+    qt5_incdir="no"
+    for inc_dir in $qt5_incdirs; do
+        if test -r "$inc_dir/$qt5_test_include"; then
+            qt5_incdir="$inc_dir"
+            break
+        fi
+    done
+    AC_MSG_RESULT([$qt5_incdir])
+    if test "x$qt5_incdir" = "xno"; then
+        AC_MSG_ERROR([Qt5 headers not found.  Please specify the root of your Qt5 installation by exporting QT5DIR before running "configure".])
+    fi
+
+    AC_MSG_CHECKING([for Qt5 libraries])
+    qt5_libdir="no"
+    for lib_dir in $qt5_libdirs; do
+        if test -r "$lib_dir/$qt5_test_library"; then
+            qt5_libdir="$lib_dir"
+            break
+        fi
+    done
+    AC_MSG_RESULT([$qt5_libdir])
+    if test "x$qt5_libdir" = "xno"; then
+        AC_MSG_ERROR([Qt5 libraries not found.  Please specify the root of your Qt5 installation by exporting QT5DIR before running "configure".])
+    fi
+    kf5_libdirs="$qt5_libdir $kf5_libdirs"
+
+    dnl Check for Meta Object Compiler
+
+    AC_PATH_PROGS( MOC5, [moc-qt5 moc], no, [`dirname $qt5_libdir`/bin:$QT5DIR/bin:$PATH] )
+    if test "$MOC5" = "no"; then
+        AC_MSG_ERROR([Qt Meta Object Compiler not found.  Please specify
+the root of your Qt installation by exporting QT5DIR before running "configure".])
+    fi
+
+    dnl kf5 KDE4 support compatibility installed
+    AC_PATH_PROG( KF5_CONFIG, $KF5_CONFIG, no, )
+    if test "$KF5_CONFIG" != "no"; then
+        kf5_incdirs="`$KF5_CONFIG --path include` $kf5_incdirs"
+        kf5_libdirs="`$KF5_CONFIG --path lib` $kf5_libdirs"
+    fi
+
+    dnl Check for KF5 headers
+    AC_MSG_CHECKING([for KF5 headers])
+    kf5_incdir="no"
+    for kf5_check in $kf5_incdirs; do
+        if test -r "$kf5_check/$kf5_test_include"; then
+            kf5_incdir="$kf5_check"
+            break
+        fi
+    done
+    AC_MSG_RESULT([$kf5_incdir])
+    if test "x$kf5_incdir" = "xno"; then
+        AC_MSG_ERROR([KF5 headers not found.  Please specify the root of your KF5 installation by exporting KF5DIR before running "configure".])
+    fi
+
+    dnl Check for KF5 libraries
+    AC_MSG_CHECKING([for KF5 libraries])
+    kf5_libdir="no"
+    for kf5_check in $kf5_libdirs; do
+        if test -r "$kf5_check/$kf5_test_library"; then
+            kf5_libdir="$kf5_check"
+            break
+        fi
+    done
+
+    AC_MSG_RESULT([$kf5_libdir])
+    if test "x$kf5_libdir" = "xno"; then
+        AC_MSG_ERROR([KF5 libraries not found.  Please specify the root of your KF5 installation by exporting KF5DIR before running "configure".])
+    fi
+
+    PKG_CHECK_MODULES(KF5_XCB,[xcb],,[AC_MSG_ERROR([XCB not installed])])
+
+    KF5_CFLAGS="-I$kf5_incdir -I$kf5_incdir/KCoreAddons -I$kf5_incdir/KI18n -I$kf5_incdir/KConfigCore -I$kf5_incdir/KWindowSystem -I$kf5_incdir/KIOCore -I$qt5_incdir -I$qt5_incdir/QtCore -I$qt5_incdir/QtGui -I$qt5_incdir/QtWidgets -I$qt5_incdir/QtNetwork -DQT_CLEAN_NAMESPACE -DQT_THREAD_SUPPORT $KF5_XCB_CFLAGS"
+    KF5_LIBS="-L$kf5_libdir -lKF5CoreAddons -lKF5I18n -lKF5ConfigCore -lKF5WindowSystem -lKF5KIOCore -L$qt5_libdir -lQt5Core -lQt5Gui -lQt5Widgets -lQt5Network -lQt5X11Extras $KF5_XCB_LIBS"
+    KF5_CFLAGS=$(printf '%s' "$KF5_CFLAGS" | sed -e "s/-I/${ISYSTEM?}/g")
+
+    AC_LANG_PUSH([C++])
+    save_CXXFLAGS=$CXXFLAGS
+    CXXFLAGS="$CXXFLAGS $KF5_CFLAGS"
+    AC_MSG_CHECKING([whether KDE is >= 5.0])
+       AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <kcoreaddons_version.h>
+
+int main(int argc, char **argv) {
+       if (KCOREADDONS_VERSION_MAJOR == 5 && KCOREADDONS_VERSION_MINOR >= 0) return 0;
+       else return 1;
+}
+]])],[AC_MSG_RESULT([yes])],[AC_MSG_ERROR([KDE5 version too old])],[])
+    CXXFLAGS=$save_CXXFLAGS
+    AC_LANG_POP([C++])
+
+    # Glib is needed for properly handling Qt event loop with Qt's Glib integration enabled.
+    # Sets also KF5_GLIB_CFLAGS/KF5_GLIB_LIBS if successful.
+    PKG_CHECK_MODULES(KF5_GLIB,[glib-2.0 >= 2.4],
+        [
+            KF5_HAVE_GLIB=TRUE
+            AC_DEFINE(KF5_HAVE_GLIB,1)
+            KF5_GLIB_CFLAGS=$(printf '%s' "$KF5_GLIB_CFLAGS" | sed -e "s/-I/${ISYSTEM?}/g")
+            FilterLibs "${KF5_GLIB_LIBS}"
+            KF5_GLIB_LIBS="${filteredlibs}"
+        ],
+        AC_MSG_WARN([[No Glib found, KDE5 support will not use native file pickers!]]))
+fi
+AC_SUBST(KF5_CFLAGS)
+AC_SUBST(KF5_LIBS)
+AC_SUBST(MOC5)
+AC_SUBST(KF5_GLIB_CFLAGS)
+AC_SUBST(KF5_GLIB_LIBS)
+AC_SUBST(KF5_HAVE_GLIB)
+
+dnl ===================================================================
 dnl Test whether to include Evolution 2 support
 dnl ===================================================================
 AC_MSG_CHECKING([whether to enable evolution 2 support])
diff --git a/vcl/unx/kde5/KDE5XLib.cxx b/vcl/unx/kde5/KDE5XLib.cxx
index d9b8e747f3c8..32a80ad8644a 100644
--- a/vcl/unx/kde5/KDE5XLib.cxx
+++ b/vcl/unx/kde5/KDE5XLib.cxx
@@ -397,7 +397,7 @@ uno::Reference< ui::dialogs::XFilePicker2 > KDE5XLib::createFilePicker(
         SalYieldMutexReleaser aReleaser;
         return Q_EMIT createFilePickerSignal( xMSF );
     }
-    return uno::Reference< ui::dialogs::XFilePicker2 >( new KDE4FilePicker( xMSF ) );
+    //return uno::Reference< ui::dialogs::XFilePicker2 >( new KDE4FilePicker( xMSF ) );
 #else
     (void)xMSF;
     return NULL;
commit 637bbffa3082d22d110740553ed52ad5182dd1f5
Author: Katarina Behrens <Katarina.Behrens at cib.de>
Date:   Wed Oct 4 21:57:56 2017 +0200

    kde5: avoid crash with null surface
    
    Change-Id: Ie63e62995bee0fd950cea0668f5ae06c903b25a3

diff --git a/vcl/unx/kde5/KDE5SalFrame.cxx b/vcl/unx/kde5/KDE5SalFrame.cxx
index a58c2d3723f1..5a15b6fb2592 100644
--- a/vcl/unx/kde5/KDE5SalFrame.cxx
+++ b/vcl/unx/kde5/KDE5SalFrame.cxx
@@ -340,7 +340,8 @@ void KDE5SalFrame::ReleaseGraphics( SalGraphics *pGraphics )
         if( m_aGraphics[i].pGraphics.get() == pGraphics )
         {
             m_aGraphics[i].bInUse = false;
-            cairo_surface_destroy( m_aGraphics[i].pSurface );
+            if ( m_aGraphics[i].pSurface != nullptr )
+                cairo_surface_destroy( m_aGraphics[i].pSurface );
             break;
         }
     }
commit 72c28fb1be61a464e45bfbbe91f1e383accfc7b2
Author: Katarina Behrens <Katarina.Behrens at cib.de>
Date:   Wed Oct 4 21:20:15 2017 +0200

    kde5: implement getCairoContext
    
    Change-Id: Ib39ca1e1d73ad4dc91c70ac3f4cdd1bdd24c2b29

diff --git a/vcl/unx/kde5/KDE5SalFrame.cxx b/vcl/unx/kde5/KDE5SalFrame.cxx
index 1e405ef629d1..a58c2d3723f1 100644
--- a/vcl/unx/kde5/KDE5SalFrame.cxx
+++ b/vcl/unx/kde5/KDE5SalFrame.cxx
@@ -383,4 +383,18 @@ SalGraphics* KDE5SalFrame::AcquireGraphics()
     return nullptr;
 }
 
+cairo_t* KDE5SalFrame::getCairoContext() const
+{
+    for( int i = 0; i < nMaxGraphics; i++ )
+    {
+        if( ! m_aGraphics[i].bInUse )
+        {
+            cairo_t* cr = cairo_create( m_aGraphics[i].pSurface );
+            assert(cr);
+            return cr;
+        }
+    }
+}
+
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/kde5/KDE5SalFrame.hxx b/vcl/unx/kde5/KDE5SalFrame.hxx
index ab98ee933c2a..7cc2a8e97662 100644
--- a/vcl/unx/kde5/KDE5SalFrame.hxx
+++ b/vcl/unx/kde5/KDE5SalFrame.hxx
@@ -111,6 +111,7 @@ class KDE5SalFrame : public SalFrame
 
         virtual void Flush() override { return; }
 
+        cairo_t* getCairoContext() const;
 };
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit a8c16e7c42bc19579f56f9d0ec3d05d70a48481a
Author: Katarina Behrens <Katarina.Behrens at cib.de>
Date:   Wed Oct 4 20:45:28 2017 +0200

    kde5: get/setLib works again
    
    Change-Id: Icc007d5c08f88ffdeb6e2d033615dccb140862ea

diff --git a/vcl/unx/kde5/KDE5Data.hxx b/vcl/unx/kde5/KDE5Data.hxx
index 1106663d3910..6feedbe81734 100644
--- a/vcl/unx/kde5/KDE5Data.hxx
+++ b/vcl/unx/kde5/KDE5Data.hxx
@@ -35,6 +35,8 @@ class KDE5Data //: public X11SalData
         virtual void Init() ;
         virtual void initNWF() ;
         virtual void deInitNWF() ;
+
+        KDE5XLib* GetLib() { return pXLib_; }
     private:
         KDE5XLib *pXLib_;
         QApplication* qMyApp;
diff --git a/vcl/unx/kde5/KDE5SalInstance.hxx b/vcl/unx/kde5/KDE5SalInstance.hxx
index e6169256020e..54f2798dc65e 100644
--- a/vcl/unx/kde5/KDE5SalInstance.hxx
+++ b/vcl/unx/kde5/KDE5SalInstance.hxx
@@ -23,6 +23,7 @@
 
 class SalYieldMutex;
 class SalFrame;
+class KDE5XLib;
 
 class KDE5SalInstance : public SvpSalInstance
 {
@@ -41,6 +42,10 @@ public:
                               css::uno::XComponentContext >& ) override;
 
     virtual bool IsMainThread() const override;
+    void SetLib( KDE5XLib *pXLib ) { m_pXLib = pXLib; }
+
+private:
+    KDE5XLib *m_pXLib;
 };
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/kde5/main.cxx b/vcl/unx/kde5/main.cxx
index c26d2ab25c4f..654a9d654ee8 100644
--- a/vcl/unx/kde5/main.cxx
+++ b/vcl/unx/kde5/main.cxx
@@ -79,7 +79,7 @@ extern "C" {
         KDE5Data *salData = new KDE5Data( pInstance );
         salData->Init();
         salData->initNWF();
-        //pInstance->SetLib(salData->GetLib());
+        pInstance->SetLib(salData->GetLib());
 
         return pInstance;
     }
commit 187324751d27dcc96c5e2cc17ad9bc38bc7d8480
Author: Katarina Behrens <Katarina.Behrens at cib.de>
Date:   Fri Sep 29 17:26:26 2017 +0200

    kde5: add cairo surface to KDE5SalFrames
    
    Change-Id: I0778ecffe5dbc5fdfe24705d37511e197a4a1ce4

diff --git a/vcl/Library_vclplug_kde5.mk b/vcl/Library_vclplug_kde5.mk
index 7775fbf9a71a..cfd6beb524ce 100644
--- a/vcl/Library_vclplug_kde5.mk
+++ b/vcl/Library_vclplug_kde5.mk
@@ -52,6 +52,7 @@ $(eval $(call gb_Library_use_libraries,vclplug_kde5,\
 
 $(eval $(call gb_Library_use_externals,vclplug_kde5,\
 	boost_headers \
+	cairo \
 	icuuc \
 	kde5 \
 	epoxy \
diff --git a/vcl/unx/kde5/KDE5SalFrame.cxx b/vcl/unx/kde5/KDE5SalFrame.cxx
index 1cdc503ff4f8..1e405ef629d1 100644
--- a/vcl/unx/kde5/KDE5SalFrame.cxx
+++ b/vcl/unx/kde5/KDE5SalFrame.cxx
@@ -340,6 +340,7 @@ void KDE5SalFrame::ReleaseGraphics( SalGraphics *pGraphics )
         if( m_aGraphics[i].pGraphics.get() == pGraphics )
         {
             m_aGraphics[i].bInUse = false;
+            cairo_surface_destroy( m_aGraphics[i].pSurface );
             break;
         }
     }
@@ -359,6 +360,7 @@ SalGraphics* KDE5SalFrame::AcquireGraphics()
 {
     if( GetWindow() )
     {
+        basegfx::B2IVector aSize( 142, 142 );
         for( int i = 0; i < nMaxGraphics; i++ )
         {
             if( ! m_aGraphics[i].bInUse )
@@ -367,6 +369,10 @@ SalGraphics* KDE5SalFrame::AcquireGraphics()
                 if( ! m_aGraphics[i].pGraphics )
                 {
                     m_aGraphics[i].pGraphics.reset( new KDE5SalGraphics( this, m_pWindow ) );
+
+                    //FIXME: those parameters are completely arbitrary, IDK what the right ones should be yet
+                    m_aGraphics[i].pSurface = cairo_image_surface_create( CAIRO_FORMAT_ARGB32, aSize.getX(), aSize.getY() );
+                    m_aGraphics[i].pGraphics->setSurface( m_aGraphics[i].pSurface, aSize );
                     //m_aGraphics[i].pGraphics->Init( this, GetWindow(), GetScreenNumber() );
                 }
                 return m_aGraphics[i].pGraphics.get();
diff --git a/vcl/unx/kde5/KDE5SalFrame.hxx b/vcl/unx/kde5/KDE5SalFrame.hxx
index 7d0fa51d2eb6..ab98ee933c2a 100644
--- a/vcl/unx/kde5/KDE5SalFrame.hxx
+++ b/vcl/unx/kde5/KDE5SalFrame.hxx
@@ -20,6 +20,7 @@
 #pragma once
 
 #include <memory>
+#include <cairo.h>
 
 #include <unx/saldisp.hxx>
 #include <unx/salframe.h>
@@ -39,8 +40,9 @@ class KDE5SalFrame : public SalFrame
         {
             std::unique_ptr<KDE5SalGraphics> pGraphics;
             bool bInUse;
+            cairo_surface_t* pSurface;
 
-            GraphicsHolder() : bInUse( false ) {}
+            GraphicsHolder() : bInUse( false ), pSurface(nullptr) {}
         };
 
         GraphicsHolder m_aGraphics[ nMaxGraphics ];
commit c375c585142ba7636e9a21c0249365f75224ecc1
Author: Katarina Behrens <Katarina.Behrens at cib.de>
Date:   Thu Sep 28 11:56:55 2017 +0200

    kde5: convert X11SalFrame to SalFrame
    
    this is WIP and crashes and leaks left'n'right
    
    Change-Id: If4be8cf6d426b705b5dbb5893a18cdbce2aa541a

diff --git a/vcl/unx/kde5/KDE5Data.cxx b/vcl/unx/kde5/KDE5Data.cxx
index b066c7d9f955..66bcde41210e 100644
--- a/vcl/unx/kde5/KDE5Data.cxx
+++ b/vcl/unx/kde5/KDE5Data.cxx
@@ -35,7 +35,10 @@ void KDE5Data::Init()
 {
     pXLib_ = new KDE5XLib();
     pXLib_->Init();
-    SetDisplay( SalKDE5Display::self() );
+    //SetDisplay( SalKDE5Display::self() );
+
+    int argc = 1;
+    qMyApp = new QApplication(argc, nullptr);
 }
 
 void KDE5Data::initNWF()
@@ -52,7 +55,8 @@ void KDE5Data::initNWF()
     pSVData->maNWFData.mbNoFocusRects = true;
 
     // Styled menus need additional space
-    QStyle *style = QApplication::style();
+    //QStyle *style = QApplication::style();
+    QStyle *style = qMyApp->style();
     pSVData->maNWFData.mnMenuFormatBorderX =
        style->pixelMetric( QStyle::PM_MenuPanelWidth ) +
        style->pixelMetric( QStyle::PM_MenuHMargin );
@@ -63,6 +67,7 @@ void KDE5Data::initNWF()
 
 void KDE5Data::deInitNWF()
 {
+    delete qMyApp;
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/kde5/KDE5Data.hxx b/vcl/unx/kde5/KDE5Data.hxx
index 9791089ce57d..1106663d3910 100644
--- a/vcl/unx/kde5/KDE5Data.hxx
+++ b/vcl/unx/kde5/KDE5Data.hxx
@@ -22,16 +22,22 @@
 #include <unx/saldisp.hxx>
 #include <unx/saldata.hxx>
 
-class KDE5Data : public X11SalData
+class KDE5SalInstance;
+class KDE5XLib;
+
+class KDE5Data //: public X11SalData
 {
     public:
-        explicit KDE5Data( SalInstance *pInstance )
-                        : X11SalData( SAL_DATA_KDE5, pInstance ) {}
-        virtual ~KDE5Data() override;
+        explicit KDE5Data( SalInstance *pInstance ) {}
+                       // : X11SalData( SAL_DATA_KDE5, pInstance ) {}
+        virtual ~KDE5Data();
 
-        virtual void Init() override;
-        virtual void initNWF() override;
-        virtual void deInitNWF() override;
+        virtual void Init() ;
+        virtual void initNWF() ;
+        virtual void deInitNWF() ;
+    private:
+        KDE5XLib *pXLib_;
+        QApplication* qMyApp;
 };
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/kde5/KDE5SalFrame.cxx b/vcl/unx/kde5/KDE5SalFrame.cxx
index 2419da16e4d4..1cdc503ff4f8 100644
--- a/vcl/unx/kde5/KDE5SalFrame.cxx
+++ b/vcl/unx/kde5/KDE5SalFrame.cxx
@@ -47,20 +47,19 @@
 #include <boost/optional.hpp>
 
 
-KDE5SalFrame::KDE5SalFrame( SalFrame* pParent, SalFrameStyleFlags nState ) :
-    X11SalFrame( pParent, nState )
+KDE5SalFrame::KDE5SalFrame( SalFrame* pParent, SalFrameStyleFlags nState )
 {
 }
 
 void KDE5SalFrame::Show( bool bVisible, bool bNoActivate )
 {
-    if ( !GetParent() && ! (GetStyle() & SalFrameStyleFlags::INTRO) )
+    if ( !GetParent() /*&& ! (GetStyle() & SalFrameStyleFlags::INTRO)*/ )
     {
-        KDE5XLib* pXLib = static_cast<KDE5XLib*>(GetDisplay()->GetXLib());
+        KDE5XLib* pXLib = new KDE5XLib();//static_cast<KDE5XLib*>(GetDisplay()->GetXLib());
         pXLib->doStartup();
     }
 
-    X11SalFrame::Show( bVisible, bNoActivate );
+    //X11SalFrame::Show( bVisible, bNoActivate );
 }
 
 /** Helper function to convert colors.
@@ -348,7 +347,7 @@ void KDE5SalFrame::ReleaseGraphics( SalGraphics *pGraphics )
 
 void KDE5SalFrame::updateGraphics( bool bClear )
 {
-    Drawable aDrawable = bClear ? None : GetWindow();
+    vcl::Window* pWindow = GetWindow();
     for( int i = 0; i < nMaxGraphics; i++ )
     {
         /*if( m_aGraphics[i].bInUse )
diff --git a/vcl/unx/kde5/KDE5SalFrame.hxx b/vcl/unx/kde5/KDE5SalFrame.hxx
index 01539a458abe..7d0fa51d2eb6 100644
--- a/vcl/unx/kde5/KDE5SalFrame.hxx
+++ b/vcl/unx/kde5/KDE5SalFrame.hxx
@@ -30,7 +30,7 @@
 class QWidget;
 class KDE5SalGraphics;
 
-class KDE5SalFrame : public X11SalFrame
+class KDE5SalFrame : public SalFrame
 {
     private:
         static const int nMaxGraphics = 2;
@@ -52,9 +52,63 @@ class KDE5SalFrame : public X11SalFrame
 
         virtual SalGraphics* AcquireGraphics() override;
         virtual void ReleaseGraphics( SalGraphics *pGraphics ) override;
-        virtual void updateGraphics( bool bClear ) override;
+        void updateGraphics( bool bClear );
         virtual void UpdateSettings( AllSettings& rSettings ) override;
         virtual void Show( bool bVisible, bool bNoActivate = false ) override;
+
+        virtual bool PostEvent(ImplSVEvent* pData) override { return false; }
+
+        virtual void SetTitle( const OUString& rTitle ) override { return; }
+        virtual void SetIcon( sal_uInt16 nIcon ) override { return; }
+
+        virtual void SetMenu( SalMenu *pSalMenu ) override { return; }
+        virtual void DrawMenuBar() override { return; }
+
+        virtual void SetExtendedFrameStyle( SalExtStyle nExtStyle ) override { return; }
+        virtual void SetMinClientSize( long nWidth, long nHeight ) override { return; }
+        virtual void SetMaxClientSize( long nWidth, long nHeight ) override { return; }
+
+        virtual void SetPosSize( long nX, long nY, long nWidth, long nHeight, sal_uInt16 nFlags ) override { return; }
+        virtual void GetClientSize( long& rWidth, long& rHeight ) override { return; }
+        virtual void GetWorkArea( tools::Rectangle& rRect ) override { return; }
+        virtual SalFrame* GetParent() const override { return nullptr; }
+        virtual void SetWindowState( const SalFrameState* pState ) override { return; }
+        virtual bool GetWindowState( SalFrameState* pState ) override { return false; }
+        virtual void ShowFullScreen( bool bFullScreen, sal_Int32 nDisplay ) override { return; }
+        virtual void StartPresentation( bool bStart ) override { return; }
+        virtual void SetAlwaysOnTop( bool bOnTop ) override { return; }
+
+        virtual void  ToTop( SalFrameToTop nFlags ) override { return; }
+        virtual void  SetPointer( PointerStyle ePointerStyle ) override { return; }
+        virtual void  CaptureMouse( bool bMouse ) override { return; }
+        virtual void  SetPointerPos( long nX, long nY ) override { return; }
+
+        virtual void SetInputContext( SalInputContext* pContext ) override { return; }
+        virtual void EndExtTextInput( EndExtTextInputFlags nFlags ) override { return; }
+        virtual OUString GetKeyName( sal_uInt16 nKeyCode ) override { return OUString(); }
+        virtual bool MapUnicodeToKeyCode( sal_Unicode aUnicode, LanguageType aLangType, vcl::KeyCode& rKeyCode ) override { return false; }
+
+        virtual LanguageType GetInputLanguage() override { return LANGUAGE_SYSTEM; }
+        virtual void Beep() override { return; }
+        virtual const SystemEnvData* GetSystemData() const override { return nullptr; }
+        virtual SalPointerState GetPointerState() override { return SalPointerState(); }
+        virtual KeyIndicatorState GetIndicatorState() override { return KeyIndicatorState(); }
+        virtual void SimulateKeyPress( sal_uInt16 nKeyCode ) override { return; }
+
+        // set new parent window
+        virtual void SetParent( SalFrame* pNewParent ) override { return; }
+        virtual bool SetPluginParent( SystemParentData* pNewParent ) override { return false; }
+
+        virtual void SetScreenNumber( unsigned int ) override { return; }
+        virtual void SetApplicationID( const OUString &rWMClass ) override { return; }
+
+        virtual void ResetClipRegion() override { return; }
+        virtual void BeginSetClipRegion( sal_uLong nRects ) override { return; }
+        virtual void UnionClipRegion( long nX, long nY, long nWidth, long nHeight ) override { return; }
+        virtual void EndSetClipRegion() override { return; }
+
+        virtual void Flush() override { return; }
+
 };
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/kde5/KDE5SalInstance.hxx b/vcl/unx/kde5/KDE5SalInstance.hxx
index 5c0247518246..e6169256020e 100644
--- a/vcl/unx/kde5/KDE5SalInstance.hxx
+++ b/vcl/unx/kde5/KDE5SalInstance.hxx
@@ -26,8 +26,9 @@ class SalFrame;
 
 class KDE5SalInstance : public SvpSalInstance
 {
+
 protected:
-//    virtual SalX11Display* CreateDisplay() const override;
+    //SalX11Display* CreateDisplay() const;
 
 public:
     explicit KDE5SalInstance(SalYieldMutex* pMutex);
diff --git a/vcl/unx/kde5/KDE5XLib.cxx b/vcl/unx/kde5/KDE5XLib.cxx
index 2c85ab7fa3f9..d9b8e747f3c8 100644
--- a/vcl/unx/kde5/KDE5XLib.cxx
+++ b/vcl/unx/kde5/KDE5XLib.cxx
@@ -235,7 +235,9 @@ bool KDE5XLib::nativeEventFilter(const QByteArray &eventType, void *message, lon
 
 void KDE5XLib::setupEventLoop()
 {
-    QAbstractEventDispatcher::instance()->installNativeEventFilter( this );
+    QAbstractEventDispatcher *qDispatcher = QAbstractEventDispatcher::instance();
+
+    //qDispatcher->installNativeEventFilter( this );
 #if KF5_HAVE_GLIB
     if( m_isGlibEventLoopType )
     {
diff --git a/vcl/unx/kde5/main.cxx b/vcl/unx/kde5/main.cxx
index 654a9d654ee8..c26d2ab25c4f 100644
--- a/vcl/unx/kde5/main.cxx
+++ b/vcl/unx/kde5/main.cxx
@@ -79,7 +79,7 @@ extern "C" {
         KDE5Data *salData = new KDE5Data( pInstance );
         salData->Init();
         salData->initNWF();
-        pInstance->SetLib(salData->GetLib());
+        //pInstance->SetLib(salData->GetLib());
 
         return pInstance;
     }
commit 74b0d908a41eddb3bc210fa0cae3f17be124a0fe
Author: Katarina Behrens <Katarina.Behrens at cib.de>
Date:   Wed Sep 27 17:00:58 2017 +0200

    kde5: convert KDE5SalInstance to SvpSalInstance
    
    Change-Id: I72da846525128a689d92598b64e6a70062ff1c69

diff --git a/vcl/unx/kde5/KDE5SalInstance.cxx b/vcl/unx/kde5/KDE5SalInstance.cxx
index b8d3471a44c6..38629113295c 100644
--- a/vcl/unx/kde5/KDE5SalInstance.cxx
+++ b/vcl/unx/kde5/KDE5SalInstance.cxx
@@ -34,7 +34,7 @@
 using namespace com::sun::star;
 
 KDE5SalInstance::KDE5SalInstance(SalYieldMutex* pMutex)
-    : X11SalInstance(pMutex)
+    :SvpSalInstance( pMutex )
 {
     ImplSVData* pSVData = ImplGetSVData();
     delete pSVData->maAppData.mpToolkitName;
@@ -54,13 +54,13 @@ uno::Reference< ui::dialogs::XFilePicker2 > KDE5SalInstance::createFilePicker(
         return uno::Reference< ui::dialogs::XFilePicker2 >(
             kdeXLib->createFilePicker(xMSF) );
     else*/
-        return X11SalInstance::createFilePicker( xMSF );
+        return SalInstance::createFilePicker( xMSF );
 }
 
-SalX11Display* KDE5SalInstance::CreateDisplay() const
+/*SalX11Display* KDE5SalInstance::CreateDisplay() const
 {
     return new SalKDE5Display( QX11Info::display() );
-}
+}*/
 
 bool KDE5SalInstance::IsMainThread() const
 {
diff --git a/vcl/unx/kde5/KDE5SalInstance.hxx b/vcl/unx/kde5/KDE5SalInstance.hxx
index 233d6fd7430b..5c0247518246 100644
--- a/vcl/unx/kde5/KDE5SalInstance.hxx
+++ b/vcl/unx/kde5/KDE5SalInstance.hxx
@@ -19,15 +19,15 @@
 
 #pragma once
 
-#include <unx/salinst.h>
+#include <headless/svpinst.hxx>
 
 class SalYieldMutex;
 class SalFrame;
 
-class KDE5SalInstance : public X11SalInstance
+class KDE5SalInstance : public SvpSalInstance
 {
 protected:
-    virtual SalX11Display* CreateDisplay() const override;
+//    virtual SalX11Display* CreateDisplay() const override;
 
 public:
     explicit KDE5SalInstance(SalYieldMutex* pMutex);
commit b899ba17b83ca46ce198bb6c0d98cb735e6cefd1
Author: Katarina Behrens <Katarina.Behrens at cib.de>
Date:   Mon Sep 25 14:00:31 2017 +0200

    kde5: convert KDE5SalGraphics to SvpSalGraphics
    
    Change-Id: Id30494fa1b01510e300f39b985b3a49ea58d81bc

diff --git a/vcl/unx/kde5/KDE5SalFrame.cxx b/vcl/unx/kde5/KDE5SalFrame.cxx
index 73eb097bacc9..2419da16e4d4 100644
--- a/vcl/unx/kde5/KDE5SalFrame.cxx
+++ b/vcl/unx/kde5/KDE5SalFrame.cxx
@@ -351,8 +351,8 @@ void KDE5SalFrame::updateGraphics( bool bClear )
     Drawable aDrawable = bClear ? None : GetWindow();
     for( int i = 0; i < nMaxGraphics; i++ )
     {
-        if( m_aGraphics[i].bInUse )
-            m_aGraphics[i].pGraphics->SetDrawable( aDrawable, GetScreenNumber() );
+        /*if( m_aGraphics[i].bInUse )
+            m_aGraphics[i].pGraphics->SetDrawable( aDrawable, GetScreenNumber() );*/
     }
 }
 
@@ -367,8 +367,8 @@ SalGraphics* KDE5SalFrame::AcquireGraphics()
                 m_aGraphics[i].bInUse = true;
                 if( ! m_aGraphics[i].pGraphics )
                 {
-                    m_aGraphics[i].pGraphics.reset( new KDE5SalGraphics );
-                    m_aGraphics[i].pGraphics->Init( this, GetWindow(), GetScreenNumber() );
+                    m_aGraphics[i].pGraphics.reset( new KDE5SalGraphics( this, m_pWindow ) );
+                    //m_aGraphics[i].pGraphics->Init( this, GetWindow(), GetScreenNumber() );
                 }
                 return m_aGraphics[i].pGraphics.get();
             }
diff --git a/vcl/unx/kde5/KDE5SalFrame.hxx b/vcl/unx/kde5/KDE5SalFrame.hxx
index dc77ec6daae5..01539a458abe 100644
--- a/vcl/unx/kde5/KDE5SalFrame.hxx
+++ b/vcl/unx/kde5/KDE5SalFrame.hxx
@@ -25,6 +25,11 @@
 #include <unx/salframe.h>
 #include <unx/salgdi.h>
 
+#include "KDE5SalGraphics.hxx"
+
+class QWidget;
+class KDE5SalGraphics;
+
 class KDE5SalFrame : public X11SalFrame
 {
     private:
@@ -32,7 +37,7 @@ class KDE5SalFrame : public X11SalFrame
 
         struct GraphicsHolder
         {
-            std::unique_ptr<X11SalGraphics> pGraphics;
+            std::unique_ptr<KDE5SalGraphics> pGraphics;
             bool bInUse;
 
             GraphicsHolder() : bInUse( false ) {}
@@ -40,6 +45,8 @@ class KDE5SalFrame : public X11SalFrame
 
         GraphicsHolder m_aGraphics[ nMaxGraphics ];
 
+        QWidget* m_pWindow;
+
     public:
         KDE5SalFrame( SalFrame* pParent, SalFrameStyleFlags nStyle );
 
diff --git a/vcl/unx/kde5/KDE5SalGraphics.cxx b/vcl/unx/kde5/KDE5SalGraphics.cxx
index 9419dff1e018..a22a695955e2 100644
--- a/vcl/unx/kde5/KDE5SalGraphics.cxx
+++ b/vcl/unx/kde5/KDE5SalGraphics.cxx
@@ -26,7 +26,7 @@
 
 #undef Region
 
-#include "KDE5SalGraphics.hxx"
+#include "KDE5SalFrame.hxx"
 #include "KDE5SalInstance.hxx"
 
 #include <vcl/settings.hxx>
@@ -70,6 +70,13 @@ QRect region2QRect( const tools::Rectangle& rControlRegion )
     return QRect(rControlRegion.Left(), rControlRegion.Top(), rControlRegion.GetWidth(), rControlRegion.GetHeight());
 }
 
+KDE5SalGraphics::KDE5SalGraphics( KDE5SalFrame *pFrame, QWidget *pWindow )
+   : SvpSalGraphics(),
+   m_pWindow( pWindow ),
+   m_pFrame( pFrame )
+{
+}
+
 bool KDE5SalGraphics::IsNativeControlSupported( ControlType type, ControlPart part )
 {
     switch (type)
diff --git a/vcl/unx/kde5/KDE5SalGraphics.hxx b/vcl/unx/kde5/KDE5SalGraphics.hxx
index 811e4953c323..298d2100fe0f 100644
--- a/vcl/unx/kde5/KDE5SalGraphics.hxx
+++ b/vcl/unx/kde5/KDE5SalGraphics.hxx
@@ -24,15 +24,19 @@
 #include <rtl/string.hxx>
 #include <unx/saldisp.hxx>
 #include <unx/salgdi.h>
+#include <headless/svpgdi.hxx>
 
 #include <QtGui/QImage>
 
+class KDE5SalFrame;
+
 /**
  * Handles native graphics requests and performs the needed drawing operations.
  */
-class KDE5SalGraphics : public X11SalGraphics
+class KDE5SalGraphics : public SvpSalGraphics
 {
 public:
+    KDE5SalGraphics( KDE5SalFrame *pFrame, QWidget *pWindow);
     virtual bool IsNativeControlSupported( ControlType, ControlPart ) override;
 
     virtual bool hitTestNativeControl( ControlType, ControlPart,
@@ -46,6 +50,9 @@ public:
                                          const OUString&, tools::Rectangle&, tools::Rectangle& ) override;
 
 private:
+    QWidget *m_pWindow;
+    KDE5SalFrame *m_pFrame;
+
     std::unique_ptr<QImage> m_image;
     QRect lastPopupRect;
 };
commit 941373f56aabd5ee42615e7334a2c8ecb333fc92
Author: Katarina Behrens <Katarina.Behrens at cib.de>
Date:   Fri Sep 22 15:24:30 2017 +0200

    kde5: rename KDESalGraphics too
    
    Change-Id: I1a1625428cca0be7ece5fb4604aaacef4967a405

diff --git a/vcl/unx/kde5/KDE5SalFrame.cxx b/vcl/unx/kde5/KDE5SalFrame.cxx
index 28f47f860015..73eb097bacc9 100644
--- a/vcl/unx/kde5/KDE5SalFrame.cxx
+++ b/vcl/unx/kde5/KDE5SalFrame.cxx
@@ -367,7 +367,7 @@ SalGraphics* KDE5SalFrame::AcquireGraphics()
                 m_aGraphics[i].bInUse = true;
                 if( ! m_aGraphics[i].pGraphics )
                 {
-                    m_aGraphics[i].pGraphics.reset( new KDESalGraphics );
+                    m_aGraphics[i].pGraphics.reset( new KDE5SalGraphics );
                     m_aGraphics[i].pGraphics->Init( this, GetWindow(), GetScreenNumber() );
                 }
                 return m_aGraphics[i].pGraphics.get();
diff --git a/vcl/unx/kde5/KDE5SalGraphics.cxx b/vcl/unx/kde5/KDE5SalGraphics.cxx
index 85642f6f91df..9419dff1e018 100644
--- a/vcl/unx/kde5/KDE5SalGraphics.cxx
+++ b/vcl/unx/kde5/KDE5SalGraphics.cxx
@@ -70,7 +70,7 @@ QRect region2QRect( const tools::Rectangle& rControlRegion )
     return QRect(rControlRegion.Left(), rControlRegion.Top(), rControlRegion.GetWidth(), rControlRegion.GetHeight());
 }
 
-bool KDESalGraphics::IsNativeControlSupported( ControlType type, ControlPart part )
+bool KDE5SalGraphics::IsNativeControlSupported( ControlType type, ControlPart part )
 {
     switch (type)
     {
@@ -197,7 +197,7 @@ static QRegion XRegionToQRegion( Region xr )
 }
 #endif
 
-bool KDESalGraphics::drawNativeControl( ControlType type, ControlPart part,
+bool KDE5SalGraphics::drawNativeControl( ControlType type, ControlPart part,
                                         const tools::Rectangle& rControlRegion, ControlState nControlState,
                                         const ImplControlValue& value,
                                         const OUString& )
@@ -661,7 +661,7 @@ bool KDESalGraphics::drawNativeControl( ControlType type, ControlPart part,
     return returnVal;
 }
 
-bool KDESalGraphics::getNativeControlRegion( ControlType type, ControlPart part,
+bool KDE5SalGraphics::getNativeControlRegion( ControlType type, ControlPart part,
                                              const tools::Rectangle& controlRegion, ControlState controlState,
                                              const ImplControlValue& val,
                                              const OUString&,
@@ -974,7 +974,7 @@ bool KDESalGraphics::getNativeControlRegion( ControlType type, ControlPart part,
     aPos was or was not inside the native widget specified by the
     nType/nPart combination.
 */
-bool KDESalGraphics::hitTestNativeControl( ControlType nType, ControlPart nPart,
+bool KDE5SalGraphics::hitTestNativeControl( ControlType nType, ControlPart nPart,
                                            const tools::Rectangle& rControlRegion, const Point& rPos,
                                            bool& rIsInside )
 {
diff --git a/vcl/unx/kde5/KDE5SalGraphics.hxx b/vcl/unx/kde5/KDE5SalGraphics.hxx
index eb513388f369..811e4953c323 100644
--- a/vcl/unx/kde5/KDE5SalGraphics.hxx
+++ b/vcl/unx/kde5/KDE5SalGraphics.hxx
@@ -30,7 +30,7 @@
 /**
  * Handles native graphics requests and performs the needed drawing operations.
  */
-class KDESalGraphics : public X11SalGraphics
+class KDE5SalGraphics : public X11SalGraphics
 {
 public:
     virtual bool IsNativeControlSupported( ControlType, ControlPart ) override;
commit 8b52adcad3f129606dc48025afafe2cbf80cdd7e
Author: Katarina Behrens <Katarina.Behrens at cib.de>
Date:   Thu Sep 7 16:18:31 2017 +0200

    kde5: rename classes and other relevant data: KDE[4]->KDE5
    
    add log area too
    
    Change-Id: I187c04c8646ec9c9264d84938e1ccf3a1cbd62f1

diff --git a/include/sal/log-areas.dox b/include/sal/log-areas.dox
index 8c0db9de0809..4bc8e66d7995 100644
--- a/include/sal/log-areas.dox
+++ b/include/sal/log-areas.dox
@@ -454,6 +454,7 @@ certain functionality.
 @li @c vcl.icontest
 @li @c vcl.kde - KDE
 @li @c vcl.kde4 - KDE4
+ at li @c vcl.kde5 - KDE5
 @li @c vcl.layout - Widget layout
 @li @c vcl.lazydelete
 @li @c vcl.opengl
diff --git a/vcl/inc/unx/gendata.hxx b/vcl/inc/unx/gendata.hxx
index 55a9aaf4ba8c..4088985678a6 100644
--- a/vcl/inc/unx/gendata.hxx
+++ b/vcl/inc/unx/gendata.hxx
@@ -20,7 +20,8 @@ class SalGenericDisplay;
 namespace psp { class PrintFontManager; }
 
 enum GenericUnixSalDataType { SAL_DATA_GTK, SAL_DATA_GTK3,
-                              SAL_DATA_TDE3, SAL_DATA_KDE3, SAL_DATA_KDE4,
+                              SAL_DATA_TDE3,
+                              SAL_DATA_KDE3,SAL_DATA_KDE4, SAL_DATA_KDE5,
                               SAL_DATA_UNX, SAL_DATA_SVP,
                               SAL_DATA_ANDROID, SAL_DATA_IOS,
                               SAL_DATA_HEADLESS };
diff --git a/vcl/unx/kde5/KDE5Data.cxx b/vcl/unx/kde5/KDE5Data.cxx
index 487a0b254af3..b066c7d9f955 100644
--- a/vcl/unx/kde5/KDE5Data.cxx
+++ b/vcl/unx/kde5/KDE5Data.cxx
@@ -27,18 +27,18 @@
 #include "KDE5XLib.hxx"
 #include "KDE5SalDisplay.hxx"
 
-KDEData::~KDEData()
+KDE5Data::~KDE5Data()
 {
 }
 
-void KDEData::Init()
+void KDE5Data::Init()
 {
-    pXLib_ = new KDEXLib();
+    pXLib_ = new KDE5XLib();
     pXLib_->Init();
-    SetDisplay( SalKDEDisplay::self() );
+    SetDisplay( SalKDE5Display::self() );
 }
 
-void KDEData::initNWF()
+void KDE5Data::initNWF()
 {
     ImplSVData *pSVData = ImplGetSVData();
 
@@ -61,7 +61,7 @@ void KDEData::initNWF()
        style->pixelMetric( QStyle::PM_MenuVMargin );
 }
 
-void KDEData::deInitNWF()
+void KDE5Data::deInitNWF()
 {
 }
 
diff --git a/vcl/unx/kde5/KDE5Data.hxx b/vcl/unx/kde5/KDE5Data.hxx
index 4efd23a7df34..9791089ce57d 100644
--- a/vcl/unx/kde5/KDE5Data.hxx
+++ b/vcl/unx/kde5/KDE5Data.hxx
@@ -22,12 +22,12 @@
 #include <unx/saldisp.hxx>
 #include <unx/saldata.hxx>
 
-class KDEData : public X11SalData
+class KDE5Data : public X11SalData
 {
     public:
-        explicit KDEData( SalInstance *pInstance )
-                        : X11SalData( SAL_DATA_KDE4, pInstance ) {}
-        virtual ~KDEData() override;
+        explicit KDE5Data( SalInstance *pInstance )
+                        : X11SalData( SAL_DATA_KDE5, pInstance ) {}
+        virtual ~KDE5Data() override;
 
         virtual void Init() override;
         virtual void initNWF() override;
diff --git a/vcl/unx/kde5/KDE5SalDisplay.cxx b/vcl/unx/kde5/KDE5SalDisplay.cxx
index eddac063048f..319f475317eb 100644
--- a/vcl/unx/kde5/KDE5SalDisplay.cxx
+++ b/vcl/unx/kde5/KDE5SalDisplay.cxx
@@ -28,9 +28,9 @@
 
 #include <assert.h>
 
-SalKDEDisplay* SalKDEDisplay::selfptr = nullptr;
+SalKDE5Display* SalKDE5Display::selfptr = nullptr;
 
-SalKDEDisplay::SalKDEDisplay( Display* pDisp )
+SalKDE5Display::SalKDE5Display( Display* pDisp )
     : SalX11Display( pDisp )
 {
     assert( selfptr == nullptr );
@@ -38,10 +38,10 @@ SalKDEDisplay::SalKDEDisplay( Display* pDisp )
     xim_protocol = XInternAtom( pDisp_, "_XIM_PROTOCOL", False );
 }
 
-SalKDEDisplay::~SalKDEDisplay()
+SalKDE5Display::~SalKDE5Display()
 {
     // in case never a frame opened
-    static_cast<KDEXLib*>(GetXLib())->doStartup();
+    static_cast<KDE5XLib*>(GetXLib())->doStartup();
     // clean up own members
     doDestruct();
     selfptr = nullptr;
@@ -49,7 +49,7 @@ SalKDEDisplay::~SalKDEDisplay()
     pDisp_ = nullptr;
 }
 
-void SalKDEDisplay::Yield()
+void SalKDE5Display::Yield()
 {
     if( DispatchInternalEvent() )
         return;
@@ -60,7 +60,7 @@ void SalKDEDisplay::Yield()
 
     DBG_ASSERT( static_cast<SalYieldMutex*>(GetSalData()->m_pInstance->GetYieldMutex())->GetThreadId() ==
                 osl::Thread::getCurrentIdentifier(),
-                "will crash soon since solar mutex not locked in SalKDEDisplay::Yield" );
+                "will crash soon since solar mutex not locked in SalKDE5Display::Yield" );
 
     /*XEvent event;
     XNextEvent( pDisp_, &event );
@@ -77,7 +77,7 @@ void SalKDEDisplay::Yield()
 // completely. Skipped events are KeyPress, KeyRelease and also _XIM_PROTOCOL client message
 // (seems to be necessary too, hopefully there are not other internal XIM messages that
 // would need this handling).
-bool SalKDEDisplay::checkDirectInputEvent( xcb_generic_event_t* ev )
+bool SalKDE5Display::checkDirectInputEvent( xcb_generic_event_t* ev )
 {
     switch (ev->response_type & ~0x80)
     {
diff --git a/vcl/unx/kde5/KDE5SalDisplay.hxx b/vcl/unx/kde5/KDE5SalDisplay.hxx
index 0a31dcedc10d..8cd18d4ed813 100644
--- a/vcl/unx/kde5/KDE5SalDisplay.hxx
+++ b/vcl/unx/kde5/KDE5SalDisplay.hxx
@@ -26,20 +26,20 @@
 #undef CursorShape
 #endif
 
-class SalKDEDisplay : public SalX11Display
+class SalKDE5Display : public SalX11Display
 {
     public:
-        explicit SalKDEDisplay( Display* pDisp );
-        virtual ~SalKDEDisplay() override;
-        static SalKDEDisplay* self();
+        explicit SalKDE5Display( Display* pDisp );
+        virtual ~SalKDE5Display() override;
+        static SalKDE5Display* self();
         virtual void Yield() override;
         bool checkDirectInputEvent( xcb_generic_event_t* ev );
     private:
         Atom xim_protocol;
-        static SalKDEDisplay* selfptr;
+        static SalKDE5Display* selfptr;
 };
 
-inline SalKDEDisplay* SalKDEDisplay::self()
+inline SalKDE5Display* SalKDE5Display::self()
 {
     return selfptr;
 }
diff --git a/vcl/unx/kde5/KDE5SalFrame.cxx b/vcl/unx/kde5/KDE5SalFrame.cxx
index 090abbc240d1..28f47f860015 100644
--- a/vcl/unx/kde5/KDE5SalFrame.cxx
+++ b/vcl/unx/kde5/KDE5SalFrame.cxx
@@ -47,16 +47,16 @@
 #include <boost/optional.hpp>
 
 
-KDESalFrame::KDESalFrame( SalFrame* pParent, SalFrameStyleFlags nState ) :
+KDE5SalFrame::KDE5SalFrame( SalFrame* pParent, SalFrameStyleFlags nState ) :
     X11SalFrame( pParent, nState )
 {
 }
 
-void KDESalFrame::Show( bool bVisible, bool bNoActivate )
+void KDE5SalFrame::Show( bool bVisible, bool bNoActivate )
 {
     if ( !GetParent() && ! (GetStyle() & SalFrameStyleFlags::INTRO) )
     {
-        KDEXLib* pXLib = static_cast<KDEXLib*>(GetDisplay()->GetXLib());
+        KDE5XLib* pXLib = static_cast<KDE5XLib*>(GetDisplay()->GetXLib());
         pXLib->doStartup();
     }
 
@@ -120,12 +120,12 @@ static vcl::Font toFont( const QFont &rQFont, const css::lang::Locale& rLocale )
     else
         aInfo.m_eWidth = WIDTH_ULTRA_EXPANDED;
 
-    SAL_INFO( "vcl.kde4", "font name BEFORE system match: \"" << aInfo.m_aFamilyName << "\"" );
+    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.kde4", "font match " <<
+    SAL_INFO( "vcl.kde5", "font match " <<
               (aInfo.m_nID != 0 ? "succeeded" : "failed") <<
               ", name AFTER: \"" << aInfo.m_aFamilyName << "\"" );
 
@@ -150,7 +150,7 @@ static vcl::Font toFont( const QFont &rQFont, const css::lang::Locale& rLocale )
 
 /** Implementation of KDE integration's main method.
 */
-void KDESalFrame::UpdateSettings( AllSettings& rSettings )
+void KDE5SalFrame::UpdateSettings( AllSettings& rSettings )
 {
     StyleSettings style( rSettings.GetStyleSettings() );
     bool bSetTitleFont = false;
@@ -334,7 +334,7 @@ void KDESalFrame::UpdateSettings( AllSettings& rSettings )
     rSettings.SetStyleSettings( style );
 }
 
-void KDESalFrame::ReleaseGraphics( SalGraphics *pGraphics )
+void KDE5SalFrame::ReleaseGraphics( SalGraphics *pGraphics )
 {
     for( int i = 0; i < nMaxGraphics; i++ )
     {
@@ -346,7 +346,7 @@ void KDESalFrame::ReleaseGraphics( SalGraphics *pGraphics )
     }
 }
 
-void KDESalFrame::updateGraphics( bool bClear )
+void KDE5SalFrame::updateGraphics( bool bClear )
 {
     Drawable aDrawable = bClear ? None : GetWindow();
     for( int i = 0; i < nMaxGraphics; i++ )
@@ -356,7 +356,7 @@ void KDESalFrame::updateGraphics( bool bClear )
     }
 }
 
-SalGraphics* KDESalFrame::AcquireGraphics()
+SalGraphics* KDE5SalFrame::AcquireGraphics()
 {
     if( GetWindow() )
     {
diff --git a/vcl/unx/kde5/KDE5SalFrame.hxx b/vcl/unx/kde5/KDE5SalFrame.hxx
index 114cd49bd8d2..dc77ec6daae5 100644
--- a/vcl/unx/kde5/KDE5SalFrame.hxx
+++ b/vcl/unx/kde5/KDE5SalFrame.hxx
@@ -25,7 +25,7 @@
 #include <unx/salframe.h>
 #include <unx/salgdi.h>
 
-class KDESalFrame : public X11SalFrame
+class KDE5SalFrame : public X11SalFrame
 {
     private:
         static const int nMaxGraphics = 2;
@@ -41,7 +41,7 @@ class KDESalFrame : public X11SalFrame
         GraphicsHolder m_aGraphics[ nMaxGraphics ];
 
     public:
-        KDESalFrame( SalFrame* pParent, SalFrameStyleFlags nStyle );
+        KDE5SalFrame( SalFrame* pParent, SalFrameStyleFlags nStyle );
 
         virtual SalGraphics* AcquireGraphics() override;
         virtual void ReleaseGraphics( SalGraphics *pGraphics ) override;
diff --git a/vcl/unx/kde5/KDE5SalInstance.cxx b/vcl/unx/kde5/KDE5SalInstance.cxx
index 5d4bc5eec5dd..b8d3471a44c6 100644
--- a/vcl/unx/kde5/KDE5SalInstance.cxx
+++ b/vcl/unx/kde5/KDE5SalInstance.cxx
@@ -33,20 +33,20 @@
 
 using namespace com::sun::star;
 
-KDESalInstance::KDESalInstance(SalYieldMutex* pMutex)
+KDE5SalInstance::KDE5SalInstance(SalYieldMutex* pMutex)
     : X11SalInstance(pMutex)
 {
     ImplSVData* pSVData = ImplGetSVData();
     delete pSVData->maAppData.mpToolkitName;
-    pSVData->maAppData.mpToolkitName = new OUString("kde4");
+    pSVData->maAppData.mpToolkitName = new OUString("kde5");
 }
 
-SalFrame* KDESalInstance::CreateFrame( SalFrame *pParent, SalFrameStyleFlags nState )
+SalFrame* KDE5SalInstance::CreateFrame( SalFrame *pParent, SalFrameStyleFlags nState )
 {
-    return new KDESalFrame( pParent, nState );
+    return new KDE5SalFrame( pParent, nState );
 }
 
-uno::Reference< ui::dialogs::XFilePicker2 > KDESalInstance::createFilePicker(
+uno::Reference< ui::dialogs::XFilePicker2 > KDE5SalInstance::createFilePicker(
     const uno::Reference< uno::XComponentContext >& xMSF )
 {
     /*KDEXLib* kdeXLib = static_cast<KDEXLib*>( mpXLib );
@@ -57,12 +57,12 @@ uno::Reference< ui::dialogs::XFilePicker2 > KDESalInstance::createFilePicker(
         return X11SalInstance::createFilePicker( xMSF );
 }
 
-SalX11Display* KDESalInstance::CreateDisplay() const
+SalX11Display* KDE5SalInstance::CreateDisplay() const
 {
-    return new SalKDEDisplay( QX11Info::display() );
+    return new SalKDE5Display( QX11Info::display() );
 }
 
-bool KDESalInstance::IsMainThread() const
+bool KDE5SalInstance::IsMainThread() const
 {
     return qApp->thread() == QThread::currentThread();
 }
diff --git a/vcl/unx/kde5/KDE5SalInstance.hxx b/vcl/unx/kde5/KDE5SalInstance.hxx
index 7b7417caaaf1..233d6fd7430b 100644
--- a/vcl/unx/kde5/KDE5SalInstance.hxx
+++ b/vcl/unx/kde5/KDE5SalInstance.hxx
@@ -24,13 +24,13 @@
 class SalYieldMutex;
 class SalFrame;
 
-class KDESalInstance : public X11SalInstance
+class KDE5SalInstance : public X11SalInstance
 {
 protected:
     virtual SalX11Display* CreateDisplay() const override;
 
 public:
-    explicit KDESalInstance(SalYieldMutex* pMutex);
+    explicit KDE5SalInstance(SalYieldMutex* pMutex);
     virtual SalFrame* CreateFrame( SalFrame* pParent, SalFrameStyleFlags nStyle ) override;
 
     virtual bool hasNativeFileSelection() const override { return true; }
diff --git a/vcl/unx/kde5/KDE5XLib.cxx b/vcl/unx/kde5/KDE5XLib.cxx
index b05e8e6ed047..2c85ab7fa3f9 100644
--- a/vcl/unx/kde5/KDE5XLib.cxx
+++ b/vcl/unx/kde5/KDE5XLib.cxx
@@ -51,7 +51,7 @@
 #include "tst_exclude_posted_events.moc"
 #endif
 
-KDEXLib::KDEXLib() :
+KDE5XLib::KDE5XLib() :
     SalXLib(),  m_bStartupDone(false),
     m_nFakeCmdLineArgs( 0 ),
     m_isGlibEventLoopType(false), m_allowKdeDialogs(false),
@@ -84,7 +84,7 @@ KDEXLib::KDEXLib() :
              Qt::BlockingQueuedConnection );
 }
 
-KDEXLib::~KDEXLib()
+KDE5XLib::~KDE5XLib()
 {
 
     // free the faked cmdline arguments no longer needed by KApplication
@@ -94,7 +94,7 @@ KDEXLib::~KDEXLib()
     }
 }
 
-void KDEXLib::Init()
+void KDE5XLib::Init()
 {
     m_pInputMethod = new SalI18N_InputMethod;
     m_pInputMethod->SetLocale();
@@ -218,22 +218,22 @@ static bool qt_event_filter( void* m )
 {
     if( old_qt_event_filter != nullptr && old_qt_event_filter( m ))
         return true;
-    if( SalKDEDisplay::self() && SalKDEDisplay::self()->checkDirectInputEvent( static_cast< XEvent* >( m )))
+    if( SalKDE5Display::self() && SalKDE5Display::self()->checkDirectInputEvent( static_cast< XEvent* >( m )))
         return true;
     return false;
 }*/
 
-bool KDEXLib::nativeEventFilter(const QByteArray &eventType, void *message, long *)
+bool KDE5XLib::nativeEventFilter(const QByteArray &eventType, void *message, long *)
 {
     if (eventType == "xcb_generic_event_t") {
         xcb_generic_event_t* ev = static_cast<xcb_generic_event_t *>(message);
-        if( SalKDEDisplay::self() && SalKDEDisplay::self()->checkDirectInputEvent( ev ))
+        if( SalKDE5Display::self() && SalKDE5Display::self()->checkDirectInputEvent( ev ))
             return true;
     }
     return false;
 }
 
-void KDEXLib::setupEventLoop()
+void KDE5XLib::setupEventLoop()
 {
     QAbstractEventDispatcher::instance()->installNativeEventFilter( this );
 #if KF5_HAVE_GLIB
@@ -248,7 +248,7 @@ void KDEXLib::setupEventLoop()
 #endif
 }
 
-void KDEXLib::Insert( int fd, void* data, YieldFunc pending, YieldFunc queued, YieldFunc handle )
+void KDE5XLib::Insert( int fd, void* data, YieldFunc pending, YieldFunc queued, YieldFunc handle )
 {
     if( !m_isGlibEventLoopType )
         return SalXLib::Insert( fd, data, pending, queued, handle );
@@ -263,7 +263,7 @@ void KDEXLib::Insert( int fd, void* data, YieldFunc pending, YieldFunc queued, Y
     socketData[ fd ] = sdata;
 }
 
-void KDEXLib::Remove( int fd )
+void KDE5XLib::Remove( int fd )
 {
     if( !m_isGlibEventLoopType )
         return SalXLib::Remove( fd );
@@ -271,13 +271,13 @@ void KDEXLib::Remove( int fd )
     delete sdata.notifier;
 }
 
-void KDEXLib::socketNotifierActivated( int fd )
+void KDE5XLib::socketNotifierActivated( int fd )
 {
     const SocketData& sdata = socketData[ fd ];
     sdata.handle( fd, sdata.data );
 }
 
-bool KDEXLib::Yield( bool bWait, bool bHandleAllCurrentEvents )
+bool KDE5XLib::Yield( bool bWait, bool bHandleAllCurrentEvents )
 {
     if( !m_isGlibEventLoopType )
     {
@@ -312,7 +312,7 @@ bool KDEXLib::Yield( bool bWait, bool bHandleAllCurrentEvents )
  * Quoting the Qt docs: [QAbstractEventDispatcher::processEvents] processes
  * pending events that match flags until there are no more events to process.
  */
-bool KDEXLib::processYield( bool bWait, bool )
+bool KDE5XLib::processYield( bool bWait, bool )
 {
     QAbstractEventDispatcher* dispatcher = QAbstractEventDispatcher::instance( qApp->thread());
     bool wasEvent = false;
@@ -323,7 +323,7 @@ bool KDEXLib::processYield( bool bWait, bool )
     return wasEvent;
 }
 
-void KDEXLib::StartTimer( sal_uLong nMS )
+void KDE5XLib::StartTimer( sal_uLong nMS )
 {
     if( !m_isGlibEventLoopType )
         return SalXLib::StartTimer( nMS );
@@ -335,47 +335,47 @@ void KDEXLib::StartTimer( sal_uLong nMS )
         Q_EMIT startTimeoutTimerSignal();
 }
 
-void KDEXLib::startTimeoutTimer()
+void KDE5XLib::startTimeoutTimer()
 {
     timeoutTimer.start();
 }
 
-void KDEXLib::StopTimer()
+void KDE5XLib::StopTimer()
 {
     if( !m_isGlibEventLoopType )
         return SalXLib::StopTimer();
     timeoutTimer.stop();
 }
 
-void KDEXLib::timeoutActivated()
+void KDE5XLib::timeoutActivated()
 {
     // don't potentially wait in timeout, as QTimer is non-recursive
     QApplication::postEvent(this, new QEvent(QEvent::Type( m_timerEventId )));
 }
 
-void KDEXLib::customEvent(QEvent* e)
+void KDE5XLib::customEvent(QEvent* e)
 {
     if( e->type() == m_timerEventId )
         X11SalData::Timeout();
     else if( e->type() == m_postUserEventId )
-        SalKDEDisplay::self()->DispatchInternalEvent();
+        SalKDE5Display::self()->DispatchInternalEvent();
 }
 
-void KDEXLib::Wakeup()
+void KDE5XLib::Wakeup()
 {
     if( !m_isGlibEventLoopType )
         return SalXLib::Wakeup();
     QAbstractEventDispatcher::instance( qApp->thread())->wakeUp(); // main thread event loop
 }
 
-void KDEXLib::PostUserEvent()
+void KDE5XLib::PostUserEvent()
 {
     if( !m_isGlibEventLoopType )
         return SalXLib::PostUserEvent();
     QApplication::postEvent(this, new QEvent(QEvent::Type( m_postUserEventId )));
 }
 
-void KDEXLib::doStartup()
+void KDE5XLib::doStartup()
 {
     if( ! m_bStartupDone )
     {
@@ -387,7 +387,7 @@ void KDEXLib::doStartup()
 
 using namespace com::sun::star;
 
-uno::Reference< ui::dialogs::XFilePicker2 > KDEXLib::createFilePicker(
+uno::Reference< ui::dialogs::XFilePicker2 > KDE5XLib::createFilePicker(
         const uno::Reference< uno::XComponentContext >& xMSF )
 {
 #if KF5_HAVE_GLIB
diff --git a/vcl/unx/kde5/KDE5XLib.hxx b/vcl/unx/kde5/KDE5XLib.hxx
index cb506edea1c6..152bba357f3b 100644
--- a/vcl/unx/kde5/KDE5XLib.hxx
+++ b/vcl/unx/kde5/KDE5XLib.hxx
@@ -35,7 +35,7 @@
 
 class VCLKDEApplication;
 
-class KDEXLib : public QObject, public QAbstractNativeEventFilter, public SalXLib
+class KDE5XLib : public QObject, public QAbstractNativeEventFilter, public SalXLib
 {
     Q_OBJECT
     private:
@@ -75,8 +75,8 @@ class KDEXLib : public QObject, public QAbstractNativeEventFilter, public SalXLi
             createFilePickerSignal( const css::uno::Reference< css::uno::XComponentContext >& );
 
     public:
-        KDEXLib();
-        virtual ~KDEXLib() override;
+        KDE5XLib();
+        virtual ~KDE5XLib() override;
 
         virtual void Init() override;
         virtual bool Yield( bool bWait, bool bHandleAllCurrentEvents ) override;
diff --git a/vcl/unx/kde5/VCLKDE5Application.cxx b/vcl/unx/kde5/VCLKDE5Application.cxx
index cea68a3321f8..15ff9a2dfdac 100644
--- a/vcl/unx/kde5/VCLKDE5Application.cxx
+++ b/vcl/unx/kde5/VCLKDE5Application.cxx
@@ -24,14 +24,14 @@
 
 #include "KDE5SalDisplay.hxx"
 
-VCLKDEApplication::VCLKDEApplication() :
-    KApplication()
+VCLKDE5Application::VCLKDE5Application() :
+    QApplication()
 {
 }
 
 // various hacks to be performed before re-entering Qt's event loop
 // because of showing a Qt dialog
-void VCLKDEApplication::preDialogSetup()
+void VCLKDE5Application::preDialogSetup()
 {
     // KFileDialog integration requires using event loop with QClipboard.
     // Opening the KDE file dialog here can lead to QClipboard
@@ -47,7 +47,7 @@ void VCLKDEApplication::preDialogSetup()
 }
 
 // various hacks to be performed after a Qt dialog has been closed
-void VCLKDEApplication::postDialogCleanup()
+void VCLKDE5Application::postDialogCleanup()
 {
     // HACK: KFileDialog uses KConfig("kdeglobals") for saving some settings
     // (such as the auto-extension flag), but that doesn't update KGlobal::config()
diff --git a/vcl/unx/kde5/main.cxx b/vcl/unx/kde5/main.cxx
index 96af86e54607..654a9d654ee8 100644
--- a/vcl/unx/kde5/main.cxx
+++ b/vcl/unx/kde5/main.cxx
@@ -54,7 +54,7 @@ extern "C" {
 #if QT_VERSION < 0x050000
         // Qt 4.x support needs >= 4.1.0
         OString aVersion( qVersion() );
-        SAL_INFO( "vcl.kde4", "qt version string is " << aVersion );
+        SAL_INFO( "vcl.kde5", "qt version string is " << aVersion );
 
         sal_Int32 nIndex = 0, nMajor = 0, nMinor = 0;
         nMajor = aVersion.getToken( 0, '.', nIndex ).toInt32();
@@ -66,17 +66,17 @@ extern "C" {
             sal_Int32 nMicro = 0;
             if( nIndex > 0 )
                 nMicro = aVersion.getToken( 0, '.', nIndex ).toInt32();
-            SAL_INFO( "vcl.kde4", "unsuitable qt version " << nMajor << "." << nMinor << "." << nMicro );
+            SAL_INFO( "vcl.kde5", "unsuitable qt version " << nMajor << "." << nMinor << "." << nMicro );
 #endif
             return nullptr;
         }
 #endif
 
-        KDESalInstance* pInstance = new KDESalInstance( new SalYieldMutex() );
-        SAL_INFO( "vcl.kde4", "created KDESalInstance " << &pInstance );
+        KDE5SalInstance* pInstance = new KDE5SalInstance( new SalYieldMutex() );
+        SAL_INFO( "vcl.kde5", "created KDE5SalInstance " << &pInstance );
 
         // initialize SalData
-        KDEData *salData = new KDEData( pInstance );
+        KDE5Data *salData = new KDE5Data( pInstance );
         salData->Init();
         salData->initNWF();
         pInstance->SetLib(salData->GetLib());
commit dd7a3147f160813022d1c2724bbdf7fc46ffcc59
Author: Katarina Behrens <Katarina.Behrens at cib.de>
Date:   Mon Aug 28 18:29:20 2017 +0200

    kde5: copy basic kde4 blocks -> kde5 and build againt qt5/kf5 libs
    
    Change-Id: I70f0c4147721a20459e1183ff40cf0ac8adf49e6

diff --git a/vcl/CustomTarget_kde5_moc.mk b/vcl/CustomTarget_kde5_moc.mk
new file mode 100644
index 000000000000..2c8540cb065a
--- /dev/null
+++ b/vcl/CustomTarget_kde5_moc.mk
@@ -0,0 +1,23 @@
+# -*- 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)/KDE5XLib.moc \
+	$(call gb_CustomTarget_get_workdir,vcl/unx/kde5)/tst_exclude_socket_notifiers.moc \
+	$(call gb_CustomTarget_get_workdir,vcl/unx/kde5)/tst_exclude_posted_events.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/Library_vclplug_kde5.mk b/vcl/Library_vclplug_kde5.mk
new file mode 100644
index 000000000000..7775fbf9a71a
--- /dev/null
+++ b/vcl/Library_vclplug_kde5.mk
@@ -0,0 +1,96 @@
+# -*- 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 \
+))
+
+$(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_gen \
+    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 \
+	icuuc \
+	kde5 \
+	epoxy \
+))
+
+$(eval $(call gb_Library_add_libs,vclplug_kde5,\
+	-lX11 \
+	-lXext \
+	-lSM \
+	-lICE \
+))
+
+ifneq ($(KF5_HAVE_GLIB),)
+$(eval $(call gb_Library_add_defs,vclplug_kde5,\
+    $(KF5_GLIB_CFLAGS) \
+))
+
+$(eval $(call gb_Library_add_libs,vclplug_kde5,\
+    $(KF5_GLIB_LIBS) \
+))
+endif
+
+
+$(eval $(call gb_Library_add_exception_objects,vclplug_kde5,\
+    vcl/unx/kde5/KDE5Data \
+    vcl/unx/kde5/KDE5SalDisplay \
+    vcl/unx/kde5/KDE5SalFrame \
+    vcl/unx/kde5/KDE5SalGraphics \
+    vcl/unx/kde5/KDE5SalInstance \
+    vcl/unx/kde5/KDE5XLib \
+    vcl/unx/kde5/main \
+))
+
+ifeq ($(OS),LINUX)
+$(eval $(call gb_Library_add_libs,vclplug_kde5,\
+	-lm \
+	-ldl \
+	-lpthread \
+))
+endif
+
+# vim: set noet sw=4 ts=4:
diff --git a/vcl/Module_vcl.mk b/vcl/Module_vcl.mk
index c3b001fff442..a9cd5e158f13 100644
--- a/vcl/Module_vcl.mk
+++ b/vcl/Module_vcl.mk
@@ -81,6 +81,12 @@ $(eval $(call gb_Module_add_targets,vcl,\
     Library_vclplug_kde4 \
 ))
 endif
+ifneq ($(ENABLE_KDE5),)
+$(eval $(call gb_Module_add_targets,vcl,\
+    CustomTarget_kde5_moc \
+    Library_vclplug_kde5 \
+))
+endif
 endif
 
 ifeq ($(OS),MACOSX)
diff --git a/vcl/unx/kde5/FPServiceInfo.hxx b/vcl/unx/kde5/FPServiceInfo.hxx
new file mode 100644
index 000000000000..fdb285144343
--- /dev/null
+++ b/vcl/unx/kde5/FPServiceInfo.hxx
@@ -0,0 +1,28 @@
+/* -*- 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
+
+// the service names
+#define FILE_PICKER_SERVICE_NAME "com.sun.star.ui.dialogs.KDE4FilePicker"
+
+// the implementation names
+#define FILE_PICKER_IMPL_NAME    "com.sun.star.ui.dialogs.KDE4FilePicker"
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/kde5/KDE5Data.cxx b/vcl/unx/kde5/KDE5Data.cxx
new file mode 100644
index 000000000000..487a0b254af3
--- /dev/null
+++ b/vcl/unx/kde5/KDE5Data.cxx
@@ -0,0 +1,68 @@
+/* -*- 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 <QtWidgets/QStyle>
+#include <QtWidgets/QApplication>
+
+#undef Region
+
+#include "KDE5Data.hxx"
+
+#include "KDE5XLib.hxx"
+#include "KDE5SalDisplay.hxx"
+
+KDEData::~KDEData()
+{
+}
+
+void KDEData::Init()
+{
+    pXLib_ = new KDEXLib();
+    pXLib_->Init();
+    SetDisplay( SalKDEDisplay::self() );
+}
+
+void KDEData::initNWF()
+{
+    ImplSVData *pSVData = ImplGetSVData();
+
+    // draw toolbars on separate lines
+    pSVData->maNWFData.mbDockingAreaSeparateTB = true;
+    // no borders for menu, theming does that
+    pSVData->maNWFData.mbFlatMenu = true;
+    // Qt theme engines may support a rollover menubar
+    pSVData->maNWFData.mbRolloverMenubar = true;
+
+    pSVData->maNWFData.mbNoFocusRects = true;
+
+    // Styled menus need additional space
+    QStyle *style = QApplication::style();
+    pSVData->maNWFData.mnMenuFormatBorderX =
+       style->pixelMetric( QStyle::PM_MenuPanelWidth ) +
+       style->pixelMetric( QStyle::PM_MenuHMargin );
+    pSVData->maNWFData.mnMenuFormatBorderY =
+       style->pixelMetric( QStyle::PM_MenuPanelWidth ) +
+       style->pixelMetric( QStyle::PM_MenuVMargin );
+}
+
+void KDEData::deInitNWF()
+{
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/kde5/KDE5Data.hxx b/vcl/unx/kde5/KDE5Data.hxx
new file mode 100644
index 000000000000..4efd23a7df34
--- /dev/null
+++ b/vcl/unx/kde5/KDE5Data.hxx
@@ -0,0 +1,37 @@
+/* -*- 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 <unx/saldisp.hxx>
+#include <unx/saldata.hxx>
+
+class KDEData : public X11SalData
+{
+    public:
+        explicit KDEData( SalInstance *pInstance )
+                        : X11SalData( SAL_DATA_KDE4, pInstance ) {}
+        virtual ~KDEData() override;
+
+        virtual void Init() override;
+        virtual void initNWF() override;
+        virtual void deInitNWF() override;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/kde5/KDE5SalDisplay.cxx b/vcl/unx/kde5/KDE5SalDisplay.cxx
new file mode 100644
index 000000000000..eddac063048f
--- /dev/null
+++ b/vcl/unx/kde5/KDE5SalDisplay.cxx
@@ -0,0 +1,98 @@
+/* -*- 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 "VCLKDE5Application.hxx"
+#include "KDE5SalDisplay.hxx"
+
+#ifdef Bool
+#undef Bool
+#endif
+
+#include "KDE5XLib.hxx"
+
+#include <assert.h>
+
+SalKDEDisplay* SalKDEDisplay::selfptr = nullptr;
+
+SalKDEDisplay::SalKDEDisplay( Display* pDisp )
+    : SalX11Display( pDisp )
+{
+    assert( selfptr == nullptr );
+    selfptr = this;
+    xim_protocol = XInternAtom( pDisp_, "_XIM_PROTOCOL", False );
+}
+
+SalKDEDisplay::~SalKDEDisplay()
+{
+    // in case never a frame opened
+    static_cast<KDEXLib*>(GetXLib())->doStartup();
+    // clean up own members
+    doDestruct();
+    selfptr = nullptr;
+    // prevent SalDisplay from closing KApplication's display
+    pDisp_ = nullptr;
+}
+
+void SalKDEDisplay::Yield()
+{
+    if( DispatchInternalEvent() )
+        return;
+
+    // Prevent blocking from Drag'n'Drop events, which may have already have processed the event
+    if (XEventsQueued( pDisp_, QueuedAfterReading ) == 0)
+        return;
+
+    DBG_ASSERT( static_cast<SalYieldMutex*>(GetSalData()->m_pInstance->GetYieldMutex())->GetThreadId() ==
+                osl::Thread::getCurrentIdentifier(),
+                "will crash soon since solar mutex not locked in SalKDEDisplay::Yield" );
+
+    /*XEvent event;
+    XNextEvent( pDisp_, &event );
+    if( checkDirectInputEvent( &event ))
+        return;
+    qApp->x11ProcessEvent( &event );*/
+}
+
+// HACK: When using Qt event loop, input methods (japanese, etc.) will get broken because
+// of XFilterEvent() getting called twice, once by Qt, once by LO (bnc#665112).
+// This function is therefore called before any XEvent is passed to Qt event handling
+// and if it is a keyboard event and no Qt widget is the active window (i.e. we are
+// processing events for some LO window), then feed the event only to LO directly and skip Qt
+// completely. Skipped events are KeyPress, KeyRelease and also _XIM_PROTOCOL client message
+// (seems to be necessary too, hopefully there are not other internal XIM messages that
+// would need this handling).
+bool SalKDEDisplay::checkDirectInputEvent( xcb_generic_event_t* ev )
+{
+    switch (ev->response_type & ~0x80)
+    {
+        case XCB_CLIENT_MESSAGE:
+        case XCB_KEY_PRESS:
+        case XCB_KEY_RELEASE:
+            if( QApplication::activeWindow() == nullptr )
+            {
+//                Dispatch(ev);
+                return true;
+            }
+            break;
+    }
+    return false;
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/kde5/KDE5SalDisplay.hxx b/vcl/unx/kde5/KDE5SalDisplay.hxx
new file mode 100644
index 000000000000..0a31dcedc10d
--- /dev/null
+++ b/vcl/unx/kde5/KDE5SalDisplay.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 <unx/saldisp.hxx>
+#include <xcb/xcb.h>
+
+#ifdef CursorShape
+#undef CursorShape
+#endif
+
+class SalKDEDisplay : public SalX11Display
+{
+    public:
+        explicit SalKDEDisplay( Display* pDisp );
+        virtual ~SalKDEDisplay() override;
+        static SalKDEDisplay* self();
+        virtual void Yield() override;
+        bool checkDirectInputEvent( xcb_generic_event_t* ev );
+    private:
+        Atom xim_protocol;
+        static SalKDEDisplay* selfptr;
+};
+
+inline SalKDEDisplay* SalKDEDisplay::self()
+{
+    return selfptr;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/kde5/KDE5SalFrame.cxx b/vcl/unx/kde5/KDE5SalFrame.cxx
new file mode 100644
index 000000000000..090abbc240d1
--- /dev/null
+++ b/vcl/unx/kde5/KDE5SalFrame.cxx
@@ -0,0 +1,381 @@
+/* -*- 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 <QtCore/QDebug>
+#include <QtWidgets/QToolTip>
+#include <QtWidgets/QApplication>
+#include <QtWidgets/QMenuBar>
+
+#include <KConfig>
+#include <KConfigGroup>
+#include <KSharedConfig>
+
+#undef Region
+
+#include "KDE5SalFrame.hxx"
+#include "KDE5XLib.hxx"
+#include "KDE5SalGraphics.hxx"
+
+#include <tools/color.hxx>
+
+#include <vcl/font.hxx>
+#include <vcl/settings.hxx>
+
+#include "unx/fontmanager.hxx"
+
+#include <svdata.hxx>
+
+#include <boost/optional.hpp>
+
+
+KDESalFrame::KDESalFrame( SalFrame* pParent, SalFrameStyleFlags nState ) :
+    X11SalFrame( pParent, nState )
+{
+}
+
+void KDESalFrame::Show( bool bVisible, bool bNoActivate )
+{
+    if ( !GetParent() && ! (GetStyle() & SalFrameStyleFlags::INTRO) )
+    {
+        KDEXLib* pXLib = static_cast<KDEXLib*>(GetDisplay()->GetXLib());
+        pXLib->doStartup();
+    }
+
+    X11SalFrame::Show( bVisible, bNoActivate );
+}
+
+/** Helper function to convert colors.
+*/
+static Color toColor( const QColor &rColor )
+{
+    return Color( rColor.red(), rColor.green(), rColor.blue() );
+}
+
+
+/** 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 <= 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.kde4", "font name BEFORE system match: \"" << aInfo.m_aFamilyName << "\"" );
+
+    // match font to e.g. resolve "Sans"
+    psp::PrintFontManager::get().matchFont( aInfo, rLocale );
+
+    SAL_INFO( "vcl.kde4", "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 KDESalFrame::UpdateSettings( AllSettings& rSettings )
+{
+    StyleSettings style( rSettings.GetStyleSettings() );
+    bool bSetTitleFont = false;
+
+    // General settings
+    QPalette pal = QApplication::palette();
+
+    style.SetToolbarIconSize( ToolbarIconSize::Large );
+
+    style.SetActiveColor(toColor(pal.color(QPalette::Active, QPalette::Window)));
+    style.SetDeactiveColor(toColor(pal.color(QPalette::Inactive, QPalette::Window)));
+
+    style.SetActiveTextColor(toColor(pal.color(QPalette::Active, QPalette::WindowText)));
+    style.SetDeactiveTextColor(toColor(pal.color(QPalette::Inactive, QPalette::WindowText)));
+
+    // 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 );
+        }
+    }*/
+
+    Color aFore = toColor( pal.color( QPalette::Active, QPalette::WindowText ) );
+    Color aBack = toColor( pal.color( QPalette::Active, QPalette::Window ) );
+    Color aText = toColor( pal.color( QPalette::Active, QPalette::Text ) );
+    Color aBase = toColor( pal.color( QPalette::Active, QPalette::Base ) );
+    Color aButn = toColor( pal.color( QPalette::Active, QPalette::ButtonText ) );
+    Color aMid = toColor( pal.color( QPalette::Active, QPalette::Mid ) );
+    Color aHigh = toColor( pal.color( QPalette::Active, QPalette::Highlight ) );
+    Color aHighText = toColor( pal.color( QPalette::Active, QPalette::HighlightedText ) );
+
+    style.SetSkipDisabledInMenus( true );
+
+    // Foreground
+    style.SetRadioCheckTextColor( aFore );
+    style.SetLabelTextColor( aFore );
+    style.SetDialogTextColor( aFore );
+    style.SetGroupTextColor( aFore );
+
+    // Text
+    style.SetFieldTextColor( aText );
+    style.SetFieldRolloverTextColor( aText );
+    style.SetWindowTextColor( aText );
+    style.SetToolTextColor( aText );
+
+    // Base
+    style.SetFieldColor( aBase );
+    style.SetWindowColor( aBase );
+    style.SetActiveTabColor( aBase );
+
+    // Buttons
+    style.SetButtonTextColor( aButn );
+    style.SetButtonRolloverTextColor( aButn );
+
+    // Tabs
+    style.SetTabTextColor( aButn );
+    style.SetTabRolloverTextColor( aButn );
+    style.SetTabHighlightTextColor( aButn );
+
+    // Disable color
+    style.SetDisableColor( toColor( pal.color( QPalette::Disabled, QPalette::WindowText ) ) );
+
+    // Workspace
+    style.SetWorkspaceColor( aMid );
+
+    // Background
+    style.Set3DColors( aBack );
+    style.SetFaceColor( aBack );
+    style.SetInactiveTabColor( aBack );
+    style.SetDialogColor( aBack );
+    style.SetCheckedColorSpecialCase( );
+
+    // Selection
+    style.SetHighlightColor( aHigh );
+    style.SetHighlightTextColor( aHighText );
+
+    // Tooltip
+    style.SetHelpColor( toColor( QToolTip::palette().color( QPalette::Active, QPalette::ToolTipBase )));
+    style.SetHelpTextColor( toColor( QToolTip::palette().color( QPalette::Active, QPalette::ToolTipText )));
+
+    // Font
+    vcl::Font aFont = toFont( QApplication::font(), rSettings.GetUILanguageTag().getLocale() );
+
+    style.SetAppFont( aFont );
+
+    style.SetMenuFont( aFont ); // will be changed according to pMenuBar
+    style.SetLabelFont( aFont );
+    style.SetRadioCheckFont( aFont );
+    style.SetPushButtonFont( aFont );
+    style.SetFieldFont( aFont );
+    style.SetIconFont( aFont );
+    style.SetTabFont( aFont );
+    style.SetGroupFont( 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::unique_ptr<QMenuBar>( new QMenuBar() );
+    QPalette qMenuCG = pMenuBar->palette();
+
+    // Menu text and background color, theme specific
+    Color aMenuFore = toColor( qMenuCG.color( QPalette::WindowText ) );
+    Color aMenuBack = toColor( qMenuCG.color( QPalette::Window ) );
+
+    style.SetMenuTextColor( aMenuFore );
+    style.SetMenuBarTextColor( style.GetPersonaMenuBarTextColor().get_value_or( aMenuFore ) );
+    style.SetMenuColor( aMenuBack );
+    style.SetMenuBarColor( aMenuBack );
+    style.SetMenuHighlightColor( toColor ( qMenuCG.color( QPalette::Highlight ) ) );
+    style.SetMenuHighlightTextColor( toColor ( qMenuCG.color( QPalette::HighlightedText ) ) );
+
+    // set special menubar highlight text color
+    if ( QApplication::style()->inherits( "HighContrastStyle" ) )
+        ImplGetSVData()->maNWFData.maMenuBarHighlightTextColor = toColor( qMenuCG.color( QPalette::HighlightedText ) );
+    else
+        ImplGetSVData()->maNWFData.maMenuBarHighlightTextColor = aMenuFore;
+
+    // set menubar rollover color
+    if ( pMenuBar->style()->styleHint( QStyle::SH_MenuBar_MouseTracking ) )
+    {
+        style.SetMenuBarRolloverColor( toColor ( qMenuCG.color( QPalette::Highlight ) ) );
+        style.SetMenuBarRolloverTextColor( ImplGetSVData()->maNWFData.maMenuBarHighlightTextColor );
+    }
+    else
+    {
+        style.SetMenuBarRolloverColor( aMenuBack );
+        style.SetMenuBarRolloverTextColor( aMenuFore );
+    }
+    style.SetMenuBarHighlightTextColor(style.GetMenuHighlightTextColor());
+
+    // Font
+    aFont = toFont( pMenuBar->font(), rSettings.GetUILanguageTag().getLocale() );
+    style.SetMenuFont( aFont );
+
+    // Scroll bar size
+    style.SetScrollBarSize( QApplication::style()->pixelMetric( QStyle::PM_ScrollBarExtent ) );
+    style.SetMinThumbSize( QApplication::style()->pixelMetric( QStyle::PM_ScrollBarSliderMin ));
+
+    // These colors are used for the ruler text and marks
+    style.SetShadowColor(toColor(pal.color(QPalette::Disabled, QPalette::WindowText)));
+    style.SetDarkShadowColor(toColor(pal.color(QPalette::Inactive, QPalette::WindowText)));
+
+    rSettings.SetStyleSettings( style );
+}
+
+void KDESalFrame::ReleaseGraphics( SalGraphics *pGraphics )
+{
+    for( int i = 0; i < nMaxGraphics; i++ )
+    {
+        if( m_aGraphics[i].pGraphics.get() == pGraphics )
+        {
+            m_aGraphics[i].bInUse = false;
+            break;
+        }
+    }
+}
+
+void KDESalFrame::updateGraphics( bool bClear )
+{
+    Drawable aDrawable = bClear ? None : GetWindow();
+    for( int i = 0; i < nMaxGraphics; i++ )
+    {
+        if( m_aGraphics[i].bInUse )
+            m_aGraphics[i].pGraphics->SetDrawable( aDrawable, GetScreenNumber() );
+    }
+}
+
+SalGraphics* KDESalFrame::AcquireGraphics()
+{
+    if( GetWindow() )
+    {
+        for( int i = 0; i < nMaxGraphics; i++ )
+        {
+            if( ! m_aGraphics[i].bInUse )
+            {
+                m_aGraphics[i].bInUse = true;
+                if( ! m_aGraphics[i].pGraphics )
+                {
+                    m_aGraphics[i].pGraphics.reset( new KDESalGraphics );
+                    m_aGraphics[i].pGraphics->Init( this, GetWindow(), GetScreenNumber() );
+                }
+                return m_aGraphics[i].pGraphics.get();
+            }
+        }
+    }
+
+    return nullptr;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/kde5/KDE5SalFrame.hxx b/vcl/unx/kde5/KDE5SalFrame.hxx
new file mode 100644
index 000000000000..114cd49bd8d2
--- /dev/null
+++ b/vcl/unx/kde5/KDE5SalFrame.hxx
@@ -0,0 +1,53 @@
+/* -*- 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 <unx/saldisp.hxx>
+#include <unx/salframe.h>
+#include <unx/salgdi.h>
+
+class KDESalFrame : public X11SalFrame
+{
+    private:
+        static const int nMaxGraphics = 2;
+
+        struct GraphicsHolder
+        {
+            std::unique_ptr<X11SalGraphics> pGraphics;
+            bool bInUse;
+
+            GraphicsHolder() : bInUse( false ) {}
+        };
+
+        GraphicsHolder m_aGraphics[ nMaxGraphics ];
+
+    public:
+        KDESalFrame( SalFrame* pParent, SalFrameStyleFlags nStyle );
+
+        virtual SalGraphics* AcquireGraphics() override;
+        virtual void ReleaseGraphics( SalGraphics *pGraphics ) override;
+        virtual void updateGraphics( bool bClear ) override;
+        virtual void UpdateSettings( AllSettings& rSettings ) override;
+        virtual void Show( bool bVisible, bool bNoActivate = false ) override;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/kde5/KDE5SalGraphics.cxx b/vcl/unx/kde5/KDE5SalGraphics.cxx
new file mode 100644
index 000000000000..85642f6f91df
--- /dev/null
+++ b/vcl/unx/kde5/KDE5SalGraphics.cxx
@@ -0,0 +1,1020 @@
+/* -*- 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 <QtGui/QPainter>
+#include <QtWidgets/QApplication>
+#include <QtWidgets/QStyle>
+#include <QtWidgets/QStyleOption>
+#include <QtWidgets/QFrame>
+#include <QtWidgets/QLabel>
+
+#undef Region
+
+#include "KDE5SalGraphics.hxx"
+#include "KDE5SalInstance.hxx"
+
+#include <vcl/settings.hxx>
+#include <vcl/decoview.hxx>
+#include <rtl/ustrbuf.hxx>
+
+/**
+  Conversion function between VCL ControlState together with
+  ImplControlValue and Qt state flags.
+  @param nControlState State of the widget (default, focused, ...) in Native Widget Framework.
+  @param aValue Value held by the widget (on, off, ...)
+*/
+QStyle::State vclStateValue2StateFlag( ControlState nControlState,
+    const ImplControlValue& aValue )
+{
+    QStyle::State nState =
+        ( (nControlState & ControlState::ENABLED)?  QStyle::State_Enabled:   QStyle::State_None ) |
+        ( (nControlState & ControlState::FOCUSED)?  QStyle::State_HasFocus:  QStyle::State_None ) |
+        ( (nControlState & ControlState::PRESSED)?  QStyle::State_Sunken:    QStyle::State_None ) |
+        ( (nControlState & ControlState::SELECTED)? QStyle::State_Selected : QStyle::State_None ) |
+        ( (nControlState & ControlState::ROLLOVER)? QStyle::State_MouseOver: QStyle::State_None );
+
+    switch ( aValue.getTristateVal() )
+    {
+        case ButtonValue::On:    nState |= QStyle::State_On;       break;
+        case ButtonValue::Off:   nState |= QStyle::State_Off;      break;
+        case ButtonValue::Mixed: nState |= QStyle::State_NoChange; break;
+        default: break;
+    }
+
+    return nState;
+}
+
+/**
+ Convert tools::Rectangle to QRect.
+ @param rControlRegion The tools::Rectangle to convert.
+ @return The matching QRect
+*/
+QRect region2QRect( const tools::Rectangle& rControlRegion )
+{
+    return QRect(rControlRegion.Left(), rControlRegion.Top(), rControlRegion.GetWidth(), rControlRegion.GetHeight());
+}
+
+bool KDESalGraphics::IsNativeControlSupported( ControlType type, ControlPart part )
+{
+    switch (type)
+    {
+        case ControlType::Pushbutton:
+        case ControlType::Radiobutton:
+        case ControlType::Checkbox:
+        case ControlType::Tooltip:
+        case ControlType::Progress:
+        case ControlType::ListNode:
+            return (part == ControlPart::Entire);
+
+        case ControlType::Menubar:
+        case ControlType::MenuPopup:
+        case ControlType::Editbox:
+        case ControlType::MultilineEditbox:
+        case ControlType::Combobox:
+        case ControlType::Toolbar:
+        case ControlType::Frame:
+        case ControlType::Scrollbar:
+        case ControlType::WindowBackground:
+        case ControlType::Fixedline:
+            return true;
+
+        case ControlType::Listbox:
+            return (part == ControlPart::Entire || part == ControlPart::HasBackgroundTexture);
+
+        case ControlType::Spinbox:
+            return (part == ControlPart::Entire || part == ControlPart::HasBackgroundTexture);
+
+        case ControlType::Slider:
+            return (part == ControlPart::TrackHorzArea || part == ControlPart::TrackVertArea);
+
+        default:
+            break;
+    }
+
+    return false;
+}
+
+/// helper drawing methods
+namespace
+{
+    void draw( QStyle::ControlElement element, QStyleOption* option, QImage* image, QStyle::State const & state, QRect rect = QRect())
+    {
+        option->state |= state;
+        option->rect = !rect.isNull() ? rect : image->rect();
+
+        QPainter painter(image);
+        QApplication::style()->drawControl(element, option, &painter);
+    }
+
+    void draw( QStyle::PrimitiveElement element, QStyleOption* option, QImage* image, QStyle::State const & state, QRect rect = QRect())
+    {
+        option->state |= state;
+        option->rect = !rect.isNull() ? rect : image->rect();
+
+        QPainter painter(image);
+        QApplication::style()->drawPrimitive(element, option, &painter);
+    }
+
+    void draw( QStyle::ComplexControl element, QStyleOptionComplex* option, QImage* image, QStyle::State const & state )
+    {
+        option->state |= state;
+        option->rect = image->rect();
+
+        QPainter painter(image);
+        QApplication::style()->drawComplexControl(element, option, &painter);
+    }
+
+    void lcl_drawFrame( QStyle::PrimitiveElement element, QImage* image, QStyle::State const & state,
+                        QStyle::PixelMetric eLineMetric = QStyle::PM_DefaultFrameWidth )
+    {
+    #if ( QT_VERSION >= QT_VERSION_CHECK( 4, 5, 0 ) )
+        QStyleOptionFrameV3 option;
+        option.frameShape = QFrame::StyledPanel;
+        option.state = QStyle::State_Sunken;
+        option.lineWidth = QApplication::style()->pixelMetric( eLineMetric );
+    #else
+        QStyleOptionFrame option;
+
+        QFrame aFrame( nullptr );
+        aFrame.setFrameRect( QRect(0, 0, image->width(), image->height()) );
+        aFrame.setFrameStyle( QFrame::StyledPanel | QFrame::Sunken );
+        aFrame.ensurePolished();
+
+        option.initFrom( &aFrame );
+        option.lineWidth = aFrame.lineWidth();
+        option.midLineWidth = aFrame.midLineWidth();
+    #endif
+        draw(element, &option, image, state);
+    }
+}
+
+#if QT_VERSION >= QT_VERSION_CHECK( 4, 5, 0 )
+#define IMAGE_BASED_PAINTING
+#else
+#undef IMAGE_BASED_PAINTING
+#endif
+
+#ifdef IMAGE_BASED_PAINTING
+// There is a small catch with this function, although hopefully only philosophical.
+// Officially Xlib's vcl::Region is an opaque data type, with only functions for manipulating it.
+// However, whoever designed it apparently didn't give it that much thought, as it's impossible
+// to find out what exactly a region actually is (except for really weird ways like XClipBox()
+// and repeated XPointInRegion(), which would be awfully slow). Fortunately, the header file
+// describing the structure actually happens to be installed too, and there's at least one
+// widely used software using it (Compiz). So access the data directly too and assume that
+// everybody who compiles with Qt4 support has Xlib new enough and good enough to support this.
+// In case this doesn't work for somebody, try #include <X11/region.h> instead, or build
+// without IMAGE_BASED_PAINTING (in which case QApplication::setGraphicsSystem( "native" ) may
+// be needed too).
+#include <X11/Xregion.h>
+static QRegion XRegionToQRegion( Region xr )
+{
+    QRegion qr;
+    for( long i = 0;
+         i < xr->numRects;
+         ++i )
+    {
+        BOX& b = xr->rects[ i ];
+        qr |= QRect( b.x1, b.y1, b.x2 - b.x1, b.y2 - b.y1 ); // x2,y2 is outside, not the bottom-right corner
+    }
+    return qr;
+}
+#endif
+
+bool KDESalGraphics::drawNativeControl( ControlType type, ControlPart part,
+                                        const tools::Rectangle& rControlRegion, ControlState nControlState,
+                                        const ImplControlValue& value,
+                                        const OUString& )
+{
+    bool nativeSupport = IsNativeControlSupported( type, part );
+    if( ! nativeSupport ) {
+        assert( ! nativeSupport && "drawNativeControl called without native support!" );
+        return false;
+    }
+
+    if( lastPopupRect.isValid() && ( type != ControlType::MenuPopup || part != ControlPart::MenuItem ))
+        lastPopupRect = QRect();
+
+    bool returnVal = true;
+
+    QRect widgetRect = region2QRect(rControlRegion);
+
+    //if no image, or resized, make a new image
+    if (!m_image || m_image->size() != widgetRect.size())
+    {
+        m_image.reset(new QImage( widgetRect.width(), widgetRect.height(), QImage::Format_ARGB32 ) );
+    }
+
+    // Default image color - just once
+    switch (type)
+    {
+        case ControlType::MenuPopup:
+            if( part == ControlPart::MenuItemCheckMark || part == ControlPart::MenuItemRadioMark )
+            {
+                // it is necessary to fill the background transparently first, as this
+                // is painted after menuitem highlight, otherwise there would be a grey area
+                m_image->fill( Qt::transparent );
+                break;
+            }
+            SAL_FALLTHROUGH; // QPalette::Window
+        case ControlType::Menubar:
+        case ControlType::WindowBackground:
+            m_image->fill( QApplication::palette().color(QPalette::Window).rgb() );
+            break;
+        case ControlType::Tooltip:
+            m_image->fill(QApplication::palette().color(QPalette::ToolTipBase).rgb());
+            break;
+        case ControlType::Pushbutton:
+            m_image->fill(QApplication::palette().color(QPalette::Button).rgb());
+            break;
+        case ControlType::Scrollbar:
+            if ((part == ControlPart::DrawBackgroundVert)
+                || (part == ControlPart::DrawBackgroundHorz))
+            {
+                m_image->fill( QApplication::palette().color(QPalette::Window).rgb() );
+                break;
+            }
+            SAL_FALLTHROUGH; // Qt::transparent
+        default:
+            m_image->fill( Qt::transparent );
+            break;
+    }
+
+    QRegion* localClipRegion = nullptr;
+
+    if (type == ControlType::Pushbutton)
+    {
+        QStyleOptionButton option;
+        draw( QStyle::CE_PushButton, &option, m_image.get(),
+              vclStateValue2StateFlag(nControlState, value) );
+    }
+    else if (type == ControlType::Menubar)
+    {
+        if (part == ControlPart::MenuItem)
+        {
+            QStyleOptionMenuItem option;
+            if ( ( nControlState & ControlState::ROLLOVER )
+                && QApplication::style()->styleHint( QStyle::SH_MenuBar_MouseTracking ) )
+                option.state |= QStyle::State_Selected;
+
+            if ( nControlState & ControlState::SELECTED ) // Passing State_Sunken is currently not documented.
+                option.state |= QStyle::State_Sunken;  // But some kinds of QStyle interpret it.
+
+            draw( QStyle::CE_MenuBarItem, &option, m_image.get(),
+                  vclStateValue2StateFlag(nControlState, value) );
+        }
+        else if (part == ControlPart::Entire)
+        {
+            QStyleOptionMenuItem option;
+            draw( QStyle::CE_MenuBarEmptyArea, &option, m_image.get(),
+                  vclStateValue2StateFlag(nControlState, value) );
+        }
+        else
+        {
+            returnVal = false;
+        }
+    }
+    else if (type == ControlType::MenuPopup)
+    {
+        OSL_ASSERT( part == ControlPart::MenuItem ? lastPopupRect.isValid() : !lastPopupRect.isValid());
+        if( part == ControlPart::MenuItem )
+        {
+            QStyleOptionMenuItem option;
+            draw( QStyle::CE_MenuItem, &option, m_image.get(),
+                  vclStateValue2StateFlag(nControlState, value) );
+            // HACK: LO core first paints the entire popup and only then it paints menu items,

... etc. - the rest is truncated


More information about the Libreoffice-commits mailing list