cinnamon-settings module
測試環境
- 「Linux Mint 17 “Qiana” Cinnamon」
- 「Cinnamon 2.2.16」
緣起
在研究「clock@cinnamon.org」這個「Desklet」的時候
發現了一個 cinnamon-settings 的用法。
那就是可以執行下面的指令,就可以直接進到「System Settings / Preferences / Date & Time」這個設定畫面
1 | $ cinnamon-settings calendar |
也就是說執行下面的指令就會進到「System Settings」這個主畫面
1 | $ cinnamon-settings |
先離題一下,先整理一下一些檔案放置的路徑,和對應的指令
我在這篇討論已經有簡單整理了,再重新整理一下。
個人資料夾
- 「System Settings / Appearance / Themes 」<=> 「~/.themes」
- 「System Settings / Preferences / Applets」 <=> 「~/.local/share/cinnamon/applets」
- 「System Settings / Preferences / Desklets」<=> 「~/.local/share/cinnamon/desklets」
- 「System Settings / Preferences / Extensions」<=> 「~/.local/share/cinnamon/extensions」
系統資料夾
- 「System Settings / Appearance / Themes 」<=> 「/usr/share/themes」
- 「System Settings / Preferences / Applets」 <=> 「/usr/share/cinnamon/applets」
- 「System Settings / Preferences / Desklets」<=> 「/usr/share/cinnamon/desklets」
- 「System Settings / Preferences / Extensions」<=> 「無」
啟動設定視窗指令
- 「System Settings / Appearance / Themes 」<=> 「$ cinnamon-settings themes」
- 「System Settings / Preferences / Applets」 <=> 「$ cinnamon-settings applets」
- 「System Settings / Preferences / Desklets」<=> 「$ cinnamon-settings desklets」
- 「System Settings / Preferences / Extensions」<=> 「$ cinnamon-settings extensions」
探尋過程
進到「System Settings / Preferences / Desklets」<=> 「$ cinnamon-settings desklets」
你會看三筆資料,有特別的圖示(鎖頭)標記鎖住的狀態,滑鼠游標移到那個圖示,就會顯示「提示說明」-「Thies desklet is read-only, and cannot be uninstalled」。他是cinnamon預設提供的,所以會放在「全域」的「Desklets」資料夾,也就是「/usr/share/cinnamon/desklets/」
- 「Clock desklet」 <=> 「/usr/share/cinnamon/desklets/clock@cinnamon.org」
- 「Digital photo frame」 <=> 「/usr/share/cinnamon/desklets/photoframe@cinnamon.org」
- 「Launcher desklet」 <=> 「/usr/share/cinnamon/desklets/launcher@cinnamon.org」
而我裝了「Clock desklet」這個「Desklet」,就會顯示在桌面上,一個數字的時鐘。
可以將滑鼠游標移到時鐘,按下滑鼠右鍵,就會出現一個「選單」讓你選。
有三個選項。
- Date and Time Settings
- Configure
- Remove this desklet
選擇按下「Date and Time Settings」就會出現「Date & Time」這個設定視窗,也就是「System Settings / Preferences / Date & Time」這個設定畫面。
而我一開始,就是想要了解,這個選單怎麼產生的,按下那個選項,如何binding那個event。想要了解哪個語法。
所以就觀看「/usr/share/cinnamon/desklets/clock@cinnamon.org/desklet.js」這個檔。
1 | $ vi /usr/share/cinnamon/desklets/clock@cinnamon.org/desklet.js |
用「Date and Time Settings」就會看到一行
1 | this._menu.addSettingsAction(_("Date and Time Settings"), "calendar") |
這時候就要先到「MyDesklet」繼承的「Desklet」去找「this._menu」,基本上「_menu」應該是個物件。「Desklet」的檔案是這個路徑「/usr/share/cinnamon/js/ui/desklet.js 」
1 | $ vi /usr/share/cinnamon/js/ui/desklet.js |
查詢「this._menu」,就會看到下面這一行。
1 | this._menu = new PopupMenu.PopupMenu(this.actor, 0.0, St.Side.LEFT, 0); |
根據cinnamon有條理的命名規則和檔案放法,很容易就可以猜到「PopupMenu」的檔案路徑在「/usr/share/cinnamon/js/ui/popupMenu.js 」
1 | $ vi /usr/share/cinnamon/js/ui/popupMenu.js |
然後用「addSettingsAction」來查詢,就可以找到下面的程式碼
1 | addSettingsAction: function(title, module) { |
主意就是這一行,1
Util.spawnCommandLine("cinnamon-settings " + module);
加上上面提的
1 | this._menu.addSettingsAction(_("Date and Time Settings"), "calendar") |
就是本篇提到的主題摟
1 | cinnamon-settings calendar |
文件?
$ man cinnamon-settings # 文件很簡單,並沒有提到這個用法。
我尚未認真的去找網路上相關的文件
只有在寫這份文件的過程,有找到一篇「Arch Linux Wiki / Cinnamon」有紀錄這個「用法」
不過我是從下面探索「cinnamon」套件的過程,去了解個大概。
探索套件
查詢「/usr/bin/cinnamon-settings」是屬於哪個套件
1 | $ dpkg -S /usr/bin/cinnamon-settings |
是屬於「cinnamon」這個套件。
1 | cinnamon: /usr/bin/cinnamon-settings |
準備等會要工作的資料夾
1 | mkdir ~/tmp/cinnamon -p |
探索「Source Package」
執行「apt-get source cinnamon」這個指令前,記得參考我「這篇」提的前置作業
1 | cd ~/tmp/cinnamon/source |
觀看「Control」檔
1 | $ vi cinnamon-2.2.16/debian/control |
知道這個「Source Package」分成三個「Package」。
- cinnamon
- cinnamon-dbg
- cinnamon-common
關於「Source Package」的探索,請自行研究吧,由於目前比較想要了解「Package: cinnamon」裝了那些檔案在系統上,觀看「Package」的資料夾結構,比較能對應到「/」的路徑。「Source Package」的放法是不太一樣的。
探索「Package」
下載「Package」並解開1
2
3
4
5cd ~/tmp/cinnamon/download
apt-get download cinnamon
dpkg -x cinnamon_2.2.16_amd64.deb cinnamon
dpkg -e cinnamon_2.2.16_amd64.deb
# ar xf cinnamon_2.2.16_amd64.deb
觀看「cinnamon/usr/bin/」有哪些執行檔
1 | ls cinnamon/usr/bin/ -1 |
看到的如下
1 | cinnamon |
觀看「cinnamon/usr/bin/cinnamon-settings」 ,從這個檔,應該就可以推敲出一些東西來。
1 | $ vi cinnamon/usr/bin/cinnamon-settings |
例如這一行
1 | if os.path.exists("/usr/lib/cinnamon-settings/modules/cs_%s.py" % module): |
觀看「cinnamon/usr/lib/cinnamon-settings/modules/」
1 | ls cinnamon/usr/lib/cinnamon-settings/modules/ -1 |
注意上面這個資料夾對應到系統上是「/usr/lib/cinnamon-settings/modules/」。所以下面的指令,和上面的指令結果是一樣的。
1 | ls /usr/lib/cinnamon-settings/modules/ |
就可以看到很多「cs_」開頭的「python檔」
1 | cs_applets.py |
用猜的大概就知道,有這些模組。所以我們就可以執行下面的指令。有興趣深究怎實作,就自行研究程式碼吧。
1 | $ cinnamon-settings applets |
再來就是「cinnamon/usr/bin/cinnamon-settings」這個檔,裡面有下面這一行
1 | os.execvp("/usr/lib/cinnamon-settings/cinnamon-settings.py", ("",) + tuple(sys.argv[1:])) |
就可以直接觀看系統「/usr/lib/cinnamon-settings/cinnamon-settings.py」這個檔,就不觀看套件裡面的了,基本上是一樣的。
1 | $ vi /usr/lib/cinnamon-settings/cinnamon-settings.py |
你看到有一段「STANDALONE_MODULES」。那裡有一行如下,就是我「上一篇」提到的「mintsources」,我也是從這裡發現的。其他的就請舉一反1000摟,呵呵。
1 | [_("Software Sources"), "mintsources", "cs-sources", "admin", _("ppa, repository, package, source, download")], |
再來有兩行比較特別的
1 | sys.path.append('/usr/lib/cinnamon-settings/modules') |
「/usr/lib/cinnamon-settings/modules」這個就是我們剛剛提到「cinnamon-settings」模組放置的路徑。
然後觀看「/usr/lib/cinnamon-settings/bin」有那些檔。
1 | $ ls cinnamon/usr/lib/cinnamon-settings/bin -1 |
我這裡是觀看套件的「cinnamon/usr/lib/cinnamon-settings/bin」,因為我不想要出現「.pyc」。
當然也可以這樣下「ls /usr/lib/cinnamon-settings/bin -1 | grep .py$」,但不會出現「xlet-settings.ui」。
1 | capi.py |
在「/usr/lib/cinnamon-settings/cinnamon-settings.py」,有一行
1 | import SettingsWidgets |
「SettingsWidgets」就可對應到「/usr/lib/cinnamon-settings/bin/SettingsWidgets.py
」這個檔
以上只是舉例,探索的方法,詳細的就自己慢慢探索吧,把「程式碼當地圖」…呵呵…本來是要說把「程式碼當文件」:-P
從「/usr/share/applications/cinnamon-settings-*.desktop」找到相關的用法。
基本上,在開示功能表,也就是「Menu / Preferences / 」裡面也可以直接執行,
不然就是在Menu的Filetr輸入關鍵字,就可以找到該選項來執行。
例如
執行「Menu / Preferences / Fonts」,
或是查找「Fonts」,就會出現一個兩個選項「Fonts」和「Font Viewer」,只要執行「Fonts」那個就行了。
等同下指令的方式1
$ cinnamon-settings fonts
理論上,那些選項都是寫在「/usr/share/applications/」裡
1 | $ ls /usr/share/applications/ -1 | grep cinnamon-settings |
1 | cinnamon-settings-applets.desktop |
上面「fonts」的範例
1 | $ cat /usr/share/applications/cinnamon-settings-fonts.desktop | grep Exec= |
就會看到這個用法了
1 | Exec=cinnamon-settings fonts |
查看一下「cinnamon-settings-fonts.desktop 」是屬於哪個套件
執行
1 | $ dpkg -S cinnamon-settings-fonts.desktop |
或是
1 | $ dpkg -S /usr/share/applications/cinnamon-settings-fonts.desktop |
也是「cinnamon」這個套件。1
cinnamon: /usr/share/applications/cinnamon-settings-fonts.desktop
回到原來下載的套件,查看一下1
2cd ~/tmp/cinnamon/download
ls cinnamon/usr/share/applications/ -1
就會看到下面的檔案。
1 | cinnamon2d.desktop |
TODO
要來研究Desklet放置「cinnamon-settings」模組的地方。這裡指的是自訂的。
一開始提到的「calendar」放置的路徑是「/usr/lib/cinnamon-settings/modules/cs_calendar.py」。是「cinnamon」內建提供的。