diff --git a/quicksettings/CMakeLists.txt b/quicksettings/CMakeLists.txt index 1ee0f50a..a560bdaf 100644 --- a/quicksettings/CMakeLists.txt +++ b/quicksettings/CMakeLists.txt @@ -10,12 +10,14 @@ plasma_install_package(docked org.kde.plasma.quicksetting.docked quicksettings) plasma_install_package(donotdisturb org.kde.plasma.quicksetting.donotdisturb quicksettings) plasma_install_package(autohidepanels org.kde.plasma.quicksetting.autohidepanels quicksettings) plasma_install_package(keyboardtoggle org.kde.plasma.quicksetting.keyboardtoggle quicksettings) +plasma_install_package(kscreenosd org.kde.plasma.quicksetting.kscreenosd quicksettings) plasma_install_package(mobiledata org.kde.plasma.quicksetting.mobiledata quicksettings) plasma_install_package(settingsapp org.kde.plasma.quicksetting.settingsapp quicksettings) plasma_install_package(waydroid org.kde.plasma.quicksetting.waydroid quicksettings) plasma_install_package(wifi org.kde.plasma.quicksetting.wifi quicksettings) plasma_install_package(hotspot org.kde.plasma.quicksetting.hotspot quicksettings) add_subdirectory(flashlight) +add_subdirectory(kscreenosd) add_subdirectory(nightcolor) add_subdirectory(powermenu) # TODO: Disable screen recording quick setting, as it does not work properly diff --git a/quicksettings/kscreenosd/CMakeLists.txt b/quicksettings/kscreenosd/CMakeLists.txt new file mode 100644 index 00000000..c9466517 --- /dev/null +++ b/quicksettings/kscreenosd/CMakeLists.txt @@ -0,0 +1,27 @@ +# SPDX-FileCopyrightText: 2025 Sebastian Kügler +# SPDX-License-Identifier: GPL-2.0-or-later + +set(kscreenosdplugin_SRCS + kscreenosdplugin.cpp + kscreenosdutil.cpp +) + +add_library(kscreenosdplugin ${kscreenosdplugin_SRCS}) + +target_link_libraries(kscreenosdplugin + Qt::Core + Qt::Qml + Qt::Quick + Qt::DBus + KF6::Screen +) + +set_property(TARGET kscreenosdplugin PROPERTY LIBRARY_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/org/kde/plasma/quicksetting/kscreenosd) +file(COPY qmldir DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/org/kde/plasma/quicksetting/kscreenosd) + +install(TARGETS kscreenosdplugin DESTINATION ${KDE_INSTALL_QMLDIR}/org/kde/plasma/quicksetting/kscreenosd) +install(FILES qmldir ${qml_SRC} DESTINATION ${KDE_INSTALL_QMLDIR}/org/kde/plasma/quicksetting/kscreenosd) + +plasma_install_package(package org.kde.plasma.quicksetting.kscreenosd quicksettings) + + diff --git a/quicksettings/kscreenosd/Messages.sh b/quicksettings/kscreenosd/Messages.sh new file mode 100644 index 00000000..3684048d --- /dev/null +++ b/quicksettings/kscreenosd/Messages.sh @@ -0,0 +1,8 @@ +#! /usr/bin/env bash + +# SPDX-FileCopyrightText: 2025 Sebastian Kügler +# SPDX-License-Identifier: GPL-2.0-or-later + + +$XGETTEXT `find . -name \*.js -o -name \*.qml -o -name \*.cpp` -o $podir/plasma_org.kde.plasma.quicksetting.kscreenosd.pot + diff --git a/quicksettings/kscreenosd/kscreenosdplugin.cpp b/quicksettings/kscreenosd/kscreenosdplugin.cpp new file mode 100644 index 00000000..f23b9063 --- /dev/null +++ b/quicksettings/kscreenosd/kscreenosdplugin.cpp @@ -0,0 +1,20 @@ +// SPDX-FileCopyrightText: 2025 Sebastian Kügler +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "kscreenosdplugin.h" + +#include +#include + +#include "kscreenosdutil.h" + +void KScreenOSDPlugin::registerTypes(const char *uri) +{ + Q_ASSERT(QLatin1String(uri) == QLatin1String("org.kde.plasma.quicksetting.kscreenosd")); + + qmlRegisterSingletonType(uri, 1, 0, "KScreenOSDUtil", [](QQmlEngine *, QJSEngine *) { + return new KScreenOSDUtil; + }); +} + +//#include "moc_screenrotationplugin.cpp" diff --git a/quicksettings/kscreenosd/kscreenosdplugin.h b/quicksettings/kscreenosd/kscreenosdplugin.h new file mode 100644 index 00000000..d72f0ccd --- /dev/null +++ b/quicksettings/kscreenosd/kscreenosdplugin.h @@ -0,0 +1,18 @@ +// SPDX-FileCopyrightText: 2025 Sebastian Kügler +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include + +#include +#include + +class KScreenOSDPlugin : public QQmlExtensionPlugin +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface") + +public: + void registerTypes(const char *uri) override; +}; diff --git a/quicksettings/kscreenosd/kscreenosdutil.cpp b/quicksettings/kscreenosd/kscreenosdutil.cpp new file mode 100644 index 00000000..b353aea1 --- /dev/null +++ b/quicksettings/kscreenosd/kscreenosdutil.cpp @@ -0,0 +1,53 @@ +// SPDX-FileCopyrightText: 2025 Sebastian Kügler +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "kscreenosdutil.h" + +#include +#include +#include + +#include +#include +#include + +KScreenOSDUtil::KScreenOSDUtil(QObject *parent) + : QObject{parent} +{ + connect(KScreen::ConfigMonitor::instance(), &KScreen::ConfigMonitor::configurationChanged, this, [this]() { + setOutputs(m_config->outputs().size()); + }); + + connect(new KScreen::GetConfigOperation(), &KScreen::GetConfigOperation::finished, this, [this](auto *op) { + m_config = qobject_cast(op)->config(); + KScreen::ConfigMonitor::instance()->addConfig(m_config); + setOutputs(m_config->outputs().size()); + }); +} + +void KScreenOSDUtil::setOutputs(int _outputs) +{ + if (_outputs != m_outputs) { + m_outputs = _outputs; + Q_EMIT outputsChanged(); + } +} + +int KScreenOSDUtil::outputs() const +{ + return m_outputs; +} + +void KScreenOSDUtil::showKScreenOSD() +{ + // This is equivalent to this call from the command line: + // busctl --user call org.kde.kscreen.osdService /org/kde/kscreen/osdService org.kde.kscreen.osdService showActionSelector + QDBusMessage msg = QDBusMessage::createMethodCall( + "org.kde.kscreen.osdService", // service + "/org/kde/kscreen/osdService", // object path + "org.kde.kscreen.osdService", // interface + "showActionSelector" // method + ); + + auto pendingCall = QDBusConnection::sessionBus().asyncCall(msg); +} diff --git a/quicksettings/kscreenosd/kscreenosdutil.h b/quicksettings/kscreenosd/kscreenosdutil.h new file mode 100644 index 00000000..2e910db7 --- /dev/null +++ b/quicksettings/kscreenosd/kscreenosdutil.h @@ -0,0 +1,29 @@ +// SPDX-FileCopyrightText: 2025 Sebastian Kügler +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include +#include + +class KScreenOSDUtil : public QObject +{ + Q_OBJECT + Q_PROPERTY(int outputs READ outputs WRITE setOutputs NOTIFY outputsChanged); + +public: + KScreenOSDUtil(QObject *parent = nullptr); + + Q_INVOKABLE void showKScreenOSD(); + + int outputs() const; + void setOutputs(int _outputs); + +Q_SIGNALS: + void outputsChanged(); + +private: + KScreen::ConfigPtr m_config{nullptr}; + int m_outputs{0}; + +}; diff --git a/quicksettings/kscreenosd/package/contents/ui/main.qml b/quicksettings/kscreenosd/package/contents/ui/main.qml new file mode 100644 index 00000000..429a50a2 --- /dev/null +++ b/quicksettings/kscreenosd/package/contents/ui/main.qml @@ -0,0 +1,22 @@ +// SPDX-FileCopyrightText: 2025 Sebastian Kügler +// SPDX-License-Identifier: GPL-2.0-or-later + +import QtQuick + +import org.kde.plasma.quicksetting.kscreenosd +import org.kde.plasma.private.mobileshell.quicksettingsplugin as QS + +QS.QuickSetting { + id: kscreenosd_qs + text: i18n("Display Config") + icon: "osd-duplicate" + settingsCommand: "plasma-open-settings kcm_kscreen" + status: i18nc("kscreen osd quicksetting", "Tap to set up") + enabled: false + available: true + + function toggle() { + console.log("Showing KScreen OSD"); + KScreenOSDUtil.showKScreenOSD(); + } +} diff --git a/quicksettings/kscreenosd/package/metadata.json b/quicksettings/kscreenosd/package/metadata.json new file mode 100644 index 00000000..8c33be14 --- /dev/null +++ b/quicksettings/kscreenosd/package/metadata.json @@ -0,0 +1,17 @@ +{ + "KPackageStructure": "KPackage/GenericQML", + "KPlugin": { + "Authors": [ + { + "Email": "sebas@kde.org", + "Name": "Sebastian Kügler" + } + ], + "Description": "Screen setup OSD quick setting for Plasma Mobile", + "Icon": "osd-duplicate", + "Id": "org.kde.plasma.quicksetting.kscreenosd", + "License": "GPL-2.0+", + "Name": "Screen OSD", + "Website": "https://kde.org" + } +} diff --git a/quicksettings/kscreenosd/qmldir b/quicksettings/kscreenosd/qmldir new file mode 100644 index 00000000..806b1600 --- /dev/null +++ b/quicksettings/kscreenosd/qmldir @@ -0,0 +1,7 @@ +# SPDX-FileCopyrightText: 2025 Sebastian Kügler +# SPDX-License-Identifier: GPL-2.0-or-later + +module org.kde.plasma.quicksetting.kscreenosd +plugin kscreenosdplugin +classname KScreenOSDPlugin +