kscreenosd quicksetting

This quicksetting plugion allows the user to open the KScreen OSD which
makes it easy to reconfigure a multiscreen setup. It's only available
when more than one monitor is connected.

Signed-off-by: Sebastian Kügler <sebas@kde.org>
This commit is contained in:
Sebastian Kügler 2025-08-05 16:34:14 +02:00
parent c3ae6650ed
commit b849fb98ab
10 changed files with 203 additions and 0 deletions

View file

@ -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(donotdisturb org.kde.plasma.quicksetting.donotdisturb quicksettings)
plasma_install_package(autohidepanels org.kde.plasma.quicksetting.autohidepanels quicksettings) plasma_install_package(autohidepanels org.kde.plasma.quicksetting.autohidepanels quicksettings)
plasma_install_package(keyboardtoggle org.kde.plasma.quicksetting.keyboardtoggle 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(mobiledata org.kde.plasma.quicksetting.mobiledata quicksettings)
plasma_install_package(settingsapp org.kde.plasma.quicksetting.settingsapp quicksettings) plasma_install_package(settingsapp org.kde.plasma.quicksetting.settingsapp quicksettings)
plasma_install_package(waydroid org.kde.plasma.quicksetting.waydroid quicksettings) plasma_install_package(waydroid org.kde.plasma.quicksetting.waydroid quicksettings)
plasma_install_package(wifi org.kde.plasma.quicksetting.wifi quicksettings) plasma_install_package(wifi org.kde.plasma.quicksetting.wifi quicksettings)
plasma_install_package(hotspot org.kde.plasma.quicksetting.hotspot quicksettings) plasma_install_package(hotspot org.kde.plasma.quicksetting.hotspot quicksettings)
add_subdirectory(flashlight) add_subdirectory(flashlight)
add_subdirectory(kscreenosd)
add_subdirectory(nightcolor) add_subdirectory(nightcolor)
add_subdirectory(powermenu) add_subdirectory(powermenu)
# TODO: Disable screen recording quick setting, as it does not work properly # TODO: Disable screen recording quick setting, as it does not work properly

View file

@ -0,0 +1,27 @@
# SPDX-FileCopyrightText: 2025 Sebastian Kügler <sebas@kde.org>
# 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)

View file

@ -0,0 +1,8 @@
#! /usr/bin/env bash
# SPDX-FileCopyrightText: 2025 Sebastian Kügler <sebas@kde.org>
# 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

View file

@ -0,0 +1,20 @@
// SPDX-FileCopyrightText: 2025 Sebastian Kügler <sebas@kde.org>
// SPDX-License-Identifier: GPL-2.0-or-later
#include "kscreenosdplugin.h"
#include <QQmlContext>
#include <QQuickItem>
#include "kscreenosdutil.h"
void KScreenOSDPlugin::registerTypes(const char *uri)
{
Q_ASSERT(QLatin1String(uri) == QLatin1String("org.kde.plasma.quicksetting.kscreenosd"));
qmlRegisterSingletonType<KScreenOSDUtil>(uri, 1, 0, "KScreenOSDUtil", [](QQmlEngine *, QJSEngine *) {
return new KScreenOSDUtil;
});
}
//#include "moc_screenrotationplugin.cpp"

View file

@ -0,0 +1,18 @@
// SPDX-FileCopyrightText: 2025 Sebastian Kügler <sebas@kde.org>
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include <QUrl>
#include <QQmlEngine>
#include <QQmlExtensionPlugin>
class KScreenOSDPlugin : public QQmlExtensionPlugin
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
public:
void registerTypes(const char *uri) override;
};

View file

@ -0,0 +1,53 @@
// SPDX-FileCopyrightText: 2025 Sebastian Kügler <sebas@kde.org>
// SPDX-License-Identifier: GPL-2.0-or-later
#include "kscreenosdutil.h"
#include <kscreen/configmonitor.h>
#include <kscreen/getconfigoperation.h>
#include <kscreen/output.h>
#include <QDebug>
#include <QDBusInterface>
#include <QDBusReply>
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<KScreen::GetConfigOperation *>(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);
}

View file

@ -0,0 +1,29 @@
// SPDX-FileCopyrightText: 2025 Sebastian Kügler <sebas@kde.org>
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include <QObject>
#include <kscreen/config.h>
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};
};

View file

@ -0,0 +1,22 @@
// SPDX-FileCopyrightText: 2025 Sebastian Kügler <sebas@kde.org>
// 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();
}
}

View file

@ -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"
}
}

View file

@ -0,0 +1,7 @@
# SPDX-FileCopyrightText: 2025 Sebastian Kügler <sebas@kde.org>
# SPDX-License-Identifier: GPL-2.0-or-later
module org.kde.plasma.quicksetting.kscreenosd
plugin kscreenosdplugin
classname KScreenOSDPlugin