diff --git a/CMakeLists.txt b/CMakeLists.txt index 5f675caf..73d9850c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,216 +1,217 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8.12) IF(POLICY CMP0053) CMAKE_POLICY(SET CMP0053 NEW) ENDIF(POLICY CMP0053) IF(POLICY CMP0048) CMAKE_POLICY(SET CMP0048 NEW) ENDIF(POLICY CMP0048) IF(POLICY CMP0017) CMAKE_POLICY(SET CMP0017 NEW) ENDIF(POLICY CMP0017) IF(POLICY CMP0028) CMAKE_POLICY(SET CMP0028 NEW) ENDIF(POLICY CMP0028) SET(PROJECT_VERSION "3.1.0") PROJECT(ring-kde) SET(QT_MIN_VERSION "5.9.0" ) SET(KF5_DEP_VERSION "5.6.0" ) # SET(AKO_DEP_VERSION "4.89.0") IF(${CMAKE_SYSTEM_NAME} MATCHES "Android") SET(OS_ANDROID 1) ENDIF() +OPTION(USE_STATIC_QT "Favor using Qt static plugins instead of shared libraries" OFF) OPTION(ENABLE_SINGLE_INSTANCE "Reuse instances of Ring-KDE when possible" ON) OPTION(ENABLE_NOTIFICATIONS "Enable the notifications on supported platgorms" ON) SET(LOCAL_CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/" ) LIST(APPEND CMAKE_MODULE_PATH "${LOCAL_CMAKE_MODULE_PATH}") FIND_PACKAGE(ECM 1.1.0 REQUIRED NO_MODULE) LIST(APPEND CMAKE_MODULE_PATH "${ECM_MODULE_PATH}") # libringqt isn't a "stable" library. Clients often only work with a very specific # commit and nothing else. To prevent using the wrong version, it is possible to # add a `libringqt` directory in the source. If present, that version will be used. IF(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/libringqt/") SET(LibRingQt_SRC "${CMAKE_CURRENT_SOURCE_DIR}/libringqt/") SET(ringqt_FOUND true) ELSE() FIND_PACKAGE ( LibRingQt QUIET CONFIG) IF (ringqt_FOUND) FIND_PACKAGE ( LibRingQtQuick REQUIRED CONFIG) ENDIF() ENDIF() FIND_PACKAGE (KQuickItemViews QUIET CONFIG) # Download libringqt if it wasn't found to simplify the build process IF(NOT ringqt_FOUND) INCLUDE(cmake/FetchRingQt.cmake) SET(LibRingQt_SRC ${CMAKE_CURRENT_BINARY_DIR}/libringqt/) ENDIF() # This package was developed for Ring-KDE. It is now a shared framework. Until # it is more widespread and stable, a copy is still included in Ring-KDE. IF(NOT KQuickItemViews_FOUND AND IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/libkquickitemviews/") SET(LibKQuickItemViews_SRC "${CMAKE_CURRENT_SOURCE_DIR}/libkquickitemviews/") SET(libkquickitemviews_FOUND true) ADD_DEFINITIONS(-DKQUICKITEMVIEWS_USE_STATIC_PLUGIN=1) ELSEIF(NOT KQuickItemViews_FOUND AND IS_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/libkquickitemviews/") SET(LibKQuickItemViews_SRC "${CMAKE_CURRENT_BINARY_DIR}/libkquickitemviews/") SET(libkquickitemviews_FOUND true) ADD_DEFINITIONS(-DKQUICKITEMVIEWS_USE_STATIC_PLUGIN=1) ELSEIF(NOT KQuickItemViews_FOUND) message(FATAL_ERROR "Download KQuickItemViews from `git clone https://anongit.kde.org/kquickitemviews/` and move it to `path/to/ring-kde/libkquickitemviews`") ENDIF() # Use the build-in copy if it has been found IF(LibRingQt_SRC) # Use the .a, not the .so; SET(ENABLE_STATIC true) LIST(APPEND CMAKE_MODULE_PATH "${LibRingQt_SRC}/cmake/") ADD_SUBDIRECTORY(${LibRingQt_SRC} build/build_libringqt) SET(ringqt_INCLUDE_DIR ${LibRingQt_SRC}/src ${LibRingQt_SRC}/libringqtquick/src ) INCLUDE_DIRECTORIES(${LibRingQt_SRC}/src) ENDIF() IF(LibKQuickItemViews_SRC) # Use the .a, not the .so; SET(ENABLE_STATIC true) ADD_SUBDIRECTORY(${LibKQuickItemViews_SRC} build/build_libkquickitemviews) ENDIF() INCLUDE(ECMInstallIcons) INCLUDE(ECMOptionalAddSubdirectory) INCLUDE(KDEInstallDirs) INCLUDE(KDECMakeSettings) INCLUDE(FeatureSummary) # On Android, the executable is treated as a library, this is not what's # normally expected. IF(NOT DEFINED OS_ANDROID) INCLUDE(KDECompilerSettings) ELSE() SET(ENABLE_NOTIFICATIONS OFF) ENDIF() # So far only Linux systems use this feature, so it will print noise on all # platforms where the necessary infrastructure doesn't even exists, let alone # in use. IF(NOT ${CMAKE_SYSTEM_NAME} MATCHES "Linux") # SET(KDE_SKIP_TEST_SETTINGS 1) ENDIF() # Block known broken C++11 compilers IF (CMAKE_COMPILER_IS_GNUCC) EXECUTE_PROCESS(COMMAND ${CMAKE_C_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION) IF (GCC_VERSION VERSION_GREATER 4.8 OR GCC_VERSION VERSION_EQUAL 4.8) MESSAGE(STATUS "Found GCC version >= 4.8: " ${GCC_VERSION}) ELSE() MESSAGE(FATAL_ERROR "Your version of GCC is too old, please install GCC 4.8 or later") ENDIF() ENDIF() FIND_PACKAGE(Qt5 ${QT_MIN_VERSION} CONFIG REQUIRED Core Widgets Gui Svg PrintSupport QuickControls2 Quick ) #FIND_PACKAGE(Qt5TextToSpeech ${QT_MIN_VERSION} QUIET) #SET_PACKAGE_PROPERTIES(Qt5TextToSpeech PROPERTIES # PURPOSE "Speech support" #) IF (Qt5TextToSpeech_FOUND) ADD_DEFINITIONS(-DHAVE_SPEECH) ENDIF() FIND_PACKAGE(KF5 "${KF5_DEP_VERSION}" REQUIRED COMPONENTS Config GuiAddons DBusAddons I18n WindowSystem XmlGui IconThemes Crash GlobalAccel Declarative Kirigami2 ) # Notifications are not supported on all platforms IF(ENABLE_NOTIFICATIONS) FIND_PACKAGE(KF5 "${KF5_DEP_VERSION}" REQUIRED COMPONENTS Notifications NotifyConfig ) ENDIF() # FIND_PACKAGE(KF5 "${AKO_DEP_VERSION}" QUIET COMPONENTS # DocTools # Akonadi # AkonadiContact # Contacts # ) INCLUDE( ${CMAKE_ROOT}/Modules/CheckIncludeFiles.cmake ) ADD_SUBDIRECTORY( data ) ADD_SUBDIRECTORY( src ) ADD_SUBDIRECTORY( clients ) ADD_SUBDIRECTORY( views ) ADD_SUBDIRECTORY( man ) IF (KF5_DOCTOOLS_FOUND OR KF5_DOC_TOOLS_FOUND) ADD_SUBDIRECTORY( doc ) ENDIF() IF(${ENABLE_TEST} MATCHES true) ADD_SUBDIRECTORY( src/test) ENDIF() # macOS IF(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") SET(MACOSX_BUNDLE ON) SET(MACOSX_BUNDLE_BUNDLE_NAME "Ring-KDE") SET(MACOSX_BUNDLE_BUNDLE_VERSION "${PROJECT_VERSION}") SET(CMAKE_MACOSX_RPATH ON) SET(CMAKE_SKIP_BUILD_RPATH FALSE) SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) SET(CMAKE_INSTALL_RPATH "${CMAKE_CURRENT_SOURCE_DIR}") SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) ENDIF(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") SET(ARCHIVE_NAME ${CMAKE_PROJECT_NAME}-${PROJECT_VERSION}) ADD_CUSTOM_TARGET(dist COMMAND git archive --prefix=${ARCHIVE_NAME}/ HEAD | gzip > ${CMAKE_BINARY_DIR}/${ARCHIVE_NAME}.tar.gz WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} ) FEATURE_SUMMARY(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES) diff --git a/clients/mobile/CMakeLists.txt b/clients/mobile/CMakeLists.txt index ac27e10b..01e20d0e 100644 --- a/clients/mobile/CMakeLists.txt +++ b/clients/mobile/CMakeLists.txt @@ -1,184 +1,186 @@ IF(POLICY CMP0017) CMAKE_POLICY(SET CMP0017 NEW) ENDIF(POLICY CMP0017) IF(POLICY CMP0022) CMAKE_POLICY(SET CMP0022 NEW) ENDIF(POLICY CMP0022) IF(POLICY CMP0063) CMAKE_POLICY(SET CMP0063 NEW) ENDIF(POLICY CMP0063) SET(QT_MIN_VERSION "5.2.0") IF(${CMAKE_SYSTEM_NAME} MATCHES "Android") SET(OS_ANDROID 1) ENDIF() OPTION(ENABLE_NOTIFICATIONS ON) IF(DEFINED OS_ANDROID) SET(ENABLE_NOTIFICATIONS OFF) SET(ENABLE_SINGLE_INSTANCE OFF) ENDIF() - # It doesn't work in sandboxes IF (NOT ENABLE_SINGLE_INSTANCE) ADD_DEFINITIONS(-DDISABLE_KDBUS_SERVICE=1) ENDIF() +IF (USE_STATIC_QT) + ADD_DEFINITIONS(-DUSE_STATIC_KF5=1) +ENDIF() SET(CMAKE_CXX_STANDARD 14) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) #Make sure it can access DBUS autogenerated files INCLUDE_DIRECTORIES(SYSTEM ${ringqt_INCLUDE_DIR}) INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/src) IF(${CMAKE_BUILD_TYPE} MATCHES Release) MESSAGE("NO DEBUG OUTPUT") ADD_DEFINITIONS( -DQT_NO_DEBUG_OUTPUT) ENDIF(${CMAKE_BUILD_TYPE} MATCHES Release) IF(NOT ENABLE_NOTIFICATIONS) ADD_DEFINITIONS(-DDISABLE_NOTIFICATION=1) ENDIF() # Added by a CI bot IF(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/iconpack) ADD_SUBDIRECTORY(iconpack) ADD_DEFINITIONS(-DHAS_ICON_PACK=1) ENDIF() SET( ring_kde_SRCS main.cpp ) QT5_ADD_RESOURCES(ring_kde_SRCS appicon.qrc) # add_subdirectory( test ) #Enable again some day, it cause compile problems for some users IF(NOT (${ENABLE_VIDEO} MATCHES false)) SET(ENABLE_VIDEO 1 CACHE BOOLEAN "Enable video") ADD_DEFINITIONS( -DENABLE_VIDEO=true ) ENDIF(NOT (${ENABLE_VIDEO} MATCHES false)) IF(${DISABLE_UNIQUE_APPLICATION} MATCHES true) MESSAGE("KUniqueApplication disabled") SET(DISABLE_UNIQUE_APPLICATION 1 CACHE BOOLEAN "Disable KUniqueApplication") ADD_DEFINITIONS( -DDISABLE_UNIQUE_APPLICATION=true ) ENDIF(${DISABLE_UNIQUE_APPLICATION} MATCHES true) IF(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") ADD_EXECUTABLE(ring-kde MACOSX_BUNDLE ${ring_kde_SRCS}) set_source_files_properties( ../data/ring-kdeui.rc PROPERTIES MACOSX_PACKAGE_LOCATION Resources ) file( COPY ../data/ring-kdeui.rc DESTINATION "ring-kde.app/Contents/Resources/" ) ELSE() ADD_EXECUTABLE(ring-kde ${ring_kde_SRCS}) ENDIF() IF(NOT ${ENABLE_STATIC} MATCHES false) FIND_PACKAGE(Qt5 ${QT_MIN_VERSION} CONFIG REQUIRED DBus) INCLUDE_DIRECTORIES(SYSTEM ${Qt5DBus_INCLUDE_DIRS} ) LINK_DIRECTORIES(${Qt5DBus_LIBRARY_DIRS} ) ADD_DEFINITIONS(${Qt5DBus_CFLAGS}) IF(NOT DEFINED OS_ANDROID) TARGET_LINK_LIBRARIES(ring-kde -lpthread ) ENDIF() TARGET_LINK_LIBRARIES(ring-kde ${ringqt_LIBRARY_STATIC} ) IF(NOT ${ENABLE_LIBWRAP}) TARGET_LINK_LIBRARIES(ring-kde ${Qt5DBus_LIBRARIES} ) ENDIF() ELSE() TARGET_LINK_LIBRARIES(ring-kde ${ringqt_LIBRARY_DYNAMIC}) ENDIF() QT5_ADD_DBUS_ADAPTOR(ring_kde_SRCS ../data/org.kde.kuiserver.xml cmd.h Cmd ) TARGET_LINK_LIBRARIES(ring-kde jamiwizard jamicallview jamidialview jamitimelineview jamiphotoselector jamicanvasindicator basicview jamicontactview jamiaccountview genericutils kquickitemviews jamikdeintegration jamivideoview jamitroubleshooting jamihistoryview jamichatview jamitimelinebase jamiaudioplayer jamisearch # RingQt ringqtquick # Qt5 Qt5::Widgets Qt5::Core Qt5::Gui Qt5::Svg Qt5::PrintSupport # KF5 KF5::I18n KF5::WidgetsAddons KF5::ConfigCore KF5::ConfigGui KF5::DBusAddons KF5::XmlGui KF5::IconThemes KF5::Crash KF5::GlobalAccel KF5::Declarative KF5::Kirigami2 ) IF(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/iconpack) TARGET_LINK_LIBRARIES(ring-kde breezeiconpack ) ENDIF() IF(ENABLE_NOTIFICATIONS) TARGET_LINK_LIBRARIES(ring-kde jaminotification # KF5 KF5::Notifications KF5::NotifyConfig ) ENDIF() IF (Qt5TextToSpeech_FOUND) TARGET_LINK_LIBRARIES(ring-kde Qt5::TextToSpeech ) ENDIF() ########### install files ############### INSTALL( TARGETS ring-kde DESTINATION ${BIN_INSTALL_DIR}) diff --git a/clients/mobile/main.cpp b/clients/mobile/main.cpp index 75d83edd..9450a725 100644 --- a/clients/mobile/main.cpp +++ b/clients/mobile/main.cpp @@ -1,199 +1,207 @@ /*************************************************************************** * Copyright (C) 2009-2015 by Savoir-Faire Linux * * Author : Jérémy Quentin * * Emmanuel Lepage Vallee * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 3 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program. If not, see . * **************************************************************************/ //Qt #include #include #include #include #include //KDE #include #include #include #include //Ring #include "kcfg_settings.h" #include #include #ifdef KQUICKITEMVIEWS_USE_STATIC_PLUGIN Q_IMPORT_PLUGIN(KQuickItemViews) #else #include #endif Q_IMPORT_PLUGIN(JamiKDEIntegration) Q_IMPORT_PLUGIN(JamiWizard) Q_IMPORT_PLUGIN(JamiAccountView) Q_IMPORT_PLUGIN(JamiCallView) Q_IMPORT_PLUGIN(JamiContactView) Q_IMPORT_PLUGIN(JamiDialView) Q_IMPORT_PLUGIN(JamiTimelineView) Q_IMPORT_PLUGIN(JamiCanvasIndicator) Q_IMPORT_PLUGIN(JamiPhotoSelector) Q_IMPORT_PLUGIN(JamiVideoView) Q_IMPORT_PLUGIN(JamiTroubleshooting) Q_IMPORT_PLUGIN(JamiChatView) Q_IMPORT_PLUGIN(JamiHistoryView) Q_IMPORT_PLUGIN(JamiTimelineBase) Q_IMPORT_PLUGIN(JamiSearch) Q_IMPORT_PLUGIN(JamiAudioPlayer) Q_IMPORT_PLUGIN(GenericUtils) Q_IMPORT_PLUGIN(RingQtQuick) -// Qt plusing -#ifdef false +// Qt plugins +#ifdef USE_STATIC_KF5 + Q_IMPORT_PLUGIN(QtQuickControls2MaterialStylePlugin) Q_IMPORT_PLUGIN(QXcbIntegrationPlugin) Q_IMPORT_PLUGIN(QtQuick2Plugin) - Q_IMPORT_PLUGIN(QtQuickControls1Plugin) Q_IMPORT_PLUGIN(QtQuickControls2Plugin) Q_IMPORT_PLUGIN(QtQuick2WindowPlugin) Q_IMPORT_PLUGIN(QEvdevKeyboardPlugin) Q_IMPORT_PLUGIN(QEvdevMousePlugin) Q_IMPORT_PLUGIN(QtQuickLayoutsPlugin) Q_IMPORT_PLUGIN(QtQuickTemplates2Plugin) Q_IMPORT_PLUGIN(QJpegPlugin) - //Q_IMPORT_PLUGIN(QJpegPlugin) Q_IMPORT_PLUGIN(QSvgPlugin) Q_IMPORT_PLUGIN(QSvgIconPlugin) Q_IMPORT_PLUGIN(QXcbGlxIntegrationPlugin) Q_IMPORT_PLUGIN(QtGraphicalEffectsPlugin) Q_IMPORT_PLUGIN(QtGraphicalEffectsPrivatePlugin) Q_IMPORT_PLUGIN(QtQmlModelsPlugin) Q_IMPORT_PLUGIN(KirigamiPlugin) - Q_IMPORT_PLUGIN(QQc2DesktopStylePlugin) +// Q_IMPORT_PLUGIN(QQc2DesktopStylePlugin) #endif #ifdef HAS_ICON_PACK Q_IMPORT_PLUGIN(BreezeIconPack) #endif #if false Q_IMPORT_PLUGIN(DesktopView) #else Q_IMPORT_PLUGIN(BasicView) #endif #ifndef Q_OS_ANDROID Q_IMPORT_PLUGIN(JamiNotification) #endif constexpr static const char version[] = "3.1.0"; #define REGISTER_PLUGIN(name, uri) \ qobject_cast(qt_static_plugin_ ## name().instance())->registerTypes(uri); \ qobject_cast(qt_static_plugin_ ## name().instance())->initializeEngine(&engine, uri); int main(int argc, char **argv) { //QQmlDebuggingEnabler enabler; +#ifdef USE_STATIC_KF5 + // In static mode, any "QML2_IMPORT_PATH" will probably have components built + // using a different version of Qt. This is unsuported and will crash + qputenv("QML2_IMPORT_PATH" , "imaginary"); + qputenv("XDG_CURRENT_DESKTOP", "imaginary"); +#endif + QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QApplication app(argc, argv); QQmlApplicationEngine engine; KLocalizedString::setApplicationDomain("ring-kde"); +#ifdef USE_STATIC_KF5 + qobject_cast(qt_static_plugin_KirigamiPlugin().instance())->registerTypes("org.kde.kirigami"); +#endif //FIXME remove #ifdef KQUICKITEMVIEWS_USE_STATIC_PLUGIN qobject_cast(qt_static_plugin_KQuickItemViews().instance())->registerTypes("org.kde.playground.kquickitemviews"); #else KQuickItemViews v; v.registerTypes("org.kde.playground.kquickitemviews"); #endif // The order is important REGISTER_PLUGIN(JamiKDEIntegration, "org.kde.ringkde.jamikdeintegration") REGISTER_PLUGIN(RingQtQuick, "net.lvindustries.ringqtquick") // The order is not important REGISTER_PLUGIN(GenericUtils, "org.kde.ringkde.genericutils") REGISTER_PLUGIN(JamiWizard, "org.kde.ringkde.jamiwizard") REGISTER_PLUGIN(JamiAccountView, "org.kde.ringkde.jamiaccountview") REGISTER_PLUGIN(JamiCallView, "org.kde.ringkde.jamicallview") REGISTER_PLUGIN(JamiContactView, "org.kde.ringkde.jamicontactview") REGISTER_PLUGIN(JamiDialView, "org.kde.ringkde.jamidialview") REGISTER_PLUGIN(JamiTimelineView, "org.kde.ringkde.jamitimeline") REGISTER_PLUGIN(JamiCanvasIndicator, "org.kde.ringkde.jamicanvasindicator") REGISTER_PLUGIN(JamiPhotoSelector, "org.kde.ringkde.jamiphotoselector") REGISTER_PLUGIN(JamiVideoView, "org.kde.ringkde.jamivideoview") REGISTER_PLUGIN(JamiTroubleshooting, "org.kde.ringkde.jamitroubleshooting") REGISTER_PLUGIN(JamiTimelineBase, "org.kde.ringkde.jamitimelinebase") REGISTER_PLUGIN(JamiSearch, "org.kde.ringkde.jamisearch") REGISTER_PLUGIN(JamiHistoryView, "org.kde.ringkde.jamihistoryview") REGISTER_PLUGIN(JamiChatView, "org.kde.ringkde.jamichatview") REGISTER_PLUGIN(JamiAudioPlayer, "org.kde.ringkde.jamiaudioplayer") #ifndef Q_OS_ANDROID REGISTER_PLUGIN(JamiNotification, "org.kde.ringkde.jaminotification") #endif #if false REGISTER_PLUGIN(DesktopView, "org.kde.ringkde.desktopview") #else REGISTER_PLUGIN(BasicView, "org.kde.ringkde.basicview") #endif - KDeclarative::KDeclarative d; d.setDeclarativeEngine(&engine); KAboutData about(QStringLiteral("ring-kde"), i18n("ring-kde"), /*QStringLiteral(*/version/*)*/, i18n("RING, a secured and distributed communication software"), KAboutLicense::GPL_V3, i18n("(C) 2004-2015 Savoir-faire Linux\n2016-2017 Emmanuel Lepage Vallee\n2017-2019 Blue Systems"), QString(), QStringLiteral("http://www.ring.cx"), QStringLiteral("ring@gnu.org") ); about.setOrganizationDomain(QByteArray("kde.org")); about.setProgramLogo(QImage(QStringLiteral(":appicon/icons/64-apps-ring-kde.png"))); about.addAuthor( i18n( "Emmanuel Lepage-Vallée" ), QString(), QStringLiteral("elv1313@gmail.com" )); about.addAuthor( i18n( "Alexandre Lision" ), QString(), QStringLiteral("alexandre.lision@savoirfairelinux.com")); about.addCredit( i18n( "Based on the SFLphone teamworks" ), QString(), QString() ); KAboutData::setApplicationData(about); KCrash::initialize(); app.setOrganizationDomain(QStringLiteral("kde.org")); #if false engine.load(QUrl(QStringLiteral("qrc:/desktopview/qml/desktopwindow.qml"))); #else engine.load(QUrl(QStringLiteral("qrc:/basicview/qml/basic.qml"))); #endif const int retVal = app.exec(); ConfigurationSkeleton::self()->save(); return retVal; } // kate: space-indent on; indent-width 4; replace-tabs on;