├── .reuse └── dep5 ├── .tag ├── AUTHORS.md ├── CMakeLists.txt ├── LICENSE.GPLv3 ├── LICENSE.LGPLv3 ├── LICENSES ├── BSD-3-Clause.txt ├── CC0-1.0.txt ├── GPL-3.0-or-later.txt └── LGPL-3.0-or-later.txt ├── README.md ├── cmake ├── 3rdparty │ └── FindPAM.cmake └── FindLibsystemd.cmake ├── data ├── protocols │ ├── liri-color-picker-unstable-v1.xml │ ├── liri-shell-unstable-v1.xml │ └── wlr-foreign-toplevel-management-unstable-v1.xml ├── settings │ ├── CMakeLists.txt │ ├── io.liri.desktop.background.gschema.xml.in │ ├── io.liri.desktop.interface.gschema.xml │ ├── io.liri.desktop.keybindings.gschema.xml │ ├── io.liri.desktop.lockscreen.gschema.xml.in │ ├── io.liri.desktop.panel.gschema.xml │ ├── io.liri.desktop.peripherals.gschema.xml │ ├── io.liri.hardware.screens.gschema.xml │ ├── io.liri.shell.gschema.xml │ └── io.liri.system.gschema.xml └── systemd │ ├── CMakeLists.txt │ ├── liri-shell.service.in │ └── liri-shell.target ├── features.cmake ├── src ├── compositor │ ├── CMakeLists.txt │ ├── application.cpp │ ├── application.h │ ├── images │ │ └── chrome │ │ │ ├── dropshadow-24.png │ │ │ ├── dropshadow-8.png │ │ │ ├── window-close.svg │ │ │ ├── window-maximize.svg │ │ │ ├── window-minimize.svg │ │ │ └── window-restore.svg │ ├── main.cpp │ ├── qml │ │ ├── Compositor.qml │ │ ├── KeyBindings.qml │ │ ├── ShellSettings.qml │ │ ├── desktop │ │ │ ├── Flash.qml │ │ │ ├── HardwareLayerSurfaceItem.qml │ │ │ ├── HotCorner.qml │ │ │ ├── IdleDimmer.qml │ │ │ ├── Keyboard.qml │ │ │ ├── LayerSurfaceItem.qml │ │ │ ├── LockScreenItem.qml │ │ │ ├── ModalOverlay.qml │ │ │ ├── Output.qml │ │ │ ├── OutputInfo.qml │ │ │ ├── OutputWindow.qml │ │ │ ├── PresentEffect.js │ │ │ ├── PresentWindowsChrome.qml │ │ │ ├── SessionLocker.qml │ │ │ ├── WindowSwitcher.qml │ │ │ ├── Workspace.qml │ │ │ └── WorkspacesView.qml │ │ ├── error │ │ │ ├── ErrorCompositor.qml │ │ │ ├── ErrorOutput.qml │ │ │ └── ErrorScreenView.qml │ │ ├── images │ │ │ ├── lan-connect.svg │ │ │ └── lan-disconnect.svg │ │ ├── overlays │ │ │ ├── HelpOverlay.qml │ │ │ └── UnresponsiveOverlay.qml │ │ └── windows │ │ │ ├── Chrome.qml │ │ │ ├── ChromeMenu.qml │ │ │ ├── DecorationButton.qml │ │ │ ├── MoveItem.qml │ │ │ ├── ResizeHandler.qml │ │ │ ├── TitleBar.qml │ │ │ ├── XWaylandWindow.qml │ │ │ └── XdgToplevelWindow.qml │ └── sessionmanager │ │ ├── sessionmanager.cpp │ │ └── sessionmanager.h ├── helper │ ├── CMakeLists.txt │ ├── images │ │ ├── hibernate.svg │ │ ├── logout.svg │ │ ├── reload.svg │ │ └── sleep.svg │ ├── main.cpp │ └── qml │ │ ├── AuthDialog.qml │ │ ├── BackgroundWindow.qml │ │ ├── KeyBindings.qml │ │ ├── LogoutDialog.qml │ │ ├── OsdWindow.qml │ │ ├── PowerOffDialog.qml │ │ ├── RunDialog.qml │ │ ├── TopLayerWindow.qml │ │ ├── launcher │ │ ├── AppsGrid.qml │ │ ├── AppsGridDelegate.qml │ │ ├── AppsLauncher.qml │ │ ├── CategoriesView.qml │ │ ├── FrequentAppsView.qml │ │ └── PagedGrid.qml │ │ ├── main.qml │ │ ├── notifications │ │ └── NotificationItem.qml │ │ └── panel │ │ ├── IndicatorsRow.qml │ │ ├── Panel.qml │ │ ├── PanelButton.qml │ │ ├── ShelfPane.qml │ │ ├── ShutdownIndicator.qml │ │ ├── StatusMenu.qml │ │ ├── TaskBar.qml │ │ ├── TaskDelegate.qml │ │ └── TaskMenu.qml ├── imports │ ├── compositor │ │ ├── CMakeLists.txt │ │ ├── abstracttitlebar.cpp │ │ ├── abstracttitlebar.h │ │ ├── appidandicon.cpp │ │ ├── appidandicon.h │ │ ├── chromeitem.cpp │ │ ├── chromeitem.h │ │ ├── desktoplayout.cpp │ │ ├── desktoplayout.h │ │ ├── fpscounter.cpp │ │ ├── fpscounter.h │ │ ├── helperlauncher.cpp │ │ ├── helperlauncher.h │ │ ├── hotspot.cpp │ │ ├── hotspot.h │ │ ├── keyeventfilter.cpp │ │ ├── keyeventfilter.h │ │ ├── lirishellcompositorplugin.cpp │ │ ├── protocols │ │ │ ├── liri-color-picker-unstable-v1.xml.license │ │ │ └── liri-shell-unstable-v1.xml.license │ │ ├── quickoutput.cpp │ │ ├── quickoutput.h │ │ ├── screencast.cpp │ │ ├── screencast.h │ │ ├── screenmodel.cpp │ │ ├── screenmodel.h │ │ ├── waylandcursorgrabber.cpp │ │ ├── waylandcursorgrabber.h │ │ ├── waylandliricolorpickerv1.cpp │ │ ├── waylandliricolorpickerv1.h │ │ ├── waylandliricolorpickerv1_p.h │ │ ├── waylandlirilockscreenv1_p.h │ │ ├── waylandlirimodalv1.cpp │ │ ├── waylandlirimodalv1.h │ │ ├── waylandlirimodalv1_p.h │ │ ├── waylandlirishellv1.cpp │ │ ├── waylandlirishellv1.h │ │ ├── waylandlirishellv1_p.h │ │ ├── windowmousetracker.cpp │ │ └── windowmousetracker.h │ ├── loginmanager │ │ ├── CMakeLists.txt │ │ ├── plugin.cpp │ │ ├── usersmodel.cpp │ │ └── usersmodel.h │ ├── mpris2 │ │ ├── CMakeLists.txt │ │ ├── mpris2engine.cpp │ │ ├── mpris2engine.h │ │ ├── mpris2player.cpp │ │ ├── mpris2player.h │ │ ├── org.freedesktop.DBus.Properties.xml │ │ ├── org.mpris.MediaPlayer2.Player.xml │ │ ├── org.mpris.MediaPlayer2.xml │ │ └── plugin.cpp │ ├── notifications │ │ ├── CMakeLists.txt │ │ ├── notificationsadaptor.cpp │ │ ├── notificationsadaptor.h │ │ ├── notificationsimageprovider.cpp │ │ ├── notificationsimageprovider.h │ │ ├── notificationsimagesstorage.cpp │ │ ├── notificationsimagesstorage.h │ │ ├── notificationsimageutils.cpp │ │ ├── notificationsimageutils.h │ │ ├── notificationsmodel.cpp │ │ ├── notificationsmodel.h │ │ ├── notificationsserver.cpp │ │ ├── notificationsserver.h │ │ └── plugin.cpp │ ├── policykit │ │ ├── CMakeLists.txt │ │ ├── listener_p.cpp │ │ ├── listener_p.h │ │ ├── plugin.cpp │ │ ├── policykitagent.cpp │ │ └── policykitagent.h │ ├── shell-private │ │ ├── CMakeLists.txt │ │ ├── dbus │ │ │ ├── multimediakeysserver.cpp │ │ │ ├── multimediakeysserver.h │ │ │ ├── osdserver.cpp │ │ │ └── osdserver.h │ │ ├── logging.cpp │ │ ├── logging.h │ │ └── plugin.cpp │ ├── shell │ │ ├── Background.qml │ │ ├── CMakeLists.txt │ │ ├── Indicator.qml │ │ ├── LoginGreeter.qml │ │ ├── PanelItem.qml │ │ ├── StatusAreaExtension.qml │ │ ├── UserDelegate.qml │ │ ├── extensionsmodel.cpp │ │ ├── extensionsmodel.h │ │ ├── lirishellv1.cpp │ │ ├── lirishellv1.h │ │ ├── multimediakeysclient.cpp │ │ ├── multimediakeysclient.h │ │ ├── osdclient.cpp │ │ └── osdclient.h │ ├── storage │ │ ├── CMakeLists.txt │ │ ├── plugin.cpp │ │ ├── plugins.qmltypes │ │ ├── qmldir │ │ ├── storagedevice.cpp │ │ ├── storagedevice.h │ │ ├── storagemodel.cpp │ │ └── storagemodel.h │ ├── taskmanager │ │ ├── CMakeLists.txt │ │ ├── application.cpp │ │ ├── application.h │ │ ├── applicationsmodel.cpp │ │ ├── applicationsmodel.h │ │ ├── appusage.cpp │ │ ├── appusage.h │ │ ├── categoriesmodel.cpp │ │ ├── categoriesmodel.h │ │ ├── frequentmodel.cpp │ │ ├── frequentmodel.h │ │ ├── pagemodel.cpp │ │ ├── pagemodel.h │ │ ├── plugin.cpp │ │ ├── qmldir │ │ ├── tasksmodel.cpp │ │ ├── tasksmodel.h │ │ ├── usagetracker.cpp │ │ ├── usagetracker.h │ │ ├── utils_p.h │ │ ├── wlrforeigntoplevelmanagementv1.cpp │ │ ├── wlrforeigntoplevelmanagementv1.h │ │ ├── wlrforeigntoplevelmanagementv1_p.h │ │ ├── xdgutils.cpp │ │ └── xdgutils.h │ └── utils │ │ ├── CMakeLists.txt │ │ ├── qqmlsortfilterproxymodel.cpp │ │ └── qqmlsortfilterproxymodel.h ├── lockscreen │ ├── CMakeLists.txt │ ├── authenticator.cpp │ ├── authenticator.h │ ├── main.cpp │ └── qml │ │ ├── LockScreenWindow.qml │ │ └── main.qml ├── plugins │ └── statusarea │ │ ├── datetime │ │ ├── CMakeLists.txt │ │ ├── contents │ │ │ └── main.qml │ │ ├── metadata.desktop │ │ └── metadata.desktop.in │ │ ├── notifications │ │ ├── CMakeLists.txt │ │ ├── contents │ │ │ └── main.qml │ │ ├── metadata.desktop │ │ └── metadata.desktop.in │ │ ├── storage │ │ ├── CMakeLists.txt │ │ ├── contents │ │ │ ├── images │ │ │ │ ├── disk.svg │ │ │ │ ├── eject.svg │ │ │ │ └── harddisk.svg │ │ │ └── main.qml │ │ ├── metadata.desktop │ │ └── metadata.desktop.in │ │ └── user │ │ ├── CMakeLists.txt │ │ ├── contents │ │ └── main.qml │ │ ├── metadata.desktop │ │ └── metadata.desktop.in └── sddm │ ├── CMakeLists.txt │ ├── DesktopStill.qml │ ├── Greeter.qml │ ├── InputPanel.qml │ ├── Main.qml │ ├── components │ ├── Indicator.qml │ └── VirtualKeyboard.qml │ ├── dummydata │ ├── keyboard.qml │ ├── screenModel.qml │ ├── sddm.qml │ ├── sessionModel.qml │ ├── tyrion.png │ └── userModel.qml │ ├── images │ ├── hibernate.svg │ ├── keyboard-variant.svg │ ├── logo.png │ ├── logout.svg │ ├── reload.svg │ └── sleep.svg │ ├── indicators │ ├── Keyboard.qml │ ├── PowerOff.qml │ ├── Session.qml │ └── VirtualKeyboard.qml │ ├── metadata.desktop │ ├── screenshot.png │ └── theme.conf ├── tools └── dropshadow │ ├── README.md │ ├── dropshadow-24.qml │ └── dropshadow-8.qml └── translations ├── compositor ├── compositor.ts ├── compositor_da.ts ├── compositor_de.ts ├── compositor_fr.ts ├── compositor_it.ts ├── compositor_lt.ts ├── compositor_nl.ts ├── compositor_pl.ts ├── compositor_pt_BR.ts ├── compositor_ru.ts └── compositor_tr.ts └── statusarea ├── datetime ├── datetime.ts ├── de.po ├── lt.po ├── metadata.pot ├── nl.po ├── pt_BR.po └── tr.po ├── notifications ├── de.po ├── lt.po ├── metadata.pot ├── nl.po ├── notifications.ts ├── notifications_de.ts ├── notifications_lt.ts ├── notifications_nl.ts ├── notifications_pt_BR.ts ├── notifications_tr.ts ├── pt_BR.po └── tr.po ├── storage ├── de.po ├── lt.po ├── metadata.pot ├── nl.po ├── pt_BR.po ├── storage.ts ├── storage_de.ts ├── storage_lt.ts ├── storage_nl.ts ├── storage_pt_BR.ts ├── storage_tr.ts └── tr.po └── user ├── de.po ├── lt.po ├── metadata.pot ├── nl.po ├── pt_BR.po ├── tr.po └── user.ts /.reuse/dep5: -------------------------------------------------------------------------------- 1 | Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ 2 | Upstream-Name: Shell 3 | Source: https://github.com/lirios/shell 4 | 5 | Files: .tag 6 | Copyright: none 7 | License: CC0-1.0 8 | 9 | Files: .github/workflows/*.yml 10 | Copyright: none 11 | License: CC0-1.0 12 | 13 | Files: .github/desktop.png 14 | Copyright: 2021 Pier Luigi Fiorini 15 | License: CC0-1.0 16 | 17 | Files: .tx/* 18 | Copyright: none 19 | License: CC0-1.0 20 | 21 | Files: data/settings/*.xml 22 | Copyright: 2021 Pier Luigi Fiorini 23 | License: CC0-1.0 24 | 25 | Files: data/settings/*.xml.in 26 | Copyright: 2021 Pier Luigi Fiorini 27 | License: CC0-1.0 28 | 29 | Files: data/systemd/*.service* 30 | Copyright: none 31 | License: CC0-1.0 32 | 33 | Files: data/systemd/*.target* 34 | Copyright: none 35 | License: CC0-1.0 36 | 37 | Files: translations/* 38 | Copyright: 2020 Liri Translators 39 | License: CC0-1.0 40 | 41 | Files: **/qmldir 42 | Copyright: none 43 | License: CC0-1.0 44 | 45 | Files: **/*.qmltypes 46 | Copyright: none 47 | License: CC0-1.0 48 | 49 | Files: **/*.qrc 50 | Copyright: none 51 | License: CC0-1.0 52 | 53 | Files: **/*.desktop 54 | Copyright: none 55 | License: CC0-1.0 56 | 57 | Files: **/*.desktop.in 58 | Copyright: none 59 | License: CC0-1.0 60 | 61 | Files: CMakeLists.txt 62 | Copyright: 2021 Pier Luigi Fiorini 63 | License: BSD-3-Clause 64 | 65 | Files: **/CMakeLists.txt 66 | Copyright: 2021 Pier Luigi Fiorini 67 | License: BSD-3-Clause 68 | 69 | Files: AUTHORS.md 70 | Copyright: 2021 Pier Luigi Fiorini 71 | License: CC0-1.0 72 | 73 | Files: README.md 74 | Copyright: 2021 Pier Luigi Fiorini 75 | License: CC0-1.0 76 | -------------------------------------------------------------------------------- /.tag: -------------------------------------------------------------------------------- 1 | fbc33a4d851b878c391e6f544672005f6aed3b96 2 | -------------------------------------------------------------------------------- /AUTHORS.md: -------------------------------------------------------------------------------- 1 | Shell 2 | ===== 3 | 4 | # Core Developers 5 | 6 | * Pier Luigi Fiorini 7 | 8 | # Contributors 9 | 10 | You can see the list of contributors to this code base, 11 | and the number of their commits with: 12 | 13 | ```sh 14 | git shortlog -s -e -n 15 | ``` 16 | -------------------------------------------------------------------------------- /LICENSES/BSD-3-Clause.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) . All rights reserved. 2 | 3 | Redistribution and use in source and binary forms, with or without modification, 4 | are permitted provided that the following conditions are met: 5 | 6 | 1. Redistributions of source code must retain the above copyright notice, 7 | this list of conditions and the following disclaimer. 8 | 9 | 2. Redistributions in binary form must reproduce the above copyright notice, 10 | this list of conditions and the following disclaimer in the documentation 11 | and/or other materials provided with the distribution. 12 | 13 | 3. Neither the name of the copyright holder nor the names of its contributors 14 | may be used to endorse or promote products derived from this software without 15 | specific prior written permission. 16 | 17 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 18 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 | ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 21 | LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 23 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 24 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 25 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE 26 | USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 | -------------------------------------------------------------------------------- /cmake/FindLibsystemd.cmake: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2021 Pier Luigi Fiorini 2 | # 3 | # SPDX-License-Identifier: BSD-3-Clause 4 | 5 | find_package(PkgConfig) 6 | 7 | pkg_check_modules(Libsystemd libsystemd IMPORTED_TARGET) 8 | -------------------------------------------------------------------------------- /data/settings/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | install( 2 | FILES 3 | io.liri.desktop.interface.gschema.xml 4 | io.liri.desktop.keybindings.gschema.xml 5 | io.liri.desktop.panel.gschema.xml 6 | io.liri.desktop.peripherals.gschema.xml 7 | io.liri.shell.gschema.xml 8 | io.liri.hardware.screens.gschema.xml 9 | io.liri.system.gschema.xml 10 | DESTINATION 11 | "${KDE_INSTALL_DATADIR}/glib-2.0/schemas" 12 | ) 13 | 14 | set(DATADIR "${KDE_INSTALL_FULL_DATADIR}") 15 | configure_file( 16 | "io.liri.desktop.background.gschema.xml.in" 17 | "${CMAKE_CURRENT_BINARY_DIR}/io.liri.desktop.background.gschema.xml" 18 | @ONLY 19 | ) 20 | configure_file( 21 | "io.liri.desktop.lockscreen.gschema.xml.in" 22 | "${CMAKE_CURRENT_BINARY_DIR}/io.liri.desktop.lockscreen.gschema.xml" 23 | @ONLY 24 | ) 25 | install( 26 | FILES 27 | "${CMAKE_CURRENT_BINARY_DIR}/io.liri.desktop.background.gschema.xml" 28 | "${CMAKE_CURRENT_BINARY_DIR}/io.liri.desktop.lockscreen.gschema.xml" 29 | DESTINATION 30 | "${KDE_INSTALL_DATADIR}/glib-2.0/schemas" 31 | ) 32 | -------------------------------------------------------------------------------- /data/settings/io.liri.desktop.panel.gschema.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 'bottom' 12 | Panel Location 13 | 14 | Which screen edge to place the panel on. 15 | Possible values are "top", "bottom", "left" or "right". 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 'medium' 25 | Panel Size 26 | 27 | Height of panel if horizontal, or the width if it is vertical. 28 | Possible values are "small", "medium" or "large". 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 'never' 37 | Panel Hide Policy 38 | 39 | Hide the panel when it isn't being used. 40 | 41 | 42 | 43 | ['io.liri.Terminal', 'io.liri.Settings'] 44 | Pinned launchers 45 | 46 | Launchers that appear permanently on the panel, regardless of whether they are running or not. 47 | 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /data/settings/io.liri.hardware.screens.gschema.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | '' 6 | Primary screen 7 | 8 | The name of the screen where the panel is shown. 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /data/settings/io.liri.shell.gschema.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | true 6 | XWayland support 7 | 8 | If set to true, XWayland support is enabled. 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 'Meta' 17 | Modifier to use for extended window management operations 18 | 19 | This key is used for extended window management operations, for example 20 | dragging windows from the contents rather than their decoration. 21 | 22 | The default is intended to be the "Windows" key on PC hardware or the 23 | "Command" key on Mac hardware. 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /data/settings/io.liri.system.gschema.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | false 6 | Developer mode 7 | 8 | Developer mode allows access to advanced features that 9 | are not meant for normal users. 10 | Set this to TRUE to enable developer mode. 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /data/systemd/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | set(ABSOLUTE_BINDIR "${KDE_INSTALL_FULL_BINDIR}") 2 | set(ABSOLUTE_LIBEXECDIR "${KDE_INSTALL_FULL_LIBEXECDIR}") 3 | configure_file( 4 | "liri-shell.service.in" 5 | "${CMAKE_CURRENT_BINARY_DIR}/liri-shell.service" 6 | @ONLY 7 | ) 8 | 9 | install( 10 | FILES 11 | liri-shell.target 12 | "${CMAKE_CURRENT_BINARY_DIR}/liri-shell.service" 13 | DESTINATION 14 | "${KDE_INSTALL_SYSTEMDUSERUNITDIR}" 15 | ) 16 | -------------------------------------------------------------------------------- /data/systemd/liri-shell.service.in: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Liri Shell 3 | PartOf=liri-shell.target 4 | # Don't manually start/stop 5 | RefuseManualStart=on 6 | RefuseManualStop=on 7 | # Force a session shutdown when this exits for a logout or a crash, 8 | # because we are a display server 9 | OnFailure=liri-session-shutdown.service 10 | OnFailureJobMode=replace-irreversibly 11 | CollectMode=inactive-or-failed 12 | 13 | [Service] 14 | Type=notify 15 | ExecStart=@ABSOLUTE_LIBEXECDIR@/liri-shell 16 | ExecStopPost=@ABSOLUTE_BINDIR@/liri-session-ctl --logout 17 | # Don't restart, this is a display server 18 | Restart=no 19 | # Avoid hangup at startup 20 | TimeoutStartSec=15 21 | # Make sure any child process is gone after this long 22 | TimeoutStopSec=5 23 | # Keep-alive every 20 seconds 24 | WatchdogSec=20 25 | # Clean the environment 26 | UnsetEnvironment=QT_QPA_PLATFORM QT_WAYLAND_SHELL_INTEGRATION 27 | -------------------------------------------------------------------------------- /data/systemd/liri-shell.target: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Graphical environment 3 | BindsTo=liri-shell.service 4 | After=liri-shell.service 5 | # Don't manually start/stop 6 | RefuseManualStart=on 7 | RefuseManualStop=on 8 | -------------------------------------------------------------------------------- /features.cmake: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2021 Pier Luigi Fiorini 2 | # 3 | # SPDX-License-Identifier: BSD-3-Clause 4 | 5 | ## Find prctl.h: 6 | include(CheckIncludeFile) 7 | check_include_file("sys/prctl.h" HAVE_SYS_PRCTL_H) 8 | 9 | ## Find Qt: 10 | find_package(Qt6 "6.6.0" 11 | REQUIRED 12 | COMPONENTS 13 | Core 14 | Concurrent 15 | DBus 16 | Xml 17 | Sql 18 | Gui 19 | WaylandClient 20 | Widgets 21 | Svg 22 | Qml 23 | Quick 24 | QuickControls2 25 | LinguistTools 26 | ) 27 | 28 | if(NOT COMMAND aurora_generate_wayland_protocol_client_sources) 29 | ## Find Aurora Scanner: 30 | find_package(AuroraScanner REQUIRED) 31 | endif() 32 | 33 | #### Features 34 | 35 | # liri-development-build 36 | option(FEATURE_liri_development_build "Development build" OFF) 37 | add_feature_info("Liri::DevelopmentBuild" FEATURE_liri_development_build "Build Liri Shell for development") 38 | set(LIRI_FEATURE_liri_development_build "$") 39 | 40 | # liri-enable-systemd 41 | option(FEATURE_shell_enable_systemd "Enable systemd support" ON) 42 | if(FEATURE_shell_enable_systemd) 43 | find_package(Libsystemd QUIET) 44 | 45 | if(NOT TARGET PkgConfig::Libsystemd) 46 | message(WARNING "You need libsystemd for Shell::Systemd") 47 | set(FEATURE_enable_systemd OFF) 48 | endif() 49 | endif() 50 | add_feature_info("Shell::Systemd" FEATURE_shell_enable_systemd "Enable systemd support") 51 | set(LIRI_FEATURE_shell_enable_systemd "$") 52 | 53 | ## Features summary: 54 | if(NOT LIRI_SUPERBUILD) 55 | feature_summary(WHAT ENABLED_FEATURES DISABLED_FEATURES) 56 | endif() 57 | -------------------------------------------------------------------------------- /src/compositor/application.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2018 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | #pragma once 6 | 7 | #include 8 | #include 9 | #include 10 | 11 | QT_FORWARD_DECLARE_CLASS(QQmlApplicationEngine) 12 | 13 | class ScreenSaver; 14 | class SessionManager; 15 | 16 | class Application : public QObject 17 | { 18 | Q_OBJECT 19 | public: 20 | explicit Application(QObject *parent = nullptr); 21 | 22 | QString screenConfigurationFileName() const; 23 | void setScreenConfigurationFileName(const QString &fileName); 24 | 25 | void setUrl(const QUrl &url); 26 | 27 | protected: 28 | void customEvent(QEvent *event) override; 29 | 30 | private: 31 | QUrl m_url; 32 | QQmlApplicationEngine *m_appEngine; 33 | SessionManager *m_sessionManager; 34 | bool m_failSafe; 35 | bool m_started; 36 | QString m_screenConfigFileName; 37 | 38 | void verifyXdgRuntimeDir(); 39 | 40 | private Q_SLOTS: 41 | void startup(); 42 | void shutdown(); 43 | void objectCreated(QObject *object, const QUrl &); 44 | }; 45 | 46 | class StartupEvent : public QEvent 47 | { 48 | public: 49 | StartupEvent(); 50 | }; 51 | -------------------------------------------------------------------------------- /src/compositor/images/chrome/dropshadow-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lirios/shell/fbc33a4d851b878c391e6f544672005f6aed3b96/src/compositor/images/chrome/dropshadow-24.png -------------------------------------------------------------------------------- /src/compositor/images/chrome/dropshadow-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lirios/shell/fbc33a4d851b878c391e6f544672005f6aed3b96/src/compositor/images/chrome/dropshadow-8.png -------------------------------------------------------------------------------- /src/compositor/images/chrome/window-close.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/compositor/images/chrome/window-maximize.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/compositor/images/chrome/window-minimize.svg: -------------------------------------------------------------------------------- 1 | 2 | 17 | 19 | 20 | 22 | image/svg+xml 23 | 25 | 26 | 27 | 28 | 30 | 50 | 54 | 55 | -------------------------------------------------------------------------------- /src/compositor/images/chrome/window-restore.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/compositor/qml/desktop/Flash.qml: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2021 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | import QtQuick 6 | 7 | Rectangle { 8 | id: flash 9 | 10 | anchors.fill: parent 11 | 12 | color: "white" 13 | opacity: 0.0 14 | 15 | SequentialAnimation { 16 | id: flashAnimation 17 | 18 | OpacityAnimator { 19 | easing.type: Easing.OutQuad 20 | target: flash 21 | from: 0.0 22 | to: 1.0 23 | duration: 250 24 | } 25 | OpacityAnimator { 26 | easing.type: Easing.OutQuad 27 | target: flash 28 | from: 1.0 29 | to: 0.0 30 | duration: 250 31 | } 32 | } 33 | 34 | function flash() { 35 | flashAnimation.start(); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/compositor/qml/desktop/HardwareLayerSurfaceItem.qml: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2019 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | import QtQuick 6 | import Aurora.Compositor 7 | 8 | LayerSurfaceItem { 9 | property alias stackingLevel: hwLayer.stackingLevel 10 | 11 | WaylandHardwareLayer { 12 | id: hwLayer 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/compositor/qml/desktop/IdleDimmer.qml: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2017 Michael Spencer 2 | // SPDX-FileCopyrightText: 2018 Pier Luigi Fiorini 3 | // 4 | // SPDX-License-Identifier: GPL-3.0-or-later 5 | 6 | import QtQuick 7 | import Fluid.Controls as FluidControls 8 | import Liri.Shell.Compositor as LS 9 | 10 | Rectangle { 11 | id: idleDimmer 12 | 13 | color: "black" 14 | opacity: 0.0 15 | 16 | function fadeIn() { 17 | if (idleDimmer.opacity > 0.0) 18 | return; 19 | 20 | // Make sure the power on timer is stopped 21 | idleDimmerTimer.stop(); 22 | 23 | idleDimmerAnimator.from = 0.0; 24 | idleDimmerAnimator.to = 1.0; 25 | idleDimmerAnimator.start(); 26 | } 27 | 28 | function fadeOut() { 29 | if (idleDimmer.opacity < 1.0) 30 | return; 31 | 32 | // Use a timer to compensate for power on time 33 | idleDimmerTimer.start(); 34 | } 35 | 36 | onOpacityChanged: { 37 | // Power off output when fade out has finished 38 | if (opacity == 1.0) 39 | output.screen.powerState = LS.ScreenItem.PowerStateStandby; 40 | } 41 | 42 | OpacityAnimator { 43 | id: idleDimmerAnimator 44 | 45 | target: idleDimmer 46 | easing.type: Easing.OutSine 47 | duration: FluidControls.Units.longDuration 48 | } 49 | 50 | Timer { 51 | id: idleDimmerTimer 52 | 53 | interval: 1000 54 | repeat: false 55 | onTriggered: { 56 | idleDimmerAnimator.from = 1.0; 57 | idleDimmerAnimator.to = 0.0; 58 | idleDimmerAnimator.start(); 59 | } 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /src/compositor/qml/desktop/Keyboard.qml: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2021 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | import QtQuick 6 | import QtQuick.VirtualKeyboard 7 | 8 | InputPanel { 9 | id: keyboard 10 | 11 | anchors.left: parent.left 12 | anchors.right: parent.right 13 | visible: active 14 | } 15 | -------------------------------------------------------------------------------- /src/compositor/qml/desktop/ModalOverlay.qml: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2021 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | import QtQuick 6 | import QtQuick.Controls.Material 7 | 8 | Rectangle { 9 | id: modalOverlay 10 | 11 | Material.theme: Material.Light 12 | 13 | anchors.fill: parent 14 | color: Material.backgroundDimColor 15 | opacity: liriCompositor.showModalOverlay ? 1.0 : 0.0 16 | enabled: liriCompositor.showModalOverlay 17 | 18 | Behavior on opacity { 19 | NumberAnimation { duration: 150 } 20 | } 21 | 22 | HoverHandler { 23 | grabPermissions: HoverHandler.CanTakeOverFromAnything 24 | } 25 | 26 | TapHandler { 27 | grabPermissions: TapHandler.CanTakeOverFromAnything 28 | onTapped: { 29 | liriModal.sendDone(); 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/compositor/qml/desktop/SessionLocker.qml: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2022 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | import QtQuick 6 | import QtQuick.Controls 7 | import QtQuick.Layouts 8 | import Fluid.Controls as FluidControls 9 | 10 | Rectangle { 11 | color: "black" 12 | 13 | TapHandler { 14 | acceptedButtons: Qt.LeftButton | Qt.RightButton | Qt.MiddleButton 15 | cursorShape: Qt.ArrowCursor 16 | } 17 | 18 | HoverHandler { 19 | cursorShape: Qt.ArrowCursor 20 | } 21 | 22 | ColumnLayout { 23 | anchors.centerIn: parent 24 | 25 | FluidControls.Placeholder { 26 | Layout.alignment: Qt.AlignVCenter 27 | 28 | icon.source: FluidControls.Utils.iconUrl("action/lock") 29 | text: qsTr("Session Locked") 30 | subText: qsTr("The session has been locked") 31 | } 32 | 33 | Button { 34 | Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter 35 | 36 | text: qsTr("Log Out") 37 | 38 | onClicked: liriCompositor.quit() 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/compositor/qml/error/ErrorOutput.qml: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2018 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | import QtQuick 6 | import QtQuick.Window 7 | import Aurora.Compositor 8 | import Liri.Shell.Compositor as LS 9 | 10 | LS.WaylandOutput { 11 | id: output 12 | 13 | readonly property bool primary: liriCompositor.defaultOutput === this 14 | 15 | window: Window { 16 | id: outputWindow 17 | 18 | x: output.position.x 19 | y: output.position.y 20 | width: output.geometry.width 21 | height: output.geometry.height 22 | flags: Qt.Window | Qt.FramelessWindowHint 23 | screen: output.screen ? Qt.application.screens[output.screen.screenIndex] : null 24 | color: "black" 25 | visible: true 26 | 27 | WaylandMouseTracker { 28 | id: mouseTracker 29 | 30 | anchors.fill: parent 31 | windowSystemCursorEnabled: containsMouse 32 | 33 | ErrorScreenView { 34 | id: screenView 35 | anchors.fill: parent 36 | } 37 | 38 | LS.WaylandCursorGrabber { 39 | seat: output.compositor.defaultSeat 40 | grab: mouseTracker.containsMouse 41 | } 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/compositor/qml/error/ErrorScreenView.qml: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2018 Pier Luigi Fiorini 2 | // SPDX-FileCopyrightText: 2017 Michael Spencer 3 | // 4 | // SPDX-License-Identifier: GPL-3.0-or-later 5 | 6 | import QtQuick 7 | import QtQuick.Layouts 8 | import QtQuick.Controls 9 | import QtQuick.Controls.Material 10 | import Fluid.Controls as FluidControls 11 | 12 | Rectangle { 13 | Material.theme: Material.Dark 14 | 15 | color: Material.color(Material.Red) 16 | 17 | ColumnLayout { 18 | anchors.centerIn: parent 19 | 20 | spacing: 0 21 | 22 | FluidControls.Icon { 23 | source: FluidControls.Utils.iconUrl("alert/warning") 24 | size: 96 25 | 26 | Layout.alignment: Qt.AlignHCenter 27 | } 28 | 29 | Item { 30 | Layout.minimumHeight: 8 31 | } 32 | 33 | FluidControls.DisplayLabel { 34 | text: qsTr("Oh no!") 35 | color: Material.primaryTextColor 36 | 37 | Layout.alignment: Qt.AlignHCenter 38 | } 39 | 40 | FluidControls.SubheadingLabel { 41 | text: qsTr("Something went wrong and the desktop failed to load.") 42 | color: Material.primaryTextColor 43 | 44 | Layout.alignment: Qt.AlignHCenter 45 | } 46 | 47 | Item { 48 | Layout.minimumHeight: 24 49 | } 50 | 51 | Button { 52 | text: qsTr("Quit") 53 | onClicked: liriCompositor.quit() 54 | 55 | Layout.alignment: Qt.AlignHCenter 56 | 57 | Material.background: "white" 58 | Material.theme: Material.Light 59 | Material.elevation: 2 60 | } 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /src/compositor/qml/images/lan-connect.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/compositor/qml/images/lan-disconnect.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/compositor/qml/overlays/HelpOverlay.qml: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2021 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | import QtQuick 6 | 7 | Rectangle { 8 | width: 100 9 | height: 62 10 | } 11 | 12 | -------------------------------------------------------------------------------- /src/compositor/qml/windows/ChromeMenu.qml: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2018 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | import QtQuick 6 | import QtQuick.Controls 7 | import Fluid.Controls 8 | 9 | Menu { 10 | focus: false 11 | 12 | MenuItem { 13 | focusPolicy: Qt.NoFocus 14 | text: qsTr("Minimize") 15 | onClicked: chrome.window.minimized = true 16 | } 17 | 18 | MenuItem { 19 | focusPolicy: Qt.NoFocus 20 | text: qsTr("Restore") 21 | height: chrome.window.maximized ? implicitHeight : 0 22 | onClicked: chrome.window.sendUnmaximized() 23 | } 24 | 25 | MenuItem { 26 | focusPolicy: Qt.NoFocus 27 | text: qsTr("Maximize") 28 | height: chrome.window.maximized ? 0 : implicitHeight 29 | onClicked: chrome.window.sendMaximized(shellSurfaceItem.output) 30 | } 31 | 32 | MenuSeparator {} 33 | 34 | MenuItem { 35 | focusPolicy: Qt.NoFocus 36 | text: qsTr("Move") 37 | } 38 | 39 | MenuItem { 40 | focusPolicy: Qt.NoFocus 41 | text: qsTr("Resize") 42 | } 43 | 44 | MenuSeparator {} 45 | 46 | MenuItem { 47 | text: qsTr("Close") 48 | onClicked: chrome.window.sendClose() 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/compositor/qml/windows/DecorationButton.qml: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2018 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | import QtQuick 6 | import QtQuick.Controls 7 | 8 | ToolButton { 9 | display: ToolButton.IconOnly 10 | padding: 0 11 | spacing: 0 12 | 13 | background: Item { 14 | anchors.fill: parent 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/compositor/qml/windows/MoveItem.qml: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2018 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | import QtQuick 6 | 7 | Item { 8 | id: moveItem 9 | 10 | property bool moving: false 11 | 12 | ParallelAnimation { 13 | id: moveAnimation 14 | 15 | alwaysRunToEnd: true 16 | 17 | SmoothedAnimation { 18 | id: xAnimator 19 | 20 | target: moveItem 21 | property: "x" 22 | duration: 250 23 | } 24 | 25 | SmoothedAnimation { 26 | id: yAnimator 27 | 28 | target: moveItem 29 | property: "y" 30 | duration: 250 31 | } 32 | } 33 | 34 | function animateTo(dx, dy) { 35 | xAnimator.to = dx; 36 | yAnimator.to = dy; 37 | moveAnimation.start(); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/compositor/qml/windows/ResizeHandler.qml: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2021 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | import QtQuick 6 | 7 | DragHandler { 8 | property int edges: 0 9 | property bool resizing: false 10 | property point initialPosition: Qt.point(-1, -1) 11 | property size initialSize: Qt.size(0, 0) 12 | property size lastSize: Qt.size(0, 0) 13 | 14 | target: null 15 | grabPermissions: DragHandler.CanTakeOverFromHandlersOfSameType 16 | enabled: shellSurfaceItem.inputEventsEnabled && visible 17 | onGrabChanged: { 18 | resizing = false; 19 | } 20 | onCentroidChanged: { 21 | if (!active) 22 | return; 23 | 24 | if (!resizing) { 25 | initialPosition = centroid.scenePosition; 26 | initialSize = Qt.size(shellSurfaceWidth, shellSurfaceHeight); 27 | lastSize = initialSize; 28 | resizing = true; 29 | } 30 | 31 | var deltaX = centroid.scenePosition.x - initialPosition.x; 32 | var deltaY = centroid.scenePosition.y - initialPosition.y; 33 | var delta = Qt.point(deltaX, deltaY); 34 | var newSize = chrome.window.sizeForResize(initialSize, delta, edges); 35 | chrome.window.sendResizing(newSize); 36 | 37 | if (edges & Qt.LeftEdge) 38 | chrome.window.moveItem.x += lastSize.width - newSize.width; 39 | if (edges & Qt.TopEdge) 40 | chrome.window.moveItem.y += lastSize.height - newSize.height; 41 | 42 | lastSize = newSize; 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/compositor/sessionmanager/sessionmanager.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2018 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | #ifndef SESSIONMANAGER_H 6 | #define SESSIONMANAGER_H 7 | 8 | #include 9 | #include 10 | 11 | Q_DECLARE_LOGGING_CATEGORY(SESSION_MANAGER) 12 | 13 | class SessionManager : public QObject 14 | { 15 | Q_OBJECT 16 | public: 17 | SessionManager(QObject *parent = nullptr); 18 | virtual ~SessionManager(); 19 | 20 | public Q_SLOTS: 21 | void registerService(); 22 | }; 23 | 24 | #endif // SESSIONMANAGER_H 25 | -------------------------------------------------------------------------------- /src/helper/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | include(CheckIncludeFile) 2 | check_include_file("sys/prctl.h" HAVE_SYS_PRCTL_H) 3 | 4 | if(FEATURE_enable_systemd) 5 | find_package(Libsystemd REQUIRED) 6 | endif() 7 | 8 | include(LiriSetGitHeadRevision) 9 | liri_set_git_head_revision(_git_rev) 10 | 11 | add_executable(LiriShellHelper main.cpp) 12 | 13 | file(GLOB_RECURSE _qml_files RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" CMAKE_CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/qml/*.qml") 14 | file(GLOB_RECURSE _image_files RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" CMAKE_CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/images/*") 15 | qt6_add_qml_module(LiriShellHelper 16 | URI helper 17 | QML_FILES ${_qml_files} 18 | RESOURCES ${_image_files} 19 | ) 20 | 21 | target_compile_definitions(LiriShellHelper PRIVATE GIT_REV="${_git_rev}") 22 | 23 | set_target_properties(LiriShellHelper PROPERTIES OUTPUT_NAME "liri-shell-helper") 24 | 25 | target_compile_definitions(LiriShellHelper 26 | PRIVATE 27 | LIRISHELL_VERSION="${PROJECT_VERSION}" 28 | ) 29 | 30 | if(LIRI_FEATURE_liri_development_build) 31 | target_compile_definitions(LiriShellHelper PRIVATE -DDEVELOPMENT_BUILD) 32 | endif() 33 | if(HAVE_SYS_PRCTL_H) 34 | target_compile_definitions(LiriShellHelper PRIVATE -DHAVE_SYS_PRCTL_H) 35 | endif() 36 | if(FEATURE_shell_enable_systemd) 37 | target_compile_definitions(LiriShellHelper PRIVATE -DHAVE_SHAVE_SYSTEMD) 38 | target_link_libraries(LiriShellHelper PRIVATE PkgConfig::Libsystemd) 39 | endif() 40 | 41 | target_link_libraries(LiriShellHelper 42 | PRIVATE 43 | Qt6::Core 44 | Qt6::DBus 45 | Qt6::Gui 46 | Qt6::GuiPrivate 47 | Qt6::Qml 48 | Qt6::Quick 49 | ) 50 | 51 | install(TARGETS LiriShellHelper 52 | DESTINATION ${KDE_INSTALL_LIBEXECDIR} 53 | ) 54 | -------------------------------------------------------------------------------- /src/helper/images/hibernate.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/helper/images/logout.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/helper/images/reload.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/helper/images/sleep.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/helper/qml/KeyBindings.qml: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2020 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | import QtQuick 6 | import QtGSettings as Settings 7 | import Fluid.Core as FluidCore 8 | import Liri.Shell as Shell 9 | 10 | FluidCore.Object { 11 | Settings.GSettings { 12 | id: wmKeybindings 13 | 14 | schema.id: "io.liri.desktop.keybindings.wm" 15 | schema.path: "/io/liri/desktop/keybindings/wm/" 16 | } 17 | 18 | Settings.GSettings { 19 | id: smKeybindings 20 | 21 | schema.id: "io.liri.desktop.keybindings.sm" 22 | schema.path: "/io/liri/desktop/keybindings/sm/" 23 | } 24 | 25 | Settings.GSettings { 26 | id: desktopKeybindings 27 | 28 | schema.id: "io.liri.desktop.keybindings.desktop" 29 | schema.path: "/io/liri/desktop/keybindings/desktop/" 30 | } 31 | 32 | /* 33 | * Window Manager 34 | */ 35 | 36 | Shell.LiriShortcutV1 { 37 | sequence: wmKeybindings.mainMenu 38 | onActivated: { 39 | panelWindow; 40 | } 41 | } 42 | 43 | /* 44 | * Session Manager 45 | */ 46 | 47 | Shell.LiriShortcutV1 { 48 | sequence: smKeybindings.powerOff 49 | onActivated: { 50 | powerOffDialog.show(); 51 | } 52 | } 53 | 54 | /* 55 | * Desktop 56 | */ 57 | 58 | Shell.LiriShortcutV1 { 59 | sequence: desktopKeybindings.runCommand 60 | onActivated: { 61 | runDialog.show(); 62 | } 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /src/helper/qml/launcher/AppsGrid.qml: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2017 Michael Spencer 2 | // SPDX-FileCopyrightText: 2018 Pier Luigi Fiorini 3 | // 4 | // SPDX-License-Identifier: GPL-3.0-or-later 5 | 6 | import QtQuick 7 | import Fluid.Controls as FluidControls 8 | import Liri.Shell.Utils as Utils 9 | 10 | PagedGrid { 11 | id: gridView 12 | 13 | property alias query: appsProxyModel.filterPattern 14 | 15 | property int cellSize: 130 16 | 17 | width: columns * cellSize 18 | height: rows * cellSize 19 | 20 | rows: 4 21 | columns: 6 22 | 23 | function filterByCategory(category) { 24 | appsCategoryProxyModel.filterPattern = category; 25 | } 26 | 27 | model: Utils.SortFilterProxyModel { 28 | id: appsProxyModel 29 | 30 | sourceModel: Utils.SortFilterProxyModel { 31 | id: appsCategoryProxyModel 32 | 33 | sourceModel: appsModel 34 | filterRoleName: "categories" 35 | filterCaseSensitivity: Qt.CaseInsensitive 36 | } 37 | filterRoleName: "filterInfo" 38 | filterCaseSensitivity: Qt.CaseInsensitive 39 | isSortLocaleAware: true 40 | sortCaseSensitivity: Qt.CaseSensitive 41 | sortOrder: Qt.AscendingOrder 42 | sortRoleName: "name" 43 | } 44 | 45 | delegate: Item { 46 | 47 | width: 130 48 | height: width 49 | 50 | AppsGridDelegate { 51 | id: delegate 52 | 53 | anchors { 54 | fill: parent 55 | margins: FluidControls.Units.smallSpacing 56 | } 57 | } 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /src/helper/qml/launcher/CategoriesView.qml: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2018 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | import QtQuick 6 | import QtQuick.Controls 7 | import Fluid.Controls as FluidControls 8 | import Liri.Shell.TaskManager as TaskManager 9 | 10 | ListView { 11 | signal selected(string category) 12 | 13 | currentIndex: 0 14 | model: TaskManager.CategoriesModel { 15 | id: categoriesModel 16 | } 17 | delegate: FluidControls.ListItem { 18 | property string category: model.category 19 | 20 | text: model.display 21 | highlighted: currentIndex === index 22 | onClicked: { 23 | currentIndex = index; 24 | } 25 | } 26 | onCurrentIndexChanged: { 27 | if (currentItem) 28 | selected(currentItem.category); 29 | } 30 | 31 | ScrollBar.vertical: ScrollBar {} 32 | } 33 | -------------------------------------------------------------------------------- /src/helper/qml/launcher/FrequentAppsView.qml: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2017 Michael Spencer 2 | // SPDX-FileCopyrightText: 2021 Pier Luigi Fiorini 3 | // 4 | // SPDX-License-Identifier: GPL-3.0-or-later 5 | 6 | import QtQuick 7 | import QtQml.Models 8 | import Fluid.Controls as FluidControls 9 | import Liri.Shell.TaskManager as TaskManager 10 | 11 | Item { 12 | id: frequentApps 13 | 14 | readonly property alias count: repeater.count 15 | 16 | width: 130 * grid.columns 17 | height: 130 * grid.rows 18 | 19 | FluidControls.Placeholder { 20 | anchors.fill: parent 21 | 22 | icon.source: FluidControls.Utils.iconUrl("action/history") 23 | text: qsTr("Frequent Apps") 24 | subText: qsTr("The apps you use frequently will show here") 25 | visible: frequentApps.count === 0 26 | } 27 | 28 | Grid { 29 | id: grid 30 | 31 | anchors.fill: parent 32 | 33 | columns: 6 34 | rows: 2 35 | 36 | Repeater { 37 | id: repeater 38 | 39 | model: TaskManager.PageModel { 40 | limitCount: grid.rows * grid.columns 41 | sourceModel: TaskManager.FrequentAppsModel { 42 | id: frequentAppsModel 43 | 44 | sourceModel: appsModel 45 | } 46 | } 47 | 48 | delegate: Item { 49 | 50 | width: 130 51 | height: width 52 | 53 | AppsGridDelegate { 54 | id: delegate 55 | 56 | anchors { 57 | fill: parent 58 | margins: FluidControls.Units.smallSpacing 59 | } 60 | } 61 | } 62 | } 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /src/helper/qml/panel/IndicatorsRow.qml: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2018 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | import QtQuick 6 | 7 | Row { 8 | height: parent.height 9 | 10 | Repeater { 11 | model: indicatorsModel 12 | 13 | Loader { 14 | asynchronous: true 15 | sourceComponent: model.component 16 | height: parent.height 17 | } 18 | } 19 | 20 | ShutdownIndicator {} 21 | } 22 | -------------------------------------------------------------------------------- /src/helper/qml/panel/ShutdownIndicator.qml: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2020 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | import QtQuick 6 | import Fluid.Controls as FluidControls 7 | import Liri.Shell as Shell 8 | 9 | Shell.Indicator { 10 | title: qsTr("Shut down") 11 | iconSource: FluidControls.Utils.iconUrl("action/power_settings_new") 12 | } 13 | -------------------------------------------------------------------------------- /src/helper/qml/panel/TaskBar.qml: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2021 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | import QtQuick 6 | import Fluid.Controls 7 | import Liri.Shell.TaskManager as TaskManager 8 | 9 | ListView { 10 | id: taskBar 11 | 12 | property bool menuOpen: false 13 | 14 | orientation: Qt.Horizontal 15 | interactive: contentWidth > width 16 | 17 | model: TaskManager.TasksModel { 18 | id: tasksModel 19 | 20 | sourceModel: appsModel 21 | } 22 | delegate: TaskDelegate {} 23 | 24 | remove: Transition { 25 | ParallelAnimation { 26 | NumberAnimation { property: "opacity"; to: 0; duration: 250 } 27 | NumberAnimation { properties: "y"; to: height; duration: 250 } 28 | } 29 | } 30 | 31 | removeDisplaced: Transition { 32 | SequentialAnimation { 33 | PauseAnimation { duration: 250 } 34 | NumberAnimation { properties: "x,y"; duration: 250 } 35 | } 36 | } 37 | 38 | move: Transition { 39 | SequentialAnimation { 40 | PauseAnimation { duration: 250 } 41 | NumberAnimation { properties: "x,y"; duration: 250 } 42 | } 43 | } 44 | 45 | moveDisplaced: Transition { 46 | SequentialAnimation { 47 | PauseAnimation { duration: 250 } 48 | NumberAnimation { properties: "x,y"; duration: 250 } 49 | } 50 | } 51 | 52 | add: Transition { 53 | ParallelAnimation { 54 | NumberAnimation { property: "opacity"; to: 1; from: 0; duration: 250 } 55 | NumberAnimation { properties: "y"; to: 0; from: height; duration: 250 } 56 | } 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /src/helper/qml/panel/TaskMenu.qml: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2021 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | import QtQml 6 | import QtQuick 7 | import QtQuick.Controls 8 | import Liri.Session as Session 9 | 10 | Menu { 11 | id: menu 12 | 13 | property var actions: model.application.actions 14 | 15 | Instantiator { 16 | id: actionsInstantiator 17 | model: actions 18 | delegate: MenuItem { 19 | text: model.name 20 | onTriggered: { 21 | if (model.command) { 22 | Session.Launcher.launchCommand(model.command); 23 | menu.close(); 24 | } 25 | } 26 | } 27 | onObjectAdded: menu.insertItem(0, object) 28 | onObjectRemoved: menu.removeItem(index) 29 | } 30 | 31 | Instantiator { 32 | model: actionsInstantiator.count > 0 ? 1 : 0 33 | delegate: MenuSeparator {} 34 | onObjectAdded: menu.insertItem(actionsInstantiator.count, object) 35 | onObjectRemoved: menu.removeItem(index) 36 | } 37 | 38 | MenuItem { 39 | text: qsTr("New Window") 40 | enabled: model.running 41 | } 42 | 43 | MenuSeparator {} 44 | 45 | MenuItem { 46 | text: model.pinned ? qsTr("Unpin from Launcher") : qsTr("Pin to Launcher") 47 | enabled: model.name 48 | onTriggered: { 49 | model.application.pinned = !model.application.pinned; 50 | menu.close(); 51 | } 52 | } 53 | 54 | MenuSeparator {} 55 | 56 | MenuItem { 57 | id: quit 58 | text: qsTr("Quit") 59 | enabled: model.running 60 | onTriggered: { 61 | if (!model.application.quit()) 62 | console.warn("Failed to quit:", model.appId); 63 | menu.close(); 64 | } 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /src/imports/compositor/abstracttitlebar.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2021 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | #ifndef TITLEBAR_H 6 | #define TITLEBAR_H 7 | 8 | #include 9 | 10 | class AbstractTitleBar : public QQuickItem 11 | { 12 | Q_OBJECT 13 | Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged FINAL) 14 | Q_PROPERTY(QQuickItem *dragTarget READ dragTarget WRITE setDragTarget NOTIFY dragTargetChanged) 15 | Q_PROPERTY(bool moving READ isMoving NOTIFY movingChanged) 16 | public: 17 | AbstractTitleBar(QQuickItem *parent = nullptr); 18 | 19 | QColor color() const; 20 | void setColor(const QColor &color); 21 | 22 | QQuickItem *dragTarget() const; 23 | void setDragTarget(QQuickItem *dragTarget); 24 | 25 | bool isMoving() const; 26 | 27 | Q_SIGNALS: 28 | void colorChanged(); 29 | void dragTargetChanged(); 30 | void movingChanged(); 31 | void activationRequested(); 32 | void minimizeClicked(); 33 | void maximizeClicked(); 34 | void closeClicked(); 35 | void windowMenuRequested(const QPointF &position); 36 | 37 | protected: 38 | void mousePressEvent(QMouseEvent *event) override; 39 | void mouseMoveEvent(QMouseEvent *event) override; 40 | void mouseReleaseEvent(QMouseEvent *event) override; 41 | void mouseDoubleClickEvent(QMouseEvent *event) override; 42 | QSGNode *updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *data) override; 43 | 44 | private: 45 | QColor m_color = Qt::transparent; 46 | QQuickItem *m_dragTarget = nullptr; 47 | bool m_isMoving = false; 48 | bool m_initialized = false; 49 | QPointF m_initialOffset; 50 | }; 51 | 52 | #endif // TITLEBAR_H 53 | -------------------------------------------------------------------------------- /src/imports/compositor/appidandicon.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2021 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | #ifndef APPIDANDICON_H 6 | #define APPIDANDICON_H 7 | 8 | #include 9 | 10 | class AppIdAndIcon : public QObject 11 | { 12 | Q_OBJECT 13 | Q_PROPERTY(QString appId READ appId WRITE setAppId NOTIFY appIdChanged) 14 | Q_PROPERTY(QString canonicalAppId READ canonicalAppId NOTIFY appIdChanged) 15 | Q_PROPERTY(QString iconName READ iconName NOTIFY iconNameChanged) 16 | public: 17 | explicit AppIdAndIcon(QObject *parent = nullptr); 18 | 19 | QString appId() const; 20 | void setAppId(const QString &appId); 21 | 22 | QString canonicalAppId() const; 23 | QString iconName() const; 24 | 25 | Q_SIGNALS: 26 | void appIdChanged(); 27 | void iconNameChanged(); 28 | 29 | private: 30 | QString m_appId; 31 | QString m_canonicalAppId; 32 | QString m_iconName; 33 | 34 | void updateIconName(); 35 | }; 36 | 37 | #endif // APPIDANDICON_H 38 | -------------------------------------------------------------------------------- /src/imports/compositor/chromeitem.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2018 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | #ifndef CHROMEITEM_H 6 | #define CHROMEITEM_H 7 | 8 | #include 9 | #include 10 | #include 11 | 12 | class ChromeItem : public QQuickItem 13 | { 14 | Q_OBJECT 15 | Q_PROPERTY(Aurora::Compositor::WaylandCompositor *compositor READ compositor NOTIFY compositorChanged) 16 | Q_PROPERTY(Aurora::Compositor::WaylandQuickItem *shellSurfaceItem READ shellSurfaceItem WRITE setShellSurfaceItem NOTIFY shellSurfaceItemChanged) 17 | Q_PROPERTY(bool primary READ isPrimary NOTIFY primaryChanged) 18 | public: 19 | enum ShellSurfaceType { 20 | WaylandShellSurface = 0, 21 | XWaylandShellSurface 22 | }; 23 | Q_ENUM(ShellSurfaceType) 24 | 25 | ChromeItem(QQuickItem *parent = nullptr); 26 | 27 | Aurora::Compositor::WaylandCompositor *compositor() const; 28 | 29 | Aurora::Compositor::WaylandQuickItem *shellSurfaceItem() const; 30 | void setShellSurfaceItem(Aurora::Compositor::WaylandQuickItem *item); 31 | 32 | bool isPrimary() const; 33 | 34 | Q_INVOKABLE QPointF randomPosition(const QPointF &mousePos) const; 35 | 36 | Q_SIGNALS: 37 | void compositorChanged(); 38 | void shellSurfaceItemChanged(); 39 | void primaryChanged(); 40 | 41 | public Q_SLOTS: 42 | void raise(); 43 | void lower(); 44 | void takeFocus(Aurora::Compositor::WaylandSeat *device = nullptr); 45 | 46 | private: 47 | Aurora::Compositor::WaylandCompositor *m_compositor = nullptr; 48 | Aurora::Compositor::WaylandQuickItem *m_shellSurfaceItem = nullptr; 49 | bool m_primary = false; 50 | 51 | private Q_SLOTS: 52 | void updatePrimary(); 53 | }; 54 | 55 | #endif // CHROMEITEM_H 56 | -------------------------------------------------------------------------------- /src/imports/compositor/desktoplayout.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2021 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | #ifndef DESKTOPLAYOUT_H 6 | #define DESKTOPLAYOUT_H 7 | 8 | #include 9 | 10 | using namespace Aurora::Compositor; 11 | 12 | class DesktopLayout : public WaylandSurfaceLayout 13 | { 14 | Q_OBJECT 15 | public: 16 | enum SurfaceRole { 17 | NoRole = 0, 18 | OsdRole, 19 | RunDialogRole, 20 | AuthDialogRole, 21 | LogoutDialogRole, 22 | PowerOffDialogRole, 23 | WindowSwitcherRole, 24 | }; 25 | Q_ENUM(SurfaceRole) 26 | 27 | enum Layer { 28 | NoLayer = 0, 29 | BackgroundLayer, 30 | BottomLayer, 31 | WindowsLayer, 32 | TopLayer, 33 | DialogLayer, 34 | FullscreenLayer, 35 | LockScreenLayer, 36 | OverlayLayer 37 | }; 38 | Q_ENUM(Layer); 39 | 40 | DesktopLayout(QQuickItem *parent = nullptr); 41 | 42 | SurfaceRole getSurfaceRole(QQuickItem *item) const; 43 | 44 | protected: 45 | Layer getLayer(QQuickItem *item) const; 46 | bool sortItems(QQuickItem *left, QQuickItem *right) override; 47 | }; 48 | 49 | #endif // DESKTOPLAYOUT_H 50 | -------------------------------------------------------------------------------- /src/imports/compositor/fpscounter.cpp: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2018 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | #include "fpscounter.h" 6 | 7 | FpsCounter::FpsCounter(QQuickItem *parent) 8 | : QQuickItem(parent) 9 | { 10 | setFlag(QQuickItem::ItemHasContents, false); 11 | 12 | handleWindowChanged(window()); 13 | connect(this, &QQuickItem::windowChanged, this, &FpsCounter::handleWindowChanged); 14 | 15 | startTimer(1000); 16 | m_timer.start(); 17 | } 18 | 19 | qreal FpsCounter::framesPerSecond() const 20 | { 21 | return m_fps; 22 | } 23 | 24 | void FpsCounter::timerEvent(QTimerEvent *) 25 | { 26 | resetFramesPerSecond(); 27 | m_counter = 0; 28 | m_timer.start(); 29 | } 30 | 31 | void FpsCounter::resetFramesPerSecond() 32 | { 33 | m_fps = m_counter * 1000.0 / m_timer.elapsed(); 34 | Q_EMIT framesPerSecondChanged(); 35 | } 36 | 37 | void FpsCounter::handleWindowChanged(QQuickWindow *window) 38 | { 39 | if (!m_lastWindow.isNull()) 40 | disconnect(m_lastWindowConnection); 41 | 42 | if (!window) 43 | return; 44 | 45 | m_lastWindow = window; 46 | m_lastWindowConnection = connect(window, &QQuickWindow::frameSwapped, this, [this] { 47 | m_counter++; 48 | }); 49 | } 50 | -------------------------------------------------------------------------------- /src/imports/compositor/fpscounter.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2018 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | #ifndef FPSCOUNTER_H 6 | #define FPSCOUNTER_H 7 | 8 | #include 9 | #include 10 | #include 11 | #include 12 | 13 | class FpsCounter : public QQuickItem 14 | { 15 | Q_OBJECT 16 | Q_PROPERTY(qreal framesPerSecond READ framesPerSecond NOTIFY framesPerSecondChanged) 17 | public: 18 | explicit FpsCounter(QQuickItem *parent = nullptr); 19 | 20 | qreal framesPerSecond() const; 21 | 22 | Q_SIGNALS: 23 | void framesPerSecondChanged(); 24 | 25 | protected: 26 | void timerEvent(QTimerEvent *) override; 27 | 28 | private: 29 | QPointer m_lastWindow; 30 | QMetaObject::Connection m_lastWindowConnection; 31 | QElapsedTimer m_timer; 32 | int m_counter = 0; 33 | qreal m_fps = 0; 34 | 35 | void resetFramesPerSecond(); 36 | 37 | private Q_SLOTS: 38 | void handleWindowChanged(QQuickWindow *window); 39 | }; 40 | 41 | #endif // FPSCOUNTER_H 42 | -------------------------------------------------------------------------------- /src/imports/compositor/hotspot.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2018 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | #ifndef HOTSPOT_H 6 | #define HOTSPOT_H 7 | 8 | #include 9 | #include 10 | 11 | class HotSpot : public QQuickItem 12 | { 13 | Q_OBJECT 14 | Q_PROPERTY(Qt::Corner corner READ corner WRITE setCorner NOTIFY cornerChanged) 15 | Q_PROPERTY(quint64 threshold READ threshold WRITE setThreshold NOTIFY thresholdChanged) 16 | Q_PROPERTY(quint64 pushTime READ pushTime WRITE setPushTime NOTIFY pushTimeChanged) 17 | Q_PROPERTY(bool hovered READ hovered NOTIFY hoveredChanged) 18 | public: 19 | explicit HotSpot(QQuickItem *parent = nullptr); 20 | 21 | Qt::Corner corner() const; 22 | void setCorner(Qt::Corner corner); 23 | 24 | quint64 threshold() const; 25 | void setThreshold(quint64 threshold); 26 | 27 | quint64 pushTime() const; 28 | void setPushTime(quint64 time); 29 | 30 | bool hovered() const; 31 | 32 | Q_SIGNALS: 33 | void cornerChanged(); 34 | void thresholdChanged(); 35 | void pushTimeChanged(); 36 | void hoveredChanged(); 37 | void triggered(); 38 | 39 | protected: 40 | void hoverEnterEvent(QHoverEvent *event) override; 41 | void hoverMoveEvent(QHoverEvent *event) override; 42 | void hoverLeaveEvent(QHoverEvent *event) override; 43 | 44 | private: 45 | Qt::Corner m_corner; 46 | quint64 m_threshold; 47 | quint64 m_pushTime; 48 | quint64 m_lastTime; 49 | quint64 m_entered; 50 | QElapsedTimer m_timer; 51 | bool m_hovered; 52 | }; 53 | 54 | #endif // HOTSPOT_H 55 | -------------------------------------------------------------------------------- /src/imports/compositor/keyeventfilter.cpp: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2018 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | #include 6 | 7 | #include "keyeventfilter.h" 8 | 9 | KeyEventFilter::KeyEventFilter(QQuickItem *parent) 10 | : QQuickItem(parent) 11 | { 12 | connect(this, &QQuickItem::windowChanged, this, [=](QQuickWindow *window) { 13 | // Remove event filter previously installed if any 14 | if (!m_window.isNull()) { 15 | m_window->removeEventFilter(this); 16 | m_window.clear(); 17 | } 18 | 19 | // Install this event filter when the item is on the window 20 | if (window) { 21 | window->installEventFilter(this); 22 | m_window = window; 23 | } 24 | }); 25 | } 26 | 27 | bool KeyEventFilter::eventFilter(QObject *object, QEvent *event) 28 | { 29 | // Only filter the window we are attached to 30 | if (object != m_window.data()) 31 | return QObject::eventFilter(object, event); 32 | 33 | // Discard events not related to keyboard 34 | if (event->type() != QEvent::KeyPress && event->type() != QEvent::KeyRelease) 35 | return false; 36 | 37 | // Pass this event to QML for processing, but do not eat it so it 38 | // will still be delivered to the currently focused application window 39 | event->accept(); 40 | QCoreApplication::sendEvent(this, event); 41 | return event->isAccepted(); 42 | } 43 | -------------------------------------------------------------------------------- /src/imports/compositor/keyeventfilter.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2018 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | #pragma once 6 | 7 | #include 8 | #include 9 | 10 | class KeyEventFilter : public QQuickItem 11 | { 12 | Q_OBJECT 13 | public: 14 | KeyEventFilter(QQuickItem *parent = nullptr); 15 | 16 | protected: 17 | bool eventFilter(QObject *, QEvent *); 18 | 19 | private: 20 | QPointer m_window; 21 | }; 22 | -------------------------------------------------------------------------------- /src/imports/compositor/protocols/liri-color-picker-unstable-v1.xml.license: -------------------------------------------------------------------------------- 1 | SPDX-FileCopyrightText: 2020-2021 Pier Luigi Fiorini 2 | 3 | SPDX-License-Identifier: MIT 4 | -------------------------------------------------------------------------------- /src/imports/compositor/protocols/liri-shell-unstable-v1.xml.license: -------------------------------------------------------------------------------- 1 | SPDX-FileCopyrightText: 2018-2021 Pier Luigi Fiorini 2 | 3 | SPDX-License-Identifier: MIT 4 | -------------------------------------------------------------------------------- /src/imports/compositor/quickoutput.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2019 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | #ifndef QUICKOUTPUT_H 6 | #define QUICKOUTPUT_H 7 | 8 | #include 9 | 10 | #include "screenmodel.h" 11 | 12 | class QuickOutput : public Aurora::Compositor::WaylandQuickOutput 13 | { 14 | Q_OBJECT 15 | Q_PROPERTY(ScreenItem *screen READ screen WRITE setScreen NOTIFY screenChanged) 16 | public: 17 | explicit QuickOutput(); 18 | 19 | ScreenItem *screen() const; 20 | void setScreen(ScreenItem *screen); 21 | 22 | Q_SIGNALS: 23 | void screenChanged(ScreenItem *screen); 24 | 25 | protected: 26 | void componentComplete() override; 27 | 28 | private: 29 | bool m_initialized = false; 30 | ScreenItem *m_screen = nullptr; 31 | 32 | void addModes(); 33 | void addScreenMode(ScreenMode *mode); 34 | 35 | private Q_SLOTS: 36 | void handleCurrentModeChanged(const QSize &resolution, int refreshRate); 37 | }; 38 | 39 | #endif // QUICKOUTPUT_H 40 | -------------------------------------------------------------------------------- /src/imports/compositor/screencast.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2020 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | #ifndef SCREENCAST_H 6 | #define SCREENCAST_H 7 | 8 | #include 9 | 10 | QT_FORWARD_DECLARE_CLASS(QScreen) 11 | 12 | class ScreenCast : public QObject 13 | { 14 | Q_OBJECT 15 | public: 16 | explicit ScreenCast(QObject *parent = nullptr); 17 | 18 | Q_INVOKABLE void enable(QScreen *screen); 19 | Q_INVOKABLE void disable(QScreen *screen); 20 | 21 | Q_SIGNALS: 22 | void frameAvailable(QScreen *screen, 23 | const QSize &size, const QPoint &offset, 24 | quint32 drmFormat, quint64 modifier, 25 | quint32 numObjects); 26 | void objectAvailable(QScreen *screen, 27 | quint32 index, quint32 fd, quint32 size, 28 | quint32 offset, quint32 stride, 29 | quint32 planeIndex); 30 | void captureReady(QScreen *screen, quint64 tv_sec, quint32 tv_nsec); 31 | 32 | protected: 33 | bool eventFilter(QObject *obj, QEvent *event) override; 34 | }; 35 | 36 | #endif // SCREENCAST_H 37 | -------------------------------------------------------------------------------- /src/imports/compositor/waylandcursorgrabber.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2021 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | #ifndef WAYLANDCURSORGRABBER_H 6 | #define WAYLANDCURSORGRABBER_H 7 | 8 | #include 9 | #include 10 | #include 11 | 12 | class WaylandCursorGrabber : public Aurora::Compositor::WaylandQuickItem 13 | { 14 | Q_OBJECT 15 | Q_PROPERTY(Aurora::Compositor::WaylandSeat *seat READ seat WRITE setSeat NOTIFY seatChanged) 16 | Q_PROPERTY(int hotspotX READ hotspotX NOTIFY hotspotXChanged) 17 | Q_PROPERTY(int hotspotY READ hotspotY NOTIFY hotspotYChanged) 18 | Q_PROPERTY(bool grab READ grab WRITE setGrab NOTIFY grabChanged) 19 | public: 20 | WaylandCursorGrabber(QQuickItem *parent = nullptr); 21 | 22 | Aurora::Compositor::WaylandSeat *seat() const; 23 | void setSeat(Aurora::Compositor::WaylandSeat *seat); 24 | 25 | int hotspotX() const; 26 | int hotspotY() const; 27 | 28 | bool grab() const; 29 | void setGrab(bool value); 30 | 31 | Q_SIGNALS: 32 | void seatChanged(Aurora::Compositor::WaylandSeat *seat); 33 | void hotspotXChanged(int hotspotX); 34 | void hotspotYChanged(int hotspotY); 35 | void grabChanged(bool grab); 36 | 37 | private: 38 | Aurora::Compositor::WaylandSurfaceGrabber *m_grabber = nullptr; 39 | Aurora::Compositor::WaylandSurfaceGrabber *m_dragIconGrabber = nullptr; 40 | bool m_grabbing = false; 41 | Aurora::Compositor::WaylandSeat *m_seat = nullptr; 42 | int m_hotspotX = -1; 43 | int m_hotspotY = -1; 44 | bool m_grab = false; 45 | 46 | private Q_SLOTS: 47 | void handleCursorSurfaceRequest(Aurora::Compositor::WaylandSurface *cursorSurface, int hotspotX, int hotspotY); 48 | void handleDragIconChanged(); 49 | void handleRedraw(); 50 | void handleGrab(const QImage &image); 51 | }; 52 | 53 | #endif // WAYLANDCURSORGRABBER_H 54 | -------------------------------------------------------------------------------- /src/imports/compositor/waylandliricolorpickerv1.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2020-2021 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | #ifndef LIRI_SHELL_COMPOSITOR_WAYLANDLIRICOLORPICKERV1_H 6 | #define LIRI_SHELL_COMPOSITOR_WAYLANDLIRICOLORPICKERV1_H 7 | 8 | #include 9 | 10 | class WaylandLiriColorPickerManagerV1Private; 11 | 12 | using namespace Aurora::Compositor; 13 | 14 | class WaylandLiriColorPickerManagerV1 15 | : public WaylandCompositorExtensionTemplate 16 | { 17 | Q_OBJECT 18 | Q_DECLARE_PRIVATE(WaylandLiriColorPickerManagerV1) 19 | Q_PROPERTY(QString layerName READ layerName WRITE setLayerName NOTIFY layerNameChanged) 20 | public: 21 | WaylandLiriColorPickerManagerV1(); 22 | WaylandLiriColorPickerManagerV1(WaylandCompositor *compositor); 23 | ~WaylandLiriColorPickerManagerV1(); 24 | 25 | QString layerName() const; 26 | void setLayerName(const QString &layer); 27 | 28 | void initialize() override; 29 | 30 | static const wl_interface *interface(); 31 | static QByteArray interfaceName(); 32 | 33 | Q_SIGNALS: 34 | void layerNameChanged(); 35 | 36 | private: 37 | QScopedPointer const d_ptr; 38 | }; 39 | 40 | #endif // LIRI_SHELL_COMPOSITOR_WAYLANDLIRICOLORPICKERV1_H 41 | -------------------------------------------------------------------------------- /src/imports/compositor/waylandlirimodalv1.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2020-2022 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | #ifndef LIRI_SHELL_COMPOSITOR_WAYLANDLIRIMODALV1_H 6 | #define LIRI_SHELL_COMPOSITOR_WAYLANDLIRIMODALV1_H 7 | 8 | #include 9 | 10 | using namespace Aurora::Compositor; 11 | 12 | class WaylandLiriModalManagerV1Private; 13 | 14 | class WaylandLiriModalManagerV1 15 | : public WaylandCompositorExtensionTemplate 16 | { 17 | Q_OBJECT 18 | Q_DECLARE_PRIVATE(WaylandLiriModalManagerV1) 19 | Q_PROPERTY(bool grabbed READ isGrabbed NOTIFY grabbedChanged) 20 | public: 21 | WaylandLiriModalManagerV1(); 22 | WaylandLiriModalManagerV1(WaylandCompositor *compositor); 23 | ~WaylandLiriModalManagerV1(); 24 | 25 | void initialize() override; 26 | 27 | bool isGrabbed() const; 28 | 29 | Q_INVOKABLE void sendDone(); 30 | 31 | static const wl_interface *interface(); 32 | static QByteArray interfaceName(); 33 | 34 | Q_SIGNALS: 35 | void grabbedChanged(); 36 | 37 | private: 38 | QScopedPointer const d_ptr; 39 | }; 40 | 41 | #endif // LIRI_SHELL_COMPOSITOR_WAYLANDLIRIMODALV1_H 42 | -------------------------------------------------------------------------------- /src/imports/compositor/waylandlirimodalv1_p.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2020-2022 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | #ifndef LIRI_SHELL_COMPOSITOR_WAYLANDLIRIMODALV1_P_H 6 | #define LIRI_SHELL_COMPOSITOR_WAYLANDLIRIMODALV1_P_H 7 | 8 | #include 9 | 10 | #include "waylandlirimodalv1.h" 11 | #include "aurora-server-liri-shell-unstable-v1.h" 12 | 13 | // 14 | // W A R N I N G 15 | // ------------- 16 | // 17 | // This file is not part of the Liri API. It exists purely as an 18 | // implementation detail. This header file may change from version to 19 | // version without notice, or even be removed. 20 | // 21 | // We mean it. 22 | // 23 | 24 | Q_DECLARE_LOGGING_CATEGORY(gLcWaylandLiriModalV1) 25 | 26 | class WaylandLiriModalV1 27 | : public PrivateServer::zliri_modal_v1 28 | { 29 | public: 30 | WaylandLiriModalV1() = default; 31 | 32 | WaylandLiriModalManagerV1Private *manager = nullptr; 33 | 34 | protected: 35 | void zliri_modal_v1_destroy_resource(Resource *resource) override; 36 | void zliri_modal_v1_destroy(Resource *resource) override; 37 | }; 38 | 39 | class WaylandLiriModalManagerV1Private 40 | : public PrivateServer::zliri_modal_manager_v1 41 | { 42 | Q_DECLARE_PUBLIC(WaylandLiriModalManagerV1) 43 | public: 44 | explicit WaylandLiriModalManagerV1Private(WaylandLiriModalManagerV1 *self); 45 | 46 | void removeGrab(WaylandLiriModalV1 *grab); 47 | 48 | QVector grabs; 49 | 50 | protected: 51 | WaylandLiriModalManagerV1 *q_ptr = nullptr; 52 | 53 | void zliri_modal_manager_v1_grab(Resource *resource, uint32_t id, 54 | struct ::wl_resource *seatResource) override; 55 | }; 56 | 57 | #endif // LIRI_SHELL_COMPOSITOR_WAYLANDLIRIMODALV1_P_H 58 | -------------------------------------------------------------------------------- /src/imports/compositor/windowmousetracker.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2018 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | #ifndef WINDOWMOUSETRACKER_H 6 | #define WINDOWMOUSETRACKER_H 7 | 8 | #include 9 | 10 | class WindowMouseTrackerPrivate; 11 | 12 | class WindowMouseTracker : public QQuickItem 13 | { 14 | Q_OBJECT 15 | Q_PROPERTY(qreal mouseX READ mouseX NOTIFY mouseXChanged) 16 | Q_PROPERTY(qreal mouseY READ mouseY NOTIFY mouseYChanged) 17 | Q_PROPERTY(bool containsMouse READ containsMouse NOTIFY containsMouseChanged) 18 | Q_PROPERTY(bool windowSystemCursorEnabled READ windowSystemCursorEnabled WRITE setWindowSystemCursorEnabled NOTIFY windowSystemCursorEnabledChanged) 19 | Q_DECLARE_PRIVATE(WindowMouseTracker) 20 | public: 21 | explicit WindowMouseTracker(QQuickItem *parent = nullptr); 22 | ~WindowMouseTracker(); 23 | 24 | qreal mouseX() const; 25 | qreal mouseY() const; 26 | 27 | bool containsMouse() const; 28 | 29 | bool windowSystemCursorEnabled() const; 30 | void setWindowSystemCursorEnabled(bool enable); 31 | 32 | Q_SIGNALS: 33 | void mouseXChanged(); 34 | void mouseYChanged(); 35 | void containsMouseChanged(); 36 | void windowSystemCursorEnabledChanged(); 37 | 38 | protected: 39 | bool eventFilter(QObject *watched, QEvent *event) override; 40 | void hoverEnterEvent(QHoverEvent *event) override; 41 | void hoverLeaveEvent(QHoverEvent *event) override; 42 | 43 | private: 44 | WindowMouseTrackerPrivate *const d_ptr; 45 | }; 46 | 47 | #endif // WINDOWMOUSETRACKER_H 48 | -------------------------------------------------------------------------------- /src/imports/loginmanager/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2024 Pier Luigi Fiorini 2 | # SPDX-License-Identifier: BSD-3-Clause 3 | 4 | if(NOT TARGET Liri::Qt6AccountsService) 5 | find_package(Qt6AccountsService REQUIRED) 6 | endif() 7 | 8 | ecm_add_qml_module(LoginManagerQmlPlugin 9 | URI Liri.LoginManager 10 | VERSION 1.0 11 | CLASS_NAME LoginManagerPlugin 12 | NO_GENERATE_PLUGIN_SOURCE 13 | DEPENDENCIES QtQuick 14 | ) 15 | 16 | target_sources(LoginManagerQmlPlugin 17 | PRIVATE 18 | plugin.cpp 19 | usersmodel.cpp usersmodel.h 20 | ) 21 | 22 | target_link_libraries(LoginManagerQmlPlugin 23 | PRIVATE 24 | Qt6::Qml 25 | Qt6::Quick 26 | Liri::Qt6AccountsService 27 | ) 28 | 29 | ecm_finalize_qml_module(LoginManagerQmlPlugin) 30 | -------------------------------------------------------------------------------- /src/imports/loginmanager/plugin.cpp: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2018 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | #include 6 | 7 | #include "usersmodel.h" 8 | 9 | class LoginManagerPlugin : public QQmlExtensionPlugin 10 | { 11 | Q_OBJECT 12 | Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface") 13 | public: 14 | void registerTypes(const char *uri) 15 | { 16 | // @uri Liri.LoginManager 17 | Q_ASSERT(QLatin1String(uri) == QLatin1String("Liri.LoginManager")); 18 | 19 | qmlRegisterType(uri, 1, 0, "UsersModel"); 20 | } 21 | }; 22 | 23 | #include "plugin.moc" 24 | -------------------------------------------------------------------------------- /src/imports/loginmanager/usersmodel.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2018 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | #pragma once 6 | 7 | #include 8 | #include 9 | 10 | class UsersModel : public QtAccountsService::UsersModel 11 | { 12 | Q_OBJECT 13 | public: 14 | enum CustomRoles { 15 | BackgroundModeRole = QtAccountsService::UsersModel::LanguageRole + 1, 16 | PictureUrlRole, 17 | FillModeRole, 18 | PrimaryColorRole, 19 | SecondaryColorRole 20 | }; 21 | Q_ENUM(CustomRoles) 22 | 23 | explicit UsersModel(QObject *parent = nullptr); 24 | 25 | QHash roleNames() const; 26 | 27 | QVariant data(const QModelIndex &index, int role) const; 28 | }; 29 | -------------------------------------------------------------------------------- /src/imports/mpris2/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2024 Pier Luigi Fiorini 2 | # SPDX-License-Identifier: BSD-3-Clause 3 | 4 | ecm_add_qml_module(MprisQmlPlugin 5 | URI Liri.Mpris 6 | VERSION 1.0 7 | CLASS_NAME Mpris2Plugin 8 | NO_GENERATE_PLUGIN_SOURCE 9 | DEPENDENCIES QtQuick 10 | ) 11 | 12 | set_source_files_properties( 13 | org.mpris.MediaPlayer2.Player.xml 14 | org.mpris.MediaPlayer2.xml 15 | PROPERTIES NO_NAMESPACE ON 16 | ) 17 | 18 | qt_add_dbus_interfaces(_dbus_sources 19 | org.freedesktop.DBus.Properties.xml 20 | org.mpris.MediaPlayer2.Player.xml 21 | org.mpris.MediaPlayer2.xml 22 | ) 23 | 24 | target_sources(MprisQmlPlugin 25 | PRIVATE 26 | mpris2engine.cpp mpris2engine.h 27 | mpris2player.cpp mpris2player.h 28 | plugin.cpp 29 | ${_dbus_sources} 30 | ) 31 | 32 | target_link_libraries(MprisQmlPlugin 33 | PRIVATE 34 | Qt6::DBus 35 | Qt6::Qml 36 | Qt6::Quick 37 | ) 38 | 39 | ecm_finalize_qml_module(MprisQmlPlugin) 40 | -------------------------------------------------------------------------------- /src/imports/mpris2/mpris2engine.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2018 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: LGPL-3.0-or-later 4 | 5 | #ifndef LIRI_MPRIS2ENGINE_H 6 | #define LIRI_MPRIS2ENGINE_H 7 | 8 | #include 9 | #include 10 | #include 11 | 12 | class QDBusServiceWatcher; 13 | class Mpris2Player; 14 | 15 | Q_DECLARE_LOGGING_CATEGORY(MPRIS2) 16 | 17 | class Mpris2Engine : public QObject 18 | { 19 | Q_OBJECT 20 | Q_PROPERTY(QQmlListProperty players READ players NOTIFY playersChanged) 21 | public: 22 | Mpris2Engine(QObject *parent = 0); 23 | ~Mpris2Engine(); 24 | 25 | QQmlListProperty players(); 26 | static qsizetype playersCount(QQmlListProperty *prop); 27 | static Mpris2Player *playersAt(QQmlListProperty *prop, qsizetype index); 28 | 29 | Q_SIGNALS: 30 | void playersChanged(); 31 | 32 | private: 33 | QDBusServiceWatcher *m_watcher; 34 | QList m_players; 35 | }; 36 | 37 | #endif // LIRI_MPRIS2ENGINE_H 38 | -------------------------------------------------------------------------------- /src/imports/mpris2/org.freedesktop.DBus.Properties.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /src/imports/mpris2/org.mpris.MediaPlayer2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /src/imports/mpris2/plugin.cpp: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2018 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: LGPL-3.0-or-later 4 | 5 | #include 6 | 7 | #include "mpris2engine.h" 8 | #include "mpris2player.h" 9 | 10 | class Mpris2Plugin : public QQmlExtensionPlugin 11 | { 12 | Q_OBJECT 13 | Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface") 14 | public: 15 | void registerTypes(const char *uri) 16 | { 17 | Q_ASSERT(QLatin1String(uri) == QLatin1String("Liri.Mpris")); 18 | 19 | // @uri Liri.Mpris 20 | qmlRegisterType(uri, 1, 0, "Mpris"); 21 | qmlRegisterUncreatableType(uri, 1, 0, "MprisPlayer", 22 | QStringLiteral("Cannot create MprisPlayer object")); 23 | } 24 | }; 25 | 26 | #include "plugin.moc" 27 | -------------------------------------------------------------------------------- /src/imports/notifications/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2024 Pier Luigi Fiorini 2 | # SPDX-License-Identifier: BSD-3-Clause 3 | 4 | ecm_add_qml_module(NotificationsServerQmlPlugin 5 | URI Liri.Shell.Notifications 6 | VERSION 1.0 7 | CLASS_NAME LiriShellNotificationsPlugin 8 | NO_GENERATE_PLUGIN_SOURCE 9 | DEPENDENCIES QtQuick 10 | ) 11 | 12 | target_compile_definitions(NotificationsServerQmlPlugin 13 | PRIVATE PROJECT_VERSION="${PROJECT_VERSION}" 14 | ) 15 | 16 | target_sources(NotificationsServerQmlPlugin 17 | PRIVATE 18 | notificationsadaptor.cpp notificationsadaptor.h 19 | notificationsmodel.cpp notificationsmodel.h 20 | notificationsimageprovider.cpp notificationsimageprovider.h 21 | notificationsimagesstorage.cpp notificationsimagesstorage.h 22 | notificationsimageutils.cpp notificationsimageutils.h 23 | notificationsserver.cpp notificationsserver.h 24 | plugin.cpp 25 | ) 26 | 27 | target_link_libraries(NotificationsServerQmlPlugin 28 | PRIVATE 29 | Qt6::DBus 30 | Qt6::Qml 31 | Qt6::Quick 32 | ) 33 | 34 | ecm_finalize_qml_module(NotificationsServerQmlPlugin) 35 | -------------------------------------------------------------------------------- /src/imports/notifications/notificationsadaptor.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2022 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: LGPL-3.0-or-later 4 | 5 | #ifndef NOTIFICATIONSADAPTOR_H 6 | #define NOTIFICATIONSADAPTOR_H 7 | 8 | #include 9 | #include 10 | #include 11 | 12 | class QAtomicInt; 13 | class NotificationItem; 14 | class NotificationsServer; 15 | 16 | Q_DECLARE_LOGGING_CATEGORY(NOTIFICATIONS) 17 | 18 | class NotificationsAdaptor : public QObject 19 | { 20 | Q_OBJECT 21 | Q_CLASSINFO("D-Bus Interface", "org.freedesktop.Notifications") 22 | public: 23 | enum CloseReason { 24 | CloseReasonExpired = 1, 25 | CloseReasonByUser, 26 | CloseReasonByApplication 27 | }; 28 | Q_ENUM(CloseReason) 29 | 30 | explicit NotificationsAdaptor(NotificationsServer *parent); 31 | ~NotificationsAdaptor(); 32 | 33 | bool registerService(); 34 | void unregisterService(); 35 | 36 | public Q_SLOTS: 37 | uint Notify(const QString &appName, uint replacesId, const QString &appIcon, 38 | const QString &summary, const QString &body, const QStringList &actions, 39 | const QVariantMap &hints, int timeout); 40 | 41 | void CloseNotification(uint id); 42 | 43 | QStringList GetCapabilities(); 44 | 45 | QString GetServerInformation(QString &vendor, QString &version, QString &specVersion); 46 | 47 | Q_SIGNALS: 48 | void NotificationClosed(uint id, uint reason); 49 | void ActionInvoked(uint id, const QString &actionKey); 50 | 51 | private: 52 | NotificationsServer *m_server = nullptr; 53 | QAtomicInt *m_idSeed = nullptr; 54 | bool m_registered = false; 55 | QSet m_spamApplications; 56 | QHash m_replaceableNotifications; 57 | QHash m_notifications; 58 | QList m_items; 59 | 60 | uint nextId(); 61 | }; 62 | 63 | #endif // NOTIFICATIONSADAPTOR_H 64 | -------------------------------------------------------------------------------- /src/imports/notifications/notificationsimageprovider.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2022 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: LGPL-3.0-or-later 4 | 5 | #ifndef NOTIFICATIONSIMAGEPROVIDER_H 6 | #define NOTIFICATIONSIMAGEPROVIDER_H 7 | 8 | #include 9 | 10 | class NotificationsImageProvider : public QQuickImageProvider 11 | { 12 | public: 13 | explicit NotificationsImageProvider(); 14 | 15 | QPixmap requestPixmap(const QString &id, QSize *realSize, const QSize &requestedSize); 16 | }; 17 | 18 | #endif // NOTIFICATIONSIMAGEPROVIDER_H 19 | -------------------------------------------------------------------------------- /src/imports/notifications/notificationsimagesstorage.cpp: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2022 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: LGPL-3.0-or-later 4 | 5 | #include 6 | 7 | #include "notificationsimagesstorage.h" 8 | 9 | Q_GLOBAL_STATIC(NotificationsImagesStorage, globalStorage) 10 | 11 | NotificationsImagesStorage::NotificationsImagesStorage() 12 | { 13 | } 14 | 15 | NotificationsImagesStorage::~NotificationsImagesStorage() 16 | { 17 | qDeleteAll(m_images); 18 | } 19 | 20 | NotificationImage *NotificationsImagesStorage::get(uint id) const 21 | { 22 | return m_images.value(id); 23 | } 24 | 25 | void NotificationsImagesStorage::add(uint id, NotificationImage *image) 26 | { 27 | remove(id); 28 | m_images[id] = image; 29 | } 30 | 31 | void NotificationsImagesStorage::remove(uint id) 32 | { 33 | if (m_images.contains(id)) 34 | delete m_images.take(id); 35 | } 36 | 37 | NotificationsImagesStorage *NotificationsImagesStorage::instance() 38 | { 39 | return globalStorage; 40 | } 41 | -------------------------------------------------------------------------------- /src/imports/notifications/notificationsimagesstorage.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2022 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: LGPL-3.0-or-later 4 | 5 | #ifndef NOTIFICATIONSIMAGESSTORAGE_H 6 | #define NOTIFICATIONSIMAGESSTORAGE_H 7 | 8 | #include 9 | #include 10 | 11 | struct NotificationImage { 12 | QPixmap image; 13 | QString iconName; 14 | QString entryIconName; 15 | }; 16 | 17 | class NotificationsImagesStorage 18 | { 19 | public: 20 | NotificationsImagesStorage(); 21 | ~NotificationsImagesStorage(); 22 | 23 | NotificationImage *get(uint id) const; 24 | 25 | void add(uint id, NotificationImage *image); 26 | void remove(uint id); 27 | 28 | static NotificationsImagesStorage *instance(); 29 | 30 | private: 31 | QHash m_images; 32 | }; 33 | 34 | #endif // NOTIFICATIONSIMAGESSTORAGE_H 35 | -------------------------------------------------------------------------------- /src/imports/notifications/notificationsimageutils.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2022 Pier Luigi Fiorini 2 | // SPDX-FileCopyrightText: 2008 Dmitry Suzdalev 3 | // 4 | // SPDX-License-Identifier: LGPL-3.0-or-later 5 | 6 | #ifndef NOTIFICATIONSIMAGEUTILS_H 7 | #define NOTIFICATIONSIMAGEUTILS_H 8 | 9 | #include 10 | #include 11 | 12 | QImage decodeImageHint(const QDBusArgument &arg); 13 | 14 | #endif // NOTIFICATIONSIMAGEUTILS_H 15 | -------------------------------------------------------------------------------- /src/imports/notifications/notificationsmodel.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2022 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: LGPL-3.0-or-later 4 | 5 | #ifndef NOTIFICATIONSMODEL_H 6 | #define NOTIFICATIONSMODEL_H 7 | 8 | #include 9 | 10 | #include "notificationsserver.h" 11 | 12 | class NotificationsModel : public QAbstractListModel 13 | { 14 | Q_OBJECT 15 | public: 16 | enum Role { 17 | IdRole = Qt::UserRole, 18 | AppNameRole, 19 | AppIconRole, 20 | IconUrlRole, 21 | HasIconRole, 22 | SummaryRole, 23 | BodyRole, 24 | ActionsRole, 25 | IsPersistentRole, 26 | ExpireTimeoutRole, 27 | HintsRole 28 | }; 29 | 30 | explicit NotificationsModel(QObject *parent = nullptr); 31 | 32 | int rowCount(const QModelIndex &parent = QModelIndex()) const override; 33 | virtual QHash roleNames() const override; 34 | QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; 35 | 36 | Q_INVOKABLE void invokeAction(uint id, const QString &actionId); 37 | Q_INVOKABLE void closeNotification(uint id); 38 | 39 | private: 40 | QList m_items; 41 | }; 42 | 43 | #endif // NOTIFICATIONSMODEL_H 44 | -------------------------------------------------------------------------------- /src/imports/notifications/notificationsserver.cpp: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2022 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: LGPL-3.0-or-later 4 | 5 | #include "notificationsadaptor.h" 6 | #include "notificationsserver.h" 7 | 8 | Q_GLOBAL_STATIC(NotificationsServer, globalServer) 9 | 10 | NotificationsServer::NotificationsServer(QObject *parent) 11 | : QObject(parent) 12 | , m_adaptor(new NotificationsAdaptor(this)) 13 | { 14 | qRegisterMetaType("NotificationItem*"); 15 | 16 | m_adaptor->registerService(); 17 | } 18 | 19 | NotificationsServer::~NotificationsServer() 20 | { 21 | if (m_adaptor) { 22 | m_adaptor->unregisterService(); 23 | m_adaptor->deleteLater(); 24 | m_adaptor = nullptr; 25 | } 26 | } 27 | 28 | void NotificationsServer::invokeAction(uint id, const QString &actionId) 29 | { 30 | Q_EMIT m_adaptor->ActionInvoked(id, actionId); 31 | } 32 | 33 | void NotificationsServer::closeNotification(uint id) 34 | { 35 | m_adaptor->CloseNotification(id); 36 | } 37 | 38 | NotificationsServer *NotificationsServer::instance() 39 | { 40 | return globalServer; 41 | } 42 | -------------------------------------------------------------------------------- /src/imports/notifications/notificationsserver.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2022 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: LGPL-3.0-or-later 4 | 5 | #ifndef NOTIFICATIONSSERVER_H 6 | #define NOTIFICATIONSSERVER_H 7 | 8 | #include 9 | #include 10 | #include 11 | 12 | class NotificationsAdaptor; 13 | 14 | class NotificationItem 15 | { 16 | public: 17 | explicit NotificationItem() = default; 18 | 19 | uint notificationId; 20 | QString appName; 21 | QString appIcon; 22 | QUrl iconUrl; 23 | bool hasIcon; 24 | QString summary; 25 | QString body; 26 | QVariantList actions; 27 | bool isPersistent; 28 | int expireTimeout; 29 | QVariantMap hints; 30 | }; 31 | 32 | class NotificationsServer : public QObject 33 | { 34 | Q_OBJECT 35 | public: 36 | explicit NotificationsServer(QObject *parent = nullptr); 37 | ~NotificationsServer(); 38 | 39 | void invokeAction(uint id, const QString &actionId); 40 | void closeNotification(uint id); 41 | 42 | static NotificationsServer *instance(); 43 | 44 | Q_SIGNALS: 45 | void notificationAdded(NotificationItem *item); 46 | void notificationReplaced(NotificationItem *item); 47 | void notificationRemoved(uint id); 48 | 49 | private: 50 | NotificationsAdaptor *m_adaptor = nullptr; 51 | }; 52 | 53 | #endif // NOTIFICATIONSSERVER_H 54 | -------------------------------------------------------------------------------- /src/imports/notifications/plugin.cpp: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2022 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: LGPL-3.0-or-later 4 | 5 | #include 6 | 7 | #include "notificationsimageprovider.h" 8 | #include "notificationsmodel.h" 9 | 10 | class LiriShellNotificationsPlugin : public QQmlExtensionPlugin 11 | { 12 | Q_OBJECT 13 | Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface") 14 | public: 15 | void initializeEngine(QQmlEngine *engine, const char *uri) override 16 | { 17 | // @uri Liri.Shell.Notifications 18 | Q_ASSERT(QLatin1String(uri) == QLatin1String("Liri.Shell.Notifications")); 19 | 20 | engine->addImageProvider(QStringLiteral("notifications"), 21 | new NotificationsImageProvider()); 22 | } 23 | 24 | void registerTypes(const char *uri) override 25 | { 26 | // @uri Liri.Shell.Notifications 27 | Q_ASSERT(QLatin1String(uri) == QLatin1String("Liri.Shell.Notifications")); 28 | 29 | qmlRegisterType(uri, 1, 0, "NotificationsModel"); 30 | } 31 | }; 32 | 33 | #include "plugin.moc" 34 | -------------------------------------------------------------------------------- /src/imports/policykit/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2024 Pier Luigi Fiorini 2 | # SPDX-License-Identifier: BSD-3-Clause 3 | 4 | find_package(PolkitQt6-1 REQUIRED) 5 | 6 | ecm_add_qml_module(PolkitQmlPlugin 7 | URI Liri.PolicyKit 8 | VERSION 1.0 9 | CLASS_NAME PolicyKitPlugin 10 | NO_GENERATE_PLUGIN_SOURCE 11 | DEPENDENCIES QtQuick 12 | ) 13 | 14 | target_sources(PolkitQmlPlugin 15 | PRIVATE 16 | listener_p.cpp listener_p.h 17 | plugin.cpp 18 | policykitagent.cpp policykitagent.h 19 | ) 20 | 21 | target_link_libraries(PolkitQmlPlugin 22 | PRIVATE 23 | Qt6::DBus 24 | Qt6::Qml 25 | Qt6::Quick 26 | PolkitQt6-1::Core 27 | PolkitQt6-1::Agent 28 | ) 29 | 30 | ecm_finalize_qml_module(PolkitQmlPlugin) 31 | -------------------------------------------------------------------------------- /src/imports/policykit/plugin.cpp: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2018 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: LGPL-3.0-or-later 4 | 5 | #include 6 | 7 | #include "policykitagent.h" 8 | 9 | class PolicyKitPlugin : public QQmlExtensionPlugin 10 | { 11 | Q_OBJECT 12 | Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface") 13 | public: 14 | void registerTypes(const char *uri) 15 | { 16 | // @uri Liri.PolicyKit 17 | Q_ASSERT(QLatin1String(uri) == QLatin1String("Liri.PolicyKit")); 18 | 19 | qmlRegisterType(uri, 1, 0, "PolicyKitAgent"); 20 | } 21 | }; 22 | 23 | #include "plugin.moc" 24 | -------------------------------------------------------------------------------- /src/imports/policykit/policykitagent.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2018 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: LGPL-3.0-or-later 4 | 5 | #ifndef LIRI_POLICYKITAGENT_H 6 | #define LIRI_POLICYKITAGENT_H 7 | 8 | #include 9 | #include 10 | 11 | #include 12 | 13 | Q_DECLARE_LOGGING_CATEGORY(POLKITAGENT) 14 | 15 | class PolicyKitAgentPrivate; 16 | 17 | class PolicyKitAgent : public QObject, public QQmlParserStatus 18 | { 19 | Q_OBJECT 20 | Q_PROPERTY(QString objectPath READ objectPath WRITE setObjectPath NOTIFY objectPathChanged) 21 | Q_PROPERTY(bool registered READ isRegistered NOTIFY registeredChanged) 22 | Q_DECLARE_PRIVATE(PolicyKitAgent) 23 | Q_INTERFACES(QQmlParserStatus) 24 | public: 25 | explicit PolicyKitAgent(QObject *parent = nullptr); 26 | ~PolicyKitAgent(); 27 | 28 | QString objectPath() const; 29 | void setObjectPath(const QString &path); 30 | 31 | bool isRegistered() const; 32 | 33 | Q_INVOKABLE void authenticate(const QString &response); 34 | Q_INVOKABLE void abortAuthentication(); 35 | 36 | void classBegin() override {} 37 | void componentComplete() override; 38 | 39 | Q_SIGNALS: 40 | void objectPathChanged(); 41 | void registeredChanged(); 42 | 43 | void authenticationInitiated(const QString &actionId, const QString &message, 44 | const QString &iconName, const QString &realName); 45 | void authenticationRequested(const QString &prompt, bool echo); 46 | void authenticationCanceled(); 47 | void authenticationFinished(); 48 | 49 | void authorizationGained(); 50 | void authorizationCanceled(); 51 | void authorizationFailed(); 52 | 53 | void information(const QString &message); 54 | void error(const QString &message); 55 | 56 | private: 57 | PolicyKitAgentPrivate *const d_ptr; 58 | }; 59 | 60 | #endif // LIRI_POLICYKITAGENT_H 61 | -------------------------------------------------------------------------------- /src/imports/shell-private/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2024 Pier Luigi Fiorini 2 | # SPDX-License-Identifier: BSD-3-Clause 3 | 4 | find_package(Wayland REQUIRED) 5 | 6 | if(NOT TARGET Liri::Xdg) 7 | find_package(Liri1Xdg REQUIRED) 8 | endif() 9 | if(NOT TARGET Liri::AuroraPlatformHeaders) 10 | find_package(Liri1AuroraPlatformHeaders REQUIRED) 11 | endif() 12 | if(NOT TARGET Liri::AuroraCompositor) 13 | find_package(Liri1AuroraCompositor REQUIRED) 14 | endif() 15 | 16 | ecm_add_qml_module(ShellPrivateQmlPlugin 17 | URI Liri.private.shell 18 | VERSION 1.0 19 | CLASS_NAME ShellPlugin 20 | NO_GENERATE_PLUGIN_SOURCE 21 | DEPENDENCIES QtQuick 22 | ) 23 | 24 | target_compile_definitions(ShellPrivateQmlPlugin PRIVATE LIBEXECDIR="${KDE_INSTALL_FULL_LIBEXECDIR}") 25 | 26 | target_sources(ShellPrivateQmlPlugin 27 | PRIVATE 28 | dbus/multimediakeysserver.cpp dbus/multimediakeysserver.h 29 | dbus/osdserver.cpp dbus/osdserver.h 30 | logging.cpp logging.h 31 | plugin.cpp 32 | ) 33 | 34 | target_link_libraries(ShellPrivateQmlPlugin 35 | PRIVATE 36 | Qt6::Core 37 | Qt6::DBus 38 | Qt6::Gui 39 | Qt6::GuiPrivate 40 | Qt6::Qml 41 | Qt6::Quick 42 | Liri::Xdg 43 | Liri::AuroraPlatformHeaders 44 | Liri::AuroraCompositor 45 | ) 46 | 47 | ecm_finalize_qml_module(ShellPrivateQmlPlugin) 48 | -------------------------------------------------------------------------------- /src/imports/shell-private/dbus/multimediakeysserver.cpp: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2019 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | #include 6 | 7 | #include "logging.h" 8 | #include "multimediakeysserver.h" 9 | 10 | MultimediaKeysServer::MultimediaKeysServer(QObject *parent) 11 | : QObject(parent) 12 | { 13 | auto bus = QDBusConnection::sessionBus(); 14 | if (!bus.registerObject(QStringLiteral("/MultimediaKeysServer"), this, QDBusConnection::ExportAllSignals)) 15 | qCWarning(lcShell, "Unable to register /MultimediaKeysServer D-Bus object"); 16 | } 17 | -------------------------------------------------------------------------------- /src/imports/shell-private/dbus/multimediakeysserver.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2019 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | #ifndef MULTIMEDIAKEYSSERVER_H 6 | #define MULTIMEDIAKEYSSERVER_H 7 | 8 | #include 9 | 10 | class MultimediaKeysServer : public QObject 11 | { 12 | Q_OBJECT 13 | Q_CLASSINFO("D-Bus Interface", "io.liri.Shell.MultimediaKeysServer") 14 | public: 15 | explicit MultimediaKeysServer(QObject *parent = nullptr); 16 | 17 | Q_SIGNALS: 18 | void VolumeMute(); 19 | void VolumeUp(); 20 | void VolumeDown(); 21 | void MediaPlay(); 22 | void MediaPrevious(); 23 | void MediaNext(); 24 | }; 25 | 26 | #endif // MULTIMEDIAKEYSSERVER_H 27 | -------------------------------------------------------------------------------- /src/imports/shell-private/dbus/osdserver.cpp: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2019 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | #include 6 | 7 | #include "logging.h" 8 | #include "osdserver.h" 9 | 10 | OsdServer::OsdServer(QObject *parent) 11 | : QObject(parent) 12 | { 13 | auto bus = QDBusConnection::sessionBus(); 14 | if (!bus.registerObject(QStringLiteral("/Osd"), this, QDBusConnection::ExportAllSlots)) 15 | qCWarning(lcShell, "Unable to register /Osd D-Bus object"); 16 | } 17 | 18 | void OsdServer::ShowText(const QString &iconName, const QString &text) 19 | { 20 | emit textRequested(iconName, text); 21 | } 22 | 23 | void OsdServer::ShowProgress(const QString &iconName, int value) 24 | { 25 | emit progressRequested(iconName, value); 26 | } 27 | -------------------------------------------------------------------------------- /src/imports/shell-private/dbus/osdserver.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2019 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | #ifndef OSDSERVER_H 6 | #define OSDSERVER_H 7 | 8 | #include 9 | 10 | class OsdServer : public QObject 11 | { 12 | Q_OBJECT 13 | Q_CLASSINFO("D-Bus Interface", "io.liri.Shell.Osd") 14 | public: 15 | explicit OsdServer(QObject *parent = nullptr); 16 | 17 | public Q_SLOTS: 18 | void ShowText(const QString &iconName, const QString &text = QString()); 19 | void ShowProgress(const QString &iconName, int value); 20 | 21 | Q_SIGNALS: 22 | void textRequested(const QString &iconName, const QString &text); 23 | void progressRequested(const QString &iconName, int value); 24 | }; 25 | 26 | #endif // OSDSERVER_H 27 | -------------------------------------------------------------------------------- /src/imports/shell-private/logging.cpp: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2019 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | #include "logging.h" 6 | 7 | Q_LOGGING_CATEGORY(lcShell, "liri.shell", QtDebugMsg) 8 | -------------------------------------------------------------------------------- /src/imports/shell-private/logging.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2019 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | #ifndef LOGGING_H 6 | #define LOGGING_H 7 | 8 | #include 9 | 10 | Q_DECLARE_LOGGING_CATEGORY(lcShell) 11 | 12 | #endif // LOGGING_H 13 | -------------------------------------------------------------------------------- /src/imports/shell-private/plugin.cpp: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2018 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | #include 6 | 7 | #ifndef QT_WAYLAND_COMPOSITOR_QUICK 8 | # define QT_WAYLAND_COMPOSITOR_QUICK 9 | #endif 10 | 11 | #include "dbus/multimediakeysserver.h" 12 | #include "dbus/osdserver.h" 13 | 14 | class ShellPrivatePlugin : public QQmlExtensionPlugin 15 | { 16 | Q_OBJECT 17 | Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface") 18 | public: 19 | void registerTypes(const char *uri) 20 | { 21 | // @uri Liri.private.shell 22 | Q_ASSERT(QLatin1String(uri) == QLatin1String("Liri.private.shell")); 23 | 24 | const int versionMajor = 1; 25 | const int versionMinor = 0; 26 | 27 | // D-Bus interfaces 28 | 29 | qmlRegisterType(uri, versionMajor, versionMinor, "OsdServer"); 30 | qmlRegisterType(uri, versionMajor, versionMinor, "MultimediaKeysServer"); 31 | } 32 | }; 33 | 34 | #include "plugin.moc" 35 | -------------------------------------------------------------------------------- /src/imports/shell/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2024 Pier Luigi Fiorini 2 | # SPDX-License-Identifier: BSD-3-Clause 3 | 4 | ecm_add_qml_module(ShellQmlPlugin 5 | URI Liri.Shell 6 | VERSION 1.0 7 | GENERATE_PLUGIN_SOURCE 8 | DEPENDENCIES QtQuick 9 | ) 10 | 11 | target_sources(ShellQmlPlugin 12 | PRIVATE 13 | extensionsmodel.cpp extensionsmodel.h 14 | lirishellv1.cpp lirishellv1.h 15 | multimediakeysclient.cpp multimediakeysclient.h 16 | osdclient.cpp osdclient.h 17 | ) 18 | 19 | qt6_generate_wayland_protocol_client_sources(ShellQmlPlugin 20 | FILES 21 | ${CMAKE_CURRENT_SOURCE_DIR}/../../../data/protocols/liri-shell-unstable-v1.xml 22 | ) 23 | 24 | ecm_qt_declare_logging_category( 25 | ShellQmlPlugin 26 | HEADER "lirishellclientlogging.h" 27 | IDENTIFIER "gLcShellClient" 28 | CATEGORY_NAME "liri.shell.client" 29 | DEFAULT_SEVERITY "Info" 30 | ) 31 | 32 | ecm_target_qml_sources(ShellQmlPlugin 33 | SOURCES 34 | Background.qml 35 | Indicator.qml 36 | LoginGreeter.qml 37 | PanelItem.qml 38 | StatusAreaExtension.qml 39 | UserDelegate.qml 40 | ) 41 | 42 | target_link_libraries(ShellQmlPlugin 43 | PRIVATE 44 | Qt6::Core 45 | Qt6::Concurrent 46 | Qt6::DBus 47 | Qt6::Gui 48 | Qt6::GuiPrivate 49 | Qt6::WaylandClient 50 | Qt6::Qml 51 | Qt6::Quick 52 | ) 53 | 54 | ecm_finalize_qml_module(ShellQmlPlugin) 55 | -------------------------------------------------------------------------------- /src/imports/shell/Indicator.qml: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2020 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | import QtQuick 6 | import QtQuick.Controls 7 | import QtQuick.Controls.Material 8 | import Fluid.Controls as FluidControls 9 | 10 | Item { 11 | property string title 12 | property alias text: label.text 13 | property alias iconName: icon.name 14 | property alias iconSource: icon.source 15 | 16 | readonly property int iconSize: height >= 40 ? 56 * 0.36 : height * 0.45 17 | 18 | width: visible ? text ? label.paintedWidth + 16 : 32 : 0 19 | height: parent.height 20 | 21 | FluidControls.Icon { 22 | id: icon 23 | 24 | size: iconSize 25 | anchors.centerIn: parent 26 | } 27 | 28 | Label { 29 | id: label 30 | 31 | anchors.centerIn: parent 32 | font.pixelSize: 15 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/imports/shell/LoginGreeter.qml: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2018 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | import QtQuick 6 | import QtQuick.Layouts 7 | import QtQuick.Controls 8 | import Fluid.Controls 9 | import Liri.Shell 10 | 11 | ListView { 12 | id: usersListView 13 | 14 | property size itemSize: Qt.size(200, 220) 15 | property size itemSelectedSize: Qt.size(230, 280) 16 | 17 | signal loginRequested(string userName, string password) 18 | signal loginSucceeded() 19 | signal loginFailed(string message) 20 | 21 | ScrollIndicator.horizontal: ScrollIndicator {} 22 | 23 | width: count > 1 ? itemSelectedSize.width + ((itemSize.width + spacing) * Math.min(count - 1, 3)) : itemSelectedSize.width + (spacing * 2) 24 | height: itemSelectedSize.height + spacing 25 | orientation: ListView.Horizontal 26 | spacing: Units.smallSpacing 27 | keyNavigationWraps: true 28 | focus: true 29 | clip: true 30 | highlightMoveVelocity: 800 31 | currentIndex: -1 32 | delegate: UserDelegate { 33 | id: userDelegate 34 | onAccepted: usersListView.loginRequested(userName, field.text) 35 | } 36 | 37 | Component.onCompleted: currentIndex = 0 38 | } 39 | -------------------------------------------------------------------------------- /src/imports/shell/StatusAreaExtension.qml: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2021 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | import QtQuick 6 | import Fluid.Core as FluidCore 7 | 8 | FluidCore.Object { 9 | property Component indicator 10 | property Component menu 11 | } 12 | -------------------------------------------------------------------------------- /src/imports/shell/extensionsmodel.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2021 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | #ifndef EXTENSIONSMODEL_H 6 | #define EXTENSIONSMODEL_H 7 | 8 | #include 9 | #include 10 | #include 11 | #include 12 | 13 | Q_DECLARE_LOGGING_CATEGORY(lcExtensions) 14 | 15 | class ExtensionItem : public QObject 16 | { 17 | Q_OBJECT 18 | Q_PROPERTY(QString name READ name CONSTANT) 19 | Q_PROPERTY(QUrl url READ url CONSTANT) 20 | Q_PROPERTY(quint32 order READ order CONSTANT) 21 | public: 22 | explicit ExtensionItem(QObject *parent = nullptr); 23 | 24 | QString name() const; 25 | void setName(const QString &name); 26 | 27 | QUrl url() const; 28 | void setUrl(const QUrl &url); 29 | 30 | quint32 order() const; 31 | void setOrder(quint32 value); 32 | 33 | private: 34 | QString m_name; 35 | QUrl m_url; 36 | quint32 m_order = 0; 37 | }; 38 | 39 | class ExtensionsModel : public QAbstractListModel 40 | { 41 | Q_OBJECT 42 | QML_ELEMENT 43 | public: 44 | enum Role { 45 | NameRole = Qt::UserRole + 1, 46 | UrlRole, 47 | OrderRole 48 | }; 49 | 50 | explicit ExtensionsModel(QObject *parent = nullptr); 51 | ~ExtensionsModel(); 52 | 53 | QHash roleNames() const override; 54 | int rowCount(const QModelIndex & parent = QModelIndex()) const override; 55 | QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const override; 56 | void sort(int column, Qt::SortOrder order = Qt::AscendingOrder) override; 57 | 58 | static void populate(ExtensionsModel *model); 59 | 60 | private: 61 | QHash m_roleNames; 62 | QList m_items; 63 | QStringList m_extensionNames; 64 | }; 65 | 66 | #endif // EXTENSIONSMODEL_H 67 | -------------------------------------------------------------------------------- /src/imports/shell/multimediakeysclient.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2019 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | #ifndef MULTIMEDIAKEYSCLIENT_H 6 | #define MULTIMEDIAKEYSCLIENT_H 7 | 8 | #include 9 | #include 10 | 11 | class MultimediaKeysClient : public QObject 12 | { 13 | Q_OBJECT 14 | QML_ELEMENT 15 | QML_SINGLETON 16 | public: 17 | explicit MultimediaKeysClient(QObject *parent = nullptr); 18 | 19 | static MultimediaKeysClient *create(QQmlEngine *qmlEngine, QJSEngine *jsEngine); 20 | 21 | Q_SIGNALS: 22 | void volumeMute(); 23 | void volumeUp(); 24 | void volumeDown(); 25 | void mediaPlay(); 26 | void mediaPrevious(); 27 | void mediaNext(); 28 | }; 29 | 30 | #endif // MULTIMEDIAKEYSCLIENT_H 31 | -------------------------------------------------------------------------------- /src/imports/shell/osdclient.cpp: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2019 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | #include 6 | #include 7 | #include 8 | 9 | #include "osdclient.h" 10 | 11 | OsdClient::OsdClient(QObject *parent) 12 | : QObject(parent) 13 | { 14 | } 15 | 16 | void OsdClient::showText(const QString &iconName, const QString &text) 17 | { 18 | auto msg = QDBusMessage::createMethodCall(QStringLiteral("io.liri.Shell"), 19 | QStringLiteral("/Osd"), 20 | QStringLiteral("io.liri.Shell.Osd"), 21 | QStringLiteral("ShowText")); 22 | QVariantList args; 23 | args.append(iconName); 24 | args.append(text); 25 | msg.setArguments(args); 26 | QDBusConnection::sessionBus().asyncCall(msg); 27 | } 28 | 29 | void OsdClient::showProgress(const QString &iconName, int value) 30 | { 31 | auto msg = QDBusMessage::createMethodCall(QStringLiteral("io.liri.Shell"), 32 | QStringLiteral("/Osd"), 33 | QStringLiteral("io.liri.Shell.Osd"), 34 | QStringLiteral("ShowProgress")); 35 | QVariantList args; 36 | args.append(iconName); 37 | args.append(value); 38 | msg.setArguments(args); 39 | QDBusConnection::sessionBus().asyncCall(msg); 40 | } 41 | 42 | OsdClient *OsdClient::create(QQmlEngine *qmlEngine, QJSEngine *jsEngine) 43 | { 44 | Q_UNUSED(qmlEngine); 45 | Q_UNUSED(jsEngine); 46 | return new OsdClient(); 47 | } 48 | -------------------------------------------------------------------------------- /src/imports/shell/osdclient.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2019 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | #ifndef OSDCLIENT_H 6 | #define OSDCLIENT_H 7 | 8 | #include 9 | #include 10 | 11 | class OsdClient : public QObject 12 | { 13 | Q_OBJECT 14 | QML_ELEMENT 15 | QML_SINGLETON 16 | public: 17 | explicit OsdClient(QObject *parent = nullptr); 18 | 19 | Q_INVOKABLE void showText(const QString &iconName, const QString &text = QString()); 20 | Q_INVOKABLE void showProgress(const QString &iconName, int value); 21 | 22 | static OsdClient *create(QQmlEngine *qmlEngine, QJSEngine *jsEngine); 23 | }; 24 | 25 | #endif // OSDCLIENT_H 26 | -------------------------------------------------------------------------------- /src/imports/storage/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2024 Pier Luigi Fiorini 2 | # SPDX-License-Identifier: BSD-3-Clause 3 | 4 | find_package(KF6Solid REQUIRED) 5 | 6 | ecm_add_qml_module(StorageQmlPlugin 7 | URI Liri.Storage 8 | VERSION 1.0 9 | CLASS_NAME StoragePlugin 10 | NO_GENERATE_PLUGIN_SOURCE 11 | DEPENDENCIES QtQuick 12 | ) 13 | 14 | target_sources(StorageQmlPlugin 15 | PRIVATE 16 | plugin.cpp 17 | storagedevice.cpp storagedevice.h 18 | storagemodel.cpp storagemodel.h 19 | ) 20 | 21 | target_link_libraries(StorageQmlPlugin 22 | PRIVATE 23 | Qt6::Qml 24 | Qt6::Quick 25 | KF6::Solid 26 | ) 27 | 28 | ecm_finalize_qml_module(StorageQmlPlugin) 29 | 30 | -------------------------------------------------------------------------------- /src/imports/storage/plugin.cpp: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2018 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: LGPL-3.0-or-later 4 | 5 | #include 6 | 7 | #include "storagedevice.h" 8 | #include "storagemodel.h" 9 | 10 | class StoragePlugin : public QQmlExtensionPlugin 11 | { 12 | Q_OBJECT 13 | Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface") 14 | public: 15 | void registerTypes(const char *uri) 16 | { 17 | Q_ASSERT(QLatin1String(uri) == QLatin1String("Liri.Storage")); 18 | 19 | // @uri Liri.Storage 20 | qmlRegisterType(uri, 1, 0, "StorageModel"); 21 | qmlRegisterUncreatableType(uri, 1, 0, "StorageDevice", 22 | QLatin1String("Cannot create StorageDevice object")); 23 | } 24 | }; 25 | 26 | #include "plugin.moc" 27 | -------------------------------------------------------------------------------- /src/imports/storage/plugins.qmltypes: -------------------------------------------------------------------------------- 1 | import QtQuick.tooling 1.2 2 | 3 | // This file describes the plugin-supplied types contained in the library. 4 | // It is used for QML tooling purposes only. 5 | // 6 | // This file was auto-generated by: 7 | // 'qmlplugindump-qt5 -v -noinstantiate -notrelocatable Liri.Storage 1.0' 8 | 9 | Module { 10 | dependencies: ["QtQuick 2.8"] 11 | Component { 12 | name: "StorageDevice" 13 | prototype: "QObject" 14 | exports: ["Liri.Storage/StorageDevice 1.0"] 15 | isCreatable: false 16 | exportMetaObjectRevisions: [0] 17 | Property { name: "udi"; type: "string"; isReadonly: true } 18 | Property { name: "name"; type: "string"; isReadonly: true } 19 | Property { name: "iconName"; type: "string"; isReadonly: true } 20 | Property { name: "filePath"; type: "string"; isReadonly: true } 21 | Property { name: "mounted"; type: "bool"; isReadonly: true } 22 | Property { name: "ignored"; type: "bool"; isReadonly: true } 23 | Method { name: "mount" } 24 | Method { name: "unmount" } 25 | } 26 | Component { 27 | name: "StorageModel" 28 | prototype: "QAbstractListModel" 29 | exports: ["Liri.Storage/StorageModel 1.0"] 30 | exportMetaObjectRevisions: [0] 31 | Property { name: "count"; type: "int"; isReadonly: true } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/imports/storage/qmldir: -------------------------------------------------------------------------------- 1 | module Liri.Storage 2 | plugin storageplugin 3 | classname StoragePlugin 4 | typeinfo plugins.qmltypes 5 | -------------------------------------------------------------------------------- /src/imports/storage/storagedevice.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2018 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: LGPL-3.0-or-later 4 | 5 | #ifndef STORAGEDEVICE_H 6 | #define STORAGEDEVICE_H 7 | 8 | #include 9 | 10 | #include 11 | 12 | class StorageDevice : public QObject 13 | { 14 | Q_OBJECT 15 | Q_PROPERTY(QString udi READ udi CONSTANT) 16 | Q_PROPERTY(QString name READ name CONSTANT) 17 | Q_PROPERTY(QString iconName READ iconName CONSTANT) 18 | Q_PROPERTY(QString filePath READ filePath CONSTANT) 19 | Q_PROPERTY(bool mounted READ isMounted NOTIFY mountedChanged) 20 | Q_PROPERTY(bool ignored READ isIgnored CONSTANT) 21 | public: 22 | explicit StorageDevice(const QString &udi, QObject *parent = nullptr); 23 | 24 | QString udi() const; 25 | QString name() const; 26 | QString iconName() const; 27 | QString filePath() const; 28 | 29 | bool isMounted() const; 30 | Q_INVOKABLE void mount(); 31 | Q_INVOKABLE void unmount(); 32 | 33 | bool isIgnored() const; 34 | 35 | Q_SIGNALS: 36 | void mountedChanged(); 37 | 38 | private: 39 | Solid::Device m_device; 40 | QString m_filePath; 41 | bool m_ignored; 42 | }; 43 | 44 | #endif // STORAGEDEVICE_H 45 | -------------------------------------------------------------------------------- /src/imports/storage/storagemodel.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2018 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: LGPL-3.0-or-later 4 | 5 | #ifndef STORAGEMODEL_H 6 | #define STORAGEMODEL_H 7 | 8 | #include 9 | 10 | class StorageDevice; 11 | 12 | class StorageModel : public QAbstractListModel 13 | { 14 | Q_OBJECT 15 | Q_PROPERTY(int count READ rowCount NOTIFY countChanged) 16 | public: 17 | enum Roles { 18 | StorageDeviceRole = Qt::UserRole + 1, 19 | UdiRole, 20 | NameRole, 21 | IconNameRole, 22 | FilePathRole, 23 | IsMountedRole, 24 | IsIgnoredRole 25 | }; 26 | 27 | explicit StorageModel(QObject *parent = nullptr); 28 | 29 | QHash roleNames() const override; 30 | int rowCount(const QModelIndex &parent = QModelIndex()) const override; 31 | QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; 32 | 33 | Q_SIGNALS: 34 | void countChanged(); 35 | 36 | private: 37 | QVector m_devices; 38 | QMap m_devicesMap; 39 | }; 40 | 41 | #endif // STORAGEMODEL_H 42 | -------------------------------------------------------------------------------- /src/imports/taskmanager/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2024 Pier Luigi Fiorini 2 | # SPDX-License-Identifier: BSD-3-Clause 3 | 4 | if(NOT TARGET Liri::Qt6GSettings) 5 | find_package(Qt6GSettings REQUIRED) 6 | endif() 7 | if(NOT TARGET Liri::Xdg) 8 | find_package(Liri1Xdg REQUIRED) 9 | endif() 10 | 11 | ecm_add_qml_module(TaskManagerQmlPlugin 12 | URI Liri.Shell.TaskManager 13 | VERSION 1.0 14 | CLASS_NAME TaskManagerPlugin 15 | NO_GENERATE_PLUGIN_SOURCE 16 | DEPENDENCIES QtQuick 17 | ) 18 | 19 | target_sources(TaskManagerQmlPlugin 20 | PRIVATE 21 | application.cpp application.h 22 | applicationsmodel.cpp applicationsmodel.h 23 | appusage.cpp appusage.h 24 | categoriesmodel.cpp categoriesmodel.h 25 | frequentmodel.cpp frequentmodel.h 26 | pagemodel.cpp pagemodel.h 27 | plugin.cpp 28 | tasksmodel.cpp tasksmodel.h 29 | usagetracker.cpp usagetracker.h 30 | wlrforeigntoplevelmanagementv1.cpp wlrforeigntoplevelmanagementv1.h wlrforeigntoplevelmanagementv1_p.h 31 | xdgutils.cpp xdgutils.h 32 | ) 33 | 34 | target_link_libraries(TaskManagerQmlPlugin 35 | PRIVATE 36 | Qt6::Core 37 | Qt6::Concurrent 38 | Qt6::DBus 39 | Qt6::Gui 40 | Qt6::GuiPrivate 41 | Qt6::WaylandClient 42 | Qt6::Sql 43 | Liri::Qt6GSettings 44 | Liri::Xdg 45 | ) 46 | 47 | ecm_qt_declare_logging_category( 48 | TaskManagerQmlPlugin 49 | HEADER "lirishelltaskmanagerlogging.h" 50 | IDENTIFIER "gLcTaskManager" 51 | CATEGORY_NAME "liri.shell.taskmanager" 52 | DEFAULT_SEVERITY "Info" 53 | ) 54 | 55 | aurora_generate_wayland_protocol_client_sources(TaskManagerQmlPlugin 56 | FILES 57 | ${PROJECT_SOURCE_DIR}/data/protocols/wlr-foreign-toplevel-management-unstable-v1.xml 58 | ) 59 | 60 | ecm_finalize_qml_module(TaskManagerQmlPlugin) 61 | -------------------------------------------------------------------------------- /src/imports/taskmanager/appusage.cpp: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2017 Michael Spencer 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | #include 6 | #include 7 | 8 | #include "appusage.h" 9 | 10 | AppUsage::AppUsage(const QString &appId, QObject *parent) 11 | : QObject(parent) 12 | , appId(appId) 13 | { 14 | m_db = QSqlDatabase::database(QStringLiteral("app_usage")); 15 | } 16 | 17 | void AppUsage::save() const 18 | { 19 | if (!m_db.isOpen()) 20 | return; 21 | 22 | QSqlQuery query(m_db); 23 | query.prepare(QStringLiteral("INSERT OR REPLACE INTO app_usage VALUES (:id, :last_seen, :score)")); 24 | query.bindValue(QStringLiteral(":id"), appId); 25 | query.bindValue(QStringLiteral(":last_seen"), lastSeen.toSecsSinceEpoch()); 26 | query.bindValue(QStringLiteral(":score"), score); 27 | query.exec(); 28 | } 29 | 30 | void AppUsage::destroy() const 31 | { 32 | if (!m_db.isOpen()) 33 | return; 34 | 35 | QSqlQuery query(m_db); 36 | query.prepare(QStringLiteral("DELETE FROM app_usage WHERE app_id = :id")); 37 | query.bindValue(QStringLiteral(":id"), appId); 38 | query.exec(); 39 | } 40 | -------------------------------------------------------------------------------- /src/imports/taskmanager/appusage.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2017 Michael Spencer 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | #ifndef APPUSAGE_H 6 | #define APPUSAGE_H 7 | 8 | #include 9 | #include 10 | #include 11 | 12 | class AppUsage : QObject 13 | { 14 | Q_OBJECT 15 | public: 16 | AppUsage(const QString &appId, QObject *parent = nullptr); 17 | 18 | QString appId; 19 | QDateTime lastSeen; 20 | int score = 0; 21 | 22 | void save() const; 23 | void destroy() const; 24 | 25 | private: 26 | QSqlDatabase m_db; 27 | }; 28 | 29 | #endif // APPUSAGE_H 30 | -------------------------------------------------------------------------------- /src/imports/taskmanager/categoriesmodel.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2018-2021 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | #ifndef CATEGORIESMODEL_H 6 | #define CATEGORIESMODEL_H 7 | 8 | #include 9 | #include 10 | 11 | class CategoryEntry; 12 | 13 | class CategoriesModel : public QAbstractListModel 14 | { 15 | Q_OBJECT 16 | Q_PROPERTY(bool includeAllCategory READ isAllCategoryIncluded WRITE includeAllCategory NOTIFY includeAllCategoryChanged) 17 | public: 18 | enum Roles { 19 | NameRole = Qt::UserRole +1, 20 | CommentRole, 21 | IconNameRole, 22 | CategoryRole 23 | }; 24 | Q_ENUM(Roles) 25 | 26 | CategoriesModel(QObject *parent = 0); 27 | ~CategoriesModel(); 28 | 29 | bool isAllCategoryIncluded() const; 30 | void includeAllCategory(bool value); 31 | 32 | QHash roleNames() const; 33 | 34 | int rowCount(const QModelIndex &parent = QModelIndex()) const; 35 | 36 | QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; 37 | 38 | Q_SIGNALS: 39 | void includeAllCategoryChanged(); 40 | void refreshing(); 41 | 42 | private: 43 | bool m_initialized; 44 | QList m_list; 45 | bool m_allCategory; 46 | 47 | static void refresh(CategoriesModel *model); 48 | 49 | private Q_SLOTS: 50 | void createAllCategory(); 51 | void addEntry(CategoryEntry *entry); 52 | void cleanModel(const QStringList &list); 53 | void sortModel(); 54 | }; 55 | 56 | QML_DECLARE_TYPE(CategoriesModel) 57 | 58 | #endif // CATEGORIESMODEL_H 59 | -------------------------------------------------------------------------------- /src/imports/taskmanager/frequentmodel.cpp: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2019-2021 Pier Luigi Fiorini 2 | // SPDX-FileCopyrightText: 2017 Michael Spencer 3 | // 4 | // SPDX-License-Identifier: GPL-3.0-or-later 5 | 6 | #include 7 | 8 | #include "applicationsmodel.h" 9 | #include "frequentmodel.h" 10 | #include "usagetracker.h" 11 | 12 | // FIXME: This old code might not be completely right 13 | QString appIdFromDesktopFile(const QString &desktopFile) 14 | { 15 | return QFileInfo(desktopFile).completeBaseName(); 16 | } 17 | 18 | FrequentAppsModel::FrequentAppsModel(QObject *parent) 19 | : QSortFilterProxyModel(parent) 20 | { 21 | sort(0, Qt::DescendingOrder); 22 | 23 | connect(UsageTracker::instance(), &UsageTracker::updated, 24 | this, &FrequentAppsModel::invalidate); 25 | } 26 | 27 | bool FrequentAppsModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const 28 | { 29 | QModelIndex sourceIndex = sourceModel()->index(sourceRow, 0, sourceParent); 30 | QString appId = sourceModel()->data(sourceIndex, ApplicationsModel::AppIdRole).toString(); 31 | 32 | AppUsage *app = UsageTracker::instance()->usageForAppId(appId); 33 | 34 | return app != nullptr && app->score > 0; 35 | } 36 | 37 | bool FrequentAppsModel::lessThan(const QModelIndex &source_left, 38 | const QModelIndex &source_right) const 39 | { 40 | QString leftAppId = sourceModel()->data(source_left, ApplicationsModel::AppIdRole).toString(); 41 | QString rightAppId = sourceModel()->data(source_right, ApplicationsModel::AppIdRole).toString(); 42 | 43 | AppUsage *leftApp = UsageTracker::instance()->usageForAppId(leftAppId); 44 | AppUsage *rightApp = UsageTracker::instance()->usageForAppId(rightAppId); 45 | 46 | if (leftApp == nullptr) 47 | return false; 48 | else if (rightApp == nullptr) 49 | return true; 50 | else 51 | return leftApp->score < rightApp->score; 52 | } 53 | -------------------------------------------------------------------------------- /src/imports/taskmanager/frequentmodel.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2019-2021 Pier Luigi Fiorini 2 | // SPDX-FileCopyrightText: 2017 Michael Spencer 3 | // 4 | // SPDX-License-Identifier: GPL-3.0-or-later 5 | 6 | #ifndef FREQUENTMODEL_H 7 | #define FREQUENTMODEL_H 8 | 9 | #include 10 | #include 11 | 12 | class FrequentAppsModel : public QSortFilterProxyModel 13 | { 14 | Q_OBJECT 15 | public: 16 | explicit FrequentAppsModel(QObject *parent = nullptr); 17 | 18 | int startIndex() const; 19 | int limitCount() const; 20 | 21 | bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const; 22 | 23 | bool lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const; 24 | }; 25 | 26 | QML_DECLARE_TYPE(FrequentAppsModel) 27 | 28 | #endif // FREQUENTMODEL_H 29 | -------------------------------------------------------------------------------- /src/imports/taskmanager/pagemodel.cpp: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2017 Michael Spencer 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | #include 6 | 7 | #include "pagemodel.h" 8 | 9 | PageModel::PageModel(QObject *parent) 10 | : QSortFilterProxyModel(parent) 11 | { 12 | } 13 | 14 | bool PageModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const 15 | { 16 | Q_UNUSED(sourceParent) 17 | 18 | return sourceRow >= m_startIndex && sourceRow < m_startIndex + m_limitCount; 19 | } 20 | 21 | int PageModel::startIndex() const { return m_startIndex; } 22 | 23 | int PageModel::limitCount() const { return m_limitCount; } 24 | 25 | void PageModel::setStartIndex(int startIndex) 26 | { 27 | if (startIndex != m_startIndex) { 28 | m_startIndex = startIndex; 29 | invalidateFilter(); 30 | emit startIndexChanged(); 31 | } 32 | } 33 | 34 | void PageModel::setLimitCount(int limitCount) 35 | { 36 | if (limitCount != m_limitCount) { 37 | m_limitCount = limitCount; 38 | invalidateFilter(); 39 | emit limitCountChanged(); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/imports/taskmanager/pagemodel.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2017 Michael Spencer 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | #ifndef PAGEMODEL_H 6 | #define PAGEMODEL_H 7 | 8 | #include 9 | #include 10 | 11 | /** 12 | * Provides a simple proxy model for accessing a subset, or "page," of data from a source model. 13 | * This is used by PagedGrid to provide models to each page with the appropriate subset of data. 14 | */ 15 | class PageModel : public QSortFilterProxyModel 16 | { 17 | Q_OBJECT 18 | Q_PROPERTY(int startIndex READ startIndex WRITE setStartIndex NOTIFY startIndexChanged) 19 | Q_PROPERTY(int limitCount READ limitCount WRITE setLimitCount NOTIFY limitCountChanged) 20 | public: 21 | PageModel(QObject *parent = nullptr); 22 | 23 | int startIndex() const; 24 | int limitCount() const; 25 | 26 | bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const; 27 | 28 | public Q_SLOTS: 29 | void setStartIndex(int startIndex); 30 | void setLimitCount(int limitCount); 31 | 32 | Q_SIGNALS: 33 | void startIndexChanged(); 34 | void limitCountChanged(); 35 | 36 | private: 37 | int m_startIndex = 0; 38 | int m_limitCount = 0; 39 | }; 40 | 41 | QML_DECLARE_TYPE(PageModel) 42 | 43 | #endif // PAGEMODEL_H 44 | -------------------------------------------------------------------------------- /src/imports/taskmanager/plugin.cpp: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2018-2021 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | #include 6 | 7 | #include "application.h" 8 | #include "applicationsmodel.h" 9 | #include "categoriesmodel.h" 10 | #include "frequentmodel.h" 11 | #include "pagemodel.h" 12 | #include "tasksmodel.h" 13 | 14 | class TaskManagerPlugin : public QQmlExtensionPlugin 15 | { 16 | Q_OBJECT 17 | Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface") 18 | 19 | public: 20 | void registerTypes(const char *uri) override 21 | { 22 | // @uri Liri.Shell.TaskManager 23 | Q_ASSERT(strcmp(uri, "Liri.Shell.TaskManager") == 0); 24 | 25 | const int versionMajor = 1; 26 | const int versionMinor = 0; 27 | 28 | qmlRegisterUncreatableType(uri, versionMajor, versionMinor, "Application", 29 | QStringLiteral("Cannot instantiate Application")); 30 | qmlRegisterType(uri, versionMajor, versionMinor, "ApplicationsModel"); 31 | qmlRegisterType(uri, versionMajor, versionMinor, "CategoriesModel"); 32 | qmlRegisterType(uri, versionMajor, versionMinor, "FrequentAppsModel"); 33 | qmlRegisterType(uri, versionMajor, versionMinor, "PageModel"); 34 | qmlRegisterType(uri, versionMajor, versionMinor, "TasksModel"); 35 | } 36 | }; 37 | 38 | #include "plugin.moc" 39 | -------------------------------------------------------------------------------- /src/imports/taskmanager/qmldir: -------------------------------------------------------------------------------- 1 | module Liri.Shell.TaskManager 2 | plugin taskmanagerplugin 3 | classname TaskManagerPlugin 4 | typeinfo plugins.qmltypes 5 | -------------------------------------------------------------------------------- /src/imports/taskmanager/tasksmodel.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2018-2021 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | #ifndef TASKSMODEL_H 6 | #define TASKSMODEL_H 7 | 8 | #include 9 | #include 10 | 11 | class Application; 12 | class ApplicationsModel; 13 | 14 | class TasksModel : public QSortFilterProxyModel 15 | { 16 | Q_OBJECT 17 | Q_PROPERTY(bool hasMaximizedWindow READ hasMaximizedWindow NOTIFY hasMaximizedWindowChanged) 18 | public: 19 | explicit TasksModel(QObject *parent = nullptr); 20 | 21 | void setSourceModel(QAbstractItemModel *sourceModel) override; 22 | 23 | bool hasMaximizedWindow() const; 24 | 25 | Q_INVOKABLE Application *get(int row) const; 26 | Q_INVOKABLE int indexFromAppId(const QString &appId) const; 27 | 28 | Q_SIGNALS: 29 | void hasMaximizedWindowChanged(); 30 | 31 | protected: 32 | bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override; 33 | bool lessThan(const QModelIndex &sourceLeft, const QModelIndex &sourceRight) const override; 34 | 35 | private: 36 | ApplicationsModel *m_appsModel = nullptr; 37 | }; 38 | 39 | QML_DECLARE_TYPE(TasksModel) 40 | 41 | #endif // TASKSMODEL_H 42 | -------------------------------------------------------------------------------- /src/imports/taskmanager/usagetracker.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2017 Michael Spencer 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | #ifndef USAGETRACKER_H 6 | #define USAGETRACKER_H 7 | 8 | #include 9 | #include 10 | #include 11 | #include 12 | 13 | #include "appusage.h" 14 | 15 | class UsageTracker : public QObject 16 | { 17 | Q_OBJECT 18 | public: 19 | UsageTracker(QObject *parent = nullptr); 20 | 21 | void applicationFocused(const QString &appId); 22 | 23 | void applicationLaunched(const QString &appId); 24 | 25 | // TODO: Call this from QML 26 | void sessionIdleStateChanged(bool isIdle); 27 | 28 | static UsageTracker *instance(); 29 | 30 | inline AppUsage *usageForAppId(const QString &appId) { return usageForAppId(appId, false); } 31 | 32 | Q_SIGNALS: 33 | void updated(); 34 | 35 | private: 36 | void normalizeScores(); 37 | 38 | void incrementUsageForApp(AppUsage *app); 39 | void incrementUsageForApp(AppUsage *app, const QDateTime &time); 40 | 41 | void openDatabase(); 42 | void migrate(); 43 | void loadUsage(); 44 | void cleanUsage(); 45 | 46 | AppUsage *usageForAppId(const QString &appId, bool createIfNew); 47 | 48 | QList m_apps; 49 | AppUsage *m_watchedApp = nullptr; 50 | QDateTime m_watchStartTime; 51 | bool m_isIdle = false; 52 | 53 | QSqlDatabase m_db; 54 | }; 55 | 56 | #endif // USAGETRACKER_H 57 | -------------------------------------------------------------------------------- /src/imports/taskmanager/utils_p.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2019-2023 Pier Luigi Fiorini 2 | // SPDX-License-Identifier: LGPL-3.0-or-later 3 | 4 | #pragma once 5 | 6 | #include 7 | #include 8 | #include 9 | #include 10 | 11 | #include 12 | 13 | static inline struct ::wl_seat *getWlSeat() 14 | { 15 | void *seat = QGuiApplication::platformNativeInterface()->nativeResourceForIntegration("wl_seat"); 16 | return static_cast(seat); 17 | } 18 | 19 | static inline struct ::wl_surface *getWlSurface(QWindow *window) 20 | { 21 | if (!window) 22 | return nullptr; 23 | void *surface = QGuiApplication::platformNativeInterface()->nativeResourceForWindow("surface", window); 24 | return static_cast(surface); 25 | } 26 | 27 | static inline struct ::wl_output *getWlOutput(QScreen *screen) 28 | { 29 | if (!screen) 30 | return nullptr; 31 | void *output = QGuiApplication::platformNativeInterface()->nativeResourceForScreen("output", screen); 32 | return static_cast(output); 33 | } 34 | 35 | static inline QScreen *getScreen(struct ::wl_output *output) 36 | { 37 | const auto screens = QGuiApplication::screens(); 38 | for (auto screen : screens) { 39 | if (getWlOutput(screen) == output) 40 | return screen; 41 | } 42 | 43 | return nullptr; 44 | } 45 | -------------------------------------------------------------------------------- /src/imports/taskmanager/xdgutils.cpp: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2018-2021 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | #include 6 | #include 7 | 8 | #include "xdgutils.h" 9 | 10 | /*! 11 | * Returns a list of XDG compliant paths for applications. 12 | * See https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html 13 | */ 14 | QStringList xdgApplicationsPaths() 15 | { 16 | QStringList paths; 17 | QStringList xdgPaths; 18 | 19 | // Add XDG_DATA_HOME 20 | QString xdgDataHome = QFile::decodeName(qgetenv("XDG_DATA_HOME")); 21 | if (xdgDataHome.isEmpty()) 22 | xdgDataHome = QDir::home().absoluteFilePath(QLatin1String(".local/share")); 23 | xdgPaths.append(xdgDataHome); 24 | 25 | // Add XDG_DATA_DIRS 26 | QString xdgDataDirs = QFile::decodeName(qgetenv("XDG_DATA_DIRS")); 27 | if (xdgDataDirs.isEmpty()) 28 | xdgDataDirs = QLatin1String("/usr/local/share/:/usr/share/"); 29 | 30 | // Split ':' path separator from XDG data directories 31 | xdgPaths += xdgDataDirs.split(QLatin1Char(':'), Qt::SkipEmptyParts); 32 | 33 | // Append the applications directory to all XDG data directories 34 | for (const QString &xdgPath : qAsConst(xdgPaths)) { 35 | QDir iconDir = QDir(xdgPath).filePath(QLatin1String("applications")); 36 | paths.append(iconDir.absolutePath()); 37 | } 38 | 39 | // Remove duplicates 40 | paths.removeDuplicates(); 41 | 42 | return paths; 43 | } 44 | -------------------------------------------------------------------------------- /src/imports/taskmanager/xdgutils.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2018-2021 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | #ifndef XDGUTILS_H 6 | #define XDGUTILS_H 7 | 8 | #include 9 | 10 | QStringList xdgApplicationsPaths(); 11 | 12 | #endif // XDGUTILS_H 13 | -------------------------------------------------------------------------------- /src/imports/utils/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2024 Pier Luigi Fiorini 2 | # SPDX-License-Identifier: BSD-3-Clause 3 | 4 | ecm_add_qml_module(ShellUtilsQmlPlugin 5 | URI Liri.Shell.Utils 6 | VERSION 1.0 7 | CLASS_NAME ShellUtilsPlugin 8 | GENERATE_PLUGIN_SOURCE 9 | DEPENDENCIES QtQuick 10 | ) 11 | 12 | target_sources(ShellUtilsQmlPlugin 13 | PRIVATE 14 | qqmlsortfilterproxymodel.cpp qqmlsortfilterproxymodel.h 15 | ) 16 | 17 | target_link_libraries(ShellUtilsQmlPlugin 18 | PRIVATE 19 | Qt6::Qml 20 | ) 21 | 22 | ecm_finalize_qml_module(ShellUtilsQmlPlugin) 23 | -------------------------------------------------------------------------------- /src/lockscreen/authenticator.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2018-2021 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | #ifndef AUTHENTICATOR_H 6 | #define AUTHENTICATOR_H 7 | 8 | #include 9 | #include 10 | #include 11 | 12 | extern "C" { 13 | struct pam_message; 14 | struct pam_response; 15 | } 16 | 17 | class Authenticator : public QObject 18 | { 19 | Q_OBJECT 20 | QML_ELEMENT 21 | QML_SINGLETON 22 | public: 23 | Authenticator(QObject *parent = nullptr); 24 | ~Authenticator(); 25 | 26 | Q_INVOKABLE void authenticate(const QString &password, const QJSValue &callback); 27 | 28 | static Authenticator *create(QQmlEngine *qmlEngine, QJSEngine *jsEngine); 29 | 30 | public Q_SLOTS: 31 | 32 | Q_SIGNALS: 33 | void authenticationSucceded(); 34 | void authenticationFailed(); 35 | void authenticationError(); 36 | 37 | private: 38 | bool m_authRequested = false; 39 | QJSValue m_callback; 40 | pam_response *m_response = nullptr; 41 | 42 | void actualAuthentication(const QString &password); 43 | void sendReply(bool succeeded); 44 | 45 | static int conversationHandler(int num, const pam_message **message, 46 | pam_response **response, void *data); 47 | }; 48 | 49 | #endif // AUTHENTICATOR_H 50 | -------------------------------------------------------------------------------- /src/lockscreen/qml/main.qml: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2022 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | import QtQml 6 | import QtQuick 7 | 8 | Item { 9 | /* 10 | * UI 11 | */ 12 | 13 | Instantiator { 14 | model: Qt.application.screens 15 | 16 | LockScreenWindow { 17 | screen: modelData 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/plugins/statusarea/datetime/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | liri_add_statusareaextension(DateTime 2 | QML_FILES 3 | contents/main.qml 4 | TRANSLATIONS_PATH 5 | "${CMAKE_CURRENT_SOURCE_DIR}/../../../../translations/statusarea/datetime" 6 | ) 7 | -------------------------------------------------------------------------------- /src/plugins/statusarea/datetime/contents/main.qml: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2021 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | import QtQuick 6 | import Liri.Shell as Shell 7 | 8 | Shell.StatusAreaExtension { 9 | indicator: Shell.Indicator { 10 | property var now: new Date() 11 | 12 | text: Qt.formatTime(now) 13 | 14 | Timer { 15 | interval: 1000 16 | repeat: true 17 | running: true 18 | onTriggered: { 19 | now = new Date(); 20 | } 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/plugins/statusarea/datetime/metadata.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Type=X-Liri-Service 3 | Name=Date and time 4 | Name[de]=Datum und Uhrzeit 5 | Name[lt]=Data ir laikas 6 | Name[nl]=Datum en tijd 7 | Name[pt_BR]=Data e hora 8 | Name[tr]=Tarih ve saat 9 | Comment=Current date and time 10 | Comment[de]=Aktuelles Datum und Uhrzeit 11 | Comment[lt]=Dabartinė data ir laikas 12 | Comment[nl]=Huidige datum en tijd 13 | Comment[pt_BR]=Data e hora atual 14 | Comment[tr]=Geçerli tarih ve saat 15 | Keywords=Date;Time; 16 | Keywords[de]=Datum;Zeit; 17 | Keywords[lt]=Data;Laikas; 18 | Keywords[nl]=Datum;Tijd; 19 | Keywords[pt_BR]=Data;Hora; 20 | Keywords[tr]=Tarih;Saat; 21 | OnlyShowIn=X-Liri; 22 | X-Liri-ServiceType=StatusAreaExtension 23 | X-Liri-StatusAreaExtension-Script=contents/main.qml 24 | X-Liri-StatusAreaExtension-Order=1 25 | X-Liri-PluginInfo-Name=io.liri.StatusAreaExtensions.DateTime 26 | X-Liri-PluginInfo-Category=StatusAreaExtensions 27 | X-Liri-PluginInfo-Author=Pier Luigi Fiorini 28 | X-Liri-PluginInfo-Version=1.0.0 29 | X-Liri-PluginInfo-Website=https://liri.io 30 | X-Liri-PluginInfo-License=GPL-3.0-or-later 31 | X-Liri-PluginInfo-EnabledByDefault=true 32 | -------------------------------------------------------------------------------- /src/plugins/statusarea/datetime/metadata.desktop.in: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Type=X-Liri-Service 3 | _Name=Date and time 4 | _Comment=Current date and time 5 | _Keywords=Date;Time; 6 | OnlyShowIn=X-Liri; 7 | X-Liri-ServiceType=StatusAreaExtension 8 | X-Liri-StatusAreaExtension-Script=contents/main.qml 9 | X-Liri-StatusAreaExtension-Order=1 10 | X-Liri-PluginInfo-Name=io.liri.StatusAreaExtensions.DateTime 11 | X-Liri-PluginInfo-Category=StatusAreaExtensions 12 | X-Liri-PluginInfo-Author=Pier Luigi Fiorini 13 | X-Liri-PluginInfo-Version=1.0.0 14 | X-Liri-PluginInfo-Website=https://liri.io 15 | X-Liri-PluginInfo-License=GPL-3.0-or-later 16 | X-Liri-PluginInfo-EnabledByDefault=true 17 | -------------------------------------------------------------------------------- /src/plugins/statusarea/notifications/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | liri_add_statusareaextension(Notifications 2 | QML_FILES 3 | contents/main.qml 4 | TRANSLATIONS_PATH 5 | "${CMAKE_CURRENT_SOURCE_DIR}/../../../../translations/statusarea/notifications" 6 | ) 7 | -------------------------------------------------------------------------------- /src/plugins/statusarea/notifications/metadata.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Type=X-Liri-Service 3 | Name=Notifications 4 | Name[de]=Benachrichtigungen 5 | Name[lt]=Pranešimai 6 | Name[nl]=Meldingen 7 | Name[pt_BR]=Notificações 8 | Name[tr]=Bildirimler 9 | Comment=Show notifications 10 | Comment[de]=Benachrichtigungen anzeigen 11 | Comment[lt]=Rodyti pranešimus 12 | Comment[nl]=Meldingen tonen 13 | Comment[pt_BR]=Exibir notificações 14 | Comment[tr]=Bildirimleri göster 15 | Keywords=Notifications; 16 | Keywords[de]=Benachrichtigungen; 17 | Keywords[lt]=Pranešimai; 18 | Keywords[nl]=Meldingen; 19 | Keywords[pt_BR]=Notificações; 20 | Keywords[tr]=Bildirimler; 21 | OnlyShowIn=X-Liri; 22 | X-Liri-ServiceType=StatusAreaExtension 23 | X-Liri-StatusAreaExtension-Script=contents/main.qml 24 | X-Liri-StatusAreaExtension-Order=2 25 | X-Liri-PluginInfo-Name=io.liri.StatusAreaExtensions.Notifications 26 | X-Liri-PluginInfo-Category=StatusAreaExtensions 27 | X-Liri-PluginInfo-Author=Pier Luigi Fiorini 28 | X-Liri-PluginInfo-Version=1.0.0 29 | X-Liri-PluginInfo-Website=https://liri.io 30 | X-Liri-PluginInfo-License=GPL-3.0-or-later 31 | X-Liri-PluginInfo-EnabledByDefault=true 32 | -------------------------------------------------------------------------------- /src/plugins/statusarea/notifications/metadata.desktop.in: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Type=X-Liri-Service 3 | _Name=Notifications 4 | _Comment=Show notifications 5 | _Keywords=Notifications; 6 | OnlyShowIn=X-Liri; 7 | X-Liri-ServiceType=StatusAreaExtension 8 | X-Liri-StatusAreaExtension-Script=contents/main.qml 9 | X-Liri-StatusAreaExtension-Order=2 10 | X-Liri-PluginInfo-Name=io.liri.StatusAreaExtensions.Notifications 11 | X-Liri-PluginInfo-Category=StatusAreaExtensions 12 | X-Liri-PluginInfo-Author=Pier Luigi Fiorini 13 | X-Liri-PluginInfo-Version=1.0.0 14 | X-Liri-PluginInfo-Website=https://liri.io 15 | X-Liri-PluginInfo-License=GPL-3.0-or-later 16 | X-Liri-PluginInfo-EnabledByDefault=true 17 | -------------------------------------------------------------------------------- /src/plugins/statusarea/storage/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | liri_add_statusareaextension(Storage 2 | QML_FILES 3 | contents/main.qml 4 | contents/images/disk.svg 5 | contents/images/eject.svg 6 | contents/images/harddisk.svg 7 | TRANSLATIONS_PATH 8 | "${CMAKE_CURRENT_SOURCE_DIR}/../../../../translations/statusarea/storage" 9 | ) 10 | -------------------------------------------------------------------------------- /src/plugins/statusarea/storage/contents/images/disk.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/plugins/statusarea/storage/contents/images/eject.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/plugins/statusarea/storage/contents/images/harddisk.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/plugins/statusarea/storage/metadata.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Type=X-Liri-Service 3 | Name=Storage 4 | Name[de]=Speicher 5 | Name[lt]=Kaupiklis 6 | Name[nl]=Opslag 7 | Name[pt_BR]=Armazenamento 8 | Name[tr]=Depolama 9 | Comment=Access storage volumes 10 | Comment[de]=Auf Speichervolumen zugreifen 11 | Comment[lt]=Gauti prieigą prie kaupiklio tomų 12 | Comment[nl]=Toegang tot schijven 13 | Comment[pt_BR]=Acessar volumes de armazenamento 14 | Comment[tr]=Depolama birimlerine eriş 15 | Keywords=Storage;Disk; 16 | Keywords[de]=Speicher;Festplatte; 17 | Keywords[lt]=Kaupiklis;Saugykla;Diskas;Atminties įrenginys;Atminties irenginys; 18 | Keywords[nl]=Opslag;Schijf; 19 | Keywords[pt_BR]=Armazenamento;Disco; 20 | Keywords[tr]=Depolama;Biriktirme;Saklama;Disk;Teker; 21 | OnlyShowIn=X-Liri; 22 | X-Liri-ServiceType=StatusAreaExtension 23 | X-Liri-StatusAreaExtension-Script=contents/main.qml 24 | X-Liri-StatusAreaExtension-Order=3 25 | X-Liri-PluginInfo-Name=io.liri.StatusAreaExtensions.Storage 26 | X-Liri-PluginInfo-Category=StatusAreaExtensions 27 | X-Liri-PluginInfo-Author=Pier Luigi Fiorini 28 | X-Liri-PluginInfo-Version=1.0.0 29 | X-Liri-PluginInfo-Website=https://liri.io 30 | X-Liri-PluginInfo-License=GPL-3.0-or-later 31 | X-Liri-PluginInfo-EnabledByDefault=true 32 | -------------------------------------------------------------------------------- /src/plugins/statusarea/storage/metadata.desktop.in: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Type=X-Liri-Service 3 | _Name=Storage 4 | _Comment=Access storage volumes 5 | _Keywords=Storage;Disk; 6 | OnlyShowIn=X-Liri; 7 | X-Liri-ServiceType=StatusAreaExtension 8 | X-Liri-StatusAreaExtension-Script=contents/main.qml 9 | X-Liri-StatusAreaExtension-Order=3 10 | X-Liri-PluginInfo-Name=io.liri.StatusAreaExtensions.Storage 11 | X-Liri-PluginInfo-Category=StatusAreaExtensions 12 | X-Liri-PluginInfo-Author=Pier Luigi Fiorini 13 | X-Liri-PluginInfo-Version=1.0.0 14 | X-Liri-PluginInfo-Website=https://liri.io 15 | X-Liri-PluginInfo-License=GPL-3.0-or-later 16 | X-Liri-PluginInfo-EnabledByDefault=true 17 | -------------------------------------------------------------------------------- /src/plugins/statusarea/user/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | liri_add_statusareaextension(User 2 | QML_FILES 3 | contents/main.qml 4 | TRANSLATIONS_PATH 5 | "${CMAKE_CURRENT_SOURCE_DIR}/../../../../translations/statusarea/user" 6 | ) 7 | -------------------------------------------------------------------------------- /src/plugins/statusarea/user/contents/main.qml: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2021 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | import QtQuick 6 | import Fluid.Controls as FluidControls 7 | import QtAccountsService as Accounts 8 | import Liri.Shell as Shell 9 | 10 | Shell.StatusAreaExtension { 11 | Accounts.UserAccount { 12 | id: currentUser 13 | } 14 | 15 | indicator: Shell.Indicator { 16 | title: currentUser.displayName 17 | 18 | FluidControls.CircleImage { 19 | anchors.centerIn: parent 20 | source: "file://" + currentUser.iconFileName 21 | width: iconSize 22 | height: iconSize 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/plugins/statusarea/user/metadata.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Type=X-Liri-Service 3 | Name=User 4 | Name[de]=Benutzer 5 | Name[lt]=Naudotojas 6 | Name[nl]=Gebruiker 7 | Name[pt_BR]=Usuário 8 | Name[tr]=Kullanıcı 9 | Comment=Current user picture 10 | Comment[de]=Aktuelles Benutzerbild 11 | Comment[lt]=Dabartinio naudotojo paveikslas 12 | Comment[nl]=Huidige gebruikersfoto 13 | Comment[pt_BR]=Imagem atual do usuário 14 | Comment[tr]=Geçerli kullanıcı resmi 15 | Keywords=User; 16 | Keywords[de]=Benutzer; 17 | Keywords[lt]=Naudotojas;naudotojai; 18 | Keywords[nl]=Gebruiker; 19 | Keywords[pt_BR]=Usuário; 20 | Keywords[tr]=Kullanıcı; 21 | OnlyShowIn=X-Liri; 22 | X-Liri-ServiceType=StatusAreaExtension 23 | X-Liri-StatusAreaExtension-Script=contents/main.qml 24 | X-Liri-StatusAreaExtension-Order=0 25 | X-Liri-PluginInfo-Name=io.liri.StatusAreaExtensions.User 26 | X-Liri-PluginInfo-Category=StatusAreaExtensions 27 | X-Liri-PluginInfo-Author=Pier Luigi Fiorini 28 | X-Liri-PluginInfo-Version=1.0.0 29 | X-Liri-PluginInfo-Website=https://liri.io 30 | X-Liri-PluginInfo-License=GPL-3.0-or-later 31 | X-Liri-PluginInfo-EnabledByDefault=true 32 | -------------------------------------------------------------------------------- /src/plugins/statusarea/user/metadata.desktop.in: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Type=X-Liri-Service 3 | _Name=User 4 | _Comment=Current user picture 5 | _Keywords=User; 6 | OnlyShowIn=X-Liri; 7 | X-Liri-ServiceType=StatusAreaExtension 8 | X-Liri-StatusAreaExtension-Script=contents/main.qml 9 | X-Liri-StatusAreaExtension-Order=0 10 | X-Liri-PluginInfo-Name=io.liri.StatusAreaExtensions.User 11 | X-Liri-PluginInfo-Category=StatusAreaExtensions 12 | X-Liri-PluginInfo-Author=Pier Luigi Fiorini 13 | X-Liri-PluginInfo-Version=1.0.0 14 | X-Liri-PluginInfo-Website=https://liri.io 15 | X-Liri-PluginInfo-License=GPL-3.0-or-later 16 | X-Liri-PluginInfo-EnabledByDefault=true 17 | -------------------------------------------------------------------------------- /src/sddm/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/" 2 | DESTINATION "${KDE_INSTALL_DATADIR}/sddm/themes/liri/" 3 | PATTERN "CMakeLists.txt" EXCLUDE) 4 | -------------------------------------------------------------------------------- /src/sddm/DesktopStill.qml: -------------------------------------------------------------------------------- 1 | /**************************************************************************** 2 | * This file is part of Liri. 3 | * 4 | * Copyright (C) 2014-2016 Pier Luigi Fiorini 5 | * 6 | * Author(s): 7 | * Pier Luigi Fiorini 8 | * 9 | * $BEGIN_LICENSE:GPL3+$ 10 | * 11 | * This program is free software: you can redistribute it and/or modify 12 | * it under the terms of the GNU General Public License as published by 13 | * the Free Software Foundation, either version 3 of the License, or 14 | * (at your option) any later version. 15 | * 16 | * This program is distributed in the hope that it will be useful, 17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19 | * GNU General Public License for more details. 20 | * 21 | * You should have received a copy of the GNU General Public License 22 | * along with this program. If not, see . 23 | * 24 | * $END_LICENSE$ 25 | ***************************************************************************/ 26 | 27 | import QtQuick 28 | import QtQuick.Controls.Material 29 | 30 | Rectangle { 31 | // TODO: We would show the last screenshot of the desktop, or 32 | // at least the user wallpaper if there wasn't a problem with 33 | // permissions 34 | color: Material.color(Material.Blue, Material.Shade800) 35 | } 36 | -------------------------------------------------------------------------------- /src/sddm/components/Indicator.qml: -------------------------------------------------------------------------------- 1 | /**************************************************************************** 2 | * This file is part of Liri. 3 | * 4 | * Copyright (C) 2014-2016 Pier Luigi Fiorini 5 | * 6 | * Author(s): 7 | * Pier Luigi Fiorini 8 | * 9 | * $BEGIN_LICENSE:GPL3+$ 10 | * 11 | * This program is free software: you can redistribute it and/or modify 12 | * it under the terms of the GNU General Public License as published by 13 | * the Free Software Foundation, either version 3 of the License, or 14 | * (at your option) any later version. 15 | * 16 | * This program is distributed in the hope that it will be useful, 17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19 | * GNU General Public License for more details. 20 | * 21 | * You should have received a copy of the GNU General Public License 22 | * along with this program. If not, see . 23 | * 24 | * $END_LICENSE$ 25 | ***************************************************************************/ 26 | 27 | import QtQuick 28 | import QtQuick.Controls 29 | 30 | MouseArea { 31 | hoverEnabled: true 32 | 33 | ToolTip.visible: containsMouse 34 | } 35 | -------------------------------------------------------------------------------- /src/sddm/components/VirtualKeyboard.qml: -------------------------------------------------------------------------------- 1 | /**************************************************************************** 2 | * This file is part of Liri. 3 | * 4 | * Copyright (C) 2018 Pier Luigi Fiorini 5 | * 6 | * $BEGIN_LICENSE:GPL3+$ 7 | * 8 | * This program is free software: you can redistribute it and/or modify 9 | * it under the terms of the GNU General Public License as published by 10 | * the Free Software Foundation, either version 3 of the License, or 11 | * (at your option) any later version. 12 | * 13 | * This program is distributed in the hope that it will be useful, 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | * GNU General Public License for more details. 17 | * 18 | * You should have received a copy of the GNU General Public License 19 | * along with this program. If not, see . 20 | * 21 | * $END_LICENSE$ 22 | ***************************************************************************/ 23 | 24 | import QtQuick 25 | import QtQuick.VirtualKeyboard 26 | 27 | InputPanel { 28 | property bool activated: false 29 | 30 | width: parent.width 31 | active: activated && Qt.inputMethod.visible 32 | visible: active 33 | } 34 | -------------------------------------------------------------------------------- /src/sddm/dummydata/keyboard.qml: -------------------------------------------------------------------------------- 1 | import QtQuick 2 | 3 | Item { 4 | property bool numLock: true 5 | property bool capsLock: false 6 | property var currentLayout: 0 7 | property var layouts: [ 8 | {"shortName": "it", "longName": "Italiano"}, 9 | {"shortName": "en", "longName": "English (US)"} 10 | ] 11 | property bool enabled: true 12 | } 13 | -------------------------------------------------------------------------------- /src/sddm/dummydata/screenModel.qml: -------------------------------------------------------------------------------- 1 | import QtQuick 2 | 3 | Item { 4 | function geometry(primary) { 5 | return Qt.rect(0, 0, 1366, 768); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/sddm/dummydata/sddm.qml: -------------------------------------------------------------------------------- 1 | import QtQuick 2 | 3 | QtObject { 4 | property bool canPowerOff: true 5 | property bool canReboot: true 6 | property bool canSuspend: true 7 | property bool canHibernate: true 8 | property bool canHybridSleep: true 9 | property string hostname: "MyHostname" 10 | 11 | signal loginFailed() 12 | signal loginSucceeded() 13 | 14 | function powerOff() { 15 | console.log("SDDM - POWERING OFF"); 16 | } 17 | function reboot() { 18 | console.log("SDDM - REBOOTING"); 19 | } 20 | function suspend() { 21 | console.log("SDDM - SUSPEND"); 22 | } 23 | function hibernate() { 24 | console.log("SDDM - HIBERNATE"); 25 | } 26 | function hybridSleep() { 27 | console.log("SDDM - HYBRID SLEEP"); 28 | } 29 | 30 | function login(user, password, sessionIndex) { 31 | console.log("SDDM - logging into session index " + sessionIndex + " as [" + user + "] [" + password + "]"); 32 | 33 | // Login 34 | if (user == "plfiorini" && password == "password") 35 | loginSucceeded(); 36 | else 37 | loginFailed(); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/sddm/dummydata/sessionModel.qml: -------------------------------------------------------------------------------- 1 | import QtQuick 2 | 3 | ListModel { 4 | property int lastIndex: 0 5 | 6 | ListElement { name: "Liri" } 7 | ListElement { name: "GNOME" } 8 | ListElement { name: "Plasma" } 9 | } 10 | -------------------------------------------------------------------------------- /src/sddm/dummydata/tyrion.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lirios/shell/fbc33a4d851b878c391e6f544672005f6aed3b96/src/sddm/dummydata/tyrion.png -------------------------------------------------------------------------------- /src/sddm/dummydata/userModel.qml: -------------------------------------------------------------------------------- 1 | import QtQuick 2 | 3 | ListModel { 4 | id: userModel 5 | 6 | property int lastIndex: 1 7 | 8 | ListElement { 9 | name: "plfiorini" 10 | realName: "Pier Luigi Fiorini" 11 | icon: "/usr/share/pixmaps/faces/grapes.jpg" 12 | homeDir: "/home/plfiorini" 13 | } 14 | ListElement { 15 | name: "ned" 16 | realName: "Eddard Stark" 17 | icon: "/home/ned/.face.icon" 18 | homeDir: "/home/ned" 19 | } 20 | ListElement { 21 | name: "kinginthenorth" 22 | realName: "Robb Stark" 23 | icon: "" 24 | homeDir: "" 25 | } 26 | ListElement { 27 | name: "jon" 28 | realName: "Jon Snow" 29 | icon: "" 30 | homeDir:"" 31 | } 32 | ListElement { 33 | name: "imp" 34 | realName: "Tyrion Lannister" 35 | icon: "" 36 | homeDir: "" 37 | } 38 | 39 | Component.onCompleted: { 40 | for (var i = 0; i < userModel.count; i++) { 41 | if (userModel.get(i).name == "imp") { 42 | userModel.get(i).icon = Qt.resolvedUrl("tyrion.png") 43 | break 44 | } 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/sddm/images/hibernate.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/sddm/images/keyboard-variant.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/sddm/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lirios/shell/fbc33a4d851b878c391e6f544672005f6aed3b96/src/sddm/images/logo.png -------------------------------------------------------------------------------- /src/sddm/images/logout.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/sddm/images/reload.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/sddm/images/sleep.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/sddm/indicators/VirtualKeyboard.qml: -------------------------------------------------------------------------------- 1 | /**************************************************************************** 2 | * This file is part of Liri. 3 | * 4 | * Copyright (C) 2018 Pier Luigi Fiorini 5 | * 6 | * $BEGIN_LICENSE:GPL3+$ 7 | * 8 | * This program is free software: you can redistribute it and/or modify 9 | * it under the terms of the GNU General Public License as published by 10 | * the Free Software Foundation, either version 3 of the License, or 11 | * (at your option) any later version. 12 | * 13 | * This program is distributed in the hope that it will be useful, 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | * GNU General Public License for more details. 17 | * 18 | * You should have received a copy of the GNU General Public License 19 | * along with this program. If not, see . 20 | * 21 | * $END_LICENSE$ 22 | ***************************************************************************/ 23 | 24 | import QtQuick 25 | import QtQuick.Controls 26 | import Fluid.Controls as FluidControls 27 | import Liri.Shell as LiriShell 28 | 29 | LiriShell.Indicator { 30 | iconSource: FluidControls.Utils.iconUrl("hardware/keyboard") 31 | active: inputPanel.keyboardActive 32 | visible: inputPanel.keyboardAvailable 33 | onClicked: inputPanel.toggle() 34 | 35 | //: Virtual keyboard indicator tooltip 36 | //~ Indicator to change keyboard layout 37 | tooltip: qsTr("Toggle virtual keyboard") 38 | 39 | //: Virtual keyboard indicator accessibility name 40 | //~ Indicator to change keyboard layout 41 | Accessible.name: qsTr("Virtual keyboard") 42 | } 43 | -------------------------------------------------------------------------------- /src/sddm/metadata.desktop: -------------------------------------------------------------------------------- 1 | [SddmGreeterTheme] 2 | Type=sddm-theme 3 | Name=Liri OS 4 | Description=Official theme for Liri OS 5 | Author=Pier Luigi Fiorini 6 | Email=pierluigi.fiorini@gmail.com 7 | Copyright=(C) 2014-2016 Pier Luigi Fiorini 8 | License=GPLv3 9 | Version=0.1 10 | Website=http://liri.io 11 | Screenshot=screenshot.png 12 | ConfigFile=theme.conf 13 | MainScript=Main.qml 14 | TranslationsDirectory=translations 15 | Theme-Id=lirios 16 | Theme-API=2.0 17 | -------------------------------------------------------------------------------- /src/sddm/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lirios/shell/fbc33a4d851b878c391e6f544672005f6aed3b96/src/sddm/screenshot.png -------------------------------------------------------------------------------- /src/sddm/theme.conf: -------------------------------------------------------------------------------- 1 | [General] 2 | iconTheme=Paper 3 | cursorTheme=Paper 4 | platformTheme=liri 5 | style=Material 6 | -------------------------------------------------------------------------------- /tools/dropshadow/README.md: -------------------------------------------------------------------------------- 1 | Drop Shadow 2 | =========== 3 | 4 | These are a couple of simple QML files that make a dropshadow with 5 | 8dp elevation and 24dp elevation. 6 | 7 | Run each QML file with the `qml` command and make a screenshot of it. 8 | Then open the screenshot with an image editor and cut the purple part. 9 | Save the resulting image into `src/compositor/images/chrome`. 10 | -------------------------------------------------------------------------------- /tools/dropshadow/dropshadow-24.qml: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2021 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | import QtQuick 6 | import QtQuick.Controls 7 | import Fluid.Effects as FluidEffects 8 | 9 | ApplicationWindow { 10 | width: 150 11 | height: 150 12 | color: "transparent" 13 | flags: Qt.Window | Qt.FramelessWindowHint 14 | visible: true 15 | 16 | Rectangle { 17 | anchors.centerIn: parent 18 | width: parent.width / 3 19 | height: parent.height / 3 20 | color: "purple" 21 | radius: 4 22 | 23 | Rectangle { 24 | anchors.fill: parent 25 | color: "purple" 26 | } 27 | 28 | layer.enabled: true 29 | layer.effect: FluidEffects.Elevation { 30 | elevation: 24 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /tools/dropshadow/dropshadow-8.qml: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2021 Pier Luigi Fiorini 2 | // 3 | // SPDX-License-Identifier: GPL-3.0-or-later 4 | 5 | import QtQuick 6 | import QtQuick.Controls 7 | import Fluid.Effects as FluidEffects 8 | 9 | ApplicationWindow { 10 | width: 150 11 | height: 150 12 | color: "transparent" 13 | flags: Qt.Window | Qt.FramelessWindowHint 14 | visible: true 15 | 16 | Rectangle { 17 | anchors.centerIn: parent 18 | width: parent.width / 3 19 | height: parent.height / 3 20 | color: "purple" 21 | radius: 4 22 | 23 | Rectangle { 24 | anchors.fill: parent 25 | color: "purple" 26 | } 27 | 28 | layer.enabled: true 29 | layer.effect: FluidEffects.Elevation { 30 | elevation: 8 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /translations/statusarea/datetime/datetime.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /translations/statusarea/datetime/de.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | # Translators: 7 | # Ettore Atalan , 2021 8 | # 9 | #, fuzzy 10 | msgid "" 11 | msgstr "" 12 | "Project-Id-Version: PACKAGE VERSION\n" 13 | "Report-Msgid-Bugs-To: \n" 14 | "PO-Revision-Date: 2021-01-03 09:25+0000\n" 15 | "Last-Translator: Ettore Atalan , 2021\n" 16 | "Language-Team: German (https://app.transifex.com/lirios/teams/71982/de/)\n" 17 | "MIME-Version: 1.0\n" 18 | "Content-Type: text/plain; charset=UTF-8\n" 19 | "Content-Transfer-Encoding: 8bit\n" 20 | "Language: de\n" 21 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 22 | 23 | #. (desktop-to-pot) "Name" entry 24 | #: metadata.desktop.in:3 25 | msgctxt "Name entry" 26 | msgid "Date and time" 27 | msgstr "Datum und Uhrzeit" 28 | 29 | #. (desktop-to-pot) "Comment" entry 30 | #: metadata.desktop.in:4 31 | msgctxt "Comment entry" 32 | msgid "Current date and time" 33 | msgstr "Aktuelles Datum und Uhrzeit" 34 | 35 | #. (desktop-to-pot) "Keywords" entry 36 | #: metadata.desktop.in:5 37 | msgctxt "Keywords entry" 38 | msgid "Date;Time;" 39 | msgstr "Datum;Zeit;" 40 | -------------------------------------------------------------------------------- /translations/statusarea/datetime/lt.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | # Translators: 7 | # Moo, 2021 8 | # 9 | #, fuzzy 10 | msgid "" 11 | msgstr "" 12 | "Project-Id-Version: PACKAGE VERSION\n" 13 | "Report-Msgid-Bugs-To: \n" 14 | "PO-Revision-Date: 2021-01-03 09:25+0000\n" 15 | "Last-Translator: Moo, 2021\n" 16 | "Language-Team: Lithuanian (https://app.transifex.com/lirios/teams/71982/lt/)\n" 17 | "MIME-Version: 1.0\n" 18 | "Content-Type: text/plain; charset=UTF-8\n" 19 | "Content-Transfer-Encoding: 8bit\n" 20 | "Language: lt\n" 21 | "Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);\n" 22 | 23 | #. (desktop-to-pot) "Name" entry 24 | #: metadata.desktop.in:3 25 | msgctxt "Name entry" 26 | msgid "Date and time" 27 | msgstr "Data ir laikas" 28 | 29 | #. (desktop-to-pot) "Comment" entry 30 | #: metadata.desktop.in:4 31 | msgctxt "Comment entry" 32 | msgid "Current date and time" 33 | msgstr "Dabartinė data ir laikas" 34 | 35 | #. (desktop-to-pot) "Keywords" entry 36 | #: metadata.desktop.in:5 37 | msgctxt "Keywords entry" 38 | msgid "Date;Time;" 39 | msgstr "Data;Laikas;" 40 | -------------------------------------------------------------------------------- /translations/statusarea/datetime/metadata.pot: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | #, fuzzy 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: PACKAGE VERSION\n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 12 | "Last-Translator: FULL NAME \n" 13 | "Language-Team: LANGUAGE \n" 14 | "Language: \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | 19 | #. (desktop-to-pot) "Name" entry 20 | #: metadata.desktop.in:3 21 | msgctxt "Name entry" 22 | msgid "Date and time" 23 | msgstr "" 24 | 25 | #. (desktop-to-pot) "Comment" entry 26 | #: metadata.desktop.in:4 27 | msgctxt "Comment entry" 28 | msgid "Current date and time" 29 | msgstr "" 30 | 31 | #. (desktop-to-pot) "Keywords" entry 32 | #: metadata.desktop.in:5 33 | msgctxt "Keywords entry" 34 | msgid "Date;Time;" 35 | msgstr "" 36 | -------------------------------------------------------------------------------- /translations/statusarea/datetime/nl.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | # Translators: 7 | # Heimen Stoffels , 2022 8 | # 9 | #, fuzzy 10 | msgid "" 11 | msgstr "" 12 | "Project-Id-Version: PACKAGE VERSION\n" 13 | "Report-Msgid-Bugs-To: \n" 14 | "PO-Revision-Date: 2021-01-03 09:25+0000\n" 15 | "Last-Translator: Heimen Stoffels , 2022\n" 16 | "Language-Team: Dutch (https://app.transifex.com/lirios/teams/71982/nl/)\n" 17 | "MIME-Version: 1.0\n" 18 | "Content-Type: text/plain; charset=UTF-8\n" 19 | "Content-Transfer-Encoding: 8bit\n" 20 | "Language: nl\n" 21 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 22 | 23 | #. (desktop-to-pot) "Name" entry 24 | #: metadata.desktop.in:3 25 | msgctxt "Name entry" 26 | msgid "Date and time" 27 | msgstr "Datum en tijd" 28 | 29 | #. (desktop-to-pot) "Comment" entry 30 | #: metadata.desktop.in:4 31 | msgctxt "Comment entry" 32 | msgid "Current date and time" 33 | msgstr "Huidige datum en tijd" 34 | 35 | #. (desktop-to-pot) "Keywords" entry 36 | #: metadata.desktop.in:5 37 | msgctxt "Keywords entry" 38 | msgid "Date;Time;" 39 | msgstr "Datum;Tijd;" 40 | -------------------------------------------------------------------------------- /translations/statusarea/datetime/pt_BR.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | # Translators: 7 | # Luiz Fernando Ranghetti , 2021 8 | # 9 | #, fuzzy 10 | msgid "" 11 | msgstr "" 12 | "Project-Id-Version: PACKAGE VERSION\n" 13 | "Report-Msgid-Bugs-To: \n" 14 | "PO-Revision-Date: 2021-01-03 09:25+0000\n" 15 | "Last-Translator: Luiz Fernando Ranghetti , 2021\n" 16 | "Language-Team: Portuguese (Brazil) (https://app.transifex.com/lirios/teams/71982/pt_BR/)\n" 17 | "MIME-Version: 1.0\n" 18 | "Content-Type: text/plain; charset=UTF-8\n" 19 | "Content-Transfer-Encoding: 8bit\n" 20 | "Language: pt_BR\n" 21 | "Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" 22 | 23 | #. (desktop-to-pot) "Name" entry 24 | #: metadata.desktop.in:3 25 | msgctxt "Name entry" 26 | msgid "Date and time" 27 | msgstr "Data e hora" 28 | 29 | #. (desktop-to-pot) "Comment" entry 30 | #: metadata.desktop.in:4 31 | msgctxt "Comment entry" 32 | msgid "Current date and time" 33 | msgstr "Data e hora atual" 34 | 35 | #. (desktop-to-pot) "Keywords" entry 36 | #: metadata.desktop.in:5 37 | msgctxt "Keywords entry" 38 | msgid "Date;Time;" 39 | msgstr "Data;Hora;" 40 | -------------------------------------------------------------------------------- /translations/statusarea/datetime/tr.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | # Translators: 7 | # Emin Tufan Çetin , 2021 8 | # 9 | #, fuzzy 10 | msgid "" 11 | msgstr "" 12 | "Project-Id-Version: PACKAGE VERSION\n" 13 | "Report-Msgid-Bugs-To: \n" 14 | "PO-Revision-Date: 2021-01-03 09:25+0000\n" 15 | "Last-Translator: Emin Tufan Çetin , 2021\n" 16 | "Language-Team: Turkish (https://app.transifex.com/lirios/teams/71982/tr/)\n" 17 | "MIME-Version: 1.0\n" 18 | "Content-Type: text/plain; charset=UTF-8\n" 19 | "Content-Transfer-Encoding: 8bit\n" 20 | "Language: tr\n" 21 | "Plural-Forms: nplurals=2; plural=(n > 1);\n" 22 | 23 | #. (desktop-to-pot) "Name" entry 24 | #: metadata.desktop.in:3 25 | msgctxt "Name entry" 26 | msgid "Date and time" 27 | msgstr "Tarih ve saat" 28 | 29 | #. (desktop-to-pot) "Comment" entry 30 | #: metadata.desktop.in:4 31 | msgctxt "Comment entry" 32 | msgid "Current date and time" 33 | msgstr "Geçerli tarih ve saat" 34 | 35 | #. (desktop-to-pot) "Keywords" entry 36 | #: metadata.desktop.in:5 37 | msgctxt "Keywords entry" 38 | msgid "Date;Time;" 39 | msgstr "Tarih;Saat;" 40 | -------------------------------------------------------------------------------- /translations/statusarea/notifications/de.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | # Translators: 7 | # Ettore Atalan , 2021 8 | # 9 | #, fuzzy 10 | msgid "" 11 | msgstr "" 12 | "Project-Id-Version: PACKAGE VERSION\n" 13 | "Report-Msgid-Bugs-To: \n" 14 | "PO-Revision-Date: 2021-01-03 09:25+0000\n" 15 | "Last-Translator: Ettore Atalan , 2021\n" 16 | "Language-Team: German (https://app.transifex.com/lirios/teams/71982/de/)\n" 17 | "MIME-Version: 1.0\n" 18 | "Content-Type: text/plain; charset=UTF-8\n" 19 | "Content-Transfer-Encoding: 8bit\n" 20 | "Language: de\n" 21 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 22 | 23 | #. (desktop-to-pot) "Name" entry 24 | #: metadata.desktop.in:3 25 | msgctxt "Name entry" 26 | msgid "Notifications" 27 | msgstr "Benachrichtigungen" 28 | 29 | #. (desktop-to-pot) "Comment" entry 30 | #: metadata.desktop.in:4 31 | msgctxt "Comment entry" 32 | msgid "Show notifications" 33 | msgstr "Benachrichtigungen anzeigen" 34 | 35 | #. (desktop-to-pot) "Keywords" entry 36 | #: metadata.desktop.in:5 37 | msgctxt "Keywords entry" 38 | msgid "Notifications;" 39 | msgstr "Benachrichtigungen;" 40 | -------------------------------------------------------------------------------- /translations/statusarea/notifications/lt.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | # Translators: 7 | # Moo, 2021 8 | # 9 | #, fuzzy 10 | msgid "" 11 | msgstr "" 12 | "Project-Id-Version: PACKAGE VERSION\n" 13 | "Report-Msgid-Bugs-To: \n" 14 | "PO-Revision-Date: 2021-01-03 09:25+0000\n" 15 | "Last-Translator: Moo, 2021\n" 16 | "Language-Team: Lithuanian (https://app.transifex.com/lirios/teams/71982/lt/)\n" 17 | "MIME-Version: 1.0\n" 18 | "Content-Type: text/plain; charset=UTF-8\n" 19 | "Content-Transfer-Encoding: 8bit\n" 20 | "Language: lt\n" 21 | "Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);\n" 22 | 23 | #. (desktop-to-pot) "Name" entry 24 | #: metadata.desktop.in:3 25 | msgctxt "Name entry" 26 | msgid "Notifications" 27 | msgstr "Pranešimai" 28 | 29 | #. (desktop-to-pot) "Comment" entry 30 | #: metadata.desktop.in:4 31 | msgctxt "Comment entry" 32 | msgid "Show notifications" 33 | msgstr "Rodyti pranešimus" 34 | 35 | #. (desktop-to-pot) "Keywords" entry 36 | #: metadata.desktop.in:5 37 | msgctxt "Keywords entry" 38 | msgid "Notifications;" 39 | msgstr "Pranešimai;" 40 | -------------------------------------------------------------------------------- /translations/statusarea/notifications/metadata.pot: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | #, fuzzy 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: PACKAGE VERSION\n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 12 | "Last-Translator: FULL NAME \n" 13 | "Language-Team: LANGUAGE \n" 14 | "Language: \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | 19 | #. (desktop-to-pot) "Name" entry 20 | #: metadata.desktop.in:3 21 | msgctxt "Name entry" 22 | msgid "Notifications" 23 | msgstr "" 24 | 25 | #. (desktop-to-pot) "Comment" entry 26 | #: metadata.desktop.in:4 27 | msgctxt "Comment entry" 28 | msgid "Show notifications" 29 | msgstr "" 30 | 31 | #. (desktop-to-pot) "Keywords" entry 32 | #: metadata.desktop.in:5 33 | msgctxt "Keywords entry" 34 | msgid "Notifications;" 35 | msgstr "" 36 | -------------------------------------------------------------------------------- /translations/statusarea/notifications/nl.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | # Translators: 7 | # Heimen Stoffels , 2022 8 | # 9 | #, fuzzy 10 | msgid "" 11 | msgstr "" 12 | "Project-Id-Version: PACKAGE VERSION\n" 13 | "Report-Msgid-Bugs-To: \n" 14 | "PO-Revision-Date: 2021-01-03 09:25+0000\n" 15 | "Last-Translator: Heimen Stoffels , 2022\n" 16 | "Language-Team: Dutch (https://app.transifex.com/lirios/teams/71982/nl/)\n" 17 | "MIME-Version: 1.0\n" 18 | "Content-Type: text/plain; charset=UTF-8\n" 19 | "Content-Transfer-Encoding: 8bit\n" 20 | "Language: nl\n" 21 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 22 | 23 | #. (desktop-to-pot) "Name" entry 24 | #: metadata.desktop.in:3 25 | msgctxt "Name entry" 26 | msgid "Notifications" 27 | msgstr "Meldingen" 28 | 29 | #. (desktop-to-pot) "Comment" entry 30 | #: metadata.desktop.in:4 31 | msgctxt "Comment entry" 32 | msgid "Show notifications" 33 | msgstr "Meldingen tonen" 34 | 35 | #. (desktop-to-pot) "Keywords" entry 36 | #: metadata.desktop.in:5 37 | msgctxt "Keywords entry" 38 | msgid "Notifications;" 39 | msgstr "Meldingen;" 40 | -------------------------------------------------------------------------------- /translations/statusarea/notifications/notifications.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | main 6 | 7 | 8 | 9 | 10 | Notifications 11 | 12 | 13 | 14 | 15 | No notifications 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /translations/statusarea/notifications/notifications_de.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | main 4 | 5 | 6 | 7 | 8 | Notifications 9 | Benachrichtigungen 10 | 11 | 12 | 13 | No notifications 14 | Keine Benachrichtigungen 15 | 16 | 17 | -------------------------------------------------------------------------------- /translations/statusarea/notifications/notifications_lt.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | main 4 | 5 | 6 | 7 | 8 | Notifications 9 | Pranešimai 10 | 11 | 12 | 13 | No notifications 14 | Nėra pranešimų 15 | 16 | 17 | -------------------------------------------------------------------------------- /translations/statusarea/notifications/notifications_nl.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | main 4 | 5 | 6 | 7 | 8 | Notifications 9 | Meldingen 10 | 11 | 12 | 13 | No notifications 14 | Geen meldingen 15 | 16 | 17 | -------------------------------------------------------------------------------- /translations/statusarea/notifications/notifications_pt_BR.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | main 4 | 5 | 6 | 7 | 8 | Notifications 9 | Notificações 10 | 11 | 12 | 13 | No notifications 14 | Nenhuma notificação 15 | 16 | 17 | -------------------------------------------------------------------------------- /translations/statusarea/notifications/notifications_tr.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | main 4 | 5 | 6 | 7 | 8 | Notifications 9 | Bildirimler 10 | 11 | 12 | 13 | No notifications 14 | Bildirim yok 15 | 16 | 17 | -------------------------------------------------------------------------------- /translations/statusarea/notifications/pt_BR.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | # Translators: 7 | # Luiz Fernando Ranghetti , 2021 8 | # 9 | #, fuzzy 10 | msgid "" 11 | msgstr "" 12 | "Project-Id-Version: PACKAGE VERSION\n" 13 | "Report-Msgid-Bugs-To: \n" 14 | "PO-Revision-Date: 2021-01-03 09:25+0000\n" 15 | "Last-Translator: Luiz Fernando Ranghetti , 2021\n" 16 | "Language-Team: Portuguese (Brazil) (https://app.transifex.com/lirios/teams/71982/pt_BR/)\n" 17 | "MIME-Version: 1.0\n" 18 | "Content-Type: text/plain; charset=UTF-8\n" 19 | "Content-Transfer-Encoding: 8bit\n" 20 | "Language: pt_BR\n" 21 | "Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" 22 | 23 | #. (desktop-to-pot) "Name" entry 24 | #: metadata.desktop.in:3 25 | msgctxt "Name entry" 26 | msgid "Notifications" 27 | msgstr "Notificações" 28 | 29 | #. (desktop-to-pot) "Comment" entry 30 | #: metadata.desktop.in:4 31 | msgctxt "Comment entry" 32 | msgid "Show notifications" 33 | msgstr "Exibir notificações" 34 | 35 | #. (desktop-to-pot) "Keywords" entry 36 | #: metadata.desktop.in:5 37 | msgctxt "Keywords entry" 38 | msgid "Notifications;" 39 | msgstr "Notificações;" 40 | -------------------------------------------------------------------------------- /translations/statusarea/notifications/tr.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | # Translators: 7 | # Emin Tufan Çetin , 2021 8 | # 9 | #, fuzzy 10 | msgid "" 11 | msgstr "" 12 | "Project-Id-Version: PACKAGE VERSION\n" 13 | "Report-Msgid-Bugs-To: \n" 14 | "PO-Revision-Date: 2021-01-03 09:25+0000\n" 15 | "Last-Translator: Emin Tufan Çetin , 2021\n" 16 | "Language-Team: Turkish (https://app.transifex.com/lirios/teams/71982/tr/)\n" 17 | "MIME-Version: 1.0\n" 18 | "Content-Type: text/plain; charset=UTF-8\n" 19 | "Content-Transfer-Encoding: 8bit\n" 20 | "Language: tr\n" 21 | "Plural-Forms: nplurals=2; plural=(n > 1);\n" 22 | 23 | #. (desktop-to-pot) "Name" entry 24 | #: metadata.desktop.in:3 25 | msgctxt "Name entry" 26 | msgid "Notifications" 27 | msgstr "Bildirimler" 28 | 29 | #. (desktop-to-pot) "Comment" entry 30 | #: metadata.desktop.in:4 31 | msgctxt "Comment entry" 32 | msgid "Show notifications" 33 | msgstr "Bildirimleri göster" 34 | 35 | #. (desktop-to-pot) "Keywords" entry 36 | #: metadata.desktop.in:5 37 | msgctxt "Keywords entry" 38 | msgid "Notifications;" 39 | msgstr "Bildirimler;" 40 | -------------------------------------------------------------------------------- /translations/statusarea/storage/de.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | # Translators: 7 | # Ettore Atalan , 2021 8 | # 9 | #, fuzzy 10 | msgid "" 11 | msgstr "" 12 | "Project-Id-Version: PACKAGE VERSION\n" 13 | "Report-Msgid-Bugs-To: \n" 14 | "PO-Revision-Date: 2021-01-03 09:25+0000\n" 15 | "Last-Translator: Ettore Atalan , 2021\n" 16 | "Language-Team: German (https://app.transifex.com/lirios/teams/71982/de/)\n" 17 | "MIME-Version: 1.0\n" 18 | "Content-Type: text/plain; charset=UTF-8\n" 19 | "Content-Transfer-Encoding: 8bit\n" 20 | "Language: de\n" 21 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 22 | 23 | #. (desktop-to-pot) "Name" entry 24 | #: metadata.desktop.in:3 25 | msgctxt "Name entry" 26 | msgid "Storage" 27 | msgstr "Speicher" 28 | 29 | #. (desktop-to-pot) "Comment" entry 30 | #: metadata.desktop.in:4 31 | msgctxt "Comment entry" 32 | msgid "Access storage volumes" 33 | msgstr "Auf Speichervolumen zugreifen" 34 | 35 | #. (desktop-to-pot) "Keywords" entry 36 | #: metadata.desktop.in:5 37 | msgctxt "Keywords entry" 38 | msgid "Storage;Disk;" 39 | msgstr "Speicher;Festplatte;" 40 | -------------------------------------------------------------------------------- /translations/statusarea/storage/lt.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | # Translators: 7 | # Moo, 2021 8 | # 9 | #, fuzzy 10 | msgid "" 11 | msgstr "" 12 | "Project-Id-Version: PACKAGE VERSION\n" 13 | "Report-Msgid-Bugs-To: \n" 14 | "PO-Revision-Date: 2021-01-03 09:25+0000\n" 15 | "Last-Translator: Moo, 2021\n" 16 | "Language-Team: Lithuanian (https://app.transifex.com/lirios/teams/71982/lt/)\n" 17 | "MIME-Version: 1.0\n" 18 | "Content-Type: text/plain; charset=UTF-8\n" 19 | "Content-Transfer-Encoding: 8bit\n" 20 | "Language: lt\n" 21 | "Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);\n" 22 | 23 | #. (desktop-to-pot) "Name" entry 24 | #: metadata.desktop.in:3 25 | msgctxt "Name entry" 26 | msgid "Storage" 27 | msgstr "Kaupiklis" 28 | 29 | #. (desktop-to-pot) "Comment" entry 30 | #: metadata.desktop.in:4 31 | msgctxt "Comment entry" 32 | msgid "Access storage volumes" 33 | msgstr "Gauti prieigą prie kaupiklio tomų" 34 | 35 | #. (desktop-to-pot) "Keywords" entry 36 | #: metadata.desktop.in:5 37 | msgctxt "Keywords entry" 38 | msgid "Storage;Disk;" 39 | msgstr "Kaupiklis;Saugykla;Diskas;Atminties įrenginys;Atminties irenginys;" 40 | -------------------------------------------------------------------------------- /translations/statusarea/storage/metadata.pot: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | #, fuzzy 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: PACKAGE VERSION\n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 12 | "Last-Translator: FULL NAME \n" 13 | "Language-Team: LANGUAGE \n" 14 | "Language: \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | 19 | #. (desktop-to-pot) "Name" entry 20 | #: metadata.desktop.in:3 21 | msgctxt "Name entry" 22 | msgid "Storage" 23 | msgstr "" 24 | 25 | #. (desktop-to-pot) "Comment" entry 26 | #: metadata.desktop.in:4 27 | msgctxt "Comment entry" 28 | msgid "Access storage volumes" 29 | msgstr "" 30 | 31 | #. (desktop-to-pot) "Keywords" entry 32 | #: metadata.desktop.in:5 33 | msgctxt "Keywords entry" 34 | msgid "Storage;Disk;" 35 | msgstr "" 36 | -------------------------------------------------------------------------------- /translations/statusarea/storage/nl.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | # Translators: 7 | # Heimen Stoffels , 2022 8 | # 9 | #, fuzzy 10 | msgid "" 11 | msgstr "" 12 | "Project-Id-Version: PACKAGE VERSION\n" 13 | "Report-Msgid-Bugs-To: \n" 14 | "PO-Revision-Date: 2021-01-03 09:25+0000\n" 15 | "Last-Translator: Heimen Stoffels , 2022\n" 16 | "Language-Team: Dutch (https://app.transifex.com/lirios/teams/71982/nl/)\n" 17 | "MIME-Version: 1.0\n" 18 | "Content-Type: text/plain; charset=UTF-8\n" 19 | "Content-Transfer-Encoding: 8bit\n" 20 | "Language: nl\n" 21 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 22 | 23 | #. (desktop-to-pot) "Name" entry 24 | #: metadata.desktop.in:3 25 | msgctxt "Name entry" 26 | msgid "Storage" 27 | msgstr "Opslag" 28 | 29 | #. (desktop-to-pot) "Comment" entry 30 | #: metadata.desktop.in:4 31 | msgctxt "Comment entry" 32 | msgid "Access storage volumes" 33 | msgstr "Toegang tot schijven" 34 | 35 | #. (desktop-to-pot) "Keywords" entry 36 | #: metadata.desktop.in:5 37 | msgctxt "Keywords entry" 38 | msgid "Storage;Disk;" 39 | msgstr "Opslag;Schijf;" 40 | -------------------------------------------------------------------------------- /translations/statusarea/storage/pt_BR.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | # Translators: 7 | # Luiz Fernando Ranghetti , 2021 8 | # 9 | #, fuzzy 10 | msgid "" 11 | msgstr "" 12 | "Project-Id-Version: PACKAGE VERSION\n" 13 | "Report-Msgid-Bugs-To: \n" 14 | "PO-Revision-Date: 2021-01-03 09:25+0000\n" 15 | "Last-Translator: Luiz Fernando Ranghetti , 2021\n" 16 | "Language-Team: Portuguese (Brazil) (https://app.transifex.com/lirios/teams/71982/pt_BR/)\n" 17 | "MIME-Version: 1.0\n" 18 | "Content-Type: text/plain; charset=UTF-8\n" 19 | "Content-Transfer-Encoding: 8bit\n" 20 | "Language: pt_BR\n" 21 | "Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" 22 | 23 | #. (desktop-to-pot) "Name" entry 24 | #: metadata.desktop.in:3 25 | msgctxt "Name entry" 26 | msgid "Storage" 27 | msgstr "Armazenamento" 28 | 29 | #. (desktop-to-pot) "Comment" entry 30 | #: metadata.desktop.in:4 31 | msgctxt "Comment entry" 32 | msgid "Access storage volumes" 33 | msgstr "Acessar volumes de armazenamento" 34 | 35 | #. (desktop-to-pot) "Keywords" entry 36 | #: metadata.desktop.in:5 37 | msgctxt "Keywords entry" 38 | msgid "Storage;Disk;" 39 | msgstr "Armazenamento;Disco;" 40 | -------------------------------------------------------------------------------- /translations/statusarea/storage/storage.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | main 6 | 7 | 8 | 9 | 10 | Storage 11 | 12 | 13 | 14 | 15 | Eject 16 | 17 | 18 | 19 | 20 | Mount 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /translations/statusarea/storage/storage_de.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | main 4 | 5 | 6 | 7 | 8 | Storage 9 | Speicher 10 | 11 | 12 | 13 | Eject 14 | Auswerfen 15 | 16 | 17 | 18 | Mount 19 | Einhängen 20 | 21 | 22 | -------------------------------------------------------------------------------- /translations/statusarea/storage/storage_lt.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | main 4 | 5 | 6 | 7 | 8 | Storage 9 | Kaupiklis 10 | 11 | 12 | 13 | Eject 14 | Išstumti 15 | 16 | 17 | 18 | Mount 19 | Prijungti 20 | 21 | 22 | -------------------------------------------------------------------------------- /translations/statusarea/storage/storage_nl.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | main 4 | 5 | 6 | 7 | 8 | Storage 9 | Opslag 10 | 11 | 12 | 13 | Eject 14 | Uitwerpen 15 | 16 | 17 | 18 | Mount 19 | Aankoppelen 20 | 21 | 22 | -------------------------------------------------------------------------------- /translations/statusarea/storage/storage_pt_BR.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | main 4 | 5 | 6 | 7 | 8 | Storage 9 | Armazenamento 10 | 11 | 12 | 13 | Eject 14 | Ejetar 15 | 16 | 17 | 18 | Mount 19 | Montar 20 | 21 | 22 | -------------------------------------------------------------------------------- /translations/statusarea/storage/storage_tr.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | main 4 | 5 | 6 | 7 | 8 | Storage 9 | Depolama 10 | 11 | 12 | 13 | Eject 14 | Ayır 15 | 16 | 17 | 18 | Mount 19 | Bağla 20 | 21 | 22 | -------------------------------------------------------------------------------- /translations/statusarea/storage/tr.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | # Translators: 7 | # Emin Tufan Çetin , 2021 8 | # 9 | #, fuzzy 10 | msgid "" 11 | msgstr "" 12 | "Project-Id-Version: PACKAGE VERSION\n" 13 | "Report-Msgid-Bugs-To: \n" 14 | "PO-Revision-Date: 2021-01-03 09:25+0000\n" 15 | "Last-Translator: Emin Tufan Çetin , 2021\n" 16 | "Language-Team: Turkish (https://app.transifex.com/lirios/teams/71982/tr/)\n" 17 | "MIME-Version: 1.0\n" 18 | "Content-Type: text/plain; charset=UTF-8\n" 19 | "Content-Transfer-Encoding: 8bit\n" 20 | "Language: tr\n" 21 | "Plural-Forms: nplurals=2; plural=(n > 1);\n" 22 | 23 | #. (desktop-to-pot) "Name" entry 24 | #: metadata.desktop.in:3 25 | msgctxt "Name entry" 26 | msgid "Storage" 27 | msgstr "Depolama" 28 | 29 | #. (desktop-to-pot) "Comment" entry 30 | #: metadata.desktop.in:4 31 | msgctxt "Comment entry" 32 | msgid "Access storage volumes" 33 | msgstr "Depolama birimlerine eriş" 34 | 35 | #. (desktop-to-pot) "Keywords" entry 36 | #: metadata.desktop.in:5 37 | msgctxt "Keywords entry" 38 | msgid "Storage;Disk;" 39 | msgstr "Depolama;Biriktirme;Saklama;Disk;Teker;" 40 | -------------------------------------------------------------------------------- /translations/statusarea/user/de.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | # Translators: 7 | # Ettore Atalan , 2021 8 | # 9 | #, fuzzy 10 | msgid "" 11 | msgstr "" 12 | "Project-Id-Version: PACKAGE VERSION\n" 13 | "Report-Msgid-Bugs-To: \n" 14 | "PO-Revision-Date: 2021-01-03 09:25+0000\n" 15 | "Last-Translator: Ettore Atalan , 2021\n" 16 | "Language-Team: German (https://app.transifex.com/lirios/teams/71982/de/)\n" 17 | "MIME-Version: 1.0\n" 18 | "Content-Type: text/plain; charset=UTF-8\n" 19 | "Content-Transfer-Encoding: 8bit\n" 20 | "Language: de\n" 21 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 22 | 23 | #. (desktop-to-pot) "Name" entry 24 | #: metadata.desktop.in:3 25 | msgctxt "Name entry" 26 | msgid "User" 27 | msgstr "Benutzer" 28 | 29 | #. (desktop-to-pot) "Comment" entry 30 | #: metadata.desktop.in:4 31 | msgctxt "Comment entry" 32 | msgid "Current user picture" 33 | msgstr "Aktuelles Benutzerbild" 34 | 35 | #. (desktop-to-pot) "Keywords" entry 36 | #: metadata.desktop.in:5 37 | msgctxt "Keywords entry" 38 | msgid "User;" 39 | msgstr "Benutzer;" 40 | -------------------------------------------------------------------------------- /translations/statusarea/user/lt.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | # Translators: 7 | # Moo, 2021 8 | # 9 | #, fuzzy 10 | msgid "" 11 | msgstr "" 12 | "Project-Id-Version: PACKAGE VERSION\n" 13 | "Report-Msgid-Bugs-To: \n" 14 | "PO-Revision-Date: 2021-01-03 09:25+0000\n" 15 | "Last-Translator: Moo, 2021\n" 16 | "Language-Team: Lithuanian (https://app.transifex.com/lirios/teams/71982/lt/)\n" 17 | "MIME-Version: 1.0\n" 18 | "Content-Type: text/plain; charset=UTF-8\n" 19 | "Content-Transfer-Encoding: 8bit\n" 20 | "Language: lt\n" 21 | "Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);\n" 22 | 23 | #. (desktop-to-pot) "Name" entry 24 | #: metadata.desktop.in:3 25 | msgctxt "Name entry" 26 | msgid "User" 27 | msgstr "Naudotojas" 28 | 29 | #. (desktop-to-pot) "Comment" entry 30 | #: metadata.desktop.in:4 31 | msgctxt "Comment entry" 32 | msgid "Current user picture" 33 | msgstr "Dabartinio naudotojo paveikslas" 34 | 35 | #. (desktop-to-pot) "Keywords" entry 36 | #: metadata.desktop.in:5 37 | msgctxt "Keywords entry" 38 | msgid "User;" 39 | msgstr "Naudotojas;naudotojai;" 40 | -------------------------------------------------------------------------------- /translations/statusarea/user/metadata.pot: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | #, fuzzy 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: PACKAGE VERSION\n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 12 | "Last-Translator: FULL NAME \n" 13 | "Language-Team: LANGUAGE \n" 14 | "Language: \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | 19 | #. (desktop-to-pot) "Name" entry 20 | #: metadata.desktop.in:3 21 | msgctxt "Name entry" 22 | msgid "User" 23 | msgstr "" 24 | 25 | #. (desktop-to-pot) "Comment" entry 26 | #: metadata.desktop.in:4 27 | msgctxt "Comment entry" 28 | msgid "Current user picture" 29 | msgstr "" 30 | 31 | #. (desktop-to-pot) "Keywords" entry 32 | #: metadata.desktop.in:5 33 | msgctxt "Keywords entry" 34 | msgid "User;" 35 | msgstr "" 36 | -------------------------------------------------------------------------------- /translations/statusarea/user/nl.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | # Translators: 7 | # Heimen Stoffels , 2022 8 | # 9 | #, fuzzy 10 | msgid "" 11 | msgstr "" 12 | "Project-Id-Version: PACKAGE VERSION\n" 13 | "Report-Msgid-Bugs-To: \n" 14 | "PO-Revision-Date: 2021-01-03 09:25+0000\n" 15 | "Last-Translator: Heimen Stoffels , 2022\n" 16 | "Language-Team: Dutch (https://app.transifex.com/lirios/teams/71982/nl/)\n" 17 | "MIME-Version: 1.0\n" 18 | "Content-Type: text/plain; charset=UTF-8\n" 19 | "Content-Transfer-Encoding: 8bit\n" 20 | "Language: nl\n" 21 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 22 | 23 | #. (desktop-to-pot) "Name" entry 24 | #: metadata.desktop.in:3 25 | msgctxt "Name entry" 26 | msgid "User" 27 | msgstr "Gebruiker" 28 | 29 | #. (desktop-to-pot) "Comment" entry 30 | #: metadata.desktop.in:4 31 | msgctxt "Comment entry" 32 | msgid "Current user picture" 33 | msgstr "Huidige gebruikersfoto" 34 | 35 | #. (desktop-to-pot) "Keywords" entry 36 | #: metadata.desktop.in:5 37 | msgctxt "Keywords entry" 38 | msgid "User;" 39 | msgstr "Gebruiker;" 40 | -------------------------------------------------------------------------------- /translations/statusarea/user/pt_BR.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | # Translators: 7 | # Luiz Fernando Ranghetti , 2021 8 | # 9 | #, fuzzy 10 | msgid "" 11 | msgstr "" 12 | "Project-Id-Version: PACKAGE VERSION\n" 13 | "Report-Msgid-Bugs-To: \n" 14 | "PO-Revision-Date: 2021-01-03 09:25+0000\n" 15 | "Last-Translator: Luiz Fernando Ranghetti , 2021\n" 16 | "Language-Team: Portuguese (Brazil) (https://app.transifex.com/lirios/teams/71982/pt_BR/)\n" 17 | "MIME-Version: 1.0\n" 18 | "Content-Type: text/plain; charset=UTF-8\n" 19 | "Content-Transfer-Encoding: 8bit\n" 20 | "Language: pt_BR\n" 21 | "Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" 22 | 23 | #. (desktop-to-pot) "Name" entry 24 | #: metadata.desktop.in:3 25 | msgctxt "Name entry" 26 | msgid "User" 27 | msgstr "Usuário" 28 | 29 | #. (desktop-to-pot) "Comment" entry 30 | #: metadata.desktop.in:4 31 | msgctxt "Comment entry" 32 | msgid "Current user picture" 33 | msgstr "Imagem atual do usuário" 34 | 35 | #. (desktop-to-pot) "Keywords" entry 36 | #: metadata.desktop.in:5 37 | msgctxt "Keywords entry" 38 | msgid "User;" 39 | msgstr "Usuário;" 40 | -------------------------------------------------------------------------------- /translations/statusarea/user/tr.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | # Translators: 7 | # Emin Tufan Çetin , 2021 8 | # 9 | #, fuzzy 10 | msgid "" 11 | msgstr "" 12 | "Project-Id-Version: PACKAGE VERSION\n" 13 | "Report-Msgid-Bugs-To: \n" 14 | "PO-Revision-Date: 2021-01-03 09:25+0000\n" 15 | "Last-Translator: Emin Tufan Çetin , 2021\n" 16 | "Language-Team: Turkish (https://app.transifex.com/lirios/teams/71982/tr/)\n" 17 | "MIME-Version: 1.0\n" 18 | "Content-Type: text/plain; charset=UTF-8\n" 19 | "Content-Transfer-Encoding: 8bit\n" 20 | "Language: tr\n" 21 | "Plural-Forms: nplurals=2; plural=(n > 1);\n" 22 | 23 | #. (desktop-to-pot) "Name" entry 24 | #: metadata.desktop.in:3 25 | msgctxt "Name entry" 26 | msgid "User" 27 | msgstr "Kullanıcı" 28 | 29 | #. (desktop-to-pot) "Comment" entry 30 | #: metadata.desktop.in:4 31 | msgctxt "Comment entry" 32 | msgid "Current user picture" 33 | msgstr "Geçerli kullanıcı resmi" 34 | 35 | #. (desktop-to-pot) "Keywords" entry 36 | #: metadata.desktop.in:5 37 | msgctxt "Keywords entry" 38 | msgid "User;" 39 | msgstr "Kullanıcı;" 40 | -------------------------------------------------------------------------------- /translations/statusarea/user/user.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | --------------------------------------------------------------------------------