Blob Blame History Raw
Index: kinit/klauncher.cpp
===================================================================
--- kinit/klauncher.cpp	(revision 918653)
+++ kinit/klauncher.cpp	(revision 918654)
@@ -58,6 +58,9 @@
 
 // #define KLAUNCHER_VERBOSE_OUTPUT
 
+static const char* const s_DBusStartupTypeToString[] =
+    { "DBusNone", "DBusUnique", "DBusMulti", "DBusWait", "ERROR" };
+
 using namespace KIO;
 
 IdleSlave::IdleSlave(QObject *parent)
@@ -393,15 +396,19 @@
       if (request->pid == pid)
       {
          if (request->dbus_startup_type == KService::DBusWait)
-            request->status = KLaunchRequest::Done;
+             request->status = KLaunchRequest::Done;
          else if ((request->dbus_startup_type == KService::DBusUnique)
-                  && QDBusConnection::sessionBus().interface()->isServiceRegistered(request->dbus_name))
-            request->status = KLaunchRequest::Running;
-         else
-            request->status = KLaunchRequest::Error;
+                  && QDBusConnection::sessionBus().interface()->isServiceRegistered(request->dbus_name)) {
+             request->status = KLaunchRequest::Running;
 #ifdef KLAUNCHER_VERBOSE_OUTPUT
-         kDebug(7016) << pid << "died, requestDone. status=" << request->status;
+             kDebug(7016) << pid << "running as a unique app";
 #endif
+         } else {
+             request->status = KLaunchRequest::Error;
+#ifdef KLAUNCHER_VERBOSE_OUTPUT
+             kDebug(7016) << pid << "died, requestDone. status=" << request->status;
+#endif
+         }
          requestDone(request);
          return;
       }
@@ -446,19 +453,29 @@
       if (request->status != KLaunchRequest::Launching)
          continue;
 
+#ifdef KLAUNCHER_VERBOSE_OUTPUT
+      kDebug(7016) << "had pending request" << request->name << s_DBusStartupTypeToString[request->dbus_startup_type] << "dbus_name" << request->dbus_name << request->tolerant_dbus_name;
+#endif
       // For unique services check the requested service name first
-      if ((request->dbus_startup_type == KService::DBusUnique) &&
-          ((appId == request->dbus_name) ||
-           QDBusConnection::sessionBus().interface()->isServiceRegistered(request->dbus_name)))
-      {
-         request->status = KLaunchRequest::Running;
-         requestDone(request);
-         continue;
+      if (request->dbus_startup_type == KService::DBusUnique) {
+          if ((appId == request->dbus_name) || // just started
+              QDBusConnection::sessionBus().interface()->isServiceRegistered(request->dbus_name)) { // was already running
+              request->status = KLaunchRequest::Running;
+#ifdef KLAUNCHER_VERBOSE_OUTPUT
+              kDebug(7016) << "OK, unique app" << request->dbus_name << "is running";
+#endif
+              requestDone(request);
+              continue;
+          } else {
+#ifdef KLAUNCHER_VERBOSE_OUTPUT
+              kDebug(7016) << "unique app" << request->dbus_name << "not running yet";
+#endif
+          }
       }
 
-      const QString rAppId = request->dbus_name;
+      const QString rAppId = !request->tolerant_dbus_name.isEmpty() ? request->tolerant_dbus_name : request->dbus_name;
 #ifdef KLAUNCHER_VERBOSE_OUTPUT
-      kDebug(7016) << "had pending request" << rAppId;
+      //kDebug(7016) << "using" << rAppId << "for matching";
 #endif
       if (rAppId.isEmpty())
           continue;
@@ -818,11 +835,18 @@
                request->dbus_name = v.toString().toUtf8();
            }
            if (request->dbus_name.isEmpty()) {
-               request->dbus_name = "*." + QFile::encodeName(KRun::binaryName(service->exec(), true));
+               const QString binName = KRun::binaryName(service->exec(), true);
+               request->dbus_name = "org.kde." + binName;
+               request->tolerant_dbus_name = "*." + binName;
            }
        }
    }
 
+#ifdef KLAUNCHER_VERBOSE_OUTPUT
+   kDebug(7016) << "name=" << request->name << "dbus_name=" << request->dbus_name
+                << "startup type=" << s_DBusStartupTypeToString[request->dbus_startup_type];
+#endif
+
    request->pid = 0;
    request->envs = envs;
    send_service_startup_info( request, service, startup_id, envs );
@@ -938,7 +962,7 @@
        request->arg_list.append(arg.toLocal8Bit());
    }
 
-   request->name = app.toLocal8Bit();
+   request->name = app;
 
    if (wait)
       request->dbus_startup_type = KService::DBusWait;
@@ -1113,7 +1137,7 @@
     }
     if (mSlaveValgrind == arg1)
     {
-       arg_list.prepend(QFile::encodeName(KLibLoader::findLibrary(name.toLocal8Bit())));
+       arg_list.prepend(QFile::encodeName(KLibLoader::findLibrary(name)));
        arg_list.prepend(QFile::encodeName(KStandardDirs::locate("exe", "kioslave")));
        name = "valgrind";
        if (!mSlaveValgrindSkin.isEmpty()) {
Index: kinit/klauncher.h
===================================================================
--- kinit/klauncher.h	(revision 918653)
+++ kinit/klauncher.h	(revision 918654)
@@ -87,6 +87,7 @@
    QString name;
    QStringList arg_list;
    QString dbus_name;
+   QString tolerant_dbus_name;
    enum status_t { Init = 0, Launching, Running, Error, Done };
    pid_t pid;
    status_t status;