Ubuntu 17.10 推出 [論壇 - Ubuntu 與 GNOME]


正在瀏覽:   1 名遊客


 到底部   前一個主題   下一個主題  [無發表權] 請登錄或者註冊

« 1 ... 3 4 5 (6)


回覆: Ubuntu 17.10 推出
會員五級
註冊日期:
2012/4/22 10:50
所屬群組:
已註冊使用者
等級: 33
HP : 160 / 803
MP : 504 / 13098
EXP: 15
離線
[回到索引]

================================================================================

# 關於「Gio.Settings.bind」

================================================================================

參考上面「#50」最後找到的程式碼片段。

寫了簡單的程式範例,放在「GitHub」上。

寫了三種版本

* gjs (README)
* python (README)
* vala (README)

在「README」裡面有列「API」文件連結。

以上提供參考,給對這部份想要深入探究的人,一個探索的起點。

報告完畢。



================================================================================

[回到索引]

11/12 16:48:38
應用擴展 工具箱
回覆: Ubuntu 17.10 推出
會員五級
註冊日期:
2012/4/22 10:50
所屬群組:
已註冊使用者
等級: 33
HP : 160 / 803
MP : 504 / 13098
EXP: 15
離線
[回到索引]

================================================================================

# 關於在「gnome-shell」環境的「imports.misc.config」

================================================================================

延續「#43」提到的,

繼續來探索「gnome-shell-extension-shortcuts」這個套件。

若系統已經安裝了這個套件,直接執行下面指令


$ dpkg -L gnome-shell-extension-shortcuts



顯示


/.
/usr
/usr/share
/usr/share/doc
/usr/share/doc/gnome-shell-extension-shortcuts
/usr/share/doc/gnome-shell-extension-shortcuts/changelog.Debian.gz
/usr/share/doc/gnome-shell-extension-shortcuts/copyright
/usr/share/gnome-shell
/usr/share/gnome-shell/extensions
/usr/share/gnome-shell/extensions/Shortcuts@kyle.aims.ac.za
/usr/share/gnome-shell/extensions/Shortcuts@kyle.aims.ac.za/convenience.js
/usr/share/gnome-shell/extensions/Shortcuts@kyle.aims.ac.za/extension.js
/usr/share/gnome-shell/extensions/Shortcuts@kyle.aims.ac.za/locale
/usr/share/gnome-shell/extensions/Shortcuts@kyle.aims.ac.za/locale/LINGUAS
/usr/share/gnome-shell/extensions/Shortcuts@kyle.aims.ac.za/locale/Shortcuts.pot
/usr/share/gnome-shell/extensions/Shortcuts@kyle.aims.ac.za/locale/af
/usr/share/gnome-shell/extensions/Shortcuts@kyle.aims.ac.za/locale/af/LC_MESSAGES
/usr/share/gnome-shell/extensions/Shortcuts@kyle.aims.ac.za/locale/af/LC_MESSAGES/af.mo
/usr/share/gnome-shell/extensions/Shortcuts@kyle.aims.ac.za/locale/af/LC_MESSAGES/af.po
/usr/share/gnome-shell/extensions/Shortcuts@kyle.aims.ac.za/metadata.json
/usr/share/gnome-shell/extensions/Shortcuts@kyle.aims.ac.za/prefs.js
/usr/share/gnome-shell/extensions/Shortcuts@kyle.aims.ac.za/schemas
/usr/share/gnome-shell/extensions/Shortcuts@kyle.aims.ac.za/schemas/gschemas.compiled
/usr/share/gnome-shell/extensions/Shortcuts@kyle.aims.ac.za/shortcuts.json
/usr/share/gnome-shell/extensions/Shortcuts@kyle.aims.ac.za/stylesheet.css



這一篇主要是探索「/usr/share/gnome-shell/extensions/Shortcuts@kyle.aims.ac.za/convenience.js」這個檔案。

執行


$ grep 'imports.misc.config' /usr/share/gnome-shell/extensions/Shortcuts@kyle.aims.ac.za/convenience.js -n



顯示


29:const Config = imports.misc.config;



可以看到在「/usr/share/gnome-shell/extensions/Shortcuts@kyle.aims.ac.za/convenience.js」這個檔案的「第29行」,也就是下面的


const Config = imports.misc.config;



================================================================================

接下來,執行下面指令,下載「gnome-shell」的「Source Package: gnome-shell」。


$ apt-get source gnome-shell



會下載下面三個檔案

* gnome-shell_3.26.1-0ubuntu5.debian.tar.xz
* gnome-shell_3.26.1-0ubuntu5.dsc
* gnome-shell_3.26.1.orig.tar.xz

並且解開到「gnome-shell-3.26.1」這個資料夾。

執行上面這個動作的前置作業,請參考「#24」的說明。

================================================================================

接下來從上面「#32」提到的「imports.searchPath」的概念,


所以我們要在「gnome-shell-3.26.1/js」這個資料夾探索。

執行


$ ls gnome-shell-3.26.1/js -1



顯示


extensionPrefs
gdm
js-resources.gresource.xml
meson.build
misc
perf
portalHelper
ui



執行


$ tree gnome-shell-3.26.1/js



上面指令的顯示結果就不貼上來了,請自行測試。

================================================================================

從「imports.misc.config」應該要找「gnome-shell-3.26.1/js/misc/config.js」
不過只有找到「gnome-shell-3.26.1/js/misc/config.js.in」。

執行


$ ls gnome-shell-3.26.1/js/misc/ -1



顯示


config.js.in
desktop.js
extensionUtils.js
fileUtils.js
gnomeSession.js
history.js
ibusManager.js
jsParse.js
keyboardManager.js
loginManager.js
meson.build
modemManager.js
objectManager.js
params.js
permissionStore.js
smartcardManager.js
systemActions.js
util.js
weather.js



執行


$ cat gnome-shell-3.26.1/js/misc/config.js.in



顯示


// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-

/* The name of this package (not localized) */
var PACKAGE_NAME = '@PACKAGE_NAME@';
/* The version of this package */
var PACKAGE_VERSION = '@PACKAGE_VERSION@';
/* 1 if gnome-bluetooth is available, 0 otherwise */
var HAVE_BLUETOOTH = @HAVE_BLUETOOTH@;
/* 1 if networkmanager is available, 0 otherwise */
var HAVE_NETWORKMANAGER = @HAVE_NETWORKMANAGER@;
/* gettext package */
var GETTEXT_PACKAGE = '@GETTEXT_PACKAGE@';
/* locale dir */
var LOCALEDIR = '@datadir@/locale';
/* other standard directories */
var LIBEXECDIR = '@libexecdir@';
var SYSCONFDIR = '@sysconfdir@';
/* g-i package versions */
var LIBMUTTER_API_VERSION = '@LIBMUTTER_API_VERSION@'





================================================================================

執行下面指令,切換到「gnome-shell-3.26.1」


$ cd gnome-shell-3.26.1



接著執行


$ ./configure



就會產生一個資料夾「_build」

執行


$ tree _build



顯示


_build/
├── browser-plugin
├── build.ninja
├── compile_commands.json
├── config.h
├── data
│   ├── gnome-shell-extension-prefs.desktop.in
│   ├── org.gnome.Shell.desktop.in
│   ├── org.gnome.shell.gschema.xml
│   ├── org.gnome.Shell.PortalHelper.desktop.in
│   ├── org.gnome.Shell.PortalHelper.service
│   ├── perf-background.xml
│   └── theme
├── js
│   └── misc
│   └── config.js
├── meson-logs
│   └── meson-log.txt
├── meson-private
│   ├── build.dat
│   ├── cleantrees.dat
│   ├── coredata.dat
│   ├── install.dat
│   ├── meson_benchmark_setup.dat
│   ├── meson_exe_data-to-c.pl_b7f84b8ca40be0b8b120075a9a67db61ea17b95c.dat
│   ├── meson_exe_glib-mkenums_3cb9f3524434b27b11d31be58f44dc91bd7121df.dat
│   ├── meson_exe_glib-mkenums_6e675282a5f60c0cafe324d6505892db3aa85aa8.dat
│   ├── meson_exe_glib-mkenums_6e8470843fbd6b72df3f9e541939c873f0cb67d8.dat
│   ├── meson_exe_glib-mkenums_7f7306fe9dbb32180ab72f9531e79b6b099d2e8d.dat
│   ├── meson_test_setup.dat
│   ├── sanitycheckc.c
│   └── sanitycheckc.exe
├── po
├── src
│   ├── calendar-server
│   │   └── org.gnome.Shell.CalendarServer.service
│   ├── gnome-shell-extension-tool
│   ├── gnome-shell-perf-tool
│   ├── hotplug-sniffer
│   │   └── org.gnome.Shell.HotplugSniffer.service
│   ├── st
│   │   └── st.h
│   └── tray
├── subprojects
│   └── gvc
│   └── config.h
└── tests
└── run-test.sh

16 directories, 31 files



這時候,就可以找到「_build/js/misc/config.js」這個檔案

執行


$ cat _build/js/misc/config.js



顯示


// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-

/* The name of this package (not localized) */
var PACKAGE_NAME = 'gnome-shell';
/* The version of this package */
var PACKAGE_VERSION = '3.26.1';
/* 1 if gnome-bluetooth is available, 0 otherwise */
var HAVE_BLUETOOTH = 1;
/* 1 if networkmanager is available, 0 otherwise */
var HAVE_NETWORKMANAGER = 1;
/* gettext package */
var GETTEXT_PACKAGE = 'gnome-shell';
/* locale dir */
var LOCALEDIR = '/usr/local/share/locale';
/* other standard directories */
var LIBEXECDIR = '/usr/local/bin';
var SYSCONFDIR = '/usr/local/etc';
/* g-i package versions */
var LIBMUTTER_API_VERSION = '1'



================================================================================

接下來就可以在「Gnome Shell / Looking Glass」做一點小實驗。
也可以複習之前「#32」提到的,關於「Looking Glass」的用法。


先在「Evaluator」執行


imports.misc.config



顯示


r(0) = [object GjsModule misc.config]



然後按下「[object GjsModule misc.config]」,會出現例另一個視窗。

顯示


inspecting: object: [object GjsModule misc.config]
GETTEXT_PACKAGE: gnome-shell
HAVE_BLUETOOTH: 1
HAVE_NETWORKMANAGER: 1
LIBEXECDIR: /usr/lib/gnome-shell
LIBMUTTER_API_VERSION: 1
LOCALEDIR: /usr/share/locale
PACKAGE_NAME: gnome-shell
PACKAGE_VERSION: 3.26.1
SYSCONFDIR: /etc




可以注意到一些「值」,跟剛剛「./configure」產生出來的「_build/js/misc/config.js」定義的並不想同。
那是因為我剛剛只有執行「./configure」,後面沒有加一些參數。

可以研究「debian/rules」這個檔案,這個檔案可以視為「Makefile」。

================================================================================

在「Terminal」執行下面指令


$ grep override_dh_auto_configure debian/rules -A 5



顯示


override_dh_auto_configure:
	dh_auto_configure -- \
		--libdir=/usr/lib \
		--libexecdir=/usr/lib/gnome-shell \
		$(CONFFLAGS)




從「debian/rules」這個檔案,可以找到「override_dh_auto_configure」這個「rule」,

所以執行


$ debian/rules override_dh_auto_configure



會顯示


dh_auto_configure -- \
--libdir=/usr/lib \
--libexecdir=/usr/lib/gnome-shell \

./configure --build=x86_64-linux-gnu --prefix=/usr --includedir=\${prefix}/include --mandir=\${prefix}/share/man --infodir=\${prefix}/share/info --sysconfdir=/etc --localstatedir=/var --disable-silent-rules --libdir=\${prefix}/lib/x86_64-linux-gnu --libexecdir=\${prefix}/lib/x86_64-linux-gnu --disable-maintainer-mode --disable-dependency-tracking --libdir=/usr/lib --libexecdir=/usr/lib/gnome-shell
INFO: Ignoring unknown option '--build=x86_64-linux-gnu'
INFO: Ignoring unknown option '--infodir=${prefix}/share/info'
INFO: Ignoring unknown option '--localstatedir=/var'
INFO: Ignoring unknown option '--disable-silent-rules'
INFO: Ignoring unknown option '--disable-maintainer-mode'
INFO: Ignoring unknown option '--disable-dependency-tracking'
Summary:
meson:....... /usr/bin/meson
ninja:....... /usr/bin/ninja
prefix:...... /usr
bindir:...... /usr/bin
sbindir:..... /usr/sbin
libexecdir:.. /usr/lib/gnome-shell
datarootdir:. /usr/share
datadir:..... /usr/share
sysconfdir:.. /etc
libdir:...... /usr/lib
mandir:...... ${prefix}/share/man
includedir:.. ${prefix}/include
additional:..
- -Denable-gtk-doc=false -Denable-man=false
The Meson build system
Version: 0.42.1
...略...



關於「debian/rules」其他的細節,建議可以從「$ man dh」開始探索起。
關於「debian/rules」這部份的細節我也尚未去深究,也偏離本篇我原本要闡述的,所以就不繼續探討了。

================================================================================

接著來看重新產生的「_build/js/misc/config.js」。


$ cat _build/js/misc/config.js



顯示


// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-

/* The name of this package (not localized) */
var PACKAGE_NAME = 'gnome-shell';
/* The version of this package */
var PACKAGE_VERSION = '3.26.1';
/* 1 if gnome-bluetooth is available, 0 otherwise */
var HAVE_BLUETOOTH = 1;
/* 1 if networkmanager is available, 0 otherwise */
var HAVE_NETWORKMANAGER = 1;
/* gettext package */
var GETTEXT_PACKAGE = 'gnome-shell';
/* locale dir */
var LOCALEDIR = '/usr/share/locale';
/* other standard directories */
var LIBEXECDIR = '/usr/lib/gnome-shell';
var SYSCONFDIR = '/etc';
/* g-i package versions */
var LIBMUTTER_API_VERSION = '1'




定義的「值」,跟上面就有一致了。

================================================================================

再回到「Looking Glass / Evaluator」執行

輸入「imports.misc.config.」,然後連續按兩下「Tab」鍵,就會看到一些訊息如下



GETTEXT_PACKAGE, HAVE_BLUETOOTH, HAVE_NETWORKMANAGER, LIBEXECDIR,LIBMUTTER_API_VERSION, LOCALEDIR, PACKAGE_NAME, PACKAGE_VERSION, SYSCONFDIR, __defineGetter__, __defineSetter__, __file__, __lookupGetter__, __lookupSetter__, __moduleName__, __modulePath__, __parentModule__, constructor, hasOwnProperty, isPrototypeOf, propertyIsEnumerable, toLocaleString, toSource, toString, unwatch, valueOf, watch



================================================================================

或是也可以在「Looking Glass / Evaluator」執行


log('imports.misc.config.: ' + JsParse.getCompletions('imports.misc.config.', imports.ui.lookingGlass.commandHeader, AUTO_COMPLETE_GLOBAL_KEYWORDS));



然後在「Terminal」執行下面指令


$ grep 'imports.misc.config.' /var/log/syslog



就可以找到下面這一行


Nov 13 18:13:43 my-host gnome-shell[1024]: imports.misc.config.: GETTEXT_PACKAGE, HAVE_BLUETOOTH, HAVE_NETWORKMANAGER, LIBEXECDIR,LIBMUTTER_API_VERSION, LOCALEDIR, PACKAGE_NAME, PACKAGE_VERSION, SYSCONFDIR, __defineGetter__, __defineSetter__, __file__, __lookupGetter__, __lookupSetter__, __moduleName__, __modulePath__, __parentModule__, constructor, hasOwnProperty, isPrototypeOf, propertyIsEnumerable, toLocaleString, toSource, toString, unwatch, valueOf, watch,



這個技巧,我在「#31」有使用過,也有提到我怎麼找到這個技巧的。

================================================================================

再回到「Looking Glass / Evaluator」執行

就可以分別執行下面的指令

* 「imports.misc.config.PACKAGE_NAME」
* 「imports.misc.config.PACKAGE_VERSION」
* 「imports.misc.config.HAVE_BLUETOOTH」
* 「imports.misc.config.HAVE_NETWORKMANAGER」
* 「imports.misc.config.GETTEXT_PACKAGE」
* 「imports.misc.config.LOCALEDIR」
* 「imports.misc.config.LIBEXECDIR」
* 「imports.misc.config.SYSCONFDIR」
* 「imports.misc.config.LIBMUTTER_API_VERSION」

分別顯示

* 「r(11) = gnome-shell」
* 「r(12) = 3.26.1」
* 「r(13) = 1」
* 「r(14) = 1」
* 「r(15) = gnome-shell」
* 「r(16) = /usr/share/locale」
* 「r(17) = /usr/lib/gnome-shell」
* 「r(18) = /etc」
* 「r(19) = 1」

================================================================================

以上提供參考

報告完畢



================================================================================

[回到索引]

11/13 18:41:05
應用擴展 工具箱
回覆: Ubuntu 17.10 推出
會員五級
註冊日期:
2012/4/22 10:50
所屬群組:
已註冊使用者
等級: 33
HP : 160 / 803
MP : 504 / 13098
EXP: 15
離線
[回到索引]

================================================================================

# 關於在「gnome-shell」環境的「imports.misc.extensionUtils」

================================================================================

延續「#52」,

繼續從「/usr/share/gnome-shell/extensions/Shortcuts@kyle.aims.ac.za/convenience.js」探索起。

執行


$ grep 'ExtensionUtils' /usr/share/gnome-shell/extensions/Shortcuts@kyle.aims.ac.za/convenience.js -n



顯示


30:const ExtensionUtils = imports.misc.extensionUtils;
37:    let extension = ExtensionUtils.getCurrentExtension();
59:    let extension = ExtensionUtils.getCurrentExtension();




可以在「第30行」看到「const ExtensionUtils = imports.misc.extensionUtils;」。


================================================================================

接下來,從「#52」,下載下來的「Source Package: gnome-shell」探索。

探索「gnome-3-26/js」這個資料夾。

從「imports.misc.extensionUtils」對到「gnome-3-26/js/misc/extensionUtils.js」這個檔案。


================================================================================

接下來在「Looking Glass / Evaluator」執行


imports.misc.extensionUtils



顯示


r(0) = [object GjsModule mis.extensionsUtils]



點選「[object GjsModule mis.extensionsUtils]」會跳出另一個視窗,顯示如下


inspecting: object: [object GjsModule misc.extensionUtils]

ExtensionFinder: <js function>
ExtensionType: [object Object]
createExtensionObject: <js function>
extensions: [object Object]
getCurrentExtension: <js function>
installImporter: <js function>
isOutOfDate: <js function>
versionCheck: <js function>



================================================================================

接下來在「Looking Glass / Evaluator

輸入「imports.misc.extensionUtils.」然後連續按下兩次「tab」鍵,顯示如下的訊息


ExtensionFinder , ExtensionType, __defineGetter__, __defineSetter__, __file__, __lookupGetter__, __lookupSetter__, __moduleName__, __modulePath__, __parentModule__, constructor, createExtensionObject, extensions, getCurrentExtension, hasOwnProperty, installImporter,isOutOfDate, isPrototypeOf, propertyIsEnumerable, toLocaleString, toSource, toString, unwatch, valueOf, versionCheck, watch



================================================================================

在「Looking Glass / Evaluator

執行


log('imports.misc.extensionUtils.: ' + JsParse.getCompletions('imports.misc.extensionUtils.', imports.ui.lookingGlass.commandHeader, AUTO_COMPLETE_GLOBAL_KEYWORDS));



可以看到「/var/log/syslog」,有如下的訊息。


Nov 15 10:00:56 my-host gnome-shell[1069]: imports.misc.extensionUtils.: ExtensionFinder , ExtensionType, __defineGetter__, __defineSetter__, __file__, __lookupGetter__, __lookupSetter__, __moduleName__, __modulePath__, __parentModule__, constructor, createExtensionObject, extensions, getCurrentExtension, hasOwnProperty, installImporter,isOutOfDate, isPrototypeOf, propertyIsEnumerable, toLocaleString, toSource, toString, unwatch, valueOf, versionCheck, watch,



================================================================================

在「Looking Glass / Evaluator

執行「imports.misc.extensionUtils.__file__」

顯示


r(2) = resource:///org/gnome/shell/misc/extensionUtils.js



執行「imports.misc.extensionUtils.__moduleName__」

顯示


r(3) = extensionUtils




執行「imports.misc.extensionUtils.__modulePath__」

顯示


r(4) = misc.extensionUtils



執行「imports.misc.extensionUtils.__parentModule__.__modulePath__」

顯示


r(5) = misc



================================================================================

在「Looking Glass / Evaluator

執行


imports.misc.extensionUtils.getCurrentExtension()



顯示


r(6) = null



因為目前在「Looking Glass / Evaluator」執行

所以的到結果是「null」。

================================================================================

然而在「misc.extensionUtils」這個模組,有一個「extensions」,存放著「Extension」的紀錄。


$ grep 'var extensions' gnome-shell-3.26.1/js/misc/extensionUtils.js -B 1 -n



顯示


19-// Maps uuid -> metadata object
20:var extensions = {};



在「Looking Glass / Evaluator

執行


imports.misc.extensionUtils.extensions



顯示


r(7) = [objcet Object]



點選「[objcet Object]」,會跳出另一個視窗,顯示訊息如下


inspecting: object: [objct Object]

Shortcuts@kyle.aims.ac.za: [objct Object]
TaskBar@zpydr: [objct Object]
TilixDropdown@ivkuzev@gmail.com: [objct Object]
alternate-tab@gnome-shell-extensions.gcampax.github.com: [objct Object]
apps-menu@gnome-shell-extensions.gcampax.github.com: [objct Object]
auto-move-windows@gnome-shell-extensions.gcampax.github.com: [objct Object]
demo@home: [objct Object]
drive-menu@gnome-shell-extensions.gcampax.github.com: [objct Object]
launch-new-instance@gnome-shell-extensions.gcampax.github.com: [objct Object]
native-window-placement@gnome-shell-extensions.gcampax.github.com: [objct Object]
openweather-extension@jenslody.de: [objct Object]
places-menu@gnome-shell-extensions.gcampax.github.com: [objct Object]
screenshot-window-sizer@gnome-shell-extensions.gcampax.github.com: [objct Object]
system-monitor@paradoxxx.zero.gmail.com: [objct Object]
ubuntu-appindicators@ubuntu.com: [objct Object]
ubuntu-dock@ubuntu.com: [objct Object]
user-theme@gnome-shell-extensions.gcampax.github.com: [objct Object]
window-list@gnome-shell-extensions.gcampax.github.com: [objct Object]
windowsNavigator@gnome-shell-extensions.gcampax.github.com: [objct Object]
workspace-indicator@gnome-shell-extensions.gcampax.github.com: [objct Object]



================================================================================

還記得下面兩個資料夾嗎?

* 「/usr/share/gnome-shell/extensions
* 「~/.local/share/gnome-shell/extensions

在「Terminal」 執行


$ ls /usr/share/gnome-shell/extensions/ -1



顯示


alternate-tab@gnome-shell-extensions.gcampax.github.com
apps-menu@gnome-shell-extensions.gcampax.github.com
auto-move-windows@gnome-shell-extensions.gcampax.github.com
drive-menu@gnome-shell-extensions.gcampax.github.com
launch-new-instance@gnome-shell-extensions.gcampax.github.com
native-window-placement@gnome-shell-extensions.gcampax.github.com
openweather-extension@jenslody.de
places-menu@gnome-shell-extensions.gcampax.github.com
screenshot-window-sizer@gnome-shell-extensions.gcampax.github.com
Shortcuts@kyle.aims.ac.za
system-monitor@paradoxxx.zero.gmail.com
TaskBar@zpydr
TilixDropdown@ivkuzev@gmail.com
ubuntu-appindicators@ubuntu.com
ubuntu-dock@ubuntu.com
user-theme@gnome-shell-extensions.gcampax.github.com
window-list@gnome-shell-extensions.gcampax.github.com
windowsNavigator@gnome-shell-extensions.gcampax.github.com
workspace-indicator@gnome-shell-extensions.gcampax.github.com



執行


$ ls ~/.local/share/gnome-shell/extensions/ -1



顯示


demo@home



關於「demo@home」是我在「#33」提到的範例。

================================================================================

接著在「gnome-3-26/js/misc/extensionUtils.js」這個檔案,
可以看到「function createExtensionObject」最下方有一段程式碼

執行


$ grep 'let extension = {};' gnome-shell-3.26.1/js/misc/extensionUtils.js -A 12



顯示


let extension = {};

extension.metadata = meta;
extension.uuid = meta.uuid;
extension.type = type;
extension.dir = dir;
extension.path = dir.get_path();
extension.error = '';
extension.hasPrefs = dir.get_child('prefs.js').query_exists(null);

extensions[uuid] = extension;

return extension;




================================================================================

接下來以「Shortcuts@kyle.aims.ac.za」這個「Extension」為例,也就是來自「gnome-shell-extension-shortcuts」這個套件。


從上面得到的屬性,可以在「Looking Glass / Evaluator」分別執行下面的指令

* 「imports.misc.extensionUtils.extensions['Shortcuts@kyle.aims.ac.za'].metadata」
* 「imports.misc.extensionUtils.extensions['Shortcuts@kyle.aims.ac.za'].uuid」
* 「imports.misc.extensionUtils.extensions['Shortcuts@kyle.aims.ac.za'].type」
* 「imports.misc.extensionUtils.extensions['Shortcuts@kyle.aims.ac.za'].dir」
* 「imports.misc.extensionUtils.extensions['Shortcuts@kyle.aims.ac.za'].path」
* 「imports.misc.extensionUtils.extensions['Shortcuts@kyle.aims.ac.za'].error」
* 「imports.misc.extensionUtils.extensions['Shortcuts@kyle.aims.ac.za'].hasPrefs」

分別會顯示

* 「r(11) = [object Object]」
* 「r(12) = Shortcuts@kyle.aims.ac.za」
* 「r(13) = 1」
* 「r(14) = [object instance proxy GType:GLocalFile jsobj@0x7fa0c89856d0 native@0x562a3026d8a0]」
* 「r(15) = /usr/share/gnome-shell/extensions/Shortcuts@kyle.aims.ac.za」
* 「r(16) =」
* 「r(17) = true」

================================================================================

上面「imports.misc.extensionUtils.extensions['Shortcuts@kyle.aims.ac.za'].dir」,
這個「dir」的「type」是「Gio.File

執行


Object.prototype.toString.call(imports.misc.extensionUtils.extensions['Shortcuts@kyle.aims.ac.za'].dir)



顯示


r(21) = [object GObject_object]



關於「Object.prototype.toString.call」是從「MDN / Javascript / typeof」看到的。

再來執行


(imports.misc.extensionUtils.extensions['Shortcuts@kyle.aims.ac.za'].dir instanceof )



顯示


r(22) = true



關於「instanceof」,可以參考「MDN / Javascript / instanceof」。

這個「dir」,其實就是等同於「imports.gi.Gio.File.new_for_path('/usr/share/gnome-shell/extensions/Shortcuts@kyle.aims.ac.za')」

可以在「Looking Glass / Evaluator

執行


dir = imports.gi.Gio.File.new_for_path('/usr/share/gnome-shell/extensions/Shortcuts@kyle.aims.ac.za')



顯示


r(23) = [object instance proxy GType:GLocalFile jsobj@x7fa0bea4f760 native@0x562a3bd0cb00]



執行


dir.get_path()



顯示


r(24) = /usr/share/gnome-shell/extensions/Shortcuts@kyle.aims.ac.za




================================================================================

要了解這個,可以在「gnome-3-26/js/misc/extensionUtils.js」這個檔案,
找到「ExtensionFinder / scanExtensions」這個「function (methond)」的實作。

在「Terminal」執行


$ grep 'scanExtensions: function()' gnome-shell-3.26.1/js/misc/extensionUtils.js -A 3 -n



顯示


187:    scanExtensions: function() {
188-        let perUserDir = Gio.File.new_for_path(global.userdatadir);
189-        FileUtils.collectFromDatadirs('extensions', true, Lang.bind(this, this._loadExtension, perUserDir));
190-    }




接下來在「gnome-3-26/js/misc/fileUtils.js」這個檔案,
觀看「function collectFromDatadirs」的實作。

在「Terminal」執行


$ grep 'function collectFromDatadirs' gnome-shell-3.26.1/js/misc/fileUtils.js -A 23 -B 1 -n



顯示


7-
8:function collectFromDatadirs(subdir, includeUserDir, processFile) {
9-    let dataDirs = GLib.get_system_data_dirs();
10-    if (includeUserDir)
11-        dataDirs.unshift(GLib.get_user_data_dir());
12-
13-    for (let i = 0; i < dataDirs.length; i++) {
14-        let path = GLib.build_filenamev([dataDirs[i], 'gnome-shell', subdir]);
15-        let dir = Gio.File.new_for_path(path);
16-
17-        let fileEnum;
18-        try {
19-            fileEnum = dir.enumerate_children('standard::name,standard::type',
20-                                              Gio.FileQueryInfoFlags.NONE, null);
21-        } catch (e) {
22-            fileEnum = null;
23-        }
24-        if (fileEnum != null) {
25-            let info;
26-            while ((info = fileEnum.next_file(null)))
27-                processFile(fileEnum.get_child(info), info);
28-        }
29-    }
30-}
31-




然後「ExtensionFinder / scanExtensions」,在何處被呼叫,
可以在「gnome-3-26/js/ui/extensionSystem.js」這個檔案找尋

在「Terminal」執行


$ grep 'scanExtensions' gnome-shell-3.26.1/js/ui/extensionSystem.js -B 12 -A 2 -n



顯示


308-
309-function _loadExtensions() {
310-    global.settings.connect('changed::' + ENABLED_EXTENSIONS_KEY, onEnabledExtensionsChanged);
311-    global.settings.connect('changed::' + DISABLE_USER_EXTENSIONS_KEY, onEnabledExtensionsChanged);
312-    global.settings.connect('changed::' + EXTENSION_DISABLE_VERSION_CHECK_KEY, _onVersionValidationChanged);
313-
314-    enabledExtensions = getEnabledExtensions();
315-
316-    let finder = new ExtensionUtils.ExtensionFinder();
317-    finder.connect('extension-found', function(finder, extension) {
318-        loadExtension(extension);
319-    });
320:    finder.scanExtensions();
321-}
322-




================================================================================

接下來來討論「imports.misc.extensionUtils.extensions['Shortcuts@kyle.aims.ac.za'].metadata」。

在「Terminal」執行


$ grep 'let requiredProperties' gnome-shell-3.26.1/js/misc/extensionUtils.js -n



顯示


125: let requiredProperties = ['uuid', 'name', 'description', 'shell-version'];



在「Looking Glass / Evaluator

執行

* 「imports.misc.extensionUtils.extensions['Shortcuts@kyle.aims.ac.za'].metadata.uuid」
* 「imports.misc.extensionUtils.extensions['Shortcuts@kyle.aims.ac.za'].metadata.name」
* 「imports.misc.extensionUtils.extensions['Shortcuts@kyle.aims.ac.za'].metadata.description」
* 「imports.misc.extensionUtils.extensions['Shortcuts@kyle.aims.ac.za'].metadata['shell-version']」

分別會顯示

* 「r(31) = Shortcuts@kyle.aims.ac.za」
* 「r(31) = Shortcuts」
* 「r(31) = This shows a pop-up of useful keyboard shortcuts when Super + S is pressed」
* 「r(31) = 3.22」

對照「/usr/share/gnome-shell/extensions/Shortcuts@kyle.aims.ac.za/metadata.json」這個檔案的定義。

在「Terminal」

執行


$ cat /usr/share/gnome-shell/extensions/Shortcuts@kyle.aims.ac.za/metadata.json



顯示


{
    "name": "Shortcuts",
    "uuid": "Shortcuts@kyle.aims.ac.za",
    "description": "This shows a pop-up of useful keyboard shortcuts when Super + S is pressed",
    "gettext-domain": "Shortcuts",
    "settings-schema": "org.gnome.shell.extensions.shortcuts",
    "shell-version": [
        "3.22"
    ]
}




相關的實作

執行


$ grep 'let requiredProperties' gnome-shell-3.26.1/js/misc/extensionUtils.js -B 22 -A 7 -n



顯示


103-
104-function createExtensionObject(uuid, dir, type) {
105-    let info;
106-
107-    let metadataFile = dir.get_child('metadata.json');
108-    if (!metadataFile.query_exists(null)) {
109-        throw new Error('Missing metadata.json');
110-    }
111-
112-    let metadataContents, success, tag;
113-    try {
114-        [success, metadataContents, tag] = metadataFile.load_contents(null);
115-    } catch (e) {
116-        throw new Error('Failed to load metadata.json: ' + e);
117-    }
118-    let meta;
119-    try {
120-        meta = JSON.parse(metadataContents);
121-    } catch (e) {
122-        throw new Error('Failed to parse metadata.json: ' + e);
123-    }
124-
125:    let requiredProperties = ['uuid', 'name', 'description', 'shell-version'];
126-    for (let i = 0; i < requiredProperties.length; i++) {
127-        let prop = requiredProperties[i];
128-        if (!meta[prop]) {
129-            throw new Error('missing "' + prop + '" property in metadata.json');
130-        }
131-    }
132-





================================================================================

最後來討論「imports.misc.extensionUtils.extensions['Shortcuts@kyle.aims.ac.za'].imports」
和「imports['Shortcuts@kyle.aims.ac.za']」。

在「Looking Glass / Evaluator

執行


Object.prototype.toString.call(imports.misc.extensionUtils.extensions['Shortcuts@kyle.aims.ac.za'].imports)



顯示


r(41) = [object GjsModule Shortcuts@kyle.aims.ac.za]



執行


Object.prototype.toString.call(imports['Shortcuts@kyle.aims.ac.za'])



顯示


r(42) = [object GjsModule Shortcuts@kyle.aims.ac.za]



================================================================================

執行


imports.misc.extensionUtils.extensions['Shortcuts@kyle.aims.ac.za'].imports.searchPath



顯示


r(43) = /usr/share/gnome-shell/extensions/Shortcuts@kyle.aims.ac.za



執行


imports.misc.extensionUtils.extensions['Shortcuts@kyle.aims.ac.za'].imports.searchPath



顯示


r(43) = imports['Shortcuts@kyle.aims.ac.za'].searchPath



================================================================================

相關的實作,
可以在「gnome-3-26/js/misc/extensionUtils.js」這個檔案,
找到「function installImporter」。

在「Terminal」,執行


$ grep 'function installImporter' gnome-shell-3.26.1/js/misc/extensionUtils.js -A 8 -B 1 -n



顯示


151-
152:function installImporter(extension) {
153-    let oldSearchPath = imports.searchPath.slice();  // make a copy
154-    imports.searchPath = [extension.dir.get_parent().get_path()];
155-    // importing a "subdir" creates a new importer object that doesn't affect
156-    // the global one
157-    extension.imports = imports[extension.uuid];
158-    imports.searchPath = oldSearchPath;
159-}
160-




================================================================================

在「Looking Glass / Evaluator

執行


imports.misc.extensionUtils.extensions['Shortcuts@kyle.aims.ac.za'].imports.extension



顯示


r(51) = [object GjsModule Shortcuts@kyle.aims.ac.za.extension]



可以對照到「/usr/share/gnome-shell/extensions/Shortcuts@kyle.aims.ac.za/extension.js」。

所以可以執行


imports.misc.extensionUtils.extensions['Shortcuts@kyle.aims.ac.za'].imports.extension.disable()



顯示


r(52) = undefined



然後在「TopBar」的「Shortcuts按鈕」消失了。

接著執行


imports.misc.extensionUtils.extensions['Shortcuts@kyle.aims.ac.za'].imports.extension.enable()



顯示


r(52) = undefined



然後在「TopBar」的「Shortcuts按鈕」再度出現了。

================================================================================

在「Looking Glass / Evaluator

執行


imports.misc.extensionUtils.extensions['Shortcuts@kyle.aims.ac.za'].imports.convenience



顯示


r(61) = [object GjsModule Shortcuts@kyle.aims.ac.za.convenience]



可以對照到「/usr/share/gnome-shell/extensions/Shortcuts@kyle.aims.ac.za/convenience.js」。

所以可以分別執行

* 「imports.misc.extensionUtils.extensions['Shortcuts@kyle.aims.ac.za'].imports.convenience.getSettings().get_boolean('use-custom-shortcuts')」
* 「imports.misc.extensionUtils.extensions['Shortcuts@kyle.aims.ac.za'].imports.convenience.getSettings().get_string('shortcuts-file')」
* 「imports.misc.extensionUtils.extensions['Shortcuts@kyle.aims.ac.za'].imports.convenience.getSettings().get_boolean('show-icon')」

分別顯示

* 「r(71) = false」
* 「r(72) = /usr/share/gnome-shell/extensions/Shortcuts@kyle.aims.ac.za/shortcuts.json」
* 「r(73) = true」

這個可以在「Terminal」,執行「apt-get source gnome-shell-extension-shortcuts」下載「Source Package: gnome-shell-extension-shortcuts」。
找到「gnome-shell-extension-shortcuts-1.1.0/src/schemas/org.gnome.shell.extensions.shortcuts.gschema.xml」這個檔案。


$ cat gnome-shell-extension-shortcuts-1.1.0/src/schemas/org.gnome.shell.extensions.shortcuts.gschema.xml



相關的概念,可以參考「#43」這篇。

所以也可以在「Looking Glass / Evaluator」,分別執行下面兩個指令

* 「imports.misc.extensionUtils.extensions['Shortcuts@kyle.aims.ac.za'].imports.convenience.getSettings().set_boolean('show-icon', true)」
* 「imports.misc.extensionUtils.extensions['Shortcuts@kyle.aims.ac.za'].imports.convenience.getSettings().set_boolean('show-icon', false)」

================================================================================

額外一提的

關於「const Lang = imports.lang;」可以探索「gjs-1.50.1/modules/lang.js」和「gjs-1.50.1/modules/_legacy.js
關於「const Signals = imports.signals;」可以探索「gjs-1.50.1/modules/signals.js

另外附上最近找資料過程中找到的連結

* https://ptomato.wordpress.com/2017/05/22/the-gjs-documentation-is-back/
* https://ptomato.wordpress.com/tag/gnome/
* https://ptomato.wordpress.com/tag/javascript/
* https://ptomato.wordpress.com/tag/gjs/

================================================================================

以上提供參考

報告完畢



================================================================================

[回到索引]

11/15 17:08:10
應用擴展 工具箱
回覆: Ubuntu 17.10 推出
會員五級
註冊日期:
2012/4/22 10:50
所屬群組:
已註冊使用者
等級: 33
HP : 160 / 803
MP : 504 / 13098
EXP: 15
離線
[回到索引]

================================================================================

# 如何透過「gsettings」設定「桌面」顯示「ICON」

================================================================================

## 緣起

延續「#2 回覆: 關於桌布切換軟體 variety」這篇討論。

在探索「gnome-shell」時,

找到「gnome-shell-3.26.1/js/ui/background.js」這個檔案。

然後無意間看到「gnome-shell-3.26.1/js/ui/backgroundMenu.js」這個檔案的實作內容。

發現到該實作,在桌面滑鼠按下右鍵,出現的選項,只有三個選項「Change Background…」,「Display Settings」,「Settings」。

跟我目前在桌面滑鼠按下右鍵,少了很多。

並且印象中,那個選單應該是「nautilus」在控制的。

後來聯想到在「gnome-tweak-tool」的「Desktop」,有一個選項「Show Icons」可以設定。

只要將該設定,設為「OFF」,這樣在桌面,按下滑鼠右鍵,出現的選單就只有三個選項,
也就是「gnome-shell-3.26.1/js/ui/backgroundMenu.js」這個檔案的實作內容。

================================================================================

## 探索「gnome-tweak-tool」

執行下面指令,下載「gnome-tweak-tool」的「Source Package: gnome-tweak-tool」。


$ apt-get source gnome-tweak-tool



然後執行


$ grep 'Show Icons' gnome-tweak-tool-3.26.2.1/* -R -n



顯示


gnome-tweak-tool-3.26.2.1/gtweak/tweaks/tweak_group_desktop.py:20:dicons = GSettingsSwitchTweak(_("Show Icons"),"org.gnome.desktop.background","show-desktop-icons")
...略...



就可以找到「gnome-tweak-tool-3.26.2.1/gtweak/tweaks/tweak_group_desktop.py」這個檔案。

並且可以找到「org.gnome.desktop.background show-desktop-icons」

================================================================================

## get

執行


$ gsettings get org.gnome.desktop.background show-desktop-icons



顯示


true



執行


$ ps aux | grep nautilus



顯示


user 1357 0.1 1.0 1131816 83572 tty1 Sl+ 00:20 0:02 nautilus-desktop
user 1658 3.9 0.8 905380 66936 ? Sl 00:39 0:03 /usr/bin/nautilus --gapplication-service
user 1912 0.0 0.0 21744 1072 pts/0 R+ 00:41 0:00 grep --color=auto nautilus




================================================================================

## set

執行


$ gsettings set org.gnome.desktop.background show-desktop-icons false



接著執行


$ gsettings get org.gnome.desktop.background show-desktop-icons



顯示


false



接著執行


$ ps aux | grep nautilus



顯示


user 1658 2.4 0.8 905380 66960 ? Sl 00:39 0:04 /usr/bin/nautilus --gapplication-service
user 1996 0.0 0.0 21744 1132 pts/0 S+ 00:42 0:00 grep --color=auto nautilus




而「nautilus-desktop」那一筆不見了。

在桌面的「ICON」都不見了,並且在桌面,滑鼠按下右鍵,出現的選單,就是顯示剛剛提到的只有三個選項。

================================================================================

## reset

執行


$ gsettings reset org.gnome.desktop.background show-desktop-icons



接著執行


$ gsettings get org.gnome.desktop.background show-desktop-icons



顯示


true



接著執行


$ ps aux | grep nautilus



顯示


user 1658 2.2 0.8 905380 66964 ? Sl 00:39 0:04 /usr/bin/nautilus --gapplication-service
user 2006 35.0 0.9 899928 78368 tty1 Sl+ 00:42 0:01 nautilus-desktop
user 2027 0.0 0.0 21744 1096 pts/0 S+ 00:42 0:00 grep --color=auto nautilus



而「nautilus-desktop」那一筆右再度出現了,並且「pid」是新的。

================================================================================

## 探索 schema

執行


$ grep 'show-desktop-icons' /usr/share/glib-2.0/schemas/* -R



顯示


/usr/share/glib-2.0/schemas/10_ubuntu-settings.gschema.override:show-desktop-icons = true
Binary file /usr/share/glib-2.0/schemas/gschemas.compiled matches
/usr/share/glib-2.0/schemas/org.gnome.desktop.background.gschema.xml:    <key name="show-desktop-icons" type="b">




================================================================================

## override

執行


$ grep 'show-desktop-icons' /usr/share/glib-2.0/schemas/10_ubuntu-settings.gschema.override -B 1 -A 1 -n



顯示


59-[org.gnome.desktop.background:ubuntu]
60:show-desktop-icons = true
61-



這部份的概念,可以參考「#8 回覆: Ubuntu Linux 17.10 螢幕鎖定失效」。

================================================================================

## schema

執行


$ grep 'show-desktop-icons' /usr/share/glib-2.0/schemas/org.gnome.desktop.background.gschema.xml -A 6 -n



顯示


59:    <key name="show-desktop-icons" type="b">
60-      <default>false</default>
61-      <summary>Have file manager handle the desktop</summary>
62-      <description>
63-        If set to true, then file manager will draw the icons on the desktop.
64-      </description>
65-    </key>



這部份的概念,可以參考「#7 回覆: Ubuntu Linux 17.10 螢幕鎖定失效」。

================================================================================

下一篇「#55」來紀錄進一步的探索。

================================================================================

[回到索引]

今天 1:10:33
應用擴展 工具箱
回覆: Ubuntu 17.10 推出
會員五級
註冊日期:
2012/4/22 10:50
所屬群組:
已註冊使用者
等級: 33
HP : 160 / 803
MP : 504 / 13098
EXP: 15
離線
[回到索引]

================================================================================

# 關於「AutostartCondition」for「Desktop Entry」in「GNOME Session」

================================================================================

延續上一篇「#54」,

提到可以透過「gesttngs」設定「org.gnome.desktop.background show-desktop-icons」是「true」或「false」來切換桌面是否顯示「ICON」。

一開始我探索的方向,是從之前「#48」提到的概念去找,

所以我先探索「gnome-settings-daemon」。

================================================================================

## 探索「gnome-settings-daemon」

執行下面指令,下載「gnome-settings-daemon」的「Source Package: gnome-settings-daemon」。


$ apt-get source gnome-settings-daemon



然後執行


$ grep 'show-desktop-icons' gnome-settings-daemon-3.26.1/* -R -n



顯示


gnome-settings-daemon-3.26.1/plugins/xsettings/gsd-xsettings-manager.c:430: { "org.gnome.desktop.background", "show-desktop-icons", "Gtk/ShellShowsDesktop", translate_bool_int },



執行


$ grep 'nautilus-desktop' gnome-settings-daemon-3.26.1/* -R -n



沒有顯示任何結果,直接跳下一個字元。
我找不到任何跟「nautilus-desktop」相關的檔案。

我還看不太懂「gnome-settings-daemon-3.26.1/plugins/xsettings/gsd-xsettings-manager.c」,

還聯想到之前寫的一篇探索紀錄「#3 回覆: 請教一個弱弱的問題,為什麼有些ubuntu的C code有"C"的圖示」,
裡面有紀錄一些連結,是關於「xsettings」。
不過沒能完全弄懂。

================================================================================

推測探索方向,應該不是我原本預期的那樣

後來想到執行「pstree」,觀察「nautilus-desktop」這個「process」是由誰產生的,
觀察到「nautilus-desktop」是由「/usr/lib/gnome-session/gnome-session-binary」產生的。

可以直接執行「pstree」直接觀察。

或是執行


$ ps aux | grep nautilus-desktop



顯示


user 2006 0.8 0.9 899928 78388 tty1 Sl+ 00:42 0:01 nautilus-desktop
user 2083 0.0 0.0 21744 1048 pts/0 S+ 00:46 0:00 grep --color=auto nautilus-desktop



執行


$ ps aux | grep gnome-session-binary



顯示


user 909 0.0 0.2 735816 17608 tty1 Sl+ 00:19 0:00 /usr/lib/gnome-session/gnome-session-binary --session=ubuntu
user 2097 0.0 0.0 21744 1180 pts/0 S+ 00:46 0:00 grep --color=auto gnome-session-binary



執行下面指令,只觀看「909」底下的


$ pstree -p 909



顯示 (以下有些process有省略沒貼出來)


gnome-session-b(909)─┬─
                     |-nautilus-deskto(2006)-+-{nautilus-deskto}(2011)
                     |                       |-{nautilus-deskto}(2012)
                     |                       `-{nautilus-deskto}(2018)




可以觀察到「nautilus-desktop」是由「/usr/lib/gnome-session/gnome-session-binary」產生的。

或是也可以執行


$ ps axo pid,ppid,cmd | grep nautilus-desktop



顯示


 2006   909 nautilus-desktop
 2908  2103 grep --color=auto nautilus-desktop



執行


$ dpkg -S /usr/lib/gnome-session/gnome-session-binary



顯示


gnome-session-bin: /usr/lib/gnome-session/gnome-session-binary



================================================================================

## 初探「gnome-session」

執行下面指令,下載「gnome-session-bin」的「Source Package: gnome-session」。


$ apt-get source gnome-session-bin



執行


$ grep 'nautilus-desktop' gnome-session-3.26.1/* -R -n



沒有顯示任何結果,直接跳下一個字元。
我找不到任何跟「nautilus-desktop」相關的檔案。

================================================================================

## 探索「nautilus」

執行


$ dpkg -L nautilus



顯示


/.
/etc
/etc/xdg
/etc/xdg/autostart
/etc/xdg/autostart/nautilus-autostart.desktop
/usr
/usr/bin
/usr/bin/nautilus
/usr/bin/nautilus-autorun-software
/usr/bin/nautilus-desktop
/usr/lib
/usr/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu/nautilus
/usr/lib/x86_64-linux-gnu/nautilus/extensions-3.0
/usr/lib/x86_64-linux-gnu/nautilus/extensions-3.0/libnautilus-sendto.so
/usr/share
/usr/share/appdata
/usr/share/appdata/org.gnome.Nautilus.appdata.xml
/usr/share/applications
/usr/share/applications/mount-archive.desktop
/usr/share/applications/nautilus-autorun-software.desktop
/usr/share/applications/nautilus-classic.desktop
/usr/share/applications/nautilus-folder-handler.desktop
/usr/share/applications/nautilus-home.desktop
/usr/share/applications/nautilus.desktop
/usr/share/applications/org.gnome.Nautilus.desktop
/usr/share/dbus-1
/usr/share/dbus-1/services
/usr/share/dbus-1/services/org.freedesktop.FileManager1.service
/usr/share/dbus-1/services/org.gnome.Nautilus.service
/usr/share/doc
/usr/share/doc/nautilus
/usr/share/doc/nautilus/NEWS.gz
/usr/share/doc/nautilus/copyright
/usr/share/man
/usr/share/man/man1
/usr/share/man/man1/nautilus.1.gz
/usr/share/doc/nautilus/changelog.Debian.gz



執行


$ cat /etc/xdg/autostart/nautilus-autostart.desktop



顯示


[Desktop Entry]
Type=Application
...略...
Name[zh_CN]=文件
Name[zh_HK]=檔案
Name[zh_TW]=檔案
Name=Files
Exec=nautilus-desktop
OnlyShowIn=GNOME;Unity;
AutostartCondition=GSettings org.gnome.desktop.background show-desktop-icons
NoDisplay=true



一開始我有注意到「AutostartCondition=GSettings org.gnome.desktop.background show-desktop-icons」這個設定,
但不曉得是什麼作用。
在「Desktop Entry Specification」也沒有查到。

================================================================================

後來我想到要觀察「nautilus-desktop」和「gnome-session-binary」這兩個的「/proc/pid/environ」

執行


$ ps aux | grep nautilus-desktop



顯示


user 2006 0.8 0.9 899928 78388 tty1 Sl+ 00:42 0:01 nautilus-desktop
user 2083 0.0 0.0 21744 1048 pts/0 S+ 00:46 0:00 grep --color=auto nautilus-desktop



執行


$ ps aux | grep gnome-session-binary



顯示


user 909 0.0 0.2 735816 17608 tty1 Sl+ 00:19 0:00 /usr/lib/gnome-session/gnome-session-binary --session=ubuntu
user 2097 0.0 0.0 21744 1180 pts/0 S+ 00:46 0:00 grep --color=auto gnome-session-binary



執行


$ strings /proc/909/environ
$ strings /proc/2006/environ



對照顯示結果後,可以發現到「nautilus-desktop」會多出一些「環境變數」如下


GNOME_DESKTOP_SESSION_ID=this-is-deprecated
XDG_MENU_PREFIX=gnome-
SESSION_MANAGER=local/my-host:@/tmp/.ICE-unix/959,unix/my-host:/tmp/.ICE-unix/959
DESKTOP_AUTOSTART_ID=10a85862da787725e8151084223872233300000009590029
GIO_LAUNCHED_DESKTOP_FILE=/etc/xdg/autostart/nautilus-autostart.desktop
GIO_LAUNCHED_DESKTOP_FILE_PID=2006



聯想到之前「ibus-daemon」的案例「#7 回覆: 討論這篇「如何讓gcin開機後不多次執行」」。

於是使用這些「環境變數」來探索。

================================================================================

執行


$ grep 'GNOME_DESKTOP_SESSION_ID' gnome-session-3.26.1/* -R -n



顯示


gnome-session-3.26.1/debian/data/run-systemd-session:10:dbus-update-activation-environment --systemd GNOME_DESKTOP_SESSION_ID=this-is-deprecated
gnome-session-3.26.1/debian/data/run-systemd-session:39:dbus-update-activation-environment --systemd GNOME_DESKTOP_SESSION_ID=
gnome-session-3.26.1/gnome-session/main.c:411:        /* Some third-party programs rely on GNOME_DESKTOP_SESSION_ID to
gnome-session-3.26.1/gnome-session/main.c:414:        gsm_util_setenv ("GNOME_DESKTOP_SESSION_ID", "this-is-deprecated");
gnome-session-3.26.1/NEWS:1881:- Fixed #542880, set GNOME_DESKTOP_SESSION_ID environment variable for




================================================================================

執行


$ grep 'XDG_MENU_PREFIX' gnome-session-3.26.1/* -R -n



顯示


gnome-session-3.26.1/ChangeLog:6698:    main: Set XDG_MENU_PREFIX
gnome-session-3.26.1/gnome-session/main.c:418:        gsm_util_setenv ("XDG_MENU_PREFIX", "gnome-");
gnome-session-3.26.1/NEWS:398:        * Set XDG_MENU_PREFIX




================================================================================

執行


$ grep 'SESSION_MANAGER' gnome-session-3.26.1/* -R -n



顯示


gnome-session-3.26.1/doc/man/gnome-session.1:79:.B SESSION_MANAGER
gnome-session-3.26.1/gnome-session/gsm-xsmp-server.c:669:        gsm_util_setenv ("SESSION_MANAGER", network_id_list);
gnome-session-3.26.1/gnome-session/gsm-xsmp-server.c:670:        g_debug ("GsmXsmpServer: SESSION_MANAGER=%s\n", network_id_list);
gnome-session-3.26.1/tools/gnome-session-selector.c:631:        if (getenv ("SESSION_MANAGER") != NULL)




================================================================================

執行


$ grep 'DESKTOP_AUTOSTART_ID' gnome-session-3.26.1/* -R -n



顯示


gnome-session-3.26.1/gnome-session/test-client-dbus.c:151:        startup_id = g_getenv ("DESKTOP_AUTOSTART_ID");
gnome-session-3.26.1/gnome-session/gsm-autostart-app.c:1115:                g_app_launch_context_setenv (ctx, "DESKTOP_AUTOSTART_ID", startup_id);




然後就可以找到「gnome-session-3.26.1/gnome-session/gsm-autostart-app.c」這個關鍵檔案。

================================================================================

至於「GIO_LAUNCHED_DESKTOP_FILE」和「GIO_LAUNCHED_DESKTOP_FILE_PID」,則在「gnome-session」找不到,
必須在「glib2.0」找尋。


$ apt-get source glib2.0



================================================================================

執行


$ grep '"GIO_LAUNCHED_DESKTOP_FILE"' glib2.0-2.54.1/* -R -A 2 -B 1 -n



顯示


glib2.0-2.54.1/gio/tests/appinfo-test.c-10-
glib2.0-2.54.1/gio/tests/appinfo-test.c:11:  envvar = g_getenv ("GIO_LAUNCHED_DESKTOP_FILE");
glib2.0-2.54.1/gio/tests/appinfo-test.c-12-  if (envvar != NULL)
glib2.0-2.54.1/gio/tests/appinfo-test.c-13-    {
--
glib2.0-2.54.1/gio/gdesktopappinfo.c-2606-                                          sn_id));
glib2.0-2.54.1/gio/gdesktopappinfo.c:2607:  gio_desktop_file = g_getenv ("GIO_LAUNCHED_DESKTOP_FILE");
glib2.0-2.54.1/gio/gdesktopappinfo.c-2608-  if (gio_desktop_file != NULL)
glib2.0-2.54.1/gio/gdesktopappinfo.c-2609-    g_variant_builder_add (&extras_variant, "{sv}",
--
glib2.0-2.54.1/gio/gdesktopappinfo.c-2703-          envp = g_environ_setenv (envp,
glib2.0-2.54.1/gio/gdesktopappinfo.c:2704:                                   "GIO_LAUNCHED_DESKTOP_FILE",
glib2.0-2.54.1/gio/gdesktopappinfo.c-2705-                                   info->filename,
glib2.0-2.54.1/gio/gdesktopappinfo.c-2706-



================================================================================

執行


$ grep '"GIO_LAUNCHED_DESKTOP_FILE_PID"' glib2.0-2.54.1/* -R -A 2 -B 1 -n



顯示


glib2.0-2.54.1/gio/tests/appinfo-test.c-20-
glib2.0-2.54.1/gio/tests/appinfo-test.c:21:      envvar = g_getenv ("GIO_LAUNCHED_DESKTOP_FILE_PID");
glib2.0-2.54.1/gio/tests/appinfo-test.c-22-      g_assert (envvar != NULL);
glib2.0-2.54.1/gio/tests/appinfo-test.c-23-      pid_from_env = atoi (envvar);
--
glib2.0-2.54.1/gio/gdesktopappinfo.c-2707-          envp = g_environ_setenv (envp,
glib2.0-2.54.1/gio/gdesktopappinfo.c:2708:                                   "GIO_LAUNCHED_DESKTOP_FILE_PID",
glib2.0-2.54.1/gio/gdesktopappinfo.c-2709-                                   "XXXXXXXXXXXXXXXXXXXX", /* filled in child_setup */
glib2.0-2.54.1/gio/gdesktopappinfo.c-2710-                                   TRUE);
glib2.0-2.54.1/gio/gdesktopappinfo.c:2711:          data.pid_envvar = (char *)g_environ_getenv (envp, "GIO_LAUNCHED_DESKTOP_FILE_PID");
glib2.0-2.54.1/gio/gdesktopappinfo.c-2712-        }
glib2.0-2.54.1/gio/gdesktopappinfo.c-2713-      else




================================================================================

進一步探索「gnome-session-3.26.1/gnome-session/gsm-autostart-app.c」這個關鍵檔案。


執行


$ grep '"GSettings"' gnome-session-3.26.1/gnome-session/gsm-autostart-app.c -A 3 -n



顯示


182:        } else if (!g_ascii_strncasecmp (condition_string, "GSettings", len)) {
183-                kind = GSM_CONDITION_GSETTINGS;
184-        } else if (!g_ascii_strncasecmp (condition_string, "GNOME3", len)) {
185-                condition_string = key;



================================================================================

執行


$ grep 'GSM_CONDITION_GSETTINGS' gnome-session-3.26.1/gnome-session/gsm-autostart-app.c -A 1 -B 1 -n




顯示


55-#endif
56:        GSM_CONDITION_GSETTINGS      = 4,
57-        GSM_CONDITION_IF_SESSION     = 5,
--
182-        } else if (!g_ascii_strncasecmp (condition_string, "GSettings", len)) {
183:                kind = GSM_CONDITION_GSETTINGS;
184-        } else if (!g_ascii_strncasecmp (condition_string, "GNOME3", len)) {
--
580-#endif
581:        } else if (kind == GSM_CONDITION_GSETTINGS) {
582-                disabled = !setup_gsettings_condition_monitor (app, key);
--
877-#endif
878:        } else if (kind == GSM_CONDITION_GSETTINGS &&
879-                   priv->condition_settings != NULL) {




執行


$ grep '^setup_gsettings_condition_monitor (' gnome-session-3.26.1/gnome-session/gsm-autostart-app.c -B 1 -A 2 -n



顯示


338-static gboolean
339:setup_gsettings_condition_monitor (GsmAutostartApp *app,
340-                                   const char      *key)
341-{



================================================================================

雖然我還沒有完全弄懂「gnome-session-3.26.1/gnome-session/gsm-autostart-app.c」這個關鍵檔案。

不過稍微閱讀了一下程式碼,做了一些假設和推測,

所以可以先直接來做以下的小實驗。

================================================================================

先產生一個檔案「/usr/local/bin/say-hi」,內容填入如下


#!/bin/bash
notify-send 'Hello world!' 'This is an example notification.' --icon=dialog-information
# https://wiki.archlinux.org/index.php/Desktop_notifications#Usage_in_programming




然後執行下面指令,設為可執行


$ sudo chmod +x /usr/local/bin/say-hi



================================================================================

再來產生一個檔案「/etc/xdg/autostart/say-hi.desktop」,內容填入如下。


[Desktop Entry]
Type=Application
Name[zh_CN]=打招呼
Name[zh_HK]=打招呼
Name[zh_TW]=打招呼
Name=SayHi
Exec=say-hi
OnlyShowIn=GNOME;Unity;
AutostartCondition=GSettings org.gnome.desktop.background show-desktop-icons
NoDisplay=true




接著登出系統,然後在登入系統。

================================================================================

然後就可以透過「gnome-tweak-tool」的「Desktop」,在「Show Icons」那個選項,在「ON」和「OFF」作切換。
會發現,當切換到「ON」時,就會跳出「提示訊息對話框」。

也可以透過上一篇提到的指令來設定,在切換到「ON」時,一樣會跳出「提示訊息對話框」

* 「gsettings set org.gnome.desktop.background show-desktop-icons false」: OFF
* 「gsettings set org.gnome.desktop.background show-desktop-icons true」: ON
* 「gsettings reset org.gnome.desktop.background show-desktop-icons」: ON

================================================================================

後來從「gnome-session-3.26.1/gnome-session/README」。

找到相關的連結

* https://wiki.gnome.org/Projects/SessionManagement/
* https://wiki.gnome.org/Projects/SessionManagement/GnomeSession
* https://wiki.gnome.org/Projects/SessionManagement/NewGnomeSession

================================================================================

## D-Bus

過往一些「D-Bus」的相關案例,紀錄在「[索引] 泛Ubuntu 安裝調校」。

執行


$ dpkg -L gnome-session



顯示


/.
/usr
/usr/share
/usr/share/doc
/usr/share/doc/gnome-session
/usr/share/doc/gnome-session/AUTHORS
/usr/share/doc/gnome-session/NEWS.gz
/usr/share/doc/gnome-session/README
/usr/share/doc/gnome-session/README.Debian
/usr/share/doc/gnome-session/copyright
/usr/share/doc/gnome-session/dbus
/usr/share/doc/gnome-session/dbus/gnome-session.html
/usr/share/gnome-session
/usr/share/gnome-session/sessions
/usr/share/gnome-session/sessions/gnome.session
/usr/share/wayland-sessions
/usr/share/wayland-sessions/gnome.desktop
/usr/share/xsessions
/usr/share/xsessions/gnome-xorg.desktop
/usr/share/doc/gnome-session/changelog.Debian.gz
/usr/share/xsessions/gnome.desktop



執行下面指令,觀看「/usr/share/doc/gnome-session/dbus/gnome-session.html


$ firefox /usr/share/doc/gnome-session/dbus/gnome-session.html



執行


$ qdbus org.gnome.SessionManager



顯示


/
/org
/org/gnome
/org/gnome/SessionManager
...略...



執行


$ qdbus org.gnome.SessionManager /org/gnome/SessionManager



顯示


method QDBusVariant org.freedesktop.DBus.Properties.Get(QString interface_name, QString property_name)
method QVariantMap org.freedesktop.DBus.Properties.GetAll(QString interface_name)
signal void org.freedesktop.DBus.Properties.PropertiesChanged(QString interface_name, QVariantMap changed_properties, QStringList invalidated_properties)
method void org.freedesktop.DBus.Properties.Set(QString interface_name, QString property_name, QDBusVariant value)
method QString org.freedesktop.DBus.Introspectable.Introspect()
method QString org.freedesktop.DBus.Peer.GetMachineId()
method void org.freedesktop.DBus.Peer.Ping()
property read uint org.gnome.SessionManager.InhibitedActions
property read QString org.gnome.SessionManager.Renderer
property read bool org.gnome.SessionManager.SessionIsActive
property read QString org.gnome.SessionManager.SessionName
method bool org.gnome.SessionManager.CanShutdown()
signal void org.gnome.SessionManager.ClientAdded(QDBusObjectPath id)
signal void org.gnome.SessionManager.ClientRemoved(QDBusObjectPath id)
method QList<QDBusObjectPath> org.gnome.SessionManager.GetClients()
method QList<QDBusObjectPath> org.gnome.SessionManager.GetInhibitors()
method QString org.gnome.SessionManager.GetLocale(int category)
method uint org.gnome.SessionManager.Inhibit(QString app_id, uint toplevel_xid, QString reason, uint flags)
signal void org.gnome.SessionManager.InhibitorAdded(QDBusObjectPath id)
signal void org.gnome.SessionManager.InhibitorRemoved(QDBusObjectPath id)
method void org.gnome.SessionManager.InitializationError(QString message, bool fatal)
method bool org.gnome.SessionManager.IsAutostartConditionHandled(QString condition)
method bool org.gnome.SessionManager.IsInhibited(uint flags)
method bool org.gnome.SessionManager.IsSessionRunning()
method void org.gnome.SessionManager.Logout(uint mode)
method void org.gnome.SessionManager.Reboot()
method QDBusObjectPath org.gnome.SessionManager.RegisterClient(QString app_id, QString client_startup_id)
method void org.gnome.SessionManager.RequestReboot()
method void org.gnome.SessionManager.RequestShutdown()
signal void org.gnome.SessionManager.SessionOver()
signal void org.gnome.SessionManager.SessionRunning()
method void org.gnome.SessionManager.Setenv(QString variable, QString value)
method void org.gnome.SessionManager.Shutdown()
method void org.gnome.SessionManager.Uninhibit(uint inhibit_cookie)
method void org.gnome.SessionManager.UnregisterClient(QDBusObjectPath client_id)



執行


$ qdbus org.gnome.SessionManager /org/gnome/SessionManager org.freedesktop.DBus.Introspectable.Introspect



顯示


<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
                      "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
<!-- GDBus 2.54.1 -->
<node>
  <interface name="org.freedesktop.DBus.Properties">
    <method name="Get">
      <arg type="s" name="interface_name" direction="in"/>
      <arg type="s" name="property_name" direction="in"/>
      <arg type="v" name="value" direction="out"/>
    </method>
    <method name="GetAll">
      <arg type="s" name="interface_name" direction="in"/>
      <arg type="a{sv}" name="properties" direction="out"/>
    </method>
    <method name="Set">
      <arg type="s" name="interface_name" direction="in"/>
      <arg type="s" name="property_name" direction="in"/>
      <arg type="v" name="value" direction="in"/>
    </method>
    <signal name="PropertiesChanged">
      <arg type="s" name="interface_name"/>
      <arg type="a{sv}" name="changed_properties"/>
      <arg type="as" name="invalidated_properties"/>
    </signal>
  </interface>
  <interface name="org.freedesktop.DBus.Introspectable">
    <method name="Introspect">
      <arg type="s" name="xml_data" direction="out"/>
    </method>
  </interface>
  <interface name="org.freedesktop.DBus.Peer">
    <method name="Ping"/>
    <method name="GetMachineId">
      <arg type="s" name="machine_uuid" direction="out"/>
    </method>
  </interface>
  <interface name="org.gnome.SessionManager">
    <method name="Setenv">
      <arg type="s" name="variable" direction="in"/>
      <arg type="s" name="value" direction="in"/>
    </method>
    <method name="GetLocale">
      <arg type="i" name="category" direction="in"/>
      <arg type="s" name="value" direction="out"/>
    </method>
    <method name="InitializationError">
      <arg type="s" name="message" direction="in"/>
      <arg type="b" name="fatal" direction="in"/>
    </method>
    <method name="RegisterClient">
      <arg type="s" name="app_id" direction="in"/>
      <arg type="s" name="client_startup_id" direction="in"/>
      <arg type="o" name="client_id" direction="out"/>
    </method>
    <method name="UnregisterClient">
      <arg type="o" name="client_id" direction="in"/>
    </method>
    <method name="Inhibit">
      <arg type="s" name="app_id" direction="in"/>
      <arg type="u" name="toplevel_xid" direction="in"/>
      <arg type="s" name="reason" direction="in"/>
      <arg type="u" name="flags" direction="in"/>
      <arg type="u" name="inhibit_cookie" direction="out"/>
    </method>
    <method name="Uninhibit">
      <arg type="u" name="inhibit_cookie" direction="in"/>
    </method>
    <method name="IsInhibited">
      <arg type="u" name="flags" direction="in"/>
      <arg type="b" name="is_inhibited" direction="out"/>
    </method>
    <method name="GetClients">
      <arg type="ao" name="clients" direction="out"/>
    </method>
    <method name="GetInhibitors">
      <arg type="ao" name="inhibitors" direction="out"/>
    </method>
    <method name="IsAutostartConditionHandled">
      <arg type="s" name="condition" direction="in"/>
      <arg type="b" name="handled" direction="out"/>
    </method>
    <method name="Shutdown"/>
    <method name="Reboot"/>
    <method name="CanShutdown">
      <arg type="b" name="is_available" direction="out"/>
    </method>
    <method name="Logout">
      <arg type="u" name="mode" direction="in"/>
    </method>
    <method name="IsSessionRunning">
      <arg type="b" name="running" direction="out"/>
    </method>
    <method name="RequestShutdown"/>
    <method name="RequestReboot"/>
    <signal name="ClientAdded">
      <arg type="o" name="id"/>
    </signal>
    <signal name="ClientRemoved">
      <arg type="o" name="id"/>
    </signal>
    <signal name="InhibitorAdded">
      <arg type="o" name="id"/>
    </signal>
    <signal name="InhibitorRemoved">
      <arg type="o" name="id"/>
    </signal>
    <signal name="SessionRunning"/>
    <signal name="SessionOver"/>
    <property type="s" name="SessionName" access="read"/>
    <property type="s" name="Renderer" access="read"/>
    <property type="b" name="SessionIsActive" access="read"/>
    <property type="u" name="InhibitedActions" access="read"/>
  </interface>
  <node name="App46"/>
...略...
</node>




執行


$ qdbus org.gnome.SessionManager /org/gnome/SessionManager org.gnome.SessionManager.IsAutostartConditionHandled 'GSettings org.gnome.desktop.background show-desktop-icons'



顯示


true



================================================================================

以上提供參考

報告完畢



================================================================================

[回到索引]

今天 1:17:04
應用擴展 工具箱

« 1 ... 3 4 5 (6)

 [無發表權] 請登錄或者註冊


可以查看帖子.
不可發帖.
不可回覆.
不可編輯自己的帖子.
不可刪除自己的帖子.
不可發起投票調查.
不可在投票調查中投票.
不可上傳附件.
不可不經審核直接發帖.