当前位置:操作系统 > Unix/Linux >>

远程控制 KDE 应用程序

应用程序的远程控制指的是当其正处于运行状态时,除了能够接受通常的用户动作之外,还可以被命令行中的命令甚至脚本进行操作。DCOP是KDE桌面环境中的进程间通信协议,它允许程序向外界暴露自己的一些接口,也是实现对KDE应用程序进行远程控制的基础。

一、简介

对许多Linux用户来讲,基于命令行的操作模式和强大的脚本功能是最能吸引他们的原因之一,这也难怪为什么像Netscape这样基于图形界面的应用程序,会专门提供相应的远程控制(remote control)功能,以便用户能够在命令行方式下对其进行控制。显然,如果Linux下的GUI应用程序能够在运行的时候很方便地通过命令或者脚本进行控制,那么它就能够更好地同其它程序进行功能集成和操作协同,从而也就更容易被广大用户所接受。遗憾的是,要想在程序中实现类似的功能并不容易,因为这会牵涉到进程间通信等诸多技术难题,好在KDE提供的DCOP(Desktop COmmunication Protocol)简化了这一工作。

DCOP是一个轻量级的桌面通信协议,它采用了非常简单的通信模型:每个用到DCOP的应用程序都是一个客户端(client),它们通过共同的DCOP服务器进行交互,DCOP服务器在整个KDE桌面环境中只有一个实例,它在KDE初始化时被自动创建,主要用来完成诸如消息派发这样的协调工作。

从KDE 2.0开始,DCOP就逐渐成为了在KDE应用程序间进行通信和交互的标准方法,凡是实现了该机制的KDE应用程序都能够向外界暴露自己的一些功能性接口,这样其它程序(不一定非得是KDE程序)如果需要的话就可以通过对这些接口的访问,来请求KDE应用程序完成相应的功能。如果仅仅从技术角度来看,DCOP只不过是一个基于socket的进程间通信协议;但如果从用户的观点来看,DCOP却可以成为通过命令行控制KDE应用程序的强大工具。

二、实用工具dcop

设计良好的KDE应用程序通常会暴露一组DCOP接口,以便用户能够通过特定的命令对其进行远程控制,KDE提供的实用工具dcop可以用来对这些接口进行操作,其语法格式为:

dcop [application] [object] [function] [arguments ...]

KDE提供的DCOP是一个轻量级的桌面通信协议,它与GNOME下的Bonobo以及Windows下的Automation机制相比,暂时还缺乏与之对应的激活机制,也就是说只有当前正在运行着的进程才有可能通过DCOP进行控制。执行不带任何参数的dcop命令,可以列出所有符合这一条件的KDE应用程序:

[root@linuxgam dcop]# dcop
kwin
kicker
kwrited
kded
knotify
kalarmd
klauncher
khotkeys
konsole-7897
kmail
kdesktop
klipper
konsole-1787
ksmserver

通常说来,采用DCOP进行通信的基本执行单元是进程(process)而不是应用(application),因此如果同一个KDE应用程序被用户执行了多次(即产生了多个进程),DCOP会自动在其名称后面加上相应的进程标识符(PID)来进行区分。从上面的输出结果中不难看出,当前有两个konsole应用程序正在运行中,它们的PID分别为7897和1787,在dcop命令中使用通配符"*"可以很方便地对它们进行查询:

[root@linuxgam dcop]# dcop konsole-*
konsole-7897
konsole-1787

对于每一个KDE应用来说,能够用DCOP控制的对象(object)一般会有多个,它们同样可以用dcop命令查询出来:

[root@linuxgam dcop]# dcop konsole-7897
KBookmarkManager-/root/.kde/share/apps/kfile/bookmarks.xml
KBookmarkManager-/root/.kde/share/apps/konqueror/bookmarks.xml
KBookmarkNotifier
MainApplication-Inte易做图ce
konsole (default)
konsole-mainwindow#1
ksycoca
session-1

DCOP为每个KDE应用都定义了默认操作对象,其名字一般与程序名称相同(如konsole),或者是程序名称再加上Iface(如KMailIface),不过也可以通过default关键字进行引用。下面的命令列出了KMail默认对象支持的所有操作函数,它们实际上就是KMail暴露给外界使用的核心功能接口:

[root@linuxgam dcop]# dcop kmail default
QCStringList inte易做图ces()
QCStringList functions()
void checkMail()
QStringList accounts()
void checkAccount(QString account)
void openReader()
int openComposer(QString to,QString cc,QString bcc,QString subject,QString body,int hidden,KURL messageFile)
int openComposer(QString to,QString cc,QString bcc,QString subject,QString body,int hidden,KURL messageFile,KURL attachURL)
int openComposer(QString to,QString cc,QString bcc,QString subject,QString body,int hidden,QString attachName,
QCString attachCte,QCString attachData,QCString attachType,QCString attachSubType,QCString attachParamAttr,
QString attachParamValue,QCString attachContDisp)
DCOPRef openComposer(QString to,QString cc,QString bcc,QString subject,QString body,bool hidden)
int sendCertificate(QString to,QByteArray certData)
void compactAllFolders()
int dcopAddMessage(QString foldername,QString messagefile)
int dcopAddMessage(QString foldername,KURL messagefile)

KMail是KDE桌面环境提供的一个EMail客户端软件,因此最先吸引我们注意力的是checkMail这一接口,调用它不需要任何参数,也没有任何返回值,其作用是连接到邮件服务器并检查是否有新的邮件到达。用户通过KMail图形界面中的菜单命令可以激活这一操作,此外还能够借助dcop命令来实现相同的目的:

[root@linuxgam dcop]# dcop kmail default checkMail

虽然上述命令执行后不会有任何输出,但如果此时注意观察KMail的话,将发现它会去邮件服务器上查看是否有新的邮件到达,如果有的话则将其取回到本地。KMail提供的另外一个非常实用的操作接口是openComposer,它可以用来在KMail中打开一个新的邮件编辑窗口,并且会将To、CC、Subject等字段事先填好:

[root@linuxgam dcop]# dcop kmail default openComposer xiaowp@263.net "" "" "From Gary" "Testing DCOP." 0 ""

上述命令的执行结果如图1所示:


              图1

三、图形工具kDCOP

kDCOP是KDE桌面环境中的一个DCOP实用工具,利用它可以很方便地执行各种DCOP调用。在命令行方式下执行kdcop命令启动kDCOP之后,它会随即在系统中查询当前所有能够通过DCOP进行控制的KDE应用程序,并将它们提供的各种操作接口以树形方式显示出来,如图2所示:


             图2

dcop和kDCOP提供的基本功能是相同的,但使用kDCOP来控制KDE应用程序要更加简单一些。例如,要想调用KMail提供的openComposer接口,只需先在kDCOP界面上的树形列表内找到相应的项,然后双击打开函数调用窗口,再填入调用时所需要的各种参数并单击确定按钮就可以了,如图3所示:


         图3

当DCOP调用完成之后,相应的返回值会显示在kDCOP主窗口底部的列表框中。使用kDCOP来浏览KDE应用程序支持的所有DCOP接口非常方便,但如果需要直接在命令行方式下进行操作,或者需要同其它命令或者脚本进行协作的话,可能还是得借助dcop命

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,