cinnamon-settings module

測試環境

緣起

在研究「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
2
3
4
5
6
addSettingsAction: function(title, module) {
let menuItem = this.addAction(title, function() {
Util.spawnCommandLine("cinnamon-settings " + module);
});
return menuItem;
},

主意就是這一行,

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
2
3
mkdir ~/tmp/cinnamon -p
cd ~/tmp/cinnamon
mkdir source download

探索「Source Package」

執行「apt-get source cinnamon」這個指令前,記得參考我「這篇」提的前置作業

1
2
cd ~/tmp/cinnamon/source
apt-get source cinnamon

觀看「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
5
cd ~/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
2
3
4
5
6
7
8
9
10
11
12
13
cinnamon
cinnamon2d
cinnamon-desktop-editor
cinnamon-extension-tool
cinnamon-json-makepot
cinnamon-launcher
cinnamon-looking-glass
cinnamon-menu-editor
cinnamon-screensaver-lock-dialog
cinnamon-session-cinnamon
cinnamon-session-cinnamon2d
cinnamon-settings
cinnamon-settings-users

觀看「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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
cs_applets.py
cs_backgrounds.py
cs_calendar.py
cs_default.py
cs_desklets.py
cs_desktop.py
cs_effects.py
cs_extensions.py
cs_fonts.py
cs_general.py
cs_hotcorner.py
cs_info.py
cs_keyboard.py
cs_mouse.py
cs_panel.py
cs_power.py
cs_screensaver.py
cs_themes.py
cs_tiling.py
cs_user.py
cs_windows.py
cs_workspaces.py

用猜的大概就知道,有這些模組。所以我們就可以執行下面的指令。有興趣深究怎實作,就自行研究程式碼吧。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ cinnamon-settings applets
$ cinnamon-settings backgrounds
$ cinnamon-settings calendar
$ cinnamon-settings default
$ cinnamon-settings desklets
$ cinnamon-settings desktop
$ cinnamon-settings effects
$ cinnamon-settings extensions
$ cinnamon-settings fonts
$ cinnamon-settings general
$ cinnamon-settings hotcorner
$ cinnamon-settings info
$ cinnamon-settings keyboard
$ cinnamon-settings mouse
$ cinnamon-settings panel
$ cinnamon-settings power
$ cinnamon-settings screensaver
$ cinnamon-settings themes
$ cinnamon-settings tiling
$ cinnamon-settings user
$ cinnamon-settings windows
$ cinnamon-settings workspaces

再來就是「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
2
sys.path.append('/usr/lib/cinnamon-settings/modules')
sys.path.append('/usr/lib/cinnamon-settings/bin')

/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
2
3
4
5
6
7
8
9
10
11
capi.py
ExtensionCore.py
eyedropper.py
imtools.py
installSchema.py
removeSchema.py
SettingsWidgets.py
Spices.py
XletSettings.py
xlet-settings.ui
XletSettingsWidgets.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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
cinnamon-settings-applets.desktop
cinnamon-settings-backgrounds.desktop
cinnamon-settings-calendar.desktop
cinnamon-settings-daemon.desktop
cinnamon-settings-default.desktop
cinnamon-settings-desklets.desktop
cinnamon-settings.desktop
cinnamon-settings-desktop.desktop
cinnamon-settings-effects.desktop
cinnamon-settings-extensions.desktop
cinnamon-settings-fonts.desktop
cinnamon-settings-general.desktop
cinnamon-settings-hotcorner.desktop
cinnamon-settings-info.desktop
cinnamon-settings-keyboard.desktop
cinnamon-settings-mouse.desktop
cinnamon-settings-panel.desktop
cinnamon-settings-power.desktop
cinnamon-settings-screensaver.desktop
cinnamon-settings-themes.desktop
cinnamon-settings-tiling.desktop
cinnamon-settings-user.desktop
cinnamon-settings-users.desktop
cinnamon-settings-windows.desktop
cinnamon-settings-workspaces.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
2
cd ~/tmp/cinnamon/download
ls cinnamon/usr/share/applications/ -1

就會看到下面的檔案。

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
cinnamon2d.desktop
cinnamon.desktop
cinnamon-menu-editor.desktop
cinnamon-settings-applets.desktop
cinnamon-settings-backgrounds.desktop
cinnamon-settings-calendar.desktop
cinnamon-settings-default.desktop
cinnamon-settings-desklets.desktop
cinnamon-settings.desktop
cinnamon-settings-desktop.desktop
cinnamon-settings-effects.desktop
cinnamon-settings-extensions.desktop
cinnamon-settings-fonts.desktop
cinnamon-settings-general.desktop
cinnamon-settings-hotcorner.desktop
cinnamon-settings-info.desktop
cinnamon-settings-keyboard.desktop
cinnamon-settings-mouse.desktop
cinnamon-settings-panel.desktop
cinnamon-settings-power.desktop
cinnamon-settings-screensaver.desktop
cinnamon-settings-themes.desktop
cinnamon-settings-tiling.desktop
cinnamon-settings-user.desktop
cinnamon-settings-users.desktop
cinnamon-settings-windows.desktop
cinnamon-settings-workspaces.desktop

TODO

要來研究Desklet放置「cinnamon-settings」模組的地方。這裡指的是自訂的。
一開始提到的「calendar」放置的路徑是「/usr/lib/cinnamon-settings/modules/cs_calendar.py」。是「cinnamon」內建提供的。