kde
上下文選單的動態修改
write by 九天雁翎(jtianling) -- blog.csdn.net/vagrxie
討論新聞組及檔案
事實上靜態改變kde
上下文選單網上還有些資料(以e
文為主),但是動態改變的我連e
文的資料都沒有看到,純靠自己看**摸索了。行文會比較亂,但是需要的人應該能找到自己所要的東西。文中複雜的行解釋時會與kde
源**相對應,以做備查。本文操作環境是kubuntu9.04
kde中的上下文選單是以.desktop
形式的配置檔案方式來管理的。此配置檔案強大到甚至支援多語言-_-!牛吧
首先檢視系統中此配置檔案所在的位置。通過kde4-config –path services
命令來檢視,下面是我機器中執行的例子:
jtianling@jtianling-laptop:~$ kde4-config --path services
/home/jtianling/.kde/share/kde4/services/:/usr/share/kde4/services/
即有kde4 services
配置的地方分別在/home/jtianling/.kde/share/kde4/services/
這個個人的目錄和/usr/share/kde4/services/
這個改變全域性配置的目錄。這點符合linux
的習慣,在沒有root
許可權或者僅僅想改變自己的操作習慣時,在自己的home
目錄下就能改變自己的配置,有root
許可權並且想改變所有使用者的配置時,去/usr
下面改。此處如是,這裡全部以修改全域性的為例。想嘗試的推薦首先備份。
首先進入services
目錄下的servicemenus
這個與上下文選單相關的配置目錄中去。
我們從乙個簡單的例子開始,下面是kubuntu 9.04
中自帶的乙個簡單選單項,類似於windows
下常用的command prompt here
和cygwin
的bash prompt here
,作用是在當前資料夾位置開啟乙個konsole
。對應的檔案是konsolehere.desktop:
[desktop entry]
type=service
x-kde-servicetypes=konqpopupmenu/plugin,inode/directory
actions=openterminalhere;
x-kde-authorizeaction=shell_access
[desktop action openterminalhere]
name=open terminal here
………name[zh_cn]
=在此開啟終端
name[zh_tw]
=在這裡開啟終端機
icon=utilities-terminal
exec=konsole --workdir %f
x-ubuntu-gettext-domain=desktop_kdebase
乙個乙個解釋一下:
配置的方式就與普通的ini
檔案類似,
用於分段,***=yyy
用於配置。這裡解釋一下配置選項。
type=
service
grep –r –e 『type=s』 * wc –l
一共有822個service,但是
grep –r –e 『type=^s』
乙個也沒有,所以,直接將此行預設存在就完了。
x-kde-servicetypes=
konqpopupmenu/plugin,inode/directory
還是參考一有說明,konqpopupmenu/plugin
表示是konqueror
的外掛程式,inode/directory
表示在指定目錄或目錄中的時候也有效。
還可以用all/all
,all/allfiles
表示所有檔案,以逗號分隔。
actions=
openterminalhere;
標明動作,由接下來的[desktop action openterminalhere]
分段具體說明
x-kde-authorizeaction=
shell_access
很明顯,所要的許可權,此處為shell_access
[desktop action openterminalhere]
新的分節,後面的openterminalhere與前面定義的動作一致,整個分節是對此動作的乙個詳細說明。
name=
open terminal here
說明顯示的選單的名字,通過name[zh_cn]
這樣的形式支援多語言版本
icon=
utilities-terminal
指定圖示
exec=
konsole --workdir %f
指定選單命令
上述的東西都不是關鍵,也不算什麼難點,下面真的好戲登場了。
這在kde
中算是新鮮課題,一則少有人知,甚至沒有找到e
文資料,二則我看到在kde
的changelog
中竟然提到kdesvn
的作者發現了其中有一些問題。(見
)說明平時用的人估計也少。要不是有kdesvn
作者走在前面,我連看源**的頭緒都沒有,向rajko albrecht
致敬。
下面是kdesvn
的配置片段:
[desktop entry]
type=service
servicetypes=konqpopupmenu/plugin,inode/directory,all/all,all/allfiles
x-kde-submenu=subversion (kdesvn)
x-kde-getactionmenu=org.kde.kded /modules/kdesvnd org.kde.kdesvnd getactionmenu
actions=log;info;add;addnew;delete;revert;rename;import;checkout;switch;merge;blame;createpatch;export;diff;update;commit;checkoutto;exportto;tree;
其他的都好說了,主要的問題在x-kde-getactionmenu=org.kde.kded /modules/kdesvnd org.kde.kdesvnd getactionmenu
一句,kdesvn
也就是靠此句實現了動態的上下文選單。
從應用上看,對於非svn
工程的目錄,在平時顯示的是checkout from a repository
和export from a subversion repository
,而actions
裡面也有,而actions
裡面還有當目標的確是乙個svn
工程的目錄時的一大堆選項。說明事實上選項是通過某個函式進行篩選然後顯示的。看上面的配置,很顯然是x-kde-getactionmenu
配置的getactionmenu
函式(從命名上猜的),通過關鍵字,我定位到了關鍵的kde
源**:
kdelibs/kio/kio/kdesktopfileactions.cpp:219開始
qlistkdesktopfileactions::userdefinedservices(constkservice& service,boolblocalfiles,constkurl::list & file_list )
else
原始碼可以看出,其一,我們分析配置檔案沒有錯誤,此行的確是關鍵,其二,獲取具體字串的方式利用了d-bus
這個程序間通訊手段遠端呼叫了getactionmenu
這個函式,然後獲取到了乙個字串list
,此list
就是我們最後看到的選單項。至此,一切問題已經得到解決,動態選單的關鍵就是以x-kde-getactionmenu
配置然後通過d-bus
呼叫函式。d-bus
作為linux
下非常流行的程序間通訊手段就遠沒有kde
動態選單這麼神秘了,資料豐富的多,需要的就自己去查閱吧。
1.kde tech base
,konqueror service menu
write by
九天雁翎
(jtianling) -- blog.csdn.net/vagrxie
ContextMenu上下文選單
上下文選單一般是真針對listview 多條資料的操作 需求 在listview中顯示聯絡歷史的 號碼,長按顯示的上下文選單為複製號碼到撥號盤 傳送資訊 複製號碼,與之相對應的事件。布局 1 linearlayout xmlns android 2android layout width match...
建立以及響應選單 上下文選單
建立選單 override oncreateoptionmenu menu menu,menuinflater inflater 用引數inflater的inflate方法,把menu檔案的資源傳入menu中,該選單指的是位於工具欄的選單。響應選單 override onoprionsitemsel...
Android上下文選單,長按出現的選單
1.定義上下文選單資源 在menu目錄下建立list item context.xml xmlns android android id id action delete android icon android drawable ic menu delete android showasactio...