diff options
Diffstat (limited to 'mate-session/gsm-manager.c')
-rw-r--r-- | mate-session/gsm-manager.c | 85 |
1 files changed, 43 insertions, 42 deletions
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 |