Blob Blame History Raw
diff --git a/mate-session/gsm-manager.c b/mate-session/gsm-manager.c
index 2a4d140..11af41b 100644
--- a/mate-session/gsm-manager.c
+++ b/mate-session/gsm-manager.c
@@ -1034,18 +1034,21 @@ cancel_end_session (GsmManager *manager)
 }
 
 static gboolean
-is_program_in_path (const char *program)
+process_is_running (const char * name)
 {
-        char *tmp = g_find_program_in_path (program);
-        if (tmp != NULL)
-        {
-                g_free (tmp);
-                return TRUE;
-        }
-        else
-        {
-                return FALSE;
-        }
+       int num_processes;
+       char * command = g_strdup_printf ("pidof %s | wc -l", name);
+       FILE *fp = popen(command, "r");
+       fscanf(fp, "%d", &num_processes);
+       pclose(fp);
+       g_free (command);
+
+       if (num_processes > 0) {
+           return TRUE;
+       }
+       else {
+           return FALSE;
+       }
 }
 
 static void
@@ -1054,6 +1057,7 @@ manager_switch_user (GsmManager *manager)
         GError  *error;
         gboolean res;
         char    *command;
+        const gchar *xdg_seat_path = g_getenv ("XDG_SEAT_PATH");
 
         /* We have to do this here and in request_switch_user() because this
          * function can be called at a later time, not just directly after
@@ -1063,7 +1067,7 @@ manager_switch_user (GsmManager *manager)
                 return;
         }
 
-        if (is_program_in_path (MDM_FLEXISERVER_COMMAND)) {
+        if (process_is_running("mdm")) {
                 /* MDM */
                 command = g_strdup_printf ("%s %s",
                                            MDM_FLEXISERVER_COMMAND,
@@ -1079,7 +1083,7 @@ manager_switch_user (GsmManager *manager)
                         g_error_free (error);
                 }
         }
-        else if (is_program_in_path (GDM_FLEXISERVER_COMMAND)) {
+        else if (process_is_running("gdm") || process_is_running("gdm3")) {
                 /* GDM */
                 command = g_strdup_printf ("%s %s",
                                                GDM_FLEXISERVER_COMMAND,
@@ -1095,38 +1099,35 @@ manager_switch_user (GsmManager *manager)
                         g_error_free (error);
                 }
         }
-        else {
+        else if (xdg_seat_path != NULL) {
                 /* LightDM */
-                const gchar *xdg_seat_path = g_getenv ("XDG_SEAT_PATH");
-                if (xdg_seat_path != NULL) {
-                        GDBusProxyFlags flags = G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START;
-                        GDBusProxy *proxy = NULL;
-                        error = NULL;
+                GDBusProxyFlags flags = G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START;
+                GDBusProxy *proxy = NULL;
+                error = NULL;
 
-                        proxy = g_dbus_proxy_new_for_bus_sync(G_BUS_TYPE_SYSTEM,
-                                                              flags,
-                                                              NULL,
-                                                              "org.freedesktop.DisplayManager",
-                                                              xdg_seat_path,
-                                                              "org.freedesktop.DisplayManager.Seat",
-                                                              NULL,
-                                                              &error);
-                        if (proxy != NULL) {
-                                g_dbus_proxy_call_sync (proxy,
-                                                        "SwitchToGreeter",
-                                                        g_variant_new ("()"),
-                                                        G_DBUS_CALL_FLAGS_NONE,
-                                                        -1,
-                                                        NULL,
-                                                        NULL);
-                                g_object_unref (proxy);
-                        }
-                        else {
-                                g_debug ("GsmManager: Unable to start LightDM greeter: %s", error->message);
-                                g_error_free (error);
-                        }
+                proxy = g_dbus_proxy_new_for_bus_sync(G_BUS_TYPE_SYSTEM,
+                                                      flags,
+                                                      NULL,
+                                                      "org.freedesktop.DisplayManager",
+                                                      xdg_seat_path,
+                                                      "org.freedesktop.DisplayManager.Seat",
+                                                      NULL,
+                                                      &error);
+                if (proxy != NULL) {
+                        g_dbus_proxy_call_sync (proxy,
+                                                "SwitchToGreeter",
+                                                g_variant_new ("()"),
+                                                G_DBUS_CALL_FLAGS_NONE,
+                                                -1,
+                                                NULL,
+                                                NULL);
+                        g_object_unref (proxy);
                 }
-        }
+                else {
+                        g_debug ("GsmManager: Unable to start LightDM greeter: %s", error->message);
+                        g_error_free (error);
+                }
+         }
 }
 
 static gboolean