GNOME2 桌面系統中基於 MIME 類型的應用程序集成

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


概述

當用戶安裝一個 GNOME 圖形界面應用程序時,應用程序需要使自己集成到 GNOME桌面系統中.這種集成包括以下幾個方面:

1.註冊應用程序到 GNOME 桌面系統.新的應用程序註冊到GNOME 程序菜單中,這樣GNOME 用戶可以通過 GNOME 菜單來啟動這個應用程序或使用這個應用程序打開某種類型的文件.

2.註冊新的 MIME 文件類型,這樣 Nautilus 文件管理器就可以辨別文件的類型,在文件夾的視圖中用適當的可讀的字元串和圖標來表示它.

3.建立應用程序和它處理的 MIME 類型的關聯.Nautilus 能夠在應用程序註冊的文件類型的 Open With 菜單中,把這個應用程序作為打開這個文件的預設程序.

這種應用程序與桌面系統的集成高度依賴桌面系統 MIEM 類型的定義和實現.在GNOME2.8 之前,GNOME 和 KDE 各自採用自己的方式來定義 MIME 類型,同時GNOME2 的每個版本的MIME類型的定義實現都稍有差異,這給GNOME2應用程序的集成帶來很大的困難.從GNOME2.8開始,它採用了XDG制定了一系列 MIME類型的規範,儘管XDG的有些標準本身還在制定當中,這已經給應用程序的集成帶來很大的方便.

本文通過對GNOME2(GNOME2.8和2.8以前的版本)MIME類型的論述給GNOME2應用程序的開發者提供一種集成應用程序到GNOME2桌面系統的實踐方法.

下面就從應用程序集成的三個方面分別對GNOME2.8和2.8以前的版本進行討論.

GNOME2.8 之前的程序集成實現方法

註冊應用程序到 GNOME 桌面系統

註冊應用程序到 GNOME 桌面系統需要兩步工作:第一,為應用程序創建一個 .desktop文件.第二,安裝到合適的路徑下.如果目標路徑不存在,則需要創建目標路徑,並且設置訪問許可權為 0700;如果目標路徑已經存在,那麼應用程序不要改變它的訪問許可權.同時,應用程序也應該處理沒有寫許可權或其他原因導致的不能安裝 .desktop 文件的情況,在這種情況下,應該提示用戶,然後退出安裝.GNOME 從 2.0 到 2.14 一直採用FreeDesktop.org 的 Desktop Entry 標準規定的 .desktop 文件格式.需要注意的是不同的 GNOME 版本對應不同版本的Desktop Entry標準,比如GNOME2.0對應的是Desktop Entry標準版本0.9.4.當前最新的Desktop Entry標準版本為0.9.8.下面的討論是基於GNOME2.2來進行的.

.desktop文件是個數據文件用來提供應用程序作為一個在菜單中的菜單項的信息.下表列出應用程序的.desktop文件的基本結構.



表1 .desktop文件的基本結構[1]

域Name、Comment和Icon的值都是和系統的區域設置相關的,它們都支持本地化.它的規則是域的名字加上後綴[區域設置],這裡區域設置是區域類型的值.它們符合區域設置的標準格式,即語言_國家.編碼@修正值(lang_COUNTRY.ENCODING@MODIFIER),這裡國家、編碼和修正值可以省略.需要注意的是,如果有支持本地化的域出現,那麼相應的那個沒有區域設置後綴的域也存在.

對於多用戶安裝,也就是用root用戶安裝,域Icon所指定的圖標文件預設存放目錄是/user/share/pixmaps/,推薦的圖標尺寸是48X48像素.對於單用戶安裝,圖標文件預設存放目錄是~/.icons/.可以使用Windows圖標文件,但使用絕對路徑.

在Accessability方面,GNOME對有特殊視覺需要的用戶提供了幾種圖標主題,它們包括低對比度圖標,高對比度圖標,反高對比度圖標.這些圖標的推薦尺寸也是48X48像素,如果可能的話,也可以同時設計16X16像素大小的圖標.對於GNOME2.2,這些特殊主題設計的圖標位於下面的目錄下.



/usr/share/icons/hicolor/<size>/apps/   /usr/share/icons/HighContrast/<size>/apps/   /usr/share/icons/HighContrastInverse/<size>/apps/   /usr/share/icons/HighContrastLargePrint/<size>/apps/   /usr/share/icons/HighContrastLargePrintInverse/<size>/apps/   /usr/share/icons/LargePrint/<size>/apps/   /usr/share/locolor/<size>/apps/   /usr/share/Locolor/<size>/apps/   /usr/share/LowContrast/<size>/apps/   /usr/share/LowContrastLargePrint/<size>/apps/   


,也是最重要的一點是把準備好的.desktop文件安裝到正確的目錄下.對於多用戶安裝,需要把它安裝到 /usr/share/applications/目錄下;對於單用戶,需要把它安裝到 ~/.gnome2/vfolders/applications/目錄下.

註冊MIME文件類型

應用程序可以使用兩種方法在 GNOME2 桌面系統註冊 MIME 文件類型.

GNOME2 提供一個文件 /etc/gnome-vfs-mime-magic(GNOME2.2) 來存放不同文件類型的特徵內容匹配模式.每個文件類型對應一個 MIME 文件類型的特殊匹配模式,GNOME通過搜索這些特殊模式來確定文件的 MIME 類型.下表列出了特徵內容模式匹配的結構.



表2 文件特徵內容模式匹配的基本結構[2]

下面是PDF文件格式的探測器,這個探測器將在文件頭尋找字元串"%PDF-"的模式匹配.它沒有模式掩碼,相對應的MIME類型是" application/pdf".



0	string	%PDF-			application/pdf   

,應用程序可以通過添加新的文件內容探測器來註冊新的MIME文件類型.

另一種方法是通過文件的後綴名來註冊新的MIME文件類型.如果GNOME通過文件內容探測器不能判斷文件的MIME類型,它就會查詢一些 .mime 文件,通過搜索 .mime文件內容中特定的文件名後綴來確定文件的MIME類型.user.mime 的優先順序要高於以其它名字,比如應用程序的名字命名的 .mime 文件.在 .mime 文件中,MIME 類型的定義格式如下:



MIME-type   ext: 這種MIME類型的後綴名列表   regex: 規則表達式來匹配文件名   

需要注意的是,上面表達式中後綴名列表和規則表達式和前面的冒號之間有個空格,否則只有第一個MIME-type的定義生效,它後面的定義將不起作用.這裡是file-roller註冊的部分MIME類型的表達式例子.



Application/x-tar   Ext: tar   Application/x-compressed-tar   Regex,2: .tar.gz$   Regex,2: .tar.Z$   Ext: tgz taz   

一般來講可以創建新的.mime文件來註冊新的MIME文件類型.同樣,對於多用戶安裝,GNOME會去/usr/share/mime-info/目錄下搜索;對於單用戶安裝,則需要把這些.mime文件安裝到~/.gnome/mime-info/目錄下.

利用這些.mime文件,在GNOME桌面系統註冊新的MIME文件類型,GNOME就可以認識它們了.有了.mime文件后,GNOME需要另外一個.keys文件給這個MIME類型建立可讀的名字和圖標.對於多用戶安裝和單用戶安裝.keys文件都和相應的.mime文件在同一個目錄下.同樣 User.keys的優先順序要高於以其它名字命名的.keys文件.它的文件格式也和.mime文件相似.下面是file-roller的.keys文件對MIME類型tar和compressed的描述部分.



Application/x-tar   Icon_filename=gnome-compressed   Short_list_application_ids_for_novice_user_level=file-roller   Short_list_application_ids_for_intermediate_user_level=file-roller   Short_list_application_ids_for_advanced_user_level=file-roller   Application/x-compressed   Icon_filename=gnome-compressed   Short_list_application_ids_for_novice_user_level=file-roller   Short_list_application_ids_for_intermediate_user_level=file-roller   Short_list_application_ids_for_advanced_user_level=file-roller   


File-roller的.keys文件的第一個條目定義了MIME類型Application/x-tar的MIME類型分類為 Application,代表這種類型文件的圖標文件為gnome-compressed,當在文件管理器中雙擊這個圖標所代表的文件時所用的預設應用為 file-roller.

圖標文件的預設搜索路徑為~/.icons/:/usr/share/pixmaps/.對於多用戶安裝,圖標應該存放在/usr/share/pixmaps/目錄下,推薦的大小是48X48.對於單用戶安裝,存放圖標的目錄是~/.icons/.[3]

Short_list_application條目所指定的應用程序是已經在GNOME桌面系統中註冊過的,,還需要一個文件來註冊應用程序.這就是下面要討論的應用程序集成的第三步註冊應用程序.

註冊應用程序

註冊應用程序建立了應用程序和它處理的MIME類型文件的關聯.應用程序註冊文件是.applications文件.對於多用戶,應該把它安裝到 /usr/share/gnome/application-registry目錄下;對於單用戶,應該安裝到~/.gnome/application -info/目錄下.下面列出file-roller的.applications文件部分內容.



file-roller            command=file-roller            name=File Roller            can_open_multiple_files=true            expects_terminal=false            mime_type=application/x-tar,application/x-compressed-tar…   

第一行是應用程序在註冊體系中的標識,它們對應.keys文件中那些Short_list_application條目所指定的應用程序的標識. "command"域指定了激活應用程序所需要的命令行,包括打開文件所需要的參數."name"域是出現在Open With菜單中應用程序的名字."expects_uris"域讓Nautilus知道這個應用程序是否接受uris.例如Mozilla能夠接受在命令行中用http:、 ftp: 等uris打開文件.如果這個域的值為真,則需要一個supported_uri_schemes條目來列出應用程序所支持的uri配置.一般來講,域" expects_terminal"的值為假,大多數的應用程序不需要在終端中運行."mime_types"列出所有這個應用程序所支持的MIME 類型.

GNOME2.8前的程序集成實例

下面介紹在GNOME2.2上集成單用戶安裝IBM Lotus Notes的示例.與Notes相關聯的文件類型為application/x-nsf和application/x-ntf兩種.

1) 安裝下面的notes.desktop文件到~/.gnome2/vfolders/applications/目錄下.



[Desktop Entry]   Version=7.0   Encoding=UTF-8   Name=IBM Lotus Notes   Type=Application   Exec=/home/junzhao/IBM/Lotus/notes   Icon=~/.icons/notes.png   Terminal=false   Categories=Core   

2) 安裝 Lotus Notes 應用程序的圖標文件 notes.png 到 ~/.icons 目錄下.完成這兩步后,可以在 GNOME 應用程序面板上看到 IBM Lotus Notes(見圖1).



圖1:應用程序面板上的 Notes 圖標

3) 安裝下面的 notes.mime 文件到 ~/.gnome/mime-info/ 目錄下.



application/x-nsf   	ext: nsf   application/x-ntf   	ext: ntf   	

4) 安裝下面的 notes.keys 文件到 ~/.gnome/mime-info/ 目錄下.



application/x-nsf   	description=IBM Lotus Notes NSF file   	icon_filename=notes   	default_action_type=application   	short_list_application_ids_for_novice_user_level=IBM Lotus Notes   application/x-ntf   	description=IBM Lotus Notes NTF file   	icon_filename=notes   	default_action_type=application   	short_list_application_ids_for_novice_user_level=IBM Lotus Notes   	


5)安裝 .nsf/ntf 文件類型的圖標文件到 ~/.icons 目錄下完成以上三步后,在文件夾中,能夠顯示.nsf/ntf文件的描述信息.重新登陸后就可以看到文件夾中,nsf/ntf 的圖標更新為 IBM Lotus Notes 的圖標(見圖2).

6) 安裝 notes.applications 文件到 ~/.gnome/application-info/ 目錄下.現在 Nautilus 可以在 .nsf/.ntf 的 Open With 菜單中指定 Lotus Notes 做為它的預設應用程序(見圖 2).



	   IBM Lotus Notes   	command=/home/junzhao/ IBM/Lotus/notes   	Name=IBM Lotus Notes   	can_open_multiple_files=true   	expects_uris=false   	mime_types=application/x-nsf,application/x-ntf   	



圖 2:文件夾視圖中的 nsf/ntf 文件和 Open With 菜單

GNOME2.8 及之後的程序集成實現方法

從 GNOME2.8 開始,在MIME類型的實現方法上最大的變化是 GNOME 採用了 XDG 提出的兩個規範,XDG 共享 MIME 信息規範(shared mime info specification)和 XDG 基本目錄規範(base directory specification).這兩個規範很大程度上解決了以前版本的主要問題,即不同的版本要求相應的MIME文件的預設路徑不同,並且沒有明確的文檔說明,這給應用程序的集成實現帶來很大的困難.同時,採用這些標準也統一了程序集成的實現方法,使之在GNOME的不同版本間,甚至是與KDE桌面系統兼容.

XDG 基本目錄規範

XDG基本目錄規範定義了五個重要的環境變數.這些環境變數統一了所有相關MIME文件的位置.

$XDG_DATA_HOME:定義了用戶相關的數據文件的基路徑.如果這個變數為空,或沒有定義,預設路徑$HOME/.local/share將被使用.

$XDG_CONFIG_HOME:定義了用戶相關的配置文件的基路徑.如果這個變數為空,或沒有定義,預設路徑為$HOME/.config.

$XDG_DATA_DIRS:定義了除了$XDG_DATA_HOME外數據文件的搜索路徑.超過一個的搜索路徑用冒號分隔.如果這個變數為空,或沒有定義,預設路徑為/usr/local/share/:/usr/share/.

$XDG_CONFIG_DIRS:定義了除了$XDG_CONFIG_HOME外的配置文件的搜索路徑.超過一個的搜索路徑用冒號來分隔.如果這個變數為空,或沒有定義,預設路徑為/etc/xdg/.

$XDG_CACHE_HOME:定義了用戶相關的非的數據的搜索路徑.如果這個變數為空,或沒有定義,預設路徑為$HOME/.cache.[4]

XGD共享MIME信息規範

XGD共享MIME信息規範定義了MIME資料庫的標準.MIME資料庫由一系列文件組成,這些文件定義了以知的MIME類型、決定文件MIME類型的方法、關於MIME類型的信息,比如文件可讀的描述及圖標.希望更改或增加MIME資料庫的MIME類型的應用程序應該在特定的路徑下安裝一個XML 文件.這個路徑為XDG_DATA_HOME:XDG_DATA_DIRS/mime/packages/.無論是安裝、卸載還是更改這個文件,應用程序都應該運行update-mime-database命令來更新MIME資料庫.update-mime-database的唯一參數是含有 packages/*.xml文件的mime路徑.例如,應用程序的XML文件安裝在 ~/.local/share/mime/packages/example_app.xml,那麼應該運行update-mime-database ~/.local/share/mime/.這個命令將掃描~/.local/share/mime/packages/下所有子目錄的XML文件,然後生成一批文件,這些文件就是所謂的MIME資料庫.當packages目錄下存在多個XML文件,並且存在信息衝突時,以更深層次目錄的XML文件為準,如果存在文件Override.xml,以它提供的信息為準.[5]

這個 XML 文件的文檔元素名為 mime-info,namespaceURI 為 http://www.freedesktop.org/standards/shared-mime-info.文檔元素可以含有零個或多個 mime-type 的子結點,每個子結點都描述了一種 MIME 類型.每個 mime-type 結點可以含有下列元素以任何順序的任何組合.

glob 元素用來根據文件的後綴名來決定文件的 MIME 類型,它的屬性是 pattern,如果文件的後綴名與這個 pattern 匹配,這個文件就屬於這個結點定義的 MIME 類型.

magic 元素用來根據文件的內容來決定文件的 MIME 類型,它含有一些 match 元素和一個可選項屬性 priority.這個屬性對所有的 match 元素起作用.通用的類型使用較小的值;具體的子類型使用較大的值.預設值為 50,最大值為 100.每個 match 元素有一些和前面講過的文件特徵內容模式匹配相似的屬性,具體的屬性在下表列出.



表3 magic元素的屬性[6]

alias元素表示除了屬性type指定的類型名字,它還有其它的別名.

sub-class-of元素表明這個MIME類型的文件同時也是這個元素所指定的MIME類型.例如,所有的image/svg文件也都是 text/xml,text/plain和application/octet-stream文件.有些文件類型的這種Sub-class-of關係是不言而喻的,比如所有的text/*類型都是text/plain類型.

comment元素定義了MIME類型的可讀的文字描述.可以用屬性xml:lang支持多語言. root-XML元素有兩個屬性namespaceURI和localName.如果文件被識別為是XML文件,那麼可以根據文件文檔元素的namespce和localname來進一步判斷它更具體的MIME類型.Localname是文檔的根元素的名字.

下面是file-roller在GNOME2.12的XML文件的部分內容.可以到/usr/share/mime/packages/下閱讀整個文件.



<?xml version="1.0" encoding="UTF-8"?>   <mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">   <!-- Most MIME types are already present in freedesktop.org.xml, but not all. -->     <mime-type type="application/x-rar">       <glob pattern="*.rar" />     </mime-type>     <mime-type type="application/x-gzip">       <glob pattern="*.gz" />     </mime-type>   </mime-info>   

運行update-mime-database會產生下列MIME資料庫文件:

XDG_DATA_HOME:XDG_DATA_DIRS/mime/globs:含有從名字到MIME類型的對應.

XDG_DATA_HOME:XDG_DATA_DIRS/mime/magic:含有從文件內容到MIME類型的對應.

XDG_DATA_HOME:XDG_DATA_DIRS/XMLnamespaces:含有XML項到MIME類型的對應.

XDG_DATA_HOME:XDG_DATA_DIRS/MEDIA/SUBTYPE.xml:MIME類型的具體信息.MEDIA指MIME類型的類別,一般為application,SUBTYPE一般為x-***.

基於MIME資料庫的應用程序集成的實現

有了MIME資料庫,就等於完成了前面提到的應用程序集成的第二和第三方面:註冊MIME文件類型和建立應用程序和它處理的MIME類型的關聯.為了完成應用程序集成只剩下一步:註冊應用程序到GNOME桌面系統.創建.desktop文件,它的格式和在前面介紹的GNOME2.8之前的實現方法介紹的一樣.創建.desktop文件后,根據XDG base directory specification,對多用戶安裝,需要安裝到$XDG_DATA_DIRS/applications目錄下,如果$ XDG_DATA_DIRS值為空,使用預設路徑/usr/share/applications.對於單用戶安裝,需要安裝到$ XDG_DATA_HOME/applications目錄下,如果$XDG_DATA_HOME值為空,使用預設路徑 ~/.local/share/applications.創建或修改.desktop文件后,需要運行update-desktop-database 命令以生成mimeinfo.cache.[7]

,通過創建或修改defaults.list文件來指定這種MIME類型文件的預設應用程序.defaults.list存在與$ XDG_DATA_HOME/applications/或$XDG_DATA_DIRS/applications/.下面是一個 defaults.list的例子.



[Default Applications]   application/pdf=evince.desktop   text/html=firefox.desktop   text/plain=gedit.desktop   image/jpeg=eog.desktop   

GNOME2.8及之後的程序集成實例

下面介紹在GNOME2.12上集成單用戶安裝的Lotus Notes的示例.

1) 創建並安裝notes.desktop文件到~/.local/share/applications.它的內容和前面的實例中的notes.desktop一樣.

2) 安裝Lotus Notes應用程序的圖標文件到~/.icons/目錄下.

3) 運行update-desktop-database命令生成mimeinfo.cache.

完成這三步后,可以在GNOME應用程序面板上看到IBM Lotus Notes(見圖3).



圖3:GNOME2.12 應用程序面板上的IBM Lotus Notes應用

4) 創建並安裝下面notes.xml文件到~/.local/share/mime/packages/目錄下.



<?xml version="1.0" encoding="UTF-8"?>   <mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">   <mime-type type="application/x-extension-nsf"><comment>nsf document</comment><glob pattern="*.nsf"/></mime-type>   <mime-type type="application/x-extension-ntf"><comment>nsf document</comment><glob pattern="*.ntf"/></mime-type>   </mime-info>   


5) 運行update-mime-database ~/.local/share/mime/命令生成MIME資料庫.

6) 創建並安裝下面的defaults.list文件到~/.local/share/applications目錄下.



[Default Applications]   application/x-nsf=notes.desktop   application/x-ntf=notes.desktop   



圖4:GNOME2.12文件夾視圖中的nsf/ntf文件和Open With菜單

結論

GNOME2不同版本桌面系統的MIME類型定義實現方法有較大的變化,在開發GNOME2應用程序與桌面系統集成時要注意GNOME不同版本的兼容.通過本文的討論,讀者可以獲得在GNOME2桌面系統中集成應用程序的全面參考,從而幫助讀者減少應用程序與GNOME桌面系統集成的開發時間.




[火星人 via ] GNOME2 桌面系統中基於 MIME 類型的應用程序集成已經有164次圍觀

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