歡迎您光臨本站 註冊首頁

用 DCOP 連接 KDE 應用程序

←手機掃碼閱讀     火星人 @ 2014-03-12 , reply:0
  

在 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. 使用 DCOP

這還可以進一步展開,直到找到期望的函數。雙擊那個函數可以調用它(如果需要參數的話會詢問)。

例 1. 刷新桌面

  1. 自終端或者 KDE 菜單欄啟動 kdcop。
  2. 在應用程序列表中,展開“kwin”(KDE 窗口管理器)。
  3. 現在展開“KWinInterface”以顯示出介面所提供的所有函數。
  4. 現在可以雙擊那些函數來執行它們。比如,雙擊 refresh() ,然後您就會看到桌面被刷新了,雙擊 nextDesktop() ,顯示就會切換到下一個虛擬桌面。

例 2. 打開一個新的 Konqueror 窗口

  1. 自終端或者 KDE 菜單欄啟動 kdcop。
  2. 確保您有一個 Konqueror 實例在運行 -- 如果在列表中沒有出現,那麼啟動一個新的實例。它應該顯示為“konqueror-NNNNN”,其中 NNNNN 是 Konqueror 進程的 PID 號。
  3. 在應用程序列表中,展開“konqueror-NNNNN”。
  4. 現在展開“KonquerorInterface”以顯示出介面所提供的所有函數。
  5. 現在雙擊 openBrowserWindow() 。
  6. 將顯示出一個對話框,要求您給出一個 URL 參數。輸入一個您選擇的完整的 URL(例如“http://www.ibm.com/”)並點擊 OK。
  7. 現在您應該會看一個定向到您所指定的 URL 的新的瀏覽器窗口。

圖 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 感知的應用程序

  1. 開始,啟動 KDevelop(我從 K 菜單中使用 run 命令)。
  2. 我們在 Project 菜單中選擇“New Project”,這將激活“Create New Project”嚮導。
  3. 如 果在其中展開 C++ 樹,並展開 C++ 樹下的 KDE 樹,我們應該會看一個叫做“Application Framework”的條目。選擇這個條目,給出您的應用程序名(例如 dwdcopapp)並填寫其他需要的地方。
  4. 繼續完成嚮導其餘的部分(大部分情況下您可以只是選擇“Next”),直到結束。
  5. 當項目創建后,用 KDevelop 編譯並運行它(第一次編譯時您將不得不同意運行 automake 和 friends)。
  6. 現在如果我們啟動 dcop(或者 kdcop),可以看到有一個對應於我們剛剛創建的應用程序的條目!
  7. 如果我們看看 (k)dcop 中的條目,可以看到已經有了許多功能 -- 我們可以打開一個 URL,退出應用程序,等等。

現在我們來看如何添加一個新函數到通過 dcop 導出的列表中。由於我們在應用程序中已經創建並初始化了一個 DCOP 介面,要做的最簡單的事情就是向已有介面添加一個新方法。

  1. 編輯 dwdcopappIface.h,利用下面的簽名在 k_dcop: 部分中添加一個新方法:

virtual void dwprintln(QString str) = 0;

  1. 向 dwdcopappView.h 的 public: 部分添加同樣的方法簽名。
  1. 將下面的實現我們的新函數的代碼添加到 dwcopappView.cpp:


void dwdcopappView::dwprintln((QString str)
{
std::cout << " We've been asked to print: " << str << endl;
std::cout.flush();
}


注意,您還必須將

#include <iostream>

放置於已有 include 指令之後。

  1. 編譯並執行程序。
  2. 現在如果我們啟動 (k)dcop,將會看到 dwprintln(QString) 方法已經添加到了 dwdcopappIface 介面中。如果您執行這個方法並傳遞一個字元串,它將被輸出到輸出窗口(或者,如果您是在 KDevelop 之外啟動這個應用程序的話,會被輸出到命令行)。
  3. 同樣可以添加另外的方法。

可以用添加 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 應用程序已經有727次圍觀

http://coctec.com/docs/program/show-post-71854.html