Linux系统下用DCOP连接KDE应用程序

时间:2007-01-19 14:17:19  来源:  作者:
将显示出所有以“konq”打头的活动的 dcop 客户机。按 Unix 惯例,我们可以与 head 命令组合使用,只得到第一个结果,如下:

dcop konq* | head -1EcV第一天空网络
EcV第一天空网络
 EcV第一天空网络
    这将只输出一个“konqueror-NNNNN”(或者如果没有 Konqueror 进程在运行则什么也不输出)。最后我们希望将这个惟一的“konqueror-NNNNN”传递给 dcop,并调用适当的函数来打开一个 URL -- 在 bash 中我们只需要借助 ` 字符就可以做到这一点,如下: EcV第一天空网络

EcV第一天空网络
dcop `dcop konq* | head -1` konqueror-mainwindow#1 EcV第一天空网络
EcV第一天空网络
openURL www.ibm.com/developerWorksEcV第一天空网络
EcV第一天空网络
  EcV第一天空网络

EcV第一天空网络

EcV第一天空网络
EcV第一天空网络
图 4. 甚至可以为调用您喜爱的 Web 站点的命令行起一个别名EcV第一天空网络
EcV第一天空网络
如果您以前没有这样用过,那么告诉您,在 `字符间包括一些内容是表示先执行 `字符之间的命令,并用结果替换 ` 字符间的内容。因此命令: EcV第一天空网络

EcV第一天空网络
EcV第一天空网络
dcop `dcop konq* | head -1` konqueror-mainwindow#1 EcV第一天空网络
EcV第一天空网络
openURL www.ibm.com/developerWorksEcV第一天空网络
EcV第一天空网络
  EcV第一天空网络

将首先执行 `dcop konq* | head -1` 部分,我们得到的是: EcV第一天空网络

EcV第一天空网络
EcV第一天空网络
dcop konqueor-NNNNN konqueror-mainwindow#1 EcV第一天空网络
EcV第一天空网络
openURL www.ibm.com/developerWorksEcV第一天空网络
EcV第一天空网络
  EcV第一天空网络

接下来就可以正常执行,并给出我们期望的结果。 EcV第一天空网络

例 4. 使其全屏 EcV第一天空网络

在这个例子中,开始我们先启动一个新的 Konqueror 实例: EcV第一天空网络

EcV第一天空网络
EcV第一天空网络
konqueror &EcV第一天空网络
EcV第一天空网络
  EcV第一天空网络

然后我们让它加载 developerWorks: EcV第一天空网络

EcV第一天空网络
EcV第一天空网络
dcop konqueror-$! konqueror-mainwindow#1 openURL www.ibm.com/developerWorksEcV第一天空网络
EcV第一天空网络
  EcV第一天空网络

在 bash 中, $! 被 shell 自动替换为在后台启动的最后一个进程的 PID,这样,这个命令将改变我们刚刚启动的 Konqueror 应用程序的 URL。 EcV第一天空网络

最后,我们想让 Konqueror 全屏;这稍微复杂一些。对 kdcop 的一个短期调查显示,这里有一些看起来有趣的函数可能会有帮助。 EcV第一天空网络

konqueror-mainwindow#1 接口有一个 actions() 函数;执行这个函数我们会得到 action() 函数所有可用参数一个列表。查看这个列表,我们会看到其中有一个操作叫 做 fullscreen 。到现在为止,一切还都不错 -- 不过在 kdcop 中调用 action() 函数并将 fullscreen 作为参数传递给这个函数,会返回一个错误。看一下 action() 函数的函数原型就会明白,它返回的是一个 DCOPRef 类型。不幸的是,kdcop 不能正确地显示这些返回类型。 EcV第一天空网络

不过这没关系;我们可以用 dcop 完成同样的事情: EcV第一天空网络

EcV第一天空网络
EcV第一天空网络
dcop konqueror-$! konqueror-mainwindow#1 action fullscreenEcV第一天空网络
EcV第一天空网络
  EcV第一天空网络

这将返回: EcV第一天空网络

EcV第一天空网络
EcV第一天空网络
DCOPRef(konqueror-NNNNN,konqueror-mainwindow#1/action/fullscreen)EcV第一天空网络
EcV第一天空网络
  EcV第一天空网络

我们可以将这个返回值传递到 dcop 的另一个实例(还是借助方便的 ` 字符): EcV第一天空网络

EcV第一天空网络
EcV第一天空网络
dcop `dcop konqueror-$! konqueror-mainwindow#1 action fullscreen`EcV第一天空网络
EcV第一天空网络
  EcV第一天空网络

这会向我们给出可用函数的一个列表,其中 activate 看起来最像是我们要找的。让我们来试试: EcV第一天空网络

EcV第一天空网络
EcV第一天空网络
dcop `dcop konqueror-$! konqueror-mainwindow#1EcV第一天空网络
EcV第一天空网络
 action fullscreen` activateEcV第一天空网络
EcV第一天空网络

就是那样,Konqueror 进入了全屏模式。 EcV第一天空网络

最终的脚本如下所示: EcV第一天空网络

EcV第一天空网络
EcV第一天空网络
konqueror & EcV第一天空网络
EcV第一天空网络
dcop konqueror-$! konqueror-mainwindow#1 EcV第一天空网络
EcV第一天空网络
openURL www.ibm.com/developerWorks EcV第一天空网络
EcV第一天空网络
dcop `dcop konqueror-$! konqueror-mainwindow#1 EcV第一天空网络
EcV第一天空网络
action fullscreen` activateEcV第一天空网络
EcV第一天空网络
  EcV第一天空网络

注意,要退出全屏模式,您只需要右击 Konqueror 并在弹出的菜单中选择“Exit Full-Screen Mode”。EcV第一天空网络
EcV第一天空网络
例 5. 当联系者上线时立即发送消息 EcV第一天空网络

最后这个例子用到了 Kopete -- 一个 KDE 即时消息客户机。 EcV第一天空网络

到现在,这个脚本应该非常容易理解。它接受两个参数,联系者名 ($1) 和消息 ($2)。然后它进行循环,通过 dcop 得到可达联系者列表,并用 grep 来检查给出的名字是否出现,如果没有,则继续循环。如果出现了,循环终止并向联系者发送一条消息(还是用 DCOP)。 EcV第一天空网络

清单 1. 向 Falken 教授问候 EcV第一天空网络

EcV第一天空网络
EcV第一天空网络
name=$1; EcV第一天空网络

  msg=$2; EcV第一天空网络

  echo Waiting for $name to come online EcV第一天空网络

  while ((`dcop kopete KopeteIface EcV第一天空网络
EcV第一天空网络
   reachableContacts | grep -c $name` == 0)) EcV第一天空网络

  do EcV第一天空网络

    sleep 5 EcV第一天空网络

  done EcV第一天空网络

  echo Sending message "$msg" to "$name" EcV第一天空网络

  dcop kopete KopeteIface messageContact $name "$msg"EcV第一天空网络
EcV第一天空网络
  EcV第一天空网络

创建一个 DCOP 感知的应用程序 EcV第一天空网络

现在我们将创建一个 DCOP 感知的应用程序。简单起见,我将使用“KDevelop”集成开发环境,它有一个非常好的应用程序向导,可以为我们完成大部分工作。由于我是一个极端的人,我现在用的是 KDevelop 3.0 beta2,但是老一些的版本的步骤也基本上相同。 EcV第一天空网络

一个简单的 DCOP 感知的应用程序 EcV第一天空网络

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

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

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

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

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

EcV第一天空网络
EcV第一天空网络
virtual void dwprintln(QString str) = 0;EcV第一天空网络
EcV第一天空网络
  EcV第一天空网络

向 dwdcopappView.h 的 public: 部分添加同样的方法签名。 EcV第一天空网络

将下面的实现我们的新函数的代码添加到 dwcopappView.cpp: EcV第一天空网络

EcV第一天空网络
EcV第一天空网络
void dwdcopappView::dwprintln((QString str) EcV第一天空网络

{ EcV第一天空网络

std::cout << " We've been asked to print: " << str << endl; EcV第一天空网络

   std::cout.flush(); EcV第一天空网络

}EcV第一天空网络
EcV第一天空网络

注意,您还必须将: EcV第一天空网络

EcV第一天空网络
EcV第一天空网络
#include <iostream>EcV第一天空网络
EcV第一天空网络
  EcV第一天空网络

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

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

文章评论

共有 位天空网友发表了评论 查看完整内容

特别推荐
  • 文字广告
  • 文字广告
  • 文字广告
  • 文字广告
站长黑板报

24小时热门信息