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.
+
+
+