diff --git a/CMakeLists.txt b/CMakeLists.txt index bf39b9f1..edef64cd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,82 +1,84 @@ cmake_minimum_required(VERSION 3.0) project(PowerDevil) set(PROJECT_VERSION "5.12.80") set(PROJECT_VERSION_MAJOR 5) set(QT_MIN_VERSION "5.9.0") set(KF5_MIN_VERSION "5.42.0") find_package(ECM ${KF5_MIN_VERSION} REQUIRED NO_MODULE) set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH} ${ECM_KDE_MODULE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/cmake) include(FeatureSummary) include(KDEInstallDirs) include(KDECMakeSettings) include(KDECompilerSettings NO_POLICY_SCOPE) # require at least gcc 4.8 if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") if ("${CMAKE_CXX_COMPILER_VERSION}" VERSION_LESS "4.8") message(SEND_ERROR "Version ${CMAKE_CXX_COMPILER_VERSION} of the ${CMAKE_CXX_COMPILER_ID} C++ compiler is not supported. Please use version 4.8 or later.") endif() endif() find_package(Qt5 ${QT_MIN_VERSION} CONFIG REQUIRED COMPONENTS Widgets DBus X11Extras) find_package(KF5 ${KF5_MIN_VERSION} REQUIRED COMPONENTS Activities Auth IdleTime Config DBusAddons Solid I18n GlobalAccel KIO NotifyConfig KDELibs4Support Wayland) find_package(KF5Screen CONFIG REQUIRED) find_package(LibKWorkspace CONFIG REQUIRED) find_package(KF5BluezQt ${KF5_MIN_VERSION}) set_package_properties(KF5BluezQt PROPERTIES DESCRIPTION "Qt wrapper for BlueZ 5 DBus API" TYPE OPTIONAL PURPOSE "Support for wireless energy saving actions" ) find_package(KF5NetworkManagerQt ${KF5_MIN_VERSION}) set_package_properties(KF5NetworkManagerQt PROPERTIES DESCRIPTION "Qt wrapper for NetworkManager API" TYPE OPTIONAL PURPOSE "Support for wireless energy saving actions" ) set(HAVE_WIRELESS_SUPPORT FALSE) if(KF5NetworkManagerQt_FOUND AND KF5BluezQt_FOUND) set(HAVE_WIRELESS_SUPPORT TRUE) endif() add_feature_info( "Wireless power saving" HAVE_WIRELESS_SUPPORT "Support turning off signal-transmitting devices to save energy" ) +find_package(LibKWorkspace ${PROJECT_VERSION} REQUIRED) + find_package(UDev REQUIRED) find_package(XCB REQUIRED COMPONENTS XCB RANDR DPMS) option(WITH_DDCUTIL "DDCUtil library support" OFF) if(WITH_DDCUTIL) find_package(DDCUtil REQUIRED) set_package_properties(DDCUtil PROPERTIES DESCRIPTION "DDCUtil library support" TYPE OPTIONAL PURPOSE "Set monitor settings over DDC/CI channel" ) else() add_feature_info("DDCUtil" "Off" "DDCUtil library support is disabled by default as recomemded by authors, add -DWITH_DDCUTIL=On to enable") endif() include_directories ( ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/daemon ) add_definitions(-DQT_NO_KEYWORDS) add_subdirectory(daemon) add_subdirectory(kcmodule) add_subdirectory(doc) install( FILES powerdevil.notifyrc DESTINATION ${KDE_INSTALL_KNOTIFY5RCDIR} ) feature_summary(WHAT ALL INCLUDE_QUIET_PACKAGES FATAL_ON_MISSING_REQUIRED_PACKAGES) diff --git a/daemon/CMakeLists.txt b/daemon/CMakeLists.txt index 8cdcdc12..eed1fab7 100644 --- a/daemon/CMakeLists.txt +++ b/daemon/CMakeLists.txt @@ -1,158 +1,159 @@ add_definitions(-DTRANSLATION_DOMAIN=\"powerdevil\" -DQT_USE_QSTRINGBUILDER) include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}) add_subdirectory(actions) set(POWERDEVIL_CORE_VERSION_MAJOR 2) set(POWERDEVIL_CORE_VERSION_MINOR 0) set(POWERDEVIL_CORE_VERSION_MICRO 0) set(POWERDEVIL_CORE_VERSION_STRING ${POWERDEVIL_CORE_VERSION_MAJOR}.${POWERDEVIL_CORE_VERSION_MINOR}.${POWERDEVIL_CORE_VERSION_MICRO}) # Add bundled actions set(powerdevil_bundled_actions_SRCS powerdevil_debug.cpp actions/bundled/suspendsession.cpp actions/bundled/brightnesscontrol.cpp actions/bundled/keyboardbrightnesscontrol.cpp actions/bundled/dimdisplay.cpp actions/bundled/runscript.cpp actions/bundled/handlebuttonevents.cpp ) if(HAVE_WIRELESS_SUPPORT) set(powerdevil_bundled_actions_SRCS ${powerdevil_bundled_actions_SRCS} actions/bundled/wirelesspowersaving.cpp ) endif() # target no.1 - powerdevil core library set(powerdevilcore_SRCS powerdevil_debug.cpp powerdevilaction.cpp powerdevilactionpool.cpp powerdevilbackendinterface.cpp powerdevilcore.cpp powerdevilpolicyagent.cpp powerdevilprofilegenerator.cpp powerdevilbrightnesslogic.cpp powerdevilscreenbrightnesslogic.cpp powerdevilkeyboardbrightnesslogic.cpp brightnessosdwidget.cpp kwinkscreenhelpereffect.cpp ) kconfig_add_kcfg_files(powerdevilcore_SRCS ../PowerDevilSettings.kcfgc) # Action DBus Adaptors qt5_add_dbus_adaptor(powerdevilcore_SRCS actions/bundled/org.kde.Solid.PowerManagement.Actions.BrightnessControl.xml actions/bundled/brightnesscontrol.h PowerDevil::BundledActions::BrightnessControl) qt5_add_dbus_adaptor(powerdevilcore_SRCS actions/bundled/org.kde.Solid.PowerManagement.Actions.KeyboardBrightnessControl.xml actions/bundled/keyboardbrightnesscontrol.h PowerDevil::BundledActions::KeyboardBrightnessControl) qt5_add_dbus_adaptor(powerdevilcore_SRCS actions/bundled/org.kde.Solid.PowerManagement.Actions.HandleButtonEvents.xml actions/bundled/handlebuttonevents.h PowerDevil::BundledActions::HandleButtonEvents) qt5_add_dbus_adaptor(powerdevilcore_SRCS actions/bundled/org.kde.Solid.PowerManagement.Actions.SuspendSession.xml actions/bundled/suspendsession.h PowerDevil::BundledActions::SuspendSession) if(HAVE_WIRELESS_SUPPORT) qt5_add_dbus_adaptor(powerdevilcore_SRCS actions/bundled/org.kde.Solid.PowerManagement.Actions.WirelessPowerSaving.xml actions/bundled/wirelesspowersaving.h PowerDevil::BundledActions::WirelessPowerSaving) endif() qt5_add_dbus_interface(powerdevilcore_SRCS org.freedesktop.ScreenSaver.xml screenlocker_interface) add_library(powerdevilcore SHARED ${powerdevilcore_SRCS} ${powerdevil_bundled_actions_SRCS}) set_target_properties(powerdevilcore PROPERTIES VERSION ${POWERDEVIL_CORE_VERSION_STRING} SOVERSION ${POWERDEVIL_CORE_VERSION_MAJOR}) # not exported, so just make the deps public target_link_libraries(powerdevilcore KF5::Activities KF5::ConfigCore KF5::ConfigGui KF5::DBusAddons KF5::I18n KF5::Solid KF5::IdleTime KF5::GlobalAccel KF5::Screen KF5::Service KF5::WidgetsAddons KF5::Notifications KF5::XmlGui PW::KWorkspace ) if(HAVE_WIRELESS_SUPPORT) target_link_libraries(powerdevilcore KF5::NetworkManagerQt KF5::BluezQt ) endif() if (XCB_FOUND) # kwin kscreen helper effect target_link_libraries(powerdevilcore Qt5::X11Extras XCB::XCB) endif () # target no.2 - powerdevil kded module set(powerdevil_SRCS powerdevil_debug.cpp powerdevilapp.cpp powerdevilfdoconnector.cpp ) # DBus Adaptors qt5_add_dbus_adaptor(powerdevil_SRCS org.kde.Solid.PowerManagement.xml powerdevilcore.h PowerDevil::Core) qt5_add_dbus_adaptor(powerdevil_SRCS org.kde.Solid.PowerManagement.PolicyAgent.xml powerdevilpolicyagent.h PowerDevil::PolicyAgent powermanagementpolicyagentadaptor PowerManagementPolicyAgentAdaptor) qt5_add_dbus_adaptor(powerdevil_SRCS ${KDE4_DBUS_INTERFACES_DIR}/kf5_org.freedesktop.PowerManagement.xml powerdevilfdoconnector.h PowerDevil::FdoConnector powermanagementfdoadaptor PowerManagementFdoAdaptor) qt5_add_dbus_adaptor(powerdevil_SRCS ${KDE4_DBUS_INTERFACES_DIR}/kf5_org.freedesktop.PowerManagement.Inhibit.xml powerdevilfdoconnector.h PowerDevil::FdoConnector powermanagementinhibitadaptor PowerManagementInhibitAdaptor) # Backends add_subdirectory(backends) add_executable(powerdevil ${powerdevil_SRCS}) set_target_properties(powerdevil PROPERTIES OUTPUT_NAME org_kde_powerdevil) configure_file(powerdevil.desktop.cmake ${CMAKE_CURRENT_BINARY_DIR}/powerdevil.desktop) target_link_libraries(powerdevil KF5::Crash KF5::ConfigCore KF5::CoreAddons KF5::I18n KF5::DBusAddons + PW::KWorkspace powerdevilcore ) if (XCB_FOUND) target_link_libraries(powerdevil Qt5::X11Extras) endif () target_link_libraries(powerdevil ${UDEV_LIBS}) install(TARGETS powerdevil DESTINATION ${KDE_INSTALL_FULL_LIBEXECDIR}) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/powerdevil.desktop DESTINATION ${KDE_INSTALL_AUTOSTARTDIR}) install(TARGETS powerdevilcore ${KDE_INSTALL_TARGETS_DEFAULT_ARGS}) # target no.3 - powerdevil ui library set(powerdevilui_SRCS powerdevilactionconfig.cpp ) add_library(powerdevilui ${powerdevilui_SRCS}) set_target_properties(powerdevilui PROPERTIES VERSION ${PROJECT_VERSION} SOVERSION ${PROJECT_VERSION_MAJOR}) # not exported, so just make the deps public target_link_libraries(powerdevilui PUBLIC Qt5::Widgets KF5::ConfigCore ) set(HAVE_XCB ${XCB_FOUND}) configure_file(config-powerdevil.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-powerdevil.h ) install(TARGETS powerdevilui ${KDE_INSTALL_TARGETS_DEFAULT_ARGS}) diff --git a/daemon/powerdevilapp.cpp b/daemon/powerdevilapp.cpp index 98030cb7..e41746c0 100644 --- a/daemon/powerdevilapp.cpp +++ b/daemon/powerdevilapp.cpp @@ -1,207 +1,210 @@ /*************************************************************************** * Copyright (C) 2010 by Dario Freddi * * * * 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 2 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, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * ***************************************************************************/ #include "powerdevilapp.h" #include "powerdevilfdoconnector.h" #include "powermanagementadaptor.h" #include "powermanagementpolicyagentadaptor.h" #include "powerdevilcore.h" #include "powerdevil_debug.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include +#include + PowerDevilApp::PowerDevilApp(int &argc, char **argv) : QGuiApplication(argc, argv) , m_core(nullptr) { migratePre512KeyboardShortcuts(); } PowerDevilApp::~PowerDevilApp() { delete m_core; } void PowerDevilApp::init() { // KGlobal::insertCatalog("powerdevil"); // KAboutData aboutData("powerdevil", "powerdevil", ki18n("KDE Power Management System"), // PROJECT_VERSION, ki18n("KDE Power Management System is PowerDevil, an " // "advanced, modular and lightweight Power Management " // "daemon"), // KAboutData::License_GPL, ki18n("(c) 2010 MetalWorkers Co."), // KLocalizedString(), "http://www.kde.org"); // // aboutData.addAuthor(ki18n( "Dario Freddi" ), ki18n("Maintainer"), "drf@kde.org", // "http://drfav.wordpress.com"); if (QDBusConnection::systemBus().interface()->isServiceRegistered(QLatin1String("org.freedesktop.PowerManagement")) || QDBusConnection::systemBus().interface()->isServiceRegistered(QLatin1String("com.novell.powersave")) || QDBusConnection::systemBus().interface()->isServiceRegistered(QLatin1String("org.freedesktop.Policy.Power"))) { qCCritical(POWERDEVIL) << "KDE Power Management system not initialized, another power manager has been detected"; return; } // not parenting Core to PowerDevilApp as it is the deleted too late on teardown // where the X connection is already lost leading to a a crash (Bug 371127) m_core = new PowerDevil::Core(nullptr/*, KComponentData(aboutData)*/); connect(m_core, SIGNAL(coreReady()), this, SLOT(onCoreReady())); // Before doing anything, let's set up our backend const QStringList paths = QCoreApplication::libraryPaths(); QFileInfoList fileInfos; for (const QString &path : paths) { QDir dir(path + QLatin1String("/kf5/powerdevil/"), QStringLiteral("*"), QDir::SortFlags(QDir::QDir::Name), QDir::NoDotAndDotDot | QDir::Files); fileInfos.append(dir.entryInfoList()); } QFileInfo backendFileInfo; Q_FOREACH (const QFileInfo &f, fileInfos) { if (f.baseName().toLower() == QLatin1String("powerdevilupowerbackend")) { backendFileInfo = f; break; } } QPluginLoader *loader = new QPluginLoader(backendFileInfo.filePath(), m_core); QObject *instance = loader->instance(); if (!instance) { qCDebug(POWERDEVIL) << loader->errorString(); qCCritical(POWERDEVIL) << "KDE Power Management System init failed!"; m_core->loadCore(nullptr); return; } auto interface = qobject_cast(instance); if (!interface) { qCDebug(POWERDEVIL) << "Failed to cast plugin instance to BackendInterface, check your plugin"; qCCritical(POWERDEVIL) << "KDE Power Management System init failed!"; m_core->loadCore(nullptr); return; } qCDebug(POWERDEVIL) << "Backend loaded, loading core"; m_core->loadCore(interface); } void PowerDevilApp::onCoreReady() { qCDebug(POWERDEVIL) << "Core is ready, registering various services on the bus..."; //DBus logic for the core new PowerManagementAdaptor(m_core); new PowerDevil::FdoConnector(m_core); QDBusConnection::sessionBus().registerService(QLatin1String("org.kde.Solid.PowerManagement")); QDBusConnection::sessionBus().registerObject(QLatin1String("/org/kde/Solid/PowerManagement"), m_core); QDBusConnection::systemBus().interface()->registerService("org.freedesktop.Policy.Power"); // Start the Policy Agent service qDBusRegisterMetaType>(); qDBusRegisterMetaType(); new PowerManagementPolicyAgentAdaptor(PowerDevil::PolicyAgent::instance()); QDBusConnection::sessionBus().registerService(QLatin1String("org.kde.Solid.PowerManagement.PolicyAgent")); QDBusConnection::sessionBus().registerObject(QLatin1String("/org/kde/Solid/PowerManagement/PolicyAgent"), PowerDevil::PolicyAgent::instance()); } /* * 5.11 -> 5.12 migrated shortcuts from kded5 to the correct component name org_kde_powerdevil for good reasons however despite a kconfupdate script working correctly and moving the old keys, because kglobalaccel is running whilst we update it synced the old values, and then ignores the powerdevil copy on future loads this removes the old powermanagent entries in the kded5 component at powerdevil startup //which is at runtime where we can talk to kglobalaccel and then re-register ours this method can probably be deleted at some point in the future */ void PowerDevilApp::migratePre512KeyboardShortcuts() { auto configGroup = KSharedConfig::openConfig("powermanagementprofilesrc")->group("migration"); if (!configGroup.hasKey("kdedShortcutMigration")) { const QStringList actionIds({ "Decrease Keyboard Brightness", "Decrease Screen Brightness", "Hibernate", "Increase Keyboard Brightness", "Increase Screen Brightness", "PowerOff", "Sleep", "Toggle Keyboard Backlight" }); for (const QString &actionId: actionIds) { QAction oldAction; oldAction.setObjectName(actionId); oldAction.setProperty("componentName", "kded5"); //claim the old shortcut so we can remove it.. KGlobalAccel::self()->setShortcut(&oldAction, QList(), KGlobalAccel::Autoloading); auto shortcuts = KGlobalAccel::self()->shortcut(&oldAction); KGlobalAccel::self()->removeAllShortcuts(&oldAction); QAction newAction; newAction.setObjectName(actionId); newAction.setProperty("componentName", "org_kde_powerdevil"); if (!shortcuts.isEmpty()) { //register with no autoloading to sync config, we then delete our QAction, and powerdevil will //re-register as normal KGlobalAccel::self()->setShortcut(&newAction, shortcuts, KGlobalAccel::NoAutoloading); } } } configGroup.writeEntry(QStringLiteral("kdedShortcutMigration"), true); configGroup.sync(); } int main(int argc, char **argv) { QGuiApplication::setDesktopSettingsAware(false); + KWorkSpace::detectPlatform(argc, argv); PowerDevilApp app(argc, argv); KDBusService service(KDBusService::Unique); KCrash::setFlags(KCrash::AutoRestart); app.setQuitOnLastWindowClosed(false); app.init(); return app.exec(); }