From b1313767d0b55054082b4397e0b03b2736ec3d42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20COUDERC?= Date: Fri, 23 Sep 2016 23:45:32 +0000 Subject: [PATCH] SDDM theming for KDE/Plasma 5 --- Makefile | 14 +- debian/README.Debian | 8 +- debian/changelog | 4 + debian/postinst | 14 + debian/prerm | 11 + .../login-background-with-logo.svg | 0 lines-theme/login-background.svg | 67 +++++ lines-theme/sddm-preview.jpg | Bin 0 -> 28168 bytes sddm-debian/Main.qml | 275 ++++++++++++++++++ sddm-debian/metadata.desktop | 12 + sddm-debian/theme.conf | 2 + 11 files changed, 401 insertions(+), 6 deletions(-) rename login/background.svg => lines-theme/login-background-with-logo.svg (100%) create mode 100644 lines-theme/login-background.svg create mode 100644 lines-theme/sddm-preview.jpg create mode 100644 sddm-debian/Main.qml create mode 100644 sddm-debian/metadata.desktop create mode 100644 sddm-debian/theme.conf diff --git a/Makefile b/Makefile index 1529f0d..d41b006 100644 --- a/Makefile +++ b/Makefile @@ -92,7 +92,19 @@ install: $(INSTALL) $(wildcard ksplash-theme/joy/1920x1080/*) $(DESTDIR)/usr/share/kde4/apps/ksplash/Themes/joy/1920x1080 install -d $(DESTDIR)/usr/share/kde4/apps/ksplash/Themes/joy/1920x1200 $(INSTALL) $(wildcard ksplash-theme/joy/1920x1200/*) $(DESTDIR)/usr/share/kde4/apps/ksplash/Themes/joy/1920x1200 + + ## SDDM meta theme (configured with alternatives) + install -d $(DESTDIR)/usr/share/sddm/themes/debian-theme + $(INSTALL) $(wildcard sddm-debian/*) $(DESTDIR)/usr/share/sddm/themes/debian-theme + + ## Lines + install -d $(DESTDIR)/usr/share/desktop-base/lines-theme + # login background + $(INSTALL) lines-theme/login-background.svg $(DESTDIR)/usr/share/desktop-base/lines-theme/ + $(INSTALL) lines-theme/login-background-with-logo.svg $(DESTDIR)/usr/share/desktop-base/lines-theme/ + $(INSTALL) lines-theme/sddm-preview.jpg $(DESTDIR)/usr/share/desktop-base/lines-theme/ + install -d $(DESTDIR)/usr/share/kde4/apps/ksplash/Themes/lines/images $(INSTALL) $(wildcard ksplash-theme/lines/*.qml) $(DESTDIR)/usr/share/kde4/apps/ksplash/Themes/lines $(INSTALL) $(wildcard ksplash-theme/lines/*.png) $(DESTDIR)/usr/share/kde4/apps/ksplash/Themes/lines @@ -106,8 +118,6 @@ install: # GNOME background descriptor mkdir -p $(DESTDIR)/usr/share/gnome-background-properties $(INSTALL) gnome-backgrounds.xml $(DESTDIR)/usr/share/gnome-background-properties/debian.xml - # login background - $(INSTALL) login/background.svg $(DESTDIR)/usr/share/images/desktop-base/login-background.svg # grub $(INSTALL) grub/lines-grub.png $(DESTDIR)/usr/share/images/desktop-base/ diff --git a/debian/README.Debian b/debian/README.Debian index 0c1667e..911b4e6 100644 --- a/debian/README.Debian +++ b/debian/README.Debian @@ -20,7 +20,7 @@ README for desktop-base 1.2. Pixmaps /usr/share/pixmaps/debian-security.png -1.3. Splash, wallpapers and grub images +1.3. Grub, boot, login and wallpapers themes Wallpapers are provided in two svg variant, one standard aspect (4/3) and one widescreen (16/9). You can switch from one another using the alternatives. @@ -29,16 +29,16 @@ that changing alternative means at the next package upgrade it won't be automatically reverted to the default choice. For wallpaper you can run: - sudo update-alternatives --config desktop-background For splash screens you can run: - sudo update-alternatives --config desktop-splash +For login screen (only SDDM for now) you can run: + sudo update-alternatives --config desktop-login-background + For grub, you can select standard or widescreen version too. Widescreen can be better in particular for UEFI firmwares: - sudo update-alternatives --config desktop-grub 2. Desktop files diff --git a/debian/changelog b/debian/changelog index 52a1fba..9d2b0ec 100644 --- a/debian/changelog +++ b/debian/changelog @@ -7,6 +7,10 @@ desktop-base (9.0.0~exp1) UNRELEASED; urgency=medium (Closes #659549) * README.Debian: inform about updating initrds too. (Closes #612163) * Document use of sync use before grub update in postinst. (Closes #611364) + * Add SDDM theming for KDE/Plasma 5: + - Based on default SDDM theme breeze + Debian theme background. + - Can be configured with alternatives (also works in lightdm). + (Closes: #415064, #608523, #611170, #670866, #762276) -- Coucouf Tue, 06 Sep 2016 08:14:12 +0200 diff --git a/debian/postinst b/debian/postinst index 12c0f4d..3b88ba2 100644 --- a/debian/postinst +++ b/debian/postinst @@ -52,6 +52,20 @@ spacefun-splash.svg 50 moreblue-orbit-splash.png 40 EOF + # Login theme + update-alternatives --install /usr/share/images/desktop-base/login-background.svg \ + desktop-login-background \ + /usr/share/desktop-base/lines-theme/login-background.svg 70 \ + --slave /usr/share/sddm/themes/debian-theme/sddm-preview.jpg \ + desktop-sddm-preview \ + /usr/share/desktop-base/lines-theme/sddm-preview.jpg + update-alternatives --install /usr/share/images/desktop-base/login-background.svg \ + desktop-login-background \ + /usr/share/desktop-base/lines-theme/login-background-with-logo.svg 65 \ + --slave /usr/share/sddm/themes/debian-theme/sddm-preview.jpg \ + desktop-sddm-preview \ + /usr/share/desktop-base/lines-theme/sddm-preview.jpg + # Alternatives for grub ## Favor widescreen / hi-res background for efi installations num_grub_efi_installed=$(dpkg-query --list "grub-efi*" | grep "^i" | wc -l) diff --git a/debian/prerm b/debian/prerm index f6b58f0..fcff04f 100644 --- a/debian/prerm +++ b/debian/prerm @@ -32,6 +32,17 @@ if [ "$1" = "remove" ] || [ "$1" = "deconfigure" ]; then update-alternatives --remove desktop-background.xml /usr/share/images/desktop-base/$desktopbackground done + # remove login theme alternatives + # secondaire alternatives + update-alternatives --remove desktop-sddm-preview \ + /usr/share/desktop-base/lines-theme/sddm-preview.jpg + # main alternatives + update-alternatives --remove desktop-login-background \ + /usr/share/desktop-base/lines-theme/login-background.svg + update-alternatives --remove desktop-login-background \ + /usr/share/desktop-base/lines-theme/login-background-no-logo.svg + + # remove splash alternatives for splash in \ spacefun-splash.svg \ diff --git a/login/background.svg b/lines-theme/login-background-with-logo.svg similarity index 100% rename from login/background.svg rename to lines-theme/login-background-with-logo.svg diff --git a/lines-theme/login-background.svg b/lines-theme/login-background.svg new file mode 100644 index 0000000..19ee6ec --- /dev/null +++ b/lines-theme/login-background.svg @@ -0,0 +1,67 @@ + +image/svg+xml \ No newline at end of file diff --git a/lines-theme/sddm-preview.jpg b/lines-theme/sddm-preview.jpg new file mode 100644 index 0000000000000000000000000000000000000000..254dc8e589049cb8f05218c730749cef50f63ee9 GIT binary patch literal 28168 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 literal 0 HcmV?d00001 diff --git a/sddm-debian/Main.qml b/sddm-debian/Main.qml new file mode 100644 index 0000000..2fa6546 --- /dev/null +++ b/sddm-debian/Main.qml @@ -0,0 +1,275 @@ +/* + * Copyright 2014 David Edmundson + * + * 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 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.2 +import QtQuick.Layouts 1.1 +import QtQuick.Controls 1.1 as Controls + +import org.kde.plasma.core 2.0 as PlasmaCore +import org.kde.plasma.components 2.0 as PlasmaComponents + +import SddmComponents 2.0 + +import "../breeze/components" + +Image { + id: root + width: 1000 + height: 1000 + + LayoutMirroring.enabled: Qt.application.layoutDirection === Qt.RightToLeft + LayoutMirroring.childrenInherit: true + + Repeater { + model: screenModel + Background { + x: geometry.x; y: geometry.y; width: geometry.width; height:geometry.height + source: config.background + fillMode: Image.PreserveAspectCrop + onStatusChanged: { + if (status == Image.Error && source != config.defaultBackground) { + source = config.defaultBackground + } + } + } + } + + property bool debug: false + + Rectangle { + id: debug3 + color: "green" + visible: debug + width: 3 + height: parent.height + anchors.horizontalCenter: root.horizontalCenter + } + + Controls.StackView { + id: stackView + + //Display the loginpromt only in the primary screen + readonly property rect geometry: screenModel.geometry(screenModel.primary) + width: geometry.width + x: geometry.x + height: units.largeSpacing*14 + //Display the BreezeBlock in the middle of each screen + y: geometry.y + (geometry.height / 2) - (height / 2) + + initialItem: BreezeBlock { + id: loginPrompt + + //Enable clipping whilst animating, otherwise the items would be shifted to other screens in multiscreen setups + //As there are only 2 items (loginPrompt and logoutScreenComponent), it's sufficient to do it only in this component + //Remember to enable clipping whilst animating when creating additional items for the StackView! + Controls.Stack.onStatusChanged: { + if(Controls.Stack.status === Controls.Stack.Activating || Controls.Stack.status === Controls.Stack.Deactivating){ + stackView.clip = true; + }else if(Controls.Stack.status === Controls.Stack.Active || Controls.Stack.status === Controls.Stack.Inactive){ + stackView.clip = false; + } + } + + main: UserSelect { + model: userModel + selectedIndex: userModel.lastIndex + + //Resets the "Login Failed" notification after 3 seconds + Timer { + id: notificationResetTimer + interval: 3000 + onTriggered: notification = "" + } + + Connections { + target: sddm + onLoginFailed: { + notificationResetTimer.restart() + notification = i18nd("plasma_lookandfeel_org.kde.lookandfeel", "Login Failed") + } + } + + } + + controls: Item { + height: childrenRect.height + + property alias password: passwordInput.text + property alias sessionIndex: sessionCombo.currentIndex + property alias buttonEnabled: loginButton.enabled + property alias pwFieldEnabled: passwordInput.enabled + + ColumnLayout { + anchors.horizontalCenter: parent.horizontalCenter + spacing: 0 + RowLayout { + anchors.horizontalCenter: parent.horizontalCenter + + PlasmaComponents.Button { + id: kbdLayoutButton + implicitWidth: minimumWidth + text: keyboard.layouts[keyboard.currentLayout].shortName + visible: keyboard.layouts.length > 1 + + onClicked: { + var idx = (keyboard.currentLayout + 1) % keyboard.layouts.length; + keyboard.currentLayout = idx; + } + + KeyNavigation.tab: sessionCombo + } + + PlasmaComponents.TextField { + id: passwordInput + placeholderText: i18nd("plasma_lookandfeel_org.kde.lookandfeel","Password") + echoMode: TextInput.Password + onAccepted: loginPrompt.startLogin() + focus: true + + //focus works in qmlscene + //but this seems to be needed when loaded from SDDM + //I don't understand why, but we have seen this before in the old lock screen + Timer { + interval: 200 + running: true + onTriggered: passwordInput.forceActiveFocus() + } + //end hack + + Keys.onEscapePressed: { + loginPrompt.mainItem.forceActiveFocus(); + } + + //if empty and left or right is pressed change selection in user switch + //this cannot be in keys.onLeftPressed as then it doesn't reach the password box + Keys.onPressed: { + if (event.key == Qt.Key_Left && !text) { + loginPrompt.mainItem.decrementCurrentIndex(); + event.accepted = true + } + if (event.key == Qt.Key_Right && !text) { + loginPrompt.mainItem.incrementCurrentIndex(); + event.accepted = true + } + } + + KeyNavigation.backtab: loginPrompt.mainItem + } + + PlasmaComponents.Button { + id: loginButton + //this keeps the buttons the same width and thus line up evenly around the centre + Layout.minimumWidth: passwordInput.width + text: i18nd("plasma_lookandfeel_org.kde.lookandfeel","Login") + onClicked: loginPrompt.startLogin(); + + KeyNavigation.tab: kbdLayoutButton + } + } + + BreezeLabel { + id: capsLockWarning + text: i18nd("plasma_lookandfeel_org.kde.lookandfeel","Caps Lock is on") + visible: keystateSource.data["Caps Lock"]["Locked"] + + anchors.horizontalCenter: parent.horizontalCenter + font.weight: Font.Bold + + PlasmaCore.DataSource { + id: keystateSource + engine: "keystate" + connectedSources: "Caps Lock" + } + } + } + + PlasmaComponents.ComboBox { + id: sessionCombo + model: sessionModel + currentIndex: sessionModel.lastIndex + + width: 200 + textRole: "name" + + anchors.left: parent.left + } + + LogoutOptions { + mode: "" + canShutdown: true + canReboot: true + canLogout: false + exclusive: false + + anchors { + right: parent.right + } + + onModeChanged: { + if (mode) { + stackView.push(logoutScreenComponent, {"mode": mode}) + } + } + onVisibleChanged: if(visible) { + mode = "" + } + } + + Connections { + target: sddm + onLoginFailed: { + //Re-enable button and textfield + passwordInput.enabled = true + passwordInput.selectAll() + passwordInput.forceActiveFocus() + loginButton.enabled = true; + } + } + + } + + function startLogin () { + //Disable button and textfield while password check is running + controlsItem.pwFieldEnabled = false; + controlsItem.buttonEnabled = false; + //Clear notification in case the notificationResetTimer hasn't expired yet + mainItem.notification = "" + sddm.login(mainItem.selectedUser, controlsItem.password, controlsItem.sessionIndex) + } + + Component { + id: logoutScreenComponent + LogoutScreen { + onCancel: { + stackView.pop() + } + + onShutdownRequested: { + sddm.powerOff() + } + + onRebootRequested: { + sddm.reboot() + } + } + } + } + + } +} diff --git a/sddm-debian/metadata.desktop b/sddm-debian/metadata.desktop new file mode 100644 index 0000000..e6f22e0 --- /dev/null +++ b/sddm-debian/metadata.desktop @@ -0,0 +1,12 @@ +[SddmGreeterTheme] +Name=Debian Theme +Name[fr]=Défaut pour Debian +Description=Debian theme powered by alternatives system +Description[fr]=Thème Debian configurables par le sytème d’alternatives +Type=sddm-theme +Version=0.1 +Screenshot=sddm-preview.jpg +MainScript=Main.qml +ConfigFile=theme.conf +Theme-Id=debian-theme +Theme-API=2.0 diff --git a/sddm-debian/theme.conf b/sddm-debian/theme.conf new file mode 100644 index 0000000..7e7929f --- /dev/null +++ b/sddm-debian/theme.conf @@ -0,0 +1,2 @@ +[General] +background=/usr/share/images/desktop-base/login-background.svg