国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 網絡通信 > 正文

用 DCOP 連接 KDE 應用程序

2019-11-04 21:05:46
字體:
來源:轉載
供稿:網友

    每一個 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
用 DCOP 連接 KDE 應用程序(圖一)

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

例 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
用 DCOP 連接 KDE 應用程序(圖二)

圖 3. 彈出您喜愛的站點
用 DCOP 連接 KDE 應用程序(圖三)

    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 連接 KDE 應用程序(圖四)

假如您以前沒有這樣用過,那么告訴您,在 `字符間包括一些內容是表示先執行 `字符之間的命令,并用結果替換 ` 字符間的內容。因此命令

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”鏈接,它能告訴您遠遠超過您所需要知道的有關此話題的內容。

 

QQread.com 推出各大專業服務器評測 linux服務器的安全性能 SUN服務器 HP服務器 DELL服務器 IBM服務器 聯想服務器 浪潮服務器 曙光服務器 同方服務器 華碩服務器 寶德服務器

其他綁定


除了前面提到的用于 DCOP 的工具和 C 綁定以外,還有很多其他的 DCOP 綁定,為許多其他常見的編程/腳本語言(包括 Perl、java、Python、C,等等)提供了 DCOP 接口。


這些綁定包含在 kdebindings 包中,您需要根據您使用的 Linux 發行版本單獨安裝。

結束語


我希望本文可以了解一些 DCOP 的強大之處,啟發您將 DCOP 功能添加到您自己的應用程序中去,并可以以有趣的方式組合已有的 KDE 程序程序。

參考資料

  • KDE Web 站點您將會找到很多為 KDE 開發者預備的 DCOP文檔。
  • 關于 DCOP 的 KDE 文檔包括 David Sweet 等人編寫的 KDE 2.0 Development(Sams Publishing, 2001) 一書的 Chapter 13. DCOP-Desktop Communication Protocol的在線拷貝,以及 Preston Brown 和 Matthias Ettrich 的 DCOP 文檔。后兩者還負責著 dcop Class Index
  • Bernd Gehrmann 的 KDE Architecture Overview 中 Chapter 4. Components and services也有一些關于 DCOP 和 DCOP 服務的信息。
  • Ladislav Strojil 還在他的 What is DCOP?網頁上給出了一些信息。
  • RPC/ipC within Kde討論了 DCOP,并給出了使用 Java、sh、Perl 和其他語言的例子。
  • 在“ Boost your efficiency”( Linux Magazine,2003 年 11 月)中,Scott Wheeler 用 DCOP 和腳本將他的計算機變成了一個帶時鐘的收音機。
  • 在“ Using DCOP from the command-line”( Linux Gazette,2003 年 12 月)中,Jimmy O'Regan 用 DCOP 和腳本來制造從 shell 中可以得到的 e-Post-It 通知。
  • Kopete是 KDE 即時消息系統。
  • KDevelop遵循 GPL,可以公開地獲得,它支持很多編程語言,包括 Ada、Java、SQL、Perl、C,等等。
  • 您可以自 kdcop CVS下載 DCOP 圖形瀏覽器。
  • Ian Reinhart Geiser 為您的應用程序創建了一個關于 編譯 dcom 接口的幻燈片。
  • kdebindings 軟件包中包括對 Java 的 Qt/KDE 綁定,讓我們可以在 Java 中使用 Qt/KDE 類,還包括對 C、Java、Perl、Python 的綁定,讓我們可以在這些語言中使用 DCOP,還包括 XParts,讓我們可以將非 KDE 應用程序作為一個 KPart 嵌入。
  • 閱讀 Martyn Honeyford 的其他 developerWorks 文章
  • IntrodUCtion to KDEdeveloperWorks,2001 年 5 月)主要針對版本 2.1,但是同樣很大程度上適用于后期的版本。
  • 文章“ 用 KParts 編碼”( developerWorks,2002 年 2 月)介紹了 KDE 的圖形組件系統結構,并比較了 KParts 和其他組件模型。
  • 通過 David Faure 的教程“ 創建 KParts 組件”( developerWorks,2002 年 5 月)深入學習 KParts 編碼。
  • DCOP 通過套接字進行通信。通過 David Mertz 的教程“ Linux Socket 編程”( developerWorks,2003 年 10 月)來深入學習這一靈活的技術。
  • developerWorks Linux 專區可以找到更多為 Linux 開發者預備的參考資料。
  • 在 Developer Bookstore 的 Linux 區可以找到很多精選的 Linux 書籍。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 普洱| 灵台县| 出国| 双辽市| 文水县| 虹口区| 娱乐| 龙州县| 全椒县| 普兰县| 连云港市| 墨江| 金川县| 合水县| 南溪县| 灵武市| 通江县| 德格县| 临湘市| 宁城县| 郓城县| 黄山市| 昌都县| 枞阳县| 荆州市| 盖州市| 绥化市| 开封市| 新安县| 玛曲县| 阿克| 皋兰县| 雅安市| 瑞安市| 河北区| 攀枝花市| 梅河口市| 汤原县| 施秉县| 松桃| 牙克石市|