基於GNOME2桌面的GConf配置系統的介紹

火星人 @ 2014-03-12 , reply:0


  

2008 年 4 月 03 日
曹 彬子 (caobinzi@cn.ibm.com), 軟體工程師, IBM

GConf 是在基於 GNOME2 的系統中用於應用程序屬性配置和管理的工具,完成類似於 Windows 操作系統中註冊表的功能。本文討論了在 GNOME2 桌面中 GConf 配置管理系統的機制以及使用其相關 API 開發應用程序的方法。本文主要內容包括 GConf 工具的介紹,使用以及相關的開發實踐。本文適用於 Linux 應用程序的開發人員。

概述

GConf 是在基於 GNOME2 的 Linux 操作系統中實現對應用程序的配置及管理功能的工具。我們可以把 GConf 理解為 Linux 操作系統中的註冊表。然而,它克服了 Windows 註冊表的一些缺點,比如 Windows 註冊表遭到破壞,可能會導致操作系統崩潰,而且 GConf 的配置信息存儲於純文本的文件中,可讀性很好。從根本上來說,GConf 採用用一種 Key/Value 的存儲機制。在 GConf 系統中,應用程序的配置信息都是以 Key/Value 的結構來存儲。每一個 Key 值對應應用程序的某種屬性,而對應的 Value 則表示該屬性的配置信息。 GConf 在後台實現了一個用戶配置信息的資料庫,這個資料庫看上去類似一個文件系統,專門用於存儲應用程序的 Key/Value 信息。整個文件系統主要有以下組件構成。包括目錄(對應使用 GConf 系統的應用程序。如 /apps/evolution),子目錄(一系列屬性配置信息的集合。如 /apps/evolution/mail),/schemas(存儲屬性的鍵信息)等。

GConf 系統還可以在一個應用程序的屬性配置值發生改變的時候通知應用程序。因此,當 GConf 中一個屬性值被更改的時候,與之相關的應用程序都能夠獲得信息,從而根據屬性的修改更新作出相應的處理。GConf 主要由三個組件構成:

  • 一系列用戶屬性的配置集合
  • 一個後台程序 gconfd-2
  • 一個命令行工具 gconftool-2

另外 Gnome 系統還有一個可視化的圖形工具 gconf-editor 供用戶使用。




Gconf 配置源介紹

GConf 系統中保存了一系列文件路徑和位置信息,我們稱之為配置源。這些配置源信息存儲在GConf 的一個路徑文件中。在筆者的 SUSE Linux 系統,該文件為 /etc/opt/gnome/gconf/2/path. (不同的 Linux 發行版本可能略有不同) 。該文件的內容(濾除註釋信息)如下:

xml:readonly:/etc/opt/gnome/gconf/gconf.xml.mandatory  include /etc/opt/gnome/gconf/2/local-mandatory.path  include "$(HOME)/.gconf.path"  xml:readwrite:$(HOME)/.gconf  include /etc/opt/gnome/gconf/2/local-defaults.path  xml:readonly:/etc/opt/gnome/gconf/gconf.xml.defaults  

GConf 系統中的配置源分為三類

強制源( Mandatory ):該源所描述的屬性為只讀,用戶無法修改該類屬性的值。

xml:readonly:/etc/opt/gnome/gconf/gconf.xml.mandatory  include /etc/opt/gnome/gconf/2/local-mandatory.path  

用戶源( User ) :該源存儲了用戶可以自行修改和設置的屬性信息。

include "$(HOME)/.gconf.path"  xml:readwrite:$(HOME)/.gconf  

默認源( Default ) :該源存儲了 GConf 系統中屬性的默認值。

include /etc/opt/gnome/gconf/2/local-defaults.path  xml:readonly:/etc/opt/gnome/gconf/gconf.xml.defaults  

上述源的順序恰好是 GConf 系統讀取應用程序配置屬性值的順序,也就是說存儲在強制源中的屬性會被優先獲取,即使用戶源中對該屬性進行了自定義配置也會被忽略。





GConf Schema 簡介

GConf Schema 是一系列鍵和實體的集合。我們總可以將一個 schema 的鍵值和一個屬性的鍵值聯繫在一起。例如我們打開一個關於 FTP 協議相關的 GConf 屬性文件:

cbz: /etc/opt/gnome/gconf/gconf.xml.defaults/desktop/gnome/url-handlers/ftp$cat %gconf.xml  <?xml version="1.0"?>  <gconf>  <entry name="needs_terminal" mtime="1165354500"        schema="/schemas/desktop/gnome/url-handlers/ftp/needs_terminal"/>  <entry name="command" mtime="1165354500"            schema="/schemas/desktop/gnome/url-handlers/ftp/command"/>  <entry name="enabled" mtime="1165354500"             schema="/schemas/desktop/gnome/url-handlers/ftp/enabled"/>  </gconf>  

從中可以看出:

/desktop/gnome/url-handlers/ftp/command  

對應的 schema 文件中的 Key 為

/schemas/desktop/gnome/url-handlers/ftp/command。  

下面我們給出部分對應的 schema 文件的信息

/etc/opt/gnome/gconf/schemas/desktop_gnome_url_handlers.schemas      <schema>        <key>/schemas/desktop/gnome/url-handlers/ftp/command</key>        <applyto>/desktop/gnome/url-handlers/ftp/command</applyto>        <owner>gnome</owner>        <type>string</type>        <default>firefox %s</default>        <locale name="C">          <short>The handler for "ftp" URLs</short>          <long>The command used to handle "ftp" URLs, if enabled.</long>        </locale>  </schema>  




GConf 圖形化工具介紹

用戶在終端中輸入 gconf-editor。 GConf 的圖形化工具將出現在用戶面前(見下圖1)。gconf-editor 提供給用戶一個方便,快捷的可視化終端,從而實現對 GConf 系統中應用程序的屬性進行直觀地查看,編輯和修改。它的結構看上去和 Windows 操作系統的註冊表類似,然而可讀性更好。用戶能夠清楚的查到相關應用程序的配置信息。例如 /apps/gnome-terminal/profiles/Default/font 存儲的是用戶的 gnome-terminal 終端的使用的字體信息。在本文的示例,用戶當前 gnome-terminal 終端的字體為 Bitstream Vera Sans Mono 14. 用戶還可以看到關於該 Key 的描述信息如下:

Key name:	         /apps/gnome-terminal/profiles/Default/font  	//鍵名		  Key owner:	         gnome-terminal					//所屬應用程序	  Short Description:	Font					         //簡單描述信息	  Long Description:	A Pango font name.  			         //詳細描述信息	  

另外 GConf 系統中還存儲了一些關於桌面系統的配置信息,例如在 /desktop/gnome/url-handlers/http/command 存儲的是系統處理基於 HTTP 的 URL 的應用程序信息,本文中的使用的是 firefox 。當用戶在打開一個含有 HTTP URL 的文檔時,如果用戶點擊其中的 URL 鏈接,系統會啟動 firefox 來打開這個 URL。

Key name:		/desktop/gnome/url-handlers/http/command    Key owner:		gnome  Short Description:	The handler for “http” URLs  Long Description:	The command to used to handle “http” URLS, if enabled.  

另外用戶可以直接通過 gconf-editor 來修改其中一些配置的信息,例如用戶可以修改/desktop/gnome/url-handlers/http/command 的值,從而使得用戶在打開 HTTP URL 的時候,能夠啟動自己定義的網頁瀏覽器。


圖1 gconf-editor 示例
 



GConf 命令行工具介紹

GConf 配置系統自帶了一個強大的命令行工具叫作 gconftool-2。 用戶可以通過這個工具實現對 GConf 系統進行配置和管理等。用戶可以通過 man gconftool-2 獲得關於 gconftool-2 命令的詳細使用方法,這裡我們給出一些常用的命令選項:


gconftool-2 命令選項
命令選項 註釋
-s, --set 設置鍵值並同步。需要與 —type 同時使用
-g, --get 列印一個鍵值到標準屏幕輸出
-u, --unset 重置 Key 值為 GConf 系統中的默認值
-a, --all-entries 列印目錄中的所有鍵/值組合
--all-dirs 列印一個目錄的所有子目錄
-R, --recursive-list 遞歸列印一個目錄的子目錄與條目
--dir-exists=STRING 返回目錄是否存在。0為目錄存在,2為不存在
--set-schema 設置一個 schema 的屬性,與 --short-desc, --long-desc, --owner, 和 –type 同時使用
--makefile-install-rule 安裝 schema 文件到 GConf 中。GCONF_CONFIG_SOURCE 環境變數必須設置為相應的配置源
--makefile-uninstall-rule 卸載 schema 文件。與 --makefile-install-rule 相同,GCONF_CONFIG_SOURCE 環境變數必須設置為相應的配置源

命令行使用示例:

  1. 遞歸列印 /desktop/gnome/url-handlers 目錄中的子目錄和選項
cbz: ~$gconftool-2 --recursive-list  /desktop/gnome/url-handlers    /desktop/gnome/url-handlers/cdda:    command = /opt/gnome/lib/gnome-volume-manager/gnome-cdda-handler %s    enabled = false   /desktop/gnome/url-handlers/man:    needs_terminal = false    command = gnome-help "%s"    enabled = true    其餘略去………  

  1. 檢查目錄在 GConf 系統中是否存在
cbz: ~$gconftool-2 --dir-exists=/desktop/gnome/url-handlers  cbz: ~$echo $?  0  

  1. 列舉 /desktop/gnome/url-handlers 的所有子目錄
cbz: ~$gconftool-2 --all-dirs /desktop/gnome/url-handlers     /desktop/gnome/url-handlers/cdda   /desktop/gnome/url-handlers/man   /desktop/gnome/url-handlers/aim   /desktop/gnome/url-handlers/ftp   /desktop/gnome/url-handlers/info  其餘略去………  

  1. 列印 /desktop/gnome/url-handlers/https/command 的值
cbz: ~$gconftool-2 -g /desktop/gnome/url-handlers/https/command  firefox %s   

  1. 設置 /desktop/gnome/url-handlers/https/command 對應的值為 ”test”
cbz: ~$gconftool-2 --type string -s /desktop/gnome/url-handlers/https/command test  cbz: ~$gconftool-2 -g /desktop/gnome/url-handlers/https/command  test  

  1. 設置 /desktop/gnome/url-handlers/https/command 對應的值為系統默認值
cbz: ~$gconftool-2 --unset /desktop/gnome/url-handlers/https/command  cbz: ~$gconftool-2 -g /desktop/gnome/url-handlers/https/command  firefox %s  

  1. 安裝一個自定義的 schema 文件到系統中,安裝源為當前用戶個人目錄
cbz: ~$export GCONF_CONFIG_SOURCE="xml:readwrite:$HOME/.gconf"  cbz: ~$gconftool-2 --makefile-install-rule Test.schemas  

  1. 卸載一個自定義的 schema 文件,卸載源為當前用戶個人目錄
cbz: ~$export GCONF_CONFIG_SOURCE=xml:readwrite:$HOME/.gconf  cbz: ~$gconftool-2 --makefile-uninstall-rule Test.schemas       




利用 GConf API 編程示例

GConf 系統本身提供了許多 API 供用戶來使用,用戶可以通過使用這些 API 完成對 GConf信息的管理。本文給出一個簡單的示常式序 test.cpp。該程序的功能是獲取當前的 FTP 協議的處理程序(對應的 command 值)。從程序的輸出可以看出,筆者的操作系統對於 FTP 協議的默認啟動程序是 firefox.


GConf 示常式序
                  #include <string.h>  #include <stdio.h>  #include <gconf/gconf-client.h>    int main (){        //Get Gconf client      GConfClient* gConfClient = gconf_client_get_default();      if (!gConfClient) return 1 ;        //Get the value      gchar * str = gconf_client_get_string(gConfClient,   "/desktop/gnome/url-handlers/ftp/command", NULL);        if (str){          printf("%s\n",str);          //Free the value          g_free(str);      }        //Unref this gobject      g_object_unref(gConfClient);      return 0;  }  

編譯 test.cpp:

cbz: ~/test$g++ `pkg-config --cflags --libs gconf-2.0` test.cpp  

執行 test.cpp:

cbz: ~/test$./a.out  firefox %s  

與命令行工具 gconftool-2 獲得的結果對比:

cbz: ~/test$gconftool-2 -g /desktop/gnome/url-handlers/ftp/command  firefox %s  

 

結論

GConf 是基於 GNOME2 桌面的 Linux 操作系統中用於配置應用程序屬性的管理工具。通過本文的討論,讀者可以獲得對 GConf 有一個比較全面的了解,尤其對於在 Linux 操作系統中進行開發應用程序時,對於如何使用 GConf 對應用程序進行配置提供了一個參考以及對基於GConf 的 API 進行程序開發和設計進行了簡單的介紹。


 





[火星人 via ] 基於GNOME2桌面的GConf配置系統的介紹已經有122次圍觀

http://www.coctec.com/docs/linux/show-post-66897.html