Merge branch 'master' into mck182/tpCaller

This commit is contained in:
Martin Klapetek 2015-06-19 14:05:25 +02:00
commit 297c6500bd
40 changed files with 578 additions and 1188 deletions

View file

@ -25,7 +25,7 @@ include(FeatureSummary)
find_package(Qt5 ${QT_MIN_VERSION} CONFIG REQUIRED Core Gui Widgets Qml Quick Test)
find_package(KF5 ${KF5_MIN_VERSION} REQUIRED COMPONENTS Plasma Service Declarative I18n)
find_package(KF5 ${KF5_MIN_VERSION} REQUIRED COMPONENTS Plasma Service Declarative I18n KIO)
find_package(KF5 REQUIRED COMPONENTS PlasmaQuick DBusAddons Notifications)
find_package(TelepathyQt5 REQUIRED)
find_package(KF5Wayland CONFIG)
@ -38,16 +38,9 @@ feature_summary(WHAT ALL INCLUDE_QUIET_PACKAGES FATAL_ON_MISSING_REQUIRED_PACKAG
include(CheckIncludeFiles)
plasma_install_package(look-and-feel org.kde.satellite.phone look-and-feel)
plasma_install_package(shell org.kde.satellite.phone shells)
install(DIRECTORY wallpaper/ DESTINATION "${WALLPAPER_INSTALL_DIR}/org.kde.satellite.lockers")
install(DIRECTORY compositor/
DESTINATION ${DATA_INSTALL_DIR}/greenisland/org.kde.satellite.compositor.phone
PATTERN .svn EXCLUDE
PATTERN CMakeLists.txt EXCLUDE
PATTERN Messages.sh EXCLUDE
PATTERN dummydata EXCLUDE)
plasma_install_package(look-and-feel org.kde.plasma.phone look-and-feel)
plasma_install_package(shell org.kde.plasma.phone shells)
install(DIRECTORY wallpaper/ DESTINATION "${WALLPAPER_INSTALL_DIR}/org.kde.plasma.phone.lockers")
kpackage_install_package(phonebook org.kde.phone.phonebook genericqml)
install(FILES phonebook/metadata.desktop DESTINATION ${XDG_APPS_INSTALL_DIR} RENAME org.kde.phone.phonebook.desktop)

View file

@ -38,6 +38,6 @@ http://comments.gmane.org/gmane.comp.handhelds.ofono/12178
phonesim -p 12345 -gui /usr/share/phonesim/default.xml
* from the oFono *source* directory, call /test/enable-modem to bring the modem up, the control UI should come up
* call test/online-modem to activate the test phonesim modem
* start plasma with plasmashell -w -p org.kde.satellite.phone to start the phone homescreen in a window
* start plasma with plasmashell -w -p org.kde.plasma.phone to start the phone homescreen in a window
Note that the oFono/phonesim part is necessary only if it's needed to test some part specific to telephony

View file

@ -44,13 +44,6 @@ MouseArea {
}
}
Behavior on height {
NumberAnimation {
easing.type: Easing.InOutQuad
duration: units.longDuration
}
}
onReleased: {
if (drag.active) {
if (x > width / 4 || x < width / -4) {
@ -97,11 +90,8 @@ MouseArea {
PlasmaComponents.Label {
id: appLabel
anchors {
left: parent.left
verticalCenter: parent.verticalCenter
leftMargin: units.gridUnit * 3
}
anchors.leftMargin: units.gridUnit * 3
color: PlasmaCore.ColorScope.textColor
text: model.appName
}
@ -109,36 +99,45 @@ MouseArea {
Column {
id: messageLayout
anchors {
left: appLabel.right
right: icon.left
verticalCenter: parent.verticalCenter
rightMargin: units.smallSpacing
left: parent.left
right: icon.left
leftMargin: units.gridUnit * 3
}
PlasmaComponents.Label {
anchors {
right: parent.right
left: parent.left
}
id: summaryLabel
anchors.right: parent.right
width: messageLayout.width - appLabel.width
horizontalAlignment: Qt.AlignRight
verticalAlignment: Qt.AlignVCenter
text: summary + (!notificationItem.expanded && body ? "..." : "")
wrapMode: Text.WordWrap
}
PlasmaComponents.Label {
id: bodyLabel
anchors {
right: parent.right
left: parent.left
}
visible: notificationItem.expanded && body != undefined && body
visible: height > 0
height: notificationItem.expanded && body != undefined && body ? implicitHeight : 0
clip: true
horizontalAlignment: Qt.AlignRight
verticalAlignment: Qt.AlignVCenter
text: body
wrapMode: Text.WordWrap
Behavior on height {
NumberAnimation {
duration: units.longDuration
easing.type: Easing.InOutQuad
}
}
}
}
PlasmaCore.IconItem {
id: icon
anchors {
@ -174,4 +173,34 @@ MouseArea {
}
}
}
states: [
State {
name: "large"
when: appLabel.width + bodyLabel.paintedWidth < messageLayout.width
AnchorChanges {
target: appLabel
anchors {
verticalCenter: parent.verticalCenter
top: undefined
left: parent.left
}
}
PropertyChanges {
}
},
State {
name: "compact"
when: notificationItem.state != "large"
AnchorChanges {
target: appLabel
anchors {
verticalCenter: undefined
top: messageLayout.top
left: parent.left
}
}
}
]
}

View file

@ -69,7 +69,7 @@ Item {
text: "Wireless"
icon: "network-wireless-on"
enabled: true
settingsCommand: "active-settings -m org.kde.satellite.settings.wifi"
settingsCommand: "active-settings -m org.kde.plasma.phone.settings.wifi"
}
ListElement {
text: "Alarms"

View file

@ -40,4 +40,4 @@ init --user &
mc-tool request ofono/ofono/account0 online
paplay /usr/share/sounds/freedesktop/stereo/message.oga &
exec /usr/bin/plasmashell -p org.kde.satellite.phone 2>/tmp/plasmashell_logs
exec /usr/bin/plasmashell -p org.kde.plasma.phone 2>/tmp/plasmashell_logs

View file

@ -1,75 +0,0 @@
/*
* Copyright 2014 Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as
* published by the Free Software Foundation; either version 2, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Library General Public License for more details
*
* You should have received a copy of the GNU Library General Public
* License along with this program; if not, write to the
* Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
import QtQuick 2.0
import org.kde.plasma.core 2.0 as PlasmaCore
WindowWrapper {
id: window
objectName: "clientWindow"
onXChanged: {
if (compositorRoot.currentWindow == window) {
compositorRoot.layers.windows.contentX = x;
}
}
Behavior on y {
enabled: !mouse.active
SequentialAnimation {
NumberAnimation {
easing.type: "InOutQuad"
duration: units.longDuration
}
ScriptAction {
script: {
if (window.opacity < 0.3) {
window.close();
}
}
}
}
}
opacity: 1 - (Math.abs(y) / height)
MouseArea {
id: mouse
z: 99
anchors.fill: parent
enabled: compositorRoot.layers.windows.switchMode
property bool active
onPressed: {
active = true;
}
onClicked: {
compositorRoot.currentWindow = window;
window.child.takeFocus();
}
onReleased: {
active = false;
if (window.opacity < 0.3) {
window.y = (window.y > 0 ? +1 : -1) * window.height;
} else {
window.y = 0;
}
}
drag {
axis: Drag.YAxis
target: window
}
}
}

View file

@ -1,378 +0,0 @@
/*
* Copyright 2014 Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as
* published by the Free Software Foundation; either version 2, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Library General Public License for more details
*
* You should have received a copy of the GNU Library General Public
* License along with this program; if not, write to the
* Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
import QtQuick 2.0
import QtQuick.Layouts 1.0
import QtQml.Models 2.1
import org.kde.plasma.core 2.0 as PlasmaCore
import "WindowManagement.js" as WindowManagement
Rectangle {
property alias showSplash: splash.visible
property bool showPanel: true
property alias showKeyboard: keyboardLayer.visible
readonly property alias layers: layers
readonly property real topBarHeight: units.iconSizes.small
readonly property real bottomBarHeight: units.iconSizes.medium
property var currentWindow: null
property var shellWindow: null;
onCurrentWindowChanged: {
if (!currentWindow) {
compositorRoot.state = "homeScreen";
return;
}
compositorRoot.state = "application";
}
id: compositorRoot
color: "black"
state: "homeScreen"
Image {
id: splash
anchors.fill: parent
source: "klogo.png"
sourceSize.width: width
sourceSize.height: height
fillMode: Image.PreserveAspectFit
z: 1000
}
ListModel {
id: surfaceModel
}
Connections {
target: compositor
onSurfaceMapped: WindowManagement.surfaceMapped(surface)
onSurfaceUnmapped: WindowManagement.surfaceUnmapped(surface)
onSurfaceDestroyed: WindowManagement.surfaceDestroyed(surface)
}
QtObject {
readonly property alias desktop: desktopLayer
readonly property alias windows: windowsLayerBackground
readonly property alias panel: panelLayer
readonly property alias keyboard: keyboardLayer
id: layers
}
Item {
id: desktopLayer
anchors.fill: parent
visible: true
}
Rectangle {
id: windowsLayerBackground
anchors {
fill: parent
topMargin: topBarHeight
bottomMargin: bottomBarHeight
}
color: Qt.rgba(0, 0, 0, 0.9)
function addWindow (window) {
window.parent = windowsLayout
}
property bool switchMode: windowsZoom.scale < 1
Item {
id: windowsZoom
anchors.fill: parent
Flickable {
id: windowsLayer
anchors.centerIn: parent
flickableDirection: Flickable.HorizontalFlick
height: windowsZoom.height * 2
width: windowsZoom.width * 2
interactive: windowsLayerBackground.switchMode
contentWidth: windowsLayout.width
contentHeight: windowsLayout.height
MouseArea {
height: windowsLayer.height
width: windowsLayout.width
onClicked: {
compositorRoot.state = "homeScreen";
}
Row {
id: windowsLayout
anchors.centerIn: parent
height: windowsLayerBackground.height
transformOrigin: Item.Left
onChildrenChanged: {
if (children.length == 0) {
compositorRoot.state = "homeScreen";
}
}
}
}
}
}
}
Item {
id: panelLayer
anchors.fill: parent
visible: showPanel
z: 3
}
Item {
id: keyboardLayer
anchors.fill: parent
z: 800
onVisibleChanged: {
if (!visible && compositorRoot.shellWindow) {
compositorRoot.shellWindow.child.takeFocus();
}
}
}
Rectangle {
id: bottomBar
z: 4
anchors.left: parent.left
anchors.right: parent.right
anchors.bottom: parent.bottom
height: bottomBarHeight
color: Qt.rgba(0, 0, 0, 0.9)
Behavior on height {
NumberAnimation {
easing.type: "InOutQuad"
duration: units.shortDuration
}
}
RowLayout {
anchors.fill: parent
PlasmaCore.IconItem {
colorGroup: PlasmaCore.Theme.ComplementaryColorGroup
width: units.iconSizes.smallMedium
height: width
source: "distribute-horizontal-x"
enabled: compositorRoot.state != "switcher" && windowsLayout.children.length > 0
opacity: enabled ? 1 : 0.2
Layout.alignment: Qt.AlignHCenter
Layout.preferredWidth: units.iconSizes.medium
Layout.preferredHeight: units.iconSizes.medium
MouseArea {
anchors.fill: parent
onClicked: {
compositorRoot.state = "switcher";
}
}
}
PlasmaCore.IconItem {
colorGroup: PlasmaCore.Theme.ComplementaryColorGroup
width: units.iconSizes.smallMedium
height: width
source: "go-home"
enabled: compositorRoot.state != "homeScreen";
opacity: enabled ? 1 : 0.2
Layout.alignment: Qt.AlignHCenter
Layout.preferredWidth: units.iconSizes.medium
Layout.preferredHeight: units.iconSizes.medium
MouseArea {
anchors.fill: parent
onClicked: {
compositorRoot.state = "homeScreen";
}
}
}
PlasmaCore.IconItem {
colorGroup: PlasmaCore.Theme.ComplementaryColorGroup
width: units.iconSizes.smallMedium
height: width
source: "window-close"
enabled: compositorRoot.currentWindow
opacity: enabled ? 1 : 0.2
Layout.alignment: Qt.AlignHCenter
Layout.preferredWidth: units.iconSizes.medium
Layout.preferredHeight: units.iconSizes.medium
MouseArea {
anchors.fill: parent
onClicked: {
compositorRoot.state = "homeScreen";
compositorRoot.currentWindow.close();
}
}
}
}
}
MouseArea {
id: taskSwitchEdge
z: 1000
anchors {
left: parent.left
right: parent.right
bottom: parent.bottom
}
height: 8
enabled: windowsLayout.children.length > 0 && compositorRoot.state != "switcher"
property int oldX: 0
onPressed: {
oldX = mouse.x;
}
onPositionChanged: {
compositorRoot.state = "changing";
compositorRoot.showKeyboard = false;
var newScale = (1-Math.abs(mouse.y)/(compositorRoot.height/2))
if (newScale > 0.3) {
windowsZoom.scale = newScale
}
windowsLayer.contentX -= (mouse.x - oldX);
oldX = mouse.x;
}
onReleased: {
if (windowsZoom.scale > 0.7) {
compositorRoot.state = compositorRoot.currentWindow ? "application" : "homeScreen";
} else {
compositorRoot.state = "switcher";
}
}
}
states: [
State {
name: "homeScreen"
PropertyChanges {
target: windowsLayerBackground
opacity: 0
}
PropertyChanges {
target: windowsZoom
scale: 1
}
},
State {
name: "application"
PropertyChanges {
target: windowsLayerBackground
opacity: 1
}
PropertyChanges {
target: windowsZoom
scale: 1
}
PropertyChanges {
target: windowsLayer
contentX: compositorRoot.currentWindow ? compositorRoot.currentWindow.x - windowsLayerBackground.width/2 : 0
}
},
State {
name: "switcher"
PropertyChanges {
target: windowsLayerBackground
opacity: 1
}
PropertyChanges {
target: windowsZoom
scale: 0.5
}
PropertyChanges {
target: windowsLayer
contentX: compositorRoot.currentWindow ? compositorRoot.currentWindow.x - windowsLayerBackground.width/2 : 0
}
},
State {
name: "changing"
PropertyChanges {
target: windowsLayerBackground
opacity: 1
}
PropertyChanges {
target: windowsLayer
contentX: compositorRoot.currentWindow ? compositorRoot.currentWindow.x - windowsLayerBackground.width/2 : 0
}
}
]
transitions: [
Transition {
to: "changing"
SequentialAnimation {
ScriptAction {
script: {
desktopLayer.z = 1
windowsLayerBackground.z = 800
}
}
PropertyAnimation {
target: windowsLayerBackground
duration: units.longDuration
easing.type: Easing.InOutQuad
properties: "opacity"
}
}
},
Transition {
SequentialAnimation {
ParallelAnimation {
PropertyAnimation {
target: windowsLayerBackground
duration: units.longDuration
easing.type: Easing.InOutQuad
properties: "opacity"
}
PropertyAnimation {
target: windowsZoom
duration: units.shortDuration
easing.type: Easing.InOutQuad
properties: "scale"
}
PropertyAnimation {
target: windowsLayer
duration: units.shortDuration
easing.type: Easing.InOutQuad
properties: "contentX"
}
}
ScriptAction {
script: {
if (compositorRoot.state == "homeScreen") {
desktopLayer.z = 2;
windowsLayerBackground.z = 1;
compositorRoot.currentWindow = null;
} else {
desktopLayer.z = 1;
windowsLayerBackground.z = 800;
if (compositorRoot.currentWindow) {
compositorRoot.currentWindow.child.takeFocus();
}
}
}
}
}
}
]
}

View file

@ -1,24 +0,0 @@
/*
* Copyright 2014 Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as
* published by the Free Software Foundation; either version 2, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Library General Public License for more details
*
* You should have received a copy of the GNU Library General Public
* License along with this program; if not, write to the
* Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
import QtQuick 2.0
WindowWrapper {
objectName: "shellWindow"
}

View file

@ -1,280 +0,0 @@
/*
* Copyright 2014 Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as
* published by the Free Software Foundation; either version 2, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Library General Public License for more details
*
* You should have received a copy of the GNU Library General Public
* License along with this program; if not, write to the
* Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
/*
* Main procedures
*/
function surfaceMapped(surface) {
// Determine if it's a shell window
var firstView = compositor.firstViewOf(surface);
var isShellWindow =
(typeof(firstView.role) != "undefined") ||
(surface.className == "plasmashell.desktop");
// Print some information
if (surface.className == "maliit-server.desktop") {
console.debug("Keyboard surface", surface, "mapped");
console.debug("\tappId:", surface.className);
console.debug("\ttitle:", surface.title);
console.debug("\tsize:", surface.size.width + "x" + surface.size.height);
} else if (isShellWindow) {
console.debug("Shell surface", surface, "mapped");
console.debug("\trole:", firstView.role);
console.debug("\tsize:", surface.size.width + "x" + surface.size.height);
} else {
console.debug("Application surface", surface, "mapped");
console.debug("\tappId:", surface.className);
console.debug("\ttitle:", surface.title);
console.debug("\tsize:", surface.size.width + "x" + surface.size.height);
}
if (surface.className == "maliit-server.desktop") {
mapKeyboardSurface(surface);
// Call a specialized method to deal with application or
// shell windows
} else if (isShellWindow)
mapShellSurface(surface, firstView);
else
mapApplicationSurface(surface);
}
function surfaceUnmapped(surface) {
// Determine if it's a shell window
var firstView = compositor.firstViewOf(surface);
var isShellWindow =
(typeof(firstView.role) != "undefined") ||
(surface.className == "plasmashell.desktop");
// Print some information
if (typeof(firstView.role) == "undefined") {
console.debug("Shell surface", surface, "unmapped");
console.debug("\trole:", firstView.role);
console.debug("\tsize:", surface.size.width + "x" + surface.size.height);
} else {
console.debug("Application surface", surface, "unmapped");
console.debug("\tappId:", surface.className);
console.debug("\ttitle:", surface.title);
}
//Is it maliit?
if (surface.className == "maliit-server.desktop") {
unmapKeyboardSurface(surface);
// Call a specialized method to deal with application or
// shell windows
} else if (isShellWindow)
unmapShellSurface(surface);
else
unmapApplicationSurface(surface);
}
function surfaceDestroyed(surface) {
console.debug("Surface", surface, "destroyed");
// Remove surface from model
var i;
for (i = 0; i < surfaceModel.count; i++) {
var entry = surfaceModel.get(i);
if (entry.surface === surface) {
// Destroy window representation and
// remove the surface from the model
if (entry.window.chrome)
entry.window.chrome.destroy();
entry.window.destroy();
surfaceModel.remove(i, 1);
break;
}
}
}
/*
* Map surfaces
*/
function mapApplicationSurface(surface) {
// Just exit if we already created a window representation
var i;
for (i = 0; i < surfaceModel.count; i++) {
var entry = surfaceModel.get(i);
if (entry.surface === surface) {
// Ask the client to resize
surface.requestSize(window.parent.width, window.parent.height);
return;
}
}
// Create surface item
var component = Qt.createComponent("ClientWindowWrapper.qml");
if (component.status !== Component.Ready) {
console.error(component.errorString());
return;
}
// Request a view for this output although with phones will
// likely have just one output
var child = compositor.viewForOutput(surface, _greenisland_output);
child.resizeSurfaceToItem = true;
child.width = compositorRoot.layers.windows.width;
child.height = compositorRoot.layers.windows.height;
// Create and setup window container
var window = component.createObject(compositorRoot.layers.windows, {"child": child});
compositorRoot.layers.windows.addWindow(window);
window.child.parent = window;
window.child.touchEventsEnabled = true;
window.width = surface.size.width;
window.height = surface.size.height;
// Switch to the applications layer and take focus
compositorRoot.state = "application";
compositorRoot.currentWindow = window;
window.child.takeFocus();
// Run map animation
if (typeof(window.runMapAnimation) != "undefined")
window.runMapAnimation();
// Add surface to the model
surfaceModel.append({"surface": surface, "window": window});
}
function mapShellSurface(surface, child) {
// Shell surfaces have only one view which is passed to us
// as an argument, check whether it's a view for this output
// or not
if (child.output !== _greenisland_output)
return;
// Just set z-index and exit if we already created a
// window representation
var i;
for (i = 0; i < surfaceModel.count; i++) {
var entry = surfaceModel.get(i);
if (entry.surface === surface) {
// Switch to layer and take focus
if (surface.className == "plasmashell.desktop") {
compositorRoot.showPanel = true;
} else {
compositorRoot.state = "homeScreen";
}
entry.window.child.takeFocus();
return;
}
}
// Create surface item
var component = Qt.createComponent("ShellWindowWrapper.qml");
if (component.status !== Component.Ready) {
console.error(component.errorString());
return;
}
// Create and setup window container
// XXX: We only support desktop roles for now
var window = component.createObject(compositorRoot, {"child": child});
window.parent = (surface.className == "plasmashell.desktop") ? compositorRoot.layers.panel : compositorRoot.layers.desktop;
window.child.parent = window;
window.child.touchEventsEnabled = true;
window.x = window.y = 0;
window.width = surface.size.width;
window.height = surface.size.height;
// Switch to the desktop layer and take focus
compositorRoot.showSplash = false;
if (surface.className == "plasmashell.desktop") {
compositorRoot.showPanel = true;
} else {
compositorRoot.state = "homeScreen";
compositorRoot.shellWindow = window;
}
window.child.takeFocus();
// Add surface to the model
surfaceModel.append({"surface": surface, "window": window});
}
function mapKeyboardSurface(surface) {
// Just exit if we already created a window representation
var i;
for (i = 0; i < surfaceModel.count; i++) {
var entry = surfaceModel.get(i);
if (entry.surface === surface) {
compositorRoot.showKeyboard = true;
return;
}
}
// Create surface item
var component = Qt.createComponent("ShellWindowWrapper.qml");
if (component.status !== Component.Ready) {
console.error(component.errorString());
return;
}
// Request a view for this output although with phones will
// likely have just one output
var child = compositor.viewForOutput(surface, _greenisland_output);
// Create and setup window container
var window = component.createObject(compositorRoot.layers.keyboard, {"child": child});
window.parent = compositorRoot.layers.keyboard;
window.child.parent = window;
window.child.touchEventsEnabled = true;
window.width = surface.size.width;
window.height = surface.size.height;
window.y = compositorRoot.layers.keyboard.height - window.height;
// Add surface to the model
surfaceModel.append({"surface": surface, "window": window});
compositorRoot.showKeyboard = true;
}
/*
* Unmap surfaces
*/
function unmapApplicationSurface(surface) {
// Reactivate home layer as soon as an application window is unmapped
compositorRoot.state = "homeScreen";
compositorRoot.currentWindow = null;
}
function unmapShellSurface(surface) {
// Hide panel layer if this is the sliding panel
if (surface.className == "plasmashell.desktop") {
compositorRoot.showPanel = false;
}
}
function unmapKeyboardSurface(surface) {
if (compositorRoot.currentWindow) {
compositorRoot.currentWindow.child.height = compositorRoot.layers.windows.height;
}
compositorRoot.showKeyboard = false;
}

View file

@ -1,54 +0,0 @@
/*
* Copyright 2014 Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as
* published by the Free Software Foundation; either version 2, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Library General Public License for more details
*
* You should have received a copy of the GNU Library General Public
* License along with this program; if not, write to the
* Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
import QtQuick 2.0
import QtCompositor 1.0
import GreenIsland 1.0
Item {
property var child
property var role: child.surface.windowProperties.role
id: window
onVisibleChanged: {
if (child)
child.surface.clientRenderingEnabled = visible;
}
SurfaceRenderer {
anchors.fill: parent
source: child
}
Connections {
target: child.surface
onSizeChanged: {
window.width = child.surface.size.width;
window.height = child.surface.size.height;
}
}
function close() {
if (!child || !child.surface)
return;
child.surface.client.close();
window.destroy();
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

View file

@ -13,6 +13,7 @@ target_link_libraries(plasma_containment_phone_homescreen
Qt5::Qml
KF5::I18n
KF5::Service
KF5::KIOWidgets
)

View file

@ -33,6 +33,7 @@
#include <KSharedConfig>
#include <KSycoca>
#include <KSycocaEntry>
#include <KIOWidgets/KRun>
#include <QDebug>
ApplicationListModel::ApplicationListModel(QObject *parent)
@ -96,7 +97,7 @@ void ApplicationListModel::loadApplications()
for(KServiceGroup::List::ConstIterator it = subGroupList.begin();it != subGroupList.end(); it++) {
KSycocaEntry::Ptr groupEntry = (*it);
if (groupEntry->isType(KST_KServiceGroup) && groupEntry->name() != "System/" && groupEntry->name() != "Settingsmenu/") {
if (groupEntry->isType(KST_KServiceGroup)) {
KServiceGroup::Ptr serviceGroup(static_cast<KServiceGroup* >(groupEntry.data()));
if (!serviceGroup->noDisplay()) {
@ -110,7 +111,7 @@ void ApplicationListModel::loadApplications()
KService::Ptr service(static_cast<KService* >(entry.data()));
if (service->isApplication() &&
!blacklist.contains(service->desktopEntryName() + QStringLiteral(".desktop")) &&
!service->showOnCurrentPlatform() &&
service->showOnCurrentPlatform() &&
!service->property("Terminal", QVariant::Bool).toBool()) {
data.name = service->name();
@ -218,6 +219,7 @@ Q_INVOKABLE void ApplicationListModel::moveItem(int row, int destination)
endMoveRows();
}
//TODO: the implementation of runApplicationKRun should be the only one remaining
void ApplicationListModel::runApplication(const QString &storageId)
{
if (storageId.isEmpty()) {
@ -230,6 +232,17 @@ void ApplicationListModel::runApplication(const QString &storageId)
QProcess::startDetached(service->exec().replace(QRegExp("%\\w"), ""));
}
void ApplicationListModel::runApplicationKRun(const QString &storageId)
{
if (storageId.isEmpty()) {
return;
}
KService::Ptr service = KService::serviceByStorageId(storageId);
KRun::run(*service, QList<QUrl>(), 0);
}
QStringList ApplicationListModel::appOrder() const
{
return m_appOrder;

View file

@ -71,6 +71,8 @@ public:
Q_INVOKABLE void runApplication(const QString &storageId);
Q_INVOKABLE void runApplicationKRun(const QString &storageId);
Q_INVOKABLE void loadApplications();
public Q_SLOTS:

View file

@ -0,0 +1,102 @@
/*
* Copyright 2015 Marco Martin <notmart@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as
* published by the Free Software Foundation; either version 2, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Library General Public License for more details
*
* You should have received a copy of the GNU Library General Public
* License along with this program; if not, write to the
* Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
import QtQuick 2.0
import QtQuick.Layouts 1.1
import QtQuick.Window 2.2
import org.kde.plasma.core 2.0 as PlasmaCore
import org.kde.plasma.components 2.0 as PlasmaComponents
Window {
id: window
property alias state: background.state
width: Screen.width
height: Screen.height
color: "transparent"
onVisibleChanged: {
if (!visible) {
background.state = "closed";
}
}
onActiveChanged: {
if (!active) {
background.state = "closed";
}
}
PlasmaCore.ColorScope {
id: background
anchors.fill: parent
colorGroup: PlasmaCore.Theme.ComplementaryColorGroup
width: window.width
height: window.height
state: "closed"
Rectangle {
anchors.fill: parent
color: background.backgroundColor
PlasmaComponents.BusyIndicator {
anchors.centerIn: parent
}
}
states: [
State {
name: "closed"
PropertyChanges {
target: background
scale: 0
}
PropertyChanges {
target: window
visible: false
}
},
State {
name: "open"
PropertyChanges {
target: background
scale: 1
}
PropertyChanges {
target: window
visible: true
}
}
]
transitions: [
Transition {
from: "closed"
SequentialAnimation {
ScriptAction {
script: window.visible = true;
}
PropertyAnimation {
target: background
duration: units.longDuration
easing.type: Easing.InOutQuad
properties: "scale"
}
}
}
]
}
}

View file

@ -15,7 +15,10 @@ Item {
PlasmaCore.IconItem {
id: icon
anchors.centerIn: parent
anchors {
centerIn: parent
verticalCenterOffset: -theme.mSize(theme.defaultFont).height
}
width: parent.height / 2
height: width
source: modelData.ApplicationIconRole

View file

@ -0,0 +1,83 @@
/*
* Copyright (C) 2015 Vishesh Handa <vhanda@kde.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) version 3, or any
* later version accepted by the membership of KDE e.V. (or its
* successor approved by the membership of KDE e.V.), which shall
* act as a proxy defined in Section 6 of version 3 of the license.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/
import QtQuick 2.0
import QtQuick.Layouts 1.1
import QtQuick.Window 2.1
import org.kde.plasma.core 2.0 as PlasmaCore
import org.kde.plasma.components 2.0 as PlasmaComponents
import org.kde.plasma.extras 2.0 as PlasmaExtras
import org.kde.milou 0.1 as Milou
PlasmaCore.FrameSvgItem {
id: background
imagePath: "widgets/background"
enabledBorders: PlasmaCore.FrameSvg.BottomBorder
height: childrenRect.height + fixedMargins.top/2 + fixedMargins.bottom
ColumnLayout {
anchors {
left: parent.left
right: parent.right
top: parent.top
topMargin: background.fixedMargins.top / 2
leftMargin: background.fixedMargins.left / 2
rightMargin: background.fixedMargins.right / 2
}
PlasmaComponents.TextField {
id: queryField
clearButtonShown: true
Layout.fillWidth: true
Layout.alignment: Qt.AlignTop
Keys.onEscapePressed: runnerWindow.visible = false
placeholderText: "Search ..."
}
Milou.ResultsView {
id: listView
queryString: queryField.text
visible: count > 0
Layout.fillWidth: true
Layout.preferredHeight: listView.contentHeight
Layout.alignment: Qt.AlignTop
onActivated: queryField.text = ""
onUpdateQueryString: {
queryField.text = text
queryField.cursorPosition = cursorPosition
}
}
Keys.onReturnPressed: {
if (queryField.texr.length == 0)
runnerWindow.visible = false;
}
Keys.onEnterPressed: {
if (queryField.texr.length == 0)
runnerWindow.visible = false;
}
}
}

View file

@ -41,12 +41,6 @@ MouseEventListener {
LayoutManager.save();
}
Plasmoid.onFocusChanged: {
if (!plasmoid.focus && applicationsView.contentY > -(applicationsView.headerItem.height - root.height/2)) {
applicationsView.contentY = -root.height;
}
}
function addApplet(applet, x, y) {
var container = appletContainerComponent.createObject(appletsSpace.layout)
container.visible = true
@ -256,6 +250,8 @@ MouseEventListener {
return;
}
feedbackWindow.title = item.modelData.ApplicationNameRole;
feedbackWindow.state = "open";
plasmoid.nativeInterface.applicationListModel.runApplication(item.modelData.ApplicationStorageIdRole);
clickFedbackAnimation.target = item;
clickFedbackAnimation.running = true;
@ -281,6 +277,19 @@ MouseEventListener {
easing.type: Easing.InOutQuad
}
}
FeedbackWindow {
id: feedbackWindow
}
KRunner {
z: 1000
anchors {
top: parent.top
left: parent.left
right: parent.right
topMargin: plasmoid.availableScreenRect.y
}
}
PlasmaCore.ColorScope {
anchors.fill: parent
//TODO: decide what color we want applets
@ -404,7 +413,7 @@ MouseEventListener {
//scrolling up
} else if (verticalVelocity < 0 && contentY < -headerItem.height + root.height &&
contentY < (-headerItem.height + root.height/6)) {
contentY < (-headerItem.height + root.height/6*5)) {
scrollAnim.to = -headerItem.height;
scrollAnim.running = true;
return;

View file

@ -1,2 +0,0 @@
workspace.activeClient.closeWindow();

View file

@ -0,0 +1,52 @@
/*
* Copyright 2015 Marco Martin <mart@kde.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 2.010-1301, USA.
*/
import QtQuick 2.4
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.components 2.0 as PlasmaComponents
import org.kde.kquickcontrolsaddons 2.0
MouseArea {
id: button
width: Math.min(parent.width, parent.height)
height: width
property alias iconSource: icon.source
property bool checked
property bool checkable
Rectangle {
anchors.fill:parent
radius: width/4
visible: button.checked
color: theme.highlightColor
}
PlasmaCore.IconItem {
id: icon
anchors.fill: parent
colorGroup: PlasmaCore.Theme.ComplementaryColorGroup
enabled: button.enabled
}
onClicked: {
if (checkable) {
checked = !checked;
}
}
}

View file

@ -0,0 +1,133 @@
/*
* Copyright 2015 Marco Martin <notmart@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as
* published by the Free Software Foundation; either version 2, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Library General Public License for more details
*
* You should have received a copy of the GNU Library General Public
* License along with this program; if not, write to the
* Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
import QtQuick 2.0
import QtQuick.Layouts 1.1
import QtQuick.Window 2.2
import org.kde.plasma.core 2.0 as PlasmaCore
import org.kde.plasma.components 2.0 as PlasmaComponents
Window {
id: window
visible: false
width: Screen.width
height: Screen.height
property int offset: 0
property int overShoot: units.gridUnit * 2
color: Qt.rgba(0, 0, 0, 0.6 * (Math.min(tasksView.contentY + window.height, window.height) / window.height))
function show() {
visible = true;
scrollAnim.to = 0;
scrollAnim.running = true;
}
function hide() {
scrollAnim.to = -tasksView.headerItem.height;
scrollAnim.running = true;
}
SequentialAnimation {
id: scrollAnim
property alias to: internalAnim.to
ScriptAction {
script: window.visible = true;
}
NumberAnimation {
id: internalAnim
target: tasksView
properties: "contentY"
duration: units.longDuration
easing.type: Easing.InOutQuad
}
ScriptAction {
script: {
if (tasksView.contentY <= -tasksView.headerItem.height) {
window.visible = false;
}
}
}
}
GridView {
id: tasksView
width: window.width
height: window.height
cellWidth: window.width/2
cellHeight: window.height/2
onFlickingChanged: {
if (!draggingVertically && contentY < -headerItem.height + window.height) {
scrollAnim.to = Math.round(contentY/window.height) * window.height
scrollAnim.running = true;
}
}
onDraggingVerticallyChanged: {
if (draggingVertically) {
return;
}
//manage separately the first page, the lockscreen
//scrolling down
if (verticalVelocity > 0 && contentY < -headerItem.height + window.height &&
contentY > (-headerItem.height + window.height/6)) {
show();
return;
//scrolling up
} else if (verticalVelocity < 0 && contentY < -headerItem.height + window.height &&
contentY < (-headerItem.height + window.height/6*5)) {
hide();
return;
}
if (contentY < 0) {
show();
}
}
model: 10
header: Item {
width: window.width
height: window.height
}
delegate: Item {
width: window.width/2
height: window.height/2
Rectangle {
anchors {
fill: parent
margins: units.gridUnit
}
radius: units.gridUnit
opacity: 0.8
PlasmaComponents.Label {
anchors {
bottom: parent.bottom
horizontalCenter: parent.horizontalCenter
}
text: "Task " + modelData
}
MouseArea {
anchors.fill: parent
onClicked: window.hide();
}
}
}
}
}

View file

@ -24,39 +24,57 @@ import org.kde.plasma.core 2.0 as PlasmaCore
import org.kde.plasma.components 2.0 as PlasmaComponents
import org.kde.kquickcontrolsaddons 2.0
Rectangle {
anchors.fill: parent
//TODO: decide what color we want applets
color: theme.backgroundColor
PlasmaCore.ColorScope {
id: root
width: 600
height: 40
height: 480
colorGroup: PlasmaCore.Theme.ComplementaryColorGroup
property Item toolBox
PlasmaComponents.ToolButton {
id: showDesktopButton
height: parent.height
width: height
anchors.horizontalCenter: parent.horizontalCenter
iconSource: "go-home"
checkable: true
onCheckedChanged: {
plasmoid.nativeInterface.showDesktop = checked;
TaskSwitcher {
id: taskSwitcher
}
Rectangle {
anchors.fill: parent
color: root.backgroundColor
width: 600
height: 40
property Item toolBox
Button {
anchors.left: parent.left
height: parent.height
width: parent.width/3
iconSource: "applications-other"
onClicked: taskSwitcher.visible ? taskSwitcher.hide() : taskSwitcher.show();
}
Connections {
target: plasmoid.nativeInterface
onShowingDesktopChanged: {
showDesktopButton.checked = plasmoid.nativeInterface.showDesktop;
Button {
id: showDesktopButton
height: parent.height
width: parent.width/3
anchors.horizontalCenter: parent.horizontalCenter
iconSource: "go-home"
checkable: true
onCheckedChanged: {print (checked)
plasmoid.nativeInterface.showDesktop = checked;
}
Connections {
target: plasmoid.nativeInterface
onShowingDesktopChanged: {
showDesktopButton.checked = plasmoid.nativeInterface.showDesktop;
}
}
}
}
PlasmaComponents.ToolButton {
height: parent.height
width: height
anchors.right: parent.right
iconSource: "window-close"
onClicked: plasmoid.nativeInterface.executeScript("close");
Button {
height: parent.height
width: parent.width/3
anchors.right: parent.right
iconSource: "window-close"
enabled: plasmoid.nativeInterface.hasCloseableActiveWindow;
onClicked: plasmoid.nativeInterface.closeActiveWindow();
}
}
}

View file

@ -21,10 +21,6 @@
#include <QtQml>
#include <QDebug>
#include <QDBusMessage>
#include <QDBusConnection>
#include <QDBusPendingCallWatcher>
#include <QDBusPendingReply>
#include <Plasma/Package>
@ -47,35 +43,6 @@ TaskPanel::~TaskPanel()
{
}
void TaskPanel::executeScript(const QString &script)
{
//Plasma::Package p =
QDBusMessage message = QDBusMessage::createMethodCall(s_kwinService, "/Scripting", QString(), "loadScript");
QList<QVariant> arguments;
arguments << QVariant(package().filePath("scripts", script + ".js"));
message.setArguments(arguments);
QDBusPendingReply<void> asyncCall = QDBusConnection::sessionBus().asyncCall(message);
QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(asyncCall, this);
QObject::connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)),
this, SLOT(loadScriptFinishedSlot(QDBusPendingCallWatcher*)));
}
void TaskPanel::loadScriptFinishedSlot(QDBusPendingCallWatcher *watcher)
{
QDBusMessage reply = watcher->reply();
if (reply.type() == QDBusMessage::ErrorMessage) {
qWarning() << reply.errorMessage();
} else {
const int id = reply.arguments().first().toInt();
QDBusConnection::sessionBus().connect(s_kwinService, "/" + QString::number(id), QString(), "print", this, SLOT(print(QString)));
QDBusConnection::sessionBus().connect(s_kwinService, "/" + QString::number(id), QString(), "printError", this, SLOT(print(QString)));
QDBusMessage message = QDBusMessage::createMethodCall(s_kwinService, "/" + QString::number(id), QString(), "run");
//fire blindly the call for now
reply = QDBusConnection::sessionBus().asyncCall(message);
}
}
void TaskPanel::requestShowingDesktop(bool showingDesktop)
{
if (!m_windowManagement) {
@ -108,11 +75,35 @@ void TaskPanel::initWayland()
emit showingDesktopChanged(m_showingDesktop);
}
);
connect(m_windowManagement, &PlasmaWindowManagement::activeWindowChanged, this, &TaskPanel::updateActiveWindow);
updateActiveWindow();
}
);
registry->setup();
}
void TaskPanel::updateActiveWindow()
{
if (!m_windowManagement) {
return;
}
m_activeWindow = m_windowManagement->activeWindow();
// TODO: connect to closeableChanged, not needed right now as KWin doesn't provide this changeable
emit hasCloseableActiveWindowChanged();
}
bool TaskPanel::hasCloseableActiveWindow() const
{
return m_activeWindow && m_activeWindow->isCloseable();
}
void TaskPanel::closeActiveWindow()
{
if (m_activeWindow) {
m_activeWindow->requestClose();
}
}
K_EXPORT_PLASMA_APPLET_WITH_JSON(taskpanel, TaskPanel, "metadata.json")
#include "taskpanel.moc"

View file

@ -24,13 +24,12 @@
#include <Plasma/Containment>
class QDBusPendingCallWatcher;
namespace KWayland
{
namespace Client
{
class PlasmaWindowManagement;
class PlasmaWindow;
}
}
@ -38,28 +37,31 @@ class TaskPanel : public Plasma::Containment
{
Q_OBJECT
Q_PROPERTY(bool showDesktop READ isShowingDesktop WRITE requestShowingDesktop NOTIFY showingDesktopChanged)
Q_PROPERTY(bool hasCloseableActiveWindow READ hasCloseableActiveWindow NOTIFY hasCloseableActiveWindowChanged)
public:
TaskPanel( QObject *parent, const QVariantList &args );
~TaskPanel();
Q_INVOKABLE void executeScript(const QString &script);
Q_INVOKABLE void closeActiveWindow();
bool isShowingDesktop() const {
return m_showingDesktop;
}
void requestShowingDesktop(bool showingDesktop);
bool hasCloseableActiveWindow() const;
Q_SIGNALS:
void showingDesktopChanged(bool);
private Q_SLOTS:
void loadScriptFinishedSlot(QDBusPendingCallWatcher *watcher);
void hasCloseableActiveWindowChanged();
private:
void initWayland();
void updateActiveWindow();
bool m_showingDesktop;
KWayland::Client::PlasmaWindowManagement *m_windowManagement;
KWayland::Client::PlasmaWindow *m_activeWindow = nullptr;
};

View file

@ -1,9 +1,9 @@
macro(satellite_install_dbus_service name)
macro(plasma_phone_install_dbus_service name)
install(FILES ${name}.service
DESTINATION ${CMAKE_INSTALL_FULL_SYSCONFDIR}/dbus-1/session.d)
endmacro()
satellite_install_dbus_service(org.kde.kde5)
satellite_install_dbus_service(org.kde.kglobalaccel)
satellite_install_dbus_service(org.kde.klauncher5)
satellite_install_dbus_service(org.kde.kuiserver)
plasma_phone_install_dbus_service(org.kde.kde5)
plasma_phone_install_dbus_service(org.kde.kglobalaccel)
plasma_phone_install_dbus_service(org.kde.klauncher5)
plasma_phone_install_dbus_service(org.kde.kuiserver)

View file

@ -1,5 +1,5 @@
[Desktop Entry]
Name=Satellite
Name=Plasma Phone
Comment=Plasma workspace for smartphones
Keywords=Phone, Workspace, Look and Feel
Type=Service
@ -10,7 +10,7 @@ X-KDE-PluginInfo-Author=
X-KDE-PluginInfo-Category=
X-KDE-PluginInfo-Email=
X-KDE-PluginInfo-License=GPLv2+
X-KDE-PluginInfo-Name=org.kde.plasma.satellite
X-KDE-PluginInfo-Name=org.kde.plasma.phone
X-KDE-PluginInfo-Version=0.1
X-KDE-PluginInfo-Website=
X-Plasma-MainScript=defaults

View file

@ -1,151 +0,0 @@
#
# Do NOT Edit the Auto-generated Part!
# Generated by: spectacle version 0.27
#
Name: plasma-phone-components
# >> macros
# << macros
Summary: Plasma Phone Components
Version: 0.2.2
Release: 1
Group: System/GUI/Other
License: GPLv2+
URL: http://www.kde.org
Source0: %{name}-%{version}.tar.xz
Source100: plasma-phone-components.yaml
Requires: greenisland
Requires: plasma-workspace
Requires: plasma-workspace-wallpaper-image
Requires: plasma-desktop
Requires: breeze-icon-theme
Requires: oxygen-fonts
Requires: frameworkintegration
Requires: libqofono-qt5
Requires: libqofono-qt5-declarative
Requires: voicecall-qt5
Requires: voicecall-qt5-plugin-ofono
Requires: nemo-qml-plugin-contextkit-qt5
Requires: tone-generator
BuildRequires: pkgconfig(Qt5Core)
BuildRequires: pkgconfig(Qt5DBus)
BuildRequires: pkgconfig(Qt5Xml)
BuildRequires: pkgconfig(Qt5Network)
BuildRequires: pkgconfig(Qt5Gui)
BuildRequires: pkgconfig(Qt5Widgets)
BuildRequires: pkgconfig(Qt5Test)
BuildRequires: pkgconfig(Qt5Qml)
BuildRequires: pkgconfig(Qt5Quick)
BuildRequires: pkgconfig(systemd)
BuildRequires: extra-cmake-modules
BuildRequires: kf5-rpm-macros
BuildRequires: qt5-tools
BuildRequires: plasma-devel
%description
Plasma Phone Components.
%prep
%setup -q -n %{name}-%{version}
# >> setup
# << setup
%build
# >> build pre
%kf5_make
# << build pre
# >> build post
# << build post
%install
rm -rf %{buildroot}
# >> install pre
%kf5_make_install
# << install pre
# >> install post
# Script that runs the UI
# File with environment variables, used by compositor systemd unit
mkdir -p %{buildroot}%{_sharedstatedir}/environment/greenisland
cat > %{buildroot}%{_sharedstatedir}/environment/greenisland/greenisland.conf <<EOF
# Use QScreen backend
KSCREEN_BACKEND=QScreen
# This one is often set to 1 but, at least for hammerhead, we need it set to 0
# TODO: Check whether this is always the case when we'll support more devices
QT_COMPOSITOR_NEGATE_INVERTED_Y=0
EOF
# File with environment variables, used by shell systemd unit
mkdir -p %{buildroot}%{_sharedstatedir}/environment/plasma-phone
cat > %{buildroot}%{_sharedstatedir}/environment/plasma-phone/plasma-phone.conf <<EOF
QT_QPA_PLATFORM=wayland
QT_QPA_PLATFORMTHEME=KDE
QT_WAYLAND_DISABLE_WINDOWDECORATION=1
XDG_CURRENT_DESKTOP=KDE
KSCREEN_BACKEND=QScreen
KDE_FULL_SESSION=1
KDE_SESSION_VERSION=5
EOF
# Default configuration for the UI
mkdir -p %{buildroot}%{_kf5_configdir}
cat > %{buildroot}%{_kf5_configdir}/kded5rc << EOF
[General]
CheckSycoca=false
EOF
cat > %{buildroot}%{_kf5_configdir}/kdeglobals <<EOF
[KDE]
LookAndFeelPackage=org.kde.satellite.phone
[General]
desktopFont=Oxygen Sans,9,-1,5,50,0,0,0,0,0
fixed=Oxygen Mono,8,-1,5,50,0,0,0,0,0
font=Oxygen Sans,9,-1,5,50,0,0,0,0,0
menuFont=Oxygen Sans,9,-1,5,50,0,0,0,0,0
smallestReadableFont=Oxygen Sans,7,-1,5,50,0,0,0,0,0
taskbarFont=Oxygen Sans,9,-1,5,50,0,0,0,0,0
toolBarFont=Oxygen Sans,8,-1,5,50,0,0,0,0,0
[Icons]
Theme=breeze
[Theme]
name=default
EOF
# Install services links
mkdir -p %{buildroot}%{_libdir}/systemd/user/user-session.target.wants
#UNITS="plasma-phone-compositor plasma-phone-ui"
UNITS="plasma-phone"
for service in $UNITS; do
ln -sf ../${service}.service %{buildroot}%{_libdir}/systemd/user/user-session.target.wants/${service}.service
done
# << install post
%files
%defattr(-,root,root,-)
%config %{_kf5_configdir}/kdeglobals
%config %{_kf5_configdir}/kded5rc
%{_bindir}/plasma-phone
%{_kf5_sharedir}/plasma/*
%{_kf5_sharedir}/wallpapers/*
%{_kf5_sharedir}/settingsmodules/*
%{_kf5_servicesdir}/*.desktop
%{_sharedstatedir}/environment/greenisland/*
%{_sharedstatedir}/environment/plasma-phone/*
%{_libdir}/systemd/user/*
%{_libdir}/systemd/user/user-session.target.wants/*
%{_libdir}/qt5/qml/*
# >> files
# << files

View file

@ -1,61 +0,0 @@
Name : plasma-phone-components
Version : 0.2.2
Release : 1
Group : System/GUI/Other
License : GPLv2+
Summary : Plasma Phone Components
Description : |
Plasma Phone Components.
URL : http://www.kde.org
Sources :
- "%{name}-%{version}.tar.xz"
SetupOptions: -q -n %{name}-%{version}
Requires:
- greenisland
- plasma-workspace
- plasma-workspace-wallpaper-image
- plasma-desktop
- breeze-icon-theme
- oxygen-fonts
- frameworkintegration
- libqofono-qt5
- libqofono-qt5-declarative
- voicecall-qt5
- voicecall-qt5-plugin-ofono
- nemo-qml-plugin-contextkit-qt5
- tone-generator
PkgBR:
- extra-cmake-modules
- kf5-rpm-macros
- qt5-tools
- plasma-devel
PkgConfigBR:
- Qt5Core
- Qt5DBus
- Qt5Xml
- Qt5Network
- Qt5Gui
- Qt5Widgets
- Qt5Test
- Qt5Qml
- Qt5Quick
- systemd
Configure: none
Builder: none
Files:
- "%config %{_kf5_configdir}/kdeglobals"
- "%config %{_kf5_configdir}/kded5rc"
- "%{_bindir}/plasma-phone"
- "%{_kf5_sharedir}/plasma/*"
- "%{_kf5_sharedir}/wallpapers/*"
- "%{_kf5_sharedir}/settingsmodules/*"
- "%{_kf5_servicesdir}/*.desktop"
- "%{_sharedstatedir}/environment/greenisland/*"
- "%{_sharedstatedir}/environment/plasma-phone/*"
- "%{_libdir}/systemd/user/*"
- "%{_libdir}/systemd/user/user-session.target.wants/*"
- "%{_libdir}/qt5/qml/*"

View file

@ -1,2 +0,0 @@
#!/bin/sh
gbs remotebuild -T home:plfiorini:phone

View file

@ -3,17 +3,16 @@ pkg_check_modules(SYSTEMD systemd REQUIRED)
execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE} --variable=systemduserunitdir systemd OUTPUT_VARIABLE SYSTEMD_USER_UNIT_DIR)
string(REGEX REPLACE "[ \t\n]+" "" SYSTEMD_USER_UNIT_DIR ${SYSTEMD_USER_UNIT_DIR})
macro(satellite_install_service name)
macro(plasma_phone_install_service name)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/${name}.service.cmake ${CMAKE_CURRENT_BINARY_DIR}/${name}.service)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${name}.service
DESTINATION ${SYSTEMD_USER_UNIT_DIR})
endmacro()
satellite_install_service(kactivitymanagerd)
satellite_install_service(kded5)
satellite_install_service(kdeinit5)
satellite_install_service(kglobalaccel5)
satellite_install_service(kuiserver5)
satellite_install_service(plasma-phone-compositor)
satellite_install_service(plasma-phone-ui)
satellite_install_service(plasma-phone)
plasma_phone_install_service(kactivitymanagerd)
plasma_phone_install_service(kded5)
plasma_phone_install_service(kdeinit5)
plasma_phone_install_service(kglobalaccel5)
plasma_phone_install_service(kuiserver5)
plasma_phone_install_service(plasma-phone-ui)
plasma_phone_install_service(plasma-phone)

9
services/README Normal file
View file

@ -0,0 +1,9 @@
This files are for systemd units.
Our current implemention is based on top of the Ubuntu phone which
still uses upstart. So these files do nothing, but we're still keeping
them over here for now.
The situation should be revisited in about 6 months.
- 19th June 2015

View file

@ -1,22 +0,0 @@
#
# Copyright (C) 2014 Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
#
# Starts Green Island with the phone compositor plugin.
#
[Unit]
Description=Green Island
Requires=dbus.socket pre-user-session.target
After=pre-user-session.target
Conflicts=maui-bootsplash.service
[Service]
Type=notify
Environment=DBUS_SESSION_BUS_ADDRESS=unix:path=%t/dbus/user_bus_socket
EnvironmentFile=-/var/lib/environment/compositor/*.conf
EnvironmentFile=-/var/lib/environment/greenisland/*.conf
ExecStart=@CMAKE_INSTALL_FULL_BINDIR@/greenisland $LIPSTICK_OPTIONS -p org.kde.satellite.compositor.phone
Restart=on-failure
[Install]
WantedBy=user-session.target

View file

@ -6,13 +6,13 @@
[Unit]
Description=Plasma Phone UI
Requires=dbus.socket plasma-phone-compositor.service
After=plasma-phone-compositor.service
Requires=dbus.socket
After=
[Service]
Environment=DBUS_SESSION_BUS_ADDRESS=unix:path=%t/dbus/user_bus_socket
EnvironmentFile=-/var/lib/environment/plasma-phone/*.conf
ExecStart=@CMAKE_INSTALL_FULL_BINDIR@/plasmashell -p org.kde.satellite.phone -n
ExecStart=@CMAKE_INSTALL_FULL_BINDIR@/plasmashell -p org.kde.plasma.phone -n
ExecStop=@CMAKE_INSTALL_FULL_BINDIR@/kquitapp5 plasmashell
Restart=on-failure
BusName=org.kde.plasmashell

View file

@ -1,4 +1,4 @@
plasma_install_package(wireless org.kde.satellite.settings.wifi packages package)
plasma_install_package(wireless org.kde.plasma.phone.settings.wifi packages package)

View file

@ -8,7 +8,7 @@ Icon=network-wireless
X-KDE-ServiceTypes=Active/SettingsModule
X-KDE-PluginInfo-Author=Marco Martin
X-KDE-PluginInfo-Email=mart@kde.org
X-KDE-PluginInfo-Name=org.kde.satellite.settings.wifi
X-KDE-PluginInfo-Name=org.kde.plasma.phone.settings.wifi
X-KDE-PluginInfo-Version=1.0
X-KDE-PluginInfo-Website=
X-KDE-PluginInfo-Category=Networking

View file

@ -1,5 +1,5 @@
[kdeglobals][KDE]
LookAndFeelPackage=org.kde.satellite.phone
LookAndFeelPackage=org.kde.plasma.phone
[Desktop]
Containment=org.kde.phone.homescreen

View file

@ -11,7 +11,7 @@ for (var j = 0; j < desktopsArray.length; j++) {
desktopsArray[j].currentConfigGroup = ["Wallpaper",
desktopsArray[j].wallpaperPlugin,
"General"];
desktopsArray[j].writeConfig("Image", "org.kde.satellite.lockers");
desktopsArray[j].writeConfig("Image", "org.kde.plasma.phone.lockers");
}
desktopsForActivity(id)[0].addWidget("org.kde.phone.notifications");

View file

@ -23,7 +23,7 @@ import QtQuick 2
Item {
id: main
property string shell : "org.kde.satellite.phone"
property string shell : "org.kde.plasma.phone"
property bool willing : true
property int priority : 10

View file

@ -8,7 +8,7 @@ X-KDE-PluginInfo-Author=Aaron Seigo
X-KDE-PluginInfo-Category=
X-KDE-PluginInfo-Email=aseigo@kde.org
X-KDE-PluginInfo-License=GPLv2+
X-KDE-PluginInfo-Name=org.kde.satellite.phone
X-KDE-PluginInfo-Name=org.kde.plasma.phone
X-KDE-PluginInfo-Version=0.1
X-KDE-PluginInfo-Website=

View file

@ -1,7 +1,7 @@
[Desktop Entry]
Name=Satellite Lockers
Name=Plasma Phone Lockers
X-KDE-PluginInfo-Name=org.kde.satellite.lockers
X-KDE-PluginInfo-Name=org.kde.plasma.phone.lockers
X-KDE-PluginInfo-Author=Jens Reuterberg
X-KDE-PluginInfo-Email=jens@ohyran.se
X-KDE-PluginInfo-License=LGPLv3