隨機變換compiz桌布的小script

歡迎提問 debian desktop 相關問題,何謂 desktop ? 舉凡您日常生活會用到的部份,如上網 ( www 、 bbs ..) 、程式設計、繪圖...等等。 通常以 X Window 環境底下問題為主。

隨機變換compiz桌布的小script

文章ronmi » 週五 3月 20, 2009 7:08 pm

nautilus「充滿一致性」的桌布讓我不滿很久了
可是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


附上效果
四個桌面兩張桌布
圖檔

四張桌布以上
圖檔
ronmi
懵懂的國中生
懵懂的國中生
 
文章: 103
註冊時間: 週一 12月 05, 2005 2:31 am
來自: Taiwan

文章ronmi » 週五 3月 27, 2009 1:18 am

放crontab的壞處浮出來了orz
沒有登入的時候就壞掉了
所以另外做了個python的小程式
因為是用glade做的,而且設定又存在gconf裡,所以請先確認有安裝python-gconf、python-glade2及相依的套件
目前在自已的筆電上(ubuntu 8.10+gnome)測試ok
下載0.1preview3 實驗用repo
解壓縮後,執行src裡的gnome.sh即可
其他說明請看readme檔
ronmi
懵懂的國中生
懵懂的國中生
 
文章: 103
註冊時間: 週一 12月 05, 2005 2:31 am
來自: Taiwan

文章ronmi » 週日 4月 05, 2009 8:47 pm

經過幾位朋友幫忙測試,似乎是沒有介面以外的問題了(設定視窗忘了判斷目錄是否重複,不過功能上沒有任何影響),有興趣的朋友應可以安心抓下來用了

tested on Debian lenny/squeeze, Ubuntu/Xubuntu 8.10/9.04
ronmi
懵懂的國中生
懵懂的國中生
 
文章: 103
註冊時間: 週一 12月 05, 2005 2:31 am
來自: Taiwan


回到 debian desktop

誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 1 位訪客