From 59b00bdd750217f7fdb4d5ba5115a4f1047b5ad1 Mon Sep 17 00:00:00 2001 From: Paul Olav Tvete Date: Wed, 25 Nov 2015 15:20:28 +0100 Subject: Demo of the new QtWayland compositor API Change-Id: Icc027eb0994240848604bf0311e0d22c3a6d5020 Reviewed-by: Kalle Viironen Reviewed-by: Eskil Abrahamsen Blomfeldt --- wayland/democompositor/democompositor.pro | 19 +++ wayland/democompositor/democompositor.qrc | 10 ++ wayland/democompositor/main.cpp | 60 +++++++ wayland/democompositor/processlauncher.cpp | 62 +++++++ wayland/democompositor/processlauncher.h | 52 ++++++ wayland/democompositor/qml/Chrome.qml | 198 ++++++++++++++++++++++ wayland/democompositor/qml/LaunchButton.qml | 46 +++++ wayland/democompositor/qml/MyButton.qml | 106 ++++++++++++ wayland/democompositor/qml/Screen.qml | 249 ++++++++++++++++++++++++++++ wayland/democompositor/qml/TimedButton.qml | 122 ++++++++++++++ wayland/democompositor/qml/main.qml | 84 ++++++++++ 11 files changed, 1008 insertions(+) create mode 100644 wayland/democompositor/democompositor.pro create mode 100644 wayland/democompositor/democompositor.qrc create mode 100644 wayland/democompositor/main.cpp create mode 100644 wayland/democompositor/processlauncher.cpp create mode 100644 wayland/democompositor/processlauncher.h create mode 100644 wayland/democompositor/qml/Chrome.qml create mode 100644 wayland/democompositor/qml/LaunchButton.qml create mode 100644 wayland/democompositor/qml/MyButton.qml create mode 100644 wayland/democompositor/qml/Screen.qml create mode 100644 wayland/democompositor/qml/TimedButton.qml create mode 100644 wayland/democompositor/qml/main.qml diff --git a/wayland/democompositor/democompositor.pro b/wayland/democompositor/democompositor.pro new file mode 100644 index 0000000..f3e31de --- /dev/null +++ b/wayland/democompositor/democompositor.pro @@ -0,0 +1,19 @@ +QT += gui qml + +SOURCES += \ + main.cpp \ + processlauncher.cpp + +OTHER_FILES = \ + qml/main.qml \ + qml/Screen.qml \ + qml/Chrome.qml \ + qml/LaunchButton.qml \ + qml/MyButton.qml \ + qml/TimedButton.qml + +RESOURCES += democompositor.qrc + +HEADERS += \ + processlauncher.h + diff --git a/wayland/democompositor/democompositor.qrc b/wayland/democompositor/democompositor.qrc new file mode 100644 index 0000000..0e924a9 --- /dev/null +++ b/wayland/democompositor/democompositor.qrc @@ -0,0 +1,10 @@ + + + qml/main.qml + qml/Screen.qml + qml/Chrome.qml + qml/MyButton.qml + qml/LaunchButton.qml + qml/TimedButton.qml + + diff --git a/wayland/democompositor/main.cpp b/wayland/democompositor/main.cpp new file mode 100644 index 0000000..5cc2f22 --- /dev/null +++ b/wayland/democompositor/main.cpp @@ -0,0 +1,60 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include + +#include +#include +#include +#include "processlauncher.h" + +static void registerTypes() +{ + qmlRegisterType("com.theqtcompany.wlprocesslauncher", 1, 0, "ProcessLauncher"); +} + + + +int main(int argc, char *argv[]) +{ + QGuiApplication app(argc, argv); + + registerTypes(); + QQmlApplicationEngine appEngine(QUrl("qrc:///qml/main.qml")); + + return app.exec(); +} diff --git a/wayland/democompositor/processlauncher.cpp b/wayland/democompositor/processlauncher.cpp new file mode 100644 index 0000000..48db12c --- /dev/null +++ b/wayland/democompositor/processlauncher.cpp @@ -0,0 +1,62 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "processlauncher.h" + +#include + +WaylandProcessLauncher::WaylandProcessLauncher(QObject *parent) + : QObject(parent) +{ +} + +WaylandProcessLauncher::~WaylandProcessLauncher() +{ +} + +void WaylandProcessLauncher::launch(const QString &program) +{ + QProcess *process = new QProcess(this); + connect(process, static_cast(&QProcess::finished), + process, &QProcess::deleteLater); + connect(process, &QProcess::errorOccurred, &QProcess::deleteLater); + + QStringList arguments; + arguments << "-platform" << "wayland"; + process->start(program, arguments); + +} + diff --git a/wayland/democompositor/processlauncher.h b/wayland/democompositor/processlauncher.h new file mode 100644 index 0000000..506ee0d --- /dev/null +++ b/wayland/democompositor/processlauncher.h @@ -0,0 +1,52 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef PROCESSLAUNCHER_H +#define PROCESSLAUNCHER_H + +#include + +class WaylandProcessLauncher : public QObject +{ + Q_OBJECT + +public: + explicit WaylandProcessLauncher(QObject *parent = 0); + ~WaylandProcessLauncher(); + Q_INVOKABLE void launch(const QString &program); +}; + +#endif // PROCESSLAUNCHER_H diff --git a/wayland/democompositor/qml/Chrome.qml b/wayland/democompositor/qml/Chrome.qml new file mode 100644 index 0000000..9a7132c --- /dev/null +++ b/wayland/democompositor/qml/Chrome.qml @@ -0,0 +1,198 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 +import QtWayland.Compositor 1.0 +import QtGraphicalEffects 1.0 + +Rectangle { + border.width: 1 + border.color: "#102080" + color: "#1337af" + id: rootChrome + property alias surface: surfaceItem.surface + property alias valid: surfaceItem.valid + property alias explicitlyHidden: surfaceItem.explicitlyHidden + property alias shellSurface: surfaceItem.shellSurface + + property alias destroyAnimation : destroyAnimationImpl + + property int marginWidth : 5 + property int titlebarHeight : 25 + + Item { + anchors.margins: 1 + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + height: titlebarHeight + LinearGradient { + anchors.fill: parent + start: Qt.point(0, 0) + end: Qt.point(0, height) + gradient: Gradient { + GradientStop { position: 0.0; color: "steelblue" } + GradientStop { position: 1.0; color: "#1337af" } + } + } + } + + function requestSize(w, h) { + surfaceItem.requestSize(Qt.size(w - 2 * marginWidth, h - titlebarHeight - marginWidth)) + } + + function toggleVisible() { + surfaceItem.explicitlyHidden = ! surfaceItem.explicitlyHidden + defaultOutput.relayout() + } + + Behavior on x { + NumberAnimation { duration: 300 } + } + Behavior on y { + NumberAnimation { duration: 300 } + } + Behavior on width { + NumberAnimation { duration: 300 } + } + Behavior on height { + NumberAnimation { duration: 300 } + } + + SequentialAnimation { + id: destroyAnimationImpl + ParallelAnimation { + NumberAnimation { target: scaleTransform; property: "yScale"; to: 2/height; duration: 150 } + NumberAnimation { target: scaleTransform; property: "xScale"; to: 0.4; duration: 150 } + } + NumberAnimation { target: scaleTransform; property: "xScale"; to: 0; duration: 150 } + ScriptAction { script: { rootChrome.destroy(); } } + } + + transform: [ + Scale { + id:scaleTransform + origin.x: rootChrome.width / 2 + origin.y: rootChrome.height / 2 + + } + ] + + + WaylandQuickItem { + id: surfaceItem + + anchors.fill: parent + anchors.margins: marginWidth + anchors.topMargin: titlebarHeight + + property bool dead: false + property bool valid: false + property bool explicitlyHidden: false + property var shellSurface: ShellSurface { + } + + + sizeFollowsSurface: false + + onSurfaceDestroyed: { + view.bufferLock = true; + x = 0 + y = 0 + rootChrome.destroyAnimation.start(); + valid = false + dead = true + } + + onValidChanged: comp.defaultOutput.relayout() + + function requestSize(size) { + //console.log("requesting size: " + size) + shellSurface.sendConfigure(size, ShellSurface.DefaultEdge) + } + + onExplicitlyHiddenChanged: { + state = explicitlyHidden ? "HIDDEN" : "SHOWN" + } + + state: "SHOWN" + + states: [ + State { + name: "SHOWN" + PropertyChanges { + target: rootChrome + visible: true + } + }, + State { + name: "HIDDEN" + PropertyChanges { + target: rootChrome + x: 0 + y: 0 + width: 0 + height: 0 + //visible: false + } + } + ] + + transitions: [ + Transition { + from: "SHOWN" + to: "HIDDEN" + SequentialAnimation { + + PauseAnimation {duration: 300} + + PropertyAction {target: rootChrome; property: "visible"; value: false} + ScriptAction {script: rootChrome.requestSize(0,0)} + } + } + ] + + Connections { + target: surface + onSizeChanged: { + valid = !surfaceItem.dead && !surface.cursorSurface && surface.size.width > 0 && surface.size.height > 0 + //console.log(shellSurface.title + " surface size: " + surface.size + " curs: " + surface.cursorSurface + " valid: " + valid) + } + } + + } + +} diff --git a/wayland/democompositor/qml/LaunchButton.qml b/wayland/democompositor/qml/LaunchButton.qml new file mode 100644 index 0000000..a5b1fbc --- /dev/null +++ b/wayland/democompositor/qml/LaunchButton.qml @@ -0,0 +1,46 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.6 + +MyButton { + property string executable + text.text: "Uninitialized" + text.elide: Text.ElideRight + text.maximumLineCount: 1 + + onTriggered: launcher.launch(executable) +} diff --git a/wayland/democompositor/qml/MyButton.qml b/wayland/democompositor/qml/MyButton.qml new file mode 100644 index 0000000..c0ac2bb --- /dev/null +++ b/wayland/democompositor/qml/MyButton.qml @@ -0,0 +1,106 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.6 + +Item { + //property alias color: rect.color + property alias text: buttonText + signal triggered() + signal alternateTrigger() + signal slideTrigger() + property bool enableAlternate: false + property bool enableSlide: false + property bool longPressed: false + + property color buttonColor: "lightgray" + Rectangle { + id: rect + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.left: parent.left + anchors.right: parent.right + + radius: 10 + color: (enableSlide && mouser.drag.active) ? "#df3f1f" : mouser.containsPress ? (longPressed ? "#3faf1f" : "steelblue") : buttonColor + + Text { + anchors.margins: 10 + id: buttonText + anchors.verticalCenter: parent.verticalCenter + anchors.left: parent.left + anchors.right: parent.right + text: "[Uninitialized]" + } + } + + MouseArea { + id: mouser + anchors.fill: parent + + onPressed: { + if (enableSlide) { + rect.anchors.left = undefined + rect.anchors.right = undefined + } + } + + onPressAndHold: if (enableAlternate) parent.longPressed = true + onReleased: { + if (enableSlide && drag.active) { + //console.log("drag end: " + rect.x + " w: " + rect.width) + if (rect.x > rect.width || rect.x < -rect.width*3/4) + parent.slideTrigger() + } else if (containsMouse) { + //console.log("clicked " + mouse.wasHeld + " alt " + enableAlternate) + if (mouse.wasHeld && enableAlternate) + parent.alternateTrigger() + else + parent.triggered() + } + + rect.anchors.left = parent.left + rect.anchors.right = parent.right + parent.longPressed = false + } + + drag.target: rect + drag.threshold: 5 + drag.axis: Drag.XAxis + //drag.maximumX: 0 + drag.minimumX: 0 + } +} diff --git a/wayland/democompositor/qml/Screen.qml b/wayland/democompositor/qml/Screen.qml new file mode 100644 index 0000000..9ab3557 --- /dev/null +++ b/wayland/democompositor/qml/Screen.qml @@ -0,0 +1,249 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.6 +import QtQuick.Window 2.2 +import QtWayland.Compositor 1.0 + +import com.theqtcompany.wlprocesslauncher 1.0 + + +WaylandOutput { + id: output + property alias surfaceArea: background + property var windowList: [ ] + property int hiddenWindowCount + + window: Window { + id: screen + + //flags: Qt.FramelessWindowHint + + property QtObject output + + width: 1024 + height: 760 + visible: true + + ProcessLauncher { + id: launcher + } + + Rectangle { + id: sidebar + + anchors.top: parent.top + anchors.left: parent.left + anchors.bottom: parent.bottom + + property int sidebarWidth : 150 + + width: sidebarWidth + + color: "#6f6d75" + + Column { + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + z: 1 + padding: 5 + spacing: 5 + Repeater { + model: windowList + MyButton { + id: winButton + enableAlternate: true + enableSlide: true + property QtObject winItem: modelData + + height: 30 + width: sidebar.width - 10 + + buttonColor: winItem.explicitlyHidden ? "#8f8f9f" : "lightgray" + + text.maximumLineCount: 1 + text.text: modelData.shellSurface.title.length > 0 ? modelData.shellSurface.title : "Untitled" + text.elide: Text.ElideRight + onTriggered: { + winItem.toggleVisible() + } + onAlternateTrigger: { + //console.log("alt " + winItem + " : " + winItem.shellSurface.surface) + setFullscreen(winItem) + + } + onSlideTrigger: { + //console.log("slide " + winItem + " : " + winItem.shellSurface.surface) + winItem.shellSurface.surface.client.close() + } + } + } + Item { + height: 20 + visible: true + } + MyButton { + height: 50 + width: sidebar.width - 10 + buttonColor: enabled ? "#6fdf7f" : "lightgray" + enabled: windowList.length > 0 && hiddenWindowCount > 0 + text.color: enabled ? "black" : "gray" + text.text: "Show all" + onTriggered: setFullscreen(null) + } + } + + + Column { + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom + padding: 5 + spacing: 5 + + + LaunchButton { + height: 30 + width: sidebar.width - 10 + text.text: "Launch wiggly" + executable: "/tmp/wiggly" + } + LaunchButton { + height: 30 + width: sidebar.width - 10 + text.text: "Launch analog clock" + executable: "/tmp/analogclock" + } + LaunchButton { + height: 30 + width: sidebar.width - 10 + text.text: "Launch digital clock" + executable: "/tmp/digitalclock" + } + TimedButton { + //visible: false + height: 50 + width: sidebar.width - 10 + text: "Quit" + onTriggered: Qt.quit() + } + } + } + + + WaylandMouseTracker { + id: mouseTracker + anchors.top: parent.top + anchors.left: sidebar.right + anchors.right: parent.right + anchors.bottom: parent.bottom + enableWSCursor: true + Rectangle { + id: background + anchors.fill: parent + color: "#8f8d95" + onWidthChanged: output.relayout() + onHeightChanged: output.relayout() + } + } + } + + function setFullscreen(obj) { + var n = windowList.length + for (var i = 0; i < n; i++) { + var child = windowList[i] + child.explicitlyHidden = !(obj === null || child === obj) + } + + relayout(); + } + + function relayout() { + var ch = [] + var vc = [] + var nn = surfaceArea.children.length + var i = 0; + var foundFS = false + var nh = 0; + for (i = 0; i < nn; i++) { + var child = surfaceArea.children[i] + var surf = child.surface + //var valid = child.valid + //surf.size.width > 0 && surf.size.height > 0 && !surf.cursorSurface && child.visible + //console.log(i + " " + child +" valid " + child.valid) + //console.log("surf: " + surf) + if (child.valid) { + ch.push(child) + //console.log(child + " " + child.shellSurface.title) + if (!child.explicitlyHidden) + vc.push(child) + else + nh++ + } + } + windowList = ch + hiddenWindowCount = nh +//console.log("fsw: " + fullscreenWindow + " found: " + foundFS) + + var n = vc.length + var ny = Math.round(Math.sqrt(n)) + var nx = Math.ceil(n/ny) + var extra = nx*ny - n + //console.log(n + ": " + nx + " * " + ny + " extra: " + extra) + + var w = surfaceArea.width / nx; + var x = 0; + i = 0; + for (var ix = 0; ix < nx; ix++) { + var nny = (ix < nx - extra) ? ny : ny - 1; + var h = surfaceArea.height / nny; + var y = 0; + for (var iy = 0; iy < nny; iy++) { + + vc[i].x = x + vc[i].y = y + vc[i].width = w + vc[i].height = h + vc[i].requestSize(w,h) + vc[i].state = "SHOWN" + y += h + i++ + } + x += w + } + } +} diff --git a/wayland/democompositor/qml/TimedButton.qml b/wayland/democompositor/qml/TimedButton.qml new file mode 100644 index 0000000..012875a --- /dev/null +++ b/wayland/democompositor/qml/TimedButton.qml @@ -0,0 +1,122 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.6 + +Rectangle { + id: theButton + + radius: 10 + color: "lightgray" + + property alias text: buttonText.text + signal triggered() + + property int percent : 0 + state: "UNPRESSED" + + states: [ + State { + name: "UNPRESSED" + }, + State { + name: "PRESSED" + } + ] + + transitions: [ Transition { + from: "UNPRESSED" + to: "PRESSED" + NumberAnimation { + target: theButton + property: "percent" + to: 100 + duration: 1500 + } + }, + Transition { + from: "PRESSED" + to: "UNPRESSED" + NumberAnimation { + target: theButton + property: "percent" + to: 0 + duration: 100 + } + } + ] + Rectangle { + radius: 10 + color: "red" + anchors.left: parent.left + anchors.top: parent.top + anchors.bottom: parent.bottom + width: parent.width * percent / 100 + visible: percent > 0 + } + + Text { + id: buttonText + anchors.verticalCenter: parent.verticalCenter + anchors.left: parent.left + anchors.right: parent.right + anchors.margins: 10 + text: "[Uninitialized]" + } + + MouseArea { + id: mouser + anchors.fill: parent + + Timer { + id: timer + interval: 1000 + } + + onPressed: parent.state = "PRESSED" + + onReleased: { + if (containsMouse && parent.percent >= 100) { + parent.triggered() + } + parent.state = "UNPRESSED" + } + + onPositionChanged: { + parent.state = containsMouse ? "PRESSED" : "UNPRESSED" + } + } +} diff --git a/wayland/democompositor/qml/main.qml b/wayland/democompositor/qml/main.qml new file mode 100644 index 0000000..9b91023 --- /dev/null +++ b/wayland/democompositor/qml/main.qml @@ -0,0 +1,84 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 +import QtWayland.Compositor 1.0 + +WaylandCompositor { + id: comp + + property var primarySurfacesArea: null + + Screen { + compositor: comp + } + + Component { + id: chromeComponent + Chrome { + } + } + + Component { + id: surfaceComponent + WaylandSurface { + } + } + + extensions: [ + Shell { + id: defaultShell + + + onCreateShellSurface: { + var item = chromeComponent.createObject(defaultOutput.surfaceArea, { "surface": surface } ); + item.shellSurface.initialize(defaultShell, surface, client, id); + } + + Component.onCompleted: { + initialize(); + } + } + ] + + onCreateSurface: { + var surface = surfaceComponent.createObject(comp, { } ); + surface.initialize(comp, client, id, version); + } + onSurfaceCreated: { + defaultOutput.relayout() + } +} -- cgit v1.2.3