DCOP

来源:互联网 发布:11房间网络已断开 编辑:程序博客网 时间:2024/05/02 04:52
 

每一个 KDE 桌面(从版本 2.0 起)都包含了一个鲜为人知但非常强大的部件,叫做“Desktop COmmunicationProtocol”,或者简称为 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. 刷新桌面

自终端或者 KDE 菜单栏启动 kdcop。

在应用程序列表中,展开“kwin”(KDE 窗口管理器)。

现在展开“KWinInterface”以显示出接口所提供的所有函数。

现在可以双击那些函数来执行它们。比如,双击 refresh() ,然后您就会看到桌面被刷新了,双击 nextDesktop() ,显示就会切换到下一个虚拟桌面。

例 2. 打开一个新的 Konqueror 窗口

自终端或者 KDE 菜单栏启动 kdcop。

确保您有一个 Konqueror 实例在运行 -- 如果在列表中没有出现,那么启动一个新的实例。它应该显示为“konqueror-NNNNN”,其中 NNNNN 是 Konqueror 进程的 PID 号。

在应用程序列表中,展开“konqueror-NNNNN”。

现在展开“KonquerorInterface”以显示出接口所提供的所有函数。

现在双击 openBrowserWindow() 。

将显示出一个对话框,要求您给出一个 URL 参数。输入一个您选择的完整的 URL(例如“http://www.ibm.com/”)并点击 OK。

现在您应该会看一个定向到您所指定的 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 感知的应用程序

开始,启动 KDevelop(我从 K 菜单中使用 run 命令)。 我们在Project 菜单中选择“New Project”,这将激活“Create New Project”向导。如果在其中展开 C 树,并展开 C树下的 KDE 树,我们应该会看一个叫做“Application Framework”的条目。选择这个条目,给出您的应用程序名(例如dwdcopapp)并填写其他需要的地方。 继续完成向导其余的部分(大部分情况下您可以只是选择“Next”),直到结束。当项目创建后,用KDevelop 编译并运行它(第一次编译时您将不得不同意运行 automake 和 friends)。

现在如果我们启动 dcop(或者 kdcop),可以看到有一个对应于我们刚刚创建的应用程序的条目!

如果我们看看 (k)dcop 中的条目,可以看到已经有了许多功能 -- 我们可以打开一个 URL,退出应用程序,等等。

现在我们来看如何添加一个新函数到通过 dcop 导出的列表中。由于我们在应用程序中已经创建并初始化了一个 DCOP 接口,要做的最简单的事情就是向已有接口添加一个新方法。

编辑 dwdcopappIface.h,利用下面的签名在 k_dcop: 部分中添加一个新方法:

virtual void dwprintln(QString str) = 0;

向 dwdcopappView.h 的 public: 部分添加同样的方法签名。

将下面的实现我们的新函数的代码添加到 dwcopappView.cpp:

void dwdcopappView::dwprintln((QString str)

{

std::cout << " We've been asked to print: " << str << endl;

std::cout.flush();

}

注意,您还必须将:

#include <iostream>

放置于已有 include 指令之后。 编译并执行程序。现在如果我们启动(k)dcop,将会看到 dwprintln(QString) 方法已经添加到了 dwdcopappIface接口中。如果您执行这个方法并传递一个字符串,它将被输出到输出窗口(或者,如果您是在 KDevelop之外启动这个应用程序的话,会被输出到命令行)。

同样可以添加另外的方法。可以用添加 dwdcopappIface的相同方式,向应用程序添加另外的接口。有兴趣的读者应该阅读后面 参考资料中列出的“DCOP documentation for KDEdevelopers”链接,它能告诉您远远超过您所需要知道的有关此话题的内容。

其他绑定

除了前面提到的用于 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(SamsPublishing, 2001) 一书的 Chapter 13. DCOP-Desktop CommunicationProtocol的在线拷贝,以及 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 KDE( developerWorks,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 书籍。

原创粉丝点击