blob: 62886b7269717ddd6a56573f9cf2e0e065a2ebbf (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
|
// Copyright (C) 2021 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
import QtQuick
import QtQuick.Window
import QtQuick.Controls
import QtWayland.Compositor
WaylandOutput {
id: output
property ListModel shellSurfaces: ListModel {}
property bool isNestedCompositor: Qt.platform.pluginName.startsWith("wayland") || Qt.platform.pluginName === "xcb"
property int currentActiveWindow: -1
function handleShellSurface(shellSurface) {
shellSurfaces.append({shellSurface: shellSurface});
}
// During development, it can be useful to start the compositor inside X11 or
// another Wayland compositor. In such cases, set sizeFollowsWindow to true to
// enable resizing of the compositor window to be forwarded to the Wayland clients
// as the output (screen) changing resolution. Consider setting it to false if you
// are running the compositor using eglfs, linuxfb or similar QPA backends.
sizeFollowsWindow: output.isNestedCompositor
window: Window {
width: 1920
height: 1080
visible: true
WaylandMouseTracker {
id: mouseTracker
anchors.fill: parent
// Set this to false to disable the outer mouse cursor when running nested
// compositors. Otherwise you would see two mouse cursors, one for each compositor.
windowSystemCursorEnabled: output.isNestedCompositor
Image {
id: background
anchors.fill: parent
fillMode: Image.Tile
source: "qrc:/images/background.jpg"
smooth: true
Repeater {
id: chromeRepeater
model: output.shellSurfaces
// Chrome displays a shell surface on the screen (See Chrome.qml)
Chrome {
shellSurface: modelData
onDestroyAnimationFinished:
{
if (currentActiveWindow > index) {
--currentActiveWindow
} else if (currentActiveWindow === index) {
currentActiveWindow = index - 1
if (currentActiveWindow >= 0) {
var nextActiveSurface = output.shellSurfaces.get(currentActiveWindow).shellSurface
if (nextActiveSurface !== undefined) // More than one surface can get destroyed at the same time
nextActiveSurface.active = true
}
}
output.shellSurfaces.remove(index)
}
onDeactivated: {
if (index === currentActiveWindow)
currentActiveWindow = -1
}
onActivated: {
if (index !== currentActiveWindow && currentActiveWindow >= 0) {
// This may already have been destroyed
if (output.shellSurfaces.get(currentActiveWindow).shellSurface !== undefined)
output.shellSurfaces.get(currentActiveWindow).shellSurface.active = false
}
currentActiveWindow = index
}
}
}
}
Rectangle {
anchors.fill: taskbar
color: "lavenderblush"
}
Row {
id: taskbar
height: 40
anchors.left: parent.left
anchors.right: parent.right
anchors.bottom: parent.bottom
Repeater {
anchors.fill: parent
model: output.shellSurfaces
ToolButton {
anchors.verticalCenter: parent.verticalCenter
text: modelData.windowTitle
onClicked: {
modelData.requestWindowGeometry(modelData.windowState & ~Qt.WindowMinimized,
modelData.windowGeometry)
chromeRepeater.itemAt(index).activate()
}
}
}
}
Item {
id: usableArea
anchors.top: parent.top
anchors.left: parent.left
anchors.right: parent.right
anchors.bottom: taskbar.top
}
// Virtual Keyboard
Loader {
anchors.fill: parent
source: "Keyboard.qml"
}
// Draws the mouse cursor for a given Wayland seat
WaylandCursorItem {
inputEventsEnabled: false
x: mouseTracker.mouseX
y: mouseTracker.mouseY
seat: output.compositor.defaultSeat
}
}
Shortcut {
sequence: "Ctrl+Alt+Backspace"
onActivated: Qt.quit()
}
}
}
|