diff --git a/cinnamon-session/csm-app.c b/cinnamon-session/csm-app.c index 0c1fb51..a629ba8 100644 --- a/cinnamon-session/csm-app.c +++ b/cinnamon-session/csm-app.c @@ -510,18 +510,23 @@ csm_app_restart (CsmApp *app, GTimeVal current_time; g_debug ("Re-starting app: %s", app->priv->id); - g_get_current_time (¤t_time); - if (app->priv->last_restart_time.tv_sec > 0 - && (current_time.tv_sec - app->priv->last_restart_time.tv_sec) < _CSM_APP_RESPAWN_RATELIMIT_SECONDS) { - g_warning ("App '%s' respawning too quickly", csm_app_peek_app_id (app)); - g_set_error (error, - CSM_APP_ERROR, - CSM_APP_ERROR_RESTART_LIMIT, - "Component '%s' crashing too quickly", - csm_app_peek_app_id (app)); - return FALSE; + // Cinnamon is *not* autorestart, we will only force it to via dbus RestartCinnamonLauncher + // and don't want that to be skipped for some reason if it happens multiple times within a minute. + // (This shouldn't ever happen anyhow). + if (g_strcmp0 (app->priv->app_id, "cinnamon.desktop") != 0) { + g_get_current_time (¤t_time); + if (app->priv->last_restart_time.tv_sec > 0 + && (current_time.tv_sec - app->priv->last_restart_time.tv_sec) < _CSM_APP_RESPAWN_RATELIMIT_SECONDS) { + g_warning ("App '%s' respawning too quickly", csm_app_peek_app_id (app)); + g_set_error (error, + CSM_APP_ERROR, + CSM_APP_ERROR_RESTART_LIMIT, + "Component '%s' crashing too quickly", + csm_app_peek_app_id (app)); + return FALSE; + } + app->priv->last_restart_time = current_time; } - app->priv->last_restart_time = current_time; return CSM_APP_GET_CLASS (app)->impl_restart (app, error); } diff --git a/cinnamon-session/csm-consolekit.c b/cinnamon-session/csm-consolekit.c index c947778..3022f80 100644 --- a/cinnamon-session/csm-consolekit.c +++ b/cinnamon-session/csm-consolekit.c @@ -859,6 +859,12 @@ csm_consolekit_is_last_session_for_user (CsmSystem *system) return FALSE; } +static gchar * +csm_consolekit_get_login_session_id (CsmSystem *system) +{ + return NULL; +} + static void csm_consolekit_system_init (CsmSystemInterface *iface) { @@ -876,6 +882,7 @@ csm_consolekit_system_init (CsmSystemInterface *iface) iface->add_inhibitor = csm_consolekit_add_inhibitor; iface->remove_inhibitor = csm_consolekit_remove_inhibitor; iface->is_last_session_for_user = csm_consolekit_is_last_session_for_user; + iface->get_login_session_id = csm_consolekit_get_login_session_id; } CsmConsolekit * diff --git a/cinnamon-session/csm-manager.c b/cinnamon-session/csm-manager.c index 2236977..1af263d 100644 --- a/cinnamon-session/csm-manager.c +++ b/cinnamon-session/csm-manager.c @@ -1598,6 +1598,17 @@ _csm_manager_set_active_session (CsmManager *manager, session_name); } +void +_csm_manager_export_login_session_id (CsmManager *manager) +{ + g_autofree gchar *session_id = NULL; + + session_id = csm_system_get_login_session_id (manager->priv->system); + + csm_exported_manager_set_session_id (manager->priv->skeleton, + session_id); +} + static gboolean _app_has_app_id (const char *id, CsmApp *app, @@ -1695,6 +1706,29 @@ find_app_for_startup_id (CsmManager *manager, return found_app; } +static gboolean +restart_cinnamon_launcher (CsmManager *manager) +{ + CsmApp *app; + + app = find_app_for_app_id (manager, "cinnamon.desktop"); + + if (app) { + GError *error = NULL; + + g_debug ("CsmManager: Restarting cinnamon-launcher"); + + if (!csm_app_restart (app, &error)) { + g_warning ("CsmManager: Unable to restart cinnamon-launcher: %s", error->message); + g_error_free (error); + } + } else { + g_warning ("CsmManager: Unable to find the cinnamon-launcher"); + } + + return G_SOURCE_REMOVE; +} + static gboolean csm_manager_setenv (CsmExportedManager *skeleton, GDBusMethodInvocation *invocation, @@ -2348,6 +2382,30 @@ csm_manager_request_reboot (CsmExportedManager *skeleton, return TRUE; } +static gboolean +csm_manager_restart_cinnamon_launcher (CsmExportedManager *skeleton, + GDBusMethodInvocation *invocation, + CsmManager *manager) +{ + g_debug ("CsmManager: RestartCinnamonLauncher called"); + + if (manager->priv->phase != CSM_MANAGER_PHASE_RUNNING) { + g_dbus_method_invocation_return_error (invocation, + CSM_MANAGER_ERROR, + CSM_MANAGER_ERROR_NOT_IN_RUNNING, + "RestartCinnamonLauncher interface is only available during the Running phase"); + + return TRUE; + } + + g_idle_add ((GSourceFunc)restart_cinnamon_launcher, manager); + + csm_exported_manager_complete_restart_cinnamon_launcher (skeleton, + invocation); + + return TRUE; +} + static void _disconnect_client (CsmManager *manager, CsmClient *client) @@ -2759,7 +2817,8 @@ static SkeletonSignal skeleton_signals[] = { { "handle-logout", csm_manager_logout_dbus }, { "handle-is-session-running", csm_manager_is_session_running }, { "handle-request-shutdown", csm_manager_request_shutdown }, - { "handle-request-reboot", csm_manager_request_reboot } + { "handle-request-reboot", csm_manager_request_reboot }, + { "handle-restart-cinnamon-launcher", csm_manager_restart_cinnamon_launcher } }; static SkeletonSignal dialog_skeleton_signals[] = { diff --git a/cinnamon-session/csm-manager.h b/cinnamon-session/csm-manager.h index 1d688f8..71b4d70 100644 --- a/cinnamon-session/csm-manager.h +++ b/cinnamon-session/csm-manager.h @@ -143,6 +143,8 @@ void _csm_manager_set_active_session (CsmManager * const char *session_name, gboolean is_fallback); +void _csm_manager_export_login_session_id (CsmManager *manager); + gboolean csm_manager_set_phase (CsmManager *manager, CsmManagerPhase phase); diff --git a/cinnamon-session/csm-session-fill.c b/cinnamon-session/csm-session-fill.c index 72c6db9..31858c4 100644 --- a/cinnamon-session/csm-session-fill.c +++ b/cinnamon-session/csm-session-fill.c @@ -496,6 +496,7 @@ csm_session_fill (CsmManager *manager, } _csm_manager_set_active_session (manager, actual_session, is_fallback); + _csm_manager_export_login_session_id (manager); g_free (actual_session); diff --git a/cinnamon-session/csm-system.c b/cinnamon-session/csm-system.c index 3e42f2c..c6be7b5 100644 --- a/cinnamon-session/csm-system.c +++ b/cinnamon-session/csm-system.c @@ -164,6 +164,12 @@ csm_system_is_last_session_for_user (CsmSystem *system) return CSM_SYSTEM_GET_IFACE (system)->is_last_session_for_user (system); } +gchar * +csm_system_get_login_session_id (CsmSystem *system) +{ + return CSM_SYSTEM_GET_IFACE (system)->get_login_session_id (system); +} + CsmSystem * csm_get_system (void) { diff --git a/cinnamon-session/csm-system.h b/cinnamon-session/csm-system.h index 3e8be22..7252124 100644 --- a/cinnamon-session/csm-system.h +++ b/cinnamon-session/csm-system.h @@ -70,6 +70,7 @@ struct _CsmSystemInterface void (* remove_inhibitor) (CsmSystem *system, const gchar *id); gboolean (* is_last_session_for_user) (CsmSystem *system); + gchar * (* get_login_session_id) (CsmSystem *system); }; enum _CsmSystemError { @@ -119,7 +120,7 @@ void csm_system_add_inhibitor (CsmSystem *system, void csm_system_remove_inhibitor (CsmSystem *system, const gchar *id); - +gchar *csm_system_get_login_session_id (CsmSystem *system); G_END_DECLS #endif /* __CSM_SYSTEM_H__ */ diff --git a/cinnamon-session/csm-systemd.c b/cinnamon-session/csm-systemd.c index 9db59d1..db3fe84 100644 --- a/cinnamon-session/csm-systemd.c +++ b/cinnamon-session/csm-systemd.c @@ -718,6 +718,26 @@ csm_systemd_is_last_session_for_user (CsmSystem *system) return is_last_session; } +static gchar * +csm_systemd_get_login_session_id (CsmSystem *system) +{ + CsmSystemd *manager = CSM_SYSTEMD (system); + + gchar *pid_session; + gint ret; + + ret = sd_pid_get_session (getpid (), &pid_session); + + if (ret < 0) { + g_printerr ("can't get login session id for cinnamon-session. errno: %d\n", -ret); + return NULL; + } + + g_debug ("Login session ID is: %s\n", pid_session); + + return pid_session; +} + static void csm_systemd_system_init (CsmSystemInterface *iface) { @@ -737,6 +757,7 @@ csm_systemd_system_init (CsmSystemInterface *iface) iface->add_inhibitor = csm_systemd_add_inhibitor; iface->remove_inhibitor = csm_systemd_remove_inhibitor; iface->is_last_session_for_user = csm_systemd_is_last_session_for_user; + iface->get_login_session_id = csm_systemd_get_login_session_id; } CsmSystemd * diff --git a/cinnamon-session/org.gnome.SessionManager.xml b/cinnamon-session/org.gnome.SessionManager.xml index 7d00801..70ab848 100644 --- a/cinnamon-session/org.gnome.SessionManager.xml +++ b/cinnamon-session/org.gnome.SessionManager.xml @@ -431,5 +431,20 @@ + + + + The login session ID of cinnamon-session. + + + + + + + + Launches cinnamon-launcher for current session. + + +