[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [kremotecontrol] /: fixes dbus communication for applications which use node trees and require the u
From:       Michael Zanetti <michael_zanetti () gmx ! net>
Date:       2012-11-04 19:23:41
Message-ID: 20121104192341.A2D0CA60C4 () git ! kde ! org
[Download RAW message or body]

Git commit 3e5f85ecc38b7a7cbe2f14cc0768dca1cfc6073e by Michael Zanetti.
Committed on 04/11/2012 at 19:28.
Pushed by mzanetti into branch 'master'.

fixes dbus communication for applications which use node trees and require the use of \
interfaces.

M  +4    -0    .gitignore
M  +1    -0    kcmremotecontrol/editdbusaction.cpp
M  +1    -1    kcmremotecontrol/editdbusaction.ui
M  +2    -0    kcmremotecontrol/editprofileaction.cpp
M  +10   -3    kcmremotecontrol/model.cpp
M  +2    -1    kcmremotecontrol/model.h
M  +1    -0    kded/kremotecontroldaemon.cpp
M  +16   -0    libkremotecontrol/dbusaction.cpp
M  +4    -0    libkremotecontrol/dbusaction.h
M  +50   -10   libkremotecontrol/dbusinterface.cpp
M  +2    -1    libkremotecontrol/dbusinterface.h
M  +4    -0    libkremotecontrol/mode.cpp
M  +1    -0    libkremotecontrol/profileaction.cpp
M  +11   -0    libkremotecontrol/profileactiontemplate.cpp
M  +4    -0    libkremotecontrol/profileactiontemplate.h
M  +5    -0    libkremotecontrol/profileserver.cpp
M  +1    -0    profiles/CMakeLists.txt
M  +11   -11   profiles/amarok.profile.xml
M  +31   -21   profiles/dragonplayer.profile.xml
M  +1    -1    profiles/klauncher.profile.xml
M  +9    -21   profiles/kmix.profile.xml
M  +2    -2    profiles/konqueror.profile.xml
M  +8    -8    profiles/kscd.profile.xml
M  +8    -8    profiles/okular.profile.xml
M  +5    -5    profiles/powermanagement.profile.xml
M  +2    -1    profiles/profile.xsd
M  +5    -5    profiles/vlc.profile.xml
A  +79   -0    profiles/vlc2.profile.xml

http://commits.kde.org/kremotecontrol/3e5f85ecc38b7a7cbe2f14cc0768dca1cfc6073e

diff --git a/.gitignore b/.gitignore
index b25c15b..0c9171e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,5 @@
 *~
+*kate-swp
+build
+
+*.kdev4
diff --git a/kcmremotecontrol/editdbusaction.cpp \
b/kcmremotecontrol/editdbusaction.cpp index 3802e17..37f4568 100644
--- a/kcmremotecontrol/editdbusaction.cpp
+++ b/kcmremotecontrol/editdbusaction.cpp
@@ -122,6 +122,7 @@ DBusAction EditDBusAction::action() const {
     Prototype prototype = \
m_dbusFunctionModel->getPrototype(ui.tvDBusFunctions->selectionModel()->currentIndex().row());
  prototype.setArgs(m_argumentsModel->arguments());
     action.setFunction(prototype);
+    action.setInterface(m_dbusFunctionModel->getInterface(ui.tvDBusFunctions->selectionModel()->currentIndex().row()));
  
     action.setAutostart(ui.cbAutostart->isChecked());
     action.setRepeat(ui.cbRepeat->isChecked());
diff --git a/kcmremotecontrol/editdbusaction.ui b/kcmremotecontrol/editdbusaction.ui
index ad2eea3..90108af 100644
--- a/kcmremotecontrol/editdbusaction.ui
+++ b/kcmremotecontrol/editdbusaction.ui
@@ -39,7 +39,7 @@
        <item row="1" column="0">
         <widget class="QTreeView" name="tvDBusApps">
          <property name="sizePolicy">
-          <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
+          <sizepolicy hsizetype="MinimumExpanding" vsizetype="Expanding">
            <horstretch>0</horstretch>
            <verstretch>0</verstretch>
           </sizepolicy>
diff --git a/kcmremotecontrol/editprofileaction.cpp \
b/kcmremotecontrol/editprofileaction.cpp index 11566b0..5a7fe08 100644
--- a/kcmremotecontrol/editprofileaction.cpp
+++ b/kcmremotecontrol/editprofileaction.cpp
@@ -96,6 +96,7 @@ void EditProfileAction::applyChanges(){
     ProfileActionTemplate actionTemplate = \
m_templateModel->actionTemplate(ui.tvDBusFunctions->selectionModel()->currentIndex());
  kDebug() << "applyChanges to action:" << actionTemplate.profileId();
     m_action->setApplication(actionTemplate.service());
+    m_action->setInterface(actionTemplate.interface());
     m_action->setNode(actionTemplate.node());
     Prototype prototype = actionTemplate.function();
     prototype.setArgs(m_argumentsModel->arguments());
@@ -127,6 +128,7 @@ ProfileAction EditProfileAction::action() const {
     action.setNode(actionTemplate.node());
     Prototype prototype = actionTemplate.function();
     prototype.setArgs(m_argumentsModel->arguments());
+    action.setInterface(actionTemplate.interface());
     action.setFunction(prototype);
     action.setActionTemplateId(actionTemplate.actionTemplateId());
     action.setProfileId(actionTemplate.profileId());
diff --git a/kcmremotecontrol/model.cpp b/kcmremotecontrol/model.cpp
index 61118ad..bc65d86 100644
--- a/kcmremotecontrol/model.cpp
+++ b/kcmremotecontrol/model.cpp
@@ -163,18 +163,20 @@ void DBusFunctionModel::refresh(const QString &app, const \
QString &node) {  return;
     }
 
-    foreach(const Prototype &prototype, DBusInterface::getInstance()->functions(app, \
                node)){
-        appendRow(prototype);
+    QMultiMap<QString, Prototype> functionMap = \
DBusInterface::getInstance()->functions(app, node); +    for (QMultiMap<QString, \
Prototype>::const_iterator i = functionMap.constBegin(); i != functionMap.constEnd(); \
++i){ +        appendRow(i.key(), i.value());
     }
 
     sort(0, Qt::AscendingOrder);
 
 }
 
-void DBusFunctionModel::appendRow(Prototype prototype) {
+void DBusFunctionModel::appendRow(const QString &interface, Prototype prototype) {
     QList<QStandardItem*> itemList;
     QStandardItem *item = new QStandardItem(prototype.name());
     item->setData(qVariantFromValue(prototype), Qt::UserRole);
+    item->setData(interface, Qt::UserRole + 1);
     itemList.append(item);
     QString argString;
     foreach(const Argument &arg, prototype.args()){
@@ -195,6 +197,11 @@ Prototype DBusFunctionModel::getPrototype(int index) const {
     return QStandardItemModel::item(index)->data(Qt::UserRole).value<Prototype>();
 }
 
+QString DBusFunctionModel::getInterface(int index) const
+{
+    return QStandardItemModel::item(index)->data(Qt::UserRole+1).toString();
+}
+
 QModelIndex DBusFunctionModel::findOrInsert(const DBusAction* action, bool insert) {
 
     for(int i = 0; i < rowCount(); i++){
diff --git a/kcmremotecontrol/model.h b/kcmremotecontrol/model.h
index 8bc12ca..a9dc79f 100644
--- a/kcmremotecontrol/model.h
+++ b/kcmremotecontrol/model.h
@@ -75,12 +75,13 @@ class DBusFunctionModel: public QStandardItemModel
         void refresh(const QString &app, const QString &node);
 
         Prototype getPrototype( int index ) const;
+        QString getInterface( int index ) const;
         QVariant headerData(int section, Qt::Orientation orientation, int role) \
const;  
         QModelIndex findOrInsert(const DBusAction *action, bool insert = false);
         
     private:
-        void appendRow(Prototype item);
+        void appendRow(const QString &interface, Prototype item);
 
 };
 
diff --git a/kded/kremotecontroldaemon.cpp b/kded/kremotecontroldaemon.cpp
index bfe9954..b18fb59 100644
--- a/kded/kremotecontroldaemon.cpp
+++ b/kded/kremotecontroldaemon.cpp
@@ -96,6 +96,7 @@ void KRemoteControlDaemon::slotStatusChanged(bool connected) {
                     SLOT(gotMessage(RemoteControlButton)));
         }
     }
+    kDebug() << "connection changed" << connected;
     emit connectionChanged(connected);
 }
 
diff --git a/libkremotecontrol/dbusaction.cpp b/libkremotecontrol/dbusaction.cpp
index 5e50546..bbc16fb 100644
--- a/libkremotecontrol/dbusaction.cpp
+++ b/libkremotecontrol/dbusaction.cpp
@@ -42,6 +42,16 @@ void DBusAction::setNode(const QString& node) {
     m_node = node;
 }
 
+QString DBusAction::interface() const
+{
+    return m_interface;
+}
+
+void DBusAction::setInterface(const QString& interface)
+{
+    m_interface = interface;
+}
+
 Prototype DBusAction::function() const {
     return m_function;
 }
@@ -62,6 +72,7 @@ void DBusAction::saveToConfig(KConfigGroup& config) {
     Action::saveToConfig(config);
     config.writeEntry("Application", m_application);
     config.writeEntry("Node", m_node);
+    config.writeEntry("Interface", m_interface);
     config.writeEntry("Function", m_function.name());
     int i = 0; // GroupID for arguments
     foreach(const Argument &arg, m_function.args()){
@@ -77,6 +88,10 @@ void DBusAction::loadFromConfig(const KConfigGroup& config) {
     Action::loadFromConfig(config);
     m_application = config.readEntry("Application");
     m_node = config.readEntry("Node");
+    if (!m_node.startsWith(QLatin1String("/"))) {
+        m_node.prepend(QLatin1String("/"));
+    }
+    m_interface = config.readEntry("Interface");
     m_function = Prototype(config.readEntry("Function"));
     QStringList argGroupList = config.groupList();
     argGroupList.sort();
@@ -97,6 +112,7 @@ Action* DBusAction::clone() const {
     action->setApplication(m_application);
     action->setAutostart(m_autostart);
     action->setDestination(m_destination);
+    action->setInterface(m_interface);
     action->setFunction(m_function);
     action->setNode(m_node);
     action->setRepeat(m_repeat);
diff --git a/libkremotecontrol/dbusaction.h b/libkremotecontrol/dbusaction.h
index ccaf926..a6bbc3b 100644
--- a/libkremotecontrol/dbusaction.h
+++ b/libkremotecontrol/dbusaction.h
@@ -42,6 +42,9 @@ class KREMOTECONTROL_EXPORT DBusAction : public Action
         QString node() const;
         void setNode(const QString &node);
         
+        QString interface() const;
+        void setInterface(const QString &interface);
+        
         Prototype function() const;
         void setFunction(const Prototype &function);
         
@@ -56,6 +59,7 @@ class KREMOTECONTROL_EXPORT DBusAction : public Action
     protected:
         QString m_application;
         QString m_node;
+        QString m_interface;
         Prototype m_function;
 };
 
diff --git a/libkremotecontrol/dbusinterface.cpp \
b/libkremotecontrol/dbusinterface.cpp index 8e9ff50..259729c 100644
--- a/libkremotecontrol/dbusinterface.cpp
+++ b/libkremotecontrol/dbusinterface.cpp
@@ -73,7 +73,7 @@ QStringList DBusInterface::registeredPrograms() {
     for (int i = 0; i < allServices.size(); ++i) {
         QString tmp = allServices.at(i);
 
-        QRegExp r1( QLatin1String( "[a-zA-Z]{1,3}\\.[a-zA-Z0-9-]+\\.[a-zA-Z0-9_-]+" \
)); +        QRegExp r1( QLatin1String( \
"[a-zA-Z]{1,3}\\.[a-zA-Z0-9-]+\\.[a-zA-Z0-9_-\\.]+" ));  if (!r1.exactMatch(tmp)) {
             continue;
         }
@@ -94,6 +94,7 @@ QStringList DBusInterface::registeredPrograms() {
 }
 
 QStringList DBusInterface::nodes(const QString &program) {
+    return getNodes(program, QLatin1String("/"));
     kDebug() << "getting Nodes of" << program;
     QDBusInterface dBusIface(program, QLatin1String( "/" ), QLatin1String( \
"org.freedesktop.DBus.Introspectable" ));  QDBusMessage msg = \
QDBusMessage::createMethodCall(program, QLatin1String( "/" ), QLatin1String( \
"org.freedesktop.DBus.Introspectable" ), QLatin1String( "Introspect" )); @@ -130,8 \
+131,47 @@ QStringList DBusInterface::nodes(const QString &program) {  return \
returnList;  }
 
-QList<Prototype> DBusInterface::functions(const QString &program, const QString \
                &object) {
-    QDBusInterface dBusIface(program, QLatin1Char( '/' ) + object, QLatin1String( \
"org.freedesktop.DBus.Introspectable" )); +QStringList DBusInterface::getNodes(const \
QString& service, const QString& node) +{
+    QStringList nodes;
+    QDBusMessage msg = QDBusMessage::createMethodCall(service, node, QLatin1String( \
"org.freedesktop.DBus.Introspectable" ), QLatin1String( "Introspect" )); +    \
QDBusReply<QString> response = QDBusConnection::sessionBus().call(msg, QDBus::Block, \
1); +
+    QDomDocument domDoc;
+    domDoc.setContent(response);
+    if (domDoc.toString().isEmpty()) { // No reply... perhaps a multi-instance...
+        kDebug() << "no reply from" << service;
+        QStringList instances = allRegisteredPrograms().filter(service);
+        if (!instances.isEmpty()) {
+            QDBusMessage msg = QDBusMessage::createMethodCall(instances.first(), \
node, QLatin1String( "org.freedesktop.DBus.Introspectable" ), QLatin1String( \
"Introspect" )); +            QDBusReply<QString> response = \
QDBusConnection::sessionBus().call(msg, QDBus::Block, 1); +//            response = \
iFace.call("Introspect"); +            domDoc.setContent(response);
+        }
+    }
+    
+    QDomElement child = domDoc.documentElement().firstChildElement();
+    while (!child.isNull()) {
+        if (child.tagName() == QLatin1String("node")) {
+            QString name = child.attribute(QLatin1String("name"));
+            kDebug() << "got node:" << service << node + name;
+            if (node.endsWith("/")) {
+                name = node + name;
+            } else {
+                name = node + QLatin1String("/") + name;
+            }
+            nodes << name;
+            nodes << getNodes(service, name);
+        }
+        child = child.nextSiblingElement();
+    }
+    return nodes;
+}
+
+
+QMultiMap<QString, Prototype> DBusInterface::functions(const QString &program, const \
QString &object) { +    //return QList<Prototype>();
+    QDBusInterface dBusIface(program, object, QLatin1String( \
                "org.freedesktop.DBus.Introspectable" ));
     QDBusReply<QString> response = dBusIface.call(QLatin1String( "Introspect" ));
 
     QDomDocument domDoc;
@@ -149,7 +189,7 @@ QList<Prototype> DBusInterface::functions(const QString &program, \
const QString  QDomElement node = domDoc.documentElement();
     QDomElement child = node.firstChildElement();
 
-    QList<Prototype> funcList;
+    QMultiMap<QString, Prototype> funcList;
 
     while (!child.isNull()) {
         if (child.tagName() == QLatin1String("interface")) {
@@ -158,6 +198,7 @@ QList<Prototype> DBusInterface::functions(const QString &program, \
const QString  child = child.nextSiblingElement();
                 continue;
             }
+            QString interface = child.attribute(QLatin1String("name"));
             QDomElement subChild = child.firstChildElement();
             while (!subChild.isNull()) {
                 if (subChild.tagName() == QLatin1String("method")) {
@@ -201,8 +242,8 @@ QList<Prototype> DBusInterface::functions(const QString &program, \
const QString  argDom = argDom.nextSiblingElement();
                     }
                     Prototype function(functionName, argList);
-                    if(!funcList.contains(function)){
-                        funcList.append(function);
+                    if(!funcList.contains(interface, function)){
+                        funcList.insertMulti(interface, function);
                     }
                 }
                 subChild = subChild.nextSiblingElement();
@@ -384,13 +425,13 @@ void DBusInterface::executeAction(const DBusAction* action) {
         const QString &program = *i;
         kDebug() << "Searching DBus for program:" << program;
         if (dBusIface->isServiceRegistered(program)) {
-            kDebug() << "Sending data (" << program << ", " << QLatin1Char( '/' ) + \
action->node() << ", " << action->function().name(); +            kDebug() << \
"Sending data (" << program << ", " << action->node() << ", " << action->interface() \
<< ". " << action->function().name();  
             if(action->function().name().startsWith("script:")) {
                 QString scriptText = action->function().name().remove(0, 7);
                 
                 QScriptEngine scriptEngine;
-                QDBusIfaceWrapper *appIface = new QDBusIfaceWrapper(program, \
QLatin1Char( '/' ) + action->node()); +                QDBusIfaceWrapper *appIface = \
                new QDBusIfaceWrapper(program, action->node());
                 QScriptValue objectValue = scriptEngine.newQObject(appIface);
                 scriptEngine.globalObject().setProperty("dbus", objectValue);
                 int argCount = 1;
@@ -426,8 +467,7 @@ void DBusInterface::executeAction(const DBusAction* action) {
                 scriptEngine.evaluate(scriptText);
             } else {
             
-                QDBusMessage m = QDBusMessage::createMethodCall(program, \
                QLatin1Char( '/' )
-                             + action->node(), QLatin1String( "" ), \
action->function().name()); +                QDBusMessage m = \
QDBusMessage::createMethodCall(program, action->node(), action->interface(), \
action->function().name());  
                 foreach(const Argument &arg, action->function().args()){
                     kDebug() << "Got argument:" << arg.value().type() << "value" << \
                arg.value();
diff --git a/libkremotecontrol/dbusinterface.h b/libkremotecontrol/dbusinterface.h
index 6c0b585..1b7b1b6 100644
--- a/libkremotecontrol/dbusinterface.h
+++ b/libkremotecontrol/dbusinterface.h
@@ -42,6 +42,7 @@ class KREMOTECONTROL_EXPORT DBusInterface: public QObject
 
         QStringList allRegisteredPrograms();
         bool searchForProgram(const DBusAction *action, QStringList &programs);
+        QStringList getNodes(const QString &interface, const QString &node);
     public:
 
         static DBusInterface *getInstance();
@@ -52,7 +53,7 @@ class KREMOTECONTROL_EXPORT DBusInterface: public QObject
 
         QStringList registeredPrograms();
         QStringList nodes(const QString &program);
-        QList<Prototype> functions(const QString &program, const QString &object);
+        QMultiMap<QString, Prototype> functions(const QString &program, const \
QString &object);  
         QStringList configuredRemotes();
         void ignoreButtonEvents(const QString &remoteName);
diff --git a/libkremotecontrol/mode.cpp b/libkremotecontrol/mode.cpp
index 3f9d386..df7198e 100644
--- a/libkremotecontrol/mode.cpp
+++ b/libkremotecontrol/mode.cpp
@@ -20,6 +20,8 @@
 #include "mode.h"
 #include "action.h"
 
+#include <KDebug>
+
 Mode::Mode(const QString &name, const QString &iconName): m_name(name), \
m_iconName(iconName) {  }
 
@@ -91,7 +93,9 @@ QVector<Action* > Mode::actions() const {
 QVector<Action*> Mode::actionsForButton(const QString &button) const {
     QVector<Action*> retList;
     foreach(Action *action, m_actionList){
+        kDebug() << "checking action:" << action->name() << action->button();
         if(action->button() == button){
+            kDebug() << "Found action for button:" << action->name();
             retList.append(action);
         }
     }
diff --git a/libkremotecontrol/profileaction.cpp \
b/libkremotecontrol/profileaction.cpp index d40545e..1332a99 100644
--- a/libkremotecontrol/profileaction.cpp
+++ b/libkremotecontrol/profileaction.cpp
@@ -89,6 +89,7 @@ Action* ProfileAction::clone() const {
     action->setAutostart(m_autostart);
     action->setDestination(m_destination);
     action->setFunction(m_function);
+    action->setInterface(m_interface);
     action->setNode(m_node);
     action->setRepeat(m_repeat);
     action->setButton(m_button);
diff --git a/libkremotecontrol/profileactiontemplate.cpp \
b/libkremotecontrol/profileactiontemplate.cpp index ac07f32..b9e6378 100644
--- a/libkremotecontrol/profileactiontemplate.cpp
+++ b/libkremotecontrol/profileactiontemplate.cpp
@@ -19,6 +19,8 @@
 
 #include "profileactiontemplate.h"
 
+#include <KDebug>
+
 
 ProfileActionTemplate::ProfileActionTemplate() {
   d = new ProfileActionTemplatePrivate;
@@ -30,6 +32,7 @@ ProfileActionTemplate::ProfileActionTemplate( const QString \
&profileId,  const QString &actionName,
                                               const QString &serviceName,
                                               const QString &node,
+                                              const QString &interface,
                                               const Prototype &function,
                                               const ProfileAction::ActionDestination \
destination,  bool autostart,
@@ -43,6 +46,7 @@ ProfileActionTemplate::ProfileActionTemplate( const QString \
&profileId,  d->m_actionName = actionName;
     d->m_node = node;
     d->m_serviceName = serviceName;
+    d->m_interface = interface;
     d->m_function = function;
     d->m_description = description;
     d->m_destination= destination;
@@ -75,6 +79,11 @@ QString ProfileActionTemplate::description() const {
     return d->m_description;
 }
 
+QString ProfileActionTemplate::interface() const
+{
+    return d->m_interface;
+}
+
 Prototype ProfileActionTemplate::function() const {
     return d->m_function;
 }
@@ -99,9 +108,11 @@ ProfileAction *ProfileActionTemplate::createAction(const \
                RemoteControlButton& bu
     ProfileAction *action = new ProfileAction(button.name(), d->m_profileId, \
d->m_actionTemplateId);  action->setApplication(d->m_serviceName);
     action->setNode(d->m_node);
+    action->setInterface(d->m_interface);
     action->setFunction(d->m_function);
     action->setDestination(d->m_destination);
     action->setAutostart(d->m_autostart);
     action->setRepeat(d->m_repeat);
+    kDebug() << "creating action from template:" << d->m_serviceName << d->m_node << \
d->m_interface << d->m_function.name();  return action;
 }
diff --git a/libkremotecontrol/profileactiontemplate.h \
b/libkremotecontrol/profileactiontemplate.h index ac95a3f..9cc1ec3 100644
--- a/libkremotecontrol/profileactiontemplate.h
+++ b/libkremotecontrol/profileactiontemplate.h
@@ -36,6 +36,7 @@ class KREMOTECONTROL_EXPORT ProfileActionTemplate
                               const QString &actionName,
                               const QString &serviceName,
                               const QString &node,
+                              const QString &interface,
                               const Prototype &function,
                               const ProfileAction::ActionDestination,
                               bool autostart,
@@ -50,6 +51,7 @@ class KREMOTECONTROL_EXPORT ProfileActionTemplate
         QString actionName() const;
         QString service() const;
         QString node() const;
+        QString interface() const;
         Prototype function() const;
         QString description() const;
         ProfileAction::ActionDestination destination() const;
@@ -75,6 +77,7 @@ class ProfileActionTemplatePrivate: public QSharedData
                                       m_actionName(other.m_actionName),
                                       m_serviceName(other.m_serviceName),
                                       m_node(other.m_node),
+                                      m_interface(other.m_interface),
                                       m_function(other.m_function),
                                       m_description(other.m_description),
                                       m_destination(other.m_destination),
@@ -87,6 +90,7 @@ class ProfileActionTemplatePrivate: public QSharedData
         QString m_actionName; // e.g. Play
         QString m_serviceName; // e.g. org.kde.amarok
         QString m_node; // e.g. Player
+        QString m_interface; // e.g. org.mpris.Player
         Prototype m_function; // play
         QString m_description; // e.g. Start playing
         ProfileAction::ActionDestination m_destination;
diff --git a/libkremotecontrol/profileserver.cpp \
b/libkremotecontrol/profileserver.cpp index 0427063..d51fd71 100644
--- a/libkremotecontrol/profileserver.cpp
+++ b/libkremotecontrol/profileserver.cpp
@@ -259,9 +259,11 @@ ProfileActionTemplate \
ProfileServer::ProfileXmlContentHandler::parseAction(QDomN  QDomElement execNode;
     QString serviceName;
     QString nodeName;
+    QString interfaceName;
     QString functionName;
     if(!actionNode.namedItem(QLatin1String( "prototype" )).isNull()){
         execNode = actionNode.namedItem(QLatin1String( "prototype" )).toElement();
+        interfaceName = execNode.namedItem(QLatin1String( "interface" \
                )).toElement().text().trimmed();
         functionName = execNode.namedItem(QLatin1String( "function" \
)).toElement().text().trimmed();  } else if(!actionNode.namedItem(QLatin1String( \
                "script" )).isNull()){
         execNode = actionNode.namedItem(QLatin1String( "script" )).toElement();
@@ -300,12 +302,15 @@ ProfileActionTemplate \
ProfileServer::ProfileXmlContentHandler::parseAction(QDomN  }
 
     Prototype function(functionName, arguments);
+    
+    kDebug() << "creating action template" << actionName << serviceName << nodeName \
<< interfaceName << functionName;  
     return ProfileActionTemplate(profileId,
                                   actionId,
                                   i18n(actionName.toUtf8().data()),
                                   serviceName,
                                   nodeName,
+                                  interfaceName,
                                   function,
                                   actionType,
                                   autostart,
diff --git a/profiles/CMakeLists.txt b/profiles/CMakeLists.txt
index d514d84..a2b3cbf 100644
--- a/profiles/CMakeLists.txt
+++ b/profiles/CMakeLists.txt
@@ -5,6 +5,7 @@ install( FILES
     amarok.profile.xml
     dragonplayer.profile.xml
     vlc.profile.xml
+    vlc2.profile.xml
     kmix.profile.xml
     okular.profile.xml
     klauncher.profile.xml
diff --git a/profiles/amarok.profile.xml b/profiles/amarok.profile.xml
index 4567019..eed252e 100644
--- a/profiles/amarok.profile.xml
+++ b/profiles/amarok.profile.xml
@@ -12,7 +12,7 @@
     <action id="play" name="Play" description="Start playing">
         <prototype>
             <serviceName>org.mpris.amarok</serviceName>
-            <node>Player</node>
+            <node>/Player</node>
             <function>Play</function>
         </prototype>
         <button>Play</button>
@@ -22,7 +22,7 @@
     <action id="stop" name="Stop" description="Stop playing">
         <prototype>
             <serviceName>org.mpris.amarok</serviceName>
-            <node>Player</node>
+            <node>/Player</node>
             <function>Stop</function>
         </prototype>
         <button>Stop</button>
@@ -33,7 +33,7 @@
     <action id="pause" name="Pause" description="Pause playing">
         <prototype>
             <serviceName>org.mpris.amarok</serviceName>
-            <node>Player</node>
+            <node>/Player</node>
             <function>Pause</function>
         </prototype>
         <button>Pause</button>
@@ -43,7 +43,7 @@
     <action id="playpause" name="Play Pause" description="Toggle Play/Pause">
         <prototype>
             <serviceName>org.mpris.amarok</serviceName>
-            <node>Player</node>
+            <node>/Player</node>
             <function>PlayPause</function>
         </prototype>
         <button>PlayPause</button>
@@ -53,7 +53,7 @@
     <action id="skipForward" name="Skip Forward" description="Advance to next \
track">  <prototype>
             <serviceName>org.mpris.amarok</serviceName>
-            <node>Player</node>
+            <node>/Player</node>
             <function>Next</function>
         </prototype>
         <button>SkipForward</button>
@@ -63,7 +63,7 @@
     <action id="skipBackWard" name="Skip Backward" description="Go to previous \
track">  <prototype>
             <serviceName>org.mpris.amarok</serviceName>
-            <node>Player</node>
+            <node>/Player</node>
             <function>Prev</function>
         </prototype>
         <button>SkipBackward</button>
@@ -73,7 +73,7 @@
     <action id="fastForward" name="Fast Forward" description="Seek forward">
         <prototype>
             <serviceName>org.mpris.amarok</serviceName>
-            <node>Player</node>
+            <node>/Player</node>
             <function>Forward</function>
             <arguments>
                 <argument type="int" comment="Amount to fast forward in ms">
@@ -88,7 +88,7 @@
     <action id="rewind" name="Backward" description="Seek backward">
         <prototype>
             <serviceName>org.mpris.amarok</serviceName>
-            <node>Player</node>
+            <node>/Player</node>
             <function>Backward</function>
             <arguments>
                 <argument type="int" comment="Amount to rewind in ms">
@@ -103,7 +103,7 @@
     <action id="fullscreen" name="Fullscreen" description="Toggle fullscreen mode">
         <prototype>
             <serviceName>org.mpris.amarok</serviceName>            
-            <node>amarok/MainWindow</node>
+            <node>/amarok/MainWindow</node>
             <function>slotFullScreen</function>
         </prototype>
         <repeat>false</repeat>
@@ -113,7 +113,7 @@
     <action id="volumeUp" name="Volume Up" description="Increases Volume">
         <script>
             <serviceName>org.mpris.amarok</serviceName>            
-            <node>Player</node>
+            <node>/Player</node>
             <scripttext>dbus.call('VolumeSet', dbus.call('VolumeGet') + \
arg1);</scripttext>  <arguments>
               <argument type="int" comment="Amount to increase volume in percent">
@@ -128,7 +128,7 @@
     <action id="volumeDown" name="Volume Down" description="Decreases Volume">
         <script>
             <serviceName>org.mpris.amarok</serviceName>            
-            <node>Player</node>
+            <node>/Player</node>
             <scripttext>dbus.call('VolumeSet', dbus.call('VolumeGet') - \
arg1);</scripttext>  <arguments>
               <argument type="int" comment="Amount to decrease volume in percent">
diff --git a/profiles/dragonplayer.profile.xml b/profiles/dragonplayer.profile.xml
index 749b30a..07f75d9 100644
--- a/profiles/dragonplayer.profile.xml
+++ b/profiles/dragonplayer.profile.xml
@@ -6,60 +6,70 @@
     <name>Dragon Player</name>
     <version>0.1</version>
     <author>Gioacchino Mazzurco [gmazzurco89@gmail.com]</author>
-   
+
     <!-- Playback actions -->
     <action id="play" name="Play" description="Start playing">
         <prototype>
-            <serviceName>org.mpris.dragonplayer</serviceName>
-            <node>Player</node>
+            <serviceName>org.mpris.MediaPlayer2.dragonplayer</serviceName>
+            <node>/org/mpris/MediaPlayer2</node>
             <function>Play</function>
         </prototype>
         <button>Play</button>
         <ifmulti>sendtotop</ifmulti>
     </action>
-    
+
     <action id="stop" name="Stop" description="Stop playing">
         <prototype>
-            <serviceName>org.mpris.dragonplayer</serviceName>
-            <node>Player</node>
+            <serviceName>org.mpris.MediaPlayer2.dragonplayer</serviceName>
+            <node>/org/mpris/MediaPlayer2</node>
             <function>Stop</function>
         </prototype>
         <button>Stop</button>
         <ifmulti>sendtotop</ifmulti>
     </action>
-    
-    <action id="pause" name="Play/Pause" description="Toggle Play/Pause">
+
+    <action id="pause" name="Pause" description="Pause playing">
         <prototype>
-            <serviceName>org.mpris.dragonplayer</serviceName>
-            <node>Player</node>
+            <serviceName>org.mpris.MediaPlayer2.dragonplayer</serviceName>
+            <node>/org/mpris/MediaPlayer2</node>
             <function>Pause</function>
         </prototype>
         <button>PlayPause</button>
         <ifmulti>sendtotop</ifmulti>
     </action>
-    
-   <!-- The actions currently have no effekt in dragon player 2.0        
-    
-    <action id="skipForward" name="Skip Forward" description="Advance to next \
track"> +
+    <action id="playPause" name="Play/Pause" description="Toggle Play/Pause">
         <prototype>
-            <serviceName>org.mpris.dragonplayer</serviceName>
-            <node>Player</node>
+            <serviceName>org.mpris.MediaPlayer2.dragonplayer</serviceName>
+            <node>/org/mpris/MediaPlayer2</node>
+            <function>PlayPause</function>
+        </prototype>
+        <button>PlayPause</button>
+        <ifmulti>sendtotop</ifmulti>
+    </action>
+
+   <!-- The actions currently have no effekt in dragon player 2.0
+
+   <action id="skipForward" name="Skip Forward" description="Advance to next track">
+        <prototype>
+            <serviceName>org.mpris.MediaPlayer2.dragonplayer</serviceName>
+            <node>/org/mpris/MediaPlayer2</node>
             <function>Next</function>
         </prototype>
         <button>SkipForward</button>
         <repeat>true</repeat>
         <ifmulti>sendtotop</ifmulti>
     </action>
-   
+
     <action id="skipBackward" name="Skip Backward" description="Go to previous \
track">  <prototype>
-            <serviceName>org.mpris.dragonplayer</serviceName>
-            <node>Player</node>
+            <serviceName>org.mpris.MediaPlayer2.dragonplayer</serviceName>
+            <node>/org/mpris/MediaPlayer2</node>
             <function>Prev</function>
         </prototype>
         <button>SkipBackward</button>
         <repeat>true</repeat>
         <ifmulti>sendtotop</ifmulti>
-    </action>       
-   -->
+    </action>
+    -->
 </profile>
diff --git a/profiles/klauncher.profile.xml b/profiles/klauncher.profile.xml
index b73ecff..14f859f 100644
--- a/profiles/klauncher.profile.xml
+++ b/profiles/klauncher.profile.xml
@@ -10,7 +10,7 @@
 	<action id="execute" name="Run command" description="Runs a command with optional \
arguments">  <prototype>
 			<serviceName>org.kde.klauncher</serviceName>
-			<node>KLauncher</node>
+                        <node>/KLauncher</node>
 			<function>kdeinit_exec</function>
 			<arguments>
 				<argument type="QString" comment="The executable name and path of the program or \
                script to run">
diff --git a/profiles/kmix.profile.xml b/profiles/kmix.profile.xml
index f164e81..e9854e3 100644
--- a/profiles/kmix.profile.xml
+++ b/profiles/kmix.profile.xml
@@ -13,13 +13,9 @@
     <action id="volUp" name="Volume Up" description="Increase Volume">
         <prototype>
             <serviceName>org.kde.kmix</serviceName>
-            <node>Mixer0</node>
-            <function>increaseVolume</function>
-            <arguments>
-                <argument type="QString" comment="Name of the slider to move and its \
                index separated by a colon (eg. Master:0)">
-                    <default>Master:0</default>
-                </argument>
-            </arguments>
+            <node>/kmix/KMixWindow/actions/increase_volume</node>
+            <interface>org.qtproject.Qt.QAction</interface>
+            <function>trigger</function>
         </prototype>
         <button>VolumeUp</button>
         <repeat>true</repeat>
@@ -28,13 +24,9 @@
     <action id="volDown" name="Volume Down" description="Decrease Volume">
         <prototype>
             <serviceName>org.kde.kmix</serviceName>
-            <node>Mixer0</node>
-            <function>decreaseVolume</function>
-            <arguments>
-                <argument type="QString" comment="Name of the slider to move and its \
                index separated by a colon (eg. Master:0)">
-                    <default>Master:0</default>
-                </argument>
-            </arguments>
+            <node>/kmix/KMixWindow/actions/decrease_volume</node>
+            <interface>org.qtproject.Qt.QAction</interface>
+            <function>trigger</function>
         </prototype>
         <button>VolumeDown</button> 
         <repeat>true</repeat>
@@ -43,13 +35,9 @@
     <action id="toggleMute" name="Mute" description="Toggle Mute">
         <prototype>
             <serviceName>org.kde.kmix</serviceName>
-            <node>Mixer0</node>            
-            <function>toggleMute</function>
-            <arguments>
-                <argument type="QString" comment="Name of the slider to mute and its \
                index separated by a colon (eg. Master:0)">
-                    <default>Master:0</default>
-                </argument>
-            </arguments>
+            <node>/kmix/KMixWindow/actions/mute</node>
+            <interface>org.qtproject.Qt.QAction</interface>
+            <function>trigger</function>
         </prototype>
         <button>Mute</button>
         <repeat>false</repeat>
diff --git a/profiles/konqueror.profile.xml b/profiles/konqueror.profile.xml
index 025b5ae..4e88a49 100644
--- a/profiles/konqueror.profile.xml
+++ b/profiles/konqueror.profile.xml
@@ -10,7 +10,7 @@
 	<action id="newWindow" name="Create New Window" description="Creates a new window \
and loads an arbitrary URL">  <prototype>
 			<serviceName>org.kde.konqueror</serviceName>
-			<node>KonqMain</node>			
+                        <node>/KonqMain</node>			
 			<function>openBrowserWindow</function>
 			<arguments>
 				<argument type="QString" comment="The URL to load in the window initially">
@@ -25,7 +25,7 @@
 	<action id="quit" name="Quit" description="Closes the Konqueror window">
 		<prototype>
 			<serviceName>org.kde.konqueror</serviceName>
-			<node>MainApplication</node>
+                        <node>/MainApplication</node>
 			<function>quit</function>
 		</prototype>
 		<ifmulti>sendtotop</ifmulti>
diff --git a/profiles/kscd.profile.xml b/profiles/kscd.profile.xml
index be8cc5d..13f5509 100644
--- a/profiles/kscd.profile.xml
+++ b/profiles/kscd.profile.xml
@@ -10,7 +10,7 @@
 	<action id="play" name="Play" description="Start playing the CD">
 		<prototype>
 			<serviceName>org.kde.kscd</serviceName>
-			<node>Player</node>
+                        <node>/Player</node>
 			<function>Play</function>
 		</prototype>
 		<button>Play</button>
@@ -20,7 +20,7 @@
 	<action id="stop" name="Stop" description="Stops the CD">
 		<prototype>
 			<serviceName>org.kde.kscd</serviceName>
-			<node>Player</node>
+                        <node>/Player</node>
 			<function>Stop</function>
 		</prototype>
 		<button>Stop</button>
@@ -29,7 +29,7 @@
 	<action id="eject" name="Eject" description="Ejects the CD">
 		<prototype>
 			<serviceName>org.kde.kscd</serviceName>
-			<node>CDPlayer</node>
+                        <node>/CDPlayer</node>
 			<function>ejectShortcut</function>
 		</prototype>
 		<button>Eject</button>
@@ -39,7 +39,7 @@
 	<action id="previousTrack" name="Previous" description="Skips to the previous track \
on the CD">  <prototype>
 			<serviceName>org.kde.kscd</serviceName>
-			<node>Player</node>
+                        <node>/Player</node>
 			<function>Prev</function>
 		</prototype>
 		<button>SkipBackward</button>
@@ -49,7 +49,7 @@
 	<action id="nextTrack" name="Next" description="Skips to the next track on the CD">
 		<prototype>
 			<serviceName>org.kde.kscd</serviceName>
-			<node>Player</node>
+                        <node>/Player</node>
 			<function>Next</function>
 		</prototype>
 		<button>SkipForward</button>
@@ -59,7 +59,7 @@
 	<action id="playTrack" name="Play Track" description="Skips to a specific track on \
the CD">  <prototype>
 			<serviceName>org.kde.kscd</serviceName>
-			<node>CDPlayer</node>
+                        <node>/CDPlayer</node>
 			<function>playTrack</function>
 			<arguments>
 				<argument type="int" comment="The number of the track to skip to">
@@ -73,7 +73,7 @@
 	<action id="setVolume" name="Set Volume" description="Sets the play volume">
 		<prototype>
 			<serviceName>org.kde.kscd</serviceName>
-			<node>Player</node>
+                        <node>/Player</node>
 			<function>VolumeSet</function>
 			<arguments>
 				<argument type="int" comment="The new value for the volume">
@@ -86,7 +86,7 @@
 	<action id="randomShortcut" name="Shuffle" description="Toggles track shuffling on \
and off">  <prototype>
 			<serviceName>org.kde.kscd</serviceName>
-			<node>CDPlayer</node>
+                        <node>/CDPlayer</node>
 			<function>randomShortcut</function>
 		</prototype>
 	</action>
diff --git a/profiles/okular.profile.xml b/profiles/okular.profile.xml
index 144b908..16c614d 100644
--- a/profiles/okular.profile.xml
+++ b/profiles/okular.profile.xml
@@ -10,7 +10,7 @@
     <action id="previousPage" name="Back" description="Goes to the previous page">
         <prototype>
             <serviceName>org.kde.okular</serviceName>
-            <node>okular</node>
+            <node>/okular</node>
             <function>slotPreviousPage</function>
         </prototype>
         <button>Rewind</button>
@@ -21,7 +21,7 @@
     <action id="nextPage" name="Forward" description="Goes to the next page">
         <prototype>
             <serviceName>org.kde.okular</serviceName>
-            <node>okular</node>
+            <node>/okular</node>
             <function>slotNextPage</function>
         </prototype>
         <button>Rewind</button>
@@ -32,7 +32,7 @@
     <action id="firstPage" name="First" description="Goes to the first page">
         <prototype>
             <serviceName>org.kde.okular</serviceName>
-            <node>okular</node>
+            <node>/okular</node>
             <function>slotGotoFirst</function>
         </prototype>
         <button>SkipBackward</button>
@@ -43,7 +43,7 @@
     <action id="lastPage" name="Last" description="Goes to the last page">
         <prototype>
             <serviceName>org.kde.okular</serviceName>
-            <node>okular</node>
+            <node>/okular</node>
             <function>slotGotoLast</function>
         </prototype>
         <button>SkipForward</button>
@@ -54,7 +54,7 @@
     <action id="pause" name="Presentation" description="Starts / stops \
presentation">  <prototype>
             <serviceName>org.kde.okular</serviceName>
-            <node>okular</node>
+            <node>/okular</node>
             <function>slotTogglePresentation</function>
         </prototype>
         <button>Pause</button>
@@ -65,7 +65,7 @@
     <action id="reload" name="Reload" description="Reloads the open document">
         <prototype>
             <serviceName>org.kde.okular</serviceName>
-            <node>okular</node>
+            <node>/okular</node>
             <function>reload</function>
         </prototype>
         <ifmulti>sendtotop</ifmulti>
@@ -74,7 +74,7 @@
     <action id="goToPage" name="Go to Page" description="Goes to the specified \
page">  <prototype>
             <serviceName>org.kde.okular</serviceName>
-            <node>okular</node>
+            <node>/okular</node>
             <function>goToPage</function>
             <arguments>
                 <argument type="uint" comment="The page to choose">
@@ -88,7 +88,7 @@
     <action id="openFile" name="Open document" description="Opens a specific \
document">  <prototype>
             <serviceName>org.kde.okular</serviceName>
-            <node>okular</node>
+            <node>/okular</node>
             <function>openDocument</function>
             <arguments>
                 <argument type="QString" comment="The document to be open">
diff --git a/profiles/powermanagement.profile.xml \
b/profiles/powermanagement.profile.xml index 84d4188..eb701bb 100644
--- a/profiles/powermanagement.profile.xml
+++ b/profiles/powermanagement.profile.xml
@@ -11,7 +11,7 @@
     <action id="suspend2Ram" name="Suspend" description="Suspends your computer to \
RAM (sleep)">  <prototype>
             <serviceName>org.kde.klauncher</serviceName>
-            <node>KLauncher</node>
+            <node>/KLauncher</node>
             <function>kdeinit_exec</function>
             <arguments>
                 <argument type="QString" comment="System command to use for \
suspend"> @@ -31,7 +31,7 @@
     <action id="suspend2Disk" name="Hibernate" description="Suspends your computer \
disk (deep sleep)">  <prototype>
             <serviceName>org.kde.klauncher</serviceName>
-            <node>KLauncher</node>
+            <node>/KLauncher</node>
             <function>kdeinit_exec</function>
             <arguments>
                 <argument type="QString" comment="System command to use for \
suspend"> @@ -51,7 +51,7 @@
     <action id="shutdown" name="Shutdown" description="Logout and shutdown your \
computer">  <prototype>
             <serviceName>org.kde.ksmserver</serviceName>
-            <node>KSMServer</node>
+            <node>/KSMServer</node>
             <function>logout</function>
             <arguments>
                 <argument type="int" comment="Ask for confirmation? 1 = No, 2 = \
Yes"> @@ -72,7 +72,7 @@
     <action id="reboot" name="Reboot" description="Logout and restart your \
computer">  <prototype>                       
             <serviceName>org.kde.ksmserver</serviceName>
-            <node>KSMServer</node>
+            <node>/KSMServer</node>
             <function>logout</function>
             <arguments>
                 <argument type="int" comment="Ask for confirmation? 1 = No, 2 = \
Yes"> @@ -91,7 +91,7 @@
     <action id="logout" name="Logout" description="Just log out">
         <prototype>                       
             <serviceName>org.kde.ksmserver</serviceName>
-            <node>KSMServer</node>
+            <node>/KSMServer</node>
             <function>logout</function>
             <arguments>
                 <argument type="int" comment="Ask for confirmation? 1 = No, 2 = \
                Yes">
diff --git a/profiles/profile.xsd b/profiles/profile.xsd
index c82dddd..e9998a2 100644
--- a/profiles/profile.xsd
+++ b/profiles/profile.xsd
@@ -84,7 +84,8 @@
     <xs:sequence>
       <xs:element name="serviceName" type="xs:string"/>
       <xs:element name="node" type="xs:string"/>
-      <xs:element name="function" type="xs:string"/>  
+      <xs:element name="interface" type="xs:string" minOccurs="0"/>
+      <xs:element name="function" type="xs:string"/>
       <xs:element name="return" type="xs:string" default="void" minOccurs="0"/>
       <xs:element name="arguments" minOccurs="0">
         <xs:complexType>
diff --git a/profiles/vlc.profile.xml b/profiles/vlc.profile.xml
index b628260..70d8cdc 100644
--- a/profiles/vlc.profile.xml
+++ b/profiles/vlc.profile.xml
@@ -12,7 +12,7 @@
     <action id="play" name="Play" description="Start playing">
         <prototype>
             <serviceName>org.mpris.vlc</serviceName>
-            <node>Player</node>
+            <node>/Player</node>
             <function>Play</function>
         </prototype>
         <button>Play</button>
@@ -21,7 +21,7 @@
     <action id="stop" name="Stop" description="Stop playing">
         <prototype>
             <serviceName>org.mpris.vlc</serviceName>
-            <node>Player</node>
+            <node>/Player</node>
             <function>Stop</function>
         </prototype>        
         <button>Stop</button>
@@ -30,7 +30,7 @@
     <action id="pause" name="Pause" description="Pause playing">
         <prototype>
             <serviceName>org.mpris.vlc</serviceName>
-            <node>Player</node>
+            <node>/Player</node>
             <function>Pause</function>
         </prototype>
         <button>Pause</button>
@@ -39,7 +39,7 @@
     <action id="skipForward" name="Skip Forward" description="Advance to next \
track">  <prototype>
             <serviceName>org.mpris.vlc</serviceName>
-            <node>Player</node>
+            <node>/Player</node>
             <function>Next</function>
         </prototype>
         <button>SkipForward</button>
@@ -49,7 +49,7 @@
     <action id="skipBackward" name="Skip Backward" description="Go to previous \
track">  <prototype>
             <serviceName>org.mpris.vlc</serviceName>
-            <node>Player</node>
+            <node>/Player</node>
             <function>Prev</function>
         </prototype>
         <button>SkipBackward</button>
diff --git a/profiles/vlc2.profile.xml b/profiles/vlc2.profile.xml
new file mode 100644
index 0000000..e29911b
--- /dev/null
+++ b/profiles/vlc2.profile.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+   <profile
+		xmlns="urn:org-kde-kremotecontrol"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="urn:org-kde-kremotecontrol file:profile.xsd"
+	>
+
+
+	<name>VLC media player</name>
+	<description>
+		This KRemoteControl template provide easy setup for VLC 2 mediaplayer.
+		Enable VLC D-Bus control interface in order to use KRemoteControl to control it.
+		If having problem with this profile try configuring it for single instance \
running. +	</description>
+	<version>0.2</version>
+	<author>Gioacchino Mazzurco [gio@eigenlab.org]</author>
+	
+
+	<!-- VLC 2 impements mpris 2 interface specification, the D-Bus name is \
org.mpris.MediaPlayer2.vlc --> +
+<!--	<action id="play" name="Play" description="Start playing">
+		<prototype>
+			<serviceName>org.mpris.MediaPlayer2.vlc</serviceName>
+                        <node>/org/mpris/MediaPlayer2</node>
+			<function>Play</function>
+		</prototype>
+		<button>Play</button>
+	</action>
+
+	<action id="pause" name="Pause" description="Pause playing">
+		<prototype>
+			<serviceName>org.mpris.MediaPlayer2.vlc</serviceName>
+                        <node>/org/mpris/MediaPlayer2</node>
+			<function>Pause</function>
+		</prototype>
+		<button>Pause</button>
+	</action>-->
+	
+	<action id="playpause" name="Play Pause" description="Toggle Play/Pause">
+		<prototype>
+			<serviceName>org.mpris.MediaPlayer2.vlc</serviceName>
+                        <node>/org/mpris/MediaPlayer2</node>
+                        <interface>org.mpris.MediaPlayer2.Player</interface>
+                        <function>PlayPause</function>
+		</prototype>
+		<button>PlayPause</button>
+		<ifmulti>sendtoall</ifmulti>
+	</action>
+    
+<!--	<action id="stop" name="Stop" description="Stop playing">
+		<prototype>
+			<serviceName>org.mpris.MediaPlayer2.vlc</serviceName>
+			<node>org/mpris/MediaPlayer2</node>
+			<function>Stop</function>
+		</prototype>        
+		<button>Stop</button>
+	</action>
+    
+	<action id="skipForward" name="Skip Forward" description="Advance to next track">
+		<prototype>
+			<serviceName>org.mpris.MediaPlayer2.vlc</serviceName>
+			<node>org/mpris/MediaPlayer2</node>
+			<function>Next</function>
+		</prototype>
+		<button>SkipForward</button>
+		<repeat>true</repeat>
+	</action>
+
+	<action id="skipBackward" name="Skip Backward" description="Go to previous track">
+		<prototype>
+			<serviceName>org.mpris.MediaPlayer2.vlc</serviceName>
+			<node>org/mpris/MediaPlayer2</node>
+			<function>Prev</function>
+		</prototype>
+		<button>SkipBackward</button>
+		<repeat>true</repeat>
+	</action>            -->
+</profile>
\ No newline at end of file


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic