每一個 KDE 桌面(從版本 2.0 起)都包含了一個鮮為人知但非常強大的部件,叫做“Desktop COmmunication PRotocol”,或者簡稱為 DCOP.從開發者的角度來看,利用 DCOP 可以很方便地將強大的腳本功能添加到您的應用程序中。從用戶的角度來看,利用 DCOP 可以輕易地控制您的 KDE 應用程序,并可以將它們以有趣且強大的方式組合起來。
什么是 DCOP?
就其本質而言,DCOP 是一個操作于套接字之上的輕量級進程間通信機制。DCOP 由一個服務器(即 dcopserver,它在 KDE 啟動時會自動啟動)和任意多個客戶機(支持 DCOP 的應用程序)構成。DCOP 客戶機之間可以互相發送消息(通過服務器)來請求信息,要求執行函數,等等。例如,Konqueror 可能會(確實是)向 KMail 發送 DCOP 消息,讓它啟動一個新窗口,新窗口的“To”域在點擊“mailto”鏈接時填好。
使用 DCOP
為幫助我們使用 DCOP,KDE 桌面附帶了兩個有用的工具:dcop 和 kdcop。
KDE DCOP 瀏覽器 -- kdcop
這是一個圖形化的小工具,運行后可以列舉出機器上正在運行的所有 DCOP 客戶機,并以樹狀視圖的形式顯示出來。然后每個客戶機都可以被展開,以顯示出它支持哪些接口。
圖 1. 使用 DCOP
這還可以進一步展開,直到找到期望的函數。雙擊那個函數可以調用它(假如需要參數的話會詢問)。
例 1. 刷新桌面
refresh() ,然后您就會看到桌面被刷新了,雙擊 nextDesktop() ,顯示就會切換到下一個虛擬桌面。 例 2. 打開一個新的 Konqueror 窗口
openBrowserWindow() 。
圖 2. 輸入 URL
圖 3. 彈出您喜愛的站點
kdcop 是一個優秀的小工具,可以用來發現一個應用程序支持哪些接口,而第二個標準工具,簡單地叫做“dcop”,可以更好地滿足日常工作的需要。
KDE 控制臺 DCOP 客戶機 -- dcop
命令行工具“dcop”本質上與 kdcop 是相同的,但是它是在命令行中使用。因此,它對于編寫腳本來說更為有用。
做一點說明,從現在起,小寫的 dcop 表示命令行工具,大寫的 DCOP 表示泛泛的 DCOP 體系結構。
讓我們來舉出一些例子,看看您可以用 dcop 工具來做哪些事情。
例 3. 加載 developerWorks
與前面一樣,Konqueror 進程在 dcop 中顯示為“konqueror-NNNNN”,其中 NNNNN 是 pid(進程 ID)。
幸好,dcop 支持通配符,因此下面的命令,
dcop konq*
將顯示出所有以“konq”打頭的活動的 dcop 客戶機。
按 Unix 慣例,我們可以與 head 命令組合使用,只得到第一個結果,如下:
dcop konq* head -1
這將只輸出一個“konqueror-NNNNN”(或者假如沒有 Konqueror 進程在運行則什么也不輸出)。
最后我們希望將這個惟一的“konqueror-NNNNN”傳遞給 dcop,并調用適當的函數來打開一個 URL -- 在 bash 中我們只需要借助 ` 字符就可以做到這一點,如下:
dcop `dcop konq* head -1` konqueror-mainwindow#1 openURL www.ibm.com/developerWorks
圖 4. 甚至可以為調用您喜愛的 Web 站點的命令行起一個別名
假如您以前沒有這樣用過,那么告訴您,在 `字符間包括一些內容是表示先執行 `字符之間的命令,并用結果替換 ` 字符間的內容。因此命令
dcop `dcop konq* head -1` konqueror-mainwindow#1 openURL www.ibm.com/developerWorks
將首先執行 `dcop konq* head -1` 部分,我們得到的是
dcop konqueor-NNNNN konqueror-mainwindow#1 openURL www.ibm.com/developerWorks
接下來就可以正常執行,并給出我們期望的結果。
例 4. 使其全屏
在這個例子中,開始我們先啟動一個新的 Konqueror 實例:
konqueror &
然后我們讓它加載 developerWorks:
dcop konqueror-$! konqueror-mainwindow#1 openURL www.ibm.com/developerWorks
在 bash 中, $! 被 shell 自動替換為在后臺啟動的最后一個進程的 PID,這樣,這個命令將改變我們剛剛啟動的 Konqueror 應用程序的 URL。
最后,我們想讓 Konqueror 全屏;這稍微復雜一些。
對 kdcop 的一個短期調查顯示,這里有一些看起來有趣的函數可能會有幫助。
konqueror-mainwindow#1 接口有一個 actions() 函數;執行這個函數我們會得到 action() 函數所有可用參數一個列表。查看這個列表,我們會看到其中有一個操作叫 做 fullscreen 。到現在為止,一切還都不錯 -- 不過在 kdcop 中調用 action() 函數并將 fullscreen 作為參數傳遞給這個函數,會返回一個錯誤。看一下 action() 函數的函數原型就會明白,它返回的是一個 DCOPRef 類型。不幸的是,kdcop 不能正確地顯示這些返回類型。
不過這沒關系;我們可以用 dcop 完成同樣的事情:
dcop konqueror-$! konqueror-mainwindow#1 action fullscreen
這將返回
DCOPRef(konqueror-NNNNN,konqueror-mainwindow#1/action/fullscreen)
我們可以將這個返回值傳遞到 dcop 的另一個實例(還是借助方便的 ` 字符):
dcop `dcop konqueror-$! konqueror-mainwindow#1 action fullscreen`
這會向我們給出可用函數的一個列表,其中 activate 看起來最像是我們要找的。讓我們來試試:
dcop `dcop konqueror-$! konqueror-mainwindow#1 action fullscreen` activate
就是那樣,Konqueror 進入了全屏模式。
最終的腳本如下所示:
konqueror &
dcop konqueror-$! konqueror-mainwindow#1 openURL www.ibm.com/developerWorks
dcop `dcop konqueror-$! konqueror-mainwindow#1 action fullscreen` activate
注重,要退出全屏模式,您只需要右擊 Konqueror 并在彈出的菜單中選擇“Exit Full-Screen Mode”。
例 5. 當聯系者上線時立即發送消息
最后這個例子用到了 Kopete -- 一個 KDE 即時消息客戶機。
到現在,這個腳本應該非常輕易理解。它接受兩個參數,聯系者名 ($1) 和消息 ($2)。然后它進行循環,通過 dcop 得到可達聯系者列表,并用 grep 來檢查給出的名字是否出現,假如沒有,則繼續循環。假如出現了,循環終止并向聯系者發送一條消息(還是用 DCOP)。
清單 1. 向 Falken 教授問候
name=$1; msg=$2; echo Waiting for $name to come online while ((`dcop kopete KopeteIface reachableContacts grep -c $name` == 0)) do sleep 5 done echo Sending message "$msg" to "$name" dcop kopete KopeteIface messageContact $name "$msg"
創建一個 DCOP 感知的應用程序
現在我們將創建一個 DCOP 感知的應用程序。
簡單起見,我將使用“KDevelop”集成開發環境,它有一個非常好的應用程序向導,可以為我們完成大部分工作。
由于我是一個極端的人,我現在用的是 KDevelop 3.0 beta2,但是老一些的版本的步驟也基本上相同。
一個簡單的 DCOP 感知的應用程序
run 命令)。 現在我們來看如何添加一個新函數到通過 dcop 導出的列表中。由于我們在應用程序中已經創建并初始化了一個 DCOP 接口,要做的最簡單的事情就是向已有接口添加一個新方法。
virtual void dwprintln(QString str) = 0;
void dwdcopappView::dwprintln((QString str){ std::cout << " We've been asked to print: " << str << endl; std::cout.flush();} 注重,您還必須將
#include <iostream>
放置于已有 include 指令之后。
dwprintln(QString) 方法已經添加到了 dwdcopappIface 接口中。假如您執行這個方法并傳遞一個字符串,它將被輸出到輸出窗口(或者,假如您是在 KDevelop 之外啟動這個應用程序的話,會被輸出到命令行)。 可以用添加 dwdcopappIface 的相同方式,向應用程序添加另外的接口。有愛好的讀者應該閱讀后面 參考資料中列出的“DCOP documentation for KDE developers”鏈接,它能告訴您遠遠超過您所需要知道的有關此話題的內容。
QQread.com 推出各大專業服務器評測 linux服務器的安全性能 SUN服務器 HP服務器 DELL服務器 IBM服務器 聯想服務器 浪潮服務器 曙光服務器 同方服務器 華碩服務器 寶德服務器
其他綁定
除了前面提到的用于 DCOP 的工具和 C 綁定以外,還有很多其他的 DCOP 綁定,為許多其他常見的編程/腳本語言(包括 Perl、java、Python、C,等等)提供了 DCOP 接口。
這些綁定包含在 kdebindings 包中,您需要根據您使用的 Linux 發行版本單獨安裝。
結束語
我希望本文可以了解一些 DCOP 的強大之處,啟發您將 DCOP 功能添加到您自己的應用程序中去,并可以以有趣的方式組合已有的 KDE 程序程序。
參考資料
新聞熱點
疑難解答