/* * SPDX-FileCopyrightText: 2015 Marco Martin * * SPDX-License-Identifier: GPL-2.0-or-later */ #include "taskpanel.h" #include #include #include #include #include #include #include #include #include #include #include #include // register type for Keyboards.KWinVirtualKeyboard.forceActivate(); Q_DECLARE_METATYPE(QDBusPendingReply<>) TaskPanel::TaskPanel(QObject *parent, const KPluginMetaData &data, const QVariantList &args) : Plasma::Containment(parent, data, args) { setHasConfigurationInterface(true); initWayland(); qmlRegisterUncreatableType("org.kde.plasma.mobile.taskpanel", 1, 0, "Output", "nope"); // register type for Keyboards.KWinVirtualKeyboard.forceActivate(); qRegisterMetaType>(); connect(this, &Plasma::Containment::locationChanged, this, &TaskPanel::locationChanged); connect(this, &Plasma::Containment::locationChanged, this, [this] { auto l = location(); setFormFactor(l == Plasma::Types::LeftEdge || l == Plasma::Types::RightEdge ? Plasma::Types::Vertical : Plasma::Types::Horizontal); }); } void TaskPanel::initWayland() { if (!QGuiApplication::platformName().startsWith(QLatin1String("wayland"), Qt::CaseInsensitive)) { return; } using namespace KWayland::Client; ConnectionThread *connection = ConnectionThread::fromApplication(this); if (!connection) { return; } auto *registry = new Registry(this); registry->create(connection); connect(registry, &Registry::plasmaShellAnnounced, this, [this, registry](quint32 name, quint32 version) { m_shellInterface = registry->createPlasmaShell(name, version, this); if (!m_panel) { return; } Surface *s = Surface::fromWindow(m_panel); if (!s) { return; } m_shellSurface = m_shellInterface->createSurface(s, this); m_shellSurface->setSkipTaskbar(true); }); registry->setup(); connection->roundtrip(); } QWindow *TaskPanel::panel() { return m_panel; } void TaskPanel::setPanel(QWindow *panel) { if (panel == m_panel) { return; } if (m_panel) { disconnect(m_panel, &QWindow::visibilityChanged, this, &TaskPanel::updatePanelVisibility); } m_panel = panel; connect(m_panel, &QWindow::visibilityChanged, this, &TaskPanel::updatePanelVisibility, Qt::QueuedConnection); Q_EMIT panelChanged(); updatePanelVisibility(); } void TaskPanel::setPanelHeight(qreal height) { if (m_panel) { m_panel->setHeight(height); } } void TaskPanel::updatePanelVisibility() { using namespace KWayland::Client; if (!m_panel->isVisible()) { return; } Surface *s = Surface::fromWindow(m_panel); if (!s) { return; } m_shellSurface = m_shellInterface->createSurface(s, this); if (m_shellSurface) { m_shellSurface->setSkipTaskbar(true); } } void TaskPanel::triggerTaskSwitcher() const { QDBusMessage message = QDBusMessage::createMethodCall("org.kde.kglobalaccel", "/component/kwin", "org.kde.kglobalaccel.Component", "invokeShortcut"); message.setArguments({QStringLiteral("Mobile Task Switcher")}); // this does not block, so it won't necessarily be called before the method returns QDBusConnection::sessionBus().send(message); } K_PLUGIN_CLASS_WITH_JSON(TaskPanel, "package/metadata.json") #include "taskpanel.moc"