├── .gitignore ├── logo.png ├── .arcconfig ├── moon_56frames.png ├── 48-apps-liquidshell.png ├── liquidshell.qrc ├── Messages.sh ├── KWinCompat.hxx ├── Moon.hxx ├── WindowList.hxx ├── LockLogout.hxx ├── QuickLaunch.hxx ├── TaskBar.hxx ├── ClockWidgetConfigureDialog.hxx ├── PopupMenu.hxx ├── SysTrayItem.hxx ├── OnScreenBrightness.hxx ├── Pager.hxx ├── DiskUsageAppletConfigureDialog.hxx ├── DeviceNotifier.hxx ├── DesktopPanel.hxx ├── PictureFrameAppletConfigureDialog.hxx ├── Bluetooth.hxx ├── Launcher.hxx ├── NEWS.yaml ├── WeatherAppletConfigureDialog.hxx ├── OnScreenVolume.hxx ├── IconButton.hxx ├── Network.hxx ├── stylesheet.css ├── StartMenu.hxx ├── ConfigureDesktopDialog.hxx ├── Battery.hxx ├── liquidshell-session.desktop ├── DiskUsageApplet.hxx ├── PictureFrameApplet.hxx ├── PagerButton.hxx ├── SysTray.hxx ├── DesktopApplet.hxx ├── start_liquidshell ├── AppMenu.hxx ├── PictureFrameAppletConfigureDialog.cxx ├── SysTrayNotifyItem.hxx ├── DiskUsageAppletConfigureDialog.cxx ├── TaskBarButton.hxx ├── NotificationServer.hxx ├── DesktopWidget.hxx ├── DBusTypes.hxx ├── org.freedesktop.Notifications.xml ├── ClockWidget.hxx ├── org.kde.liquidshell.desktop ├── PkUpdates.hxx ├── NetworkList.hxx ├── KdeConnect.hxx ├── README-de ├── WeatherApplet.hxx ├── desktop.cxx ├── PopupMenu.cxx ├── SysTrayItem.cxx ├── NotificationList.hxx ├── IconButton.cxx ├── SysLoad.hxx ├── LockLogout.cxx ├── WindowList.cxx ├── Moon.cxx ├── DeviceNotifier.cxx ├── Bluetooth.cxx ├── Launcher.cxx ├── OnScreenBrightness.cxx ├── DeviceList.hxx ├── TaskBar.cxx ├── ClockWidgetConfigureDialog.cxx ├── PictureFrameApplet.cxx ├── PictureFrameAppletConfigureDialog.ui ├── DesktopPanel.cxx ├── README ├── DiskUsageAppletConfigureDialog.ui ├── PkUpdateList.hxx ├── Pager.cxx ├── DesktopApplet.cxx ├── ConfigureDesktopDialog.ui ├── DBusTypes.cxx ├── liquidshell.notifyrc ├── WeatherAppletConfigureDialog.ui ├── CMakeLists.txt ├── QuickLaunch.cxx ├── AppMenu.cxx ├── WeatherAppletConfigureDialog.cxx ├── PagerButton.cxx ├── NotificationServer.cxx ├── Network.cxx ├── Battery.cxx ├── ConfigureDesktopDialog.cxx ├── OnScreenVolume.cxx └── DiskUsageApplet.cxx /.gitignore: -------------------------------------------------------------------------------- 1 | compile_commands.json 2 | .cache/ 3 | -------------------------------------------------------------------------------- /logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KDE/liquidshell/HEAD/logo.png -------------------------------------------------------------------------------- /.arcconfig: -------------------------------------------------------------------------------- 1 | { 2 | "phabricator.uri" : "https://phabricator.kde.org/" 3 | } 4 | -------------------------------------------------------------------------------- /moon_56frames.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KDE/liquidshell/HEAD/moon_56frames.png -------------------------------------------------------------------------------- /48-apps-liquidshell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KDE/liquidshell/HEAD/48-apps-liquidshell.png -------------------------------------------------------------------------------- /liquidshell.qrc: -------------------------------------------------------------------------------- 1 | 2 | 3 | moon_56frames.png 4 | 5 | 6 | -------------------------------------------------------------------------------- /Messages.sh: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env bash 2 | $EXTRACTRC `find . -name \*.ui` >> rc.cpp || exit 11 3 | $XGETTEXT *.cxx rc.cpp -o $podir/liquidshell.pot 4 | rm -f rc.cpp 5 | -------------------------------------------------------------------------------- /KWinCompat.hxx: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of liquidshell. 3 | 4 | SPDX-FileCopyrightText: 2017 - 2024 Martin Koller 5 | 6 | SPDX-License-Identifier: GPL-3.0-or-later 7 | */ 8 | 9 | #ifndef _KWINCOMPAT_H_ 10 | #define _KWINCOMPAT_H_ 11 | 12 | #include 13 | #include 14 | #include 15 | #define KWinCompat KX11Extras 16 | 17 | #endif 18 | -------------------------------------------------------------------------------- /Moon.hxx: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of liquidshell. 3 | 4 | SPDX-FileCopyrightText: 2017 - 2024 Martin Koller 5 | 6 | SPDX-License-Identifier: GPL-3.0-or-later 7 | */ 8 | 9 | #include 10 | 11 | class Moon 12 | { 13 | public: 14 | // returns the frame to be used from the moon_56frames.png 15 | static int phase(const QDate &date); 16 | 17 | private: 18 | static double sun_position(double j); 19 | static double moon_position(double j, double ls); 20 | }; 21 | -------------------------------------------------------------------------------- /WindowList.hxx: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of liquidshell. 3 | 4 | SPDX-FileCopyrightText: 2017 - 2024 Martin Koller 5 | 6 | SPDX-License-Identifier: GPL-3.0-or-later 7 | */ 8 | 9 | #ifndef _WindowList_H_ 10 | #define _WindowList_H_ 11 | 12 | #include 13 | 14 | class WindowList : public QPushButton 15 | { 16 | Q_OBJECT 17 | 18 | public: 19 | WindowList(QWidget *parent); 20 | 21 | protected: 22 | void paintEvent(QPaintEvent *event) override; 23 | 24 | private Q_SLOTS: 25 | void fillMenu(); 26 | }; 27 | 28 | #endif 29 | -------------------------------------------------------------------------------- /LockLogout.hxx: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of liquidshell. 3 | 4 | SPDX-FileCopyrightText: 2017 - 2024 Martin Koller 5 | 6 | SPDX-License-Identifier: GPL-3.0-or-later 7 | */ 8 | 9 | #ifndef _LockLogout_H_ 10 | #define _LockLogout_H_ 11 | 12 | #include 13 | #include 14 | 15 | #include 16 | 17 | class LockLogout : public QWidget 18 | { 19 | Q_OBJECT 20 | 21 | public: 22 | LockLogout(DesktopPanel *parent); 23 | 24 | private Q_SLOTS: 25 | void fill(int rows); 26 | 27 | private: 28 | QToolButton *lock, *logout; 29 | }; 30 | 31 | #endif 32 | -------------------------------------------------------------------------------- /QuickLaunch.hxx: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of liquidshell. 3 | 4 | SPDX-FileCopyrightText: 2017 - 2024 Martin Koller 5 | 6 | SPDX-License-Identifier: GPL-3.0-or-later 7 | */ 8 | 9 | #ifndef _QuickLaunch_H_ 10 | #define _QuickLaunch_H_ 11 | 12 | #include 13 | #include 14 | 15 | #include 16 | 17 | class QuickLaunch : public Launcher 18 | { 19 | Q_OBJECT 20 | 21 | public: 22 | QuickLaunch(DesktopPanel *parent); 23 | 24 | private Q_SLOTS: 25 | void fill() override; 26 | 27 | private: 28 | QGridLayout *grid; 29 | }; 30 | 31 | #endif 32 | -------------------------------------------------------------------------------- /TaskBar.hxx: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of liquidshell. 3 | 4 | SPDX-FileCopyrightText: 2017 - 2024 Martin Koller 5 | 6 | SPDX-License-Identifier: GPL-3.0-or-later 7 | */ 8 | 9 | #ifndef _TaskBar_H_ 10 | #define _TaskBar_H_ 11 | 12 | #include 13 | #include 14 | 15 | #include 16 | 17 | class TaskBar : public QWidget 18 | { 19 | Q_OBJECT 20 | 21 | public: 22 | TaskBar(DesktopPanel *parent); 23 | 24 | private Q_SLOTS: 25 | void fill(); 26 | void windowChanged(WId wid, NET::Properties props, NET::Properties2 props2); 27 | 28 | private: 29 | QGridLayout *grid; 30 | }; 31 | 32 | #endif 33 | -------------------------------------------------------------------------------- /ClockWidgetConfigureDialog.hxx: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of liquidshell. 3 | 4 | SPDX-FileCopyrightText: 2017 - 2024 Martin Koller 5 | 6 | SPDX-License-Identifier: GPL-3.0-or-later 7 | */ 8 | 9 | #ifndef _ClockWidgetConfigureDialog_H_ 10 | #define _ClockWidgetConfigureDialog_H_ 11 | 12 | #include 13 | class QTreeWidget; 14 | 15 | class ClockWidgetConfigureDialog : public QDialog 16 | { 17 | Q_OBJECT 18 | 19 | public: 20 | ClockWidgetConfigureDialog(QWidget *parent, const QVector &timeZoneIds); 21 | 22 | QVector getSelectedTimeZoneIds() const; 23 | 24 | private: 25 | QTreeWidget *tree; 26 | }; 27 | 28 | #endif 29 | -------------------------------------------------------------------------------- /PopupMenu.hxx: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of liquidshell. 3 | 4 | SPDX-FileCopyrightText: 2017 - 2024 Martin Koller 5 | 6 | SPDX-License-Identifier: GPL-3.0-or-later 7 | */ 8 | 9 | #ifndef _PopupMenu_H_ 10 | #define _PopupMenu_H_ 11 | 12 | // A QMenu with drag functionality 13 | 14 | #include 15 | 16 | class PopupMenu : public QMenu 17 | { 18 | Q_OBJECT 19 | 20 | public: 21 | PopupMenu(QWidget *parent) : QMenu(parent), dragStartPos(-1, -1) { } 22 | 23 | protected: 24 | void mousePressEvent(QMouseEvent *event) override; 25 | void mouseMoveEvent(QMouseEvent *event) override; 26 | 27 | private: 28 | QPoint dragStartPos; 29 | }; 30 | 31 | #endif 32 | -------------------------------------------------------------------------------- /SysTrayItem.hxx: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of liquidshell. 3 | 4 | SPDX-FileCopyrightText: 2017 - 2024 Martin Koller 5 | 6 | SPDX-License-Identifier: GPL-3.0-or-later 7 | */ 8 | 9 | #ifndef _SysTrayItem_H_ 10 | #define _SysTrayItem_H_ 11 | 12 | #include 13 | 14 | class SysTrayItem : public QLabel 15 | { 16 | Q_OBJECT 17 | 18 | public: 19 | SysTrayItem(QWidget *parent, const QString &icon = QString()); 20 | 21 | protected Q_SLOTS: 22 | void toggleDetailsList(); 23 | void showDetailsList(); 24 | 25 | protected: 26 | void mousePressEvent(QMouseEvent *event) override; 27 | virtual QWidget *getDetailsList() { return nullptr; } 28 | 29 | protected: 30 | QString iconName; 31 | }; 32 | 33 | #endif 34 | -------------------------------------------------------------------------------- /OnScreenBrightness.hxx: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of liquidshell. 3 | 4 | SPDX-FileCopyrightText: 2017 - 2024 Martin Koller 5 | 6 | SPDX-License-Identifier: GPL-3.0-or-later 7 | */ 8 | 9 | #ifndef _OnScreenBrightness_H_ 10 | #define _OnScreenBrightness_H_ 11 | 12 | #include 13 | #include 14 | class QDBusMessage; 15 | class QDBusError; 16 | 17 | class OnScreenBrightness : public QProgressBar 18 | { 19 | Q_OBJECT 20 | 21 | public: 22 | OnScreenBrightness(QWidget *parent); 23 | 24 | private Q_SLOTS: 25 | void gotBrightnessMax(QDBusMessage msg); 26 | void brightnessMaxChanged(int value); 27 | void brightnessChanged(int value); 28 | 29 | private: 30 | QTimer hideTimer; 31 | }; 32 | 33 | #endif 34 | -------------------------------------------------------------------------------- /Pager.hxx: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of liquidshell. 3 | 4 | SPDX-FileCopyrightText: 2017 - 2024 Martin Koller 5 | 6 | SPDX-License-Identifier: GPL-3.0-or-later 7 | */ 8 | 9 | #ifndef _Pager_H_ 10 | #define _Pager_H_ 11 | 12 | #include 13 | class QButtonGroup; 14 | class PagerButton; 15 | class DesktopPanel; 16 | 17 | class Pager : public QWidget 18 | { 19 | Q_OBJECT 20 | 21 | public: 22 | Pager(DesktopPanel *parent); 23 | 24 | protected: 25 | void wheelEvent(QWheelEvent *event) override; 26 | 27 | private Q_SLOTS: 28 | void fill(); 29 | void changeDesktop(bool checked); 30 | 31 | private: 32 | QButtonGroup *group; 33 | QVector buttons; 34 | bool showIcons = true; 35 | }; 36 | 37 | #endif 38 | -------------------------------------------------------------------------------- /DiskUsageAppletConfigureDialog.hxx: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of liquidshell. 3 | 4 | SPDX-FileCopyrightText: 2017 - 2024 Martin Koller 5 | 6 | SPDX-License-Identifier: GPL-3.0-or-later 7 | */ 8 | 9 | #ifndef _DiskUsageAppletConfigureDialog_H_ 10 | #define _DiskUsageAppletConfigureDialog_H_ 11 | 12 | #include 13 | #include 14 | class DiskUsageApplet; 15 | 16 | class DiskUsageAppletConfigureDialog : public QDialog 17 | { 18 | Q_OBJECT 19 | 20 | public: 21 | DiskUsageAppletConfigureDialog(DiskUsageApplet *parent); 22 | 23 | private Q_SLOTS: 24 | void accept() override; 25 | 26 | private: 27 | DiskUsageApplet *applet; 28 | Ui::DiskUsageAppletConfigureDialog ui; 29 | }; 30 | 31 | #endif 32 | -------------------------------------------------------------------------------- /DeviceNotifier.hxx: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of liquidshell. 3 | 4 | SPDX-FileCopyrightText: 2017 - 2024 Martin Koller 5 | 6 | SPDX-License-Identifier: GPL-3.0-or-later 7 | */ 8 | 9 | #ifndef _DeviceNotifier_H_ 10 | #define _DeviceNotifier_H_ 11 | 12 | #include 13 | #include 14 | class DeviceList; 15 | 16 | class DeviceNotifier : public SysTrayItem 17 | { 18 | Q_OBJECT 19 | 20 | public: 21 | DeviceNotifier(QWidget *parent); 22 | 23 | protected: 24 | QWidget *getDetailsList() override; 25 | bool eventFilter(QObject *watched, QEvent *event) override; 26 | 27 | private Q_SLOTS: 28 | void checkDeviceList(); 29 | 30 | private: 31 | DeviceList *deviceList = nullptr; 32 | QTimer timer; 33 | }; 34 | 35 | #endif 36 | -------------------------------------------------------------------------------- /DesktopPanel.hxx: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of liquidshell. 3 | 4 | SPDX-FileCopyrightText: 2017 - 2024 Martin Koller 5 | 6 | SPDX-License-Identifier: GPL-3.0-or-later 7 | */ 8 | 9 | #ifndef _DesktopPanel_H_ 10 | #define _DesktopPanel_H_ 11 | 12 | #include 13 | 14 | class DesktopPanel : public QFrame 15 | { 16 | Q_OBJECT 17 | 18 | public: 19 | DesktopPanel(QWidget *parent); 20 | 21 | int getRows() const { return rows; } 22 | 23 | Q_SIGNALS: 24 | void resized(); 25 | void rowsChanged(int rows); 26 | 27 | protected: 28 | bool event(QEvent *event) override; 29 | void resizeEvent(QResizeEvent *event) override; 30 | 31 | private Q_SLOTS: 32 | void updateRowCount(); 33 | 34 | private: 35 | int rows = 2; 36 | }; 37 | 38 | #endif 39 | -------------------------------------------------------------------------------- /PictureFrameAppletConfigureDialog.hxx: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of liquidshell. 3 | 4 | SPDX-FileCopyrightText: 2017 - 2024 Martin Koller 5 | 6 | SPDX-License-Identifier: GPL-3.0-or-later 7 | */ 8 | 9 | #ifndef _PictureFrameAppletConfigureDialog_H_ 10 | #define _PictureFrameAppletConfigureDialog_H_ 11 | 12 | #include 13 | #include 14 | class PictureFrameApplet; 15 | 16 | class PictureFrameAppletConfigureDialog : public QDialog 17 | { 18 | Q_OBJECT 19 | 20 | public: 21 | PictureFrameAppletConfigureDialog(PictureFrameApplet *parent); 22 | 23 | private Q_SLOTS: 24 | void accept() override; 25 | 26 | private: 27 | PictureFrameApplet *applet; 28 | Ui::PictureFrameAppletConfigureDialog ui; 29 | }; 30 | 31 | #endif 32 | -------------------------------------------------------------------------------- /Bluetooth.hxx: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of liquidshell. 3 | 4 | SPDX-FileCopyrightText: 2017 - 2024 Martin Koller 5 | 6 | SPDX-License-Identifier: GPL-3.0-or-later 7 | */ 8 | 9 | #ifndef _Bluetooth_H_ 10 | #define _Bluetooth_H_ 11 | 12 | #include 13 | 14 | #include 15 | #include 16 | #include 17 | 18 | class Bluetooth : public SysTrayItem 19 | { 20 | Q_OBJECT 21 | 22 | public: 23 | Bluetooth(QWidget *parent); 24 | ~Bluetooth() override; 25 | 26 | protected: 27 | QWidget *getDetailsList() override; 28 | 29 | private Q_SLOTS: 30 | void changed(); 31 | 32 | private: 33 | BluezQt::Manager *manager; 34 | BluezQt::InitManagerJob *job; 35 | QPointer dialog; 36 | }; 37 | 38 | #endif 39 | -------------------------------------------------------------------------------- /Launcher.hxx: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of liquidshell. 3 | 4 | SPDX-FileCopyrightText: 2017 - 2024 Martin Koller 5 | 6 | SPDX-License-Identifier: GPL-3.0-or-later 7 | */ 8 | 9 | #ifndef _Launcher_H_ 10 | #define _Launcher_H_ 11 | 12 | #include 13 | #include 14 | 15 | class Launcher : public QWidget 16 | { 17 | Q_OBJECT 18 | 19 | public: 20 | Launcher(QWidget *parent, const QString &theId); 21 | 22 | protected: 23 | void contextMenuEvent(QContextMenuEvent *event) override; 24 | void loadConfig(const QString &defaultDir = QString()); 25 | void setDir(const QString &theDirPath); 26 | 27 | private Q_SLOTS: 28 | virtual void fill() = 0; 29 | 30 | protected: 31 | QString id; 32 | QString dirPath; 33 | QFileSystemWatcher dirWatcher; 34 | }; 35 | 36 | #endif 37 | -------------------------------------------------------------------------------- /NEWS.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | Version: 1.9 3 | Date: 2023-07-25 4 | Description: 5 | - Added install options (sleep/shutdown after install) 6 | - Improved EULA handling on package installation 7 | - Added long format of time and date display to calendar popup 8 | - Create default folder for storing quicklaunch apps 9 | - SysLoad widget width depends on CPU count 10 | - Bugfixes and adjustments to newer KDE components 11 | --- 12 | Version: 1.8.1 13 | Date: 2022-07-26 14 | Description: 15 | - Bugfixes and adjustments to newer KDE components 16 | --- 17 | Version: 1.8 18 | Date: 2021-12-01 19 | Description: 20 | - Notifications show how long they remain open (small animation) 21 | - Weather Applet shows moon phase 22 | - Disk Usage Applet watches for mount/unmount to react quicker for update 23 | - Display improvements in software updates component 24 | - Added DBUS-Menu support (some apps don't provide own menu but only via DBUS, e.g. MS teams) 25 | -------------------------------------------------------------------------------- /WeatherAppletConfigureDialog.hxx: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of liquidshell. 3 | 4 | SPDX-FileCopyrightText: 2017 - 2024 Martin Koller 5 | 6 | SPDX-License-Identifier: GPL-3.0-or-later 7 | */ 8 | 9 | #ifndef _WeatherAppletConfigureDialog_H_ 10 | #define _WeatherAppletConfigureDialog_H_ 11 | 12 | #include 13 | #include 14 | #include 15 | class WeatherApplet; 16 | 17 | class WeatherAppletConfigureDialog : public QDialog 18 | { 19 | Q_OBJECT 20 | 21 | public: 22 | WeatherAppletConfigureDialog(WeatherApplet *parent); 23 | 24 | public Q_SLOTS: 25 | void accept() override; 26 | 27 | private Q_SLOTS: 28 | void gotJsonFile(KJob *job); 29 | void readJsonFile(const QString &filePath); 30 | 31 | private: 32 | WeatherApplet *applet; 33 | Ui::WeatherAppletConfigureDialog ui; 34 | QString cityId; 35 | }; 36 | 37 | #endif 38 | -------------------------------------------------------------------------------- /OnScreenVolume.hxx: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of liquidshell. 3 | 4 | SPDX-FileCopyrightText: 2017 - 2024 Martin Koller 5 | 6 | SPDX-License-Identifier: GPL-3.0-or-later 7 | */ 8 | 9 | #ifndef _OnScreenVolume_H_ 10 | #define _OnScreenVolume_H_ 11 | 12 | #include 13 | #include 14 | #include 15 | class QDBusMessage; 16 | class QDBusError; 17 | 18 | class OnScreenVolume : public QProgressBar 19 | { 20 | Q_OBJECT 21 | 22 | public: 23 | OnScreenVolume(QWidget *parent); 24 | 25 | private Q_SLOTS: 26 | void gotMasterMixerError(QDBusError error, QDBusMessage msg); 27 | void getMasterMixer(); 28 | void gotMasterMixer(QDBusMessage msg); 29 | void controlChanged(); 30 | void gotCurrentControl(QDBusMessage reply); 31 | void volumeChanged(QDBusMessage reply); 32 | 33 | private: 34 | QTimer hideTimer, retryTimer; 35 | QString masterMixer; 36 | }; 37 | 38 | #endif 39 | -------------------------------------------------------------------------------- /IconButton.hxx: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of liquidshell. 3 | 4 | SPDX-FileCopyrightText: 2017 - 2024 Martin Koller 5 | 6 | SPDX-License-Identifier: GPL-3.0-or-later 7 | */ 8 | 9 | #ifndef _IconButton_H_ 10 | #define _IconButton_H_ 11 | 12 | #include 13 | #include 14 | 15 | // button class to ensure the positioning of the icon and text independent of the style 16 | 17 | class IconButton : public QToolButton 18 | { 19 | Q_OBJECT 20 | 21 | public: 22 | IconButton(QWidget *parent = nullptr); 23 | IconButton(QWidget *parent, const QIcon &icon, int iconSize, const QString &name); 24 | 25 | void setText(const QString &txt); 26 | void setIcon(const QIcon &icon); 27 | void setIcon2(const QIcon &icon); 28 | 29 | QSize sizeHint() const override; 30 | 31 | private: 32 | QLabel *iconLabel = nullptr; 33 | QLabel *icon2Label = nullptr; 34 | QLabel *textLabel = nullptr; 35 | }; 36 | 37 | #endif 38 | -------------------------------------------------------------------------------- /Network.hxx: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of liquidshell. 3 | 4 | SPDX-FileCopyrightText: 2017 - 2024 Martin Koller 5 | 6 | SPDX-License-Identifier: GPL-3.0-or-later 7 | */ 8 | 9 | #ifndef _Network_H_ 10 | #define _Network_H_ 11 | 12 | // network management (status display, activate, switch, ...) 13 | 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | #include 20 | 21 | class Network : public SysTrayItem 22 | { 23 | Q_OBJECT 24 | 25 | public: 26 | Network(QWidget *parent); 27 | 28 | protected: 29 | QWidget *getDetailsList() override; 30 | 31 | private Q_SLOTS: 32 | void checkState(); 33 | void openConfigureDialog(); 34 | 35 | private: 36 | QTimer blinkTimer; 37 | bool blinkState = false; 38 | QPixmap origPixmap; 39 | QPointer networkList; 40 | QPointer dialog; 41 | }; 42 | 43 | #endif 44 | -------------------------------------------------------------------------------- /stylesheet.css: -------------------------------------------------------------------------------- 1 | /* some examples ... 2 | 3 | DesktopPanel 4 | { 5 | min-height: 65px; 6 | max-height: 65px; 7 | } 8 | 9 | ClockWidget QLabel#time 10 | { 11 | font-size: 26px; 12 | font-weight: bold; 13 | } 14 | 15 | ClockWidget 16 | { 17 | qproperty-dayFormat: "dddd"; 18 | qproperty-dateFormat: "dd.MM.yyyy"; 19 | } 20 | 21 | SysLoad 22 | { 23 | qproperty-cpuUserColor: orange; 24 | qproperty-cpuSystemColorColor: red; 25 | qproperty-cpuNiceColorColor: yellow; 26 | qproperty-cpuSummaryBar: true; 27 | 28 | qproperty-memUsedColor: blue; 29 | qproperty-memCachedColor: darkGreen; 30 | qproperty-memSwapColor: cyan; 31 | 32 | qproperty-netReceivedColor: green; 33 | qproperty-netSentColor: red; 34 | } 35 | 36 | StartMenu 37 | { 38 | qproperty-themeIcon: "start-here-kde" 39 | } 40 | 41 | WeatherApplet 42 | { 43 | background: rgba(32, 56, 92, 75%); 44 | border: none; 45 | color: white; 46 | font-size: 20px; 47 | } 48 | 49 | WeatherApplet QLabel#city 50 | { 51 | font-size: 28px; 52 | } 53 | */ 54 | -------------------------------------------------------------------------------- /StartMenu.hxx: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of liquidshell. 3 | 4 | SPDX-FileCopyrightText: 2017 - 2024 Martin Koller 5 | 6 | SPDX-License-Identifier: GPL-3.0-or-later 7 | */ 8 | 9 | #ifndef _StartMenu_H_ 10 | #define _StartMenu_H_ 11 | 12 | #include 13 | #include 14 | 15 | #include 16 | 17 | #include 18 | 19 | class StartMenu : public QToolButton 20 | { 21 | Q_OBJECT 22 | 23 | Q_PROPERTY(QString themeIcon READ getThemeIcon WRITE setThemeIcon) 24 | 25 | public: 26 | StartMenu(DesktopPanel *parent); 27 | 28 | QString getThemeIcon() const { return themeIcon; } 29 | void setThemeIcon(const QString &icon); 30 | 31 | protected: 32 | void contextMenuEvent(QContextMenuEvent *event) override; 33 | 34 | private Q_SLOTS: 35 | void adjustIconSize(); 36 | void fill(); 37 | void showMenu(); 38 | 39 | private: 40 | void fillFromGroup(QMenu *menu, KServiceGroup::Ptr group); 41 | 42 | private: 43 | QString themeIcon; 44 | QMenu *popup; 45 | }; 46 | 47 | #endif 48 | -------------------------------------------------------------------------------- /ConfigureDesktopDialog.hxx: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of liquidshell. 3 | 4 | SPDX-FileCopyrightText: 2017 - 2024 Martin Koller 5 | 6 | SPDX-License-Identifier: GPL-3.0-or-later 7 | */ 8 | 9 | #ifndef _ConfigureDesktopDialog_H_ 10 | #define _ConfigureDesktopDialog_H_ 11 | 12 | #include 13 | #include 14 | #include 15 | 16 | #include 17 | 18 | class ConfigureDesktopDialog : public QDialog 19 | { 20 | Q_OBJECT 21 | 22 | public: 23 | ConfigureDesktopDialog(QWidget *parent, const DesktopWidget::Wallpaper &wp); 24 | 25 | const DesktopWidget::Wallpaper &getWallpaper() const { return wallpaper; } 26 | 27 | Q_SIGNALS: 28 | void changed(); 29 | 30 | private Q_SLOTS: 31 | void returnPressed(const QString &text); 32 | void buttonClicked(QAbstractButton *button); 33 | 34 | private: 35 | void showImages(); 36 | 37 | private: 38 | Ui::ConfigureDesktopDialog ui; 39 | QButtonGroup buttonGroup; 40 | DesktopWidget::Wallpaper wallpaper; 41 | }; 42 | 43 | #endif 44 | -------------------------------------------------------------------------------- /Battery.hxx: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of liquidshell. 3 | 4 | SPDX-FileCopyrightText: 2017 - 2024 Martin Koller 5 | 6 | SPDX-License-Identifier: GPL-3.0-or-later 7 | */ 8 | 9 | #ifndef _Battery_H_ 10 | #define _Battery_H_ 11 | 12 | #include 13 | #include 14 | #include 15 | #include 16 | class QDBusMessage; 17 | 18 | class Battery : public SysTrayItem 19 | { 20 | Q_OBJECT 21 | 22 | public: 23 | Battery(QWidget *parent); 24 | 25 | static QIcon getStatusIcon(int charge, bool isCharging); 26 | 27 | protected: 28 | QWidget *getDetailsList() override; 29 | 30 | private Q_SLOTS: 31 | void onBatteryReply(const QDBusMessage &msg); 32 | void upowerPropertiesChanged(const QString &interface, const QVariantMap &properties, const QStringList &invalidated); 33 | void changed(); 34 | 35 | private: 36 | QString secsToHM(int secs) const; 37 | 38 | private: 39 | Solid::Device device; 40 | bool onBattery = false; 41 | QPointer dialog; 42 | }; 43 | 44 | #endif 45 | -------------------------------------------------------------------------------- /liquidshell-session.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Type=XSession 3 | Exec=@CMAKE_INSTALL_FULL_BINDIR@/start_liquidshell 4 | TryExec=@CMAKE_INSTALL_FULL_BINDIR@/start_liquidshell 5 | DesktopNames=KDE 6 | Name=Liquidshell 7 | Name[ar]=صدفة الانسياب 8 | Name[ca]=Liquidshell 9 | Name[ca@valencia]=Liquidshell 10 | Name[cs]=Liquidshell 11 | Name[de]=Liquidshell 12 | Name[el]=Liquidshell 13 | Name[en_GB]=Liquidshell 14 | Name[eo]=Liquidshell 15 | Name[es]=Liquidshell 16 | Name[et]=Liquidshell 17 | Name[eu]=Liquidshell 18 | Name[fi]=Liquidshell 19 | Name[fr]=Liquidshell 20 | Name[gl]=Liquidshell 21 | Name[he]=Liquidshell 22 | Name[ia]=Liquidshell 23 | Name[it]=Liquidshell 24 | Name[ka]=Liquidshell 25 | Name[ko]=Liquidshell 26 | Name[lt]=Liquidshell 27 | Name[lv]=Liquidshell 28 | Name[nl]=Liquidshell 29 | Name[pl]=Liquidshell 30 | Name[pt]=Liquidshell 31 | Name[pt_BR]=Liquidshell 32 | Name[ro]=Liquidshell 33 | Name[ru]=Liquidshell 34 | Name[sa]=द्रवशैलम् 35 | Name[sl]=Liquidshell 36 | Name[sv]=Liquid skal 37 | Name[tg]=Восити рақиқи 38 | Name[tr]=Liquidshell 39 | Name[uk]=Liquidshell 40 | Name[zh_TW]=Liquidshell 41 | -------------------------------------------------------------------------------- /DiskUsageApplet.hxx: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of liquidshell. 3 | 4 | SPDX-FileCopyrightText: 2017 - 2024 Martin Koller 5 | 6 | SPDX-License-Identifier: GPL-3.0-or-later 7 | */ 8 | 9 | #ifndef _DiskUsageApplet_H_ 10 | #define _DiskUsageApplet_H_ 11 | 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | class QProgressBar; 18 | class QLabel; 19 | 20 | class DiskUsageApplet : public DesktopApplet 21 | { 22 | Q_OBJECT 23 | 24 | public: 25 | DiskUsageApplet(QWidget *parent, const QString &theId); 26 | 27 | void loadConfig() override; 28 | 29 | public Q_SLOTS: 30 | void configure() override; 31 | void saveConfig() override; 32 | 33 | private Q_SLOTS: 34 | void fill(); 35 | 36 | private: 37 | QTimer timer; 38 | 39 | struct SizeInfo 40 | { 41 | QLabel *label; 42 | QProgressBar *progress; 43 | QLabel *sizeLabel; 44 | bool used; 45 | }; 46 | 47 | QMap partitionMap; 48 | QPointer dialog; 49 | }; 50 | 51 | #endif 52 | -------------------------------------------------------------------------------- /PictureFrameApplet.hxx: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of liquidshell. 3 | 4 | SPDX-FileCopyrightText: 2017 - 2024 Martin Koller 5 | 6 | SPDX-License-Identifier: GPL-3.0-or-later 7 | */ 8 | 9 | #ifndef _PictureFrameApplet_H_ 10 | #define _PictureFrameApplet_H_ 11 | 12 | #include 13 | #include 14 | #include 15 | 16 | class PictureFrameApplet : public DesktopApplet 17 | { 18 | Q_OBJECT 19 | 20 | public: 21 | PictureFrameApplet(QWidget *parent, const QString &theId); 22 | 23 | void loadConfig() override; 24 | QSize sizeHint() const override; 25 | 26 | QString getImagePath() const { return imagePath; } 27 | void setImagePath(const QString &path) { imagePath = path; loadImage(); } 28 | 29 | public Q_SLOTS: 30 | void configure() override; 31 | 32 | protected: 33 | void resizeEvent(QResizeEvent *event) override; 34 | void paintEvent(QPaintEvent *event) override; 35 | 36 | private: 37 | void loadImage(); 38 | 39 | private: 40 | QPixmap pixmap; 41 | QString imagePath; 42 | QPointer dialog; 43 | }; 44 | 45 | #endif 46 | -------------------------------------------------------------------------------- /PagerButton.hxx: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of liquidshell. 3 | 4 | SPDX-FileCopyrightText: 2017 - 2024 Martin Koller 5 | 6 | SPDX-License-Identifier: GPL-3.0-or-later 7 | */ 8 | 9 | #ifndef _PagerButton_H_ 10 | #define _PagerButton_H_ 11 | 12 | #include 13 | #include 14 | class DesktopPanel; 15 | 16 | #include 17 | 18 | class PagerButton : public QPushButton 19 | { 20 | Q_OBJECT 21 | 22 | public: 23 | PagerButton(int num, DesktopPanel *panel, bool showIcon); 24 | 25 | int getDesktop() const { return desktop; } 26 | 27 | QSize sizeHint() const override; 28 | 29 | protected: 30 | void paintEvent(QPaintEvent *event) override; 31 | void dragEnterEvent(QDragEnterEvent *event) override; 32 | void dragLeaveEvent(QDragLeaveEvent *event) override; 33 | void dropEvent(QDropEvent *event) override; 34 | 35 | private Q_SLOTS: 36 | void createPixmap(); 37 | void windowChanged(WId id, NET::Properties props, NET::Properties2 props2); 38 | 39 | private: 40 | int desktop; 41 | DesktopPanel *panel; 42 | bool showIcon; 43 | QPixmap firstPixmap; 44 | QTimer dragDropTimer; 45 | QTimer pixmapTimer; 46 | }; 47 | 48 | #endif 49 | -------------------------------------------------------------------------------- /SysTray.hxx: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of liquidshell. 3 | 4 | SPDX-FileCopyrightText: 2017 - 2024 Martin Koller 5 | 6 | SPDX-License-Identifier: GPL-3.0-or-later 7 | */ 8 | 9 | #ifndef _SysTray_H_ 10 | #define _SysTray_H_ 11 | 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | 19 | #include 20 | #include 21 | class NotificationServer; 22 | 23 | class SysTray : public QFrame 24 | { 25 | Q_OBJECT 26 | 27 | public: 28 | SysTray(DesktopPanel *parent); 29 | 30 | private Q_SLOTS: 31 | void fill(); 32 | void itemRegistered(QString service); 33 | void itemUnregistered(QString service); 34 | void itemInitialized(SysTrayNotifyItem *item); 35 | 36 | private: 37 | void registerWatcher(); 38 | void arrangeNotifyItems(); 39 | void contextMenuEvent(QContextMenuEvent *event) override; 40 | 41 | private: 42 | QVBoxLayout *vbox, *appsVbox; 43 | QVector appsRows; 44 | QString serviceName; 45 | QMap> items; 46 | NotificationServer *notificationServer = nullptr; 47 | }; 48 | 49 | #endif 50 | -------------------------------------------------------------------------------- /DesktopApplet.hxx: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of liquidshell. 3 | 4 | SPDX-FileCopyrightText: 2017 - 2024 Martin Koller 5 | 6 | SPDX-License-Identifier: GPL-3.0-or-later 7 | */ 8 | 9 | #ifndef _DesktopApplet_H_ 10 | #define _DesktopApplet_H_ 11 | 12 | #include 13 | #include 14 | #include 15 | 16 | class DesktopApplet : public QFrame 17 | { 18 | Q_OBJECT 19 | 20 | public: 21 | DesktopApplet(QWidget *parent, const QString &theId, bool addConfigureAction = true); 22 | 23 | virtual void loadConfig(); 24 | 25 | bool isConfiguring() const { return buttons->isVisible(); } 26 | 27 | const QString &getId() const { return id; } 28 | int isOnDesktop(int d) const { return (onDesktop == NET::OnAllDesktops) || (onDesktop == d); } 29 | 30 | public Q_SLOTS: 31 | virtual void configure() { } 32 | virtual void saveConfig(); 33 | 34 | Q_SIGNALS: 35 | void removeThis(DesktopApplet *); 36 | 37 | protected: 38 | QString id; 39 | 40 | private Q_SLOTS: 41 | void startGeometryChange(); 42 | void finishGeometryChange(QAbstractButton *clicked); 43 | void removeThisApplet(); 44 | 45 | private: 46 | QDialogButtonBox *buttons = nullptr; 47 | QRect oldRect; 48 | int onDesktop = NET::OnAllDesktops; 49 | }; 50 | 51 | #endif 52 | -------------------------------------------------------------------------------- /start_liquidshell: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # disable plasmashell and enable liquidshell instead 3 | 4 | if [ ${XDG_CONFIG_HOME} ] 5 | then 6 | configDir=$XDG_CONFIG_HOME; 7 | else 8 | configDir=${HOME}/.config; #this is the default, http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html 9 | fi 10 | 11 | if [ -f /etc/xdg/autostart/plasmashell.desktop ] 12 | then 13 | plasmaFileName=$configDir/autostart/plasmashell.desktop 14 | else 15 | plasmaFileName=$configDir/autostart/org.kde.plasmashell.desktop 16 | fi 17 | 18 | liquidFileName=$configDir/autostart/org.kde.liquidshell.desktop 19 | 20 | mkdir -p $configDir/autostart 21 | 22 | test -f $liquidFileName 23 | liquidNotExists=$? 24 | if [ $liquidNotExists -eq 1 ] 25 | then 26 | cp @CMAKE_INSTALL_PREFIX@/@XDG_APPS_INSTALL_DIR@/org.kde.liquidshell.desktop $configDir/autostart 27 | else 28 | sed -i -e "s/Hidden=true/Hidden=false/" $liquidFileName 29 | fi 30 | 31 | cat > $plasmaFileName <