Skip to content

Commit 37d538e

Browse files
committed
systemd: add api for detecting if this is the last session for a user
https://bugzilla.gnome.org/show_bug.cgi?id=764029 Adapted from https://gitlab.gnome.org/GNOME/gnome-session/commit/f708bbbf
1 parent 409d9fc commit 37d538e

File tree

2 files changed

+67
-0
lines changed

2 files changed

+67
-0
lines changed

mate-session/gsm-systemd.c

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -421,6 +421,71 @@ emit_stop_complete (GsmSystemd *manager,
421421
}
422422
}
423423

424+
gboolean
425+
gsm_systemd_is_last_session_for_user (GsmSystemd *manager)
426+
{
427+
char **sessions = NULL;
428+
char *session = NULL;
429+
gboolean is_last_session;
430+
int ret, i;
431+
432+
ret = sd_pid_get_session (getpid (), &session);
433+
434+
if (ret != 0) {
435+
return FALSE;
436+
}
437+
438+
ret = sd_uid_get_sessions (getuid (), FALSE, &sessions);
439+
440+
if (ret <= 0) {
441+
free (session);
442+
return FALSE;
443+
}
444+
445+
is_last_session = TRUE;
446+
for (i = 0; sessions[i]; i++) {
447+
char *state = NULL;
448+
char *type = NULL;
449+
450+
if (g_strcmp0 (sessions[i], session) == 0)
451+
continue;
452+
453+
ret = sd_session_get_state (sessions[i], &state);
454+
455+
if (ret != 0)
456+
continue;
457+
458+
if (g_strcmp0 (state, "closing") == 0) {
459+
free (state);
460+
continue;
461+
}
462+
free (state);
463+
464+
ret = sd_session_get_type (sessions[i], &type);
465+
466+
if (ret != 0)
467+
continue;
468+
469+
if (g_strcmp0 (type, "x11") != 0 &&
470+
g_strcmp0 (type, "wayland") != 0) {
471+
free (type);
472+
continue;
473+
}
474+
free (type);
475+
476+
is_last_session = FALSE;
477+
478+
break;
479+
}
480+
481+
for (i = 0; sessions[i]; i++)
482+
free (sessions[i]);
483+
free (sessions);
484+
free (session);
485+
486+
return is_last_session;
487+
}
488+
424489
void
425490
gsm_systemd_attempt_restart (GsmSystemd *manager)
426491
{

mate-session/gsm-systemd.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ gboolean gsm_systemd_can_hibernate (GsmSystemd *manager);
7676

7777
gboolean gsm_systemd_can_suspend (GsmSystemd *manager);
7878

79+
gboolean gsm_systemd_is_last_session_for_user (GsmSystemd *manager);
80+
7981
void gsm_systemd_attempt_stop (GsmSystemd *manager);
8082

8183
void gsm_systemd_attempt_restart (GsmSystemd *manager);

0 commit comments

Comments
 (0)