-
Notifications
You must be signed in to change notification settings - Fork 0
/
set_wallpaper
executable file
·263 lines (224 loc) · 10.9 KB
/
set_wallpaper
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
#!/bin/bash
#
# This script is run by Variety when a new wallpaper is set. You can use Bash, Python or whatever suits you best.
# Here you can put custom commands for setting the wallpaper on your specific desktop environment,
# or run commands like notify-send that notify you of the change. You can also add commands to theme your browser,
# login screen or whatever you desire.
#
# Occasionally new versions of this script are released to bring support for new desktops. To apply them, you
# should either delete this copy (in ~/.config/data/scripts/) and restart Variety, or merge in the changes yourself.
# Bug fixes are automatically applied by Variety provided the local copy is never changed.
#
# PARAMETERS:
# $1: The first passed parameter is the absolute path to the wallpaper image to be set as wallpaper
# (after effects, clock, etc. are applied).
#
# $2: The second passed parameter is "auto" when the wallpaper is changed automatically (i.e. regular change), "manual"
# when the user has triggered the change, or "refresh" when the change is triggered by a change in quotes, clock, etc.
#
# $3: The third passed parameter is the absolute path to the original wallpaper image (before effects, clock, etc.)
#
# EXAMPLE:
# echo "$1" # /home/username/.config/variety/wallpaper/wallpaper-clock-fac0eef772f9b03bd9c0f82a79d72506.jpg
# echo "$2" # auto
# echo "$3" # /home/username/Pictures/Wallpapers/Nature/green-tunnel-1920x1080-wallpaper-861.jpg
# Here you may apply some additional custom operations on the wallpaper before it is applied.
# In the end put the path to the actual final wallpaper image file in the WP variable.
# The default is to simply set WP=$1.
WP=$1
feh --bg-fill "$WP" 2> /dev/null
#wal -i "$WP" 2> /dev/null
duskc run_command xrdb
exit 0
# Enlightenment
# Needs Modules/System/DBus Extension loaded to work
if [[ "$DESKTOP" == *"Enlightenment"* ]] || [[ "$DESKTOP" == *"Moksha"* ]]; then
OUTPUT_DIR="$HOME/.e/e/backgrounds"
TEMPLATE='
images { image: "@IMAGE@" USER; }
collections {
group {
name: "e/desktop/background";
data { item: "style" "4"; item: "noanimation" "1"; }
max: @WIDTH@ @HEIGHT@;
parts {
part {
name: "bg";
mouse_events: 0;
description {
state: "default" 0.0;
aspect: @ASPECT@ @ASPECT@;
aspect_preference: NONE;
image { normal: "@IMAGE@"; scale_hint: STATIC; }
}
}
}
}
}
'
OFILE="$OUTPUT_DIR/variety_wallpaper_$RANDOM"
DIMENSION="$(identify -format "%w/%h" "$WP")"
if [ ! -z "$DIMENSION" ]; then
WIDTH="$(echo "$DIMENSION" | cut -d/ -f1)"
HEIGHT="$(echo "$DIMENSION" | cut -d/ -f2)"
IMAGE="$(echo "$WP" | sed 's/[^[:alnum:]_-]/\\&/g')"
if [ -z "$HEIGHT" ] || [ "$HEIGHT" = "0" ]; then
ASPECT="0.0"
else
ASPECT="$(echo "scale=9; $DIMENSION" | bc)"
fi
fi
printf "%s" "$TEMPLATE" | \
sed "s/@ASPECT@/$ASPECT/g; s/@WIDTH@/$WIDTH/g; s/@HEIGHT@/$HEIGHT/g; s|@IMAGE@|$IMAGE|g" > "$OFILE.edc"
edje_cc "$OFILE.edc" "$OFILE.edj" 2>/dev/null
rm "$OFILE.edc"
## Get the current number of virtual desktops
desk_x_count=$(enlightenment_remote -desktops-get | awk '{print $1}')
desk_y_count=$(enlightenment_remote -desktops-get | awk '{print $2}')
## Get the current number of screens
screen_count=1
# If xrandr is available use it to get screen desk_x_count
if command -v xrandr >/dev/null 2>&1; then
screen_count=$(xrandr -q | grep -c ' connected')
fi
## Set the wallpaper for each virtual desktop
for ((x=0; x<desk_x_count; x++)); do
for ((y=0; y<desk_y_count; y++)); do
for ((z=0; z<screen_count; z++)); do
# -desktop-bg-add OPT1 OPT2 OPT3 OPT4 OPT5 Add a desktop bg definition.
# OPT1 = ContainerNo OPT2 = ZoneNo OPT3 = Desk_x. OPT4 = Desk_y. OPT5 = bg file path
enlightenment_remote -desktop-bg-add 0 "$z" "$x" "$y" "$OFILE.edj"&
done
done
done
# Remove all Variety wallpapers, but the current one and the previous one
# as we are calling enlightenment_remote asynchronously, if the previous wallpaper hasn't been
# replaced yet then the wallpaper will get set back to the theme one causing ugly artifacts
LAST_WALLPAPER_FILE="/home/ray/.config/variety/.enlightenment_last_wallpaper.txt"
if [ -e "$LAST_WALLPAPER_FILE" ]; then
find "$OUTPUT_DIR" -name "variety_wallpaper*.*" | grep -v "$OFILE.edj" | grep -v "$(cat "$LAST_WALLPAPER_FILE")" | xargs rm
else
find "$OUTPUT_DIR" -name "variety_wallpaper*.*" | grep -v "$OFILE.edj" | xargs rm
fi
echo "$OFILE.edj" > "$LAST_WALLPAPER_FILE"
fi
# KDE: Users on KDE 4 or Plasma < 5.7 will have to manually choose ~/Pictures/variety-wallpaper/ as a slideshow folder with a short interval.
# Afterwards, with the command below, Variety will just overwrite the single file there when changing the wallpaper
# and KDE will refresh it
# On Plasma 5.7 and above, the wallpaper choosing is automatic.
if [ "${KDE_FULL_SESSION}" == "true" ]; then
# Plasma 5.7 introduced a new feature to set the wallpaper via a qdbus script:
# https://github.com/KDE/plasma-workspace/commit/903cbfd7e267a4812a6ec222eb7e1b5dd775686f
if [[ -n "${KDE_SESSION_VERSION}" && "${KDE_SESSION_VERSION}" == '5' ]]; then
# Try to find the Qt 5 version of qdbus. For systems using qtchooser, the binary name is 'qdbus'
# and the Qt version can be selected via the QT_SELECT environment variable.
if command -v qdbus-qt5 &>/dev/null; then
qdbus_command=qdbus-qt5
else
qdbus_command=qdbus
fi
QT_SELECT=5 $qdbus_command org.kde.plasmashell /PlasmaShell org.kde.PlasmaShell.evaluateScript "
var allDesktops = desktops();
for (i=0; i < allDesktops.length; i++) {
d = allDesktops[i];
d.wallpaperPlugin = 'org.kde.image';
d.currentConfigGroup = Array('Wallpaper', 'org.kde.image', 'General');
d.writeConfig('Image', 'file://""$WP""')
}
"
# Reuse the exit code from qdbus
qdbus_exitcode="$?"
if [[ "$qdbus_exitcode" -ne 0 ]]; then
# If the script fails, show a notification.
kdialog --title "Variety: cannot change Plasma wallpaper" --passivepopup "Could not change the Plasma 5 wallpaper; \
make sure that you're using Plasma 5.7+ and have widgets unlocked.\n----\n \
Due to Plasma limitations, external programs cannot automatically change the wallpaper when the widgets are locked.\n \
See https://git.io/vprpM for more information." --icon variety 10 # Final number is the length of the popup
fi
exit "$qdbus_exitcode"
else
WALLDIR="$(xdg-user-dir PICTURES)/variety-wallpaper"
mkdir -p "$WALLDIR"
# Remove all old wallpapers
rm -fv "${WALLDIR}"/*
NEWWP="${WALLDIR}/wallpaper-kde-$RANDOM.jpg"
cp "$WP" "$NEWWP"
touch "$NEWWP"
fi
fi
# Gnome 3, Unity
gsettings set org.gnome.desktop.background picture-uri "file://$WP" 2> /dev/null
if [ "$(gsettings get org.gnome.desktop.background picture-options)" == "'none'" ]; then
gsettings set org.gnome.desktop.background picture-options 'zoom'
fi
# GNOME Screensaver / Lock screen - thanks to George C. de Araujo for the patch
gsettings set org.gnome.desktop.screensaver picture-uri "file://$WP" 2> /dev/null
if [ "$(gsettings get org.gnome.desktop.screensaver picture-options)" == "'none'" ]; then
gsettings set org.gnome.desktop.screensaver picture-options 'zoom'
fi
# Deepin
if [ "$(gsettings list-schemas | grep -c com.deepin.wrap.gnome.desktop.background)" -ge 1 ]; then
gsettings set com.deepin.wrap.gnome.desktop.background picture-uri "file://$WP"
if [ "$(gsettings get com.deepin.wrap.gnome.desktop.background picture-options)" == "'none'" ]; then
gsettings set com.deepin.wrap.gnome.desktop.background picture-options 'zoom'
fi
fi
# XFCE
command -v xfconf-query >/dev/null 2>&1
rc=$?
if [[ $rc = 0 ]] ; then
for i in $(xfconf-query -c xfce4-desktop -p /backdrop -l | grep -E -e "screen.*/monitor.*image-path$" -e "screen.*/monitor.*/last-image$"); do
xfconf-query -c xfce4-desktop -p "$i" -n -t string -s "" 2> /dev/null
xfconf-query -c xfce4-desktop -p "$i" -s "" 2> /dev/null
xfconf-query -c xfce4-desktop -p "$i" -s "$WP" 2> /dev/null
done
fi
# LXDE/PCmanFM
if [ "$XDG_CURRENT_DESKTOP" == "LXDE" ]; then
pcmanfm --set-wallpaper "$WP" 2> /dev/null
fi
# LXQt/PCmanFM-qt
if [ "$XDG_CURRENT_DESKTOP" == "LXQt" ]; then
pcmanfm-qt --set-wallpaper "$WP" 2> /dev/null
fi
# For simple WMs, use either feh or nitrogen
# Implementation note: this uses spaces around list items to enforce matching whole words.
# This also means that an empty variable won't cause false positives, since it expands to " "
SIMPLE_WMS=("bspwm" "dwm" "default" "instantwm" "i3" "i3-with-shmlog" "jwm" "openbox" "qtile" "qtile-venv" "xmonad")
if [[ " ${SIMPLE_WMS[*]} " = *" $XDG_CURRENT_DESKTOP "* || " ${SIMPLE_WMS[*]} " = *" $XDG_SESSION_DESKTOP "* ||
" ${SIMPLE_WMS[*]} " = *" $DESKTOP_SESSION "* ]]; then
if command -v "feh" >/dev/null 2>&1; then
feh --bg-fill "$WP" 2> /dev/null
#wal -i "$WP" 2> /dev/null
elif command -v "nitrogen" >/dev/null 2>&1; then
nitrogen --set-zoom-fill --save "$WP" 2> /dev/null
fi
fi
if [[ -n $SWAYSOCK ]]; then
swaymsg output "*" bg "$WP" fill 2> /dev/null
fi
# trinity
if [ "$XDG_CURRENT_DESKTOP" == "Trinity" ]; then
# The 4 refers to display mode 4; valid ones are 1-8
dcop kdesktop KBackgroundIface setWallpaper "$WP" 4 2> /dev/null
fi
# MATE after 1.6
gsettings set org.mate.background picture-filename "$WP" 2> /dev/null
# Cinnamon after 2.0
gsettings set org.cinnamon.desktop.background picture-uri "file://$WP" 2> /dev/null
if [ "$(gsettings get org.cinnamon.desktop.background picture-options 2>/dev/null)" == "'none'" ]; then
gsettings set org.cinnamon.desktop.background picture-options 'zoom'
fi
# Awesome Window Manager
# Be sure to start variety when you start awesome, such as by adding it to ~/.xinitrc
# NOTE: This config will change the wallpaper after your current awesome theme sets it.
# As such, the theme's wallpaper will briefly appear before being replaced with Variety's wallpaper.
if [[ "$XDG_SESSION_DESKTOP $DESKTOP_STARTUP_ID $DESKTOP_SESSION $XDG_CURRENT_DESKTOP" == *"awesome"* ]]; then
echo "local gears = require(\"gears\") gears.wallpaper.maximized(\"$1\", nil)" | awesome-client
fi
# =====================================================================================
# OPTIONAL: Show a notification on automatic wallpaper change.
# Display the original filename in the notification, but actually apply the post-effects image.
# name=$(echo "$3" | sed 's/\//\n/g'| tail -n 1)
# if [ "$2" == "auto" ]; then notify-send --icon "$WP" "Wallpaper changed" "$name" ; fi
exit 0