wpe-manager 0.5.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 dragonir
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,170 @@
1
+ Metadata-Version: 2.4
2
+ Name: wpe-manager
3
+ Version: 0.5.0
4
+ Summary: A fast, native GUI over linux-wallpaperengine with per-screen assignment and playlist rotation
5
+ Author-email: Dragonir <dragonir44@gmail.com>
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/Dragonir44/wpe-manager
8
+ Project-URL: Repository, https://github.com/Dragonir44/wpe-manager
9
+ Project-URL: Issues, https://github.com/Dragonir44/wpe-manager/issues
10
+ Keywords: wallpaper,wallpaper-engine,linux-wallpaperengine,kde,wayland
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: Environment :: X11 Applications :: Qt
13
+ Classifier: Intended Audience :: End Users/Desktop
14
+ Classifier: Operating System :: POSIX :: Linux
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.10
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Topic :: Desktop Environment
21
+ Requires-Python: >=3.10
22
+ Description-Content-Type: text/markdown
23
+ License-File: LICENSE
24
+ Requires-Dist: PySide6>=6.5
25
+ Dynamic: license-file
26
+
27
+ # Wallpaper Engine Manager
28
+
29
+ Une petite GUI native (PySide6/Qt) au-dessus de
30
+ [`linux-wallpaperengine`](https://github.com/Almamu/linux-wallpaperengine).
31
+ Elle fait ce que les frontends existants faisaient mal : gérer correctement une
32
+ bibliothèque Steam sur un autre disque, transmettre le bon `--assets-dir`, et
33
+ proposer des **playlists tournantes par écran** — le tout en restant fluide.
34
+
35
+ Testé sur KDE Plasma 6 / Wayland (CachyOS), mais ne dépend d'aucune API KDE.
36
+
37
+ ## Fonctionnalités
38
+
39
+ - **Détection auto** de la bibliothèque (`workshop/content/431960`) même sur un
40
+ autre disque — lit `libraryfolders.vdf` et résout les symlinks pour retrouver
41
+ le dossier des assets.
42
+ - **Grille de vignettes**, chargées en tâche de fond (fluide même à 500+ fonds).
43
+ - **Recherche** par titre.
44
+ - **Filtres combinés** : genre, type, évaluation d'âge (tout en local depuis
45
+ `project.json`), **résolution**, et un filtre **« Compatible écran »** qui ne
46
+ montre que les fonds au bon ratio pour l'écran sélectionné (idéal multi-écran /
47
+ ultrawide). Tri par titre ou par taille.
48
+ - **Résolution via Steam** : la résolution est un tag Workshop absent des fichiers
49
+ locaux ; l'app la récupère depuis l'API publique Steam (**sans clé**), la met en
50
+ cache (`metadata.json`) — instantané et hors-ligne ensuite. Bouton « Sync Steam »
51
+ et sync auto au premier lancement.
52
+ - **Un process par écran** : changer un écran ne redémarre pas les autres.
53
+ - **Assignation par écran** : un **fond fixe** ou une **playlist tournante**.
54
+ - **Playlists** créées par **cases à cocher** dans la grille, avec **intervalle**
55
+ et **ordre** (séquentiel / aléatoire).
56
+ - **Import depuis Wallpaper Engine** : récupère les playlists du `config.json`
57
+ de WPE (extrait les IDs, ignore les chemins/moniteurs Windows non portables).
58
+ - **Propriétés par fond** : bouton *Propriétés…* pour personnaliser un fond
59
+ (couleurs, curseurs, cases à cocher, listes de choix). Les réglages sont
60
+ enregistrés par fond et réappliqués à chaque lancement via `--set-property` ;
61
+ si le fond est affiché, il se recharge aussitôt.
62
+ - **Transition sans coupure** : le nouveau fond est affiché *par-dessus* l'ancien
63
+ avant que celui-ci soit tué (pas de fondu alpha — le backend ne le permet pas —
64
+ mais plus de flash du fond de bureau entre deux).
65
+ - **Barre système (systray)** : fermer la fenêtre la réduit dans le tray ; la
66
+ **rotation continue** en arrière-plan. Le menu de l'icône permet de changer la
67
+ playlist de chaque écran, de vider un écran, de tout arrêter, et de rouvrir.
68
+ - **Démarrage avec la session** : une case (ou l'entrée du menu tray) installe
69
+ un lanceur autostart qui relance l'app dans le tray et **restaure les fonds
70
+ (rotation comprise)** à l'ouverture de session.
71
+ - **Options** : muet, FPS, durée de transition (ms).
72
+
73
+ ## Prérequis
74
+
75
+ - [`linux-wallpaperengine`](https://github.com/Almamu/linux-wallpaperengine)
76
+ installé et dans le `PATH`.
77
+ - Wallpaper Engine (l'app Steam, app id `431960`) installé, pour disposer des
78
+ **assets** et des wallpapers du workshop.
79
+ - Python ≥ 3.10 et PySide6 (installé automatiquement via pip).
80
+
81
+ ## Installation
82
+
83
+ ### Toute distribution (PyPI)
84
+
85
+ ```bash
86
+ pipx install wpe-manager # recommandé (environnement isolé)
87
+ # ou
88
+ pip install --user wpe-manager
89
+ ```
90
+
91
+ ### Arch / CachyOS / dérivés (AUR)
92
+
93
+ ```bash
94
+ paru -S wpe-manager # ou : yay -S wpe-manager
95
+ ```
96
+
97
+ Le paquet AUR tire le backend `linux-wallpaperengine-git` automatiquement.
98
+
99
+ ### Depuis les sources
100
+
101
+ ```bash
102
+ pipx install . # ou : pip install --user .
103
+ # ou sans installer :
104
+ python -m wpe_manager
105
+ ```
106
+
107
+ Puis lance la commande :
108
+
109
+ ```bash
110
+ wpe-manager
111
+ ```
112
+
113
+ ## Utilisation
114
+
115
+ 1. Choisis un **écran** dans le menu en haut.
116
+ 2. Clique un fond (ou double-clic) → **Fond sélectionné → écran** pour un fond fixe.
117
+ 3. Pour une rotation : coche des fonds → **Nouvelle (depuis cochés)**, nomme la
118
+ playlist, règle **intervalle** + **ordre**, puis **Playlist → écran**.
119
+ 4. **Vider l'écran** / **Tout arrêter** au besoin.
120
+
121
+ Si la bibliothèque n'est pas trouvée automatiquement, bouton **Chemins…** pour la
122
+ pointer à la main.
123
+
124
+ > Fermer la fenêtre la **réduit dans la barre système** : la rotation continue.
125
+ > Clic sur l'icône pour rouvrir, clic droit → **Quitter** pour fermer réellement.
126
+
127
+ ## Fichiers de config
128
+
129
+ - `~/.config/wpe-manager/config.json` — chemins, muet, FPS, transition.
130
+ - `~/.config/wpe-manager/state.json` — assignations par écran (fond / playlist).
131
+ - `~/.config/wpe-manager/playlists.json` — playlists.
132
+ - `~/.config/wpe-manager/engine.json` — process backend en cours (par écran).
133
+ - `~/.config/wpe-manager/metadata.json` — cache des résolutions (Steam Workshop).
134
+ - `~/.config/wpe-manager/properties.json` — propriétés personnalisées par fond.
135
+
136
+ ## Autostart (restaurer les fonds à l'ouverture de session)
137
+
138
+ Le plus simple : coche **Démarrer avec la session** (barre du haut ou menu du
139
+ tray). L'app écrit `~/.config/autostart/wpe-manager.desktop` pour toi.
140
+
141
+ Sous le capot, l'entrée lance `wpe-manager --daemon` (alias historique :
142
+ `--autostart`) : l'app démarre **cachée dans la barre système**, restaure les
143
+ fonds sauvegardés et **reprend la rotation**.
144
+
145
+ ## Entrée dans le menu des applications
146
+
147
+ Coche **Menu applications** (barre du haut ou menu du tray) pour ajouter un
148
+ lanceur dans le menu de ton bureau (`~/.local/share/applications/`) et ouvrir
149
+ l'app comme n'importe quel programme. Fonctionne aussi bien depuis une
150
+ installation pip/pipx que depuis les sources.
151
+
152
+ ## Compatibilité & limites connues
153
+
154
+ Cette app n'est qu'un frontend ; ce qui fonctionne dépend surtout du backend.
155
+
156
+ - **Backend requis** : `linux-wallpaperengine` doit être installé et dans le
157
+ `PATH`. Il est packagé sur l'AUR ; sur Debian/Fedora/etc. il faut le
158
+ **compiler depuis les sources**.
159
+ - **Bureau** : testé sur **KDE Plasma / Wayland**. Fonctionne sur les
160
+ compositeurs qui supportent `wlr-layer-shell` (KWin, wlroots) et sous X11.
161
+ **GNOME Wayland (Mutter) n'implémente pas layer-shell** → le backend ne peut
162
+ pas y dessiner le fond ; c'est une limite du compositeur, pas de cette app.
163
+ - **Wayland** : le fond est dessiné **par-dessus** le bureau → pas d'icônes ni
164
+ de clic droit sur le bureau tant qu'un fond animé est actif (limite du
165
+ backend).
166
+
167
+ ## Remerciements
168
+
169
+ Ce projet n'est qu'un frontend ; tout le rendu est assuré par
170
+ [Almamu/linux-wallpaperengine](https://github.com/Almamu/linux-wallpaperengine).
@@ -0,0 +1,144 @@
1
+ # Wallpaper Engine Manager
2
+
3
+ Une petite GUI native (PySide6/Qt) au-dessus de
4
+ [`linux-wallpaperengine`](https://github.com/Almamu/linux-wallpaperengine).
5
+ Elle fait ce que les frontends existants faisaient mal : gérer correctement une
6
+ bibliothèque Steam sur un autre disque, transmettre le bon `--assets-dir`, et
7
+ proposer des **playlists tournantes par écran** — le tout en restant fluide.
8
+
9
+ Testé sur KDE Plasma 6 / Wayland (CachyOS), mais ne dépend d'aucune API KDE.
10
+
11
+ ## Fonctionnalités
12
+
13
+ - **Détection auto** de la bibliothèque (`workshop/content/431960`) même sur un
14
+ autre disque — lit `libraryfolders.vdf` et résout les symlinks pour retrouver
15
+ le dossier des assets.
16
+ - **Grille de vignettes**, chargées en tâche de fond (fluide même à 500+ fonds).
17
+ - **Recherche** par titre.
18
+ - **Filtres combinés** : genre, type, évaluation d'âge (tout en local depuis
19
+ `project.json`), **résolution**, et un filtre **« Compatible écran »** qui ne
20
+ montre que les fonds au bon ratio pour l'écran sélectionné (idéal multi-écran /
21
+ ultrawide). Tri par titre ou par taille.
22
+ - **Résolution via Steam** : la résolution est un tag Workshop absent des fichiers
23
+ locaux ; l'app la récupère depuis l'API publique Steam (**sans clé**), la met en
24
+ cache (`metadata.json`) — instantané et hors-ligne ensuite. Bouton « Sync Steam »
25
+ et sync auto au premier lancement.
26
+ - **Un process par écran** : changer un écran ne redémarre pas les autres.
27
+ - **Assignation par écran** : un **fond fixe** ou une **playlist tournante**.
28
+ - **Playlists** créées par **cases à cocher** dans la grille, avec **intervalle**
29
+ et **ordre** (séquentiel / aléatoire).
30
+ - **Import depuis Wallpaper Engine** : récupère les playlists du `config.json`
31
+ de WPE (extrait les IDs, ignore les chemins/moniteurs Windows non portables).
32
+ - **Propriétés par fond** : bouton *Propriétés…* pour personnaliser un fond
33
+ (couleurs, curseurs, cases à cocher, listes de choix). Les réglages sont
34
+ enregistrés par fond et réappliqués à chaque lancement via `--set-property` ;
35
+ si le fond est affiché, il se recharge aussitôt.
36
+ - **Transition sans coupure** : le nouveau fond est affiché *par-dessus* l'ancien
37
+ avant que celui-ci soit tué (pas de fondu alpha — le backend ne le permet pas —
38
+ mais plus de flash du fond de bureau entre deux).
39
+ - **Barre système (systray)** : fermer la fenêtre la réduit dans le tray ; la
40
+ **rotation continue** en arrière-plan. Le menu de l'icône permet de changer la
41
+ playlist de chaque écran, de vider un écran, de tout arrêter, et de rouvrir.
42
+ - **Démarrage avec la session** : une case (ou l'entrée du menu tray) installe
43
+ un lanceur autostart qui relance l'app dans le tray et **restaure les fonds
44
+ (rotation comprise)** à l'ouverture de session.
45
+ - **Options** : muet, FPS, durée de transition (ms).
46
+
47
+ ## Prérequis
48
+
49
+ - [`linux-wallpaperengine`](https://github.com/Almamu/linux-wallpaperengine)
50
+ installé et dans le `PATH`.
51
+ - Wallpaper Engine (l'app Steam, app id `431960`) installé, pour disposer des
52
+ **assets** et des wallpapers du workshop.
53
+ - Python ≥ 3.10 et PySide6 (installé automatiquement via pip).
54
+
55
+ ## Installation
56
+
57
+ ### Toute distribution (PyPI)
58
+
59
+ ```bash
60
+ pipx install wpe-manager # recommandé (environnement isolé)
61
+ # ou
62
+ pip install --user wpe-manager
63
+ ```
64
+
65
+ ### Arch / CachyOS / dérivés (AUR)
66
+
67
+ ```bash
68
+ paru -S wpe-manager # ou : yay -S wpe-manager
69
+ ```
70
+
71
+ Le paquet AUR tire le backend `linux-wallpaperengine-git` automatiquement.
72
+
73
+ ### Depuis les sources
74
+
75
+ ```bash
76
+ pipx install . # ou : pip install --user .
77
+ # ou sans installer :
78
+ python -m wpe_manager
79
+ ```
80
+
81
+ Puis lance la commande :
82
+
83
+ ```bash
84
+ wpe-manager
85
+ ```
86
+
87
+ ## Utilisation
88
+
89
+ 1. Choisis un **écran** dans le menu en haut.
90
+ 2. Clique un fond (ou double-clic) → **Fond sélectionné → écran** pour un fond fixe.
91
+ 3. Pour une rotation : coche des fonds → **Nouvelle (depuis cochés)**, nomme la
92
+ playlist, règle **intervalle** + **ordre**, puis **Playlist → écran**.
93
+ 4. **Vider l'écran** / **Tout arrêter** au besoin.
94
+
95
+ Si la bibliothèque n'est pas trouvée automatiquement, bouton **Chemins…** pour la
96
+ pointer à la main.
97
+
98
+ > Fermer la fenêtre la **réduit dans la barre système** : la rotation continue.
99
+ > Clic sur l'icône pour rouvrir, clic droit → **Quitter** pour fermer réellement.
100
+
101
+ ## Fichiers de config
102
+
103
+ - `~/.config/wpe-manager/config.json` — chemins, muet, FPS, transition.
104
+ - `~/.config/wpe-manager/state.json` — assignations par écran (fond / playlist).
105
+ - `~/.config/wpe-manager/playlists.json` — playlists.
106
+ - `~/.config/wpe-manager/engine.json` — process backend en cours (par écran).
107
+ - `~/.config/wpe-manager/metadata.json` — cache des résolutions (Steam Workshop).
108
+ - `~/.config/wpe-manager/properties.json` — propriétés personnalisées par fond.
109
+
110
+ ## Autostart (restaurer les fonds à l'ouverture de session)
111
+
112
+ Le plus simple : coche **Démarrer avec la session** (barre du haut ou menu du
113
+ tray). L'app écrit `~/.config/autostart/wpe-manager.desktop` pour toi.
114
+
115
+ Sous le capot, l'entrée lance `wpe-manager --daemon` (alias historique :
116
+ `--autostart`) : l'app démarre **cachée dans la barre système**, restaure les
117
+ fonds sauvegardés et **reprend la rotation**.
118
+
119
+ ## Entrée dans le menu des applications
120
+
121
+ Coche **Menu applications** (barre du haut ou menu du tray) pour ajouter un
122
+ lanceur dans le menu de ton bureau (`~/.local/share/applications/`) et ouvrir
123
+ l'app comme n'importe quel programme. Fonctionne aussi bien depuis une
124
+ installation pip/pipx que depuis les sources.
125
+
126
+ ## Compatibilité & limites connues
127
+
128
+ Cette app n'est qu'un frontend ; ce qui fonctionne dépend surtout du backend.
129
+
130
+ - **Backend requis** : `linux-wallpaperengine` doit être installé et dans le
131
+ `PATH`. Il est packagé sur l'AUR ; sur Debian/Fedora/etc. il faut le
132
+ **compiler depuis les sources**.
133
+ - **Bureau** : testé sur **KDE Plasma / Wayland**. Fonctionne sur les
134
+ compositeurs qui supportent `wlr-layer-shell` (KWin, wlroots) et sous X11.
135
+ **GNOME Wayland (Mutter) n'implémente pas layer-shell** → le backend ne peut
136
+ pas y dessiner le fond ; c'est une limite du compositeur, pas de cette app.
137
+ - **Wayland** : le fond est dessiné **par-dessus** le bureau → pas d'icônes ni
138
+ de clic droit sur le bureau tant qu'un fond animé est actif (limite du
139
+ backend).
140
+
141
+ ## Remerciements
142
+
143
+ Ce projet n'est qu'un frontend ; tout le rendu est assuré par
144
+ [Almamu/linux-wallpaperengine](https://github.com/Almamu/linux-wallpaperengine).
@@ -0,0 +1,41 @@
1
+ [build-system]
2
+ requires = ["setuptools>=77"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "wpe-manager"
7
+ dynamic = ["version"]
8
+ description = "A fast, native GUI over linux-wallpaperengine with per-screen assignment and playlist rotation"
9
+ readme = "README.md"
10
+ requires-python = ">=3.10"
11
+ license = "MIT"
12
+ license-files = ["LICENSE"]
13
+ authors = [{ name = "Dragonir", email = "dragonir44@gmail.com" }]
14
+ dependencies = ["PySide6>=6.5"]
15
+ keywords = ["wallpaper", "wallpaper-engine", "linux-wallpaperengine", "kde", "wayland"]
16
+ classifiers = [
17
+ "Development Status :: 4 - Beta",
18
+ "Environment :: X11 Applications :: Qt",
19
+ "Intended Audience :: End Users/Desktop",
20
+ "Operating System :: POSIX :: Linux",
21
+ "Programming Language :: Python :: 3",
22
+ "Programming Language :: Python :: 3.10",
23
+ "Programming Language :: Python :: 3.11",
24
+ "Programming Language :: Python :: 3.12",
25
+ "Programming Language :: Python :: 3.13",
26
+ "Topic :: Desktop Environment",
27
+ ]
28
+
29
+ [project.urls]
30
+ Homepage = "https://github.com/Dragonir44/wpe-manager"
31
+ Repository = "https://github.com/Dragonir44/wpe-manager"
32
+ Issues = "https://github.com/Dragonir44/wpe-manager/issues"
33
+
34
+ [project.gui-scripts]
35
+ wpe-manager = "wpe_manager.__main__:main"
36
+
37
+ [tool.setuptools]
38
+ packages = ["wpe_manager"]
39
+
40
+ [tool.setuptools.dynamic]
41
+ version = { attr = "wpe_manager.__version__" }
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,2 @@
1
+ """Wallpaper Engine Manager — a thin, fast GUI over linux-wallpaperengine."""
2
+ __version__ = "0.5.0"
@@ -0,0 +1,98 @@
1
+ """Entry point.
2
+
3
+ python -m wpe_manager launch the GUI (with a system-tray icon)
4
+ python -m wpe_manager --daemon start hidden in the tray and re-apply the
5
+ saved wallpapers, so playlist rotation
6
+ resumes at session login. Suitable for an
7
+ autostart entry (see config.install_autostart).
8
+
9
+ --autostart is kept as an alias of --daemon for older autostart entries.
10
+
11
+ Only ONE instance runs at a time. A second launch just tells the running one to
12
+ show its window (and exits), so the daemon started at login and a later manual
13
+ launch never fight over the config files.
14
+ """
15
+ from __future__ import annotations
16
+
17
+ import os
18
+ import sys
19
+
20
+ from . import config
21
+
22
+ _SERVER_NAME = f"wpe-manager-{os.getuid()}"
23
+
24
+
25
+ def _signal_existing(daemon: bool) -> bool:
26
+ """If another instance is listening, ask it to show its window and return
27
+ True (we should exit). Return False if we're the first instance."""
28
+ from PySide6.QtNetwork import QLocalSocket
29
+
30
+ sock = QLocalSocket()
31
+ sock.connectToServer(_SERVER_NAME)
32
+ if not sock.waitForConnected(300):
33
+ return False
34
+ # A daemon relaunch shouldn't pop the window open; a plain launch should.
35
+ sock.write(b"noop" if daemon else b"show")
36
+ sock.flush()
37
+ sock.waitForBytesWritten(500)
38
+ sock.disconnectFromServer()
39
+ return True
40
+
41
+
42
+ def main() -> int:
43
+ daemon = "--daemon" in sys.argv or "--autostart" in sys.argv
44
+
45
+ from PySide6.QtNetwork import QLocalServer
46
+ from PySide6.QtWidgets import QApplication
47
+
48
+ from .gui import MainWindow, app_icon
49
+
50
+ app = QApplication(sys.argv)
51
+ app.setApplicationName("Wallpaper Engine Manager")
52
+ app.setWindowIcon(app_icon())
53
+ # The tray keeps the app alive when the window is hidden/closed.
54
+ app.setQuitOnLastWindowClosed(False)
55
+
56
+ # Single-instance guard: hand off to a running instance if there is one.
57
+ if _signal_existing(daemon):
58
+ return 0
59
+
60
+ cfg = config.load_config()
61
+ win = MainWindow(cfg)
62
+
63
+ # We're the primary instance: listen so later launches can reach us.
64
+ QLocalServer.removeServer(_SERVER_NAME) # clear a stale socket if any
65
+ server = QLocalServer(app)
66
+ server.listen(_SERVER_NAME)
67
+
68
+ def _on_new_connection() -> None:
69
+ conn = server.nextPendingConnection()
70
+ if conn is None:
71
+ return
72
+ if conn.waitForReadyRead(300):
73
+ msg = bytes(conn.readAll().data())
74
+ if msg.startswith(b"show"):
75
+ win.showNormal()
76
+ win.raise_()
77
+ win.activateWindow()
78
+ conn.disconnectFromServer()
79
+
80
+ server.newConnection.connect(_on_new_connection)
81
+
82
+ if daemon:
83
+ # Resume the saved assignments (launches wallpapers, arms rotation
84
+ # timers) and stay hidden in the tray.
85
+ if cfg.is_usable():
86
+ win.controller.apply()
87
+ # If there's no tray to live in, fall back to showing the window so the
88
+ # app isn't invisible and unreachable.
89
+ if win._tray is None:
90
+ win.show()
91
+ else:
92
+ win.show()
93
+
94
+ return app.exec()
95
+
96
+
97
+ if __name__ == "__main__":
98
+ raise SystemExit(main())