Linux系统下用DCOP连接KDE应用程序
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 KDE developers”链接,它能告诉您远远超过您所需要知道的有关此话题的内容。



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