可是compiz的wallpaper plugin不支援定時或隨機換桌布的功能
google也沒看到換桌布用的script
(也不是沒有,只是不太喜歡他自動縮放圖的作法)
查了一下dbus plugin的資料(詳見compiz wiki)後用shell script寫了一個換桌布的小程式
以下code請自行複製貼上後,用crontab或其他方式定時執行即可
註:我試了一下,用CRONTAB的時候會有錯誤,似乎是DBUS-LAUNCH無法正確執行(x11 initialization failed)
我試著加了XAUTHORITY進去也無法解決
所以若是打算用CRONTAB的朋友,請用這個PATCH後,自行修改第39行DESKTOPS的值
- 代碼: 選擇全部
#!/bin/bash
# 本程式目前沒有調整顯示方式的功能(以後也不會有orz),無法針對不同的桌布調整並排顯示等設定
# 使用前請自行調整圖檔至合理的範圍,並在wallpaper plugin中事先設定好各桌面的顯示設定
#
#
# 修改以下設定以符合個人需求
#
# 圖檔所在的目錄
IMGDIR='/path/to/wallpaper'
# 是否允許重複的桌布 1: 允許 0: 不允許
DUPLICATE=0
# 尋找圖檔時的額外參數,改變這個值之前請man find
# FIND_OPT="-maxdepth 1"
#
#
# 以下的設定通常不需要變動
#
# display
DISP=:0
# 要調整的螢幕,通常是0
SCREEN=0
# 以下是程式碼
# 確定dbus session
if test -z "$DBUS_SESSION_BUS_ADDRESS" ; then
export DISPLAY=${DISP}
. ${HOME}/.dbus/session-bus/*
export DBUS_SESSION_BUS_ADDRESS
fi
# 取得虛擬桌面數
hsize=`dbus-send --print-reply --type=method_call --dest=org.freedesktop.compiz /org/freedesktop/compiz/core/screen${SCREEN}/hsize org.freedesktop.compiz.get|grep int32|sed 's/int32//'|sed 's/ //g'`
vsize=`dbus-send --print-reply --type=method_call --dest=org.freedesktop.compiz /org/freedesktop/compiz/core/screen${SCREEN}/vsize org.freedesktop.compiz.get|grep int32|sed 's/int32//'|sed 's/ //g'`
let "DESKTOPS = hsize * vsize"
IMGTMP=`/usr/bin/find ${IMGDIR} ${FIND_OPT} -type f -printf "\"%h/%f\" "`
eval "IMGS=(${IMGTMP})"
# 初始化亂數表
SEED=$(head -1 /dev/urandom | od -N 1 | awk '{ print $2 }')
RANDOM=${SEED}
# 計算有幾個檔
FILECNT=0
eval "for i in ${IMGTMP};do let \"FILECNT++\";done"
# 若只有一個檔的話,就直接設定後離開
if [ $FILECNT -eq 1 ]
then
PIC="array:string:$IMGS"
PIC=`echo "${PIC}"|sed 's/ /\\\\ /g'`
eval "dbus-send --type=method_call --dest=org.freedesktop.compiz /org/freedesktop/compiz/wallpaper/screen${SCREEN}/bg_image org.freedesktop.compiz.set ${PIC} > /dev/null 2>&1"
exit
fi
# 若圖檔不夠多,就強制調整成允許重複
if [ ${DESKTOPS} -ge ${FILECNT} ]
then
DUPLICATE=1
fi
x=$RANDOM;let "x %= FILECNT";n="${IMGS[${x}]}";if [ ${DUPLICATE} -eq 0 ];then unset IMGS[${x}];fi
PIC="array:string:${n}"
cnt=${DESKTOPS}
prev="$n"
while [ $cnt != 1 ]
do
flg=0
while [ ${flg} -eq 0 ]
do
x=$RANDOM;let "x %= FILECNT";n="${IMGS[${x}]}";if [ ${DUPLICATE} -eq 0 ];then unset IMGS[${x}];fi
if [ "$n" != "" ]
then
if [ "$n" != "$prev" ]
then
flg=1;
fi
fi
done
prev="$n"
PIC="${PIC},${n}"
let "cnt--"
done
PIC=`echo "${PIC}"|sed 's/ /\\\\ /g'`
eval "dbus-send --type=method_call --dest=org.freedesktop.compiz /org/freedesktop/compiz/wallpaper/screen${SCREEN}/bg_image org.freedesktop.compiz.set ${PIC} > /dev/null 2>&1"
這個小程式稍稍修改一下之後可以變成隨機變換skydome的程式,不過我沒有這個需求,所以有需要的話自已改吧
在此只稍微的提一下兩個DBUS的操作 (screen0請自行代換成正確的screen,不過一般來說正是screen0 囧)
取得目前的skydome圖檔
- 代碼: 選擇全部
dbus-send --print-reply --type=method_call --dest=org.freedesktop.compiz /org/freedesktop/compiz/cube/screen0/skydome_image org.freedesktop.compiz.get|grep string|sed 's/string//'|sed 's/"//g'| sed -r 's/^[ \t]+//'
設定skydome圖檔
- 代碼: 選擇全部
dbus-send --type=method_call --dest=org.freedesktop.compiz /org/freedesktop/compiz/cube/screen0/skydome_image org.freedesktop.compiz.set string:/path/to/image
附上效果
四個桌面兩張桌布
四張桌布以上