And D-BUS can control a KDE application already
So I was working on kdelibs over the weekend, trying to clear up a few problems with the D-BUS implementation in KDE. I found that the KMainWindow interface worked almost perfectly out of the box (it would have worked perfectly if I hadn't used a dash [-] in the object path in the first place).
Here's what the object looks like: [image:2079 hspace=10 align=right class="show-on-planet" size=preview]
$ dbus local.kmainwindowtest /kmainwindowtest/MainWindow_1 method void local.kmainwindowtest.KMainWindow.appHelpActivated() method void local.kmainwindowtest.KMainWindow.configureToolbars() method void local.kmainwindowtest.KMainWindow.setCaption(QString caption) method void local.kmainwindowtest.KMainWindow.setCaption(QString caption, bool modified) method void local.kmainwindowtest.KMainWindow.setPlainCaption(QString caption) method void local.kmainwindowtest.KMainWindow.setSettingsDirty() method void local.kmainwindowtest.KMainWindow.slotStateChanged(QString newstate) method void local.kmainwindowtest.KMainWindow.slotStateChanged(QString newstate, bool reverse) property readwrite bool com.trolltech.Qt.QWidget.acceptDrops property readwrite QString com.trolltech.Qt.QWidget.accessibleDescription property readwrite QString com.trolltech.Qt.QWidget.accessibleName property readwrite bool com.trolltech.Qt.QWidget.autoFillBackground property readwrite bool com.trolltech.Qt.QWidget.enabled property read bool com.trolltech.Qt.QWidget.focus property read bool com.trolltech.Qt.QWidget.fullScreen property read int com.trolltech.Qt.QWidget.height property read bool com.trolltech.Qt.QWidget.isActiveWindow property read bool com.trolltech.Qt.QWidget.maximized property readwrite int com.trolltech.Qt.QWidget.maximumHeight property readwrite int com.trolltech.Qt.QWidget.maximumWidth property read bool com.trolltech.Qt.QWidget.minimized property readwrite int com.trolltech.Qt.QWidget.minimumHeight property readwrite int com.trolltech.Qt.QWidget.minimumWidth property read bool com.trolltech.Qt.QWidget.modal property readwrite bool com.trolltech.Qt.QWidget.mouseTracking property readwrite QString com.trolltech.Qt.QWidget.statusTip property readwrite QString com.trolltech.Qt.QWidget.toolTip property readwrite bool com.trolltech.Qt.QWidget.updatesEnabled property readwrite bool com.trolltech.Qt.QWidget.visible property readwrite QString com.trolltech.Qt.QWidget.whatsThis property read int com.trolltech.Qt.QWidget.width property readwrite QString com.trolltech.Qt.QWidget.windowIconText property readwrite bool com.trolltech.Qt.QWidget.windowModified property readwrite double com.trolltech.Qt.QWidget.windowOpacity property readwrite QString com.trolltech.Qt.QWidget.windowTitle property read int com.trolltech.Qt.QWidget.x property read int com.trolltech.Qt.QWidget.y method bool com.trolltech.Qt.QWidget.close() method void com.trolltech.Qt.QWidget.hide() method void com.trolltech.Qt.QWidget.lower() method void com.trolltech.Qt.QWidget.raise() method void com.trolltech.Qt.QWidget.repaint() method void com.trolltech.Qt.QWidget.setDisabled(bool) method void com.trolltech.Qt.QWidget.setEnabled(bool) method void com.trolltech.Qt.QWidget.setFocus() method void com.trolltech.Qt.QWidget.setHidden(bool hidden) method void com.trolltech.Qt.QWidget.setShown(bool shown) method void com.trolltech.Qt.QWidget.setVisible(bool visible) method void com.trolltech.Qt.QWidget.setWindowModified(bool) method void com.trolltech.Qt.QWidget.show() method void com.trolltech.Qt.QWidget.showFullScreen() method void com.trolltech.Qt.QWidget.showMaximized() method void com.trolltech.Qt.QWidget.showMinimized() method void com.trolltech.Qt.QWidget.showNormal() method void com.trolltech.Qt.QWidget.update() method bool org.kde.KMainWindow.actionIsEnabled(QString action) method QString org.kde.KMainWindow.actionToolTip(QString action) method QStringList org.kde.KMainWindow.actions() method bool org.kde.KMainWindow.activateAction(QString action) method bool org.kde.KMainWindow.disableAction(QString action) method bool org.kde.KMainWindow.enableAction(QString action) method void org.kde.KMainWindow.grabWindowToClipBoard() method qlonglong org.kde.KMainWindow.winId() method QString org.freedesktop.DBus.Introspectable.Introspect() method QVariant org.freedesktop.DBus.Properties.Get(QString interface_name, QString property_name) method void org.freedesktop.DBus.Properties.Set(QString interface_name, QString property_name, QVariant value)
The local.kmainwindowtest.KMainWindow interface is a side-effect I'll have to correct eventually: I wanted to get all the QWidget slots public, but that also made the KMainWindow slots public as well.
With that object, you can do nifty things like raising, lowering, minimising, restoring, hiding or showing a window, setting it to full-screen and normal mode or even copy it to the clipboard. Unfortunately, you can't move windows yet, because the geometry and pos properties take QRect and QPoint (respectively), which aren't supported in D-BUS for the moment.
This is all cross-framework as well!
Here's what the /MainApplication object currently looks like (it's the KApplication object):
$ dbus local.kmainwindowtest /MainApplication method void org.kde.KApplication.quit() method void org.kde.KApplication.reparseConfiguration() method void org.kde.KApplication.updateUserTimestamp() method void org.kde.KApplication.updateUserTimestamp(int time) property readwrite int com.trolltech.Qt.QApplication.cursorFlashTime property readwrite int com.trolltech.Qt.QApplication.doubleClickInterval property readwrite int com.trolltech.Qt.QApplication.keyboardInputInterval property readwrite bool com.trolltech.Qt.QApplication.quitOnLastWindowClosed property readwrite int com.trolltech.Qt.QApplication.startDragDistance property readwrite int com.trolltech.Qt.QApplication.startDragTime property readwrite int com.trolltech.Qt.QApplication.wheelScrollLines property readwrite QString com.trolltech.Qt.QCoreApplication.applicationName property readwrite QString com.trolltech.Qt.QCoreApplication.organizationDomain property readwrite QString com.trolltech.Qt.QCoreApplication.organizationName method QString org.freedesktop.DBus.Introspectable.Introspect() method QVariant org.freedesktop.DBus.Properties.Get(QString interface_name, QString property_name) method void org.freedesktop.DBus.Properties.Set(QString interface_name, QString property_name, QVariant value)
One interesting thing you may note is that, if your application is a KUniqueApplication, you automatically get a org.kde.KUniqueApplication.newInstance method.
And when you're done with your test, you can just quit it:
$ dbus local.kmainwindowtest /MainApplication quit [1]+ Done ./kmainwindowtest $