mirror of
https://invent.kde.org/marcoa/shift-shell.git
synced 2026-04-26 14:23:09 +00:00
taskpanel: Extract navbar and task switcher to components/mobileshell
This commit is contained in:
parent
d4c3c29608
commit
2d87bb3e65
18 changed files with 228 additions and 168 deletions
|
|
@ -2,14 +2,19 @@
|
||||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
qt_add_dbus_interfaces(DBUS_SRCS dbus/org.kde.KWin.ScreenShot2.xml
|
qt_add_dbus_interfaces(DBUS_SRCS dbus/org.kde.KWin.ScreenShot2.xml
|
||||||
dbus/org.kde.KScreen.xml)
|
dbus/org.kde.KScreen.xml
|
||||||
|
${KWIN_VIRTUALKEYBOARD_INTERFACE})
|
||||||
|
|
||||||
set(mobileshellplugin_SRCS
|
set(mobileshellplugin_SRCS
|
||||||
mobileshellplugin.cpp
|
mobileshellplugin.cpp
|
||||||
shellutil.cpp
|
shellutil.cpp
|
||||||
quicksettingsmodel.cpp
|
quicksettingsmodel.cpp
|
||||||
|
vkbdinterface.cpp
|
||||||
|
displaysmodel.cpp
|
||||||
|
|
||||||
notifications/notificationthumbnailer.cpp
|
notifications/notificationthumbnailer.cpp
|
||||||
notifications/notificationfilemenu.cpp
|
notifications/notificationfilemenu.cpp
|
||||||
|
|
||||||
${DBUS_SRCS}
|
${DBUS_SRCS}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
||||||
99
components/mobileshell/displaysmodel.cpp
Normal file
99
components/mobileshell/displaysmodel.cpp
Normal file
|
|
@ -0,0 +1,99 @@
|
||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: 2021 Aleix Pol <apol@kde.org>
|
||||||
|
* SPDX-FileCopyrightText: 2021 Devin Lin <devin@kde.org>
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "displaysmodel.h"
|
||||||
|
|
||||||
|
#include <QGuiApplication>
|
||||||
|
|
||||||
|
DisplaysModel::DisplaysModel(QObject *parent)
|
||||||
|
: QAbstractListModel(parent)
|
||||||
|
{
|
||||||
|
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::outputAnnounced, this, [this, registry](quint32 name, quint32 version) {
|
||||||
|
createOutput(registry->bindOutput(name, version));
|
||||||
|
});
|
||||||
|
connect(registry, &Registry::plasmaWindowManagementAnnounced, this, [this, registry](quint32 name, quint32 version) {
|
||||||
|
m_windowManagement = registry->createPlasmaWindowManagement(name, version, this);
|
||||||
|
});
|
||||||
|
|
||||||
|
registry->setup();
|
||||||
|
connection->roundtrip();
|
||||||
|
}
|
||||||
|
|
||||||
|
QHash<int, QByteArray> DisplaysModel::roleNames() const
|
||||||
|
{
|
||||||
|
return {
|
||||||
|
{Model, "modelName"},
|
||||||
|
{Geometry, "geometry"},
|
||||||
|
{Position, "position"},
|
||||||
|
{Output, "output"},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
void DisplaysModel::createOutput(wl_output *output)
|
||||||
|
{
|
||||||
|
auto newOutput = new KWayland::Client::Output(this);
|
||||||
|
connect(newOutput, &KWayland::Client::Output::removed, this, [this, newOutput] {
|
||||||
|
auto i = m_outputs.indexOf(newOutput);
|
||||||
|
Q_ASSERT(i >= 0);
|
||||||
|
beginRemoveRows({}, i, i);
|
||||||
|
m_outputs.removeAt(i);
|
||||||
|
endRemoveRows();
|
||||||
|
});
|
||||||
|
newOutput->setup(output);
|
||||||
|
beginInsertRows({}, m_outputs.count(), m_outputs.count());
|
||||||
|
m_outputs.append(newOutput);
|
||||||
|
endInsertRows();
|
||||||
|
}
|
||||||
|
|
||||||
|
void DisplaysModel::sendWindowToOutput(const QString &uuid, KWayland::Client::Output *output)
|
||||||
|
{
|
||||||
|
const auto windows = m_windowManagement->windows();
|
||||||
|
for (auto w : windows) {
|
||||||
|
if (w->uuid() == uuid) {
|
||||||
|
w->sendToOutput(output);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int DisplaysModel::rowCount(const QModelIndex &parent) const
|
||||||
|
{
|
||||||
|
return parent.isValid() ? 0 : m_outputs.count();
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant DisplaysModel::data(const QModelIndex &index, int role) const
|
||||||
|
{
|
||||||
|
if (index.row() >= m_outputs.count()) {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
auto o = m_outputs[index.row()];
|
||||||
|
switch (role) {
|
||||||
|
case Model:
|
||||||
|
return o->model();
|
||||||
|
case Geometry:
|
||||||
|
return o->geometry();
|
||||||
|
case Position:
|
||||||
|
return o->globalPosition();
|
||||||
|
case Output:
|
||||||
|
return QVariant::fromValue<QObject *>(o);
|
||||||
|
}
|
||||||
|
return {};
|
||||||
|
}
|
||||||
44
components/mobileshell/displaysmodel.h
Normal file
44
components/mobileshell/displaysmodel.h
Normal file
|
|
@ -0,0 +1,44 @@
|
||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: 2021 Aleix Pol <apol@kde.org>
|
||||||
|
* SPDX-FileCopyrightText: 2021 Devin Lin <devin@kde.org>
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QAbstractListModel>
|
||||||
|
#include <QRect>
|
||||||
|
|
||||||
|
#include <KWayland/Client/connection_thread.h>
|
||||||
|
#include <KWayland/Client/output.h>
|
||||||
|
#include <KWayland/Client/plasmashell.h>
|
||||||
|
#include <KWayland/Client/plasmawindowmanagement.h>
|
||||||
|
#include <KWayland/Client/registry.h>
|
||||||
|
#include <KWayland/Client/surface.h>
|
||||||
|
|
||||||
|
class DisplaysModel : public QAbstractListModel
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum Roles {
|
||||||
|
Model = Qt::DisplayRole,
|
||||||
|
Geometry = Qt::UserRole,
|
||||||
|
Position,
|
||||||
|
Output,
|
||||||
|
};
|
||||||
|
|
||||||
|
DisplaysModel(QObject *parent = nullptr);
|
||||||
|
|
||||||
|
void createOutput(wl_output *output);
|
||||||
|
|
||||||
|
Q_INVOKABLE void sendWindowToOutput(const QString &uuid, KWayland::Client::Output *output);
|
||||||
|
|
||||||
|
QHash<int, QByteArray> roleNames() const override;
|
||||||
|
int rowCount(const QModelIndex &parent) const override;
|
||||||
|
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
KWayland::Client::PlasmaWindowManagement *m_windowManagement = nullptr;
|
||||||
|
|
||||||
|
QVector<KWayland::Client::Output *> m_outputs;
|
||||||
|
};
|
||||||
|
|
@ -4,14 +4,18 @@
|
||||||
* SPDX-License-Identifier: GPL-2.0-or-later
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "mobileshellplugin.h"
|
||||||
|
|
||||||
#include <QQmlContext>
|
#include <QQmlContext>
|
||||||
#include <QQuickItem>
|
#include <QQuickItem>
|
||||||
|
|
||||||
#include "mobileshellplugin.h"
|
#include "displaysmodel.h"
|
||||||
#include "notifications/notificationfilemenu.h"
|
#include "notifications/notificationfilemenu.h"
|
||||||
#include "notifications/notificationthumbnailer.h"
|
#include "notifications/notificationthumbnailer.h"
|
||||||
#include "quicksettingsmodel.h"
|
#include "quicksettingsmodel.h"
|
||||||
#include "shellutil.h"
|
#include "shellutil.h"
|
||||||
|
#include "virtualkeyboardinterface.h"
|
||||||
|
#include "vkbdinterface.h"
|
||||||
|
|
||||||
void MobileShellPlugin::registerTypes(const char *uri)
|
void MobileShellPlugin::registerTypes(const char *uri)
|
||||||
{
|
{
|
||||||
|
|
@ -24,6 +28,11 @@ void MobileShellPlugin::registerTypes(const char *uri)
|
||||||
qmlRegisterType<QuickSetting>(uri, 1, 0, "QuickSetting");
|
qmlRegisterType<QuickSetting>(uri, 1, 0, "QuickSetting");
|
||||||
qmlRegisterType<QuickSettingsModel>(uri, 1, 0, "QuickSettingsModel");
|
qmlRegisterType<QuickSettingsModel>(uri, 1, 0, "QuickSettingsModel");
|
||||||
|
|
||||||
|
qmlRegisterType<DisplaysModel>(uri, 1, 0, "DisplaysModel");
|
||||||
|
qmlRegisterSingletonType<OrgKdeKwinVirtualKeyboardInterface>(uri, 1, 0, "KWinVirtualKeyboard", [](QQmlEngine *, QJSEngine *) -> QObject * {
|
||||||
|
return new KwinVirtualKeyboardInterface;
|
||||||
|
});
|
||||||
|
|
||||||
// notifications
|
// notifications
|
||||||
qmlRegisterType<NotificationThumbnailer>(uri, 1, 0, "NotificationThumbnailer");
|
qmlRegisterType<NotificationThumbnailer>(uri, 1, 0, "NotificationThumbnailer");
|
||||||
qmlRegisterType<NotificationFileMenu>(uri, 1, 0, "NotificationFileMenu");
|
qmlRegisterType<NotificationFileMenu>(uri, 1, 0, "NotificationFileMenu");
|
||||||
|
|
|
||||||
|
|
@ -11,13 +11,11 @@ import QtQuick.Window 2.2
|
||||||
import QtGraphicalEffects 1.12
|
import QtGraphicalEffects 1.12
|
||||||
|
|
||||||
import org.kde.taskmanager 0.1 as TaskManager
|
import org.kde.taskmanager 0.1 as TaskManager
|
||||||
import org.kde.plasma.plasmoid 2.0
|
|
||||||
import org.kde.plasma.core 2.0 as PlasmaCore
|
import org.kde.plasma.core 2.0 as PlasmaCore
|
||||||
import org.kde.kquickcontrolsaddons 2.0
|
import org.kde.kquickcontrolsaddons 2.0
|
||||||
|
|
||||||
import org.kde.plasma.private.nanoshell 2.0 as NanoShell
|
import org.kde.plasma.private.nanoshell 2.0 as NanoShell
|
||||||
import org.kde.plasma.private.mobileshell 1.0 as MobileShell
|
import org.kde.plasma.private.mobileshell 1.0 as MobileShell
|
||||||
import org.kde.plasma.phone.taskpanel 1.0 as TaskPanel
|
|
||||||
|
|
||||||
Item {
|
Item {
|
||||||
id: root
|
id: root
|
||||||
|
|
@ -112,7 +110,6 @@ Item {
|
||||||
id: icons
|
id: icons
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
|
|
||||||
visible: plasmoid.configuration.PanelButtonsVisible
|
|
||||||
property real buttonLength: 0
|
property real buttonLength: 0
|
||||||
|
|
||||||
// background colour
|
// background colour
|
||||||
|
|
@ -8,7 +8,6 @@
|
||||||
import QtQuick 2.12
|
import QtQuick 2.12
|
||||||
import QtQuick.Layouts 1.1
|
import QtQuick.Layouts 1.1
|
||||||
|
|
||||||
import org.kde.plasma.plasmoid 2.0
|
|
||||||
import org.kde.plasma.core 2.0 as PlasmaCore
|
import org.kde.plasma.core 2.0 as PlasmaCore
|
||||||
import org.kde.kquickcontrolsaddons 2.0
|
import org.kde.kquickcontrolsaddons 2.0
|
||||||
|
|
||||||
|
|
@ -22,6 +21,7 @@ Item {
|
||||||
property double iconSizeFactor: 1
|
property double iconSizeFactor: 1
|
||||||
property alias iconSource: icon.source
|
property alias iconSource: icon.source
|
||||||
property alias colorGroup: icon.colorGroup
|
property alias colorGroup: icon.colorGroup
|
||||||
|
|
||||||
signal clicked()
|
signal clicked()
|
||||||
|
|
||||||
Rectangle {
|
Rectangle {
|
||||||
|
|
@ -21,9 +21,16 @@ singleton SignalStrengthProvider 1.0 dataproviders/SignalStrengthProvider.qml
|
||||||
singleton VolumeProvider 1.0 dataproviders/VolumeProvider.qml
|
singleton VolumeProvider 1.0 dataproviders/VolumeProvider.qml
|
||||||
singleton WifiProvider 1.0 dataproviders/WifiProvider.qml
|
singleton WifiProvider 1.0 dataproviders/WifiProvider.qml
|
||||||
|
|
||||||
|
# /navigationpanel
|
||||||
|
NavigationPanel 1.0 navigationpanel/NavigationPanel.qml
|
||||||
|
NavigationPanelAction 1.0 navigationpanel/NavigationPanelAction.qml
|
||||||
|
|
||||||
# /statusbar
|
# /statusbar
|
||||||
StatusBar 1.0 statusbar/StatusBar.qml
|
StatusBar 1.0 statusbar/StatusBar.qml
|
||||||
|
|
||||||
|
# /taskswitcher
|
||||||
|
TaskSwitcher 1.0 taskswitcher/TaskSwitcher.qml
|
||||||
|
|
||||||
# /widgets
|
# /widgets
|
||||||
MediaControlsWidget 1.0 widgets/MediaControlsWidget.qml
|
MediaControlsWidget 1.0 widgets/MediaControlsWidget.qml
|
||||||
NotificationsWidget 1.0 widgets/NotificationsWidget.qml
|
NotificationsWidget 1.0 widgets/NotificationsWidget.qml
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ import QtQuick 2.15
|
||||||
import QtQuick.Layouts 1.1
|
import QtQuick.Layouts 1.1
|
||||||
import QtQuick.Window 2.2
|
import QtQuick.Window 2.2
|
||||||
import QtQuick.Controls 2.2 as QQC2
|
import QtQuick.Controls 2.2 as QQC2
|
||||||
import org.kde.plasma.phone.taskpanel 1.0
|
|
||||||
import org.kde.taskmanager 0.1 as TaskManager
|
import org.kde.taskmanager 0.1 as TaskManager
|
||||||
import org.kde.plasma.core 2.0 as PlasmaCore
|
import org.kde.plasma.core 2.0 as PlasmaCore
|
||||||
import org.kde.plasma.components 3.0 as PlasmaComponents
|
import org.kde.plasma.components 3.0 as PlasmaComponents
|
||||||
|
|
@ -18,6 +18,7 @@ Item {
|
||||||
id: delegate
|
id: delegate
|
||||||
|
|
||||||
required property var model
|
required property var model
|
||||||
|
required property var displaysModel
|
||||||
|
|
||||||
readonly property point taskScreenPoint: Qt.point(model.ScreenGeometry.x, model.ScreenGeometry.y)
|
readonly property point taskScreenPoint: Qt.point(model.ScreenGeometry.x, model.ScreenGeometry.y)
|
||||||
readonly property real dragOffset: -control.y
|
readonly property real dragOffset: -control.y
|
||||||
|
|
@ -129,7 +130,7 @@ Item {
|
||||||
|
|
||||||
Repeater {
|
Repeater {
|
||||||
id: rep
|
id: rep
|
||||||
model: plasmoid.nativeInterface.outputs
|
model: displaysModel
|
||||||
delegate: PlasmaComponents.ToolButton {
|
delegate: PlasmaComponents.ToolButton {
|
||||||
Layout.alignment: Qt.AlignVCenter
|
Layout.alignment: Qt.AlignVCenter
|
||||||
text: model.modelName
|
text: model.modelName
|
||||||
|
|
@ -138,7 +139,7 @@ Item {
|
||||||
icon.name: "tv" //TODO provide a more adequate icon
|
icon.name: "tv" //TODO provide a more adequate icon
|
||||||
|
|
||||||
onClicked: {
|
onClicked: {
|
||||||
plasmoid.nativeInterface.sendWindowToOutput(delegate.model.WinIdList[0], model.output)
|
displaysModel.sendWindowToOutput(delegate.model.WinIdList[0], model.output)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -6,8 +6,8 @@
|
||||||
|
|
||||||
import QtQuick 2.0
|
import QtQuick 2.0
|
||||||
import QtQuick.Layouts 1.1
|
import QtQuick.Layouts 1.1
|
||||||
import org.kde.plasma.core 2.0 as PlasmaCore
|
|
||||||
|
|
||||||
|
import org.kde.plasma.core 2.0 as PlasmaCore
|
||||||
|
|
||||||
PlasmaCore.IconItem {
|
PlasmaCore.IconItem {
|
||||||
implicitWidth: PlasmaCore.Units.iconSizes.medium
|
implicitWidth: PlasmaCore.Units.iconSizes.medium
|
||||||
|
|
@ -8,6 +8,7 @@
|
||||||
import QtQuick 2.12
|
import QtQuick 2.12
|
||||||
import QtQuick.Layouts 1.1
|
import QtQuick.Layouts 1.1
|
||||||
import QtQuick.Window 2.2
|
import QtQuick.Window 2.2
|
||||||
|
|
||||||
import org.kde.taskmanager 0.1 as TaskManager
|
import org.kde.taskmanager 0.1 as TaskManager
|
||||||
import org.kde.plasma.core 2.1 as PlasmaCore
|
import org.kde.plasma.core 2.1 as PlasmaCore
|
||||||
import org.kde.plasma.components 3.0 as PlasmaComponents
|
import org.kde.plasma.components 3.0 as PlasmaComponents
|
||||||
|
|
@ -43,8 +44,8 @@ NanoShell.FullScreenOverlay {
|
||||||
property bool wasInActiveTask: false // whether we were in an app before opening the task switcher
|
property bool wasInActiveTask: false // whether we were in an app before opening the task switcher
|
||||||
property bool currentlyDragging: false // whether we are in a swipe up gesture
|
property bool currentlyDragging: false // whether we are in a swipe up gesture
|
||||||
|
|
||||||
Component.onCompleted: plasmoid.nativeInterface.panel = window;
|
property var displaysModel: MobileShell.DisplaysModel {}
|
||||||
|
|
||||||
enum MovementDirection {
|
enum MovementDirection {
|
||||||
None = 0,
|
None = 0,
|
||||||
Left,
|
Left,
|
||||||
|
|
@ -231,6 +232,8 @@ NanoShell.FullScreenOverlay {
|
||||||
width: tasksView.width
|
width: tasksView.width
|
||||||
height: tasksView.height
|
height: tasksView.height
|
||||||
|
|
||||||
|
displaysModel: window.displaysModel
|
||||||
|
|
||||||
// account for header offset (center the preview)
|
// account for header offset (center the preview)
|
||||||
y: -tasksView.taskHeaderHeight / 2
|
y: -tasksView.taskHeaderHeight / 2
|
||||||
|
|
||||||
|
|
@ -273,7 +276,7 @@ NanoShell.FullScreenOverlay {
|
||||||
}
|
}
|
||||||
|
|
||||||
// task panel
|
// task panel
|
||||||
NavigationPanel {
|
MobileShell.NavigationPanel {
|
||||||
id: navPanel
|
id: navPanel
|
||||||
|
|
||||||
property bool isPortrait: Screen.width <= Screen.height
|
property bool isPortrait: Screen.width <= Screen.height
|
||||||
|
|
@ -292,7 +295,7 @@ NanoShell.FullScreenOverlay {
|
||||||
|
|
||||||
Behavior on backgroundColor { ColorAnimation {} }
|
Behavior on backgroundColor { ColorAnimation {} }
|
||||||
|
|
||||||
leftAction: NavigationPanelAction {
|
leftAction: MobileShell.NavigationPanelAction {
|
||||||
enabled: true
|
enabled: true
|
||||||
iconSource: "mobile-task-switcher"
|
iconSource: "mobile-task-switcher"
|
||||||
iconSizeFactor: 0.75
|
iconSizeFactor: 0.75
|
||||||
|
|
@ -305,7 +308,7 @@ NanoShell.FullScreenOverlay {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
middleAction: NavigationPanelAction {
|
middleAction: MobileShell.NavigationPanelAction {
|
||||||
enabled: true
|
enabled: true
|
||||||
iconSource: "start-here-kde"
|
iconSource: "start-here-kde"
|
||||||
iconSizeFactor: 1
|
iconSizeFactor: 1
|
||||||
|
|
@ -315,7 +318,7 @@ NanoShell.FullScreenOverlay {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
rightAction: NavigationPanelAction {
|
rightAction: MobileShell.NavigationPanelAction {
|
||||||
enabled: true
|
enabled: true
|
||||||
iconSource: "mobile-close-app"
|
iconSource: "mobile-close-app"
|
||||||
iconSizeFactor: 0.75
|
iconSizeFactor: 0.75
|
||||||
|
|
@ -7,6 +7,7 @@
|
||||||
import QtQuick 2.0
|
import QtQuick 2.0
|
||||||
import QtQuick.Layouts 1.1
|
import QtQuick.Layouts 1.1
|
||||||
import QtQuick.Window 2.2
|
import QtQuick.Window 2.2
|
||||||
|
|
||||||
import org.kde.taskmanager 0.1 as TaskManager
|
import org.kde.taskmanager 0.1 as TaskManager
|
||||||
|
|
||||||
TaskManager.PipeWireSourceItem {
|
TaskManager.PipeWireSourceItem {
|
||||||
12
components/mobileshell/vkbdinterface.cpp
Normal file
12
components/mobileshell/vkbdinterface.cpp
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: 2021 Aleix Pol <apol@kde.org>
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "vkbdinterface.h"
|
||||||
|
|
||||||
|
KwinVirtualKeyboardInterface::KwinVirtualKeyboardInterface()
|
||||||
|
: OrgKdeKwinVirtualKeyboardInterface(QStringLiteral("org.kde.KWin"), QStringLiteral("/VirtualKeyboard"), QDBusConnection::sessionBus())
|
||||||
|
{
|
||||||
|
}
|
||||||
23
components/mobileshell/vkbdinterface.h
Normal file
23
components/mobileshell/vkbdinterface.h
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: 2021 Aleix Pol <apol@kde.org>
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QDBusConnection>
|
||||||
|
#include <QObject>
|
||||||
|
#include <QString>
|
||||||
|
|
||||||
|
#include <virtualkeyboardinterface.h>
|
||||||
|
|
||||||
|
class KwinVirtualKeyboardInterface : public OrgKdeKwinVirtualKeyboardInterface
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
Q_PROPERTY(bool active READ active WRITE setActive NOTIFY activeChanged)
|
||||||
|
Q_PROPERTY(bool enabled READ enabled WRITE setEnabled NOTIFY enabledChanged)
|
||||||
|
Q_PROPERTY(bool visible READ visible NOTIFY visibleChanged)
|
||||||
|
public:
|
||||||
|
KwinVirtualKeyboardInterface();
|
||||||
|
};
|
||||||
|
|
@ -1,21 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
- SPDX-FileCopyrightText: 2015-2017 Marco Martin <mart@kde.org>
|
|
||||||
- SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
-->
|
|
||||||
|
|
||||||
<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
|
|
||||||
http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
|
|
||||||
<kcfgfile name=""/>
|
|
||||||
|
|
||||||
<group name="General">
|
|
||||||
<entry name="PanelButtonsVisible" type="Bool">
|
|
||||||
<default>true</default>
|
|
||||||
<label>panel chrome visible</label>
|
|
||||||
</entry>
|
|
||||||
</group>
|
|
||||||
|
|
||||||
</kcfg>
|
|
||||||
|
|
@ -21,8 +21,6 @@ import org.kde.plasma.phone.taskpanel 1.0 as TaskPanel
|
||||||
|
|
||||||
PlasmaCore.ColorScope {
|
PlasmaCore.ColorScope {
|
||||||
id: root
|
id: root
|
||||||
width: 600
|
|
||||||
height: 480
|
|
||||||
colorGroup: showingApp ? PlasmaCore.Theme.HeaderColorGroup : PlasmaCore.Theme.ComplementaryColorGroup
|
colorGroup: showingApp ? PlasmaCore.Theme.HeaderColorGroup : PlasmaCore.Theme.ComplementaryColorGroup
|
||||||
|
|
||||||
Plasmoid.backgroundHints: PlasmaCore.Types.NoBackground
|
Plasmoid.backgroundHints: PlasmaCore.Types.NoBackground
|
||||||
|
|
@ -99,14 +97,14 @@ PlasmaCore.ColorScope {
|
||||||
// task switcher
|
// task switcher
|
||||||
Loader {
|
Loader {
|
||||||
id: taskSwitcherLoader
|
id: taskSwitcherLoader
|
||||||
sourceComponent: TaskSwitcher {
|
sourceComponent: MobileShell.TaskSwitcher {
|
||||||
model: tasksModel
|
model: tasksModel
|
||||||
taskPanelHeight: root.state === "portrait" ? root.height : root.width
|
taskPanelHeight: root.state === "portrait" ? root.height : root.width
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// bottom navigation panel
|
// bottom navigation panel
|
||||||
NavigationPanel {
|
MobileShell.NavigationPanel {
|
||||||
id: panel
|
id: panel
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
opacity: (root.taskSwitcher && root.taskSwitcher.visible) ? 0 : 1 // hide bar when task switcher is open
|
opacity: (root.taskSwitcher && root.taskSwitcher.visible) ? 0 : 1 // hide bar when task switcher is open
|
||||||
|
|
@ -117,7 +115,7 @@ PlasmaCore.ColorScope {
|
||||||
dragGestureEnabled: true
|
dragGestureEnabled: true
|
||||||
taskSwitcher: root.taskSwitcher
|
taskSwitcher: root.taskSwitcher
|
||||||
|
|
||||||
leftAction: NavigationPanelAction {
|
leftAction: MobileShell.NavigationPanelAction {
|
||||||
enabled: hasTasks
|
enabled: hasTasks
|
||||||
iconSource: "mobile-task-switcher"
|
iconSource: "mobile-task-switcher"
|
||||||
iconSizeFactor: 0.75
|
iconSizeFactor: 0.75
|
||||||
|
|
@ -128,22 +126,22 @@ PlasmaCore.ColorScope {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
middleAction: NavigationPanelAction {
|
middleAction: MobileShell.NavigationPanelAction {
|
||||||
enabled: true
|
enabled: true
|
||||||
iconSource: "start-here-kde"
|
iconSource: "start-here-kde"
|
||||||
iconSizeFactor: 1
|
iconSizeFactor: 1
|
||||||
onTriggered: root.triggerHomescreen()
|
onTriggered: root.triggerHomescreen()
|
||||||
}
|
}
|
||||||
|
|
||||||
rightAction: NavigationPanelAction {
|
rightAction: MobileShell.NavigationPanelAction {
|
||||||
enabled: TaskPanel.KWinVirtualKeyboard.visible || (plasmoid.nativeInterface.hasCloseableActiveWindow && !taskSwitcher.visible)
|
enabled: MobileShell.KWinVirtualKeyboard.visible || (plasmoid.nativeInterface.hasCloseableActiveWindow && !taskSwitcher.visible)
|
||||||
// mobile-close-app (from plasma-frameworks) seems to have less margins than icons from breeze-icons
|
// mobile-close-app (from plasma-frameworks) seems to have less margins than icons from breeze-icons
|
||||||
iconSizeFactor: TaskPanel.KWinVirtualKeyboard.visible ? 1 : 0.75
|
iconSizeFactor: MobileShell.KWinVirtualKeyboard.visible ? 1 : 0.75
|
||||||
iconSource: TaskPanel.KWinVirtualKeyboard.visible ? "go-down-symbolic" : "mobile-close-app"
|
iconSource: MobileShell.KWinVirtualKeyboard.visible ? "go-down-symbolic" : "mobile-close-app"
|
||||||
|
|
||||||
onTriggered: {
|
onTriggered: {
|
||||||
if (TaskPanel.KWinVirtualKeyboard.active) {
|
if (MobileShell.KWinVirtualKeyboard.active) {
|
||||||
TaskPanel.KWinVirtualKeyboard.active = false;
|
MobileShell.KWinVirtualKeyboard.active = false;
|
||||||
} else if (plasmoid.nativeInterface.hasCloseableActiveWindow) {
|
} else if (plasmoid.nativeInterface.hasCloseableActiveWindow) {
|
||||||
var index = taskSwitcher.model.activeTask;
|
var index = taskSwitcher.model.activeTask;
|
||||||
if (index) {
|
if (index) {
|
||||||
|
|
|
||||||
|
|
@ -24,95 +24,10 @@
|
||||||
static const QString s_kwinService = QStringLiteral("org.kde.KWin");
|
static const QString s_kwinService = QStringLiteral("org.kde.KWin");
|
||||||
constexpr int ACTIVE_WINDOW_UPDATE_INVERVAL = 250;
|
constexpr int ACTIVE_WINDOW_UPDATE_INVERVAL = 250;
|
||||||
|
|
||||||
class OutputsModel : public QAbstractListModel
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
enum Roles {
|
|
||||||
Model = Qt::DisplayRole,
|
|
||||||
Geometry = Qt::UserRole,
|
|
||||||
Position,
|
|
||||||
Output,
|
|
||||||
};
|
|
||||||
|
|
||||||
OutputsModel(QObject *parent)
|
|
||||||
: QAbstractListModel(parent)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QHash<int, QByteArray> roleNames() const override
|
|
||||||
{
|
|
||||||
return {
|
|
||||||
{Model, "modelName"},
|
|
||||||
{Geometry, "geometry"},
|
|
||||||
{Position, "position"},
|
|
||||||
{Output, "output"},
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
void createOutput(wl_output *output)
|
|
||||||
{
|
|
||||||
auto newOutput = new KWayland::Client::Output(this);
|
|
||||||
connect(newOutput, &KWayland::Client::Output::removed, this, [this, newOutput] {
|
|
||||||
auto i = m_outputs.indexOf(newOutput);
|
|
||||||
Q_ASSERT(i >= 0);
|
|
||||||
beginRemoveRows({}, i, i);
|
|
||||||
m_outputs.removeAt(i);
|
|
||||||
endRemoveRows();
|
|
||||||
});
|
|
||||||
newOutput->setup(output);
|
|
||||||
beginInsertRows({}, m_outputs.count(), m_outputs.count());
|
|
||||||
m_outputs.append(newOutput);
|
|
||||||
endInsertRows();
|
|
||||||
}
|
|
||||||
|
|
||||||
int rowCount(const QModelIndex &parent) const override
|
|
||||||
{
|
|
||||||
return parent.isValid() ? 0 : m_outputs.count();
|
|
||||||
}
|
|
||||||
|
|
||||||
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override
|
|
||||||
{
|
|
||||||
if (index.row() >= m_outputs.count()) {
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
|
|
||||||
auto o = m_outputs[index.row()];
|
|
||||||
switch (role) {
|
|
||||||
case Model:
|
|
||||||
return o->model();
|
|
||||||
case Geometry:
|
|
||||||
return o->geometry();
|
|
||||||
case Position:
|
|
||||||
return o->globalPosition();
|
|
||||||
case Output:
|
|
||||||
return QVariant::fromValue<QObject *>(o);
|
|
||||||
}
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
QVector<KWayland::Client::Output *> m_outputs;
|
|
||||||
};
|
|
||||||
|
|
||||||
// helper class to expose the NOTIFY in the properties
|
|
||||||
class KwinVirtualKeyboardInterface : public OrgKdeKwinVirtualKeyboardInterface
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
Q_PROPERTY(bool active READ active WRITE setActive NOTIFY activeChanged)
|
|
||||||
Q_PROPERTY(bool enabled READ enabled WRITE setEnabled NOTIFY enabledChanged)
|
|
||||||
Q_PROPERTY(bool visible READ visible NOTIFY visibleChanged)
|
|
||||||
public:
|
|
||||||
KwinVirtualKeyboardInterface()
|
|
||||||
: OrgKdeKwinVirtualKeyboardInterface(QStringLiteral("org.kde.KWin"), QStringLiteral("/VirtualKeyboard"), QDBusConnection::sessionBus())
|
|
||||||
{
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
TaskPanel::TaskPanel(QObject *parent, const QVariantList &args)
|
TaskPanel::TaskPanel(QObject *parent, const QVariantList &args)
|
||||||
: Plasma::Containment(parent, args)
|
: Plasma::Containment(parent, args)
|
||||||
, m_showingDesktop(false)
|
, m_showingDesktop(false)
|
||||||
, m_windowManagement(nullptr)
|
, m_windowManagement(nullptr)
|
||||||
, m_outputsModel(new OutputsModel(this))
|
|
||||||
{
|
{
|
||||||
setHasConfigurationInterface(true);
|
setHasConfigurationInterface(true);
|
||||||
m_activeTimer = new QTimer(this);
|
m_activeTimer = new QTimer(this);
|
||||||
|
|
@ -122,14 +37,6 @@ TaskPanel::TaskPanel(QObject *parent, const QVariantList &args)
|
||||||
initWayland();
|
initWayland();
|
||||||
|
|
||||||
qmlRegisterUncreatableType<KWayland::Client::Output>("org.kde.plasma.phone.taskpanel", 1, 0, "Output", "nope");
|
qmlRegisterUncreatableType<KWayland::Client::Output>("org.kde.plasma.phone.taskpanel", 1, 0, "Output", "nope");
|
||||||
qmlRegisterUncreatableType<OutputsModel>("org.kde.plasma.phone.taskpanel", 1, 0, "OutputsModel", "nope");
|
|
||||||
qmlRegisterSingletonType<OrgKdeKwinVirtualKeyboardInterface>("org.kde.plasma.phone.taskpanel",
|
|
||||||
1,
|
|
||||||
0,
|
|
||||||
"KWinVirtualKeyboard",
|
|
||||||
[](QQmlEngine *, QJSEngine *) -> QObject * {
|
|
||||||
return new KwinVirtualKeyboardInterface;
|
|
||||||
});
|
|
||||||
|
|
||||||
connect(this, &Plasma::Containment::locationChanged, this, &TaskPanel::locationChanged);
|
connect(this, &Plasma::Containment::locationChanged, this, &TaskPanel::locationChanged);
|
||||||
connect(this, &Plasma::Containment::locationChanged, this, [this] {
|
connect(this, &Plasma::Containment::locationChanged, this, [this] {
|
||||||
|
|
@ -161,9 +68,6 @@ void TaskPanel::initWayland()
|
||||||
}
|
}
|
||||||
auto *registry = new Registry(this);
|
auto *registry = new Registry(this);
|
||||||
registry->create(connection);
|
registry->create(connection);
|
||||||
connect(registry, &Registry::outputAnnounced, m_outputsModel, [this, registry](quint32 name, quint32 version) {
|
|
||||||
m_outputsModel->createOutput(registry->bindOutput(name, version));
|
|
||||||
});
|
|
||||||
connect(registry, &Registry::plasmaWindowManagementAnnounced, this, [this, registry](quint32 name, quint32 version) {
|
connect(registry, &Registry::plasmaWindowManagementAnnounced, this, [this, registry](quint32 name, quint32 version) {
|
||||||
m_windowManagement = registry->createPlasmaWindowManagement(name, version, this);
|
m_windowManagement = registry->createPlasmaWindowManagement(name, version, this);
|
||||||
qRegisterMetaType<QVector<int>>("QVector<int>");
|
qRegisterMetaType<QVector<int>>("QVector<int>");
|
||||||
|
|
@ -174,9 +78,6 @@ void TaskPanel::initWayland()
|
||||||
m_showingDesktop = showing;
|
m_showingDesktop = showing;
|
||||||
emit showingDesktopChanged(m_showingDesktop);
|
emit showingDesktopChanged(m_showingDesktop);
|
||||||
});
|
});
|
||||||
// FIXME
|
|
||||||
// connect(m_windowManagement, &PlasmaWindowManagement::activeWindowChanged, this, &TaskPanel::updateActiveWindow, Qt::QueuedConnection);
|
|
||||||
|
|
||||||
connect(m_windowManagement, &KWayland::Client::PlasmaWindowManagement::activeWindowChanged, m_activeTimer, qOverload<>(&QTimer::start));
|
connect(m_windowManagement, &KWayland::Client::PlasmaWindowManagement::activeWindowChanged, m_activeTimer, qOverload<>(&QTimer::start));
|
||||||
|
|
||||||
m_activeTimer->start();
|
m_activeTimer->start();
|
||||||
|
|
@ -290,21 +191,6 @@ void TaskPanel::closeActiveWindow()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TaskPanel::sendWindowToOutput(const QString &uuid, KWayland::Client::Output *output)
|
|
||||||
{
|
|
||||||
const auto windows = m_windowManagement->windows();
|
|
||||||
for (auto w : windows) {
|
|
||||||
if (w->uuid() == uuid) {
|
|
||||||
w->sendToOutput(output);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QAbstractItemModel *TaskPanel::outputs() const
|
|
||||||
{
|
|
||||||
return m_outputsModel;
|
|
||||||
}
|
|
||||||
|
|
||||||
K_PLUGIN_CLASS_WITH_JSON(TaskPanel, "metadata.json")
|
K_PLUGIN_CLASS_WITH_JSON(TaskPanel, "metadata.json")
|
||||||
|
|
||||||
#include "taskpanel.moc"
|
#include "taskpanel.moc"
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,6 @@ class TaskPanel : public Plasma::Containment
|
||||||
Q_PROPERTY(bool hasCloseableActiveWindow READ hasCloseableActiveWindow NOTIFY hasCloseableActiveWindowChanged)
|
Q_PROPERTY(bool hasCloseableActiveWindow READ hasCloseableActiveWindow NOTIFY hasCloseableActiveWindowChanged)
|
||||||
Q_PROPERTY(QWindow *panel READ panel WRITE setPanel NOTIFY panelChanged)
|
Q_PROPERTY(QWindow *panel READ panel WRITE setPanel NOTIFY panelChanged)
|
||||||
Q_PROPERTY(Plasma::Types::Location location READ location WRITE setLocation NOTIFY locationChanged)
|
Q_PROPERTY(Plasma::Types::Location location READ location WRITE setLocation NOTIFY locationChanged)
|
||||||
Q_PROPERTY(QAbstractItemModel *outputs READ outputs CONSTANT)
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
TaskPanel(QObject *parent, const QVariantList &args);
|
TaskPanel(QObject *parent, const QVariantList &args);
|
||||||
|
|
@ -58,8 +57,6 @@ public:
|
||||||
|
|
||||||
QAbstractItemModel *outputs() const;
|
QAbstractItemModel *outputs() const;
|
||||||
|
|
||||||
Q_INVOKABLE void sendWindowToOutput(const QString &uuid, KWayland::Client::Output *output);
|
|
||||||
|
|
||||||
public Q_SLOTS:
|
public Q_SLOTS:
|
||||||
void forgetActiveWindow();
|
void forgetActiveWindow();
|
||||||
|
|
||||||
|
|
@ -83,7 +80,6 @@ private:
|
||||||
KWayland::Client::PlasmaWindowManagement *m_windowManagement = nullptr;
|
KWayland::Client::PlasmaWindowManagement *m_windowManagement = nullptr;
|
||||||
QPointer<KWayland::Client::PlasmaWindow> m_activeWindow;
|
QPointer<KWayland::Client::PlasmaWindow> m_activeWindow;
|
||||||
QTimer *m_activeTimer;
|
QTimer *m_activeTimer;
|
||||||
OutputsModel *m_outputsModel;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue