Chinaunix首页 | 论坛 | 博客
  • 博客访问: 101097352
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-03-23 12:27:08

来源:中国IT实验室    作者:中国IT实验室

每一个 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. 刷新桌面

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

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

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

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

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

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

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

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

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

现在双击 openBrowserWindow() 。

将显示出一个对话框,要求您给出一个 URL 参数。输入一个您选择的完整的 URL(例如“”)并点击 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 

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

同样可以添加另外的方法。可以用添加 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 文档包括 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 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 书籍。

 

阅读(229) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~