在 KDE 桌面背後,暗藏著一系列強大的腳本技術,可以讓高級用戶自動地完成很多任務。在本文中,Martyn Honeyford 向我們介紹了這些技術,並解釋了如何才能讓它們發揮最大作用。
每 一個 KDE 桌面(從版本 2.0 起)都包含了一個鮮為人知但非常強大的部件,叫做“Desktop COmmunication Protocol”,或者簡稱為 DCOP。從開發者的角度來看,利用 DCOP 可以很方便地將強大的腳本功能添加到您的應用程序中。從用戶的角度來看,利用 DCOP 可以容易地控制您的 KDE 應用程序,並可以將它們以有趣且強大的方式組合起來。
什麼是 DCOP?
就 其本質而言,DCOP 是一個操作於套接字之上的輕量級進程間通信機制。DCOP 由一個伺服器(即 dcopserver,它在 KDE 啟動時會自動啟動)和任意多個客戶機(支持 DCOP 的應用程序)構成。DCOP 客戶機之間可以互相發送消息(通過伺服器)來請求信息,要求執行函數,等等。例如,Konqueror 可能會(確實是)向 KMail 發送 DCOP 消息,讓它啟動一個新窗口,新窗口的“To”域在點擊“mailto& rdquo;鏈接時填好。
|
使用 DCOP
為幫助我們使用 DCOP,KDE 桌面附帶了兩個有用的工具:dcop 和 kdcop。
KDE DCOP 瀏覽器 -- kdcop
這是一個圖形化的小工具,運行后可以列舉出機器上正在運行的所有 DCOP 客戶機,並以樹狀視圖的形式顯示出來。然後每個客戶機都可以被展開,以顯示出它支持哪些介面。
這還可以進一步展開,直到找到期望的函數。雙擊那個函數可以調用它(如果需要參數的話會詢問)。
例 1. 刷新桌面
例 2. 打開一個新的 Konqueror 窗口
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
如果您以前沒有這樣用過,那麼告訴您,在 `字元間包括一些內容是表示先執行 `字元之間的命令,並用結果替換 ` 字元間的內容。因此命令
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 教授問候
|
|
創建一個 DCOP 感知的應用程序
現在我們將創建一個 DCOP 感知的應用程序。
簡單起見,我將使用“KDevelop”集成開發環境,它有一個非常好的應用程序嚮導,可以為我們完成大部分工作。
由於我是一個極端的人,我現在用的是 KDevelop 3.0 beta2,但是老一些的版本的步驟也基本上相同。
一個簡單的 DCOP 感知的應用程序
現在我們來看如何添加一個新函數到通過 dcop 導出的列表中。由於我們在應用程序中已經創建並初始化了一個 DCOP 介面,要做的最簡單的事情就是向已有介面添加一個新方法。
virtual void dwprintln(QString str) = 0;
|
注意,您還必須將
#include <iostream>
放置於已有 include 指令之後。
可以用添加 dwdcopappIface 的相同方式,嚮應用程序添加另外的介面。有興趣的讀者應該閱讀後面 參考資料中列出的“DCOP documentation for KDE developers”鏈接,它能告訴您遠遠超過您所需要知道的有關此話題的內容。
|
其他綁定
除了前面提到的用於 DCOP 的工具和 C++ 綁定以外,還有很多其他的 DCOP 綁定,為許多其他常見的編程/腳本語言(包括 Perl、Java、Python、C,等等)提供了 DCOP 介面。
這些綁定包含在 kdebindings 包中,您需要根據您使用的 Linux 發行版本單獨安裝。
|
結束語
我希望本文可以了解一些 DCOP 的強大之處,啟發您將 DCOP 功能添加到您自己的應用程序中去,並可以以有趣的方式組合已有的 KDE 程序程序。
|
參考資料
在 KDE Web 站點您將會找到很多為 KDE 開發者準備的 DCOP文檔。
[火星人 ] 用 DCOP 連接 KDE 應用程序已經有815次圍觀