From 52bc89324e4c2c311a2ce2ead67a1ff97a5cf0a9 Mon Sep 17 00:00:00 2001 From: Robert Tari Date: Sun, 6 Aug 2023 17:44:44 +0200 Subject: Add remote session detection/termination fixes https://github.com/AyatanaIndicators/ayatana-indicator-session/issues/13 --- CMakeLists.txt | 3 +- src/service.c | 90 ++++++++++++++++++++++++++++++++++++++++++---------------- 2 files changed, 68 insertions(+), 25 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5c244c8..79cf868 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -48,7 +48,8 @@ include (FindPkgConfig) pkg_check_modules (SERVICE REQUIRED libayatana-common>=0.9.2 glib-2.0>=2.36 - gio-unix-2.0>=2.36) + gio-unix-2.0>=2.36 + rda) include_directories (${SERVICE_INCLUDE_DIRS}) set (ARCHIVE_NAME ${CMAKE_PROJECT_NAME}-${PROJECT_VERSION}) diff --git a/src/service.c b/src/service.c index d05f2cb..7711f97 100644 --- a/src/service.c +++ b/src/service.c @@ -22,7 +22,7 @@ #include #include #include - +#include #include "backend.h" #include "recoverable-problem.h" #include "service.h" @@ -115,6 +115,7 @@ struct _IndicatorSessionServicePrivate GDBusConnection * conn; GCancellable * cancellable; GVariant * default_icon_serialized; + gboolean bLocal; }; typedef IndicatorSessionServicePrivate priv_t; @@ -676,6 +677,11 @@ create_switch_section (IndicatorSessionService * self, int profile) menu = g_menu_new (); + if (!self->priv->bLocal) + { + return G_MENU_MODEL (menu); + } + /* lockswitch */ if (indicator_session_users_is_live_session (p->backend_users)) { @@ -828,11 +834,21 @@ create_logout_section (IndicatorSessionService * self) menu = g_menu_new (); - if (indicator_session_actions_can_logout (p->backend_actions)) - { - const char * label = ellipsis ? _("Log Out…") : _("Log Out"); - g_menu_append (menu, label, "indicator.logout"); - } + if (!self->priv->bLocal || indicator_session_actions_can_logout (p->backend_actions)) + { + const char * label = NULL; + + if (self->priv->bLocal && ellipsis) + { + label = _("Log Out…"); + } + else + { + label = _("Log Out"); + } + + g_menu_append (menu, label, "indicator.logout"); + } return G_MENU_MODEL (menu); } @@ -847,25 +863,35 @@ create_session_section (IndicatorSessionService * self, int profile) menu = g_menu_new (); - if (indicator_session_actions_can_suspend (p->backend_actions)) - g_menu_append (menu, _("Suspend"), "indicator.suspend"); + if (self->priv->bLocal) + { + if (indicator_session_actions_can_suspend (p->backend_actions)) + g_menu_append (menu, _("Suspend"), "indicator.suspend"); - if (indicator_session_actions_can_hibernate (p->backend_actions)) - g_menu_append (menu, _("Hibernate"), "indicator.hibernate"); + if (indicator_session_actions_can_hibernate (p->backend_actions)) + g_menu_append (menu, _("Hibernate"), "indicator.hibernate"); - if (profile != PROFILE_LOCKSCREEN && - indicator_session_actions_can_reboot (p->backend_actions)) - { - const char * label = ellipsis ? _("Restart…") : _("Restart"); - g_menu_append (menu, label, "indicator.reboot"); - } + if (profile != PROFILE_LOCKSCREEN && indicator_session_actions_can_reboot (p->backend_actions)) + { + const char * label = ellipsis ? _("Restart…") : _("Restart"); + g_menu_append (menu, label, "indicator.reboot"); + } - if (profile != PROFILE_LOCKSCREEN && - !g_settings_get_boolean (s, "suppress-shutdown-menuitem")) - { - const char * label = ellipsis ? _("Shut Down…") : _("Shut Down"); - g_menu_append (menu, label, "indicator.power-off"); - } + if (profile != PROFILE_LOCKSCREEN && !g_settings_get_boolean (s, "suppress-shutdown-menuitem")) + { + const char * label = ellipsis ? _("Shut Down…") : _("Shut Down"); + g_menu_append (menu, label, "indicator.power-off"); + } + } + else + { + gboolean bSuspendable = rda_session_can_be_suspended (); + + if (bSuspendable) + { + g_menu_append (menu, _("Suspend Remote Session"), "indicator.remotesuspend"); + } + } return G_MENU_MODEL (menu); } @@ -986,7 +1012,16 @@ on_logout_activated (GSimpleAction * a G_GNUC_UNUSED, GVariant * param G_GNUC_UNUSED, gpointer gself) { - indicator_session_actions_logout (get_backend_actions(gself)); + IndicatorSessionService *self = INDICATOR_SESSION_SERVICE (gself); + + if (!self->priv->bLocal) + { + rda_session_terminate (); + } + else + { + indicator_session_actions_logout (get_backend_actions(gself)); + } } static void @@ -1062,6 +1097,11 @@ static void on_custom_activated (GSimpleAction *pAction G_GNUC_UNUSED, GVariant ayatana_common_utils_open_url (sUri); } +static void onRemoteSuspend (GSimpleAction *pAction G_GNUC_UNUSED, GVariant *pParam G_GNUC_UNUSED, gpointer pUserData) +{ + rda_session_suspend (); +} + static void init_gactions (IndicatorSessionService * self) { @@ -1083,7 +1123,8 @@ init_gactions (IndicatorSessionService * self) { "switch-to-greeter", on_greeter_activated }, { "suspend", on_suspend_activated }, { "power-off", on_power_off_activated }, - { "custom", on_custom_activated } + { "custom", on_custom_activated }, + { "remotesuspend", onRemoteSuspend } }; p->actions = g_simple_action_group_new (); @@ -1372,6 +1413,7 @@ indicator_session_service_init (IndicatorSessionService * self) } self->priv = p; + self->priv->bLocal = rda_session_is_local (); /* init the backend objects */ p->cancellable = g_cancellable_new (); -- cgit v1.2.3