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.
- wpe_manager-0.5.0/LICENSE +21 -0
- wpe_manager-0.5.0/PKG-INFO +170 -0
- wpe_manager-0.5.0/README.md +144 -0
- wpe_manager-0.5.0/pyproject.toml +41 -0
- wpe_manager-0.5.0/setup.cfg +4 -0
- wpe_manager-0.5.0/wpe_manager/__init__.py +2 -0
- wpe_manager-0.5.0/wpe_manager/__main__.py +98 -0
- wpe_manager-0.5.0/wpe_manager/config.py +391 -0
- wpe_manager-0.5.0/wpe_manager/engine.py +189 -0
- wpe_manager-0.5.0/wpe_manager/gui.py +1302 -0
- wpe_manager-0.5.0/wpe_manager/library.py +172 -0
- wpe_manager-0.5.0/wpe_manager/rotation.py +201 -0
- wpe_manager-0.5.0/wpe_manager/steam.py +131 -0
- wpe_manager-0.5.0/wpe_manager.egg-info/PKG-INFO +170 -0
- wpe_manager-0.5.0/wpe_manager.egg-info/SOURCES.txt +17 -0
- wpe_manager-0.5.0/wpe_manager.egg-info/dependency_links.txt +1 -0
- wpe_manager-0.5.0/wpe_manager.egg-info/entry_points.txt +2 -0
- wpe_manager-0.5.0/wpe_manager.egg-info/requires.txt +1 -0
- wpe_manager-0.5.0/wpe_manager.egg-info/top_level.txt +1 -0
|
@@ -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,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())
|