顯示具有 3D desktop 標籤的文章。 顯示所有文章
顯示具有 3D desktop 標籤的文章。 顯示所有文章

星期六, 2月 02, 2008

使用 wmctrl 來旋轉 compiz 的桌面方塊


Compiz 或 Compiz-Fusion 的 Cube plugin 是個相當有趣的特效 plugin,透過 Cube 以及 Rotate plugin,桌面可以虛擬成一個立體方塊,方塊四周的4個面變成 4 個虛擬桌面,這個我在『我也來貼圖 - Linux 的 3D 桌面』中有提過。旋轉立體方塊可以透過設定好的滑鼠或者鍵盤快速鍵來達成,這在一般的使用狀態下已經足夠了,但假設想要寫 script 來控制時,那該怎麼做呢?

要使用 script 來控制 Cube 的旋轉,方法其實很多,例如透過 Compiz 提供的 DBus 物件來達成。除此之外,方便好用的 wmctrl 雖然沒有直接支援 Cube 的旋轉,但透過一些分析,其實還是可以用 wmctrl 間接控制 Cube 的旋轉。


為了能夠用 wmctrl 控制 Cube 的旋轉,首先我們必須先看看到底 Compiz 是怎麼處理 Cube 的。以我的系統為例,我使用 Ubuntu 7.10 中的 Compiz-Fusion,螢幕解析度設定為 1024×768,先看看在 Cube 的第一個面時,使用 "wmctrl -d" 會看到怎樣的訊息:

$ wmctrl -d
0 * DG: 4096x768 VP: 0,0 WA: 0,25 1024x718 N/A

wmctrl -d 輸出的資訊裡,"DG" 是桌面大小 (Desktop Geometry),"VP" 是 Viewport 座標 (Viewport Position),WA 則是工作區域 (WorkArea) 的座標及大小,最後則是 Desktop 的名稱。從上面的資訊看起來,Compiz 實際的 Cube 實際上只有管理一個寬度很寬的 Desktop 而已,那我們看到的各個面到底是怎麼回事呢?為了搞清楚狀況,將 Cube 向右旋轉到第二面以後,再次以 wmctrl 來看看 Desktop 資訊:

$ wmctrl -d
0 * DG: 4096x768 VP: 1024,0 WA: 0,25 1024x718 N/A

發現了嗎?切換到不同面時,wmctrl -d 顯示的資訊裡,唯一改變的是 Viewport 的位置!換句話說,Compiz 的 Cube 實際上只有管理一個很寬的桌面,然後各個面其實只是不同的 Viewport 而已!這也解釋了為何應用程式視窗可以跨過兩個相鄰面的邊界了!既然知道 Compiz 實際上是這樣管理 Cube 的,那要用 wmctrl 來達成 Cube 的旋轉,其實就只是使用 wmctrl 來切換 Viewport 位置即可!

我寫了個簡單的 BASH script 來做這件事情:

#!/bin/bash
#
# compiz-rotate-wmctrl - Rotate the cube using wmctrl
#
# Author: Shang-Feng Yang
# Released under GPLv3

VER="1.0"


function rotate() {
  # The target face number (begins with 0)
  TVPN=$(( $1 % ${NF} ))

  # The X coordinate of the target viewport
  TVPX=$(( ${TVPN} * ${WW} ))

  # Change to the target viewport
  wmctrl -o ${TVPX},0
}

function usage() {
  echo -e "$(basename $0) v${VER}\n"
  echo -e "Usage:\n"
  echo -e "\t$(basename $0) {left|right|#}\n"
  echo -e "\tWhere:\n"
  echo -e "\t\tleft - rotate the cube to the left"
  echo -e "\t\tright - rotate the cube to the right"
  echo -e "\t\t# - rotate to #th face (begins with 0)\n\n"
  echo -e "Author: Shang-Feng Yang <storm dot sfyang at gmail dot com>"
  echo -e "Released under GPLv3"
}

# The action to be performed. $ACT could be 'left' or 'right' to rotate
# left or right, accordingly. $ACT could also be the number of the face
# to rotate into.
ACT=$(echo $1 |tr '[A-Z]' '[a-z]')

[ "x$ACT" == "x" ] && { usage; exit 1; } || {
  case $ACT in
    left|right|[0-9]|[0-9][0-9])
      ;;
    *)
      usage
      exit 1
      ;;
  esac
}


# The informations about the desktop
INFO=$(wmctrl -d)
# The width of the desktop
DW=$(echo "${INFO}"| awk '{sub(/x[0-9]+/, "", $4); print $4}')
# The width of the workarea
WW=$(echo "${INFO}"| awk '{sub(/x[0-9]+/, "", $9); print $9}')
# The number of faces on the cube
NF=$(($DW/$WW))
# The X coordinate of the viewport
CVPX=$(echo "${INFO}" |awk '{sub(/,[0-9]+/, "", $6); print $6}')
# Current number of the face in all faces (begins with 0)
CVPN=$(( ${CVPX} / ${WW} ))

[ "$ACT" == "right" ] && {
  ACT=$(( ${CVPN} + 1 ))
} || {
  [ "$ACT" == "left" ] && {
    ACT=$(( ${CVPN} - 1 ))
  }
}

rotate ${ACT}


使用方式如下:

  • 不給任何參數,或者參數給錯時時,會顯示簡單的使用說明:

    $ compiz-rotate-wmctrl
    compiz-rotate-wmctrl v1.0

    Usage:

    compiz-rotate-wmctrl {left|right|#}

    Where:

    left - rotate the cube to the left
    right - rotate the cube to the right
    # - rotate to #th face (begins with 0)


    Author: Shang-Feng Yang <storm dot sfyang at gmail dot com>
    Released under GPLv3


  • 使用 left 將 Cube 向左旋轉一個面:

    $ compiz-rotate-wmctrl left


  • 使用 right 將 Cube 向右旋轉一個面:

    $ compiz-rotate-wmctrl right


  • 直接給定某個面的編號時,會直接旋轉至該面,編號由 0 開始:

    $ compiz-rotate-wmctrl 3




這樣的 script 可以用在什麼地方呢?通常是用在一些特殊場合,例如透過非正規方式控制電腦時,像是透過網路遙控,或者使用觸控螢幕時,使用 script 會比較方便。

繼續閱讀全文

星期五, 6月 08, 2007

我也來貼圖 - Linux 的 3D 桌面

上週的某一天,總算下定決心,把我帶來美國的筆記型電腦中,用了兩年多,從 Mandrake 10.0 一路修改升級,到後來因為很多原因而運作不順暢的 Mandriva Cooker,給換成 Ubuntu Linux在這之前,雖然為了嘗鮮,已經自己忍不住試過許多次,在我的機器上嘗試驅動 XGLAIGLX 等新的 X Window 3D 加速架構,但因為我的機器的顯示晶片是 ATi Radeon Mobility 7500,而該晶片只有 Open Source 的 driver 可以用,但該 driver 在要滿足 XGL/AIGLX 所需的 OpenGL extension 上,一直略有不足,導致往往無法完全正常運作。此外,自己手工打造能使用 XGL/AIGLX 環境的 X Window 系統,是一件十分繁重的工作,雖然後來 Mandriva 宣佈會支援 XGL/AIGLX,而 Cooker 中也已經有相關的套件了,但實際試用的結果,比我自己手工打造的系統看慘。

沒想到等了一年多以後,Ubuntu 7.04 的表現讓我眼睛為之一亮。Ubuntu 的安裝方式與我之前較熟悉的 Red Hat Linux 為基礎的系統(例如 Red Hat Linux、Fedora Core、Mandrake/Mandriva 等等)不太一樣,安裝光碟本身就是一片 LiveCD,安裝過程也算是相當順暢。安裝完成之後,只需要安裝 CompizBeryl 相關的套件,XGL/AIGLX 所帶來的好處,以及 Compiz/Beryl 的各種特效 plugin 的效果,幾乎都可以有效運作在我的機器上。雖然部分特效,如雨滴特效等等,因為某個 OpenGL extension 支援的不足,導致無法使用,而且因為 ATi Radeon Mobility 7500 的 3D 運算功能沒有時下最新晶片來得強悍,但也已經堪用。Beryl 豐富的 plugin,以及所提供的靈活設定,讓 Beryl 本身不單純只是提供 eye candy 而已,同時也提高的整個圖形介面的可用性。唯一的缺點是,應該是因為內建的顯示記憶體的空間比較小,且顯示晶片的計算能力比較差,所以螢幕解析度最高只能到達 1024×768,而我的螢幕本身最高可以達到 1400×1050,但一但使用高於 1024×768 以上的解析度時,不論是 Compiz 或 Beryl,都無法正確啟動。我倒是還沒測試過 Metacity 的特效功能,而且也還不確定 Ubuntu 的 Metacity 是否已經是內建 composite manager 的新版本,下次有空再試試看好了。

標題既然提到要貼圖,當然不能免俗的,來貼一下大家都有的 cube plugin 的圖:
從圖上可以看到,視窗並不是平貼在 cube 上,而是立體的浮在 cube 表面,那是所謂的 3D Window 的效果。此外,下面則是所謂的視窗預覽功能,該功能在 Windows Vista 中也有:
從圖中可以看到,該縮圖是即時影像,與視窗的內容是一樣的。事實上,即使視窗是最小化,但該功能產生的預覽縮圖也還是視窗正常狀態時的內容。再來則是視窗透明化的特效:
最上層被透明化的視窗是 GNOME terminal,可以看到下面的 GNOME 字典程式,以及最底層的 PCManX。該透明化的效果可以自己調整透明度。然後是 Switcher 視窗切換器的特效:
視窗切換時的縮圖也是即時影像,換句話說,視窗也任何變化,會立即反應在縮圖上,這樣可以讓我在不需要真的把某個視窗切換到前景的狀態下,知道視窗中程式執行的狀態。此外,切換視窗時,不是只可以切換現在面向螢幕的 cube 或目前虛擬桌面上的程式而已,事實上可以切換至任何一個在 cube 上有視窗的任何程式,相當方便。而切換器提供的切換方式,除了如上圖中最傳統的將視窗橫列在切換器中以外,還可以做到類似 Windows Vista 中的視窗環狀排列的切換方式。不過因為抓圖熱鍵設定的問題,我沒有抓該模式下的圖。最後,當然免不了要貼一張摹仿 Mac OS 的 Expose 功能的視窗排列特效:
同樣的,視窗排列時的視窗縮圖也都是即時影像,且也可以選擇只要排列當前虛擬桌面上的視窗,還是要排列所有執行中程式的視窗。

其實還有種種其他的特效,例如畫面反白功能(藉由反白視窗或整個畫面,暫時提高目前畫面的對比,以方便觀看)、視窗捲軸功能(把視窗『捲』到標題列,只剩下標題列在畫面上)、各種視窗變換特效,以及視窗黏著特效等等,雖然有些比較單純是表現特效而已,但還是有不少功能讓圖形介面變得更好用。有不少特效要用影片來展示會比較清楚,但因為螢幕連續影像捕捉,如果是使用程式來做,之前試過幾次,frame rate 都不夠高;但如果用外部攝影機來拍攝,我又懶得這麼做,所以就先算啦!反正在 YouTube 上可以找到一堆相當棒的展示影片。

我喜歡 Linux + XGL/AIGLX 最重要的一點是,在 Windows Vista 絕對跑不動的硬體上(像我的電腦就絕對無法安裝 Windows Vista,因為光是記憶體就不夠了,我只有 512MB 的記憶體而已),還是可以達到相同程度,甚至更好的 3D 桌面,而且 3D 桌面也不單純只是很炫好看而已,還更進一步的提昇了 X Window 的可用性,加上 Linux 本身的一些特性,實在是讓我愛不釋手啊!

繼續閱讀全文