diff options
author | David Zeuthen <davidz@redhat.com> | 2009-08-12 11:52:46 -0400 |
---|---|---|
committer | David Zeuthen <davidz@redhat.com> | 2009-08-12 11:52:46 -0400 |
commit | f1e312653c7c7d3eafcfb6a55b884faa19e5ea5d (patch) | |
tree | ef56d22c4ae9fbf41dba160b31d3d69d03bb1a13 /src/polkitbackend/polkitbackendsessionmonitor.c | |
parent | 6806b4883077745c3f288cfe679181a61849f97f (diff) | |
download | polkit-f1e312653c7c7d3eafcfb6a55b884faa19e5ea5d.tar.gz |
Remove temporary authorization when the subject it applies to vanishes
This makes it easier to write the desktop component showing a
notification icon - said component now only needs to watch ::changed
and reenumerate temporary authorizations. If this is done, then the
notification icon is updated in near-realtime.
Also emit ::changed on ConsoleKit changes. This helps remind
Mechanisms that they should redo an authorization check (if this is
how the Mechanism decides to cache authorizations).
Diffstat (limited to 'src/polkitbackend/polkitbackendsessionmonitor.c')
-rw-r--r-- | src/polkitbackend/polkitbackendsessionmonitor.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/polkitbackend/polkitbackendsessionmonitor.c b/src/polkitbackend/polkitbackendsessionmonitor.c index eca8bd8..ecdd6a6 100644 --- a/src/polkitbackend/polkitbackendsessionmonitor.c +++ b/src/polkitbackend/polkitbackendsessionmonitor.c @@ -55,8 +55,18 @@ struct _PolkitBackendSessionMonitorClass { GObjectClass parent_class; + void (*changed) (PolkitBackendSessionMonitor *monitor); }; + +enum +{ + CHANGED_SIGNAL, + LAST_SIGNAL, +}; + +static guint signals[LAST_SIGNAL] = {0}; + static void seat_session_added (CkSeat *seat, const gchar *object_path, gpointer user_data); @@ -154,6 +164,8 @@ manager_seat_added (CkManager *manager, //g_debug ("seat %s added", object_path); add_seat (monitor, object_path); + + g_signal_emit (monitor, signals[CHANGED_SIGNAL], 0); } static void @@ -166,6 +178,8 @@ manager_seat_removed (CkManager *manager, //g_debug ("seat %s removed", object_path); remove_seat (monitor, object_path); + + g_signal_emit (monitor, signals[CHANGED_SIGNAL], 0); } static void @@ -178,6 +192,8 @@ seat_session_added (CkSeat *seat, //g_debug ("session %s added", object_path); add_session (monitor, object_path); + + g_signal_emit (monitor, signals[CHANGED_SIGNAL], 0); } static void @@ -190,6 +206,8 @@ seat_session_removed (CkSeat *seat, //g_debug ("session %s removed", object_path); remove_session (monitor, object_path); + + g_signal_emit (monitor, signals[CHANGED_SIGNAL], 0); } static void @@ -197,6 +215,7 @@ session_active_changed (CkSession *session, gboolean is_active, gpointer user_data) { + PolkitBackendSessionMonitor *monitor = POLKIT_BACKEND_SESSION_MONITOR (user_data); EggDBusObjectProxy *object_proxy; object_proxy = egg_dbus_interface_proxy_get_object_proxy (EGG_DBUS_INTERFACE_PROXY (session)); @@ -204,6 +223,8 @@ session_active_changed (CkSession *session, //g_debug ("session %s active changed to %d", egg_dbus_object_proxy_get_object_path (object_proxy), is_active); egg_dbus_object_proxy_invalidate_properties (object_proxy); + + g_signal_emit (monitor, signals[CHANGED_SIGNAL], 0); } /* ---------------------------------------------------------------------------------------------------- */ @@ -307,6 +328,22 @@ polkit_backend_session_monitor_class_init (PolkitBackendSessionMonitorClass *kla gobject_class = G_OBJECT_CLASS (klass); gobject_class->finalize = polkit_backend_session_monitor_finalize; + + /** + * PolkitBackendSessionMonitor::changed: + * @monitor: A #PolkitBackendSessionMonitor + * + * Emitted when something changes. + */ + signals[CHANGED_SIGNAL] = g_signal_new ("changed", + POLKIT_BACKEND_TYPE_SESSION_MONITOR, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (PolkitBackendSessionMonitorClass, changed), + NULL, /* accumulator */ + NULL, /* accumulator data */ + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, + 0); } PolkitBackendSessionMonitor * |