From 7054a072d67d9cc1de70ee87db7e033acdfaf967 Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: Mon, 13 Jun 2022 11:14:33 +0000 Subject: [PATCH] Auto sync2gitlab import of gnome-settings-daemon-3.32.0-16.el8.src.rpm --- .gitignore | 1 + ...-account-first-cut-at-account-plugin.patch | 12157 ++++++++++++++++ ...-Add-a-GPU-memory-usage-notification.patch | 5101 +++++++ ...screen-cast-as-stopped-if-it-was-sig.patch | 125 + ...le-Suspend-Hibernate-actions-inside-.patch | 53 + ...ard-Cancel-cancellable-when-stopping.patch | 58 + ...-plugin-to-provide-system-subscripti.patch | 1871 +++ ...-entry-for-the-overlay-scrolling-set.patch | 25 + ...the-notification-when-screen-unlocks.patch | 271 + ...lledProducts-dbus-property-for-g-c-c.patch | 768 + ...ount-display-nag-screen-periodically.patch | 451 + ...man-Increase-RHSM-dbus-call-timeouts.patch | 313 + ...ll-more-frequently-than-notification.patch | 110 + 0004-subman-Drop-userlang-field.patch | 454 + ...locale-for-registration-subscription.patch | 373 + ...bscription-manager-giving-invalid-st.patch | 236 + ...subscribe-if-the-admin-already-subsc.patch | 260 + ...-t-send-secrets-through-command-line.patch | 576 + ...n-t-treat-failure-to-attach-as-fatal.patch | 310 + ...-Add-new-no-installed-products-state.patch | 427 + 0011-subman-Fix-some-build-warnings.patch | 146 + ...API-to-subscribe-for-updates-on-alre.patch | 259 + ...Improve-subscription-status-handling.patch | 141 + 0014-subman-Drop-LAST-from-status-enum.patch | 56 + ...ubman-Clean-up-notification-behavior.patch | 419 + 0016-subman-Update-POTFILES.in.patch | 25 + 0017-Update-translations.patch | 10198 +++++++++++++ EMPTY | 1 - gnome-settings-daemon.spec | 1474 ++ ...ings-daemon.plugins.power.gschema.override | 3 + sources | 1 + 31 files changed, 36662 insertions(+), 1 deletion(-) create mode 100644 .gitignore create mode 100644 0001-account-first-cut-at-account-plugin.patch create mode 100644 0001-housekeeping-Add-a-GPU-memory-usage-notification.patch create mode 100644 0001-media-keys-Mark-screen-cast-as-stopped-if-it-was-sig.patch create mode 100644 0001-power-Only-disable-Suspend-Hibernate-actions-inside-.patch create mode 100644 0001-smartcard-Cancel-cancellable-when-stopping.patch create mode 100644 0001-subman-Add-a-new-plugin-to-provide-system-subscripti.patch create mode 100644 0001-xsettings-Add-an-entry-for-the-overlay-scrolling-set.patch create mode 100644 0002-account-reshow-the-notification-when-screen-unlocks.patch create mode 100644 0002-subman-Add-InstalledProducts-dbus-property-for-g-c-c.patch create mode 100644 0003-account-display-nag-screen-periodically.patch create mode 100644 0003-subman-Increase-RHSM-dbus-call-timeouts.patch create mode 100644 0004-account-don-t-poll-more-frequently-than-notification.patch create mode 100644 0004-subman-Drop-userlang-field.patch create mode 100644 0005-subman-Use-user-locale-for-registration-subscription.patch create mode 100644 0006-subman-Handle-subscription-manager-giving-invalid-st.patch create mode 100644 0007-subman-Force-re-subscribe-if-the-admin-already-subsc.patch create mode 100644 0008-subman-Don-t-send-secrets-through-command-line.patch create mode 100644 0009-subman-Don-t-treat-failure-to-attach-as-fatal.patch create mode 100644 0010-subman-Add-new-no-installed-products-state.patch create mode 100644 0011-subman-Fix-some-build-warnings.patch create mode 100644 0012-subman-Add-DBus-API-to-subscribe-for-updates-on-alre.patch create mode 100644 0013-subman-Improve-subscription-status-handling.patch create mode 100644 0014-subman-Drop-LAST-from-status-enum.patch create mode 100644 0015-subman-Clean-up-notification-behavior.patch create mode 100644 0016-subman-Update-POTFILES.in.patch create mode 100644 0017-Update-translations.patch delete mode 100644 EMPTY create mode 100644 gnome-settings-daemon.spec create mode 100644 org.gnome.settings-daemon.plugins.power.gschema.override create mode 100644 sources diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bac7ea9 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/gnome-settings-daemon-3.32.0.tar.xz diff --git a/0001-account-first-cut-at-account-plugin.patch b/0001-account-first-cut-at-account-plugin.patch new file mode 100644 index 0000000..ddbdf14 --- /dev/null +++ b/0001-account-first-cut-at-account-plugin.patch @@ -0,0 +1,12157 @@ +From d02ca09af14bdaed74fb3e3251aeed485ab419b8 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Mon, 6 Nov 2017 14:43:46 -0500 +Subject: [PATCH 1/4] account: first cut at account plugin + +It just notifies when the user's account is about to expire. + +Future commits will make it redisplay the notification after +screen unlock and provide some configurability for regular +nags. +--- + plugins/account/Makefile.am | 68 + + plugins/account/gsd-account-manager.c | 422 ++ + plugins/account/gsd-account-manager.h | 54 + + plugins/account/main.c | 7 + + plugins/account/meson.build | 39 + + .../account/org.freedesktop.Accounts.User.c | 6176 +++++++++++++++++ + .../account/org.freedesktop.Accounts.User.h | 725 ++ + .../account/org.freedesktop.Accounts.User.xml | 825 +++ + plugins/account/org.freedesktop.Accounts.c | 3016 ++++++++ + plugins/account/org.freedesktop.Accounts.h | 400 ++ + plugins/account/org.freedesktop.Accounts.xml | 248 + + .../org.gnome.SettingsDaemon.Account.desktop | 9 + + ...rg.gnome.SettingsDaemon.Account.desktop.in | 9 + + plugins/meson.build | 1 + + 14 files changed, 11999 insertions(+) + create mode 100644 plugins/account/Makefile.am + create mode 100644 plugins/account/gsd-account-manager.c + create mode 100644 plugins/account/gsd-account-manager.h + create mode 100644 plugins/account/main.c + create mode 100644 plugins/account/meson.build + create mode 100644 plugins/account/org.freedesktop.Accounts.User.c + create mode 100644 plugins/account/org.freedesktop.Accounts.User.h + create mode 100644 plugins/account/org.freedesktop.Accounts.User.xml + create mode 100644 plugins/account/org.freedesktop.Accounts.c + create mode 100644 plugins/account/org.freedesktop.Accounts.h + create mode 100644 plugins/account/org.freedesktop.Accounts.xml + create mode 100644 plugins/account/org.gnome.SettingsDaemon.Account.desktop + create mode 100644 plugins/account/org.gnome.SettingsDaemon.Account.desktop.in + +diff --git a/plugins/account/Makefile.am b/plugins/account/Makefile.am +new file mode 100644 +index 00000000..e06abcf5 +--- /dev/null ++++ b/plugins/account/Makefile.am +@@ -0,0 +1,68 @@ ++plugin_name = account ++ ++dbus_accounts_built_sources = org.freedesktop.Accounts.c org.freedesktop.Accounts.h ++dbus_accounts_user_built_sources = org.freedesktop.Accounts.User.c org.freedesktop.Accounts.User.h ++ ++BUILT_SOURCES = $(dbus_accounts_built_sources) \ ++ $(dbus_accounts_user_built_sources) ++ ++libexec_PROGRAMS = gsd-account ++ ++$(dbus_accounts_built_sources) : Makefile.am org.freedesktop.Accounts.xml ++ $(AM_V_GEN) gdbus-codegen \ ++ --interface-prefix org.freedesktop. \ ++ --c-namespace Gsd \ ++ --generate-c-code org.freedesktop.Accounts \ ++ --annotate "org.freedesktop.Accounts" \ ++ "org.gtk.GDBus.C.Name" Accounts \ ++ $(srcdir)/org.freedesktop.Accounts.xml ++ ++$(dbus_accounts_user_built_sources) : Makefile.am org.freedesktop.Accounts.User.xml ++ $(AM_V_GEN) gdbus-codegen \ ++ --interface-prefix org.freedesktop. \ ++ --c-namespace Gsd \ ++ --generate-c-code org.freedesktop.Accounts.User \ ++ --annotate "org.freedesktop.Accounts.User" \ ++ "org.gtk.GDBus.C.Name" AccountsUser \ ++ $(srcdir)/org.freedesktop.Accounts.User.xml ++ ++gsd_account_SOURCES = \ ++ main.c \ ++ gsd-account-manager.c \ ++ gsd-account-manager.h \ ++ $(COMMON_FILES) ++ ++nodist_gsd_account_SOURCES = \ ++ $(dbus_accounts_built_sources) \ ++ $(dbus_accounts_user_built_sources) ++ ++gsd_account_CPPFLAGS = \ ++ -I$(top_srcdir)/data/ \ ++ -I$(top_srcdir)/gnome-settings-daemon \ ++ -I$(top_builddir)/gnome-settings-daemon \ ++ -I$(top_srcdir)/plugins/common \ ++ -DGNOME_SETTINGS_LOCALEDIR=\""$(datadir)/locale"\" \ ++ -DLIBEXECDIR=\""$(libexecdir)"\" \ ++ $(AM_CPPFLAGS) ++ ++gsd_account_CFLAGS = \ ++ $(PLUGIN_CFLAGS) \ ++ $(ACCOUNT_CFLAGS) ++ ++gsd_account_LDADD = \ ++ $(top_builddir)/gnome-settings-daemon/libgsd.la \ ++ $(top_builddir)/plugins/common/libcommon.la \ ++ $(ACCOUNT_LIBS) ++ ++desktopdir = $(sysconfdir)/xdg/autostart ++desktop_in_files = org.gnome.SettingsDaemon.Account.desktop.in ++desktop_DATA = $(desktop_in_files:.desktop.in=.desktop) ++ ++org.gnome.SettingsDaemon.Account.desktop: $(desktop_in_files) Makefile ++ $(AM_V_GEN) sed -e "s|\@libexecdir\@|$(libexecdir)|" $< > $@ ++ ++EXTRA_DIST = $(desktop_in_files) ++ ++CLEANFILES = $(desktop_DATA) ++ ++DISTCLEANFILES = $(desktop_DATA) +diff --git a/plugins/account/gsd-account-manager.c b/plugins/account/gsd-account-manager.c +new file mode 100644 +index 00000000..40b91cb6 +--- /dev/null ++++ b/plugins/account/gsd-account-manager.c +@@ -0,0 +1,422 @@ ++/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- ++ * ++ * Copyright (C) 2017 Red Hat, Inc. ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, see . ++ * ++ */ ++ ++#include "config.h" ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++ ++#include ++#include ++#include ++ ++#include ++#include ++#include ++ ++#include "gnome-settings-profile.h" ++#include "gsd-account-manager.h" ++#include "org.freedesktop.Accounts.h" ++#include "org.freedesktop.Accounts.User.h" ++ ++#define GSD_ACCOUNT_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GSD_TYPE_ACCOUNT_MANAGER, GsdAccountManagerPrivate)) ++ ++struct GsdAccountManagerPrivate ++{ ++ GsdAccounts *accounts_proxy; ++ GsdAccountsUser *accounts_user_proxy; ++ GCancellable *cancellable; ++ ++ gint64 expiration_time; ++ gint64 last_change_time; ++ gint64 min_days_between_changes; ++ gint64 max_days_between_changes; ++ gint64 days_to_warn; ++ gint64 days_after_expiration_until_lock; ++ ++ NotifyNotification *notification; ++}; ++ ++static void gsd_account_manager_class_init (GsdAccountManagerClass *klass); ++static void gsd_account_manager_init (GsdAccountManager *account_manager); ++static void gsd_account_manager_finalize (GObject *object); ++ ++G_DEFINE_TYPE (GsdAccountManager, gsd_account_manager, G_TYPE_OBJECT) ++ ++static gpointer manager_object = NULL; ++ ++static void ++on_notification_closed (NotifyNotification *notification, ++ gpointer user_data) ++{ ++ GsdAccountManager *manager = user_data; ++ ++ g_clear_object (&manager->priv->notification); ++} ++ ++static void ++hide_notification (GsdAccountManager *manager) ++{ ++ if (manager->priv->notification == NULL) ++ return; ++ ++ notify_notification_close (manager->priv->notification, NULL); ++ g_clear_object (&manager->priv->notification); ++} ++ ++static void ++show_notification (GsdAccountManager *manager, ++ const char *primary_text, ++ const char *secondary_text) ++{ ++ g_assert (manager->priv->notification == NULL); ++ ++ manager->priv->notification = notify_notification_new (primary_text, ++ secondary_text, ++ "avatar-default-symbolic"); ++ notify_notification_set_app_name (manager->priv->notification, _("User Account")); ++ notify_notification_set_hint (manager->priv->notification, ++ "resident", ++ g_variant_new_boolean (TRUE)); ++ notify_notification_set_timeout (manager->priv->notification, ++ NOTIFY_EXPIRES_NEVER); ++ ++ g_signal_connect (manager->priv->notification, ++ "closed", ++ G_CALLBACK (on_notification_closed), ++ manager); ++ ++ notify_notification_show (manager->priv->notification, NULL); ++} ++ ++static void ++update_password_notification (GsdAccountManager *manager) ++{ ++ gint64 days_since_epoch; ++ gint64 days_until_expiration = -1; ++ gint64 days_since_last_change = -1; ++ gint64 days_left = -1; ++ g_autofree char *primary_text = NULL; ++ g_autofree char *secondary_text = NULL; ++ gboolean password_already_expired = FALSE; ++ ++ hide_notification (manager); ++ ++ days_since_epoch = g_get_real_time () / G_USEC_PER_SEC / 60 / 60 / 24; ++ ++ if (manager->priv->expiration_time > 0) { ++ days_until_expiration = manager->priv->expiration_time - days_since_epoch; ++ ++ if (days_until_expiration <= 0) { ++ password_already_expired = TRUE; ++ goto out; ++ } ++ } ++ ++ if (manager->priv->last_change_time == 0) { ++ password_already_expired = TRUE; ++ goto out; ++ } ++ ++ days_since_last_change = days_since_epoch - manager->priv->last_change_time; ++ ++ if (days_since_last_change < 0) { ++ /* time skew, password was changed in the future! */ ++ goto out; ++ } ++ ++ if (manager->priv->max_days_between_changes > -1) { ++ if (manager->priv->days_after_expiration_until_lock > -1) { ++ if ((days_since_last_change > manager->priv->max_days_between_changes) && ++ (days_since_last_change > manager->priv->days_after_expiration_until_lock)) { ++ password_already_expired = TRUE; ++ goto out; ++ } ++ } ++ ++ if (days_since_last_change > manager->priv->max_days_between_changes) { ++ password_already_expired = TRUE; ++ goto out; ++ } ++ ++ if (manager->priv->days_to_warn > -1) { ++ if (days_since_last_change > manager->priv->max_days_between_changes - manager->priv->days_to_warn) { ++ days_left = manager->priv->last_change_time + manager->priv->max_days_between_changes - days_since_epoch; ++ ++ if (days_until_expiration >= 0) ++ days_left = MIN (days_left, days_until_expiration); ++ goto out; ++ } ++ } ++ } ++ ++out: ++ if (password_already_expired) { ++ primary_text = g_strdup_printf (_("Password Expired")); ++ secondary_text = g_strdup_printf (_("Your password is expired. Please update it.")); ++ } else if (days_left >= 0) { ++ primary_text = g_strdup_printf (_("Password Expiring Soon")); ++ if (days_left == 0) ++ secondary_text = g_strdup_printf (_("Your password is expiring today.")); ++ else if (days_left == 1) ++ secondary_text = g_strdup_printf (_("Your password is expiring in a day.")); ++ else ++ secondary_text = g_strdup_printf (_("Your password is expiring in %ld days."), ++ days_left); ++ } ++ ++ if (primary_text != NULL && secondary_text != NULL) ++ show_notification (manager, ++ primary_text, ++ secondary_text); ++} ++ ++static gboolean ++set_policy_number (gint64 *destination, ++ gint64 source) ++{ ++ if (*destination == source) ++ return FALSE; ++ ++ *destination = source; ++ return TRUE; ++} ++ ++static void ++on_got_password_expiration_policy (GsdAccountsUser *accounts_user_proxy, ++ GAsyncResult *res, ++ gpointer user_data) ++{ ++ GsdAccountManager *manager = user_data; ++ g_autoptr(GError) error = NULL; ++ gboolean succeeded; ++ gint64 expiration_time; ++ gint64 last_change_time; ++ gint64 min_days_between_changes; ++ gint64 max_days_between_changes; ++ gint64 days_to_warn; ++ gint64 days_after_expiration_until_lock; ++ ++ gnome_settings_profile_start (NULL); ++ succeeded = gsd_accounts_user_call_get_password_expiration_policy_finish (accounts_user_proxy, ++ &expiration_time, ++ &last_change_time, ++ &min_days_between_changes, ++ &max_days_between_changes, ++ &days_to_warn, ++ &days_after_expiration_until_lock, ++ res, ++ &error); ++ ++ if (!succeeded) { ++ g_warning ("Failed to get password expiration policy for user: %s", error->message); ++ goto out; ++ } ++ ++ set_policy_number (&manager->priv->expiration_time, expiration_time); ++ set_policy_number (&manager->priv->last_change_time, last_change_time); ++ set_policy_number (&manager->priv->min_days_between_changes, min_days_between_changes); ++ set_policy_number (&manager->priv->max_days_between_changes, max_days_between_changes); ++ set_policy_number (&manager->priv->days_to_warn, days_to_warn); ++ set_policy_number (&manager->priv->days_after_expiration_until_lock, days_after_expiration_until_lock); ++ ++ update_password_notification (manager); ++out: ++ gnome_settings_profile_end (NULL); ++} ++ ++static void ++on_got_accounts_user_proxy (GObject *source_object, ++ GAsyncResult *res, ++ gpointer user_data) ++{ ++ GsdAccountManager *manager = user_data; ++ g_autoptr(GError) error = NULL; ++ ++ gnome_settings_profile_start (NULL); ++ manager->priv->accounts_user_proxy = gsd_accounts_user_proxy_new_finish (res, &error); ++ ++ if (manager->priv->accounts_user_proxy != NULL) { ++ gsd_accounts_user_call_get_password_expiration_policy (manager->priv->accounts_user_proxy, ++ manager->priv->cancellable, ++ (GAsyncReadyCallback) ++ on_got_password_expiration_policy, ++ manager); ++ } else { ++ g_warning ("Failed to get user proxy to accounts service: %s", error->message); ++ goto out; ++ } ++ ++out: ++ gnome_settings_profile_end (NULL); ++} ++ ++static void ++on_got_user_object_path (GsdAccounts *accounts_proxy, ++ GAsyncResult *res, ++ gpointer user_data) ++{ ++ GsdAccountManager *manager = user_data; ++ g_autoptr(GError) error = NULL; ++ gboolean succeeded; ++ gchar *object_path; ++ GDBusConnection *connection; ++ ++ gnome_settings_profile_start (NULL); ++ ++ succeeded = gsd_accounts_call_find_user_by_id_finish (accounts_proxy, ++ &object_path, ++ res, ++ &error); ++ ++ if (!succeeded) { ++ g_warning ("Unable to find current user in accounts service: %s", ++ error->message); ++ goto out; ++ } ++ ++ connection = g_dbus_proxy_get_connection (G_DBUS_PROXY (accounts_proxy)); ++ gsd_accounts_user_proxy_new (connection, ++ G_DBUS_PROXY_FLAGS_NONE, ++ "org.freedesktop.Accounts", ++ object_path, ++ manager->priv->cancellable, ++ (GAsyncReadyCallback) ++ on_got_accounts_user_proxy, ++ manager); ++ ++out: ++ gnome_settings_profile_end (NULL); ++} ++ ++static void ++on_got_accounts_proxy (GObject *source_object, ++ GAsyncResult *res, ++ gpointer user_data) ++{ ++ GsdAccountManager *manager = user_data; ++ g_autoptr(GError) error = NULL; ++ ++ gnome_settings_profile_start (NULL); ++ manager->priv->accounts_proxy = gsd_accounts_proxy_new_for_bus_finish (res, &error); ++ ++ if (manager->priv->accounts_proxy != NULL) { ++ gsd_accounts_call_find_user_by_id (manager->priv->accounts_proxy, ++ getuid (), ++ manager->priv->cancellable, ++ (GAsyncReadyCallback) ++ on_got_user_object_path, ++ manager); ++ } else { ++ g_warning ("Failed to get proxy to accounts service: %s", error->message); ++ } ++ gnome_settings_profile_end (NULL); ++} ++ ++gboolean ++gsd_account_manager_start (GsdAccountManager *manager, ++ GError **error) ++{ ++ g_debug ("Starting accounts manager"); ++ ++ gnome_settings_profile_start (NULL); ++ manager->priv->cancellable = g_cancellable_new (); ++ gsd_accounts_proxy_new_for_bus (G_BUS_TYPE_SYSTEM, ++ G_DBUS_PROXY_FLAGS_NONE, ++ "org.freedesktop.Accounts", ++ "/org/freedesktop/Accounts", ++ manager->priv->cancellable, ++ (GAsyncReadyCallback) ++ on_got_accounts_proxy, ++ manager); ++ gnome_settings_profile_end (NULL); ++ ++ return TRUE; ++} ++ ++void ++gsd_account_manager_stop (GsdAccountManager *manager) ++{ ++ g_debug ("Stopping accounts manager"); ++ ++ if (manager->priv->cancellable != NULL) { ++ g_cancellable_cancel (manager->priv->cancellable); ++ g_clear_object (&manager->priv->cancellable); ++ } ++ ++ g_clear_object (&manager->priv->accounts_proxy); ++ g_clear_object (&manager->priv->accounts_user_proxy); ++ g_clear_object (&manager->priv->notification); ++} ++ ++static void ++gsd_account_manager_class_init (GsdAccountManagerClass *klass) ++{ ++ GObjectClass *object_class = G_OBJECT_CLASS (klass); ++ ++ object_class->finalize = gsd_account_manager_finalize; ++ ++ notify_init ("gnome-settings-daemon"); ++ ++ g_type_class_add_private (klass, sizeof (GsdAccountManagerPrivate)); ++} ++ ++static void ++gsd_account_manager_init (GsdAccountManager *manager) ++{ ++ manager->priv = GSD_ACCOUNT_MANAGER_GET_PRIVATE (manager); ++} ++ ++static void ++gsd_account_manager_finalize (GObject *object) ++{ ++ GsdAccountManager *manager; ++ ++ g_return_if_fail (object != NULL); ++ g_return_if_fail (GSD_IS_ACCOUNT_MANAGER (object)); ++ ++ manager = GSD_ACCOUNT_MANAGER (object); ++ ++ g_return_if_fail (manager->priv != NULL); ++ ++ gsd_account_manager_stop (manager); ++ ++ G_OBJECT_CLASS (gsd_account_manager_parent_class)->finalize (object); ++} ++ ++GsdAccountManager * ++gsd_account_manager_new (void) ++{ ++ if (manager_object != NULL) { ++ g_object_ref (manager_object); ++ } else { ++ manager_object = g_object_new (GSD_TYPE_ACCOUNT_MANAGER, NULL); ++ g_object_add_weak_pointer (manager_object, ++ (gpointer *) &manager_object); ++ } ++ ++ return GSD_ACCOUNT_MANAGER (manager_object); ++} +diff --git a/plugins/account/gsd-account-manager.h b/plugins/account/gsd-account-manager.h +new file mode 100644 +index 00000000..faefcc18 +--- /dev/null ++++ b/plugins/account/gsd-account-manager.h +@@ -0,0 +1,54 @@ ++/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- ++ * ++ * Copyright (C) 2017 Red Hat, Inc. ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, see . ++ * ++ */ ++ ++#ifndef __GSD_ACCOUNT_MANAGER_H ++#define __GSD_ACCOUNT_MANAGER_H ++ ++#include ++ ++G_BEGIN_DECLS ++ ++#define GSD_TYPE_ACCOUNT_MANAGER (gsd_account_manager_get_type ()) ++#define GSD_ACCOUNT_MANAGER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GSD_TYPE_ACCOUNT_MANAGER, GsdAccountManager)) ++#define GSD_ACCOUNT_MANAGER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GSD_TYPE_ACCOUNT_MANAGER, GsdAccountManagerClass)) ++#define GSD_IS_ACCOUNT_MANAGER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GSD_TYPE_ACCOUNT_MANAGER)) ++#define GSD_IS_ACCOUNT_MANAGER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GSD_TYPE_ACCOUNT_MANAGER)) ++#define GSD_ACCOUNT_MANAGER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GSD_TYPE_ACCOUNT_MANAGER, GsdAccountManagerClass)) ++ ++typedef struct GsdAccountManagerPrivate GsdAccountManagerPrivate; ++ ++typedef struct { ++ GObject parent; ++ GsdAccountManagerPrivate *priv; ++} GsdAccountManager; ++ ++typedef struct { ++ GObjectClass parent_class; ++} GsdAccountManagerClass; ++ ++GType gsd_account_manager_get_type (void); ++ ++GsdAccountManager * gsd_account_manager_new (void); ++gboolean gsd_account_manager_start (GsdAccountManager *manager, ++ GError **error); ++void gsd_account_manager_stop (GsdAccountManager *manager); ++ ++G_END_DECLS ++ ++#endif /* __GSD_ACCOUNT_MANAGER_H */ +diff --git a/plugins/account/main.c b/plugins/account/main.c +new file mode 100644 +index 00000000..9b854f65 +--- /dev/null ++++ b/plugins/account/main.c +@@ -0,0 +1,7 @@ ++#define NEW gsd_account_manager_new ++#define START gsd_account_manager_start ++#define STOP gsd_account_manager_stop ++#define MANAGER GsdAccountManager ++#include "gsd-account-manager.h" ++ ++#include "daemon-skeleton.h" +diff --git a/plugins/account/meson.build b/plugins/account/meson.build +new file mode 100644 +index 00000000..c70ac36e +--- /dev/null ++++ b/plugins/account/meson.build +@@ -0,0 +1,39 @@ ++sources = files( ++ 'gsd-account-manager.c', ++ 'main.c' ++) ++ ++sources += gnome.gdbus_codegen( ++ 'org.freedesktop.Accounts', ++ 'org.freedesktop.Accounts.xml', ++ interface_prefix: 'org.freedesktop.', ++ namespace: 'Gsd', ++ object_manager: false, ++ annotations: ['org.freedesktop.Accounts', 'org.gtk.GDBus.C.Name', 'Accounts'] ++) ++ ++sources += gnome.gdbus_codegen( ++ 'org.freedesktop.Accounts.User', ++ 'org.freedesktop.Accounts.User.xml', ++ interface_prefix: 'org.freedesktop.', ++ namespace: 'Gsd', ++ object_manager: false, ++ annotations: ['org.freedesktop.Accounts.User', 'org.gtk.GDBus.C.Name', 'AccountsUser'] ++) ++ ++deps = plugins_deps + [ ++ gio_unix_dep, ++ libnotify_dep, ++ nss_dep ++] ++ ++executable( ++ 'gsd-' + plugin_name, ++ sources, ++ include_directories: [top_inc, common_inc], ++ dependencies: deps, ++ c_args: cflags, ++ install: true, ++ install_rpath: gsd_pkglibdir, ++ install_dir: gsd_libexecdir ++) +diff --git a/plugins/account/org.freedesktop.Accounts.User.c b/plugins/account/org.freedesktop.Accounts.User.c +new file mode 100644 +index 00000000..3b18d185 +--- /dev/null ++++ b/plugins/account/org.freedesktop.Accounts.User.c +@@ -0,0 +1,6176 @@ ++/* ++ * Generated by gdbus-codegen 2.54.1. DO NOT EDIT. ++ * ++ * The license of this code is the same as for the source it was derived from. ++ */ ++ ++#ifdef HAVE_CONFIG_H ++# include "config.h" ++#endif ++ ++#include "org.freedesktop.Accounts.User.h" ++ ++#include ++#ifdef G_OS_UNIX ++# include ++#endif ++ ++typedef struct ++{ ++ GDBusArgInfo parent_struct; ++ gboolean use_gvariant; ++} _ExtendedGDBusArgInfo; ++ ++typedef struct ++{ ++ GDBusMethodInfo parent_struct; ++ const gchar *signal_name; ++ gboolean pass_fdlist; ++} _ExtendedGDBusMethodInfo; ++ ++typedef struct ++{ ++ GDBusSignalInfo parent_struct; ++ const gchar *signal_name; ++} _ExtendedGDBusSignalInfo; ++ ++typedef struct ++{ ++ GDBusPropertyInfo parent_struct; ++ const gchar *hyphen_name; ++ gboolean use_gvariant; ++} _ExtendedGDBusPropertyInfo; ++ ++typedef struct ++{ ++ GDBusInterfaceInfo parent_struct; ++ const gchar *hyphen_name; ++} _ExtendedGDBusInterfaceInfo; ++ ++typedef struct ++{ ++ const _ExtendedGDBusPropertyInfo *info; ++ guint prop_id; ++ GValue orig_value; /* the value before the change */ ++} ChangedProperty; ++ ++static void ++_changed_property_free (ChangedProperty *data) ++{ ++ g_value_unset (&data->orig_value); ++ g_free (data); ++} ++ ++static gboolean ++_g_strv_equal0 (gchar **a, gchar **b) ++{ ++ gboolean ret = FALSE; ++ guint n; ++ if (a == NULL && b == NULL) ++ { ++ ret = TRUE; ++ goto out; ++ } ++ if (a == NULL || b == NULL) ++ goto out; ++ if (g_strv_length (a) != g_strv_length (b)) ++ goto out; ++ for (n = 0; a[n] != NULL; n++) ++ if (g_strcmp0 (a[n], b[n]) != 0) ++ goto out; ++ ret = TRUE; ++out: ++ return ret; ++} ++ ++static gboolean ++_g_variant_equal0 (GVariant *a, GVariant *b) ++{ ++ gboolean ret = FALSE; ++ if (a == NULL && b == NULL) ++ { ++ ret = TRUE; ++ goto out; ++ } ++ if (a == NULL || b == NULL) ++ goto out; ++ ret = g_variant_equal (a, b); ++out: ++ return ret; ++} ++ ++G_GNUC_UNUSED static gboolean ++_g_value_equal (const GValue *a, const GValue *b) ++{ ++ gboolean ret = FALSE; ++ g_assert (G_VALUE_TYPE (a) == G_VALUE_TYPE (b)); ++ switch (G_VALUE_TYPE (a)) ++ { ++ case G_TYPE_BOOLEAN: ++ ret = (g_value_get_boolean (a) == g_value_get_boolean (b)); ++ break; ++ case G_TYPE_UCHAR: ++ ret = (g_value_get_uchar (a) == g_value_get_uchar (b)); ++ break; ++ case G_TYPE_INT: ++ ret = (g_value_get_int (a) == g_value_get_int (b)); ++ break; ++ case G_TYPE_UINT: ++ ret = (g_value_get_uint (a) == g_value_get_uint (b)); ++ break; ++ case G_TYPE_INT64: ++ ret = (g_value_get_int64 (a) == g_value_get_int64 (b)); ++ break; ++ case G_TYPE_UINT64: ++ ret = (g_value_get_uint64 (a) == g_value_get_uint64 (b)); ++ break; ++ case G_TYPE_DOUBLE: ++ { ++ /* Avoid -Wfloat-equal warnings by doing a direct bit compare */ ++ gdouble da = g_value_get_double (a); ++ gdouble db = g_value_get_double (b); ++ ret = memcmp (&da, &db, sizeof (gdouble)) == 0; ++ } ++ break; ++ case G_TYPE_STRING: ++ ret = (g_strcmp0 (g_value_get_string (a), g_value_get_string (b)) == 0); ++ break; ++ case G_TYPE_VARIANT: ++ ret = _g_variant_equal0 (g_value_get_variant (a), g_value_get_variant (b)); ++ break; ++ default: ++ if (G_VALUE_TYPE (a) == G_TYPE_STRV) ++ ret = _g_strv_equal0 (g_value_get_boxed (a), g_value_get_boxed (b)); ++ else ++ g_critical ("_g_value_equal() does not handle type %s", g_type_name (G_VALUE_TYPE (a))); ++ break; ++ } ++ return ret; ++} ++ ++/* ------------------------------------------------------------------------ ++ * Code for interface org.freedesktop.Accounts.User ++ * ------------------------------------------------------------------------ ++ */ ++ ++/** ++ * SECTION:GsdAccountsUser ++ * @title: GsdAccountsUser ++ * @short_description: Generated C code for the org.freedesktop.Accounts.User D-Bus interface ++ * ++ * This section contains code for working with the org.freedesktop.Accounts.User D-Bus interface in C. ++ */ ++ ++/* ---- Introspection data for org.freedesktop.Accounts.User ---- */ ++ ++static const _ExtendedGDBusArgInfo _gsd_accounts_user_method_info_set_user_name_IN_ARG_name = ++{ ++ { ++ -1, ++ (gchar *) "name", ++ (gchar *) "s", ++ NULL ++ }, ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo * const _gsd_accounts_user_method_info_set_user_name_IN_ARG_pointers[] = ++{ ++ &_gsd_accounts_user_method_info_set_user_name_IN_ARG_name, ++ NULL ++}; ++ ++static const GDBusAnnotationInfo _gsd_accounts_user_method_set_user_name_annotation_info_0 = ++{ ++ -1, ++ (gchar *) "org.freedesktop.DBus.GLib.Async", ++ (gchar *) "", ++ NULL ++}; ++ ++static const GDBusAnnotationInfo * const _gsd_accounts_user_method_set_user_name_annotation_info_pointers[] = ++{ ++ &_gsd_accounts_user_method_set_user_name_annotation_info_0, ++ NULL ++}; ++ ++static const _ExtendedGDBusMethodInfo _gsd_accounts_user_method_info_set_user_name = ++{ ++ { ++ -1, ++ (gchar *) "SetUserName", ++ (GDBusArgInfo **) &_gsd_accounts_user_method_info_set_user_name_IN_ARG_pointers, ++ NULL, ++ (GDBusAnnotationInfo **) &_gsd_accounts_user_method_set_user_name_annotation_info_pointers ++ }, ++ "handle-set-user-name", ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo _gsd_accounts_user_method_info_set_real_name_IN_ARG_name = ++{ ++ { ++ -1, ++ (gchar *) "name", ++ (gchar *) "s", ++ NULL ++ }, ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo * const _gsd_accounts_user_method_info_set_real_name_IN_ARG_pointers[] = ++{ ++ &_gsd_accounts_user_method_info_set_real_name_IN_ARG_name, ++ NULL ++}; ++ ++static const GDBusAnnotationInfo _gsd_accounts_user_method_set_real_name_annotation_info_0 = ++{ ++ -1, ++ (gchar *) "org.freedesktop.DBus.GLib.Async", ++ (gchar *) "", ++ NULL ++}; ++ ++static const GDBusAnnotationInfo * const _gsd_accounts_user_method_set_real_name_annotation_info_pointers[] = ++{ ++ &_gsd_accounts_user_method_set_real_name_annotation_info_0, ++ NULL ++}; ++ ++static const _ExtendedGDBusMethodInfo _gsd_accounts_user_method_info_set_real_name = ++{ ++ { ++ -1, ++ (gchar *) "SetRealName", ++ (GDBusArgInfo **) &_gsd_accounts_user_method_info_set_real_name_IN_ARG_pointers, ++ NULL, ++ (GDBusAnnotationInfo **) &_gsd_accounts_user_method_set_real_name_annotation_info_pointers ++ }, ++ "handle-set-real-name", ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo _gsd_accounts_user_method_info_set_email_IN_ARG_email = ++{ ++ { ++ -1, ++ (gchar *) "email", ++ (gchar *) "s", ++ NULL ++ }, ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo * const _gsd_accounts_user_method_info_set_email_IN_ARG_pointers[] = ++{ ++ &_gsd_accounts_user_method_info_set_email_IN_ARG_email, ++ NULL ++}; ++ ++static const GDBusAnnotationInfo _gsd_accounts_user_method_set_email_annotation_info_0 = ++{ ++ -1, ++ (gchar *) "org.freedesktop.DBus.GLib.Async", ++ (gchar *) "", ++ NULL ++}; ++ ++static const GDBusAnnotationInfo * const _gsd_accounts_user_method_set_email_annotation_info_pointers[] = ++{ ++ &_gsd_accounts_user_method_set_email_annotation_info_0, ++ NULL ++}; ++ ++static const _ExtendedGDBusMethodInfo _gsd_accounts_user_method_info_set_email = ++{ ++ { ++ -1, ++ (gchar *) "SetEmail", ++ (GDBusArgInfo **) &_gsd_accounts_user_method_info_set_email_IN_ARG_pointers, ++ NULL, ++ (GDBusAnnotationInfo **) &_gsd_accounts_user_method_set_email_annotation_info_pointers ++ }, ++ "handle-set-email", ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo _gsd_accounts_user_method_info_set_language_IN_ARG_language = ++{ ++ { ++ -1, ++ (gchar *) "language", ++ (gchar *) "s", ++ NULL ++ }, ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo * const _gsd_accounts_user_method_info_set_language_IN_ARG_pointers[] = ++{ ++ &_gsd_accounts_user_method_info_set_language_IN_ARG_language, ++ NULL ++}; ++ ++static const GDBusAnnotationInfo _gsd_accounts_user_method_set_language_annotation_info_0 = ++{ ++ -1, ++ (gchar *) "org.freedesktop.DBus.GLib.Async", ++ (gchar *) "", ++ NULL ++}; ++ ++static const GDBusAnnotationInfo * const _gsd_accounts_user_method_set_language_annotation_info_pointers[] = ++{ ++ &_gsd_accounts_user_method_set_language_annotation_info_0, ++ NULL ++}; ++ ++static const _ExtendedGDBusMethodInfo _gsd_accounts_user_method_info_set_language = ++{ ++ { ++ -1, ++ (gchar *) "SetLanguage", ++ (GDBusArgInfo **) &_gsd_accounts_user_method_info_set_language_IN_ARG_pointers, ++ NULL, ++ (GDBusAnnotationInfo **) &_gsd_accounts_user_method_set_language_annotation_info_pointers ++ }, ++ "handle-set-language", ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo _gsd_accounts_user_method_info_set_xsession_IN_ARG_x_session = ++{ ++ { ++ -1, ++ (gchar *) "x_session", ++ (gchar *) "s", ++ NULL ++ }, ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo * const _gsd_accounts_user_method_info_set_xsession_IN_ARG_pointers[] = ++{ ++ &_gsd_accounts_user_method_info_set_xsession_IN_ARG_x_session, ++ NULL ++}; ++ ++static const GDBusAnnotationInfo _gsd_accounts_user_method_set_xsession_annotation_info_0 = ++{ ++ -1, ++ (gchar *) "org.freedesktop.DBus.GLib.Async", ++ (gchar *) "", ++ NULL ++}; ++ ++static const GDBusAnnotationInfo _gsd_accounts_user_method_set_xsession_annotation_info_1 = ++{ ++ -1, ++ (gchar *) "org.freedesktop.DBus.GLib.CSymbol", ++ (gchar *) "user_set_x_session", ++ NULL ++}; ++ ++static const GDBusAnnotationInfo * const _gsd_accounts_user_method_set_xsession_annotation_info_pointers[] = ++{ ++ &_gsd_accounts_user_method_set_xsession_annotation_info_0, ++ &_gsd_accounts_user_method_set_xsession_annotation_info_1, ++ NULL ++}; ++ ++static const _ExtendedGDBusMethodInfo _gsd_accounts_user_method_info_set_xsession = ++{ ++ { ++ -1, ++ (gchar *) "SetXSession", ++ (GDBusArgInfo **) &_gsd_accounts_user_method_info_set_xsession_IN_ARG_pointers, ++ NULL, ++ (GDBusAnnotationInfo **) &_gsd_accounts_user_method_set_xsession_annotation_info_pointers ++ }, ++ "handle-set-xsession", ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo _gsd_accounts_user_method_info_set_location_IN_ARG_location = ++{ ++ { ++ -1, ++ (gchar *) "location", ++ (gchar *) "s", ++ NULL ++ }, ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo * const _gsd_accounts_user_method_info_set_location_IN_ARG_pointers[] = ++{ ++ &_gsd_accounts_user_method_info_set_location_IN_ARG_location, ++ NULL ++}; ++ ++static const GDBusAnnotationInfo _gsd_accounts_user_method_set_location_annotation_info_0 = ++{ ++ -1, ++ (gchar *) "org.freedesktop.DBus.GLib.Async", ++ (gchar *) "", ++ NULL ++}; ++ ++static const GDBusAnnotationInfo * const _gsd_accounts_user_method_set_location_annotation_info_pointers[] = ++{ ++ &_gsd_accounts_user_method_set_location_annotation_info_0, ++ NULL ++}; ++ ++static const _ExtendedGDBusMethodInfo _gsd_accounts_user_method_info_set_location = ++{ ++ { ++ -1, ++ (gchar *) "SetLocation", ++ (GDBusArgInfo **) &_gsd_accounts_user_method_info_set_location_IN_ARG_pointers, ++ NULL, ++ (GDBusAnnotationInfo **) &_gsd_accounts_user_method_set_location_annotation_info_pointers ++ }, ++ "handle-set-location", ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo _gsd_accounts_user_method_info_set_home_directory_IN_ARG_homedir = ++{ ++ { ++ -1, ++ (gchar *) "homedir", ++ (gchar *) "s", ++ NULL ++ }, ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo * const _gsd_accounts_user_method_info_set_home_directory_IN_ARG_pointers[] = ++{ ++ &_gsd_accounts_user_method_info_set_home_directory_IN_ARG_homedir, ++ NULL ++}; ++ ++static const GDBusAnnotationInfo _gsd_accounts_user_method_set_home_directory_annotation_info_0 = ++{ ++ -1, ++ (gchar *) "org.freedesktop.DBus.GLib.Async", ++ (gchar *) "", ++ NULL ++}; ++ ++static const GDBusAnnotationInfo * const _gsd_accounts_user_method_set_home_directory_annotation_info_pointers[] = ++{ ++ &_gsd_accounts_user_method_set_home_directory_annotation_info_0, ++ NULL ++}; ++ ++static const _ExtendedGDBusMethodInfo _gsd_accounts_user_method_info_set_home_directory = ++{ ++ { ++ -1, ++ (gchar *) "SetHomeDirectory", ++ (GDBusArgInfo **) &_gsd_accounts_user_method_info_set_home_directory_IN_ARG_pointers, ++ NULL, ++ (GDBusAnnotationInfo **) &_gsd_accounts_user_method_set_home_directory_annotation_info_pointers ++ }, ++ "handle-set-home-directory", ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo _gsd_accounts_user_method_info_set_shell_IN_ARG_shell = ++{ ++ { ++ -1, ++ (gchar *) "shell", ++ (gchar *) "s", ++ NULL ++ }, ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo * const _gsd_accounts_user_method_info_set_shell_IN_ARG_pointers[] = ++{ ++ &_gsd_accounts_user_method_info_set_shell_IN_ARG_shell, ++ NULL ++}; ++ ++static const GDBusAnnotationInfo _gsd_accounts_user_method_set_shell_annotation_info_0 = ++{ ++ -1, ++ (gchar *) "org.freedesktop.DBus.GLib.Async", ++ (gchar *) "", ++ NULL ++}; ++ ++static const GDBusAnnotationInfo * const _gsd_accounts_user_method_set_shell_annotation_info_pointers[] = ++{ ++ &_gsd_accounts_user_method_set_shell_annotation_info_0, ++ NULL ++}; ++ ++static const _ExtendedGDBusMethodInfo _gsd_accounts_user_method_info_set_shell = ++{ ++ { ++ -1, ++ (gchar *) "SetShell", ++ (GDBusArgInfo **) &_gsd_accounts_user_method_info_set_shell_IN_ARG_pointers, ++ NULL, ++ (GDBusAnnotationInfo **) &_gsd_accounts_user_method_set_shell_annotation_info_pointers ++ }, ++ "handle-set-shell", ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo _gsd_accounts_user_method_info_set_icon_file_IN_ARG_filename = ++{ ++ { ++ -1, ++ (gchar *) "filename", ++ (gchar *) "s", ++ NULL ++ }, ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo * const _gsd_accounts_user_method_info_set_icon_file_IN_ARG_pointers[] = ++{ ++ &_gsd_accounts_user_method_info_set_icon_file_IN_ARG_filename, ++ NULL ++}; ++ ++static const GDBusAnnotationInfo _gsd_accounts_user_method_set_icon_file_annotation_info_0 = ++{ ++ -1, ++ (gchar *) "org.freedesktop.DBus.GLib.Async", ++ (gchar *) "", ++ NULL ++}; ++ ++static const GDBusAnnotationInfo * const _gsd_accounts_user_method_set_icon_file_annotation_info_pointers[] = ++{ ++ &_gsd_accounts_user_method_set_icon_file_annotation_info_0, ++ NULL ++}; ++ ++static const _ExtendedGDBusMethodInfo _gsd_accounts_user_method_info_set_icon_file = ++{ ++ { ++ -1, ++ (gchar *) "SetIconFile", ++ (GDBusArgInfo **) &_gsd_accounts_user_method_info_set_icon_file_IN_ARG_pointers, ++ NULL, ++ (GDBusAnnotationInfo **) &_gsd_accounts_user_method_set_icon_file_annotation_info_pointers ++ }, ++ "handle-set-icon-file", ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo _gsd_accounts_user_method_info_set_locked_IN_ARG_locked = ++{ ++ { ++ -1, ++ (gchar *) "locked", ++ (gchar *) "b", ++ NULL ++ }, ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo * const _gsd_accounts_user_method_info_set_locked_IN_ARG_pointers[] = ++{ ++ &_gsd_accounts_user_method_info_set_locked_IN_ARG_locked, ++ NULL ++}; ++ ++static const GDBusAnnotationInfo _gsd_accounts_user_method_set_locked_annotation_info_0 = ++{ ++ -1, ++ (gchar *) "org.freedesktop.DBus.GLib.Async", ++ (gchar *) "", ++ NULL ++}; ++ ++static const GDBusAnnotationInfo * const _gsd_accounts_user_method_set_locked_annotation_info_pointers[] = ++{ ++ &_gsd_accounts_user_method_set_locked_annotation_info_0, ++ NULL ++}; ++ ++static const _ExtendedGDBusMethodInfo _gsd_accounts_user_method_info_set_locked = ++{ ++ { ++ -1, ++ (gchar *) "SetLocked", ++ (GDBusArgInfo **) &_gsd_accounts_user_method_info_set_locked_IN_ARG_pointers, ++ NULL, ++ (GDBusAnnotationInfo **) &_gsd_accounts_user_method_set_locked_annotation_info_pointers ++ }, ++ "handle-set-locked", ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo _gsd_accounts_user_method_info_set_account_type_IN_ARG_accountType = ++{ ++ { ++ -1, ++ (gchar *) "accountType", ++ (gchar *) "i", ++ NULL ++ }, ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo * const _gsd_accounts_user_method_info_set_account_type_IN_ARG_pointers[] = ++{ ++ &_gsd_accounts_user_method_info_set_account_type_IN_ARG_accountType, ++ NULL ++}; ++ ++static const GDBusAnnotationInfo _gsd_accounts_user_method_set_account_type_annotation_info_0 = ++{ ++ -1, ++ (gchar *) "org.freedesktop.DBus.GLib.Async", ++ (gchar *) "", ++ NULL ++}; ++ ++static const GDBusAnnotationInfo * const _gsd_accounts_user_method_set_account_type_annotation_info_pointers[] = ++{ ++ &_gsd_accounts_user_method_set_account_type_annotation_info_0, ++ NULL ++}; ++ ++static const _ExtendedGDBusMethodInfo _gsd_accounts_user_method_info_set_account_type = ++{ ++ { ++ -1, ++ (gchar *) "SetAccountType", ++ (GDBusArgInfo **) &_gsd_accounts_user_method_info_set_account_type_IN_ARG_pointers, ++ NULL, ++ (GDBusAnnotationInfo **) &_gsd_accounts_user_method_set_account_type_annotation_info_pointers ++ }, ++ "handle-set-account-type", ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo _gsd_accounts_user_method_info_set_password_mode_IN_ARG_mode = ++{ ++ { ++ -1, ++ (gchar *) "mode", ++ (gchar *) "i", ++ NULL ++ }, ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo * const _gsd_accounts_user_method_info_set_password_mode_IN_ARG_pointers[] = ++{ ++ &_gsd_accounts_user_method_info_set_password_mode_IN_ARG_mode, ++ NULL ++}; ++ ++static const GDBusAnnotationInfo _gsd_accounts_user_method_set_password_mode_annotation_info_0 = ++{ ++ -1, ++ (gchar *) "org.freedesktop.DBus.GLib.Async", ++ (gchar *) "", ++ NULL ++}; ++ ++static const GDBusAnnotationInfo * const _gsd_accounts_user_method_set_password_mode_annotation_info_pointers[] = ++{ ++ &_gsd_accounts_user_method_set_password_mode_annotation_info_0, ++ NULL ++}; ++ ++static const _ExtendedGDBusMethodInfo _gsd_accounts_user_method_info_set_password_mode = ++{ ++ { ++ -1, ++ (gchar *) "SetPasswordMode", ++ (GDBusArgInfo **) &_gsd_accounts_user_method_info_set_password_mode_IN_ARG_pointers, ++ NULL, ++ (GDBusAnnotationInfo **) &_gsd_accounts_user_method_set_password_mode_annotation_info_pointers ++ }, ++ "handle-set-password-mode", ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo _gsd_accounts_user_method_info_set_password_IN_ARG_password = ++{ ++ { ++ -1, ++ (gchar *) "password", ++ (gchar *) "s", ++ NULL ++ }, ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo _gsd_accounts_user_method_info_set_password_IN_ARG_hint = ++{ ++ { ++ -1, ++ (gchar *) "hint", ++ (gchar *) "s", ++ NULL ++ }, ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo * const _gsd_accounts_user_method_info_set_password_IN_ARG_pointers[] = ++{ ++ &_gsd_accounts_user_method_info_set_password_IN_ARG_password, ++ &_gsd_accounts_user_method_info_set_password_IN_ARG_hint, ++ NULL ++}; ++ ++static const GDBusAnnotationInfo _gsd_accounts_user_method_set_password_annotation_info_0 = ++{ ++ -1, ++ (gchar *) "org.freedesktop.DBus.GLib.Async", ++ (gchar *) "", ++ NULL ++}; ++ ++static const GDBusAnnotationInfo * const _gsd_accounts_user_method_set_password_annotation_info_pointers[] = ++{ ++ &_gsd_accounts_user_method_set_password_annotation_info_0, ++ NULL ++}; ++ ++static const _ExtendedGDBusMethodInfo _gsd_accounts_user_method_info_set_password = ++{ ++ { ++ -1, ++ (gchar *) "SetPassword", ++ (GDBusArgInfo **) &_gsd_accounts_user_method_info_set_password_IN_ARG_pointers, ++ NULL, ++ (GDBusAnnotationInfo **) &_gsd_accounts_user_method_set_password_annotation_info_pointers ++ }, ++ "handle-set-password", ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo _gsd_accounts_user_method_info_set_password_hint_IN_ARG_hint = ++{ ++ { ++ -1, ++ (gchar *) "hint", ++ (gchar *) "s", ++ NULL ++ }, ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo * const _gsd_accounts_user_method_info_set_password_hint_IN_ARG_pointers[] = ++{ ++ &_gsd_accounts_user_method_info_set_password_hint_IN_ARG_hint, ++ NULL ++}; ++ ++static const GDBusAnnotationInfo _gsd_accounts_user_method_set_password_hint_annotation_info_0 = ++{ ++ -1, ++ (gchar *) "org.freedesktop.DBus.GLib.Async", ++ (gchar *) "", ++ NULL ++}; ++ ++static const GDBusAnnotationInfo * const _gsd_accounts_user_method_set_password_hint_annotation_info_pointers[] = ++{ ++ &_gsd_accounts_user_method_set_password_hint_annotation_info_0, ++ NULL ++}; ++ ++static const _ExtendedGDBusMethodInfo _gsd_accounts_user_method_info_set_password_hint = ++{ ++ { ++ -1, ++ (gchar *) "SetPasswordHint", ++ (GDBusArgInfo **) &_gsd_accounts_user_method_info_set_password_hint_IN_ARG_pointers, ++ NULL, ++ (GDBusAnnotationInfo **) &_gsd_accounts_user_method_set_password_hint_annotation_info_pointers ++ }, ++ "handle-set-password-hint", ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo _gsd_accounts_user_method_info_set_automatic_login_IN_ARG_enabled = ++{ ++ { ++ -1, ++ (gchar *) "enabled", ++ (gchar *) "b", ++ NULL ++ }, ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo * const _gsd_accounts_user_method_info_set_automatic_login_IN_ARG_pointers[] = ++{ ++ &_gsd_accounts_user_method_info_set_automatic_login_IN_ARG_enabled, ++ NULL ++}; ++ ++static const GDBusAnnotationInfo _gsd_accounts_user_method_set_automatic_login_annotation_info_0 = ++{ ++ -1, ++ (gchar *) "org.freedesktop.DBus.GLib.Async", ++ (gchar *) "", ++ NULL ++}; ++ ++static const GDBusAnnotationInfo * const _gsd_accounts_user_method_set_automatic_login_annotation_info_pointers[] = ++{ ++ &_gsd_accounts_user_method_set_automatic_login_annotation_info_0, ++ NULL ++}; ++ ++static const _ExtendedGDBusMethodInfo _gsd_accounts_user_method_info_set_automatic_login = ++{ ++ { ++ -1, ++ (gchar *) "SetAutomaticLogin", ++ (GDBusArgInfo **) &_gsd_accounts_user_method_info_set_automatic_login_IN_ARG_pointers, ++ NULL, ++ (GDBusAnnotationInfo **) &_gsd_accounts_user_method_set_automatic_login_annotation_info_pointers ++ }, ++ "handle-set-automatic-login", ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo _gsd_accounts_user_method_info_get_password_expiration_policy_OUT_ARG_expiration_time = ++{ ++ { ++ -1, ++ (gchar *) "expiration_time", ++ (gchar *) "x", ++ NULL ++ }, ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo _gsd_accounts_user_method_info_get_password_expiration_policy_OUT_ARG_last_change_time = ++{ ++ { ++ -1, ++ (gchar *) "last_change_time", ++ (gchar *) "x", ++ NULL ++ }, ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo _gsd_accounts_user_method_info_get_password_expiration_policy_OUT_ARG_min_days_between_changes = ++{ ++ { ++ -1, ++ (gchar *) "min_days_between_changes", ++ (gchar *) "x", ++ NULL ++ }, ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo _gsd_accounts_user_method_info_get_password_expiration_policy_OUT_ARG_max_days_between_changes = ++{ ++ { ++ -1, ++ (gchar *) "max_days_between_changes", ++ (gchar *) "x", ++ NULL ++ }, ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo _gsd_accounts_user_method_info_get_password_expiration_policy_OUT_ARG_days_to_warn = ++{ ++ { ++ -1, ++ (gchar *) "days_to_warn", ++ (gchar *) "x", ++ NULL ++ }, ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo _gsd_accounts_user_method_info_get_password_expiration_policy_OUT_ARG_days_after_expiration_until_lock = ++{ ++ { ++ -1, ++ (gchar *) "days_after_expiration_until_lock", ++ (gchar *) "x", ++ NULL ++ }, ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo * const _gsd_accounts_user_method_info_get_password_expiration_policy_OUT_ARG_pointers[] = ++{ ++ &_gsd_accounts_user_method_info_get_password_expiration_policy_OUT_ARG_expiration_time, ++ &_gsd_accounts_user_method_info_get_password_expiration_policy_OUT_ARG_last_change_time, ++ &_gsd_accounts_user_method_info_get_password_expiration_policy_OUT_ARG_min_days_between_changes, ++ &_gsd_accounts_user_method_info_get_password_expiration_policy_OUT_ARG_max_days_between_changes, ++ &_gsd_accounts_user_method_info_get_password_expiration_policy_OUT_ARG_days_to_warn, ++ &_gsd_accounts_user_method_info_get_password_expiration_policy_OUT_ARG_days_after_expiration_until_lock, ++ NULL ++}; ++ ++static const GDBusAnnotationInfo _gsd_accounts_user_method_get_password_expiration_policy_annotation_info_0 = ++{ ++ -1, ++ (gchar *) "org.freedesktop.DBus.GLib.Async", ++ (gchar *) "", ++ NULL ++}; ++ ++static const GDBusAnnotationInfo * const _gsd_accounts_user_method_get_password_expiration_policy_annotation_info_pointers[] = ++{ ++ &_gsd_accounts_user_method_get_password_expiration_policy_annotation_info_0, ++ NULL ++}; ++ ++static const _ExtendedGDBusMethodInfo _gsd_accounts_user_method_info_get_password_expiration_policy = ++{ ++ { ++ -1, ++ (gchar *) "GetPasswordExpirationPolicy", ++ NULL, ++ (GDBusArgInfo **) &_gsd_accounts_user_method_info_get_password_expiration_policy_OUT_ARG_pointers, ++ (GDBusAnnotationInfo **) &_gsd_accounts_user_method_get_password_expiration_policy_annotation_info_pointers ++ }, ++ "handle-get-password-expiration-policy", ++ FALSE ++}; ++ ++static const _ExtendedGDBusMethodInfo * const _gsd_accounts_user_method_info_pointers[] = ++{ ++ &_gsd_accounts_user_method_info_set_user_name, ++ &_gsd_accounts_user_method_info_set_real_name, ++ &_gsd_accounts_user_method_info_set_email, ++ &_gsd_accounts_user_method_info_set_language, ++ &_gsd_accounts_user_method_info_set_xsession, ++ &_gsd_accounts_user_method_info_set_location, ++ &_gsd_accounts_user_method_info_set_home_directory, ++ &_gsd_accounts_user_method_info_set_shell, ++ &_gsd_accounts_user_method_info_set_icon_file, ++ &_gsd_accounts_user_method_info_set_locked, ++ &_gsd_accounts_user_method_info_set_account_type, ++ &_gsd_accounts_user_method_info_set_password_mode, ++ &_gsd_accounts_user_method_info_set_password, ++ &_gsd_accounts_user_method_info_set_password_hint, ++ &_gsd_accounts_user_method_info_set_automatic_login, ++ &_gsd_accounts_user_method_info_get_password_expiration_policy, ++ NULL ++}; ++ ++static const _ExtendedGDBusSignalInfo _gsd_accounts_user_signal_info_changed = ++{ ++ { ++ -1, ++ (gchar *) "Changed", ++ NULL, ++ NULL ++ }, ++ "changed" ++}; ++ ++static const _ExtendedGDBusSignalInfo * const _gsd_accounts_user_signal_info_pointers[] = ++{ ++ &_gsd_accounts_user_signal_info_changed, ++ NULL ++}; ++ ++static const _ExtendedGDBusPropertyInfo _gsd_accounts_user_property_info_uid = ++{ ++ { ++ -1, ++ (gchar *) "Uid", ++ (gchar *) "t", ++ G_DBUS_PROPERTY_INFO_FLAGS_READABLE, ++ NULL ++ }, ++ "uid", ++ FALSE ++}; ++ ++static const _ExtendedGDBusPropertyInfo _gsd_accounts_user_property_info_user_name = ++{ ++ { ++ -1, ++ (gchar *) "UserName", ++ (gchar *) "s", ++ G_DBUS_PROPERTY_INFO_FLAGS_READABLE, ++ NULL ++ }, ++ "user-name", ++ FALSE ++}; ++ ++static const _ExtendedGDBusPropertyInfo _gsd_accounts_user_property_info_real_name = ++{ ++ { ++ -1, ++ (gchar *) "RealName", ++ (gchar *) "s", ++ G_DBUS_PROPERTY_INFO_FLAGS_READABLE, ++ NULL ++ }, ++ "real-name", ++ FALSE ++}; ++ ++static const _ExtendedGDBusPropertyInfo _gsd_accounts_user_property_info_account_type = ++{ ++ { ++ -1, ++ (gchar *) "AccountType", ++ (gchar *) "i", ++ G_DBUS_PROPERTY_INFO_FLAGS_READABLE, ++ NULL ++ }, ++ "account-type", ++ FALSE ++}; ++ ++static const _ExtendedGDBusPropertyInfo _gsd_accounts_user_property_info_home_directory = ++{ ++ { ++ -1, ++ (gchar *) "HomeDirectory", ++ (gchar *) "s", ++ G_DBUS_PROPERTY_INFO_FLAGS_READABLE, ++ NULL ++ }, ++ "home-directory", ++ FALSE ++}; ++ ++static const _ExtendedGDBusPropertyInfo _gsd_accounts_user_property_info_shell = ++{ ++ { ++ -1, ++ (gchar *) "Shell", ++ (gchar *) "s", ++ G_DBUS_PROPERTY_INFO_FLAGS_READABLE, ++ NULL ++ }, ++ "shell", ++ FALSE ++}; ++ ++static const _ExtendedGDBusPropertyInfo _gsd_accounts_user_property_info_email = ++{ ++ { ++ -1, ++ (gchar *) "Email", ++ (gchar *) "s", ++ G_DBUS_PROPERTY_INFO_FLAGS_READABLE, ++ NULL ++ }, ++ "email", ++ FALSE ++}; ++ ++static const _ExtendedGDBusPropertyInfo _gsd_accounts_user_property_info_language = ++{ ++ { ++ -1, ++ (gchar *) "Language", ++ (gchar *) "s", ++ G_DBUS_PROPERTY_INFO_FLAGS_READABLE, ++ NULL ++ }, ++ "language", ++ FALSE ++}; ++ ++static const _ExtendedGDBusPropertyInfo _gsd_accounts_user_property_info_xsession = ++{ ++ { ++ -1, ++ (gchar *) "XSession", ++ (gchar *) "s", ++ G_DBUS_PROPERTY_INFO_FLAGS_READABLE, ++ NULL ++ }, ++ "xsession", ++ FALSE ++}; ++ ++static const _ExtendedGDBusPropertyInfo _gsd_accounts_user_property_info_location = ++{ ++ { ++ -1, ++ (gchar *) "Location", ++ (gchar *) "s", ++ G_DBUS_PROPERTY_INFO_FLAGS_READABLE, ++ NULL ++ }, ++ "location", ++ FALSE ++}; ++ ++static const _ExtendedGDBusPropertyInfo _gsd_accounts_user_property_info_login_frequency = ++{ ++ { ++ -1, ++ (gchar *) "LoginFrequency", ++ (gchar *) "t", ++ G_DBUS_PROPERTY_INFO_FLAGS_READABLE, ++ NULL ++ }, ++ "login-frequency", ++ FALSE ++}; ++ ++static const _ExtendedGDBusPropertyInfo _gsd_accounts_user_property_info_login_time = ++{ ++ { ++ -1, ++ (gchar *) "LoginTime", ++ (gchar *) "x", ++ G_DBUS_PROPERTY_INFO_FLAGS_READABLE, ++ NULL ++ }, ++ "login-time", ++ FALSE ++}; ++ ++static const _ExtendedGDBusPropertyInfo _gsd_accounts_user_property_info_login_history = ++{ ++ { ++ -1, ++ (gchar *) "LoginHistory", ++ (gchar *) "a(xxa{sv})", ++ G_DBUS_PROPERTY_INFO_FLAGS_READABLE, ++ NULL ++ }, ++ "login-history", ++ FALSE ++}; ++ ++static const _ExtendedGDBusPropertyInfo _gsd_accounts_user_property_info_icon_file = ++{ ++ { ++ -1, ++ (gchar *) "IconFile", ++ (gchar *) "s", ++ G_DBUS_PROPERTY_INFO_FLAGS_READABLE, ++ NULL ++ }, ++ "icon-file", ++ FALSE ++}; ++ ++static const _ExtendedGDBusPropertyInfo _gsd_accounts_user_property_info_locked = ++{ ++ { ++ -1, ++ (gchar *) "Locked", ++ (gchar *) "b", ++ G_DBUS_PROPERTY_INFO_FLAGS_READABLE, ++ NULL ++ }, ++ "locked", ++ FALSE ++}; ++ ++static const _ExtendedGDBusPropertyInfo _gsd_accounts_user_property_info_password_mode = ++{ ++ { ++ -1, ++ (gchar *) "PasswordMode", ++ (gchar *) "i", ++ G_DBUS_PROPERTY_INFO_FLAGS_READABLE, ++ NULL ++ }, ++ "password-mode", ++ FALSE ++}; ++ ++static const _ExtendedGDBusPropertyInfo _gsd_accounts_user_property_info_password_hint = ++{ ++ { ++ -1, ++ (gchar *) "PasswordHint", ++ (gchar *) "s", ++ G_DBUS_PROPERTY_INFO_FLAGS_READABLE, ++ NULL ++ }, ++ "password-hint", ++ FALSE ++}; ++ ++static const _ExtendedGDBusPropertyInfo _gsd_accounts_user_property_info_automatic_login = ++{ ++ { ++ -1, ++ (gchar *) "AutomaticLogin", ++ (gchar *) "b", ++ G_DBUS_PROPERTY_INFO_FLAGS_READABLE, ++ NULL ++ }, ++ "automatic-login", ++ FALSE ++}; ++ ++static const _ExtendedGDBusPropertyInfo _gsd_accounts_user_property_info_system_account = ++{ ++ { ++ -1, ++ (gchar *) "SystemAccount", ++ (gchar *) "b", ++ G_DBUS_PROPERTY_INFO_FLAGS_READABLE, ++ NULL ++ }, ++ "system-account", ++ FALSE ++}; ++ ++static const _ExtendedGDBusPropertyInfo _gsd_accounts_user_property_info_local_account = ++{ ++ { ++ -1, ++ (gchar *) "LocalAccount", ++ (gchar *) "b", ++ G_DBUS_PROPERTY_INFO_FLAGS_READABLE, ++ NULL ++ }, ++ "local-account", ++ FALSE ++}; ++ ++static const _ExtendedGDBusPropertyInfo * const _gsd_accounts_user_property_info_pointers[] = ++{ ++ &_gsd_accounts_user_property_info_uid, ++ &_gsd_accounts_user_property_info_user_name, ++ &_gsd_accounts_user_property_info_real_name, ++ &_gsd_accounts_user_property_info_account_type, ++ &_gsd_accounts_user_property_info_home_directory, ++ &_gsd_accounts_user_property_info_shell, ++ &_gsd_accounts_user_property_info_email, ++ &_gsd_accounts_user_property_info_language, ++ &_gsd_accounts_user_property_info_xsession, ++ &_gsd_accounts_user_property_info_location, ++ &_gsd_accounts_user_property_info_login_frequency, ++ &_gsd_accounts_user_property_info_login_time, ++ &_gsd_accounts_user_property_info_login_history, ++ &_gsd_accounts_user_property_info_icon_file, ++ &_gsd_accounts_user_property_info_locked, ++ &_gsd_accounts_user_property_info_password_mode, ++ &_gsd_accounts_user_property_info_password_hint, ++ &_gsd_accounts_user_property_info_automatic_login, ++ &_gsd_accounts_user_property_info_system_account, ++ &_gsd_accounts_user_property_info_local_account, ++ NULL ++}; ++ ++static const _ExtendedGDBusInterfaceInfo _gsd_accounts_user_interface_info = ++{ ++ { ++ -1, ++ (gchar *) "org.freedesktop.Accounts.User", ++ (GDBusMethodInfo **) &_gsd_accounts_user_method_info_pointers, ++ (GDBusSignalInfo **) &_gsd_accounts_user_signal_info_pointers, ++ (GDBusPropertyInfo **) &_gsd_accounts_user_property_info_pointers, ++ NULL ++ }, ++ "accounts-user", ++}; ++ ++ ++/** ++ * gsd_accounts_user_interface_info: ++ * ++ * Gets a machine-readable description of the org.freedesktop.Accounts.User D-Bus interface. ++ * ++ * Returns: (transfer none): A #GDBusInterfaceInfo. Do not free. ++ */ ++GDBusInterfaceInfo * ++gsd_accounts_user_interface_info (void) ++{ ++ return (GDBusInterfaceInfo *) &_gsd_accounts_user_interface_info.parent_struct; ++} ++ ++/** ++ * gsd_accounts_user_override_properties: ++ * @klass: The class structure for a #GObject-derived class. ++ * @property_id_begin: The property id to assign to the first overridden property. ++ * ++ * Overrides all #GObject properties in the #GsdAccountsUser interface for a concrete class. ++ * The properties are overridden in the order they are defined. ++ * ++ * Returns: The last property id. ++ */ ++guint ++gsd_accounts_user_override_properties (GObjectClass *klass, guint property_id_begin) ++{ ++ g_object_class_override_property (klass, property_id_begin++, "uid"); ++ g_object_class_override_property (klass, property_id_begin++, "user-name"); ++ g_object_class_override_property (klass, property_id_begin++, "real-name"); ++ g_object_class_override_property (klass, property_id_begin++, "account-type"); ++ g_object_class_override_property (klass, property_id_begin++, "home-directory"); ++ g_object_class_override_property (klass, property_id_begin++, "shell"); ++ g_object_class_override_property (klass, property_id_begin++, "email"); ++ g_object_class_override_property (klass, property_id_begin++, "language"); ++ g_object_class_override_property (klass, property_id_begin++, "xsession"); ++ g_object_class_override_property (klass, property_id_begin++, "location"); ++ g_object_class_override_property (klass, property_id_begin++, "login-frequency"); ++ g_object_class_override_property (klass, property_id_begin++, "login-time"); ++ g_object_class_override_property (klass, property_id_begin++, "login-history"); ++ g_object_class_override_property (klass, property_id_begin++, "icon-file"); ++ g_object_class_override_property (klass, property_id_begin++, "locked"); ++ g_object_class_override_property (klass, property_id_begin++, "password-mode"); ++ g_object_class_override_property (klass, property_id_begin++, "password-hint"); ++ g_object_class_override_property (klass, property_id_begin++, "automatic-login"); ++ g_object_class_override_property (klass, property_id_begin++, "system-account"); ++ g_object_class_override_property (klass, property_id_begin++, "local-account"); ++ return property_id_begin - 1; ++} ++ ++ ++ ++/** ++ * GsdAccountsUser: ++ * ++ * Abstract interface type for the D-Bus interface org.freedesktop.Accounts.User. ++ */ ++ ++/** ++ * GsdAccountsUserIface: ++ * @parent_iface: The parent interface. ++ * @handle_get_password_expiration_policy: Handler for the #GsdAccountsUser::handle-get-password-expiration-policy signal. ++ * @handle_set_account_type: Handler for the #GsdAccountsUser::handle-set-account-type signal. ++ * @handle_set_automatic_login: Handler for the #GsdAccountsUser::handle-set-automatic-login signal. ++ * @handle_set_email: Handler for the #GsdAccountsUser::handle-set-email signal. ++ * @handle_set_home_directory: Handler for the #GsdAccountsUser::handle-set-home-directory signal. ++ * @handle_set_icon_file: Handler for the #GsdAccountsUser::handle-set-icon-file signal. ++ * @handle_set_language: Handler for the #GsdAccountsUser::handle-set-language signal. ++ * @handle_set_location: Handler for the #GsdAccountsUser::handle-set-location signal. ++ * @handle_set_locked: Handler for the #GsdAccountsUser::handle-set-locked signal. ++ * @handle_set_password: Handler for the #GsdAccountsUser::handle-set-password signal. ++ * @handle_set_password_hint: Handler for the #GsdAccountsUser::handle-set-password-hint signal. ++ * @handle_set_password_mode: Handler for the #GsdAccountsUser::handle-set-password-mode signal. ++ * @handle_set_real_name: Handler for the #GsdAccountsUser::handle-set-real-name signal. ++ * @handle_set_shell: Handler for the #GsdAccountsUser::handle-set-shell signal. ++ * @handle_set_user_name: Handler for the #GsdAccountsUser::handle-set-user-name signal. ++ * @handle_set_xsession: Handler for the #GsdAccountsUser::handle-set-xsession signal. ++ * @get_account_type: Getter for the #GsdAccountsUser:account-type property. ++ * @get_automatic_login: Getter for the #GsdAccountsUser:automatic-login property. ++ * @get_email: Getter for the #GsdAccountsUser:email property. ++ * @get_home_directory: Getter for the #GsdAccountsUser:home-directory property. ++ * @get_icon_file: Getter for the #GsdAccountsUser:icon-file property. ++ * @get_language: Getter for the #GsdAccountsUser:language property. ++ * @get_local_account: Getter for the #GsdAccountsUser:local-account property. ++ * @get_location: Getter for the #GsdAccountsUser:location property. ++ * @get_locked: Getter for the #GsdAccountsUser:locked property. ++ * @get_login_frequency: Getter for the #GsdAccountsUser:login-frequency property. ++ * @get_login_history: Getter for the #GsdAccountsUser:login-history property. ++ * @get_login_time: Getter for the #GsdAccountsUser:login-time property. ++ * @get_password_hint: Getter for the #GsdAccountsUser:password-hint property. ++ * @get_password_mode: Getter for the #GsdAccountsUser:password-mode property. ++ * @get_real_name: Getter for the #GsdAccountsUser:real-name property. ++ * @get_shell: Getter for the #GsdAccountsUser:shell property. ++ * @get_system_account: Getter for the #GsdAccountsUser:system-account property. ++ * @get_uid: Getter for the #GsdAccountsUser:uid property. ++ * @get_user_name: Getter for the #GsdAccountsUser:user-name property. ++ * @get_xsession: Getter for the #GsdAccountsUser:xsession property. ++ * @changed: Handler for the #GsdAccountsUser::changed signal. ++ * ++ * Virtual table for the D-Bus interface org.freedesktop.Accounts.User. ++ */ ++ ++typedef GsdAccountsUserIface GsdAccountsUserInterface; ++G_DEFINE_INTERFACE (GsdAccountsUser, gsd_accounts_user, G_TYPE_OBJECT) ++ ++static void ++gsd_accounts_user_default_init (GsdAccountsUserIface *iface) ++{ ++ /* GObject signals for incoming D-Bus method calls: */ ++ /** ++ * GsdAccountsUser::handle-set-user-name: ++ * @object: A #GsdAccountsUser. ++ * @invocation: A #GDBusMethodInvocation. ++ * @arg_name: Argument passed by remote caller. ++ * ++ * Signal emitted when a remote caller is invoking the SetUserName() D-Bus method. ++ * ++ * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call gsd_accounts_user_complete_set_user_name() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. ++ * ++ * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. ++ */ ++ g_signal_new ("handle-set-user-name", ++ G_TYPE_FROM_INTERFACE (iface), ++ G_SIGNAL_RUN_LAST, ++ G_STRUCT_OFFSET (GsdAccountsUserIface, handle_set_user_name), ++ g_signal_accumulator_true_handled, ++ NULL, ++ g_cclosure_marshal_generic, ++ G_TYPE_BOOLEAN, ++ 2, ++ G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING); ++ ++ /** ++ * GsdAccountsUser::handle-set-real-name: ++ * @object: A #GsdAccountsUser. ++ * @invocation: A #GDBusMethodInvocation. ++ * @arg_name: Argument passed by remote caller. ++ * ++ * Signal emitted when a remote caller is invoking the SetRealName() D-Bus method. ++ * ++ * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call gsd_accounts_user_complete_set_real_name() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. ++ * ++ * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. ++ */ ++ g_signal_new ("handle-set-real-name", ++ G_TYPE_FROM_INTERFACE (iface), ++ G_SIGNAL_RUN_LAST, ++ G_STRUCT_OFFSET (GsdAccountsUserIface, handle_set_real_name), ++ g_signal_accumulator_true_handled, ++ NULL, ++ g_cclosure_marshal_generic, ++ G_TYPE_BOOLEAN, ++ 2, ++ G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING); ++ ++ /** ++ * GsdAccountsUser::handle-set-email: ++ * @object: A #GsdAccountsUser. ++ * @invocation: A #GDBusMethodInvocation. ++ * @arg_email: Argument passed by remote caller. ++ * ++ * Signal emitted when a remote caller is invoking the SetEmail() D-Bus method. ++ * ++ * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call gsd_accounts_user_complete_set_email() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. ++ * ++ * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. ++ */ ++ g_signal_new ("handle-set-email", ++ G_TYPE_FROM_INTERFACE (iface), ++ G_SIGNAL_RUN_LAST, ++ G_STRUCT_OFFSET (GsdAccountsUserIface, handle_set_email), ++ g_signal_accumulator_true_handled, ++ NULL, ++ g_cclosure_marshal_generic, ++ G_TYPE_BOOLEAN, ++ 2, ++ G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING); ++ ++ /** ++ * GsdAccountsUser::handle-set-language: ++ * @object: A #GsdAccountsUser. ++ * @invocation: A #GDBusMethodInvocation. ++ * @arg_language: Argument passed by remote caller. ++ * ++ * Signal emitted when a remote caller is invoking the SetLanguage() D-Bus method. ++ * ++ * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call gsd_accounts_user_complete_set_language() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. ++ * ++ * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. ++ */ ++ g_signal_new ("handle-set-language", ++ G_TYPE_FROM_INTERFACE (iface), ++ G_SIGNAL_RUN_LAST, ++ G_STRUCT_OFFSET (GsdAccountsUserIface, handle_set_language), ++ g_signal_accumulator_true_handled, ++ NULL, ++ g_cclosure_marshal_generic, ++ G_TYPE_BOOLEAN, ++ 2, ++ G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING); ++ ++ /** ++ * GsdAccountsUser::handle-set-xsession: ++ * @object: A #GsdAccountsUser. ++ * @invocation: A #GDBusMethodInvocation. ++ * @arg_x_session: Argument passed by remote caller. ++ * ++ * Signal emitted when a remote caller is invoking the SetXSession() D-Bus method. ++ * ++ * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call gsd_accounts_user_complete_set_xsession() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. ++ * ++ * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. ++ */ ++ g_signal_new ("handle-set-xsession", ++ G_TYPE_FROM_INTERFACE (iface), ++ G_SIGNAL_RUN_LAST, ++ G_STRUCT_OFFSET (GsdAccountsUserIface, handle_set_xsession), ++ g_signal_accumulator_true_handled, ++ NULL, ++ g_cclosure_marshal_generic, ++ G_TYPE_BOOLEAN, ++ 2, ++ G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING); ++ ++ /** ++ * GsdAccountsUser::handle-set-location: ++ * @object: A #GsdAccountsUser. ++ * @invocation: A #GDBusMethodInvocation. ++ * @arg_location: Argument passed by remote caller. ++ * ++ * Signal emitted when a remote caller is invoking the SetLocation() D-Bus method. ++ * ++ * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call gsd_accounts_user_complete_set_location() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. ++ * ++ * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. ++ */ ++ g_signal_new ("handle-set-location", ++ G_TYPE_FROM_INTERFACE (iface), ++ G_SIGNAL_RUN_LAST, ++ G_STRUCT_OFFSET (GsdAccountsUserIface, handle_set_location), ++ g_signal_accumulator_true_handled, ++ NULL, ++ g_cclosure_marshal_generic, ++ G_TYPE_BOOLEAN, ++ 2, ++ G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING); ++ ++ /** ++ * GsdAccountsUser::handle-set-home-directory: ++ * @object: A #GsdAccountsUser. ++ * @invocation: A #GDBusMethodInvocation. ++ * @arg_homedir: Argument passed by remote caller. ++ * ++ * Signal emitted when a remote caller is invoking the SetHomeDirectory() D-Bus method. ++ * ++ * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call gsd_accounts_user_complete_set_home_directory() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. ++ * ++ * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. ++ */ ++ g_signal_new ("handle-set-home-directory", ++ G_TYPE_FROM_INTERFACE (iface), ++ G_SIGNAL_RUN_LAST, ++ G_STRUCT_OFFSET (GsdAccountsUserIface, handle_set_home_directory), ++ g_signal_accumulator_true_handled, ++ NULL, ++ g_cclosure_marshal_generic, ++ G_TYPE_BOOLEAN, ++ 2, ++ G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING); ++ ++ /** ++ * GsdAccountsUser::handle-set-shell: ++ * @object: A #GsdAccountsUser. ++ * @invocation: A #GDBusMethodInvocation. ++ * @arg_shell: Argument passed by remote caller. ++ * ++ * Signal emitted when a remote caller is invoking the SetShell() D-Bus method. ++ * ++ * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call gsd_accounts_user_complete_set_shell() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. ++ * ++ * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. ++ */ ++ g_signal_new ("handle-set-shell", ++ G_TYPE_FROM_INTERFACE (iface), ++ G_SIGNAL_RUN_LAST, ++ G_STRUCT_OFFSET (GsdAccountsUserIface, handle_set_shell), ++ g_signal_accumulator_true_handled, ++ NULL, ++ g_cclosure_marshal_generic, ++ G_TYPE_BOOLEAN, ++ 2, ++ G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING); ++ ++ /** ++ * GsdAccountsUser::handle-set-icon-file: ++ * @object: A #GsdAccountsUser. ++ * @invocation: A #GDBusMethodInvocation. ++ * @arg_filename: Argument passed by remote caller. ++ * ++ * Signal emitted when a remote caller is invoking the SetIconFile() D-Bus method. ++ * ++ * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call gsd_accounts_user_complete_set_icon_file() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. ++ * ++ * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. ++ */ ++ g_signal_new ("handle-set-icon-file", ++ G_TYPE_FROM_INTERFACE (iface), ++ G_SIGNAL_RUN_LAST, ++ G_STRUCT_OFFSET (GsdAccountsUserIface, handle_set_icon_file), ++ g_signal_accumulator_true_handled, ++ NULL, ++ g_cclosure_marshal_generic, ++ G_TYPE_BOOLEAN, ++ 2, ++ G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING); ++ ++ /** ++ * GsdAccountsUser::handle-set-locked: ++ * @object: A #GsdAccountsUser. ++ * @invocation: A #GDBusMethodInvocation. ++ * @arg_locked: Argument passed by remote caller. ++ * ++ * Signal emitted when a remote caller is invoking the SetLocked() D-Bus method. ++ * ++ * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call gsd_accounts_user_complete_set_locked() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. ++ * ++ * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. ++ */ ++ g_signal_new ("handle-set-locked", ++ G_TYPE_FROM_INTERFACE (iface), ++ G_SIGNAL_RUN_LAST, ++ G_STRUCT_OFFSET (GsdAccountsUserIface, handle_set_locked), ++ g_signal_accumulator_true_handled, ++ NULL, ++ g_cclosure_marshal_generic, ++ G_TYPE_BOOLEAN, ++ 2, ++ G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_BOOLEAN); ++ ++ /** ++ * GsdAccountsUser::handle-set-account-type: ++ * @object: A #GsdAccountsUser. ++ * @invocation: A #GDBusMethodInvocation. ++ * @arg_accountType: Argument passed by remote caller. ++ * ++ * Signal emitted when a remote caller is invoking the SetAccountType() D-Bus method. ++ * ++ * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call gsd_accounts_user_complete_set_account_type() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. ++ * ++ * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. ++ */ ++ g_signal_new ("handle-set-account-type", ++ G_TYPE_FROM_INTERFACE (iface), ++ G_SIGNAL_RUN_LAST, ++ G_STRUCT_OFFSET (GsdAccountsUserIface, handle_set_account_type), ++ g_signal_accumulator_true_handled, ++ NULL, ++ g_cclosure_marshal_generic, ++ G_TYPE_BOOLEAN, ++ 2, ++ G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_INT); ++ ++ /** ++ * GsdAccountsUser::handle-set-password-mode: ++ * @object: A #GsdAccountsUser. ++ * @invocation: A #GDBusMethodInvocation. ++ * @arg_mode: Argument passed by remote caller. ++ * ++ * Signal emitted when a remote caller is invoking the SetPasswordMode() D-Bus method. ++ * ++ * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call gsd_accounts_user_complete_set_password_mode() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. ++ * ++ * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. ++ */ ++ g_signal_new ("handle-set-password-mode", ++ G_TYPE_FROM_INTERFACE (iface), ++ G_SIGNAL_RUN_LAST, ++ G_STRUCT_OFFSET (GsdAccountsUserIface, handle_set_password_mode), ++ g_signal_accumulator_true_handled, ++ NULL, ++ g_cclosure_marshal_generic, ++ G_TYPE_BOOLEAN, ++ 2, ++ G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_INT); ++ ++ /** ++ * GsdAccountsUser::handle-set-password: ++ * @object: A #GsdAccountsUser. ++ * @invocation: A #GDBusMethodInvocation. ++ * @arg_password: Argument passed by remote caller. ++ * @arg_hint: Argument passed by remote caller. ++ * ++ * Signal emitted when a remote caller is invoking the SetPassword() D-Bus method. ++ * ++ * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call gsd_accounts_user_complete_set_password() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. ++ * ++ * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. ++ */ ++ g_signal_new ("handle-set-password", ++ G_TYPE_FROM_INTERFACE (iface), ++ G_SIGNAL_RUN_LAST, ++ G_STRUCT_OFFSET (GsdAccountsUserIface, handle_set_password), ++ g_signal_accumulator_true_handled, ++ NULL, ++ g_cclosure_marshal_generic, ++ G_TYPE_BOOLEAN, ++ 3, ++ G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING, G_TYPE_STRING); ++ ++ /** ++ * GsdAccountsUser::handle-set-password-hint: ++ * @object: A #GsdAccountsUser. ++ * @invocation: A #GDBusMethodInvocation. ++ * @arg_hint: Argument passed by remote caller. ++ * ++ * Signal emitted when a remote caller is invoking the SetPasswordHint() D-Bus method. ++ * ++ * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call gsd_accounts_user_complete_set_password_hint() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. ++ * ++ * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. ++ */ ++ g_signal_new ("handle-set-password-hint", ++ G_TYPE_FROM_INTERFACE (iface), ++ G_SIGNAL_RUN_LAST, ++ G_STRUCT_OFFSET (GsdAccountsUserIface, handle_set_password_hint), ++ g_signal_accumulator_true_handled, ++ NULL, ++ g_cclosure_marshal_generic, ++ G_TYPE_BOOLEAN, ++ 2, ++ G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING); ++ ++ /** ++ * GsdAccountsUser::handle-set-automatic-login: ++ * @object: A #GsdAccountsUser. ++ * @invocation: A #GDBusMethodInvocation. ++ * @arg_enabled: Argument passed by remote caller. ++ * ++ * Signal emitted when a remote caller is invoking the SetAutomaticLogin() D-Bus method. ++ * ++ * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call gsd_accounts_user_complete_set_automatic_login() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. ++ * ++ * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. ++ */ ++ g_signal_new ("handle-set-automatic-login", ++ G_TYPE_FROM_INTERFACE (iface), ++ G_SIGNAL_RUN_LAST, ++ G_STRUCT_OFFSET (GsdAccountsUserIface, handle_set_automatic_login), ++ g_signal_accumulator_true_handled, ++ NULL, ++ g_cclosure_marshal_generic, ++ G_TYPE_BOOLEAN, ++ 2, ++ G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_BOOLEAN); ++ ++ /** ++ * GsdAccountsUser::handle-get-password-expiration-policy: ++ * @object: A #GsdAccountsUser. ++ * @invocation: A #GDBusMethodInvocation. ++ * ++ * Signal emitted when a remote caller is invoking the GetPasswordExpirationPolicy() D-Bus method. ++ * ++ * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call gsd_accounts_user_complete_get_password_expiration_policy() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. ++ * ++ * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. ++ */ ++ g_signal_new ("handle-get-password-expiration-policy", ++ G_TYPE_FROM_INTERFACE (iface), ++ G_SIGNAL_RUN_LAST, ++ G_STRUCT_OFFSET (GsdAccountsUserIface, handle_get_password_expiration_policy), ++ g_signal_accumulator_true_handled, ++ NULL, ++ g_cclosure_marshal_generic, ++ G_TYPE_BOOLEAN, ++ 1, ++ G_TYPE_DBUS_METHOD_INVOCATION); ++ ++ /* GObject signals for received D-Bus signals: */ ++ /** ++ * GsdAccountsUser::changed: ++ * @object: A #GsdAccountsUser. ++ * ++ * On the client-side, this signal is emitted whenever the D-Bus signal "Changed" is received. ++ * ++ * On the service-side, this signal can be used with e.g. g_signal_emit_by_name() to make the object emit the D-Bus signal. ++ */ ++ g_signal_new ("changed", ++ G_TYPE_FROM_INTERFACE (iface), ++ G_SIGNAL_RUN_LAST, ++ G_STRUCT_OFFSET (GsdAccountsUserIface, changed), ++ NULL, ++ NULL, ++ g_cclosure_marshal_generic, ++ G_TYPE_NONE, ++ 0); ++ ++ /* GObject properties for D-Bus properties: */ ++ /** ++ * GsdAccountsUser:uid: ++ * ++ * Represents the D-Bus property "Uid". ++ * ++ * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side. ++ */ ++ g_object_interface_install_property (iface, ++ g_param_spec_uint64 ("uid", "Uid", "Uid", 0, G_MAXUINT64, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); ++ /** ++ * GsdAccountsUser:user-name: ++ * ++ * Represents the D-Bus property "UserName". ++ * ++ * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side. ++ */ ++ g_object_interface_install_property (iface, ++ g_param_spec_string ("user-name", "UserName", "UserName", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); ++ /** ++ * GsdAccountsUser:real-name: ++ * ++ * Represents the D-Bus property "RealName". ++ * ++ * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side. ++ */ ++ g_object_interface_install_property (iface, ++ g_param_spec_string ("real-name", "RealName", "RealName", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); ++ /** ++ * GsdAccountsUser:account-type: ++ * ++ * Represents the D-Bus property "AccountType". ++ * ++ * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side. ++ */ ++ g_object_interface_install_property (iface, ++ g_param_spec_int ("account-type", "AccountType", "AccountType", G_MININT32, G_MAXINT32, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); ++ /** ++ * GsdAccountsUser:home-directory: ++ * ++ * Represents the D-Bus property "HomeDirectory". ++ * ++ * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side. ++ */ ++ g_object_interface_install_property (iface, ++ g_param_spec_string ("home-directory", "HomeDirectory", "HomeDirectory", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); ++ /** ++ * GsdAccountsUser:shell: ++ * ++ * Represents the D-Bus property "Shell". ++ * ++ * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side. ++ */ ++ g_object_interface_install_property (iface, ++ g_param_spec_string ("shell", "Shell", "Shell", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); ++ /** ++ * GsdAccountsUser:email: ++ * ++ * Represents the D-Bus property "Email". ++ * ++ * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side. ++ */ ++ g_object_interface_install_property (iface, ++ g_param_spec_string ("email", "Email", "Email", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); ++ /** ++ * GsdAccountsUser:language: ++ * ++ * Represents the D-Bus property "Language". ++ * ++ * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side. ++ */ ++ g_object_interface_install_property (iface, ++ g_param_spec_string ("language", "Language", "Language", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); ++ /** ++ * GsdAccountsUser:xsession: ++ * ++ * Represents the D-Bus property "XSession". ++ * ++ * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side. ++ */ ++ g_object_interface_install_property (iface, ++ g_param_spec_string ("xsession", "XSession", "XSession", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); ++ /** ++ * GsdAccountsUser:location: ++ * ++ * Represents the D-Bus property "Location". ++ * ++ * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side. ++ */ ++ g_object_interface_install_property (iface, ++ g_param_spec_string ("location", "Location", "Location", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); ++ /** ++ * GsdAccountsUser:login-frequency: ++ * ++ * Represents the D-Bus property "LoginFrequency". ++ * ++ * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side. ++ */ ++ g_object_interface_install_property (iface, ++ g_param_spec_uint64 ("login-frequency", "LoginFrequency", "LoginFrequency", 0, G_MAXUINT64, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); ++ /** ++ * GsdAccountsUser:login-time: ++ * ++ * Represents the D-Bus property "LoginTime". ++ * ++ * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side. ++ */ ++ g_object_interface_install_property (iface, ++ g_param_spec_int64 ("login-time", "LoginTime", "LoginTime", G_MININT64, G_MAXINT64, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); ++ /** ++ * GsdAccountsUser:login-history: ++ * ++ * Represents the D-Bus property "LoginHistory". ++ * ++ * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side. ++ */ ++ g_object_interface_install_property (iface, ++ g_param_spec_variant ("login-history", "LoginHistory", "LoginHistory", G_VARIANT_TYPE ("a(xxa{sv})"), NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); ++ /** ++ * GsdAccountsUser:icon-file: ++ * ++ * Represents the D-Bus property "IconFile". ++ * ++ * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side. ++ */ ++ g_object_interface_install_property (iface, ++ g_param_spec_string ("icon-file", "IconFile", "IconFile", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); ++ /** ++ * GsdAccountsUser:locked: ++ * ++ * Represents the D-Bus property "Locked". ++ * ++ * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side. ++ */ ++ g_object_interface_install_property (iface, ++ g_param_spec_boolean ("locked", "Locked", "Locked", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); ++ /** ++ * GsdAccountsUser:password-mode: ++ * ++ * Represents the D-Bus property "PasswordMode". ++ * ++ * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side. ++ */ ++ g_object_interface_install_property (iface, ++ g_param_spec_int ("password-mode", "PasswordMode", "PasswordMode", G_MININT32, G_MAXINT32, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); ++ /** ++ * GsdAccountsUser:password-hint: ++ * ++ * Represents the D-Bus property "PasswordHint". ++ * ++ * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side. ++ */ ++ g_object_interface_install_property (iface, ++ g_param_spec_string ("password-hint", "PasswordHint", "PasswordHint", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); ++ /** ++ * GsdAccountsUser:automatic-login: ++ * ++ * Represents the D-Bus property "AutomaticLogin". ++ * ++ * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side. ++ */ ++ g_object_interface_install_property (iface, ++ g_param_spec_boolean ("automatic-login", "AutomaticLogin", "AutomaticLogin", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); ++ /** ++ * GsdAccountsUser:system-account: ++ * ++ * Represents the D-Bus property "SystemAccount". ++ * ++ * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side. ++ */ ++ g_object_interface_install_property (iface, ++ g_param_spec_boolean ("system-account", "SystemAccount", "SystemAccount", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); ++ /** ++ * GsdAccountsUser:local-account: ++ * ++ * Represents the D-Bus property "LocalAccount". ++ * ++ * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side. ++ */ ++ g_object_interface_install_property (iface, ++ g_param_spec_boolean ("local-account", "LocalAccount", "LocalAccount", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); ++} ++ ++/** ++ * gsd_accounts_user_get_uid: (skip) ++ * @object: A #GsdAccountsUser. ++ * ++ * Gets the value of the "Uid" D-Bus property. ++ * ++ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side. ++ * ++ * Returns: The property value. ++ */ ++guint64 ++gsd_accounts_user_get_uid (GsdAccountsUser *object) ++{ ++ return GSD_ACCOUNTS_USER_GET_IFACE (object)->get_uid (object); ++} ++ ++/** ++ * gsd_accounts_user_set_uid: (skip) ++ * @object: A #GsdAccountsUser. ++ * @value: The value to set. ++ * ++ * Sets the "Uid" D-Bus property to @value. ++ * ++ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side. ++ */ ++void ++gsd_accounts_user_set_uid (GsdAccountsUser *object, guint64 value) ++{ ++ g_object_set (G_OBJECT (object), "uid", value, NULL); ++} ++ ++/** ++ * gsd_accounts_user_get_user_name: (skip) ++ * @object: A #GsdAccountsUser. ++ * ++ * Gets the value of the "UserName" D-Bus property. ++ * ++ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side. ++ * ++ * The returned value is only valid until the property changes so on the client-side it is only safe to use this function on the thread where @object was constructed. Use gsd_accounts_user_dup_user_name() if on another thread. ++ * ++ * Returns: (transfer none): The property value or %NULL if the property is not set. Do not free the returned value, it belongs to @object. ++ */ ++const gchar * ++gsd_accounts_user_get_user_name (GsdAccountsUser *object) ++{ ++ return GSD_ACCOUNTS_USER_GET_IFACE (object)->get_user_name (object); ++} ++ ++/** ++ * gsd_accounts_user_dup_user_name: (skip) ++ * @object: A #GsdAccountsUser. ++ * ++ * Gets a copy of the "UserName" D-Bus property. ++ * ++ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side. ++ * ++ * Returns: (transfer full): The property value or %NULL if the property is not set. The returned value should be freed with g_free(). ++ */ ++gchar * ++gsd_accounts_user_dup_user_name (GsdAccountsUser *object) ++{ ++ gchar *value; ++ g_object_get (G_OBJECT (object), "user-name", &value, NULL); ++ return value; ++} ++ ++/** ++ * gsd_accounts_user_set_user_name: (skip) ++ * @object: A #GsdAccountsUser. ++ * @value: The value to set. ++ * ++ * Sets the "UserName" D-Bus property to @value. ++ * ++ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side. ++ */ ++void ++gsd_accounts_user_set_user_name (GsdAccountsUser *object, const gchar *value) ++{ ++ g_object_set (G_OBJECT (object), "user-name", value, NULL); ++} ++ ++/** ++ * gsd_accounts_user_get_real_name: (skip) ++ * @object: A #GsdAccountsUser. ++ * ++ * Gets the value of the "RealName" D-Bus property. ++ * ++ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side. ++ * ++ * The returned value is only valid until the property changes so on the client-side it is only safe to use this function on the thread where @object was constructed. Use gsd_accounts_user_dup_real_name() if on another thread. ++ * ++ * Returns: (transfer none): The property value or %NULL if the property is not set. Do not free the returned value, it belongs to @object. ++ */ ++const gchar * ++gsd_accounts_user_get_real_name (GsdAccountsUser *object) ++{ ++ return GSD_ACCOUNTS_USER_GET_IFACE (object)->get_real_name (object); ++} ++ ++/** ++ * gsd_accounts_user_dup_real_name: (skip) ++ * @object: A #GsdAccountsUser. ++ * ++ * Gets a copy of the "RealName" D-Bus property. ++ * ++ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side. ++ * ++ * Returns: (transfer full): The property value or %NULL if the property is not set. The returned value should be freed with g_free(). ++ */ ++gchar * ++gsd_accounts_user_dup_real_name (GsdAccountsUser *object) ++{ ++ gchar *value; ++ g_object_get (G_OBJECT (object), "real-name", &value, NULL); ++ return value; ++} ++ ++/** ++ * gsd_accounts_user_set_real_name: (skip) ++ * @object: A #GsdAccountsUser. ++ * @value: The value to set. ++ * ++ * Sets the "RealName" D-Bus property to @value. ++ * ++ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side. ++ */ ++void ++gsd_accounts_user_set_real_name (GsdAccountsUser *object, const gchar *value) ++{ ++ g_object_set (G_OBJECT (object), "real-name", value, NULL); ++} ++ ++/** ++ * gsd_accounts_user_get_account_type: (skip) ++ * @object: A #GsdAccountsUser. ++ * ++ * Gets the value of the "AccountType" D-Bus property. ++ * ++ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side. ++ * ++ * Returns: The property value. ++ */ ++gint ++gsd_accounts_user_get_account_type (GsdAccountsUser *object) ++{ ++ return GSD_ACCOUNTS_USER_GET_IFACE (object)->get_account_type (object); ++} ++ ++/** ++ * gsd_accounts_user_set_account_type: (skip) ++ * @object: A #GsdAccountsUser. ++ * @value: The value to set. ++ * ++ * Sets the "AccountType" D-Bus property to @value. ++ * ++ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side. ++ */ ++void ++gsd_accounts_user_set_account_type (GsdAccountsUser *object, gint value) ++{ ++ g_object_set (G_OBJECT (object), "account-type", value, NULL); ++} ++ ++/** ++ * gsd_accounts_user_get_home_directory: (skip) ++ * @object: A #GsdAccountsUser. ++ * ++ * Gets the value of the "HomeDirectory" D-Bus property. ++ * ++ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side. ++ * ++ * The returned value is only valid until the property changes so on the client-side it is only safe to use this function on the thread where @object was constructed. Use gsd_accounts_user_dup_home_directory() if on another thread. ++ * ++ * Returns: (transfer none): The property value or %NULL if the property is not set. Do not free the returned value, it belongs to @object. ++ */ ++const gchar * ++gsd_accounts_user_get_home_directory (GsdAccountsUser *object) ++{ ++ return GSD_ACCOUNTS_USER_GET_IFACE (object)->get_home_directory (object); ++} ++ ++/** ++ * gsd_accounts_user_dup_home_directory: (skip) ++ * @object: A #GsdAccountsUser. ++ * ++ * Gets a copy of the "HomeDirectory" D-Bus property. ++ * ++ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side. ++ * ++ * Returns: (transfer full): The property value or %NULL if the property is not set. The returned value should be freed with g_free(). ++ */ ++gchar * ++gsd_accounts_user_dup_home_directory (GsdAccountsUser *object) ++{ ++ gchar *value; ++ g_object_get (G_OBJECT (object), "home-directory", &value, NULL); ++ return value; ++} ++ ++/** ++ * gsd_accounts_user_set_home_directory: (skip) ++ * @object: A #GsdAccountsUser. ++ * @value: The value to set. ++ * ++ * Sets the "HomeDirectory" D-Bus property to @value. ++ * ++ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side. ++ */ ++void ++gsd_accounts_user_set_home_directory (GsdAccountsUser *object, const gchar *value) ++{ ++ g_object_set (G_OBJECT (object), "home-directory", value, NULL); ++} ++ ++/** ++ * gsd_accounts_user_get_shell: (skip) ++ * @object: A #GsdAccountsUser. ++ * ++ * Gets the value of the "Shell" D-Bus property. ++ * ++ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side. ++ * ++ * The returned value is only valid until the property changes so on the client-side it is only safe to use this function on the thread where @object was constructed. Use gsd_accounts_user_dup_shell() if on another thread. ++ * ++ * Returns: (transfer none): The property value or %NULL if the property is not set. Do not free the returned value, it belongs to @object. ++ */ ++const gchar * ++gsd_accounts_user_get_shell (GsdAccountsUser *object) ++{ ++ return GSD_ACCOUNTS_USER_GET_IFACE (object)->get_shell (object); ++} ++ ++/** ++ * gsd_accounts_user_dup_shell: (skip) ++ * @object: A #GsdAccountsUser. ++ * ++ * Gets a copy of the "Shell" D-Bus property. ++ * ++ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side. ++ * ++ * Returns: (transfer full): The property value or %NULL if the property is not set. The returned value should be freed with g_free(). ++ */ ++gchar * ++gsd_accounts_user_dup_shell (GsdAccountsUser *object) ++{ ++ gchar *value; ++ g_object_get (G_OBJECT (object), "shell", &value, NULL); ++ return value; ++} ++ ++/** ++ * gsd_accounts_user_set_shell: (skip) ++ * @object: A #GsdAccountsUser. ++ * @value: The value to set. ++ * ++ * Sets the "Shell" D-Bus property to @value. ++ * ++ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side. ++ */ ++void ++gsd_accounts_user_set_shell (GsdAccountsUser *object, const gchar *value) ++{ ++ g_object_set (G_OBJECT (object), "shell", value, NULL); ++} ++ ++/** ++ * gsd_accounts_user_get_email: (skip) ++ * @object: A #GsdAccountsUser. ++ * ++ * Gets the value of the "Email" D-Bus property. ++ * ++ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side. ++ * ++ * The returned value is only valid until the property changes so on the client-side it is only safe to use this function on the thread where @object was constructed. Use gsd_accounts_user_dup_email() if on another thread. ++ * ++ * Returns: (transfer none): The property value or %NULL if the property is not set. Do not free the returned value, it belongs to @object. ++ */ ++const gchar * ++gsd_accounts_user_get_email (GsdAccountsUser *object) ++{ ++ return GSD_ACCOUNTS_USER_GET_IFACE (object)->get_email (object); ++} ++ ++/** ++ * gsd_accounts_user_dup_email: (skip) ++ * @object: A #GsdAccountsUser. ++ * ++ * Gets a copy of the "Email" D-Bus property. ++ * ++ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side. ++ * ++ * Returns: (transfer full): The property value or %NULL if the property is not set. The returned value should be freed with g_free(). ++ */ ++gchar * ++gsd_accounts_user_dup_email (GsdAccountsUser *object) ++{ ++ gchar *value; ++ g_object_get (G_OBJECT (object), "email", &value, NULL); ++ return value; ++} ++ ++/** ++ * gsd_accounts_user_set_email: (skip) ++ * @object: A #GsdAccountsUser. ++ * @value: The value to set. ++ * ++ * Sets the "Email" D-Bus property to @value. ++ * ++ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side. ++ */ ++void ++gsd_accounts_user_set_email (GsdAccountsUser *object, const gchar *value) ++{ ++ g_object_set (G_OBJECT (object), "email", value, NULL); ++} ++ ++/** ++ * gsd_accounts_user_get_language: (skip) ++ * @object: A #GsdAccountsUser. ++ * ++ * Gets the value of the "Language" D-Bus property. ++ * ++ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side. ++ * ++ * The returned value is only valid until the property changes so on the client-side it is only safe to use this function on the thread where @object was constructed. Use gsd_accounts_user_dup_language() if on another thread. ++ * ++ * Returns: (transfer none): The property value or %NULL if the property is not set. Do not free the returned value, it belongs to @object. ++ */ ++const gchar * ++gsd_accounts_user_get_language (GsdAccountsUser *object) ++{ ++ return GSD_ACCOUNTS_USER_GET_IFACE (object)->get_language (object); ++} ++ ++/** ++ * gsd_accounts_user_dup_language: (skip) ++ * @object: A #GsdAccountsUser. ++ * ++ * Gets a copy of the "Language" D-Bus property. ++ * ++ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side. ++ * ++ * Returns: (transfer full): The property value or %NULL if the property is not set. The returned value should be freed with g_free(). ++ */ ++gchar * ++gsd_accounts_user_dup_language (GsdAccountsUser *object) ++{ ++ gchar *value; ++ g_object_get (G_OBJECT (object), "language", &value, NULL); ++ return value; ++} ++ ++/** ++ * gsd_accounts_user_set_language: (skip) ++ * @object: A #GsdAccountsUser. ++ * @value: The value to set. ++ * ++ * Sets the "Language" D-Bus property to @value. ++ * ++ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side. ++ */ ++void ++gsd_accounts_user_set_language (GsdAccountsUser *object, const gchar *value) ++{ ++ g_object_set (G_OBJECT (object), "language", value, NULL); ++} ++ ++/** ++ * gsd_accounts_user_get_xsession: (skip) ++ * @object: A #GsdAccountsUser. ++ * ++ * Gets the value of the "XSession" D-Bus property. ++ * ++ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side. ++ * ++ * The returned value is only valid until the property changes so on the client-side it is only safe to use this function on the thread where @object was constructed. Use gsd_accounts_user_dup_xsession() if on another thread. ++ * ++ * Returns: (transfer none): The property value or %NULL if the property is not set. Do not free the returned value, it belongs to @object. ++ */ ++const gchar * ++gsd_accounts_user_get_xsession (GsdAccountsUser *object) ++{ ++ return GSD_ACCOUNTS_USER_GET_IFACE (object)->get_xsession (object); ++} ++ ++/** ++ * gsd_accounts_user_dup_xsession: (skip) ++ * @object: A #GsdAccountsUser. ++ * ++ * Gets a copy of the "XSession" D-Bus property. ++ * ++ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side. ++ * ++ * Returns: (transfer full): The property value or %NULL if the property is not set. The returned value should be freed with g_free(). ++ */ ++gchar * ++gsd_accounts_user_dup_xsession (GsdAccountsUser *object) ++{ ++ gchar *value; ++ g_object_get (G_OBJECT (object), "xsession", &value, NULL); ++ return value; ++} ++ ++/** ++ * gsd_accounts_user_set_xsession: (skip) ++ * @object: A #GsdAccountsUser. ++ * @value: The value to set. ++ * ++ * Sets the "XSession" D-Bus property to @value. ++ * ++ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side. ++ */ ++void ++gsd_accounts_user_set_xsession (GsdAccountsUser *object, const gchar *value) ++{ ++ g_object_set (G_OBJECT (object), "xsession", value, NULL); ++} ++ ++/** ++ * gsd_accounts_user_get_location: (skip) ++ * @object: A #GsdAccountsUser. ++ * ++ * Gets the value of the "Location" D-Bus property. ++ * ++ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side. ++ * ++ * The returned value is only valid until the property changes so on the client-side it is only safe to use this function on the thread where @object was constructed. Use gsd_accounts_user_dup_location() if on another thread. ++ * ++ * Returns: (transfer none): The property value or %NULL if the property is not set. Do not free the returned value, it belongs to @object. ++ */ ++const gchar * ++gsd_accounts_user_get_location (GsdAccountsUser *object) ++{ ++ return GSD_ACCOUNTS_USER_GET_IFACE (object)->get_location (object); ++} ++ ++/** ++ * gsd_accounts_user_dup_location: (skip) ++ * @object: A #GsdAccountsUser. ++ * ++ * Gets a copy of the "Location" D-Bus property. ++ * ++ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side. ++ * ++ * Returns: (transfer full): The property value or %NULL if the property is not set. The returned value should be freed with g_free(). ++ */ ++gchar * ++gsd_accounts_user_dup_location (GsdAccountsUser *object) ++{ ++ gchar *value; ++ g_object_get (G_OBJECT (object), "location", &value, NULL); ++ return value; ++} ++ ++/** ++ * gsd_accounts_user_set_location: (skip) ++ * @object: A #GsdAccountsUser. ++ * @value: The value to set. ++ * ++ * Sets the "Location" D-Bus property to @value. ++ * ++ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side. ++ */ ++void ++gsd_accounts_user_set_location (GsdAccountsUser *object, const gchar *value) ++{ ++ g_object_set (G_OBJECT (object), "location", value, NULL); ++} ++ ++/** ++ * gsd_accounts_user_get_login_frequency: (skip) ++ * @object: A #GsdAccountsUser. ++ * ++ * Gets the value of the "LoginFrequency" D-Bus property. ++ * ++ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side. ++ * ++ * Returns: The property value. ++ */ ++guint64 ++gsd_accounts_user_get_login_frequency (GsdAccountsUser *object) ++{ ++ return GSD_ACCOUNTS_USER_GET_IFACE (object)->get_login_frequency (object); ++} ++ ++/** ++ * gsd_accounts_user_set_login_frequency: (skip) ++ * @object: A #GsdAccountsUser. ++ * @value: The value to set. ++ * ++ * Sets the "LoginFrequency" D-Bus property to @value. ++ * ++ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side. ++ */ ++void ++gsd_accounts_user_set_login_frequency (GsdAccountsUser *object, guint64 value) ++{ ++ g_object_set (G_OBJECT (object), "login-frequency", value, NULL); ++} ++ ++/** ++ * gsd_accounts_user_get_login_time: (skip) ++ * @object: A #GsdAccountsUser. ++ * ++ * Gets the value of the "LoginTime" D-Bus property. ++ * ++ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side. ++ * ++ * Returns: The property value. ++ */ ++gint64 ++gsd_accounts_user_get_login_time (GsdAccountsUser *object) ++{ ++ return GSD_ACCOUNTS_USER_GET_IFACE (object)->get_login_time (object); ++} ++ ++/** ++ * gsd_accounts_user_set_login_time: (skip) ++ * @object: A #GsdAccountsUser. ++ * @value: The value to set. ++ * ++ * Sets the "LoginTime" D-Bus property to @value. ++ * ++ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side. ++ */ ++void ++gsd_accounts_user_set_login_time (GsdAccountsUser *object, gint64 value) ++{ ++ g_object_set (G_OBJECT (object), "login-time", value, NULL); ++} ++ ++/** ++ * gsd_accounts_user_get_login_history: (skip) ++ * @object: A #GsdAccountsUser. ++ * ++ * Gets the value of the "LoginHistory" D-Bus property. ++ * ++ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side. ++ * ++ * The returned value is only valid until the property changes so on the client-side it is only safe to use this function on the thread where @object was constructed. Use gsd_accounts_user_dup_login_history() if on another thread. ++ * ++ * Returns: (transfer none): The property value or %NULL if the property is not set. Do not free the returned value, it belongs to @object. ++ */ ++GVariant * ++gsd_accounts_user_get_login_history (GsdAccountsUser *object) ++{ ++ return GSD_ACCOUNTS_USER_GET_IFACE (object)->get_login_history (object); ++} ++ ++/** ++ * gsd_accounts_user_dup_login_history: (skip) ++ * @object: A #GsdAccountsUser. ++ * ++ * Gets a copy of the "LoginHistory" D-Bus property. ++ * ++ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side. ++ * ++ * Returns: (transfer full): The property value or %NULL if the property is not set. The returned value should be freed with g_variant_unref(). ++ */ ++GVariant * ++gsd_accounts_user_dup_login_history (GsdAccountsUser *object) ++{ ++ GVariant *value; ++ g_object_get (G_OBJECT (object), "login-history", &value, NULL); ++ return value; ++} ++ ++/** ++ * gsd_accounts_user_set_login_history: (skip) ++ * @object: A #GsdAccountsUser. ++ * @value: The value to set. ++ * ++ * Sets the "LoginHistory" D-Bus property to @value. ++ * ++ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side. ++ */ ++void ++gsd_accounts_user_set_login_history (GsdAccountsUser *object, GVariant *value) ++{ ++ g_object_set (G_OBJECT (object), "login-history", value, NULL); ++} ++ ++/** ++ * gsd_accounts_user_get_icon_file: (skip) ++ * @object: A #GsdAccountsUser. ++ * ++ * Gets the value of the "IconFile" D-Bus property. ++ * ++ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side. ++ * ++ * The returned value is only valid until the property changes so on the client-side it is only safe to use this function on the thread where @object was constructed. Use gsd_accounts_user_dup_icon_file() if on another thread. ++ * ++ * Returns: (transfer none): The property value or %NULL if the property is not set. Do not free the returned value, it belongs to @object. ++ */ ++const gchar * ++gsd_accounts_user_get_icon_file (GsdAccountsUser *object) ++{ ++ return GSD_ACCOUNTS_USER_GET_IFACE (object)->get_icon_file (object); ++} ++ ++/** ++ * gsd_accounts_user_dup_icon_file: (skip) ++ * @object: A #GsdAccountsUser. ++ * ++ * Gets a copy of the "IconFile" D-Bus property. ++ * ++ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side. ++ * ++ * Returns: (transfer full): The property value or %NULL if the property is not set. The returned value should be freed with g_free(). ++ */ ++gchar * ++gsd_accounts_user_dup_icon_file (GsdAccountsUser *object) ++{ ++ gchar *value; ++ g_object_get (G_OBJECT (object), "icon-file", &value, NULL); ++ return value; ++} ++ ++/** ++ * gsd_accounts_user_set_icon_file: (skip) ++ * @object: A #GsdAccountsUser. ++ * @value: The value to set. ++ * ++ * Sets the "IconFile" D-Bus property to @value. ++ * ++ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side. ++ */ ++void ++gsd_accounts_user_set_icon_file (GsdAccountsUser *object, const gchar *value) ++{ ++ g_object_set (G_OBJECT (object), "icon-file", value, NULL); ++} ++ ++/** ++ * gsd_accounts_user_get_locked: (skip) ++ * @object: A #GsdAccountsUser. ++ * ++ * Gets the value of the "Locked" D-Bus property. ++ * ++ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side. ++ * ++ * Returns: The property value. ++ */ ++gboolean ++gsd_accounts_user_get_locked (GsdAccountsUser *object) ++{ ++ return GSD_ACCOUNTS_USER_GET_IFACE (object)->get_locked (object); ++} ++ ++/** ++ * gsd_accounts_user_set_locked: (skip) ++ * @object: A #GsdAccountsUser. ++ * @value: The value to set. ++ * ++ * Sets the "Locked" D-Bus property to @value. ++ * ++ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side. ++ */ ++void ++gsd_accounts_user_set_locked (GsdAccountsUser *object, gboolean value) ++{ ++ g_object_set (G_OBJECT (object), "locked", value, NULL); ++} ++ ++/** ++ * gsd_accounts_user_get_password_mode: (skip) ++ * @object: A #GsdAccountsUser. ++ * ++ * Gets the value of the "PasswordMode" D-Bus property. ++ * ++ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side. ++ * ++ * Returns: The property value. ++ */ ++gint ++gsd_accounts_user_get_password_mode (GsdAccountsUser *object) ++{ ++ return GSD_ACCOUNTS_USER_GET_IFACE (object)->get_password_mode (object); ++} ++ ++/** ++ * gsd_accounts_user_set_password_mode: (skip) ++ * @object: A #GsdAccountsUser. ++ * @value: The value to set. ++ * ++ * Sets the "PasswordMode" D-Bus property to @value. ++ * ++ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side. ++ */ ++void ++gsd_accounts_user_set_password_mode (GsdAccountsUser *object, gint value) ++{ ++ g_object_set (G_OBJECT (object), "password-mode", value, NULL); ++} ++ ++/** ++ * gsd_accounts_user_get_password_hint: (skip) ++ * @object: A #GsdAccountsUser. ++ * ++ * Gets the value of the "PasswordHint" D-Bus property. ++ * ++ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side. ++ * ++ * The returned value is only valid until the property changes so on the client-side it is only safe to use this function on the thread where @object was constructed. Use gsd_accounts_user_dup_password_hint() if on another thread. ++ * ++ * Returns: (transfer none): The property value or %NULL if the property is not set. Do not free the returned value, it belongs to @object. ++ */ ++const gchar * ++gsd_accounts_user_get_password_hint (GsdAccountsUser *object) ++{ ++ return GSD_ACCOUNTS_USER_GET_IFACE (object)->get_password_hint (object); ++} ++ ++/** ++ * gsd_accounts_user_dup_password_hint: (skip) ++ * @object: A #GsdAccountsUser. ++ * ++ * Gets a copy of the "PasswordHint" D-Bus property. ++ * ++ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side. ++ * ++ * Returns: (transfer full): The property value or %NULL if the property is not set. The returned value should be freed with g_free(). ++ */ ++gchar * ++gsd_accounts_user_dup_password_hint (GsdAccountsUser *object) ++{ ++ gchar *value; ++ g_object_get (G_OBJECT (object), "password-hint", &value, NULL); ++ return value; ++} ++ ++/** ++ * gsd_accounts_user_set_password_hint: (skip) ++ * @object: A #GsdAccountsUser. ++ * @value: The value to set. ++ * ++ * Sets the "PasswordHint" D-Bus property to @value. ++ * ++ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side. ++ */ ++void ++gsd_accounts_user_set_password_hint (GsdAccountsUser *object, const gchar *value) ++{ ++ g_object_set (G_OBJECT (object), "password-hint", value, NULL); ++} ++ ++/** ++ * gsd_accounts_user_get_automatic_login: (skip) ++ * @object: A #GsdAccountsUser. ++ * ++ * Gets the value of the "AutomaticLogin" D-Bus property. ++ * ++ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side. ++ * ++ * Returns: The property value. ++ */ ++gboolean ++gsd_accounts_user_get_automatic_login (GsdAccountsUser *object) ++{ ++ return GSD_ACCOUNTS_USER_GET_IFACE (object)->get_automatic_login (object); ++} ++ ++/** ++ * gsd_accounts_user_set_automatic_login: (skip) ++ * @object: A #GsdAccountsUser. ++ * @value: The value to set. ++ * ++ * Sets the "AutomaticLogin" D-Bus property to @value. ++ * ++ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side. ++ */ ++void ++gsd_accounts_user_set_automatic_login (GsdAccountsUser *object, gboolean value) ++{ ++ g_object_set (G_OBJECT (object), "automatic-login", value, NULL); ++} ++ ++/** ++ * gsd_accounts_user_get_system_account: (skip) ++ * @object: A #GsdAccountsUser. ++ * ++ * Gets the value of the "SystemAccount" D-Bus property. ++ * ++ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side. ++ * ++ * Returns: The property value. ++ */ ++gboolean ++gsd_accounts_user_get_system_account (GsdAccountsUser *object) ++{ ++ return GSD_ACCOUNTS_USER_GET_IFACE (object)->get_system_account (object); ++} ++ ++/** ++ * gsd_accounts_user_set_system_account: (skip) ++ * @object: A #GsdAccountsUser. ++ * @value: The value to set. ++ * ++ * Sets the "SystemAccount" D-Bus property to @value. ++ * ++ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side. ++ */ ++void ++gsd_accounts_user_set_system_account (GsdAccountsUser *object, gboolean value) ++{ ++ g_object_set (G_OBJECT (object), "system-account", value, NULL); ++} ++ ++/** ++ * gsd_accounts_user_get_local_account: (skip) ++ * @object: A #GsdAccountsUser. ++ * ++ * Gets the value of the "LocalAccount" D-Bus property. ++ * ++ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side. ++ * ++ * Returns: The property value. ++ */ ++gboolean ++gsd_accounts_user_get_local_account (GsdAccountsUser *object) ++{ ++ return GSD_ACCOUNTS_USER_GET_IFACE (object)->get_local_account (object); ++} ++ ++/** ++ * gsd_accounts_user_set_local_account: (skip) ++ * @object: A #GsdAccountsUser. ++ * @value: The value to set. ++ * ++ * Sets the "LocalAccount" D-Bus property to @value. ++ * ++ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side. ++ */ ++void ++gsd_accounts_user_set_local_account (GsdAccountsUser *object, gboolean value) ++{ ++ g_object_set (G_OBJECT (object), "local-account", value, NULL); ++} ++ ++/** ++ * gsd_accounts_user_emit_changed: ++ * @object: A #GsdAccountsUser. ++ * ++ * Emits the "Changed" D-Bus signal. ++ */ ++void ++gsd_accounts_user_emit_changed ( ++ GsdAccountsUser *object) ++{ ++ g_signal_emit_by_name (object, "changed"); ++} ++ ++/** ++ * gsd_accounts_user_call_set_user_name: ++ * @proxy: A #GsdAccountsUserProxy. ++ * @arg_name: Argument to pass with the method invocation. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. ++ * @user_data: User data to pass to @callback. ++ * ++ * Asynchronously invokes the SetUserName() D-Bus method on @proxy. ++ * When the operation is finished, @callback will be invoked in the thread-default main loop of the thread you are calling this method from. ++ * You can then call gsd_accounts_user_call_set_user_name_finish() to get the result of the operation. ++ * ++ * See gsd_accounts_user_call_set_user_name_sync() for the synchronous, blocking version of this method. ++ */ ++void ++gsd_accounts_user_call_set_user_name ( ++ GsdAccountsUser *proxy, ++ const gchar *arg_name, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data) ++{ ++ g_dbus_proxy_call (G_DBUS_PROXY (proxy), ++ "SetUserName", ++ g_variant_new ("(s)", ++ arg_name), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancellable, ++ callback, ++ user_data); ++} ++ ++/** ++ * gsd_accounts_user_call_set_user_name_finish: ++ * @proxy: A #GsdAccountsUserProxy. ++ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to gsd_accounts_user_call_set_user_name(). ++ * @error: Return location for error or %NULL. ++ * ++ * Finishes an operation started with gsd_accounts_user_call_set_user_name(). ++ * ++ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. ++ */ ++gboolean ++gsd_accounts_user_call_set_user_name_finish ( ++ GsdAccountsUser *proxy, ++ GAsyncResult *res, ++ GError **error) ++{ ++ GVariant *_ret; ++ _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); ++ if (_ret == NULL) ++ goto _out; ++ g_variant_get (_ret, ++ "()"); ++ g_variant_unref (_ret); ++_out: ++ return _ret != NULL; ++} ++ ++/** ++ * gsd_accounts_user_call_set_user_name_sync: ++ * @proxy: A #GsdAccountsUserProxy. ++ * @arg_name: Argument to pass with the method invocation. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @error: Return location for error or %NULL. ++ * ++ * Synchronously invokes the SetUserName() D-Bus method on @proxy. The calling thread is blocked until a reply is received. ++ * ++ * See gsd_accounts_user_call_set_user_name() for the asynchronous version of this method. ++ * ++ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. ++ */ ++gboolean ++gsd_accounts_user_call_set_user_name_sync ( ++ GsdAccountsUser *proxy, ++ const gchar *arg_name, ++ GCancellable *cancellable, ++ GError **error) ++{ ++ GVariant *_ret; ++ _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), ++ "SetUserName", ++ g_variant_new ("(s)", ++ arg_name), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancellable, ++ error); ++ if (_ret == NULL) ++ goto _out; ++ g_variant_get (_ret, ++ "()"); ++ g_variant_unref (_ret); ++_out: ++ return _ret != NULL; ++} ++ ++/** ++ * gsd_accounts_user_call_set_real_name: ++ * @proxy: A #GsdAccountsUserProxy. ++ * @arg_name: Argument to pass with the method invocation. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. ++ * @user_data: User data to pass to @callback. ++ * ++ * Asynchronously invokes the SetRealName() D-Bus method on @proxy. ++ * When the operation is finished, @callback will be invoked in the thread-default main loop of the thread you are calling this method from. ++ * You can then call gsd_accounts_user_call_set_real_name_finish() to get the result of the operation. ++ * ++ * See gsd_accounts_user_call_set_real_name_sync() for the synchronous, blocking version of this method. ++ */ ++void ++gsd_accounts_user_call_set_real_name ( ++ GsdAccountsUser *proxy, ++ const gchar *arg_name, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data) ++{ ++ g_dbus_proxy_call (G_DBUS_PROXY (proxy), ++ "SetRealName", ++ g_variant_new ("(s)", ++ arg_name), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancellable, ++ callback, ++ user_data); ++} ++ ++/** ++ * gsd_accounts_user_call_set_real_name_finish: ++ * @proxy: A #GsdAccountsUserProxy. ++ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to gsd_accounts_user_call_set_real_name(). ++ * @error: Return location for error or %NULL. ++ * ++ * Finishes an operation started with gsd_accounts_user_call_set_real_name(). ++ * ++ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. ++ */ ++gboolean ++gsd_accounts_user_call_set_real_name_finish ( ++ GsdAccountsUser *proxy, ++ GAsyncResult *res, ++ GError **error) ++{ ++ GVariant *_ret; ++ _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); ++ if (_ret == NULL) ++ goto _out; ++ g_variant_get (_ret, ++ "()"); ++ g_variant_unref (_ret); ++_out: ++ return _ret != NULL; ++} ++ ++/** ++ * gsd_accounts_user_call_set_real_name_sync: ++ * @proxy: A #GsdAccountsUserProxy. ++ * @arg_name: Argument to pass with the method invocation. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @error: Return location for error or %NULL. ++ * ++ * Synchronously invokes the SetRealName() D-Bus method on @proxy. The calling thread is blocked until a reply is received. ++ * ++ * See gsd_accounts_user_call_set_real_name() for the asynchronous version of this method. ++ * ++ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. ++ */ ++gboolean ++gsd_accounts_user_call_set_real_name_sync ( ++ GsdAccountsUser *proxy, ++ const gchar *arg_name, ++ GCancellable *cancellable, ++ GError **error) ++{ ++ GVariant *_ret; ++ _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), ++ "SetRealName", ++ g_variant_new ("(s)", ++ arg_name), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancellable, ++ error); ++ if (_ret == NULL) ++ goto _out; ++ g_variant_get (_ret, ++ "()"); ++ g_variant_unref (_ret); ++_out: ++ return _ret != NULL; ++} ++ ++/** ++ * gsd_accounts_user_call_set_email: ++ * @proxy: A #GsdAccountsUserProxy. ++ * @arg_email: Argument to pass with the method invocation. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. ++ * @user_data: User data to pass to @callback. ++ * ++ * Asynchronously invokes the SetEmail() D-Bus method on @proxy. ++ * When the operation is finished, @callback will be invoked in the thread-default main loop of the thread you are calling this method from. ++ * You can then call gsd_accounts_user_call_set_email_finish() to get the result of the operation. ++ * ++ * See gsd_accounts_user_call_set_email_sync() for the synchronous, blocking version of this method. ++ */ ++void ++gsd_accounts_user_call_set_email ( ++ GsdAccountsUser *proxy, ++ const gchar *arg_email, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data) ++{ ++ g_dbus_proxy_call (G_DBUS_PROXY (proxy), ++ "SetEmail", ++ g_variant_new ("(s)", ++ arg_email), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancellable, ++ callback, ++ user_data); ++} ++ ++/** ++ * gsd_accounts_user_call_set_email_finish: ++ * @proxy: A #GsdAccountsUserProxy. ++ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to gsd_accounts_user_call_set_email(). ++ * @error: Return location for error or %NULL. ++ * ++ * Finishes an operation started with gsd_accounts_user_call_set_email(). ++ * ++ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. ++ */ ++gboolean ++gsd_accounts_user_call_set_email_finish ( ++ GsdAccountsUser *proxy, ++ GAsyncResult *res, ++ GError **error) ++{ ++ GVariant *_ret; ++ _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); ++ if (_ret == NULL) ++ goto _out; ++ g_variant_get (_ret, ++ "()"); ++ g_variant_unref (_ret); ++_out: ++ return _ret != NULL; ++} ++ ++/** ++ * gsd_accounts_user_call_set_email_sync: ++ * @proxy: A #GsdAccountsUserProxy. ++ * @arg_email: Argument to pass with the method invocation. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @error: Return location for error or %NULL. ++ * ++ * Synchronously invokes the SetEmail() D-Bus method on @proxy. The calling thread is blocked until a reply is received. ++ * ++ * See gsd_accounts_user_call_set_email() for the asynchronous version of this method. ++ * ++ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. ++ */ ++gboolean ++gsd_accounts_user_call_set_email_sync ( ++ GsdAccountsUser *proxy, ++ const gchar *arg_email, ++ GCancellable *cancellable, ++ GError **error) ++{ ++ GVariant *_ret; ++ _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), ++ "SetEmail", ++ g_variant_new ("(s)", ++ arg_email), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancellable, ++ error); ++ if (_ret == NULL) ++ goto _out; ++ g_variant_get (_ret, ++ "()"); ++ g_variant_unref (_ret); ++_out: ++ return _ret != NULL; ++} ++ ++/** ++ * gsd_accounts_user_call_set_language: ++ * @proxy: A #GsdAccountsUserProxy. ++ * @arg_language: Argument to pass with the method invocation. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. ++ * @user_data: User data to pass to @callback. ++ * ++ * Asynchronously invokes the SetLanguage() D-Bus method on @proxy. ++ * When the operation is finished, @callback will be invoked in the thread-default main loop of the thread you are calling this method from. ++ * You can then call gsd_accounts_user_call_set_language_finish() to get the result of the operation. ++ * ++ * See gsd_accounts_user_call_set_language_sync() for the synchronous, blocking version of this method. ++ */ ++void ++gsd_accounts_user_call_set_language ( ++ GsdAccountsUser *proxy, ++ const gchar *arg_language, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data) ++{ ++ g_dbus_proxy_call (G_DBUS_PROXY (proxy), ++ "SetLanguage", ++ g_variant_new ("(s)", ++ arg_language), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancellable, ++ callback, ++ user_data); ++} ++ ++/** ++ * gsd_accounts_user_call_set_language_finish: ++ * @proxy: A #GsdAccountsUserProxy. ++ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to gsd_accounts_user_call_set_language(). ++ * @error: Return location for error or %NULL. ++ * ++ * Finishes an operation started with gsd_accounts_user_call_set_language(). ++ * ++ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. ++ */ ++gboolean ++gsd_accounts_user_call_set_language_finish ( ++ GsdAccountsUser *proxy, ++ GAsyncResult *res, ++ GError **error) ++{ ++ GVariant *_ret; ++ _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); ++ if (_ret == NULL) ++ goto _out; ++ g_variant_get (_ret, ++ "()"); ++ g_variant_unref (_ret); ++_out: ++ return _ret != NULL; ++} ++ ++/** ++ * gsd_accounts_user_call_set_language_sync: ++ * @proxy: A #GsdAccountsUserProxy. ++ * @arg_language: Argument to pass with the method invocation. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @error: Return location for error or %NULL. ++ * ++ * Synchronously invokes the SetLanguage() D-Bus method on @proxy. The calling thread is blocked until a reply is received. ++ * ++ * See gsd_accounts_user_call_set_language() for the asynchronous version of this method. ++ * ++ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. ++ */ ++gboolean ++gsd_accounts_user_call_set_language_sync ( ++ GsdAccountsUser *proxy, ++ const gchar *arg_language, ++ GCancellable *cancellable, ++ GError **error) ++{ ++ GVariant *_ret; ++ _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), ++ "SetLanguage", ++ g_variant_new ("(s)", ++ arg_language), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancellable, ++ error); ++ if (_ret == NULL) ++ goto _out; ++ g_variant_get (_ret, ++ "()"); ++ g_variant_unref (_ret); ++_out: ++ return _ret != NULL; ++} ++ ++/** ++ * gsd_accounts_user_call_set_xsession: ++ * @proxy: A #GsdAccountsUserProxy. ++ * @arg_x_session: Argument to pass with the method invocation. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. ++ * @user_data: User data to pass to @callback. ++ * ++ * Asynchronously invokes the SetXSession() D-Bus method on @proxy. ++ * When the operation is finished, @callback will be invoked in the thread-default main loop of the thread you are calling this method from. ++ * You can then call gsd_accounts_user_call_set_xsession_finish() to get the result of the operation. ++ * ++ * See gsd_accounts_user_call_set_xsession_sync() for the synchronous, blocking version of this method. ++ */ ++void ++gsd_accounts_user_call_set_xsession ( ++ GsdAccountsUser *proxy, ++ const gchar *arg_x_session, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data) ++{ ++ g_dbus_proxy_call (G_DBUS_PROXY (proxy), ++ "SetXSession", ++ g_variant_new ("(s)", ++ arg_x_session), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancellable, ++ callback, ++ user_data); ++} ++ ++/** ++ * gsd_accounts_user_call_set_xsession_finish: ++ * @proxy: A #GsdAccountsUserProxy. ++ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to gsd_accounts_user_call_set_xsession(). ++ * @error: Return location for error or %NULL. ++ * ++ * Finishes an operation started with gsd_accounts_user_call_set_xsession(). ++ * ++ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. ++ */ ++gboolean ++gsd_accounts_user_call_set_xsession_finish ( ++ GsdAccountsUser *proxy, ++ GAsyncResult *res, ++ GError **error) ++{ ++ GVariant *_ret; ++ _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); ++ if (_ret == NULL) ++ goto _out; ++ g_variant_get (_ret, ++ "()"); ++ g_variant_unref (_ret); ++_out: ++ return _ret != NULL; ++} ++ ++/** ++ * gsd_accounts_user_call_set_xsession_sync: ++ * @proxy: A #GsdAccountsUserProxy. ++ * @arg_x_session: Argument to pass with the method invocation. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @error: Return location for error or %NULL. ++ * ++ * Synchronously invokes the SetXSession() D-Bus method on @proxy. The calling thread is blocked until a reply is received. ++ * ++ * See gsd_accounts_user_call_set_xsession() for the asynchronous version of this method. ++ * ++ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. ++ */ ++gboolean ++gsd_accounts_user_call_set_xsession_sync ( ++ GsdAccountsUser *proxy, ++ const gchar *arg_x_session, ++ GCancellable *cancellable, ++ GError **error) ++{ ++ GVariant *_ret; ++ _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), ++ "SetXSession", ++ g_variant_new ("(s)", ++ arg_x_session), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancellable, ++ error); ++ if (_ret == NULL) ++ goto _out; ++ g_variant_get (_ret, ++ "()"); ++ g_variant_unref (_ret); ++_out: ++ return _ret != NULL; ++} ++ ++/** ++ * gsd_accounts_user_call_set_location: ++ * @proxy: A #GsdAccountsUserProxy. ++ * @arg_location: Argument to pass with the method invocation. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. ++ * @user_data: User data to pass to @callback. ++ * ++ * Asynchronously invokes the SetLocation() D-Bus method on @proxy. ++ * When the operation is finished, @callback will be invoked in the thread-default main loop of the thread you are calling this method from. ++ * You can then call gsd_accounts_user_call_set_location_finish() to get the result of the operation. ++ * ++ * See gsd_accounts_user_call_set_location_sync() for the synchronous, blocking version of this method. ++ */ ++void ++gsd_accounts_user_call_set_location ( ++ GsdAccountsUser *proxy, ++ const gchar *arg_location, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data) ++{ ++ g_dbus_proxy_call (G_DBUS_PROXY (proxy), ++ "SetLocation", ++ g_variant_new ("(s)", ++ arg_location), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancellable, ++ callback, ++ user_data); ++} ++ ++/** ++ * gsd_accounts_user_call_set_location_finish: ++ * @proxy: A #GsdAccountsUserProxy. ++ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to gsd_accounts_user_call_set_location(). ++ * @error: Return location for error or %NULL. ++ * ++ * Finishes an operation started with gsd_accounts_user_call_set_location(). ++ * ++ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. ++ */ ++gboolean ++gsd_accounts_user_call_set_location_finish ( ++ GsdAccountsUser *proxy, ++ GAsyncResult *res, ++ GError **error) ++{ ++ GVariant *_ret; ++ _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); ++ if (_ret == NULL) ++ goto _out; ++ g_variant_get (_ret, ++ "()"); ++ g_variant_unref (_ret); ++_out: ++ return _ret != NULL; ++} ++ ++/** ++ * gsd_accounts_user_call_set_location_sync: ++ * @proxy: A #GsdAccountsUserProxy. ++ * @arg_location: Argument to pass with the method invocation. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @error: Return location for error or %NULL. ++ * ++ * Synchronously invokes the SetLocation() D-Bus method on @proxy. The calling thread is blocked until a reply is received. ++ * ++ * See gsd_accounts_user_call_set_location() for the asynchronous version of this method. ++ * ++ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. ++ */ ++gboolean ++gsd_accounts_user_call_set_location_sync ( ++ GsdAccountsUser *proxy, ++ const gchar *arg_location, ++ GCancellable *cancellable, ++ GError **error) ++{ ++ GVariant *_ret; ++ _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), ++ "SetLocation", ++ g_variant_new ("(s)", ++ arg_location), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancellable, ++ error); ++ if (_ret == NULL) ++ goto _out; ++ g_variant_get (_ret, ++ "()"); ++ g_variant_unref (_ret); ++_out: ++ return _ret != NULL; ++} ++ ++/** ++ * gsd_accounts_user_call_set_home_directory: ++ * @proxy: A #GsdAccountsUserProxy. ++ * @arg_homedir: Argument to pass with the method invocation. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. ++ * @user_data: User data to pass to @callback. ++ * ++ * Asynchronously invokes the SetHomeDirectory() D-Bus method on @proxy. ++ * When the operation is finished, @callback will be invoked in the thread-default main loop of the thread you are calling this method from. ++ * You can then call gsd_accounts_user_call_set_home_directory_finish() to get the result of the operation. ++ * ++ * See gsd_accounts_user_call_set_home_directory_sync() for the synchronous, blocking version of this method. ++ */ ++void ++gsd_accounts_user_call_set_home_directory ( ++ GsdAccountsUser *proxy, ++ const gchar *arg_homedir, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data) ++{ ++ g_dbus_proxy_call (G_DBUS_PROXY (proxy), ++ "SetHomeDirectory", ++ g_variant_new ("(s)", ++ arg_homedir), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancellable, ++ callback, ++ user_data); ++} ++ ++/** ++ * gsd_accounts_user_call_set_home_directory_finish: ++ * @proxy: A #GsdAccountsUserProxy. ++ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to gsd_accounts_user_call_set_home_directory(). ++ * @error: Return location for error or %NULL. ++ * ++ * Finishes an operation started with gsd_accounts_user_call_set_home_directory(). ++ * ++ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. ++ */ ++gboolean ++gsd_accounts_user_call_set_home_directory_finish ( ++ GsdAccountsUser *proxy, ++ GAsyncResult *res, ++ GError **error) ++{ ++ GVariant *_ret; ++ _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); ++ if (_ret == NULL) ++ goto _out; ++ g_variant_get (_ret, ++ "()"); ++ g_variant_unref (_ret); ++_out: ++ return _ret != NULL; ++} ++ ++/** ++ * gsd_accounts_user_call_set_home_directory_sync: ++ * @proxy: A #GsdAccountsUserProxy. ++ * @arg_homedir: Argument to pass with the method invocation. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @error: Return location for error or %NULL. ++ * ++ * Synchronously invokes the SetHomeDirectory() D-Bus method on @proxy. The calling thread is blocked until a reply is received. ++ * ++ * See gsd_accounts_user_call_set_home_directory() for the asynchronous version of this method. ++ * ++ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. ++ */ ++gboolean ++gsd_accounts_user_call_set_home_directory_sync ( ++ GsdAccountsUser *proxy, ++ const gchar *arg_homedir, ++ GCancellable *cancellable, ++ GError **error) ++{ ++ GVariant *_ret; ++ _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), ++ "SetHomeDirectory", ++ g_variant_new ("(s)", ++ arg_homedir), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancellable, ++ error); ++ if (_ret == NULL) ++ goto _out; ++ g_variant_get (_ret, ++ "()"); ++ g_variant_unref (_ret); ++_out: ++ return _ret != NULL; ++} ++ ++/** ++ * gsd_accounts_user_call_set_shell: ++ * @proxy: A #GsdAccountsUserProxy. ++ * @arg_shell: Argument to pass with the method invocation. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. ++ * @user_data: User data to pass to @callback. ++ * ++ * Asynchronously invokes the SetShell() D-Bus method on @proxy. ++ * When the operation is finished, @callback will be invoked in the thread-default main loop of the thread you are calling this method from. ++ * You can then call gsd_accounts_user_call_set_shell_finish() to get the result of the operation. ++ * ++ * See gsd_accounts_user_call_set_shell_sync() for the synchronous, blocking version of this method. ++ */ ++void ++gsd_accounts_user_call_set_shell ( ++ GsdAccountsUser *proxy, ++ const gchar *arg_shell, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data) ++{ ++ g_dbus_proxy_call (G_DBUS_PROXY (proxy), ++ "SetShell", ++ g_variant_new ("(s)", ++ arg_shell), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancellable, ++ callback, ++ user_data); ++} ++ ++/** ++ * gsd_accounts_user_call_set_shell_finish: ++ * @proxy: A #GsdAccountsUserProxy. ++ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to gsd_accounts_user_call_set_shell(). ++ * @error: Return location for error or %NULL. ++ * ++ * Finishes an operation started with gsd_accounts_user_call_set_shell(). ++ * ++ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. ++ */ ++gboolean ++gsd_accounts_user_call_set_shell_finish ( ++ GsdAccountsUser *proxy, ++ GAsyncResult *res, ++ GError **error) ++{ ++ GVariant *_ret; ++ _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); ++ if (_ret == NULL) ++ goto _out; ++ g_variant_get (_ret, ++ "()"); ++ g_variant_unref (_ret); ++_out: ++ return _ret != NULL; ++} ++ ++/** ++ * gsd_accounts_user_call_set_shell_sync: ++ * @proxy: A #GsdAccountsUserProxy. ++ * @arg_shell: Argument to pass with the method invocation. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @error: Return location for error or %NULL. ++ * ++ * Synchronously invokes the SetShell() D-Bus method on @proxy. The calling thread is blocked until a reply is received. ++ * ++ * See gsd_accounts_user_call_set_shell() for the asynchronous version of this method. ++ * ++ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. ++ */ ++gboolean ++gsd_accounts_user_call_set_shell_sync ( ++ GsdAccountsUser *proxy, ++ const gchar *arg_shell, ++ GCancellable *cancellable, ++ GError **error) ++{ ++ GVariant *_ret; ++ _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), ++ "SetShell", ++ g_variant_new ("(s)", ++ arg_shell), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancellable, ++ error); ++ if (_ret == NULL) ++ goto _out; ++ g_variant_get (_ret, ++ "()"); ++ g_variant_unref (_ret); ++_out: ++ return _ret != NULL; ++} ++ ++/** ++ * gsd_accounts_user_call_set_icon_file: ++ * @proxy: A #GsdAccountsUserProxy. ++ * @arg_filename: Argument to pass with the method invocation. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. ++ * @user_data: User data to pass to @callback. ++ * ++ * Asynchronously invokes the SetIconFile() D-Bus method on @proxy. ++ * When the operation is finished, @callback will be invoked in the thread-default main loop of the thread you are calling this method from. ++ * You can then call gsd_accounts_user_call_set_icon_file_finish() to get the result of the operation. ++ * ++ * See gsd_accounts_user_call_set_icon_file_sync() for the synchronous, blocking version of this method. ++ */ ++void ++gsd_accounts_user_call_set_icon_file ( ++ GsdAccountsUser *proxy, ++ const gchar *arg_filename, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data) ++{ ++ g_dbus_proxy_call (G_DBUS_PROXY (proxy), ++ "SetIconFile", ++ g_variant_new ("(s)", ++ arg_filename), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancellable, ++ callback, ++ user_data); ++} ++ ++/** ++ * gsd_accounts_user_call_set_icon_file_finish: ++ * @proxy: A #GsdAccountsUserProxy. ++ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to gsd_accounts_user_call_set_icon_file(). ++ * @error: Return location for error or %NULL. ++ * ++ * Finishes an operation started with gsd_accounts_user_call_set_icon_file(). ++ * ++ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. ++ */ ++gboolean ++gsd_accounts_user_call_set_icon_file_finish ( ++ GsdAccountsUser *proxy, ++ GAsyncResult *res, ++ GError **error) ++{ ++ GVariant *_ret; ++ _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); ++ if (_ret == NULL) ++ goto _out; ++ g_variant_get (_ret, ++ "()"); ++ g_variant_unref (_ret); ++_out: ++ return _ret != NULL; ++} ++ ++/** ++ * gsd_accounts_user_call_set_icon_file_sync: ++ * @proxy: A #GsdAccountsUserProxy. ++ * @arg_filename: Argument to pass with the method invocation. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @error: Return location for error or %NULL. ++ * ++ * Synchronously invokes the SetIconFile() D-Bus method on @proxy. The calling thread is blocked until a reply is received. ++ * ++ * See gsd_accounts_user_call_set_icon_file() for the asynchronous version of this method. ++ * ++ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. ++ */ ++gboolean ++gsd_accounts_user_call_set_icon_file_sync ( ++ GsdAccountsUser *proxy, ++ const gchar *arg_filename, ++ GCancellable *cancellable, ++ GError **error) ++{ ++ GVariant *_ret; ++ _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), ++ "SetIconFile", ++ g_variant_new ("(s)", ++ arg_filename), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancellable, ++ error); ++ if (_ret == NULL) ++ goto _out; ++ g_variant_get (_ret, ++ "()"); ++ g_variant_unref (_ret); ++_out: ++ return _ret != NULL; ++} ++ ++/** ++ * gsd_accounts_user_call_set_locked: ++ * @proxy: A #GsdAccountsUserProxy. ++ * @arg_locked: Argument to pass with the method invocation. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. ++ * @user_data: User data to pass to @callback. ++ * ++ * Asynchronously invokes the SetLocked() D-Bus method on @proxy. ++ * When the operation is finished, @callback will be invoked in the thread-default main loop of the thread you are calling this method from. ++ * You can then call gsd_accounts_user_call_set_locked_finish() to get the result of the operation. ++ * ++ * See gsd_accounts_user_call_set_locked_sync() for the synchronous, blocking version of this method. ++ */ ++void ++gsd_accounts_user_call_set_locked ( ++ GsdAccountsUser *proxy, ++ gboolean arg_locked, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data) ++{ ++ g_dbus_proxy_call (G_DBUS_PROXY (proxy), ++ "SetLocked", ++ g_variant_new ("(b)", ++ arg_locked), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancellable, ++ callback, ++ user_data); ++} ++ ++/** ++ * gsd_accounts_user_call_set_locked_finish: ++ * @proxy: A #GsdAccountsUserProxy. ++ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to gsd_accounts_user_call_set_locked(). ++ * @error: Return location for error or %NULL. ++ * ++ * Finishes an operation started with gsd_accounts_user_call_set_locked(). ++ * ++ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. ++ */ ++gboolean ++gsd_accounts_user_call_set_locked_finish ( ++ GsdAccountsUser *proxy, ++ GAsyncResult *res, ++ GError **error) ++{ ++ GVariant *_ret; ++ _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); ++ if (_ret == NULL) ++ goto _out; ++ g_variant_get (_ret, ++ "()"); ++ g_variant_unref (_ret); ++_out: ++ return _ret != NULL; ++} ++ ++/** ++ * gsd_accounts_user_call_set_locked_sync: ++ * @proxy: A #GsdAccountsUserProxy. ++ * @arg_locked: Argument to pass with the method invocation. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @error: Return location for error or %NULL. ++ * ++ * Synchronously invokes the SetLocked() D-Bus method on @proxy. The calling thread is blocked until a reply is received. ++ * ++ * See gsd_accounts_user_call_set_locked() for the asynchronous version of this method. ++ * ++ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. ++ */ ++gboolean ++gsd_accounts_user_call_set_locked_sync ( ++ GsdAccountsUser *proxy, ++ gboolean arg_locked, ++ GCancellable *cancellable, ++ GError **error) ++{ ++ GVariant *_ret; ++ _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), ++ "SetLocked", ++ g_variant_new ("(b)", ++ arg_locked), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancellable, ++ error); ++ if (_ret == NULL) ++ goto _out; ++ g_variant_get (_ret, ++ "()"); ++ g_variant_unref (_ret); ++_out: ++ return _ret != NULL; ++} ++ ++/** ++ * gsd_accounts_user_call_set_account_type: ++ * @proxy: A #GsdAccountsUserProxy. ++ * @arg_accountType: Argument to pass with the method invocation. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. ++ * @user_data: User data to pass to @callback. ++ * ++ * Asynchronously invokes the SetAccountType() D-Bus method on @proxy. ++ * When the operation is finished, @callback will be invoked in the thread-default main loop of the thread you are calling this method from. ++ * You can then call gsd_accounts_user_call_set_account_type_finish() to get the result of the operation. ++ * ++ * See gsd_accounts_user_call_set_account_type_sync() for the synchronous, blocking version of this method. ++ */ ++void ++gsd_accounts_user_call_set_account_type ( ++ GsdAccountsUser *proxy, ++ gint arg_accountType, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data) ++{ ++ g_dbus_proxy_call (G_DBUS_PROXY (proxy), ++ "SetAccountType", ++ g_variant_new ("(i)", ++ arg_accountType), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancellable, ++ callback, ++ user_data); ++} ++ ++/** ++ * gsd_accounts_user_call_set_account_type_finish: ++ * @proxy: A #GsdAccountsUserProxy. ++ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to gsd_accounts_user_call_set_account_type(). ++ * @error: Return location for error or %NULL. ++ * ++ * Finishes an operation started with gsd_accounts_user_call_set_account_type(). ++ * ++ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. ++ */ ++gboolean ++gsd_accounts_user_call_set_account_type_finish ( ++ GsdAccountsUser *proxy, ++ GAsyncResult *res, ++ GError **error) ++{ ++ GVariant *_ret; ++ _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); ++ if (_ret == NULL) ++ goto _out; ++ g_variant_get (_ret, ++ "()"); ++ g_variant_unref (_ret); ++_out: ++ return _ret != NULL; ++} ++ ++/** ++ * gsd_accounts_user_call_set_account_type_sync: ++ * @proxy: A #GsdAccountsUserProxy. ++ * @arg_accountType: Argument to pass with the method invocation. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @error: Return location for error or %NULL. ++ * ++ * Synchronously invokes the SetAccountType() D-Bus method on @proxy. The calling thread is blocked until a reply is received. ++ * ++ * See gsd_accounts_user_call_set_account_type() for the asynchronous version of this method. ++ * ++ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. ++ */ ++gboolean ++gsd_accounts_user_call_set_account_type_sync ( ++ GsdAccountsUser *proxy, ++ gint arg_accountType, ++ GCancellable *cancellable, ++ GError **error) ++{ ++ GVariant *_ret; ++ _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), ++ "SetAccountType", ++ g_variant_new ("(i)", ++ arg_accountType), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancellable, ++ error); ++ if (_ret == NULL) ++ goto _out; ++ g_variant_get (_ret, ++ "()"); ++ g_variant_unref (_ret); ++_out: ++ return _ret != NULL; ++} ++ ++/** ++ * gsd_accounts_user_call_set_password_mode: ++ * @proxy: A #GsdAccountsUserProxy. ++ * @arg_mode: Argument to pass with the method invocation. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. ++ * @user_data: User data to pass to @callback. ++ * ++ * Asynchronously invokes the SetPasswordMode() D-Bus method on @proxy. ++ * When the operation is finished, @callback will be invoked in the thread-default main loop of the thread you are calling this method from. ++ * You can then call gsd_accounts_user_call_set_password_mode_finish() to get the result of the operation. ++ * ++ * See gsd_accounts_user_call_set_password_mode_sync() for the synchronous, blocking version of this method. ++ */ ++void ++gsd_accounts_user_call_set_password_mode ( ++ GsdAccountsUser *proxy, ++ gint arg_mode, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data) ++{ ++ g_dbus_proxy_call (G_DBUS_PROXY (proxy), ++ "SetPasswordMode", ++ g_variant_new ("(i)", ++ arg_mode), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancellable, ++ callback, ++ user_data); ++} ++ ++/** ++ * gsd_accounts_user_call_set_password_mode_finish: ++ * @proxy: A #GsdAccountsUserProxy. ++ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to gsd_accounts_user_call_set_password_mode(). ++ * @error: Return location for error or %NULL. ++ * ++ * Finishes an operation started with gsd_accounts_user_call_set_password_mode(). ++ * ++ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. ++ */ ++gboolean ++gsd_accounts_user_call_set_password_mode_finish ( ++ GsdAccountsUser *proxy, ++ GAsyncResult *res, ++ GError **error) ++{ ++ GVariant *_ret; ++ _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); ++ if (_ret == NULL) ++ goto _out; ++ g_variant_get (_ret, ++ "()"); ++ g_variant_unref (_ret); ++_out: ++ return _ret != NULL; ++} ++ ++/** ++ * gsd_accounts_user_call_set_password_mode_sync: ++ * @proxy: A #GsdAccountsUserProxy. ++ * @arg_mode: Argument to pass with the method invocation. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @error: Return location for error or %NULL. ++ * ++ * Synchronously invokes the SetPasswordMode() D-Bus method on @proxy. The calling thread is blocked until a reply is received. ++ * ++ * See gsd_accounts_user_call_set_password_mode() for the asynchronous version of this method. ++ * ++ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. ++ */ ++gboolean ++gsd_accounts_user_call_set_password_mode_sync ( ++ GsdAccountsUser *proxy, ++ gint arg_mode, ++ GCancellable *cancellable, ++ GError **error) ++{ ++ GVariant *_ret; ++ _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), ++ "SetPasswordMode", ++ g_variant_new ("(i)", ++ arg_mode), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancellable, ++ error); ++ if (_ret == NULL) ++ goto _out; ++ g_variant_get (_ret, ++ "()"); ++ g_variant_unref (_ret); ++_out: ++ return _ret != NULL; ++} ++ ++/** ++ * gsd_accounts_user_call_set_password: ++ * @proxy: A #GsdAccountsUserProxy. ++ * @arg_password: Argument to pass with the method invocation. ++ * @arg_hint: Argument to pass with the method invocation. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. ++ * @user_data: User data to pass to @callback. ++ * ++ * Asynchronously invokes the SetPassword() D-Bus method on @proxy. ++ * When the operation is finished, @callback will be invoked in the thread-default main loop of the thread you are calling this method from. ++ * You can then call gsd_accounts_user_call_set_password_finish() to get the result of the operation. ++ * ++ * See gsd_accounts_user_call_set_password_sync() for the synchronous, blocking version of this method. ++ */ ++void ++gsd_accounts_user_call_set_password ( ++ GsdAccountsUser *proxy, ++ const gchar *arg_password, ++ const gchar *arg_hint, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data) ++{ ++ g_dbus_proxy_call (G_DBUS_PROXY (proxy), ++ "SetPassword", ++ g_variant_new ("(ss)", ++ arg_password, ++ arg_hint), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancellable, ++ callback, ++ user_data); ++} ++ ++/** ++ * gsd_accounts_user_call_set_password_finish: ++ * @proxy: A #GsdAccountsUserProxy. ++ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to gsd_accounts_user_call_set_password(). ++ * @error: Return location for error or %NULL. ++ * ++ * Finishes an operation started with gsd_accounts_user_call_set_password(). ++ * ++ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. ++ */ ++gboolean ++gsd_accounts_user_call_set_password_finish ( ++ GsdAccountsUser *proxy, ++ GAsyncResult *res, ++ GError **error) ++{ ++ GVariant *_ret; ++ _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); ++ if (_ret == NULL) ++ goto _out; ++ g_variant_get (_ret, ++ "()"); ++ g_variant_unref (_ret); ++_out: ++ return _ret != NULL; ++} ++ ++/** ++ * gsd_accounts_user_call_set_password_sync: ++ * @proxy: A #GsdAccountsUserProxy. ++ * @arg_password: Argument to pass with the method invocation. ++ * @arg_hint: Argument to pass with the method invocation. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @error: Return location for error or %NULL. ++ * ++ * Synchronously invokes the SetPassword() D-Bus method on @proxy. The calling thread is blocked until a reply is received. ++ * ++ * See gsd_accounts_user_call_set_password() for the asynchronous version of this method. ++ * ++ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. ++ */ ++gboolean ++gsd_accounts_user_call_set_password_sync ( ++ GsdAccountsUser *proxy, ++ const gchar *arg_password, ++ const gchar *arg_hint, ++ GCancellable *cancellable, ++ GError **error) ++{ ++ GVariant *_ret; ++ _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), ++ "SetPassword", ++ g_variant_new ("(ss)", ++ arg_password, ++ arg_hint), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancellable, ++ error); ++ if (_ret == NULL) ++ goto _out; ++ g_variant_get (_ret, ++ "()"); ++ g_variant_unref (_ret); ++_out: ++ return _ret != NULL; ++} ++ ++/** ++ * gsd_accounts_user_call_set_password_hint: ++ * @proxy: A #GsdAccountsUserProxy. ++ * @arg_hint: Argument to pass with the method invocation. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. ++ * @user_data: User data to pass to @callback. ++ * ++ * Asynchronously invokes the SetPasswordHint() D-Bus method on @proxy. ++ * When the operation is finished, @callback will be invoked in the thread-default main loop of the thread you are calling this method from. ++ * You can then call gsd_accounts_user_call_set_password_hint_finish() to get the result of the operation. ++ * ++ * See gsd_accounts_user_call_set_password_hint_sync() for the synchronous, blocking version of this method. ++ */ ++void ++gsd_accounts_user_call_set_password_hint ( ++ GsdAccountsUser *proxy, ++ const gchar *arg_hint, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data) ++{ ++ g_dbus_proxy_call (G_DBUS_PROXY (proxy), ++ "SetPasswordHint", ++ g_variant_new ("(s)", ++ arg_hint), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancellable, ++ callback, ++ user_data); ++} ++ ++/** ++ * gsd_accounts_user_call_set_password_hint_finish: ++ * @proxy: A #GsdAccountsUserProxy. ++ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to gsd_accounts_user_call_set_password_hint(). ++ * @error: Return location for error or %NULL. ++ * ++ * Finishes an operation started with gsd_accounts_user_call_set_password_hint(). ++ * ++ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. ++ */ ++gboolean ++gsd_accounts_user_call_set_password_hint_finish ( ++ GsdAccountsUser *proxy, ++ GAsyncResult *res, ++ GError **error) ++{ ++ GVariant *_ret; ++ _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); ++ if (_ret == NULL) ++ goto _out; ++ g_variant_get (_ret, ++ "()"); ++ g_variant_unref (_ret); ++_out: ++ return _ret != NULL; ++} ++ ++/** ++ * gsd_accounts_user_call_set_password_hint_sync: ++ * @proxy: A #GsdAccountsUserProxy. ++ * @arg_hint: Argument to pass with the method invocation. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @error: Return location for error or %NULL. ++ * ++ * Synchronously invokes the SetPasswordHint() D-Bus method on @proxy. The calling thread is blocked until a reply is received. ++ * ++ * See gsd_accounts_user_call_set_password_hint() for the asynchronous version of this method. ++ * ++ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. ++ */ ++gboolean ++gsd_accounts_user_call_set_password_hint_sync ( ++ GsdAccountsUser *proxy, ++ const gchar *arg_hint, ++ GCancellable *cancellable, ++ GError **error) ++{ ++ GVariant *_ret; ++ _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), ++ "SetPasswordHint", ++ g_variant_new ("(s)", ++ arg_hint), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancellable, ++ error); ++ if (_ret == NULL) ++ goto _out; ++ g_variant_get (_ret, ++ "()"); ++ g_variant_unref (_ret); ++_out: ++ return _ret != NULL; ++} ++ ++/** ++ * gsd_accounts_user_call_set_automatic_login: ++ * @proxy: A #GsdAccountsUserProxy. ++ * @arg_enabled: Argument to pass with the method invocation. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. ++ * @user_data: User data to pass to @callback. ++ * ++ * Asynchronously invokes the SetAutomaticLogin() D-Bus method on @proxy. ++ * When the operation is finished, @callback will be invoked in the thread-default main loop of the thread you are calling this method from. ++ * You can then call gsd_accounts_user_call_set_automatic_login_finish() to get the result of the operation. ++ * ++ * See gsd_accounts_user_call_set_automatic_login_sync() for the synchronous, blocking version of this method. ++ */ ++void ++gsd_accounts_user_call_set_automatic_login ( ++ GsdAccountsUser *proxy, ++ gboolean arg_enabled, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data) ++{ ++ g_dbus_proxy_call (G_DBUS_PROXY (proxy), ++ "SetAutomaticLogin", ++ g_variant_new ("(b)", ++ arg_enabled), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancellable, ++ callback, ++ user_data); ++} ++ ++/** ++ * gsd_accounts_user_call_set_automatic_login_finish: ++ * @proxy: A #GsdAccountsUserProxy. ++ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to gsd_accounts_user_call_set_automatic_login(). ++ * @error: Return location for error or %NULL. ++ * ++ * Finishes an operation started with gsd_accounts_user_call_set_automatic_login(). ++ * ++ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. ++ */ ++gboolean ++gsd_accounts_user_call_set_automatic_login_finish ( ++ GsdAccountsUser *proxy, ++ GAsyncResult *res, ++ GError **error) ++{ ++ GVariant *_ret; ++ _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); ++ if (_ret == NULL) ++ goto _out; ++ g_variant_get (_ret, ++ "()"); ++ g_variant_unref (_ret); ++_out: ++ return _ret != NULL; ++} ++ ++/** ++ * gsd_accounts_user_call_set_automatic_login_sync: ++ * @proxy: A #GsdAccountsUserProxy. ++ * @arg_enabled: Argument to pass with the method invocation. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @error: Return location for error or %NULL. ++ * ++ * Synchronously invokes the SetAutomaticLogin() D-Bus method on @proxy. The calling thread is blocked until a reply is received. ++ * ++ * See gsd_accounts_user_call_set_automatic_login() for the asynchronous version of this method. ++ * ++ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. ++ */ ++gboolean ++gsd_accounts_user_call_set_automatic_login_sync ( ++ GsdAccountsUser *proxy, ++ gboolean arg_enabled, ++ GCancellable *cancellable, ++ GError **error) ++{ ++ GVariant *_ret; ++ _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), ++ "SetAutomaticLogin", ++ g_variant_new ("(b)", ++ arg_enabled), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancellable, ++ error); ++ if (_ret == NULL) ++ goto _out; ++ g_variant_get (_ret, ++ "()"); ++ g_variant_unref (_ret); ++_out: ++ return _ret != NULL; ++} ++ ++/** ++ * gsd_accounts_user_call_get_password_expiration_policy: ++ * @proxy: A #GsdAccountsUserProxy. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. ++ * @user_data: User data to pass to @callback. ++ * ++ * Asynchronously invokes the GetPasswordExpirationPolicy() D-Bus method on @proxy. ++ * When the operation is finished, @callback will be invoked in the thread-default main loop of the thread you are calling this method from. ++ * You can then call gsd_accounts_user_call_get_password_expiration_policy_finish() to get the result of the operation. ++ * ++ * See gsd_accounts_user_call_get_password_expiration_policy_sync() for the synchronous, blocking version of this method. ++ */ ++void ++gsd_accounts_user_call_get_password_expiration_policy ( ++ GsdAccountsUser *proxy, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data) ++{ ++ g_dbus_proxy_call (G_DBUS_PROXY (proxy), ++ "GetPasswordExpirationPolicy", ++ g_variant_new ("()"), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancellable, ++ callback, ++ user_data); ++} ++ ++/** ++ * gsd_accounts_user_call_get_password_expiration_policy_finish: ++ * @proxy: A #GsdAccountsUserProxy. ++ * @out_expiration_time: (out): Return location for return parameter or %NULL to ignore. ++ * @out_last_change_time: (out): Return location for return parameter or %NULL to ignore. ++ * @out_min_days_between_changes: (out): Return location for return parameter or %NULL to ignore. ++ * @out_max_days_between_changes: (out): Return location for return parameter or %NULL to ignore. ++ * @out_days_to_warn: (out): Return location for return parameter or %NULL to ignore. ++ * @out_days_after_expiration_until_lock: (out): Return location for return parameter or %NULL to ignore. ++ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to gsd_accounts_user_call_get_password_expiration_policy(). ++ * @error: Return location for error or %NULL. ++ * ++ * Finishes an operation started with gsd_accounts_user_call_get_password_expiration_policy(). ++ * ++ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. ++ */ ++gboolean ++gsd_accounts_user_call_get_password_expiration_policy_finish ( ++ GsdAccountsUser *proxy, ++ gint64 *out_expiration_time, ++ gint64 *out_last_change_time, ++ gint64 *out_min_days_between_changes, ++ gint64 *out_max_days_between_changes, ++ gint64 *out_days_to_warn, ++ gint64 *out_days_after_expiration_until_lock, ++ GAsyncResult *res, ++ GError **error) ++{ ++ GVariant *_ret; ++ _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); ++ if (_ret == NULL) ++ goto _out; ++ g_variant_get (_ret, ++ "(xxxxxx)", ++ out_expiration_time, ++ out_last_change_time, ++ out_min_days_between_changes, ++ out_max_days_between_changes, ++ out_days_to_warn, ++ out_days_after_expiration_until_lock); ++ g_variant_unref (_ret); ++_out: ++ return _ret != NULL; ++} ++ ++/** ++ * gsd_accounts_user_call_get_password_expiration_policy_sync: ++ * @proxy: A #GsdAccountsUserProxy. ++ * @out_expiration_time: (out): Return location for return parameter or %NULL to ignore. ++ * @out_last_change_time: (out): Return location for return parameter or %NULL to ignore. ++ * @out_min_days_between_changes: (out): Return location for return parameter or %NULL to ignore. ++ * @out_max_days_between_changes: (out): Return location for return parameter or %NULL to ignore. ++ * @out_days_to_warn: (out): Return location for return parameter or %NULL to ignore. ++ * @out_days_after_expiration_until_lock: (out): Return location for return parameter or %NULL to ignore. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @error: Return location for error or %NULL. ++ * ++ * Synchronously invokes the GetPasswordExpirationPolicy() D-Bus method on @proxy. The calling thread is blocked until a reply is received. ++ * ++ * See gsd_accounts_user_call_get_password_expiration_policy() for the asynchronous version of this method. ++ * ++ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. ++ */ ++gboolean ++gsd_accounts_user_call_get_password_expiration_policy_sync ( ++ GsdAccountsUser *proxy, ++ gint64 *out_expiration_time, ++ gint64 *out_last_change_time, ++ gint64 *out_min_days_between_changes, ++ gint64 *out_max_days_between_changes, ++ gint64 *out_days_to_warn, ++ gint64 *out_days_after_expiration_until_lock, ++ GCancellable *cancellable, ++ GError **error) ++{ ++ GVariant *_ret; ++ _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), ++ "GetPasswordExpirationPolicy", ++ g_variant_new ("()"), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancellable, ++ error); ++ if (_ret == NULL) ++ goto _out; ++ g_variant_get (_ret, ++ "(xxxxxx)", ++ out_expiration_time, ++ out_last_change_time, ++ out_min_days_between_changes, ++ out_max_days_between_changes, ++ out_days_to_warn, ++ out_days_after_expiration_until_lock); ++ g_variant_unref (_ret); ++_out: ++ return _ret != NULL; ++} ++ ++/** ++ * gsd_accounts_user_complete_set_user_name: ++ * @object: A #GsdAccountsUser. ++ * @invocation: (transfer full): A #GDBusMethodInvocation. ++ * ++ * Helper function used in service implementations to finish handling invocations of the SetUserName() D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. ++ * ++ * This method will free @invocation, you cannot use it afterwards. ++ */ ++void ++gsd_accounts_user_complete_set_user_name ( ++ GsdAccountsUser *object, ++ GDBusMethodInvocation *invocation) ++{ ++ g_dbus_method_invocation_return_value (invocation, ++ g_variant_new ("()")); ++} ++ ++/** ++ * gsd_accounts_user_complete_set_real_name: ++ * @object: A #GsdAccountsUser. ++ * @invocation: (transfer full): A #GDBusMethodInvocation. ++ * ++ * Helper function used in service implementations to finish handling invocations of the SetRealName() D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. ++ * ++ * This method will free @invocation, you cannot use it afterwards. ++ */ ++void ++gsd_accounts_user_complete_set_real_name ( ++ GsdAccountsUser *object, ++ GDBusMethodInvocation *invocation) ++{ ++ g_dbus_method_invocation_return_value (invocation, ++ g_variant_new ("()")); ++} ++ ++/** ++ * gsd_accounts_user_complete_set_email: ++ * @object: A #GsdAccountsUser. ++ * @invocation: (transfer full): A #GDBusMethodInvocation. ++ * ++ * Helper function used in service implementations to finish handling invocations of the SetEmail() D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. ++ * ++ * This method will free @invocation, you cannot use it afterwards. ++ */ ++void ++gsd_accounts_user_complete_set_email ( ++ GsdAccountsUser *object, ++ GDBusMethodInvocation *invocation) ++{ ++ g_dbus_method_invocation_return_value (invocation, ++ g_variant_new ("()")); ++} ++ ++/** ++ * gsd_accounts_user_complete_set_language: ++ * @object: A #GsdAccountsUser. ++ * @invocation: (transfer full): A #GDBusMethodInvocation. ++ * ++ * Helper function used in service implementations to finish handling invocations of the SetLanguage() D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. ++ * ++ * This method will free @invocation, you cannot use it afterwards. ++ */ ++void ++gsd_accounts_user_complete_set_language ( ++ GsdAccountsUser *object, ++ GDBusMethodInvocation *invocation) ++{ ++ g_dbus_method_invocation_return_value (invocation, ++ g_variant_new ("()")); ++} ++ ++/** ++ * gsd_accounts_user_complete_set_xsession: ++ * @object: A #GsdAccountsUser. ++ * @invocation: (transfer full): A #GDBusMethodInvocation. ++ * ++ * Helper function used in service implementations to finish handling invocations of the SetXSession() D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. ++ * ++ * This method will free @invocation, you cannot use it afterwards. ++ */ ++void ++gsd_accounts_user_complete_set_xsession ( ++ GsdAccountsUser *object, ++ GDBusMethodInvocation *invocation) ++{ ++ g_dbus_method_invocation_return_value (invocation, ++ g_variant_new ("()")); ++} ++ ++/** ++ * gsd_accounts_user_complete_set_location: ++ * @object: A #GsdAccountsUser. ++ * @invocation: (transfer full): A #GDBusMethodInvocation. ++ * ++ * Helper function used in service implementations to finish handling invocations of the SetLocation() D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. ++ * ++ * This method will free @invocation, you cannot use it afterwards. ++ */ ++void ++gsd_accounts_user_complete_set_location ( ++ GsdAccountsUser *object, ++ GDBusMethodInvocation *invocation) ++{ ++ g_dbus_method_invocation_return_value (invocation, ++ g_variant_new ("()")); ++} ++ ++/** ++ * gsd_accounts_user_complete_set_home_directory: ++ * @object: A #GsdAccountsUser. ++ * @invocation: (transfer full): A #GDBusMethodInvocation. ++ * ++ * Helper function used in service implementations to finish handling invocations of the SetHomeDirectory() D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. ++ * ++ * This method will free @invocation, you cannot use it afterwards. ++ */ ++void ++gsd_accounts_user_complete_set_home_directory ( ++ GsdAccountsUser *object, ++ GDBusMethodInvocation *invocation) ++{ ++ g_dbus_method_invocation_return_value (invocation, ++ g_variant_new ("()")); ++} ++ ++/** ++ * gsd_accounts_user_complete_set_shell: ++ * @object: A #GsdAccountsUser. ++ * @invocation: (transfer full): A #GDBusMethodInvocation. ++ * ++ * Helper function used in service implementations to finish handling invocations of the SetShell() D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. ++ * ++ * This method will free @invocation, you cannot use it afterwards. ++ */ ++void ++gsd_accounts_user_complete_set_shell ( ++ GsdAccountsUser *object, ++ GDBusMethodInvocation *invocation) ++{ ++ g_dbus_method_invocation_return_value (invocation, ++ g_variant_new ("()")); ++} ++ ++/** ++ * gsd_accounts_user_complete_set_icon_file: ++ * @object: A #GsdAccountsUser. ++ * @invocation: (transfer full): A #GDBusMethodInvocation. ++ * ++ * Helper function used in service implementations to finish handling invocations of the SetIconFile() D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. ++ * ++ * This method will free @invocation, you cannot use it afterwards. ++ */ ++void ++gsd_accounts_user_complete_set_icon_file ( ++ GsdAccountsUser *object, ++ GDBusMethodInvocation *invocation) ++{ ++ g_dbus_method_invocation_return_value (invocation, ++ g_variant_new ("()")); ++} ++ ++/** ++ * gsd_accounts_user_complete_set_locked: ++ * @object: A #GsdAccountsUser. ++ * @invocation: (transfer full): A #GDBusMethodInvocation. ++ * ++ * Helper function used in service implementations to finish handling invocations of the SetLocked() D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. ++ * ++ * This method will free @invocation, you cannot use it afterwards. ++ */ ++void ++gsd_accounts_user_complete_set_locked ( ++ GsdAccountsUser *object, ++ GDBusMethodInvocation *invocation) ++{ ++ g_dbus_method_invocation_return_value (invocation, ++ g_variant_new ("()")); ++} ++ ++/** ++ * gsd_accounts_user_complete_set_account_type: ++ * @object: A #GsdAccountsUser. ++ * @invocation: (transfer full): A #GDBusMethodInvocation. ++ * ++ * Helper function used in service implementations to finish handling invocations of the SetAccountType() D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. ++ * ++ * This method will free @invocation, you cannot use it afterwards. ++ */ ++void ++gsd_accounts_user_complete_set_account_type ( ++ GsdAccountsUser *object, ++ GDBusMethodInvocation *invocation) ++{ ++ g_dbus_method_invocation_return_value (invocation, ++ g_variant_new ("()")); ++} ++ ++/** ++ * gsd_accounts_user_complete_set_password_mode: ++ * @object: A #GsdAccountsUser. ++ * @invocation: (transfer full): A #GDBusMethodInvocation. ++ * ++ * Helper function used in service implementations to finish handling invocations of the SetPasswordMode() D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. ++ * ++ * This method will free @invocation, you cannot use it afterwards. ++ */ ++void ++gsd_accounts_user_complete_set_password_mode ( ++ GsdAccountsUser *object, ++ GDBusMethodInvocation *invocation) ++{ ++ g_dbus_method_invocation_return_value (invocation, ++ g_variant_new ("()")); ++} ++ ++/** ++ * gsd_accounts_user_complete_set_password: ++ * @object: A #GsdAccountsUser. ++ * @invocation: (transfer full): A #GDBusMethodInvocation. ++ * ++ * Helper function used in service implementations to finish handling invocations of the SetPassword() D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. ++ * ++ * This method will free @invocation, you cannot use it afterwards. ++ */ ++void ++gsd_accounts_user_complete_set_password ( ++ GsdAccountsUser *object, ++ GDBusMethodInvocation *invocation) ++{ ++ g_dbus_method_invocation_return_value (invocation, ++ g_variant_new ("()")); ++} ++ ++/** ++ * gsd_accounts_user_complete_set_password_hint: ++ * @object: A #GsdAccountsUser. ++ * @invocation: (transfer full): A #GDBusMethodInvocation. ++ * ++ * Helper function used in service implementations to finish handling invocations of the SetPasswordHint() D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. ++ * ++ * This method will free @invocation, you cannot use it afterwards. ++ */ ++void ++gsd_accounts_user_complete_set_password_hint ( ++ GsdAccountsUser *object, ++ GDBusMethodInvocation *invocation) ++{ ++ g_dbus_method_invocation_return_value (invocation, ++ g_variant_new ("()")); ++} ++ ++/** ++ * gsd_accounts_user_complete_set_automatic_login: ++ * @object: A #GsdAccountsUser. ++ * @invocation: (transfer full): A #GDBusMethodInvocation. ++ * ++ * Helper function used in service implementations to finish handling invocations of the SetAutomaticLogin() D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. ++ * ++ * This method will free @invocation, you cannot use it afterwards. ++ */ ++void ++gsd_accounts_user_complete_set_automatic_login ( ++ GsdAccountsUser *object, ++ GDBusMethodInvocation *invocation) ++{ ++ g_dbus_method_invocation_return_value (invocation, ++ g_variant_new ("()")); ++} ++ ++/** ++ * gsd_accounts_user_complete_get_password_expiration_policy: ++ * @object: A #GsdAccountsUser. ++ * @invocation: (transfer full): A #GDBusMethodInvocation. ++ * @expiration_time: Parameter to return. ++ * @last_change_time: Parameter to return. ++ * @min_days_between_changes: Parameter to return. ++ * @max_days_between_changes: Parameter to return. ++ * @days_to_warn: Parameter to return. ++ * @days_after_expiration_until_lock: Parameter to return. ++ * ++ * Helper function used in service implementations to finish handling invocations of the GetPasswordExpirationPolicy() D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. ++ * ++ * This method will free @invocation, you cannot use it afterwards. ++ */ ++void ++gsd_accounts_user_complete_get_password_expiration_policy ( ++ GsdAccountsUser *object, ++ GDBusMethodInvocation *invocation, ++ gint64 expiration_time, ++ gint64 last_change_time, ++ gint64 min_days_between_changes, ++ gint64 max_days_between_changes, ++ gint64 days_to_warn, ++ gint64 days_after_expiration_until_lock) ++{ ++ g_dbus_method_invocation_return_value (invocation, ++ g_variant_new ("(xxxxxx)", ++ expiration_time, ++ last_change_time, ++ min_days_between_changes, ++ max_days_between_changes, ++ days_to_warn, ++ days_after_expiration_until_lock)); ++} ++ ++/* ------------------------------------------------------------------------ */ ++ ++/** ++ * GsdAccountsUserProxy: ++ * ++ * The #GsdAccountsUserProxy structure contains only private data and should only be accessed using the provided API. ++ */ ++ ++/** ++ * GsdAccountsUserProxyClass: ++ * @parent_class: The parent class. ++ * ++ * Class structure for #GsdAccountsUserProxy. ++ */ ++ ++struct _GsdAccountsUserProxyPrivate ++{ ++ GData *qdata; ++}; ++ ++static void gsd_accounts_user_proxy_iface_init (GsdAccountsUserIface *iface); ++ ++#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38 ++G_DEFINE_TYPE_WITH_CODE (GsdAccountsUserProxy, gsd_accounts_user_proxy, G_TYPE_DBUS_PROXY, ++ G_ADD_PRIVATE (GsdAccountsUserProxy) ++ G_IMPLEMENT_INTERFACE (GSD_TYPE_ACCOUNTS_USER, gsd_accounts_user_proxy_iface_init)) ++ ++#else ++G_DEFINE_TYPE_WITH_CODE (GsdAccountsUserProxy, gsd_accounts_user_proxy, G_TYPE_DBUS_PROXY, ++ G_IMPLEMENT_INTERFACE (GSD_TYPE_ACCOUNTS_USER, gsd_accounts_user_proxy_iface_init)) ++ ++#endif ++static void ++gsd_accounts_user_proxy_finalize (GObject *object) ++{ ++ GsdAccountsUserProxy *proxy = GSD_ACCOUNTS_USER_PROXY (object); ++ g_datalist_clear (&proxy->priv->qdata); ++ G_OBJECT_CLASS (gsd_accounts_user_proxy_parent_class)->finalize (object); ++} ++ ++static void ++gsd_accounts_user_proxy_get_property (GObject *object, ++ guint prop_id, ++ GValue *value, ++ GParamSpec *pspec G_GNUC_UNUSED) ++{ ++ const _ExtendedGDBusPropertyInfo *info; ++ GVariant *variant; ++ g_assert (prop_id != 0 && prop_id - 1 < 20); ++ info = _gsd_accounts_user_property_info_pointers[prop_id - 1]; ++ variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (object), info->parent_struct.name); ++ if (info->use_gvariant) ++ { ++ g_value_set_variant (value, variant); ++ } ++ else ++ { ++ if (variant != NULL) ++ g_dbus_gvariant_to_gvalue (variant, value); ++ } ++ if (variant != NULL) ++ g_variant_unref (variant); ++} ++ ++static void ++gsd_accounts_user_proxy_set_property_cb (GDBusProxy *proxy, ++ GAsyncResult *res, ++ gpointer user_data) ++{ ++ const _ExtendedGDBusPropertyInfo *info = user_data; ++ GError *error; ++ GVariant *_ret; ++ error = NULL; ++ _ret = g_dbus_proxy_call_finish (proxy, res, &error); ++ if (!_ret) ++ { ++ g_warning ("Error setting property '%s' on interface org.freedesktop.Accounts.User: %s (%s, %d)", ++ info->parent_struct.name, ++ error->message, g_quark_to_string (error->domain), error->code); ++ g_error_free (error); ++ } ++ else ++ { ++ g_variant_unref (_ret); ++ } ++} ++ ++static void ++gsd_accounts_user_proxy_set_property (GObject *object, ++ guint prop_id, ++ const GValue *value, ++ GParamSpec *pspec G_GNUC_UNUSED) ++{ ++ const _ExtendedGDBusPropertyInfo *info; ++ GVariant *variant; ++ g_assert (prop_id != 0 && prop_id - 1 < 20); ++ info = _gsd_accounts_user_property_info_pointers[prop_id - 1]; ++ variant = g_dbus_gvalue_to_gvariant (value, G_VARIANT_TYPE (info->parent_struct.signature)); ++ g_dbus_proxy_call (G_DBUS_PROXY (object), ++ "org.freedesktop.DBus.Properties.Set", ++ g_variant_new ("(ssv)", "org.freedesktop.Accounts.User", info->parent_struct.name, variant), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ NULL, (GAsyncReadyCallback) gsd_accounts_user_proxy_set_property_cb, (GDBusPropertyInfo *) &info->parent_struct); ++ g_variant_unref (variant); ++} ++ ++static void ++gsd_accounts_user_proxy_g_signal (GDBusProxy *proxy, ++ const gchar *sender_name G_GNUC_UNUSED, ++ const gchar *signal_name, ++ GVariant *parameters) ++{ ++ _ExtendedGDBusSignalInfo *info; ++ GVariantIter iter; ++ GVariant *child; ++ GValue *paramv; ++ gsize num_params; ++ gsize n; ++ guint signal_id; ++ info = (_ExtendedGDBusSignalInfo *) g_dbus_interface_info_lookup_signal ((GDBusInterfaceInfo *) &_gsd_accounts_user_interface_info.parent_struct, signal_name); ++ if (info == NULL) ++ return; ++ num_params = g_variant_n_children (parameters); ++ paramv = g_new0 (GValue, num_params + 1); ++ g_value_init (¶mv[0], GSD_TYPE_ACCOUNTS_USER); ++ g_value_set_object (¶mv[0], proxy); ++ g_variant_iter_init (&iter, parameters); ++ n = 1; ++ while ((child = g_variant_iter_next_value (&iter)) != NULL) ++ { ++ _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.args[n - 1]; ++ if (arg_info->use_gvariant) ++ { ++ g_value_init (¶mv[n], G_TYPE_VARIANT); ++ g_value_set_variant (¶mv[n], child); ++ n++; ++ } ++ else ++ g_dbus_gvariant_to_gvalue (child, ¶mv[n++]); ++ g_variant_unref (child); ++ } ++ signal_id = g_signal_lookup (info->signal_name, GSD_TYPE_ACCOUNTS_USER); ++ g_signal_emitv (paramv, signal_id, 0, NULL); ++ for (n = 0; n < num_params + 1; n++) ++ g_value_unset (¶mv[n]); ++ g_free (paramv); ++} ++ ++static void ++gsd_accounts_user_proxy_g_properties_changed (GDBusProxy *_proxy, ++ GVariant *changed_properties, ++ const gchar *const *invalidated_properties) ++{ ++ GsdAccountsUserProxy *proxy = GSD_ACCOUNTS_USER_PROXY (_proxy); ++ guint n; ++ const gchar *key; ++ GVariantIter *iter; ++ _ExtendedGDBusPropertyInfo *info; ++ g_variant_get (changed_properties, "a{sv}", &iter); ++ while (g_variant_iter_next (iter, "{&sv}", &key, NULL)) ++ { ++ info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_gsd_accounts_user_interface_info.parent_struct, key); ++ g_datalist_remove_data (&proxy->priv->qdata, key); ++ if (info != NULL) ++ g_object_notify (G_OBJECT (proxy), info->hyphen_name); ++ } ++ g_variant_iter_free (iter); ++ for (n = 0; invalidated_properties[n] != NULL; n++) ++ { ++ info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_gsd_accounts_user_interface_info.parent_struct, invalidated_properties[n]); ++ g_datalist_remove_data (&proxy->priv->qdata, invalidated_properties[n]); ++ if (info != NULL) ++ g_object_notify (G_OBJECT (proxy), info->hyphen_name); ++ } ++} ++ ++static guint64 ++gsd_accounts_user_proxy_get_uid (GsdAccountsUser *object) ++{ ++ GsdAccountsUserProxy *proxy = GSD_ACCOUNTS_USER_PROXY (object); ++ GVariant *variant; ++ guint64 value = 0; ++ variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "Uid"); ++ if (variant != NULL) ++ { ++ value = g_variant_get_uint64 (variant); ++ g_variant_unref (variant); ++ } ++ return value; ++} ++ ++static const gchar * ++gsd_accounts_user_proxy_get_user_name (GsdAccountsUser *object) ++{ ++ GsdAccountsUserProxy *proxy = GSD_ACCOUNTS_USER_PROXY (object); ++ GVariant *variant; ++ const gchar *value = NULL; ++ variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "UserName"); ++ if (variant != NULL) ++ { ++ value = g_variant_get_string (variant, NULL); ++ g_variant_unref (variant); ++ } ++ return value; ++} ++ ++static const gchar * ++gsd_accounts_user_proxy_get_real_name (GsdAccountsUser *object) ++{ ++ GsdAccountsUserProxy *proxy = GSD_ACCOUNTS_USER_PROXY (object); ++ GVariant *variant; ++ const gchar *value = NULL; ++ variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "RealName"); ++ if (variant != NULL) ++ { ++ value = g_variant_get_string (variant, NULL); ++ g_variant_unref (variant); ++ } ++ return value; ++} ++ ++static gint ++gsd_accounts_user_proxy_get_account_type (GsdAccountsUser *object) ++{ ++ GsdAccountsUserProxy *proxy = GSD_ACCOUNTS_USER_PROXY (object); ++ GVariant *variant; ++ gint value = 0; ++ variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "AccountType"); ++ if (variant != NULL) ++ { ++ value = g_variant_get_int32 (variant); ++ g_variant_unref (variant); ++ } ++ return value; ++} ++ ++static const gchar * ++gsd_accounts_user_proxy_get_home_directory (GsdAccountsUser *object) ++{ ++ GsdAccountsUserProxy *proxy = GSD_ACCOUNTS_USER_PROXY (object); ++ GVariant *variant; ++ const gchar *value = NULL; ++ variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "HomeDirectory"); ++ if (variant != NULL) ++ { ++ value = g_variant_get_string (variant, NULL); ++ g_variant_unref (variant); ++ } ++ return value; ++} ++ ++static const gchar * ++gsd_accounts_user_proxy_get_shell (GsdAccountsUser *object) ++{ ++ GsdAccountsUserProxy *proxy = GSD_ACCOUNTS_USER_PROXY (object); ++ GVariant *variant; ++ const gchar *value = NULL; ++ variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "Shell"); ++ if (variant != NULL) ++ { ++ value = g_variant_get_string (variant, NULL); ++ g_variant_unref (variant); ++ } ++ return value; ++} ++ ++static const gchar * ++gsd_accounts_user_proxy_get_email (GsdAccountsUser *object) ++{ ++ GsdAccountsUserProxy *proxy = GSD_ACCOUNTS_USER_PROXY (object); ++ GVariant *variant; ++ const gchar *value = NULL; ++ variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "Email"); ++ if (variant != NULL) ++ { ++ value = g_variant_get_string (variant, NULL); ++ g_variant_unref (variant); ++ } ++ return value; ++} ++ ++static const gchar * ++gsd_accounts_user_proxy_get_language (GsdAccountsUser *object) ++{ ++ GsdAccountsUserProxy *proxy = GSD_ACCOUNTS_USER_PROXY (object); ++ GVariant *variant; ++ const gchar *value = NULL; ++ variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "Language"); ++ if (variant != NULL) ++ { ++ value = g_variant_get_string (variant, NULL); ++ g_variant_unref (variant); ++ } ++ return value; ++} ++ ++static const gchar * ++gsd_accounts_user_proxy_get_xsession (GsdAccountsUser *object) ++{ ++ GsdAccountsUserProxy *proxy = GSD_ACCOUNTS_USER_PROXY (object); ++ GVariant *variant; ++ const gchar *value = NULL; ++ variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "XSession"); ++ if (variant != NULL) ++ { ++ value = g_variant_get_string (variant, NULL); ++ g_variant_unref (variant); ++ } ++ return value; ++} ++ ++static const gchar * ++gsd_accounts_user_proxy_get_location (GsdAccountsUser *object) ++{ ++ GsdAccountsUserProxy *proxy = GSD_ACCOUNTS_USER_PROXY (object); ++ GVariant *variant; ++ const gchar *value = NULL; ++ variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "Location"); ++ if (variant != NULL) ++ { ++ value = g_variant_get_string (variant, NULL); ++ g_variant_unref (variant); ++ } ++ return value; ++} ++ ++static guint64 ++gsd_accounts_user_proxy_get_login_frequency (GsdAccountsUser *object) ++{ ++ GsdAccountsUserProxy *proxy = GSD_ACCOUNTS_USER_PROXY (object); ++ GVariant *variant; ++ guint64 value = 0; ++ variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "LoginFrequency"); ++ if (variant != NULL) ++ { ++ value = g_variant_get_uint64 (variant); ++ g_variant_unref (variant); ++ } ++ return value; ++} ++ ++static gint64 ++gsd_accounts_user_proxy_get_login_time (GsdAccountsUser *object) ++{ ++ GsdAccountsUserProxy *proxy = GSD_ACCOUNTS_USER_PROXY (object); ++ GVariant *variant; ++ gint64 value = 0; ++ variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "LoginTime"); ++ if (variant != NULL) ++ { ++ value = g_variant_get_int64 (variant); ++ g_variant_unref (variant); ++ } ++ return value; ++} ++ ++static GVariant * ++gsd_accounts_user_proxy_get_login_history (GsdAccountsUser *object) ++{ ++ GsdAccountsUserProxy *proxy = GSD_ACCOUNTS_USER_PROXY (object); ++ GVariant *variant; ++ GVariant *value = NULL; ++ variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "LoginHistory"); ++ value = variant; ++ if (variant != NULL) ++ g_variant_unref (variant); ++ return value; ++} ++ ++static const gchar * ++gsd_accounts_user_proxy_get_icon_file (GsdAccountsUser *object) ++{ ++ GsdAccountsUserProxy *proxy = GSD_ACCOUNTS_USER_PROXY (object); ++ GVariant *variant; ++ const gchar *value = NULL; ++ variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "IconFile"); ++ if (variant != NULL) ++ { ++ value = g_variant_get_string (variant, NULL); ++ g_variant_unref (variant); ++ } ++ return value; ++} ++ ++static gboolean ++gsd_accounts_user_proxy_get_locked (GsdAccountsUser *object) ++{ ++ GsdAccountsUserProxy *proxy = GSD_ACCOUNTS_USER_PROXY (object); ++ GVariant *variant; ++ gboolean value = 0; ++ variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "Locked"); ++ if (variant != NULL) ++ { ++ value = g_variant_get_boolean (variant); ++ g_variant_unref (variant); ++ } ++ return value; ++} ++ ++static gint ++gsd_accounts_user_proxy_get_password_mode (GsdAccountsUser *object) ++{ ++ GsdAccountsUserProxy *proxy = GSD_ACCOUNTS_USER_PROXY (object); ++ GVariant *variant; ++ gint value = 0; ++ variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "PasswordMode"); ++ if (variant != NULL) ++ { ++ value = g_variant_get_int32 (variant); ++ g_variant_unref (variant); ++ } ++ return value; ++} ++ ++static const gchar * ++gsd_accounts_user_proxy_get_password_hint (GsdAccountsUser *object) ++{ ++ GsdAccountsUserProxy *proxy = GSD_ACCOUNTS_USER_PROXY (object); ++ GVariant *variant; ++ const gchar *value = NULL; ++ variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "PasswordHint"); ++ if (variant != NULL) ++ { ++ value = g_variant_get_string (variant, NULL); ++ g_variant_unref (variant); ++ } ++ return value; ++} ++ ++static gboolean ++gsd_accounts_user_proxy_get_automatic_login (GsdAccountsUser *object) ++{ ++ GsdAccountsUserProxy *proxy = GSD_ACCOUNTS_USER_PROXY (object); ++ GVariant *variant; ++ gboolean value = 0; ++ variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "AutomaticLogin"); ++ if (variant != NULL) ++ { ++ value = g_variant_get_boolean (variant); ++ g_variant_unref (variant); ++ } ++ return value; ++} ++ ++static gboolean ++gsd_accounts_user_proxy_get_system_account (GsdAccountsUser *object) ++{ ++ GsdAccountsUserProxy *proxy = GSD_ACCOUNTS_USER_PROXY (object); ++ GVariant *variant; ++ gboolean value = 0; ++ variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "SystemAccount"); ++ if (variant != NULL) ++ { ++ value = g_variant_get_boolean (variant); ++ g_variant_unref (variant); ++ } ++ return value; ++} ++ ++static gboolean ++gsd_accounts_user_proxy_get_local_account (GsdAccountsUser *object) ++{ ++ GsdAccountsUserProxy *proxy = GSD_ACCOUNTS_USER_PROXY (object); ++ GVariant *variant; ++ gboolean value = 0; ++ variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "LocalAccount"); ++ if (variant != NULL) ++ { ++ value = g_variant_get_boolean (variant); ++ g_variant_unref (variant); ++ } ++ return value; ++} ++ ++static void ++gsd_accounts_user_proxy_init (GsdAccountsUserProxy *proxy) ++{ ++#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38 ++ proxy->priv = gsd_accounts_user_proxy_get_instance_private (proxy); ++#else ++ proxy->priv = G_TYPE_INSTANCE_GET_PRIVATE (proxy, GSD_TYPE_ACCOUNTS_USER_PROXY, GsdAccountsUserProxyPrivate); ++#endif ++ ++ g_dbus_proxy_set_interface_info (G_DBUS_PROXY (proxy), gsd_accounts_user_interface_info ()); ++} ++ ++static void ++gsd_accounts_user_proxy_class_init (GsdAccountsUserProxyClass *klass) ++{ ++ GObjectClass *gobject_class; ++ GDBusProxyClass *proxy_class; ++ ++ gobject_class = G_OBJECT_CLASS (klass); ++ gobject_class->finalize = gsd_accounts_user_proxy_finalize; ++ gobject_class->get_property = gsd_accounts_user_proxy_get_property; ++ gobject_class->set_property = gsd_accounts_user_proxy_set_property; ++ ++ proxy_class = G_DBUS_PROXY_CLASS (klass); ++ proxy_class->g_signal = gsd_accounts_user_proxy_g_signal; ++ proxy_class->g_properties_changed = gsd_accounts_user_proxy_g_properties_changed; ++ ++ gsd_accounts_user_override_properties (gobject_class, 1); ++ ++#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38 ++ g_type_class_add_private (klass, sizeof (GsdAccountsUserProxyPrivate)); ++#endif ++} ++ ++static void ++gsd_accounts_user_proxy_iface_init (GsdAccountsUserIface *iface) ++{ ++ iface->get_uid = gsd_accounts_user_proxy_get_uid; ++ iface->get_user_name = gsd_accounts_user_proxy_get_user_name; ++ iface->get_real_name = gsd_accounts_user_proxy_get_real_name; ++ iface->get_account_type = gsd_accounts_user_proxy_get_account_type; ++ iface->get_home_directory = gsd_accounts_user_proxy_get_home_directory; ++ iface->get_shell = gsd_accounts_user_proxy_get_shell; ++ iface->get_email = gsd_accounts_user_proxy_get_email; ++ iface->get_language = gsd_accounts_user_proxy_get_language; ++ iface->get_xsession = gsd_accounts_user_proxy_get_xsession; ++ iface->get_location = gsd_accounts_user_proxy_get_location; ++ iface->get_login_frequency = gsd_accounts_user_proxy_get_login_frequency; ++ iface->get_login_time = gsd_accounts_user_proxy_get_login_time; ++ iface->get_login_history = gsd_accounts_user_proxy_get_login_history; ++ iface->get_icon_file = gsd_accounts_user_proxy_get_icon_file; ++ iface->get_locked = gsd_accounts_user_proxy_get_locked; ++ iface->get_password_mode = gsd_accounts_user_proxy_get_password_mode; ++ iface->get_password_hint = gsd_accounts_user_proxy_get_password_hint; ++ iface->get_automatic_login = gsd_accounts_user_proxy_get_automatic_login; ++ iface->get_system_account = gsd_accounts_user_proxy_get_system_account; ++ iface->get_local_account = gsd_accounts_user_proxy_get_local_account; ++} ++ ++/** ++ * gsd_accounts_user_proxy_new: ++ * @connection: A #GDBusConnection. ++ * @flags: Flags from the #GDBusProxyFlags enumeration. ++ * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus connection. ++ * @object_path: An object path. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @callback: A #GAsyncReadyCallback to call when the request is satisfied. ++ * @user_data: User data to pass to @callback. ++ * ++ * Asynchronously creates a proxy for the D-Bus interface org.freedesktop.Accounts.User. See g_dbus_proxy_new() for more details. ++ * ++ * When the operation is finished, @callback will be invoked in the thread-default main loop of the thread you are calling this method from. ++ * You can then call gsd_accounts_user_proxy_new_finish() to get the result of the operation. ++ * ++ * See gsd_accounts_user_proxy_new_sync() for the synchronous, blocking version of this constructor. ++ */ ++void ++gsd_accounts_user_proxy_new ( ++ GDBusConnection *connection, ++ GDBusProxyFlags flags, ++ const gchar *name, ++ const gchar *object_path, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data) ++{ ++ g_async_initable_new_async (GSD_TYPE_ACCOUNTS_USER_PROXY, G_PRIORITY_DEFAULT, cancellable, callback, user_data, "g-flags", flags, "g-name", name, "g-connection", connection, "g-object-path", object_path, "g-interface-name", "org.freedesktop.Accounts.User", NULL); ++} ++ ++/** ++ * gsd_accounts_user_proxy_new_finish: ++ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to gsd_accounts_user_proxy_new(). ++ * @error: Return location for error or %NULL ++ * ++ * Finishes an operation started with gsd_accounts_user_proxy_new(). ++ * ++ * Returns: (transfer full) (type GsdAccountsUserProxy): The constructed proxy object or %NULL if @error is set. ++ */ ++GsdAccountsUser * ++gsd_accounts_user_proxy_new_finish ( ++ GAsyncResult *res, ++ GError **error) ++{ ++ GObject *ret; ++ GObject *source_object; ++ source_object = g_async_result_get_source_object (res); ++ ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error); ++ g_object_unref (source_object); ++ if (ret != NULL) ++ return GSD_ACCOUNTS_USER (ret); ++ else ++ return NULL; ++} ++ ++/** ++ * gsd_accounts_user_proxy_new_sync: ++ * @connection: A #GDBusConnection. ++ * @flags: Flags from the #GDBusProxyFlags enumeration. ++ * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus connection. ++ * @object_path: An object path. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @error: Return location for error or %NULL ++ * ++ * Synchronously creates a proxy for the D-Bus interface org.freedesktop.Accounts.User. See g_dbus_proxy_new_sync() for more details. ++ * ++ * The calling thread is blocked until a reply is received. ++ * ++ * See gsd_accounts_user_proxy_new() for the asynchronous version of this constructor. ++ * ++ * Returns: (transfer full) (type GsdAccountsUserProxy): The constructed proxy object or %NULL if @error is set. ++ */ ++GsdAccountsUser * ++gsd_accounts_user_proxy_new_sync ( ++ GDBusConnection *connection, ++ GDBusProxyFlags flags, ++ const gchar *name, ++ const gchar *object_path, ++ GCancellable *cancellable, ++ GError **error) ++{ ++ GInitable *ret; ++ ret = g_initable_new (GSD_TYPE_ACCOUNTS_USER_PROXY, cancellable, error, "g-flags", flags, "g-name", name, "g-connection", connection, "g-object-path", object_path, "g-interface-name", "org.freedesktop.Accounts.User", NULL); ++ if (ret != NULL) ++ return GSD_ACCOUNTS_USER (ret); ++ else ++ return NULL; ++} ++ ++ ++/** ++ * gsd_accounts_user_proxy_new_for_bus: ++ * @bus_type: A #GBusType. ++ * @flags: Flags from the #GDBusProxyFlags enumeration. ++ * @name: A bus name (well-known or unique). ++ * @object_path: An object path. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @callback: A #GAsyncReadyCallback to call when the request is satisfied. ++ * @user_data: User data to pass to @callback. ++ * ++ * Like gsd_accounts_user_proxy_new() but takes a #GBusType instead of a #GDBusConnection. ++ * ++ * When the operation is finished, @callback will be invoked in the thread-default main loop of the thread you are calling this method from. ++ * You can then call gsd_accounts_user_proxy_new_for_bus_finish() to get the result of the operation. ++ * ++ * See gsd_accounts_user_proxy_new_for_bus_sync() for the synchronous, blocking version of this constructor. ++ */ ++void ++gsd_accounts_user_proxy_new_for_bus ( ++ GBusType bus_type, ++ GDBusProxyFlags flags, ++ const gchar *name, ++ const gchar *object_path, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data) ++{ ++ g_async_initable_new_async (GSD_TYPE_ACCOUNTS_USER_PROXY, G_PRIORITY_DEFAULT, cancellable, callback, user_data, "g-flags", flags, "g-name", name, "g-bus-type", bus_type, "g-object-path", object_path, "g-interface-name", "org.freedesktop.Accounts.User", NULL); ++} ++ ++/** ++ * gsd_accounts_user_proxy_new_for_bus_finish: ++ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to gsd_accounts_user_proxy_new_for_bus(). ++ * @error: Return location for error or %NULL ++ * ++ * Finishes an operation started with gsd_accounts_user_proxy_new_for_bus(). ++ * ++ * Returns: (transfer full) (type GsdAccountsUserProxy): The constructed proxy object or %NULL if @error is set. ++ */ ++GsdAccountsUser * ++gsd_accounts_user_proxy_new_for_bus_finish ( ++ GAsyncResult *res, ++ GError **error) ++{ ++ GObject *ret; ++ GObject *source_object; ++ source_object = g_async_result_get_source_object (res); ++ ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error); ++ g_object_unref (source_object); ++ if (ret != NULL) ++ return GSD_ACCOUNTS_USER (ret); ++ else ++ return NULL; ++} ++ ++/** ++ * gsd_accounts_user_proxy_new_for_bus_sync: ++ * @bus_type: A #GBusType. ++ * @flags: Flags from the #GDBusProxyFlags enumeration. ++ * @name: A bus name (well-known or unique). ++ * @object_path: An object path. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @error: Return location for error or %NULL ++ * ++ * Like gsd_accounts_user_proxy_new_sync() but takes a #GBusType instead of a #GDBusConnection. ++ * ++ * The calling thread is blocked until a reply is received. ++ * ++ * See gsd_accounts_user_proxy_new_for_bus() for the asynchronous version of this constructor. ++ * ++ * Returns: (transfer full) (type GsdAccountsUserProxy): The constructed proxy object or %NULL if @error is set. ++ */ ++GsdAccountsUser * ++gsd_accounts_user_proxy_new_for_bus_sync ( ++ GBusType bus_type, ++ GDBusProxyFlags flags, ++ const gchar *name, ++ const gchar *object_path, ++ GCancellable *cancellable, ++ GError **error) ++{ ++ GInitable *ret; ++ ret = g_initable_new (GSD_TYPE_ACCOUNTS_USER_PROXY, cancellable, error, "g-flags", flags, "g-name", name, "g-bus-type", bus_type, "g-object-path", object_path, "g-interface-name", "org.freedesktop.Accounts.User", NULL); ++ if (ret != NULL) ++ return GSD_ACCOUNTS_USER (ret); ++ else ++ return NULL; ++} ++ ++ ++/* ------------------------------------------------------------------------ */ ++ ++/** ++ * GsdAccountsUserSkeleton: ++ * ++ * The #GsdAccountsUserSkeleton structure contains only private data and should only be accessed using the provided API. ++ */ ++ ++/** ++ * GsdAccountsUserSkeletonClass: ++ * @parent_class: The parent class. ++ * ++ * Class structure for #GsdAccountsUserSkeleton. ++ */ ++ ++struct _GsdAccountsUserSkeletonPrivate ++{ ++ GValue *properties; ++ GList *changed_properties; ++ GSource *changed_properties_idle_source; ++ GMainContext *context; ++ GMutex lock; ++}; ++ ++static void ++_gsd_accounts_user_skeleton_handle_method_call ( ++ GDBusConnection *connection G_GNUC_UNUSED, ++ const gchar *sender G_GNUC_UNUSED, ++ const gchar *object_path G_GNUC_UNUSED, ++ const gchar *interface_name, ++ const gchar *method_name, ++ GVariant *parameters, ++ GDBusMethodInvocation *invocation, ++ gpointer user_data) ++{ ++ GsdAccountsUserSkeleton *skeleton = GSD_ACCOUNTS_USER_SKELETON (user_data); ++ _ExtendedGDBusMethodInfo *info; ++ GVariantIter iter; ++ GVariant *child; ++ GValue *paramv; ++ gsize num_params; ++ guint num_extra; ++ gsize n; ++ guint signal_id; ++ GValue return_value = G_VALUE_INIT; ++ info = (_ExtendedGDBusMethodInfo *) g_dbus_method_invocation_get_method_info (invocation); ++ g_assert (info != NULL); ++ num_params = g_variant_n_children (parameters); ++ num_extra = info->pass_fdlist ? 3 : 2; paramv = g_new0 (GValue, num_params + num_extra); ++ n = 0; ++ g_value_init (¶mv[n], GSD_TYPE_ACCOUNTS_USER); ++ g_value_set_object (¶mv[n++], skeleton); ++ g_value_init (¶mv[n], G_TYPE_DBUS_METHOD_INVOCATION); ++ g_value_set_object (¶mv[n++], invocation); ++ if (info->pass_fdlist) ++ { ++#ifdef G_OS_UNIX ++ g_value_init (¶mv[n], G_TYPE_UNIX_FD_LIST); ++ g_value_set_object (¶mv[n++], g_dbus_message_get_unix_fd_list (g_dbus_method_invocation_get_message (invocation))); ++#else ++ g_assert_not_reached (); ++#endif ++ } ++ g_variant_iter_init (&iter, parameters); ++ while ((child = g_variant_iter_next_value (&iter)) != NULL) ++ { ++ _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.in_args[n - num_extra]; ++ if (arg_info->use_gvariant) ++ { ++ g_value_init (¶mv[n], G_TYPE_VARIANT); ++ g_value_set_variant (¶mv[n], child); ++ n++; ++ } ++ else ++ g_dbus_gvariant_to_gvalue (child, ¶mv[n++]); ++ g_variant_unref (child); ++ } ++ signal_id = g_signal_lookup (info->signal_name, GSD_TYPE_ACCOUNTS_USER); ++ g_value_init (&return_value, G_TYPE_BOOLEAN); ++ g_signal_emitv (paramv, signal_id, 0, &return_value); ++ if (!g_value_get_boolean (&return_value)) ++ g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD, "Method %s is not implemented on interface %s", method_name, interface_name); ++ g_value_unset (&return_value); ++ for (n = 0; n < num_params + num_extra; n++) ++ g_value_unset (¶mv[n]); ++ g_free (paramv); ++} ++ ++static GVariant * ++_gsd_accounts_user_skeleton_handle_get_property ( ++ GDBusConnection *connection G_GNUC_UNUSED, ++ const gchar *sender G_GNUC_UNUSED, ++ const gchar *object_path G_GNUC_UNUSED, ++ const gchar *interface_name G_GNUC_UNUSED, ++ const gchar *property_name, ++ GError **error, ++ gpointer user_data) ++{ ++ GsdAccountsUserSkeleton *skeleton = GSD_ACCOUNTS_USER_SKELETON (user_data); ++ GValue value = G_VALUE_INIT; ++ GParamSpec *pspec; ++ _ExtendedGDBusPropertyInfo *info; ++ GVariant *ret; ++ ret = NULL; ++ info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_gsd_accounts_user_interface_info.parent_struct, property_name); ++ g_assert (info != NULL); ++ pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name); ++ if (pspec == NULL) ++ { ++ g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %s", property_name); ++ } ++ else ++ { ++ g_value_init (&value, pspec->value_type); ++ g_object_get_property (G_OBJECT (skeleton), info->hyphen_name, &value); ++ ret = g_dbus_gvalue_to_gvariant (&value, G_VARIANT_TYPE (info->parent_struct.signature)); ++ g_value_unset (&value); ++ } ++ return ret; ++} ++ ++static gboolean ++_gsd_accounts_user_skeleton_handle_set_property ( ++ GDBusConnection *connection G_GNUC_UNUSED, ++ const gchar *sender G_GNUC_UNUSED, ++ const gchar *object_path G_GNUC_UNUSED, ++ const gchar *interface_name G_GNUC_UNUSED, ++ const gchar *property_name, ++ GVariant *variant, ++ GError **error, ++ gpointer user_data) ++{ ++ GsdAccountsUserSkeleton *skeleton = GSD_ACCOUNTS_USER_SKELETON (user_data); ++ GValue value = G_VALUE_INIT; ++ GParamSpec *pspec; ++ _ExtendedGDBusPropertyInfo *info; ++ gboolean ret; ++ ret = FALSE; ++ info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_gsd_accounts_user_interface_info.parent_struct, property_name); ++ g_assert (info != NULL); ++ pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name); ++ if (pspec == NULL) ++ { ++ g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %s", property_name); ++ } ++ else ++ { ++ if (info->use_gvariant) ++ g_value_set_variant (&value, variant); ++ else ++ g_dbus_gvariant_to_gvalue (variant, &value); ++ g_object_set_property (G_OBJECT (skeleton), info->hyphen_name, &value); ++ g_value_unset (&value); ++ ret = TRUE; ++ } ++ return ret; ++} ++ ++static const GDBusInterfaceVTable _gsd_accounts_user_skeleton_vtable = ++{ ++ _gsd_accounts_user_skeleton_handle_method_call, ++ _gsd_accounts_user_skeleton_handle_get_property, ++ _gsd_accounts_user_skeleton_handle_set_property, ++ {NULL} ++}; ++ ++static GDBusInterfaceInfo * ++gsd_accounts_user_skeleton_dbus_interface_get_info (GDBusInterfaceSkeleton *skeleton G_GNUC_UNUSED) ++{ ++ return gsd_accounts_user_interface_info (); ++} ++ ++static GDBusInterfaceVTable * ++gsd_accounts_user_skeleton_dbus_interface_get_vtable (GDBusInterfaceSkeleton *skeleton G_GNUC_UNUSED) ++{ ++ return (GDBusInterfaceVTable *) &_gsd_accounts_user_skeleton_vtable; ++} ++ ++static GVariant * ++gsd_accounts_user_skeleton_dbus_interface_get_properties (GDBusInterfaceSkeleton *_skeleton) ++{ ++ GsdAccountsUserSkeleton *skeleton = GSD_ACCOUNTS_USER_SKELETON (_skeleton); ++ ++ GVariantBuilder builder; ++ guint n; ++ g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}")); ++ if (_gsd_accounts_user_interface_info.parent_struct.properties == NULL) ++ goto out; ++ for (n = 0; _gsd_accounts_user_interface_info.parent_struct.properties[n] != NULL; n++) ++ { ++ GDBusPropertyInfo *info = _gsd_accounts_user_interface_info.parent_struct.properties[n]; ++ if (info->flags & G_DBUS_PROPERTY_INFO_FLAGS_READABLE) ++ { ++ GVariant *value; ++ value = _gsd_accounts_user_skeleton_handle_get_property (g_dbus_interface_skeleton_get_connection (G_DBUS_INTERFACE_SKELETON (skeleton)), NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)), "org.freedesktop.Accounts.User", info->name, NULL, skeleton); ++ if (value != NULL) ++ { ++ g_variant_take_ref (value); ++ g_variant_builder_add (&builder, "{sv}", info->name, value); ++ g_variant_unref (value); ++ } ++ } ++ } ++out: ++ return g_variant_builder_end (&builder); ++} ++ ++static gboolean _gsd_accounts_user_emit_changed (gpointer user_data); ++ ++static void ++gsd_accounts_user_skeleton_dbus_interface_flush (GDBusInterfaceSkeleton *_skeleton) ++{ ++ GsdAccountsUserSkeleton *skeleton = GSD_ACCOUNTS_USER_SKELETON (_skeleton); ++ gboolean emit_changed = FALSE; ++ ++ g_mutex_lock (&skeleton->priv->lock); ++ if (skeleton->priv->changed_properties_idle_source != NULL) ++ { ++ g_source_destroy (skeleton->priv->changed_properties_idle_source); ++ skeleton->priv->changed_properties_idle_source = NULL; ++ emit_changed = TRUE; ++ } ++ g_mutex_unlock (&skeleton->priv->lock); ++ ++ if (emit_changed) ++ _gsd_accounts_user_emit_changed (skeleton); ++} ++ ++static void ++_gsd_accounts_user_on_signal_changed ( ++ GsdAccountsUser *object) ++{ ++ GsdAccountsUserSkeleton *skeleton = GSD_ACCOUNTS_USER_SKELETON (object); ++ ++ GList *connections, *l; ++ GVariant *signal_variant; ++ connections = g_dbus_interface_skeleton_get_connections (G_DBUS_INTERFACE_SKELETON (skeleton)); ++ ++ signal_variant = g_variant_ref_sink (g_variant_new ("()")); ++ for (l = connections; l != NULL; l = l->next) ++ { ++ GDBusConnection *connection = l->data; ++ g_dbus_connection_emit_signal (connection, ++ NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)), "org.freedesktop.Accounts.User", "Changed", ++ signal_variant, NULL); ++ } ++ g_variant_unref (signal_variant); ++ g_list_free_full (connections, g_object_unref); ++} ++ ++static void gsd_accounts_user_skeleton_iface_init (GsdAccountsUserIface *iface); ++#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38 ++G_DEFINE_TYPE_WITH_CODE (GsdAccountsUserSkeleton, gsd_accounts_user_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON, ++ G_ADD_PRIVATE (GsdAccountsUserSkeleton) ++ G_IMPLEMENT_INTERFACE (GSD_TYPE_ACCOUNTS_USER, gsd_accounts_user_skeleton_iface_init)) ++ ++#else ++G_DEFINE_TYPE_WITH_CODE (GsdAccountsUserSkeleton, gsd_accounts_user_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON, ++ G_IMPLEMENT_INTERFACE (GSD_TYPE_ACCOUNTS_USER, gsd_accounts_user_skeleton_iface_init)) ++ ++#endif ++static void ++gsd_accounts_user_skeleton_finalize (GObject *object) ++{ ++ GsdAccountsUserSkeleton *skeleton = GSD_ACCOUNTS_USER_SKELETON (object); ++ guint n; ++ for (n = 0; n < 20; n++) ++ g_value_unset (&skeleton->priv->properties[n]); ++ g_free (skeleton->priv->properties); ++ g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free); ++ if (skeleton->priv->changed_properties_idle_source != NULL) ++ g_source_destroy (skeleton->priv->changed_properties_idle_source); ++ g_main_context_unref (skeleton->priv->context); ++ g_mutex_clear (&skeleton->priv->lock); ++ G_OBJECT_CLASS (gsd_accounts_user_skeleton_parent_class)->finalize (object); ++} ++ ++static void ++gsd_accounts_user_skeleton_get_property (GObject *object, ++ guint prop_id, ++ GValue *value, ++ GParamSpec *pspec G_GNUC_UNUSED) ++{ ++ GsdAccountsUserSkeleton *skeleton = GSD_ACCOUNTS_USER_SKELETON (object); ++ g_assert (prop_id != 0 && prop_id - 1 < 20); ++ g_mutex_lock (&skeleton->priv->lock); ++ g_value_copy (&skeleton->priv->properties[prop_id - 1], value); ++ g_mutex_unlock (&skeleton->priv->lock); ++} ++ ++static gboolean ++_gsd_accounts_user_emit_changed (gpointer user_data) ++{ ++ GsdAccountsUserSkeleton *skeleton = GSD_ACCOUNTS_USER_SKELETON (user_data); ++ GList *l; ++ GVariantBuilder builder; ++ GVariantBuilder invalidated_builder; ++ guint num_changes; ++ ++ g_mutex_lock (&skeleton->priv->lock); ++ g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}")); ++ g_variant_builder_init (&invalidated_builder, G_VARIANT_TYPE ("as")); ++ for (l = skeleton->priv->changed_properties, num_changes = 0; l != NULL; l = l->next) ++ { ++ ChangedProperty *cp = l->data; ++ GVariant *variant; ++ const GValue *cur_value; ++ ++ cur_value = &skeleton->priv->properties[cp->prop_id - 1]; ++ if (!_g_value_equal (cur_value, &cp->orig_value)) ++ { ++ variant = g_dbus_gvalue_to_gvariant (cur_value, G_VARIANT_TYPE (cp->info->parent_struct.signature)); ++ g_variant_builder_add (&builder, "{sv}", cp->info->parent_struct.name, variant); ++ g_variant_unref (variant); ++ num_changes++; ++ } ++ } ++ if (num_changes > 0) ++ { ++ GList *connections, *ll; ++ GVariant *signal_variant; ++ signal_variant = g_variant_ref_sink (g_variant_new ("(sa{sv}as)", "org.freedesktop.Accounts.User", ++ &builder, &invalidated_builder)); ++ connections = g_dbus_interface_skeleton_get_connections (G_DBUS_INTERFACE_SKELETON (skeleton)); ++ for (ll = connections; ll != NULL; ll = ll->next) ++ { ++ GDBusConnection *connection = ll->data; ++ ++ g_dbus_connection_emit_signal (connection, ++ NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)), ++ "org.freedesktop.DBus.Properties", ++ "PropertiesChanged", ++ signal_variant, ++ NULL); ++ } ++ g_variant_unref (signal_variant); ++ g_list_free_full (connections, g_object_unref); ++ } ++ else ++ { ++ g_variant_builder_clear (&builder); ++ g_variant_builder_clear (&invalidated_builder); ++ } ++ g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free); ++ skeleton->priv->changed_properties = NULL; ++ skeleton->priv->changed_properties_idle_source = NULL; ++ g_mutex_unlock (&skeleton->priv->lock); ++ return FALSE; ++} ++ ++static void ++_gsd_accounts_user_schedule_emit_changed (GsdAccountsUserSkeleton *skeleton, const _ExtendedGDBusPropertyInfo *info, guint prop_id, const GValue *orig_value) ++{ ++ ChangedProperty *cp; ++ GList *l; ++ cp = NULL; ++ for (l = skeleton->priv->changed_properties; l != NULL; l = l->next) ++ { ++ ChangedProperty *i_cp = l->data; ++ if (i_cp->info == info) ++ { ++ cp = i_cp; ++ break; ++ } ++ } ++ if (cp == NULL) ++ { ++ cp = g_new0 (ChangedProperty, 1); ++ cp->prop_id = prop_id; ++ cp->info = info; ++ skeleton->priv->changed_properties = g_list_prepend (skeleton->priv->changed_properties, cp); ++ g_value_init (&cp->orig_value, G_VALUE_TYPE (orig_value)); ++ g_value_copy (orig_value, &cp->orig_value); ++ } ++} ++ ++static void ++gsd_accounts_user_skeleton_notify (GObject *object, ++ GParamSpec *pspec G_GNUC_UNUSED) ++{ ++ GsdAccountsUserSkeleton *skeleton = GSD_ACCOUNTS_USER_SKELETON (object); ++ g_mutex_lock (&skeleton->priv->lock); ++ if (skeleton->priv->changed_properties != NULL && ++ skeleton->priv->changed_properties_idle_source == NULL) ++ { ++ skeleton->priv->changed_properties_idle_source = g_idle_source_new (); ++ g_source_set_priority (skeleton->priv->changed_properties_idle_source, G_PRIORITY_DEFAULT); ++ g_source_set_callback (skeleton->priv->changed_properties_idle_source, _gsd_accounts_user_emit_changed, g_object_ref (skeleton), (GDestroyNotify) g_object_unref); ++ g_source_set_name (skeleton->priv->changed_properties_idle_source, "[generated] _gsd_accounts_user_emit_changed"); ++ g_source_attach (skeleton->priv->changed_properties_idle_source, skeleton->priv->context); ++ g_source_unref (skeleton->priv->changed_properties_idle_source); ++ } ++ g_mutex_unlock (&skeleton->priv->lock); ++} ++ ++static void ++gsd_accounts_user_skeleton_set_property (GObject *object, ++ guint prop_id, ++ const GValue *value, ++ GParamSpec *pspec) ++{ ++ GsdAccountsUserSkeleton *skeleton = GSD_ACCOUNTS_USER_SKELETON (object); ++ g_assert (prop_id != 0 && prop_id - 1 < 20); ++ g_mutex_lock (&skeleton->priv->lock); ++ g_object_freeze_notify (object); ++ if (!_g_value_equal (value, &skeleton->priv->properties[prop_id - 1])) ++ { ++ if (g_dbus_interface_skeleton_get_connection (G_DBUS_INTERFACE_SKELETON (skeleton)) != NULL) ++ _gsd_accounts_user_schedule_emit_changed (skeleton, _gsd_accounts_user_property_info_pointers[prop_id - 1], prop_id, &skeleton->priv->properties[prop_id - 1]); ++ g_value_copy (value, &skeleton->priv->properties[prop_id - 1]); ++ g_object_notify_by_pspec (object, pspec); ++ } ++ g_mutex_unlock (&skeleton->priv->lock); ++ g_object_thaw_notify (object); ++} ++ ++static void ++gsd_accounts_user_skeleton_init (GsdAccountsUserSkeleton *skeleton) ++{ ++#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38 ++ skeleton->priv = gsd_accounts_user_skeleton_get_instance_private (skeleton); ++#else ++ skeleton->priv = G_TYPE_INSTANCE_GET_PRIVATE (skeleton, GSD_TYPE_ACCOUNTS_USER_SKELETON, GsdAccountsUserSkeletonPrivate); ++#endif ++ ++ g_mutex_init (&skeleton->priv->lock); ++ skeleton->priv->context = g_main_context_ref_thread_default (); ++ skeleton->priv->properties = g_new0 (GValue, 20); ++ g_value_init (&skeleton->priv->properties[0], G_TYPE_UINT64); ++ g_value_init (&skeleton->priv->properties[1], G_TYPE_STRING); ++ g_value_init (&skeleton->priv->properties[2], G_TYPE_STRING); ++ g_value_init (&skeleton->priv->properties[3], G_TYPE_INT); ++ g_value_init (&skeleton->priv->properties[4], G_TYPE_STRING); ++ g_value_init (&skeleton->priv->properties[5], G_TYPE_STRING); ++ g_value_init (&skeleton->priv->properties[6], G_TYPE_STRING); ++ g_value_init (&skeleton->priv->properties[7], G_TYPE_STRING); ++ g_value_init (&skeleton->priv->properties[8], G_TYPE_STRING); ++ g_value_init (&skeleton->priv->properties[9], G_TYPE_STRING); ++ g_value_init (&skeleton->priv->properties[10], G_TYPE_UINT64); ++ g_value_init (&skeleton->priv->properties[11], G_TYPE_INT64); ++ g_value_init (&skeleton->priv->properties[12], G_TYPE_VARIANT); ++ g_value_init (&skeleton->priv->properties[13], G_TYPE_STRING); ++ g_value_init (&skeleton->priv->properties[14], G_TYPE_BOOLEAN); ++ g_value_init (&skeleton->priv->properties[15], G_TYPE_INT); ++ g_value_init (&skeleton->priv->properties[16], G_TYPE_STRING); ++ g_value_init (&skeleton->priv->properties[17], G_TYPE_BOOLEAN); ++ g_value_init (&skeleton->priv->properties[18], G_TYPE_BOOLEAN); ++ g_value_init (&skeleton->priv->properties[19], G_TYPE_BOOLEAN); ++} ++ ++static guint64 ++gsd_accounts_user_skeleton_get_uid (GsdAccountsUser *object) ++{ ++ GsdAccountsUserSkeleton *skeleton = GSD_ACCOUNTS_USER_SKELETON (object); ++ guint64 value; ++ g_mutex_lock (&skeleton->priv->lock); ++ value = g_value_get_uint64 (&(skeleton->priv->properties[0])); ++ g_mutex_unlock (&skeleton->priv->lock); ++ return value; ++} ++ ++static const gchar * ++gsd_accounts_user_skeleton_get_user_name (GsdAccountsUser *object) ++{ ++ GsdAccountsUserSkeleton *skeleton = GSD_ACCOUNTS_USER_SKELETON (object); ++ const gchar *value; ++ g_mutex_lock (&skeleton->priv->lock); ++ value = g_value_get_string (&(skeleton->priv->properties[1])); ++ g_mutex_unlock (&skeleton->priv->lock); ++ return value; ++} ++ ++static const gchar * ++gsd_accounts_user_skeleton_get_real_name (GsdAccountsUser *object) ++{ ++ GsdAccountsUserSkeleton *skeleton = GSD_ACCOUNTS_USER_SKELETON (object); ++ const gchar *value; ++ g_mutex_lock (&skeleton->priv->lock); ++ value = g_value_get_string (&(skeleton->priv->properties[2])); ++ g_mutex_unlock (&skeleton->priv->lock); ++ return value; ++} ++ ++static gint ++gsd_accounts_user_skeleton_get_account_type (GsdAccountsUser *object) ++{ ++ GsdAccountsUserSkeleton *skeleton = GSD_ACCOUNTS_USER_SKELETON (object); ++ gint value; ++ g_mutex_lock (&skeleton->priv->lock); ++ value = g_value_get_int (&(skeleton->priv->properties[3])); ++ g_mutex_unlock (&skeleton->priv->lock); ++ return value; ++} ++ ++static const gchar * ++gsd_accounts_user_skeleton_get_home_directory (GsdAccountsUser *object) ++{ ++ GsdAccountsUserSkeleton *skeleton = GSD_ACCOUNTS_USER_SKELETON (object); ++ const gchar *value; ++ g_mutex_lock (&skeleton->priv->lock); ++ value = g_value_get_string (&(skeleton->priv->properties[4])); ++ g_mutex_unlock (&skeleton->priv->lock); ++ return value; ++} ++ ++static const gchar * ++gsd_accounts_user_skeleton_get_shell (GsdAccountsUser *object) ++{ ++ GsdAccountsUserSkeleton *skeleton = GSD_ACCOUNTS_USER_SKELETON (object); ++ const gchar *value; ++ g_mutex_lock (&skeleton->priv->lock); ++ value = g_value_get_string (&(skeleton->priv->properties[5])); ++ g_mutex_unlock (&skeleton->priv->lock); ++ return value; ++} ++ ++static const gchar * ++gsd_accounts_user_skeleton_get_email (GsdAccountsUser *object) ++{ ++ GsdAccountsUserSkeleton *skeleton = GSD_ACCOUNTS_USER_SKELETON (object); ++ const gchar *value; ++ g_mutex_lock (&skeleton->priv->lock); ++ value = g_value_get_string (&(skeleton->priv->properties[6])); ++ g_mutex_unlock (&skeleton->priv->lock); ++ return value; ++} ++ ++static const gchar * ++gsd_accounts_user_skeleton_get_language (GsdAccountsUser *object) ++{ ++ GsdAccountsUserSkeleton *skeleton = GSD_ACCOUNTS_USER_SKELETON (object); ++ const gchar *value; ++ g_mutex_lock (&skeleton->priv->lock); ++ value = g_value_get_string (&(skeleton->priv->properties[7])); ++ g_mutex_unlock (&skeleton->priv->lock); ++ return value; ++} ++ ++static const gchar * ++gsd_accounts_user_skeleton_get_xsession (GsdAccountsUser *object) ++{ ++ GsdAccountsUserSkeleton *skeleton = GSD_ACCOUNTS_USER_SKELETON (object); ++ const gchar *value; ++ g_mutex_lock (&skeleton->priv->lock); ++ value = g_value_get_string (&(skeleton->priv->properties[8])); ++ g_mutex_unlock (&skeleton->priv->lock); ++ return value; ++} ++ ++static const gchar * ++gsd_accounts_user_skeleton_get_location (GsdAccountsUser *object) ++{ ++ GsdAccountsUserSkeleton *skeleton = GSD_ACCOUNTS_USER_SKELETON (object); ++ const gchar *value; ++ g_mutex_lock (&skeleton->priv->lock); ++ value = g_value_get_string (&(skeleton->priv->properties[9])); ++ g_mutex_unlock (&skeleton->priv->lock); ++ return value; ++} ++ ++static guint64 ++gsd_accounts_user_skeleton_get_login_frequency (GsdAccountsUser *object) ++{ ++ GsdAccountsUserSkeleton *skeleton = GSD_ACCOUNTS_USER_SKELETON (object); ++ guint64 value; ++ g_mutex_lock (&skeleton->priv->lock); ++ value = g_value_get_uint64 (&(skeleton->priv->properties[10])); ++ g_mutex_unlock (&skeleton->priv->lock); ++ return value; ++} ++ ++static gint64 ++gsd_accounts_user_skeleton_get_login_time (GsdAccountsUser *object) ++{ ++ GsdAccountsUserSkeleton *skeleton = GSD_ACCOUNTS_USER_SKELETON (object); ++ gint64 value; ++ g_mutex_lock (&skeleton->priv->lock); ++ value = g_value_get_int64 (&(skeleton->priv->properties[11])); ++ g_mutex_unlock (&skeleton->priv->lock); ++ return value; ++} ++ ++static GVariant * ++gsd_accounts_user_skeleton_get_login_history (GsdAccountsUser *object) ++{ ++ GsdAccountsUserSkeleton *skeleton = GSD_ACCOUNTS_USER_SKELETON (object); ++ GVariant *value; ++ g_mutex_lock (&skeleton->priv->lock); ++ value = g_value_get_variant (&(skeleton->priv->properties[12])); ++ g_mutex_unlock (&skeleton->priv->lock); ++ return value; ++} ++ ++static const gchar * ++gsd_accounts_user_skeleton_get_icon_file (GsdAccountsUser *object) ++{ ++ GsdAccountsUserSkeleton *skeleton = GSD_ACCOUNTS_USER_SKELETON (object); ++ const gchar *value; ++ g_mutex_lock (&skeleton->priv->lock); ++ value = g_value_get_string (&(skeleton->priv->properties[13])); ++ g_mutex_unlock (&skeleton->priv->lock); ++ return value; ++} ++ ++static gboolean ++gsd_accounts_user_skeleton_get_locked (GsdAccountsUser *object) ++{ ++ GsdAccountsUserSkeleton *skeleton = GSD_ACCOUNTS_USER_SKELETON (object); ++ gboolean value; ++ g_mutex_lock (&skeleton->priv->lock); ++ value = g_value_get_boolean (&(skeleton->priv->properties[14])); ++ g_mutex_unlock (&skeleton->priv->lock); ++ return value; ++} ++ ++static gint ++gsd_accounts_user_skeleton_get_password_mode (GsdAccountsUser *object) ++{ ++ GsdAccountsUserSkeleton *skeleton = GSD_ACCOUNTS_USER_SKELETON (object); ++ gint value; ++ g_mutex_lock (&skeleton->priv->lock); ++ value = g_value_get_int (&(skeleton->priv->properties[15])); ++ g_mutex_unlock (&skeleton->priv->lock); ++ return value; ++} ++ ++static const gchar * ++gsd_accounts_user_skeleton_get_password_hint (GsdAccountsUser *object) ++{ ++ GsdAccountsUserSkeleton *skeleton = GSD_ACCOUNTS_USER_SKELETON (object); ++ const gchar *value; ++ g_mutex_lock (&skeleton->priv->lock); ++ value = g_value_get_string (&(skeleton->priv->properties[16])); ++ g_mutex_unlock (&skeleton->priv->lock); ++ return value; ++} ++ ++static gboolean ++gsd_accounts_user_skeleton_get_automatic_login (GsdAccountsUser *object) ++{ ++ GsdAccountsUserSkeleton *skeleton = GSD_ACCOUNTS_USER_SKELETON (object); ++ gboolean value; ++ g_mutex_lock (&skeleton->priv->lock); ++ value = g_value_get_boolean (&(skeleton->priv->properties[17])); ++ g_mutex_unlock (&skeleton->priv->lock); ++ return value; ++} ++ ++static gboolean ++gsd_accounts_user_skeleton_get_system_account (GsdAccountsUser *object) ++{ ++ GsdAccountsUserSkeleton *skeleton = GSD_ACCOUNTS_USER_SKELETON (object); ++ gboolean value; ++ g_mutex_lock (&skeleton->priv->lock); ++ value = g_value_get_boolean (&(skeleton->priv->properties[18])); ++ g_mutex_unlock (&skeleton->priv->lock); ++ return value; ++} ++ ++static gboolean ++gsd_accounts_user_skeleton_get_local_account (GsdAccountsUser *object) ++{ ++ GsdAccountsUserSkeleton *skeleton = GSD_ACCOUNTS_USER_SKELETON (object); ++ gboolean value; ++ g_mutex_lock (&skeleton->priv->lock); ++ value = g_value_get_boolean (&(skeleton->priv->properties[19])); ++ g_mutex_unlock (&skeleton->priv->lock); ++ return value; ++} ++ ++static void ++gsd_accounts_user_skeleton_class_init (GsdAccountsUserSkeletonClass *klass) ++{ ++ GObjectClass *gobject_class; ++ GDBusInterfaceSkeletonClass *skeleton_class; ++ ++ gobject_class = G_OBJECT_CLASS (klass); ++ gobject_class->finalize = gsd_accounts_user_skeleton_finalize; ++ gobject_class->get_property = gsd_accounts_user_skeleton_get_property; ++ gobject_class->set_property = gsd_accounts_user_skeleton_set_property; ++ gobject_class->notify = gsd_accounts_user_skeleton_notify; ++ ++ ++ gsd_accounts_user_override_properties (gobject_class, 1); ++ ++ skeleton_class = G_DBUS_INTERFACE_SKELETON_CLASS (klass); ++ skeleton_class->get_info = gsd_accounts_user_skeleton_dbus_interface_get_info; ++ skeleton_class->get_properties = gsd_accounts_user_skeleton_dbus_interface_get_properties; ++ skeleton_class->flush = gsd_accounts_user_skeleton_dbus_interface_flush; ++ skeleton_class->get_vtable = gsd_accounts_user_skeleton_dbus_interface_get_vtable; ++ ++#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38 ++ g_type_class_add_private (klass, sizeof (GsdAccountsUserSkeletonPrivate)); ++#endif ++} ++ ++static void ++gsd_accounts_user_skeleton_iface_init (GsdAccountsUserIface *iface) ++{ ++ iface->changed = _gsd_accounts_user_on_signal_changed; ++ iface->get_uid = gsd_accounts_user_skeleton_get_uid; ++ iface->get_user_name = gsd_accounts_user_skeleton_get_user_name; ++ iface->get_real_name = gsd_accounts_user_skeleton_get_real_name; ++ iface->get_account_type = gsd_accounts_user_skeleton_get_account_type; ++ iface->get_home_directory = gsd_accounts_user_skeleton_get_home_directory; ++ iface->get_shell = gsd_accounts_user_skeleton_get_shell; ++ iface->get_email = gsd_accounts_user_skeleton_get_email; ++ iface->get_language = gsd_accounts_user_skeleton_get_language; ++ iface->get_xsession = gsd_accounts_user_skeleton_get_xsession; ++ iface->get_location = gsd_accounts_user_skeleton_get_location; ++ iface->get_login_frequency = gsd_accounts_user_skeleton_get_login_frequency; ++ iface->get_login_time = gsd_accounts_user_skeleton_get_login_time; ++ iface->get_login_history = gsd_accounts_user_skeleton_get_login_history; ++ iface->get_icon_file = gsd_accounts_user_skeleton_get_icon_file; ++ iface->get_locked = gsd_accounts_user_skeleton_get_locked; ++ iface->get_password_mode = gsd_accounts_user_skeleton_get_password_mode; ++ iface->get_password_hint = gsd_accounts_user_skeleton_get_password_hint; ++ iface->get_automatic_login = gsd_accounts_user_skeleton_get_automatic_login; ++ iface->get_system_account = gsd_accounts_user_skeleton_get_system_account; ++ iface->get_local_account = gsd_accounts_user_skeleton_get_local_account; ++} ++ ++/** ++ * gsd_accounts_user_skeleton_new: ++ * ++ * Creates a skeleton object for the D-Bus interface org.freedesktop.Accounts.User. ++ * ++ * Returns: (transfer full) (type GsdAccountsUserSkeleton): The skeleton object. ++ */ ++GsdAccountsUser * ++gsd_accounts_user_skeleton_new (void) ++{ ++ return GSD_ACCOUNTS_USER (g_object_new (GSD_TYPE_ACCOUNTS_USER_SKELETON, NULL)); ++} +diff --git a/plugins/account/org.freedesktop.Accounts.User.h b/plugins/account/org.freedesktop.Accounts.User.h +new file mode 100644 +index 00000000..f5a0ca0f +--- /dev/null ++++ b/plugins/account/org.freedesktop.Accounts.User.h +@@ -0,0 +1,725 @@ ++/* ++ * Generated by gdbus-codegen 2.54.1. DO NOT EDIT. ++ * ++ * The license of this code is the same as for the source it was derived from. ++ */ ++ ++#ifndef __ORG_FREEDESKTOP_ACCOUNTS_USER_H__ ++#define __ORG_FREEDESKTOP_ACCOUNTS_USER_H__ ++ ++#include ++ ++G_BEGIN_DECLS ++ ++ ++/* ------------------------------------------------------------------------ */ ++/* Declarations for org.freedesktop.Accounts.User */ ++ ++#define GSD_TYPE_ACCOUNTS_USER (gsd_accounts_user_get_type ()) ++#define GSD_ACCOUNTS_USER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GSD_TYPE_ACCOUNTS_USER, GsdAccountsUser)) ++#define GSD_IS_ACCOUNTS_USER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GSD_TYPE_ACCOUNTS_USER)) ++#define GSD_ACCOUNTS_USER_GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE ((o), GSD_TYPE_ACCOUNTS_USER, GsdAccountsUserIface)) ++ ++struct _GsdAccountsUser; ++typedef struct _GsdAccountsUser GsdAccountsUser; ++typedef struct _GsdAccountsUserIface GsdAccountsUserIface; ++ ++struct _GsdAccountsUserIface ++{ ++ GTypeInterface parent_iface; ++ ++ ++ ++ gboolean (*handle_get_password_expiration_policy) ( ++ GsdAccountsUser *object, ++ GDBusMethodInvocation *invocation); ++ ++ gboolean (*handle_set_account_type) ( ++ GsdAccountsUser *object, ++ GDBusMethodInvocation *invocation, ++ gint arg_accountType); ++ ++ gboolean (*handle_set_automatic_login) ( ++ GsdAccountsUser *object, ++ GDBusMethodInvocation *invocation, ++ gboolean arg_enabled); ++ ++ gboolean (*handle_set_email) ( ++ GsdAccountsUser *object, ++ GDBusMethodInvocation *invocation, ++ const gchar *arg_email); ++ ++ gboolean (*handle_set_home_directory) ( ++ GsdAccountsUser *object, ++ GDBusMethodInvocation *invocation, ++ const gchar *arg_homedir); ++ ++ gboolean (*handle_set_icon_file) ( ++ GsdAccountsUser *object, ++ GDBusMethodInvocation *invocation, ++ const gchar *arg_filename); ++ ++ gboolean (*handle_set_language) ( ++ GsdAccountsUser *object, ++ GDBusMethodInvocation *invocation, ++ const gchar *arg_language); ++ ++ gboolean (*handle_set_location) ( ++ GsdAccountsUser *object, ++ GDBusMethodInvocation *invocation, ++ const gchar *arg_location); ++ ++ gboolean (*handle_set_locked) ( ++ GsdAccountsUser *object, ++ GDBusMethodInvocation *invocation, ++ gboolean arg_locked); ++ ++ gboolean (*handle_set_password) ( ++ GsdAccountsUser *object, ++ GDBusMethodInvocation *invocation, ++ const gchar *arg_password, ++ const gchar *arg_hint); ++ ++ gboolean (*handle_set_password_hint) ( ++ GsdAccountsUser *object, ++ GDBusMethodInvocation *invocation, ++ const gchar *arg_hint); ++ ++ gboolean (*handle_set_password_mode) ( ++ GsdAccountsUser *object, ++ GDBusMethodInvocation *invocation, ++ gint arg_mode); ++ ++ gboolean (*handle_set_real_name) ( ++ GsdAccountsUser *object, ++ GDBusMethodInvocation *invocation, ++ const gchar *arg_name); ++ ++ gboolean (*handle_set_shell) ( ++ GsdAccountsUser *object, ++ GDBusMethodInvocation *invocation, ++ const gchar *arg_shell); ++ ++ gboolean (*handle_set_user_name) ( ++ GsdAccountsUser *object, ++ GDBusMethodInvocation *invocation, ++ const gchar *arg_name); ++ ++ gboolean (*handle_set_xsession) ( ++ GsdAccountsUser *object, ++ GDBusMethodInvocation *invocation, ++ const gchar *arg_x_session); ++ ++ gint (*get_account_type) (GsdAccountsUser *object); ++ ++ gboolean (*get_automatic_login) (GsdAccountsUser *object); ++ ++ const gchar * (*get_email) (GsdAccountsUser *object); ++ ++ const gchar * (*get_home_directory) (GsdAccountsUser *object); ++ ++ const gchar * (*get_icon_file) (GsdAccountsUser *object); ++ ++ const gchar * (*get_language) (GsdAccountsUser *object); ++ ++ gboolean (*get_local_account) (GsdAccountsUser *object); ++ ++ const gchar * (*get_location) (GsdAccountsUser *object); ++ ++ gboolean (*get_locked) (GsdAccountsUser *object); ++ ++ guint64 (*get_login_frequency) (GsdAccountsUser *object); ++ ++ GVariant * (*get_login_history) (GsdAccountsUser *object); ++ ++ gint64 (*get_login_time) (GsdAccountsUser *object); ++ ++ const gchar * (*get_password_hint) (GsdAccountsUser *object); ++ ++ gint (*get_password_mode) (GsdAccountsUser *object); ++ ++ const gchar * (*get_real_name) (GsdAccountsUser *object); ++ ++ const gchar * (*get_shell) (GsdAccountsUser *object); ++ ++ gboolean (*get_system_account) (GsdAccountsUser *object); ++ ++ guint64 (*get_uid) (GsdAccountsUser *object); ++ ++ const gchar * (*get_user_name) (GsdAccountsUser *object); ++ ++ const gchar * (*get_xsession) (GsdAccountsUser *object); ++ ++ void (*changed) ( ++ GsdAccountsUser *object); ++ ++}; ++ ++GType gsd_accounts_user_get_type (void) G_GNUC_CONST; ++ ++GDBusInterfaceInfo *gsd_accounts_user_interface_info (void); ++guint gsd_accounts_user_override_properties (GObjectClass *klass, guint property_id_begin); ++ ++ ++/* D-Bus method call completion functions: */ ++void gsd_accounts_user_complete_set_user_name ( ++ GsdAccountsUser *object, ++ GDBusMethodInvocation *invocation); ++ ++void gsd_accounts_user_complete_set_real_name ( ++ GsdAccountsUser *object, ++ GDBusMethodInvocation *invocation); ++ ++void gsd_accounts_user_complete_set_email ( ++ GsdAccountsUser *object, ++ GDBusMethodInvocation *invocation); ++ ++void gsd_accounts_user_complete_set_language ( ++ GsdAccountsUser *object, ++ GDBusMethodInvocation *invocation); ++ ++void gsd_accounts_user_complete_set_xsession ( ++ GsdAccountsUser *object, ++ GDBusMethodInvocation *invocation); ++ ++void gsd_accounts_user_complete_set_location ( ++ GsdAccountsUser *object, ++ GDBusMethodInvocation *invocation); ++ ++void gsd_accounts_user_complete_set_home_directory ( ++ GsdAccountsUser *object, ++ GDBusMethodInvocation *invocation); ++ ++void gsd_accounts_user_complete_set_shell ( ++ GsdAccountsUser *object, ++ GDBusMethodInvocation *invocation); ++ ++void gsd_accounts_user_complete_set_icon_file ( ++ GsdAccountsUser *object, ++ GDBusMethodInvocation *invocation); ++ ++void gsd_accounts_user_complete_set_locked ( ++ GsdAccountsUser *object, ++ GDBusMethodInvocation *invocation); ++ ++void gsd_accounts_user_complete_set_account_type ( ++ GsdAccountsUser *object, ++ GDBusMethodInvocation *invocation); ++ ++void gsd_accounts_user_complete_set_password_mode ( ++ GsdAccountsUser *object, ++ GDBusMethodInvocation *invocation); ++ ++void gsd_accounts_user_complete_set_password ( ++ GsdAccountsUser *object, ++ GDBusMethodInvocation *invocation); ++ ++void gsd_accounts_user_complete_set_password_hint ( ++ GsdAccountsUser *object, ++ GDBusMethodInvocation *invocation); ++ ++void gsd_accounts_user_complete_set_automatic_login ( ++ GsdAccountsUser *object, ++ GDBusMethodInvocation *invocation); ++ ++void gsd_accounts_user_complete_get_password_expiration_policy ( ++ GsdAccountsUser *object, ++ GDBusMethodInvocation *invocation, ++ gint64 expiration_time, ++ gint64 last_change_time, ++ gint64 min_days_between_changes, ++ gint64 max_days_between_changes, ++ gint64 days_to_warn, ++ gint64 days_after_expiration_until_lock); ++ ++ ++ ++/* D-Bus signal emissions functions: */ ++void gsd_accounts_user_emit_changed ( ++ GsdAccountsUser *object); ++ ++ ++ ++/* D-Bus method calls: */ ++void gsd_accounts_user_call_set_user_name ( ++ GsdAccountsUser *proxy, ++ const gchar *arg_name, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data); ++ ++gboolean gsd_accounts_user_call_set_user_name_finish ( ++ GsdAccountsUser *proxy, ++ GAsyncResult *res, ++ GError **error); ++ ++gboolean gsd_accounts_user_call_set_user_name_sync ( ++ GsdAccountsUser *proxy, ++ const gchar *arg_name, ++ GCancellable *cancellable, ++ GError **error); ++ ++void gsd_accounts_user_call_set_real_name ( ++ GsdAccountsUser *proxy, ++ const gchar *arg_name, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data); ++ ++gboolean gsd_accounts_user_call_set_real_name_finish ( ++ GsdAccountsUser *proxy, ++ GAsyncResult *res, ++ GError **error); ++ ++gboolean gsd_accounts_user_call_set_real_name_sync ( ++ GsdAccountsUser *proxy, ++ const gchar *arg_name, ++ GCancellable *cancellable, ++ GError **error); ++ ++void gsd_accounts_user_call_set_email ( ++ GsdAccountsUser *proxy, ++ const gchar *arg_email, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data); ++ ++gboolean gsd_accounts_user_call_set_email_finish ( ++ GsdAccountsUser *proxy, ++ GAsyncResult *res, ++ GError **error); ++ ++gboolean gsd_accounts_user_call_set_email_sync ( ++ GsdAccountsUser *proxy, ++ const gchar *arg_email, ++ GCancellable *cancellable, ++ GError **error); ++ ++void gsd_accounts_user_call_set_language ( ++ GsdAccountsUser *proxy, ++ const gchar *arg_language, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data); ++ ++gboolean gsd_accounts_user_call_set_language_finish ( ++ GsdAccountsUser *proxy, ++ GAsyncResult *res, ++ GError **error); ++ ++gboolean gsd_accounts_user_call_set_language_sync ( ++ GsdAccountsUser *proxy, ++ const gchar *arg_language, ++ GCancellable *cancellable, ++ GError **error); ++ ++void gsd_accounts_user_call_set_xsession ( ++ GsdAccountsUser *proxy, ++ const gchar *arg_x_session, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data); ++ ++gboolean gsd_accounts_user_call_set_xsession_finish ( ++ GsdAccountsUser *proxy, ++ GAsyncResult *res, ++ GError **error); ++ ++gboolean gsd_accounts_user_call_set_xsession_sync ( ++ GsdAccountsUser *proxy, ++ const gchar *arg_x_session, ++ GCancellable *cancellable, ++ GError **error); ++ ++void gsd_accounts_user_call_set_location ( ++ GsdAccountsUser *proxy, ++ const gchar *arg_location, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data); ++ ++gboolean gsd_accounts_user_call_set_location_finish ( ++ GsdAccountsUser *proxy, ++ GAsyncResult *res, ++ GError **error); ++ ++gboolean gsd_accounts_user_call_set_location_sync ( ++ GsdAccountsUser *proxy, ++ const gchar *arg_location, ++ GCancellable *cancellable, ++ GError **error); ++ ++void gsd_accounts_user_call_set_home_directory ( ++ GsdAccountsUser *proxy, ++ const gchar *arg_homedir, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data); ++ ++gboolean gsd_accounts_user_call_set_home_directory_finish ( ++ GsdAccountsUser *proxy, ++ GAsyncResult *res, ++ GError **error); ++ ++gboolean gsd_accounts_user_call_set_home_directory_sync ( ++ GsdAccountsUser *proxy, ++ const gchar *arg_homedir, ++ GCancellable *cancellable, ++ GError **error); ++ ++void gsd_accounts_user_call_set_shell ( ++ GsdAccountsUser *proxy, ++ const gchar *arg_shell, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data); ++ ++gboolean gsd_accounts_user_call_set_shell_finish ( ++ GsdAccountsUser *proxy, ++ GAsyncResult *res, ++ GError **error); ++ ++gboolean gsd_accounts_user_call_set_shell_sync ( ++ GsdAccountsUser *proxy, ++ const gchar *arg_shell, ++ GCancellable *cancellable, ++ GError **error); ++ ++void gsd_accounts_user_call_set_icon_file ( ++ GsdAccountsUser *proxy, ++ const gchar *arg_filename, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data); ++ ++gboolean gsd_accounts_user_call_set_icon_file_finish ( ++ GsdAccountsUser *proxy, ++ GAsyncResult *res, ++ GError **error); ++ ++gboolean gsd_accounts_user_call_set_icon_file_sync ( ++ GsdAccountsUser *proxy, ++ const gchar *arg_filename, ++ GCancellable *cancellable, ++ GError **error); ++ ++void gsd_accounts_user_call_set_locked ( ++ GsdAccountsUser *proxy, ++ gboolean arg_locked, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data); ++ ++gboolean gsd_accounts_user_call_set_locked_finish ( ++ GsdAccountsUser *proxy, ++ GAsyncResult *res, ++ GError **error); ++ ++gboolean gsd_accounts_user_call_set_locked_sync ( ++ GsdAccountsUser *proxy, ++ gboolean arg_locked, ++ GCancellable *cancellable, ++ GError **error); ++ ++void gsd_accounts_user_call_set_account_type ( ++ GsdAccountsUser *proxy, ++ gint arg_accountType, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data); ++ ++gboolean gsd_accounts_user_call_set_account_type_finish ( ++ GsdAccountsUser *proxy, ++ GAsyncResult *res, ++ GError **error); ++ ++gboolean gsd_accounts_user_call_set_account_type_sync ( ++ GsdAccountsUser *proxy, ++ gint arg_accountType, ++ GCancellable *cancellable, ++ GError **error); ++ ++void gsd_accounts_user_call_set_password_mode ( ++ GsdAccountsUser *proxy, ++ gint arg_mode, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data); ++ ++gboolean gsd_accounts_user_call_set_password_mode_finish ( ++ GsdAccountsUser *proxy, ++ GAsyncResult *res, ++ GError **error); ++ ++gboolean gsd_accounts_user_call_set_password_mode_sync ( ++ GsdAccountsUser *proxy, ++ gint arg_mode, ++ GCancellable *cancellable, ++ GError **error); ++ ++void gsd_accounts_user_call_set_password ( ++ GsdAccountsUser *proxy, ++ const gchar *arg_password, ++ const gchar *arg_hint, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data); ++ ++gboolean gsd_accounts_user_call_set_password_finish ( ++ GsdAccountsUser *proxy, ++ GAsyncResult *res, ++ GError **error); ++ ++gboolean gsd_accounts_user_call_set_password_sync ( ++ GsdAccountsUser *proxy, ++ const gchar *arg_password, ++ const gchar *arg_hint, ++ GCancellable *cancellable, ++ GError **error); ++ ++void gsd_accounts_user_call_set_password_hint ( ++ GsdAccountsUser *proxy, ++ const gchar *arg_hint, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data); ++ ++gboolean gsd_accounts_user_call_set_password_hint_finish ( ++ GsdAccountsUser *proxy, ++ GAsyncResult *res, ++ GError **error); ++ ++gboolean gsd_accounts_user_call_set_password_hint_sync ( ++ GsdAccountsUser *proxy, ++ const gchar *arg_hint, ++ GCancellable *cancellable, ++ GError **error); ++ ++void gsd_accounts_user_call_set_automatic_login ( ++ GsdAccountsUser *proxy, ++ gboolean arg_enabled, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data); ++ ++gboolean gsd_accounts_user_call_set_automatic_login_finish ( ++ GsdAccountsUser *proxy, ++ GAsyncResult *res, ++ GError **error); ++ ++gboolean gsd_accounts_user_call_set_automatic_login_sync ( ++ GsdAccountsUser *proxy, ++ gboolean arg_enabled, ++ GCancellable *cancellable, ++ GError **error); ++ ++void gsd_accounts_user_call_get_password_expiration_policy ( ++ GsdAccountsUser *proxy, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data); ++ ++gboolean gsd_accounts_user_call_get_password_expiration_policy_finish ( ++ GsdAccountsUser *proxy, ++ gint64 *out_expiration_time, ++ gint64 *out_last_change_time, ++ gint64 *out_min_days_between_changes, ++ gint64 *out_max_days_between_changes, ++ gint64 *out_days_to_warn, ++ gint64 *out_days_after_expiration_until_lock, ++ GAsyncResult *res, ++ GError **error); ++ ++gboolean gsd_accounts_user_call_get_password_expiration_policy_sync ( ++ GsdAccountsUser *proxy, ++ gint64 *out_expiration_time, ++ gint64 *out_last_change_time, ++ gint64 *out_min_days_between_changes, ++ gint64 *out_max_days_between_changes, ++ gint64 *out_days_to_warn, ++ gint64 *out_days_after_expiration_until_lock, ++ GCancellable *cancellable, ++ GError **error); ++ ++ ++ ++/* D-Bus property accessors: */ ++guint64 gsd_accounts_user_get_uid (GsdAccountsUser *object); ++void gsd_accounts_user_set_uid (GsdAccountsUser *object, guint64 value); ++ ++const gchar *gsd_accounts_user_get_user_name (GsdAccountsUser *object); ++gchar *gsd_accounts_user_dup_user_name (GsdAccountsUser *object); ++void gsd_accounts_user_set_user_name (GsdAccountsUser *object, const gchar *value); ++ ++const gchar *gsd_accounts_user_get_real_name (GsdAccountsUser *object); ++gchar *gsd_accounts_user_dup_real_name (GsdAccountsUser *object); ++void gsd_accounts_user_set_real_name (GsdAccountsUser *object, const gchar *value); ++ ++gint gsd_accounts_user_get_account_type (GsdAccountsUser *object); ++void gsd_accounts_user_set_account_type (GsdAccountsUser *object, gint value); ++ ++const gchar *gsd_accounts_user_get_home_directory (GsdAccountsUser *object); ++gchar *gsd_accounts_user_dup_home_directory (GsdAccountsUser *object); ++void gsd_accounts_user_set_home_directory (GsdAccountsUser *object, const gchar *value); ++ ++const gchar *gsd_accounts_user_get_shell (GsdAccountsUser *object); ++gchar *gsd_accounts_user_dup_shell (GsdAccountsUser *object); ++void gsd_accounts_user_set_shell (GsdAccountsUser *object, const gchar *value); ++ ++const gchar *gsd_accounts_user_get_email (GsdAccountsUser *object); ++gchar *gsd_accounts_user_dup_email (GsdAccountsUser *object); ++void gsd_accounts_user_set_email (GsdAccountsUser *object, const gchar *value); ++ ++const gchar *gsd_accounts_user_get_language (GsdAccountsUser *object); ++gchar *gsd_accounts_user_dup_language (GsdAccountsUser *object); ++void gsd_accounts_user_set_language (GsdAccountsUser *object, const gchar *value); ++ ++const gchar *gsd_accounts_user_get_xsession (GsdAccountsUser *object); ++gchar *gsd_accounts_user_dup_xsession (GsdAccountsUser *object); ++void gsd_accounts_user_set_xsession (GsdAccountsUser *object, const gchar *value); ++ ++const gchar *gsd_accounts_user_get_location (GsdAccountsUser *object); ++gchar *gsd_accounts_user_dup_location (GsdAccountsUser *object); ++void gsd_accounts_user_set_location (GsdAccountsUser *object, const gchar *value); ++ ++guint64 gsd_accounts_user_get_login_frequency (GsdAccountsUser *object); ++void gsd_accounts_user_set_login_frequency (GsdAccountsUser *object, guint64 value); ++ ++gint64 gsd_accounts_user_get_login_time (GsdAccountsUser *object); ++void gsd_accounts_user_set_login_time (GsdAccountsUser *object, gint64 value); ++ ++GVariant *gsd_accounts_user_get_login_history (GsdAccountsUser *object); ++GVariant *gsd_accounts_user_dup_login_history (GsdAccountsUser *object); ++void gsd_accounts_user_set_login_history (GsdAccountsUser *object, GVariant *value); ++ ++const gchar *gsd_accounts_user_get_icon_file (GsdAccountsUser *object); ++gchar *gsd_accounts_user_dup_icon_file (GsdAccountsUser *object); ++void gsd_accounts_user_set_icon_file (GsdAccountsUser *object, const gchar *value); ++ ++gboolean gsd_accounts_user_get_locked (GsdAccountsUser *object); ++void gsd_accounts_user_set_locked (GsdAccountsUser *object, gboolean value); ++ ++gint gsd_accounts_user_get_password_mode (GsdAccountsUser *object); ++void gsd_accounts_user_set_password_mode (GsdAccountsUser *object, gint value); ++ ++const gchar *gsd_accounts_user_get_password_hint (GsdAccountsUser *object); ++gchar *gsd_accounts_user_dup_password_hint (GsdAccountsUser *object); ++void gsd_accounts_user_set_password_hint (GsdAccountsUser *object, const gchar *value); ++ ++gboolean gsd_accounts_user_get_automatic_login (GsdAccountsUser *object); ++void gsd_accounts_user_set_automatic_login (GsdAccountsUser *object, gboolean value); ++ ++gboolean gsd_accounts_user_get_system_account (GsdAccountsUser *object); ++void gsd_accounts_user_set_system_account (GsdAccountsUser *object, gboolean value); ++ ++gboolean gsd_accounts_user_get_local_account (GsdAccountsUser *object); ++void gsd_accounts_user_set_local_account (GsdAccountsUser *object, gboolean value); ++ ++ ++/* ---- */ ++ ++#define GSD_TYPE_ACCOUNTS_USER_PROXY (gsd_accounts_user_proxy_get_type ()) ++#define GSD_ACCOUNTS_USER_PROXY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GSD_TYPE_ACCOUNTS_USER_PROXY, GsdAccountsUserProxy)) ++#define GSD_ACCOUNTS_USER_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), GSD_TYPE_ACCOUNTS_USER_PROXY, GsdAccountsUserProxyClass)) ++#define GSD_ACCOUNTS_USER_PROXY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GSD_TYPE_ACCOUNTS_USER_PROXY, GsdAccountsUserProxyClass)) ++#define GSD_IS_ACCOUNTS_USER_PROXY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GSD_TYPE_ACCOUNTS_USER_PROXY)) ++#define GSD_IS_ACCOUNTS_USER_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GSD_TYPE_ACCOUNTS_USER_PROXY)) ++ ++typedef struct _GsdAccountsUserProxy GsdAccountsUserProxy; ++typedef struct _GsdAccountsUserProxyClass GsdAccountsUserProxyClass; ++typedef struct _GsdAccountsUserProxyPrivate GsdAccountsUserProxyPrivate; ++ ++struct _GsdAccountsUserProxy ++{ ++ /*< private >*/ ++ GDBusProxy parent_instance; ++ GsdAccountsUserProxyPrivate *priv; ++}; ++ ++struct _GsdAccountsUserProxyClass ++{ ++ GDBusProxyClass parent_class; ++}; ++ ++GType gsd_accounts_user_proxy_get_type (void) G_GNUC_CONST; ++ ++#if GLIB_CHECK_VERSION(2, 44, 0) ++G_DEFINE_AUTOPTR_CLEANUP_FUNC (GsdAccountsUserProxy, g_object_unref) ++#endif ++ ++void gsd_accounts_user_proxy_new ( ++ GDBusConnection *connection, ++ GDBusProxyFlags flags, ++ const gchar *name, ++ const gchar *object_path, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data); ++GsdAccountsUser *gsd_accounts_user_proxy_new_finish ( ++ GAsyncResult *res, ++ GError **error); ++GsdAccountsUser *gsd_accounts_user_proxy_new_sync ( ++ GDBusConnection *connection, ++ GDBusProxyFlags flags, ++ const gchar *name, ++ const gchar *object_path, ++ GCancellable *cancellable, ++ GError **error); ++ ++void gsd_accounts_user_proxy_new_for_bus ( ++ GBusType bus_type, ++ GDBusProxyFlags flags, ++ const gchar *name, ++ const gchar *object_path, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data); ++GsdAccountsUser *gsd_accounts_user_proxy_new_for_bus_finish ( ++ GAsyncResult *res, ++ GError **error); ++GsdAccountsUser *gsd_accounts_user_proxy_new_for_bus_sync ( ++ GBusType bus_type, ++ GDBusProxyFlags flags, ++ const gchar *name, ++ const gchar *object_path, ++ GCancellable *cancellable, ++ GError **error); ++ ++ ++/* ---- */ ++ ++#define GSD_TYPE_ACCOUNTS_USER_SKELETON (gsd_accounts_user_skeleton_get_type ()) ++#define GSD_ACCOUNTS_USER_SKELETON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GSD_TYPE_ACCOUNTS_USER_SKELETON, GsdAccountsUserSkeleton)) ++#define GSD_ACCOUNTS_USER_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), GSD_TYPE_ACCOUNTS_USER_SKELETON, GsdAccountsUserSkeletonClass)) ++#define GSD_ACCOUNTS_USER_SKELETON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GSD_TYPE_ACCOUNTS_USER_SKELETON, GsdAccountsUserSkeletonClass)) ++#define GSD_IS_ACCOUNTS_USER_SKELETON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GSD_TYPE_ACCOUNTS_USER_SKELETON)) ++#define GSD_IS_ACCOUNTS_USER_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GSD_TYPE_ACCOUNTS_USER_SKELETON)) ++ ++typedef struct _GsdAccountsUserSkeleton GsdAccountsUserSkeleton; ++typedef struct _GsdAccountsUserSkeletonClass GsdAccountsUserSkeletonClass; ++typedef struct _GsdAccountsUserSkeletonPrivate GsdAccountsUserSkeletonPrivate; ++ ++struct _GsdAccountsUserSkeleton ++{ ++ /*< private >*/ ++ GDBusInterfaceSkeleton parent_instance; ++ GsdAccountsUserSkeletonPrivate *priv; ++}; ++ ++struct _GsdAccountsUserSkeletonClass ++{ ++ GDBusInterfaceSkeletonClass parent_class; ++}; ++ ++GType gsd_accounts_user_skeleton_get_type (void) G_GNUC_CONST; ++ ++#if GLIB_CHECK_VERSION(2, 44, 0) ++G_DEFINE_AUTOPTR_CLEANUP_FUNC (GsdAccountsUserSkeleton, g_object_unref) ++#endif ++ ++GsdAccountsUser *gsd_accounts_user_skeleton_new (void); ++ ++ ++G_END_DECLS ++ ++#endif /* __ORG_FREEDESKTOP_ACCOUNTS_USER_H__ */ +diff --git a/plugins/account/org.freedesktop.Accounts.User.xml b/plugins/account/org.freedesktop.Accounts.User.xml +new file mode 100644 +index 00000000..4ab989a0 +--- /dev/null ++++ b/plugins/account/org.freedesktop.Accounts.User.xml +@@ -0,0 +1,825 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ The new username. ++ ++ ++ ++ ++ ++ ++ Sets the users username. Note that it is usually not allowed ++ to have multiple users with the same username. ++ ++ ++ ++ The caller needs one of the following PolicyKit authorizations: ++ ++ ++ org.freedesktop.accounts.user-administration ++ To change the username of any user ++ ++ ++ ++ ++ if the caller lacks the appropriate PolicyKit authorization ++ if the operation failed ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ The new name, typically in the form "Firstname Lastname". ++ ++ ++ ++ ++ ++ ++ Sets the users real name. ++ ++ ++ ++ The caller needs one of the following PolicyKit authorizations: ++ ++ ++ org.freedesktop.accounts.change-own-user-data ++ To change his own name ++ ++ ++ org.freedesktop.accounts.user-administration ++ To change the name of another user ++ ++ ++ ++ ++ if the caller lacks the appropriate PolicyKit authorization ++ if the operation failed ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ The new email address. ++ ++ ++ ++ ++ ++ ++ Sets the users email address. ++ ++ ++ Note that setting an email address in the AccountsService is ++ not the same as configuring a mail client. Mail clients might ++ default to email address that is configured here, though. ++ ++ ++ ++ The caller needs one of the following PolicyKit authorizations: ++ ++ ++ org.freedesktop.accounts.change-own-user-data ++ To change his own email address ++ ++ ++ org.freedesktop.accounts.user-administration ++ To change the email address of another user ++ ++ ++ ++ ++ if the caller lacks the appropriate PolicyKit authorization ++ if the operation failed ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ The new language, as a locale specification like "de_DE.UTF-8". ++ ++ ++ ++ ++ ++ ++ Sets the users language. ++ ++ ++ The expectation is that display managers will start the ++ users session with this locale. ++ ++ ++ ++ The caller needs one of the following PolicyKit authorizations: ++ ++ ++ org.freedesktop.accounts.change-own-user-data ++ To change his own language ++ ++ ++ org.freedesktop.accounts.user-administration ++ To change the language of another user ++ ++ ++ ++ ++ if the caller lacks the appropriate PolicyKit authorization ++ if the operation failed ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ The new xsession to start (e.g. "gnome") ++ ++ ++ ++ ++ ++ ++ Sets the users x session. ++ ++ ++ The expectation is that display managers will log the user in to this ++ specified session, if available. ++ ++ ++ ++ The caller needs one of the following PolicyKit authorizations: ++ ++ ++ org.freedesktop.accounts.change-own-user-data ++ To change his own language ++ ++ ++ org.freedesktop.accounts.user-administration ++ To change the language of another user ++ ++ ++ ++ ++ if the caller lacks the appropriate PolicyKit authorization ++ if the operation failed ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ The new location as a freeform string. ++ ++ ++ ++ ++ ++ ++ Sets the users location. ++ ++ ++ ++ The caller needs one of the following PolicyKit authorizations: ++ ++ ++ org.freedesktop.accounts.change-own-user-data ++ To change his own location ++ ++ ++ org.freedesktop.accounts.user-administration ++ To change the location of another user ++ ++ ++ ++ ++ if the caller lacks the appropriate PolicyKit authorization ++ if the operation failed ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ The new homedir as an absolute path. ++ ++ ++ ++ ++ ++ ++ Sets the users home directory. ++ ++ ++ Note that changing the users home directory moves all the content ++ from the old location to the new one, and is potentially an ++ expensive operation. ++ ++ ++ ++ The caller needs one of the following PolicyKit authorizations: ++ ++ ++ org.freedesktop.accounts.user-administration ++ To change the home directory of a user ++ ++ ++ ++ ++ if the caller lacks the appropriate PolicyKit authorization ++ if the operation failed ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ The new user shell. ++ ++ ++ ++ ++ ++ ++ Sets the users shell. ++ ++ ++ Note that setting the shell to a non-allowed program may ++ prevent the user from logging in. ++ ++ ++ ++ The caller needs one of the following PolicyKit authorizations: ++ ++ ++ org.freedesktop.accounts.user-administration ++ To change the shell of a user ++ ++ ++ ++ ++ if the caller lacks the appropriate PolicyKit authorization ++ if the operation failed ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ The absolute filename of a png file to use as the users icon. ++ ++ ++ ++ ++ ++ ++ Sets the users icon. ++ ++ ++ ++ The caller needs one of the following PolicyKit authorizations: ++ ++ ++ org.freedesktop.accounts.change-own-user-data ++ To change his own icon ++ ++ ++ org.freedesktop.accounts.user-administration ++ To change the icon of another user ++ ++ ++ ++ ++ if the caller lacks the appropriate PolicyKit authorization ++ if the operation failed ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Whether to lock or unlock the users account. ++ ++ ++ ++ ++ ++ ++ Locks or unlocks a users account. ++ ++ ++ Locking an account prevents the user from logging in. ++ ++ ++ ++ The caller needs one of the following PolicyKit authorizations: ++ ++ ++ org.freedesktop.accounts.user-administration ++ To lock or unlock user accounts ++ ++ ++ ++ ++ if the caller lacks the appropriate PolicyKit authorization ++ if the operation failed ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ The new account type, encoded as an integer: ++ ++ ++ 0 ++ Standard user ++ ++ ++ 1 ++ Administrator ++ ++ ++ ++ ++ ++ ++ ++ ++ Changes the users account type. ++ ++ ++ ++ The caller needs one of the following PolicyKit authorizations: ++ ++ ++ org.freedesktop.accounts.user-administration ++ To change an account type ++ ++ ++ ++ ++ if the caller lacks the appropriate PolicyKit authorization ++ if the operation failed ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ The new password mode, encoded as an integer: ++ ++ ++ 0 ++ Regular password ++ ++ ++ 1 ++ Password must be set at next login ++ ++ ++ 2 ++ No password ++ ++ ++ ++ ++ ++ ++ ++ ++ Changes the users password mode. ++ ++ ++ Note that changing the password mode has the side-effect of ++ unlocking the account. ++ ++ ++ ++ The caller needs one of the following PolicyKit authorizations: ++ ++ ++ org.freedesktop.accounts.user-administration ++ To change a users password mode ++ ++ ++ ++ ++ if the caller lacks the appropriate PolicyKit authorization ++ if the operation failed ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ The crypted password. ++ ++ ++ ++ ++ ++ ++ The password hint. ++ ++ ++ ++ ++ ++ ++ Sets a new password for this user. ++ ++ ++ Note that setting a password has the side-effect of ++ unlocking the account. ++ ++ ++ ++ The caller needs one of the following PolicyKit authorizations: ++ ++ ++ org.freedesktop.accounts.user-administration ++ To change the password of a user ++ ++ ++ ++ ++ if the caller lacks the appropriate PolicyKit authorization ++ if the operation failed ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ The password hint. ++ ++ ++ ++ ++ ++ ++ Sets the users password hint. ++ ++ ++ ++ The caller needs one of the following PolicyKit authorizations: ++ ++ ++ org.freedesktop.accounts.change-own-user-data ++ To change his own language ++ ++ ++ org.freedesktop.accounts.user-administration ++ To change the language of another user ++ ++ ++ ++ ++ if the caller lacks the appropriate PolicyKit authorization ++ if the operation failed ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Whether to enable automatic login for this user. ++ ++ ++ ++ ++ ++ ++ Enables or disables automatic login for a user. ++ ++ ++ Note that usually only one user can have automatic login ++ enabled, so turning it on for a user will disable it for ++ the previously configured autologin user. ++ ++ ++ ++ The caller needs one of the following PolicyKit authorizations: ++ ++ ++ org.freedesktop.accounts.set-login-option ++ To change the login screen configuration ++ ++ ++ ++ ++ if the caller lacks the appropriate PolicyKit authorization ++ if the operation failed ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ The uid of the user. ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ The username of the user. ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ The users real name. ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ The users account type, encoded as an integer: ++ ++ ++ 0 ++ Standard user ++ ++ ++ 1 ++ Administrator ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ The users home directory. ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ The users shell. ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ The email address. ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ The users language, as a locale specification like "de_DE.UTF-8". ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ The users x session. ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ The users location. ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ How often the user has logged in. ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ The last login time. ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ The login history for this user. ++ Each entry in the array represents a login session. The first two ++ members are the login time and logout time, as timestamps (seconds since the epoch). If the session is still running, the logout time ++ is 0. ++ ++ ++ The a{sv} member is a dictionary containing additional information ++ about the session. Possible members include 'type' (with values like ':0', 'tty0', 'pts/0' etc). ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ The filename of a png file containing the users icon. ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Whether the users account is locked. ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ The password mode for the user account, encoded as an integer: ++ ++ ++ 0 ++ Regular password ++ ++ ++ 1 ++ Password must be set at next login ++ ++ ++ 2 ++ No password ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ The password hint for the user. ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Whether automatic login is enabled for the user. ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Whether this is a 'system' account, like 'root' or 'nobody'. ++ System accounts should normally not appear in lists of ++ users, and ListCachedUsers will not include such accounts. ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Whether the user is a local account or not. ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Emitted when the user is changed. ++ ++ ++ ++ ++ ++ ++ +diff --git a/plugins/account/org.freedesktop.Accounts.c b/plugins/account/org.freedesktop.Accounts.c +new file mode 100644 +index 00000000..669c43a8 +--- /dev/null ++++ b/plugins/account/org.freedesktop.Accounts.c +@@ -0,0 +1,3016 @@ ++/* ++ * Generated by gdbus-codegen 2.54.1. DO NOT EDIT. ++ * ++ * The license of this code is the same as for the source it was derived from. ++ */ ++ ++#ifdef HAVE_CONFIG_H ++# include "config.h" ++#endif ++ ++#include "org.freedesktop.Accounts.h" ++ ++#include ++#ifdef G_OS_UNIX ++# include ++#endif ++ ++typedef struct ++{ ++ GDBusArgInfo parent_struct; ++ gboolean use_gvariant; ++} _ExtendedGDBusArgInfo; ++ ++typedef struct ++{ ++ GDBusMethodInfo parent_struct; ++ const gchar *signal_name; ++ gboolean pass_fdlist; ++} _ExtendedGDBusMethodInfo; ++ ++typedef struct ++{ ++ GDBusSignalInfo parent_struct; ++ const gchar *signal_name; ++} _ExtendedGDBusSignalInfo; ++ ++typedef struct ++{ ++ GDBusPropertyInfo parent_struct; ++ const gchar *hyphen_name; ++ gboolean use_gvariant; ++} _ExtendedGDBusPropertyInfo; ++ ++typedef struct ++{ ++ GDBusInterfaceInfo parent_struct; ++ const gchar *hyphen_name; ++} _ExtendedGDBusInterfaceInfo; ++ ++typedef struct ++{ ++ const _ExtendedGDBusPropertyInfo *info; ++ guint prop_id; ++ GValue orig_value; /* the value before the change */ ++} ChangedProperty; ++ ++static void ++_changed_property_free (ChangedProperty *data) ++{ ++ g_value_unset (&data->orig_value); ++ g_free (data); ++} ++ ++static gboolean ++_g_strv_equal0 (gchar **a, gchar **b) ++{ ++ gboolean ret = FALSE; ++ guint n; ++ if (a == NULL && b == NULL) ++ { ++ ret = TRUE; ++ goto out; ++ } ++ if (a == NULL || b == NULL) ++ goto out; ++ if (g_strv_length (a) != g_strv_length (b)) ++ goto out; ++ for (n = 0; a[n] != NULL; n++) ++ if (g_strcmp0 (a[n], b[n]) != 0) ++ goto out; ++ ret = TRUE; ++out: ++ return ret; ++} ++ ++static gboolean ++_g_variant_equal0 (GVariant *a, GVariant *b) ++{ ++ gboolean ret = FALSE; ++ if (a == NULL && b == NULL) ++ { ++ ret = TRUE; ++ goto out; ++ } ++ if (a == NULL || b == NULL) ++ goto out; ++ ret = g_variant_equal (a, b); ++out: ++ return ret; ++} ++ ++G_GNUC_UNUSED static gboolean ++_g_value_equal (const GValue *a, const GValue *b) ++{ ++ gboolean ret = FALSE; ++ g_assert (G_VALUE_TYPE (a) == G_VALUE_TYPE (b)); ++ switch (G_VALUE_TYPE (a)) ++ { ++ case G_TYPE_BOOLEAN: ++ ret = (g_value_get_boolean (a) == g_value_get_boolean (b)); ++ break; ++ case G_TYPE_UCHAR: ++ ret = (g_value_get_uchar (a) == g_value_get_uchar (b)); ++ break; ++ case G_TYPE_INT: ++ ret = (g_value_get_int (a) == g_value_get_int (b)); ++ break; ++ case G_TYPE_UINT: ++ ret = (g_value_get_uint (a) == g_value_get_uint (b)); ++ break; ++ case G_TYPE_INT64: ++ ret = (g_value_get_int64 (a) == g_value_get_int64 (b)); ++ break; ++ case G_TYPE_UINT64: ++ ret = (g_value_get_uint64 (a) == g_value_get_uint64 (b)); ++ break; ++ case G_TYPE_DOUBLE: ++ { ++ /* Avoid -Wfloat-equal warnings by doing a direct bit compare */ ++ gdouble da = g_value_get_double (a); ++ gdouble db = g_value_get_double (b); ++ ret = memcmp (&da, &db, sizeof (gdouble)) == 0; ++ } ++ break; ++ case G_TYPE_STRING: ++ ret = (g_strcmp0 (g_value_get_string (a), g_value_get_string (b)) == 0); ++ break; ++ case G_TYPE_VARIANT: ++ ret = _g_variant_equal0 (g_value_get_variant (a), g_value_get_variant (b)); ++ break; ++ default: ++ if (G_VALUE_TYPE (a) == G_TYPE_STRV) ++ ret = _g_strv_equal0 (g_value_get_boxed (a), g_value_get_boxed (b)); ++ else ++ g_critical ("_g_value_equal() does not handle type %s", g_type_name (G_VALUE_TYPE (a))); ++ break; ++ } ++ return ret; ++} ++ ++/* ------------------------------------------------------------------------ ++ * Code for interface org.freedesktop.Accounts ++ * ------------------------------------------------------------------------ ++ */ ++ ++/** ++ * SECTION:GsdAccounts ++ * @title: GsdAccounts ++ * @short_description: Generated C code for the org.freedesktop.Accounts D-Bus interface ++ * ++ * This section contains code for working with the org.freedesktop.Accounts D-Bus interface in C. ++ */ ++ ++/* ---- Introspection data for org.freedesktop.Accounts ---- */ ++ ++static const _ExtendedGDBusArgInfo _gsd_accounts_method_info_list_cached_users_OUT_ARG_users = ++{ ++ { ++ -1, ++ (gchar *) "users", ++ (gchar *) "ao", ++ NULL ++ }, ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo * const _gsd_accounts_method_info_list_cached_users_OUT_ARG_pointers[] = ++{ ++ &_gsd_accounts_method_info_list_cached_users_OUT_ARG_users, ++ NULL ++}; ++ ++static const GDBusAnnotationInfo _gsd_accounts_method_list_cached_users_annotation_info_0 = ++{ ++ -1, ++ (gchar *) "org.freedesktop.DBus.GLib.Async", ++ (gchar *) "", ++ NULL ++}; ++ ++static const GDBusAnnotationInfo * const _gsd_accounts_method_list_cached_users_annotation_info_pointers[] = ++{ ++ &_gsd_accounts_method_list_cached_users_annotation_info_0, ++ NULL ++}; ++ ++static const _ExtendedGDBusMethodInfo _gsd_accounts_method_info_list_cached_users = ++{ ++ { ++ -1, ++ (gchar *) "ListCachedUsers", ++ NULL, ++ (GDBusArgInfo **) &_gsd_accounts_method_info_list_cached_users_OUT_ARG_pointers, ++ (GDBusAnnotationInfo **) &_gsd_accounts_method_list_cached_users_annotation_info_pointers ++ }, ++ "handle-list-cached-users", ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo _gsd_accounts_method_info_find_user_by_id_IN_ARG_id = ++{ ++ { ++ -1, ++ (gchar *) "id", ++ (gchar *) "x", ++ NULL ++ }, ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo * const _gsd_accounts_method_info_find_user_by_id_IN_ARG_pointers[] = ++{ ++ &_gsd_accounts_method_info_find_user_by_id_IN_ARG_id, ++ NULL ++}; ++ ++static const _ExtendedGDBusArgInfo _gsd_accounts_method_info_find_user_by_id_OUT_ARG_user = ++{ ++ { ++ -1, ++ (gchar *) "user", ++ (gchar *) "o", ++ NULL ++ }, ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo * const _gsd_accounts_method_info_find_user_by_id_OUT_ARG_pointers[] = ++{ ++ &_gsd_accounts_method_info_find_user_by_id_OUT_ARG_user, ++ NULL ++}; ++ ++static const GDBusAnnotationInfo _gsd_accounts_method_find_user_by_id_annotation_info_0 = ++{ ++ -1, ++ (gchar *) "org.freedesktop.DBus.GLib.Async", ++ (gchar *) "", ++ NULL ++}; ++ ++static const GDBusAnnotationInfo * const _gsd_accounts_method_find_user_by_id_annotation_info_pointers[] = ++{ ++ &_gsd_accounts_method_find_user_by_id_annotation_info_0, ++ NULL ++}; ++ ++static const _ExtendedGDBusMethodInfo _gsd_accounts_method_info_find_user_by_id = ++{ ++ { ++ -1, ++ (gchar *) "FindUserById", ++ (GDBusArgInfo **) &_gsd_accounts_method_info_find_user_by_id_IN_ARG_pointers, ++ (GDBusArgInfo **) &_gsd_accounts_method_info_find_user_by_id_OUT_ARG_pointers, ++ (GDBusAnnotationInfo **) &_gsd_accounts_method_find_user_by_id_annotation_info_pointers ++ }, ++ "handle-find-user-by-id", ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo _gsd_accounts_method_info_find_user_by_name_IN_ARG_name = ++{ ++ { ++ -1, ++ (gchar *) "name", ++ (gchar *) "s", ++ NULL ++ }, ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo * const _gsd_accounts_method_info_find_user_by_name_IN_ARG_pointers[] = ++{ ++ &_gsd_accounts_method_info_find_user_by_name_IN_ARG_name, ++ NULL ++}; ++ ++static const _ExtendedGDBusArgInfo _gsd_accounts_method_info_find_user_by_name_OUT_ARG_user = ++{ ++ { ++ -1, ++ (gchar *) "user", ++ (gchar *) "o", ++ NULL ++ }, ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo * const _gsd_accounts_method_info_find_user_by_name_OUT_ARG_pointers[] = ++{ ++ &_gsd_accounts_method_info_find_user_by_name_OUT_ARG_user, ++ NULL ++}; ++ ++static const GDBusAnnotationInfo _gsd_accounts_method_find_user_by_name_annotation_info_0 = ++{ ++ -1, ++ (gchar *) "org.freedesktop.DBus.GLib.Async", ++ (gchar *) "", ++ NULL ++}; ++ ++static const GDBusAnnotationInfo * const _gsd_accounts_method_find_user_by_name_annotation_info_pointers[] = ++{ ++ &_gsd_accounts_method_find_user_by_name_annotation_info_0, ++ NULL ++}; ++ ++static const _ExtendedGDBusMethodInfo _gsd_accounts_method_info_find_user_by_name = ++{ ++ { ++ -1, ++ (gchar *) "FindUserByName", ++ (GDBusArgInfo **) &_gsd_accounts_method_info_find_user_by_name_IN_ARG_pointers, ++ (GDBusArgInfo **) &_gsd_accounts_method_info_find_user_by_name_OUT_ARG_pointers, ++ (GDBusAnnotationInfo **) &_gsd_accounts_method_find_user_by_name_annotation_info_pointers ++ }, ++ "handle-find-user-by-name", ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo _gsd_accounts_method_info_create_user_IN_ARG_name = ++{ ++ { ++ -1, ++ (gchar *) "name", ++ (gchar *) "s", ++ NULL ++ }, ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo _gsd_accounts_method_info_create_user_IN_ARG_fullname = ++{ ++ { ++ -1, ++ (gchar *) "fullname", ++ (gchar *) "s", ++ NULL ++ }, ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo _gsd_accounts_method_info_create_user_IN_ARG_accountType = ++{ ++ { ++ -1, ++ (gchar *) "accountType", ++ (gchar *) "i", ++ NULL ++ }, ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo * const _gsd_accounts_method_info_create_user_IN_ARG_pointers[] = ++{ ++ &_gsd_accounts_method_info_create_user_IN_ARG_name, ++ &_gsd_accounts_method_info_create_user_IN_ARG_fullname, ++ &_gsd_accounts_method_info_create_user_IN_ARG_accountType, ++ NULL ++}; ++ ++static const _ExtendedGDBusArgInfo _gsd_accounts_method_info_create_user_OUT_ARG_user = ++{ ++ { ++ -1, ++ (gchar *) "user", ++ (gchar *) "o", ++ NULL ++ }, ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo * const _gsd_accounts_method_info_create_user_OUT_ARG_pointers[] = ++{ ++ &_gsd_accounts_method_info_create_user_OUT_ARG_user, ++ NULL ++}; ++ ++static const GDBusAnnotationInfo _gsd_accounts_method_create_user_annotation_info_0 = ++{ ++ -1, ++ (gchar *) "org.freedesktop.DBus.GLib.Async", ++ (gchar *) "", ++ NULL ++}; ++ ++static const GDBusAnnotationInfo _gsd_accounts_method_create_user_annotation_info_1 = ++{ ++ -1, ++ (gchar *) "org.freedesktop.DBus.GLib.Async", ++ (gchar *) "", ++ NULL ++}; ++ ++static const GDBusAnnotationInfo * const _gsd_accounts_method_create_user_annotation_info_pointers[] = ++{ ++ &_gsd_accounts_method_create_user_annotation_info_0, ++ &_gsd_accounts_method_create_user_annotation_info_1, ++ NULL ++}; ++ ++static const _ExtendedGDBusMethodInfo _gsd_accounts_method_info_create_user = ++{ ++ { ++ -1, ++ (gchar *) "CreateUser", ++ (GDBusArgInfo **) &_gsd_accounts_method_info_create_user_IN_ARG_pointers, ++ (GDBusArgInfo **) &_gsd_accounts_method_info_create_user_OUT_ARG_pointers, ++ (GDBusAnnotationInfo **) &_gsd_accounts_method_create_user_annotation_info_pointers ++ }, ++ "handle-create-user", ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo _gsd_accounts_method_info_cache_user_IN_ARG_name = ++{ ++ { ++ -1, ++ (gchar *) "name", ++ (gchar *) "s", ++ NULL ++ }, ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo * const _gsd_accounts_method_info_cache_user_IN_ARG_pointers[] = ++{ ++ &_gsd_accounts_method_info_cache_user_IN_ARG_name, ++ NULL ++}; ++ ++static const _ExtendedGDBusArgInfo _gsd_accounts_method_info_cache_user_OUT_ARG_user = ++{ ++ { ++ -1, ++ (gchar *) "user", ++ (gchar *) "o", ++ NULL ++ }, ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo * const _gsd_accounts_method_info_cache_user_OUT_ARG_pointers[] = ++{ ++ &_gsd_accounts_method_info_cache_user_OUT_ARG_user, ++ NULL ++}; ++ ++static const GDBusAnnotationInfo _gsd_accounts_method_cache_user_annotation_info_0 = ++{ ++ -1, ++ (gchar *) "org.freedesktop.DBus.GLib.Async", ++ (gchar *) "", ++ NULL ++}; ++ ++static const GDBusAnnotationInfo * const _gsd_accounts_method_cache_user_annotation_info_pointers[] = ++{ ++ &_gsd_accounts_method_cache_user_annotation_info_0, ++ NULL ++}; ++ ++static const _ExtendedGDBusMethodInfo _gsd_accounts_method_info_cache_user = ++{ ++ { ++ -1, ++ (gchar *) "CacheUser", ++ (GDBusArgInfo **) &_gsd_accounts_method_info_cache_user_IN_ARG_pointers, ++ (GDBusArgInfo **) &_gsd_accounts_method_info_cache_user_OUT_ARG_pointers, ++ (GDBusAnnotationInfo **) &_gsd_accounts_method_cache_user_annotation_info_pointers ++ }, ++ "handle-cache-user", ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo _gsd_accounts_method_info_uncache_user_IN_ARG_name = ++{ ++ { ++ -1, ++ (gchar *) "name", ++ (gchar *) "s", ++ NULL ++ }, ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo * const _gsd_accounts_method_info_uncache_user_IN_ARG_pointers[] = ++{ ++ &_gsd_accounts_method_info_uncache_user_IN_ARG_name, ++ NULL ++}; ++ ++static const GDBusAnnotationInfo _gsd_accounts_method_uncache_user_annotation_info_0 = ++{ ++ -1, ++ (gchar *) "org.freedesktop.DBus.GLib.Async", ++ (gchar *) "", ++ NULL ++}; ++ ++static const GDBusAnnotationInfo * const _gsd_accounts_method_uncache_user_annotation_info_pointers[] = ++{ ++ &_gsd_accounts_method_uncache_user_annotation_info_0, ++ NULL ++}; ++ ++static const _ExtendedGDBusMethodInfo _gsd_accounts_method_info_uncache_user = ++{ ++ { ++ -1, ++ (gchar *) "UncacheUser", ++ (GDBusArgInfo **) &_gsd_accounts_method_info_uncache_user_IN_ARG_pointers, ++ NULL, ++ (GDBusAnnotationInfo **) &_gsd_accounts_method_uncache_user_annotation_info_pointers ++ }, ++ "handle-uncache-user", ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo _gsd_accounts_method_info_delete_user_IN_ARG_id = ++{ ++ { ++ -1, ++ (gchar *) "id", ++ (gchar *) "x", ++ NULL ++ }, ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo _gsd_accounts_method_info_delete_user_IN_ARG_removeFiles = ++{ ++ { ++ -1, ++ (gchar *) "removeFiles", ++ (gchar *) "b", ++ NULL ++ }, ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo * const _gsd_accounts_method_info_delete_user_IN_ARG_pointers[] = ++{ ++ &_gsd_accounts_method_info_delete_user_IN_ARG_id, ++ &_gsd_accounts_method_info_delete_user_IN_ARG_removeFiles, ++ NULL ++}; ++ ++static const GDBusAnnotationInfo _gsd_accounts_method_delete_user_annotation_info_0 = ++{ ++ -1, ++ (gchar *) "org.freedesktop.DBus.GLib.Async", ++ (gchar *) "", ++ NULL ++}; ++ ++static const GDBusAnnotationInfo * const _gsd_accounts_method_delete_user_annotation_info_pointers[] = ++{ ++ &_gsd_accounts_method_delete_user_annotation_info_0, ++ NULL ++}; ++ ++static const _ExtendedGDBusMethodInfo _gsd_accounts_method_info_delete_user = ++{ ++ { ++ -1, ++ (gchar *) "DeleteUser", ++ (GDBusArgInfo **) &_gsd_accounts_method_info_delete_user_IN_ARG_pointers, ++ NULL, ++ (GDBusAnnotationInfo **) &_gsd_accounts_method_delete_user_annotation_info_pointers ++ }, ++ "handle-delete-user", ++ FALSE ++}; ++ ++static const _ExtendedGDBusMethodInfo * const _gsd_accounts_method_info_pointers[] = ++{ ++ &_gsd_accounts_method_info_list_cached_users, ++ &_gsd_accounts_method_info_find_user_by_id, ++ &_gsd_accounts_method_info_find_user_by_name, ++ &_gsd_accounts_method_info_create_user, ++ &_gsd_accounts_method_info_cache_user, ++ &_gsd_accounts_method_info_uncache_user, ++ &_gsd_accounts_method_info_delete_user, ++ NULL ++}; ++ ++static const _ExtendedGDBusArgInfo _gsd_accounts_signal_info_user_added_ARG_user = ++{ ++ { ++ -1, ++ (gchar *) "user", ++ (gchar *) "o", ++ NULL ++ }, ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo * const _gsd_accounts_signal_info_user_added_ARG_pointers[] = ++{ ++ &_gsd_accounts_signal_info_user_added_ARG_user, ++ NULL ++}; ++ ++static const _ExtendedGDBusSignalInfo _gsd_accounts_signal_info_user_added = ++{ ++ { ++ -1, ++ (gchar *) "UserAdded", ++ (GDBusArgInfo **) &_gsd_accounts_signal_info_user_added_ARG_pointers, ++ NULL ++ }, ++ "user-added" ++}; ++ ++static const _ExtendedGDBusArgInfo _gsd_accounts_signal_info_user_deleted_ARG_user = ++{ ++ { ++ -1, ++ (gchar *) "user", ++ (gchar *) "o", ++ NULL ++ }, ++ FALSE ++}; ++ ++static const _ExtendedGDBusArgInfo * const _gsd_accounts_signal_info_user_deleted_ARG_pointers[] = ++{ ++ &_gsd_accounts_signal_info_user_deleted_ARG_user, ++ NULL ++}; ++ ++static const _ExtendedGDBusSignalInfo _gsd_accounts_signal_info_user_deleted = ++{ ++ { ++ -1, ++ (gchar *) "UserDeleted", ++ (GDBusArgInfo **) &_gsd_accounts_signal_info_user_deleted_ARG_pointers, ++ NULL ++ }, ++ "user-deleted" ++}; ++ ++static const _ExtendedGDBusSignalInfo * const _gsd_accounts_signal_info_pointers[] = ++{ ++ &_gsd_accounts_signal_info_user_added, ++ &_gsd_accounts_signal_info_user_deleted, ++ NULL ++}; ++ ++static const _ExtendedGDBusPropertyInfo _gsd_accounts_property_info_daemon_version = ++{ ++ { ++ -1, ++ (gchar *) "DaemonVersion", ++ (gchar *) "s", ++ G_DBUS_PROPERTY_INFO_FLAGS_READABLE, ++ NULL ++ }, ++ "daemon-version", ++ FALSE ++}; ++ ++static const _ExtendedGDBusPropertyInfo _gsd_accounts_property_info_has_no_users = ++{ ++ { ++ -1, ++ (gchar *) "HasNoUsers", ++ (gchar *) "b", ++ G_DBUS_PROPERTY_INFO_FLAGS_READABLE, ++ NULL ++ }, ++ "has-no-users", ++ FALSE ++}; ++ ++static const _ExtendedGDBusPropertyInfo _gsd_accounts_property_info_has_multiple_users = ++{ ++ { ++ -1, ++ (gchar *) "HasMultipleUsers", ++ (gchar *) "b", ++ G_DBUS_PROPERTY_INFO_FLAGS_READABLE, ++ NULL ++ }, ++ "has-multiple-users", ++ FALSE ++}; ++ ++static const _ExtendedGDBusPropertyInfo * const _gsd_accounts_property_info_pointers[] = ++{ ++ &_gsd_accounts_property_info_daemon_version, ++ &_gsd_accounts_property_info_has_no_users, ++ &_gsd_accounts_property_info_has_multiple_users, ++ NULL ++}; ++ ++static const _ExtendedGDBusInterfaceInfo _gsd_accounts_interface_info = ++{ ++ { ++ -1, ++ (gchar *) "org.freedesktop.Accounts", ++ (GDBusMethodInfo **) &_gsd_accounts_method_info_pointers, ++ (GDBusSignalInfo **) &_gsd_accounts_signal_info_pointers, ++ (GDBusPropertyInfo **) &_gsd_accounts_property_info_pointers, ++ NULL ++ }, ++ "accounts", ++}; ++ ++ ++/** ++ * gsd_accounts_interface_info: ++ * ++ * Gets a machine-readable description of the org.freedesktop.Accounts D-Bus interface. ++ * ++ * Returns: (transfer none): A #GDBusInterfaceInfo. Do not free. ++ */ ++GDBusInterfaceInfo * ++gsd_accounts_interface_info (void) ++{ ++ return (GDBusInterfaceInfo *) &_gsd_accounts_interface_info.parent_struct; ++} ++ ++/** ++ * gsd_accounts_override_properties: ++ * @klass: The class structure for a #GObject-derived class. ++ * @property_id_begin: The property id to assign to the first overridden property. ++ * ++ * Overrides all #GObject properties in the #GsdAccounts interface for a concrete class. ++ * The properties are overridden in the order they are defined. ++ * ++ * Returns: The last property id. ++ */ ++guint ++gsd_accounts_override_properties (GObjectClass *klass, guint property_id_begin) ++{ ++ g_object_class_override_property (klass, property_id_begin++, "daemon-version"); ++ g_object_class_override_property (klass, property_id_begin++, "has-no-users"); ++ g_object_class_override_property (klass, property_id_begin++, "has-multiple-users"); ++ return property_id_begin - 1; ++} ++ ++ ++ ++/** ++ * GsdAccounts: ++ * ++ * Abstract interface type for the D-Bus interface org.freedesktop.Accounts. ++ */ ++ ++/** ++ * GsdAccountsIface: ++ * @parent_iface: The parent interface. ++ * @handle_cache_user: Handler for the #GsdAccounts::handle-cache-user signal. ++ * @handle_create_user: Handler for the #GsdAccounts::handle-create-user signal. ++ * @handle_delete_user: Handler for the #GsdAccounts::handle-delete-user signal. ++ * @handle_find_user_by_id: Handler for the #GsdAccounts::handle-find-user-by-id signal. ++ * @handle_find_user_by_name: Handler for the #GsdAccounts::handle-find-user-by-name signal. ++ * @handle_list_cached_users: Handler for the #GsdAccounts::handle-list-cached-users signal. ++ * @handle_uncache_user: Handler for the #GsdAccounts::handle-uncache-user signal. ++ * @get_daemon_version: Getter for the #GsdAccounts:daemon-version property. ++ * @get_has_multiple_users: Getter for the #GsdAccounts:has-multiple-users property. ++ * @get_has_no_users: Getter for the #GsdAccounts:has-no-users property. ++ * @user_added: Handler for the #GsdAccounts::user-added signal. ++ * @user_deleted: Handler for the #GsdAccounts::user-deleted signal. ++ * ++ * Virtual table for the D-Bus interface org.freedesktop.Accounts. ++ */ ++ ++typedef GsdAccountsIface GsdAccountsInterface; ++G_DEFINE_INTERFACE (GsdAccounts, gsd_accounts, G_TYPE_OBJECT) ++ ++static void ++gsd_accounts_default_init (GsdAccountsIface *iface) ++{ ++ /* GObject signals for incoming D-Bus method calls: */ ++ /** ++ * GsdAccounts::handle-list-cached-users: ++ * @object: A #GsdAccounts. ++ * @invocation: A #GDBusMethodInvocation. ++ * ++ * Signal emitted when a remote caller is invoking the ListCachedUsers() D-Bus method. ++ * ++ * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call gsd_accounts_complete_list_cached_users() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. ++ * ++ * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. ++ */ ++ g_signal_new ("handle-list-cached-users", ++ G_TYPE_FROM_INTERFACE (iface), ++ G_SIGNAL_RUN_LAST, ++ G_STRUCT_OFFSET (GsdAccountsIface, handle_list_cached_users), ++ g_signal_accumulator_true_handled, ++ NULL, ++ g_cclosure_marshal_generic, ++ G_TYPE_BOOLEAN, ++ 1, ++ G_TYPE_DBUS_METHOD_INVOCATION); ++ ++ /** ++ * GsdAccounts::handle-find-user-by-id: ++ * @object: A #GsdAccounts. ++ * @invocation: A #GDBusMethodInvocation. ++ * @arg_id: Argument passed by remote caller. ++ * ++ * Signal emitted when a remote caller is invoking the FindUserById() D-Bus method. ++ * ++ * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call gsd_accounts_complete_find_user_by_id() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. ++ * ++ * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. ++ */ ++ g_signal_new ("handle-find-user-by-id", ++ G_TYPE_FROM_INTERFACE (iface), ++ G_SIGNAL_RUN_LAST, ++ G_STRUCT_OFFSET (GsdAccountsIface, handle_find_user_by_id), ++ g_signal_accumulator_true_handled, ++ NULL, ++ g_cclosure_marshal_generic, ++ G_TYPE_BOOLEAN, ++ 2, ++ G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_INT64); ++ ++ /** ++ * GsdAccounts::handle-find-user-by-name: ++ * @object: A #GsdAccounts. ++ * @invocation: A #GDBusMethodInvocation. ++ * @arg_name: Argument passed by remote caller. ++ * ++ * Signal emitted when a remote caller is invoking the FindUserByName() D-Bus method. ++ * ++ * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call gsd_accounts_complete_find_user_by_name() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. ++ * ++ * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. ++ */ ++ g_signal_new ("handle-find-user-by-name", ++ G_TYPE_FROM_INTERFACE (iface), ++ G_SIGNAL_RUN_LAST, ++ G_STRUCT_OFFSET (GsdAccountsIface, handle_find_user_by_name), ++ g_signal_accumulator_true_handled, ++ NULL, ++ g_cclosure_marshal_generic, ++ G_TYPE_BOOLEAN, ++ 2, ++ G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING); ++ ++ /** ++ * GsdAccounts::handle-create-user: ++ * @object: A #GsdAccounts. ++ * @invocation: A #GDBusMethodInvocation. ++ * @arg_name: Argument passed by remote caller. ++ * @arg_fullname: Argument passed by remote caller. ++ * @arg_accountType: Argument passed by remote caller. ++ * ++ * Signal emitted when a remote caller is invoking the CreateUser() D-Bus method. ++ * ++ * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call gsd_accounts_complete_create_user() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. ++ * ++ * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. ++ */ ++ g_signal_new ("handle-create-user", ++ G_TYPE_FROM_INTERFACE (iface), ++ G_SIGNAL_RUN_LAST, ++ G_STRUCT_OFFSET (GsdAccountsIface, handle_create_user), ++ g_signal_accumulator_true_handled, ++ NULL, ++ g_cclosure_marshal_generic, ++ G_TYPE_BOOLEAN, ++ 4, ++ G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT); ++ ++ /** ++ * GsdAccounts::handle-cache-user: ++ * @object: A #GsdAccounts. ++ * @invocation: A #GDBusMethodInvocation. ++ * @arg_name: Argument passed by remote caller. ++ * ++ * Signal emitted when a remote caller is invoking the CacheUser() D-Bus method. ++ * ++ * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call gsd_accounts_complete_cache_user() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. ++ * ++ * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. ++ */ ++ g_signal_new ("handle-cache-user", ++ G_TYPE_FROM_INTERFACE (iface), ++ G_SIGNAL_RUN_LAST, ++ G_STRUCT_OFFSET (GsdAccountsIface, handle_cache_user), ++ g_signal_accumulator_true_handled, ++ NULL, ++ g_cclosure_marshal_generic, ++ G_TYPE_BOOLEAN, ++ 2, ++ G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING); ++ ++ /** ++ * GsdAccounts::handle-uncache-user: ++ * @object: A #GsdAccounts. ++ * @invocation: A #GDBusMethodInvocation. ++ * @arg_name: Argument passed by remote caller. ++ * ++ * Signal emitted when a remote caller is invoking the UncacheUser() D-Bus method. ++ * ++ * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call gsd_accounts_complete_uncache_user() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. ++ * ++ * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. ++ */ ++ g_signal_new ("handle-uncache-user", ++ G_TYPE_FROM_INTERFACE (iface), ++ G_SIGNAL_RUN_LAST, ++ G_STRUCT_OFFSET (GsdAccountsIface, handle_uncache_user), ++ g_signal_accumulator_true_handled, ++ NULL, ++ g_cclosure_marshal_generic, ++ G_TYPE_BOOLEAN, ++ 2, ++ G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING); ++ ++ /** ++ * GsdAccounts::handle-delete-user: ++ * @object: A #GsdAccounts. ++ * @invocation: A #GDBusMethodInvocation. ++ * @arg_id: Argument passed by remote caller. ++ * @arg_removeFiles: Argument passed by remote caller. ++ * ++ * Signal emitted when a remote caller is invoking the DeleteUser() D-Bus method. ++ * ++ * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call gsd_accounts_complete_delete_user() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. ++ * ++ * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. ++ */ ++ g_signal_new ("handle-delete-user", ++ G_TYPE_FROM_INTERFACE (iface), ++ G_SIGNAL_RUN_LAST, ++ G_STRUCT_OFFSET (GsdAccountsIface, handle_delete_user), ++ g_signal_accumulator_true_handled, ++ NULL, ++ g_cclosure_marshal_generic, ++ G_TYPE_BOOLEAN, ++ 3, ++ G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_INT64, G_TYPE_BOOLEAN); ++ ++ /* GObject signals for received D-Bus signals: */ ++ /** ++ * GsdAccounts::user-added: ++ * @object: A #GsdAccounts. ++ * @arg_user: Argument. ++ * ++ * On the client-side, this signal is emitted whenever the D-Bus signal "UserAdded" is received. ++ * ++ * On the service-side, this signal can be used with e.g. g_signal_emit_by_name() to make the object emit the D-Bus signal. ++ */ ++ g_signal_new ("user-added", ++ G_TYPE_FROM_INTERFACE (iface), ++ G_SIGNAL_RUN_LAST, ++ G_STRUCT_OFFSET (GsdAccountsIface, user_added), ++ NULL, ++ NULL, ++ g_cclosure_marshal_generic, ++ G_TYPE_NONE, ++ 1, G_TYPE_STRING); ++ ++ /** ++ * GsdAccounts::user-deleted: ++ * @object: A #GsdAccounts. ++ * @arg_user: Argument. ++ * ++ * On the client-side, this signal is emitted whenever the D-Bus signal "UserDeleted" is received. ++ * ++ * On the service-side, this signal can be used with e.g. g_signal_emit_by_name() to make the object emit the D-Bus signal. ++ */ ++ g_signal_new ("user-deleted", ++ G_TYPE_FROM_INTERFACE (iface), ++ G_SIGNAL_RUN_LAST, ++ G_STRUCT_OFFSET (GsdAccountsIface, user_deleted), ++ NULL, ++ NULL, ++ g_cclosure_marshal_generic, ++ G_TYPE_NONE, ++ 1, G_TYPE_STRING); ++ ++ /* GObject properties for D-Bus properties: */ ++ /** ++ * GsdAccounts:daemon-version: ++ * ++ * Represents the D-Bus property "DaemonVersion". ++ * ++ * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side. ++ */ ++ g_object_interface_install_property (iface, ++ g_param_spec_string ("daemon-version", "DaemonVersion", "DaemonVersion", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); ++ /** ++ * GsdAccounts:has-no-users: ++ * ++ * Represents the D-Bus property "HasNoUsers". ++ * ++ * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side. ++ */ ++ g_object_interface_install_property (iface, ++ g_param_spec_boolean ("has-no-users", "HasNoUsers", "HasNoUsers", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); ++ /** ++ * GsdAccounts:has-multiple-users: ++ * ++ * Represents the D-Bus property "HasMultipleUsers". ++ * ++ * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side. ++ */ ++ g_object_interface_install_property (iface, ++ g_param_spec_boolean ("has-multiple-users", "HasMultipleUsers", "HasMultipleUsers", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); ++} ++ ++/** ++ * gsd_accounts_get_daemon_version: (skip) ++ * @object: A #GsdAccounts. ++ * ++ * Gets the value of the "DaemonVersion" D-Bus property. ++ * ++ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side. ++ * ++ * The returned value is only valid until the property changes so on the client-side it is only safe to use this function on the thread where @object was constructed. Use gsd_accounts_dup_daemon_version() if on another thread. ++ * ++ * Returns: (transfer none): The property value or %NULL if the property is not set. Do not free the returned value, it belongs to @object. ++ */ ++const gchar * ++gsd_accounts_get_daemon_version (GsdAccounts *object) ++{ ++ return GSD_ACCOUNTS_GET_IFACE (object)->get_daemon_version (object); ++} ++ ++/** ++ * gsd_accounts_dup_daemon_version: (skip) ++ * @object: A #GsdAccounts. ++ * ++ * Gets a copy of the "DaemonVersion" D-Bus property. ++ * ++ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side. ++ * ++ * Returns: (transfer full): The property value or %NULL if the property is not set. The returned value should be freed with g_free(). ++ */ ++gchar * ++gsd_accounts_dup_daemon_version (GsdAccounts *object) ++{ ++ gchar *value; ++ g_object_get (G_OBJECT (object), "daemon-version", &value, NULL); ++ return value; ++} ++ ++/** ++ * gsd_accounts_set_daemon_version: (skip) ++ * @object: A #GsdAccounts. ++ * @value: The value to set. ++ * ++ * Sets the "DaemonVersion" D-Bus property to @value. ++ * ++ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side. ++ */ ++void ++gsd_accounts_set_daemon_version (GsdAccounts *object, const gchar *value) ++{ ++ g_object_set (G_OBJECT (object), "daemon-version", value, NULL); ++} ++ ++/** ++ * gsd_accounts_get_has_no_users: (skip) ++ * @object: A #GsdAccounts. ++ * ++ * Gets the value of the "HasNoUsers" D-Bus property. ++ * ++ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side. ++ * ++ * Returns: The property value. ++ */ ++gboolean ++gsd_accounts_get_has_no_users (GsdAccounts *object) ++{ ++ return GSD_ACCOUNTS_GET_IFACE (object)->get_has_no_users (object); ++} ++ ++/** ++ * gsd_accounts_set_has_no_users: (skip) ++ * @object: A #GsdAccounts. ++ * @value: The value to set. ++ * ++ * Sets the "HasNoUsers" D-Bus property to @value. ++ * ++ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side. ++ */ ++void ++gsd_accounts_set_has_no_users (GsdAccounts *object, gboolean value) ++{ ++ g_object_set (G_OBJECT (object), "has-no-users", value, NULL); ++} ++ ++/** ++ * gsd_accounts_get_has_multiple_users: (skip) ++ * @object: A #GsdAccounts. ++ * ++ * Gets the value of the "HasMultipleUsers" D-Bus property. ++ * ++ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side. ++ * ++ * Returns: The property value. ++ */ ++gboolean ++gsd_accounts_get_has_multiple_users (GsdAccounts *object) ++{ ++ return GSD_ACCOUNTS_GET_IFACE (object)->get_has_multiple_users (object); ++} ++ ++/** ++ * gsd_accounts_set_has_multiple_users: (skip) ++ * @object: A #GsdAccounts. ++ * @value: The value to set. ++ * ++ * Sets the "HasMultipleUsers" D-Bus property to @value. ++ * ++ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side. ++ */ ++void ++gsd_accounts_set_has_multiple_users (GsdAccounts *object, gboolean value) ++{ ++ g_object_set (G_OBJECT (object), "has-multiple-users", value, NULL); ++} ++ ++/** ++ * gsd_accounts_emit_user_added: ++ * @object: A #GsdAccounts. ++ * @arg_user: Argument to pass with the signal. ++ * ++ * Emits the "UserAdded" D-Bus signal. ++ */ ++void ++gsd_accounts_emit_user_added ( ++ GsdAccounts *object, ++ const gchar *arg_user) ++{ ++ g_signal_emit_by_name (object, "user-added", arg_user); ++} ++ ++/** ++ * gsd_accounts_emit_user_deleted: ++ * @object: A #GsdAccounts. ++ * @arg_user: Argument to pass with the signal. ++ * ++ * Emits the "UserDeleted" D-Bus signal. ++ */ ++void ++gsd_accounts_emit_user_deleted ( ++ GsdAccounts *object, ++ const gchar *arg_user) ++{ ++ g_signal_emit_by_name (object, "user-deleted", arg_user); ++} ++ ++/** ++ * gsd_accounts_call_list_cached_users: ++ * @proxy: A #GsdAccountsProxy. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. ++ * @user_data: User data to pass to @callback. ++ * ++ * Asynchronously invokes the ListCachedUsers() D-Bus method on @proxy. ++ * When the operation is finished, @callback will be invoked in the thread-default main loop of the thread you are calling this method from. ++ * You can then call gsd_accounts_call_list_cached_users_finish() to get the result of the operation. ++ * ++ * See gsd_accounts_call_list_cached_users_sync() for the synchronous, blocking version of this method. ++ */ ++void ++gsd_accounts_call_list_cached_users ( ++ GsdAccounts *proxy, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data) ++{ ++ g_dbus_proxy_call (G_DBUS_PROXY (proxy), ++ "ListCachedUsers", ++ g_variant_new ("()"), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancellable, ++ callback, ++ user_data); ++} ++ ++/** ++ * gsd_accounts_call_list_cached_users_finish: ++ * @proxy: A #GsdAccountsProxy. ++ * @out_users: (out): Return location for return parameter or %NULL to ignore. ++ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to gsd_accounts_call_list_cached_users(). ++ * @error: Return location for error or %NULL. ++ * ++ * Finishes an operation started with gsd_accounts_call_list_cached_users(). ++ * ++ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. ++ */ ++gboolean ++gsd_accounts_call_list_cached_users_finish ( ++ GsdAccounts *proxy, ++ gchar ***out_users, ++ GAsyncResult *res, ++ GError **error) ++{ ++ GVariant *_ret; ++ _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); ++ if (_ret == NULL) ++ goto _out; ++ g_variant_get (_ret, ++ "(^ao)", ++ out_users); ++ g_variant_unref (_ret); ++_out: ++ return _ret != NULL; ++} ++ ++/** ++ * gsd_accounts_call_list_cached_users_sync: ++ * @proxy: A #GsdAccountsProxy. ++ * @out_users: (out): Return location for return parameter or %NULL to ignore. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @error: Return location for error or %NULL. ++ * ++ * Synchronously invokes the ListCachedUsers() D-Bus method on @proxy. The calling thread is blocked until a reply is received. ++ * ++ * See gsd_accounts_call_list_cached_users() for the asynchronous version of this method. ++ * ++ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. ++ */ ++gboolean ++gsd_accounts_call_list_cached_users_sync ( ++ GsdAccounts *proxy, ++ gchar ***out_users, ++ GCancellable *cancellable, ++ GError **error) ++{ ++ GVariant *_ret; ++ _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), ++ "ListCachedUsers", ++ g_variant_new ("()"), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancellable, ++ error); ++ if (_ret == NULL) ++ goto _out; ++ g_variant_get (_ret, ++ "(^ao)", ++ out_users); ++ g_variant_unref (_ret); ++_out: ++ return _ret != NULL; ++} ++ ++/** ++ * gsd_accounts_call_find_user_by_id: ++ * @proxy: A #GsdAccountsProxy. ++ * @arg_id: Argument to pass with the method invocation. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. ++ * @user_data: User data to pass to @callback. ++ * ++ * Asynchronously invokes the FindUserById() D-Bus method on @proxy. ++ * When the operation is finished, @callback will be invoked in the thread-default main loop of the thread you are calling this method from. ++ * You can then call gsd_accounts_call_find_user_by_id_finish() to get the result of the operation. ++ * ++ * See gsd_accounts_call_find_user_by_id_sync() for the synchronous, blocking version of this method. ++ */ ++void ++gsd_accounts_call_find_user_by_id ( ++ GsdAccounts *proxy, ++ gint64 arg_id, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data) ++{ ++ g_dbus_proxy_call (G_DBUS_PROXY (proxy), ++ "FindUserById", ++ g_variant_new ("(x)", ++ arg_id), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancellable, ++ callback, ++ user_data); ++} ++ ++/** ++ * gsd_accounts_call_find_user_by_id_finish: ++ * @proxy: A #GsdAccountsProxy. ++ * @out_user: (out): Return location for return parameter or %NULL to ignore. ++ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to gsd_accounts_call_find_user_by_id(). ++ * @error: Return location for error or %NULL. ++ * ++ * Finishes an operation started with gsd_accounts_call_find_user_by_id(). ++ * ++ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. ++ */ ++gboolean ++gsd_accounts_call_find_user_by_id_finish ( ++ GsdAccounts *proxy, ++ gchar **out_user, ++ GAsyncResult *res, ++ GError **error) ++{ ++ GVariant *_ret; ++ _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); ++ if (_ret == NULL) ++ goto _out; ++ g_variant_get (_ret, ++ "(o)", ++ out_user); ++ g_variant_unref (_ret); ++_out: ++ return _ret != NULL; ++} ++ ++/** ++ * gsd_accounts_call_find_user_by_id_sync: ++ * @proxy: A #GsdAccountsProxy. ++ * @arg_id: Argument to pass with the method invocation. ++ * @out_user: (out): Return location for return parameter or %NULL to ignore. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @error: Return location for error or %NULL. ++ * ++ * Synchronously invokes the FindUserById() D-Bus method on @proxy. The calling thread is blocked until a reply is received. ++ * ++ * See gsd_accounts_call_find_user_by_id() for the asynchronous version of this method. ++ * ++ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. ++ */ ++gboolean ++gsd_accounts_call_find_user_by_id_sync ( ++ GsdAccounts *proxy, ++ gint64 arg_id, ++ gchar **out_user, ++ GCancellable *cancellable, ++ GError **error) ++{ ++ GVariant *_ret; ++ _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), ++ "FindUserById", ++ g_variant_new ("(x)", ++ arg_id), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancellable, ++ error); ++ if (_ret == NULL) ++ goto _out; ++ g_variant_get (_ret, ++ "(o)", ++ out_user); ++ g_variant_unref (_ret); ++_out: ++ return _ret != NULL; ++} ++ ++/** ++ * gsd_accounts_call_find_user_by_name: ++ * @proxy: A #GsdAccountsProxy. ++ * @arg_name: Argument to pass with the method invocation. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. ++ * @user_data: User data to pass to @callback. ++ * ++ * Asynchronously invokes the FindUserByName() D-Bus method on @proxy. ++ * When the operation is finished, @callback will be invoked in the thread-default main loop of the thread you are calling this method from. ++ * You can then call gsd_accounts_call_find_user_by_name_finish() to get the result of the operation. ++ * ++ * See gsd_accounts_call_find_user_by_name_sync() for the synchronous, blocking version of this method. ++ */ ++void ++gsd_accounts_call_find_user_by_name ( ++ GsdAccounts *proxy, ++ const gchar *arg_name, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data) ++{ ++ g_dbus_proxy_call (G_DBUS_PROXY (proxy), ++ "FindUserByName", ++ g_variant_new ("(s)", ++ arg_name), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancellable, ++ callback, ++ user_data); ++} ++ ++/** ++ * gsd_accounts_call_find_user_by_name_finish: ++ * @proxy: A #GsdAccountsProxy. ++ * @out_user: (out): Return location for return parameter or %NULL to ignore. ++ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to gsd_accounts_call_find_user_by_name(). ++ * @error: Return location for error or %NULL. ++ * ++ * Finishes an operation started with gsd_accounts_call_find_user_by_name(). ++ * ++ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. ++ */ ++gboolean ++gsd_accounts_call_find_user_by_name_finish ( ++ GsdAccounts *proxy, ++ gchar **out_user, ++ GAsyncResult *res, ++ GError **error) ++{ ++ GVariant *_ret; ++ _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); ++ if (_ret == NULL) ++ goto _out; ++ g_variant_get (_ret, ++ "(o)", ++ out_user); ++ g_variant_unref (_ret); ++_out: ++ return _ret != NULL; ++} ++ ++/** ++ * gsd_accounts_call_find_user_by_name_sync: ++ * @proxy: A #GsdAccountsProxy. ++ * @arg_name: Argument to pass with the method invocation. ++ * @out_user: (out): Return location for return parameter or %NULL to ignore. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @error: Return location for error or %NULL. ++ * ++ * Synchronously invokes the FindUserByName() D-Bus method on @proxy. The calling thread is blocked until a reply is received. ++ * ++ * See gsd_accounts_call_find_user_by_name() for the asynchronous version of this method. ++ * ++ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. ++ */ ++gboolean ++gsd_accounts_call_find_user_by_name_sync ( ++ GsdAccounts *proxy, ++ const gchar *arg_name, ++ gchar **out_user, ++ GCancellable *cancellable, ++ GError **error) ++{ ++ GVariant *_ret; ++ _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), ++ "FindUserByName", ++ g_variant_new ("(s)", ++ arg_name), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancellable, ++ error); ++ if (_ret == NULL) ++ goto _out; ++ g_variant_get (_ret, ++ "(o)", ++ out_user); ++ g_variant_unref (_ret); ++_out: ++ return _ret != NULL; ++} ++ ++/** ++ * gsd_accounts_call_create_user: ++ * @proxy: A #GsdAccountsProxy. ++ * @arg_name: Argument to pass with the method invocation. ++ * @arg_fullname: Argument to pass with the method invocation. ++ * @arg_accountType: Argument to pass with the method invocation. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. ++ * @user_data: User data to pass to @callback. ++ * ++ * Asynchronously invokes the CreateUser() D-Bus method on @proxy. ++ * When the operation is finished, @callback will be invoked in the thread-default main loop of the thread you are calling this method from. ++ * You can then call gsd_accounts_call_create_user_finish() to get the result of the operation. ++ * ++ * See gsd_accounts_call_create_user_sync() for the synchronous, blocking version of this method. ++ */ ++void ++gsd_accounts_call_create_user ( ++ GsdAccounts *proxy, ++ const gchar *arg_name, ++ const gchar *arg_fullname, ++ gint arg_accountType, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data) ++{ ++ g_dbus_proxy_call (G_DBUS_PROXY (proxy), ++ "CreateUser", ++ g_variant_new ("(ssi)", ++ arg_name, ++ arg_fullname, ++ arg_accountType), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancellable, ++ callback, ++ user_data); ++} ++ ++/** ++ * gsd_accounts_call_create_user_finish: ++ * @proxy: A #GsdAccountsProxy. ++ * @out_user: (out): Return location for return parameter or %NULL to ignore. ++ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to gsd_accounts_call_create_user(). ++ * @error: Return location for error or %NULL. ++ * ++ * Finishes an operation started with gsd_accounts_call_create_user(). ++ * ++ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. ++ */ ++gboolean ++gsd_accounts_call_create_user_finish ( ++ GsdAccounts *proxy, ++ gchar **out_user, ++ GAsyncResult *res, ++ GError **error) ++{ ++ GVariant *_ret; ++ _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); ++ if (_ret == NULL) ++ goto _out; ++ g_variant_get (_ret, ++ "(o)", ++ out_user); ++ g_variant_unref (_ret); ++_out: ++ return _ret != NULL; ++} ++ ++/** ++ * gsd_accounts_call_create_user_sync: ++ * @proxy: A #GsdAccountsProxy. ++ * @arg_name: Argument to pass with the method invocation. ++ * @arg_fullname: Argument to pass with the method invocation. ++ * @arg_accountType: Argument to pass with the method invocation. ++ * @out_user: (out): Return location for return parameter or %NULL to ignore. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @error: Return location for error or %NULL. ++ * ++ * Synchronously invokes the CreateUser() D-Bus method on @proxy. The calling thread is blocked until a reply is received. ++ * ++ * See gsd_accounts_call_create_user() for the asynchronous version of this method. ++ * ++ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. ++ */ ++gboolean ++gsd_accounts_call_create_user_sync ( ++ GsdAccounts *proxy, ++ const gchar *arg_name, ++ const gchar *arg_fullname, ++ gint arg_accountType, ++ gchar **out_user, ++ GCancellable *cancellable, ++ GError **error) ++{ ++ GVariant *_ret; ++ _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), ++ "CreateUser", ++ g_variant_new ("(ssi)", ++ arg_name, ++ arg_fullname, ++ arg_accountType), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancellable, ++ error); ++ if (_ret == NULL) ++ goto _out; ++ g_variant_get (_ret, ++ "(o)", ++ out_user); ++ g_variant_unref (_ret); ++_out: ++ return _ret != NULL; ++} ++ ++/** ++ * gsd_accounts_call_cache_user: ++ * @proxy: A #GsdAccountsProxy. ++ * @arg_name: Argument to pass with the method invocation. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. ++ * @user_data: User data to pass to @callback. ++ * ++ * Asynchronously invokes the CacheUser() D-Bus method on @proxy. ++ * When the operation is finished, @callback will be invoked in the thread-default main loop of the thread you are calling this method from. ++ * You can then call gsd_accounts_call_cache_user_finish() to get the result of the operation. ++ * ++ * See gsd_accounts_call_cache_user_sync() for the synchronous, blocking version of this method. ++ */ ++void ++gsd_accounts_call_cache_user ( ++ GsdAccounts *proxy, ++ const gchar *arg_name, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data) ++{ ++ g_dbus_proxy_call (G_DBUS_PROXY (proxy), ++ "CacheUser", ++ g_variant_new ("(s)", ++ arg_name), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancellable, ++ callback, ++ user_data); ++} ++ ++/** ++ * gsd_accounts_call_cache_user_finish: ++ * @proxy: A #GsdAccountsProxy. ++ * @out_user: (out): Return location for return parameter or %NULL to ignore. ++ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to gsd_accounts_call_cache_user(). ++ * @error: Return location for error or %NULL. ++ * ++ * Finishes an operation started with gsd_accounts_call_cache_user(). ++ * ++ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. ++ */ ++gboolean ++gsd_accounts_call_cache_user_finish ( ++ GsdAccounts *proxy, ++ gchar **out_user, ++ GAsyncResult *res, ++ GError **error) ++{ ++ GVariant *_ret; ++ _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); ++ if (_ret == NULL) ++ goto _out; ++ g_variant_get (_ret, ++ "(o)", ++ out_user); ++ g_variant_unref (_ret); ++_out: ++ return _ret != NULL; ++} ++ ++/** ++ * gsd_accounts_call_cache_user_sync: ++ * @proxy: A #GsdAccountsProxy. ++ * @arg_name: Argument to pass with the method invocation. ++ * @out_user: (out): Return location for return parameter or %NULL to ignore. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @error: Return location for error or %NULL. ++ * ++ * Synchronously invokes the CacheUser() D-Bus method on @proxy. The calling thread is blocked until a reply is received. ++ * ++ * See gsd_accounts_call_cache_user() for the asynchronous version of this method. ++ * ++ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. ++ */ ++gboolean ++gsd_accounts_call_cache_user_sync ( ++ GsdAccounts *proxy, ++ const gchar *arg_name, ++ gchar **out_user, ++ GCancellable *cancellable, ++ GError **error) ++{ ++ GVariant *_ret; ++ _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), ++ "CacheUser", ++ g_variant_new ("(s)", ++ arg_name), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancellable, ++ error); ++ if (_ret == NULL) ++ goto _out; ++ g_variant_get (_ret, ++ "(o)", ++ out_user); ++ g_variant_unref (_ret); ++_out: ++ return _ret != NULL; ++} ++ ++/** ++ * gsd_accounts_call_uncache_user: ++ * @proxy: A #GsdAccountsProxy. ++ * @arg_name: Argument to pass with the method invocation. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. ++ * @user_data: User data to pass to @callback. ++ * ++ * Asynchronously invokes the UncacheUser() D-Bus method on @proxy. ++ * When the operation is finished, @callback will be invoked in the thread-default main loop of the thread you are calling this method from. ++ * You can then call gsd_accounts_call_uncache_user_finish() to get the result of the operation. ++ * ++ * See gsd_accounts_call_uncache_user_sync() for the synchronous, blocking version of this method. ++ */ ++void ++gsd_accounts_call_uncache_user ( ++ GsdAccounts *proxy, ++ const gchar *arg_name, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data) ++{ ++ g_dbus_proxy_call (G_DBUS_PROXY (proxy), ++ "UncacheUser", ++ g_variant_new ("(s)", ++ arg_name), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancellable, ++ callback, ++ user_data); ++} ++ ++/** ++ * gsd_accounts_call_uncache_user_finish: ++ * @proxy: A #GsdAccountsProxy. ++ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to gsd_accounts_call_uncache_user(). ++ * @error: Return location for error or %NULL. ++ * ++ * Finishes an operation started with gsd_accounts_call_uncache_user(). ++ * ++ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. ++ */ ++gboolean ++gsd_accounts_call_uncache_user_finish ( ++ GsdAccounts *proxy, ++ GAsyncResult *res, ++ GError **error) ++{ ++ GVariant *_ret; ++ _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); ++ if (_ret == NULL) ++ goto _out; ++ g_variant_get (_ret, ++ "()"); ++ g_variant_unref (_ret); ++_out: ++ return _ret != NULL; ++} ++ ++/** ++ * gsd_accounts_call_uncache_user_sync: ++ * @proxy: A #GsdAccountsProxy. ++ * @arg_name: Argument to pass with the method invocation. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @error: Return location for error or %NULL. ++ * ++ * Synchronously invokes the UncacheUser() D-Bus method on @proxy. The calling thread is blocked until a reply is received. ++ * ++ * See gsd_accounts_call_uncache_user() for the asynchronous version of this method. ++ * ++ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. ++ */ ++gboolean ++gsd_accounts_call_uncache_user_sync ( ++ GsdAccounts *proxy, ++ const gchar *arg_name, ++ GCancellable *cancellable, ++ GError **error) ++{ ++ GVariant *_ret; ++ _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), ++ "UncacheUser", ++ g_variant_new ("(s)", ++ arg_name), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancellable, ++ error); ++ if (_ret == NULL) ++ goto _out; ++ g_variant_get (_ret, ++ "()"); ++ g_variant_unref (_ret); ++_out: ++ return _ret != NULL; ++} ++ ++/** ++ * gsd_accounts_call_delete_user: ++ * @proxy: A #GsdAccountsProxy. ++ * @arg_id: Argument to pass with the method invocation. ++ * @arg_removeFiles: Argument to pass with the method invocation. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. ++ * @user_data: User data to pass to @callback. ++ * ++ * Asynchronously invokes the DeleteUser() D-Bus method on @proxy. ++ * When the operation is finished, @callback will be invoked in the thread-default main loop of the thread you are calling this method from. ++ * You can then call gsd_accounts_call_delete_user_finish() to get the result of the operation. ++ * ++ * See gsd_accounts_call_delete_user_sync() for the synchronous, blocking version of this method. ++ */ ++void ++gsd_accounts_call_delete_user ( ++ GsdAccounts *proxy, ++ gint64 arg_id, ++ gboolean arg_removeFiles, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data) ++{ ++ g_dbus_proxy_call (G_DBUS_PROXY (proxy), ++ "DeleteUser", ++ g_variant_new ("(xb)", ++ arg_id, ++ arg_removeFiles), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancellable, ++ callback, ++ user_data); ++} ++ ++/** ++ * gsd_accounts_call_delete_user_finish: ++ * @proxy: A #GsdAccountsProxy. ++ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to gsd_accounts_call_delete_user(). ++ * @error: Return location for error or %NULL. ++ * ++ * Finishes an operation started with gsd_accounts_call_delete_user(). ++ * ++ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. ++ */ ++gboolean ++gsd_accounts_call_delete_user_finish ( ++ GsdAccounts *proxy, ++ GAsyncResult *res, ++ GError **error) ++{ ++ GVariant *_ret; ++ _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); ++ if (_ret == NULL) ++ goto _out; ++ g_variant_get (_ret, ++ "()"); ++ g_variant_unref (_ret); ++_out: ++ return _ret != NULL; ++} ++ ++/** ++ * gsd_accounts_call_delete_user_sync: ++ * @proxy: A #GsdAccountsProxy. ++ * @arg_id: Argument to pass with the method invocation. ++ * @arg_removeFiles: Argument to pass with the method invocation. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @error: Return location for error or %NULL. ++ * ++ * Synchronously invokes the DeleteUser() D-Bus method on @proxy. The calling thread is blocked until a reply is received. ++ * ++ * See gsd_accounts_call_delete_user() for the asynchronous version of this method. ++ * ++ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. ++ */ ++gboolean ++gsd_accounts_call_delete_user_sync ( ++ GsdAccounts *proxy, ++ gint64 arg_id, ++ gboolean arg_removeFiles, ++ GCancellable *cancellable, ++ GError **error) ++{ ++ GVariant *_ret; ++ _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), ++ "DeleteUser", ++ g_variant_new ("(xb)", ++ arg_id, ++ arg_removeFiles), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancellable, ++ error); ++ if (_ret == NULL) ++ goto _out; ++ g_variant_get (_ret, ++ "()"); ++ g_variant_unref (_ret); ++_out: ++ return _ret != NULL; ++} ++ ++/** ++ * gsd_accounts_complete_list_cached_users: ++ * @object: A #GsdAccounts. ++ * @invocation: (transfer full): A #GDBusMethodInvocation. ++ * @users: Parameter to return. ++ * ++ * Helper function used in service implementations to finish handling invocations of the ListCachedUsers() D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. ++ * ++ * This method will free @invocation, you cannot use it afterwards. ++ */ ++void ++gsd_accounts_complete_list_cached_users ( ++ GsdAccounts *object, ++ GDBusMethodInvocation *invocation, ++ const gchar *const *users) ++{ ++ g_dbus_method_invocation_return_value (invocation, ++ g_variant_new ("(^ao)", ++ users)); ++} ++ ++/** ++ * gsd_accounts_complete_find_user_by_id: ++ * @object: A #GsdAccounts. ++ * @invocation: (transfer full): A #GDBusMethodInvocation. ++ * @user: Parameter to return. ++ * ++ * Helper function used in service implementations to finish handling invocations of the FindUserById() D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. ++ * ++ * This method will free @invocation, you cannot use it afterwards. ++ */ ++void ++gsd_accounts_complete_find_user_by_id ( ++ GsdAccounts *object, ++ GDBusMethodInvocation *invocation, ++ const gchar *user) ++{ ++ g_dbus_method_invocation_return_value (invocation, ++ g_variant_new ("(o)", ++ user)); ++} ++ ++/** ++ * gsd_accounts_complete_find_user_by_name: ++ * @object: A #GsdAccounts. ++ * @invocation: (transfer full): A #GDBusMethodInvocation. ++ * @user: Parameter to return. ++ * ++ * Helper function used in service implementations to finish handling invocations of the FindUserByName() D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. ++ * ++ * This method will free @invocation, you cannot use it afterwards. ++ */ ++void ++gsd_accounts_complete_find_user_by_name ( ++ GsdAccounts *object, ++ GDBusMethodInvocation *invocation, ++ const gchar *user) ++{ ++ g_dbus_method_invocation_return_value (invocation, ++ g_variant_new ("(o)", ++ user)); ++} ++ ++/** ++ * gsd_accounts_complete_create_user: ++ * @object: A #GsdAccounts. ++ * @invocation: (transfer full): A #GDBusMethodInvocation. ++ * @user: Parameter to return. ++ * ++ * Helper function used in service implementations to finish handling invocations of the CreateUser() D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. ++ * ++ * This method will free @invocation, you cannot use it afterwards. ++ */ ++void ++gsd_accounts_complete_create_user ( ++ GsdAccounts *object, ++ GDBusMethodInvocation *invocation, ++ const gchar *user) ++{ ++ g_dbus_method_invocation_return_value (invocation, ++ g_variant_new ("(o)", ++ user)); ++} ++ ++/** ++ * gsd_accounts_complete_cache_user: ++ * @object: A #GsdAccounts. ++ * @invocation: (transfer full): A #GDBusMethodInvocation. ++ * @user: Parameter to return. ++ * ++ * Helper function used in service implementations to finish handling invocations of the CacheUser() D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. ++ * ++ * This method will free @invocation, you cannot use it afterwards. ++ */ ++void ++gsd_accounts_complete_cache_user ( ++ GsdAccounts *object, ++ GDBusMethodInvocation *invocation, ++ const gchar *user) ++{ ++ g_dbus_method_invocation_return_value (invocation, ++ g_variant_new ("(o)", ++ user)); ++} ++ ++/** ++ * gsd_accounts_complete_uncache_user: ++ * @object: A #GsdAccounts. ++ * @invocation: (transfer full): A #GDBusMethodInvocation. ++ * ++ * Helper function used in service implementations to finish handling invocations of the UncacheUser() D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. ++ * ++ * This method will free @invocation, you cannot use it afterwards. ++ */ ++void ++gsd_accounts_complete_uncache_user ( ++ GsdAccounts *object, ++ GDBusMethodInvocation *invocation) ++{ ++ g_dbus_method_invocation_return_value (invocation, ++ g_variant_new ("()")); ++} ++ ++/** ++ * gsd_accounts_complete_delete_user: ++ * @object: A #GsdAccounts. ++ * @invocation: (transfer full): A #GDBusMethodInvocation. ++ * ++ * Helper function used in service implementations to finish handling invocations of the DeleteUser() D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. ++ * ++ * This method will free @invocation, you cannot use it afterwards. ++ */ ++void ++gsd_accounts_complete_delete_user ( ++ GsdAccounts *object, ++ GDBusMethodInvocation *invocation) ++{ ++ g_dbus_method_invocation_return_value (invocation, ++ g_variant_new ("()")); ++} ++ ++/* ------------------------------------------------------------------------ */ ++ ++/** ++ * GsdAccountsProxy: ++ * ++ * The #GsdAccountsProxy structure contains only private data and should only be accessed using the provided API. ++ */ ++ ++/** ++ * GsdAccountsProxyClass: ++ * @parent_class: The parent class. ++ * ++ * Class structure for #GsdAccountsProxy. ++ */ ++ ++struct _GsdAccountsProxyPrivate ++{ ++ GData *qdata; ++}; ++ ++static void gsd_accounts_proxy_iface_init (GsdAccountsIface *iface); ++ ++#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38 ++G_DEFINE_TYPE_WITH_CODE (GsdAccountsProxy, gsd_accounts_proxy, G_TYPE_DBUS_PROXY, ++ G_ADD_PRIVATE (GsdAccountsProxy) ++ G_IMPLEMENT_INTERFACE (GSD_TYPE_ACCOUNTS, gsd_accounts_proxy_iface_init)) ++ ++#else ++G_DEFINE_TYPE_WITH_CODE (GsdAccountsProxy, gsd_accounts_proxy, G_TYPE_DBUS_PROXY, ++ G_IMPLEMENT_INTERFACE (GSD_TYPE_ACCOUNTS, gsd_accounts_proxy_iface_init)) ++ ++#endif ++static void ++gsd_accounts_proxy_finalize (GObject *object) ++{ ++ GsdAccountsProxy *proxy = GSD_ACCOUNTS_PROXY (object); ++ g_datalist_clear (&proxy->priv->qdata); ++ G_OBJECT_CLASS (gsd_accounts_proxy_parent_class)->finalize (object); ++} ++ ++static void ++gsd_accounts_proxy_get_property (GObject *object, ++ guint prop_id, ++ GValue *value, ++ GParamSpec *pspec G_GNUC_UNUSED) ++{ ++ const _ExtendedGDBusPropertyInfo *info; ++ GVariant *variant; ++ g_assert (prop_id != 0 && prop_id - 1 < 3); ++ info = _gsd_accounts_property_info_pointers[prop_id - 1]; ++ variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (object), info->parent_struct.name); ++ if (info->use_gvariant) ++ { ++ g_value_set_variant (value, variant); ++ } ++ else ++ { ++ if (variant != NULL) ++ g_dbus_gvariant_to_gvalue (variant, value); ++ } ++ if (variant != NULL) ++ g_variant_unref (variant); ++} ++ ++static void ++gsd_accounts_proxy_set_property_cb (GDBusProxy *proxy, ++ GAsyncResult *res, ++ gpointer user_data) ++{ ++ const _ExtendedGDBusPropertyInfo *info = user_data; ++ GError *error; ++ GVariant *_ret; ++ error = NULL; ++ _ret = g_dbus_proxy_call_finish (proxy, res, &error); ++ if (!_ret) ++ { ++ g_warning ("Error setting property '%s' on interface org.freedesktop.Accounts: %s (%s, %d)", ++ info->parent_struct.name, ++ error->message, g_quark_to_string (error->domain), error->code); ++ g_error_free (error); ++ } ++ else ++ { ++ g_variant_unref (_ret); ++ } ++} ++ ++static void ++gsd_accounts_proxy_set_property (GObject *object, ++ guint prop_id, ++ const GValue *value, ++ GParamSpec *pspec G_GNUC_UNUSED) ++{ ++ const _ExtendedGDBusPropertyInfo *info; ++ GVariant *variant; ++ g_assert (prop_id != 0 && prop_id - 1 < 3); ++ info = _gsd_accounts_property_info_pointers[prop_id - 1]; ++ variant = g_dbus_gvalue_to_gvariant (value, G_VARIANT_TYPE (info->parent_struct.signature)); ++ g_dbus_proxy_call (G_DBUS_PROXY (object), ++ "org.freedesktop.DBus.Properties.Set", ++ g_variant_new ("(ssv)", "org.freedesktop.Accounts", info->parent_struct.name, variant), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ NULL, (GAsyncReadyCallback) gsd_accounts_proxy_set_property_cb, (GDBusPropertyInfo *) &info->parent_struct); ++ g_variant_unref (variant); ++} ++ ++static void ++gsd_accounts_proxy_g_signal (GDBusProxy *proxy, ++ const gchar *sender_name G_GNUC_UNUSED, ++ const gchar *signal_name, ++ GVariant *parameters) ++{ ++ _ExtendedGDBusSignalInfo *info; ++ GVariantIter iter; ++ GVariant *child; ++ GValue *paramv; ++ gsize num_params; ++ gsize n; ++ guint signal_id; ++ info = (_ExtendedGDBusSignalInfo *) g_dbus_interface_info_lookup_signal ((GDBusInterfaceInfo *) &_gsd_accounts_interface_info.parent_struct, signal_name); ++ if (info == NULL) ++ return; ++ num_params = g_variant_n_children (parameters); ++ paramv = g_new0 (GValue, num_params + 1); ++ g_value_init (¶mv[0], GSD_TYPE_ACCOUNTS); ++ g_value_set_object (¶mv[0], proxy); ++ g_variant_iter_init (&iter, parameters); ++ n = 1; ++ while ((child = g_variant_iter_next_value (&iter)) != NULL) ++ { ++ _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.args[n - 1]; ++ if (arg_info->use_gvariant) ++ { ++ g_value_init (¶mv[n], G_TYPE_VARIANT); ++ g_value_set_variant (¶mv[n], child); ++ n++; ++ } ++ else ++ g_dbus_gvariant_to_gvalue (child, ¶mv[n++]); ++ g_variant_unref (child); ++ } ++ signal_id = g_signal_lookup (info->signal_name, GSD_TYPE_ACCOUNTS); ++ g_signal_emitv (paramv, signal_id, 0, NULL); ++ for (n = 0; n < num_params + 1; n++) ++ g_value_unset (¶mv[n]); ++ g_free (paramv); ++} ++ ++static void ++gsd_accounts_proxy_g_properties_changed (GDBusProxy *_proxy, ++ GVariant *changed_properties, ++ const gchar *const *invalidated_properties) ++{ ++ GsdAccountsProxy *proxy = GSD_ACCOUNTS_PROXY (_proxy); ++ guint n; ++ const gchar *key; ++ GVariantIter *iter; ++ _ExtendedGDBusPropertyInfo *info; ++ g_variant_get (changed_properties, "a{sv}", &iter); ++ while (g_variant_iter_next (iter, "{&sv}", &key, NULL)) ++ { ++ info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_gsd_accounts_interface_info.parent_struct, key); ++ g_datalist_remove_data (&proxy->priv->qdata, key); ++ if (info != NULL) ++ g_object_notify (G_OBJECT (proxy), info->hyphen_name); ++ } ++ g_variant_iter_free (iter); ++ for (n = 0; invalidated_properties[n] != NULL; n++) ++ { ++ info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_gsd_accounts_interface_info.parent_struct, invalidated_properties[n]); ++ g_datalist_remove_data (&proxy->priv->qdata, invalidated_properties[n]); ++ if (info != NULL) ++ g_object_notify (G_OBJECT (proxy), info->hyphen_name); ++ } ++} ++ ++static const gchar * ++gsd_accounts_proxy_get_daemon_version (GsdAccounts *object) ++{ ++ GsdAccountsProxy *proxy = GSD_ACCOUNTS_PROXY (object); ++ GVariant *variant; ++ const gchar *value = NULL; ++ variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "DaemonVersion"); ++ if (variant != NULL) ++ { ++ value = g_variant_get_string (variant, NULL); ++ g_variant_unref (variant); ++ } ++ return value; ++} ++ ++static gboolean ++gsd_accounts_proxy_get_has_no_users (GsdAccounts *object) ++{ ++ GsdAccountsProxy *proxy = GSD_ACCOUNTS_PROXY (object); ++ GVariant *variant; ++ gboolean value = 0; ++ variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "HasNoUsers"); ++ if (variant != NULL) ++ { ++ value = g_variant_get_boolean (variant); ++ g_variant_unref (variant); ++ } ++ return value; ++} ++ ++static gboolean ++gsd_accounts_proxy_get_has_multiple_users (GsdAccounts *object) ++{ ++ GsdAccountsProxy *proxy = GSD_ACCOUNTS_PROXY (object); ++ GVariant *variant; ++ gboolean value = 0; ++ variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "HasMultipleUsers"); ++ if (variant != NULL) ++ { ++ value = g_variant_get_boolean (variant); ++ g_variant_unref (variant); ++ } ++ return value; ++} ++ ++static void ++gsd_accounts_proxy_init (GsdAccountsProxy *proxy) ++{ ++#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38 ++ proxy->priv = gsd_accounts_proxy_get_instance_private (proxy); ++#else ++ proxy->priv = G_TYPE_INSTANCE_GET_PRIVATE (proxy, GSD_TYPE_ACCOUNTS_PROXY, GsdAccountsProxyPrivate); ++#endif ++ ++ g_dbus_proxy_set_interface_info (G_DBUS_PROXY (proxy), gsd_accounts_interface_info ()); ++} ++ ++static void ++gsd_accounts_proxy_class_init (GsdAccountsProxyClass *klass) ++{ ++ GObjectClass *gobject_class; ++ GDBusProxyClass *proxy_class; ++ ++ gobject_class = G_OBJECT_CLASS (klass); ++ gobject_class->finalize = gsd_accounts_proxy_finalize; ++ gobject_class->get_property = gsd_accounts_proxy_get_property; ++ gobject_class->set_property = gsd_accounts_proxy_set_property; ++ ++ proxy_class = G_DBUS_PROXY_CLASS (klass); ++ proxy_class->g_signal = gsd_accounts_proxy_g_signal; ++ proxy_class->g_properties_changed = gsd_accounts_proxy_g_properties_changed; ++ ++ gsd_accounts_override_properties (gobject_class, 1); ++ ++#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38 ++ g_type_class_add_private (klass, sizeof (GsdAccountsProxyPrivate)); ++#endif ++} ++ ++static void ++gsd_accounts_proxy_iface_init (GsdAccountsIface *iface) ++{ ++ iface->get_daemon_version = gsd_accounts_proxy_get_daemon_version; ++ iface->get_has_no_users = gsd_accounts_proxy_get_has_no_users; ++ iface->get_has_multiple_users = gsd_accounts_proxy_get_has_multiple_users; ++} ++ ++/** ++ * gsd_accounts_proxy_new: ++ * @connection: A #GDBusConnection. ++ * @flags: Flags from the #GDBusProxyFlags enumeration. ++ * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus connection. ++ * @object_path: An object path. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @callback: A #GAsyncReadyCallback to call when the request is satisfied. ++ * @user_data: User data to pass to @callback. ++ * ++ * Asynchronously creates a proxy for the D-Bus interface org.freedesktop.Accounts. See g_dbus_proxy_new() for more details. ++ * ++ * When the operation is finished, @callback will be invoked in the thread-default main loop of the thread you are calling this method from. ++ * You can then call gsd_accounts_proxy_new_finish() to get the result of the operation. ++ * ++ * See gsd_accounts_proxy_new_sync() for the synchronous, blocking version of this constructor. ++ */ ++void ++gsd_accounts_proxy_new ( ++ GDBusConnection *connection, ++ GDBusProxyFlags flags, ++ const gchar *name, ++ const gchar *object_path, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data) ++{ ++ g_async_initable_new_async (GSD_TYPE_ACCOUNTS_PROXY, G_PRIORITY_DEFAULT, cancellable, callback, user_data, "g-flags", flags, "g-name", name, "g-connection", connection, "g-object-path", object_path, "g-interface-name", "org.freedesktop.Accounts", NULL); ++} ++ ++/** ++ * gsd_accounts_proxy_new_finish: ++ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to gsd_accounts_proxy_new(). ++ * @error: Return location for error or %NULL ++ * ++ * Finishes an operation started with gsd_accounts_proxy_new(). ++ * ++ * Returns: (transfer full) (type GsdAccountsProxy): The constructed proxy object or %NULL if @error is set. ++ */ ++GsdAccounts * ++gsd_accounts_proxy_new_finish ( ++ GAsyncResult *res, ++ GError **error) ++{ ++ GObject *ret; ++ GObject *source_object; ++ source_object = g_async_result_get_source_object (res); ++ ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error); ++ g_object_unref (source_object); ++ if (ret != NULL) ++ return GSD_ACCOUNTS (ret); ++ else ++ return NULL; ++} ++ ++/** ++ * gsd_accounts_proxy_new_sync: ++ * @connection: A #GDBusConnection. ++ * @flags: Flags from the #GDBusProxyFlags enumeration. ++ * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus connection. ++ * @object_path: An object path. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @error: Return location for error or %NULL ++ * ++ * Synchronously creates a proxy for the D-Bus interface org.freedesktop.Accounts. See g_dbus_proxy_new_sync() for more details. ++ * ++ * The calling thread is blocked until a reply is received. ++ * ++ * See gsd_accounts_proxy_new() for the asynchronous version of this constructor. ++ * ++ * Returns: (transfer full) (type GsdAccountsProxy): The constructed proxy object or %NULL if @error is set. ++ */ ++GsdAccounts * ++gsd_accounts_proxy_new_sync ( ++ GDBusConnection *connection, ++ GDBusProxyFlags flags, ++ const gchar *name, ++ const gchar *object_path, ++ GCancellable *cancellable, ++ GError **error) ++{ ++ GInitable *ret; ++ ret = g_initable_new (GSD_TYPE_ACCOUNTS_PROXY, cancellable, error, "g-flags", flags, "g-name", name, "g-connection", connection, "g-object-path", object_path, "g-interface-name", "org.freedesktop.Accounts", NULL); ++ if (ret != NULL) ++ return GSD_ACCOUNTS (ret); ++ else ++ return NULL; ++} ++ ++ ++/** ++ * gsd_accounts_proxy_new_for_bus: ++ * @bus_type: A #GBusType. ++ * @flags: Flags from the #GDBusProxyFlags enumeration. ++ * @name: A bus name (well-known or unique). ++ * @object_path: An object path. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @callback: A #GAsyncReadyCallback to call when the request is satisfied. ++ * @user_data: User data to pass to @callback. ++ * ++ * Like gsd_accounts_proxy_new() but takes a #GBusType instead of a #GDBusConnection. ++ * ++ * When the operation is finished, @callback will be invoked in the thread-default main loop of the thread you are calling this method from. ++ * You can then call gsd_accounts_proxy_new_for_bus_finish() to get the result of the operation. ++ * ++ * See gsd_accounts_proxy_new_for_bus_sync() for the synchronous, blocking version of this constructor. ++ */ ++void ++gsd_accounts_proxy_new_for_bus ( ++ GBusType bus_type, ++ GDBusProxyFlags flags, ++ const gchar *name, ++ const gchar *object_path, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data) ++{ ++ g_async_initable_new_async (GSD_TYPE_ACCOUNTS_PROXY, G_PRIORITY_DEFAULT, cancellable, callback, user_data, "g-flags", flags, "g-name", name, "g-bus-type", bus_type, "g-object-path", object_path, "g-interface-name", "org.freedesktop.Accounts", NULL); ++} ++ ++/** ++ * gsd_accounts_proxy_new_for_bus_finish: ++ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to gsd_accounts_proxy_new_for_bus(). ++ * @error: Return location for error or %NULL ++ * ++ * Finishes an operation started with gsd_accounts_proxy_new_for_bus(). ++ * ++ * Returns: (transfer full) (type GsdAccountsProxy): The constructed proxy object or %NULL if @error is set. ++ */ ++GsdAccounts * ++gsd_accounts_proxy_new_for_bus_finish ( ++ GAsyncResult *res, ++ GError **error) ++{ ++ GObject *ret; ++ GObject *source_object; ++ source_object = g_async_result_get_source_object (res); ++ ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error); ++ g_object_unref (source_object); ++ if (ret != NULL) ++ return GSD_ACCOUNTS (ret); ++ else ++ return NULL; ++} ++ ++/** ++ * gsd_accounts_proxy_new_for_bus_sync: ++ * @bus_type: A #GBusType. ++ * @flags: Flags from the #GDBusProxyFlags enumeration. ++ * @name: A bus name (well-known or unique). ++ * @object_path: An object path. ++ * @cancellable: (allow-none): A #GCancellable or %NULL. ++ * @error: Return location for error or %NULL ++ * ++ * Like gsd_accounts_proxy_new_sync() but takes a #GBusType instead of a #GDBusConnection. ++ * ++ * The calling thread is blocked until a reply is received. ++ * ++ * See gsd_accounts_proxy_new_for_bus() for the asynchronous version of this constructor. ++ * ++ * Returns: (transfer full) (type GsdAccountsProxy): The constructed proxy object or %NULL if @error is set. ++ */ ++GsdAccounts * ++gsd_accounts_proxy_new_for_bus_sync ( ++ GBusType bus_type, ++ GDBusProxyFlags flags, ++ const gchar *name, ++ const gchar *object_path, ++ GCancellable *cancellable, ++ GError **error) ++{ ++ GInitable *ret; ++ ret = g_initable_new (GSD_TYPE_ACCOUNTS_PROXY, cancellable, error, "g-flags", flags, "g-name", name, "g-bus-type", bus_type, "g-object-path", object_path, "g-interface-name", "org.freedesktop.Accounts", NULL); ++ if (ret != NULL) ++ return GSD_ACCOUNTS (ret); ++ else ++ return NULL; ++} ++ ++ ++/* ------------------------------------------------------------------------ */ ++ ++/** ++ * GsdAccountsSkeleton: ++ * ++ * The #GsdAccountsSkeleton structure contains only private data and should only be accessed using the provided API. ++ */ ++ ++/** ++ * GsdAccountsSkeletonClass: ++ * @parent_class: The parent class. ++ * ++ * Class structure for #GsdAccountsSkeleton. ++ */ ++ ++struct _GsdAccountsSkeletonPrivate ++{ ++ GValue *properties; ++ GList *changed_properties; ++ GSource *changed_properties_idle_source; ++ GMainContext *context; ++ GMutex lock; ++}; ++ ++static void ++_gsd_accounts_skeleton_handle_method_call ( ++ GDBusConnection *connection G_GNUC_UNUSED, ++ const gchar *sender G_GNUC_UNUSED, ++ const gchar *object_path G_GNUC_UNUSED, ++ const gchar *interface_name, ++ const gchar *method_name, ++ GVariant *parameters, ++ GDBusMethodInvocation *invocation, ++ gpointer user_data) ++{ ++ GsdAccountsSkeleton *skeleton = GSD_ACCOUNTS_SKELETON (user_data); ++ _ExtendedGDBusMethodInfo *info; ++ GVariantIter iter; ++ GVariant *child; ++ GValue *paramv; ++ gsize num_params; ++ guint num_extra; ++ gsize n; ++ guint signal_id; ++ GValue return_value = G_VALUE_INIT; ++ info = (_ExtendedGDBusMethodInfo *) g_dbus_method_invocation_get_method_info (invocation); ++ g_assert (info != NULL); ++ num_params = g_variant_n_children (parameters); ++ num_extra = info->pass_fdlist ? 3 : 2; paramv = g_new0 (GValue, num_params + num_extra); ++ n = 0; ++ g_value_init (¶mv[n], GSD_TYPE_ACCOUNTS); ++ g_value_set_object (¶mv[n++], skeleton); ++ g_value_init (¶mv[n], G_TYPE_DBUS_METHOD_INVOCATION); ++ g_value_set_object (¶mv[n++], invocation); ++ if (info->pass_fdlist) ++ { ++#ifdef G_OS_UNIX ++ g_value_init (¶mv[n], G_TYPE_UNIX_FD_LIST); ++ g_value_set_object (¶mv[n++], g_dbus_message_get_unix_fd_list (g_dbus_method_invocation_get_message (invocation))); ++#else ++ g_assert_not_reached (); ++#endif ++ } ++ g_variant_iter_init (&iter, parameters); ++ while ((child = g_variant_iter_next_value (&iter)) != NULL) ++ { ++ _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.in_args[n - num_extra]; ++ if (arg_info->use_gvariant) ++ { ++ g_value_init (¶mv[n], G_TYPE_VARIANT); ++ g_value_set_variant (¶mv[n], child); ++ n++; ++ } ++ else ++ g_dbus_gvariant_to_gvalue (child, ¶mv[n++]); ++ g_variant_unref (child); ++ } ++ signal_id = g_signal_lookup (info->signal_name, GSD_TYPE_ACCOUNTS); ++ g_value_init (&return_value, G_TYPE_BOOLEAN); ++ g_signal_emitv (paramv, signal_id, 0, &return_value); ++ if (!g_value_get_boolean (&return_value)) ++ g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD, "Method %s is not implemented on interface %s", method_name, interface_name); ++ g_value_unset (&return_value); ++ for (n = 0; n < num_params + num_extra; n++) ++ g_value_unset (¶mv[n]); ++ g_free (paramv); ++} ++ ++static GVariant * ++_gsd_accounts_skeleton_handle_get_property ( ++ GDBusConnection *connection G_GNUC_UNUSED, ++ const gchar *sender G_GNUC_UNUSED, ++ const gchar *object_path G_GNUC_UNUSED, ++ const gchar *interface_name G_GNUC_UNUSED, ++ const gchar *property_name, ++ GError **error, ++ gpointer user_data) ++{ ++ GsdAccountsSkeleton *skeleton = GSD_ACCOUNTS_SKELETON (user_data); ++ GValue value = G_VALUE_INIT; ++ GParamSpec *pspec; ++ _ExtendedGDBusPropertyInfo *info; ++ GVariant *ret; ++ ret = NULL; ++ info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_gsd_accounts_interface_info.parent_struct, property_name); ++ g_assert (info != NULL); ++ pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name); ++ if (pspec == NULL) ++ { ++ g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %s", property_name); ++ } ++ else ++ { ++ g_value_init (&value, pspec->value_type); ++ g_object_get_property (G_OBJECT (skeleton), info->hyphen_name, &value); ++ ret = g_dbus_gvalue_to_gvariant (&value, G_VARIANT_TYPE (info->parent_struct.signature)); ++ g_value_unset (&value); ++ } ++ return ret; ++} ++ ++static gboolean ++_gsd_accounts_skeleton_handle_set_property ( ++ GDBusConnection *connection G_GNUC_UNUSED, ++ const gchar *sender G_GNUC_UNUSED, ++ const gchar *object_path G_GNUC_UNUSED, ++ const gchar *interface_name G_GNUC_UNUSED, ++ const gchar *property_name, ++ GVariant *variant, ++ GError **error, ++ gpointer user_data) ++{ ++ GsdAccountsSkeleton *skeleton = GSD_ACCOUNTS_SKELETON (user_data); ++ GValue value = G_VALUE_INIT; ++ GParamSpec *pspec; ++ _ExtendedGDBusPropertyInfo *info; ++ gboolean ret; ++ ret = FALSE; ++ info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_gsd_accounts_interface_info.parent_struct, property_name); ++ g_assert (info != NULL); ++ pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name); ++ if (pspec == NULL) ++ { ++ g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %s", property_name); ++ } ++ else ++ { ++ if (info->use_gvariant) ++ g_value_set_variant (&value, variant); ++ else ++ g_dbus_gvariant_to_gvalue (variant, &value); ++ g_object_set_property (G_OBJECT (skeleton), info->hyphen_name, &value); ++ g_value_unset (&value); ++ ret = TRUE; ++ } ++ return ret; ++} ++ ++static const GDBusInterfaceVTable _gsd_accounts_skeleton_vtable = ++{ ++ _gsd_accounts_skeleton_handle_method_call, ++ _gsd_accounts_skeleton_handle_get_property, ++ _gsd_accounts_skeleton_handle_set_property, ++ {NULL} ++}; ++ ++static GDBusInterfaceInfo * ++gsd_accounts_skeleton_dbus_interface_get_info (GDBusInterfaceSkeleton *skeleton G_GNUC_UNUSED) ++{ ++ return gsd_accounts_interface_info (); ++} ++ ++static GDBusInterfaceVTable * ++gsd_accounts_skeleton_dbus_interface_get_vtable (GDBusInterfaceSkeleton *skeleton G_GNUC_UNUSED) ++{ ++ return (GDBusInterfaceVTable *) &_gsd_accounts_skeleton_vtable; ++} ++ ++static GVariant * ++gsd_accounts_skeleton_dbus_interface_get_properties (GDBusInterfaceSkeleton *_skeleton) ++{ ++ GsdAccountsSkeleton *skeleton = GSD_ACCOUNTS_SKELETON (_skeleton); ++ ++ GVariantBuilder builder; ++ guint n; ++ g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}")); ++ if (_gsd_accounts_interface_info.parent_struct.properties == NULL) ++ goto out; ++ for (n = 0; _gsd_accounts_interface_info.parent_struct.properties[n] != NULL; n++) ++ { ++ GDBusPropertyInfo *info = _gsd_accounts_interface_info.parent_struct.properties[n]; ++ if (info->flags & G_DBUS_PROPERTY_INFO_FLAGS_READABLE) ++ { ++ GVariant *value; ++ value = _gsd_accounts_skeleton_handle_get_property (g_dbus_interface_skeleton_get_connection (G_DBUS_INTERFACE_SKELETON (skeleton)), NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)), "org.freedesktop.Accounts", info->name, NULL, skeleton); ++ if (value != NULL) ++ { ++ g_variant_take_ref (value); ++ g_variant_builder_add (&builder, "{sv}", info->name, value); ++ g_variant_unref (value); ++ } ++ } ++ } ++out: ++ return g_variant_builder_end (&builder); ++} ++ ++static gboolean _gsd_accounts_emit_changed (gpointer user_data); ++ ++static void ++gsd_accounts_skeleton_dbus_interface_flush (GDBusInterfaceSkeleton *_skeleton) ++{ ++ GsdAccountsSkeleton *skeleton = GSD_ACCOUNTS_SKELETON (_skeleton); ++ gboolean emit_changed = FALSE; ++ ++ g_mutex_lock (&skeleton->priv->lock); ++ if (skeleton->priv->changed_properties_idle_source != NULL) ++ { ++ g_source_destroy (skeleton->priv->changed_properties_idle_source); ++ skeleton->priv->changed_properties_idle_source = NULL; ++ emit_changed = TRUE; ++ } ++ g_mutex_unlock (&skeleton->priv->lock); ++ ++ if (emit_changed) ++ _gsd_accounts_emit_changed (skeleton); ++} ++ ++static void ++_gsd_accounts_on_signal_user_added ( ++ GsdAccounts *object, ++ const gchar *arg_user) ++{ ++ GsdAccountsSkeleton *skeleton = GSD_ACCOUNTS_SKELETON (object); ++ ++ GList *connections, *l; ++ GVariant *signal_variant; ++ connections = g_dbus_interface_skeleton_get_connections (G_DBUS_INTERFACE_SKELETON (skeleton)); ++ ++ signal_variant = g_variant_ref_sink (g_variant_new ("(o)", ++ arg_user)); ++ for (l = connections; l != NULL; l = l->next) ++ { ++ GDBusConnection *connection = l->data; ++ g_dbus_connection_emit_signal (connection, ++ NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)), "org.freedesktop.Accounts", "UserAdded", ++ signal_variant, NULL); ++ } ++ g_variant_unref (signal_variant); ++ g_list_free_full (connections, g_object_unref); ++} ++ ++static void ++_gsd_accounts_on_signal_user_deleted ( ++ GsdAccounts *object, ++ const gchar *arg_user) ++{ ++ GsdAccountsSkeleton *skeleton = GSD_ACCOUNTS_SKELETON (object); ++ ++ GList *connections, *l; ++ GVariant *signal_variant; ++ connections = g_dbus_interface_skeleton_get_connections (G_DBUS_INTERFACE_SKELETON (skeleton)); ++ ++ signal_variant = g_variant_ref_sink (g_variant_new ("(o)", ++ arg_user)); ++ for (l = connections; l != NULL; l = l->next) ++ { ++ GDBusConnection *connection = l->data; ++ g_dbus_connection_emit_signal (connection, ++ NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)), "org.freedesktop.Accounts", "UserDeleted", ++ signal_variant, NULL); ++ } ++ g_variant_unref (signal_variant); ++ g_list_free_full (connections, g_object_unref); ++} ++ ++static void gsd_accounts_skeleton_iface_init (GsdAccountsIface *iface); ++#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38 ++G_DEFINE_TYPE_WITH_CODE (GsdAccountsSkeleton, gsd_accounts_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON, ++ G_ADD_PRIVATE (GsdAccountsSkeleton) ++ G_IMPLEMENT_INTERFACE (GSD_TYPE_ACCOUNTS, gsd_accounts_skeleton_iface_init)) ++ ++#else ++G_DEFINE_TYPE_WITH_CODE (GsdAccountsSkeleton, gsd_accounts_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON, ++ G_IMPLEMENT_INTERFACE (GSD_TYPE_ACCOUNTS, gsd_accounts_skeleton_iface_init)) ++ ++#endif ++static void ++gsd_accounts_skeleton_finalize (GObject *object) ++{ ++ GsdAccountsSkeleton *skeleton = GSD_ACCOUNTS_SKELETON (object); ++ guint n; ++ for (n = 0; n < 3; n++) ++ g_value_unset (&skeleton->priv->properties[n]); ++ g_free (skeleton->priv->properties); ++ g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free); ++ if (skeleton->priv->changed_properties_idle_source != NULL) ++ g_source_destroy (skeleton->priv->changed_properties_idle_source); ++ g_main_context_unref (skeleton->priv->context); ++ g_mutex_clear (&skeleton->priv->lock); ++ G_OBJECT_CLASS (gsd_accounts_skeleton_parent_class)->finalize (object); ++} ++ ++static void ++gsd_accounts_skeleton_get_property (GObject *object, ++ guint prop_id, ++ GValue *value, ++ GParamSpec *pspec G_GNUC_UNUSED) ++{ ++ GsdAccountsSkeleton *skeleton = GSD_ACCOUNTS_SKELETON (object); ++ g_assert (prop_id != 0 && prop_id - 1 < 3); ++ g_mutex_lock (&skeleton->priv->lock); ++ g_value_copy (&skeleton->priv->properties[prop_id - 1], value); ++ g_mutex_unlock (&skeleton->priv->lock); ++} ++ ++static gboolean ++_gsd_accounts_emit_changed (gpointer user_data) ++{ ++ GsdAccountsSkeleton *skeleton = GSD_ACCOUNTS_SKELETON (user_data); ++ GList *l; ++ GVariantBuilder builder; ++ GVariantBuilder invalidated_builder; ++ guint num_changes; ++ ++ g_mutex_lock (&skeleton->priv->lock); ++ g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}")); ++ g_variant_builder_init (&invalidated_builder, G_VARIANT_TYPE ("as")); ++ for (l = skeleton->priv->changed_properties, num_changes = 0; l != NULL; l = l->next) ++ { ++ ChangedProperty *cp = l->data; ++ GVariant *variant; ++ const GValue *cur_value; ++ ++ cur_value = &skeleton->priv->properties[cp->prop_id - 1]; ++ if (!_g_value_equal (cur_value, &cp->orig_value)) ++ { ++ variant = g_dbus_gvalue_to_gvariant (cur_value, G_VARIANT_TYPE (cp->info->parent_struct.signature)); ++ g_variant_builder_add (&builder, "{sv}", cp->info->parent_struct.name, variant); ++ g_variant_unref (variant); ++ num_changes++; ++ } ++ } ++ if (num_changes > 0) ++ { ++ GList *connections, *ll; ++ GVariant *signal_variant; ++ signal_variant = g_variant_ref_sink (g_variant_new ("(sa{sv}as)", "org.freedesktop.Accounts", ++ &builder, &invalidated_builder)); ++ connections = g_dbus_interface_skeleton_get_connections (G_DBUS_INTERFACE_SKELETON (skeleton)); ++ for (ll = connections; ll != NULL; ll = ll->next) ++ { ++ GDBusConnection *connection = ll->data; ++ ++ g_dbus_connection_emit_signal (connection, ++ NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)), ++ "org.freedesktop.DBus.Properties", ++ "PropertiesChanged", ++ signal_variant, ++ NULL); ++ } ++ g_variant_unref (signal_variant); ++ g_list_free_full (connections, g_object_unref); ++ } ++ else ++ { ++ g_variant_builder_clear (&builder); ++ g_variant_builder_clear (&invalidated_builder); ++ } ++ g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free); ++ skeleton->priv->changed_properties = NULL; ++ skeleton->priv->changed_properties_idle_source = NULL; ++ g_mutex_unlock (&skeleton->priv->lock); ++ return FALSE; ++} ++ ++static void ++_gsd_accounts_schedule_emit_changed (GsdAccountsSkeleton *skeleton, const _ExtendedGDBusPropertyInfo *info, guint prop_id, const GValue *orig_value) ++{ ++ ChangedProperty *cp; ++ GList *l; ++ cp = NULL; ++ for (l = skeleton->priv->changed_properties; l != NULL; l = l->next) ++ { ++ ChangedProperty *i_cp = l->data; ++ if (i_cp->info == info) ++ { ++ cp = i_cp; ++ break; ++ } ++ } ++ if (cp == NULL) ++ { ++ cp = g_new0 (ChangedProperty, 1); ++ cp->prop_id = prop_id; ++ cp->info = info; ++ skeleton->priv->changed_properties = g_list_prepend (skeleton->priv->changed_properties, cp); ++ g_value_init (&cp->orig_value, G_VALUE_TYPE (orig_value)); ++ g_value_copy (orig_value, &cp->orig_value); ++ } ++} ++ ++static void ++gsd_accounts_skeleton_notify (GObject *object, ++ GParamSpec *pspec G_GNUC_UNUSED) ++{ ++ GsdAccountsSkeleton *skeleton = GSD_ACCOUNTS_SKELETON (object); ++ g_mutex_lock (&skeleton->priv->lock); ++ if (skeleton->priv->changed_properties != NULL && ++ skeleton->priv->changed_properties_idle_source == NULL) ++ { ++ skeleton->priv->changed_properties_idle_source = g_idle_source_new (); ++ g_source_set_priority (skeleton->priv->changed_properties_idle_source, G_PRIORITY_DEFAULT); ++ g_source_set_callback (skeleton->priv->changed_properties_idle_source, _gsd_accounts_emit_changed, g_object_ref (skeleton), (GDestroyNotify) g_object_unref); ++ g_source_set_name (skeleton->priv->changed_properties_idle_source, "[generated] _gsd_accounts_emit_changed"); ++ g_source_attach (skeleton->priv->changed_properties_idle_source, skeleton->priv->context); ++ g_source_unref (skeleton->priv->changed_properties_idle_source); ++ } ++ g_mutex_unlock (&skeleton->priv->lock); ++} ++ ++static void ++gsd_accounts_skeleton_set_property (GObject *object, ++ guint prop_id, ++ const GValue *value, ++ GParamSpec *pspec) ++{ ++ GsdAccountsSkeleton *skeleton = GSD_ACCOUNTS_SKELETON (object); ++ g_assert (prop_id != 0 && prop_id - 1 < 3); ++ g_mutex_lock (&skeleton->priv->lock); ++ g_object_freeze_notify (object); ++ if (!_g_value_equal (value, &skeleton->priv->properties[prop_id - 1])) ++ { ++ if (g_dbus_interface_skeleton_get_connection (G_DBUS_INTERFACE_SKELETON (skeleton)) != NULL) ++ _gsd_accounts_schedule_emit_changed (skeleton, _gsd_accounts_property_info_pointers[prop_id - 1], prop_id, &skeleton->priv->properties[prop_id - 1]); ++ g_value_copy (value, &skeleton->priv->properties[prop_id - 1]); ++ g_object_notify_by_pspec (object, pspec); ++ } ++ g_mutex_unlock (&skeleton->priv->lock); ++ g_object_thaw_notify (object); ++} ++ ++static void ++gsd_accounts_skeleton_init (GsdAccountsSkeleton *skeleton) ++{ ++#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38 ++ skeleton->priv = gsd_accounts_skeleton_get_instance_private (skeleton); ++#else ++ skeleton->priv = G_TYPE_INSTANCE_GET_PRIVATE (skeleton, GSD_TYPE_ACCOUNTS_SKELETON, GsdAccountsSkeletonPrivate); ++#endif ++ ++ g_mutex_init (&skeleton->priv->lock); ++ skeleton->priv->context = g_main_context_ref_thread_default (); ++ skeleton->priv->properties = g_new0 (GValue, 3); ++ g_value_init (&skeleton->priv->properties[0], G_TYPE_STRING); ++ g_value_init (&skeleton->priv->properties[1], G_TYPE_BOOLEAN); ++ g_value_init (&skeleton->priv->properties[2], G_TYPE_BOOLEAN); ++} ++ ++static const gchar * ++gsd_accounts_skeleton_get_daemon_version (GsdAccounts *object) ++{ ++ GsdAccountsSkeleton *skeleton = GSD_ACCOUNTS_SKELETON (object); ++ const gchar *value; ++ g_mutex_lock (&skeleton->priv->lock); ++ value = g_value_get_string (&(skeleton->priv->properties[0])); ++ g_mutex_unlock (&skeleton->priv->lock); ++ return value; ++} ++ ++static gboolean ++gsd_accounts_skeleton_get_has_no_users (GsdAccounts *object) ++{ ++ GsdAccountsSkeleton *skeleton = GSD_ACCOUNTS_SKELETON (object); ++ gboolean value; ++ g_mutex_lock (&skeleton->priv->lock); ++ value = g_value_get_boolean (&(skeleton->priv->properties[1])); ++ g_mutex_unlock (&skeleton->priv->lock); ++ return value; ++} ++ ++static gboolean ++gsd_accounts_skeleton_get_has_multiple_users (GsdAccounts *object) ++{ ++ GsdAccountsSkeleton *skeleton = GSD_ACCOUNTS_SKELETON (object); ++ gboolean value; ++ g_mutex_lock (&skeleton->priv->lock); ++ value = g_value_get_boolean (&(skeleton->priv->properties[2])); ++ g_mutex_unlock (&skeleton->priv->lock); ++ return value; ++} ++ ++static void ++gsd_accounts_skeleton_class_init (GsdAccountsSkeletonClass *klass) ++{ ++ GObjectClass *gobject_class; ++ GDBusInterfaceSkeletonClass *skeleton_class; ++ ++ gobject_class = G_OBJECT_CLASS (klass); ++ gobject_class->finalize = gsd_accounts_skeleton_finalize; ++ gobject_class->get_property = gsd_accounts_skeleton_get_property; ++ gobject_class->set_property = gsd_accounts_skeleton_set_property; ++ gobject_class->notify = gsd_accounts_skeleton_notify; ++ ++ ++ gsd_accounts_override_properties (gobject_class, 1); ++ ++ skeleton_class = G_DBUS_INTERFACE_SKELETON_CLASS (klass); ++ skeleton_class->get_info = gsd_accounts_skeleton_dbus_interface_get_info; ++ skeleton_class->get_properties = gsd_accounts_skeleton_dbus_interface_get_properties; ++ skeleton_class->flush = gsd_accounts_skeleton_dbus_interface_flush; ++ skeleton_class->get_vtable = gsd_accounts_skeleton_dbus_interface_get_vtable; ++ ++#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38 ++ g_type_class_add_private (klass, sizeof (GsdAccountsSkeletonPrivate)); ++#endif ++} ++ ++static void ++gsd_accounts_skeleton_iface_init (GsdAccountsIface *iface) ++{ ++ iface->user_added = _gsd_accounts_on_signal_user_added; ++ iface->user_deleted = _gsd_accounts_on_signal_user_deleted; ++ iface->get_daemon_version = gsd_accounts_skeleton_get_daemon_version; ++ iface->get_has_no_users = gsd_accounts_skeleton_get_has_no_users; ++ iface->get_has_multiple_users = gsd_accounts_skeleton_get_has_multiple_users; ++} ++ ++/** ++ * gsd_accounts_skeleton_new: ++ * ++ * Creates a skeleton object for the D-Bus interface org.freedesktop.Accounts. ++ * ++ * Returns: (transfer full) (type GsdAccountsSkeleton): The skeleton object. ++ */ ++GsdAccounts * ++gsd_accounts_skeleton_new (void) ++{ ++ return GSD_ACCOUNTS (g_object_new (GSD_TYPE_ACCOUNTS_SKELETON, NULL)); ++} +diff --git a/plugins/account/org.freedesktop.Accounts.h b/plugins/account/org.freedesktop.Accounts.h +new file mode 100644 +index 00000000..b8d0625e +--- /dev/null ++++ b/plugins/account/org.freedesktop.Accounts.h +@@ -0,0 +1,400 @@ ++/* ++ * Generated by gdbus-codegen 2.54.1. DO NOT EDIT. ++ * ++ * The license of this code is the same as for the source it was derived from. ++ */ ++ ++#ifndef __ORG_FREEDESKTOP_ACCOUNTS_H__ ++#define __ORG_FREEDESKTOP_ACCOUNTS_H__ ++ ++#include ++ ++G_BEGIN_DECLS ++ ++ ++/* ------------------------------------------------------------------------ */ ++/* Declarations for org.freedesktop.Accounts */ ++ ++#define GSD_TYPE_ACCOUNTS (gsd_accounts_get_type ()) ++#define GSD_ACCOUNTS(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GSD_TYPE_ACCOUNTS, GsdAccounts)) ++#define GSD_IS_ACCOUNTS(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GSD_TYPE_ACCOUNTS)) ++#define GSD_ACCOUNTS_GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE ((o), GSD_TYPE_ACCOUNTS, GsdAccountsIface)) ++ ++struct _GsdAccounts; ++typedef struct _GsdAccounts GsdAccounts; ++typedef struct _GsdAccountsIface GsdAccountsIface; ++ ++struct _GsdAccountsIface ++{ ++ GTypeInterface parent_iface; ++ ++ ++ ++ gboolean (*handle_cache_user) ( ++ GsdAccounts *object, ++ GDBusMethodInvocation *invocation, ++ const gchar *arg_name); ++ ++ gboolean (*handle_create_user) ( ++ GsdAccounts *object, ++ GDBusMethodInvocation *invocation, ++ const gchar *arg_name, ++ const gchar *arg_fullname, ++ gint arg_accountType); ++ ++ gboolean (*handle_delete_user) ( ++ GsdAccounts *object, ++ GDBusMethodInvocation *invocation, ++ gint64 arg_id, ++ gboolean arg_removeFiles); ++ ++ gboolean (*handle_find_user_by_id) ( ++ GsdAccounts *object, ++ GDBusMethodInvocation *invocation, ++ gint64 arg_id); ++ ++ gboolean (*handle_find_user_by_name) ( ++ GsdAccounts *object, ++ GDBusMethodInvocation *invocation, ++ const gchar *arg_name); ++ ++ gboolean (*handle_list_cached_users) ( ++ GsdAccounts *object, ++ GDBusMethodInvocation *invocation); ++ ++ gboolean (*handle_uncache_user) ( ++ GsdAccounts *object, ++ GDBusMethodInvocation *invocation, ++ const gchar *arg_name); ++ ++ const gchar * (*get_daemon_version) (GsdAccounts *object); ++ ++ gboolean (*get_has_multiple_users) (GsdAccounts *object); ++ ++ gboolean (*get_has_no_users) (GsdAccounts *object); ++ ++ void (*user_added) ( ++ GsdAccounts *object, ++ const gchar *arg_user); ++ ++ void (*user_deleted) ( ++ GsdAccounts *object, ++ const gchar *arg_user); ++ ++}; ++ ++GType gsd_accounts_get_type (void) G_GNUC_CONST; ++ ++GDBusInterfaceInfo *gsd_accounts_interface_info (void); ++guint gsd_accounts_override_properties (GObjectClass *klass, guint property_id_begin); ++ ++ ++/* D-Bus method call completion functions: */ ++void gsd_accounts_complete_list_cached_users ( ++ GsdAccounts *object, ++ GDBusMethodInvocation *invocation, ++ const gchar *const *users); ++ ++void gsd_accounts_complete_find_user_by_id ( ++ GsdAccounts *object, ++ GDBusMethodInvocation *invocation, ++ const gchar *user); ++ ++void gsd_accounts_complete_find_user_by_name ( ++ GsdAccounts *object, ++ GDBusMethodInvocation *invocation, ++ const gchar *user); ++ ++void gsd_accounts_complete_create_user ( ++ GsdAccounts *object, ++ GDBusMethodInvocation *invocation, ++ const gchar *user); ++ ++void gsd_accounts_complete_cache_user ( ++ GsdAccounts *object, ++ GDBusMethodInvocation *invocation, ++ const gchar *user); ++ ++void gsd_accounts_complete_uncache_user ( ++ GsdAccounts *object, ++ GDBusMethodInvocation *invocation); ++ ++void gsd_accounts_complete_delete_user ( ++ GsdAccounts *object, ++ GDBusMethodInvocation *invocation); ++ ++ ++ ++/* D-Bus signal emissions functions: */ ++void gsd_accounts_emit_user_added ( ++ GsdAccounts *object, ++ const gchar *arg_user); ++ ++void gsd_accounts_emit_user_deleted ( ++ GsdAccounts *object, ++ const gchar *arg_user); ++ ++ ++ ++/* D-Bus method calls: */ ++void gsd_accounts_call_list_cached_users ( ++ GsdAccounts *proxy, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data); ++ ++gboolean gsd_accounts_call_list_cached_users_finish ( ++ GsdAccounts *proxy, ++ gchar ***out_users, ++ GAsyncResult *res, ++ GError **error); ++ ++gboolean gsd_accounts_call_list_cached_users_sync ( ++ GsdAccounts *proxy, ++ gchar ***out_users, ++ GCancellable *cancellable, ++ GError **error); ++ ++void gsd_accounts_call_find_user_by_id ( ++ GsdAccounts *proxy, ++ gint64 arg_id, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data); ++ ++gboolean gsd_accounts_call_find_user_by_id_finish ( ++ GsdAccounts *proxy, ++ gchar **out_user, ++ GAsyncResult *res, ++ GError **error); ++ ++gboolean gsd_accounts_call_find_user_by_id_sync ( ++ GsdAccounts *proxy, ++ gint64 arg_id, ++ gchar **out_user, ++ GCancellable *cancellable, ++ GError **error); ++ ++void gsd_accounts_call_find_user_by_name ( ++ GsdAccounts *proxy, ++ const gchar *arg_name, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data); ++ ++gboolean gsd_accounts_call_find_user_by_name_finish ( ++ GsdAccounts *proxy, ++ gchar **out_user, ++ GAsyncResult *res, ++ GError **error); ++ ++gboolean gsd_accounts_call_find_user_by_name_sync ( ++ GsdAccounts *proxy, ++ const gchar *arg_name, ++ gchar **out_user, ++ GCancellable *cancellable, ++ GError **error); ++ ++void gsd_accounts_call_create_user ( ++ GsdAccounts *proxy, ++ const gchar *arg_name, ++ const gchar *arg_fullname, ++ gint arg_accountType, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data); ++ ++gboolean gsd_accounts_call_create_user_finish ( ++ GsdAccounts *proxy, ++ gchar **out_user, ++ GAsyncResult *res, ++ GError **error); ++ ++gboolean gsd_accounts_call_create_user_sync ( ++ GsdAccounts *proxy, ++ const gchar *arg_name, ++ const gchar *arg_fullname, ++ gint arg_accountType, ++ gchar **out_user, ++ GCancellable *cancellable, ++ GError **error); ++ ++void gsd_accounts_call_cache_user ( ++ GsdAccounts *proxy, ++ const gchar *arg_name, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data); ++ ++gboolean gsd_accounts_call_cache_user_finish ( ++ GsdAccounts *proxy, ++ gchar **out_user, ++ GAsyncResult *res, ++ GError **error); ++ ++gboolean gsd_accounts_call_cache_user_sync ( ++ GsdAccounts *proxy, ++ const gchar *arg_name, ++ gchar **out_user, ++ GCancellable *cancellable, ++ GError **error); ++ ++void gsd_accounts_call_uncache_user ( ++ GsdAccounts *proxy, ++ const gchar *arg_name, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data); ++ ++gboolean gsd_accounts_call_uncache_user_finish ( ++ GsdAccounts *proxy, ++ GAsyncResult *res, ++ GError **error); ++ ++gboolean gsd_accounts_call_uncache_user_sync ( ++ GsdAccounts *proxy, ++ const gchar *arg_name, ++ GCancellable *cancellable, ++ GError **error); ++ ++void gsd_accounts_call_delete_user ( ++ GsdAccounts *proxy, ++ gint64 arg_id, ++ gboolean arg_removeFiles, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data); ++ ++gboolean gsd_accounts_call_delete_user_finish ( ++ GsdAccounts *proxy, ++ GAsyncResult *res, ++ GError **error); ++ ++gboolean gsd_accounts_call_delete_user_sync ( ++ GsdAccounts *proxy, ++ gint64 arg_id, ++ gboolean arg_removeFiles, ++ GCancellable *cancellable, ++ GError **error); ++ ++ ++ ++/* D-Bus property accessors: */ ++const gchar *gsd_accounts_get_daemon_version (GsdAccounts *object); ++gchar *gsd_accounts_dup_daemon_version (GsdAccounts *object); ++void gsd_accounts_set_daemon_version (GsdAccounts *object, const gchar *value); ++ ++gboolean gsd_accounts_get_has_no_users (GsdAccounts *object); ++void gsd_accounts_set_has_no_users (GsdAccounts *object, gboolean value); ++ ++gboolean gsd_accounts_get_has_multiple_users (GsdAccounts *object); ++void gsd_accounts_set_has_multiple_users (GsdAccounts *object, gboolean value); ++ ++ ++/* ---- */ ++ ++#define GSD_TYPE_ACCOUNTS_PROXY (gsd_accounts_proxy_get_type ()) ++#define GSD_ACCOUNTS_PROXY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GSD_TYPE_ACCOUNTS_PROXY, GsdAccountsProxy)) ++#define GSD_ACCOUNTS_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), GSD_TYPE_ACCOUNTS_PROXY, GsdAccountsProxyClass)) ++#define GSD_ACCOUNTS_PROXY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GSD_TYPE_ACCOUNTS_PROXY, GsdAccountsProxyClass)) ++#define GSD_IS_ACCOUNTS_PROXY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GSD_TYPE_ACCOUNTS_PROXY)) ++#define GSD_IS_ACCOUNTS_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GSD_TYPE_ACCOUNTS_PROXY)) ++ ++typedef struct _GsdAccountsProxy GsdAccountsProxy; ++typedef struct _GsdAccountsProxyClass GsdAccountsProxyClass; ++typedef struct _GsdAccountsProxyPrivate GsdAccountsProxyPrivate; ++ ++struct _GsdAccountsProxy ++{ ++ /*< private >*/ ++ GDBusProxy parent_instance; ++ GsdAccountsProxyPrivate *priv; ++}; ++ ++struct _GsdAccountsProxyClass ++{ ++ GDBusProxyClass parent_class; ++}; ++ ++GType gsd_accounts_proxy_get_type (void) G_GNUC_CONST; ++ ++#if GLIB_CHECK_VERSION(2, 44, 0) ++G_DEFINE_AUTOPTR_CLEANUP_FUNC (GsdAccountsProxy, g_object_unref) ++#endif ++ ++void gsd_accounts_proxy_new ( ++ GDBusConnection *connection, ++ GDBusProxyFlags flags, ++ const gchar *name, ++ const gchar *object_path, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data); ++GsdAccounts *gsd_accounts_proxy_new_finish ( ++ GAsyncResult *res, ++ GError **error); ++GsdAccounts *gsd_accounts_proxy_new_sync ( ++ GDBusConnection *connection, ++ GDBusProxyFlags flags, ++ const gchar *name, ++ const gchar *object_path, ++ GCancellable *cancellable, ++ GError **error); ++ ++void gsd_accounts_proxy_new_for_bus ( ++ GBusType bus_type, ++ GDBusProxyFlags flags, ++ const gchar *name, ++ const gchar *object_path, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data); ++GsdAccounts *gsd_accounts_proxy_new_for_bus_finish ( ++ GAsyncResult *res, ++ GError **error); ++GsdAccounts *gsd_accounts_proxy_new_for_bus_sync ( ++ GBusType bus_type, ++ GDBusProxyFlags flags, ++ const gchar *name, ++ const gchar *object_path, ++ GCancellable *cancellable, ++ GError **error); ++ ++ ++/* ---- */ ++ ++#define GSD_TYPE_ACCOUNTS_SKELETON (gsd_accounts_skeleton_get_type ()) ++#define GSD_ACCOUNTS_SKELETON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GSD_TYPE_ACCOUNTS_SKELETON, GsdAccountsSkeleton)) ++#define GSD_ACCOUNTS_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), GSD_TYPE_ACCOUNTS_SKELETON, GsdAccountsSkeletonClass)) ++#define GSD_ACCOUNTS_SKELETON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GSD_TYPE_ACCOUNTS_SKELETON, GsdAccountsSkeletonClass)) ++#define GSD_IS_ACCOUNTS_SKELETON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GSD_TYPE_ACCOUNTS_SKELETON)) ++#define GSD_IS_ACCOUNTS_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GSD_TYPE_ACCOUNTS_SKELETON)) ++ ++typedef struct _GsdAccountsSkeleton GsdAccountsSkeleton; ++typedef struct _GsdAccountsSkeletonClass GsdAccountsSkeletonClass; ++typedef struct _GsdAccountsSkeletonPrivate GsdAccountsSkeletonPrivate; ++ ++struct _GsdAccountsSkeleton ++{ ++ /*< private >*/ ++ GDBusInterfaceSkeleton parent_instance; ++ GsdAccountsSkeletonPrivate *priv; ++}; ++ ++struct _GsdAccountsSkeletonClass ++{ ++ GDBusInterfaceSkeletonClass parent_class; ++}; ++ ++GType gsd_accounts_skeleton_get_type (void) G_GNUC_CONST; ++ ++#if GLIB_CHECK_VERSION(2, 44, 0) ++G_DEFINE_AUTOPTR_CLEANUP_FUNC (GsdAccountsSkeleton, g_object_unref) ++#endif ++ ++GsdAccounts *gsd_accounts_skeleton_new (void); ++ ++ ++G_END_DECLS ++ ++#endif /* __ORG_FREEDESKTOP_ACCOUNTS_H__ */ +diff --git a/plugins/account/org.freedesktop.Accounts.xml b/plugins/account/org.freedesktop.Accounts.xml +new file mode 100644 +index 00000000..ed7db50c +--- /dev/null ++++ b/plugins/account/org.freedesktop.Accounts.xml +@@ -0,0 +1,248 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Object paths of cached users ++ ++ ++ ++ ++ ++ Lists users which have logged into the system locally before. ++ This is not meant to return an exhaustive list of all users. ++ It is possible for FindUserByName() ++ to return a user that's not on the list. ++ ++ ++ ++ ++ ++ ++ ++ ++ The uid to look up ++ ++ ++ Object path of user ++ ++ ++ ++ ++ ++ Finds a user by uid. ++ ++ ++ ++ if no user with the given uid exists ++ ++ ++ ++ ++ ++ ++ ++ The username to look up ++ ++ ++ Object path of user ++ ++ ++ ++ ++ ++ Finds a user by its username. ++ ++ ++ ++ if no user with the given username exists ++ ++ ++ ++ ++ ++ ++ ++ The username for the new user ++ ++ ++ ++ The real name for the new user ++ ++ ++ Object path of the new user ++ ++ ++ ++ The account type, encoded as an integer ++ ++ ++ ++ ++ ++ Creates a new user account. ++ ++ ++ The accountType argument can take the following values: ++ ++ ++ ++ 0 ++ Standard user ++ ++ ++ 1 ++ Administrator ++ ++ ++ ++ ++ The caller needs the org.freedesktop.accounts.user-administration PolicyKit authorization. ++ ++ ++ if the caller lacks the appropriate PolicyKit authorization ++ if the operation failed ++ ++ ++ ++ ++ ++ ++ ++ The username for the user ++ ++ ++ Object path of user ++ ++ ++ ++ ++ ++ Caches a user account, so that it shows up in ListCachedUsers() output. ++ The user name may be a remote user, but the system must be able to lookup ++ the user name and resolve the user information. ++ ++ ++ ++ The caller needs the org.freedesktop.accounts.user-administration PolicyKit authorization. ++ ++ ++ if the caller lacks the appropriate PolicyKit authorization ++ if the user name cannot be resolved ++ ++ ++ ++ ++ ++ ++ ++ The username for the user ++ ++ ++ ++ ++ ++ Releases all metadata about a user account, including icon, language and session. If the user account is ++ from a remote server and the user has never logged in before, then that account will no longer show up ++ in ListCachedUsers() output. ++ ++ ++ ++ The caller needs the org.freedesktop.accounts.user-administration PolicyKit authorization. ++ ++ ++ if the caller lacks the appropriate PolicyKit authorization ++ if the user name cannot be resolved ++ ++ ++ ++ ++ ++ ++ ++ The uid to delete ++ ++ ++ Whether to remove the users files ++ ++ ++ ++ ++ ++ Deletes a user account. ++ ++ ++ ++ The caller needs the org.freedesktop.accounts.user-administration PolicyKit authorization. ++ ++ ++ if the caller lacks the appropriate PolicyKit authorization ++ if the operation failed ++ ++ ++ ++ ++ ++ ++ Object path of the user that was added. ++ ++ ++ ++ ++ Emitted when a user is added. ++ ++ ++ ++ ++ ++ ++ ++ Object path of the user that was deleted. ++ ++ ++ ++ ++ Emitted when a user is deleted. ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ The version of the running daemon. ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Whether or not the system has no users ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Whether or not the system has multiple users ++ ++ ++ ++ ++ ++ ++ +diff --git a/plugins/account/org.gnome.SettingsDaemon.Account.desktop b/plugins/account/org.gnome.SettingsDaemon.Account.desktop +new file mode 100644 +index 00000000..388fbd54 +--- /dev/null ++++ b/plugins/account/org.gnome.SettingsDaemon.Account.desktop +@@ -0,0 +1,9 @@ ++[Desktop Entry] ++Type=Application ++Name=GNOME Settings Daemon's housekeeping plugin ++Exec=/usr/libexec/gsd-account ++OnlyShowIn=GNOME; ++NoDisplay=true ++X-GNOME-Autostart-Phase=Initialization ++X-GNOME-Autostart-Notify=true ++X-GNOME-AutoRestart=true +diff --git a/plugins/account/org.gnome.SettingsDaemon.Account.desktop.in b/plugins/account/org.gnome.SettingsDaemon.Account.desktop.in +new file mode 100644 +index 00000000..1a8ded7d +--- /dev/null ++++ b/plugins/account/org.gnome.SettingsDaemon.Account.desktop.in +@@ -0,0 +1,9 @@ ++[Desktop Entry] ++Type=Application ++Name=GNOME Settings Daemon's housekeeping plugin ++Exec=@libexecdir@/gsd-account ++OnlyShowIn=GNOME; ++NoDisplay=true ++X-GNOME-Autostart-Phase=Initialization ++X-GNOME-Autostart-Notify=true ++X-GNOME-AutoRestart=true +diff --git a/plugins/meson.build b/plugins/meson.build +index 3db69da7..3c4d42ac 100644 +--- a/plugins/meson.build ++++ b/plugins/meson.build +@@ -1,32 +1,33 @@ + enabled_plugins = [ + ['a11y-settings', 'A11ySettings'], ++ ['account', 'Account'], + ['clipboard', 'Clipboard'], + ['color', 'Color'], + ['datetime', 'Datetime'], + ['dummy', ''], + ['power', 'Power'], + ['housekeeping', 'Housekeeping'], + ['keyboard', 'Keyboard'], + ['media-keys', 'MediaKeys'], + ['mouse', 'Mouse'], + ['screensaver-proxy', 'ScreensaverProxy'], + ['sharing', 'Sharing'], + ['sound', 'Sound'], + ['xsettings', 'XSettings'] + ] + + if enable_smartcard + enabled_plugins += [['smartcard', 'Smartcard']] + endif + + if enable_wacom + enabled_plugins += [['wacom', 'Wacom']] + endif + + if enable_cups + enabled_plugins += [['print-notifications', 'PrintNotifications']] + endif + + if enable_rfkill + enabled_plugins += [['rfkill', 'Rfkill']] + endif +-- +2.21.0 + diff --git a/0001-housekeeping-Add-a-GPU-memory-usage-notification.patch b/0001-housekeeping-Add-a-GPU-memory-usage-notification.patch new file mode 100644 index 0000000..981d617 --- /dev/null +++ b/0001-housekeeping-Add-a-GPU-memory-usage-notification.patch @@ -0,0 +1,5101 @@ +From e206501e56a364efa130f9a1c691f61d8cf0bd1a Mon Sep 17 00:00:00 2001 +From: Rui Matos +Date: Thu, 31 Aug 2017 17:32:43 +0200 +Subject: [PATCH] housekeeping: Add a GPU memory usage notification + +Only works on supported nvidia GPUs and nvidia binary driver +combinations. +--- + meson.build | 1 + + plugins/housekeeping/gsd-gpu-mem.c | 261 + + plugins/housekeeping/gsd-gpu-mem.h | 33 + + .../housekeeping/gsd-housekeeping-manager.c | 7 + + plugins/housekeeping/meson.build | 7 +- + plugins/housekeeping/nvml/include/nvml.h | 4447 +++++++++++++++++ + 6 files changed, 4754 insertions(+), 2 deletions(-) + create mode 100644 plugins/housekeeping/gsd-gpu-mem.c + create mode 100644 plugins/housekeeping/gsd-gpu-mem.h + create mode 100644 plugins/housekeeping/nvml/include/nvml.h + +diff --git a/meson.build b/meson.build +index a352d04f..1632ea05 100644 +--- a/meson.build ++++ b/meson.build +@@ -76,60 +76,61 @@ endif + + # Workaround for meson's bug + # https://github.com/mesonbuild/meson/pull/1896 + if get_option('b_ndebug') == true + common_flags += ['-DG_DISABLE_ASSERT'] + endif + + add_project_arguments(common_flags + compiler_flags, language: 'c') + + glib_dep = dependency('glib-2.0', version: '>= 2.56') + colord_dep = dependency('colord', version: '>= 1.0.2') + geocode_glib_dep = dependency('geocode-glib-1.0', version: '>= 3.10.0') + gio_dep = dependency('gio-2.0', version: '>= 2.53.0') + gio_unix_dep = dependency('gio-unix-2.0') + gnome_desktop_dep = dependency('gnome-desktop-3.0', version: '>= 3.11.1') + gsettings_desktop_dep = dependency('gsettings-desktop-schemas', version: '>= 3.27.90') + gtk_dep = dependency('gtk+-3.0', version: '>= 3.15.3') + gtk_x11_dep = dependency('gtk+-x11-3.0') + gweather_dep = dependency('gweather-3.0', version: '>= 3.9.5') + lcms_dep = dependency('lcms2', version: '>= 2.2') + libcanberra_gtk_dep = dependency('libcanberra-gtk3') + libgeoclue_dep = dependency('libgeoclue-2.0', version: '>= 2.3.1') + libnotify_dep = dependency('libnotify', version: '>= 0.7.3') + libpulse_mainloop_glib_dep = dependency('libpulse-mainloop-glib', version: '>= 2.0') + pango_dep = dependency('pango', version: '>= 1.20.0') + polkit_gobject_dep = dependency('polkit-gobject-1', version: '>= 0.103') + upower_glib_dep = dependency('upower-glib', version: '>= 0.99.0') + x11_dep = dependency('x11') + + m_dep = cc.find_library('m') ++dl_dep = cc.find_library('dl') + + # ALSA integration (default enabled) + enable_alsa = get_option('alsa') + assert(enable_alsa or not host_is_linux, 'ALSA is not optional on Linux platforms') + + libgvc = subproject( + 'gvc', + default_options: [ + 'static=true', + 'alsa=' + enable_alsa.to_string() + ] + ) + libgvc_dep = libgvc.get_variable('libgvc_dep') + + # GUdev integration (default enabled) + enable_gudev = get_option('gudev') + if enable_gudev + gudev_dep = dependency('gudev-1.0') + endif + config_h.set10('HAVE_GUDEV', enable_gudev) + if host_is_linux + assert(enable_gudev, 'GUdev is not optional on Linux platforms') + endif + + has_timerfd_create = cc.has_function('timerfd_create') + config_h.set10('HAVE_TIMERFD', has_timerfd_create) + + # Check for wayland dependencies + enable_wayland = get_option('wayland') + if enable_wayland +diff --git a/plugins/housekeeping/gsd-gpu-mem.c b/plugins/housekeeping/gsd-gpu-mem.c +new file mode 100644 +index 00000000..a76579b6 +--- /dev/null ++++ b/plugins/housekeeping/gsd-gpu-mem.c +@@ -0,0 +1,261 @@ ++/* ++ * Copyright (C) 2017 Red Hat, Inc. ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ */ ++ ++#include ++#include ++#include ++#include "nvml/include/nvml.h" ++ ++typedef nvmlReturn_t (*nvml_init_t) (void); ++static nvml_init_t nvml_init; ++typedef nvmlReturn_t (*nvml_device_get_handle_by_index_t) (unsigned int, nvmlDevice_t *); ++static nvml_device_get_handle_by_index_t nvml_device_get_handle_by_index; ++typedef nvmlReturn_t (*nvml_device_get_memory_info_t) (nvmlDevice_t, nvmlMemory_t *); ++static nvml_device_get_memory_info_t nvml_device_get_memory_info; ++typedef const char* (*nvml_error_string_t) (nvmlReturn_t); ++static nvml_error_string_t nvml_error_string; ++static void *nvml_handle = NULL; ++static gboolean nvml_loaded = FALSE; ++ ++static gboolean ++nvml_load (void) ++{ ++ char *error; ++ ++ if (nvml_loaded) ++ goto out; ++ nvml_loaded = TRUE; ++ ++ nvml_handle = dlopen ("libnvidia-ml.so", RTLD_LAZY); ++ error = dlerror(); ++ if (!nvml_handle) ++ { ++ g_warning ("Loading NVML: %s", error); ++ goto out; ++ } ++ ++ nvml_init = (nvml_init_t) dlsym (nvml_handle, "nvmlInit"); ++ nvml_device_get_handle_by_index = (nvml_device_get_handle_by_index_t) dlsym (nvml_handle, "nvmlDeviceGetHandleByIndex"); ++ nvml_device_get_memory_info = (nvml_device_get_memory_info_t) dlsym (nvml_handle, "nvmlDeviceGetMemoryInfo"); ++ nvml_error_string = (nvml_error_string_t) dlsym (nvml_handle, "nvmlErrorString"); ++ error = dlerror(); ++ if (error) ++ { ++ g_warning ("Loading NVML: %s", error); ++ goto cleanup; ++ } ++ goto out; ++ ++ cleanup: ++ dlclose (nvml_handle); ++ nvml_handle = NULL; ++ out: ++ return nvml_handle != NULL; ++} ++ ++static nvmlReturn_t nvml_status = NVML_ERROR_UNINITIALIZED; ++static nvmlDevice_t nvml_device = NULL; ++ ++static nvmlReturn_t ++nvml_warn (nvmlReturn_t rcode, const gchar *prefix) ++{ ++ if (rcode != NVML_SUCCESS) ++ g_warning ("%s: %s", prefix, nvml_error_string (rcode)); ++ return rcode; ++} ++ ++static gboolean ++nvml_ready (void) ++{ ++ if (!nvml_load ()) ++ return FALSE; ++ ++ if (nvml_status == NVML_ERROR_UNINITIALIZED) ++ { ++ nvml_status = nvml_warn (nvml_init (), "Initializing NVML"); ++ if (nvml_status == NVML_SUCCESS) ++ nvml_warn (nvml_device_get_handle_by_index (0, &nvml_device), "Getting NVML device 0"); ++ } ++ ++ return nvml_status == NVML_SUCCESS && nvml_device != NULL; ++} ++ ++static void ++nvml_read_mem_info (nvmlMemory_t *mem_info) ++{ ++ if (!nvml_ready ()) ++ return; ++ ++ nvml_device_get_memory_info (nvml_device, mem_info); ++} ++ ++ ++#include ++#include ++#include "gsd-gpu-mem.h" ++ ++#define POLLING_INTERVAL 30 ++#define MEM_USAGE_NOTIFY_THRESHOLD 0.80 ++ ++struct _GsdGpuMem ++{ ++ GObject parent_instance; ++ ++ guint timeout_id; ++ ++ GDesktopAppInfo *sysmon_app_info; ++ NotifyNotification *notification; ++}; ++ ++G_DEFINE_TYPE (GsdGpuMem, gsd_gpu_mem, G_TYPE_OBJECT) ++ ++static void ++clear_timeout (GsdGpuMem *self) ++{ ++ if (self->timeout_id != 0) ++ { ++ g_source_remove (self->timeout_id); ++ self->timeout_id = 0; ++ } ++} ++ ++static void ++notification_closed (GsdGpuMem *self) ++{ ++ g_clear_object (&self->notification); ++} ++ ++static void ++unnotify (GsdGpuMem *self) ++{ ++ if (!self->notification) ++ return; ++ ++ notify_notification_close (self->notification, NULL); ++} ++ ++static void ++ignore_callback (NotifyNotification *n, ++ const char *a, ++ GsdGpuMem *self) ++{ ++ unnotify (self); ++ clear_timeout (self); ++} ++ ++static void ++examine_callback (NotifyNotification *n, ++ const char *a, ++ GsdGpuMem *self) ++ ++{ ++ unnotify (self); ++ g_app_info_launch (G_APP_INFO (self->sysmon_app_info), NULL, NULL, NULL); ++} ++ ++static void ++notify (GsdGpuMem *self, double mem_usage) ++{ ++ const gchar *summary = "Running low on GPU memory"; ++ const gchar *icon_name = "utilities-system-monitor-symbolic"; ++ g_autofree gchar *body = g_strdup_printf ("GPU memory usage is at %d%%. " ++ "You may free up some memory by closing some applications.", ++ (int) round (mem_usage * 100)); ++ if (self->notification) ++ { ++ notify_notification_update (self->notification, summary, body, icon_name); ++ notify_notification_show (self->notification, NULL); ++ return; ++ } ++ ++ self->notification = notify_notification_new (summary, body, icon_name); ++ g_signal_connect_object (self->notification, "closed", ++ G_CALLBACK (notification_closed), ++ self, G_CONNECT_SWAPPED); ++ ++ notify_notification_set_app_name (self->notification, "GPU memory"); ++ ++ notify_notification_add_action (self->notification, ++ "ignore", ++ "Ignore", ++ (NotifyActionCallback) ignore_callback, ++ self, NULL); ++ ++ if (self->sysmon_app_info) ++ notify_notification_add_action (self->notification, ++ "examine", ++ "Examine", ++ (NotifyActionCallback) examine_callback, ++ self, NULL); ++ ++ notify_notification_show (self->notification, NULL); ++} ++ ++static gboolean ++poll_gpu_memory (gpointer user_data) ++{ ++ GsdGpuMem *self = user_data; ++ nvmlMemory_t mem_info = { 0 }; ++ double mem_usage = 0.0; ++ ++ nvml_read_mem_info (&mem_info); ++ if (mem_info.total > 0) ++ mem_usage = (double) mem_info.used / mem_info.total; ++ ++ if (mem_usage > MEM_USAGE_NOTIFY_THRESHOLD) ++ { ++ notify (self, mem_usage); ++ } ++ else ++ { ++ unnotify (self); ++ } ++ ++ return G_SOURCE_CONTINUE; ++} ++ ++static void ++gsd_gpu_mem_init (GsdGpuMem *self) ++{ ++ if (!nvml_ready ()) ++ return; ++ ++ self->timeout_id = g_timeout_add_seconds (POLLING_INTERVAL, poll_gpu_memory, self); ++ self->sysmon_app_info = g_desktop_app_info_new ("gnome-system-monitor.desktop"); ++} ++ ++static void ++gsd_gpu_mem_finalize (GObject *object) ++{ ++ GsdGpuMem *self = GSD_GPU_MEM (object); ++ ++ clear_timeout (self); ++ g_clear_object (&self->sysmon_app_info); ++ unnotify (self); ++ ++ G_OBJECT_CLASS (gsd_gpu_mem_parent_class)->finalize (object); ++} ++ ++static void ++gsd_gpu_mem_class_init (GsdGpuMemClass *klass) ++{ ++ GObjectClass *gobject_class = G_OBJECT_CLASS (klass); ++ ++ gobject_class->finalize = gsd_gpu_mem_finalize; ++} +diff --git a/plugins/housekeeping/gsd-gpu-mem.h b/plugins/housekeeping/gsd-gpu-mem.h +new file mode 100644 +index 00000000..f8967879 +--- /dev/null ++++ b/plugins/housekeeping/gsd-gpu-mem.h +@@ -0,0 +1,33 @@ ++/* ++ * Copyright (C) 2017 Red Hat, Inc. ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ */ ++ ++#ifndef _GSD_GPU_MEM_H ++#define _GSD_GPU_MEM_H ++ ++#include ++ ++G_BEGIN_DECLS ++ ++#define GSD_TYPE_GPU_MEM (gsd_gpu_mem_get_type ()) ++G_DECLARE_FINAL_TYPE (GsdGpuMem, gsd_gpu_mem, ++ GSD, GPU_MEM, GObject) ++ ++G_END_DECLS ++ ++#endif /* _GSD_GPU_MEM_H */ +diff --git a/plugins/housekeeping/gsd-housekeeping-manager.c b/plugins/housekeeping/gsd-housekeeping-manager.c +index 5ace4179..1bd53061 100644 +--- a/plugins/housekeeping/gsd-housekeeping-manager.c ++++ b/plugins/housekeeping/gsd-housekeeping-manager.c +@@ -1,89 +1,92 @@ + /* + * Copyright (C) 2008 Michael J. Chudobiak + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ + + #include "config.h" + + #include + #include + #include + #include + + #include "gnome-settings-profile.h" + #include "gsd-housekeeping-manager.h" + #include "gsd-disk-space.h" ++#include "gsd-gpu-mem.h" + + + /* General */ + #define INTERVAL_ONCE_A_DAY 24*60*60 + #define INTERVAL_TWO_MINUTES 2*60 + + /* Thumbnail cleaner */ + #define THUMB_PREFIX "org.gnome.desktop.thumbnail-cache" + + #define THUMB_AGE_KEY "maximum-age" + #define THUMB_SIZE_KEY "maximum-size" + + #define GSD_HOUSEKEEPING_DBUS_PATH "/org/gnome/SettingsDaemon/Housekeeping" + + static const gchar introspection_xml[] = + "" + " " + " " + " " + " " + ""; + + struct GsdHousekeepingManagerPrivate { + GSettings *settings; + guint long_term_cb; + guint short_term_cb; + + GDBusNodeInfo *introspection_data; + GDBusConnection *connection; + GCancellable *bus_cancellable; + guint name_id; ++ ++ GsdGpuMem *gpu_mem_notifier; + }; + + #define GSD_HOUSEKEEPING_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GSD_TYPE_HOUSEKEEPING_MANAGER, GsdHousekeepingManagerPrivate)) + + static void gsd_housekeeping_manager_class_init (GsdHousekeepingManagerClass *klass); + static void gsd_housekeeping_manager_init (GsdHousekeepingManager *housekeeping_manager); + + G_DEFINE_TYPE (GsdHousekeepingManager, gsd_housekeeping_manager, G_TYPE_OBJECT) + + static gpointer manager_object = NULL; + + + typedef struct { + glong now; + glong max_age; + goffset total_size; + goffset max_size; + } PurgeData; + + + typedef struct { + time_t mtime; + char *path; + glong size; + } ThumbData; + + + static void + thumb_data_free (gpointer data) + { +@@ -384,101 +387,105 @@ gsd_housekeeping_manager_start (GsdHousekeepingManager *manager, + { + gchar *dir; + + g_debug ("Starting housekeeping manager"); + gnome_settings_profile_start (NULL); + + /* Create ~/.local/ as early as possible */ + (void) g_mkdir_with_parents(g_get_user_data_dir (), 0700); + + /* Create ~/.local/share/applications/, see + * https://bugzilla.gnome.org/show_bug.cgi?id=703048 */ + dir = g_build_filename (g_get_user_data_dir (), "applications", NULL); + (void) g_mkdir (dir, 0700); + g_free (dir); + + gsd_ldsm_setup (FALSE); + + manager->priv->settings = g_settings_new (THUMB_PREFIX); + g_signal_connect (G_OBJECT (manager->priv->settings), "changed", + G_CALLBACK (settings_changed_callback), manager); + + /* Clean once, a few minutes after start-up */ + do_cleanup_soon (manager); + + /* Clean periodically, on a daily basis. */ + manager->priv->long_term_cb = g_timeout_add_seconds (INTERVAL_ONCE_A_DAY, + (GSourceFunc) do_cleanup, + manager); + g_source_set_name_by_id (manager->priv->long_term_cb, "[gnome-settings-daemon] do_cleanup"); + ++ manager->priv->gpu_mem_notifier = g_object_new (GSD_TYPE_GPU_MEM, NULL); ++ + gnome_settings_profile_end (NULL); + + return TRUE; + } + + void + gsd_housekeeping_manager_stop (GsdHousekeepingManager *manager) + { + GsdHousekeepingManagerPrivate *p = manager->priv; + + g_debug ("Stopping housekeeping manager"); + + if (manager->priv->name_id != 0) { + g_bus_unown_name (manager->priv->name_id); + manager->priv->name_id = 0; + } + + g_clear_object (&p->bus_cancellable); + g_clear_pointer (&p->introspection_data, g_dbus_node_info_unref); + g_clear_object (&p->connection); + + if (p->short_term_cb) { + g_source_remove (p->short_term_cb); + p->short_term_cb = 0; + } + + if (p->long_term_cb) { + g_source_remove (p->long_term_cb); + p->long_term_cb = 0; + + /* Do a clean-up on shutdown if and only if the size or age + limits have been set to paranoid levels (zero) */ + if ((g_settings_get_int (p->settings, THUMB_AGE_KEY) == 0) || + (g_settings_get_int (p->settings, THUMB_SIZE_KEY) == 0)) { + do_cleanup (manager); + } + + } + + g_clear_object (&p->settings); + gsd_ldsm_clean (); ++ ++ g_clear_object (&p->gpu_mem_notifier); + } + + static void + gsd_housekeeping_manager_finalize (GObject *object) + { + gsd_housekeeping_manager_stop (GSD_HOUSEKEEPING_MANAGER (object)); + + G_OBJECT_CLASS (gsd_housekeeping_manager_parent_class)->finalize (object); + } + + static void + gsd_housekeeping_manager_class_init (GsdHousekeepingManagerClass *klass) + { + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->finalize = gsd_housekeeping_manager_finalize; + + notify_init ("gnome-settings-daemon"); + + g_type_class_add_private (klass, sizeof (GsdHousekeepingManagerPrivate)); + } + + static void + gsd_housekeeping_manager_init (GsdHousekeepingManager *manager) + { + manager->priv = GSD_HOUSEKEEPING_MANAGER_GET_PRIVATE (manager); + } + + GsdHousekeepingManager * + gsd_housekeeping_manager_new (void) +diff --git a/plugins/housekeeping/meson.build b/plugins/housekeeping/meson.build +index a0b4ca5f..0b690cdb 100644 +--- a/plugins/housekeeping/meson.build ++++ b/plugins/housekeeping/meson.build +@@ -1,41 +1,44 @@ + common_files = files( + 'gsd-disk-space.c', +- 'gsd-disk-space-helper.c' ++ 'gsd-disk-space-helper.c', ++ 'gsd-gpu-mem.c' + ) + + sources = common_files + files( + 'gsd-housekeeping-manager.c', + 'main.c' + ) + + deps = plugins_deps + [ + gio_unix_dep, + gtk_dep, +- libnotify_dep ++ libnotify_dep, ++ m_dep, ++ dl_dep + ] + + executable( + 'gsd-' + plugin_name, + sources, + include_directories: [top_inc, common_inc], + dependencies: deps, + c_args: cflags, + install: true, + install_rpath: gsd_pkglibdir, + install_dir: gsd_libexecdir + ) + + programs = [ + 'gsd-disk-space-test', + 'gsd-empty-trash-test', + 'gsd-purge-temp-test' + ] + + foreach program: programs + executable( + program, + common_files + [program + '.c'], + include_directories: top_inc, + dependencies: deps + ) + endforeach +diff --git a/plugins/housekeeping/nvml/include/nvml.h b/plugins/housekeeping/nvml/include/nvml.h +new file mode 100644 +index 00000000..f151007e +--- /dev/null ++++ b/plugins/housekeeping/nvml/include/nvml.h +@@ -0,0 +1,4447 @@ ++/* ++ * Copyright 1993-2016 NVIDIA Corporation. All rights reserved. ++ * ++ * NOTICE TO USER: ++ * ++ * This source code is subject to NVIDIA ownership rights under U.S. and ++ * international Copyright laws. Users and possessors of this source code ++ * are hereby granted a nonexclusive, royalty-free license to use this code ++ * in individual and commercial software. ++ * ++ * NVIDIA MAKES NO REPRESENTATION ABOUT THE SUITABILITY OF THIS SOURCE ++ * CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR ++ * IMPLIED WARRANTY OF ANY KIND. NVIDIA DISCLAIMS ALL WARRANTIES WITH ++ * REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED WARRANTIES OF ++ * MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE. ++ * IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL, ++ * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS ++ * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ++ * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE ++ * OR PERFORMANCE OF THIS SOURCE CODE. ++ * ++ * U.S. Government End Users. This source code is a "commercial item" as ++ * that term is defined at 48 C.F.R. 2.101 (OCT 1995), consisting of ++ * "commercial computer software" and "commercial computer software ++ * documentation" as such terms are used in 48 C.F.R. 12.212 (SEPT 1995) ++ * and is provided to the U.S. Government only as a commercial end item. ++ * Consistent with 48 C.F.R.12.212 and 48 C.F.R. 227.7202-1 through ++ * 227.7202-4 (JUNE 1995), all U.S. Government End Users acquire the ++ * source code with only those rights set forth herein. ++ * ++ * Any use of this source code in individual and commercial software must ++ * include, in the user documentation and internal comments to the code, ++ * the above Disclaimer and U.S. Government End Users Notice. ++ */ ++ ++/* ++NVML API Reference ++ ++The NVIDIA Management Library (NVML) is a C-based programmatic interface for monitoring and ++managing various states within NVIDIA Tesla &tm; GPUs. It is intended to be a platform for building ++3rd party applications, and is also the underlying library for the NVIDIA-supported nvidia-smi ++tool. NVML is thread-safe so it is safe to make simultaneous NVML calls from multiple threads. ++ ++API Documentation ++ ++Supported platforms: ++- Windows: Windows Server 2008 R2 64bit, Windows Server 2012 R2 64bit, Windows 7 64bit, Windows 8 64bit, Windows 10 64bit ++- Linux: 32-bit and 64-bit ++- Hypervisors: Windows Server 2008R2/2012 Hyper-V 64bit, Citrix XenServer 6.2 SP1+, VMware ESX 5.1/5.5 ++ ++Supported products: ++- Full Support ++ - All Tesla products, starting with the Fermi architecture ++ - All Quadro products, starting with the Fermi architecture ++ - All GRID products, starting with the Kepler architecture ++ - Selected GeForce Titan products ++- Limited Support ++ - All Geforce products, starting with the Fermi architecture ++ ++The NVML library can be found at \%ProgramW6432\%\\"NVIDIA Corporation"\\NVSMI\\ on Windows. It is ++not be added to the system path by default. To dynamically link to NVML, add this path to the PATH ++environmental variable. To dynamically load NVML, call LoadLibrary with this path. ++ ++On Linux the NVML library will be found on the standard library path. For 64 bit Linux, both the 32 bit ++and 64 bit NVML libraries will be installed. ++ ++Online documentation for this library is available at http://docs.nvidia.com/deploy/nvml-api/index.html ++*/ ++ ++#ifndef __nvml_nvml_h__ ++#define __nvml_nvml_h__ ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++/* ++ * On Windows, set up methods for DLL export ++ * define NVML_STATIC_IMPORT when using nvml_loader library ++ */ ++#if defined _WINDOWS ++ #if !defined NVML_STATIC_IMPORT ++ #if defined NVML_LIB_EXPORT ++ #define DECLDIR __declspec(dllexport) ++ #else ++ #define DECLDIR __declspec(dllimport) ++ #endif ++ #else ++ #define DECLDIR ++ #endif ++#else ++ #define DECLDIR ++#endif ++ ++/** ++ * NVML API versioning support ++ */ ++#define NVML_API_VERSION 8 ++#define NVML_API_VERSION_STR "8" ++#define nvmlInit nvmlInit_v2 ++#define nvmlDeviceGetPciInfo nvmlDeviceGetPciInfo_v2 ++#define nvmlDeviceGetCount nvmlDeviceGetCount_v2 ++#define nvmlDeviceGetHandleByIndex nvmlDeviceGetHandleByIndex_v2 ++#define nvmlDeviceGetHandleByPciBusId nvmlDeviceGetHandleByPciBusId_v2 ++ ++/***************************************************************************************************/ ++/** @defgroup nvmlDeviceStructs Device Structs ++ * @{ ++ */ ++/***************************************************************************************************/ ++ ++/** ++ * Special constant that some fields take when they are not available. ++ * Used when only part of the struct is not available. ++ * ++ * Each structure explicitly states when to check for this value. ++ */ ++#define NVML_VALUE_NOT_AVAILABLE (-1) ++ ++typedef struct nvmlDevice_st* nvmlDevice_t; ++ ++/** ++ * Buffer size guaranteed to be large enough for pci bus id ++ */ ++#define NVML_DEVICE_PCI_BUS_ID_BUFFER_SIZE 16 ++ ++/** ++ * PCI information about a GPU device. ++ */ ++typedef struct nvmlPciInfo_st ++{ ++ char busId[NVML_DEVICE_PCI_BUS_ID_BUFFER_SIZE]; //!< The tuple domain:bus:device.function PCI identifier (& NULL terminator) ++ unsigned int domain; //!< The PCI domain on which the device's bus resides, 0 to 0xffff ++ unsigned int bus; //!< The bus on which the device resides, 0 to 0xff ++ unsigned int device; //!< The device's id on the bus, 0 to 31 ++ unsigned int pciDeviceId; //!< The combined 16-bit device id and 16-bit vendor id ++ ++ // Added in NVML 2.285 API ++ unsigned int pciSubSystemId; //!< The 32-bit Sub System Device ID ++ ++ // NVIDIA reserved for internal use only ++ unsigned int reserved0; ++ unsigned int reserved1; ++ unsigned int reserved2; ++ unsigned int reserved3; ++} nvmlPciInfo_t; ++ ++/** ++ * Detailed ECC error counts for a device. ++ * ++ * @deprecated Different GPU families can have different memory error counters ++ * See \ref nvmlDeviceGetMemoryErrorCounter ++ */ ++typedef struct nvmlEccErrorCounts_st ++{ ++ unsigned long long l1Cache; //!< L1 cache errors ++ unsigned long long l2Cache; //!< L2 cache errors ++ unsigned long long deviceMemory; //!< Device memory errors ++ unsigned long long registerFile; //!< Register file errors ++} nvmlEccErrorCounts_t; ++ ++/** ++ * Utilization information for a device. ++ * Each sample period may be between 1 second and 1/6 second, depending on the product being queried. ++ */ ++typedef struct nvmlUtilization_st ++{ ++ unsigned int gpu; //!< Percent of time over the past sample period during which one or more kernels was executing on the GPU ++ unsigned int memory; //!< Percent of time over the past sample period during which global (device) memory was being read or written ++} nvmlUtilization_t; ++ ++/** ++ * Memory allocation information for a device. ++ */ ++typedef struct nvmlMemory_st ++{ ++ unsigned long long total; //!< Total installed FB memory (in bytes) ++ unsigned long long free; //!< Unallocated FB memory (in bytes) ++ unsigned long long used; //!< Allocated FB memory (in bytes). Note that the driver/GPU always sets aside a small amount of memory for bookkeeping ++} nvmlMemory_t; ++ ++/** ++ * BAR1 Memory allocation Information for a device ++ */ ++typedef struct nvmlBAR1Memory_st ++{ ++ unsigned long long bar1Total; //!< Total BAR1 Memory (in bytes) ++ unsigned long long bar1Free; //!< Unallocated BAR1 Memory (in bytes) ++ unsigned long long bar1Used; //!< Allocated Used Memory (in bytes) ++}nvmlBAR1Memory_t; ++ ++/** ++ * Information about running compute processes on the GPU ++ */ ++typedef struct nvmlProcessInfo_st ++{ ++ unsigned int pid; //!< Process ID ++ unsigned long long usedGpuMemory; //!< Amount of used GPU memory in bytes. ++ //! Under WDDM, \ref NVML_VALUE_NOT_AVAILABLE is always reported ++ //! because Windows KMD manages all the memory and not the NVIDIA driver ++} nvmlProcessInfo_t; ++ ++ ++/** ++ * Enum to represent type of bridge chip ++ */ ++typedef enum nvmlBridgeChipType_enum ++{ ++ NVML_BRIDGE_CHIP_PLX = 0, ++ NVML_BRIDGE_CHIP_BRO4 = 1 ++}nvmlBridgeChipType_t; ++ ++/** ++ * Maximum number of NvLink links supported ++ */ ++#define NVML_NVLINK_MAX_LINKS 4 ++ ++/** ++ * Enum to represent the NvLink utilization counter packet units ++ */ ++typedef enum nvmlNvLinkUtilizationCountUnits_enum ++{ ++ NVML_NVLINK_COUNTER_UNIT_CYCLES = 0, // count by cycles ++ NVML_NVLINK_COUNTER_UNIT_PACKETS = 1, // count by packets ++ NVML_NVLINK_COUNTER_UNIT_BYTES = 2, // count by bytes ++ ++ // this must be last ++ NVML_NVLINK_COUNTER_UNIT_COUNT ++} nvmlNvLinkUtilizationCountUnits_t; ++ ++/** ++ * Enum to represent the NvLink utilization counter packet types to count ++ * ** this is ONLY applicable with the units as packets or bytes ++ * ** as specified in \a nvmlNvLinkUtilizationCountUnits_t ++ * ** all packet filter descriptions are target GPU centric ++ * ** these can be "OR'd" together ++ */ ++typedef enum nvmlNvLinkUtilizationCountPktTypes_enum ++{ ++ NVML_NVLINK_COUNTER_PKTFILTER_NOP = 0x1, // no operation packets ++ NVML_NVLINK_COUNTER_PKTFILTER_READ = 0x2, // read packets ++ NVML_NVLINK_COUNTER_PKTFILTER_WRITE = 0x4, // write packets ++ NVML_NVLINK_COUNTER_PKTFILTER_RATOM = 0x8, // reduction atomic requests ++ NVML_NVLINK_COUNTER_PKTFILTER_NRATOM = 0x10, // non-reduction atomic requests ++ NVML_NVLINK_COUNTER_PKTFILTER_FLUSH = 0x20, // flush requests ++ NVML_NVLINK_COUNTER_PKTFILTER_RESPDATA = 0x40, // responses with data ++ NVML_NVLINK_COUNTER_PKTFILTER_RESPNODATA = 0x80, // responses without data ++ NVML_NVLINK_COUNTER_PKTFILTER_ALL = 0xFF // all packets ++} nvmlNvLinkUtilizationCountPktTypes_t; ++ ++/** ++ * Struct to define the NVLINK counter controls ++ */ ++typedef struct nvmlNvLinkUtilizationControl_st ++{ ++ nvmlNvLinkUtilizationCountUnits_t units; ++ nvmlNvLinkUtilizationCountPktTypes_t pktfilter; ++} nvmlNvLinkUtilizationControl_t; ++ ++/** ++ * Enum to represent NvLink queryable capabilities ++ */ ++typedef enum nvmlNvLinkCapability_enum ++{ ++ NVML_NVLINK_CAP_P2P_SUPPORTED = 0, // P2P over NVLink is supported ++ NVML_NVLINK_CAP_SYSMEM_ACCESS = 1, // Access to system memory is supported ++ NVML_NVLINK_CAP_P2P_ATOMICS = 2, // P2P atomics are supported ++ NVML_NVLINK_CAP_SYSMEM_ATOMICS= 3, // System memory atomics are supported ++ NVML_NVLINK_CAP_SLI_BRIDGE = 4, // SLI is supported over this link ++ NVML_NVLINK_CAP_VALID = 5, // Link is supported on this device ++ // should be last ++ NVML_NVLINK_CAP_COUNT ++} nvmlNvLinkCapability_t; ++ ++/** ++ * Enum to represent NvLink queryable error counters ++ */ ++typedef enum nvmlNvLinkErrorCounter_enum ++{ ++ NVML_NVLINK_ERROR_DL_REPLAY = 0, // Data link transmit replay error counter ++ NVML_NVLINK_ERROR_DL_RECOVERY = 1, // Data link transmit recovery error counter ++ NVML_NVLINK_ERROR_DL_CRC_FLIT = 2, // Data link receive flow control digit CRC error counter ++ NVML_NVLINK_ERROR_DL_CRC_DATA = 3, // Data link receive data CRC error counter ++ ++ // this must be last ++ NVML_NVLINK_ERROR_COUNT ++} nvmlNvLinkErrorCounter_t; ++ ++/** ++ * Represents level relationships within a system between two GPUs ++ * The enums are spaced to allow for future relationships ++ */ ++typedef enum nvmlGpuLevel_enum ++{ ++ NVML_TOPOLOGY_INTERNAL = 0, // e.g. Tesla K80 ++ NVML_TOPOLOGY_SINGLE = 10, // all devices that only need traverse a single PCIe switch ++ NVML_TOPOLOGY_MULTIPLE = 20, // all devices that need not traverse a host bridge ++ NVML_TOPOLOGY_HOSTBRIDGE = 30, // all devices that are connected to the same host bridge ++ NVML_TOPOLOGY_CPU = 40, // all devices that are connected to the same CPU but possibly multiple host bridges ++ NVML_TOPOLOGY_SYSTEM = 50, // all devices in the system ++ ++ // there is purposefully no COUNT here because of the need for spacing above ++} nvmlGpuTopologyLevel_t; ++ ++/* P2P Capability Index Status*/ ++typedef enum nvmlGpuP2PStatus_enum ++{ ++ NVML_P2P_STATUS_OK = 0, ++ NVML_P2P_STATUS_CHIPSET_NOT_SUPPORED, ++ NVML_P2P_STATUS_GPU_NOT_SUPPORTED, ++ NVML_P2P_STATUS_IOH_TOPOLOGY_NOT_SUPPORTED, ++ NVML_P2P_STATUS_DISABLED_BY_REGKEY, ++ NVML_P2P_STATUS_NOT_SUPPORTED, ++ NVML_P2P_STATUS_UNKNOWN ++ ++} nvmlGpuP2PStatus_t; ++ ++/* P2P Capability Index*/ ++typedef enum nvmlGpuP2PCapsIndex_enum ++{ ++ NVML_P2P_CAPS_INDEX_READ = 0, ++ NVML_P2P_CAPS_INDEX_WRITE, ++ NVML_P2P_CAPS_INDEX_NVLINK, ++ NVML_P2P_CAPS_INDEX_ATOMICS, ++ NVML_P2P_CAPS_INDEX_PROP, ++ NVML_P2P_CAPS_INDEX_UNKNOWN ++}nvmlGpuP2PCapsIndex_t; ++ ++/** ++ * Maximum limit on Physical Bridges per Board ++ */ ++#define NVML_MAX_PHYSICAL_BRIDGE (128) ++ ++/** ++ * Information about the Bridge Chip Firmware ++ */ ++typedef struct nvmlBridgeChipInfo_st ++{ ++ nvmlBridgeChipType_t type; //!< Type of Bridge Chip ++ unsigned int fwVersion; //!< Firmware Version. 0=Version is unavailable ++}nvmlBridgeChipInfo_t; ++ ++/** ++ * This structure stores the complete Hierarchy of the Bridge Chip within the board. The immediate ++ * bridge is stored at index 0 of bridgeInfoList, parent to immediate bridge is at index 1 and so forth. ++ */ ++typedef struct nvmlBridgeChipHierarchy_st ++{ ++ unsigned char bridgeCount; //!< Number of Bridge Chips on the Board ++ nvmlBridgeChipInfo_t bridgeChipInfo[NVML_MAX_PHYSICAL_BRIDGE]; //!< Hierarchy of Bridge Chips on the board ++}nvmlBridgeChipHierarchy_t; ++ ++/** ++ * Represents Type of Sampling Event ++ */ ++typedef enum nvmlSamplingType_enum ++{ ++ NVML_TOTAL_POWER_SAMPLES = 0, //!< To represent total power drawn by GPU ++ NVML_GPU_UTILIZATION_SAMPLES = 1, //!< To represent percent of time during which one or more kernels was executing on the GPU ++ NVML_MEMORY_UTILIZATION_SAMPLES = 2, //!< To represent percent of time during which global (device) memory was being read or written ++ NVML_ENC_UTILIZATION_SAMPLES = 3, //!< To represent percent of time during which NVENC remains busy ++ NVML_DEC_UTILIZATION_SAMPLES = 4, //!< To represent percent of time during which NVDEC remains busy ++ NVML_PROCESSOR_CLK_SAMPLES = 5, //!< To represent processor clock samples ++ NVML_MEMORY_CLK_SAMPLES = 6, //!< To represent memory clock samples ++ ++ // Keep this last ++ NVML_SAMPLINGTYPE_COUNT ++}nvmlSamplingType_t; ++ ++/** ++ * Represents the queryable PCIe utilization counters ++ */ ++typedef enum nvmlPcieUtilCounter_enum ++{ ++ NVML_PCIE_UTIL_TX_BYTES = 0, // 1KB granularity ++ NVML_PCIE_UTIL_RX_BYTES = 1, // 1KB granularity ++ ++ // Keep this last ++ NVML_PCIE_UTIL_COUNT ++} nvmlPcieUtilCounter_t; ++ ++/** ++ * Represents the type for sample value returned ++ */ ++typedef enum nvmlValueType_enum ++{ ++ NVML_VALUE_TYPE_DOUBLE = 0, ++ NVML_VALUE_TYPE_UNSIGNED_INT = 1, ++ NVML_VALUE_TYPE_UNSIGNED_LONG = 2, ++ NVML_VALUE_TYPE_UNSIGNED_LONG_LONG = 3, ++ ++ // Keep this last ++ NVML_VALUE_TYPE_COUNT ++}nvmlValueType_t; ++ ++ ++/** ++ * Union to represent different types of Value ++ */ ++typedef union nvmlValue_st ++{ ++ double dVal; //!< If the value is double ++ unsigned int uiVal; //!< If the value is unsigned int ++ unsigned long ulVal; //!< If the value is unsigned long ++ unsigned long long ullVal; //!< If the value is unsigned long long ++}nvmlValue_t; ++ ++/** ++ * Information for Sample ++ */ ++typedef struct nvmlSample_st ++{ ++ unsigned long long timeStamp; //!< CPU Timestamp in microseconds ++ nvmlValue_t sampleValue; //!< Sample Value ++}nvmlSample_t; ++ ++/** ++ * Represents type of perf policy for which violation times can be queried ++ */ ++typedef enum nvmlPerfPolicyType_enum ++{ ++ NVML_PERF_POLICY_POWER = 0, ++ NVML_PERF_POLICY_THERMAL = 1, ++ NVML_PERF_POLICY_SYNC_BOOST = 2, ++ ++ // Keep this last ++ NVML_PERF_POLICY_COUNT ++}nvmlPerfPolicyType_t; ++ ++/** ++ * Struct to hold perf policy violation status data ++ */ ++typedef struct nvmlViolationTime_st ++{ ++ unsigned long long referenceTime; //!< referenceTime represents CPU timestamp in microseconds ++ unsigned long long violationTime; //!< violationTime in Nanoseconds ++}nvmlViolationTime_t; ++ ++/** @} */ ++ ++/***************************************************************************************************/ ++/** @defgroup nvmlDeviceEnumvs Device Enums ++ * @{ ++ */ ++/***************************************************************************************************/ ++ ++/** ++ * Generic enable/disable enum. ++ */ ++typedef enum nvmlEnableState_enum ++{ ++ NVML_FEATURE_DISABLED = 0, //!< Feature disabled ++ NVML_FEATURE_ENABLED = 1 //!< Feature enabled ++} nvmlEnableState_t; ++ ++//! Generic flag used to specify the default behavior of some functions. See description of particular functions for details. ++#define nvmlFlagDefault 0x00 ++//! Generic flag used to force some behavior. See description of particular functions for details. ++#define nvmlFlagForce 0x01 ++ ++/** ++ * * The Brand of the GPU ++ * */ ++typedef enum nvmlBrandType_enum ++{ ++ NVML_BRAND_UNKNOWN = 0, ++ NVML_BRAND_QUADRO = 1, ++ NVML_BRAND_TESLA = 2, ++ NVML_BRAND_NVS = 3, ++ NVML_BRAND_GRID = 4, ++ NVML_BRAND_GEFORCE = 5, ++ ++ // Keep this last ++ NVML_BRAND_COUNT ++} nvmlBrandType_t; ++ ++/** ++ * Temperature thresholds. ++ */ ++typedef enum nvmlTemperatureThresholds_enum ++{ ++ NVML_TEMPERATURE_THRESHOLD_SHUTDOWN = 0, // Temperature at which the GPU will shut down ++ // for HW protection ++ NVML_TEMPERATURE_THRESHOLD_SLOWDOWN = 1, // Temperature at which the GPU will begin slowdown ++ // Keep this last ++ NVML_TEMPERATURE_THRESHOLD_COUNT ++} nvmlTemperatureThresholds_t; ++ ++/** ++ * Temperature sensors. ++ */ ++typedef enum nvmlTemperatureSensors_enum ++{ ++ NVML_TEMPERATURE_GPU = 0, //!< Temperature sensor for the GPU die ++ ++ // Keep this last ++ NVML_TEMPERATURE_COUNT ++} nvmlTemperatureSensors_t; ++ ++/** ++ * Compute mode. ++ * ++ * NVML_COMPUTEMODE_EXCLUSIVE_PROCESS was added in CUDA 4.0. ++ * Earlier CUDA versions supported a single exclusive mode, ++ * which is equivalent to NVML_COMPUTEMODE_EXCLUSIVE_THREAD in CUDA 4.0 and beyond. ++ */ ++typedef enum nvmlComputeMode_enum ++{ ++ NVML_COMPUTEMODE_DEFAULT = 0, //!< Default compute mode -- multiple contexts per device ++ NVML_COMPUTEMODE_EXCLUSIVE_THREAD = 1, //!< Support Removed ++ NVML_COMPUTEMODE_PROHIBITED = 2, //!< Compute-prohibited mode -- no contexts per device ++ NVML_COMPUTEMODE_EXCLUSIVE_PROCESS = 3, //!< Compute-exclusive-process mode -- only one context per device, usable from multiple threads at a time ++ ++ // Keep this last ++ NVML_COMPUTEMODE_COUNT ++} nvmlComputeMode_t; ++ ++/** ++ * ECC bit types. ++ * ++ * @deprecated See \ref nvmlMemoryErrorType_t for a more flexible type ++ */ ++#define nvmlEccBitType_t nvmlMemoryErrorType_t ++ ++/** ++ * Single bit ECC errors ++ * ++ * @deprecated Mapped to \ref NVML_MEMORY_ERROR_TYPE_CORRECTED ++ */ ++#define NVML_SINGLE_BIT_ECC NVML_MEMORY_ERROR_TYPE_CORRECTED ++ ++/** ++ * Double bit ECC errors ++ * ++ * @deprecated Mapped to \ref NVML_MEMORY_ERROR_TYPE_UNCORRECTED ++ */ ++#define NVML_DOUBLE_BIT_ECC NVML_MEMORY_ERROR_TYPE_UNCORRECTED ++ ++/** ++ * Memory error types ++ */ ++typedef enum nvmlMemoryErrorType_enum ++{ ++ /** ++ * A memory error that was corrected ++ * ++ * For ECC errors, these are single bit errors ++ * For Texture memory, these are errors fixed by resend ++ */ ++ NVML_MEMORY_ERROR_TYPE_CORRECTED = 0, ++ /** ++ * A memory error that was not corrected ++ * ++ * For ECC errors, these are double bit errors ++ * For Texture memory, these are errors where the resend fails ++ */ ++ NVML_MEMORY_ERROR_TYPE_UNCORRECTED = 1, ++ ++ ++ // Keep this last ++ NVML_MEMORY_ERROR_TYPE_COUNT //!< Count of memory error types ++ ++} nvmlMemoryErrorType_t; ++ ++/** ++ * ECC counter types. ++ * ++ * Note: Volatile counts are reset each time the driver loads. On Windows this is once per boot. On Linux this can be more frequent. ++ * On Linux the driver unloads when no active clients exist. If persistence mode is enabled or there is always a driver ++ * client active (e.g. X11), then Linux also sees per-boot behavior. If not, volatile counts are reset each time a compute app ++ * is run. ++ */ ++typedef enum nvmlEccCounterType_enum ++{ ++ NVML_VOLATILE_ECC = 0, //!< Volatile counts are reset each time the driver loads. ++ NVML_AGGREGATE_ECC = 1, //!< Aggregate counts persist across reboots (i.e. for the lifetime of the device) ++ ++ // Keep this last ++ NVML_ECC_COUNTER_TYPE_COUNT //!< Count of memory counter types ++} nvmlEccCounterType_t; ++ ++/** ++ * Clock types. ++ * ++ * All speeds are in Mhz. ++ */ ++typedef enum nvmlClockType_enum ++{ ++ NVML_CLOCK_GRAPHICS = 0, //!< Graphics clock domain ++ NVML_CLOCK_SM = 1, //!< SM clock domain ++ NVML_CLOCK_MEM = 2, //!< Memory clock domain ++ NVML_CLOCK_VIDEO = 3, //!< Video encoder/decoder clock domain ++ ++ // Keep this last ++ NVML_CLOCK_COUNT //usedGpuMemory is not supported ++ ++ ++ unsigned long long time; //!< Amount of time in ms during which the compute context was active. The time is reported as 0 if ++ //!< the process is not terminated ++ ++ unsigned long long startTime; //!< CPU Timestamp in usec representing start time for the process ++ ++ unsigned int isRunning; //!< Flag to represent if the process is running (1 for running, 0 for terminated) ++ ++ unsigned int reserved[5]; //!< Reserved for future use ++} nvmlAccountingStats_t; ++ ++/** @} */ ++ ++/***************************************************************************************************/ ++/** @defgroup nvmlInitializationAndCleanup Initialization and Cleanup ++ * This chapter describes the methods that handle NVML initialization and cleanup. ++ * It is the user's responsibility to call \ref nvmlInit() before calling any other methods, and ++ * nvmlShutdown() once NVML is no longer being used. ++ * @{ ++ */ ++/***************************************************************************************************/ ++ ++/** ++ * Initialize NVML, but don't initialize any GPUs yet. ++ * ++ * \note In NVML 5.319 new nvmlInit_v2 has replaced nvmlInit"_v1" (default in NVML 4.304 and older) that ++ * did initialize all GPU devices in the system. ++ * ++ * This allows NVML to communicate with a GPU ++ * when other GPUs in the system are unstable or in a bad state. When using this API, GPUs are ++ * discovered and initialized in nvmlDeviceGetHandleBy* functions instead. ++ * ++ * \note To contrast nvmlInit_v2 with nvmlInit"_v1", NVML 4.304 nvmlInit"_v1" will fail when any detected GPU is in ++ * a bad or unstable state. ++ * ++ * For all products. ++ * ++ * This method, should be called once before invoking any other methods in the library. ++ * A reference count of the number of initializations is maintained. Shutdown only occurs ++ * when the reference count reaches zero. ++ * ++ * @return ++ * - \ref NVML_SUCCESS if NVML has been properly initialized ++ * - \ref NVML_ERROR_DRIVER_NOT_LOADED if NVIDIA driver is not running ++ * - \ref NVML_ERROR_NO_PERMISSION if NVML does not have permission to talk to the driver ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlInit(void); ++ ++/** ++ * Shut down NVML by releasing all GPU resources previously allocated with \ref nvmlInit(). ++ * ++ * For all products. ++ * ++ * This method should be called after NVML work is done, once for each call to \ref nvmlInit() ++ * A reference count of the number of initializations is maintained. Shutdown only occurs ++ * when the reference count reaches zero. For backwards compatibility, no error is reported if ++ * nvmlShutdown() is called more times than nvmlInit(). ++ * ++ * @return ++ * - \ref NVML_SUCCESS if NVML has been properly shut down ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlShutdown(void); ++ ++/** @} */ ++ ++/***************************************************************************************************/ ++/** @defgroup nvmlErrorReporting Error reporting ++ * This chapter describes helper functions for error reporting routines. ++ * @{ ++ */ ++/***************************************************************************************************/ ++ ++/** ++ * Helper method for converting NVML error codes into readable strings. ++ * ++ * For all products. ++ * ++ * @param result NVML error code to convert ++ * ++ * @return String representation of the error. ++ * ++ */ ++const DECLDIR char* nvmlErrorString(nvmlReturn_t result); ++/** @} */ ++ ++ ++/***************************************************************************************************/ ++/** @defgroup nvmlConstants Constants ++ * @{ ++ */ ++/***************************************************************************************************/ ++ ++/** ++ * Buffer size guaranteed to be large enough for \ref nvmlDeviceGetInforomVersion and \ref nvmlDeviceGetInforomImageVersion ++ */ ++#define NVML_DEVICE_INFOROM_VERSION_BUFFER_SIZE 16 ++ ++/** ++ * Buffer size guaranteed to be large enough for \ref nvmlDeviceGetUUID ++ */ ++#define NVML_DEVICE_UUID_BUFFER_SIZE 80 ++ ++/** ++ * Buffer size guaranteed to be large enough for \ref nvmlDeviceGetBoardPartNumber ++ */ ++#define NVML_DEVICE_PART_NUMBER_BUFFER_SIZE 80 ++ ++/** ++ * Buffer size guaranteed to be large enough for \ref nvmlSystemGetDriverVersion ++ */ ++#define NVML_SYSTEM_DRIVER_VERSION_BUFFER_SIZE 80 ++ ++/** ++ * Buffer size guaranteed to be large enough for \ref nvmlSystemGetNVMLVersion ++ */ ++#define NVML_SYSTEM_NVML_VERSION_BUFFER_SIZE 80 ++ ++/** ++ * Buffer size guaranteed to be large enough for \ref nvmlDeviceGetName ++ */ ++#define NVML_DEVICE_NAME_BUFFER_SIZE 64 ++ ++/** ++ * Buffer size guaranteed to be large enough for \ref nvmlDeviceGetSerial ++ */ ++#define NVML_DEVICE_SERIAL_BUFFER_SIZE 30 ++ ++/** ++ * Buffer size guaranteed to be large enough for \ref nvmlDeviceGetVbiosVersion ++ */ ++#define NVML_DEVICE_VBIOS_VERSION_BUFFER_SIZE 32 ++ ++/** @} */ ++ ++/***************************************************************************************************/ ++/** @defgroup nvmlSystemQueries System Queries ++ * This chapter describes the queries that NVML can perform against the local system. These queries ++ * are not device-specific. ++ * @{ ++ */ ++/***************************************************************************************************/ ++ ++/** ++ * Retrieves the version of the system's graphics driver. ++ * ++ * For all products. ++ * ++ * The version identifier is an alphanumeric string. It will not exceed 80 characters in length ++ * (including the NULL terminator). See \ref nvmlConstants::NVML_SYSTEM_DRIVER_VERSION_BUFFER_SIZE. ++ * ++ * @param version Reference in which to return the version identifier ++ * @param length The maximum allowed length of the string returned in \a version ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a version has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a version is NULL ++ * - \ref NVML_ERROR_INSUFFICIENT_SIZE if \a length is too small ++ */ ++nvmlReturn_t DECLDIR nvmlSystemGetDriverVersion(char *version, unsigned int length); ++ ++/** ++ * Retrieves the version of the NVML library. ++ * ++ * For all products. ++ * ++ * The version identifier is an alphanumeric string. It will not exceed 80 characters in length ++ * (including the NULL terminator). See \ref nvmlConstants::NVML_SYSTEM_NVML_VERSION_BUFFER_SIZE. ++ * ++ * @param version Reference in which to return the version identifier ++ * @param length The maximum allowed length of the string returned in \a version ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a version has been set ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a version is NULL ++ * - \ref NVML_ERROR_INSUFFICIENT_SIZE if \a length is too small ++ */ ++nvmlReturn_t DECLDIR nvmlSystemGetNVMLVersion(char *version, unsigned int length); ++ ++/** ++ * Gets name of the process with provided process id ++ * ++ * For all products. ++ * ++ * Returned process name is cropped to provided length. ++ * name string is encoded in ANSI. ++ * ++ * @param pid The identifier of the process ++ * @param name Reference in which to return the process name ++ * @param length The maximum allowed length of the string returned in \a name ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a name has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a name is NULL or \a length is 0. ++ * - \ref NVML_ERROR_NOT_FOUND if process doesn't exists ++ * - \ref NVML_ERROR_NO_PERMISSION if the user doesn't have permission to perform this operation ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlSystemGetProcessName(unsigned int pid, char *name, unsigned int length); ++ ++/** @} */ ++ ++/***************************************************************************************************/ ++/** @defgroup nvmlUnitQueries Unit Queries ++ * This chapter describes that queries that NVML can perform against each unit. For S-class systems only. ++ * In each case the device is identified with an nvmlUnit_t handle. This handle is obtained by ++ * calling \ref nvmlUnitGetHandleByIndex(). ++ * @{ ++ */ ++/***************************************************************************************************/ ++ ++ /** ++ * Retrieves the number of units in the system. ++ * ++ * For S-class products. ++ * ++ * @param unitCount Reference in which to return the number of units ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a unitCount has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a unitCount is NULL ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlUnitGetCount(unsigned int *unitCount); ++ ++/** ++ * Acquire the handle for a particular unit, based on its index. ++ * ++ * For S-class products. ++ * ++ * Valid indices are derived from the \a unitCount returned by \ref nvmlUnitGetCount(). ++ * For example, if \a unitCount is 2 the valid indices are 0 and 1, corresponding to UNIT 0 and UNIT 1. ++ * ++ * The order in which NVML enumerates units has no guarantees of consistency between reboots. ++ * ++ * @param index The index of the target unit, >= 0 and < \a unitCount ++ * @param unit Reference in which to return the unit handle ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a unit has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a index is invalid or \a unit is NULL ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlUnitGetHandleByIndex(unsigned int index, nvmlUnit_t *unit); ++ ++/** ++ * Retrieves the static information associated with a unit. ++ * ++ * For S-class products. ++ * ++ * See \ref nvmlUnitInfo_t for details on available unit info. ++ * ++ * @param unit The identifier of the target unit ++ * @param info Reference in which to return the unit information ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a info has been populated ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a unit is invalid or \a info is NULL ++ */ ++nvmlReturn_t DECLDIR nvmlUnitGetUnitInfo(nvmlUnit_t unit, nvmlUnitInfo_t *info); ++ ++/** ++ * Retrieves the LED state associated with this unit. ++ * ++ * For S-class products. ++ * ++ * See \ref nvmlLedState_t for details on allowed states. ++ * ++ * @param unit The identifier of the target unit ++ * @param state Reference in which to return the current LED state ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a state has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a unit is invalid or \a state is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if this is not an S-class product ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ * ++ * @see nvmlUnitSetLedState() ++ */ ++nvmlReturn_t DECLDIR nvmlUnitGetLedState(nvmlUnit_t unit, nvmlLedState_t *state); ++ ++/** ++ * Retrieves the PSU stats for the unit. ++ * ++ * For S-class products. ++ * ++ * See \ref nvmlPSUInfo_t for details on available PSU info. ++ * ++ * @param unit The identifier of the target unit ++ * @param psu Reference in which to return the PSU information ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a psu has been populated ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a unit is invalid or \a psu is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if this is not an S-class product ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlUnitGetPsuInfo(nvmlUnit_t unit, nvmlPSUInfo_t *psu); ++ ++/** ++ * Retrieves the temperature readings for the unit, in degrees C. ++ * ++ * For S-class products. ++ * ++ * Depending on the product, readings may be available for intake (type=0), ++ * exhaust (type=1) and board (type=2). ++ * ++ * @param unit The identifier of the target unit ++ * @param type The type of reading to take ++ * @param temp Reference in which to return the intake temperature ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a temp has been populated ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a unit or \a type is invalid or \a temp is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if this is not an S-class product ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlUnitGetTemperature(nvmlUnit_t unit, unsigned int type, unsigned int *temp); ++ ++/** ++ * Retrieves the fan speed readings for the unit. ++ * ++ * For S-class products. ++ * ++ * See \ref nvmlUnitFanSpeeds_t for details on available fan speed info. ++ * ++ * @param unit The identifier of the target unit ++ * @param fanSpeeds Reference in which to return the fan speed information ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a fanSpeeds has been populated ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a unit is invalid or \a fanSpeeds is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if this is not an S-class product ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlUnitGetFanSpeedInfo(nvmlUnit_t unit, nvmlUnitFanSpeeds_t *fanSpeeds); ++ ++/** ++ * Retrieves the set of GPU devices that are attached to the specified unit. ++ * ++ * For S-class products. ++ * ++ * The \a deviceCount argument is expected to be set to the size of the input \a devices array. ++ * ++ * @param unit The identifier of the target unit ++ * @param deviceCount Reference in which to provide the \a devices array size, and ++ * to return the number of attached GPU devices ++ * @param devices Reference in which to return the references to the attached GPU devices ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a deviceCount and \a devices have been populated ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INSUFFICIENT_SIZE if \a deviceCount indicates that the \a devices array is too small ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a unit is invalid, either of \a deviceCount or \a devices is NULL ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlUnitGetDevices(nvmlUnit_t unit, unsigned int *deviceCount, nvmlDevice_t *devices); ++ ++/** ++ * Retrieves the IDs and firmware versions for any Host Interface Cards (HICs) in the system. ++ * ++ * For S-class products. ++ * ++ * The \a hwbcCount argument is expected to be set to the size of the input \a hwbcEntries array. ++ * The HIC must be connected to an S-class system for it to be reported by this function. ++ * ++ * @param hwbcCount Size of hwbcEntries array ++ * @param hwbcEntries Array holding information about hwbc ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a hwbcCount and \a hwbcEntries have been populated ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if either \a hwbcCount or \a hwbcEntries is NULL ++ * - \ref NVML_ERROR_INSUFFICIENT_SIZE if \a hwbcCount indicates that the \a hwbcEntries array is too small ++ */ ++nvmlReturn_t DECLDIR nvmlSystemGetHicVersion(unsigned int *hwbcCount, nvmlHwbcEntry_t *hwbcEntries); ++/** @} */ ++ ++/***************************************************************************************************/ ++/** @defgroup nvmlDeviceQueries Device Queries ++ * This chapter describes that queries that NVML can perform against each device. ++ * In each case the device is identified with an nvmlDevice_t handle. This handle is obtained by ++ * calling one of \ref nvmlDeviceGetHandleByIndex(), \ref nvmlDeviceGetHandleBySerial(), ++ * \ref nvmlDeviceGetHandleByPciBusId(). or \ref nvmlDeviceGetHandleByUUID(). ++ * @{ ++ */ ++/***************************************************************************************************/ ++ ++ /** ++ * Retrieves the number of compute devices in the system. A compute device is a single GPU. ++ * ++ * For all products. ++ * ++ * Note: New nvmlDeviceGetCount_v2 (default in NVML 5.319) returns count of all devices in the system ++ * even if nvmlDeviceGetHandleByIndex_v2 returns NVML_ERROR_NO_PERMISSION for such device. ++ * Update your code to handle this error, or use NVML 4.304 or older nvml header file. ++ * For backward binary compatibility reasons _v1 version of the API is still present in the shared ++ * library. ++ * Old _v1 version of nvmlDeviceGetCount doesn't count devices that NVML has no permission to talk to. ++ * ++ * @param deviceCount Reference in which to return the number of accessible devices ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a deviceCount has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a deviceCount is NULL ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetCount(unsigned int *deviceCount); ++ ++/** ++ * Acquire the handle for a particular device, based on its index. ++ * ++ * For all products. ++ * ++ * Valid indices are derived from the \a accessibleDevices count returned by ++ * \ref nvmlDeviceGetCount(). For example, if \a accessibleDevices is 2 the valid indices ++ * are 0 and 1, corresponding to GPU 0 and GPU 1. ++ * ++ * The order in which NVML enumerates devices has no guarantees of consistency between reboots. For that reason it ++ * is recommended that devices be looked up by their PCI ids or UUID. See ++ * \ref nvmlDeviceGetHandleByUUID() and \ref nvmlDeviceGetHandleByPciBusId(). ++ * ++ * Note: The NVML index may not correlate with other APIs, such as the CUDA device index. ++ * ++ * Starting from NVML 5, this API causes NVML to initialize the target GPU ++ * NVML may initialize additional GPUs if: ++ * - The target GPU is an SLI slave ++ * ++ * Note: New nvmlDeviceGetCount_v2 (default in NVML 5.319) returns count of all devices in the system ++ * even if nvmlDeviceGetHandleByIndex_v2 returns NVML_ERROR_NO_PERMISSION for such device. ++ * Update your code to handle this error, or use NVML 4.304 or older nvml header file. ++ * For backward binary compatibility reasons _v1 version of the API is still present in the shared ++ * library. ++ * Old _v1 version of nvmlDeviceGetCount doesn't count devices that NVML has no permission to talk to. ++ * ++ * This means that nvmlDeviceGetHandleByIndex_v2 and _v1 can return different devices for the same index. ++ * If you don't touch macros that map old (_v1) versions to _v2 versions at the top of the file you don't ++ * need to worry about that. ++ * ++ * @param index The index of the target GPU, >= 0 and < \a accessibleDevices ++ * @param device Reference in which to return the device handle ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a device has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a index is invalid or \a device is NULL ++ * - \ref NVML_ERROR_INSUFFICIENT_POWER if any attached devices have improperly attached external power cables ++ * - \ref NVML_ERROR_NO_PERMISSION if the user doesn't have permission to talk to this device ++ * - \ref NVML_ERROR_IRQ_ISSUE if NVIDIA kernel detected an interrupt issue with the attached GPUs ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ * ++ * @see nvmlDeviceGetIndex ++ * @see nvmlDeviceGetCount ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetHandleByIndex(unsigned int index, nvmlDevice_t *device); ++ ++/** ++ * Acquire the handle for a particular device, based on its board serial number. ++ * ++ * For Fermi &tm; or newer fully supported devices. ++ * ++ * This number corresponds to the value printed directly on the board, and to the value returned by ++ * \ref nvmlDeviceGetSerial(). ++ * ++ * @deprecated Since more than one GPU can exist on a single board this function is deprecated in favor ++ * of \ref nvmlDeviceGetHandleByUUID. ++ * For dual GPU boards this function will return NVML_ERROR_INVALID_ARGUMENT. ++ * ++ * Starting from NVML 5, this API causes NVML to initialize the target GPU ++ * NVML may initialize additional GPUs as it searches for the target GPU ++ * ++ * @param serial The board serial number of the target GPU ++ * @param device Reference in which to return the device handle ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a device has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a serial is invalid, \a device is NULL or more than one ++ * device has the same serial (dual GPU boards) ++ * - \ref NVML_ERROR_NOT_FOUND if \a serial does not match a valid device on the system ++ * - \ref NVML_ERROR_INSUFFICIENT_POWER if any attached devices have improperly attached external power cables ++ * - \ref NVML_ERROR_IRQ_ISSUE if NVIDIA kernel detected an interrupt issue with the attached GPUs ++ * - \ref NVML_ERROR_GPU_IS_LOST if any GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ * ++ * @see nvmlDeviceGetSerial ++ * @see nvmlDeviceGetHandleByUUID ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetHandleBySerial(const char *serial, nvmlDevice_t *device); ++ ++/** ++ * Acquire the handle for a particular device, based on its globally unique immutable UUID associated with each device. ++ * ++ * For all products. ++ * ++ * @param uuid The UUID of the target GPU ++ * @param device Reference in which to return the device handle ++ * ++ * Starting from NVML 5, this API causes NVML to initialize the target GPU ++ * NVML may initialize additional GPUs as it searches for the target GPU ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a device has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a uuid is invalid or \a device is null ++ * - \ref NVML_ERROR_NOT_FOUND if \a uuid does not match a valid device on the system ++ * - \ref NVML_ERROR_INSUFFICIENT_POWER if any attached devices have improperly attached external power cables ++ * - \ref NVML_ERROR_IRQ_ISSUE if NVIDIA kernel detected an interrupt issue with the attached GPUs ++ * - \ref NVML_ERROR_GPU_IS_LOST if any GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ * ++ * @see nvmlDeviceGetUUID ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetHandleByUUID(const char *uuid, nvmlDevice_t *device); ++ ++/** ++ * Acquire the handle for a particular device, based on its PCI bus id. ++ * ++ * For all products. ++ * ++ * This value corresponds to the nvmlPciInfo_t::busId returned by \ref nvmlDeviceGetPciInfo(). ++ * ++ * Starting from NVML 5, this API causes NVML to initialize the target GPU ++ * NVML may initialize additional GPUs if: ++ * - The target GPU is an SLI slave ++ * ++ * \note NVML 4.304 and older version of nvmlDeviceGetHandleByPciBusId"_v1" returns NVML_ERROR_NOT_FOUND ++ * instead of NVML_ERROR_NO_PERMISSION. ++ * ++ * @param pciBusId The PCI bus id of the target GPU ++ * @param device Reference in which to return the device handle ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a device has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a pciBusId is invalid or \a device is NULL ++ * - \ref NVML_ERROR_NOT_FOUND if \a pciBusId does not match a valid device on the system ++ * - \ref NVML_ERROR_INSUFFICIENT_POWER if the attached device has improperly attached external power cables ++ * - \ref NVML_ERROR_NO_PERMISSION if the user doesn't have permission to talk to this device ++ * - \ref NVML_ERROR_IRQ_ISSUE if NVIDIA kernel detected an interrupt issue with the attached GPUs ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetHandleByPciBusId(const char *pciBusId, nvmlDevice_t *device); ++ ++/** ++ * Retrieves the name of this device. ++ * ++ * For all products. ++ * ++ * The name is an alphanumeric string that denotes a particular product, e.g. Tesla &tm; C2070. It will not ++ * exceed 64 characters in length (including the NULL terminator). See \ref ++ * nvmlConstants::NVML_DEVICE_NAME_BUFFER_SIZE. ++ * ++ * @param device The identifier of the target device ++ * @param name Reference in which to return the product name ++ * @param length The maximum allowed length of the string returned in \a name ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a name has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, or \a name is NULL ++ * - \ref NVML_ERROR_INSUFFICIENT_SIZE if \a length is too small ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetName(nvmlDevice_t device, char *name, unsigned int length); ++ ++/** ++ * Retrieves the brand of this device. ++ * ++ * For all products. ++ * ++ * The type is a member of \ref nvmlBrandType_t defined above. ++ * ++ * @param device The identifier of the target device ++ * @param type Reference in which to return the product brand type ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a name has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, or \a type is NULL ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetBrand(nvmlDevice_t device, nvmlBrandType_t *type); ++ ++/** ++ * Retrieves the NVML index of this device. ++ * ++ * For all products. ++ * ++ * Valid indices are derived from the \a accessibleDevices count returned by ++ * \ref nvmlDeviceGetCount(). For example, if \a accessibleDevices is 2 the valid indices ++ * are 0 and 1, corresponding to GPU 0 and GPU 1. ++ * ++ * The order in which NVML enumerates devices has no guarantees of consistency between reboots. For that reason it ++ * is recommended that devices be looked up by their PCI ids or GPU UUID. See ++ * \ref nvmlDeviceGetHandleByPciBusId() and \ref nvmlDeviceGetHandleByUUID(). ++ * ++ * Note: The NVML index may not correlate with other APIs, such as the CUDA device index. ++ * ++ * @param device The identifier of the target device ++ * @param index Reference in which to return the NVML index of the device ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a index has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, or \a index is NULL ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ * ++ * @see nvmlDeviceGetHandleByIndex() ++ * @see nvmlDeviceGetCount() ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetIndex(nvmlDevice_t device, unsigned int *index); ++ ++/** ++ * Retrieves the globally unique board serial number associated with this device's board. ++ * ++ * For all products with an inforom. ++ * ++ * The serial number is an alphanumeric string that will not exceed 30 characters (including the NULL terminator). ++ * This number matches the serial number tag that is physically attached to the board. See \ref ++ * nvmlConstants::NVML_DEVICE_SERIAL_BUFFER_SIZE. ++ * ++ * @param device The identifier of the target device ++ * @param serial Reference in which to return the board/module serial number ++ * @param length The maximum allowed length of the string returned in \a serial ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a serial has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, or \a serial is NULL ++ * - \ref NVML_ERROR_INSUFFICIENT_SIZE if \a length is too small ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetSerial(nvmlDevice_t device, char *serial, unsigned int length); ++ ++/** ++ * Retrieves an array of unsigned ints (sized to cpuSetSize) of bitmasks with the ideal CPU affinity for the device ++ * For example, if processors 0, 1, 32, and 33 are ideal for the device and cpuSetSize == 2, ++ * result[0] = 0x3, result[1] = 0x3 ++ * ++ * For Kepler &tm; or newer fully supported devices. ++ * Supported on Linux only. ++ * ++ * @param device The identifier of the target device ++ * @param cpuSetSize The size of the cpuSet array that is safe to access ++ * @param cpuSet Array reference in which to return a bitmask of CPUs, 64 CPUs per ++ * unsigned long on 64-bit machines, 32 on 32-bit machines ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a cpuAffinity has been filled ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, cpuSetSize == 0, or cpuSet is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetCpuAffinity(nvmlDevice_t device, unsigned int cpuSetSize, unsigned long *cpuSet); ++ ++/** ++ * Sets the ideal affinity for the calling thread and device using the guidelines ++ * given in nvmlDeviceGetCpuAffinity(). Note, this is a change as of version 8.0. ++ * Older versions set the affinity for a calling process and all children. ++ * Currently supports up to 64 processors. ++ * ++ * For Kepler &tm; or newer fully supported devices. ++ * Supported on Linux only. ++ * ++ * @param device The identifier of the target device ++ * ++ * @return ++ * - \ref NVML_SUCCESS if the calling process has been successfully bound ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceSetCpuAffinity(nvmlDevice_t device); ++ ++/** ++ * Clear all affinity bindings for the calling thread. Note, this is a change as of version ++ * 8.0 as older versions cleared the affinity for a calling process and all children. ++ * ++ * For Kepler &tm; or newer fully supported devices. ++ * Supported on Linux only. ++ * ++ * @param device The identifier of the target device ++ * ++ * @return ++ * - \ref NVML_SUCCESS if the calling process has been successfully unbound ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceClearCpuAffinity(nvmlDevice_t device); ++ ++/** ++ * Retrieve the common ancestor for two devices ++ * For all products. ++ * Supported on Linux only. ++ * ++ * @param device1 The identifier of the first device ++ * @param device2 The identifier of the second device ++ * @param pathInfo A \ref nvmlGpuTopologyLevel_t that gives the path type ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a pathInfo has been set ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device1, or \a device2 is invalid, or \a pathInfo is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device or OS does not support this feature ++ * - \ref NVML_ERROR_UNKNOWN an error has occurred in underlying topology discovery ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetTopologyCommonAncestor(nvmlDevice_t device1, nvmlDevice_t device2, nvmlGpuTopologyLevel_t *pathInfo); ++ ++/** ++ * Retrieve the set of GPUs that are nearest to a given device at a specific interconnectivity level ++ * For all products. ++ * Supported on Linux only. ++ * ++ * @param device The identifier of the first device ++ * @param level The \ref nvmlGpuTopologyLevel_t level to search for other GPUs ++ * @param count When zero, is set to the number of matching GPUs such that \a deviceArray ++ * can be malloc'd. When non-zero, \a deviceArray will be filled with \a count ++ * number of device handles. ++ * @param deviceArray An array of device handles for GPUs found at \a level ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a deviceArray or \a count (if initially zero) has been set ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device, \a level, or \a count is invalid, or \a deviceArray is NULL with a non-zero \a count ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device or OS does not support this feature ++ * - \ref NVML_ERROR_UNKNOWN an error has occurred in underlying topology discovery ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetTopologyNearestGpus(nvmlDevice_t device, nvmlGpuTopologyLevel_t level, unsigned int *count, nvmlDevice_t *deviceArray); ++ ++/** ++ * Retrieve the set of GPUs that have a CPU affinity with the given CPU number ++ * For all products. ++ * Supported on Linux only. ++ * ++ * @param cpuNumber The CPU number ++ * @param count When zero, is set to the number of matching GPUs such that \a deviceArray ++ * can be malloc'd. When non-zero, \a deviceArray will be filled with \a count ++ * number of device handles. ++ * @param deviceArray An array of device handles for GPUs found with affinity to \a cpuNumber ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a deviceArray or \a count (if initially zero) has been set ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a cpuNumber, or \a count is invalid, or \a deviceArray is NULL with a non-zero \a count ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device or OS does not support this feature ++ * - \ref NVML_ERROR_UNKNOWN an error has occurred in underlying topology discovery ++ */ ++nvmlReturn_t DECLDIR nvmlSystemGetTopologyGpuSet(unsigned int cpuNumber, unsigned int *count, nvmlDevice_t *deviceArray); ++ ++/** ++ * Retrieve the status for a given p2p capability index between a given pair of GPU ++ * ++ * @param device1 The first device ++ * @param device2 The second device ++ * @param p2pIndex p2p Capability Index being looked for between \a device1 and \a device2 ++ * @param p2pStatus Reference in which to return the status of the \a p2pIndex ++ * between \a device1 and \a device2 ++ * @return ++ * - \ref NVML_SUCCESS if \a p2pStatus has been populated ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device1 or \a device2 or \a p2pIndex is invalid or \a p2pStatus is NULL ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetP2PStatus(nvmlDevice_t device1, nvmlDevice_t device2, nvmlGpuP2PCapsIndex_t p2pIndex,nvmlGpuP2PStatus_t *p2pStatus); ++ ++ ++/** ++ * Retrieves the globally unique immutable UUID associated with this device, as a 5 part hexadecimal string, ++ * that augments the immutable, board serial identifier. ++ * ++ * For all products. ++ * ++ * The UUID is a globally unique identifier. It is the only available identifier for pre-Fermi-architecture products. ++ * It does NOT correspond to any identifier printed on the board. It will not exceed 80 characters in length ++ * (including the NULL terminator). See \ref nvmlConstants::NVML_DEVICE_UUID_BUFFER_SIZE. ++ * ++ * @param device The identifier of the target device ++ * @param uuid Reference in which to return the GPU UUID ++ * @param length The maximum allowed length of the string returned in \a uuid ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a uuid has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, or \a uuid is NULL ++ * - \ref NVML_ERROR_INSUFFICIENT_SIZE if \a length is too small ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetUUID(nvmlDevice_t device, char *uuid, unsigned int length); ++ ++/** ++ * Retrieves minor number for the device. The minor number for the device is such that the Nvidia device node file for ++ * each GPU will have the form /dev/nvidia[minor number]. ++ * ++ * For all products. ++ * Supported only for Linux ++ * ++ * @param device The identifier of the target device ++ * @param minorNumber Reference in which to return the minor number for the device ++ * @return ++ * - \ref NVML_SUCCESS if the minor number is successfully retrieved ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a minorNumber is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if this query is not supported by the device ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetMinorNumber(nvmlDevice_t device, unsigned int *minorNumber); ++ ++/** ++ * Retrieves the the device board part number which is programmed into the board's InfoROM ++ * ++ * For all products. ++ * ++ * @param device Identifier of the target device ++ * @param partNumber Reference to the buffer to return ++ * @param length Length of the buffer reference ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a partNumber has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the needed VBIOS fields have not been filled ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a serial is NULL ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetBoardPartNumber(nvmlDevice_t device, char* partNumber, unsigned int length); ++ ++/** ++ * Retrieves the version information for the device's infoROM object. ++ * ++ * For all products with an inforom. ++ * ++ * Fermi and higher parts have non-volatile on-board memory for persisting device info, such as aggregate ++ * ECC counts. The version of the data structures in this memory may change from time to time. It will not ++ * exceed 16 characters in length (including the NULL terminator). ++ * See \ref nvmlConstants::NVML_DEVICE_INFOROM_VERSION_BUFFER_SIZE. ++ * ++ * See \ref nvmlInforomObject_t for details on the available infoROM objects. ++ * ++ * @param device The identifier of the target device ++ * @param object The target infoROM object ++ * @param version Reference in which to return the infoROM version ++ * @param length The maximum allowed length of the string returned in \a version ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a version has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a version is NULL ++ * - \ref NVML_ERROR_INSUFFICIENT_SIZE if \a length is too small ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not have an infoROM ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ * ++ * @see nvmlDeviceGetInforomImageVersion ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetInforomVersion(nvmlDevice_t device, nvmlInforomObject_t object, char *version, unsigned int length); ++ ++/** ++ * Retrieves the global infoROM image version ++ * ++ * For all products with an inforom. ++ * ++ * Image version just like VBIOS version uniquely describes the exact version of the infoROM flashed on the board ++ * in contrast to infoROM object version which is only an indicator of supported features. ++ * Version string will not exceed 16 characters in length (including the NULL terminator). ++ * See \ref nvmlConstants::NVML_DEVICE_INFOROM_VERSION_BUFFER_SIZE. ++ * ++ * @param device The identifier of the target device ++ * @param version Reference in which to return the infoROM image version ++ * @param length The maximum allowed length of the string returned in \a version ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a version has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a version is NULL ++ * - \ref NVML_ERROR_INSUFFICIENT_SIZE if \a length is too small ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not have an infoROM ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ * ++ * @see nvmlDeviceGetInforomVersion ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetInforomImageVersion(nvmlDevice_t device, char *version, unsigned int length); ++ ++/** ++ * Retrieves the checksum of the configuration stored in the device's infoROM. ++ * ++ * For all products with an inforom. ++ * ++ * Can be used to make sure that two GPUs have the exact same configuration. ++ * Current checksum takes into account configuration stored in PWR and ECC infoROM objects. ++ * Checksum can change between driver releases or when user changes configuration (e.g. disable/enable ECC) ++ * ++ * @param device The identifier of the target device ++ * @param checksum Reference in which to return the infoROM configuration checksum ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a checksum has been set ++ * - \ref NVML_ERROR_CORRUPTED_INFOROM if the device's checksum couldn't be retrieved due to infoROM corruption ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a checksum is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetInforomConfigurationChecksum(nvmlDevice_t device, unsigned int *checksum); ++ ++/** ++ * Reads the infoROM from the flash and verifies the checksums. ++ * ++ * For all products with an inforom. ++ * ++ * @param device The identifier of the target device ++ * ++ * @return ++ * - \ref NVML_SUCCESS if infoROM is not corrupted ++ * - \ref NVML_ERROR_CORRUPTED_INFOROM if the device's infoROM is corrupted ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceValidateInforom(nvmlDevice_t device); ++ ++/** ++ * Retrieves the display mode for the device. ++ * ++ * For all products. ++ * ++ * This method indicates whether a physical display (e.g. monitor) is currently connected to ++ * any of the device's connectors. ++ * ++ * See \ref nvmlEnableState_t for details on allowed modes. ++ * ++ * @param device The identifier of the target device ++ * @param display Reference in which to return the display mode ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a display has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a display is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetDisplayMode(nvmlDevice_t device, nvmlEnableState_t *display); ++ ++/** ++ * Retrieves the display active state for the device. ++ * ++ * For all products. ++ * ++ * This method indicates whether a display is initialized on the device. ++ * For example whether X Server is attached to this device and has allocated memory for the screen. ++ * ++ * Display can be active even when no monitor is physically attached. ++ * ++ * See \ref nvmlEnableState_t for details on allowed modes. ++ * ++ * @param device The identifier of the target device ++ * @param isActive Reference in which to return the display active state ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a isActive has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a isActive is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetDisplayActive(nvmlDevice_t device, nvmlEnableState_t *isActive); ++ ++/** ++ * Retrieves the persistence mode associated with this device. ++ * ++ * For all products. ++ * For Linux only. ++ * ++ * When driver persistence mode is enabled the driver software state is not torn down when the last ++ * client disconnects. By default this feature is disabled. ++ * ++ * See \ref nvmlEnableState_t for details on allowed modes. ++ * ++ * @param device The identifier of the target device ++ * @param mode Reference in which to return the current driver persistence mode ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a mode has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a mode is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ * ++ * @see nvmlDeviceSetPersistenceMode() ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetPersistenceMode(nvmlDevice_t device, nvmlEnableState_t *mode); ++ ++/** ++ * Retrieves the PCI attributes of this device. ++ * ++ * For all products. ++ * ++ * See \ref nvmlPciInfo_t for details on the available PCI info. ++ * ++ * @param device The identifier of the target device ++ * @param pci Reference in which to return the PCI info ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a pci has been populated ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a pci is NULL ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetPciInfo(nvmlDevice_t device, nvmlPciInfo_t *pci); ++ ++/** ++ * Retrieves the maximum PCIe link generation possible with this device and system ++ * ++ * I.E. for a generation 2 PCIe device attached to a generation 1 PCIe bus the max link generation this function will ++ * report is generation 1. ++ * ++ * For Fermi &tm; or newer fully supported devices. ++ * ++ * @param device The identifier of the target device ++ * @param maxLinkGen Reference in which to return the max PCIe link generation ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a maxLinkGen has been populated ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a maxLinkGen is null ++ * - \ref NVML_ERROR_NOT_SUPPORTED if PCIe link information is not available ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetMaxPcieLinkGeneration(nvmlDevice_t device, unsigned int *maxLinkGen); ++ ++/** ++ * Retrieves the maximum PCIe link width possible with this device and system ++ * ++ * I.E. for a device with a 16x PCIe bus width attached to a 8x PCIe system bus this function will report ++ * a max link width of 8. ++ * ++ * For Fermi &tm; or newer fully supported devices. ++ * ++ * @param device The identifier of the target device ++ * @param maxLinkWidth Reference in which to return the max PCIe link generation ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a maxLinkWidth has been populated ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a maxLinkWidth is null ++ * - \ref NVML_ERROR_NOT_SUPPORTED if PCIe link information is not available ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetMaxPcieLinkWidth(nvmlDevice_t device, unsigned int *maxLinkWidth); ++ ++/** ++ * Retrieves the current PCIe link generation ++ * ++ * For Fermi &tm; or newer fully supported devices. ++ * ++ * @param device The identifier of the target device ++ * @param currLinkGen Reference in which to return the current PCIe link generation ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a currLinkGen has been populated ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a currLinkGen is null ++ * - \ref NVML_ERROR_NOT_SUPPORTED if PCIe link information is not available ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetCurrPcieLinkGeneration(nvmlDevice_t device, unsigned int *currLinkGen); ++ ++/** ++ * Retrieves the current PCIe link width ++ * ++ * For Fermi &tm; or newer fully supported devices. ++ * ++ * @param device The identifier of the target device ++ * @param currLinkWidth Reference in which to return the current PCIe link generation ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a currLinkWidth has been populated ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a currLinkWidth is null ++ * - \ref NVML_ERROR_NOT_SUPPORTED if PCIe link information is not available ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetCurrPcieLinkWidth(nvmlDevice_t device, unsigned int *currLinkWidth); ++ ++/** ++ * Retrieve PCIe utilization information. ++ * This function is querying a byte counter over a 20ms interval and thus is the ++ * PCIe throughput over that interval. ++ * ++ * For Maxwell &tm; or newer fully supported devices. ++ * ++ * This method is not supported on virtualized GPU environments. ++ * ++ * @param device The identifier of the target device ++ * @param counter The specific counter that should be queried \ref nvmlPcieUtilCounter_t ++ * @param value Reference in which to return throughput in KB/s ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a value has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device or \a counter is invalid, or \a value is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetPcieThroughput(nvmlDevice_t device, nvmlPcieUtilCounter_t counter, unsigned int *value); ++ ++/** ++ * Retrieve the PCIe replay counter. ++ * ++ * For Kepler &tm; or newer fully supported devices. ++ * ++ * @param device The identifier of the target device ++ * @param value Reference in which to return the counter's value ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a value and \a rollover have been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, or \a value or \a rollover are NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetPcieReplayCounter(nvmlDevice_t device, unsigned int *value); ++ ++/** ++ * Retrieves the current clock speeds for the device. ++ * ++ * For Fermi &tm; or newer fully supported devices. ++ * ++ * See \ref nvmlClockType_t for details on available clock information. ++ * ++ * @param device The identifier of the target device ++ * @param type Identify which clock domain to query ++ * @param clock Reference in which to return the clock speed in MHz ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a clock has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a clock is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device cannot report the specified clock ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetClockInfo(nvmlDevice_t device, nvmlClockType_t type, unsigned int *clock); ++ ++/** ++ * Retrieves the maximum clock speeds for the device. ++ * ++ * For Fermi &tm; or newer fully supported devices. ++ * ++ * See \ref nvmlClockType_t for details on available clock information. ++ * ++ * \note On GPUs from Fermi family current P0 clocks (reported by \ref nvmlDeviceGetClockInfo) can differ from max clocks ++ * by few MHz. ++ * ++ * @param device The identifier of the target device ++ * @param type Identify which clock domain to query ++ * @param clock Reference in which to return the clock speed in MHz ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a clock has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a clock is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device cannot report the specified clock ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetMaxClockInfo(nvmlDevice_t device, nvmlClockType_t type, unsigned int *clock); ++ ++/** ++ * Retrieves the current setting of a clock that applications will use unless an overspec situation occurs. ++ * Can be changed using \ref nvmlDeviceSetApplicationsClocks. ++ * ++ * For Kepler &tm; or newer fully supported devices. ++ * ++ * @param device The identifier of the target device ++ * @param clockType Identify which clock domain to query ++ * @param clockMHz Reference in which to return the clock in MHz ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a clockMHz has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a clockMHz is NULL or \a clockType is invalid ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetApplicationsClock(nvmlDevice_t device, nvmlClockType_t clockType, unsigned int *clockMHz); ++ ++/** ++ * Retrieves the default applications clock that GPU boots with or ++ * defaults to after \ref nvmlDeviceResetApplicationsClocks call. ++ * ++ * For Kepler &tm; or newer fully supported devices. ++ * ++ * @param device The identifier of the target device ++ * @param clockType Identify which clock domain to query ++ * @param clockMHz Reference in which to return the default clock in MHz ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a clockMHz has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a clockMHz is NULL or \a clockType is invalid ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ * ++ * \see nvmlDeviceGetApplicationsClock ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetDefaultApplicationsClock(nvmlDevice_t device, nvmlClockType_t clockType, unsigned int *clockMHz); ++ ++/** ++ * Resets the application clock to the default value ++ * ++ * This is the applications clock that will be used after system reboot or driver reload. ++ * Default value is constant, but the current value an be changed using \ref nvmlDeviceSetApplicationsClocks. ++ * ++ * On Pascal and newer hardware, if clocks were previously locked with \ref nvmlDeviceSetApplicationsClocks, ++ * this call will unlock clocks. This returns clocks their default behavior ofautomatically boosting above ++ * base clocks as thermal limits allow. ++ * ++ * @see nvmlDeviceGetApplicationsClock ++ * @see nvmlDeviceSetApplicationsClocks ++ * ++ * For Fermi &tm; or newer non-GeForce fully supported devices and Maxwell or newer GeForce devices. ++ * ++ * @param device The identifier of the target device ++ * ++ * @return ++ * - \ref NVML_SUCCESS if new settings were successfully set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceResetApplicationsClocks(nvmlDevice_t device); ++ ++/** ++ * Retrieves the clock speed for the clock specified by the clock type and clock ID. ++ * ++ * For Kepler &tm; or newer fully supported devices. ++ * ++ * @param device The identifier of the target device ++ * @param clockType Identify which clock domain to query ++ * @param clockId Identify which clock in the domain to query ++ * @param clockMHz Reference in which to return the clock in MHz ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a clockMHz has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a clockMHz is NULL or \a clockType is invalid ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetClock(nvmlDevice_t device, nvmlClockType_t clockType, nvmlClockId_t clockId, unsigned int *clockMHz); ++ ++/** ++ * Retrieves the customer defined maximum boost clock speed specified by the given clock type. ++ * ++ * For newer than Maxwell &tm; fully supported devices. ++ * ++ * @param device The identifier of the target device ++ * @param clockType Identify which clock domain to query ++ * @param clockMHz Reference in which to return the clock in MHz ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a clockMHz has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a clockMHz is NULL or \a clockType is invalid ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device or the \a clockType on this device does not support this feature ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetMaxCustomerBoostClock(nvmlDevice_t device, nvmlClockType_t clockType, unsigned int *clockMHz); ++ ++/** ++ * Retrieves the list of possible memory clocks that can be used as an argument for \ref nvmlDeviceSetApplicationsClocks. ++ * ++ * For Kepler &tm; or newer fully supported devices. ++ * ++ * @param device The identifier of the target device ++ * @param count Reference in which to provide the \a clocksMHz array size, and ++ * to return the number of elements ++ * @param clocksMHz Reference in which to return the clock in MHz ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a count and \a clocksMHz have been populated ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a count is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature ++ * - \ref NVML_ERROR_INSUFFICIENT_SIZE if \a count is too small (\a count is set to the number of ++ * required elements) ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ * ++ * @see nvmlDeviceSetApplicationsClocks ++ * @see nvmlDeviceGetSupportedGraphicsClocks ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetSupportedMemoryClocks(nvmlDevice_t device, unsigned int *count, unsigned int *clocksMHz); ++ ++/** ++ * Retrieves the list of possible graphics clocks that can be used as an argument for \ref nvmlDeviceSetApplicationsClocks. ++ * ++ * For Kepler &tm; or newer fully supported devices. ++ * ++ * @param device The identifier of the target device ++ * @param memoryClockMHz Memory clock for which to return possible graphics clocks ++ * @param count Reference in which to provide the \a clocksMHz array size, and ++ * to return the number of elements ++ * @param clocksMHz Reference in which to return the clocks in MHz ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a count and \a clocksMHz have been populated ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_NOT_FOUND if the specified \a memoryClockMHz is not a supported frequency ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a clock is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature ++ * - \ref NVML_ERROR_INSUFFICIENT_SIZE if \a count is too small ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ * ++ * @see nvmlDeviceSetApplicationsClocks ++ * @see nvmlDeviceGetSupportedMemoryClocks ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetSupportedGraphicsClocks(nvmlDevice_t device, unsigned int memoryClockMHz, unsigned int *count, unsigned int *clocksMHz); ++ ++/** ++ * Retrieve the current state of Auto Boosted clocks on a device and store it in \a isEnabled ++ * ++ * For Kepler &tm; or newer fully supported devices. ++ * ++ * Auto Boosted clocks are enabled by default on some hardware, allowing the GPU to run at higher clock rates ++ * to maximize performance as thermal limits allow. ++ * ++ * On Pascal and newer hardware, Auto Aoosted clocks are controlled through application clocks. ++ * Use \ref nvmlDeviceSetApplicationsClocks and \ref nvmlDeviceResetApplicationsClocks to control Auto Boost ++ * behavior. ++ * ++ * @param device The identifier of the target device ++ * @param isEnabled Where to store the current state of Auto Boosted clocks of the target device ++ * @param defaultIsEnabled Where to store the default Auto Boosted clocks behavior of the target device that the device will ++ * revert to when no applications are using the GPU ++ * ++ * @return ++ * - \ref NVML_SUCCESS If \a isEnabled has been been set with the Auto Boosted clocks state of \a device ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a isEnabled is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support Auto Boosted clocks ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ * ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetAutoBoostedClocksEnabled(nvmlDevice_t device, nvmlEnableState_t *isEnabled, nvmlEnableState_t *defaultIsEnabled); ++ ++/** ++ * Try to set the current state of Auto Boosted clocks on a device. ++ * ++ * For Kepler &tm; or newer fully supported devices. ++ * ++ * Auto Boosted clocks are enabled by default on some hardware, allowing the GPU to run at higher clock rates ++ * to maximize performance as thermal limits allow. Auto Boosted clocks should be disabled if fixed clock ++ * rates are desired. ++ * ++ * Non-root users may use this API by default but can be restricted by root from using this API by calling ++ * \ref nvmlDeviceSetAPIRestriction with apiType=NVML_RESTRICTED_API_SET_AUTO_BOOSTED_CLOCKS. ++ * Note: Persistence Mode is required to modify current Auto Boost settings, therefore, it must be enabled. ++ * ++ * On Pascal and newer hardware, Auto Boosted clocks are controlled through application clocks. ++ * Use \ref nvmlDeviceSetApplicationsClocks and \ref nvmlDeviceResetApplicationsClocks to control Auto Boost ++ * behavior. ++ * ++ * @param device The identifier of the target device ++ * @param enabled What state to try to set Auto Boosted clocks of the target device to ++ * ++ * @return ++ * - \ref NVML_SUCCESS If the Auto Boosted clocks were successfully set to the state specified by \a enabled ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support Auto Boosted clocks ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ * ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceSetAutoBoostedClocksEnabled(nvmlDevice_t device, nvmlEnableState_t enabled); ++ ++/** ++ * Try to set the default state of Auto Boosted clocks on a device. This is the default state that Auto Boosted clocks will ++ * return to when no compute running processes (e.g. CUDA application which have an active context) are running ++ * ++ * For Kepler &tm; or newer non-GeForce fully supported devices and Maxwell or newer GeForce devices. ++ * Requires root/admin permissions. ++ * ++ * Auto Boosted clocks are enabled by default on some hardware, allowing the GPU to run at higher clock rates ++ * to maximize performance as thermal limits allow. Auto Boosted clocks should be disabled if fixed clock ++ * rates are desired. ++ * ++ * On Pascal and newer hardware, Auto Boosted clocks are controlled through application clocks. ++ * Use \ref nvmlDeviceSetApplicationsClocks and \ref nvmlDeviceResetApplicationsClocks to control Auto Boost ++ * behavior. ++ * ++ * @param device The identifier of the target device ++ * @param enabled What state to try to set default Auto Boosted clocks of the target device to ++ * @param flags Flags that change the default behavior. Currently Unused. ++ * ++ * @return ++ * - \ref NVML_SUCCESS If the Auto Boosted clock's default state was successfully set to the state specified by \a enabled ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_NO_PERMISSION If the calling user does not have permission to change Auto Boosted clock's default state. ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support Auto Boosted clocks ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ * ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceSetDefaultAutoBoostedClocksEnabled(nvmlDevice_t device, nvmlEnableState_t enabled, unsigned int flags); ++ ++ ++/** ++ * Retrieves the intended operating speed of the device's fan. ++ * ++ * Note: The reported speed is the intended fan speed. If the fan is physically blocked and unable to spin, the ++ * output will not match the actual fan speed. ++ * ++ * For all discrete products with dedicated fans. ++ * ++ * The fan speed is expressed as a percent of the maximum, i.e. full speed is 100%. ++ * ++ * @param device The identifier of the target device ++ * @param speed Reference in which to return the fan speed percentage ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a speed has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a speed is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not have a fan ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetFanSpeed(nvmlDevice_t device, unsigned int *speed); ++ ++/** ++ * Retrieves the current temperature readings for the device, in degrees C. ++ * ++ * For all products. ++ * ++ * See \ref nvmlTemperatureSensors_t for details on available temperature sensors. ++ * ++ * @param device The identifier of the target device ++ * @param sensorType Flag that indicates which sensor reading to retrieve ++ * @param temp Reference in which to return the temperature reading ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a temp has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, \a sensorType is invalid or \a temp is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not have the specified sensor ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetTemperature(nvmlDevice_t device, nvmlTemperatureSensors_t sensorType, unsigned int *temp); ++ ++/** ++ * Retrieves the temperature threshold for the GPU with the specified threshold type in degrees C. ++ * ++ * For Kepler &tm; or newer fully supported devices. ++ * ++ * See \ref nvmlTemperatureThresholds_t for details on available temperature thresholds. ++ * ++ * @param device The identifier of the target device ++ * @param thresholdType The type of threshold value queried ++ * @param temp Reference in which to return the temperature reading ++ * @return ++ * - \ref NVML_SUCCESS if \a temp has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, \a thresholdType is invalid or \a temp is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not have a temperature sensor or is unsupported ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetTemperatureThreshold(nvmlDevice_t device, nvmlTemperatureThresholds_t thresholdType, unsigned int *temp); ++ ++/** ++ * Retrieves the current performance state for the device. ++ * ++ * For Fermi &tm; or newer fully supported devices. ++ * ++ * See \ref nvmlPstates_t for details on allowed performance states. ++ * ++ * @param device The identifier of the target device ++ * @param pState Reference in which to return the performance state reading ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a pState has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a pState is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetPerformanceState(nvmlDevice_t device, nvmlPstates_t *pState); ++ ++/** ++ * Retrieves current clocks throttling reasons. ++ * ++ * For all fully supported products. ++ * ++ * \note More than one bit can be enabled at the same time. Multiple reasons can be affecting clocks at once. ++ * ++ * @param device The identifier of the target device ++ * @param clocksThrottleReasons Reference in which to return bitmask of active clocks throttle ++ * reasons ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a clocksThrottleReasons has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a clocksThrottleReasons is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ * ++ * @see nvmlClocksThrottleReasons ++ * @see nvmlDeviceGetSupportedClocksThrottleReasons ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetCurrentClocksThrottleReasons(nvmlDevice_t device, unsigned long long *clocksThrottleReasons); ++ ++/** ++ * Retrieves bitmask of supported clocks throttle reasons that can be returned by ++ * \ref nvmlDeviceGetCurrentClocksThrottleReasons ++ * ++ * For all fully supported products. ++ * ++ * This method is not supported on virtualized GPU environments. ++ * ++ * @param device The identifier of the target device ++ * @param supportedClocksThrottleReasons Reference in which to return bitmask of supported ++ * clocks throttle reasons ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a supportedClocksThrottleReasons has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a supportedClocksThrottleReasons is NULL ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ * ++ * @see nvmlClocksThrottleReasons ++ * @see nvmlDeviceGetCurrentClocksThrottleReasons ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetSupportedClocksThrottleReasons(nvmlDevice_t device, unsigned long long *supportedClocksThrottleReasons); ++ ++/** ++ * Deprecated: Use \ref nvmlDeviceGetPerformanceState. This function exposes an incorrect generalization. ++ * ++ * Retrieve the current performance state for the device. ++ * ++ * For Fermi &tm; or newer fully supported devices. ++ * ++ * See \ref nvmlPstates_t for details on allowed performance states. ++ * ++ * @param device The identifier of the target device ++ * @param pState Reference in which to return the performance state reading ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a pState has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a pState is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetPowerState(nvmlDevice_t device, nvmlPstates_t *pState); ++ ++/** ++ * This API has been deprecated. ++ * ++ * Retrieves the power management mode associated with this device. ++ * ++ * For products from the Fermi family. ++ * - Requires \a NVML_INFOROM_POWER version 3.0 or higher. ++ * ++ * For from the Kepler or newer families. ++ * - Does not require \a NVML_INFOROM_POWER object. ++ * ++ * This flag indicates whether any power management algorithm is currently active on the device. An ++ * enabled state does not necessarily mean the device is being actively throttled -- only that ++ * that the driver will do so if the appropriate conditions are met. ++ * ++ * See \ref nvmlEnableState_t for details on allowed modes. ++ * ++ * @param device The identifier of the target device ++ * @param mode Reference in which to return the current power management mode ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a mode has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a mode is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetPowerManagementMode(nvmlDevice_t device, nvmlEnableState_t *mode); ++ ++/** ++ * Retrieves the power management limit associated with this device. ++ * ++ * For Fermi &tm; or newer fully supported devices. ++ * ++ * The power limit defines the upper boundary for the card's power draw. If ++ * the card's total power draw reaches this limit the power management algorithm kicks in. ++ * ++ * This reading is only available if power management mode is supported. ++ * See \ref nvmlDeviceGetPowerManagementMode. ++ * ++ * @param device The identifier of the target device ++ * @param limit Reference in which to return the power management limit in milliwatts ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a limit has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a limit is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetPowerManagementLimit(nvmlDevice_t device, unsigned int *limit); ++ ++/** ++ * Retrieves information about possible values of power management limits on this device. ++ * ++ * For Kepler &tm; or newer fully supported devices. ++ * ++ * @param device The identifier of the target device ++ * @param minLimit Reference in which to return the minimum power management limit in milliwatts ++ * @param maxLimit Reference in which to return the maximum power management limit in milliwatts ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a minLimit and \a maxLimit have been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a minLimit or \a maxLimit is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ * ++ * @see nvmlDeviceSetPowerManagementLimit ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetPowerManagementLimitConstraints(nvmlDevice_t device, unsigned int *minLimit, unsigned int *maxLimit); ++ ++/** ++ * Retrieves default power management limit on this device, in milliwatts. ++ * Default power management limit is a power management limit that the device boots with. ++ * ++ * For Kepler &tm; or newer fully supported devices. ++ * ++ * @param device The identifier of the target device ++ * @param defaultLimit Reference in which to return the default power management limit in milliwatts ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a defaultLimit has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a defaultLimit is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetPowerManagementDefaultLimit(nvmlDevice_t device, unsigned int *defaultLimit); ++ ++/** ++ * Retrieves power usage for this GPU in milliwatts and its associated circuitry (e.g. memory) ++ * ++ * For Fermi &tm; or newer fully supported devices. ++ * ++ * On Fermi and Kepler GPUs the reading is accurate to within +/- 5% of current power draw. ++ * ++ * It is only available if power management mode is supported. See \ref nvmlDeviceGetPowerManagementMode. ++ * ++ * @param device The identifier of the target device ++ * @param power Reference in which to return the power usage information ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a power has been populated ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a power is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support power readings ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetPowerUsage(nvmlDevice_t device, unsigned int *power); ++ ++/** ++ * Get the effective power limit that the driver enforces after taking into account all limiters ++ * ++ * Note: This can be different from the \ref nvmlDeviceGetPowerManagementLimit if other limits are set elsewhere ++ * This includes the out of band power limit interface ++ * ++ * For Kepler &tm; or newer fully supported devices. ++ * ++ * @param device The device to communicate with ++ * @param limit Reference in which to return the power management limit in milliwatts ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a limit has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a limit is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetEnforcedPowerLimit(nvmlDevice_t device, unsigned int *limit); ++ ++/** ++ * Retrieves the current GOM and pending GOM (the one that GPU will switch to after reboot). ++ * ++ * For GK110 M-class and X-class Tesla &tm; products from the Kepler family. ++ * Modes \ref NVML_GOM_LOW_DP and \ref NVML_GOM_ALL_ON are supported on fully supported GeForce products. ++ * Not supported on Quadro ® and Tesla &tm; C-class products. ++ * ++ * @param device The identifier of the target device ++ * @param current Reference in which to return the current GOM ++ * @param pending Reference in which to return the pending GOM ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a mode has been populated ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a current or \a pending is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ * ++ * @see nvmlGpuOperationMode_t ++ * @see nvmlDeviceSetGpuOperationMode ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetGpuOperationMode(nvmlDevice_t device, nvmlGpuOperationMode_t *current, nvmlGpuOperationMode_t *pending); ++ ++/** ++ * Retrieves the amount of used, free and total memory available on the device, in bytes. ++ * ++ * For all products. ++ * ++ * Enabling ECC reduces the amount of total available memory, due to the extra required parity bits. ++ * Under WDDM most device memory is allocated and managed on startup by Windows. ++ * ++ * Under Linux and Windows TCC, the reported amount of used memory is equal to the sum of memory allocated ++ * by all active channels on the device. ++ * ++ * See \ref nvmlMemory_t for details on available memory info. ++ * ++ * @param device The identifier of the target device ++ * @param memory Reference in which to return the memory information ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a memory has been populated ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a memory is NULL ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetMemoryInfo(nvmlDevice_t device, nvmlMemory_t *memory); ++ ++/** ++ * Retrieves the current compute mode for the device. ++ * ++ * For all products. ++ * ++ * See \ref nvmlComputeMode_t for details on allowed compute modes. ++ * ++ * @param device The identifier of the target device ++ * @param mode Reference in which to return the current compute mode ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a mode has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a mode is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ * ++ * @see nvmlDeviceSetComputeMode() ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetComputeMode(nvmlDevice_t device, nvmlComputeMode_t *mode); ++ ++/** ++ * Retrieves the current and pending ECC modes for the device. ++ * ++ * For Fermi &tm; or newer fully supported devices. ++ * Only applicable to devices with ECC. ++ * Requires \a NVML_INFOROM_ECC version 1.0 or higher. ++ * ++ * Changing ECC modes requires a reboot. The "pending" ECC mode refers to the target mode following ++ * the next reboot. ++ * ++ * See \ref nvmlEnableState_t for details on allowed modes. ++ * ++ * @param device The identifier of the target device ++ * @param current Reference in which to return the current ECC mode ++ * @param pending Reference in which to return the pending ECC mode ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a current and \a pending have been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or either \a current or \a pending is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ * ++ * @see nvmlDeviceSetEccMode() ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetEccMode(nvmlDevice_t device, nvmlEnableState_t *current, nvmlEnableState_t *pending); ++ ++/** ++ * Retrieves the device boardId from 0-N. ++ * Devices with the same boardId indicate GPUs connected to the same PLX. Use in conjunction with ++ * \ref nvmlDeviceGetMultiGpuBoard() to decide if they are on the same board as well. ++ * The boardId returned is a unique ID for the current configuration. Uniqueness and ordering across ++ * reboots and system configurations is not guaranteed (i.e. if a Tesla K40c returns 0x100 and ++ * the two GPUs on a Tesla K10 in the same system returns 0x200 it is not guaranteed they will ++ * always return those values but they will always be different from each other). ++ * ++ * ++ * For Fermi &tm; or newer fully supported devices. ++ * ++ * @param device The identifier of the target device ++ * @param boardId Reference in which to return the device's board ID ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a boardId has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a boardId is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetBoardId(nvmlDevice_t device, unsigned int *boardId); ++ ++/** ++ * Retrieves whether the device is on a Multi-GPU Board ++ * Devices that are on multi-GPU boards will set \a multiGpuBool to a non-zero value. ++ * ++ * For Fermi &tm; or newer fully supported devices. ++ * ++ * @param device The identifier of the target device ++ * @param multiGpuBool Reference in which to return a zero or non-zero value ++ * to indicate whether the device is on a multi GPU board ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a multiGpuBool has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a multiGpuBool is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetMultiGpuBoard(nvmlDevice_t device, unsigned int *multiGpuBool); ++ ++/** ++ * Retrieves the total ECC error counts for the device. ++ * ++ * For Fermi &tm; or newer fully supported devices. ++ * Only applicable to devices with ECC. ++ * Requires \a NVML_INFOROM_ECC version 1.0 or higher. ++ * Requires ECC Mode to be enabled. ++ * ++ * The total error count is the sum of errors across each of the separate memory systems, i.e. the total set of ++ * errors across the entire device. ++ * ++ * See \ref nvmlMemoryErrorType_t for a description of available error types.\n ++ * See \ref nvmlEccCounterType_t for a description of available counter types. ++ * ++ * @param device The identifier of the target device ++ * @param errorType Flag that specifies the type of the errors. ++ * @param counterType Flag that specifies the counter-type of the errors. ++ * @param eccCounts Reference in which to return the specified ECC errors ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a eccCounts has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device, \a errorType or \a counterType is invalid, or \a eccCounts is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ * ++ * @see nvmlDeviceClearEccErrorCounts() ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetTotalEccErrors(nvmlDevice_t device, nvmlMemoryErrorType_t errorType, nvmlEccCounterType_t counterType, unsigned long long *eccCounts); ++ ++/** ++ * Retrieves the detailed ECC error counts for the device. ++ * ++ * @deprecated This API supports only a fixed set of ECC error locations ++ * On different GPU architectures different locations are supported ++ * See \ref nvmlDeviceGetMemoryErrorCounter ++ * ++ * For Fermi &tm; or newer fully supported devices. ++ * Only applicable to devices with ECC. ++ * Requires \a NVML_INFOROM_ECC version 2.0 or higher to report aggregate location-based ECC counts. ++ * Requires \a NVML_INFOROM_ECC version 1.0 or higher to report all other ECC counts. ++ * Requires ECC Mode to be enabled. ++ * ++ * Detailed errors provide separate ECC counts for specific parts of the memory system. ++ * ++ * Reports zero for unsupported ECC error counters when a subset of ECC error counters are supported. ++ * ++ * See \ref nvmlMemoryErrorType_t for a description of available bit types.\n ++ * See \ref nvmlEccCounterType_t for a description of available counter types.\n ++ * See \ref nvmlEccErrorCounts_t for a description of provided detailed ECC counts. ++ * ++ * @param device The identifier of the target device ++ * @param errorType Flag that specifies the type of the errors. ++ * @param counterType Flag that specifies the counter-type of the errors. ++ * @param eccCounts Reference in which to return the specified ECC errors ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a eccCounts has been populated ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device, \a errorType or \a counterType is invalid, or \a eccCounts is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ * ++ * @see nvmlDeviceClearEccErrorCounts() ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetDetailedEccErrors(nvmlDevice_t device, nvmlMemoryErrorType_t errorType, nvmlEccCounterType_t counterType, nvmlEccErrorCounts_t *eccCounts); ++ ++/** ++ * Retrieves the requested memory error counter for the device. ++ * ++ * For Fermi &tm; or newer fully supported devices. ++ * Requires \a NVML_INFOROM_ECC version 2.0 or higher to report aggregate location-based memory error counts. ++ * Requires \a NVML_INFOROM_ECC version 1.0 or higher to report all other memory error counts. ++ * ++ * Only applicable to devices with ECC. ++ * ++ * Requires ECC Mode to be enabled. ++ * ++ * See \ref nvmlMemoryErrorType_t for a description of available memory error types.\n ++ * See \ref nvmlEccCounterType_t for a description of available counter types.\n ++ * See \ref nvmlMemoryLocation_t for a description of available counter locations.\n ++ * ++ * @param device The identifier of the target device ++ * @param errorType Flag that specifies the type of error. ++ * @param counterType Flag that specifies the counter-type of the errors. ++ * @param locationType Specifies the location of the counter. ++ * @param count Reference in which to return the ECC counter ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a count has been populated ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device, \a bitTyp,e \a counterType or \a locationType is ++ * invalid, or \a count is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support ECC error reporting in the specified memory ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetMemoryErrorCounter(nvmlDevice_t device, nvmlMemoryErrorType_t errorType, ++ nvmlEccCounterType_t counterType, ++ nvmlMemoryLocation_t locationType, unsigned long long *count); ++ ++/** ++ * Retrieves the current utilization rates for the device's major subsystems. ++ * ++ * For Fermi &tm; or newer fully supported devices. ++ * ++ * See \ref nvmlUtilization_t for details on available utilization rates. ++ * ++ * \note During driver initialization when ECC is enabled one can see high GPU and Memory Utilization readings. ++ * This is caused by ECC Memory Scrubbing mechanism that is performed during driver initialization. ++ * ++ * @param device The identifier of the target device ++ * @param utilization Reference in which to return the utilization information ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a utilization has been populated ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a utilization is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetUtilizationRates(nvmlDevice_t device, nvmlUtilization_t *utilization); ++ ++/** ++ * Retrieves the current utilization and sampling size in microseconds for the Encoder ++ * ++ * For Kepler &tm; or newer fully supported devices. ++ * ++ * @param device The identifier of the target device ++ * @param utilization Reference to an unsigned int for encoder utilization info ++ * @param samplingPeriodUs Reference to an unsigned int for the sampling period in US ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a utilization has been populated ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, \a utilization is NULL, or \a samplingPeriodUs is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetEncoderUtilization(nvmlDevice_t device, unsigned int *utilization, unsigned int *samplingPeriodUs); ++ ++/** ++ * Retrieves the current utilization and sampling size in microseconds for the Decoder ++ * ++ * For Kepler &tm; or newer fully supported devices. ++ * ++ * @param device The identifier of the target device ++ * @param utilization Reference to an unsigned int for decoder utilization info ++ * @param samplingPeriodUs Reference to an unsigned int for the sampling period in US ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a utilization has been populated ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, \a utilization is NULL, or \a samplingPeriodUs is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetDecoderUtilization(nvmlDevice_t device, unsigned int *utilization, unsigned int *samplingPeriodUs); ++ ++/** ++ * Retrieves the current and pending driver model for the device. ++ * ++ * For Fermi &tm; or newer fully supported devices. ++ * For windows only. ++ * ++ * On Windows platforms the device driver can run in either WDDM or WDM (TCC) mode. If a display is attached ++ * to the device it must run in WDDM mode. TCC mode is preferred if a display is not attached. ++ * ++ * See \ref nvmlDriverModel_t for details on available driver models. ++ * ++ * @param device The identifier of the target device ++ * @param current Reference in which to return the current driver model ++ * @param pending Reference in which to return the pending driver model ++ * ++ * @return ++ * - \ref NVML_SUCCESS if either \a current and/or \a pending have been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or both \a current and \a pending are NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the platform is not windows ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ * ++ * @see nvmlDeviceSetDriverModel() ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetDriverModel(nvmlDevice_t device, nvmlDriverModel_t *current, nvmlDriverModel_t *pending); ++ ++/** ++ * Get VBIOS version of the device. ++ * ++ * For all products. ++ * ++ * The VBIOS version may change from time to time. It will not exceed 32 characters in length ++ * (including the NULL terminator). See \ref nvmlConstants::NVML_DEVICE_VBIOS_VERSION_BUFFER_SIZE. ++ * ++ * @param device The identifier of the target device ++ * @param version Reference to which to return the VBIOS version ++ * @param length The maximum allowed length of the string returned in \a version ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a version has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, or \a version is NULL ++ * - \ref NVML_ERROR_INSUFFICIENT_SIZE if \a length is too small ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetVbiosVersion(nvmlDevice_t device, char *version, unsigned int length); ++ ++/** ++ * Get Bridge Chip Information for all the bridge chips on the board. ++ * ++ * For all fully supported products. ++ * Only applicable to multi-GPU products. ++ * ++ * @param device The identifier of the target device ++ * @param bridgeHierarchy Reference to the returned bridge chip Hierarchy ++ * ++ * @return ++ * - \ref NVML_SUCCESS if bridge chip exists ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, or \a bridgeInfo is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if bridge chip not supported on the device ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ * ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetBridgeChipInfo(nvmlDevice_t device, nvmlBridgeChipHierarchy_t *bridgeHierarchy); ++ ++/** ++ * Get information about processes with a compute context on a device ++ * ++ * For Fermi &tm; or newer fully supported devices. ++ * ++ * This function returns information only about compute running processes (e.g. CUDA application which have ++ * active context). Any graphics applications (e.g. using OpenGL, DirectX) won't be listed by this function. ++ * ++ * To query the current number of running compute processes, call this function with *infoCount = 0. The ++ * return code will be NVML_ERROR_INSUFFICIENT_SIZE, or NVML_SUCCESS if none are running. For this call ++ * \a infos is allowed to be NULL. ++ * ++ * The usedGpuMemory field returned is all of the memory used by the application. ++ * ++ * Keep in mind that information returned by this call is dynamic and the number of elements might change in ++ * time. Allocate more space for \a infos table in case new compute processes are spawned. ++ * ++ * @param device The identifier of the target device ++ * @param infoCount Reference in which to provide the \a infos array size, and ++ * to return the number of returned elements ++ * @param infos Reference in which to return the process information ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a infoCount and \a infos have been populated ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INSUFFICIENT_SIZE if \a infoCount indicates that the \a infos array is too small ++ * \a infoCount will contain minimal amount of space necessary for ++ * the call to complete ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, either of \a infoCount or \a infos is NULL ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ * ++ * @see \ref nvmlSystemGetProcessName ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetComputeRunningProcesses(nvmlDevice_t device, unsigned int *infoCount, nvmlProcessInfo_t *infos); ++ ++/** ++ * Get information about processes with a graphics context on a device ++ * ++ * For Kepler &tm; or newer fully supported devices. ++ * ++ * This function returns information only about graphics based processes ++ * (eg. applications using OpenGL, DirectX) ++ * ++ * To query the current number of running graphics processes, call this function with *infoCount = 0. The ++ * return code will be NVML_ERROR_INSUFFICIENT_SIZE, or NVML_SUCCESS if none are running. For this call ++ * \a infos is allowed to be NULL. ++ * ++ * The usedGpuMemory field returned is all of the memory used by the application. ++ * ++ * Keep in mind that information returned by this call is dynamic and the number of elements might change in ++ * time. Allocate more space for \a infos table in case new graphics processes are spawned. ++ * ++ * @param device The identifier of the target device ++ * @param infoCount Reference in which to provide the \a infos array size, and ++ * to return the number of returned elements ++ * @param infos Reference in which to return the process information ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a infoCount and \a infos have been populated ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INSUFFICIENT_SIZE if \a infoCount indicates that the \a infos array is too small ++ * \a infoCount will contain minimal amount of space necessary for ++ * the call to complete ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, either of \a infoCount or \a infos is NULL ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ * ++ * @see \ref nvmlSystemGetProcessName ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetGraphicsRunningProcesses(nvmlDevice_t device, unsigned int *infoCount, nvmlProcessInfo_t *infos); ++ ++/** ++ * Check if the GPU devices are on the same physical board. ++ * ++ * For all fully supported products. ++ * ++ * @param device1 The first GPU device ++ * @param device2 The second GPU device ++ * @param onSameBoard Reference in which to return the status. ++ * Non-zero indicates that the GPUs are on the same board. ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a onSameBoard has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a dev1 or \a dev2 are invalid or \a onSameBoard is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if this check is not supported by the device ++ * - \ref NVML_ERROR_GPU_IS_LOST if the either GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceOnSameBoard(nvmlDevice_t device1, nvmlDevice_t device2, int *onSameBoard); ++ ++/** ++ * Retrieves the root/admin permissions on the target API. See \a nvmlRestrictedAPI_t for the list of supported APIs. ++ * If an API is restricted only root users can call that API. See \a nvmlDeviceSetAPIRestriction to change current permissions. ++ * ++ * For all fully supported products. ++ * ++ * @param device The identifier of the target device ++ * @param apiType Target API type for this operation ++ * @param isRestricted Reference in which to return the current restriction ++ * NVML_FEATURE_ENABLED indicates that the API is root-only ++ * NVML_FEATURE_DISABLED indicates that the API is accessible to all users ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a isRestricted has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, \a apiType incorrect or \a isRestricted is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if this query is not supported by the device or the device does not support ++ * the feature that is being queried (E.G. Enabling/disabling Auto Boosted clocks is ++ * not supported by the device) ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ * ++ * @see nvmlRestrictedAPI_t ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetAPIRestriction(nvmlDevice_t device, nvmlRestrictedAPI_t apiType, nvmlEnableState_t *isRestricted); ++ ++/** ++ * Gets recent samples for the GPU. ++ * ++ * For Kepler &tm; or newer fully supported devices. ++ * ++ * Based on type, this method can be used to fetch the power, utilization or clock samples maintained in the buffer by ++ * the driver. ++ * ++ * Power, Utilization and Clock samples are returned as type "unsigned int" for the union nvmlValue_t. ++ * ++ * To get the size of samples that user needs to allocate, the method is invoked with samples set to NULL. ++ * The returned samplesCount will provide the number of samples that can be queried. The user needs to ++ * allocate the buffer with size as samplesCount * sizeof(nvmlSample_t). ++ * ++ * lastSeenTimeStamp represents CPU timestamp in microseconds. Set it to 0 to fetch all the samples maintained by the ++ * underlying buffer. Set lastSeenTimeStamp to one of the timeStamps retrieved from the date of the previous query ++ * to get more recent samples. ++ * ++ * This method fetches the number of entries which can be accommodated in the provided samples array, and the ++ * reference samplesCount is updated to indicate how many samples were actually retrieved. The advantage of using this ++ * method for samples in contrast to polling via existing methods is to get get higher frequency data at lower polling cost. ++ * ++ * @param device The identifier for the target device ++ * @param type Type of sampling event ++ * @param lastSeenTimeStamp Return only samples with timestamp greater than lastSeenTimeStamp. ++ * @param sampleValType Output parameter to represent the type of sample value as described in nvmlSampleVal_t ++ * @param sampleCount Reference to provide the number of elements which can be queried in samples array ++ * @param samples Reference in which samples are returned ++ ++ * @return ++ * - \ref NVML_SUCCESS if samples are successfully retrieved ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, \a samplesCount is NULL or ++ * reference to \a sampleCount is 0 for non null \a samples ++ * - \ref NVML_ERROR_NOT_SUPPORTED if this query is not supported by the device ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_NOT_FOUND if sample entries are not found ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetSamples(nvmlDevice_t device, nvmlSamplingType_t type, unsigned long long lastSeenTimeStamp, ++ nvmlValueType_t *sampleValType, unsigned int *sampleCount, nvmlSample_t *samples); ++ ++/** ++ * Gets Total, Available and Used size of BAR1 memory. ++ * ++ * BAR1 is used to map the FB (device memory) so that it can be directly accessed by the CPU or by 3rd party ++ * devices (peer-to-peer on the PCIE bus). ++ * ++ * For Kepler &tm; or newer fully supported devices. ++ * ++ * @param device The identifier of the target device ++ * @param bar1Memory Reference in which BAR1 memory ++ * information is returned. ++ * ++ * @return ++ * - \ref NVML_SUCCESS if BAR1 memory is successfully retrieved ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, \a bar1Memory is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if this query is not supported by the device ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ * ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetBAR1MemoryInfo(nvmlDevice_t device, nvmlBAR1Memory_t *bar1Memory); ++ ++ ++/** ++ * Gets the duration of time during which the device was throttled (lower than requested clocks) due to power ++ * or thermal constraints. ++ * ++ * The method is important to users who are tying to understand if their GPUs throttle at any point during their applications. The ++ * difference in violation times at two different reference times gives the indication of GPU throttling event. ++ * ++ * Violation for thermal capping is not supported at this time. ++ * ++ * For Kepler &tm; or newer fully supported devices. ++ * ++ * @param device The identifier of the target device ++ * @param perfPolicyType Represents Performance policy which can trigger GPU throttling ++ * @param violTime Reference to which violation time related information is returned ++ * ++ * ++ * @return ++ * - \ref NVML_SUCCESS if violation time is successfully retrieved ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, \a perfPolicyType is invalid, or \a violTime is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if this query is not supported by the device ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetViolationStatus(nvmlDevice_t device, nvmlPerfPolicyType_t perfPolicyType, nvmlViolationTime_t *violTime); ++ ++/** ++ * @} ++ */ ++ ++/** @addtogroup nvmlAccountingStats ++ * @{ ++ */ ++ ++/** ++ * Queries the state of per process accounting mode. ++ * ++ * For Kepler &tm; or newer fully supported devices. ++ * ++ * See \ref nvmlDeviceGetAccountingStats for more details. ++ * See \ref nvmlDeviceSetAccountingMode ++ * ++ * @param device The identifier of the target device ++ * @param mode Reference in which to return the current accounting mode ++ * ++ * @return ++ * - \ref NVML_SUCCESS if the mode has been successfully retrieved ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a mode are NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device doesn't support this feature ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetAccountingMode(nvmlDevice_t device, nvmlEnableState_t *mode); ++ ++/** ++ * Queries process's accounting stats. ++ * ++ * For Kepler &tm; or newer fully supported devices. ++ * ++ * Accounting stats capture GPU utilization and other statistics across the lifetime of a process. ++ * Accounting stats can be queried during life time of the process and after its termination. ++ * The time field in \ref nvmlAccountingStats_t is reported as 0 during the lifetime of the process and ++ * updated to actual running time after its termination. ++ * Accounting stats are kept in a circular buffer, newly created processes overwrite information about old ++ * processes. ++ * ++ * See \ref nvmlAccountingStats_t for description of each returned metric. ++ * List of processes that can be queried can be retrieved from \ref nvmlDeviceGetAccountingPids. ++ * ++ * @note Accounting Mode needs to be on. See \ref nvmlDeviceGetAccountingMode. ++ * @note Only compute and graphics applications stats can be queried. Monitoring applications stats can't be ++ * queried since they don't contribute to GPU utilization. ++ * @note In case of pid collision stats of only the latest process (that terminated last) will be reported ++ * ++ * @warning On Kepler devices per process statistics are accurate only if there's one process running on a GPU. ++ * ++ * @param device The identifier of the target device ++ * @param pid Process Id of the target process to query stats for ++ * @param stats Reference in which to return the process's accounting stats ++ * ++ * @return ++ * - \ref NVML_SUCCESS if stats have been successfully retrieved ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a stats are NULL ++ * - \ref NVML_ERROR_NOT_FOUND if process stats were not found ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device doesn't support this feature or accounting mode is disabled ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ * ++ * @see nvmlDeviceGetAccountingBufferSize ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetAccountingStats(nvmlDevice_t device, unsigned int pid, nvmlAccountingStats_t *stats); ++ ++/** ++ * Queries list of processes that can be queried for accounting stats. The list of processes returned ++ * can be in running or terminated state. ++ * ++ * For Kepler &tm; or newer fully supported devices. ++ * ++ * To just query the number of processes ready to be queried, call this function with *count = 0 and ++ * pids=NULL. The return code will be NVML_ERROR_INSUFFICIENT_SIZE, or NVML_SUCCESS if list is empty. ++ * ++ * For more details see \ref nvmlDeviceGetAccountingStats. ++ * ++ * @note In case of PID collision some processes might not be accessible before the circular buffer is full. ++ * ++ * @param device The identifier of the target device ++ * @param count Reference in which to provide the \a pids array size, and ++ * to return the number of elements ready to be queried ++ * @param pids Reference in which to return list of process ids ++ * ++ * @return ++ * - \ref NVML_SUCCESS if pids were successfully retrieved ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a count is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device doesn't support this feature or accounting mode is disabled ++ * - \ref NVML_ERROR_INSUFFICIENT_SIZE if \a count is too small (\a count is set to ++ * expected value) ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ * ++ * @see nvmlDeviceGetAccountingBufferSize ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetAccountingPids(nvmlDevice_t device, unsigned int *count, unsigned int *pids); ++ ++/** ++ * Returns the number of processes that the circular buffer with accounting pids can hold. ++ * ++ * For Kepler &tm; or newer fully supported devices. ++ * ++ * This is the maximum number of processes that accounting information will be stored for before information ++ * about oldest processes will get overwritten by information about new processes. ++ * ++ * @param device The identifier of the target device ++ * @param bufferSize Reference in which to provide the size (in number of elements) ++ * of the circular buffer for accounting stats. ++ * ++ * @return ++ * - \ref NVML_SUCCESS if buffer size was successfully retrieved ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a bufferSize is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device doesn't support this feature or accounting mode is disabled ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ * ++ * @see nvmlDeviceGetAccountingStats ++ * @see nvmlDeviceGetAccountingPids ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetAccountingBufferSize(nvmlDevice_t device, unsigned int *bufferSize); ++ ++/** @} */ ++ ++/** @addtogroup nvmlDeviceQueries ++ * @{ ++ */ ++ ++/** ++ * Returns the list of retired pages by source, including pages that are pending retirement ++ * The address information provided from this API is the hardware address of the page that was retired. Note ++ * that this does not match the virtual address used in CUDA, but will match the address information in XID 63 ++ * ++ * For Kepler &tm; or newer fully supported devices. ++ * ++ * @param device The identifier of the target device ++ * @param cause Filter page addresses by cause of retirement ++ * @param pageCount Reference in which to provide the \a addresses buffer size, and ++ * to return the number of retired pages that match \a cause ++ * Set to 0 to query the size without allocating an \a addresses buffer ++ * @param addresses Buffer to write the page addresses into ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a pageCount was populated and \a addresses was filled ++ * - \ref NVML_ERROR_INSUFFICIENT_SIZE if \a pageCount indicates the buffer is not large enough to store all the ++ * matching page addresses. \a pageCount is set to the needed size. ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, \a pageCount is NULL, \a cause is invalid, or ++ * \a addresses is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device doesn't support this feature ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetRetiredPages(nvmlDevice_t device, nvmlPageRetirementCause_t cause, ++ unsigned int *pageCount, unsigned long long *addresses); ++ ++/** ++ * Check if any pages are pending retirement and need a reboot to fully retire. ++ * ++ * For Kepler &tm; or newer fully supported devices. ++ * ++ * @param device The identifier of the target device ++ * @param isPending Reference in which to return the pending status ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a isPending was populated ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a isPending is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device doesn't support this feature ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetRetiredPagesPendingStatus(nvmlDevice_t device, nvmlEnableState_t *isPending); ++ ++/** @} */ ++ ++/***************************************************************************************************/ ++/** @defgroup nvmlUnitCommands Unit Commands ++ * This chapter describes NVML operations that change the state of the unit. For S-class products. ++ * Each of these requires root/admin access. Non-admin users will see an NVML_ERROR_NO_PERMISSION ++ * error code when invoking any of these methods. ++ * @{ ++ */ ++/***************************************************************************************************/ ++ ++/** ++ * Set the LED state for the unit. The LED can be either green (0) or amber (1). ++ * ++ * For S-class products. ++ * Requires root/admin permissions. ++ * ++ * This operation takes effect immediately. ++ * ++ * ++ * Current S-Class products don't provide unique LEDs for each unit. As such, both front ++ * and back LEDs will be toggled in unison regardless of which unit is specified with this command. ++ * ++ * See \ref nvmlLedColor_t for available colors. ++ * ++ * @param unit The identifier of the target unit ++ * @param color The target LED color ++ * ++ * @return ++ * - \ref NVML_SUCCESS if the LED color has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a unit or \a color is invalid ++ * - \ref NVML_ERROR_NOT_SUPPORTED if this is not an S-class product ++ * - \ref NVML_ERROR_NO_PERMISSION if the user doesn't have permission to perform this operation ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ * ++ * @see nvmlUnitGetLedState() ++ */ ++nvmlReturn_t DECLDIR nvmlUnitSetLedState(nvmlUnit_t unit, nvmlLedColor_t color); ++ ++/** @} */ ++ ++/***************************************************************************************************/ ++/** @defgroup nvmlDeviceCommands Device Commands ++ * This chapter describes NVML operations that change the state of the device. ++ * Each of these requires root/admin access. Non-admin users will see an NVML_ERROR_NO_PERMISSION ++ * error code when invoking any of these methods. ++ * @{ ++ */ ++/***************************************************************************************************/ ++ ++/** ++ * Set the persistence mode for the device. ++ * ++ * For all products. ++ * For Linux only. ++ * Requires root/admin permissions. ++ * ++ * The persistence mode determines whether the GPU driver software is torn down after the last client ++ * exits. ++ * ++ * This operation takes effect immediately. It is not persistent across reboots. After each reboot the ++ * persistence mode is reset to "Disabled". ++ * ++ * See \ref nvmlEnableState_t for available modes. ++ * ++ * @param device The identifier of the target device ++ * @param mode The target persistence mode ++ * ++ * @return ++ * - \ref NVML_SUCCESS if the persistence mode was set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a mode is invalid ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature ++ * - \ref NVML_ERROR_NO_PERMISSION if the user doesn't have permission to perform this operation ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ * ++ * @see nvmlDeviceGetPersistenceMode() ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceSetPersistenceMode(nvmlDevice_t device, nvmlEnableState_t mode); ++ ++/** ++ * Set the compute mode for the device. ++ * ++ * For all products. ++ * Requires root/admin permissions. ++ * ++ * The compute mode determines whether a GPU can be used for compute operations and whether it can ++ * be shared across contexts. ++ * ++ * This operation takes effect immediately. Under Linux it is not persistent across reboots and ++ * always resets to "Default". Under windows it is persistent. ++ * ++ * Under windows compute mode may only be set to DEFAULT when running in WDDM ++ * ++ * See \ref nvmlComputeMode_t for details on available compute modes. ++ * ++ * @param device The identifier of the target device ++ * @param mode The target compute mode ++ * ++ * @return ++ * - \ref NVML_SUCCESS if the compute mode was set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a mode is invalid ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature ++ * - \ref NVML_ERROR_NO_PERMISSION if the user doesn't have permission to perform this operation ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ * ++ * @see nvmlDeviceGetComputeMode() ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceSetComputeMode(nvmlDevice_t device, nvmlComputeMode_t mode); ++ ++/** ++ * Set the ECC mode for the device. ++ * ++ * For Kepler &tm; or newer fully supported devices. ++ * Only applicable to devices with ECC. ++ * Requires \a NVML_INFOROM_ECC version 1.0 or higher. ++ * Requires root/admin permissions. ++ * ++ * The ECC mode determines whether the GPU enables its ECC support. ++ * ++ * This operation takes effect after the next reboot. ++ * ++ * See \ref nvmlEnableState_t for details on available modes. ++ * ++ * @param device The identifier of the target device ++ * @param ecc The target ECC mode ++ * ++ * @return ++ * - \ref NVML_SUCCESS if the ECC mode was set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a ecc is invalid ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature ++ * - \ref NVML_ERROR_NO_PERMISSION if the user doesn't have permission to perform this operation ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ * ++ * @see nvmlDeviceGetEccMode() ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceSetEccMode(nvmlDevice_t device, nvmlEnableState_t ecc); ++ ++/** ++ * Clear the ECC error and other memory error counts for the device. ++ * ++ * For Kepler &tm; or newer fully supported devices. ++ * Only applicable to devices with ECC. ++ * Requires \a NVML_INFOROM_ECC version 2.0 or higher to clear aggregate location-based ECC counts. ++ * Requires \a NVML_INFOROM_ECC version 1.0 or higher to clear all other ECC counts. ++ * Requires root/admin permissions. ++ * Requires ECC Mode to be enabled. ++ * ++ * Sets all of the specified ECC counters to 0, including both detailed and total counts. ++ * ++ * This operation takes effect immediately. ++ * ++ * See \ref nvmlMemoryErrorType_t for details on available counter types. ++ * ++ * @param device The identifier of the target device ++ * @param counterType Flag that indicates which type of errors should be cleared. ++ * ++ * @return ++ * - \ref NVML_SUCCESS if the error counts were cleared ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a counterType is invalid ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature ++ * - \ref NVML_ERROR_NO_PERMISSION if the user doesn't have permission to perform this operation ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ * ++ * @see ++ * - nvmlDeviceGetDetailedEccErrors() ++ * - nvmlDeviceGetTotalEccErrors() ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceClearEccErrorCounts(nvmlDevice_t device, nvmlEccCounterType_t counterType); ++ ++/** ++ * Set the driver model for the device. ++ * ++ * For Fermi &tm; or newer fully supported devices. ++ * For windows only. ++ * Requires root/admin permissions. ++ * ++ * On Windows platforms the device driver can run in either WDDM or WDM (TCC) mode. If a display is attached ++ * to the device it must run in WDDM mode. ++ * ++ * It is possible to force the change to WDM (TCC) while the display is still attached with a force flag (nvmlFlagForce). ++ * This should only be done if the host is subsequently powered down and the display is detached from the device ++ * before the next reboot. ++ * ++ * This operation takes effect after the next reboot. ++ * ++ * Windows driver model may only be set to WDDM when running in DEFAULT compute mode. ++ * ++ * Change driver model to WDDM is not supported when GPU doesn't support graphics acceleration or ++ * will not support it after reboot. See \ref nvmlDeviceSetGpuOperationMode. ++ * ++ * See \ref nvmlDriverModel_t for details on available driver models. ++ * See \ref nvmlFlagDefault and \ref nvmlFlagForce ++ * ++ * @param device The identifier of the target device ++ * @param driverModel The target driver model ++ * @param flags Flags that change the default behavior ++ * ++ * @return ++ * - \ref NVML_SUCCESS if the driver model has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a driverModel is invalid ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the platform is not windows or the device does not support this feature ++ * - \ref NVML_ERROR_NO_PERMISSION if the user doesn't have permission to perform this operation ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ * ++ * @see nvmlDeviceGetDriverModel() ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceSetDriverModel(nvmlDevice_t device, nvmlDriverModel_t driverModel, unsigned int flags); ++ ++/** ++ * Set clocks that applications will lock to. ++ * ++ * Sets the clocks that compute and graphics applications will be running at. ++ * e.g. CUDA driver requests these clocks during context creation which means this property ++ * defines clocks at which CUDA applications will be running unless some overspec event ++ * occurs (e.g. over power, over thermal or external HW brake). ++ * ++ * Can be used as a setting to request constant performance. ++ * ++ * On Pascal and newer hardware, this will automatically disable automatic boosting of clocks. ++ * ++ * On K80 and newer Kepler and Maxwell GPUs, users desiring fixed performance should also call ++ * \ref nvmlDeviceSetAutoBoostedClocksEnabled to prevent clocks from automatically boosting ++ * above the clock value being set. ++ * ++ * For Kepler &tm; or newer non-GeForce fully supported devices and Maxwell or newer GeForce devices. ++ * Requires root/admin permissions. ++ * ++ * See \ref nvmlDeviceGetSupportedMemoryClocks and \ref nvmlDeviceGetSupportedGraphicsClocks ++ * for details on how to list available clocks combinations. ++ * ++ * After system reboot or driver reload applications clocks go back to their default value. ++ * See \ref nvmlDeviceResetApplicationsClocks. ++ * ++ * @param device The identifier of the target device ++ * @param memClockMHz Requested memory clock in MHz ++ * @param graphicsClockMHz Requested graphics clock in MHz ++ * ++ * @return ++ * - \ref NVML_SUCCESS if new settings were successfully set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a memClockMHz and \a graphicsClockMHz ++ * is not a valid clock combination ++ * - \ref NVML_ERROR_NO_PERMISSION if the user doesn't have permission to perform this operation ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device doesn't support this feature ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceSetApplicationsClocks(nvmlDevice_t device, unsigned int memClockMHz, unsigned int graphicsClockMHz); ++ ++/** ++ * Set new power limit of this device. ++ * ++ * For Kepler &tm; or newer fully supported devices. ++ * Requires root/admin permissions. ++ * ++ * See \ref nvmlDeviceGetPowerManagementLimitConstraints to check the allowed ranges of values. ++ * ++ * \note Limit is not persistent across reboots or driver unloads. ++ * Enable persistent mode to prevent driver from unloading when no application is using the device. ++ * ++ * @param device The identifier of the target device ++ * @param limit Power management limit in milliwatts to set ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a limit has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a defaultLimit is out of range ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ * ++ * @see nvmlDeviceGetPowerManagementLimitConstraints ++ * @see nvmlDeviceGetPowerManagementDefaultLimit ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceSetPowerManagementLimit(nvmlDevice_t device, unsigned int limit); ++ ++/** ++ * Sets new GOM. See \a nvmlGpuOperationMode_t for details. ++ * ++ * For GK110 M-class and X-class Tesla &tm; products from the Kepler family. ++ * Modes \ref NVML_GOM_LOW_DP and \ref NVML_GOM_ALL_ON are supported on fully supported GeForce products. ++ * Not supported on Quadro ® and Tesla &tm; C-class products. ++ * Requires root/admin permissions. ++ * ++ * Changing GOMs requires a reboot. ++ * The reboot requirement might be removed in the future. ++ * ++ * Compute only GOMs don't support graphics acceleration. Under windows switching to these GOMs when ++ * pending driver model is WDDM is not supported. See \ref nvmlDeviceSetDriverModel. ++ * ++ * @param device The identifier of the target device ++ * @param mode Target GOM ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a mode has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a mode incorrect ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support GOM or specific mode ++ * - \ref NVML_ERROR_NO_PERMISSION if the user doesn't have permission to perform this operation ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ * ++ * @see nvmlGpuOperationMode_t ++ * @see nvmlDeviceGetGpuOperationMode ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceSetGpuOperationMode(nvmlDevice_t device, nvmlGpuOperationMode_t mode); ++ ++/** ++ * Changes the root/admin restructions on certain APIs. See \a nvmlRestrictedAPI_t for the list of supported APIs. ++ * This method can be used by a root/admin user to give non-root/admin access to certain otherwise-restricted APIs. ++ * The new setting lasts for the lifetime of the NVIDIA driver; it is not persistent. See \a nvmlDeviceGetAPIRestriction ++ * to query the current restriction settings. ++ * ++ * For Kepler &tm; or newer fully supported devices. ++ * Requires root/admin permissions. ++ * ++ * @param device The identifier of the target device ++ * @param apiType Target API type for this operation ++ * @param isRestricted The target restriction ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a isRestricted has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a apiType incorrect ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support changing API restrictions or the device does not support ++ * the feature that api restrictions are being set for (E.G. Enabling/disabling auto ++ * boosted clocks is not supported by the device) ++ * - \ref NVML_ERROR_NO_PERMISSION if the user doesn't have permission to perform this operation ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ * ++ * @see nvmlRestrictedAPI_t ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceSetAPIRestriction(nvmlDevice_t device, nvmlRestrictedAPI_t apiType, nvmlEnableState_t isRestricted); ++ ++/** ++ * @} ++ */ ++ ++/** @addtogroup nvmlAccountingStats ++ * @{ ++ */ ++ ++/** ++ * Enables or disables per process accounting. ++ * ++ * For Kepler &tm; or newer fully supported devices. ++ * Requires root/admin permissions. ++ * ++ * @note This setting is not persistent and will default to disabled after driver unloads. ++ * Enable persistence mode to be sure the setting doesn't switch off to disabled. ++ * ++ * @note Enabling accounting mode has no negative impact on the GPU performance. ++ * ++ * @note Disabling accounting clears all accounting pids information. ++ * ++ * See \ref nvmlDeviceGetAccountingMode ++ * See \ref nvmlDeviceGetAccountingStats ++ * See \ref nvmlDeviceClearAccountingPids ++ * ++ * @param device The identifier of the target device ++ * @param mode The target accounting mode ++ * ++ * @return ++ * - \ref NVML_SUCCESS if the new mode has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device or \a mode are invalid ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device doesn't support this feature ++ * - \ref NVML_ERROR_NO_PERMISSION if the user doesn't have permission to perform this operation ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceSetAccountingMode(nvmlDevice_t device, nvmlEnableState_t mode); ++ ++/** ++ * Clears accounting information about all processes that have already terminated. ++ * ++ * For Kepler &tm; or newer fully supported devices. ++ * Requires root/admin permissions. ++ * ++ * See \ref nvmlDeviceGetAccountingMode ++ * See \ref nvmlDeviceGetAccountingStats ++ * See \ref nvmlDeviceSetAccountingMode ++ * ++ * @param device The identifier of the target device ++ * ++ * @return ++ * - \ref NVML_SUCCESS if accounting information has been cleared ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device are invalid ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device doesn't support this feature ++ * - \ref NVML_ERROR_NO_PERMISSION if the user doesn't have permission to perform this operation ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceClearAccountingPids(nvmlDevice_t device); ++ ++/** @} */ ++ ++/***************************************************************************************************/ ++/** @defgroup NvLink NvLink Methods ++ * This chapter describes methods that NVML can perform on NVLINK enabled devices. ++ * @{ ++ */ ++/***************************************************************************************************/ ++ ++/** ++ * Retrieves the state of the device's NvLink for the link specified ++ * ++ * For newer than Maxwell &tm; fully supported devices. ++ * ++ * @param device The identifier of the target device ++ * @param link Specifies the NvLink link to be queried ++ * @param isActive \a nvmlEnableState_t where NVML_FEATURE_ENABLED indicates that ++ * the link is active and NVML_FEATURE_DISABLED indicates it ++ * is inactive ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a isActive has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device or \a link is invalid or \a isActive is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device doesn't support this feature ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetNvLinkState(nvmlDevice_t device, unsigned int link, nvmlEnableState_t *isActive); ++ ++/** ++ * Retrieves the version of the device's NvLink for the link specified ++ * ++ * For newer than Maxwell &tm; fully supported devices. ++ * ++ * @param device The identifier of the target device ++ * @param link Specifies the NvLink link to be queried ++ * @param version Requested NvLink version ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a version has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device or \a link is invalid or \a version is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device doesn't support this feature ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetNvLinkVersion(nvmlDevice_t device, unsigned int link, unsigned int *version); ++ ++/** ++ * Retrieves the requested capability from the device's NvLink for the link specified ++ * Please refer to the \a nvmlNvLinkCapability_t structure for the specific caps that can be queried ++ * The return value should be treated as a boolean. ++ * ++ * For newer than Maxwell &tm; fully supported devices. ++ * ++ * @param device The identifier of the target device ++ * @param link Specifies the NvLink link to be queried ++ * @param capability Specifies the \a nvmlNvLinkCapability_t to be queried ++ * @param capResult A boolean for the queried capability indicating that feature is available ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a capResult has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device, \a link, or \a capability is invalid or \a capResult is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device doesn't support this feature ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetNvLinkCapability(nvmlDevice_t device, unsigned int link, ++ nvmlNvLinkCapability_t capability, unsigned int *capResult); ++ ++/** ++ * Retrieves the PCI information for the remote node on a NvLink link ++ * Note: pciSubSystemId is not filled in this function and is indeterminate ++ * ++ * For newer than Maxwell &tm; fully supported devices. ++ * ++ * @param device The identifier of the target device ++ * @param link Specifies the NvLink link to be queried ++ * @param pci \a nvmlPciInfo_t of the remote node for the specified link ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a pci has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device or \a link is invalid or \a pci is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device doesn't support this feature ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetNvLinkRemotePciInfo(nvmlDevice_t device, unsigned int link, nvmlPciInfo_t *pci); ++ ++/** ++ * Retrieves the specified error counter value ++ * Please refer to \a nvmlNvLinkErrorCounter_t for error counters that are available ++ * ++ * For newer than Maxwell &tm; fully supported devices. ++ * ++ * @param device The identifier of the target device ++ * @param link Specifies the NvLink link to be queried ++ * @param counter Specifies the NvLink counter to be queried ++ * @param counterValue Returned counter value ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a counter has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device, \a link, or \a counter is invalid or \a counterValue is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device doesn't support this feature ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetNvLinkErrorCounter(nvmlDevice_t device, unsigned int link, ++ nvmlNvLinkErrorCounter_t counter, unsigned long long *counterValue); ++ ++/** ++ * Resets all error counters to zero ++ * Please refer to \a nvmlNvLinkErrorCounter_t for the list of error counters that are reset ++ * ++ * For newer than Maxwell &tm; fully supported devices. ++ * ++ * @param device The identifier of the target device ++ * @param link Specifies the NvLink link to be queried ++ * ++ * @return ++ * - \ref NVML_SUCCESS if the reset is successful ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device or \a link is invalid ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device doesn't support this feature ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceResetNvLinkErrorCounters(nvmlDevice_t device, unsigned int link); ++ ++/** ++ * Set the NVLINK utilization counter control information for the specified counter, 0 or 1. ++ * Please refer to \a nvmlNvLinkUtilizationControl_t for the structure definition. Performs a reset ++ * of the counters if the reset parameter is non-zero. ++ * ++ * For newer than Maxwell &tm; fully supported devices. ++ * ++ * @param device The identifier of the target device ++ * @param counter Specifies the counter that should be set (0 or 1). ++ * @param link Specifies the NvLink link to be queried ++ * @param control A reference to the \a nvmlNvLinkUtilizationControl_t to set ++ * @param reset Resets the counters on set if non-zero ++ * ++ * @return ++ * - \ref NVML_SUCCESS if the control has been set successfully ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device, \a counter, \a link, or \a control is invalid ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device doesn't support this feature ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceSetNvLinkUtilizationControl(nvmlDevice_t device, unsigned int link, unsigned int counter, ++ nvmlNvLinkUtilizationControl_t *control, unsigned int reset); ++ ++/** ++ * Get the NVLINK utilization counter control information for the specified counter, 0 or 1. ++ * Please refer to \a nvmlNvLinkUtilizationControl_t for the structure definition ++ * ++ * For newer than Maxwell &tm; fully supported devices. ++ * ++ * @param device The identifier of the target device ++ * @param counter Specifies the counter that should be set (0 or 1). ++ * @param link Specifies the NvLink link to be queried ++ * @param control A reference to the \a nvmlNvLinkUtilizationControl_t to place information ++ * ++ * @return ++ * - \ref NVML_SUCCESS if the control has been set successfully ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device, \a counter, \a link, or \a control is invalid ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device doesn't support this feature ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetNvLinkUtilizationControl(nvmlDevice_t device, unsigned int link, unsigned int counter, ++ nvmlNvLinkUtilizationControl_t *control); ++ ++ ++/** ++ * Retrieve the NVLINK utilization counter based on the current control for a specified counter. ++ * In general it is good practice to use \a nvmlDeviceSetNvLinkUtilizationControl ++ * before reading the utilization counters as they have no default state ++ * ++ * For newer than Maxwell &tm; fully supported devices. ++ * ++ * @param device The identifier of the target device ++ * @param link Specifies the NvLink link to be queried ++ * @param counter Specifies the counter that should be read (0 or 1). ++ * @param rxcounter Receive counter return value ++ * @param txcounter Transmit counter return value ++ * ++ * @return ++ * - \ref NVML_SUCCESS if \a rxcounter and \a txcounter have been successfully set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device, \a counter, or \a link is invalid or \a rxcounter or \a txcounter are NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device doesn't support this feature ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetNvLinkUtilizationCounter(nvmlDevice_t device, unsigned int link, unsigned int counter, ++ unsigned long long *rxcounter, unsigned long long *txcounter); ++ ++/** ++ * Freeze the NVLINK utilization counters ++ * Both the receive and transmit counters are operated on by this function ++ * ++ * For newer than Maxwell &tm; fully supported devices. ++ * ++ * @param device The identifier of the target device ++ * @param link Specifies the NvLink link to be queried ++ * @param counter Specifies the counter that should be frozen (0 or 1). ++ * @param freeze NVML_FEATURE_ENABLED = freeze the receive and transmit counters ++ * NVML_FEATURE_DISABLED = unfreeze the receive and transmit counters ++ * ++ * @return ++ * - \ref NVML_SUCCESS if counters were successfully frozen or unfrozen ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device, \a link, \a counter, or \a freeze is invalid ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device doesn't support this feature ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceFreezeNvLinkUtilizationCounter (nvmlDevice_t device, unsigned int link, ++ unsigned int counter, nvmlEnableState_t freeze); ++ ++/** ++ * Reset the NVLINK utilization counters ++ * Both the receive and transmit counters are operated on by this function ++ * ++ * For newer than Maxwell &tm; fully supported devices. ++ * ++ * @param device The identifier of the target device ++ * @param link Specifies the NvLink link to be reset ++ * @param counter Specifies the counter that should be reset (0 or 1) ++ * ++ * @return ++ * - \ref NVML_SUCCESS if counters were successfully reset ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device, \a link, or \a counter is invalid ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device doesn't support this feature ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceResetNvLinkUtilizationCounter (nvmlDevice_t device, unsigned int link, unsigned int counter); ++ ++/** @} */ ++ ++/***************************************************************************************************/ ++/** @defgroup nvmlEvents Event Handling Methods ++ * This chapter describes methods that NVML can perform against each device to register and wait for ++ * some event to occur. ++ * @{ ++ */ ++/***************************************************************************************************/ ++ ++/** ++ * Create an empty set of events. ++ * Event set should be freed by \ref nvmlEventSetFree ++ * ++ * For Fermi &tm; or newer fully supported devices. ++ * @param set Reference in which to return the event handle ++ * ++ * @return ++ * - \ref NVML_SUCCESS if the event has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a set is NULL ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ * ++ * @see nvmlEventSetFree ++ */ ++nvmlReturn_t DECLDIR nvmlEventSetCreate(nvmlEventSet_t *set); ++ ++/** ++ * Starts recording of events on a specified devices and add the events to specified \ref nvmlEventSet_t ++ * ++ * For Fermi &tm; or newer fully supported devices. ++ * Ecc events are available only on ECC enabled devices (see \ref nvmlDeviceGetTotalEccErrors) ++ * Power capping events are available only on Power Management enabled devices (see \ref nvmlDeviceGetPowerManagementMode) ++ * ++ * For Linux only. ++ * ++ * \b IMPORTANT: Operations on \a set are not thread safe ++ * ++ * This call starts recording of events on specific device. ++ * All events that occurred before this call are not recorded. ++ * Checking if some event occurred can be done with \ref nvmlEventSetWait ++ * ++ * If function reports NVML_ERROR_UNKNOWN, event set is in undefined state and should be freed. ++ * If function reports NVML_ERROR_NOT_SUPPORTED, event set can still be used. None of the requested eventTypes ++ * are registered in that case. ++ * ++ * @param device The identifier of the target device ++ * @param eventTypes Bitmask of \ref nvmlEventType to record ++ * @param set Set to which add new event types ++ * ++ * @return ++ * - \ref NVML_SUCCESS if the event has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a eventTypes is invalid or \a set is NULL ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the platform does not support this feature or some of requested event types ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ * ++ * @see nvmlEventType ++ * @see nvmlDeviceGetSupportedEventTypes ++ * @see nvmlEventSetWait ++ * @see nvmlEventSetFree ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceRegisterEvents(nvmlDevice_t device, unsigned long long eventTypes, nvmlEventSet_t set); ++ ++/** ++ * Returns information about events supported on device ++ * ++ * For Fermi &tm; or newer fully supported devices. ++ * ++ * Events are not supported on Windows. So this function returns an empty mask in \a eventTypes on Windows. ++ * ++ * @param device The identifier of the target device ++ * @param eventTypes Reference in which to return bitmask of supported events ++ * ++ * @return ++ * - \ref NVML_SUCCESS if the eventTypes has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a eventType is NULL ++ * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ * ++ * @see nvmlEventType ++ * @see nvmlDeviceRegisterEvents ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceGetSupportedEventTypes(nvmlDevice_t device, unsigned long long *eventTypes); ++ ++/** ++ * Waits on events and delivers events ++ * ++ * For Fermi &tm; or newer fully supported devices. ++ * ++ * If some events are ready to be delivered at the time of the call, function returns immediately. ++ * If there are no events ready to be delivered, function sleeps till event arrives ++ * but not longer than specified timeout. This function in certain conditions can return before ++ * specified timeout passes (e.g. when interrupt arrives) ++ * ++ * In case of xid error, the function returns the most recent xid error type seen by the system. If there are multiple ++ * xid errors generated before nvmlEventSetWait is invoked then the last seen xid error type is returned for all ++ * xid error events. ++ * ++ * @param set Reference to set of events to wait on ++ * @param data Reference in which to return event data ++ * @param timeoutms Maximum amount of wait time in milliseconds for registered event ++ * ++ * @return ++ * - \ref NVML_SUCCESS if the data has been set ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a data is NULL ++ * - \ref NVML_ERROR_TIMEOUT if no event arrived in specified timeout or interrupt arrived ++ * - \ref NVML_ERROR_GPU_IS_LOST if a GPU has fallen off the bus or is otherwise inaccessible ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ * ++ * @see nvmlEventType ++ * @see nvmlDeviceRegisterEvents ++ */ ++nvmlReturn_t DECLDIR nvmlEventSetWait(nvmlEventSet_t set, nvmlEventData_t * data, unsigned int timeoutms); ++ ++/** ++ * Releases events in the set ++ * ++ * For Fermi &tm; or newer fully supported devices. ++ * ++ * @param set Reference to events to be released ++ * ++ * @return ++ * - \ref NVML_SUCCESS if the event has been successfully released ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ * ++ * @see nvmlDeviceRegisterEvents ++ */ ++nvmlReturn_t DECLDIR nvmlEventSetFree(nvmlEventSet_t set); ++ ++/** @} */ ++ ++/***************************************************************************************************/ ++/** @defgroup nvmlZPI Drain states ++ * This chapter describes methods that NVML can perform against each device to control their drain state ++ * and recognition by NVML and NVIDIA kernel driver. These methods can be used with out-of-band tools to ++ * power on/off GPUs, enable robust reset scenarios, etc. ++ * @{ ++ */ ++/***************************************************************************************************/ ++ ++/** ++ * Modify the drain state of a GPU. This method forces a GPU to no longer accept new incoming requests. ++ * Any new NVML process will no longer see this GPU. Persistence mode for this GPU must be turned off before ++ * this call is made. ++ * Must be called as administrator. ++ * For Linux only. ++ * ++ * For newer than Maxwell &tm; fully supported devices. ++ * Some Kepler devices supported. ++ * ++ * @param pciInfo The PCI address of the GPU drain state to be modified ++ * @param newState The drain state that should be entered, see \ref nvmlEnableState_t ++ * ++ * @return ++ * - \ref NVML_SUCCESS if counters were successfully reset ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a nvmlIndex or \a newState is invalid ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device doesn't support this feature ++ * - \ref NVML_ERROR_NO_PERMISSION if the calling process has insufficient permissions to perform operation ++ * - \ref NVML_ERROR_IN_USE if the device has persistence mode turned on ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceModifyDrainState (nvmlPciInfo_t *pciInfo, nvmlEnableState_t newState); ++ ++/** ++ * Query the drain state of a GPU. This method is used to check if a GPU is in a currently draining ++ * state. ++ * For Linux only. ++ * ++ * For newer than Maxwell &tm; fully supported devices. ++ * Some Kepler devices supported. ++ * ++ * @param pciInfo The PCI address of the GPU drain state to be queried ++ * @param currentState The current drain state for this GPU, see \ref nvmlEnableState_t ++ * ++ * @return ++ * - \ref NVML_SUCCESS if counters were successfully reset ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a nvmlIndex or \a currentState is invalid ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device doesn't support this feature ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceQueryDrainState (nvmlPciInfo_t *pciInfo, nvmlEnableState_t *currentState); ++ ++/** ++ * This method will remove the specified GPU from the view of both NVML and the NVIDIA kernel driver ++ * as long as no other processes are attached. If other processes are attached, this call will return ++ * NVML_ERROR_IN_USE and the GPU will be returned to its original "draining" state. Note: the ++ * only situation where a process can still be attached after nvmlDeviceModifyDrainState() is called ++ * to initiate the draining state is if that process was using, and is still using, a GPU before the ++ * call was made. Also note, persistence mode counts as an attachment to the GPU thus it must be disabled ++ * prior to this call. ++ * ++ * For long-running NVML processes please note that this will change the enumeration of current GPUs. ++ * For example, if there are four GPUs present and GPU1 is removed, the new enumeration will be 0-2. ++ * Also, device handles after the removed GPU will not be valid and must be re-established. ++ * Must be run as administrator. ++ * For Linux only. ++ * ++ * For newer than Maxwell &tm; fully supported devices. ++ * Some Kepler devices supported. ++ * ++ * @param pciInfo The PCI address of the GPU to be removed ++ * ++ * @return ++ * - \ref NVML_SUCCESS if counters were successfully reset ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a nvmlIndex is invalid ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the device doesn't support this feature ++ * - \ref NVML_ERROR_IN_USE if the device is still in use and cannot be removed ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceRemoveGpu (nvmlPciInfo_t *pciInfo); ++ ++/** ++ * Request the OS and the NVIDIA kernel driver to rediscover a portion of the PCI subsystem looking for GPUs that ++ * were previously removed. The portion of the PCI tree can be narrowed by specifying a domain, bus, and device. ++ * If all are zeroes then the entire PCI tree will be searched. Please note that for long-running NVML processes ++ * the enumeration will change based on how many GPUs are discovered and where they are inserted in bus order. ++ * ++ * In addition, all newly discovered GPUs will be initialized and their ECC scrubbed which may take several seconds ++ * per GPU. Also, all device handles are no longer guaranteed to be valid post discovery. ++ * ++ * Must be run as administrator. ++ * For Linux only. ++ * ++ * For newer than Maxwell &tm; fully supported devices. ++ * Some Kepler devices supported. ++ * ++ * @param pciInfo The PCI tree to be searched. Only the domain, bus, and device ++ * fields are used in this call. ++ * ++ * @return ++ * - \ref NVML_SUCCESS if counters were successfully reset ++ * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized ++ * - \ref NVML_ERROR_INVALID_ARGUMENT if \a pciInfo is invalid ++ * - \ref NVML_ERROR_NOT_SUPPORTED if the operating system does not support this feature ++ * - \ref NVML_ERROR_OPERATING_SYSTEM if the operating system is denying this feature ++ * - \ref NVML_ERROR_NO_PERMISSION if the calling process has insufficient permissions to perform operation ++ * - \ref NVML_ERROR_UNKNOWN on any unexpected error ++ */ ++nvmlReturn_t DECLDIR nvmlDeviceDiscoverGpus (nvmlPciInfo_t *pciInfo); ++ ++/** @} */ ++ ++/** ++ * NVML API versioning support ++ */ ++#if defined(__NVML_API_VERSION_INTERNAL) ++#undef nvmlDeviceGetPciInfo ++#undef nvmlDeviceGetCount ++#undef nvmlDeviceGetHandleByIndex ++#undef nvmlDeviceGetHandleByPciBusId ++#undef nvmlInit ++#endif ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif +-- +2.21.0 + diff --git a/0001-media-keys-Mark-screen-cast-as-stopped-if-it-was-sig.patch b/0001-media-keys-Mark-screen-cast-as-stopped-if-it-was-sig.patch new file mode 100644 index 0000000..e940d66 --- /dev/null +++ b/0001-media-keys-Mark-screen-cast-as-stopped-if-it-was-sig.patch @@ -0,0 +1,125 @@ +From a8115378fd876bfd4c3871428cdc16134ed484b1 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Jonas=20=C3=85dahl?= +Date: Tue, 5 Jan 2021 11:11:18 +0100 +Subject: [PATCH] media-keys: Mark screen cast as stopped if it was signalled + as such + +gnome-shell now sends a 'Stopped' signal if it was stopped without +gsd-media-keys itself being the stopper. +--- + plugins/media-keys/gsd-media-keys-manager.c | 52 +++++++++++++++++++-- + 1 file changed, 49 insertions(+), 3 deletions(-) + +diff --git a/plugins/media-keys/gsd-media-keys-manager.c b/plugins/media-keys/gsd-media-keys-manager.c +index 4d251f08..a526d5cf 100644 +--- a/plugins/media-keys/gsd-media-keys-manager.c ++++ b/plugins/media-keys/gsd-media-keys-manager.c +@@ -210,6 +210,7 @@ struct GsdMediaKeysManagerPrivate + guint screencast_timeout_id; + gboolean screencast_recording; + GCancellable *screencast_cancellable; ++ guint screencast_stopped_signal_id; + + /* Rotation */ + guint iio_sensor_watch_id; +@@ -2346,20 +2347,26 @@ do_rfkill_action (GsdMediaKeysManager *manager, + } + + static void +-screencast_stop (GsdMediaKeysManager *manager) ++screencast_stopped (GsdMediaKeysManager *manager) + { + if (manager->priv->screencast_timeout_id > 0) { + g_source_remove (manager->priv->screencast_timeout_id); + manager->priv->screencast_timeout_id = 0; + } + ++ manager->priv->screencast_recording = FALSE; ++} ++ ++static void ++screencast_stop (GsdMediaKeysManager *manager) ++{ ++ screencast_stopped (manager); ++ + g_dbus_proxy_call (manager->priv->screencast_proxy, + "StopScreencast", NULL, + G_DBUS_CALL_FLAGS_NONE, -1, + manager->priv->screencast_cancellable, + NULL, NULL); +- +- manager->priv->screencast_recording = FALSE; + } + + static gboolean +@@ -2835,6 +2842,21 @@ initialize_volume_handler (GsdMediaKeysManager *manager) + gnome_settings_profile_end ("gvc_mixer_control_new"); + } + ++ ++static void ++on_screencast_stopped (GDBusConnection *connection, ++ const gchar *sender_name, ++ const gchar *object_path, ++ const gchar *interface_name, ++ const gchar *signal_name, ++ GVariant *parameters, ++ gpointer data) ++{ ++ GsdMediaKeysManager *manager = data; ++ ++ screencast_stopped (manager); ++} ++ + static void + on_screencast_proxy_ready (GObject *source, + GAsyncResult *result, +@@ -2850,7 +2872,20 @@ on_screencast_proxy_ready (GObject *source, + if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + g_warning ("Failed to create proxy for screencast: %s", error->message); + g_error_free (error); ++ return; + } ++ ++ manager->priv->screencast_stopped_signal_id = ++ g_dbus_connection_signal_subscribe (manager->priv->connection, ++ SHELL_DBUS_NAME ".Screencast", ++ SHELL_DBUS_NAME ".Screencast", ++ "Stopped", ++ SHELL_DBUS_PATH "/Screencast", ++ NULL, ++ G_DBUS_SIGNAL_FLAGS_NONE, ++ on_screencast_stopped, ++ manager, ++ NULL); + } + + static void +@@ -2901,6 +2936,11 @@ shell_presence_changed (GsdMediaKeysManager *manager) + on_screencast_proxy_ready, manager); + g_free (name_owner); + } else { ++ if (manager->priv->screencast_stopped_signal_id) ++ g_dbus_connection_signal_unsubscribe (manager->priv->connection, ++ manager->priv->screencast_stopped_signal_id); ++ manager->priv->screencast_stopped_signal_id = 0; ++ + g_ptr_array_set_size (manager->priv->keys, 0); + g_clear_object (&manager->priv->key_grabber); + g_clear_object (&manager->priv->screencast_proxy); +@@ -3091,6 +3131,12 @@ gsd_media_keys_manager_stop (GsdMediaKeysManager *manager) + priv->reenable_power_button_timer_id = 0; + } + ++ if (priv->screencast_stopped_signal_id) { ++ g_dbus_connection_signal_unsubscribe (priv->connection, ++ priv->screencast_stopped_signal_id); ++ priv->screencast_stopped_signal_id = 0; ++ } ++ + g_clear_pointer (&manager->priv->ca, ca_context_destroy); + + #if HAVE_GUDEV +-- +2.27.0 + diff --git a/0001-power-Only-disable-Suspend-Hibernate-actions-inside-.patch b/0001-power-Only-disable-Suspend-Hibernate-actions-inside-.patch new file mode 100644 index 0000000..ea4fa26 --- /dev/null +++ b/0001-power-Only-disable-Suspend-Hibernate-actions-inside-.patch @@ -0,0 +1,53 @@ +From fbe9b7dba44cb284f649a1e916b2cf3ce8281211 Mon Sep 17 00:00:00 2001 +From: Benjamin Berg +Date: Tue, 7 May 2019 15:40:20 +0200 +Subject: [PATCH] power: Only disable Suspend/Hibernate actions inside VM + +While we theoretically only want a different default value inside a VM, +we currently hack this by never doing a suspend action inside VMs. +However, that also breaks automatic logout, which is an unintended side +effect. + +Move the check to not install the corresponding timeout (preventing +sleep warnings from being displayed) and also only enforce the VM +specific hack for the Suspend and Hibernate actions. +--- + plugins/power/gsd-power-manager.c | 15 ++++++++------- + 1 file changed, 8 insertions(+), 7 deletions(-) + +diff --git a/plugins/power/gsd-power-manager.c b/plugins/power/gsd-power-manager.c +index f965f6f..dbaa262 100644 +--- a/plugins/power/gsd-power-manager.c ++++ b/plugins/power/gsd-power-manager.c +@@ -1520,13 +1520,6 @@ idle_set_mode (GsdPowerManager *manager, GsdPowerIdleMode mode) + return; + } + +- /* don't do any power saving if we're a VM */ +- if (manager->priv->is_virtual_machine) { +- g_debug ("ignoring state transition to %s as virtual machine", +- idle_mode_to_string (mode)); +- return; +- } +- + manager->priv->current_idle_mode = mode; + g_debug ("Doing a state transition: %s", idle_mode_to_string (mode)); + +@@ -1727,6 +1720,14 @@ idle_configure (GsdPowerManager *manager) + clear_idle_watch (manager->priv->idle_monitor, + &manager->priv->idle_sleep_warning_id); + ++ /* don't do any power saving if we're a VM */ ++ if (manager->priv->is_virtual_machine && ++ (action_type == GSD_POWER_ACTION_SUSPEND || ++ action_type == GSD_POWER_ACTION_HIBERNATE)) { ++ g_debug ("Ignoring sleep timeout with suspend action inside VM"); ++ timeout_sleep = 0; ++ } ++ + if (timeout_sleep != 0) { + g_debug ("setting up sleep callback %is", timeout_sleep); + +-- +2.31.1 + diff --git a/0001-smartcard-Cancel-cancellable-when-stopping.patch b/0001-smartcard-Cancel-cancellable-when-stopping.patch new file mode 100644 index 0000000..4ddcdef --- /dev/null +++ b/0001-smartcard-Cancel-cancellable-when-stopping.patch @@ -0,0 +1,58 @@ +From a1c2685bc6b255f22b6ce4645c001d428cb67907 Mon Sep 17 00:00:00 2001 +From: Marek Kasik +Date: Wed, 22 May 2019 14:56:42 +0200 +Subject: [PATCH] smartcard: Cancel cancellable when stopping + +self->cancellable in GsdSmartcardManager is not cancelled +at gsd_smartcard_manager_stop() and hence some callbacks are +still called after unload_nss() which clears SECMODListLock +which is used by SECMOD_GetReadLock() / SECMOD_ReleaseReadLock(). + +This leads to crashes in NSSRWLock_LockRead_Util() and +NSSRWLock_UnlockRead_Util() probably. + +Also check for return value of g_cancellable_connect() +and initialize pointer to PK11SlotInfo. + +See https://bugzilla.redhat.com/show_bug.cgi?id=1646359, +https://bugzilla.redhat.com/show_bug.cgi?id=1688791 and +their duplicates for additional info. +--- + plugins/smartcard/gsd-smartcard-manager.c | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletion(-) + +diff --git a/plugins/smartcard/gsd-smartcard-manager.c b/plugins/smartcard/gsd-smartcard-manager.c +index 014c17be..da1e0d6d 100644 +--- a/plugins/smartcard/gsd-smartcard-manager.c ++++ b/plugins/smartcard/gsd-smartcard-manager.c +@@ -184,7 +184,7 @@ + GError **error) + { + GsdSmartcardManagerPrivate *priv = self->priv; +- PK11SlotInfo *card, *old_card; ++ PK11SlotInfo *card = NULL, *old_card; + CK_SLOT_ID slot_id; + gulong handler_id; + int old_slot_series = -1, slot_series; +@@ -190,7 +190,8 @@ watch_one_event_from_driver (GsdSmartcardManager *self, + operation, + NULL); + +- card = SECMOD_WaitForAnyTokenEvent (operation->driver, 0, PR_SecondsToInterval (1)); ++ if (handler_id != 0) ++ card = SECMOD_WaitForAnyTokenEvent (operation->driver, 0, PR_SecondsToInterval (1)); + + g_cancellable_disconnect (cancellable, handler_id); + +@@ -773,6 +774,8 @@ gsd_smartcard_manager_stop (GsdSmartcardManager *self) + + g_debug ("Stopping smartcard manager"); + ++ g_cancellable_cancel (priv->cancellable); ++ + unload_nss (self); + + g_clear_object (&priv->settings); +-- +2.23.0 + diff --git a/0001-subman-Add-a-new-plugin-to-provide-system-subscripti.patch b/0001-subman-Add-a-new-plugin-to-provide-system-subscripti.patch new file mode 100644 index 0000000..bc13b55 --- /dev/null +++ b/0001-subman-Add-a-new-plugin-to-provide-system-subscripti.patch @@ -0,0 +1,1871 @@ +From bee6d42503ec9b56f6e10704db02bcedb6a4fdf1 Mon Sep 17 00:00:00 2001 +From: Richard Hughes +Date: Thu, 20 Aug 2020 11:16:09 -0400 +Subject: [PATCH 01/15] subman: Add a new plugin to provide system subscription + registration + +--- + meson.build | 1 + + plugins/meson.build | 1 + + plugins/subman/README.md | 56 + + plugins/subman/gsd-subman-common.c | 36 + + plugins/subman/gsd-subman-common.h | 40 + + plugins/subman/gsd-subman-helper.c | 378 +++++++ + plugins/subman/gsd-subscription-manager.c | 982 ++++++++++++++++++ + plugins/subman/gsd-subscription-manager.h | 63 ++ + plugins/subman/main.c | 8 + + plugins/subman/meson.build | 56 + + ...ome.SettingsDaemon.Subscription.desktop.in | 9 + + ...ettings-daemon.plugins.subman.policy.in.in | 27 + + ...gnome.settings-daemon.plugins.subman.rules | 7 + + 13 files changed, 1664 insertions(+) + create mode 100644 plugins/subman/README.md + create mode 100644 plugins/subman/gsd-subman-common.c + create mode 100644 plugins/subman/gsd-subman-common.h + create mode 100644 plugins/subman/gsd-subman-helper.c + create mode 100644 plugins/subman/gsd-subscription-manager.c + create mode 100644 plugins/subman/gsd-subscription-manager.h + create mode 100644 plugins/subman/main.c + create mode 100644 plugins/subman/meson.build + create mode 100644 plugins/subman/org.gnome.SettingsDaemon.Subscription.desktop.in + create mode 100644 plugins/subman/org.gnome.settings-daemon.plugins.subman.policy.in.in + create mode 100644 plugins/subman/org.gnome.settings-daemon.plugins.subman.rules + +diff --git a/meson.build b/meson.build +index 1632ea05..27bf8c4c 100644 +--- a/meson.build ++++ b/meson.build +@@ -70,60 +70,61 @@ if gsd_buildtype.contains('debug') + ] + + compiler_flags = cc.get_supported_arguments(test_cflags) + elif gsd_buildtype.contains('release') + common_flags += ['-DG_DISABLE_CAST_CHECKS'] + endif + + # Workaround for meson's bug + # https://github.com/mesonbuild/meson/pull/1896 + if get_option('b_ndebug') == true + common_flags += ['-DG_DISABLE_ASSERT'] + endif + + add_project_arguments(common_flags + compiler_flags, language: 'c') + + glib_dep = dependency('glib-2.0', version: '>= 2.56') + colord_dep = dependency('colord', version: '>= 1.0.2') + geocode_glib_dep = dependency('geocode-glib-1.0', version: '>= 3.10.0') + gio_dep = dependency('gio-2.0', version: '>= 2.53.0') + gio_unix_dep = dependency('gio-unix-2.0') + gnome_desktop_dep = dependency('gnome-desktop-3.0', version: '>= 3.11.1') + gsettings_desktop_dep = dependency('gsettings-desktop-schemas', version: '>= 3.27.90') + gtk_dep = dependency('gtk+-3.0', version: '>= 3.15.3') + gtk_x11_dep = dependency('gtk+-x11-3.0') + gweather_dep = dependency('gweather-3.0', version: '>= 3.9.5') + lcms_dep = dependency('lcms2', version: '>= 2.2') + libcanberra_gtk_dep = dependency('libcanberra-gtk3') + libgeoclue_dep = dependency('libgeoclue-2.0', version: '>= 2.3.1') + libnotify_dep = dependency('libnotify', version: '>= 0.7.3') + libpulse_mainloop_glib_dep = dependency('libpulse-mainloop-glib', version: '>= 2.0') ++jsonglib_dep = dependency('json-glib-1.0', version: '>= 1.1.1') + pango_dep = dependency('pango', version: '>= 1.20.0') + polkit_gobject_dep = dependency('polkit-gobject-1', version: '>= 0.103') + upower_glib_dep = dependency('upower-glib', version: '>= 0.99.0') + x11_dep = dependency('x11') + + m_dep = cc.find_library('m') + dl_dep = cc.find_library('dl') + + # ALSA integration (default enabled) + enable_alsa = get_option('alsa') + assert(enable_alsa or not host_is_linux, 'ALSA is not optional on Linux platforms') + + libgvc = subproject( + 'gvc', + default_options: [ + 'static=true', + 'alsa=' + enable_alsa.to_string() + ] + ) + libgvc_dep = libgvc.get_variable('libgvc_dep') + + # GUdev integration (default enabled) + enable_gudev = get_option('gudev') + if enable_gudev + gudev_dep = dependency('gudev-1.0') + endif + config_h.set10('HAVE_GUDEV', enable_gudev) + if host_is_linux + assert(enable_gudev, 'GUdev is not optional on Linux platforms') + endif +diff --git a/plugins/meson.build b/plugins/meson.build +index 3c4d42ac..4c9caf47 100644 +--- a/plugins/meson.build ++++ b/plugins/meson.build +@@ -1,35 +1,36 @@ + enabled_plugins = [ + ['a11y-settings', 'A11ySettings'], + ['account', 'Account'], + ['clipboard', 'Clipboard'], + ['color', 'Color'], ++ ['subman', 'Subscription'], + ['datetime', 'Datetime'], + ['dummy', ''], + ['power', 'Power'], + ['housekeeping', 'Housekeeping'], + ['keyboard', 'Keyboard'], + ['media-keys', 'MediaKeys'], + ['mouse', 'Mouse'], + ['screensaver-proxy', 'ScreensaverProxy'], + ['sharing', 'Sharing'], + ['sound', 'Sound'], + ['xsettings', 'XSettings'] + ] + + if enable_smartcard + enabled_plugins += [['smartcard', 'Smartcard']] + endif + + if enable_wacom + enabled_plugins += [['wacom', 'Wacom']] + endif + + if enable_cups + enabled_plugins += [['print-notifications', 'PrintNotifications']] + endif + + if enable_rfkill + enabled_plugins += [['rfkill', 'Rfkill']] + endif + + plugins_conf = configuration_data() +diff --git a/plugins/subman/README.md b/plugins/subman/README.md +new file mode 100644 +index 00000000..3e1cc3cd +--- /dev/null ++++ b/plugins/subman/README.md +@@ -0,0 +1,56 @@ ++GNOME Settings Daemon: Subscription Manager Plugin ++================================================== ++ ++Testing: ++ ++To add a test acccount on subscription.rhsm.stage.redhat.com, use Ethel: ++http://account-manager-stage.app.eng.rdu2.redhat.com/#view ++ ++Register with a username and password ++------------------------------------- ++ ++ gdbus call \ ++ --session \ ++ --dest org.gnome.SettingsDaemon.Subscription \ ++ --object-path /org/gnome/SettingsDaemon/Subscription \ ++ --method org.gnome.SettingsDaemon.Subscription.Register "{'kind':<'username'>,'hostname':<'subscription.rhsm.stage.redhat.com'>,'username':<'rhughes_test'>,'password':<'barbaz'>}" ++ ++To register with a certificate ++------------------------------ ++ ++ gdbus call \ ++ --session \ ++ --dest org.gnome.SettingsDaemon.Subscription \ ++ --object-path /org/gnome/SettingsDaemon/Subscription \ ++ --method org.gnome.SettingsDaemon.Subscription.Register "{'kind':<'key'>,'hostname':<'subscription.rhsm.stage.redhat.com'>,'organisation':<'foo'>,'activation-key':<'barbaz'>}" ++ ++To unregister ++------------- ++ ++ gdbus call \ ++ --session \ ++ --dest org.gnome.SettingsDaemon.Subscription \ ++ --object-path /org/gnome/SettingsDaemon/Subscription \ ++ --method org.gnome.SettingsDaemon.Subscription.Unregister ++ ++Debugging ++--------- ++ ++Get the UNIX socket using `Subscription.Register` then call something like: ++ ++ sudo G_MESSAGES_DEBUG=all ./plugins/subman/gsd-subman-helper \ ++ --address="unix:abstract=/var/run/dbus-ulGB1wfnbn,guid=71e6bf329d861ce366df7a1d5d036a5b" \ ++ --kind="register-with-username" \ ++ --username="rhughes_test" \ ++ --password="barbaz" \ ++ --hostname="subscription.rhsm.stage.redhat.com" \ ++ --organisation="" ++ ++You can all see some basic debugging running `rhsmd` in the foreground: ++ ++ sudo /usr/libexec/rhsmd -d -k ++ ++Known Limitations ++================= ++ ++Proxy servers are not supported, nor are custom host ports or prefixes. +diff --git a/plugins/subman/gsd-subman-common.c b/plugins/subman/gsd-subman-common.c +new file mode 100644 +index 00000000..e515131e +--- /dev/null ++++ b/plugins/subman/gsd-subman-common.c +@@ -0,0 +1,36 @@ ++/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- ++ * ++ * Copyright (C) 2019 Richard Hughes ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, see . ++ * ++ */ ++ ++#include "config.h" ++ ++#include "gsd-subman-common.h" ++ ++const gchar * ++gsd_subman_subscription_status_to_string (GsdSubmanSubscriptionStatus status) ++{ ++ if (status == GSD_SUBMAN_SUBSCRIPTION_STATUS_VALID) ++ return "valid"; ++ if (status == GSD_SUBMAN_SUBSCRIPTION_STATUS_INVALID) ++ return "invalid"; ++ if (status == GSD_SUBMAN_SUBSCRIPTION_STATUS_DISABLED) ++ return "disabled"; ++ if (status == GSD_SUBMAN_SUBSCRIPTION_STATUS_PARTIALLY_VALID) ++ return "partially-valid"; ++ return "unknown"; ++} +diff --git a/plugins/subman/gsd-subman-common.h b/plugins/subman/gsd-subman-common.h +new file mode 100644 +index 00000000..fccf9f6a +--- /dev/null ++++ b/plugins/subman/gsd-subman-common.h +@@ -0,0 +1,40 @@ ++/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- ++ * ++ * Copyright (C) 2019 Richard Hughes ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, see . ++ * ++ */ ++ ++#ifndef __GSD_SUBMAN_COMMON_H ++#define __GSD_SUBMAN_COMMON_H ++ ++#include ++ ++G_BEGIN_DECLS ++ ++typedef enum { ++ GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN, ++ GSD_SUBMAN_SUBSCRIPTION_STATUS_VALID, ++ GSD_SUBMAN_SUBSCRIPTION_STATUS_INVALID, ++ GSD_SUBMAN_SUBSCRIPTION_STATUS_DISABLED, ++ GSD_SUBMAN_SUBSCRIPTION_STATUS_PARTIALLY_VALID, ++ GSD_SUBMAN_SUBSCRIPTION_STATUS_LAST ++} GsdSubmanSubscriptionStatus; ++ ++const gchar *gsd_subman_subscription_status_to_string (GsdSubmanSubscriptionStatus status); ++ ++G_END_DECLS ++ ++#endif /* __GSD_SUBMAN_COMMON_H */ +diff --git a/plugins/subman/gsd-subman-helper.c b/plugins/subman/gsd-subman-helper.c +new file mode 100644 +index 00000000..182f7190 +--- /dev/null ++++ b/plugins/subman/gsd-subman-helper.c +@@ -0,0 +1,378 @@ ++/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- ++ * ++ * Copyright (C) 2019 Richard Hughes ++ * ++ * Licensed under the GNU General Public License Version 2 ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ++ */ ++ ++#include "config.h" ++ ++#include ++#include ++#include ++ ++#include ++#include ++ ++static void ++_helper_convert_error (const gchar *json_txt, GError **error) ++{ ++ JsonNode *json_root; ++ JsonObject *json_obj; ++ const gchar *message; ++ g_autoptr(JsonParser) json_parser = json_parser_new (); ++ ++ /* this may be plain text or JSON :| */ ++ if (!json_parser_load_from_data (json_parser, json_txt, -1, NULL)) { ++ g_set_error_literal (error, ++ G_IO_ERROR, ++ G_IO_ERROR_NOT_SUPPORTED, ++ json_txt); ++ return; ++ } ++ json_root = json_parser_get_root (json_parser); ++ json_obj = json_node_get_object (json_root); ++ if (!json_object_has_member (json_obj, "message")) { ++ g_set_error (error, ++ G_IO_ERROR, ++ G_IO_ERROR_INVALID_DATA, ++ "no message' in %s", json_txt); ++ return; ++ } ++ message = json_object_get_string_member (json_obj, "message"); ++ if (g_strstr_len (message, -1, "Invalid user credentials") != NULL) { ++ g_set_error_literal (error, ++ G_IO_ERROR, ++ G_IO_ERROR_PERMISSION_DENIED, ++ message); ++ return; ++ } ++ g_set_error_literal (error, ++ G_IO_ERROR, ++ G_IO_ERROR_NOT_SUPPORTED, ++ message); ++} ++ ++static gboolean ++_helper_unregister (GError **error) ++{ ++ g_autoptr(GDBusProxy) proxy = NULL; ++ g_autoptr(GVariantBuilder) proxy_options = NULL; ++ g_autoptr(GVariant) res = NULL; ++ ++ g_debug ("unregistering"); ++ proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, ++ G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | ++ G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS, ++ NULL, ++ "com.redhat.RHSM1", ++ "/com/redhat/RHSM1/Unregister", ++ "com.redhat.RHSM1.Unregister", ++ NULL, error); ++ if (proxy == NULL) { ++ g_prefix_error (error, "Failed to get proxy: "); ++ return FALSE; ++ } ++ proxy_options = g_variant_builder_new (G_VARIANT_TYPE_VARDICT); ++ res = g_dbus_proxy_call_sync (proxy, ++ "Unregister", ++ g_variant_new ("(a{sv}s)", ++ proxy_options, ++ ""), /* lang */ ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, NULL, error); ++ return res != NULL; ++} ++ ++static gboolean ++_helper_auto_attach (GError **error) ++{ ++ const gchar *str = NULL; ++ g_autoptr(GDBusProxy) proxy = NULL; ++ g_autoptr(GVariantBuilder) proxy_options = NULL; ++ g_autoptr(GVariant) res = NULL; ++ ++ g_debug ("auto-attaching subscriptions"); ++ proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, ++ G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | ++ G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS, ++ NULL, ++ "com.redhat.RHSM1", ++ "/com/redhat/RHSM1/Attach", ++ "com.redhat.RHSM1.Attach", ++ NULL, error); ++ if (proxy == NULL) { ++ g_prefix_error (error, "Failed to get proxy: "); ++ return FALSE; ++ } ++ proxy_options = g_variant_builder_new (G_VARIANT_TYPE_VARDICT); ++ res = g_dbus_proxy_call_sync (proxy, ++ "AutoAttach", ++ g_variant_new ("(sa{sv}s)", ++ "", /* now? */ ++ proxy_options, ++ ""), /* lang */ ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, NULL, error); ++ if (res == NULL) ++ return FALSE; ++ g_variant_get (res, "(&s)", &str); ++ g_debug ("Attach.AutoAttach: %s", str); ++ return TRUE; ++} ++ ++static gboolean ++_helper_save_config (const gchar *key, const gchar *value, GError **error) ++{ ++ g_autoptr(GDBusProxy) proxy = NULL; ++ g_autoptr(GVariant) res = NULL; ++ proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, ++ G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | ++ G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS, ++ NULL, ++ "com.redhat.RHSM1", ++ "/com/redhat/RHSM1/Config", ++ "com.redhat.RHSM1.Config", ++ NULL, error); ++ if (proxy == NULL) { ++ g_prefix_error (error, "Failed to get proxy: "); ++ return FALSE; ++ } ++ res = g_dbus_proxy_call_sync (proxy, "Set", ++ g_variant_new ("(svs)", ++ key, ++ g_variant_new_string (value), ++ ""), /* lang */ ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, NULL, error); ++ return res != NULL; ++} ++ ++int ++main (int argc, char *argv[]) ++{ ++ const gchar *userlang = ""; /* as root, so no translations */ ++ g_autofree gchar *activation_key = NULL; ++ g_autofree gchar *address = NULL; ++ g_autofree gchar *hostname = NULL; ++ g_autofree gchar *kind = NULL; ++ g_autofree gchar *organisation = NULL; ++ g_autofree gchar *password = NULL; ++ g_autofree gchar *port = NULL; ++ g_autofree gchar *prefix = NULL; ++ g_autofree gchar *proxy_server = NULL; ++ g_autofree gchar *username = NULL; ++ g_autoptr(GDBusConnection) conn_private = NULL; ++ g_autoptr(GDBusProxy) proxy = NULL; ++ g_autoptr(GError) error = NULL; ++ g_autoptr(GOptionContext) context = g_option_context_new (NULL); ++ g_autoptr(GVariantBuilder) proxy_options = NULL; ++ g_autoptr(GVariantBuilder) subman_conopts = NULL; ++ g_autoptr(GVariantBuilder) subman_options = NULL; ++ ++ const GOptionEntry options[] = { ++ { "kind", '\0', G_OPTION_FLAG_NONE, G_OPTION_ARG_STRING, ++ &kind, "Kind, e.g. 'username' or 'key'", NULL }, ++ { "address", '\0', G_OPTION_FLAG_NONE, G_OPTION_ARG_STRING, ++ &address, "UNIX address", NULL }, ++ { "username", '\0', G_OPTION_FLAG_NONE, G_OPTION_ARG_STRING, ++ &username, "Username", NULL }, ++ { "password", '\0', G_OPTION_FLAG_NONE, G_OPTION_ARG_STRING, ++ &password, "Password", NULL }, ++ { "organisation", '\0', G_OPTION_FLAG_NONE, G_OPTION_ARG_STRING, ++ &organisation, "Organisation", NULL }, ++ { "activation-key", '\0', G_OPTION_FLAG_NONE, G_OPTION_ARG_STRING, ++ &activation_key, "Activation keys", NULL }, ++ { "hostname", '\0', G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_STRING, ++ &hostname, "Registration server hostname", NULL }, ++ { "prefix", '\0', G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_STRING, ++ &prefix, "Registration server prefix", NULL }, ++ { "port", '\0', G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_STRING, ++ &port, "Registration server port", NULL }, ++ { "proxy", '\0', G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_STRING, ++ &proxy_server, "Proxy settings", NULL }, ++ { NULL} ++ }; ++ ++ /* check calling UID */ ++ if (getuid () != 0 || geteuid () != 0) { ++ g_printerr ("This program can only be used by the root user\n"); ++ return G_IO_ERROR_NOT_SUPPORTED; ++ } ++ g_option_context_add_main_entries (context, options, NULL); ++ if (!g_option_context_parse (context, &argc, &argv, &error)) { ++ g_printerr ("Failed to parse arguments: %s\n", error->message); ++ return G_IO_ERROR_NOT_SUPPORTED; ++ } ++ ++ /* uncommon actions */ ++ if (kind == NULL) { ++ g_printerr ("No --kind specified\n"); ++ return G_IO_ERROR_INVALID_DATA; ++ } ++ if (g_strcmp0 (kind, "unregister") == 0) { ++ if (!_helper_unregister (&error)) { ++ g_printerr ("Failed to Unregister: %s\n", error->message); ++ return G_IO_ERROR_NOT_INITIALIZED; ++ } ++ return EXIT_SUCCESS; ++ } ++ if (g_strcmp0 (kind, "auto-attach") == 0) { ++ if (!_helper_auto_attach (&error)) { ++ g_printerr ("Failed to AutoAttach: %s\n", error->message); ++ return G_IO_ERROR_NOT_INITIALIZED; ++ } ++ return EXIT_SUCCESS; ++ } ++ ++ /* connect to abstract socket for reasons */ ++ if (address == NULL) { ++ g_printerr ("No --address specified\n"); ++ return G_IO_ERROR_INVALID_DATA; ++ } ++ conn_private = g_dbus_connection_new_for_address_sync (address, ++ G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT, ++ NULL, NULL, ++ &error); ++ if (conn_private == NULL) { ++ g_printerr ("Invalid --address specified: %s\n", error->message); ++ return G_IO_ERROR_INVALID_DATA; ++ } ++ proxy = g_dbus_proxy_new_sync (conn_private, ++ G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, ++ NULL, /* GDBusInterfaceInfo */ ++ NULL, /* name */ ++ "/com/redhat/RHSM1/Register", ++ "com.redhat.RHSM1.Register", ++ NULL, &error); ++ if (proxy == NULL) { ++ g_printerr ("Count not contact RHSM: %s\n", error->message); ++ return G_IO_ERROR_NOT_FOUND; ++ } ++ ++ /* no options */ ++ subman_options = g_variant_builder_new (G_VARIANT_TYPE("a{ss}")); ++ ++ /* set registration server */ ++ if (hostname == NULL || hostname[0] == '\0') ++ hostname = g_strdup ("subscription.rhsm.redhat.com"); ++ if (prefix == NULL || prefix[0] == '\0') ++ prefix = g_strdup ("/subscription"); ++ if (port == NULL || port[0] == '\0') ++ port = g_strdup ("443"); ++ subman_conopts = g_variant_builder_new (G_VARIANT_TYPE("a{ss}")); ++ g_variant_builder_add (subman_conopts, "{ss}", "host", hostname); ++ g_variant_builder_add (subman_conopts, "{ss}", "handler", prefix); ++ g_variant_builder_add (subman_conopts, "{ss}", "port", port); ++ ++ /* call into RHSM */ ++ if (g_strcmp0 (kind, "register-with-key") == 0) { ++ g_auto(GStrv) activation_keys = NULL; ++ g_autoptr(GError) error_local = NULL; ++ g_autoptr(GVariant) res = NULL; ++ ++ if (activation_key == NULL) { ++ g_printerr ("Required --activation-key\n"); ++ return G_IO_ERROR_INVALID_DATA; ++ } ++ if (organisation == NULL) { ++ g_printerr ("Required --organisation\n"); ++ return G_IO_ERROR_INVALID_DATA; ++ } ++ ++ g_debug ("registering using activation key"); ++ activation_keys = g_strsplit (activation_key, ",", -1); ++ res = g_dbus_proxy_call_sync (proxy, ++ "RegisterWithActivationKeys", ++ g_variant_new ("(s^asa{ss}a{ss}s)", ++ organisation, ++ activation_keys, ++ subman_options, ++ subman_conopts, ++ userlang), ++ G_DBUS_CALL_FLAGS_NO_AUTO_START, ++ -1, NULL, &error_local); ++ if (res == NULL) { ++ g_dbus_error_strip_remote_error (error_local); ++ _helper_convert_error (error_local->message, &error); ++ g_printerr ("Failed to RegisterWithActivationKeys: %s\n", error->message); ++ return error->code; ++ } ++ } else if (g_strcmp0 (kind, "register-with-username") == 0) { ++ g_autoptr(GError) error_local = NULL; ++ g_autoptr(GVariant) res = NULL; ++ ++ g_debug ("registering using username and password"); ++ if (username == NULL) { ++ g_printerr ("Required --username\n"); ++ return G_IO_ERROR_INVALID_DATA; ++ } ++ if (password == NULL) { ++ g_printerr ("Required --password\n"); ++ return G_IO_ERROR_INVALID_DATA; ++ } ++ if (organisation == NULL) { ++ g_printerr ("Required --organisation\n"); ++ return G_IO_ERROR_INVALID_DATA; ++ } ++ res = g_dbus_proxy_call_sync (proxy, ++ "Register", ++ g_variant_new ("(sssa{ss}a{ss}s)", ++ organisation, ++ username, ++ password, ++ subman_options, ++ subman_conopts, ++ userlang), ++ G_DBUS_CALL_FLAGS_NO_AUTO_START, ++ -1, NULL, &error_local); ++ if (res == NULL) { ++ g_dbus_error_strip_remote_error (error_local); ++ _helper_convert_error (error_local->message, &error); ++ g_printerr ("Failed to Register: %s\n", error->message); ++ return error->code; ++ } ++ } else { ++ g_printerr ("Invalid --kind specified: %s\n", kind); ++ return G_IO_ERROR_INVALID_DATA; ++ } ++ ++ /* set the new hostname */ ++ if (!_helper_save_config ("server.hostname", hostname, &error)) { ++ g_printerr ("Failed to save hostname: %s\n", error->message); ++ return G_IO_ERROR_NOT_INITIALIZED; ++ } ++ if (!_helper_save_config ("server.prefix", prefix, &error)) { ++ g_printerr ("Failed to save prefix: %s\n", error->message); ++ return G_IO_ERROR_NOT_INITIALIZED; ++ } ++ if (!_helper_save_config ("server.port", port, &error)) { ++ g_printerr ("Failed to save port: %s\n", error->message); ++ return G_IO_ERROR_NOT_INITIALIZED; ++ } ++ ++ /* wait for rhsmd to notice the new config */ ++ g_usleep (G_USEC_PER_SEC * 5); ++ ++ /* auto-attach */ ++ if (!_helper_auto_attach (&error)) { ++ g_printerr ("Failed to AutoAttach: %s\n", error->message); ++ return G_IO_ERROR_NOT_INITIALIZED; ++ } ++ ++ return EXIT_SUCCESS; ++} +diff --git a/plugins/subman/gsd-subscription-manager.c b/plugins/subman/gsd-subscription-manager.c +new file mode 100644 +index 00000000..08b13fa6 +--- /dev/null ++++ b/plugins/subman/gsd-subscription-manager.c +@@ -0,0 +1,982 @@ ++/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- ++ * ++ * Copyright (C) 2019 Richard Hughes ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, see . ++ * ++ */ ++ ++#include "config.h" ++ ++#include ++#include ++#include ++#include ++#include ++ ++#include "gnome-settings-profile.h" ++#include "gsd-subman-common.h" ++#include "gsd-subscription-manager.h" ++ ++#define GSD_DBUS_NAME "org.gnome.SettingsDaemon" ++#define GSD_DBUS_PATH "/org/gnome/SettingsDaemon" ++#define GSD_DBUS_BASE_INTERFACE "org.gnome.SettingsDaemon" ++ ++#define GSD_SUBSCRIPTION_DBUS_NAME GSD_DBUS_NAME ".Subscription" ++#define GSD_SUBSCRIPTION_DBUS_PATH GSD_DBUS_PATH "/Subscription" ++#define GSD_SUBSCRIPTION_DBUS_INTERFACE GSD_DBUS_BASE_INTERFACE ".Subscription" ++ ++static const gchar introspection_xml[] = ++"" ++" " ++" " ++" " ++" " ++" " ++" " ++" " ++""; ++ ++#define GSD_SUBSCRIPTION_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GSD_TYPE_SUBSCRIPTION_MANAGER, GsdSubscriptionManagerPrivate)) ++ ++typedef enum { ++ _RHSM_INTERFACE_CONFIG, ++ _RHSM_INTERFACE_REGISTER_SERVER, ++ _RHSM_INTERFACE_ATTACH, ++ _RHSM_INTERFACE_ENTITLEMENT, ++ _RHSM_INTERFACE_PRODUCTS, ++ _RHSM_INTERFACE_CONSUMER, ++ _RHSM_INTERFACE_SYSPURPOSE, ++ _RHSM_INTERFACE_LAST ++} _RhsmInterface; ++ ++struct GsdSubscriptionManagerPrivate ++{ ++ /* D-Bus */ ++ guint name_id; ++ GDBusNodeInfo *introspection_data; ++ GDBusConnection *connection; ++ GCancellable *bus_cancellable; ++ ++ GDBusProxy *proxies[_RHSM_INTERFACE_LAST]; ++ const gchar *userlang; /* owned by GLib internally */ ++ GHashTable *config; /* str:str */ ++ gchar *address; ++ ++ GTimer *timer_last_notified; ++ NotifyNotification *notification_expired; ++ NotifyNotification *notification_registered; ++ NotifyNotification *notification_registration_required; ++ GsdSubmanSubscriptionStatus subscription_status; ++ GsdSubmanSubscriptionStatus subscription_status_last; ++}; ++ ++enum { ++ PROP_0, ++}; ++ ++static void gsd_subscription_manager_class_init (GsdSubscriptionManagerClass *klass); ++static void gsd_subscription_manager_init (GsdSubscriptionManager *subscription_manager); ++static void gsd_subscription_manager_finalize (GObject *object); ++ ++G_DEFINE_TYPE (GsdSubscriptionManager, gsd_subscription_manager, G_TYPE_OBJECT) ++ ++static gpointer manager_object = NULL; ++ ++GQuark ++gsd_subscription_manager_error_quark (void) ++{ ++ static GQuark quark = 0; ++ if (!quark) ++ quark = g_quark_from_static_string ("gsd_subscription_manager_error"); ++ return quark; ++} ++ ++static GsdSubmanSubscriptionStatus ++_client_subscription_status_from_text (const gchar *status_txt) ++{ ++ if (g_strcmp0 (status_txt, "Unknown") == 0) ++ return GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN; ++ if (g_strcmp0 (status_txt, "Current") == 0) ++ return GSD_SUBMAN_SUBSCRIPTION_STATUS_VALID; ++ if (g_strcmp0 (status_txt, "Invalid") == 0) ++ return GSD_SUBMAN_SUBSCRIPTION_STATUS_INVALID; ++ if (g_strcmp0 (status_txt, "Disabled") == 0) ++ return GSD_SUBMAN_SUBSCRIPTION_STATUS_DISABLED; ++ if (g_strcmp0 (status_txt, "Insufficient") == 0) ++ return GSD_SUBMAN_SUBSCRIPTION_STATUS_PARTIALLY_VALID; ++ g_warning ("Unknown subscription status: %s", status_txt); // 'Current'? ++ return GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN; ++} ++ ++static void ++_emit_property_changed (GsdSubscriptionManager *manager, ++ const gchar *property_name, ++ GVariant *property_value) ++{ ++ GsdSubscriptionManagerPrivate *priv = manager->priv; ++ GVariantBuilder builder; ++ GVariantBuilder invalidated_builder; ++ ++ /* not yet connected */ ++ if (priv->connection == NULL) ++ return; ++ ++ /* build the dict */ ++ g_variant_builder_init (&invalidated_builder, G_VARIANT_TYPE ("as")); ++ g_variant_builder_init (&builder, G_VARIANT_TYPE_ARRAY); ++ g_variant_builder_add (&builder, ++ "{sv}", ++ property_name, ++ property_value); ++ g_dbus_connection_emit_signal (priv->connection, ++ NULL, ++ GSD_SUBSCRIPTION_DBUS_PATH, ++ "org.freedesktop.DBus.Properties", ++ "PropertiesChanged", ++ g_variant_new ("(sa{sv}as)", ++ GSD_SUBSCRIPTION_DBUS_INTERFACE, ++ &builder, ++ &invalidated_builder), ++ NULL); ++ g_variant_builder_clear (&builder); ++ g_variant_builder_clear (&invalidated_builder); ++} ++ ++static gboolean ++_client_subscription_status_update (GsdSubscriptionManager *manager, GError **error) ++{ ++ GsdSubscriptionManagerPrivate *priv = manager->priv; ++ JsonNode *json_root; ++ JsonObject *json_obj; ++ const gchar *json_txt = NULL; ++ const gchar *status_txt = NULL; ++ g_autoptr(GVariant) val = NULL; ++ g_autoptr(JsonParser) json_parser = json_parser_new (); ++ ++ /* save old value */ ++ priv->subscription_status_last = priv->subscription_status; ++ ++ val = g_dbus_proxy_call_sync (priv->proxies[_RHSM_INTERFACE_ENTITLEMENT], ++ "GetStatus", ++ g_variant_new ("(ss)", ++ "", /* assumed as 'now' */ ++ priv->userlang), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, NULL, error); ++ if (val == NULL) ++ return FALSE; ++ g_variant_get (val, "(&s)", &json_txt); ++ g_debug ("Entitlement.GetStatus JSON: %s", json_txt); ++ if (!json_parser_load_from_data (json_parser, json_txt, -1, error)) ++ return FALSE; ++ json_root = json_parser_get_root (json_parser); ++ json_obj = json_node_get_object (json_root); ++ if (!json_object_has_member (json_obj, "status")) { ++ g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_DATA, ++ "no Entitlement.GetStatus status in %s", json_txt); ++ return FALSE; ++ } ++ ++ status_txt = json_object_get_string_member (json_obj, "status"); ++ g_debug ("Entitlement.GetStatus: %s", status_txt); ++ priv->subscription_status = _client_subscription_status_from_text (status_txt); ++ ++ /* emit notification for g-c-c */ ++ if (priv->subscription_status != priv->subscription_status_last) { ++ _emit_property_changed (manager, "SubscriptionStatus", ++ g_variant_new_uint32 (priv->subscription_status)); ++ } ++ ++ return TRUE; ++} ++ ++static gboolean ++_client_syspurpose_update (GsdSubscriptionManager *manager, GError **error) ++{ ++ GsdSubscriptionManagerPrivate *priv = manager->priv; ++ JsonNode *json_root; ++ JsonObject *json_obj; ++ const gchar *json_txt = NULL; ++ g_autoptr(GVariant) val = NULL; ++ g_autoptr(JsonParser) json_parser = json_parser_new (); ++ ++ val = g_dbus_proxy_call_sync (priv->proxies[_RHSM_INTERFACE_SYSPURPOSE], ++ "GetSyspurpose", ++ g_variant_new ("(s)", priv->userlang), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, NULL, error); ++ if (val == NULL) ++ return FALSE; ++ g_variant_get (val, "(&s)", &json_txt); ++ g_debug ("Syspurpose.GetSyspurpose JSON: %s", json_txt); ++ if (!json_parser_load_from_data (json_parser, json_txt, -1, error)) ++ return FALSE; ++ json_root = json_parser_get_root (json_parser); ++ json_obj = json_node_get_object (json_root); ++ if (!json_object_has_member (json_obj, "status")) { ++ g_debug ("Syspurpose.GetSyspurpose: Unknown"); ++ return TRUE; ++ } ++ g_debug ("Syspurpose.GetSyspurpose: '%s", json_object_get_string_member (json_obj, "status")); ++ return TRUE; ++} ++ ++static gboolean ++_client_register_start (GsdSubscriptionManager *manager, GError **error) ++{ ++ GsdSubscriptionManagerPrivate *priv = manager->priv; ++ const gchar *address = NULL; ++ g_autoptr(GDBusProxy) proxy = NULL; ++ g_autoptr(GVariant) val = NULL; ++ ++ /* already started */ ++ if (priv->address != NULL) ++ return TRUE; ++ ++ /* apparently: "we can't send registration credentials over the regular ++ * system or session bus since those aren't really locked down..." */ ++ proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, ++ G_DBUS_PROXY_FLAGS_NONE, ++ NULL, ++ "com.redhat.RHSM1", ++ "/com/redhat/RHSM1/RegisterServer", ++ "com.redhat.RHSM1.RegisterServer", ++ NULL, error); ++ if (proxy == NULL) ++ return FALSE; ++ val = g_dbus_proxy_call_sync (proxy, "Start", ++ g_variant_new ("(s)", priv->userlang), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, NULL, error); ++ if (val == NULL) ++ return FALSE; ++ g_variant_get (val, "(&s)", &address); ++ g_debug ("RegisterServer.Start: %s", address); ++ priv->address = g_strdup (address); ++ return TRUE; ++} ++ ++static gboolean ++_client_register_stop (GsdSubscriptionManager *manager, GError **error) ++{ ++ GsdSubscriptionManagerPrivate *priv = manager->priv; ++ g_autoptr(GDBusProxy) proxy = NULL; ++ g_autoptr(GVariant) val = NULL; ++ ++ /* already started */ ++ if (priv->address == NULL) ++ return TRUE; ++ ++ /* stop registration server */ ++ proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, ++ G_DBUS_PROXY_FLAGS_NONE, ++ NULL, ++ "com.redhat.RHSM1", ++ "/com/redhat/RHSM1/RegisterServer", ++ "com.redhat.RHSM1.RegisterServer", ++ NULL, error); ++ if (proxy == NULL) ++ return FALSE; ++ val = g_dbus_proxy_call_sync (proxy, "Stop", ++ g_variant_new ("(s)", priv->userlang), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, NULL, error); ++ if (val == NULL) ++ return FALSE; ++ g_clear_pointer (&priv->address, g_free); ++ return TRUE; ++} ++ ++static gboolean ++_client_subprocess_wait_check (GSubprocess *subprocess, GError **error) ++{ ++ gint rc; ++ if (!g_subprocess_wait (subprocess, NULL, error)) { ++ g_prefix_error (error, "failed to run pkexec: "); ++ return FALSE; ++ } ++ rc = g_subprocess_get_exit_status (subprocess); ++ if (rc != 0) { ++ GInputStream *istream = g_subprocess_get_stderr_pipe (subprocess); ++ gchar buf[1024] = { 0x0 }; ++ gsize sz = 0; ++ g_input_stream_read_all (istream, buf, sizeof(buf) - 1, &sz, NULL, NULL); ++ if (sz == 0) { ++ g_set_error_literal (error, G_IO_ERROR, rc, ++ "Failed to run helper without stderr"); ++ return FALSE; ++ } ++ g_set_error_literal (error, G_IO_ERROR, rc, buf); ++ return FALSE; ++ } ++ return TRUE; ++} ++ ++typedef enum { ++ _NOTIFY_EXPIRED, ++ _NOTIFY_REGISTRATION_REQUIRED, ++ _NOTIFY_REGISTERED ++} _NotifyKind; ++ ++static void ++_show_notification (GsdSubscriptionManager *manager, _NotifyKind notify_kind) ++{ ++ GsdSubscriptionManagerPrivate *priv = manager->priv; ++ switch (notify_kind) { ++ case _NOTIFY_EXPIRED: ++ notify_notification_close (priv->notification_registered, NULL); ++ notify_notification_close (priv->notification_registration_required, NULL); ++ notify_notification_show (priv->notification_expired, NULL); ++ break; ++ case _NOTIFY_REGISTRATION_REQUIRED: ++ notify_notification_close (priv->notification_registered, NULL); ++ notify_notification_close (priv->notification_expired, NULL); ++ notify_notification_show (priv->notification_registration_required, NULL); ++ break; ++ case _NOTIFY_REGISTERED: ++ notify_notification_close (priv->notification_expired, NULL); ++ notify_notification_close (priv->notification_registration_required, NULL); ++ notify_notification_show (priv->notification_registered, NULL); ++ break; ++ default: ++ break; ++ } ++ g_timer_reset (priv->timer_last_notified); ++} ++ ++static void ++_client_maybe__show_notification (GsdSubscriptionManager *manager) ++{ ++ GsdSubscriptionManagerPrivate *priv = manager->priv; ++ ++ /* startup */ ++ if (priv->subscription_status_last == GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN && ++ priv->subscription_status == GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN) { ++ _show_notification (manager, _NOTIFY_REGISTRATION_REQUIRED); ++ return; ++ } ++ ++ /* something changed */ ++ if (priv->subscription_status_last != priv->subscription_status) { ++ g_debug ("transisition from subscription status '%s' to '%s'", ++ gsd_subman_subscription_status_to_string (priv->subscription_status_last), ++ gsd_subman_subscription_status_to_string (priv->subscription_status)); ++ ++ /* needs registration */ ++ if (priv->subscription_status_last == GSD_SUBMAN_SUBSCRIPTION_STATUS_VALID && ++ priv->subscription_status == GSD_SUBMAN_SUBSCRIPTION_STATUS_INVALID) { ++ _show_notification (manager, _NOTIFY_REGISTRATION_REQUIRED); ++ return; ++ } ++ ++ /* was unregistered */ ++ if (priv->subscription_status_last == GSD_SUBMAN_SUBSCRIPTION_STATUS_VALID && ++ priv->subscription_status == GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN) { ++ _show_notification (manager, _NOTIFY_REGISTRATION_REQUIRED); ++ return; ++ } ++ ++ /* registered */ ++ if (priv->subscription_status_last == GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN && ++ priv->subscription_status == GSD_SUBMAN_SUBSCRIPTION_STATUS_VALID && ++ g_timer_elapsed (priv->timer_last_notified, NULL) > 60) { ++ _show_notification (manager, _NOTIFY_REGISTERED); ++ return; ++ } ++ } ++ ++ /* nag again */ ++ if (priv->subscription_status == GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN && ++ g_timer_elapsed (priv->timer_last_notified, NULL) > 60 * 60 * 24) { ++ _show_notification (manager, _NOTIFY_REGISTRATION_REQUIRED); ++ return; ++ } ++ if (priv->subscription_status == GSD_SUBMAN_SUBSCRIPTION_STATUS_INVALID && ++ g_timer_elapsed (priv->timer_last_notified, NULL) > 60 * 60 * 24) { ++ _show_notification (manager, _NOTIFY_EXPIRED); ++ return; ++ } ++ if (priv->subscription_status == GSD_SUBMAN_SUBSCRIPTION_STATUS_PARTIALLY_VALID && ++ g_timer_elapsed (priv->timer_last_notified, NULL) > 60 * 60 * 24) { ++ _show_notification (manager, _NOTIFY_EXPIRED); ++ return; ++ } ++} ++ ++static gboolean ++_client_register_with_keys (GsdSubscriptionManager *manager, ++ const gchar *hostname, ++ const gchar *organisation, ++ const gchar *activation_key, ++ GError **error) ++{ ++ GsdSubscriptionManagerPrivate *priv = manager->priv; ++ g_autoptr(GSubprocess) subprocess = NULL; ++ ++ /* apparently: "we can't send registration credentials over the regular ++ * system or session bus since those aren't really locked down..." */ ++ if (!_client_register_start (manager, error)) ++ return FALSE; ++ g_debug ("spawning %s", LIBEXECDIR "/gsd-subman-helper"); ++ subprocess = g_subprocess_new (G_SUBPROCESS_FLAGS_STDERR_PIPE, error, ++ "pkexec", LIBEXECDIR "/gsd-subman-helper", ++ "--kind", "register-with-key", ++ "--address", priv->address, ++ "--hostname", hostname, ++ "--organisation", organisation, ++ "--activation-key", activation_key, ++ NULL); ++ if (subprocess == NULL) { ++ g_prefix_error (error, "failed to find pkexec: "); ++ return FALSE; ++ } ++ if (!_client_subprocess_wait_check (subprocess, error)) ++ return FALSE; ++ ++ /* FIXME: also do on error? */ ++ if (!_client_register_stop (manager, error)) ++ return FALSE; ++ if (!_client_subscription_status_update (manager, error)) ++ return FALSE; ++ _client_maybe__show_notification (manager); ++ ++ /* success */ ++ return TRUE; ++} ++ ++static gboolean ++_client_register (GsdSubscriptionManager *manager, ++ const gchar *hostname, ++ const gchar *organisation, ++ const gchar *username, ++ const gchar *password, ++ GError **error) ++{ ++ GsdSubscriptionManagerPrivate *priv = manager->priv; ++ g_autoptr(GSubprocess) subprocess = NULL; ++ ++ /* fallback */ ++ if (organisation == NULL) ++ organisation = ""; ++ ++ /* apparently: "we can't send registration credentials over the regular ++ * system or session bus since those aren't really locked down..." */ ++ if (!_client_register_start (manager, error)) ++ return FALSE; ++ g_debug ("spawning %s", LIBEXECDIR "/gsd-subman-helper"); ++ subprocess = g_subprocess_new (G_SUBPROCESS_FLAGS_STDERR_PIPE, error, ++ "pkexec", LIBEXECDIR "/gsd-subman-helper", ++ "--kind", "register-with-username", ++ "--address", priv->address, ++ "--hostname", hostname, ++ "--organisation", organisation, ++ "--username", username, ++ "--password", password, ++ NULL); ++ if (subprocess == NULL) { ++ g_prefix_error (error, "failed to find pkexec: "); ++ return FALSE; ++ } ++ if (!_client_subprocess_wait_check (subprocess, error)) ++ return FALSE; ++ ++ /* FIXME: also do on error? */ ++ if (!_client_register_stop (manager, error)) ++ return FALSE; ++ if (!_client_subscription_status_update (manager, error)) ++ return FALSE; ++ _client_maybe__show_notification (manager); ++ return TRUE; ++} ++ ++static gboolean ++_client_unregister (GsdSubscriptionManager *manager, GError **error) ++{ ++ g_autoptr(GSubprocess) subprocess = NULL; ++ ++ /* apparently: "we can't send registration credentials over the regular ++ * system or session bus since those aren't really locked down..." */ ++ if (!_client_register_start (manager, error)) ++ return FALSE; ++ g_debug ("spawning %s", LIBEXECDIR "/gsd-subman-helper"); ++ subprocess = g_subprocess_new (G_SUBPROCESS_FLAGS_STDERR_PIPE, error, ++ "pkexec", LIBEXECDIR "/gsd-subman-helper", ++ "--kind", "unregister", ++ NULL); ++ if (subprocess == NULL) { ++ g_prefix_error (error, "failed to find pkexec: "); ++ return FALSE; ++ } ++ if (!_client_subprocess_wait_check (subprocess, error)) ++ return FALSE; ++ if (!_client_subscription_status_update (manager, error)) ++ return FALSE; ++ _client_maybe__show_notification (manager); ++ return TRUE; ++} ++ ++static gboolean ++_client_update_config (GsdSubscriptionManager *manager, GError **error) ++{ ++ GsdSubscriptionManagerPrivate *priv = manager->priv; ++ g_autoptr(GVariant) val = NULL; ++ g_autoptr(GVariant) val_server = NULL; ++ g_autoptr(GVariantDict) dict = NULL; ++ GVariantIter iter; ++ gchar *key; ++ gchar *value; ++ ++ val = g_dbus_proxy_call_sync (priv->proxies[_RHSM_INTERFACE_CONFIG], ++ "GetAll", ++ g_variant_new ("(s)", priv->userlang), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, NULL, error); ++ if (val == NULL) ++ return FALSE; ++ dict = g_variant_dict_new (g_variant_get_child_value (val, 0)); ++ val_server = g_variant_dict_lookup_value (dict, "server", G_VARIANT_TYPE("a{ss}")); ++ if (val_server != NULL) { ++ g_variant_iter_init (&iter, val_server); ++ while (g_variant_iter_next (&iter, "{ss}", &key, &value)) { ++ g_debug ("%s=%s", key, value); ++ g_hash_table_insert (priv->config, ++ g_steal_pointer (&key), ++ g_steal_pointer (&value)); ++ } ++ } ++ return TRUE; ++} ++ ++static void ++_subman_proxy_signal_cb (GDBusProxy *proxy, ++ const gchar *sender_name, ++ const gchar *signal_name, ++ GVariant *parameters, ++ GsdSubscriptionManager *manager) ++{ ++ g_autoptr(GError) error = NULL; ++ if (!_client_syspurpose_update (manager, &error)) { ++ g_warning ("failed to update syspurpose: %s", error->message); ++ g_clear_error (&error); ++ } ++ if (!_client_subscription_status_update (manager, &error)) { ++ g_warning ("failed to update subscription status: %s", error->message); ++ g_clear_error (&error); ++ } ++ _client_maybe__show_notification (manager); ++} ++ ++static void ++_client_unload (GsdSubscriptionManager *manager) ++{ ++ GsdSubscriptionManagerPrivate *priv = manager->priv; ++ for (guint i = 0; i < _RHSM_INTERFACE_LAST; i++) ++ g_clear_object (&priv->proxies[i]); ++ g_hash_table_unref (priv->config); ++} ++ ++static const gchar * ++_rhsm_interface_to_string (_RhsmInterface kind) ++{ ++ if (kind == _RHSM_INTERFACE_CONFIG) ++ return "Config"; ++ if (kind == _RHSM_INTERFACE_REGISTER_SERVER) ++ return "RegisterServer"; ++ if (kind == _RHSM_INTERFACE_ATTACH) ++ return "Attach"; ++ if (kind == _RHSM_INTERFACE_ENTITLEMENT) ++ return "Entitlement"; ++ if (kind == _RHSM_INTERFACE_PRODUCTS) ++ return "Products"; ++ if (kind == _RHSM_INTERFACE_CONSUMER) ++ return "Consumer"; ++ if (kind == _RHSM_INTERFACE_SYSPURPOSE) ++ return "Syspurpose"; ++ return NULL; ++} ++ ++static gboolean ++_client_load (GsdSubscriptionManager *manager, GError **error) ++{ ++ GsdSubscriptionManagerPrivate *priv = manager->priv; ++ ++ priv->config = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); ++ ++ /* connect to all the interfaces on the *different* objects :| */ ++ for (guint i = 0; i < _RHSM_INTERFACE_LAST; i++) { ++ const gchar *kind = _rhsm_interface_to_string (i); ++ g_autofree gchar *opath = g_strdup_printf ("/com/redhat/RHSM1/%s", kind); ++ g_autofree gchar *iface = g_strdup_printf ("com.redhat.RHSM1.%s", kind); ++ priv->proxies[i] = ++ g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, ++ G_DBUS_PROXY_FLAGS_NONE, ++ NULL, ++ "com.redhat.RHSM1", ++ opath, iface, ++ NULL, ++ error); ++ if (priv->proxies[i] == NULL) ++ return FALSE; ++ /* we want to get notified if the status of the system changes */ ++ g_signal_connect (priv->proxies[i], "g-signal", ++ G_CALLBACK (_subman_proxy_signal_cb), manager); ++ } ++ ++ /* get initial status */ ++ priv->userlang = ""; ++ if (!_client_update_config (manager, error)) ++ return FALSE; ++ if (!_client_subscription_status_update (manager, error)) ++ return FALSE; ++ if (!_client_syspurpose_update (manager, error)) ++ return FALSE; ++ ++ /* success */ ++ return TRUE; ++} ++ ++gboolean ++gsd_subscription_manager_start (GsdSubscriptionManager *manager, GError **error) ++{ ++ gboolean ret; ++ g_debug ("Starting subscription manager"); ++ gnome_settings_profile_start (NULL); ++ ret = _client_load (manager, error); ++ _client_maybe__show_notification (manager); ++ gnome_settings_profile_end (NULL); ++ return ret; ++} ++ ++void ++gsd_subscription_manager_stop (GsdSubscriptionManager *manager) ++{ ++ g_debug ("Stopping subscription manager"); ++ _client_unload (manager); ++} ++ ++static void ++gsd_subscription_manager_class_init (GsdSubscriptionManagerClass *klass) ++{ ++ GObjectClass *object_class = G_OBJECT_CLASS (klass); ++ object_class->finalize = gsd_subscription_manager_finalize; ++ notify_init ("gnome-settings-daemon"); ++ g_type_class_add_private (klass, sizeof (GsdSubscriptionManagerPrivate)); ++} ++ ++static void ++_launch_info_overview (void) ++{ ++ const gchar *argv[] = { "gnome-control-center", "info-overview", NULL }; ++ g_debug ("Running gnome-control-center info-overview"); ++ g_spawn_async (NULL, (gchar **) argv, NULL, G_SPAWN_SEARCH_PATH, ++ NULL, NULL, NULL, NULL); ++} ++ ++static void ++_notify_closed_cb (NotifyNotification *notification, gpointer user_data) ++{ ++ /* FIXME: only launch when clicking on the main body, not the window close */ ++ if (notify_notification_get_closed_reason (notification) == 0x400) ++ _launch_info_overview (); ++} ++ ++static void ++_notify_clicked_cb (NotifyNotification *notification, char *action, gpointer user_data) ++{ ++ _launch_info_overview (); ++} ++ ++static void ++gsd_subscription_manager_init (GsdSubscriptionManager *manager) ++{ ++ GsdSubscriptionManagerPrivate *priv = manager->priv = GSD_SUBSCRIPTION_MANAGER_GET_PRIVATE (manager); ++ ++ priv->timer_last_notified = g_timer_new (); ++ ++ /* expired */ ++ priv->notification_expired = ++ notify_notification_new (_("Subscription Has Expired"), ++ _("Add or renew a subscription to continue receiving software updates."), ++ NULL); ++ notify_notification_set_app_name (priv->notification_expired, _("Subscription")); ++ notify_notification_set_hint_string (priv->notification_expired, "desktop-entry", "subman-panel"); ++ notify_notification_set_hint_string (priv->notification_expired, "x-gnome-privacy-scope", "system"); ++ notify_notification_set_urgency (priv->notification_expired, NOTIFY_URGENCY_CRITICAL); ++ notify_notification_add_action (priv->notification_expired, ++ "info-overview", _("Subscribe System…"), ++ _notify_clicked_cb, ++ manager, NULL); ++ g_signal_connect (priv->notification_expired, "closed", ++ G_CALLBACK (_notify_closed_cb), manager); ++ ++ /* registered */ ++ priv->notification_registered = ++ notify_notification_new (_("Registration Successful"), ++ _("The system has been registered and software updates have been enabled."), ++ NULL); ++ notify_notification_set_app_name (priv->notification_registered, _("Subscription")); ++ notify_notification_set_hint_string (priv->notification_registered, "desktop-entry", "subman-panel"); ++ notify_notification_set_hint_string (priv->notification_registered, "x-gnome-privacy-scope", "system"); ++ notify_notification_set_urgency (priv->notification_registered, NOTIFY_URGENCY_CRITICAL); ++ g_signal_connect (priv->notification_registered, "closed", ++ G_CALLBACK (_notify_closed_cb), manager); ++ ++ /* registration required */ ++ priv->notification_registration_required = ++ notify_notification_new (_("System Not Registered"), ++ _("Please register your system to receive software updates."), ++ NULL); ++ notify_notification_set_app_name (priv->notification_registration_required, _("Subscription")); ++ notify_notification_set_hint_string (priv->notification_registration_required, "desktop-entry", "subman-panel"); ++ notify_notification_set_hint_string (priv->notification_registration_required, "x-gnome-privacy-scope", "system"); ++ notify_notification_set_urgency (priv->notification_registration_required, NOTIFY_URGENCY_CRITICAL); ++ notify_notification_add_action (priv->notification_registration_required, ++ "info-overview", _("Register System…"), ++ _notify_clicked_cb, ++ manager, NULL); ++ g_signal_connect (priv->notification_registration_required, "closed", ++ G_CALLBACK (_notify_closed_cb), manager); ++} ++ ++static void ++gsd_subscription_manager_finalize (GObject *object) ++{ ++ GsdSubscriptionManager *manager; ++ ++ g_return_if_fail (object != NULL); ++ g_return_if_fail (GSD_IS_SUBSCRIPTION_MANAGER (object)); ++ ++ manager = GSD_SUBSCRIPTION_MANAGER (object); ++ ++ gsd_subscription_manager_stop (manager); ++ ++ if (manager->priv->bus_cancellable != NULL) { ++ g_cancellable_cancel (manager->priv->bus_cancellable); ++ g_clear_object (&manager->priv->bus_cancellable); ++ } ++ ++ g_clear_pointer (&manager->priv->introspection_data, g_dbus_node_info_unref); ++ g_clear_object (&manager->priv->connection); ++ g_clear_object (&manager->priv->notification_expired); ++ g_clear_object (&manager->priv->notification_registered); ++ g_timer_destroy (manager->priv->timer_last_notified); ++ ++ if (manager->priv->name_id != 0) { ++ g_bus_unown_name (manager->priv->name_id); ++ manager->priv->name_id = 0; ++ } ++ ++ G_OBJECT_CLASS (gsd_subscription_manager_parent_class)->finalize (object); ++} ++ ++static void ++handle_method_call (GDBusConnection *connection, ++ const gchar *sender, ++ const gchar *object_path, ++ const gchar *interface_name, ++ const gchar *method_name, ++ GVariant *parameters, ++ GDBusMethodInvocation *invocation, ++ gpointer user_data) ++{ ++ GsdSubscriptionManager *manager = GSD_SUBSCRIPTION_MANAGER (user_data); ++ g_autoptr(GError) error = NULL; ++ ++ if (g_strcmp0 (method_name, "Register") == 0) { ++ const gchar *organisation = NULL; ++ const gchar *hostname = NULL; ++ ++ if (FALSE) { ++ g_dbus_method_invocation_return_error_literal (invocation, ++ G_IO_ERROR, G_IO_ERROR_NOT_INITIALIZED, ++ "Cannot register at this time"); ++ ++ return; ++ } ++ ++ g_autoptr(GVariantDict) dict = g_variant_dict_new (g_variant_get_child_value (parameters, 0)); ++ ++ const gchar *kind = NULL; ++ if (!g_variant_dict_lookup (dict, "kind", "&s", &kind)) { ++ g_dbus_method_invocation_return_error_literal (invocation, ++ G_IO_ERROR, G_IO_ERROR_FAILED, ++ "No kind specified"); ++ ++ return; ++ } ++ if (g_strcmp0 (kind, "username") == 0) { ++ const gchar *username = NULL; ++ const gchar *password = NULL; ++ g_variant_dict_lookup (dict, "hostname", "&s", &hostname); ++ g_variant_dict_lookup (dict, "organisation", "&s", &organisation); ++ g_variant_dict_lookup (dict, "username", "&s", &username); ++ g_variant_dict_lookup (dict, "password", "&s", &password); ++ if (!_client_register (manager, ++ hostname, ++ organisation, ++ username, ++ password, ++ &error)) { ++ g_dbus_method_invocation_return_gerror (invocation, error); ++ return; ++ } ++ } else if (g_strcmp0 (kind, "key") == 0) { ++ const gchar *activation_key = NULL; ++ g_variant_dict_lookup (dict, "hostname", "&s", &hostname); ++ g_variant_dict_lookup (dict, "organisation", "&s", &organisation); ++ g_variant_dict_lookup (dict, "activation-key", "&s", &activation_key); ++ if (!_client_register_with_keys (manager, ++ hostname, ++ organisation, ++ activation_key, ++ &error)) { ++ g_dbus_method_invocation_return_gerror (invocation, error); ++ return; ++ } ++ } else { ++ g_dbus_method_invocation_return_error_literal (invocation, ++ G_IO_ERROR, G_IO_ERROR_FAILED, ++ "Invalid kind specified"); ++ ++ return; ++ } ++ g_dbus_method_invocation_return_value (invocation, NULL); ++ } else if (g_strcmp0 (method_name, "Unregister") == 0) { ++ if (!_client_unregister (manager, &error)) { ++ g_dbus_method_invocation_return_gerror (invocation, error); ++ return; ++ } ++ g_dbus_method_invocation_return_value (invocation, NULL); ++ } else { ++ g_assert_not_reached (); ++ } ++} ++ ++static GVariant * ++handle_get_property (GDBusConnection *connection, ++ const gchar *sender, ++ const gchar *object_path, ++ const gchar *interface_name, ++ const gchar *property_name, ++ GError **error, gpointer user_data) ++{ ++ GsdSubscriptionManager *manager = GSD_SUBSCRIPTION_MANAGER (user_data); ++ GsdSubscriptionManagerPrivate *priv = manager->priv; ++ ++ if (g_strcmp0 (interface_name, GSD_SUBSCRIPTION_DBUS_INTERFACE) != 0) { ++ g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_FAILED, ++ "No such interface: %s", interface_name); ++ return NULL; ++ } ++ ++ if (g_strcmp0 (property_name, "SubscriptionStatus") == 0) ++ return g_variant_new_uint32 (priv->subscription_status); ++ ++ g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_FAILED, ++ "Failed to get property: %s", property_name); ++ return NULL; ++} ++ ++static gboolean ++handle_set_property (GDBusConnection *connection, ++ const gchar *sender, ++ const gchar *object_path, ++ const gchar *interface_name, ++ const gchar *property_name, ++ GVariant *value, ++ GError **error, gpointer user_data) ++{ ++ if (g_strcmp0 (interface_name, GSD_SUBSCRIPTION_DBUS_INTERFACE) != 0) { ++ g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_FAILED, ++ "No such interface: %s", interface_name); ++ return FALSE; ++ } ++ g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_FAILED, ++ "No such property: %s", property_name); ++ return FALSE; ++} ++ ++static const GDBusInterfaceVTable interface_vtable = ++{ ++ handle_method_call, ++ handle_get_property, ++ handle_set_property ++}; ++ ++static void ++name_lost_handler_cb (GDBusConnection *connection, const gchar *name, gpointer user_data) ++{ ++ g_debug ("lost name, so exiting"); ++ gtk_main_quit (); ++} ++ ++static void ++on_bus_gotten (GObject *source_object, GAsyncResult *res, GsdSubscriptionManager *manager) ++{ ++ GsdSubscriptionManagerPrivate *priv = manager->priv; ++ GDBusConnection *connection; ++ g_autoptr(GError) error = NULL; ++ ++ connection = g_bus_get_finish (res, &error); ++ if (connection == NULL) { ++ if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) ++ g_warning ("Could not get session bus: %s", error->message); ++ return; ++ } ++ ++ priv->connection = connection; ++ g_dbus_connection_register_object (connection, ++ GSD_SUBSCRIPTION_DBUS_PATH, ++ priv->introspection_data->interfaces[0], ++ &interface_vtable, ++ manager, ++ NULL, ++ NULL); ++ priv->name_id = g_bus_own_name_on_connection (connection, ++ GSD_SUBSCRIPTION_DBUS_NAME, ++ G_BUS_NAME_OWNER_FLAGS_NONE, ++ NULL, ++ name_lost_handler_cb, ++ manager, ++ NULL); ++} ++ ++static void ++register_manager_dbus (GsdSubscriptionManager *manager) ++{ ++ GsdSubscriptionManagerPrivate *priv = manager->priv; ++ ++ priv->introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, NULL); ++ g_assert (priv->introspection_data != NULL); ++ priv->bus_cancellable = g_cancellable_new (); ++ ++ g_bus_get (G_BUS_TYPE_SESSION, priv->bus_cancellable, ++ (GAsyncReadyCallback) on_bus_gotten, manager); ++} ++ ++GsdSubscriptionManager * ++gsd_subscription_manager_new (void) ++{ ++ if (manager_object != NULL) { ++ g_object_ref (manager_object); ++ } else { ++ manager_object = g_object_new (GSD_TYPE_SUBSCRIPTION_MANAGER, NULL); ++ g_object_add_weak_pointer (manager_object, ++ (gpointer *) &manager_object); ++ register_manager_dbus (manager_object); ++ } ++ ++ return GSD_SUBSCRIPTION_MANAGER (manager_object); ++} +diff --git a/plugins/subman/gsd-subscription-manager.h b/plugins/subman/gsd-subscription-manager.h +new file mode 100644 +index 00000000..6a524b1b +--- /dev/null ++++ b/plugins/subman/gsd-subscription-manager.h +@@ -0,0 +1,63 @@ ++/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- ++ * ++ * Copyright (C) 2019 Richard Hughes ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, see . ++ * ++ */ ++ ++#ifndef __GSD_SUBSCRIPTION_MANAGER_H ++#define __GSD_SUBSCRIPTION_MANAGER_H ++ ++#include ++ ++G_BEGIN_DECLS ++ ++#define GSD_TYPE_SUBSCRIPTION_MANAGER (gsd_subscription_manager_get_type ()) ++#define GSD_SUBSCRIPTION_MANAGER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GSD_TYPE_SUBSCRIPTION_MANAGER, GsdSubscriptionManager)) ++#define GSD_SUBSCRIPTION_MANAGER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GSD_TYPE_SUBSCRIPTION_MANAGER, GsdSubscriptionManagerClass)) ++#define GSD_IS_SUBSCRIPTION_MANAGER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GSD_TYPE_SUBSCRIPTION_MANAGER)) ++#define GSD_IS_SUBSCRIPTION_MANAGER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GSD_TYPE_SUBSCRIPTION_MANAGER)) ++#define GSD_SUBSCRIPTION_MANAGER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GSD_TYPE_SUBSCRIPTION_MANAGER, GsdSubscriptionManagerClass)) ++#define GSD_SUBSCRIPTION_MANAGER_ERROR (gsd_subscription_manager_error_quark ()) ++ ++typedef struct GsdSubscriptionManagerPrivate GsdSubscriptionManagerPrivate; ++ ++typedef struct ++{ ++ GObject parent; ++ GsdSubscriptionManagerPrivate *priv; ++} GsdSubscriptionManager; ++ ++typedef struct ++{ ++ GObjectClass parent_class; ++} GsdSubscriptionManagerClass; ++ ++enum ++{ ++ GSD_SUBSCRIPTION_MANAGER_ERROR_FAILED ++}; ++ ++GType gsd_subscription_manager_get_type (void); ++GQuark gsd_subscription_manager_error_quark (void); ++ ++GsdSubscriptionManager *gsd_subscription_manager_new (void); ++gboolean gsd_subscription_manager_start (GsdSubscriptionManager *manager, ++ GError **error); ++void gsd_subscription_manager_stop (GsdSubscriptionManager *manager); ++ ++G_END_DECLS ++ ++#endif /* __GSD_SUBSCRIPTION_MANAGER_H */ +diff --git a/plugins/subman/main.c b/plugins/subman/main.c +new file mode 100644 +index 00000000..28ac995b +--- /dev/null ++++ b/plugins/subman/main.c +@@ -0,0 +1,8 @@ ++#define NEW gsd_subscription_manager_new ++#define START gsd_subscription_manager_start ++#define STOP gsd_subscription_manager_stop ++#define MANAGER GsdSubscriptionManager ++#define GDK_BACKEND "x11" ++#include "gsd-subscription-manager.h" ++ ++#include "daemon-skeleton-gtk.h" +diff --git a/plugins/subman/meson.build b/plugins/subman/meson.build +new file mode 100644 +index 00000000..bfd073b6 +--- /dev/null ++++ b/plugins/subman/meson.build +@@ -0,0 +1,56 @@ ++sources = files( ++ 'gsd-subscription-manager.c', ++ 'gsd-subman-common.c', ++ 'main.c' ++) ++ ++deps = plugins_deps + [ ++ libnotify_dep, ++ gtk_dep, ++ jsonglib_dep, ++ m_dep, ++] ++ ++cflags += ['-DBINDIR="@0@"'.format(gsd_bindir)] ++cflags += ['-DLIBEXECDIR="@0@"'.format(gsd_libexecdir)] ++ ++executable( ++ 'gsd-' + plugin_name, ++ sources, ++ include_directories: [top_inc, common_inc], ++ dependencies: deps, ++ c_args: cflags, ++ install: true, ++ install_rpath: gsd_pkglibdir, ++ install_dir: gsd_libexecdir ++) ++ ++# .Register needs to be called from root as subman can't do PolicyKit... ++policy = 'org.gnome.settings-daemon.plugins.subman.policy' ++policy_in = configure_file( ++ input: policy + '.in.in', ++ output: policy + '.in', ++ configuration: plugins_conf ++) ++ ++i18n.merge_file( ++ policy, ++ input: policy_in, ++ output: policy, ++ po_dir: po_dir, ++ install: true, ++ install_dir: join_paths(gsd_datadir, 'polkit-1', 'actions') ++) ++ ++install_data('org.gnome.settings-daemon.plugins.subman.rules', ++ install_dir : join_paths(gsd_datadir, 'polkit-1', 'rules.d')) ++ ++executable( ++ 'gsd-subman-helper', ++ 'gsd-subman-helper.c', ++ include_directories: top_inc, ++ dependencies: [gio_dep, jsonglib_dep], ++ install: true, ++ install_rpath: gsd_pkglibdir, ++ install_dir: gsd_libexecdir ++) +diff --git a/plugins/subman/org.gnome.SettingsDaemon.Subscription.desktop.in b/plugins/subman/org.gnome.SettingsDaemon.Subscription.desktop.in +new file mode 100644 +index 00000000..14fe5915 +--- /dev/null ++++ b/plugins/subman/org.gnome.SettingsDaemon.Subscription.desktop.in +@@ -0,0 +1,9 @@ ++[Desktop Entry] ++Type=Application ++Name=GNOME Settings Daemon's subscription manager plugin ++Exec=@libexecdir@/gsd-subman ++OnlyShowIn=GNOME; ++NoDisplay=true ++X-GNOME-Autostart-Phase=Initialization ++X-GNOME-Autostart-Notify=true ++X-GNOME-AutoRestart=true +diff --git a/plugins/subman/org.gnome.settings-daemon.plugins.subman.policy.in.in b/plugins/subman/org.gnome.settings-daemon.plugins.subman.policy.in.in +new file mode 100644 +index 00000000..59e9fdd4 +--- /dev/null ++++ b/plugins/subman/org.gnome.settings-daemon.plugins.subman.policy.in.in +@@ -0,0 +1,27 @@ ++ ++ ++ ++ ++ ++ ++ GNOME Settings Daemon ++ http://git.gnome.org/browse/gnome-settings-daemon ++ emblem-synchronizing ++ ++ ++ Register the system ++ Authentication is required to register the system ++ ++ no ++ no ++ auth_admin_keep ++ ++ @libexecdir@/gsd-subman-helper ++ ++ ++ +diff --git a/plugins/subman/org.gnome.settings-daemon.plugins.subman.rules b/plugins/subman/org.gnome.settings-daemon.plugins.subman.rules +new file mode 100644 +index 00000000..1ed3a0ea +--- /dev/null ++++ b/plugins/subman/org.gnome.settings-daemon.plugins.subman.rules +@@ -0,0 +1,7 @@ ++polkit.addRule(function(action, subject) { ++ if (action.id == "org.gnome.settings-daemon.plugins.subman.register" && ++ subject.active == true && subject.local == true && ++ subject.isInGroup("wheel")) { ++ return polkit.Result.YES; ++ } ++}); +-- +2.30.0 + diff --git a/0001-xsettings-Add-an-entry-for-the-overlay-scrolling-set.patch b/0001-xsettings-Add-an-entry-for-the-overlay-scrolling-set.patch new file mode 100644 index 0000000..0ec6921 --- /dev/null +++ b/0001-xsettings-Add-an-entry-for-the-overlay-scrolling-set.patch @@ -0,0 +1,25 @@ +From 6e790966c2b6e1db8dd2c145119d3fdd19e0c18f Mon Sep 17 00:00:00 2001 +From: Matthias Clasen +Date: Wed, 22 May 2019 16:04:42 -0400 +Subject: [PATCH] xsettings: Add an entry for the overlay scrolling setting + +This will be used by GTK. +--- + plugins/xsettings/gsd-xsettings-manager.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/plugins/xsettings/gsd-xsettings-manager.c b/plugins/xsettings/gsd-xsettings-manager.c +index c3ac7892..4164de40 100644 +--- a/plugins/xsettings/gsd-xsettings-manager.c ++++ b/plugins/xsettings/gsd-xsettings-manager.c +@@ -478,6 +478,7 @@ static TranslationEntry translations [] = { + { "org.gnome.desktop.interface", "icon-theme", "Net/IconThemeName", translate_string_string }, + { "org.gnome.desktop.interface", "cursor-theme", "Gtk/CursorThemeName", translate_string_string }, + { "org.gnome.desktop.interface", "gtk-enable-primary-paste", "Gtk/EnablePrimaryPaste", translate_bool_int }, ++ { "org.gnome.desktop.interface", "overlay-scrolling", "Gtk/OverlayScrolling", translate_bool_int }, + /* cursor-size is handled via the Xft side as it needs the scaling factor */ + + { "org.gnome.desktop.sound", "theme-name", "Net/SoundThemeName", translate_string_string }, +-- +2.23.0 + diff --git a/0002-account-reshow-the-notification-when-screen-unlocks.patch b/0002-account-reshow-the-notification-when-screen-unlocks.patch new file mode 100644 index 0000000..858b737 --- /dev/null +++ b/0002-account-reshow-the-notification-when-screen-unlocks.patch @@ -0,0 +1,271 @@ +From ad0fd6c905011b7bb9eac9fa8cb91f58d71e4a29 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Mon, 6 Nov 2017 15:49:58 -0500 +Subject: [PATCH 2/4] account: reshow the notification when screen unlocks + +--- + plugins/account/gsd-account-manager.c | 48 ++++++++++++++++++++++++--- + 1 file changed, 43 insertions(+), 5 deletions(-) + +diff --git a/plugins/account/gsd-account-manager.c b/plugins/account/gsd-account-manager.c +index 40b91cb6..cb37f466 100644 +--- a/plugins/account/gsd-account-manager.c ++++ b/plugins/account/gsd-account-manager.c +@@ -11,72 +11,75 @@ + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ + + #include "config.h" + + #include + #include + #include + #include + #include + #include + #include + + #include + + #include + #include + #include + + #include + #include + #include + + #include "gnome-settings-profile.h" ++#include "gnome-settings-bus.h" + #include "gsd-account-manager.h" + #include "org.freedesktop.Accounts.h" + #include "org.freedesktop.Accounts.User.h" + + #define GSD_ACCOUNT_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GSD_TYPE_ACCOUNT_MANAGER, GsdAccountManagerPrivate)) + + struct GsdAccountManagerPrivate + { + GsdAccounts *accounts_proxy; + GsdAccountsUser *accounts_user_proxy; + GCancellable *cancellable; + ++ GsdScreenSaver *screensaver_proxy; ++ + gint64 expiration_time; + gint64 last_change_time; + gint64 min_days_between_changes; + gint64 max_days_between_changes; + gint64 days_to_warn; + gint64 days_after_expiration_until_lock; + + NotifyNotification *notification; + }; + + static void gsd_account_manager_class_init (GsdAccountManagerClass *klass); + static void gsd_account_manager_init (GsdAccountManager *account_manager); + static void gsd_account_manager_finalize (GObject *object); + + G_DEFINE_TYPE (GsdAccountManager, gsd_account_manager, G_TYPE_OBJECT) + + static gpointer manager_object = NULL; + + static void + on_notification_closed (NotifyNotification *notification, + gpointer user_data) + { + GsdAccountManager *manager = user_data; + + g_clear_object (&manager->priv->notification); + } + + static void + hide_notification (GsdAccountManager *manager) + { +@@ -221,77 +224,111 @@ on_got_password_expiration_policy (GsdAccountsUser *accounts_user_proxy, + gint64 days_after_expiration_until_lock; + + gnome_settings_profile_start (NULL); + succeeded = gsd_accounts_user_call_get_password_expiration_policy_finish (accounts_user_proxy, + &expiration_time, + &last_change_time, + &min_days_between_changes, + &max_days_between_changes, + &days_to_warn, + &days_after_expiration_until_lock, + res, + &error); + + if (!succeeded) { + g_warning ("Failed to get password expiration policy for user: %s", error->message); + goto out; + } + + set_policy_number (&manager->priv->expiration_time, expiration_time); + set_policy_number (&manager->priv->last_change_time, last_change_time); + set_policy_number (&manager->priv->min_days_between_changes, min_days_between_changes); + set_policy_number (&manager->priv->max_days_between_changes, max_days_between_changes); + set_policy_number (&manager->priv->days_to_warn, days_to_warn); + set_policy_number (&manager->priv->days_after_expiration_until_lock, days_after_expiration_until_lock); + + update_password_notification (manager); + out: + gnome_settings_profile_end (NULL); + } + ++static void ++fetch_password_expiration_policy (GsdAccountManager *manager) ++{ ++ gsd_accounts_user_call_get_password_expiration_policy (manager->priv->accounts_user_proxy, ++ manager->priv->cancellable, ++ (GAsyncReadyCallback) ++ on_got_password_expiration_policy, ++ manager); ++} ++ ++static void ++on_screensaver_signal (GDBusProxy *proxy, ++ const gchar *sender_name, ++ const gchar *signal_name, ++ GVariant *parameters, ++ gpointer user_data) ++{ ++ GsdAccountManager *manager = user_data; ++ ++ if (g_strcmp0 (signal_name, "ActiveChanged") == 0) { ++ gboolean active; ++ ++ g_variant_get (parameters, "(b)", &active); ++ ++ if (!active) { ++ fetch_password_expiration_policy (manager); ++ } ++ } ++} ++ + static void + on_got_accounts_user_proxy (GObject *source_object, + GAsyncResult *res, + gpointer user_data) + { + GsdAccountManager *manager = user_data; + g_autoptr(GError) error = NULL; + + gnome_settings_profile_start (NULL); + manager->priv->accounts_user_proxy = gsd_accounts_user_proxy_new_finish (res, &error); + + if (manager->priv->accounts_user_proxy != NULL) { +- gsd_accounts_user_call_get_password_expiration_policy (manager->priv->accounts_user_proxy, +- manager->priv->cancellable, +- (GAsyncReadyCallback) +- on_got_password_expiration_policy, +- manager); ++ fetch_password_expiration_policy (manager); ++ ++ manager->priv->screensaver_proxy = gnome_settings_bus_get_screen_saver_proxy (); ++ ++ g_signal_connect (manager->priv->screensaver_proxy, ++ "g-signal", ++ G_CALLBACK (on_screensaver_signal), ++ manager); ++ + } else { + g_warning ("Failed to get user proxy to accounts service: %s", error->message); + goto out; + } + + out: + gnome_settings_profile_end (NULL); + } + + static void + on_got_user_object_path (GsdAccounts *accounts_proxy, + GAsyncResult *res, + gpointer user_data) + { + GsdAccountManager *manager = user_data; + g_autoptr(GError) error = NULL; + gboolean succeeded; + gchar *object_path; + GDBusConnection *connection; + + gnome_settings_profile_start (NULL); + + succeeded = gsd_accounts_call_find_user_by_id_finish (accounts_proxy, + &object_path, + res, + &error); + + if (!succeeded) { + g_warning ("Unable to find current user in accounts service: %s", + error->message); +@@ -343,60 +380,61 @@ gsd_account_manager_start (GsdAccountManager *manager, + g_debug ("Starting accounts manager"); + + gnome_settings_profile_start (NULL); + manager->priv->cancellable = g_cancellable_new (); + gsd_accounts_proxy_new_for_bus (G_BUS_TYPE_SYSTEM, + G_DBUS_PROXY_FLAGS_NONE, + "org.freedesktop.Accounts", + "/org/freedesktop/Accounts", + manager->priv->cancellable, + (GAsyncReadyCallback) + on_got_accounts_proxy, + manager); + gnome_settings_profile_end (NULL); + + return TRUE; + } + + void + gsd_account_manager_stop (GsdAccountManager *manager) + { + g_debug ("Stopping accounts manager"); + + if (manager->priv->cancellable != NULL) { + g_cancellable_cancel (manager->priv->cancellable); + g_clear_object (&manager->priv->cancellable); + } + + g_clear_object (&manager->priv->accounts_proxy); + g_clear_object (&manager->priv->accounts_user_proxy); + g_clear_object (&manager->priv->notification); ++ g_clear_object (&manager->priv->screensaver_proxy); + } + + static void + gsd_account_manager_class_init (GsdAccountManagerClass *klass) + { + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->finalize = gsd_account_manager_finalize; + + notify_init ("gnome-settings-daemon"); + + g_type_class_add_private (klass, sizeof (GsdAccountManagerPrivate)); + } + + static void + gsd_account_manager_init (GsdAccountManager *manager) + { + manager->priv = GSD_ACCOUNT_MANAGER_GET_PRIVATE (manager); + } + + static void + gsd_account_manager_finalize (GObject *object) + { + GsdAccountManager *manager; + + g_return_if_fail (object != NULL); + g_return_if_fail (GSD_IS_ACCOUNT_MANAGER (object)); + + manager = GSD_ACCOUNT_MANAGER (object); + +-- +2.21.0 + diff --git a/0002-subman-Add-InstalledProducts-dbus-property-for-g-c-c.patch b/0002-subman-Add-InstalledProducts-dbus-property-for-g-c-c.patch new file mode 100644 index 0000000..c7505ab --- /dev/null +++ b/0002-subman-Add-InstalledProducts-dbus-property-for-g-c-c.patch @@ -0,0 +1,768 @@ +From f723ed1078e050c4d966d40b2aea74970c74279c Mon Sep 17 00:00:00 2001 +From: Kalev Lember +Date: Thu, 27 Jun 2019 16:12:00 +0200 +Subject: [PATCH 02/15] subman: Add InstalledProducts dbus property for g-c-c + +--- + plugins/subman/gsd-subscription-manager.c | 135 ++++++++++++++++++++++ + 1 file changed, 135 insertions(+) + +diff --git a/plugins/subman/gsd-subscription-manager.c b/plugins/subman/gsd-subscription-manager.c +index 08b13fa6..a8c18a26 100644 +--- a/plugins/subman/gsd-subscription-manager.c ++++ b/plugins/subman/gsd-subscription-manager.c +@@ -1,186 +1,304 @@ + /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2019 Richard Hughes ++ * Copyright (C) 2019 Kalev Lember + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ + + #include "config.h" + + #include + #include + #include + #include + #include + + #include "gnome-settings-profile.h" + #include "gsd-subman-common.h" + #include "gsd-subscription-manager.h" + + #define GSD_DBUS_NAME "org.gnome.SettingsDaemon" + #define GSD_DBUS_PATH "/org/gnome/SettingsDaemon" + #define GSD_DBUS_BASE_INTERFACE "org.gnome.SettingsDaemon" + + #define GSD_SUBSCRIPTION_DBUS_NAME GSD_DBUS_NAME ".Subscription" + #define GSD_SUBSCRIPTION_DBUS_PATH GSD_DBUS_PATH "/Subscription" + #define GSD_SUBSCRIPTION_DBUS_INTERFACE GSD_DBUS_BASE_INTERFACE ".Subscription" + + static const gchar introspection_xml[] = + "" + " " + " " + " " + " " + " " ++" " + " " + " " + ""; + + #define GSD_SUBSCRIPTION_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GSD_TYPE_SUBSCRIPTION_MANAGER, GsdSubscriptionManagerPrivate)) + + typedef enum { + _RHSM_INTERFACE_CONFIG, + _RHSM_INTERFACE_REGISTER_SERVER, + _RHSM_INTERFACE_ATTACH, + _RHSM_INTERFACE_ENTITLEMENT, + _RHSM_INTERFACE_PRODUCTS, + _RHSM_INTERFACE_CONSUMER, + _RHSM_INTERFACE_SYSPURPOSE, + _RHSM_INTERFACE_LAST + } _RhsmInterface; + + struct GsdSubscriptionManagerPrivate + { + /* D-Bus */ + guint name_id; + GDBusNodeInfo *introspection_data; + GDBusConnection *connection; + GCancellable *bus_cancellable; + + GDBusProxy *proxies[_RHSM_INTERFACE_LAST]; + const gchar *userlang; /* owned by GLib internally */ + GHashTable *config; /* str:str */ ++ GPtrArray *installed_products; + gchar *address; + + GTimer *timer_last_notified; + NotifyNotification *notification_expired; + NotifyNotification *notification_registered; + NotifyNotification *notification_registration_required; + GsdSubmanSubscriptionStatus subscription_status; + GsdSubmanSubscriptionStatus subscription_status_last; + }; + + enum { + PROP_0, + }; + + static void gsd_subscription_manager_class_init (GsdSubscriptionManagerClass *klass); + static void gsd_subscription_manager_init (GsdSubscriptionManager *subscription_manager); + static void gsd_subscription_manager_finalize (GObject *object); + + G_DEFINE_TYPE (GsdSubscriptionManager, gsd_subscription_manager, G_TYPE_OBJECT) + ++typedef struct ++{ ++ gchar *product_name; ++ gchar *product_id; ++ gchar *version; ++ gchar *arch; ++ gchar *status; ++ gchar *starts; ++ gchar *ends; ++} ProductData; ++ ++static void ++product_data_free (ProductData *product) ++{ ++ g_free (product->product_name); ++ g_free (product->product_id); ++ g_free (product->version); ++ g_free (product->arch); ++ g_free (product->status); ++ g_free (product->starts); ++ g_free (product->ends); ++ g_free (product); ++} ++ ++G_DEFINE_AUTOPTR_CLEANUP_FUNC (ProductData, product_data_free); ++ + static gpointer manager_object = NULL; + + GQuark + gsd_subscription_manager_error_quark (void) + { + static GQuark quark = 0; + if (!quark) + quark = g_quark_from_static_string ("gsd_subscription_manager_error"); + return quark; + } + + static GsdSubmanSubscriptionStatus + _client_subscription_status_from_text (const gchar *status_txt) + { + if (g_strcmp0 (status_txt, "Unknown") == 0) + return GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN; + if (g_strcmp0 (status_txt, "Current") == 0) + return GSD_SUBMAN_SUBSCRIPTION_STATUS_VALID; + if (g_strcmp0 (status_txt, "Invalid") == 0) + return GSD_SUBMAN_SUBSCRIPTION_STATUS_INVALID; + if (g_strcmp0 (status_txt, "Disabled") == 0) + return GSD_SUBMAN_SUBSCRIPTION_STATUS_DISABLED; + if (g_strcmp0 (status_txt, "Insufficient") == 0) + return GSD_SUBMAN_SUBSCRIPTION_STATUS_PARTIALLY_VALID; + g_warning ("Unknown subscription status: %s", status_txt); // 'Current'? + return GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN; + } + ++static GVariant * ++_make_installed_products_variant (GPtrArray *installed_products) ++{ ++ GVariantBuilder builder; ++ g_variant_builder_init (&builder, G_VARIANT_TYPE ("aa{sv}")); ++ ++ for (guint i = 0; i < installed_products->len; i++) { ++ ProductData *product = g_ptr_array_index (installed_products, i); ++ g_auto(GVariantDict) dict; ++ ++ g_variant_dict_init (&dict, NULL); ++ ++ g_variant_dict_insert (&dict, "product-name", "s", product->product_name); ++ g_variant_dict_insert (&dict, "product-id", "s", product->product_id); ++ g_variant_dict_insert (&dict, "version", "s", product->version); ++ g_variant_dict_insert (&dict, "arch", "s", product->arch); ++ g_variant_dict_insert (&dict, "status", "s", product->status); ++ g_variant_dict_insert (&dict, "starts", "s", product->starts); ++ g_variant_dict_insert (&dict, "ends", "s", product->ends); ++ ++ g_variant_builder_add_value (&builder, g_variant_dict_end (&dict)); ++ } ++ ++ return g_variant_builder_end (&builder); ++} ++ + static void + _emit_property_changed (GsdSubscriptionManager *manager, + const gchar *property_name, + GVariant *property_value) + { + GsdSubscriptionManagerPrivate *priv = manager->priv; + GVariantBuilder builder; + GVariantBuilder invalidated_builder; + + /* not yet connected */ + if (priv->connection == NULL) + return; + + /* build the dict */ + g_variant_builder_init (&invalidated_builder, G_VARIANT_TYPE ("as")); + g_variant_builder_init (&builder, G_VARIANT_TYPE_ARRAY); + g_variant_builder_add (&builder, + "{sv}", + property_name, + property_value); + g_dbus_connection_emit_signal (priv->connection, + NULL, + GSD_SUBSCRIPTION_DBUS_PATH, + "org.freedesktop.DBus.Properties", + "PropertiesChanged", + g_variant_new ("(sa{sv}as)", + GSD_SUBSCRIPTION_DBUS_INTERFACE, + &builder, + &invalidated_builder), + NULL); + g_variant_builder_clear (&builder); + g_variant_builder_clear (&invalidated_builder); + } + ++static gboolean ++_client_installed_products_update (GsdSubscriptionManager *manager, GError **error) ++{ ++ GsdSubscriptionManagerPrivate *priv = manager->priv; ++ JsonNode *json_root; ++ JsonArray *json_products_array; ++ const gchar *json_txt = NULL; ++ g_autoptr(GVariant) val = NULL; ++ g_autoptr(JsonParser) json_parser = json_parser_new (); ++ ++ val = g_dbus_proxy_call_sync (priv->proxies[_RHSM_INTERFACE_PRODUCTS], ++ "ListInstalledProducts", ++ g_variant_new ("(sa{sv}s)", ++ "" /* filter_string */, ++ NULL /* proxy_options */, ++ priv->userlang), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, NULL, error); ++ if (val == NULL) ++ return FALSE; ++ g_variant_get (val, "(&s)", &json_txt); ++ g_debug ("Products.ListInstalledProducts JSON: %s", json_txt); ++ if (!json_parser_load_from_data (json_parser, json_txt, -1, error)) ++ return FALSE; ++ json_root = json_parser_get_root (json_parser); ++ json_products_array = json_node_get_array (json_root); ++ if (json_products_array == NULL) { ++ g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_DATA, ++ "no InstalledProducts array in %s", json_txt); ++ return FALSE; ++ } ++ ++ g_ptr_array_set_size (priv->installed_products, 0); ++ ++ for (guint i = 0; i < json_array_get_length (json_products_array); i++) { ++ JsonArray *json_product = json_array_get_array_element (json_products_array, i); ++ g_autoptr(ProductData) product = g_new0 (ProductData, 1); ++ ++ if (json_product == NULL) ++ continue; ++ if (json_array_get_length (json_product) < 8) { ++ g_debug ("Unexpected number of array elements in InstalledProducts JSON"); ++ continue; ++ } ++ ++ product->product_name = g_strdup (json_array_get_string_element (json_product, 0)); ++ product->product_id = g_strdup (json_array_get_string_element (json_product, 1)); ++ product->version = g_strdup (json_array_get_string_element (json_product, 2)); ++ product->arch = g_strdup (json_array_get_string_element (json_product, 3)); ++ product->status = g_strdup (json_array_get_string_element (json_product, 4)); ++ product->starts = g_strdup (json_array_get_string_element (json_product, 6)); ++ product->ends = g_strdup (json_array_get_string_element (json_product, 7)); ++ ++ g_ptr_array_add (priv->installed_products, g_steal_pointer (&product)); ++ } ++ ++ /* emit notification for g-c-c */ ++ _emit_property_changed (manager, "InstalledProducts", ++ _make_installed_products_variant (priv->installed_products)); ++ ++ return TRUE; ++} ++ + static gboolean + _client_subscription_status_update (GsdSubscriptionManager *manager, GError **error) + { + GsdSubscriptionManagerPrivate *priv = manager->priv; + JsonNode *json_root; + JsonObject *json_obj; + const gchar *json_txt = NULL; + const gchar *status_txt = NULL; + g_autoptr(GVariant) val = NULL; + g_autoptr(JsonParser) json_parser = json_parser_new (); + + /* save old value */ + priv->subscription_status_last = priv->subscription_status; + + val = g_dbus_proxy_call_sync (priv->proxies[_RHSM_INTERFACE_ENTITLEMENT], + "GetStatus", + g_variant_new ("(ss)", + "", /* assumed as 'now' */ + priv->userlang), + G_DBUS_CALL_FLAGS_NONE, + -1, NULL, error); + if (val == NULL) + return FALSE; + g_variant_get (val, "(&s)", &json_txt); + g_debug ("Entitlement.GetStatus JSON: %s", json_txt); + if (!json_parser_load_from_data (json_parser, json_txt, -1, error)) + return FALSE; + json_root = json_parser_get_root (json_parser); + json_obj = json_node_get_object (json_root); + if (!json_object_has_member (json_obj, "status")) { +@@ -423,185 +541,195 @@ _client_register_with_keys (GsdSubscriptionManager *manager, + GError **error) + { + GsdSubscriptionManagerPrivate *priv = manager->priv; + g_autoptr(GSubprocess) subprocess = NULL; + + /* apparently: "we can't send registration credentials over the regular + * system or session bus since those aren't really locked down..." */ + if (!_client_register_start (manager, error)) + return FALSE; + g_debug ("spawning %s", LIBEXECDIR "/gsd-subman-helper"); + subprocess = g_subprocess_new (G_SUBPROCESS_FLAGS_STDERR_PIPE, error, + "pkexec", LIBEXECDIR "/gsd-subman-helper", + "--kind", "register-with-key", + "--address", priv->address, + "--hostname", hostname, + "--organisation", organisation, + "--activation-key", activation_key, + NULL); + if (subprocess == NULL) { + g_prefix_error (error, "failed to find pkexec: "); + return FALSE; + } + if (!_client_subprocess_wait_check (subprocess, error)) + return FALSE; + + /* FIXME: also do on error? */ + if (!_client_register_stop (manager, error)) + return FALSE; + if (!_client_subscription_status_update (manager, error)) + return FALSE; ++ if (!_client_installed_products_update (manager, error)) ++ return FALSE; + _client_maybe__show_notification (manager); + + /* success */ + return TRUE; + } + + static gboolean + _client_register (GsdSubscriptionManager *manager, + const gchar *hostname, + const gchar *organisation, + const gchar *username, + const gchar *password, + GError **error) + { + GsdSubscriptionManagerPrivate *priv = manager->priv; + g_autoptr(GSubprocess) subprocess = NULL; + + /* fallback */ + if (organisation == NULL) + organisation = ""; + + /* apparently: "we can't send registration credentials over the regular + * system or session bus since those aren't really locked down..." */ + if (!_client_register_start (manager, error)) + return FALSE; + g_debug ("spawning %s", LIBEXECDIR "/gsd-subman-helper"); + subprocess = g_subprocess_new (G_SUBPROCESS_FLAGS_STDERR_PIPE, error, + "pkexec", LIBEXECDIR "/gsd-subman-helper", + "--kind", "register-with-username", + "--address", priv->address, + "--hostname", hostname, + "--organisation", organisation, + "--username", username, + "--password", password, + NULL); + if (subprocess == NULL) { + g_prefix_error (error, "failed to find pkexec: "); + return FALSE; + } + if (!_client_subprocess_wait_check (subprocess, error)) + return FALSE; + + /* FIXME: also do on error? */ + if (!_client_register_stop (manager, error)) + return FALSE; + if (!_client_subscription_status_update (manager, error)) + return FALSE; ++ if (!_client_installed_products_update (manager, error)) ++ return FALSE; + _client_maybe__show_notification (manager); + return TRUE; + } + + static gboolean + _client_unregister (GsdSubscriptionManager *manager, GError **error) + { + g_autoptr(GSubprocess) subprocess = NULL; + + /* apparently: "we can't send registration credentials over the regular + * system or session bus since those aren't really locked down..." */ + if (!_client_register_start (manager, error)) + return FALSE; + g_debug ("spawning %s", LIBEXECDIR "/gsd-subman-helper"); + subprocess = g_subprocess_new (G_SUBPROCESS_FLAGS_STDERR_PIPE, error, + "pkexec", LIBEXECDIR "/gsd-subman-helper", + "--kind", "unregister", + NULL); + if (subprocess == NULL) { + g_prefix_error (error, "failed to find pkexec: "); + return FALSE; + } + if (!_client_subprocess_wait_check (subprocess, error)) + return FALSE; + if (!_client_subscription_status_update (manager, error)) + return FALSE; ++ if (!_client_installed_products_update (manager, error)) ++ return FALSE; + _client_maybe__show_notification (manager); + return TRUE; + } + + static gboolean + _client_update_config (GsdSubscriptionManager *manager, GError **error) + { + GsdSubscriptionManagerPrivate *priv = manager->priv; + g_autoptr(GVariant) val = NULL; + g_autoptr(GVariant) val_server = NULL; + g_autoptr(GVariantDict) dict = NULL; + GVariantIter iter; + gchar *key; + gchar *value; + + val = g_dbus_proxy_call_sync (priv->proxies[_RHSM_INTERFACE_CONFIG], + "GetAll", + g_variant_new ("(s)", priv->userlang), + G_DBUS_CALL_FLAGS_NONE, + -1, NULL, error); + if (val == NULL) + return FALSE; + dict = g_variant_dict_new (g_variant_get_child_value (val, 0)); + val_server = g_variant_dict_lookup_value (dict, "server", G_VARIANT_TYPE("a{ss}")); + if (val_server != NULL) { + g_variant_iter_init (&iter, val_server); + while (g_variant_iter_next (&iter, "{ss}", &key, &value)) { + g_debug ("%s=%s", key, value); + g_hash_table_insert (priv->config, + g_steal_pointer (&key), + g_steal_pointer (&value)); + } + } + return TRUE; + } + + static void + _subman_proxy_signal_cb (GDBusProxy *proxy, + const gchar *sender_name, + const gchar *signal_name, + GVariant *parameters, + GsdSubscriptionManager *manager) + { + g_autoptr(GError) error = NULL; + if (!_client_syspurpose_update (manager, &error)) { + g_warning ("failed to update syspurpose: %s", error->message); + g_clear_error (&error); + } + if (!_client_subscription_status_update (manager, &error)) { + g_warning ("failed to update subscription status: %s", error->message); + g_clear_error (&error); + } ++ if (!_client_installed_products_update (manager, &error)) { ++ g_warning ("failed to update installed products: %s", error->message); ++ g_clear_error (&error); ++ } + _client_maybe__show_notification (manager); + } + + static void + _client_unload (GsdSubscriptionManager *manager) + { + GsdSubscriptionManagerPrivate *priv = manager->priv; + for (guint i = 0; i < _RHSM_INTERFACE_LAST; i++) + g_clear_object (&priv->proxies[i]); + g_hash_table_unref (priv->config); + } + + static const gchar * + _rhsm_interface_to_string (_RhsmInterface kind) + { + if (kind == _RHSM_INTERFACE_CONFIG) + return "Config"; + if (kind == _RHSM_INTERFACE_REGISTER_SERVER) + return "RegisterServer"; + if (kind == _RHSM_INTERFACE_ATTACH) + return "Attach"; + if (kind == _RHSM_INTERFACE_ENTITLEMENT) + return "Entitlement"; + if (kind == _RHSM_INTERFACE_PRODUCTS) + return "Products"; + if (kind == _RHSM_INTERFACE_CONSUMER) + return "Consumer"; + if (kind == _RHSM_INTERFACE_SYSPURPOSE) + return "Syspurpose"; + return NULL; +@@ -613,60 +741,62 @@ _client_load (GsdSubscriptionManager *manager, GError **error) + GsdSubscriptionManagerPrivate *priv = manager->priv; + + priv->config = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); + + /* connect to all the interfaces on the *different* objects :| */ + for (guint i = 0; i < _RHSM_INTERFACE_LAST; i++) { + const gchar *kind = _rhsm_interface_to_string (i); + g_autofree gchar *opath = g_strdup_printf ("/com/redhat/RHSM1/%s", kind); + g_autofree gchar *iface = g_strdup_printf ("com.redhat.RHSM1.%s", kind); + priv->proxies[i] = + g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, + G_DBUS_PROXY_FLAGS_NONE, + NULL, + "com.redhat.RHSM1", + opath, iface, + NULL, + error); + if (priv->proxies[i] == NULL) + return FALSE; + /* we want to get notified if the status of the system changes */ + g_signal_connect (priv->proxies[i], "g-signal", + G_CALLBACK (_subman_proxy_signal_cb), manager); + } + + /* get initial status */ + priv->userlang = ""; + if (!_client_update_config (manager, error)) + return FALSE; + if (!_client_subscription_status_update (manager, error)) + return FALSE; ++ if (!_client_installed_products_update (manager, error)) ++ return FALSE; + if (!_client_syspurpose_update (manager, error)) + return FALSE; + + /* success */ + return TRUE; + } + + gboolean + gsd_subscription_manager_start (GsdSubscriptionManager *manager, GError **error) + { + gboolean ret; + g_debug ("Starting subscription manager"); + gnome_settings_profile_start (NULL); + ret = _client_load (manager, error); + _client_maybe__show_notification (manager); + gnome_settings_profile_end (NULL); + return ret; + } + + void + gsd_subscription_manager_stop (GsdSubscriptionManager *manager) + { + g_debug ("Stopping subscription manager"); + _client_unload (manager); + } + + static void + gsd_subscription_manager_class_init (GsdSubscriptionManagerClass *klass) + { + GObjectClass *object_class = G_OBJECT_CLASS (klass); +@@ -676,60 +806,61 @@ gsd_subscription_manager_class_init (GsdSubscriptionManagerClass *klass) + } + + static void + _launch_info_overview (void) + { + const gchar *argv[] = { "gnome-control-center", "info-overview", NULL }; + g_debug ("Running gnome-control-center info-overview"); + g_spawn_async (NULL, (gchar **) argv, NULL, G_SPAWN_SEARCH_PATH, + NULL, NULL, NULL, NULL); + } + + static void + _notify_closed_cb (NotifyNotification *notification, gpointer user_data) + { + /* FIXME: only launch when clicking on the main body, not the window close */ + if (notify_notification_get_closed_reason (notification) == 0x400) + _launch_info_overview (); + } + + static void + _notify_clicked_cb (NotifyNotification *notification, char *action, gpointer user_data) + { + _launch_info_overview (); + } + + static void + gsd_subscription_manager_init (GsdSubscriptionManager *manager) + { + GsdSubscriptionManagerPrivate *priv = manager->priv = GSD_SUBSCRIPTION_MANAGER_GET_PRIVATE (manager); + ++ priv->installed_products = g_ptr_array_new_with_free_func ((GDestroyNotify) product_data_free); + priv->timer_last_notified = g_timer_new (); + + /* expired */ + priv->notification_expired = + notify_notification_new (_("Subscription Has Expired"), + _("Add or renew a subscription to continue receiving software updates."), + NULL); + notify_notification_set_app_name (priv->notification_expired, _("Subscription")); + notify_notification_set_hint_string (priv->notification_expired, "desktop-entry", "subman-panel"); + notify_notification_set_hint_string (priv->notification_expired, "x-gnome-privacy-scope", "system"); + notify_notification_set_urgency (priv->notification_expired, NOTIFY_URGENCY_CRITICAL); + notify_notification_add_action (priv->notification_expired, + "info-overview", _("Subscribe System…"), + _notify_clicked_cb, + manager, NULL); + g_signal_connect (priv->notification_expired, "closed", + G_CALLBACK (_notify_closed_cb), manager); + + /* registered */ + priv->notification_registered = + notify_notification_new (_("Registration Successful"), + _("The system has been registered and software updates have been enabled."), + NULL); + notify_notification_set_app_name (priv->notification_registered, _("Subscription")); + notify_notification_set_hint_string (priv->notification_registered, "desktop-entry", "subman-panel"); + notify_notification_set_hint_string (priv->notification_registered, "x-gnome-privacy-scope", "system"); + notify_notification_set_urgency (priv->notification_registered, NOTIFY_URGENCY_CRITICAL); + g_signal_connect (priv->notification_registered, "closed", + G_CALLBACK (_notify_closed_cb), manager); + +@@ -740,60 +871,61 @@ gsd_subscription_manager_init (GsdSubscriptionManager *manager) + NULL); + notify_notification_set_app_name (priv->notification_registration_required, _("Subscription")); + notify_notification_set_hint_string (priv->notification_registration_required, "desktop-entry", "subman-panel"); + notify_notification_set_hint_string (priv->notification_registration_required, "x-gnome-privacy-scope", "system"); + notify_notification_set_urgency (priv->notification_registration_required, NOTIFY_URGENCY_CRITICAL); + notify_notification_add_action (priv->notification_registration_required, + "info-overview", _("Register System…"), + _notify_clicked_cb, + manager, NULL); + g_signal_connect (priv->notification_registration_required, "closed", + G_CALLBACK (_notify_closed_cb), manager); + } + + static void + gsd_subscription_manager_finalize (GObject *object) + { + GsdSubscriptionManager *manager; + + g_return_if_fail (object != NULL); + g_return_if_fail (GSD_IS_SUBSCRIPTION_MANAGER (object)); + + manager = GSD_SUBSCRIPTION_MANAGER (object); + + gsd_subscription_manager_stop (manager); + + if (manager->priv->bus_cancellable != NULL) { + g_cancellable_cancel (manager->priv->bus_cancellable); + g_clear_object (&manager->priv->bus_cancellable); + } + ++ g_clear_pointer (&manager->priv->installed_products, g_ptr_array_unref); + g_clear_pointer (&manager->priv->introspection_data, g_dbus_node_info_unref); + g_clear_object (&manager->priv->connection); + g_clear_object (&manager->priv->notification_expired); + g_clear_object (&manager->priv->notification_registered); + g_timer_destroy (manager->priv->timer_last_notified); + + if (manager->priv->name_id != 0) { + g_bus_unown_name (manager->priv->name_id); + manager->priv->name_id = 0; + } + + G_OBJECT_CLASS (gsd_subscription_manager_parent_class)->finalize (object); + } + + static void + handle_method_call (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) + { + GsdSubscriptionManager *manager = GSD_SUBSCRIPTION_MANAGER (user_data); + g_autoptr(GError) error = NULL; + + if (g_strcmp0 (method_name, "Register") == 0) { + const gchar *organisation = NULL; + const gchar *hostname = NULL; +@@ -857,60 +989,63 @@ handle_method_call (GDBusConnection *connection, + if (!_client_unregister (manager, &error)) { + g_dbus_method_invocation_return_gerror (invocation, error); + return; + } + g_dbus_method_invocation_return_value (invocation, NULL); + } else { + g_assert_not_reached (); + } + } + + static GVariant * + handle_get_property (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *property_name, + GError **error, gpointer user_data) + { + GsdSubscriptionManager *manager = GSD_SUBSCRIPTION_MANAGER (user_data); + GsdSubscriptionManagerPrivate *priv = manager->priv; + + if (g_strcmp0 (interface_name, GSD_SUBSCRIPTION_DBUS_INTERFACE) != 0) { + g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_FAILED, + "No such interface: %s", interface_name); + return NULL; + } + + if (g_strcmp0 (property_name, "SubscriptionStatus") == 0) + return g_variant_new_uint32 (priv->subscription_status); + ++ if (g_strcmp0 (property_name, "InstalledProducts") == 0) ++ return _make_installed_products_variant (priv->installed_products); ++ + g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_FAILED, + "Failed to get property: %s", property_name); + return NULL; + } + + static gboolean + handle_set_property (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *property_name, + GVariant *value, + GError **error, gpointer user_data) + { + if (g_strcmp0 (interface_name, GSD_SUBSCRIPTION_DBUS_INTERFACE) != 0) { + g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_FAILED, + "No such interface: %s", interface_name); + return FALSE; + } + g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_FAILED, + "No such property: %s", property_name); + return FALSE; + } + + static const GDBusInterfaceVTable interface_vtable = + { + handle_method_call, + handle_get_property, + handle_set_property + }; +-- +2.30.0 + diff --git a/0003-account-display-nag-screen-periodically.patch b/0003-account-display-nag-screen-periodically.patch new file mode 100644 index 0000000..c7a13fb --- /dev/null +++ b/0003-account-display-nag-screen-periodically.patch @@ -0,0 +1,451 @@ +From 31844edad70876e26ab995179bc67fb3b23a1793 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Mon, 6 Nov 2017 16:39:55 -0500 +Subject: [PATCH 3/4] account: display nag screen periodically + +This is configurable via a gsettings key. +--- + data/meson.build | 1 + + ...ings-daemon.plugins.account.gschema.xml.in | 9 +++ + plugins/account/gsd-account-manager.c | 55 +++++++++++++++++++ + 3 files changed, 65 insertions(+) + create mode 100644 data/org.gnome.settings-daemon.plugins.account.gschema.xml.in + +diff --git a/data/meson.build b/data/meson.build +index e93ba641..5a2cd5a7 100644 +--- a/data/meson.build ++++ b/data/meson.build +@@ -1,36 +1,37 @@ + data_inc = include_directories('.') + + schemas = [ + 'org.gnome.settings-daemon.peripherals.gschema.xml', + 'org.gnome.settings-daemon.peripherals.wacom.gschema.xml', + 'org.gnome.settings-daemon.plugins.gschema.xml', ++ 'org.gnome.settings-daemon.plugins.account.gschema.xml', + 'org.gnome.settings-daemon.plugins.color.gschema.xml', + 'org.gnome.settings-daemon.plugins.housekeeping.gschema.xml', + 'org.gnome.settings-daemon.plugins.media-keys.gschema.xml', + 'org.gnome.settings-daemon.plugins.power.gschema.xml', + 'org.gnome.settings-daemon.plugins.sharing.gschema.xml', + 'org.gnome.settings-daemon.plugins.xsettings.gschema.xml' + ] + + schema_conf = configuration_data() + schema_conf.set('GETTEXT_PACKAGE', meson.project_name()) + + schemas_xml = [] + foreach schema: schemas + schemas_xml += [configure_file( + input: schema + '.in', + output: schema, + configuration: schema_conf, + install: true, + install_dir: gsd_schemadir + )] + endforeach + + enums_header = files('gsd-enums.h') + + mkenums = gnome.mkenums( + 'org.gnome.settings-daemon.enums.xml', + sources: enums_header, + comments: '', + fhead: '', + vhead: ' <@type@ id="org.gnome.settings-daemon.@EnumName@">', +diff --git a/data/org.gnome.settings-daemon.plugins.account.gschema.xml.in b/data/org.gnome.settings-daemon.plugins.account.gschema.xml.in +new file mode 100644 +index 00000000..f3d59e81 +--- /dev/null ++++ b/data/org.gnome.settings-daemon.plugins.account.gschema.xml.in +@@ -0,0 +1,9 @@ ++ ++ ++ ++ 1440 ++ Time before repeated warning about account password expiration ++ If a user's account is expiring, a notification will get displayed periodically after the specified number of minutes ++ ++ ++ +diff --git a/plugins/account/gsd-account-manager.c b/plugins/account/gsd-account-manager.c +index cb37f466..ff054edd 100644 +--- a/plugins/account/gsd-account-manager.c ++++ b/plugins/account/gsd-account-manager.c +@@ -20,126 +20,135 @@ + #include "config.h" + + #include + #include + #include + #include + #include + #include + #include + + #include + + #include + #include + #include + + #include + #include + #include + + #include "gnome-settings-profile.h" + #include "gnome-settings-bus.h" + #include "gsd-account-manager.h" + #include "org.freedesktop.Accounts.h" + #include "org.freedesktop.Accounts.User.h" + + #define GSD_ACCOUNT_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GSD_TYPE_ACCOUNT_MANAGER, GsdAccountManagerPrivate)) + + struct GsdAccountManagerPrivate + { ++ GSettings *settings; ++ + GsdAccounts *accounts_proxy; + GsdAccountsUser *accounts_user_proxy; + GCancellable *cancellable; + + GsdScreenSaver *screensaver_proxy; + + gint64 expiration_time; + gint64 last_change_time; + gint64 min_days_between_changes; + gint64 max_days_between_changes; + gint64 days_to_warn; + gint64 days_after_expiration_until_lock; + + NotifyNotification *notification; ++ ++ gint64 last_notify_time; ++ int notify_period; ++ guint notify_period_timeout_id; + }; + + static void gsd_account_manager_class_init (GsdAccountManagerClass *klass); + static void gsd_account_manager_init (GsdAccountManager *account_manager); + static void gsd_account_manager_finalize (GObject *object); ++static void fetch_password_expiration_policy (GsdAccountManager *manager); + + G_DEFINE_TYPE (GsdAccountManager, gsd_account_manager, G_TYPE_OBJECT) + + static gpointer manager_object = NULL; + + static void + on_notification_closed (NotifyNotification *notification, + gpointer user_data) + { + GsdAccountManager *manager = user_data; + + g_clear_object (&manager->priv->notification); + } + + static void + hide_notification (GsdAccountManager *manager) + { + if (manager->priv->notification == NULL) + return; + + notify_notification_close (manager->priv->notification, NULL); + g_clear_object (&manager->priv->notification); + } + + static void + show_notification (GsdAccountManager *manager, + const char *primary_text, + const char *secondary_text) + { + g_assert (manager->priv->notification == NULL); + + manager->priv->notification = notify_notification_new (primary_text, + secondary_text, + "avatar-default-symbolic"); + notify_notification_set_app_name (manager->priv->notification, _("User Account")); + notify_notification_set_hint (manager->priv->notification, + "resident", + g_variant_new_boolean (TRUE)); + notify_notification_set_timeout (manager->priv->notification, + NOTIFY_EXPIRES_NEVER); + + g_signal_connect (manager->priv->notification, + "closed", + G_CALLBACK (on_notification_closed), + manager); + + notify_notification_show (manager->priv->notification, NULL); ++ ++ manager->priv->last_notify_time = g_get_monotonic_time (); + } + + static void + update_password_notification (GsdAccountManager *manager) + { + gint64 days_since_epoch; + gint64 days_until_expiration = -1; + gint64 days_since_last_change = -1; + gint64 days_left = -1; + g_autofree char *primary_text = NULL; + g_autofree char *secondary_text = NULL; + gboolean password_already_expired = FALSE; + + hide_notification (manager); + + days_since_epoch = g_get_real_time () / G_USEC_PER_SEC / 60 / 60 / 24; + + if (manager->priv->expiration_time > 0) { + days_until_expiration = manager->priv->expiration_time - days_since_epoch; + + if (days_until_expiration <= 0) { + password_already_expired = TRUE; + goto out; + } + } + + if (manager->priv->last_change_time == 0) { + password_already_expired = TRUE; + goto out; + } +@@ -181,99 +190,127 @@ out: + primary_text = g_strdup_printf (_("Password Expired")); + secondary_text = g_strdup_printf (_("Your password is expired. Please update it.")); + } else if (days_left >= 0) { + primary_text = g_strdup_printf (_("Password Expiring Soon")); + if (days_left == 0) + secondary_text = g_strdup_printf (_("Your password is expiring today.")); + else if (days_left == 1) + secondary_text = g_strdup_printf (_("Your password is expiring in a day.")); + else + secondary_text = g_strdup_printf (_("Your password is expiring in %ld days."), + days_left); + } + + if (primary_text != NULL && secondary_text != NULL) + show_notification (manager, + primary_text, + secondary_text); + } + + static gboolean + set_policy_number (gint64 *destination, + gint64 source) + { + if (*destination == source) + return FALSE; + + *destination = source; + return TRUE; + } + ++static gboolean ++on_notify_period_elapsed (GsdAccountManager *manager) ++{ ++ manager->priv->notify_period_timeout_id = 0; ++ fetch_password_expiration_policy (manager); ++ return G_SOURCE_REMOVE; ++} ++ ++static void ++queue_periodic_timeout (GsdAccountManager *manager) ++{ ++ if (manager->priv->notify_period_timeout_id != 0) { ++ g_source_remove (manager->priv->notify_period_timeout_id); ++ manager->priv->notify_period_timeout_id = 0; ++ } ++ ++ if (manager->priv->notify_period > 0) { ++ gint64 already_elapsed_time; ++ ++ already_elapsed_time = MAX (0, (g_get_monotonic_time () - manager->priv->last_notify_time) / G_USEC_PER_SEC); ++ ++ manager->priv->notify_period_timeout_id = g_timeout_add_seconds (MAX (0, manager->priv->notify_period * 60 - already_elapsed_time), ++ (GSourceFunc) on_notify_period_elapsed, ++ manager); ++ } ++} ++ + static void + on_got_password_expiration_policy (GsdAccountsUser *accounts_user_proxy, + GAsyncResult *res, + gpointer user_data) + { + GsdAccountManager *manager = user_data; + g_autoptr(GError) error = NULL; + gboolean succeeded; + gint64 expiration_time; + gint64 last_change_time; + gint64 min_days_between_changes; + gint64 max_days_between_changes; + gint64 days_to_warn; + gint64 days_after_expiration_until_lock; + + gnome_settings_profile_start (NULL); + succeeded = gsd_accounts_user_call_get_password_expiration_policy_finish (accounts_user_proxy, + &expiration_time, + &last_change_time, + &min_days_between_changes, + &max_days_between_changes, + &days_to_warn, + &days_after_expiration_until_lock, + res, + &error); + + if (!succeeded) { + g_warning ("Failed to get password expiration policy for user: %s", error->message); + goto out; + } + + set_policy_number (&manager->priv->expiration_time, expiration_time); + set_policy_number (&manager->priv->last_change_time, last_change_time); + set_policy_number (&manager->priv->min_days_between_changes, min_days_between_changes); + set_policy_number (&manager->priv->max_days_between_changes, max_days_between_changes); + set_policy_number (&manager->priv->days_to_warn, days_to_warn); + set_policy_number (&manager->priv->days_after_expiration_until_lock, days_after_expiration_until_lock); + + update_password_notification (manager); ++ queue_periodic_timeout (manager); + out: + gnome_settings_profile_end (NULL); + } + + static void + fetch_password_expiration_policy (GsdAccountManager *manager) + { + gsd_accounts_user_call_get_password_expiration_policy (manager->priv->accounts_user_proxy, + manager->priv->cancellable, + (GAsyncReadyCallback) + on_got_password_expiration_policy, + manager); + } + + static void + on_screensaver_signal (GDBusProxy *proxy, + const gchar *sender_name, + const gchar *signal_name, + GVariant *parameters, + gpointer user_data) + { + GsdAccountManager *manager = user_data; + + if (g_strcmp0 (signal_name, "ActiveChanged") == 0) { + gboolean active; + + g_variant_get (parameters, "(b)", &active); + + if (!active) { + fetch_password_expiration_policy (manager); +@@ -346,91 +383,109 @@ on_got_user_object_path (GsdAccounts *accounts_proxy, + manager); + + out: + gnome_settings_profile_end (NULL); + } + + static void + on_got_accounts_proxy (GObject *source_object, + GAsyncResult *res, + gpointer user_data) + { + GsdAccountManager *manager = user_data; + g_autoptr(GError) error = NULL; + + gnome_settings_profile_start (NULL); + manager->priv->accounts_proxy = gsd_accounts_proxy_new_for_bus_finish (res, &error); + + if (manager->priv->accounts_proxy != NULL) { + gsd_accounts_call_find_user_by_id (manager->priv->accounts_proxy, + getuid (), + manager->priv->cancellable, + (GAsyncReadyCallback) + on_got_user_object_path, + manager); + } else { + g_warning ("Failed to get proxy to accounts service: %s", error->message); + } + gnome_settings_profile_end (NULL); + } + ++static void ++on_notify_period_changed (GsdAccountManager *manager) ++{ ++ manager->priv->notify_period = g_settings_get_int (manager->priv->settings, "notify-period"); ++ ++ queue_periodic_timeout (manager); ++} ++ + gboolean + gsd_account_manager_start (GsdAccountManager *manager, + GError **error) + { + g_debug ("Starting accounts manager"); + + gnome_settings_profile_start (NULL); + manager->priv->cancellable = g_cancellable_new (); ++ manager->priv->settings = g_settings_new ("org.gnome.settings-daemon.plugins.account"); ++ ++ manager->priv->notify_period = g_settings_get_int (manager->priv->settings, "notify-period"); ++ g_signal_connect_object (G_OBJECT (manager->priv->settings), ++ "changed::notify-period", ++ G_CALLBACK (on_notify_period_changed), ++ manager, ++ G_CONNECT_SWAPPED); ++ + gsd_accounts_proxy_new_for_bus (G_BUS_TYPE_SYSTEM, + G_DBUS_PROXY_FLAGS_NONE, + "org.freedesktop.Accounts", + "/org/freedesktop/Accounts", + manager->priv->cancellable, + (GAsyncReadyCallback) + on_got_accounts_proxy, + manager); + gnome_settings_profile_end (NULL); + + return TRUE; + } + + void + gsd_account_manager_stop (GsdAccountManager *manager) + { + g_debug ("Stopping accounts manager"); + + if (manager->priv->cancellable != NULL) { + g_cancellable_cancel (manager->priv->cancellable); + g_clear_object (&manager->priv->cancellable); + } + ++ g_clear_object (&manager->priv->settings); + g_clear_object (&manager->priv->accounts_proxy); + g_clear_object (&manager->priv->accounts_user_proxy); + g_clear_object (&manager->priv->notification); + g_clear_object (&manager->priv->screensaver_proxy); + } + + static void + gsd_account_manager_class_init (GsdAccountManagerClass *klass) + { + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->finalize = gsd_account_manager_finalize; + + notify_init ("gnome-settings-daemon"); + + g_type_class_add_private (klass, sizeof (GsdAccountManagerPrivate)); + } + + static void + gsd_account_manager_init (GsdAccountManager *manager) + { + manager->priv = GSD_ACCOUNT_MANAGER_GET_PRIVATE (manager); + } + + static void + gsd_account_manager_finalize (GObject *object) + { + GsdAccountManager *manager; + + g_return_if_fail (object != NULL); +-- +2.21.0 + diff --git a/0003-subman-Increase-RHSM-dbus-call-timeouts.patch b/0003-subman-Increase-RHSM-dbus-call-timeouts.patch new file mode 100644 index 0000000..b8a4ea4 --- /dev/null +++ b/0003-subman-Increase-RHSM-dbus-call-timeouts.patch @@ -0,0 +1,313 @@ +From 0d88b2133b20957e00b0eeb0c0f48932485cc73d Mon Sep 17 00:00:00 2001 +From: Kalev Lember +Date: Fri, 28 Jun 2019 18:10:36 +0200 +Subject: [PATCH 03/15] subman: Increase RHSM dbus call timeouts + +Increase the dbus timeouts to 5 minutes as the register/unregister calls +seem to routinely take more than a minute. +--- + plugins/subman/gsd-subman-helper.c | 17 ++++++++++++----- + 1 file changed, 12 insertions(+), 5 deletions(-) + +diff --git a/plugins/subman/gsd-subman-helper.c b/plugins/subman/gsd-subman-helper.c +index 182f7190..af7a82e9 100644 +--- a/plugins/subman/gsd-subman-helper.c ++++ b/plugins/subman/gsd-subman-helper.c +@@ -1,60 +1,62 @@ + /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * + * Copyright (C) 2019 Richard Hughes + * + * Licensed under the GNU General Public License Version 2 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + + #include "config.h" + + #include + #include + #include + + #include + #include + ++#define DBUS_TIMEOUT 300000 /* 5 minutes */ ++ + static void + _helper_convert_error (const gchar *json_txt, GError **error) + { + JsonNode *json_root; + JsonObject *json_obj; + const gchar *message; + g_autoptr(JsonParser) json_parser = json_parser_new (); + + /* this may be plain text or JSON :| */ + if (!json_parser_load_from_data (json_parser, json_txt, -1, NULL)) { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + json_txt); + return; + } + json_root = json_parser_get_root (json_parser); + json_obj = json_node_get_object (json_root); + if (!json_object_has_member (json_obj, "message")) { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "no message' in %s", json_txt); + return; + } + message = json_object_get_string_member (json_obj, "message"); + if (g_strstr_len (message, -1, "Invalid user credentials") != NULL) { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_PERMISSION_DENIED, +@@ -67,125 +69,128 @@ _helper_convert_error (const gchar *json_txt, GError **error) + message); + } + + static gboolean + _helper_unregister (GError **error) + { + g_autoptr(GDBusProxy) proxy = NULL; + g_autoptr(GVariantBuilder) proxy_options = NULL; + g_autoptr(GVariant) res = NULL; + + g_debug ("unregistering"); + proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | + G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS, + NULL, + "com.redhat.RHSM1", + "/com/redhat/RHSM1/Unregister", + "com.redhat.RHSM1.Unregister", + NULL, error); + if (proxy == NULL) { + g_prefix_error (error, "Failed to get proxy: "); + return FALSE; + } + proxy_options = g_variant_builder_new (G_VARIANT_TYPE_VARDICT); + res = g_dbus_proxy_call_sync (proxy, + "Unregister", + g_variant_new ("(a{sv}s)", + proxy_options, + ""), /* lang */ + G_DBUS_CALL_FLAGS_NONE, +- -1, NULL, error); ++ DBUS_TIMEOUT, ++ NULL, error); + return res != NULL; + } + + static gboolean + _helper_auto_attach (GError **error) + { + const gchar *str = NULL; + g_autoptr(GDBusProxy) proxy = NULL; + g_autoptr(GVariantBuilder) proxy_options = NULL; + g_autoptr(GVariant) res = NULL; + + g_debug ("auto-attaching subscriptions"); + proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | + G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS, + NULL, + "com.redhat.RHSM1", + "/com/redhat/RHSM1/Attach", + "com.redhat.RHSM1.Attach", + NULL, error); + if (proxy == NULL) { + g_prefix_error (error, "Failed to get proxy: "); + return FALSE; + } + proxy_options = g_variant_builder_new (G_VARIANT_TYPE_VARDICT); + res = g_dbus_proxy_call_sync (proxy, + "AutoAttach", + g_variant_new ("(sa{sv}s)", + "", /* now? */ + proxy_options, + ""), /* lang */ + G_DBUS_CALL_FLAGS_NONE, +- -1, NULL, error); ++ DBUS_TIMEOUT, ++ NULL, error); + if (res == NULL) + return FALSE; + g_variant_get (res, "(&s)", &str); + g_debug ("Attach.AutoAttach: %s", str); + return TRUE; + } + + static gboolean + _helper_save_config (const gchar *key, const gchar *value, GError **error) + { + g_autoptr(GDBusProxy) proxy = NULL; + g_autoptr(GVariant) res = NULL; + proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | + G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS, + NULL, + "com.redhat.RHSM1", + "/com/redhat/RHSM1/Config", + "com.redhat.RHSM1.Config", + NULL, error); + if (proxy == NULL) { + g_prefix_error (error, "Failed to get proxy: "); + return FALSE; + } + res = g_dbus_proxy_call_sync (proxy, "Set", + g_variant_new ("(svs)", + key, + g_variant_new_string (value), + ""), /* lang */ + G_DBUS_CALL_FLAGS_NONE, +- -1, NULL, error); ++ DBUS_TIMEOUT, ++ NULL, error); + return res != NULL; + } + + int + main (int argc, char *argv[]) + { + const gchar *userlang = ""; /* as root, so no translations */ + g_autofree gchar *activation_key = NULL; + g_autofree gchar *address = NULL; + g_autofree gchar *hostname = NULL; + g_autofree gchar *kind = NULL; + g_autofree gchar *organisation = NULL; + g_autofree gchar *password = NULL; + g_autofree gchar *port = NULL; + g_autofree gchar *prefix = NULL; + g_autofree gchar *proxy_server = NULL; + g_autofree gchar *username = NULL; + g_autoptr(GDBusConnection) conn_private = NULL; + g_autoptr(GDBusProxy) proxy = NULL; + g_autoptr(GError) error = NULL; + g_autoptr(GOptionContext) context = g_option_context_new (NULL); + g_autoptr(GVariantBuilder) proxy_options = NULL; + g_autoptr(GVariantBuilder) subman_conopts = NULL; + g_autoptr(GVariantBuilder) subman_options = NULL; + + const GOptionEntry options[] = { + { "kind", '\0', G_OPTION_FLAG_NONE, G_OPTION_ARG_STRING, + &kind, "Kind, e.g. 'username' or 'key'", NULL }, + { "address", '\0', G_OPTION_FLAG_NONE, G_OPTION_ARG_STRING, + &address, "UNIX address", NULL }, +@@ -278,95 +283,97 @@ main (int argc, char *argv[]) + g_variant_builder_add (subman_conopts, "{ss}", "host", hostname); + g_variant_builder_add (subman_conopts, "{ss}", "handler", prefix); + g_variant_builder_add (subman_conopts, "{ss}", "port", port); + + /* call into RHSM */ + if (g_strcmp0 (kind, "register-with-key") == 0) { + g_auto(GStrv) activation_keys = NULL; + g_autoptr(GError) error_local = NULL; + g_autoptr(GVariant) res = NULL; + + if (activation_key == NULL) { + g_printerr ("Required --activation-key\n"); + return G_IO_ERROR_INVALID_DATA; + } + if (organisation == NULL) { + g_printerr ("Required --organisation\n"); + return G_IO_ERROR_INVALID_DATA; + } + + g_debug ("registering using activation key"); + activation_keys = g_strsplit (activation_key, ",", -1); + res = g_dbus_proxy_call_sync (proxy, + "RegisterWithActivationKeys", + g_variant_new ("(s^asa{ss}a{ss}s)", + organisation, + activation_keys, + subman_options, + subman_conopts, + userlang), + G_DBUS_CALL_FLAGS_NO_AUTO_START, +- -1, NULL, &error_local); ++ DBUS_TIMEOUT, ++ NULL, &error_local); + if (res == NULL) { + g_dbus_error_strip_remote_error (error_local); + _helper_convert_error (error_local->message, &error); + g_printerr ("Failed to RegisterWithActivationKeys: %s\n", error->message); + return error->code; + } + } else if (g_strcmp0 (kind, "register-with-username") == 0) { + g_autoptr(GError) error_local = NULL; + g_autoptr(GVariant) res = NULL; + + g_debug ("registering using username and password"); + if (username == NULL) { + g_printerr ("Required --username\n"); + return G_IO_ERROR_INVALID_DATA; + } + if (password == NULL) { + g_printerr ("Required --password\n"); + return G_IO_ERROR_INVALID_DATA; + } + if (organisation == NULL) { + g_printerr ("Required --organisation\n"); + return G_IO_ERROR_INVALID_DATA; + } + res = g_dbus_proxy_call_sync (proxy, + "Register", + g_variant_new ("(sssa{ss}a{ss}s)", + organisation, + username, + password, + subman_options, + subman_conopts, + userlang), + G_DBUS_CALL_FLAGS_NO_AUTO_START, +- -1, NULL, &error_local); ++ DBUS_TIMEOUT, ++ NULL, &error_local); + if (res == NULL) { + g_dbus_error_strip_remote_error (error_local); + _helper_convert_error (error_local->message, &error); + g_printerr ("Failed to Register: %s\n", error->message); + return error->code; + } + } else { + g_printerr ("Invalid --kind specified: %s\n", kind); + return G_IO_ERROR_INVALID_DATA; + } + + /* set the new hostname */ + if (!_helper_save_config ("server.hostname", hostname, &error)) { + g_printerr ("Failed to save hostname: %s\n", error->message); + return G_IO_ERROR_NOT_INITIALIZED; + } + if (!_helper_save_config ("server.prefix", prefix, &error)) { + g_printerr ("Failed to save prefix: %s\n", error->message); + return G_IO_ERROR_NOT_INITIALIZED; + } + if (!_helper_save_config ("server.port", port, &error)) { + g_printerr ("Failed to save port: %s\n", error->message); + return G_IO_ERROR_NOT_INITIALIZED; + } + + /* wait for rhsmd to notice the new config */ + g_usleep (G_USEC_PER_SEC * 5); + + /* auto-attach */ + if (!_helper_auto_attach (&error)) { +-- +2.30.0 + diff --git a/0004-account-don-t-poll-more-frequently-than-notification.patch b/0004-account-don-t-poll-more-frequently-than-notification.patch new file mode 100644 index 0000000..48708dd --- /dev/null +++ b/0004-account-don-t-poll-more-frequently-than-notification.patch @@ -0,0 +1,110 @@ +From ff98c03c88e53041dcc861de3b3a3351d55297fe Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Fri, 9 Nov 2018 10:39:11 -0500 +Subject: [PATCH 4/4] account: don't poll more frequently than notification + period + +At the moment, if an account has no reason to receive a notification, +the account plugin ends up polling continuously, desperately, +and unsuccessfully trying to find a reason to notify. That leads +to unnecessary CPU utilization. + +The reason is an apparent think-o in the code. The code tracks +the last time a notification was shown, so it knows when to show +the next notification later, even if the notification period, or +account policy is updated by the admin in the interim. + +The problem is that it's wrong to look at the last notification +time if there's no reason to show a notification. In that case +the wakeup is merely to poll updates on the account policy. + +This commit addresses the problem by only looking at the previous +notification time, if it was within the current notification period. +--- + plugins/account/gsd-account-manager.c | 14 +++++++++++--- + 1 file changed, 11 insertions(+), 3 deletions(-) + +diff --git a/plugins/account/gsd-account-manager.c b/plugins/account/gsd-account-manager.c +index ff054edd..b48c0fe8 100644 +--- a/plugins/account/gsd-account-manager.c ++++ b/plugins/account/gsd-account-manager.c +@@ -207,65 +207,73 @@ out: + } + + static gboolean + set_policy_number (gint64 *destination, + gint64 source) + { + if (*destination == source) + return FALSE; + + *destination = source; + return TRUE; + } + + static gboolean + on_notify_period_elapsed (GsdAccountManager *manager) + { + manager->priv->notify_period_timeout_id = 0; + fetch_password_expiration_policy (manager); + return G_SOURCE_REMOVE; + } + + static void + queue_periodic_timeout (GsdAccountManager *manager) + { + if (manager->priv->notify_period_timeout_id != 0) { + g_source_remove (manager->priv->notify_period_timeout_id); + manager->priv->notify_period_timeout_id = 0; + } + + if (manager->priv->notify_period > 0) { +- gint64 already_elapsed_time; ++ gint64 seconds_since_last_notification; ++ guint seconds_between_notifications; ++ guint seconds_until_next_notification; + +- already_elapsed_time = MAX (0, (g_get_monotonic_time () - manager->priv->last_notify_time) / G_USEC_PER_SEC); ++ seconds_since_last_notification = MAX (0, (g_get_monotonic_time () - manager->priv->last_notify_time) / G_USEC_PER_SEC); ++ seconds_between_notifications = manager->priv->notify_period * 60; + +- manager->priv->notify_period_timeout_id = g_timeout_add_seconds (MAX (0, manager->priv->notify_period * 60 - already_elapsed_time), ++ if (seconds_since_last_notification > seconds_between_notifications) ++ seconds_until_next_notification = seconds_between_notifications; ++ else ++ seconds_until_next_notification = seconds_between_notifications - seconds_since_last_notification; ++ ++ manager->priv->notify_period_timeout_id = g_timeout_add_seconds (seconds_until_next_notification, + (GSourceFunc) on_notify_period_elapsed, + manager); + } + } + + static void + on_got_password_expiration_policy (GsdAccountsUser *accounts_user_proxy, + GAsyncResult *res, + gpointer user_data) + { + GsdAccountManager *manager = user_data; + g_autoptr(GError) error = NULL; + gboolean succeeded; + gint64 expiration_time; + gint64 last_change_time; + gint64 min_days_between_changes; + gint64 max_days_between_changes; + gint64 days_to_warn; + gint64 days_after_expiration_until_lock; + + gnome_settings_profile_start (NULL); + succeeded = gsd_accounts_user_call_get_password_expiration_policy_finish (accounts_user_proxy, + &expiration_time, + &last_change_time, + &min_days_between_changes, + &max_days_between_changes, + &days_to_warn, + &days_after_expiration_until_lock, + res, + &error); +-- +2.21.0 + diff --git a/0004-subman-Drop-userlang-field.patch b/0004-subman-Drop-userlang-field.patch new file mode 100644 index 0000000..559be02 --- /dev/null +++ b/0004-subman-Drop-userlang-field.patch @@ -0,0 +1,454 @@ +From df08a65d86626ff135a12d96cff6f48f3f1864ae Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Thu, 20 Aug 2020 11:20:47 -0400 +Subject: [PATCH 04/15] subman: Drop userlang field + +It's currently always erroneously set to empty string. + +This commit drops it, and just uses "C.UTF-8" everywhere, +which is what we actually want. +--- + plugins/subman/gsd-subscription-manager.c | 14 ++++++-------- + 1 file changed, 6 insertions(+), 8 deletions(-) + +diff --git a/plugins/subman/gsd-subscription-manager.c b/plugins/subman/gsd-subscription-manager.c +index a8c18a26..46f051a5 100644 +--- a/plugins/subman/gsd-subscription-manager.c ++++ b/plugins/subman/gsd-subscription-manager.c +@@ -45,61 +45,60 @@ static const gchar introspection_xml[] = + " " + " " + " " + " " + " " + " " + ""; + + #define GSD_SUBSCRIPTION_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GSD_TYPE_SUBSCRIPTION_MANAGER, GsdSubscriptionManagerPrivate)) + + typedef enum { + _RHSM_INTERFACE_CONFIG, + _RHSM_INTERFACE_REGISTER_SERVER, + _RHSM_INTERFACE_ATTACH, + _RHSM_INTERFACE_ENTITLEMENT, + _RHSM_INTERFACE_PRODUCTS, + _RHSM_INTERFACE_CONSUMER, + _RHSM_INTERFACE_SYSPURPOSE, + _RHSM_INTERFACE_LAST + } _RhsmInterface; + + struct GsdSubscriptionManagerPrivate + { + /* D-Bus */ + guint name_id; + GDBusNodeInfo *introspection_data; + GDBusConnection *connection; + GCancellable *bus_cancellable; + + GDBusProxy *proxies[_RHSM_INTERFACE_LAST]; +- const gchar *userlang; /* owned by GLib internally */ + GHashTable *config; /* str:str */ + GPtrArray *installed_products; + gchar *address; + + GTimer *timer_last_notified; + NotifyNotification *notification_expired; + NotifyNotification *notification_registered; + NotifyNotification *notification_registration_required; + GsdSubmanSubscriptionStatus subscription_status; + GsdSubmanSubscriptionStatus subscription_status_last; + }; + + enum { + PROP_0, + }; + + static void gsd_subscription_manager_class_init (GsdSubscriptionManagerClass *klass); + static void gsd_subscription_manager_init (GsdSubscriptionManager *subscription_manager); + static void gsd_subscription_manager_finalize (GObject *object); + + G_DEFINE_TYPE (GsdSubscriptionManager, gsd_subscription_manager, G_TYPE_OBJECT) + + typedef struct + { + gchar *product_name; + gchar *product_id; + gchar *version; + gchar *arch; + gchar *status; + gchar *starts; +@@ -197,61 +196,61 @@ _emit_property_changed (GsdSubscriptionManager *manager, + property_value); + g_dbus_connection_emit_signal (priv->connection, + NULL, + GSD_SUBSCRIPTION_DBUS_PATH, + "org.freedesktop.DBus.Properties", + "PropertiesChanged", + g_variant_new ("(sa{sv}as)", + GSD_SUBSCRIPTION_DBUS_INTERFACE, + &builder, + &invalidated_builder), + NULL); + g_variant_builder_clear (&builder); + g_variant_builder_clear (&invalidated_builder); + } + + static gboolean + _client_installed_products_update (GsdSubscriptionManager *manager, GError **error) + { + GsdSubscriptionManagerPrivate *priv = manager->priv; + JsonNode *json_root; + JsonArray *json_products_array; + const gchar *json_txt = NULL; + g_autoptr(GVariant) val = NULL; + g_autoptr(JsonParser) json_parser = json_parser_new (); + + val = g_dbus_proxy_call_sync (priv->proxies[_RHSM_INTERFACE_PRODUCTS], + "ListInstalledProducts", + g_variant_new ("(sa{sv}s)", + "" /* filter_string */, + NULL /* proxy_options */, +- priv->userlang), ++ "C.UTF-8"), + G_DBUS_CALL_FLAGS_NONE, + -1, NULL, error); + if (val == NULL) + return FALSE; + g_variant_get (val, "(&s)", &json_txt); + g_debug ("Products.ListInstalledProducts JSON: %s", json_txt); + if (!json_parser_load_from_data (json_parser, json_txt, -1, error)) + return FALSE; + json_root = json_parser_get_root (json_parser); + json_products_array = json_node_get_array (json_root); + if (json_products_array == NULL) { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_DATA, + "no InstalledProducts array in %s", json_txt); + return FALSE; + } + + g_ptr_array_set_size (priv->installed_products, 0); + + for (guint i = 0; i < json_array_get_length (json_products_array); i++) { + JsonArray *json_product = json_array_get_array_element (json_products_array, i); + g_autoptr(ProductData) product = g_new0 (ProductData, 1); + + if (json_product == NULL) + continue; + if (json_array_get_length (json_product) < 8) { + g_debug ("Unexpected number of array elements in InstalledProducts JSON"); + continue; + } + + product->product_name = g_strdup (json_array_get_string_element (json_product, 0)); +@@ -263,179 +262,179 @@ _client_installed_products_update (GsdSubscriptionManager *manager, GError **err + product->ends = g_strdup (json_array_get_string_element (json_product, 7)); + + g_ptr_array_add (priv->installed_products, g_steal_pointer (&product)); + } + + /* emit notification for g-c-c */ + _emit_property_changed (manager, "InstalledProducts", + _make_installed_products_variant (priv->installed_products)); + + return TRUE; + } + + static gboolean + _client_subscription_status_update (GsdSubscriptionManager *manager, GError **error) + { + GsdSubscriptionManagerPrivate *priv = manager->priv; + JsonNode *json_root; + JsonObject *json_obj; + const gchar *json_txt = NULL; + const gchar *status_txt = NULL; + g_autoptr(GVariant) val = NULL; + g_autoptr(JsonParser) json_parser = json_parser_new (); + + /* save old value */ + priv->subscription_status_last = priv->subscription_status; + + val = g_dbus_proxy_call_sync (priv->proxies[_RHSM_INTERFACE_ENTITLEMENT], + "GetStatus", + g_variant_new ("(ss)", + "", /* assumed as 'now' */ +- priv->userlang), ++ "C.UTF-8"), + G_DBUS_CALL_FLAGS_NONE, + -1, NULL, error); + if (val == NULL) + return FALSE; + g_variant_get (val, "(&s)", &json_txt); + g_debug ("Entitlement.GetStatus JSON: %s", json_txt); + if (!json_parser_load_from_data (json_parser, json_txt, -1, error)) + return FALSE; + json_root = json_parser_get_root (json_parser); + json_obj = json_node_get_object (json_root); + if (!json_object_has_member (json_obj, "status")) { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_DATA, + "no Entitlement.GetStatus status in %s", json_txt); + return FALSE; + } + + status_txt = json_object_get_string_member (json_obj, "status"); + g_debug ("Entitlement.GetStatus: %s", status_txt); + priv->subscription_status = _client_subscription_status_from_text (status_txt); + + /* emit notification for g-c-c */ + if (priv->subscription_status != priv->subscription_status_last) { + _emit_property_changed (manager, "SubscriptionStatus", + g_variant_new_uint32 (priv->subscription_status)); + } + + return TRUE; + } + + static gboolean + _client_syspurpose_update (GsdSubscriptionManager *manager, GError **error) + { + GsdSubscriptionManagerPrivate *priv = manager->priv; + JsonNode *json_root; + JsonObject *json_obj; + const gchar *json_txt = NULL; + g_autoptr(GVariant) val = NULL; + g_autoptr(JsonParser) json_parser = json_parser_new (); + + val = g_dbus_proxy_call_sync (priv->proxies[_RHSM_INTERFACE_SYSPURPOSE], + "GetSyspurpose", +- g_variant_new ("(s)", priv->userlang), ++ g_variant_new ("(s)", "C.UTF-8"), + G_DBUS_CALL_FLAGS_NONE, + -1, NULL, error); + if (val == NULL) + return FALSE; + g_variant_get (val, "(&s)", &json_txt); + g_debug ("Syspurpose.GetSyspurpose JSON: %s", json_txt); + if (!json_parser_load_from_data (json_parser, json_txt, -1, error)) + return FALSE; + json_root = json_parser_get_root (json_parser); + json_obj = json_node_get_object (json_root); + if (!json_object_has_member (json_obj, "status")) { + g_debug ("Syspurpose.GetSyspurpose: Unknown"); + return TRUE; + } + g_debug ("Syspurpose.GetSyspurpose: '%s", json_object_get_string_member (json_obj, "status")); + return TRUE; + } + + static gboolean + _client_register_start (GsdSubscriptionManager *manager, GError **error) + { + GsdSubscriptionManagerPrivate *priv = manager->priv; + const gchar *address = NULL; + g_autoptr(GDBusProxy) proxy = NULL; + g_autoptr(GVariant) val = NULL; + + /* already started */ + if (priv->address != NULL) + return TRUE; + + /* apparently: "we can't send registration credentials over the regular + * system or session bus since those aren't really locked down..." */ + proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, + G_DBUS_PROXY_FLAGS_NONE, + NULL, + "com.redhat.RHSM1", + "/com/redhat/RHSM1/RegisterServer", + "com.redhat.RHSM1.RegisterServer", + NULL, error); + if (proxy == NULL) + return FALSE; + val = g_dbus_proxy_call_sync (proxy, "Start", +- g_variant_new ("(s)", priv->userlang), ++ g_variant_new ("(s)", "C.UTF-8"), + G_DBUS_CALL_FLAGS_NONE, + -1, NULL, error); + if (val == NULL) + return FALSE; + g_variant_get (val, "(&s)", &address); + g_debug ("RegisterServer.Start: %s", address); + priv->address = g_strdup (address); + return TRUE; + } + + static gboolean + _client_register_stop (GsdSubscriptionManager *manager, GError **error) + { + GsdSubscriptionManagerPrivate *priv = manager->priv; + g_autoptr(GDBusProxy) proxy = NULL; + g_autoptr(GVariant) val = NULL; + + /* already started */ + if (priv->address == NULL) + return TRUE; + + /* stop registration server */ + proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, + G_DBUS_PROXY_FLAGS_NONE, + NULL, + "com.redhat.RHSM1", + "/com/redhat/RHSM1/RegisterServer", + "com.redhat.RHSM1.RegisterServer", + NULL, error); + if (proxy == NULL) + return FALSE; + val = g_dbus_proxy_call_sync (proxy, "Stop", +- g_variant_new ("(s)", priv->userlang), ++ g_variant_new ("(s)", "C.UTF-8"), + G_DBUS_CALL_FLAGS_NONE, + -1, NULL, error); + if (val == NULL) + return FALSE; + g_clear_pointer (&priv->address, g_free); + return TRUE; + } + + static gboolean + _client_subprocess_wait_check (GSubprocess *subprocess, GError **error) + { + gint rc; + if (!g_subprocess_wait (subprocess, NULL, error)) { + g_prefix_error (error, "failed to run pkexec: "); + return FALSE; + } + rc = g_subprocess_get_exit_status (subprocess); + if (rc != 0) { + GInputStream *istream = g_subprocess_get_stderr_pipe (subprocess); + gchar buf[1024] = { 0x0 }; + gsize sz = 0; + g_input_stream_read_all (istream, buf, sizeof(buf) - 1, &sz, NULL, NULL); + if (sz == 0) { + g_set_error_literal (error, G_IO_ERROR, rc, + "Failed to run helper without stderr"); + return FALSE; + } + g_set_error_literal (error, G_IO_ERROR, rc, buf); + return FALSE; + } +@@ -637,61 +636,61 @@ _client_unregister (GsdSubscriptionManager *manager, GError **error) + "pkexec", LIBEXECDIR "/gsd-subman-helper", + "--kind", "unregister", + NULL); + if (subprocess == NULL) { + g_prefix_error (error, "failed to find pkexec: "); + return FALSE; + } + if (!_client_subprocess_wait_check (subprocess, error)) + return FALSE; + if (!_client_subscription_status_update (manager, error)) + return FALSE; + if (!_client_installed_products_update (manager, error)) + return FALSE; + _client_maybe__show_notification (manager); + return TRUE; + } + + static gboolean + _client_update_config (GsdSubscriptionManager *manager, GError **error) + { + GsdSubscriptionManagerPrivate *priv = manager->priv; + g_autoptr(GVariant) val = NULL; + g_autoptr(GVariant) val_server = NULL; + g_autoptr(GVariantDict) dict = NULL; + GVariantIter iter; + gchar *key; + gchar *value; + + val = g_dbus_proxy_call_sync (priv->proxies[_RHSM_INTERFACE_CONFIG], + "GetAll", +- g_variant_new ("(s)", priv->userlang), ++ g_variant_new ("(s)", "C.UTF-8"), + G_DBUS_CALL_FLAGS_NONE, + -1, NULL, error); + if (val == NULL) + return FALSE; + dict = g_variant_dict_new (g_variant_get_child_value (val, 0)); + val_server = g_variant_dict_lookup_value (dict, "server", G_VARIANT_TYPE("a{ss}")); + if (val_server != NULL) { + g_variant_iter_init (&iter, val_server); + while (g_variant_iter_next (&iter, "{ss}", &key, &value)) { + g_debug ("%s=%s", key, value); + g_hash_table_insert (priv->config, + g_steal_pointer (&key), + g_steal_pointer (&value)); + } + } + return TRUE; + } + + static void + _subman_proxy_signal_cb (GDBusProxy *proxy, + const gchar *sender_name, + const gchar *signal_name, + GVariant *parameters, + GsdSubscriptionManager *manager) + { + g_autoptr(GError) error = NULL; + if (!_client_syspurpose_update (manager, &error)) { + g_warning ("failed to update syspurpose: %s", error->message); + g_clear_error (&error); + } +@@ -736,61 +735,60 @@ _rhsm_interface_to_string (_RhsmInterface kind) + } + + static gboolean + _client_load (GsdSubscriptionManager *manager, GError **error) + { + GsdSubscriptionManagerPrivate *priv = manager->priv; + + priv->config = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); + + /* connect to all the interfaces on the *different* objects :| */ + for (guint i = 0; i < _RHSM_INTERFACE_LAST; i++) { + const gchar *kind = _rhsm_interface_to_string (i); + g_autofree gchar *opath = g_strdup_printf ("/com/redhat/RHSM1/%s", kind); + g_autofree gchar *iface = g_strdup_printf ("com.redhat.RHSM1.%s", kind); + priv->proxies[i] = + g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, + G_DBUS_PROXY_FLAGS_NONE, + NULL, + "com.redhat.RHSM1", + opath, iface, + NULL, + error); + if (priv->proxies[i] == NULL) + return FALSE; + /* we want to get notified if the status of the system changes */ + g_signal_connect (priv->proxies[i], "g-signal", + G_CALLBACK (_subman_proxy_signal_cb), manager); + } + + /* get initial status */ +- priv->userlang = ""; + if (!_client_update_config (manager, error)) + return FALSE; + if (!_client_subscription_status_update (manager, error)) + return FALSE; + if (!_client_installed_products_update (manager, error)) + return FALSE; + if (!_client_syspurpose_update (manager, error)) + return FALSE; + + /* success */ + return TRUE; + } + + gboolean + gsd_subscription_manager_start (GsdSubscriptionManager *manager, GError **error) + { + gboolean ret; + g_debug ("Starting subscription manager"); + gnome_settings_profile_start (NULL); + ret = _client_load (manager, error); + _client_maybe__show_notification (manager); + gnome_settings_profile_end (NULL); + return ret; + } + + void + gsd_subscription_manager_stop (GsdSubscriptionManager *manager) + { + g_debug ("Stopping subscription manager"); + _client_unload (manager); +-- +2.30.0 + diff --git a/0005-subman-Use-user-locale-for-registration-subscription.patch b/0005-subman-Use-user-locale-for-registration-subscription.patch new file mode 100644 index 0000000..fa6973b --- /dev/null +++ b/0005-subman-Use-user-locale-for-registration-subscription.patch @@ -0,0 +1,373 @@ +From db73e2211ecc746434d78d23d801c92581fa8824 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Sun, 24 Jan 2021 15:04:17 -0500 +Subject: [PATCH 05/15] subman: Use user locale for registration/subscription + operations + +This makes sure that error messages are in the correct locale. +--- + plugins/subman/gsd-subman-helper.c | 17 +++++++++++------ + 1 file changed, 11 insertions(+), 6 deletions(-) + +diff --git a/plugins/subman/gsd-subman-helper.c b/plugins/subman/gsd-subman-helper.c +index af7a82e9..f84e91bf 100644 +--- a/plugins/subman/gsd-subman-helper.c ++++ b/plugins/subman/gsd-subman-helper.c +@@ -1,61 +1,63 @@ + /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * + * Copyright (C) 2019 Richard Hughes + * + * Licensed under the GNU General Public License Version 2 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + + #include "config.h" + + #include + #include + #include ++#include + + #include + #include + + #define DBUS_TIMEOUT 300000 /* 5 minutes */ ++static const char *locale; + + static void + _helper_convert_error (const gchar *json_txt, GError **error) + { + JsonNode *json_root; + JsonObject *json_obj; + const gchar *message; + g_autoptr(JsonParser) json_parser = json_parser_new (); + + /* this may be plain text or JSON :| */ + if (!json_parser_load_from_data (json_parser, json_txt, -1, NULL)) { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + json_txt); + return; + } + json_root = json_parser_get_root (json_parser); + json_obj = json_node_get_object (json_root); + if (!json_object_has_member (json_obj, "message")) { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "no message' in %s", json_txt); + return; + } + message = json_object_get_string_member (json_obj, "message"); + if (g_strstr_len (message, -1, "Invalid user credentials") != NULL) { + g_set_error_literal (error, + G_IO_ERROR, +@@ -67,184 +69,187 @@ _helper_convert_error (const gchar *json_txt, GError **error) + G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + message); + } + + static gboolean + _helper_unregister (GError **error) + { + g_autoptr(GDBusProxy) proxy = NULL; + g_autoptr(GVariantBuilder) proxy_options = NULL; + g_autoptr(GVariant) res = NULL; + + g_debug ("unregistering"); + proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | + G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS, + NULL, + "com.redhat.RHSM1", + "/com/redhat/RHSM1/Unregister", + "com.redhat.RHSM1.Unregister", + NULL, error); + if (proxy == NULL) { + g_prefix_error (error, "Failed to get proxy: "); + return FALSE; + } + proxy_options = g_variant_builder_new (G_VARIANT_TYPE_VARDICT); + res = g_dbus_proxy_call_sync (proxy, + "Unregister", + g_variant_new ("(a{sv}s)", + proxy_options, +- ""), /* lang */ ++ locale), + G_DBUS_CALL_FLAGS_NONE, + DBUS_TIMEOUT, + NULL, error); + return res != NULL; + } + + static gboolean + _helper_auto_attach (GError **error) + { + const gchar *str = NULL; + g_autoptr(GDBusProxy) proxy = NULL; + g_autoptr(GVariantBuilder) proxy_options = NULL; + g_autoptr(GVariant) res = NULL; + + g_debug ("auto-attaching subscriptions"); + proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | + G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS, + NULL, + "com.redhat.RHSM1", + "/com/redhat/RHSM1/Attach", + "com.redhat.RHSM1.Attach", + NULL, error); + if (proxy == NULL) { + g_prefix_error (error, "Failed to get proxy: "); + return FALSE; + } + proxy_options = g_variant_builder_new (G_VARIANT_TYPE_VARDICT); + res = g_dbus_proxy_call_sync (proxy, + "AutoAttach", + g_variant_new ("(sa{sv}s)", + "", /* now? */ + proxy_options, +- ""), /* lang */ ++ locale), + G_DBUS_CALL_FLAGS_NONE, + DBUS_TIMEOUT, + NULL, error); + if (res == NULL) + return FALSE; + g_variant_get (res, "(&s)", &str); + g_debug ("Attach.AutoAttach: %s", str); + return TRUE; + } + + static gboolean + _helper_save_config (const gchar *key, const gchar *value, GError **error) + { + g_autoptr(GDBusProxy) proxy = NULL; + g_autoptr(GVariant) res = NULL; + proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | + G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS, + NULL, + "com.redhat.RHSM1", + "/com/redhat/RHSM1/Config", + "com.redhat.RHSM1.Config", + NULL, error); + if (proxy == NULL) { + g_prefix_error (error, "Failed to get proxy: "); + return FALSE; + } + res = g_dbus_proxy_call_sync (proxy, "Set", + g_variant_new ("(svs)", + key, + g_variant_new_string (value), +- ""), /* lang */ ++ locale), + G_DBUS_CALL_FLAGS_NONE, + DBUS_TIMEOUT, + NULL, error); + return res != NULL; + } + + int + main (int argc, char *argv[]) + { +- const gchar *userlang = ""; /* as root, so no translations */ + g_autofree gchar *activation_key = NULL; + g_autofree gchar *address = NULL; + g_autofree gchar *hostname = NULL; + g_autofree gchar *kind = NULL; + g_autofree gchar *organisation = NULL; + g_autofree gchar *password = NULL; + g_autofree gchar *port = NULL; + g_autofree gchar *prefix = NULL; + g_autofree gchar *proxy_server = NULL; + g_autofree gchar *username = NULL; + g_autoptr(GDBusConnection) conn_private = NULL; + g_autoptr(GDBusProxy) proxy = NULL; + g_autoptr(GError) error = NULL; + g_autoptr(GOptionContext) context = g_option_context_new (NULL); + g_autoptr(GVariantBuilder) proxy_options = NULL; + g_autoptr(GVariantBuilder) subman_conopts = NULL; + g_autoptr(GVariantBuilder) subman_options = NULL; + + const GOptionEntry options[] = { + { "kind", '\0', G_OPTION_FLAG_NONE, G_OPTION_ARG_STRING, + &kind, "Kind, e.g. 'username' or 'key'", NULL }, + { "address", '\0', G_OPTION_FLAG_NONE, G_OPTION_ARG_STRING, + &address, "UNIX address", NULL }, + { "username", '\0', G_OPTION_FLAG_NONE, G_OPTION_ARG_STRING, + &username, "Username", NULL }, + { "password", '\0', G_OPTION_FLAG_NONE, G_OPTION_ARG_STRING, + &password, "Password", NULL }, + { "organisation", '\0', G_OPTION_FLAG_NONE, G_OPTION_ARG_STRING, + &organisation, "Organisation", NULL }, + { "activation-key", '\0', G_OPTION_FLAG_NONE, G_OPTION_ARG_STRING, + &activation_key, "Activation keys", NULL }, + { "hostname", '\0', G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_STRING, + &hostname, "Registration server hostname", NULL }, + { "prefix", '\0', G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_STRING, + &prefix, "Registration server prefix", NULL }, + { "port", '\0', G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_STRING, + &port, "Registration server port", NULL }, + { "proxy", '\0', G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_STRING, + &proxy_server, "Proxy settings", NULL }, + { NULL} + }; + + /* check calling UID */ + if (getuid () != 0 || geteuid () != 0) { + g_printerr ("This program can only be used by the root user\n"); + return G_IO_ERROR_NOT_SUPPORTED; + } ++ ++ setlocale (LC_ALL, ""); ++ locale = setlocale (LC_MESSAGES, NULL); ++ + g_option_context_add_main_entries (context, options, NULL); + if (!g_option_context_parse (context, &argc, &argv, &error)) { + g_printerr ("Failed to parse arguments: %s\n", error->message); + return G_IO_ERROR_NOT_SUPPORTED; + } + + /* uncommon actions */ + if (kind == NULL) { + g_printerr ("No --kind specified\n"); + return G_IO_ERROR_INVALID_DATA; + } + if (g_strcmp0 (kind, "unregister") == 0) { + if (!_helper_unregister (&error)) { + g_printerr ("Failed to Unregister: %s\n", error->message); + return G_IO_ERROR_NOT_INITIALIZED; + } + return EXIT_SUCCESS; + } + if (g_strcmp0 (kind, "auto-attach") == 0) { + if (!_helper_auto_attach (&error)) { + g_printerr ("Failed to AutoAttach: %s\n", error->message); + return G_IO_ERROR_NOT_INITIALIZED; + } + return EXIT_SUCCESS; + } + + /* connect to abstract socket for reasons */ + if (address == NULL) { + g_printerr ("No --address specified\n"); + return G_IO_ERROR_INVALID_DATA; +@@ -281,96 +286,96 @@ main (int argc, char *argv[]) + port = g_strdup ("443"); + subman_conopts = g_variant_builder_new (G_VARIANT_TYPE("a{ss}")); + g_variant_builder_add (subman_conopts, "{ss}", "host", hostname); + g_variant_builder_add (subman_conopts, "{ss}", "handler", prefix); + g_variant_builder_add (subman_conopts, "{ss}", "port", port); + + /* call into RHSM */ + if (g_strcmp0 (kind, "register-with-key") == 0) { + g_auto(GStrv) activation_keys = NULL; + g_autoptr(GError) error_local = NULL; + g_autoptr(GVariant) res = NULL; + + if (activation_key == NULL) { + g_printerr ("Required --activation-key\n"); + return G_IO_ERROR_INVALID_DATA; + } + if (organisation == NULL) { + g_printerr ("Required --organisation\n"); + return G_IO_ERROR_INVALID_DATA; + } + + g_debug ("registering using activation key"); + activation_keys = g_strsplit (activation_key, ",", -1); + res = g_dbus_proxy_call_sync (proxy, + "RegisterWithActivationKeys", + g_variant_new ("(s^asa{ss}a{ss}s)", + organisation, + activation_keys, + subman_options, + subman_conopts, +- userlang), ++ locale), + G_DBUS_CALL_FLAGS_NO_AUTO_START, + DBUS_TIMEOUT, + NULL, &error_local); + if (res == NULL) { + g_dbus_error_strip_remote_error (error_local); + _helper_convert_error (error_local->message, &error); + g_printerr ("Failed to RegisterWithActivationKeys: %s\n", error->message); + return error->code; + } + } else if (g_strcmp0 (kind, "register-with-username") == 0) { + g_autoptr(GError) error_local = NULL; + g_autoptr(GVariant) res = NULL; + + g_debug ("registering using username and password"); + if (username == NULL) { + g_printerr ("Required --username\n"); + return G_IO_ERROR_INVALID_DATA; + } + if (password == NULL) { + g_printerr ("Required --password\n"); + return G_IO_ERROR_INVALID_DATA; + } + if (organisation == NULL) { + g_printerr ("Required --organisation\n"); + return G_IO_ERROR_INVALID_DATA; + } + res = g_dbus_proxy_call_sync (proxy, + "Register", + g_variant_new ("(sssa{ss}a{ss}s)", + organisation, + username, + password, + subman_options, + subman_conopts, +- userlang), ++ locale), + G_DBUS_CALL_FLAGS_NO_AUTO_START, + DBUS_TIMEOUT, + NULL, &error_local); + if (res == NULL) { + g_dbus_error_strip_remote_error (error_local); + _helper_convert_error (error_local->message, &error); + g_printerr ("Failed to Register: %s\n", error->message); + return error->code; + } + } else { + g_printerr ("Invalid --kind specified: %s\n", kind); + return G_IO_ERROR_INVALID_DATA; + } + + /* set the new hostname */ + if (!_helper_save_config ("server.hostname", hostname, &error)) { + g_printerr ("Failed to save hostname: %s\n", error->message); + return G_IO_ERROR_NOT_INITIALIZED; + } + if (!_helper_save_config ("server.prefix", prefix, &error)) { + g_printerr ("Failed to save prefix: %s\n", error->message); + return G_IO_ERROR_NOT_INITIALIZED; + } + if (!_helper_save_config ("server.port", port, &error)) { + g_printerr ("Failed to save port: %s\n", error->message); + return G_IO_ERROR_NOT_INITIALIZED; + } + + /* wait for rhsmd to notice the new config */ + g_usleep (G_USEC_PER_SEC * 5); +-- +2.30.0 + diff --git a/0006-subman-Handle-subscription-manager-giving-invalid-st.patch b/0006-subman-Handle-subscription-manager-giving-invalid-st.patch new file mode 100644 index 0000000..cfd9b7c --- /dev/null +++ b/0006-subman-Handle-subscription-manager-giving-invalid-st.patch @@ -0,0 +1,236 @@ +From f8ddd2c711cd502c74eb9d45360914fe2e6e1b3f Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Thu, 20 Aug 2020 13:34:19 -0400 +Subject: [PATCH 06/15] subman: Handle subscription-manager giving invalid + status better + +subscription-manager potentially returns status messages that the +subman plugin treats as enum values translated in some unknown +other language. It could be tied to system locale, or due to a +caching bug a previous locale used. + +This commit tries to work around that bug, by instead relying on +the GetUUID() method and valid attribute. If there's no UUID we +know the system is unregistered. If there's a UUID but the valid +attribute is FALSE we know the system is registered, but hasn't +got proper entitlements. +--- + plugins/subman/gsd-subscription-manager.c | 69 ++++++++++++----------- + 1 file changed, 36 insertions(+), 33 deletions(-) + +diff --git a/plugins/subman/gsd-subscription-manager.c b/plugins/subman/gsd-subscription-manager.c +index 46f051a5..e2c16056 100644 +--- a/plugins/subman/gsd-subscription-manager.c ++++ b/plugins/subman/gsd-subscription-manager.c +@@ -104,77 +104,60 @@ typedef struct + gchar *starts; + gchar *ends; + } ProductData; + + static void + product_data_free (ProductData *product) + { + g_free (product->product_name); + g_free (product->product_id); + g_free (product->version); + g_free (product->arch); + g_free (product->status); + g_free (product->starts); + g_free (product->ends); + g_free (product); + } + + G_DEFINE_AUTOPTR_CLEANUP_FUNC (ProductData, product_data_free); + + static gpointer manager_object = NULL; + + GQuark + gsd_subscription_manager_error_quark (void) + { + static GQuark quark = 0; + if (!quark) + quark = g_quark_from_static_string ("gsd_subscription_manager_error"); + return quark; + } + +-static GsdSubmanSubscriptionStatus +-_client_subscription_status_from_text (const gchar *status_txt) +-{ +- if (g_strcmp0 (status_txt, "Unknown") == 0) +- return GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN; +- if (g_strcmp0 (status_txt, "Current") == 0) +- return GSD_SUBMAN_SUBSCRIPTION_STATUS_VALID; +- if (g_strcmp0 (status_txt, "Invalid") == 0) +- return GSD_SUBMAN_SUBSCRIPTION_STATUS_INVALID; +- if (g_strcmp0 (status_txt, "Disabled") == 0) +- return GSD_SUBMAN_SUBSCRIPTION_STATUS_DISABLED; +- if (g_strcmp0 (status_txt, "Insufficient") == 0) +- return GSD_SUBMAN_SUBSCRIPTION_STATUS_PARTIALLY_VALID; +- g_warning ("Unknown subscription status: %s", status_txt); // 'Current'? +- return GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN; +-} +- + static GVariant * + _make_installed_products_variant (GPtrArray *installed_products) + { + GVariantBuilder builder; + g_variant_builder_init (&builder, G_VARIANT_TYPE ("aa{sv}")); + + for (guint i = 0; i < installed_products->len; i++) { + ProductData *product = g_ptr_array_index (installed_products, i); + g_auto(GVariantDict) dict; + + g_variant_dict_init (&dict, NULL); + + g_variant_dict_insert (&dict, "product-name", "s", product->product_name); + g_variant_dict_insert (&dict, "product-id", "s", product->product_id); + g_variant_dict_insert (&dict, "version", "s", product->version); + g_variant_dict_insert (&dict, "arch", "s", product->arch); + g_variant_dict_insert (&dict, "status", "s", product->status); + g_variant_dict_insert (&dict, "starts", "s", product->starts); + g_variant_dict_insert (&dict, "ends", "s", product->ends); + + g_variant_builder_add_value (&builder, g_variant_dict_end (&dict)); + } + + return g_variant_builder_end (&builder); + } + + static void + _emit_property_changed (GsdSubscriptionManager *manager, + const gchar *property_name, + GVariant *property_value) +@@ -248,94 +231,114 @@ _client_installed_products_update (GsdSubscriptionManager *manager, GError **err + + if (json_product == NULL) + continue; + if (json_array_get_length (json_product) < 8) { + g_debug ("Unexpected number of array elements in InstalledProducts JSON"); + continue; + } + + product->product_name = g_strdup (json_array_get_string_element (json_product, 0)); + product->product_id = g_strdup (json_array_get_string_element (json_product, 1)); + product->version = g_strdup (json_array_get_string_element (json_product, 2)); + product->arch = g_strdup (json_array_get_string_element (json_product, 3)); + product->status = g_strdup (json_array_get_string_element (json_product, 4)); + product->starts = g_strdup (json_array_get_string_element (json_product, 6)); + product->ends = g_strdup (json_array_get_string_element (json_product, 7)); + + g_ptr_array_add (priv->installed_products, g_steal_pointer (&product)); + } + + /* emit notification for g-c-c */ + _emit_property_changed (manager, "InstalledProducts", + _make_installed_products_variant (priv->installed_products)); + + return TRUE; + } + + static gboolean + _client_subscription_status_update (GsdSubscriptionManager *manager, GError **error) + { + GsdSubscriptionManagerPrivate *priv = manager->priv; ++ g_autoptr(GVariant) uuid = NULL; ++ const gchar *uuid_txt = NULL; + JsonNode *json_root; + JsonObject *json_obj; + const gchar *json_txt = NULL; +- const gchar *status_txt = NULL; +- g_autoptr(GVariant) val = NULL; ++ g_autoptr(GVariant) status = NULL; + g_autoptr(JsonParser) json_parser = json_parser_new (); + + /* save old value */ + priv->subscription_status_last = priv->subscription_status; + +- val = g_dbus_proxy_call_sync (priv->proxies[_RHSM_INTERFACE_ENTITLEMENT], +- "GetStatus", +- g_variant_new ("(ss)", +- "", /* assumed as 'now' */ +- "C.UTF-8"), +- G_DBUS_CALL_FLAGS_NONE, +- -1, NULL, error); +- if (val == NULL) ++ uuid = g_dbus_proxy_call_sync (priv->proxies[_RHSM_INTERFACE_CONSUMER], ++ "GetUuid", ++ g_variant_new ("(s)", ++ "C.UTF-8"), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, NULL, error); ++ if (uuid == NULL) + return FALSE; +- g_variant_get (val, "(&s)", &json_txt); ++ ++ g_variant_get (uuid, "(&s)", &uuid_txt); ++ ++ status = g_dbus_proxy_call_sync (priv->proxies[_RHSM_INTERFACE_ENTITLEMENT], ++ "GetStatus", ++ g_variant_new ("(ss)", ++ "", /* assumed as 'now' */ ++ "C.UTF-8"), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, NULL, error); ++ if (status == NULL) ++ return FALSE; ++ g_variant_get (status, "(&s)", &json_txt); + g_debug ("Entitlement.GetStatus JSON: %s", json_txt); + if (!json_parser_load_from_data (json_parser, json_txt, -1, error)) + return FALSE; + json_root = json_parser_get_root (json_parser); + json_obj = json_node_get_object (json_root); +- if (!json_object_has_member (json_obj, "status")) { ++ if (!json_object_has_member (json_obj, "valid")) { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_DATA, +- "no Entitlement.GetStatus status in %s", json_txt); ++ "no Entitlement.GetStatus valid in %s", json_txt); + return FALSE; + } + +- status_txt = json_object_get_string_member (json_obj, "status"); +- g_debug ("Entitlement.GetStatus: %s", status_txt); +- priv->subscription_status = _client_subscription_status_from_text (status_txt); ++ gboolean is_valid = json_object_get_boolean_member (json_obj, "valid"); ++ ++ if (uuid_txt[0] != '\0') { ++ if (is_valid) { ++ priv->subscription_status = GSD_SUBMAN_SUBSCRIPTION_STATUS_VALID; ++ } else { ++ priv->subscription_status = GSD_SUBMAN_SUBSCRIPTION_STATUS_INVALID; ++ } ++ } else { ++ priv->subscription_status = GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN; ++ } + + /* emit notification for g-c-c */ + if (priv->subscription_status != priv->subscription_status_last) { + _emit_property_changed (manager, "SubscriptionStatus", + g_variant_new_uint32 (priv->subscription_status)); + } + + return TRUE; + } + + static gboolean + _client_syspurpose_update (GsdSubscriptionManager *manager, GError **error) + { + GsdSubscriptionManagerPrivate *priv = manager->priv; + JsonNode *json_root; + JsonObject *json_obj; + const gchar *json_txt = NULL; + g_autoptr(GVariant) val = NULL; + g_autoptr(JsonParser) json_parser = json_parser_new (); + + val = g_dbus_proxy_call_sync (priv->proxies[_RHSM_INTERFACE_SYSPURPOSE], + "GetSyspurpose", + g_variant_new ("(s)", "C.UTF-8"), + G_DBUS_CALL_FLAGS_NONE, + -1, NULL, error); + if (val == NULL) + return FALSE; + g_variant_get (val, "(&s)", &json_txt); + g_debug ("Syspurpose.GetSyspurpose JSON: %s", json_txt); + if (!json_parser_load_from_data (json_parser, json_txt, -1, error)) +-- +2.30.0 + diff --git a/0007-subman-Force-re-subscribe-if-the-admin-already-subsc.patch b/0007-subman-Force-re-subscribe-if-the-admin-already-subsc.patch new file mode 100644 index 0000000..73acafa --- /dev/null +++ b/0007-subman-Force-re-subscribe-if-the-admin-already-subsc.patch @@ -0,0 +1,260 @@ +From 477dc8accccab568002bd19caa3fbf898bc05aad Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Tue, 25 Aug 2020 10:34:03 -0400 +Subject: [PATCH 07/15] subman: Force re-subscribe if the admin already + subscribed + +It's possible for an admin to to half-enroll the system with RHN, +using the CLI tools. + +Meaning, it's possible for them to register the system with the +service, but not attach to a purchased license for the machine, +the, so called, entitlements. + +The subman module always does both halves of the registration process +in lock step. This means, if an admin tries to register using GNOME +while in a half-registered state, subman will fail because the first +step, the registration step, is already finished. + +This commit addresses that problem by trying to unregister up front +before registering. +--- + plugins/subman/gsd-subman-helper.c | 11 +++++++++-- + 1 file changed, 9 insertions(+), 2 deletions(-) + +diff --git a/plugins/subman/gsd-subman-helper.c b/plugins/subman/gsd-subman-helper.c +index f84e91bf..3931ef2e 100644 +--- a/plugins/subman/gsd-subman-helper.c ++++ b/plugins/subman/gsd-subman-helper.c +@@ -51,61 +51,60 @@ _helper_convert_error (const gchar *json_txt, GError **error) + json_root = json_parser_get_root (json_parser); + json_obj = json_node_get_object (json_root); + if (!json_object_has_member (json_obj, "message")) { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "no message' in %s", json_txt); + return; + } + message = json_object_get_string_member (json_obj, "message"); + if (g_strstr_len (message, -1, "Invalid user credentials") != NULL) { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_PERMISSION_DENIED, + message); + return; + } + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + message); + } + + static gboolean + _helper_unregister (GError **error) + { + g_autoptr(GDBusProxy) proxy = NULL; + g_autoptr(GVariantBuilder) proxy_options = NULL; + g_autoptr(GVariant) res = NULL; + +- g_debug ("unregistering"); + proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | + G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS, + NULL, + "com.redhat.RHSM1", + "/com/redhat/RHSM1/Unregister", + "com.redhat.RHSM1.Unregister", + NULL, error); + if (proxy == NULL) { + g_prefix_error (error, "Failed to get proxy: "); + return FALSE; + } + proxy_options = g_variant_builder_new (G_VARIANT_TYPE_VARDICT); + res = g_dbus_proxy_call_sync (proxy, + "Unregister", + g_variant_new ("(a{sv}s)", + proxy_options, + locale), + G_DBUS_CALL_FLAGS_NONE, + DBUS_TIMEOUT, + NULL, error); + return res != NULL; + } + + static gboolean + _helper_auto_attach (GError **error) + { + const gchar *str = NULL; + g_autoptr(GDBusProxy) proxy = NULL; + g_autoptr(GVariantBuilder) proxy_options = NULL; +@@ -208,60 +207,61 @@ main (int argc, char *argv[]) + { "prefix", '\0', G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_STRING, + &prefix, "Registration server prefix", NULL }, + { "port", '\0', G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_STRING, + &port, "Registration server port", NULL }, + { "proxy", '\0', G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_STRING, + &proxy_server, "Proxy settings", NULL }, + { NULL} + }; + + /* check calling UID */ + if (getuid () != 0 || geteuid () != 0) { + g_printerr ("This program can only be used by the root user\n"); + return G_IO_ERROR_NOT_SUPPORTED; + } + + setlocale (LC_ALL, ""); + locale = setlocale (LC_MESSAGES, NULL); + + g_option_context_add_main_entries (context, options, NULL); + if (!g_option_context_parse (context, &argc, &argv, &error)) { + g_printerr ("Failed to parse arguments: %s\n", error->message); + return G_IO_ERROR_NOT_SUPPORTED; + } + + /* uncommon actions */ + if (kind == NULL) { + g_printerr ("No --kind specified\n"); + return G_IO_ERROR_INVALID_DATA; + } + if (g_strcmp0 (kind, "unregister") == 0) { ++ g_debug ("unregistering"); + if (!_helper_unregister (&error)) { + g_printerr ("Failed to Unregister: %s\n", error->message); + return G_IO_ERROR_NOT_INITIALIZED; + } + return EXIT_SUCCESS; + } + if (g_strcmp0 (kind, "auto-attach") == 0) { + if (!_helper_auto_attach (&error)) { + g_printerr ("Failed to AutoAttach: %s\n", error->message); + return G_IO_ERROR_NOT_INITIALIZED; + } + return EXIT_SUCCESS; + } + + /* connect to abstract socket for reasons */ + if (address == NULL) { + g_printerr ("No --address specified\n"); + return G_IO_ERROR_INVALID_DATA; + } + conn_private = g_dbus_connection_new_for_address_sync (address, + G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT, + NULL, NULL, + &error); + if (conn_private == NULL) { + g_printerr ("Invalid --address specified: %s\n", error->message); + return G_IO_ERROR_INVALID_DATA; + } + proxy = g_dbus_proxy_new_sync (conn_private, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, + NULL, /* GDBusInterfaceInfo */ +@@ -277,96 +277,103 @@ main (int argc, char *argv[]) + /* no options */ + subman_options = g_variant_builder_new (G_VARIANT_TYPE("a{ss}")); + + /* set registration server */ + if (hostname == NULL || hostname[0] == '\0') + hostname = g_strdup ("subscription.rhsm.redhat.com"); + if (prefix == NULL || prefix[0] == '\0') + prefix = g_strdup ("/subscription"); + if (port == NULL || port[0] == '\0') + port = g_strdup ("443"); + subman_conopts = g_variant_builder_new (G_VARIANT_TYPE("a{ss}")); + g_variant_builder_add (subman_conopts, "{ss}", "host", hostname); + g_variant_builder_add (subman_conopts, "{ss}", "handler", prefix); + g_variant_builder_add (subman_conopts, "{ss}", "port", port); + + /* call into RHSM */ + if (g_strcmp0 (kind, "register-with-key") == 0) { + g_auto(GStrv) activation_keys = NULL; + g_autoptr(GError) error_local = NULL; + g_autoptr(GVariant) res = NULL; + + if (activation_key == NULL) { + g_printerr ("Required --activation-key\n"); + return G_IO_ERROR_INVALID_DATA; + } + if (organisation == NULL) { + g_printerr ("Required --organisation\n"); + return G_IO_ERROR_INVALID_DATA; + } + ++ g_debug ("trying to unregister in case machine is already registered"); ++ _helper_unregister (NULL); ++ + g_debug ("registering using activation key"); + activation_keys = g_strsplit (activation_key, ",", -1); + res = g_dbus_proxy_call_sync (proxy, + "RegisterWithActivationKeys", + g_variant_new ("(s^asa{ss}a{ss}s)", + organisation, + activation_keys, + subman_options, + subman_conopts, + locale), + G_DBUS_CALL_FLAGS_NO_AUTO_START, + DBUS_TIMEOUT, + NULL, &error_local); + if (res == NULL) { + g_dbus_error_strip_remote_error (error_local); + _helper_convert_error (error_local->message, &error); + g_printerr ("Failed to RegisterWithActivationKeys: %s\n", error->message); + return error->code; + } + } else if (g_strcmp0 (kind, "register-with-username") == 0) { + g_autoptr(GError) error_local = NULL; + g_autoptr(GVariant) res = NULL; + +- g_debug ("registering using username and password"); + if (username == NULL) { + g_printerr ("Required --username\n"); + return G_IO_ERROR_INVALID_DATA; + } + if (password == NULL) { + g_printerr ("Required --password\n"); + return G_IO_ERROR_INVALID_DATA; + } + if (organisation == NULL) { + g_printerr ("Required --organisation\n"); + return G_IO_ERROR_INVALID_DATA; + } ++ ++ g_debug ("trying to unregister in case machine is already registered"); ++ _helper_unregister (NULL); ++ ++ g_debug ("registering using username and password"); + res = g_dbus_proxy_call_sync (proxy, + "Register", + g_variant_new ("(sssa{ss}a{ss}s)", + organisation, + username, + password, + subman_options, + subman_conopts, + locale), + G_DBUS_CALL_FLAGS_NO_AUTO_START, + DBUS_TIMEOUT, + NULL, &error_local); + if (res == NULL) { + g_dbus_error_strip_remote_error (error_local); + _helper_convert_error (error_local->message, &error); + g_printerr ("Failed to Register: %s\n", error->message); + return error->code; + } + } else { + g_printerr ("Invalid --kind specified: %s\n", kind); + return G_IO_ERROR_INVALID_DATA; + } + + /* set the new hostname */ + if (!_helper_save_config ("server.hostname", hostname, &error)) { + g_printerr ("Failed to save hostname: %s\n", error->message); + return G_IO_ERROR_NOT_INITIALIZED; + } + if (!_helper_save_config ("server.prefix", prefix, &error)) { + g_printerr ("Failed to save prefix: %s\n", error->message); +-- +2.30.0 + diff --git a/0008-subman-Don-t-send-secrets-through-command-line.patch b/0008-subman-Don-t-send-secrets-through-command-line.patch new file mode 100644 index 0000000..bd85eaf --- /dev/null +++ b/0008-subman-Don-t-send-secrets-through-command-line.patch @@ -0,0 +1,576 @@ +From b73800da7f384eea66b6eb67f5f40129f3dfc372 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Tue, 25 Aug 2020 16:20:42 -0400 +Subject: [PATCH 08/15] subman: Don't send secrets through command line + +The command line is introspectable with "ps", and it even gets logged +to syslog, so it's not suitable for passing secrets. + +Unfortunately, the user's password is currently passed. + +This commit addresses that problem by passing the password through +stdin, instead. +--- + plugins/subman/gsd-subman-helper.c | 32 ++++++++------ + plugins/subman/gsd-subscription-manager.c | 52 ++++++++++++++++++++--- + plugins/subman/meson.build | 2 +- + 3 files changed, 66 insertions(+), 20 deletions(-) + +diff --git a/plugins/subman/gsd-subman-helper.c b/plugins/subman/gsd-subman-helper.c +index 3931ef2e..edf1e41f 100644 +--- a/plugins/subman/gsd-subman-helper.c ++++ b/plugins/subman/gsd-subman-helper.c +@@ -1,59 +1,61 @@ + /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * + * Copyright (C) 2019 Richard Hughes + * + * Licensed under the GNU General Public License Version 2 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + + #include "config.h" + ++ + #include + #include + #include + #include + + #include ++#include + #include + + #define DBUS_TIMEOUT 300000 /* 5 minutes */ + static const char *locale; + + static void + _helper_convert_error (const gchar *json_txt, GError **error) + { + JsonNode *json_root; + JsonObject *json_obj; + const gchar *message; + g_autoptr(JsonParser) json_parser = json_parser_new (); + + /* this may be plain text or JSON :| */ + if (!json_parser_load_from_data (json_parser, json_txt, -1, NULL)) { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + json_txt); + return; + } + json_root = json_parser_get_root (json_parser); + json_obj = json_node_get_object (json_root); + if (!json_object_has_member (json_obj, "message")) { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "no message' in %s", json_txt); + return; + } +@@ -149,86 +151,82 @@ _helper_save_config (const gchar *key, const gchar *value, GError **error) + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | + G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS, + NULL, + "com.redhat.RHSM1", + "/com/redhat/RHSM1/Config", + "com.redhat.RHSM1.Config", + NULL, error); + if (proxy == NULL) { + g_prefix_error (error, "Failed to get proxy: "); + return FALSE; + } + res = g_dbus_proxy_call_sync (proxy, "Set", + g_variant_new ("(svs)", + key, + g_variant_new_string (value), + locale), + G_DBUS_CALL_FLAGS_NONE, + DBUS_TIMEOUT, + NULL, error); + return res != NULL; + } + + int + main (int argc, char *argv[]) + { + g_autofree gchar *activation_key = NULL; + g_autofree gchar *address = NULL; + g_autofree gchar *hostname = NULL; + g_autofree gchar *kind = NULL; + g_autofree gchar *organisation = NULL; +- g_autofree gchar *password = NULL; + g_autofree gchar *port = NULL; + g_autofree gchar *prefix = NULL; + g_autofree gchar *proxy_server = NULL; + g_autofree gchar *username = NULL; + g_autoptr(GDBusConnection) conn_private = NULL; + g_autoptr(GDBusProxy) proxy = NULL; + g_autoptr(GError) error = NULL; + g_autoptr(GOptionContext) context = g_option_context_new (NULL); + g_autoptr(GVariantBuilder) proxy_options = NULL; + g_autoptr(GVariantBuilder) subman_conopts = NULL; + g_autoptr(GVariantBuilder) subman_options = NULL; ++ g_autoptr(GInputStream) standard_input_stream = g_unix_input_stream_new (STDIN_FILENO, FALSE); + + const GOptionEntry options[] = { + { "kind", '\0', G_OPTION_FLAG_NONE, G_OPTION_ARG_STRING, + &kind, "Kind, e.g. 'username' or 'key'", NULL }, + { "address", '\0', G_OPTION_FLAG_NONE, G_OPTION_ARG_STRING, + &address, "UNIX address", NULL }, + { "username", '\0', G_OPTION_FLAG_NONE, G_OPTION_ARG_STRING, + &username, "Username", NULL }, +- { "password", '\0', G_OPTION_FLAG_NONE, G_OPTION_ARG_STRING, +- &password, "Password", NULL }, + { "organisation", '\0', G_OPTION_FLAG_NONE, G_OPTION_ARG_STRING, + &organisation, "Organisation", NULL }, +- { "activation-key", '\0', G_OPTION_FLAG_NONE, G_OPTION_ARG_STRING, +- &activation_key, "Activation keys", NULL }, + { "hostname", '\0', G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_STRING, + &hostname, "Registration server hostname", NULL }, + { "prefix", '\0', G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_STRING, + &prefix, "Registration server prefix", NULL }, + { "port", '\0', G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_STRING, + &port, "Registration server port", NULL }, + { "proxy", '\0', G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_STRING, + &proxy_server, "Proxy settings", NULL }, + { NULL} + }; + + /* check calling UID */ + if (getuid () != 0 || geteuid () != 0) { + g_printerr ("This program can only be used by the root user\n"); + return G_IO_ERROR_NOT_SUPPORTED; + } + + setlocale (LC_ALL, ""); + locale = setlocale (LC_MESSAGES, NULL); + + g_option_context_add_main_entries (context, options, NULL); + if (!g_option_context_parse (context, &argc, &argv, &error)) { + g_printerr ("Failed to parse arguments: %s\n", error->message); + return G_IO_ERROR_NOT_SUPPORTED; + } + + /* uncommon actions */ + if (kind == NULL) { + g_printerr ("No --kind specified\n"); + return G_IO_ERROR_INVALID_DATA; +@@ -267,109 +265,117 @@ main (int argc, char *argv[]) + NULL, /* GDBusInterfaceInfo */ + NULL, /* name */ + "/com/redhat/RHSM1/Register", + "com.redhat.RHSM1.Register", + NULL, &error); + if (proxy == NULL) { + g_printerr ("Count not contact RHSM: %s\n", error->message); + return G_IO_ERROR_NOT_FOUND; + } + + /* no options */ + subman_options = g_variant_builder_new (G_VARIANT_TYPE("a{ss}")); + + /* set registration server */ + if (hostname == NULL || hostname[0] == '\0') + hostname = g_strdup ("subscription.rhsm.redhat.com"); + if (prefix == NULL || prefix[0] == '\0') + prefix = g_strdup ("/subscription"); + if (port == NULL || port[0] == '\0') + port = g_strdup ("443"); + subman_conopts = g_variant_builder_new (G_VARIANT_TYPE("a{ss}")); + g_variant_builder_add (subman_conopts, "{ss}", "host", hostname); + g_variant_builder_add (subman_conopts, "{ss}", "handler", prefix); + g_variant_builder_add (subman_conopts, "{ss}", "port", port); + + /* call into RHSM */ + if (g_strcmp0 (kind, "register-with-key") == 0) { + g_auto(GStrv) activation_keys = NULL; + g_autoptr(GError) error_local = NULL; + g_autoptr(GVariant) res = NULL; ++ gchar activation_key[PIPE_BUF + 1] = ""; + +- if (activation_key == NULL) { +- g_printerr ("Required --activation-key\n"); +- return G_IO_ERROR_INVALID_DATA; +- } + if (organisation == NULL) { + g_printerr ("Required --organisation\n"); + return G_IO_ERROR_INVALID_DATA; + } + ++ g_input_stream_read (standard_input_stream, activation_key, sizeof (activation_key) - 1, NULL, &error_local); ++ ++ if (error_local != NULL) { ++ g_printerr ("Could not read activation key: %s\n", error_local->message); ++ return G_IO_ERROR_INVALID_DATA; ++ } ++ + g_debug ("trying to unregister in case machine is already registered"); + _helper_unregister (NULL); + + g_debug ("registering using activation key"); + activation_keys = g_strsplit (activation_key, ",", -1); + res = g_dbus_proxy_call_sync (proxy, + "RegisterWithActivationKeys", + g_variant_new ("(s^asa{ss}a{ss}s)", + organisation, + activation_keys, + subman_options, + subman_conopts, + locale), + G_DBUS_CALL_FLAGS_NO_AUTO_START, + DBUS_TIMEOUT, + NULL, &error_local); + if (res == NULL) { + g_dbus_error_strip_remote_error (error_local); + _helper_convert_error (error_local->message, &error); + g_printerr ("Failed to RegisterWithActivationKeys: %s\n", error->message); + return error->code; + } + } else if (g_strcmp0 (kind, "register-with-username") == 0) { + g_autoptr(GError) error_local = NULL; + g_autoptr(GVariant) res = NULL; ++ gchar password[PIPE_BUF + 1] = ""; + + if (username == NULL) { + g_printerr ("Required --username\n"); + return G_IO_ERROR_INVALID_DATA; + } +- if (password == NULL) { +- g_printerr ("Required --password\n"); +- return G_IO_ERROR_INVALID_DATA; +- } + if (organisation == NULL) { + g_printerr ("Required --organisation\n"); + return G_IO_ERROR_INVALID_DATA; + } + ++ g_input_stream_read (standard_input_stream, password, sizeof (password) - 1, NULL, &error_local); ++ ++ if (error_local != NULL) { ++ g_printerr ("Could not read password: %s\n", error_local->message); ++ return G_IO_ERROR_INVALID_DATA; ++ } ++ + g_debug ("trying to unregister in case machine is already registered"); + _helper_unregister (NULL); + + g_debug ("registering using username and password"); + res = g_dbus_proxy_call_sync (proxy, + "Register", + g_variant_new ("(sssa{ss}a{ss}s)", + organisation, + username, + password, + subman_options, + subman_conopts, + locale), + G_DBUS_CALL_FLAGS_NO_AUTO_START, + DBUS_TIMEOUT, + NULL, &error_local); + if (res == NULL) { + g_dbus_error_strip_remote_error (error_local); + _helper_convert_error (error_local->message, &error); + g_printerr ("Failed to Register: %s\n", error->message); + return error->code; + } + } else { + g_printerr ("Invalid --kind specified: %s\n", kind); + return G_IO_ERROR_INVALID_DATA; + } + + /* set the new hostname */ + if (!_helper_save_config ("server.hostname", hostname, &error)) { + g_printerr ("Failed to save hostname: %s\n", error->message); +diff --git a/plugins/subman/gsd-subscription-manager.c b/plugins/subman/gsd-subscription-manager.c +index e2c16056..0838d490 100644 +--- a/plugins/subman/gsd-subscription-manager.c ++++ b/plugins/subman/gsd-subscription-manager.c +@@ -1,53 +1,54 @@ + /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2019 Richard Hughes + * Copyright (C) 2019 Kalev Lember + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ + + #include "config.h" + + #include ++#include + #include + #include + #include + #include + + #include "gnome-settings-profile.h" + #include "gsd-subman-common.h" + #include "gsd-subscription-manager.h" + + #define GSD_DBUS_NAME "org.gnome.SettingsDaemon" + #define GSD_DBUS_PATH "/org/gnome/SettingsDaemon" + #define GSD_DBUS_BASE_INTERFACE "org.gnome.SettingsDaemon" + + #define GSD_SUBSCRIPTION_DBUS_NAME GSD_DBUS_NAME ".Subscription" + #define GSD_SUBSCRIPTION_DBUS_PATH GSD_DBUS_PATH "/Subscription" + #define GSD_SUBSCRIPTION_DBUS_INTERFACE GSD_DBUS_BASE_INTERFACE ".Subscription" + + static const gchar introspection_xml[] = + "" + " " + " " + " " + " " + " " + " " + " " + " " + ""; + + #define GSD_SUBSCRIPTION_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GSD_TYPE_SUBSCRIPTION_MANAGER, GsdSubscriptionManagerPrivate)) +@@ -517,129 +518,168 @@ _client_maybe__show_notification (GsdSubscriptionManager *manager) + } + } + + /* nag again */ + if (priv->subscription_status == GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN && + g_timer_elapsed (priv->timer_last_notified, NULL) > 60 * 60 * 24) { + _show_notification (manager, _NOTIFY_REGISTRATION_REQUIRED); + return; + } + if (priv->subscription_status == GSD_SUBMAN_SUBSCRIPTION_STATUS_INVALID && + g_timer_elapsed (priv->timer_last_notified, NULL) > 60 * 60 * 24) { + _show_notification (manager, _NOTIFY_EXPIRED); + return; + } + if (priv->subscription_status == GSD_SUBMAN_SUBSCRIPTION_STATUS_PARTIALLY_VALID && + g_timer_elapsed (priv->timer_last_notified, NULL) > 60 * 60 * 24) { + _show_notification (manager, _NOTIFY_EXPIRED); + return; + } + } + + static gboolean + _client_register_with_keys (GsdSubscriptionManager *manager, + const gchar *hostname, + const gchar *organisation, + const gchar *activation_key, + GError **error) + { + GsdSubscriptionManagerPrivate *priv = manager->priv; + g_autoptr(GSubprocess) subprocess = NULL; ++ g_autoptr(GBytes) stdin_buf = g_bytes_new (activation_key, strlen (activation_key) + 1); ++ g_autoptr(GBytes) stderr_buf = NULL; ++ gint rc; + + /* apparently: "we can't send registration credentials over the regular + * system or session bus since those aren't really locked down..." */ + if (!_client_register_start (manager, error)) + return FALSE; + g_debug ("spawning %s", LIBEXECDIR "/gsd-subman-helper"); +- subprocess = g_subprocess_new (G_SUBPROCESS_FLAGS_STDERR_PIPE, error, ++ subprocess = g_subprocess_new (G_SUBPROCESS_FLAGS_STDIN_PIPE | G_SUBPROCESS_FLAGS_STDERR_PIPE, error, + "pkexec", LIBEXECDIR "/gsd-subman-helper", + "--kind", "register-with-key", + "--address", priv->address, + "--hostname", hostname, + "--organisation", organisation, +- "--activation-key", activation_key, + NULL); + if (subprocess == NULL) { + g_prefix_error (error, "failed to find pkexec: "); + return FALSE; + } +- if (!_client_subprocess_wait_check (subprocess, error)) ++ ++ if (!g_subprocess_communicate (subprocess, stdin_buf, NULL, NULL, &stderr_buf, error)) { ++ g_prefix_error (error, "failed to run pkexec: "); + return FALSE; ++ } ++ ++ rc = g_subprocess_get_exit_status (subprocess); ++ if (rc != 0) { ++ if (g_bytes_get_size (stderr_buf) == 0) { ++ g_set_error_literal (error, G_IO_ERROR, rc, ++ "Failed to run helper without stderr"); ++ return FALSE; ++ } ++ ++ g_set_error (error, G_IO_ERROR, rc, ++ "%.*s", ++ g_bytes_get_size (stderr_buf), ++ g_bytes_get_data (stderr_buf, NULL)); ++ } + + /* FIXME: also do on error? */ + if (!_client_register_stop (manager, error)) + return FALSE; + if (!_client_subscription_status_update (manager, error)) + return FALSE; + if (!_client_installed_products_update (manager, error)) + return FALSE; + _client_maybe__show_notification (manager); + + /* success */ + return TRUE; + } + + static gboolean + _client_register (GsdSubscriptionManager *manager, + const gchar *hostname, + const gchar *organisation, + const gchar *username, + const gchar *password, + GError **error) + { + GsdSubscriptionManagerPrivate *priv = manager->priv; + g_autoptr(GSubprocess) subprocess = NULL; ++ g_autoptr(GBytes) stdin_buf = g_bytes_new (password, strlen (password) + 1); ++ g_autoptr(GBytes) stderr_buf = NULL; ++ gint rc; + + /* fallback */ + if (organisation == NULL) + organisation = ""; + + /* apparently: "we can't send registration credentials over the regular + * system or session bus since those aren't really locked down..." */ + if (!_client_register_start (manager, error)) + return FALSE; + g_debug ("spawning %s", LIBEXECDIR "/gsd-subman-helper"); +- subprocess = g_subprocess_new (G_SUBPROCESS_FLAGS_STDERR_PIPE, error, ++ subprocess = g_subprocess_new (G_SUBPROCESS_FLAGS_STDIN_PIPE | G_SUBPROCESS_FLAGS_STDERR_PIPE, ++ error, + "pkexec", LIBEXECDIR "/gsd-subman-helper", + "--kind", "register-with-username", + "--address", priv->address, + "--hostname", hostname, + "--organisation", organisation, + "--username", username, +- "--password", password, + NULL); + if (subprocess == NULL) { + g_prefix_error (error, "failed to find pkexec: "); + return FALSE; + } +- if (!_client_subprocess_wait_check (subprocess, error)) ++ ++ if (!g_subprocess_communicate (subprocess, stdin_buf, NULL, NULL, &stderr_buf, error)) { ++ g_prefix_error (error, "failed to run pkexec: "); + return FALSE; ++ } ++ ++ rc = g_subprocess_get_exit_status (subprocess); ++ if (rc != 0) { ++ if (g_bytes_get_size (stderr_buf) == 0) { ++ g_set_error_literal (error, G_IO_ERROR, rc, ++ "Failed to run helper without stderr"); ++ return FALSE; ++ } ++ ++ g_set_error (error, G_IO_ERROR, rc, ++ "%.*s", ++ g_bytes_get_size (stderr_buf), ++ g_bytes_get_data (stderr_buf, NULL)); ++ } + + /* FIXME: also do on error? */ + if (!_client_register_stop (manager, error)) + return FALSE; + if (!_client_subscription_status_update (manager, error)) + return FALSE; + if (!_client_installed_products_update (manager, error)) + return FALSE; + _client_maybe__show_notification (manager); + return TRUE; + } + + static gboolean + _client_unregister (GsdSubscriptionManager *manager, GError **error) + { + g_autoptr(GSubprocess) subprocess = NULL; + + /* apparently: "we can't send registration credentials over the regular + * system or session bus since those aren't really locked down..." */ + if (!_client_register_start (manager, error)) + return FALSE; + g_debug ("spawning %s", LIBEXECDIR "/gsd-subman-helper"); + subprocess = g_subprocess_new (G_SUBPROCESS_FLAGS_STDERR_PIPE, error, + "pkexec", LIBEXECDIR "/gsd-subman-helper", + "--kind", "unregister", + NULL); + if (subprocess == NULL) { + g_prefix_error (error, "failed to find pkexec: "); + return FALSE; + } +diff --git a/plugins/subman/meson.build b/plugins/subman/meson.build +index bfd073b6..e4b4589d 100644 +--- a/plugins/subman/meson.build ++++ b/plugins/subman/meson.build +@@ -22,35 +22,35 @@ executable( + c_args: cflags, + install: true, + install_rpath: gsd_pkglibdir, + install_dir: gsd_libexecdir + ) + + # .Register needs to be called from root as subman can't do PolicyKit... + policy = 'org.gnome.settings-daemon.plugins.subman.policy' + policy_in = configure_file( + input: policy + '.in.in', + output: policy + '.in', + configuration: plugins_conf + ) + + i18n.merge_file( + policy, + input: policy_in, + output: policy, + po_dir: po_dir, + install: true, + install_dir: join_paths(gsd_datadir, 'polkit-1', 'actions') + ) + + install_data('org.gnome.settings-daemon.plugins.subman.rules', + install_dir : join_paths(gsd_datadir, 'polkit-1', 'rules.d')) + + executable( + 'gsd-subman-helper', + 'gsd-subman-helper.c', + include_directories: top_inc, +- dependencies: [gio_dep, jsonglib_dep], ++ dependencies: [gio_dep, gio_unix_dep, jsonglib_dep], + install: true, + install_rpath: gsd_pkglibdir, + install_dir: gsd_libexecdir + ) +-- +2.30.0 + diff --git a/0009-subman-Don-t-treat-failure-to-attach-as-fatal.patch b/0009-subman-Don-t-treat-failure-to-attach-as-fatal.patch new file mode 100644 index 0000000..5edb2ae --- /dev/null +++ b/0009-subman-Don-t-treat-failure-to-attach-as-fatal.patch @@ -0,0 +1,310 @@ +From 1255b2b83284d262f6b8c3ceb23d499ddbf77d48 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Thu, 21 Jan 2021 09:52:19 -0500 +Subject: [PATCH 09/15] subman: Don't treat failure to attach as fatal + +Many organizations don't require specific subscriptions to get +updates (called "simple content access"). At the moment, +those systems get an error when registering. + +This commit quiets the error. +--- + plugins/subman/gsd-subman-helper.c | 46 ++++++++++++++++++++++++------ + 1 file changed, 37 insertions(+), 9 deletions(-) + +diff --git a/plugins/subman/gsd-subman-helper.c b/plugins/subman/gsd-subman-helper.c +index edf1e41f..53a4d56b 100644 +--- a/plugins/subman/gsd-subman-helper.c ++++ b/plugins/subman/gsd-subman-helper.c +@@ -25,145 +25,169 @@ + #include + #include + #include + #include + + #include + #include + #include + + #define DBUS_TIMEOUT 300000 /* 5 minutes */ + static const char *locale; + + static void + _helper_convert_error (const gchar *json_txt, GError **error) + { + JsonNode *json_root; + JsonObject *json_obj; + const gchar *message; + g_autoptr(JsonParser) json_parser = json_parser_new (); + + /* this may be plain text or JSON :| */ + if (!json_parser_load_from_data (json_parser, json_txt, -1, NULL)) { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + json_txt); + return; + } + json_root = json_parser_get_root (json_parser); + json_obj = json_node_get_object (json_root); ++ if (json_object_has_member (json_obj, "severity")) { ++ const gchar *severity; ++ ++ /* warnings are non-fatal so we ignore them ++ */ ++ severity = json_object_get_string_member (json_obj, "severity"); ++ if (g_strstr_len (severity, -1, "warning") != NULL) { ++ return; ++ } ++ } ++ + if (!json_object_has_member (json_obj, "message")) { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "no message' in %s", json_txt); + return; + } + message = json_object_get_string_member (json_obj, "message"); + if (g_strstr_len (message, -1, "Invalid user credentials") != NULL) { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_PERMISSION_DENIED, + message); + return; + } + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + message); + } + + static gboolean + _helper_unregister (GError **error) + { + g_autoptr(GDBusProxy) proxy = NULL; + g_autoptr(GVariantBuilder) proxy_options = NULL; + g_autoptr(GVariant) res = NULL; + + proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | + G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS, + NULL, + "com.redhat.RHSM1", + "/com/redhat/RHSM1/Unregister", + "com.redhat.RHSM1.Unregister", + NULL, error); + if (proxy == NULL) { + g_prefix_error (error, "Failed to get proxy: "); + return FALSE; + } + proxy_options = g_variant_builder_new (G_VARIANT_TYPE_VARDICT); + res = g_dbus_proxy_call_sync (proxy, + "Unregister", + g_variant_new ("(a{sv}s)", + proxy_options, + locale), + G_DBUS_CALL_FLAGS_NONE, + DBUS_TIMEOUT, + NULL, error); + return res != NULL; + } + + static gboolean + _helper_auto_attach (GError **error) + { + const gchar *str = NULL; ++ g_autoptr(GError) error_local = NULL; + g_autoptr(GDBusProxy) proxy = NULL; + g_autoptr(GVariantBuilder) proxy_options = NULL; + g_autoptr(GVariant) res = NULL; + + g_debug ("auto-attaching subscriptions"); + proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | + G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS, + NULL, + "com.redhat.RHSM1", + "/com/redhat/RHSM1/Attach", + "com.redhat.RHSM1.Attach", +- NULL, error); ++ NULL, &error_local); + if (proxy == NULL) { +- g_prefix_error (error, "Failed to get proxy: "); ++ g_dbus_error_strip_remote_error (error_local); ++ g_propagate_prefixed_error (error, ++ g_steal_pointer (&error_local), ++ "Failed to get proxy: "); + return FALSE; + } + proxy_options = g_variant_builder_new (G_VARIANT_TYPE_VARDICT); + res = g_dbus_proxy_call_sync (proxy, + "AutoAttach", + g_variant_new ("(sa{sv}s)", + "", /* now? */ + proxy_options, + locale), + G_DBUS_CALL_FLAGS_NONE, + DBUS_TIMEOUT, +- NULL, error); +- if (res == NULL) +- return FALSE; ++ NULL, &error_local); ++ if (res == NULL) { ++ g_dbus_error_strip_remote_error (error_local); ++ _helper_convert_error (error_local->message, error); ++ ++ if (*error != NULL) { ++ g_prefix_error (error, "Failed to get proxy: "); ++ return FALSE; ++ } ++ ++ return TRUE; ++ } + g_variant_get (res, "(&s)", &str); + g_debug ("Attach.AutoAttach: %s", str); + return TRUE; + } + + static gboolean + _helper_save_config (const gchar *key, const gchar *value, GError **error) + { + g_autoptr(GDBusProxy) proxy = NULL; + g_autoptr(GVariant) res = NULL; + proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | + G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS, + NULL, + "com.redhat.RHSM1", + "/com/redhat/RHSM1/Config", + "com.redhat.RHSM1.Config", + NULL, error); + if (proxy == NULL) { + g_prefix_error (error, "Failed to get proxy: "); + return FALSE; + } + res = g_dbus_proxy_call_sync (proxy, "Set", + g_variant_new ("(svs)", + key, + g_variant_new_string (value), + locale), + G_DBUS_CALL_FLAGS_NONE, + DBUS_TIMEOUT, + NULL, error); +@@ -298,105 +322,109 @@ main (int argc, char *argv[]) + g_printerr ("Required --organisation\n"); + return G_IO_ERROR_INVALID_DATA; + } + + g_input_stream_read (standard_input_stream, activation_key, sizeof (activation_key) - 1, NULL, &error_local); + + if (error_local != NULL) { + g_printerr ("Could not read activation key: %s\n", error_local->message); + return G_IO_ERROR_INVALID_DATA; + } + + g_debug ("trying to unregister in case machine is already registered"); + _helper_unregister (NULL); + + g_debug ("registering using activation key"); + activation_keys = g_strsplit (activation_key, ",", -1); + res = g_dbus_proxy_call_sync (proxy, + "RegisterWithActivationKeys", + g_variant_new ("(s^asa{ss}a{ss}s)", + organisation, + activation_keys, + subman_options, + subman_conopts, + locale), + G_DBUS_CALL_FLAGS_NO_AUTO_START, + DBUS_TIMEOUT, + NULL, &error_local); + if (res == NULL) { + g_dbus_error_strip_remote_error (error_local); + _helper_convert_error (error_local->message, &error); +- g_printerr ("Failed to RegisterWithActivationKeys: %s\n", error->message); +- return error->code; ++ if (error != NULL) { ++ g_printerr ("Failed to RegisterWithActivationKeys: %s\n", error->message); ++ return error->code; ++ } + } + } else if (g_strcmp0 (kind, "register-with-username") == 0) { + g_autoptr(GError) error_local = NULL; + g_autoptr(GVariant) res = NULL; + gchar password[PIPE_BUF + 1] = ""; + + if (username == NULL) { + g_printerr ("Required --username\n"); + return G_IO_ERROR_INVALID_DATA; + } + if (organisation == NULL) { + g_printerr ("Required --organisation\n"); + return G_IO_ERROR_INVALID_DATA; + } + + g_input_stream_read (standard_input_stream, password, sizeof (password) - 1, NULL, &error_local); + + if (error_local != NULL) { + g_printerr ("Could not read password: %s\n", error_local->message); + return G_IO_ERROR_INVALID_DATA; + } + + g_debug ("trying to unregister in case machine is already registered"); + _helper_unregister (NULL); + + g_debug ("registering using username and password"); + res = g_dbus_proxy_call_sync (proxy, + "Register", + g_variant_new ("(sssa{ss}a{ss}s)", + organisation, + username, + password, + subman_options, + subman_conopts, + locale), + G_DBUS_CALL_FLAGS_NO_AUTO_START, + DBUS_TIMEOUT, + NULL, &error_local); + if (res == NULL) { + g_dbus_error_strip_remote_error (error_local); + _helper_convert_error (error_local->message, &error); +- g_printerr ("Failed to Register: %s\n", error->message); +- return error->code; ++ if (error != NULL) { ++ g_printerr ("Failed to Register: %s\n", error->message); ++ return error->code; ++ } + } + } else { + g_printerr ("Invalid --kind specified: %s\n", kind); + return G_IO_ERROR_INVALID_DATA; + } + + /* set the new hostname */ + if (!_helper_save_config ("server.hostname", hostname, &error)) { + g_printerr ("Failed to save hostname: %s\n", error->message); + return G_IO_ERROR_NOT_INITIALIZED; + } + if (!_helper_save_config ("server.prefix", prefix, &error)) { + g_printerr ("Failed to save prefix: %s\n", error->message); + return G_IO_ERROR_NOT_INITIALIZED; + } + if (!_helper_save_config ("server.port", port, &error)) { + g_printerr ("Failed to save port: %s\n", error->message); + return G_IO_ERROR_NOT_INITIALIZED; + } + + /* wait for rhsmd to notice the new config */ + g_usleep (G_USEC_PER_SEC * 5); + + /* auto-attach */ + if (!_helper_auto_attach (&error)) { + g_printerr ("Failed to AutoAttach: %s\n", error->message); + return G_IO_ERROR_NOT_INITIALIZED; + } + + return EXIT_SUCCESS; +-- +2.30.0 + diff --git a/0010-subman-Add-new-no-installed-products-state.patch b/0010-subman-Add-new-no-installed-products-state.patch new file mode 100644 index 0000000..efe9990 --- /dev/null +++ b/0010-subman-Add-new-no-installed-products-state.patch @@ -0,0 +1,427 @@ +From d53c27802c69773d63d108f57912035fd3caabf9 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Sun, 24 Jan 2021 11:24:36 -0500 +Subject: [PATCH 10/15] subman: Add new no-installed-products state + +It's possible, though unlikley, the system has +no packages installed from Red Hat supported package sets. + +This commit adds a new state to track that situation. +--- + plugins/subman/gsd-subman-common.c | 2 ++ + plugins/subman/gsd-subman-common.h | 1 + + plugins/subman/gsd-subscription-manager.c | 17 +++++++---------- + 3 files changed, 10 insertions(+), 10 deletions(-) + +diff --git a/plugins/subman/gsd-subman-common.c b/plugins/subman/gsd-subman-common.c +index e515131e..eef5175d 100644 +--- a/plugins/subman/gsd-subman-common.c ++++ b/plugins/subman/gsd-subman-common.c +@@ -5,32 +5,34 @@ + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ + + #include "config.h" + + #include "gsd-subman-common.h" + + const gchar * + gsd_subman_subscription_status_to_string (GsdSubmanSubscriptionStatus status) + { + if (status == GSD_SUBMAN_SUBSCRIPTION_STATUS_VALID) + return "valid"; + if (status == GSD_SUBMAN_SUBSCRIPTION_STATUS_INVALID) + return "invalid"; + if (status == GSD_SUBMAN_SUBSCRIPTION_STATUS_DISABLED) + return "disabled"; + if (status == GSD_SUBMAN_SUBSCRIPTION_STATUS_PARTIALLY_VALID) + return "partially-valid"; ++ if (status == GSD_SUBMAN_SUBSCRIPTION_STATUS_NO_INSTALLED_PRODUCTS) ++ return "no-installed-products"; + return "unknown"; + } +diff --git a/plugins/subman/gsd-subman-common.h b/plugins/subman/gsd-subman-common.h +index fccf9f6a..f8a3d9f4 100644 +--- a/plugins/subman/gsd-subman-common.h ++++ b/plugins/subman/gsd-subman-common.h +@@ -3,38 +3,39 @@ + * Copyright (C) 2019 Richard Hughes + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ + + #ifndef __GSD_SUBMAN_COMMON_H + #define __GSD_SUBMAN_COMMON_H + + #include + + G_BEGIN_DECLS + + typedef enum { + GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN, + GSD_SUBMAN_SUBSCRIPTION_STATUS_VALID, + GSD_SUBMAN_SUBSCRIPTION_STATUS_INVALID, + GSD_SUBMAN_SUBSCRIPTION_STATUS_DISABLED, + GSD_SUBMAN_SUBSCRIPTION_STATUS_PARTIALLY_VALID, ++ GSD_SUBMAN_SUBSCRIPTION_STATUS_NO_INSTALLED_PRODUCTS, + GSD_SUBMAN_SUBSCRIPTION_STATUS_LAST + } GsdSubmanSubscriptionStatus; + + const gchar *gsd_subman_subscription_status_to_string (GsdSubmanSubscriptionStatus status); + + G_END_DECLS + + #endif /* __GSD_SUBMAN_COMMON_H */ +diff --git a/plugins/subman/gsd-subscription-manager.c b/plugins/subman/gsd-subscription-manager.c +index 0838d490..46f8d35c 100644 +--- a/plugins/subman/gsd-subscription-manager.c ++++ b/plugins/subman/gsd-subscription-manager.c +@@ -242,60 +242,67 @@ _client_installed_products_update (GsdSubscriptionManager *manager, GError **err + product->version = g_strdup (json_array_get_string_element (json_product, 2)); + product->arch = g_strdup (json_array_get_string_element (json_product, 3)); + product->status = g_strdup (json_array_get_string_element (json_product, 4)); + product->starts = g_strdup (json_array_get_string_element (json_product, 6)); + product->ends = g_strdup (json_array_get_string_element (json_product, 7)); + + g_ptr_array_add (priv->installed_products, g_steal_pointer (&product)); + } + + /* emit notification for g-c-c */ + _emit_property_changed (manager, "InstalledProducts", + _make_installed_products_variant (priv->installed_products)); + + return TRUE; + } + + static gboolean + _client_subscription_status_update (GsdSubscriptionManager *manager, GError **error) + { + GsdSubscriptionManagerPrivate *priv = manager->priv; + g_autoptr(GVariant) uuid = NULL; + const gchar *uuid_txt = NULL; + JsonNode *json_root; + JsonObject *json_obj; + const gchar *json_txt = NULL; + g_autoptr(GVariant) status = NULL; + g_autoptr(JsonParser) json_parser = json_parser_new (); + + /* save old value */ + priv->subscription_status_last = priv->subscription_status; ++ if (!_client_installed_products_update (manager, error)) ++ goto out; ++ ++ if (priv->installed_products->len == 0) { ++ priv->subscription_status = GSD_SUBMAN_SUBSCRIPTION_STATUS_NO_INSTALLED_PRODUCTS; ++ goto out; ++ } + + uuid = g_dbus_proxy_call_sync (priv->proxies[_RHSM_INTERFACE_CONSUMER], + "GetUuid", + g_variant_new ("(s)", + "C.UTF-8"), + G_DBUS_CALL_FLAGS_NONE, + -1, NULL, error); + if (uuid == NULL) + return FALSE; + + g_variant_get (uuid, "(&s)", &uuid_txt); + + status = g_dbus_proxy_call_sync (priv->proxies[_RHSM_INTERFACE_ENTITLEMENT], + "GetStatus", + g_variant_new ("(ss)", + "", /* assumed as 'now' */ + "C.UTF-8"), + G_DBUS_CALL_FLAGS_NONE, + -1, NULL, error); + if (status == NULL) + return FALSE; + g_variant_get (status, "(&s)", &json_txt); + g_debug ("Entitlement.GetStatus JSON: %s", json_txt); + if (!json_parser_load_from_data (json_parser, json_txt, -1, error)) + return FALSE; + json_root = json_parser_get_root (json_parser); + json_obj = json_node_get_object (json_root); + if (!json_object_has_member (json_obj, "valid")) { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_DATA, + "no Entitlement.GetStatus valid in %s", json_txt); +@@ -563,62 +570,60 @@ _client_register_with_keys (GsdSubscriptionManager *manager, + NULL); + if (subprocess == NULL) { + g_prefix_error (error, "failed to find pkexec: "); + return FALSE; + } + + if (!g_subprocess_communicate (subprocess, stdin_buf, NULL, NULL, &stderr_buf, error)) { + g_prefix_error (error, "failed to run pkexec: "); + return FALSE; + } + + rc = g_subprocess_get_exit_status (subprocess); + if (rc != 0) { + if (g_bytes_get_size (stderr_buf) == 0) { + g_set_error_literal (error, G_IO_ERROR, rc, + "Failed to run helper without stderr"); + return FALSE; + } + + g_set_error (error, G_IO_ERROR, rc, + "%.*s", + g_bytes_get_size (stderr_buf), + g_bytes_get_data (stderr_buf, NULL)); + } + + /* FIXME: also do on error? */ + if (!_client_register_stop (manager, error)) + return FALSE; + if (!_client_subscription_status_update (manager, error)) + return FALSE; +- if (!_client_installed_products_update (manager, error)) +- return FALSE; + _client_maybe__show_notification (manager); + + /* success */ + return TRUE; + } + + static gboolean + _client_register (GsdSubscriptionManager *manager, + const gchar *hostname, + const gchar *organisation, + const gchar *username, + const gchar *password, + GError **error) + { + GsdSubscriptionManagerPrivate *priv = manager->priv; + g_autoptr(GSubprocess) subprocess = NULL; + g_autoptr(GBytes) stdin_buf = g_bytes_new (password, strlen (password) + 1); + g_autoptr(GBytes) stderr_buf = NULL; + gint rc; + + /* fallback */ + if (organisation == NULL) + organisation = ""; + + /* apparently: "we can't send registration credentials over the regular + * system or session bus since those aren't really locked down..." */ + if (!_client_register_start (manager, error)) + return FALSE; + g_debug ("spawning %s", LIBEXECDIR "/gsd-subman-helper"); + subprocess = g_subprocess_new (G_SUBPROCESS_FLAGS_STDIN_PIPE | G_SUBPROCESS_FLAGS_STDERR_PIPE, +@@ -632,62 +637,60 @@ _client_register (GsdSubscriptionManager *manager, + NULL); + if (subprocess == NULL) { + g_prefix_error (error, "failed to find pkexec: "); + return FALSE; + } + + if (!g_subprocess_communicate (subprocess, stdin_buf, NULL, NULL, &stderr_buf, error)) { + g_prefix_error (error, "failed to run pkexec: "); + return FALSE; + } + + rc = g_subprocess_get_exit_status (subprocess); + if (rc != 0) { + if (g_bytes_get_size (stderr_buf) == 0) { + g_set_error_literal (error, G_IO_ERROR, rc, + "Failed to run helper without stderr"); + return FALSE; + } + + g_set_error (error, G_IO_ERROR, rc, + "%.*s", + g_bytes_get_size (stderr_buf), + g_bytes_get_data (stderr_buf, NULL)); + } + + /* FIXME: also do on error? */ + if (!_client_register_stop (manager, error)) + return FALSE; + if (!_client_subscription_status_update (manager, error)) + return FALSE; +- if (!_client_installed_products_update (manager, error)) +- return FALSE; + _client_maybe__show_notification (manager); + return TRUE; + } + + static gboolean + _client_unregister (GsdSubscriptionManager *manager, GError **error) + { + g_autoptr(GSubprocess) subprocess = NULL; + + /* apparently: "we can't send registration credentials over the regular + * system or session bus since those aren't really locked down..." */ + if (!_client_register_start (manager, error)) + return FALSE; + g_debug ("spawning %s", LIBEXECDIR "/gsd-subman-helper"); + subprocess = g_subprocess_new (G_SUBPROCESS_FLAGS_STDERR_PIPE, error, + "pkexec", LIBEXECDIR "/gsd-subman-helper", + "--kind", "unregister", + NULL); + if (subprocess == NULL) { + g_prefix_error (error, "failed to find pkexec: "); + return FALSE; + } + if (!_client_subprocess_wait_check (subprocess, error)) + return FALSE; + if (!_client_subscription_status_update (manager, error)) + return FALSE; + if (!_client_installed_products_update (manager, error)) + return FALSE; + _client_maybe__show_notification (manager); + return TRUE; +@@ -714,64 +717,60 @@ _client_update_config (GsdSubscriptionManager *manager, GError **error) + dict = g_variant_dict_new (g_variant_get_child_value (val, 0)); + val_server = g_variant_dict_lookup_value (dict, "server", G_VARIANT_TYPE("a{ss}")); + if (val_server != NULL) { + g_variant_iter_init (&iter, val_server); + while (g_variant_iter_next (&iter, "{ss}", &key, &value)) { + g_debug ("%s=%s", key, value); + g_hash_table_insert (priv->config, + g_steal_pointer (&key), + g_steal_pointer (&value)); + } + } + return TRUE; + } + + static void + _subman_proxy_signal_cb (GDBusProxy *proxy, + const gchar *sender_name, + const gchar *signal_name, + GVariant *parameters, + GsdSubscriptionManager *manager) + { + g_autoptr(GError) error = NULL; + if (!_client_syspurpose_update (manager, &error)) { + g_warning ("failed to update syspurpose: %s", error->message); + g_clear_error (&error); + } + if (!_client_subscription_status_update (manager, &error)) { + g_warning ("failed to update subscription status: %s", error->message); + g_clear_error (&error); + } +- if (!_client_installed_products_update (manager, &error)) { +- g_warning ("failed to update installed products: %s", error->message); +- g_clear_error (&error); +- } + _client_maybe__show_notification (manager); + } + + static void + _client_unload (GsdSubscriptionManager *manager) + { + GsdSubscriptionManagerPrivate *priv = manager->priv; + for (guint i = 0; i < _RHSM_INTERFACE_LAST; i++) + g_clear_object (&priv->proxies[i]); + g_hash_table_unref (priv->config); + } + + static const gchar * + _rhsm_interface_to_string (_RhsmInterface kind) + { + if (kind == _RHSM_INTERFACE_CONFIG) + return "Config"; + if (kind == _RHSM_INTERFACE_REGISTER_SERVER) + return "RegisterServer"; + if (kind == _RHSM_INTERFACE_ATTACH) + return "Attach"; + if (kind == _RHSM_INTERFACE_ENTITLEMENT) + return "Entitlement"; + if (kind == _RHSM_INTERFACE_PRODUCTS) + return "Products"; + if (kind == _RHSM_INTERFACE_CONSUMER) + return "Consumer"; + if (kind == _RHSM_INTERFACE_SYSPURPOSE) + return "Syspurpose"; + return NULL; +@@ -782,62 +781,60 @@ _client_load (GsdSubscriptionManager *manager, GError **error) + { + GsdSubscriptionManagerPrivate *priv = manager->priv; + + priv->config = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); + + /* connect to all the interfaces on the *different* objects :| */ + for (guint i = 0; i < _RHSM_INTERFACE_LAST; i++) { + const gchar *kind = _rhsm_interface_to_string (i); + g_autofree gchar *opath = g_strdup_printf ("/com/redhat/RHSM1/%s", kind); + g_autofree gchar *iface = g_strdup_printf ("com.redhat.RHSM1.%s", kind); + priv->proxies[i] = + g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, + G_DBUS_PROXY_FLAGS_NONE, + NULL, + "com.redhat.RHSM1", + opath, iface, + NULL, + error); + if (priv->proxies[i] == NULL) + return FALSE; + /* we want to get notified if the status of the system changes */ + g_signal_connect (priv->proxies[i], "g-signal", + G_CALLBACK (_subman_proxy_signal_cb), manager); + } + + /* get initial status */ + if (!_client_update_config (manager, error)) + return FALSE; + if (!_client_subscription_status_update (manager, error)) + return FALSE; +- if (!_client_installed_products_update (manager, error)) +- return FALSE; + if (!_client_syspurpose_update (manager, error)) + return FALSE; + + /* success */ + return TRUE; + } + + gboolean + gsd_subscription_manager_start (GsdSubscriptionManager *manager, GError **error) + { + gboolean ret; + g_debug ("Starting subscription manager"); + gnome_settings_profile_start (NULL); + ret = _client_load (manager, error); + _client_maybe__show_notification (manager); + gnome_settings_profile_end (NULL); + return ret; + } + + void + gsd_subscription_manager_stop (GsdSubscriptionManager *manager) + { + g_debug ("Stopping subscription manager"); + _client_unload (manager); + } + + static void + gsd_subscription_manager_class_init (GsdSubscriptionManagerClass *klass) + { + GObjectClass *object_class = G_OBJECT_CLASS (klass); +-- +2.30.0 + diff --git a/0011-subman-Fix-some-build-warnings.patch b/0011-subman-Fix-some-build-warnings.patch new file mode 100644 index 0000000..2d70f9b --- /dev/null +++ b/0011-subman-Fix-some-build-warnings.patch @@ -0,0 +1,146 @@ +From 432850e943d72daedb1d352a0332d3fdee6078e2 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Sun, 24 Jan 2021 11:26:40 -0500 +Subject: [PATCH 11/15] subman: Fix some build warnings + +--- + plugins/subman/gsd-subscription-manager.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/plugins/subman/gsd-subscription-manager.c b/plugins/subman/gsd-subscription-manager.c +index 46f8d35c..1f9ca447 100644 +--- a/plugins/subman/gsd-subscription-manager.c ++++ b/plugins/subman/gsd-subscription-manager.c +@@ -561,62 +561,62 @@ _client_register_with_keys (GsdSubscriptionManager *manager, + if (!_client_register_start (manager, error)) + return FALSE; + g_debug ("spawning %s", LIBEXECDIR "/gsd-subman-helper"); + subprocess = g_subprocess_new (G_SUBPROCESS_FLAGS_STDIN_PIPE | G_SUBPROCESS_FLAGS_STDERR_PIPE, error, + "pkexec", LIBEXECDIR "/gsd-subman-helper", + "--kind", "register-with-key", + "--address", priv->address, + "--hostname", hostname, + "--organisation", organisation, + NULL); + if (subprocess == NULL) { + g_prefix_error (error, "failed to find pkexec: "); + return FALSE; + } + + if (!g_subprocess_communicate (subprocess, stdin_buf, NULL, NULL, &stderr_buf, error)) { + g_prefix_error (error, "failed to run pkexec: "); + return FALSE; + } + + rc = g_subprocess_get_exit_status (subprocess); + if (rc != 0) { + if (g_bytes_get_size (stderr_buf) == 0) { + g_set_error_literal (error, G_IO_ERROR, rc, + "Failed to run helper without stderr"); + return FALSE; + } + + g_set_error (error, G_IO_ERROR, rc, + "%.*s", +- g_bytes_get_size (stderr_buf), +- g_bytes_get_data (stderr_buf, NULL)); ++ (int) g_bytes_get_size (stderr_buf), ++ (char *) g_bytes_get_data (stderr_buf, NULL)); + } + + /* FIXME: also do on error? */ + if (!_client_register_stop (manager, error)) + return FALSE; + if (!_client_subscription_status_update (manager, error)) + return FALSE; + _client_maybe__show_notification (manager); + + /* success */ + return TRUE; + } + + static gboolean + _client_register (GsdSubscriptionManager *manager, + const gchar *hostname, + const gchar *organisation, + const gchar *username, + const gchar *password, + GError **error) + { + GsdSubscriptionManagerPrivate *priv = manager->priv; + g_autoptr(GSubprocess) subprocess = NULL; + g_autoptr(GBytes) stdin_buf = g_bytes_new (password, strlen (password) + 1); + g_autoptr(GBytes) stderr_buf = NULL; + gint rc; + + /* fallback */ + if (organisation == NULL) + organisation = ""; +@@ -628,62 +628,62 @@ _client_register (GsdSubscriptionManager *manager, + g_debug ("spawning %s", LIBEXECDIR "/gsd-subman-helper"); + subprocess = g_subprocess_new (G_SUBPROCESS_FLAGS_STDIN_PIPE | G_SUBPROCESS_FLAGS_STDERR_PIPE, + error, + "pkexec", LIBEXECDIR "/gsd-subman-helper", + "--kind", "register-with-username", + "--address", priv->address, + "--hostname", hostname, + "--organisation", organisation, + "--username", username, + NULL); + if (subprocess == NULL) { + g_prefix_error (error, "failed to find pkexec: "); + return FALSE; + } + + if (!g_subprocess_communicate (subprocess, stdin_buf, NULL, NULL, &stderr_buf, error)) { + g_prefix_error (error, "failed to run pkexec: "); + return FALSE; + } + + rc = g_subprocess_get_exit_status (subprocess); + if (rc != 0) { + if (g_bytes_get_size (stderr_buf) == 0) { + g_set_error_literal (error, G_IO_ERROR, rc, + "Failed to run helper without stderr"); + return FALSE; + } + + g_set_error (error, G_IO_ERROR, rc, + "%.*s", +- g_bytes_get_size (stderr_buf), +- g_bytes_get_data (stderr_buf, NULL)); ++ (int) g_bytes_get_size (stderr_buf), ++ (char *) g_bytes_get_data (stderr_buf, NULL)); + } + + /* FIXME: also do on error? */ + if (!_client_register_stop (manager, error)) + return FALSE; + if (!_client_subscription_status_update (manager, error)) + return FALSE; + _client_maybe__show_notification (manager); + return TRUE; + } + + static gboolean + _client_unregister (GsdSubscriptionManager *manager, GError **error) + { + g_autoptr(GSubprocess) subprocess = NULL; + + /* apparently: "we can't send registration credentials over the regular + * system or session bus since those aren't really locked down..." */ + if (!_client_register_start (manager, error)) + return FALSE; + g_debug ("spawning %s", LIBEXECDIR "/gsd-subman-helper"); + subprocess = g_subprocess_new (G_SUBPROCESS_FLAGS_STDERR_PIPE, error, + "pkexec", LIBEXECDIR "/gsd-subman-helper", + "--kind", "unregister", + NULL); + if (subprocess == NULL) { + g_prefix_error (error, "failed to find pkexec: "); + return FALSE; + } + if (!_client_subprocess_wait_check (subprocess, error)) +-- +2.30.0 + diff --git a/0012-subman-Add-DBus-API-to-subscribe-for-updates-on-alre.patch b/0012-subman-Add-DBus-API-to-subscribe-for-updates-on-alre.patch new file mode 100644 index 0000000..30758fb --- /dev/null +++ b/0012-subman-Add-DBus-API-to-subscribe-for-updates-on-alre.patch @@ -0,0 +1,259 @@ +From 3bb3b2b09d34deafadd3cfe3355137afab20cb23 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Sun, 24 Jan 2021 11:27:42 -0500 +Subject: [PATCH 12/15] subman: Add DBus API to subscribe for updates on + already registered system + +It's possible an admin may have registered their system without +attaching any subscriptions to it. + +At the moment, gnome-settings-daemon only provides a way to register +and subscribe in one step. + +This commit adds an API to support doing the last half of the process +on its own. +--- + plugins/subman/gsd-subscription-manager.c | 51 +++++++++++++++++++++++ + 1 file changed, 51 insertions(+) + +diff --git a/plugins/subman/gsd-subscription-manager.c b/plugins/subman/gsd-subscription-manager.c +index 1f9ca447..705f8b11 100644 +--- a/plugins/subman/gsd-subscription-manager.c ++++ b/plugins/subman/gsd-subscription-manager.c +@@ -19,60 +19,61 @@ + */ + + #include "config.h" + + #include + #include + #include + #include + #include + #include + + #include "gnome-settings-profile.h" + #include "gsd-subman-common.h" + #include "gsd-subscription-manager.h" + + #define GSD_DBUS_NAME "org.gnome.SettingsDaemon" + #define GSD_DBUS_PATH "/org/gnome/SettingsDaemon" + #define GSD_DBUS_BASE_INTERFACE "org.gnome.SettingsDaemon" + + #define GSD_SUBSCRIPTION_DBUS_NAME GSD_DBUS_NAME ".Subscription" + #define GSD_SUBSCRIPTION_DBUS_PATH GSD_DBUS_PATH "/Subscription" + #define GSD_SUBSCRIPTION_DBUS_INTERFACE GSD_DBUS_BASE_INTERFACE ".Subscription" + + static const gchar introspection_xml[] = + "" + " " + " " + " " + " " + " " ++" " + " " + " " + " " + ""; + + #define GSD_SUBSCRIPTION_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GSD_TYPE_SUBSCRIPTION_MANAGER, GsdSubscriptionManagerPrivate)) + + typedef enum { + _RHSM_INTERFACE_CONFIG, + _RHSM_INTERFACE_REGISTER_SERVER, + _RHSM_INTERFACE_ATTACH, + _RHSM_INTERFACE_ENTITLEMENT, + _RHSM_INTERFACE_PRODUCTS, + _RHSM_INTERFACE_CONSUMER, + _RHSM_INTERFACE_SYSPURPOSE, + _RHSM_INTERFACE_LAST + } _RhsmInterface; + + struct GsdSubscriptionManagerPrivate + { + /* D-Bus */ + guint name_id; + GDBusNodeInfo *introspection_data; + GDBusConnection *connection; + GCancellable *bus_cancellable; + + GDBusProxy *proxies[_RHSM_INTERFACE_LAST]; + GHashTable *config; /* str:str */ + GPtrArray *installed_products; + gchar *address; +@@ -669,60 +670,104 @@ _client_register (GsdSubscriptionManager *manager, + } + + static gboolean + _client_unregister (GsdSubscriptionManager *manager, GError **error) + { + g_autoptr(GSubprocess) subprocess = NULL; + + /* apparently: "we can't send registration credentials over the regular + * system or session bus since those aren't really locked down..." */ + if (!_client_register_start (manager, error)) + return FALSE; + g_debug ("spawning %s", LIBEXECDIR "/gsd-subman-helper"); + subprocess = g_subprocess_new (G_SUBPROCESS_FLAGS_STDERR_PIPE, error, + "pkexec", LIBEXECDIR "/gsd-subman-helper", + "--kind", "unregister", + NULL); + if (subprocess == NULL) { + g_prefix_error (error, "failed to find pkexec: "); + return FALSE; + } + if (!_client_subprocess_wait_check (subprocess, error)) + return FALSE; + if (!_client_subscription_status_update (manager, error)) + return FALSE; + if (!_client_installed_products_update (manager, error)) + return FALSE; + _client_maybe__show_notification (manager); + return TRUE; + } + ++static gboolean ++_client_attach (GsdSubscriptionManager *manager, ++ GError **error) ++{ ++ g_autoptr(GSubprocess) subprocess = NULL; ++ g_autoptr(GBytes) stderr_buf = NULL; ++ gint rc; ++ ++ g_debug ("spawning %s", LIBEXECDIR "/gsd-subman-helper"); ++ subprocess = g_subprocess_new (G_SUBPROCESS_FLAGS_STDERR_PIPE, ++ error, ++ "pkexec", LIBEXECDIR "/gsd-subman-helper", ++ "--kind", "auto-attach", ++ NULL); ++ if (subprocess == NULL) { ++ g_prefix_error (error, "failed to find pkexec: "); ++ return FALSE; ++ } ++ ++ if (!g_subprocess_communicate (subprocess, NULL, NULL, NULL, &stderr_buf, error)) { ++ g_prefix_error (error, "failed to run pkexec: "); ++ return FALSE; ++ } ++ ++ rc = g_subprocess_get_exit_status (subprocess); ++ if (rc != 0) { ++ if (g_bytes_get_size (stderr_buf) == 0) { ++ g_set_error_literal (error, G_IO_ERROR, rc, ++ "Failed to run helper without stderr"); ++ return FALSE; ++ } ++ ++ g_set_error (error, G_IO_ERROR, rc, ++ "%.*s", ++ (int) g_bytes_get_size (stderr_buf), ++ (char *) g_bytes_get_data (stderr_buf, NULL)); ++ } ++ ++ if (!_client_subscription_status_update (manager, error)) ++ return FALSE; ++ _client_maybe__show_notification (manager); ++ return TRUE; ++} ++ + static gboolean + _client_update_config (GsdSubscriptionManager *manager, GError **error) + { + GsdSubscriptionManagerPrivate *priv = manager->priv; + g_autoptr(GVariant) val = NULL; + g_autoptr(GVariant) val_server = NULL; + g_autoptr(GVariantDict) dict = NULL; + GVariantIter iter; + gchar *key; + gchar *value; + + val = g_dbus_proxy_call_sync (priv->proxies[_RHSM_INTERFACE_CONFIG], + "GetAll", + g_variant_new ("(s)", "C.UTF-8"), + G_DBUS_CALL_FLAGS_NONE, + -1, NULL, error); + if (val == NULL) + return FALSE; + dict = g_variant_dict_new (g_variant_get_child_value (val, 0)); + val_server = g_variant_dict_lookup_value (dict, "server", G_VARIANT_TYPE("a{ss}")); + if (val_server != NULL) { + g_variant_iter_init (&iter, val_server); + while (g_variant_iter_next (&iter, "{ss}", &key, &value)) { + g_debug ("%s=%s", key, value); + g_hash_table_insert (priv->config, + g_steal_pointer (&key), + g_steal_pointer (&value)); + } + } + return TRUE; +@@ -1002,60 +1047,66 @@ handle_method_call (GDBusConnection *connection, + g_dbus_method_invocation_return_gerror (invocation, error); + return; + } + } else if (g_strcmp0 (kind, "key") == 0) { + const gchar *activation_key = NULL; + g_variant_dict_lookup (dict, "hostname", "&s", &hostname); + g_variant_dict_lookup (dict, "organisation", "&s", &organisation); + g_variant_dict_lookup (dict, "activation-key", "&s", &activation_key); + if (!_client_register_with_keys (manager, + hostname, + organisation, + activation_key, + &error)) { + g_dbus_method_invocation_return_gerror (invocation, error); + return; + } + } else { + g_dbus_method_invocation_return_error_literal (invocation, + G_IO_ERROR, G_IO_ERROR_FAILED, + "Invalid kind specified"); + + return; + } + g_dbus_method_invocation_return_value (invocation, NULL); + } else if (g_strcmp0 (method_name, "Unregister") == 0) { + if (!_client_unregister (manager, &error)) { + g_dbus_method_invocation_return_gerror (invocation, error); + return; + } + g_dbus_method_invocation_return_value (invocation, NULL); ++ } else if (g_strcmp0 (method_name, "Attach") == 0) { ++ if (!_client_attach (manager, &error)) { ++ g_dbus_method_invocation_return_gerror (invocation, error); ++ return; ++ } ++ g_dbus_method_invocation_return_value (invocation, NULL); + } else { + g_assert_not_reached (); + } + } + + static GVariant * + handle_get_property (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *property_name, + GError **error, gpointer user_data) + { + GsdSubscriptionManager *manager = GSD_SUBSCRIPTION_MANAGER (user_data); + GsdSubscriptionManagerPrivate *priv = manager->priv; + + if (g_strcmp0 (interface_name, GSD_SUBSCRIPTION_DBUS_INTERFACE) != 0) { + g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_FAILED, + "No such interface: %s", interface_name); + return NULL; + } + + if (g_strcmp0 (property_name, "SubscriptionStatus") == 0) + return g_variant_new_uint32 (priv->subscription_status); + + if (g_strcmp0 (property_name, "InstalledProducts") == 0) + return _make_installed_products_variant (priv->installed_products); + + g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_FAILED, + "Failed to get property: %s", property_name); +-- +2.30.0 + diff --git a/0013-subman-Improve-subscription-status-handling.patch b/0013-subman-Improve-subscription-status-handling.patch new file mode 100644 index 0000000..40d6c68 --- /dev/null +++ b/0013-subman-Improve-subscription-status-handling.patch @@ -0,0 +1,141 @@ +From d9eb6331efa92cd28a8ba3ccc1665c3744296465 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Sun, 24 Jan 2021 11:34:03 -0500 +Subject: [PATCH 13/15] subman: Improve subscription status handling + +This commit improves how subscription-manager status is +parsed to give more detailed information about subscription +state. +--- + plugins/subman/gsd-subscription-manager.c | 33 +++++++++++++++++++---- + 1 file changed, 28 insertions(+), 5 deletions(-) + +diff --git a/plugins/subman/gsd-subscription-manager.c b/plugins/subman/gsd-subscription-manager.c +index 705f8b11..6d80bfa9 100644 +--- a/plugins/subman/gsd-subscription-manager.c ++++ b/plugins/subman/gsd-subscription-manager.c +@@ -262,93 +262,116 @@ _client_subscription_status_update (GsdSubscriptionManager *manager, GError **er + GsdSubscriptionManagerPrivate *priv = manager->priv; + g_autoptr(GVariant) uuid = NULL; + const gchar *uuid_txt = NULL; + JsonNode *json_root; + JsonObject *json_obj; + const gchar *json_txt = NULL; + g_autoptr(GVariant) status = NULL; + g_autoptr(JsonParser) json_parser = json_parser_new (); + + /* save old value */ + priv->subscription_status_last = priv->subscription_status; + if (!_client_installed_products_update (manager, error)) + goto out; + + if (priv->installed_products->len == 0) { + priv->subscription_status = GSD_SUBMAN_SUBSCRIPTION_STATUS_NO_INSTALLED_PRODUCTS; + goto out; + } + + uuid = g_dbus_proxy_call_sync (priv->proxies[_RHSM_INTERFACE_CONSUMER], + "GetUuid", + g_variant_new ("(s)", + "C.UTF-8"), + G_DBUS_CALL_FLAGS_NONE, + -1, NULL, error); + if (uuid == NULL) + return FALSE; + + g_variant_get (uuid, "(&s)", &uuid_txt); + ++ if (uuid_txt[0] == '\0') { ++ priv->subscription_status = GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN; ++ goto out; ++ } ++ + status = g_dbus_proxy_call_sync (priv->proxies[_RHSM_INTERFACE_ENTITLEMENT], + "GetStatus", + g_variant_new ("(ss)", + "", /* assumed as 'now' */ + "C.UTF-8"), + G_DBUS_CALL_FLAGS_NONE, + -1, NULL, error); + if (status == NULL) + return FALSE; + g_variant_get (status, "(&s)", &json_txt); + g_debug ("Entitlement.GetStatus JSON: %s", json_txt); + if (!json_parser_load_from_data (json_parser, json_txt, -1, error)) + return FALSE; + json_root = json_parser_get_root (json_parser); + json_obj = json_node_get_object (json_root); ++ ++ const gchar *status_id = NULL; ++ ++ if (json_object_has_member (json_obj, "status_id")) { ++ status_id = json_object_get_string_member (json_obj, "status_id"); ++ } ++ + if (!json_object_has_member (json_obj, "valid")) { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_DATA, + "no Entitlement.GetStatus valid in %s", json_txt); + return FALSE; + } + + gboolean is_valid = json_object_get_boolean_member (json_obj, "valid"); + +- if (uuid_txt[0] != '\0') { +- if (is_valid) { ++ if (is_valid) { ++ if (g_strcmp0 (status_id, "disabled") != 0) { + priv->subscription_status = GSD_SUBMAN_SUBSCRIPTION_STATUS_VALID; + } else { +- priv->subscription_status = GSD_SUBMAN_SUBSCRIPTION_STATUS_INVALID; ++ priv->subscription_status = GSD_SUBMAN_SUBSCRIPTION_STATUS_DISABLED; ++ } ++ goto out; ++ } ++ ++ for (guint i = 0; i < priv->installed_products->len; i++) { ++ ProductData *product = g_ptr_array_index (priv->installed_products, i); ++ ++ if (g_strcmp0 (product->status, "subscribed") == 0) { ++ priv->subscription_status = GSD_SUBMAN_SUBSCRIPTION_STATUS_PARTIALLY_VALID; ++ goto out; + } +- } else { +- priv->subscription_status = GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN; + } + ++ priv->subscription_status = GSD_SUBMAN_SUBSCRIPTION_STATUS_INVALID; ++ ++out: + /* emit notification for g-c-c */ + if (priv->subscription_status != priv->subscription_status_last) { + _emit_property_changed (manager, "SubscriptionStatus", + g_variant_new_uint32 (priv->subscription_status)); + } + + return TRUE; + } + + static gboolean + _client_syspurpose_update (GsdSubscriptionManager *manager, GError **error) + { + GsdSubscriptionManagerPrivate *priv = manager->priv; + JsonNode *json_root; + JsonObject *json_obj; + const gchar *json_txt = NULL; + g_autoptr(GVariant) val = NULL; + g_autoptr(JsonParser) json_parser = json_parser_new (); + + val = g_dbus_proxy_call_sync (priv->proxies[_RHSM_INTERFACE_SYSPURPOSE], + "GetSyspurpose", + g_variant_new ("(s)", "C.UTF-8"), + G_DBUS_CALL_FLAGS_NONE, + -1, NULL, error); + if (val == NULL) + return FALSE; + g_variant_get (val, "(&s)", &json_txt); + g_debug ("Syspurpose.GetSyspurpose JSON: %s", json_txt); + if (!json_parser_load_from_data (json_parser, json_txt, -1, error)) + return FALSE; +-- +2.30.0 + diff --git a/0014-subman-Drop-LAST-from-status-enum.patch b/0014-subman-Drop-LAST-from-status-enum.patch new file mode 100644 index 0000000..4f5c99e --- /dev/null +++ b/0014-subman-Drop-LAST-from-status-enum.patch @@ -0,0 +1,56 @@ +From a78b25b9507edb958a46779f2bb808bf678fa4a7 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Sun, 24 Jan 2021 11:55:19 -0500 +Subject: [PATCH 14/15] subman: Drop "LAST" from status enum + +It's unused, so get rid of it. +--- + plugins/subman/gsd-subman-common.h | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/plugins/subman/gsd-subman-common.h b/plugins/subman/gsd-subman-common.h +index f8a3d9f4..88226564 100644 +--- a/plugins/subman/gsd-subman-common.h ++++ b/plugins/subman/gsd-subman-common.h +@@ -4,38 +4,37 @@ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ + + #ifndef __GSD_SUBMAN_COMMON_H + #define __GSD_SUBMAN_COMMON_H + + #include + + G_BEGIN_DECLS + + typedef enum { + GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN, + GSD_SUBMAN_SUBSCRIPTION_STATUS_VALID, + GSD_SUBMAN_SUBSCRIPTION_STATUS_INVALID, + GSD_SUBMAN_SUBSCRIPTION_STATUS_DISABLED, + GSD_SUBMAN_SUBSCRIPTION_STATUS_PARTIALLY_VALID, + GSD_SUBMAN_SUBSCRIPTION_STATUS_NO_INSTALLED_PRODUCTS, +- GSD_SUBMAN_SUBSCRIPTION_STATUS_LAST + } GsdSubmanSubscriptionStatus; + + const gchar *gsd_subman_subscription_status_to_string (GsdSubmanSubscriptionStatus status); + + G_END_DECLS + + #endif /* __GSD_SUBMAN_COMMON_H */ +-- +2.30.0 + diff --git a/0015-subman-Clean-up-notification-behavior.patch b/0015-subman-Clean-up-notification-behavior.patch new file mode 100644 index 0000000..96585cd --- /dev/null +++ b/0015-subman-Clean-up-notification-behavior.patch @@ -0,0 +1,419 @@ +From 3412be1f63df2a5967ef92c27028368df1646b5c Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Sun, 24 Jan 2021 12:41:20 -0500 +Subject: [PATCH 15/15] subman: Clean up notification behavior + +Notifications were only displayed for some status transitions. + +This commit introduces some booleans based on the old and new +statuses to make the code clearer and to make it easier to hit +all the cases. +--- + plugins/subman/gsd-subman-common.h | 1 + + plugins/subman/gsd-subscription-manager.c | 141 ++++++++++++++++++---- + 2 files changed, 120 insertions(+), 22 deletions(-) + +diff --git a/plugins/subman/gsd-subman-common.h b/plugins/subman/gsd-subman-common.h +index 88226564..9397dbe4 100644 +--- a/plugins/subman/gsd-subman-common.h ++++ b/plugins/subman/gsd-subman-common.h +@@ -1,40 +1,41 @@ + /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2019 Richard Hughes + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ + + #ifndef __GSD_SUBMAN_COMMON_H + #define __GSD_SUBMAN_COMMON_H + + #include + + G_BEGIN_DECLS + + typedef enum { ++ GSD_SUBMAN_SUBSCRIPTION_STATUS_NOT_READ = -1, + GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN, + GSD_SUBMAN_SUBSCRIPTION_STATUS_VALID, + GSD_SUBMAN_SUBSCRIPTION_STATUS_INVALID, + GSD_SUBMAN_SUBSCRIPTION_STATUS_DISABLED, + GSD_SUBMAN_SUBSCRIPTION_STATUS_PARTIALLY_VALID, + GSD_SUBMAN_SUBSCRIPTION_STATUS_NO_INSTALLED_PRODUCTS, + } GsdSubmanSubscriptionStatus; + + const gchar *gsd_subman_subscription_status_to_string (GsdSubmanSubscriptionStatus status); + + G_END_DECLS + + #endif /* __GSD_SUBMAN_COMMON_H */ +diff --git a/plugins/subman/gsd-subscription-manager.c b/plugins/subman/gsd-subscription-manager.c +index 6d80bfa9..aaccbbc6 100644 +--- a/plugins/subman/gsd-subscription-manager.c ++++ b/plugins/subman/gsd-subscription-manager.c +@@ -243,60 +243,61 @@ _client_installed_products_update (GsdSubscriptionManager *manager, GError **err + product->version = g_strdup (json_array_get_string_element (json_product, 2)); + product->arch = g_strdup (json_array_get_string_element (json_product, 3)); + product->status = g_strdup (json_array_get_string_element (json_product, 4)); + product->starts = g_strdup (json_array_get_string_element (json_product, 6)); + product->ends = g_strdup (json_array_get_string_element (json_product, 7)); + + g_ptr_array_add (priv->installed_products, g_steal_pointer (&product)); + } + + /* emit notification for g-c-c */ + _emit_property_changed (manager, "InstalledProducts", + _make_installed_products_variant (priv->installed_products)); + + return TRUE; + } + + static gboolean + _client_subscription_status_update (GsdSubscriptionManager *manager, GError **error) + { + GsdSubscriptionManagerPrivate *priv = manager->priv; + g_autoptr(GVariant) uuid = NULL; + const gchar *uuid_txt = NULL; + JsonNode *json_root; + JsonObject *json_obj; + const gchar *json_txt = NULL; + g_autoptr(GVariant) status = NULL; + g_autoptr(JsonParser) json_parser = json_parser_new (); + + /* save old value */ + priv->subscription_status_last = priv->subscription_status; ++ + if (!_client_installed_products_update (manager, error)) + goto out; + + if (priv->installed_products->len == 0) { + priv->subscription_status = GSD_SUBMAN_SUBSCRIPTION_STATUS_NO_INSTALLED_PRODUCTS; + goto out; + } + + uuid = g_dbus_proxy_call_sync (priv->proxies[_RHSM_INTERFACE_CONSUMER], + "GetUuid", + g_variant_new ("(s)", + "C.UTF-8"), + G_DBUS_CALL_FLAGS_NONE, + -1, NULL, error); + if (uuid == NULL) + return FALSE; + + g_variant_get (uuid, "(&s)", &uuid_txt); + + if (uuid_txt[0] == '\0') { + priv->subscription_status = GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN; + goto out; + } + + status = g_dbus_proxy_call_sync (priv->proxies[_RHSM_INTERFACE_ENTITLEMENT], + "GetStatus", + g_variant_new ("(ss)", + "", /* assumed as 'now' */ + "C.UTF-8"), + G_DBUS_CALL_FLAGS_NONE, +@@ -485,109 +486,203 @@ typedef enum { + static void + _show_notification (GsdSubscriptionManager *manager, _NotifyKind notify_kind) + { + GsdSubscriptionManagerPrivate *priv = manager->priv; + switch (notify_kind) { + case _NOTIFY_EXPIRED: + notify_notification_close (priv->notification_registered, NULL); + notify_notification_close (priv->notification_registration_required, NULL); + notify_notification_show (priv->notification_expired, NULL); + break; + case _NOTIFY_REGISTRATION_REQUIRED: + notify_notification_close (priv->notification_registered, NULL); + notify_notification_close (priv->notification_expired, NULL); + notify_notification_show (priv->notification_registration_required, NULL); + break; + case _NOTIFY_REGISTERED: + notify_notification_close (priv->notification_expired, NULL); + notify_notification_close (priv->notification_registration_required, NULL); + notify_notification_show (priv->notification_registered, NULL); + break; + default: + break; + } + g_timer_reset (priv->timer_last_notified); + } + + static void + _client_maybe__show_notification (GsdSubscriptionManager *manager) + { + GsdSubscriptionManagerPrivate *priv = manager->priv; ++ gboolean was_read, was_registered, had_subscriptions, needed_subscriptions; ++ gboolean is_read, is_registered, has_subscriptions, needs_subscriptions; ++ ++ switch (priv->subscription_status_last) { ++ case GSD_SUBMAN_SUBSCRIPTION_STATUS_NOT_READ: ++ was_read = FALSE; ++ was_registered = FALSE; ++ needed_subscriptions = TRUE; ++ had_subscriptions = FALSE; ++ break; ++ case GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN: ++ was_read = TRUE; ++ was_registered = FALSE; ++ needed_subscriptions = TRUE; ++ had_subscriptions = FALSE; ++ break; ++ case GSD_SUBMAN_SUBSCRIPTION_STATUS_VALID: ++ was_read = TRUE; ++ was_registered = TRUE; ++ needed_subscriptions = TRUE; ++ had_subscriptions = TRUE; ++ break; ++ case GSD_SUBMAN_SUBSCRIPTION_STATUS_INVALID: ++ was_read = TRUE; ++ was_registered = TRUE; ++ needed_subscriptions = TRUE; ++ had_subscriptions = FALSE; ++ break; ++ case GSD_SUBMAN_SUBSCRIPTION_STATUS_DISABLED: ++ was_read = TRUE; ++ was_registered = TRUE; ++ needed_subscriptions = FALSE; ++ had_subscriptions = FALSE; ++ break; ++ case GSD_SUBMAN_SUBSCRIPTION_STATUS_PARTIALLY_VALID: ++ was_read = TRUE; ++ was_registered = TRUE; ++ needed_subscriptions = TRUE; ++ had_subscriptions = FALSE; ++ case GSD_SUBMAN_SUBSCRIPTION_STATUS_NO_INSTALLED_PRODUCTS: ++ was_read = TRUE; ++ was_registered = FALSE; ++ needed_subscriptions = FALSE; ++ had_subscriptions = FALSE; ++ break; ++ } ++ ++ switch (priv->subscription_status) { ++ case GSD_SUBMAN_SUBSCRIPTION_STATUS_NOT_READ: ++ is_read = FALSE; ++ is_registered = FALSE; ++ needs_subscriptions = TRUE; ++ has_subscriptions = FALSE; ++ break; ++ case GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN: ++ is_read = TRUE; ++ is_registered = FALSE; ++ needs_subscriptions = TRUE; ++ has_subscriptions = FALSE; ++ break; ++ case GSD_SUBMAN_SUBSCRIPTION_STATUS_VALID: ++ is_read = TRUE; ++ is_registered = TRUE; ++ needs_subscriptions = TRUE; ++ has_subscriptions = TRUE; ++ break; ++ case GSD_SUBMAN_SUBSCRIPTION_STATUS_PARTIALLY_VALID: ++ case GSD_SUBMAN_SUBSCRIPTION_STATUS_INVALID: ++ is_read = TRUE; ++ is_registered = TRUE; ++ needs_subscriptions = TRUE; ++ has_subscriptions = FALSE; ++ break; ++ case GSD_SUBMAN_SUBSCRIPTION_STATUS_DISABLED: ++ is_read = TRUE; ++ is_registered = TRUE; ++ needs_subscriptions = FALSE; ++ has_subscriptions = FALSE; ++ break; ++ case GSD_SUBMAN_SUBSCRIPTION_STATUS_NO_INSTALLED_PRODUCTS: ++ is_read = TRUE; ++ is_registered = FALSE; ++ needs_subscriptions = FALSE; ++ has_subscriptions = FALSE; ++ break; ++ } + + /* startup */ +- if (priv->subscription_status_last == GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN && +- priv->subscription_status == GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN) { ++ if (!was_read && is_read && priv->subscription_status == GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN) { + _show_notification (manager, _NOTIFY_REGISTRATION_REQUIRED); + return; + } + + /* something changed */ +- if (priv->subscription_status_last != priv->subscription_status) { ++ if (was_read && is_read && priv->subscription_status_last != priv->subscription_status) { + g_debug ("transisition from subscription status '%s' to '%s'", + gsd_subman_subscription_status_to_string (priv->subscription_status_last), + gsd_subman_subscription_status_to_string (priv->subscription_status)); + +- /* needs registration */ +- if (priv->subscription_status_last == GSD_SUBMAN_SUBSCRIPTION_STATUS_VALID && +- priv->subscription_status == GSD_SUBMAN_SUBSCRIPTION_STATUS_INVALID) { +- _show_notification (manager, _NOTIFY_REGISTRATION_REQUIRED); ++ /* needs subscription */ ++ if (is_registered && needs_subscriptions && !has_subscriptions) { ++ _show_notification (manager, _NOTIFY_EXPIRED); + return; + } + + /* was unregistered */ +- if (priv->subscription_status_last == GSD_SUBMAN_SUBSCRIPTION_STATUS_VALID && +- priv->subscription_status == GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN) { ++ if (was_registered && !is_registered) { + _show_notification (manager, _NOTIFY_REGISTRATION_REQUIRED); + return; + } + +- /* registered */ +- if (priv->subscription_status_last == GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN && +- priv->subscription_status == GSD_SUBMAN_SUBSCRIPTION_STATUS_VALID && +- g_timer_elapsed (priv->timer_last_notified, NULL) > 60) { +- _show_notification (manager, _NOTIFY_REGISTERED); +- return; ++ /* just registered */ ++ if (!was_registered && is_registered) { ++ if (!needs_subscriptions || has_subscriptions) { ++ _show_notification (manager, _NOTIFY_REGISTERED); ++ return; ++ } ++ } ++ ++ /* subscriptions changed */ ++ if (was_registered && is_registered) { ++ /* subscribed */ ++ if (!had_subscriptions && ++ needs_subscriptions && has_subscriptions) { ++ _show_notification (manager, _NOTIFY_REGISTERED); ++ return; ++ } ++ ++ /* simple content access enabled */ ++ if (needed_subscriptions && !had_subscriptions && !needs_subscriptions) { ++ _show_notification (manager, _NOTIFY_REGISTERED); ++ return; ++ } + } + } + + /* nag again */ +- if (priv->subscription_status == GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN && ++ if (!is_registered && + g_timer_elapsed (priv->timer_last_notified, NULL) > 60 * 60 * 24) { + _show_notification (manager, _NOTIFY_REGISTRATION_REQUIRED); + return; + } +- if (priv->subscription_status == GSD_SUBMAN_SUBSCRIPTION_STATUS_INVALID && +- g_timer_elapsed (priv->timer_last_notified, NULL) > 60 * 60 * 24) { +- _show_notification (manager, _NOTIFY_EXPIRED); +- return; +- } +- if (priv->subscription_status == GSD_SUBMAN_SUBSCRIPTION_STATUS_PARTIALLY_VALID && ++ if (is_registered && !has_subscriptions && needs_subscriptions && + g_timer_elapsed (priv->timer_last_notified, NULL) > 60 * 60 * 24) { + _show_notification (manager, _NOTIFY_EXPIRED); + return; + } + } + + static gboolean + _client_register_with_keys (GsdSubscriptionManager *manager, + const gchar *hostname, + const gchar *organisation, + const gchar *activation_key, + GError **error) + { + GsdSubscriptionManagerPrivate *priv = manager->priv; + g_autoptr(GSubprocess) subprocess = NULL; + g_autoptr(GBytes) stdin_buf = g_bytes_new (activation_key, strlen (activation_key) + 1); + g_autoptr(GBytes) stderr_buf = NULL; + gint rc; + + /* apparently: "we can't send registration credentials over the regular + * system or session bus since those aren't really locked down..." */ + if (!_client_register_start (manager, error)) + return FALSE; + g_debug ("spawning %s", LIBEXECDIR "/gsd-subman-helper"); + subprocess = g_subprocess_new (G_SUBPROCESS_FLAGS_STDIN_PIPE | G_SUBPROCESS_FLAGS_STDERR_PIPE, error, + "pkexec", LIBEXECDIR "/gsd-subman-helper", + "--kind", "register-with-key", + "--address", priv->address, + "--hostname", hostname, + "--organisation", organisation, +@@ -914,60 +1009,62 @@ gsd_subscription_manager_class_init (GsdSubscriptionManagerClass *klass) + static void + _launch_info_overview (void) + { + const gchar *argv[] = { "gnome-control-center", "info-overview", NULL }; + g_debug ("Running gnome-control-center info-overview"); + g_spawn_async (NULL, (gchar **) argv, NULL, G_SPAWN_SEARCH_PATH, + NULL, NULL, NULL, NULL); + } + + static void + _notify_closed_cb (NotifyNotification *notification, gpointer user_data) + { + /* FIXME: only launch when clicking on the main body, not the window close */ + if (notify_notification_get_closed_reason (notification) == 0x400) + _launch_info_overview (); + } + + static void + _notify_clicked_cb (NotifyNotification *notification, char *action, gpointer user_data) + { + _launch_info_overview (); + } + + static void + gsd_subscription_manager_init (GsdSubscriptionManager *manager) + { + GsdSubscriptionManagerPrivate *priv = manager->priv = GSD_SUBSCRIPTION_MANAGER_GET_PRIVATE (manager); + + priv->installed_products = g_ptr_array_new_with_free_func ((GDestroyNotify) product_data_free); + priv->timer_last_notified = g_timer_new (); ++ priv->subscription_status = GSD_SUBMAN_SUBSCRIPTION_STATUS_NOT_READ; ++ priv->subscription_status_last = GSD_SUBMAN_SUBSCRIPTION_STATUS_NOT_READ; + + /* expired */ + priv->notification_expired = + notify_notification_new (_("Subscription Has Expired"), + _("Add or renew a subscription to continue receiving software updates."), + NULL); + notify_notification_set_app_name (priv->notification_expired, _("Subscription")); + notify_notification_set_hint_string (priv->notification_expired, "desktop-entry", "subman-panel"); + notify_notification_set_hint_string (priv->notification_expired, "x-gnome-privacy-scope", "system"); + notify_notification_set_urgency (priv->notification_expired, NOTIFY_URGENCY_CRITICAL); + notify_notification_add_action (priv->notification_expired, + "info-overview", _("Subscribe System…"), + _notify_clicked_cb, + manager, NULL); + g_signal_connect (priv->notification_expired, "closed", + G_CALLBACK (_notify_closed_cb), manager); + + /* registered */ + priv->notification_registered = + notify_notification_new (_("Registration Successful"), + _("The system has been registered and software updates have been enabled."), + NULL); + notify_notification_set_app_name (priv->notification_registered, _("Subscription")); + notify_notification_set_hint_string (priv->notification_registered, "desktop-entry", "subman-panel"); + notify_notification_set_hint_string (priv->notification_registered, "x-gnome-privacy-scope", "system"); + notify_notification_set_urgency (priv->notification_registered, NOTIFY_URGENCY_CRITICAL); + g_signal_connect (priv->notification_registered, "closed", + G_CALLBACK (_notify_closed_cb), manager); + + /* registration required */ +-- +2.30.0 + diff --git a/0016-subman-Update-POTFILES.in.patch b/0016-subman-Update-POTFILES.in.patch new file mode 100644 index 0000000..f2882e1 --- /dev/null +++ b/0016-subman-Update-POTFILES.in.patch @@ -0,0 +1,25 @@ +From ff1278ecdebb5b23c80589a65f053d535a4d4f6a Mon Sep 17 00:00:00 2001 +From: Kalev Lember +Date: Fri, 12 Feb 2021 14:51:29 +0100 +Subject: [PATCH 16/16] subman: Update POTFILES.in + +--- + po/POTFILES.in | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/po/POTFILES.in b/po/POTFILES.in +index 7f17d5b5..9b94dc0f 100644 +--- a/po/POTFILES.in ++++ b/po/POTFILES.in +@@ -25,6 +25,8 @@ plugins/print-notifications/gsd-printer.c + plugins/print-notifications/gsd-print-notifications-manager.c + plugins/smartcard/gsd-smartcard-manager.c + plugins/smartcard/gsd-smartcard-service.c ++plugins/subman/gsd-subscription-manager.c ++plugins/subman/org.gnome.settings-daemon.plugins.subman.policy.in.in + plugins/wacom/gsd-wacom-manager.c + plugins/wacom/org.gnome.settings-daemon.plugins.wacom.policy.in.in + plugins/xsettings/gsd-xsettings-manager.c +-- +2.29.2 + diff --git a/0017-Update-translations.patch b/0017-Update-translations.patch new file mode 100644 index 0000000..cb21af2 --- /dev/null +++ b/0017-Update-translations.patch @@ -0,0 +1,10198 @@ +From cbc4a1308af27308217233def7aab6ef4d1156c2 Mon Sep 17 00:00:00 2001 +From: Kalev Lember +Date: Fri, 10 Sep 2021 13:50:55 +0200 +Subject: [PATCH 17/17] Update translations + +https://bugzilla.redhat.com/show_bug.cgi?id=1876291 +https://bugzilla.redhat.com/show_bug.cgi?id=1978612 +--- + po/fr.po | 547 +++---- + po/ja.po | 4326 ++++++++++++++++++++++++++------------------------- + po/pt_BR.po | 369 +++-- + po/zh_CN.po | 1153 +++++++------- + 4 files changed, 3202 insertions(+), 3193 deletions(-) + +diff --git a/po/fr.po b/po/fr.po +index a42b9398..3f778d5f 100644 +--- a/po/fr.po ++++ b/po/fr.po +@@ -16,9 +16,8 @@ + msgid "" + msgstr "" + "Project-Id-Version: gnome-settings-daemon HEAD\n" +-"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-settings-daemon/" +-"issues\n" +-"POT-Creation-Date: 2019-01-18 13:47+0000\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2021-02-12 15:05+0100\n" + "PO-Revision-Date: 2019-02-12 21:55+0100\n" + "Last-Translator: Charles Monzat \n" + "Language-Team: GNOME French Team \n" +@@ -37,11 +36,7 @@ msgstr "Action quand la carte à puce est retirée" + msgid "" + "Set this to one of “none”, “lock-screen”, or “force-logout”. The action will " + "get performed when the smartcard used for log in is removed." +-msgstr "" +-"Définissez cette clé selon l’une des valeurs suivantes : « none » (aucune), " +-"« lock-screen » (verrouiller l’écran) ou « force-logout » (forcer la " +-"déconnexion). Cette action est effectuée lorsque la carte à puce utilisée " +-"pour se connecter est retirée." ++msgstr "Définissez cette clé selon l’une des valeurs suivantes : « none » (aucune), « lock-screen » (verrouiller l’écran) ou « force-logout » (forcer la déconnexion). Cette action est effectuée lorsque la carte à puce utilisée pour se connecter est retirée." + + #: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:25 + msgid "Possible values are “on”, “off”, and “custom”." +@@ -63,9 +58,7 @@ msgstr "Se souvenir de l’état du verrouillage numérique" + msgid "" + "When set to true, GNOME will remember the state of the NumLock LED between " + "sessions." +-msgstr "" +-"Si défini à vrai, GNOME se souvient de l’état de la diode lumineuse Verr. " +-"Num. entre les sessions." ++msgstr "Si défini à vrai, GNOME se souvient de l’état de la diode lumineuse Verr. Num. entre les sessions." + + #: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:45 + msgid "NumLock state" +@@ -79,9 +72,7 @@ msgstr "État conservé de la diode Verr. Num." + msgid "" + "Highlights the current location of the pointer when the Control key is " + "pressed and released." +-msgstr "" +-"Met en évidence la position du pointeur de la souris lorsque la touche Ctrl " +-"est pressée puis relâchée." ++msgstr "Met en évidence la position du pointeur de la souris lorsque la touche Ctrl est pressée puis relâchée." + + #: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:56 + msgid "Double click time" +@@ -101,9 +92,7 @@ msgstr "Distance avant qu’un glisser-déposer soit initié." + + #: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:68 + msgid "Whether the tablet’s orientation is locked, or rotated automatically." +-msgstr "" +-"Indique si l’orientation de la tablette est verrouillée ou si la rotation " +-"est automatique." ++msgstr "Indique si l’orientation de la tablette est verrouillée ou si la rotation est automatique." + + #: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:76 + msgid "Mouse button orientation" +@@ -123,9 +112,7 @@ msgstr "Simple clic" + msgid "" + "Acceleration multiplier for mouse motion. A value of -1 is the system " + "default." +-msgstr "" +-"Multiplicateur d’accélération pour le déplacement de la souris. Une valeur " +-"de -1 correspond à la valeur par défaut du système." ++msgstr "Multiplicateur d’accélération pour le déplacement de la souris. Une valeur de -1 correspond à la valeur par défaut du système." + + #: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:86 + #: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:148 +@@ -137,10 +124,7 @@ msgstr "Seuil de déplacement" + msgid "" + "Distance in pixels the pointer must move before accelerated mouse motion is " + "activated. A value of -1 is the system default." +-msgstr "" +-"Distance en pixels que le pointeur doit parcourir avant l’activation du " +-"déplacement de souris accéléré. Une valeur de -1 correspond à la valeur par " +-"défaut du système." ++msgstr "Distance en pixels que le pointeur doit parcourir avant l’activation du déplacement de souris accéléré. Une valeur de -1 correspond à la valeur par défaut du système." + + #: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:91 + msgid "Middle button emulation" +@@ -150,9 +134,7 @@ msgstr "Émulation du bouton du milieu" + msgid "" + "Enables middle mouse button emulation through simultaneous left and right " + "button click." +-msgstr "" +-"Active l’émulation du bouton du milieu de la souris par un clic simultané " +-"des boutons gauche et droit." ++msgstr "Active l’émulation du bouton du milieu de la souris par un clic simultané des boutons gauche et droit." + + #: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:101 + msgid "Key Repeat Interval" +@@ -178,9 +160,7 @@ msgstr "Désactivation du pavé tactile lors de la frappe" + msgid "" + "Set this to TRUE if you have problems with accidentally hitting the touchpad " + "while typing." +-msgstr "" +-"Définissez ce réglage à vrai si vous avez des problèmes avec l’activation " +-"inopinée du pavé tactile lorsque vous écrivez au clavier." ++msgstr "Définissez ce réglage à vrai si vous avez des problèmes avec l’activation inopinée du pavé tactile lorsque vous écrivez au clavier." + + #: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:118 + msgid "Enable horizontal scrolling" +@@ -190,9 +170,7 @@ msgstr "Activer le défilement horizontal" + msgid "" + "Set this to TRUE to allow horizontal scrolling by the same method selected " + "with the scroll_method key." +-msgstr "" +-"Définissez ce réglage à vrai pour permettre le défilement horizontal par la " +-"même méthode qui est définie par la clé scroll_method." ++msgstr "Définissez ce réglage à vrai pour permettre le défilement horizontal par la même méthode qui est définie par la clé scroll_method." + + #: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:123 + msgid "Select the touchpad scroll method" +@@ -202,10 +180,7 @@ msgstr "Méthode de défilement du pavé tactile" + msgid "" + "Select the touchpad scroll method. Supported values are: “disabled”, “edge-" + "scrolling”, “two-finger-scrolling”." +-msgstr "" +-"Choisissez la méthode de défilement du pavé tactile. Les valeurs prises en " +-"charge sont : « disabled » (désactivé), « edge-scrolling » (défilement sur " +-"les bords) et « two-finger-scrolling » (défilement à deux doigts)." ++msgstr "Choisissez la méthode de défilement du pavé tactile. Les valeurs prises en charge sont : « disabled » (désactivé), « edge-scrolling » (défilement sur les bords) et « two-finger-scrolling » (défilement à deux doigts)." + + #: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:128 + msgid "Enable mouse clicks with touchpad" +@@ -214,9 +189,7 @@ msgstr "Activer les clics de souris avec le pavé tactile" + #: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:129 + msgid "" + "Set this to TRUE to be able to send mouse clicks by tapping on the touchpad." +-msgstr "" +-"Définissez ce réglage à vrai pour pouvoir émuler des clics de souris en " +-"tapant sur le pavé tactile." ++msgstr "Définissez ce réglage à vrai pour pouvoir émuler des clics de souris en tapant sur le pavé tactile." + + #: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:133 + msgid "Enable touchpad" +@@ -234,10 +207,7 @@ msgstr "Orientation des boutons du pavé tactile" + msgid "" + "Swap left and right mouse buttons for left-handed mice with “left”, “right” " + "for right-handed, “mouse” to follow the mouse setting." +-msgstr "" +-"« left » inverse les boutons de souris gauche et droit pour les gauchers, " +-"« right » convient aux droitiers et « mouse » utilise le même réglage que " +-"pour la souris." ++msgstr "« left » inverse les boutons de souris gauche et droit pour les gauchers, « right » convient aux droitiers et « mouse » utilise le même réglage que pour la souris." + + #: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:153 + msgid "Natural scrolling" +@@ -245,14 +215,11 @@ msgstr "Défilement naturel" + + #: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:154 + msgid "Set this to TRUE to enable natural (reverse) scrolling for touchpads." +-msgstr "" +-"Définissez ce réglage à vrai pour activer le défilement naturel (inversé) " +-"pour les pavés tactiles." ++msgstr "Définissez ce réglage à vrai pour activer le défilement naturel (inversé) pour les pavés tactiles." + + #: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:161 + msgid "Mouse wheel emulation button. 0 to disable the feature." +-msgstr "" +-"Bouton d’émulation de la molette de la souris. 0 désactive la fonctionnalité." ++msgstr "Bouton d’émulation de la molette de la souris. 0 désactive la fonctionnalité." + + #: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:10 + msgid "Wacom stylus absolute mode" +@@ -268,9 +235,7 @@ msgstr "Zone de la tablette Wacom" + + #: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:16 + msgid "Set this to x1, y1 and x2, y2 of the area usable by the tools." +-msgstr "" +-"Définit les coordonnées x1, y1 et x2, y2 de la surface utilisable par les " +-"outils." ++msgstr "Définit les coordonnées x1, y1 et x2, y2 de la surface utilisable par les outils." + + #: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:20 + msgid "Wacom tablet aspect ratio" +@@ -280,9 +245,7 @@ msgstr "Proportions de la tablette Wacom" + msgid "" + "Enable this to restrict the Wacom tablet area to match the aspect ratio of " + "the output." +-msgstr "" +-"Activez cette option afin de limiter la surface de la tablette Wacom pour " +-"correspondre aux proportions de l’affichage." ++msgstr "Activez cette option afin de limiter la surface de la tablette Wacom pour correspondre aux proportions de l’affichage." + + #: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:25 + msgid "Wacom tablet rotation" +@@ -292,9 +255,7 @@ msgstr "Rotation de la tablette Wacom" + msgid "" + "Set this to “none”, “cw” for 90 degree clockwise, “half” for 180 degree, and " + "“ccw” for 90 degree counterclockwise." +-msgstr "" +-"Réglez-la à « none » (aucune), « cw » pour 90 degrés dans le sens horaire, " +-"« half » pour 180 degrés et « ccw » pour 90 degrés dans le sens anti-horaire." ++msgstr "Réglez-la à « none » (aucune), « cw » pour 90 degrés dans le sens horaire, « half » pour 180 degrés et « ccw » pour 90 degrés dans le sens anti-horaire." + + #: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:30 + msgid "Wacom touch feature" +@@ -302,9 +263,7 @@ msgstr "Fonctionnalités tactiles Wacom" + + #: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:31 + msgid "Enable this to move the cursor when the user touches the tablet." +-msgstr "" +-"Activer cette option pour déplacer le curseur lorsque l’utilisateur touche " +-"la tablette." ++msgstr "Activer cette option pour déplacer le curseur lorsque l’utilisateur touche la tablette." + + #: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:37 + msgid "Wacom stylus pressure curve" +@@ -313,9 +272,7 @@ msgstr "Courbe de pression du stylet Wacom" + #: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:38 + msgid "" + "Set this to x1, y1 and x2, y2 of the pressure curve applied to the stylus." +-msgstr "" +-"Définissez ici les coordonnées x1, y1 et x2, y2 selon la courbe de pression " +-"appliquée au stylet." ++msgstr "Définissez ici les coordonnées x1, y1 et x2, y2 selon la courbe de pression appliquée au stylet." + + #: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:42 + msgid "Wacom stylus button mapping" +@@ -333,9 +290,7 @@ msgstr "Seuil de pression pour le stylet Wacom" + #: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:48 + msgid "" + "Set this to the pressure value at which a stylus click event is generated." +-msgstr "" +-"Définissez ici la valeur de pression pour laquelle un évènement clic du " +-"stylet est généré." ++msgstr "Définissez ici la valeur de pression pour laquelle un évènement clic du stylet est généré." + + #: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:54 + msgid "Wacom eraser pressure curve" +@@ -344,9 +299,7 @@ msgstr "Courbe de pression de la gomme Wacom" + #: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:55 + msgid "" + "Set this to x1, y1 and x2, y2 of the pressure curve applied to the eraser." +-msgstr "" +-"Définissez ici les coordonnées x1, y1 et x2, y2 selon la courbe de pression " +-"appliquée à la gomme." ++msgstr "Définissez ici les coordonnées x1, y1 et x2, y2 selon la courbe de pression appliquée à la gomme." + + #: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:59 + msgid "Wacom eraser button mapping" +@@ -359,9 +312,7 @@ msgstr "Seuil de pression de la gomme Wacom" + #: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:65 + msgid "" + "Set this to the pressure value at which an eraser click event is generated." +-msgstr "" +-"Définissez ici la valeur de pression pour laquelle un évènement clic de la " +-"gomme est généré." ++msgstr "Définissez ici la valeur de pression pour laquelle un évènement clic de la gomme est généré." + + #: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:71 + msgid "Wacom button action type" +@@ -379,24 +330,17 @@ msgstr "Combinaison de touches pour l’action personnalisée" + msgid "" + "The keyboard shortcut generated when the button is pressed for custom " + "actions." +-msgstr "" +-"Le raccourci clavier généré quand le bouton est appuyé pour des actions " +-"personnalisées." ++msgstr "Le raccourci clavier généré quand le bouton est appuyé pour des actions personnalisées." + + #: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:81 + msgid "Key combinations for a touchring or touchstrip custom action" +-msgstr "" +-"Combinaisons de touches pour une action personnalisée du type touchring ou " +-"touchstrip" ++msgstr "Combinaisons de touches pour une action personnalisée du type touchring ou touchstrip" + + #: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:82 + msgid "" + "The keyboard shortcuts generated when a touchring or touchstrip is used for " + "custom actions (up followed by down)." +-msgstr "" +-"Les raccourcis de clavier générés quand le touchring ou le touchstrip est " +-"utilisé pour des actions personnalisées (mouvement vers le haut puis vers le " +-"bas)." ++msgstr "Les raccourcis de clavier générés quand le touchring ou le touchstrip est utilisé pour des actions personnalisées (mouvement vers le haut puis vers le bas)." + + #. Translators: This is the OLED display on an Intuos4 tablet: + #. http://eu.shop.wacom.eu/images/articles/d9abd9f2d4d88aa0649cda97a8077e2b_8.jpg +@@ -416,9 +360,7 @@ msgstr "La durée de validité d’un profil d’écran" + msgid "" + "This is the number of days after which the display color profile is " + "considered invalid." +-msgstr "" +-"Nombre de jours après quoi le profil colorimétrique de l’affichage est " +-"considéré comme périmé." ++msgstr "Nombre de jours après quoi le profil colorimétrique de l’affichage est considéré comme périmé." + + #: data/org.gnome.settings-daemon.plugins.color.gschema.xml.in:11 + msgid "The duration a printer profile is valid" +@@ -428,9 +370,7 @@ msgstr "La durée de validité d’un profil d’impression" + msgid "" + "This is the number of days after which the printer color profile is " + "considered invalid." +-msgstr "" +-"Nombre de jours après quoi le profil colorimétrique de l’impression est " +-"considéré comme périmé." ++msgstr "Nombre de jours après quoi le profil colorimétrique de l’impression est considéré comme périmé." + + #: data/org.gnome.settings-daemon.plugins.color.gschema.xml.in:16 + msgid "If the night light mode is enabled" +@@ -440,9 +380,7 @@ msgstr "Indique si le mode éclairage de nuit est activé" + msgid "" + "Night light mode changes the color temperature of your display when the sun " + "has gone down or at preset times." +-msgstr "" +-"Le mode éclairage de nuit modifie la température de couleur de l’écran " +-"lorsque la lumière solaire a baissé ou à des heures définies." ++msgstr "Le mode éclairage de nuit modifie la température de couleur de l’écran lorsque la lumière solaire a baissé ou à des heures définies." + + #: data/org.gnome.settings-daemon.plugins.color.gschema.xml.in:21 + msgid "Temperature of the display when enabled" +@@ -452,10 +390,7 @@ msgstr "La température de l’écran lorsqu’activé" + msgid "" + "This temperature in Kelvin is used to modify the screen tones when night " + "light mode is enabled. Higher values are bluer, lower redder." +-msgstr "" +-"Cette température exprimée en degrés Kelvin sert à modifier les couleurs " +-"d’affichage lorsque le mode éclairage de nuit est activé. Les valeurs les " +-"plus élevées tendent vers le bleu, les plus basses vers le rouge." ++msgstr "Cette température exprimée en degrés Kelvin sert à modifier les couleurs d’affichage lorsque le mode éclairage de nuit est activé. Les valeurs les plus élevées tendent vers le bleu, les plus basses vers le rouge." + + #: data/org.gnome.settings-daemon.plugins.color.gschema.xml.in:26 + msgid "Use the sunrise and sunset" +@@ -465,9 +400,7 @@ msgstr "Utiliser les heures de lever et coucher du soleil" + msgid "" + "Calculate the sunrise and sunset times automatically, from the current " + "location." +-msgstr "" +-"Calculer automatiquement les heures de lever et coucher du soleil en " +-"fonction de votre emplacement." ++msgstr "Calculer automatiquement les heures de lever et coucher du soleil en fonction de votre emplacement." + + #: data/org.gnome.settings-daemon.plugins.color.gschema.xml.in:31 + msgid "The start time" +@@ -477,9 +410,7 @@ msgstr "Heure de début" + msgid "" + "When “night-light-schedule-automatic” is disabled, use this start time in " + "hours from midnight." +-msgstr "" +-"Lorsque « night-light-schedule-automatic » est désactivé, utiliser cette " +-"heure de début en heures à partir de minuit." ++msgstr "Lorsque « night-light-schedule-automatic » est désactivé, utiliser cette heure de début en heures à partir de minuit." + + #: data/org.gnome.settings-daemon.plugins.color.gschema.xml.in:36 + msgid "The end time" +@@ -489,9 +420,7 @@ msgstr "Heure de fin" + msgid "" + "When “night-light-schedule-automatic” is disabled, use this end time in " + "hours from midnight." +-msgstr "" +-"Lorsque « night-light-schedule-automatic » est désactivé, utiliser cette " +-"heure de fin en heures à partir de minuit." ++msgstr "Lorsque « night-light-schedule-automatic » est désactivé, utiliser cette heure de fin en heures à partir de minuit." + + #: data/org.gnome.settings-daemon.plugins.color.gschema.xml.in:41 + msgid "The last detected position" +@@ -502,10 +431,7 @@ msgid "" + "When location services are available this represents the last detected " + "location. The default value is an invalid value to ensure it is always " + "updated at startup." +-msgstr "" +-"Lorsque les services de géolocalisation sont disponibles, ceci représente la " +-"dernière position géographique détectée. La valeur par défaut est une valeur " +-"non valide afin de toujours assurer sa mise à jour au démarrage." ++msgstr "Lorsque les services de géolocalisation sont disponibles, ceci représente la dernière position géographique détectée. La valeur par défaut est une valeur non valide afin de toujours assurer sa mise à jour au démarrage." + + #: data/org.gnome.settings-daemon.plugins.gschema.xml.in:6 + msgid "List of plugins that are allowed to be loaded" +@@ -515,9 +441,7 @@ msgstr "Liste des greffons autorisés au chargement" + msgid "" + "A list of strings representing the plugins that are allowed to be loaded " + "(default: “all”). This is only evaluated on startup." +-msgstr "" +-"Une liste de chaînes décrivant les greffons qui sont autorisés au chargement " +-"(la valeur par défaut est « all », tous). Cela n’est évalué qu’au démarrage." ++msgstr "Une liste de chaînes décrivant les greffons qui sont autorisés au chargement (la valeur par défaut est « all », tous). Cela n’est évalué qu’au démarrage." + + #: data/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml.in:6 + msgid "Mount paths to ignore" +@@ -525,9 +449,7 @@ msgstr "Chemins de montage à ignorer" + + #: data/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml.in:7 + msgid "Specify a list of mount paths to ignore when they run low on space." +-msgstr "" +-"Indique une liste de chemins de montage à ignorer lorsque leur espace disque " +-"est faible." ++msgstr "Indique une liste de chemins de montage à ignorer lorsque leur espace disque est faible." + + #: data/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml.in:12 + msgid "Free percentage notify threshold" +@@ -537,10 +459,7 @@ msgstr "Seuil d’avertissement d’espace libre, en pourcentage" + msgid "" + "Percentage free space threshold for initial warning of low disk space. If " + "the percentage free space drops below this, a warning will be shown." +-msgstr "" +-"Seuil d’espace libre, en pourcentage, pour l’alerte initiale d’espace disque " +-"faible. Si le pourcentage d’espace libre tombe en dessous de ce seuil, une " +-"alerte est affichée." ++msgstr "Seuil d’espace libre, en pourcentage, pour l’alerte initiale d’espace disque faible. Si le pourcentage d’espace libre tombe en dessous de ce seuil, une alerte est affichée." + + #: data/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml.in:18 + msgid "Subsequent free space percentage notify threshold" +@@ -550,9 +469,7 @@ msgstr "Seuil suivant d’avertissement d’espace libre, en pourcentage" + msgid "" + "Specify the percentage that the free disk space should reduce by before " + "issuing a subsequent warning." +-msgstr "" +-"Indique le pourcentage de réduction d’espace disque avant d’émettre un " +-"nouvel avertissement." ++msgstr "Indique le pourcentage de réduction d’espace disque avant d’émettre un nouvel avertissement." + + #: data/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml.in:23 + msgid "Free space notify threshold" +@@ -562,9 +479,7 @@ msgstr "Seuil d’avertissement d’espace libre" + msgid "" + "Specify an amount in GB. If the amount of free space is more than this, no " + "warning will be shown." +-msgstr "" +-"Indique une taille en Go. Si la quantité d’espace disque disponible est " +-"supérieure à ce paramètre, aucune alerte ne sera affichée." ++msgstr "Indique une taille en Go. Si la quantité d’espace disque disponible est supérieure à ce paramètre, aucune alerte ne sera affichée." + + #: data/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml.in:28 + msgid "Minimum notify period for repeated warnings" +@@ -574,9 +489,7 @@ msgstr "Intervalle minimum de répétition des avertissements" + msgid "" + "Specify a time in minutes. Subsequent warnings for a volume will not appear " + "more often than this period." +-msgstr "" +-"Indique un intervalle en minutes. C’est le délai minimal entre deux alertes " +-"pour un même volume." ++msgstr "Indique un intervalle en minutes. C’est le délai minimal entre deux alertes pour un même volume." + + #: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:6 + msgid "Custom keybindings" +@@ -776,9 +689,7 @@ msgstr "Copier une capture d’écran d’une fenêtre vers le presse-papiers" + + #: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:127 + msgid "Binding to copy a screenshot of a window to clipboard." +-msgstr "" +-"Raccourci pour copier une capture d’écran d’une fenêtre vers le presse-" +-"papiers." ++msgstr "Raccourci pour copier une capture d’écran d’une fenêtre vers le presse-papiers." + + #: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:131 + msgid "Copy a screenshot of an area to clipboard" +@@ -786,9 +697,7 @@ msgstr "Copier une capture d’une partie de l’écran vers le presse-papiers" + + #: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:132 + msgid "Binding to copy a screenshot of an area to clipboard." +-msgstr "" +-"Raccourci pour copier une capture d’une partie de l’écran vers le presse-" +-"papiers." ++msgstr "Raccourci pour copier une capture d’une partie de l’écran vers le presse-papiers." + + #: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:136 + msgid "Record a short video of the screen" +@@ -878,9 +787,7 @@ msgstr "Longueur maximale des enregistrements d’écran" + msgid "" + "The maximum length of single screen cast recordings in seconds or 0 for " + "unlimited" +-msgstr "" +-"Longueur maximale d’une capture d’écran vidéo en secondes ou 0 pour une " +-"durée illimitée" ++msgstr "Longueur maximale d’une capture d’écran vidéo en secondes ou 0 pour une durée illimitée" + + #: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:194 + msgid "Name" +@@ -913,9 +820,7 @@ msgstr "Luminosité de l’écran hors activité" + #: data/org.gnome.settings-daemon.plugins.power.gschema.xml.in:7 + msgid "" + "This is the laptop panel screen brightness used when the session is idle." +-msgstr "" +-"Il s’agit de la luminosité d’écran d’ordinateur portable utilisée lorsque la " +-"session n’est pas active." ++msgstr "Il s’agit de la luminosité d’écran d’ordinateur portable utilisée lorsque la session n’est pas active." + + #: data/org.gnome.settings-daemon.plugins.power.gschema.xml.in:11 + msgid "Dim the screen after a period of inactivity" +@@ -923,9 +828,7 @@ msgstr "Assombrir l’écran après une période d’inactivité" + + #: data/org.gnome.settings-daemon.plugins.power.gschema.xml.in:12 + msgid "If the screen should be dimmed to save power when the computer is idle." +-msgstr "" +-"Indique si l’écran doit être obscurci pour économiser de l’énergie lorsque " +-"l’ordinateur n’est pas actif." ++msgstr "Indique si l’écran doit être obscurci pour économiser de l’énergie lorsque l’ordinateur n’est pas actif." + + #: data/org.gnome.settings-daemon.plugins.power.gschema.xml.in:16 + msgid "Sleep timeout computer when on AC" +@@ -935,9 +838,7 @@ msgstr "Délai avant endormissement de l’ordinateur sur secteur" + msgid "" + "The amount of time in seconds the computer on AC power needs to be inactive " + "before it goes to sleep. A value of 0 means never." +-msgstr "" +-"Le nombre de secondes d’inactivité avant que l’ordinateur sur alimentation " +-"secteur ne passe en mode veille. Une valeur à 0 signifie jamais." ++msgstr "Le nombre de secondes d’inactivité avant que l’ordinateur sur alimentation secteur ne passe en mode veille. Une valeur à 0 signifie jamais." + + #: data/org.gnome.settings-daemon.plugins.power.gschema.xml.in:21 + #: data/org.gnome.settings-daemon.plugins.power.gschema.xml.in:31 +@@ -948,9 +849,7 @@ msgstr "Hibernation, mise en veille ou statu quo en cas d’inactivité" + #: data/org.gnome.settings-daemon.plugins.power.gschema.xml.in:32 + msgid "" + "The type of sleeping that should be performed when the computer is inactive." +-msgstr "" +-"Type d’endormissement qui doit être appliqué lorsque l’ordinateur est " +-"inactif." ++msgstr "Type d’endormissement qui doit être appliqué lorsque l’ordinateur est inactif." + + #: data/org.gnome.settings-daemon.plugins.power.gschema.xml.in:26 + msgid "Sleep timeout computer when on battery" +@@ -960,9 +859,7 @@ msgstr "Délai avant endormissement de l’ordinateur sur batterie" + msgid "" + "The amount of time in seconds the computer on battery power needs to be " + "inactive before it goes to sleep. A value of 0 means never." +-msgstr "" +-"Le nombre de secondes d’inactivité avant que l’ordinateur sur batterie ne " +-"passe en mode veille. Une valeur à 0 signifie jamais." ++msgstr "Le nombre de secondes d’inactivité avant que l’ordinateur sur batterie ne passe en mode veille. Une valeur à 0 signifie jamais." + + #: data/org.gnome.settings-daemon.plugins.power.gschema.xml.in:36 + msgid "Enable the ALS sensor" +@@ -981,10 +878,7 @@ msgid "" + "The action to take when the system power button is pressed. This action is " + "hard-coded (and the setting ignored) on virtual machines (power off) and " + "tablets (suspend)." +-msgstr "" +-"Action à entreprendre lorsque le bouton d’alimentation du système est " +-"pressé. Cette action est fixe (et ce réglage ignoré) pour les machines " +-"virtuelles (extinction) et les tablettes (mise en veille)." ++msgstr "Action à entreprendre lorsque le bouton d’alimentation du système est pressé. Cette action est fixe (et ce réglage ignoré) pour les machines virtuelles (extinction) et les tablettes (mise en veille)." + + #: data/org.gnome.settings-daemon.plugins.sharing.gschema.xml.in:6 + msgid "On which connections the service is enabled" +@@ -994,9 +888,7 @@ msgstr "Sur quelles connexions le service est activé" + msgid "" + "The list of NetworkManager connections (each one represented with its UUID) " + "on which this service is enabled and started." +-msgstr "" +-"La liste des connexions NetworkManager (chacune représentée par son UUID) " +-"sur lesquelles ce service est activé et démarré." ++msgstr "La liste des connexions NetworkManager (chacune représentée par son UUID) sur lesquelles ce service est activé et démarré." + + #: data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in:6 + msgid "Antialiasing" +@@ -1007,11 +899,7 @@ msgid "" + "The type of antialiasing to use when rendering fonts. Possible values are: " + "“none” for no antialiasing, “grayscale” for standard grayscale antialiasing, " + "and “rgba” for subpixel antialiasing (LCD screens only)." +-msgstr "" +-"Type de lissage utilisé pour le rendu des polices. Les valeurs possibles " +-"sont : « none » pour aucun lissage, « grayscale » pour le lissage classique " +-"en niveaux de gris et « rgba » pour le lissage sous-pixels (écrans LCD " +-"uniquement)." ++msgstr "Type de lissage utilisé pour le rendu des polices. Les valeurs possibles sont : « none » pour aucun lissage, « grayscale » pour le lissage classique en niveaux de gris et « rgba » pour le lissage sous-pixels (écrans LCD uniquement)." + + #: data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in:11 + msgid "Hinting" +@@ -1029,18 +917,7 @@ msgid "" + "(except for .otf: Y-only). This can lead to distortion and/or inconsistent " + "rendering depending on the quality of the font, the font format and the " + "state of FreeType’s font engines." +-msgstr "" +-"Type d’optimisation utilisé pour le rendu des polices. Les valeurs possibles " +-"sont : « none » pour aucune optimisation, « slight » pour adapter uniquement " +-"selon l’axe Y comme le font les moteurs propriétaires de rendu de polices " +-"ClearType de Microsoft, DirectWrite et ceux d’Adobe. Ignore l’optimisation " +-"native dans la police, génère l’optimisation de façon algorithmique. Utilisé " +-"par défaut chez Ubuntu. Recommandé. La signification des valeurs « medium » " +-"et « full » dépend du format de police (.ttf, .otf, .pfa/.pfb) et de la " +-"version de FreeType. Ils essaient généralement d’adapter les caractères en " +-"fonction des axes X et Y (sauf pour .otf : axe Y seulement). Cela peut " +-"causer des distorsions ou un rendu incohérent en fonction de la qualité de " +-"la police, de son format et de l’état des moteurs de police FreeType." ++msgstr "Type d’optimisation utilisé pour le rendu des polices. Les valeurs possibles sont : « none » pour aucune optimisation, « slight » pour adapter uniquement selon l’axe Y comme le font les moteurs propriétaires de rendu de polices ClearType de Microsoft, DirectWrite et ceux d’Adobe. Ignore l’optimisation native dans la police, génère l’optimisation de façon algorithmique. Utilisé par défaut chez Ubuntu. Recommandé. La signification des valeurs « medium » et « full » dépend du format de police (.ttf, .otf, .pfa/.pfb) et de la version de FreeType. Ils essaient généralement d’adapter les caractères en fonction des axes X et Y (sauf pour .otf : axe Y seulement). Cela peut causer des distorsions ou un rendu incohérent en fonction de la qualité de la police, de son format et de l’état des moteurs de police FreeType." + + #: data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in:16 + msgid "RGBA order" +@@ -1051,11 +928,7 @@ msgid "" + "The order of subpixel elements on an LCD screen; only used when antialiasing " + "is set to “rgba”. Possible values are: “rgb” for red on left (most common), " + "“bgr” for blue on left, “vrgb” for red on top, “vbgr” for red on bottom." +-msgstr "" +-"Ordre des éléments sous-pixels sur un écran LCD ; uniquement utilisé si le " +-"lissage est défini à « rgba ». Les valeurs possibles sont « rgb » pour le " +-"rouge à gauche (le plus courant), « bgr » pour le bleu à gauche, « vrgb » " +-"pour le rouge en haut, « vbgr » pour le rouge en bas." ++msgstr "Ordre des éléments sous-pixels sur un écran LCD ; uniquement utilisé si le lissage est défini à « rgba ». Les valeurs possibles sont « rgb » pour le rouge à gauche (le plus courant), « bgr » pour le bleu à gauche, « vrgb » pour le rouge en haut, « vbgr » pour le rouge en bas." + + #: data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in:21 + msgid "List of explicitly disabled GTK+ modules" +@@ -1065,9 +938,7 @@ msgstr "Liste de modules GTK+ désactivés de façon explicite" + msgid "" + "A list of strings representing the GTK+ modules that will not be loaded, " + "even if enabled by default in their configuration." +-msgstr "" +-"Liste de chaînes représentant les modules GTK+ à ne pas charger, même s’ils " +-"sont activés par défaut dans leur configuration." ++msgstr "Liste de chaînes représentant les modules GTK+ à ne pas charger, même s’ils sont activés par défaut dans leur configuration." + + #: data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in:26 + msgid "List of explicitly enabled GTK+ modules" +@@ -1077,9 +948,7 @@ msgstr "Liste de modules GTK+ activés de façon explicite" + msgid "" + "A list of strings representing the GTK+ modules that will be loaded, usually " + "in addition to conditional and forcibly disabled ones." +-msgstr "" +-"Liste de chaînes représentant les modules GTK+ à charger, en général en plus " +-"de ceux désactivés conditionnellement ou de force." ++msgstr "Liste de chaînes représentant les modules GTK+ à charger, en général en plus de ceux désactivés conditionnellement ou de force." + + #: data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in:31 + msgid "A dictionary of XSETTINGS to override" +@@ -1090,11 +959,7 @@ msgid "" + "This dictionary maps XSETTINGS names to overrides values. The values must be " + "either strings, signed int32s or (in the case of colors), 4-tuples of uint16 " + "(red, green, blue, alpha; 65535 is fully opaque)." +-msgstr "" +-"Ce dictionnaire contient des noms XSETTINGS dont les valeurs doivent être " +-"surchargées. Les valeurs doivent être des chaînes, des entiers signés int32 " +-"ou (dans le cas de couleurs), des tuples à 4 éléments uint16 (rouge, vert, " +-"bleu, alpha ; 65535 est l’opacité complète)." ++msgstr "Ce dictionnaire contient des noms XSETTINGS dont les valeurs doivent être surchargées. Les valeurs doivent être des chaînes, des entiers signés int32 ou (dans le cas de couleurs), des tuples à 4 éléments uint16 (rouge, vert, bleu, alpha ; 65535 est l’opacité complète)." + + #: plugins/color/gsd-color-calibrate.c:139 + msgid "Color" +@@ -1158,7 +1023,6 @@ msgid "Date & Time Settings" + msgstr "Paramètres de date et heure" + + #: plugins/housekeeping/gsd-disk-space.c:575 +-#| msgid "Disk space" + msgid "Disk Space" + msgstr "Espace disque" + +@@ -1184,9 +1048,7 @@ msgstr "Espace disque faible sur « %s »" + msgid "" + "The volume “%s” has only %s disk space remaining. You may free up some " + "space by emptying the trash." +-msgstr "" +-"Le volume « %s » n’a plus que %s d’espace disque disponible. Vous pouvez " +-"libérer de l’espace en vidant la corbeille." ++msgstr "Le volume « %s » n’a plus que %s d’espace disque disponible. Vous pouvez libérer de l’espace en vidant la corbeille." + + #: plugins/housekeeping/gsd-disk-space.c:644 + #, c-format +@@ -1202,39 +1064,37 @@ msgstr "Espace disque faible" + msgid "" + "This computer has only %s disk space remaining. You may free up some space " + "by emptying the trash." +-msgstr "" +-"Cet ordinateur n’a plus que %s d’espace disque disponible. Vous pouvez " +-"libérer de l’espace en vidant la corbeille." ++msgstr "Cet ordinateur n’a plus que %s d’espace disque disponible. Vous pouvez libérer de l’espace en vidant la corbeille." + + #: plugins/housekeeping/gsd-disk-space.c:654 + #, c-format + msgid "This computer has only %s disk space remaining." + msgstr "Cet ordinateur n’a plus que %s d’espace disque disponible." + +-#: plugins/media-keys/gsd-media-keys-manager.c:2284 ++#: plugins/media-keys/gsd-media-keys-manager.c:2288 + msgid "Bluetooth disabled" + msgstr "Bluetooth désactivé" + +-#: plugins/media-keys/gsd-media-keys-manager.c:2287 ++#: plugins/media-keys/gsd-media-keys-manager.c:2291 + msgid "Bluetooth enabled" + msgstr "Bluetooth activé" + +-#: plugins/media-keys/gsd-media-keys-manager.c:2291 ++#: plugins/media-keys/gsd-media-keys-manager.c:2295 + msgid "Airplane mode enabled" + msgstr "Mode avion activé" + +-#: plugins/media-keys/gsd-media-keys-manager.c:2294 ++#: plugins/media-keys/gsd-media-keys-manager.c:2298 + msgid "Airplane mode disabled" + msgstr "Mode avion désactivé" + +-#: plugins/media-keys/gsd-media-keys-manager.c:2322 ++#: plugins/media-keys/gsd-media-keys-manager.c:2326 + msgid "Hardware Airplane Mode" + msgstr "Mode avion matériel" + + #. Translators: this is a filename used for screencast + #. * recording, where "%d" and "%t" date and time, e.g. + #. * "Screencast from 07-17-2013 10:00:46 PM.webm" +-#: plugins/media-keys/gsd-media-keys-manager.c:2382 ++#: plugins/media-keys/gsd-media-keys-manager.c:2392 + #, no-c-format + msgid "Screencast from %d %t.webm" + msgstr "Capture d’écran vidéo de %d %t.webm" +@@ -1255,116 +1115,116 @@ msgstr "Capture d’écran faite" + msgid "Screenshot from %s" + msgstr "Capture d’écran de %s" + +-#: plugins/media-keys/shortcuts-list.h:45 + #: plugins/media-keys/shortcuts-list.h:46 ++#: plugins/media-keys/shortcuts-list.h:47 + msgid "Touchpad toggle" + msgstr "Interrupteur du pavé tactile" + +-#: plugins/media-keys/shortcuts-list.h:47 ++#: plugins/media-keys/shortcuts-list.h:48 + msgid "Touchpad On" + msgstr "Pavé tactile actif" + +-#: plugins/media-keys/shortcuts-list.h:48 ++#: plugins/media-keys/shortcuts-list.h:49 + msgid "Touchpad Off" + msgstr "Pavé tactile inactif" + +-#: plugins/media-keys/shortcuts-list.h:55 ++#: plugins/media-keys/shortcuts-list.h:56 + msgid "Quiet Volume Mute" + msgstr "Mettre en sourdine sans émettre de bruit" + +-#: plugins/media-keys/shortcuts-list.h:56 ++#: plugins/media-keys/shortcuts-list.h:57 + msgid "Quiet Volume Down" + msgstr "Baisser le volume sans émettre de bruit" + +-#: plugins/media-keys/shortcuts-list.h:57 ++#: plugins/media-keys/shortcuts-list.h:58 + msgid "Quiet Volume Up" + msgstr "Augmenter le volume sans émettre de bruit" + +-#: plugins/media-keys/shortcuts-list.h:58 ++#: plugins/media-keys/shortcuts-list.h:59 + msgid "Precise Volume Down" + msgstr "Baisser le volume avec précision" + +-#: plugins/media-keys/shortcuts-list.h:59 ++#: plugins/media-keys/shortcuts-list.h:60 + msgid "Precise Volume Up" + msgstr "Augmenter le volume avec précision" + +-#: plugins/media-keys/shortcuts-list.h:69 ++#: plugins/media-keys/shortcuts-list.h:70 + msgid "Lock Screen" + msgstr "Verrouiller l’écran" + +-#: plugins/media-keys/shortcuts-list.h:71 ++#: plugins/media-keys/shortcuts-list.h:72 + msgid "Help" + msgstr "Aide" + +-#: plugins/media-keys/shortcuts-list.h:88 ++#: plugins/media-keys/shortcuts-list.h:89 + msgid "Rewind" + msgstr "Retour rapide" + +-#: plugins/media-keys/shortcuts-list.h:89 ++#: plugins/media-keys/shortcuts-list.h:90 + msgid "Forward" + msgstr "Avance rapide" + +-#: plugins/media-keys/shortcuts-list.h:90 ++#: plugins/media-keys/shortcuts-list.h:91 + msgid "Repeat" + msgstr "Répétition" + +-#: plugins/media-keys/shortcuts-list.h:91 ++#: plugins/media-keys/shortcuts-list.h:92 + msgid "Random Play" + msgstr "Lecture aléatoire" + +-#: plugins/media-keys/shortcuts-list.h:92 ++#: plugins/media-keys/shortcuts-list.h:93 + msgid "Orientation Lock" + msgstr "Verrouiller l’orientation" + +-#: plugins/media-keys/shortcuts-list.h:101 ++#: plugins/media-keys/shortcuts-list.h:102 + msgid "Power Off" + msgstr "Éteindre" + + #. the kernel / Xorg names really are like this... + #. translators: "Sleep" means putting the machine to sleep, either through hibernate or suspend +-#: plugins/media-keys/shortcuts-list.h:104 ++#: plugins/media-keys/shortcuts-list.h:105 + msgid "Sleep" + msgstr "Mettre en veille" + +-#: plugins/media-keys/shortcuts-list.h:105 ++#: plugins/media-keys/shortcuts-list.h:106 + msgid "Suspend" + msgstr "Mettre en veille" + +-#: plugins/media-keys/shortcuts-list.h:106 ++#: plugins/media-keys/shortcuts-list.h:107 + msgid "Hibernate" + msgstr "Hiberner" + +-#: plugins/media-keys/shortcuts-list.h:107 ++#: plugins/media-keys/shortcuts-list.h:108 + msgid "Brightness Up" + msgstr "Augmenter la luminosité" + +-#: plugins/media-keys/shortcuts-list.h:108 ++#: plugins/media-keys/shortcuts-list.h:109 + msgid "Brightness Down" + msgstr "Diminuer la luminosité" + +-#: plugins/media-keys/shortcuts-list.h:109 ++#: plugins/media-keys/shortcuts-list.h:110 + msgid "Keyboard Brightness Up" + msgstr "Augmenter la luminosité du clavier" + +-#: plugins/media-keys/shortcuts-list.h:110 ++#: plugins/media-keys/shortcuts-list.h:111 + msgid "Keyboard Brightness Down" + msgstr "Diminuer la luminosité du clavier" + +-#: plugins/media-keys/shortcuts-list.h:111 ++#: plugins/media-keys/shortcuts-list.h:112 + msgid "Keyboard Brightness Toggle" + msgstr "Allumer/éteindre l’éclairage du clavier" + +-#: plugins/media-keys/shortcuts-list.h:112 ++#: plugins/media-keys/shortcuts-list.h:113 + msgid "Battery Status" + msgstr "État de la batterie" + +-#: plugins/media-keys/shortcuts-list.h:113 + #: plugins/media-keys/shortcuts-list.h:114 + #: plugins/media-keys/shortcuts-list.h:115 ++#: plugins/media-keys/shortcuts-list.h:116 + msgid "Toggle Airplane Mode" + msgstr "Inversion du mode avion" + +-#: plugins/media-keys/shortcuts-list.h:116 ++#: plugins/media-keys/shortcuts-list.h:117 + msgid "Toggle Bluetooth" + msgstr "Inversion de l’état Bluetooth" + +@@ -1406,330 +1266,303 @@ msgstr[0] "minute" + msgstr[1] "minutes" + + #. TRANSLATORS: this is the sound description +-#: plugins/power/gpm-common.c:438 plugins/power/gsd-power-manager.c:693 +-#: plugins/power/gsd-power-manager.c:790 ++#: plugins/power/gpm-common.c:438 plugins/power/gsd-power-manager.c:717 ++#: plugins/power/gsd-power-manager.c:814 + msgid "Battery is critically low" + msgstr "La batterie est très faible" + + #. TRANSLATORS: this is the notification application name +-#: plugins/power/gsd-power-manager.c:325 ++#: plugins/power/gsd-power-manager.c:347 + msgid "Power" + msgstr "Énergie" + + #. TRANSLATORS: UPS is now discharging +-#: plugins/power/gsd-power-manager.c:363 ++#: plugins/power/gsd-power-manager.c:387 + msgid "UPS Discharging" + msgstr "Onduleur en décharge" + + #. TRANSLATORS: tell the user how much time they have got +-#: plugins/power/gsd-power-manager.c:368 ++#: plugins/power/gsd-power-manager.c:392 + #, c-format + msgid "%s of UPS backup power remaining" + msgstr "Il reste %s d’autonomie à l’onduleur" + +-#: plugins/power/gsd-power-manager.c:371 ++#: plugins/power/gsd-power-manager.c:395 + msgid "Unknown amount of UPS backup power remaining" + msgstr "Autonomie restante de l’onduleur inconnue" + + #. TRANSLATORS: laptop battery low, and we only have one battery +-#: plugins/power/gsd-power-manager.c:446 ++#: plugins/power/gsd-power-manager.c:470 + msgid "Battery low" + msgstr "Batterie faible" + + #. TRANSLATORS: laptop battery low, and we have more than one kind of battery +-#: plugins/power/gsd-power-manager.c:449 ++#: plugins/power/gsd-power-manager.c:473 + msgid "Laptop battery low" + msgstr "Batterie du portable faible" + + #. TRANSLATORS: tell the user how much time they have got +-#: plugins/power/gsd-power-manager.c:456 ++#: plugins/power/gsd-power-manager.c:480 + #, c-format + msgid "Approximately %s remaining (%.0f%%)" + msgstr "Il reste environ %s (%.0f %%)" + + #. TRANSLATORS: UPS is starting to get a little low +-#: plugins/power/gsd-power-manager.c:461 ++#: plugins/power/gsd-power-manager.c:485 + msgid "UPS low" + msgstr "Onduleur faible" + + #. TRANSLATORS: tell the user how much time they have got +-#: plugins/power/gsd-power-manager.c:467 ++#: plugins/power/gsd-power-manager.c:491 + #, c-format + msgid "Approximately %s of remaining UPS backup power (%.0f%%)" + msgstr "Il reste environ %s d’autonomie à l’onduleur (%.0f %%)" + + #. TRANSLATORS: mouse is getting a little low + #. TRANSLATORS: the mouse battery is very low +-#: plugins/power/gsd-power-manager.c:472 plugins/power/gsd-power-manager.c:606 ++#: plugins/power/gsd-power-manager.c:496 plugins/power/gsd-power-manager.c:630 + msgid "Mouse battery low" + msgstr "Batterie de souris faible" + + #. TRANSLATORS: tell user more details +-#: plugins/power/gsd-power-manager.c:475 ++#: plugins/power/gsd-power-manager.c:499 + #, c-format + msgid "Wireless mouse is low in power (%.0f%%)" + msgstr "Il reste peu d’autonomie à la souris sans fil (%.0f %%)" + + #. TRANSLATORS: keyboard is getting a little low + #. TRANSLATORS: the keyboard battery is very low +-#: plugins/power/gsd-power-manager.c:479 plugins/power/gsd-power-manager.c:614 ++#: plugins/power/gsd-power-manager.c:503 plugins/power/gsd-power-manager.c:638 + msgid "Keyboard battery low" + msgstr "Batterie du clavier faible" + + #. TRANSLATORS: tell user more details +-#: plugins/power/gsd-power-manager.c:482 ++#: plugins/power/gsd-power-manager.c:506 + #, c-format + msgid "Wireless keyboard is low in power (%.0f%%)" + msgstr "Il reste peu d’autonomie au clavier sans fil (%.0f %%)" + + #. TRANSLATORS: PDA is getting a little low + #. TRANSLATORS: the PDA battery is very low +-#: plugins/power/gsd-power-manager.c:486 plugins/power/gsd-power-manager.c:623 ++#: plugins/power/gsd-power-manager.c:510 plugins/power/gsd-power-manager.c:647 + msgid "PDA battery low" + msgstr "Batterie d’assistant personnel faible" + + #. TRANSLATORS: tell user more details +-#: plugins/power/gsd-power-manager.c:489 ++#: plugins/power/gsd-power-manager.c:513 + #, c-format + msgid "PDA is low in power (%.0f%%)" + msgstr "Il reste peu d’autonomie à l’assistant personnel (%.0f %%)" + + #. TRANSLATORS: cell phone (mobile) is getting a little low + #. TRANSLATORS: the cell battery is very low +-#: plugins/power/gsd-power-manager.c:493 plugins/power/gsd-power-manager.c:633 +-#: plugins/power/gsd-power-manager.c:642 ++#: plugins/power/gsd-power-manager.c:517 plugins/power/gsd-power-manager.c:657 ++#: plugins/power/gsd-power-manager.c:666 + msgid "Cell phone battery low" + msgstr "Batterie de téléphone portable faible" + + #. TRANSLATORS: tell user more details +-#: plugins/power/gsd-power-manager.c:496 ++#: plugins/power/gsd-power-manager.c:520 + #, c-format + msgid "Cell phone is low in power (%.0f%%)" + msgstr "Il reste peu d’autonomie au téléphone portable (%.0f %%)" + + #. TRANSLATORS: media player, e.g. mp3 is getting a little low +-#: plugins/power/gsd-power-manager.c:500 ++#: plugins/power/gsd-power-manager.c:524 + msgid "Media player battery low" + msgstr "Batterie de lecteur multimédia faible" + + #. TRANSLATORS: tell user more details +-#: plugins/power/gsd-power-manager.c:503 ++#: plugins/power/gsd-power-manager.c:527 + #, c-format + msgid "Media player is low in power (%.0f%%)" + msgstr "Il reste peu d’autonomie au lecteur multimédia (%.0f %%)" + + #. TRANSLATORS: graphics tablet, e.g. wacom is getting a little low + #. TRANSLATORS: the cell battery is very low +-#: plugins/power/gsd-power-manager.c:507 plugins/power/gsd-power-manager.c:651 ++#: plugins/power/gsd-power-manager.c:531 plugins/power/gsd-power-manager.c:675 + msgid "Tablet battery low" + msgstr "Batterie de tablette faible" + + #. TRANSLATORS: tell user more details +-#: plugins/power/gsd-power-manager.c:510 ++#: plugins/power/gsd-power-manager.c:534 + #, c-format + msgid "Tablet is low in power (%.0f%%)" + msgstr "Il reste peu d’autonomie à la tablette (%.0f %%)" + + #. TRANSLATORS: computer, e.g. ipad is getting a little low + #. TRANSLATORS: the cell battery is very low +-#: plugins/power/gsd-power-manager.c:514 plugins/power/gsd-power-manager.c:660 ++#: plugins/power/gsd-power-manager.c:538 plugins/power/gsd-power-manager.c:684 + msgid "Attached computer battery low" + msgstr "Batterie de l’ordinateur connecté faible" + + #. TRANSLATORS: tell user more details +-#: plugins/power/gsd-power-manager.c:517 ++#: plugins/power/gsd-power-manager.c:541 + #, c-format + msgid "Attached computer is low in power (%.0f%%)" + msgstr "Il reste peu d’autonomie à l’ordinateur connecté (%.0f %%)" + + #. TRANSLATORS: this is the sound description +-#: plugins/power/gsd-power-manager.c:538 ++#: plugins/power/gsd-power-manager.c:562 + msgid "Battery is low" + msgstr "Batterie faible" + + #. TRANSLATORS: laptop battery critically low, and only have one kind of battery +-#: plugins/power/gsd-power-manager.c:570 ++#: plugins/power/gsd-power-manager.c:594 + msgid "Battery critically low" + msgstr "Batterie très faible" + + #. TRANSLATORS: laptop battery critically low, and we have more than one type of battery + #. TRANSLATORS: laptop battery is really, really, low +-#: plugins/power/gsd-power-manager.c:573 plugins/power/gsd-power-manager.c:720 ++#: plugins/power/gsd-power-manager.c:597 plugins/power/gsd-power-manager.c:744 + msgid "Laptop battery critically low" + msgstr "Batterie du portable très faible" + + #. TRANSLATORS: give the user a ultimatum +-#: plugins/power/gsd-power-manager.c:582 ++#: plugins/power/gsd-power-manager.c:606 + #, c-format + msgid "Computer will hibernate very soon unless it is plugged in." +-msgstr "" +-"L’ordinateur se mettra très rapidement en hibernation si l’alimentation " +-"n’est pas branchée." ++msgstr "L’ordinateur se mettra très rapidement en hibernation si l’alimentation n’est pas branchée." + + #. TRANSLATORS: give the user a ultimatum +-#: plugins/power/gsd-power-manager.c:586 ++#: plugins/power/gsd-power-manager.c:610 + #, c-format + msgid "Computer will shutdown very soon unless it is plugged in." +-msgstr "" +-"L’ordinateur s’éteindra très rapidement si l’alimentation n’est pas branchée." ++msgstr "L’ordinateur s’éteindra très rapidement si l’alimentation n’est pas branchée." + + #. TRANSLATORS: the UPS is very low + #. TRANSLATORS: UPS is really, really, low +-#: plugins/power/gsd-power-manager.c:594 plugins/power/gsd-power-manager.c:745 ++#: plugins/power/gsd-power-manager.c:618 plugins/power/gsd-power-manager.c:769 + msgid "UPS critically low" + msgstr "Onduleur très faible" + + #. TRANSLATORS: give the user a ultimatum +-#: plugins/power/gsd-power-manager.c:600 ++#: plugins/power/gsd-power-manager.c:624 + #, c-format + msgid "" + "Approximately %s of remaining UPS power (%.0f%%). Restore AC power to your " + "computer to avoid losing data." +-msgstr "" +-"Il reste environ %s d’autonomie à l’onduleur (%.0f %%). Branchez votre " +-"ordinateur au secteur pour éviter de perdre des données." ++msgstr "Il reste environ %s d’autonomie à l’onduleur (%.0f %%). Branchez votre ordinateur au secteur pour éviter de perdre des données." + + #. TRANSLATORS: the device is just going to stop working +-#: plugins/power/gsd-power-manager.c:609 ++#: plugins/power/gsd-power-manager.c:633 + #, c-format + msgid "" + "Wireless mouse is very low in power (%.0f%%). This device will soon stop " + "functioning if not charged." +-msgstr "" +-"Il reste très peu d’autonomie à la souris sans fil (%.0f %%). Elle " +-"s’arrêtera bientôt de fonctionner si elle n’est pas rechargée." ++msgstr "Il reste très peu d’autonomie à la souris sans fil (%.0f %%). Elle s’arrêtera bientôt de fonctionner si elle n’est pas rechargée." + + #. TRANSLATORS: the device is just going to stop working +-#: plugins/power/gsd-power-manager.c:617 ++#: plugins/power/gsd-power-manager.c:641 + #, c-format + msgid "" + "Wireless keyboard is very low in power (%.0f%%). This device will soon stop " + "functioning if not charged." +-msgstr "" +-"Il reste très peu d’autonomie au clavier sans fil (%.0f %%). Il s’arrêtera " +-"bientôt de fonctionner s’il n’est pas rechargé." ++msgstr "Il reste très peu d’autonomie au clavier sans fil (%.0f %%). Il s’arrêtera bientôt de fonctionner s’il n’est pas rechargé." + + #. TRANSLATORS: the device is just going to stop working +-#: plugins/power/gsd-power-manager.c:626 ++#: plugins/power/gsd-power-manager.c:650 + #, c-format + msgid "" + "PDA is very low in power (%.0f%%). This device will soon stop functioning if " + "not charged." +-msgstr "" +-"Il reste très peu d’autonomie à l’assistant personnel (%.0f %%). Il " +-"s’arrêtera bientôt de fonctionner s’il n’est pas rechargé." ++msgstr "Il reste très peu d’autonomie à l’assistant personnel (%.0f %%). Il s’arrêtera bientôt de fonctionner s’il n’est pas rechargé." + + #. TRANSLATORS: the device is just going to stop working +-#: plugins/power/gsd-power-manager.c:636 ++#: plugins/power/gsd-power-manager.c:660 + #, c-format + msgid "" + "Cell phone is very low in power (%.0f%%). This device will soon stop " + "functioning if not charged." +-msgstr "" +-"Il reste très peu d’autonomie au téléphone portable (%.0f %%). Il s’arrêtera " +-"bientôt de fonctionner s’il n’est pas rechargé." ++msgstr "Il reste très peu d’autonomie au téléphone portable (%.0f %%). Il s’arrêtera bientôt de fonctionner s’il n’est pas rechargé." + + #. TRANSLATORS: the device is just going to stop working +-#: plugins/power/gsd-power-manager.c:645 ++#: plugins/power/gsd-power-manager.c:669 + #, c-format + msgid "" + "Media player is very low in power (%.0f%%). This device will soon stop " + "functioning if not charged." +-msgstr "" +-"Il reste très peu d’autonomie au lecteur multimédia (%.0f %%). Il s’arrêtera " +-"bientôt de fonctionner s’il n’est pas rechargé." ++msgstr "Il reste très peu d’autonomie au lecteur multimédia (%.0f %%). Il s’arrêtera bientôt de fonctionner s’il n’est pas rechargé." + + #. TRANSLATORS: the device is just going to stop working +-#: plugins/power/gsd-power-manager.c:654 ++#: plugins/power/gsd-power-manager.c:678 + #, c-format + msgid "" + "Tablet is very low in power (%.0f%%). This device will soon stop functioning " + "if not charged." +-msgstr "" +-"Il reste très peu d’autonomie à la tablette (%.0f %%). Elle s’arrêtera " +-"bientôt de fonctionner si elle n’est pas rechargée." ++msgstr "Il reste très peu d’autonomie à la tablette (%.0f %%). Elle s’arrêtera bientôt de fonctionner si elle n’est pas rechargée." + + #. TRANSLATORS: the device is just going to stop working +-#: plugins/power/gsd-power-manager.c:663 ++#: plugins/power/gsd-power-manager.c:687 + #, c-format + msgid "" + "Attached computer is very low in power (%.0f%%). The device will soon " + "shutdown if not charged." +-msgstr "" +-"Il reste très peu d’autonomie à l’ordinateur connecté (%.0f %%). Il " +-"s’arrêtera bientôt de fonctionner s’il n’est pas rechargé." ++msgstr "Il reste très peu d’autonomie à l’ordinateur connecté (%.0f %%). Il s’arrêtera bientôt de fonctionner s’il n’est pas rechargé." + + #. TRANSLATORS: computer will hibernate +-#: plugins/power/gsd-power-manager.c:728 ++#: plugins/power/gsd-power-manager.c:752 + msgid "" + "The battery is below the critical level and this computer is about to " + "hibernate." +-msgstr "" +-"La batterie est au-dessous de son niveau critique ; l’ordinateur va se " +-"mettre en hibernation." ++msgstr "La batterie est au-dessous de son niveau critique ; l’ordinateur va se mettre en hibernation." + + #. TRANSLATORS: computer will just shutdown +-#: plugins/power/gsd-power-manager.c:733 ++#: plugins/power/gsd-power-manager.c:757 + msgid "" + "The battery is below the critical level and this computer is about to " + "shutdown." +-msgstr "" +-"La batterie est au-dessous de son niveau critique ; l’ordinateur va " +-"s’éteindre." ++msgstr "La batterie est au-dessous de son niveau critique ; l’ordinateur va s’éteindre." + + #. TRANSLATORS: computer will hibernate +-#: plugins/power/gsd-power-manager.c:753 ++#: plugins/power/gsd-power-manager.c:777 + msgid "" + "UPS is below the critical level and this computer is about to hibernate." +-msgstr "" +-"L’onduleur est au-dessous de son niveau critique ; l’ordinateur va se mettre " +-"en hibernation." ++msgstr "L’onduleur est au-dessous de son niveau critique ; l’ordinateur va se mettre en hibernation." + + #. TRANSLATORS: computer will just shutdown +-#: plugins/power/gsd-power-manager.c:758 ++#: plugins/power/gsd-power-manager.c:782 + msgid "UPS is below the critical level and this computer is about to shutdown." +-msgstr "" +-"L’onduleur est au-dessous de son niveau critique ; l’ordinateur va " +-"s’éteindre." ++msgstr "L’onduleur est au-dessous de son niveau critique ; l’ordinateur va s’éteindre." + + #. TRANSLATORS: this is the sound description +-#: plugins/power/gsd-power-manager.c:1236 ++#: plugins/power/gsd-power-manager.c:1260 + msgid "Lid has been opened" + msgstr "Ouverture de l’écran de l’ordinateur" + + #. TRANSLATORS: this is the sound description +-#: plugins/power/gsd-power-manager.c:1270 ++#: plugins/power/gsd-power-manager.c:1294 + msgid "Lid has been closed" + msgstr "Fermeture de l’écran de l’ordinateur" + + #. TRANSLATORS: this is the sound description +-#: plugins/power/gsd-power-manager.c:1832 ++#: plugins/power/gsd-power-manager.c:1856 + msgid "On battery power" + msgstr "Sur batterie" + + #. TRANSLATORS: this is the sound description +-#: plugins/power/gsd-power-manager.c:1837 ++#: plugins/power/gsd-power-manager.c:1861 + msgid "On AC power" + msgstr "Sur secteur" + +-#: plugins/power/gsd-power-manager.c:2029 ++#: plugins/power/gsd-power-manager.c:2051 + msgid "Automatic logout" + msgstr "Déconnexion automatique" + +-#: plugins/power/gsd-power-manager.c:2029 ++#: plugins/power/gsd-power-manager.c:2051 + msgid "You will soon log out because of inactivity." + msgstr "Vous allez être déconnecté bientôt faute d’activité." + +-#: plugins/power/gsd-power-manager.c:2034 ++#: plugins/power/gsd-power-manager.c:2056 + msgid "Automatic suspend" + msgstr "Veille automatique" + +-#: plugins/power/gsd-power-manager.c:2034 +-#: plugins/power/gsd-power-manager.c:2039 ++#: plugins/power/gsd-power-manager.c:2056 ++#: plugins/power/gsd-power-manager.c:2061 + msgid "Computer will suspend very soon because of inactivity." + msgstr "L’ordinateur se mettra en veille bientôt faute d’activité." + +-#: plugins/power/gsd-power-manager.c:2039 ++#: plugins/power/gsd-power-manager.c:2061 + msgid "Automatic hibernation" + msgstr "Hibernation automatique" + +@@ -1742,9 +1575,7 @@ msgstr "Modifier la luminosité de l’ordinateur portable" + + #: plugins/power/org.gnome.settings-daemon.plugins.power.policy.in.in:22 + msgid "Authentication is required to modify the laptop brightness" +-msgstr "" +-"Authentification nécessaire pour modifier la luminosité de l’ordinateur " +-"portable" ++msgstr "Authentification nécessaire pour modifier la luminosité de l’ordinateur portable" + + #. Translators: We are configuring new printer + #: plugins/print-notifications/gsd-printer.c:890 +@@ -1999,10 +1830,56 @@ msgstr "Alerte de l’imprimante" + msgid "Printer “%s”: “%s”." + msgstr "Imprimante « %s » : « %s »." + +-#: plugins/smartcard/gsd-smartcard-service.c:224 ++#: plugins/smartcard/gsd-smartcard-service.c:288 + msgid "User was not logged in with smartcard." + msgstr "L’utilisateur n’était pas connecté avec la carte à puce." + ++#: plugins/subman/gsd-subscription-manager.c:1044 ++msgid "Subscription Has Expired" ++msgstr "L'abonnement a expiré" ++ ++#: plugins/subman/gsd-subscription-manager.c:1045 ++msgid "Add or renew a subscription to continue receiving software updates." ++msgstr "Ajouter ou renouveler un abonnement pour continuer à recevoir les mises à jour de logiciels." ++ ++#: plugins/subman/gsd-subscription-manager.c:1047 ++#: plugins/subman/gsd-subscription-manager.c:1063 ++#: plugins/subman/gsd-subscription-manager.c:1075 ++msgid "Subscription" ++msgstr "Abonnement" ++ ++#: plugins/subman/gsd-subscription-manager.c:1052 ++msgid "Subscribe System…" ++msgstr "Abonnement du système..." ++ ++#: plugins/subman/gsd-subscription-manager.c:1060 ++msgid "Registration Successful" ++msgstr "Abonnement réussi" ++ ++#: plugins/subman/gsd-subscription-manager.c:1061 ++msgid "The system has been registered and software updates have been enabled." ++msgstr "Le système a été enregistré et les mises à jour du logiciel ont été activées." ++ ++#: plugins/subman/gsd-subscription-manager.c:1072 ++msgid "System Not Registered" ++msgstr "Le système n'est pas enregistré" ++ ++#: plugins/subman/gsd-subscription-manager.c:1073 ++msgid "Please register your system to receive software updates." ++msgstr "Enregistrez ce système pour recevoir les mises à jour du logiciel." ++ ++#: plugins/subman/gsd-subscription-manager.c:1080 ++msgid "Register System…" ++msgstr "Enregistrement du système..." ++ ++#: plugins/subman/org.gnome.settings-daemon.plugins.subman.policy.in.in:17 ++msgid "Register the system" ++msgstr "Enregistrer le système" ++ ++#: plugins/subman/org.gnome.settings-daemon.plugins.subman.policy.in.in:18 ++msgid "Authentication is required to register the system" ++msgstr "Authentification nécessaire pour enregistrer le système" ++ + #. SECURITY: + #. - A normal active user on the local machine does not need permission + #. to change the LED setting for a Wacom tablet +@@ -2012,9 +1889,7 @@ msgstr "Modifie les voyants allumés d’une tablette Wacom" + + #: plugins/wacom/org.gnome.settings-daemon.plugins.wacom.policy.in.in:21 + msgid "Authentication is required to modify the lit LED for a Wacom tablet" +-msgstr "" +-"Une authentification est nécessaire pour modifier les voyants allumés d’une " +-"tablette Wacom" ++msgstr "Une authentification est nécessaire pour modifier les voyants allumés d’une tablette Wacom" + + #. SECURITY: + #. - A normal active user on the local machine does not need permission +@@ -2025,6 +1900,4 @@ msgstr "Modifie les images des voyants d’une tablette Wacom" + + #: plugins/wacom/org.gnome.settings-daemon.plugins.wacom.policy.in.in:36 + msgid "Authentication is required to modify the OLED image for a Wacom tablet" +-msgstr "" +-"Une authentification est nécessaire pour modifier les images des voyants " +-"d’une tablette Wacom" ++msgstr "Une authentification est nécessaire pour modifier les images des voyants d’une tablette Wacom" +diff --git a/po/ja.po b/po/ja.po +index 8f045c38..ef77a4e1 100644 +--- a/po/ja.po ++++ b/po/ja.po +@@ -17,8 +17,8 @@ + msgid "" + msgstr "" + "Project-Id-Version: gnome-settings-daemon master\n" +-"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-settings-daemon&keywords=I18N+L10N&component=general\n" +-"POT-Creation-Date: 2013-09-18 13:55+0000\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2021-02-12 15:05+0100\n" + "PO-Revision-Date: 2013-09-21 07:10+0900\n" + "Last-Translator: Jiro Matsuzawa \n" + "Language-Team: Japanese \n" +@@ -28,1358 +28,1220 @@ msgstr "" + "Content-Transfer-Encoding: 8bit\n" + "Plural-Forms: nplurals=1; plural=0;\n" + +-#: ../data/gnome-settings-daemon.desktop.in.in.h:1 +-msgid "GNOME Settings Daemon" +-msgstr "GNOME 設定デーモン" +- +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:1 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:12 + msgid "Smartcard removal action" + msgstr "スマートカードを抜いた時のアクション" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:2 +-msgid "Set this to one of \"none\", \"lock-screen\", or \"force-logout\". The action will get performed when the smartcard used for log in is removed." +-msgstr "\"none\"、\"lock-screen\"、あるいは \"force-logout\" のうちの一つを指定します。スマートカードがログインに使用されたり、取り出された場合にそのアクションが実行されます。" ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:13 ++msgid "" ++"Set this to one of “none”, “lock-screen”, or “force-logout”. The action will " ++"get performed when the smartcard used for log in is removed." ++msgstr "\"none\"、\"lock-screen\"、あるいは \"force-logout\" のうちの 1 つを指定します。この操作は、ログインに使用したスマートカードが取り外されたときに実行されます。" ++ ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:25 ++msgid "Possible values are “on”, “off”, and “custom”." ++msgstr "使用可能な値は、\"on\"、\"off\"、および \"custom\" です。" ++ ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:35 ++msgid "Keyboard Bell Custom Filename" ++msgstr "キーボードベルカスタムファイル名" ++ ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:36 ++msgid "File name of the bell sound to be played." ++msgstr "再生するベル音のファイル名。" ++ ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:40 ++msgid "Remember NumLock state" ++msgstr "NumLock の状態を記憶する" ++ ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:41 ++msgid "" ++"When set to true, GNOME will remember the state of the NumLock LED between " ++"sessions." ++msgstr "true に設定すると、GNOME はセッション間の NumLock LED の状態を記憶します。" ++ ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:45 ++msgid "NumLock state" ++msgstr "NumLock の状態" ++ ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:46 ++msgid "The remembered state of the NumLock LED." ++msgstr "NumLock LED の記憶状態。" ++ ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:52 ++msgid "" ++"Highlights the current location of the pointer when the Control key is " ++"pressed and released." ++msgstr "コントロールキーが押されて、離された時、ポインターの現在位置をハイライトします。" ++ ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:56 ++msgid "Double click time" ++msgstr "ダブルクリックの時間" ++ ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:57 ++msgid "Length of a double click in milliseconds." ++msgstr "ダブルクリックの長さ(ミリ秒単位)です。" ++ ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:61 ++msgid "Drag threshold" ++msgstr "ドラッグのしきい値" ++ ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:62 ++msgid "Distance before a drag is started." ++msgstr "ドラッグが開始されるまでの距離です。" ++ ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:68 ++msgid "Whether the tablet’s orientation is locked, or rotated automatically." ++msgstr "タブレットの方向を固定するか、自動的に回転するか。" ++ ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:76 ++msgid "Mouse button orientation" ++msgstr "マウスボタンの方向" ++ ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:77 ++msgid "Swap left and right mouse buttons for left-handed mice." ++msgstr "左利きのマウス用に右、左ボタンを交換します。" ++ ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:81 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:143 ++msgid "Single Click" ++msgstr "シングルクリック" ++ ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:82 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:144 ++msgid "" ++"Acceleration multiplier for mouse motion. A value of -1 is the system " ++"default." ++msgstr "マウスモーションの加速度乗数。値 -1 がシステムのデフォルトです。" ++ ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:86 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:148 ++msgid "Motion Threshold" ++msgstr "モーションのしきい値" ++ ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:87 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:149 ++msgid "" ++"Distance in pixels the pointer must move before accelerated mouse motion is " ++"activated. A value of -1 is the system default." ++msgstr "マウスの加速モーションが有効になる前にポインターが移動する距離をピクセル単位で指定します。値 -1 がシステムのデフォルトです。" ++ ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:91 ++msgid "Middle button emulation" ++msgstr "中ボタンのエミュレーション" ++ ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:92 ++msgid "" ++"Enables middle mouse button emulation through simultaneous left and right " ++"button click." ++msgstr "マウスの中ボタンの左右ボタンの同時クリックによるエミュレーションを利用可能にします。" ++ ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:101 ++msgid "Key Repeat Interval" ++msgstr "キーリピートの間隔" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:3 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:102 ++msgid "Delay between repeats in milliseconds." ++msgstr "リピート間の遅延時間をミリ秒単位で指定します。" ++ ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:106 ++msgid "Initial Key Repeat Delay" ++msgstr "初期キーリピート遅延" ++ ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:107 ++msgid "Initial key repeat delay in milliseconds." ++msgstr "初期キーリピート遅延をミリ秒単位で指定します。" ++ ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:113 + msgid "Disable touchpad while typing" + msgstr "タイピング中にタッチパッドを無効にする" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:4 +-msgid "Set this to TRUE if you have problems with accidentally hitting the touchpad while typing." ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:114 ++msgid "" ++"Set this to TRUE if you have problems with accidentally hitting the touchpad " ++"while typing." + msgstr "タイプ中に誤ってタッチパッドに触れてしまう問題があるのであれば、TRUE に設定してください。" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:5 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:118 + msgid "Enable horizontal scrolling" + msgstr "水平スクロールを有効にする" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:6 +-msgid "Set this to TRUE to allow horizontal scrolling by the same method selected with the scroll_method key." ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:119 ++msgid "" ++"Set this to TRUE to allow horizontal scrolling by the same method selected " ++"with the scroll_method key." + msgstr "この値を TRUE にすると、scroll_method キーで選択したのと同じ方法で、水平スクロールを許可します。" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:7 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:123 + msgid "Select the touchpad scroll method" + msgstr "タッチパッドでのスクロールの方法の選択" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:8 +-msgid "Select the touchpad scroll method. Supported values are: \"disabled\", \"edge-scrolling\", \"two-finger-scrolling\"." +-msgstr "タッチパッドでのスクロール方法を選択します。指定できる値は次のとおりです。\"disabled\"、\"edge-scrolling\"、\"two-finger-scrolling\"" ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:124 ++msgid "" ++"Select the touchpad scroll method. Supported values are: “disabled”, “edge-" ++"scrolling”, “two-finger-scrolling”." ++msgstr "タッチパッドでのスクロール方法を選択します。指定できる値は、\"disabled\"、\"edge-scrolling\"、\"two-finger-scrolling\" です。" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:9 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:128 + msgid "Enable mouse clicks with touchpad" + msgstr "タッチパッドでのマウスクリックを有効にする" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:10 +-msgid "Set this to TRUE to be able to send mouse clicks by tapping on the touchpad." ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:129 ++msgid "" ++"Set this to TRUE to be able to send mouse clicks by tapping on the touchpad." + msgstr "この値を TRUE にすると、タッチパッドをタップすることで、マウスクリックと同じ動作になるようにします。" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:11 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:133 + msgid "Enable touchpad" + msgstr "タッチパッドを有効にする" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:12 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:134 + msgid "Set this to TRUE to enable all touchpads." + msgstr "この値を TRUE にすると、すべてのタッチパッドを有効にします。" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:13 +-msgid "Highlights the current location of the pointer when the Control key is pressed and released." +-msgstr "コントロールキーが押されて、離された時、ポインターの現在位置をハイライトする" +- +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:14 +-msgid "Double click time" +-msgstr "ダブルクリックの時間" +- +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:15 +-msgid "Length of a double click in milliseconds." +-msgstr "ダブルクリックの長さ(ミリ秒単位)です。" +- +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:16 +-msgid "Drag threshold" +-msgstr "ドラッグのしきい値" ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:138 ++msgid "Touchpad button orientation" ++msgstr "タッチパッドボタンの方向" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:17 +-msgid "Distance before a drag is started." +-msgstr "ドラッグが開始されるまでの距離です。" ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:139 ++msgid "" ++"Swap left and right mouse buttons for left-handed mice with “left”, “right” " ++"for right-handed, “mouse” to follow the mouse setting." ++msgstr "左利き用のマウスボタンを「左」、右利き用のマウスボタンを「右」、マウスの設定に従うように「マウス」で左右を入れ替えます。" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:18 +-msgid "Middle button emulation" +-msgstr "中ボタンのエミュレーション" ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:153 ++msgid "Natural scrolling" ++msgstr "ナチュラルスクロール" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:19 +-msgid "Enables middle mouse button emulation through simultaneous left and right button click." +-msgstr "マウスの中ボタンの左右ボタンの同時クリックによるエミュレーションを利用可能にします。" ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:154 ++msgid "Set this to TRUE to enable natural (reverse) scrolling for touchpads." ++msgstr "この値を TRUE にすると、すべてのタッチパッドのスクロールがナチュラル (逆) になります。" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:20 +-msgid "Whether the tablet's orientation is locked, or rotated automatically." +-msgstr "タブレットの方向を固定するか自動的に回転するかです。" +- +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:21 +-msgid "Device hotplug custom command" +-msgstr "デバイスのホットプラグの独自コマンド" +- +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:22 +-msgid "Command to be run when a device is added or removed. An exit value of 1 means that the device will not be handled further by gnome-settings-daemon." +-msgstr "デバイスの接続または取り外し時に実行するコマンドです。終了ステータスが 1 である場合は、これ以上 gnome-settings-daemon によってデバイスが処理されないことを意味します。" +- +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:1 +-#: ../data/org.gnome.settings-daemon.plugins.color.gschema.xml.in.in.h:1 +-#: ../data/org.gnome.settings-daemon.plugins.datetime.gschema.xml.in.in.h:1 +-#: ../data/org.gnome.settings-daemon.plugins.gschema.xml.in.in.h:3 +-#: ../data/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml.in.in.h:1 +-#: ../data/org.gnome.settings-daemon.plugins.keyboard.gschema.xml.in.in.h:1 +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:1 +-#: ../data/org.gnome.settings-daemon.plugins.orientation.gschema.xml.in.in.h:1 +-#: ../data/org.gnome.settings-daemon.plugins.power.gschema.xml.in.in.h:1 +-#: ../data/org.gnome.settings-daemon.plugins.print-notifications.gschema.xml.in.in.h:1 +-#: ../data/org.gnome.settings-daemon.plugins.updates.gschema.xml.in.in.h:1 +-#: ../data/org.gnome.settings-daemon.plugins.xrandr.gschema.xml.in.in.h:1 +-#: ../data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in.in.h:1 +-msgid "Activation of this plugin" +-msgstr "このプラグインを有効化する" +- +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:2 +-#: ../data/org.gnome.settings-daemon.plugins.color.gschema.xml.in.in.h:2 +-#: ../data/org.gnome.settings-daemon.plugins.datetime.gschema.xml.in.in.h:2 +-#: ../data/org.gnome.settings-daemon.plugins.gschema.xml.in.in.h:4 +-#: ../data/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml.in.in.h:2 +-#: ../data/org.gnome.settings-daemon.plugins.keyboard.gschema.xml.in.in.h:2 +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:2 +-#: ../data/org.gnome.settings-daemon.plugins.orientation.gschema.xml.in.in.h:2 +-#: ../data/org.gnome.settings-daemon.plugins.power.gschema.xml.in.in.h:2 +-#: ../data/org.gnome.settings-daemon.plugins.print-notifications.gschema.xml.in.in.h:2 +-#: ../data/org.gnome.settings-daemon.plugins.updates.gschema.xml.in.in.h:2 +-#: ../data/org.gnome.settings-daemon.plugins.xrandr.gschema.xml.in.in.h:2 +-#: ../data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in.in.h:2 +-msgid "Whether this plugin would be activated by gnome-settings-daemon or not" +-msgstr "このプラグインを gnome-settings-daemon で有効化するかどうかです" +- +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:3 +-#: ../data/org.gnome.settings-daemon.plugins.color.gschema.xml.in.in.h:3 +-#: ../data/org.gnome.settings-daemon.plugins.datetime.gschema.xml.in.in.h:3 +-#: ../data/org.gnome.settings-daemon.plugins.gschema.xml.in.in.h:5 +-#: ../data/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml.in.in.h:13 +-#: ../data/org.gnome.settings-daemon.plugins.keyboard.gschema.xml.in.in.h:3 +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:27 +-#: ../data/org.gnome.settings-daemon.plugins.orientation.gschema.xml.in.in.h:3 +-#: ../data/org.gnome.settings-daemon.plugins.power.gschema.xml.in.in.h:3 +-#: ../data/org.gnome.settings-daemon.plugins.print-notifications.gschema.xml.in.in.h:3 +-#: ../data/org.gnome.settings-daemon.plugins.updates.gschema.xml.in.in.h:3 +-#: ../data/org.gnome.settings-daemon.plugins.xrandr.gschema.xml.in.in.h:5 +-#: ../data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in.in.h:7 +-msgid "Priority to use for this plugin" +-msgstr "このプラグインの優先度" +- +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:4 +-#: ../data/org.gnome.settings-daemon.plugins.color.gschema.xml.in.in.h:4 +-#: ../data/org.gnome.settings-daemon.plugins.datetime.gschema.xml.in.in.h:4 +-#: ../data/org.gnome.settings-daemon.plugins.gschema.xml.in.in.h:6 +-#: ../data/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml.in.in.h:14 +-#: ../data/org.gnome.settings-daemon.plugins.keyboard.gschema.xml.in.in.h:4 +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:28 +-#: ../data/org.gnome.settings-daemon.plugins.orientation.gschema.xml.in.in.h:4 +-#: ../data/org.gnome.settings-daemon.plugins.power.gschema.xml.in.in.h:4 +-#: ../data/org.gnome.settings-daemon.plugins.print-notifications.gschema.xml.in.in.h:4 +-#: ../data/org.gnome.settings-daemon.plugins.updates.gschema.xml.in.in.h:4 +-#: ../data/org.gnome.settings-daemon.plugins.xrandr.gschema.xml.in.in.h:6 +-#: ../data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in.in.h:8 +-msgid "Priority to use for this plugin in gnome-settings-daemon startup queue" +-msgstr "gnome-settings-daemon の起動時のキューで、このプラグインが使用される優先度" ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:161 ++msgid "Mouse wheel emulation button. 0 to disable the feature." ++msgstr "マウスホイールエミュレーションボタン。0 で機能を無効にします。" + + # stylus はそのままスタイラスとした。http://ja.wikipedia.org/wiki/%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%A9%E3%82%B9 +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:5 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:10 + msgid "Wacom stylus absolute mode" + msgstr "Wacom スタイラスの絶対座標モード" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:6 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:11 + msgid "Enable this to set the tablet to absolute mode." + msgstr "タブレットを絶対座標モードに設定することを可能にします。" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:7 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:15 + msgid "Wacom tablet area" + msgstr "Wacom タブレットの範囲" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:8 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:16 + msgid "Set this to x1, y1 and x2, y2 of the area usable by the tools." + msgstr "以下の x1, y1 を、ツールで利用可能な領域 x2, y2 に設定します。" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:9 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:20 + msgid "Wacom tablet aspect ratio" + msgstr "Wacom タブレットのアスペクト比" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:10 +-msgid "Enable this to restrict the Wacom tablet area to match the aspect ratio of the output." ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:21 ++msgid "" ++"Enable this to restrict the Wacom tablet area to match the aspect ratio of " ++"the output." + msgstr "Wacom タブレットの領域を出力のアスペクト比に一致させます。" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:11 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:25 + msgid "Wacom tablet rotation" + msgstr "Wacom タブレットの回転" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:12 +-msgid "Set this to 'none', 'cw' for 90 degree clockwise, 'half' for 180 degree, and 'ccw' for 90 degree counterclockwise." +-msgstr "これを、'none'、90度時計回りの 'cw'、180度の 'half'、そして、90度反時計回りの 'ccw' に設定します。" ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:26 ++msgid "" ++"Set this to “none”, “cw” for 90 degree clockwise, “half” for 180 degree, and " ++"“ccw” for 90 degree counterclockwise." ++msgstr "これを、'none'、90 度時計回りの 'cw'、180度の 'half'、そして、90 度反時計回りの 'ccw' に設定します。" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:13 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:30 + msgid "Wacom touch feature" + msgstr "Wacom のタッチ機能" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:14 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:31 + msgid "Enable this to move the cursor when the user touches the tablet." + msgstr "ユーザーがタブレットにタッチしたときにカーソルが動くようにします。" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:15 +-msgid "Wacom tablet PC feature" +-msgstr "Wacom タブレット PC の機能" +- +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:16 +-msgid "Enable this to only report stylus events when the tip is pressed." +-msgstr "チップが押されたときにスタイラスイベントだけが送られるようにします。" +- +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:17 +-msgid "Wacom last calibrated resolution" +-msgstr "Wacom で最後にキャリブレーションした時の解像度" +- +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:18 +-msgid "Holds the last calibrated resolution to help check if calibration is needed." +-msgstr "キャリブレーションが必要かどうか判断できるように、最後にキャリブレーションした時の解像度を保持します。" +- +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:19 +-msgid "Wacom display mapping" +-msgstr "Wacom ディスプレイ・マッピング" +- +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:20 +-msgid "EDID information of monitor to map tablet to. Must be in the format [vendor, product, serial]. [\"\",\"\",\"\"] disables mapping." +-msgstr "モニターとタブレットのマップで EDID 情報を使用します。書式は、[vendor, product, serial] です。[\"\",\"\",\"\"] にするとマッピングできません。" +- +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:21 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:37 + msgid "Wacom stylus pressure curve" + msgstr "Wacom のスタイラスの圧力曲線" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:22 +-msgid "Set this to x1, y1 and x2, y2 of the pressure curve applied to the stylus." ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:38 ++msgid "" ++"Set this to x1, y1 and x2, y2 of the pressure curve applied to the stylus." + msgstr "以下の x1, y1 を、スタイラスの圧力曲線の x2, y2 に設定します。" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:23 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:42 + msgid "Wacom stylus button mapping" + msgstr "Wacom スタイラスボタンのマッピング" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:24 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:43 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:60 + msgid "Set this to the logical button mapping." + msgstr "これをロジカルボタンのマッピングにします。" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:25 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:47 + msgid "Wacom stylus pressure threshold" + msgstr "Wacom スタイラスの圧力しきい値" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:26 +-msgid "Set this to the pressure value at which a stylus click event is generated." ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:48 ++msgid "" ++"Set this to the pressure value at which a stylus click event is generated." + msgstr "これをスタイラスがクリックイベントを生成するしきい値にします。" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:27 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:54 + msgid "Wacom eraser pressure curve" + msgstr "Wacom の消しゴムツールの圧力曲線" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:28 +-msgid "Set this to x1, y1 and x2, y2 of the pressure curve applied to the eraser." ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:55 ++msgid "" ++"Set this to x1, y1 and x2, y2 of the pressure curve applied to the eraser." + msgstr "以下の x1, y1 を、消しゴムツールの圧力曲線の x2, y2 に設定します。" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:29 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:59 + msgid "Wacom eraser button mapping" + msgstr "Wacom の消しゴムボタンのマッピング" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:30 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:64 + msgid "Wacom eraser pressure threshold" + msgstr "Wacom 消しゴムツールの圧力しきい値" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:31 +-msgid "Set this to the pressure value at which an eraser click event is generated." ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:65 ++msgid "" ++"Set this to the pressure value at which an eraser click event is generated." + msgstr "これを消しゴムツールがクリックイベントを生成するしきい値にします。" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:32 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:71 + msgid "Wacom button action type" + msgstr "Wacom ボタンアクションの型" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:33 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:72 + msgid "The type of action triggered by the button being pressed." + msgstr "ボタンが押された時に実行されるアクションの型です。" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:34 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:76 + msgid "Key combination for the custom action" + msgstr "独自アクションのキーの組み合わせ" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:35 +-msgid "The keyboard shortcut generated when the button is pressed for custom actions." ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:77 ++msgid "" ++"The keyboard shortcut generated when the button is pressed for custom " ++"actions." + msgstr "独自アクションのボタンが押されたときに生成されるキーボードショートカットです。" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:36 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:81 + msgid "Key combinations for a touchring or touchstrip custom action" + msgstr "タッチホイールやトラックパッドの独自アクションのキーの組み合わせ" + + # touchring を タッチホイール touchstrip を トラックパッド と訳出 +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:37 +-msgid "The keyboard shortcuts generated when a touchring or touchstrip is used for custom actions (up followed by down)." ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:82 ++msgid "" ++"The keyboard shortcuts generated when a touchring or touchstrip is used for " ++"custom actions (up followed by down)." + msgstr "タッチホイールやトラックパッドがカスタムアクションのために (上から順番に) 使用されるとき、生成されるキーボードショートカットです。" + + #. Translators: This is the OLED display on an Intuos4 tablet: + #. http://eu.shop.wacom.eu/images/articles/d9abd9f2d4d88aa0649cda97a8077e2b_8.jpg +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:40 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:88 + msgid "Button label for OLED display." +-msgstr "OLED ディスプレイのボタンラベル" ++msgstr "OLED ディスプレイのボタンラベル。" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:41 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:89 + msgid "Label will be rendered to OLED display belonging to the button" +-msgstr "ボタンに対応する OLED ディスプレイに表示されるラベルです。" ++msgstr "ボタンに対応する OLED ディスプレイに表示されるラベルです" + +-#: ../data/org.gnome.settings-daemon.plugins.color.gschema.xml.in.in.h:5 ++#: data/org.gnome.settings-daemon.plugins.color.gschema.xml.in:6 + msgid "The duration a display profile is valid" + msgstr "ディスプレイ・プロファイルの有効時間" + +-#: ../data/org.gnome.settings-daemon.plugins.color.gschema.xml.in.in.h:6 +-msgid "This is the number of days after which the display color profile is considered invalid." ++#: data/org.gnome.settings-daemon.plugins.color.gschema.xml.in:7 ++msgid "" ++"This is the number of days after which the display color profile is " ++"considered invalid." + msgstr "ディスプレイ・カラープロファイルが実施されてから、無効とされるまでの日数です。" + +-#: ../data/org.gnome.settings-daemon.plugins.color.gschema.xml.in.in.h:7 ++#: data/org.gnome.settings-daemon.plugins.color.gschema.xml.in:11 + msgid "The duration a printer profile is valid" + msgstr "プリンター・プロファイルの有効時間" + +-#: ../data/org.gnome.settings-daemon.plugins.color.gschema.xml.in.in.h:8 +-msgid "This is the number of days after which the printer color profile is considered invalid." ++#: data/org.gnome.settings-daemon.plugins.color.gschema.xml.in:12 ++msgid "" ++"This is the number of days after which the printer color profile is " ++"considered invalid." + msgstr "プリンター・カラープロファイルが実施されてから、無効とされるまでの日数です。" + +-#: ../data/org.gnome.settings-daemon.plugins.gschema.xml.in.in.h:1 ++#: data/org.gnome.settings-daemon.plugins.color.gschema.xml.in:16 ++msgid "If the night light mode is enabled" ++msgstr "ナイトライトモードが有効な場合" ++ ++#: data/org.gnome.settings-daemon.plugins.color.gschema.xml.in:17 ++msgid "" ++"Night light mode changes the color temperature of your display when the sun " ++"has gone down or at preset times." ++msgstr "ナイトライトモードでは、太陽が沈んだとき、またはあらかじめ設定した時間にディスプレイの色温度を変更します。" ++ ++#: data/org.gnome.settings-daemon.plugins.color.gschema.xml.in:21 ++msgid "Temperature of the display when enabled" ++msgstr "有効時のディスプレイの温度" ++ ++#: data/org.gnome.settings-daemon.plugins.color.gschema.xml.in:22 ++msgid "" ++"This temperature in Kelvin is used to modify the screen tones when night " ++"light mode is enabled. Higher values are bluer, lower redder." ++msgstr "この温度 (ケルビン) は、ナイトライトモードが有効のときに画面のトーンを変更するために使用されます。値が高いほど青く、低いほど赤くなります。" ++ ++#: data/org.gnome.settings-daemon.plugins.color.gschema.xml.in:26 ++msgid "Use the sunrise and sunset" ++msgstr "日の出と日の入りを使用" ++ ++#: data/org.gnome.settings-daemon.plugins.color.gschema.xml.in:27 ++msgid "" ++"Calculate the sunrise and sunset times automatically, from the current " ++"location." ++msgstr "現在地から日の出と日の入りの時間を自動的に計算します。" ++ ++#: data/org.gnome.settings-daemon.plugins.color.gschema.xml.in:31 ++msgid "The start time" ++msgstr "開始時刻" ++ ++#: data/org.gnome.settings-daemon.plugins.color.gschema.xml.in:32 ++msgid "" ++"When “night-light-schedule-automatic” is disabled, use this start time in " ++"hours from midnight." ++msgstr "“night-light-schedule-automatic” を無効にすると、この開始時刻を 0 時からの時間単位で使用します。" ++ ++#: data/org.gnome.settings-daemon.plugins.color.gschema.xml.in:36 ++msgid "The end time" ++msgstr "終了時刻" ++ ++#: data/org.gnome.settings-daemon.plugins.color.gschema.xml.in:37 ++msgid "" ++"When “night-light-schedule-automatic” is disabled, use this end time in " ++"hours from midnight." ++msgstr "“night-light-schedule-automatic” を無効にすると、この終了時刻を 0 時からの時間単位で使用します。" ++ ++#: data/org.gnome.settings-daemon.plugins.color.gschema.xml.in:41 ++msgid "The last detected position" ++msgstr "最後に検出した位置" ++ ++#: data/org.gnome.settings-daemon.plugins.color.gschema.xml.in:42 ++msgid "" ++"When location services are available this represents the last detected " ++"location. The default value is an invalid value to ensure it is always " ++"updated at startup." ++msgstr "位置情報サービスが利用可能な場合、最後に検出された位置情報を表します。このデフォルト値は、起動時に常に更新されるようにするために無効な値になっています。" ++ ++#: data/org.gnome.settings-daemon.plugins.gschema.xml.in:6 + msgid "List of plugins that are allowed to be loaded" + msgstr "ロードを許可するプラグインのリスト" + +-#: ../data/org.gnome.settings-daemon.plugins.gschema.xml.in.in.h:2 +-msgid "A list of strings representing the plugins that are allowed to be loaded (default: 'all'). The plugins still need to be marked as active to get loaded. This is only evaluated on startup." +-msgstr "ロードを許可するプラグインを表す文字列のリストです (デフォルト: 'all')。プラグインを読み込むには、さらにそれぞれが有効化対象としてマーキングされている必要があります。このキーは起動時にだけ評価されます。" ++#: data/org.gnome.settings-daemon.plugins.gschema.xml.in:7 ++msgid "" ++"A list of strings representing the plugins that are allowed to be loaded " ++"(default: “all”). This is only evaluated on startup." ++msgstr "ロードを許可するプラグインを表す文字列のリストです (デフォルト: all)。これは起動時にだけ評価されます。" + +-#: ../data/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml.in.in.h:3 ++#: data/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml.in:6 + msgid "Mount paths to ignore" + msgstr "無視するマウントパス" + +-#: ../data/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml.in.in.h:4 ++#: data/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml.in:7 + msgid "Specify a list of mount paths to ignore when they run low on space." +-msgstr "残り容量が少なくても無視するマウントパスの一覧を指定します" ++msgstr "残り容量が少なくても無視するマウントパスの一覧を指定します。" + +-#: ../data/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml.in.in.h:5 ++#: data/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml.in:12 + msgid "Free percentage notify threshold" + msgstr "空きパーセンテージ通知の閾値" + +-#: ../data/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml.in.in.h:6 +-msgid "Percentage free space threshold for initial warning of low disk space. If the percentage free space drops below this, a warning will be shown." ++#: data/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml.in:13 ++msgid "" ++"Percentage free space threshold for initial warning of low disk space. If " ++"the percentage free space drops below this, a warning will be shown." + msgstr "ディスクの残り容量が少なくなった時に最初に警告する閾値となる残り容量のパーセンテージです。残り容量のパーセンテージがこの値を下まわれば、警告が表示されます。" + +-#: ../data/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml.in.in.h:7 ++#: data/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml.in:18 + msgid "Subsequent free space percentage notify threshold" + msgstr "空き容量の連続通知のパーセンテージの閾値" + +-#: ../data/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml.in.in.h:8 +-msgid "Specify the percentage that the free disk space should reduce by before issuing a subsequent warning." ++#: data/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml.in:19 ++msgid "" ++"Specify the percentage that the free disk space should reduce by before " ++"issuing a subsequent warning." + msgstr "空き容量の警告を連続して出す前に、何パーセント空き容量を減らさなくてはならないかを指定します。" + +-#: ../data/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml.in.in.h:9 ++#: data/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml.in:23 + msgid "Free space notify threshold" + msgstr "空き容量の通知の閾値" + +-#: ../data/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml.in.in.h:10 +-msgid "Specify an amount in GB. If the amount of free space is more than this, no warning will be shown." ++#: data/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml.in:24 ++msgid "" ++"Specify an amount in GB. If the amount of free space is more than this, no " ++"warning will be shown." + msgstr "容量をGB単位で指定します。空き容量がこの値を上まわれば、警告は表示されません。" + +-#: ../data/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml.in.in.h:11 ++#: data/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml.in:28 + msgid "Minimum notify period for repeated warnings" + msgstr "警告の繰り返しの最小通知間隔" + +-#: ../data/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml.in.in.h:12 +-msgid "Specify a time in minutes. Subsequent warnings for a volume will not appear more often than this period." ++#: data/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml.in:29 ++msgid "" ++"Specify a time in minutes. Subsequent warnings for a volume will not appear " ++"more often than this period." + msgstr "時間を分単位で指定します。この時間より短い間隔で容量の警告を表示することはありません。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:3 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:6 + msgid "Custom keybindings" + msgstr "独自のキーバインディング" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:4 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:7 + msgid "List of custom keybindings" + msgstr "独自のキーバインディングのリスト" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:5 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:11 + msgid "Launch calculator" + msgstr "電卓を起動する" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:6 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:12 + msgid "Binding to launch the calculator." + msgstr "電卓を起動するキーバインディングです。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:7 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:16 ++msgid "Launch settings" ++msgstr "起動設定" ++ ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:17 ++msgid "Binding to launch GNOME settings." ++msgstr "GNOME 設定を起動するためのキーバインディングです。" ++ ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:21 + msgid "Launch email client" + msgstr "E-メールクライアントを起動する" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:8 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:22 + msgid "Binding to launch the email client." + msgstr "E-メールクライアントを起動するキーバインディングです。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:9 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:26 + msgid "Eject" + msgstr "メディアを取り出す" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:10 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:27 + msgid "Binding to eject an optical disc." + msgstr "光学ディスクを取り出すキーバインディングです。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:11 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:31 + msgid "Launch help browser" + msgstr "ヘルプブラウザーを起動する" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:12 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:32 + msgid "Binding to launch the help browser." + msgstr "ヘルプブラウザーを起動するキーバインディングです。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:13 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:36 + msgid "Home folder" + msgstr "ホームフォルダーを開く" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:14 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:37 + msgid "Binding to open the Home folder." + msgstr "ホームフォルダーを開くキーバインディングです。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:15 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:41 + msgid "Launch media player" + msgstr "メディアプレーヤーを起動する" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:16 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:42 + msgid "Binding to launch the media player." + msgstr "メディアプレーヤーを起動するキーバインディングです。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:17 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:46 + msgid "Next track" + msgstr "次のトラックに進む" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:18 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:47 + msgid "Binding to skip to next track." + msgstr "次のトラックにスキップするキーバインディングです。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:19 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:51 + msgid "Pause playback" + msgstr "再生を一時停止する" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:20 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:52 + msgid "Binding to pause playback." + msgstr "再生を一時停止するキーバインディングです。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:21 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:56 + msgid "Play (or play/pause)" + msgstr "再生する (または再生/一時停止する)" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:22 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:57 + msgid "Binding to start playback (or toggle play/pause)." + msgstr "再生を開始する (または再生と一時停止を切り替える) キーバインディングです。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:23 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:61 + msgid "Log out" + msgstr "ログアウトする" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:24 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:62 + msgid "Binding to log out." + msgstr "ログアウトするキーバインディングです。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:25 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:66 + msgid "Previous track" + msgstr "前のトラックに戻る" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:26 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:67 + msgid "Binding to skip to previous track." + msgstr "前のトラックにスキップするキーバインディングです。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:29 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:71 + msgid "Lock screen" + msgstr "画面をロックする" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:30 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:72 + msgid "Binding to lock the screen." + msgstr "画面をロックするキーバインディングです。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:31 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:76 + msgid "Search" + msgstr "検索する" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:32 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:77 + msgid "Binding to launch the search tool." + msgstr "検索ツールを起動するキーバインディングです。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:33 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:81 + msgid "Stop playback" + msgstr "再生を停止する" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:34 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:82 + msgid "Binding to stop playback." + msgstr "再生を停止するキーバインディングです。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:35 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:86 + msgid "Volume down" + msgstr "音量を下げる" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:36 +-msgid "Binding to lower the system volume." ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:87 ++msgid "Binding to lower the volume." + msgstr "システムの音量を小さくするキーバインディングです。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:37 +-msgid "Volume mute" +-msgstr "ミュートにする" ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:91 ++msgid "Volume mute/unmute" ++msgstr "システムの音量のミュート/ミュート解除" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:38 +-msgid "Binding to mute the system volume." +-msgstr "システムの音量をミュート (無音) にするキーバインディングです。" ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:92 ++msgid "Binding to mute/unmute the volume." ++msgstr "システムの音量をミュート (無音) またはミュート解除するキーバインディングです。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:39 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:96 + msgid "Volume up" + msgstr "音量を上げる" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:40 +-msgid "Binding to raise the system volume." ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:97 ++msgid "Binding to raise the volume." + msgstr "システムの音量を大きくするキーバインディングです。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:41 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:101 ++msgid "Microphone mute/unmute" ++msgstr "マイクのミュート/ミュート解除" ++ ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:102 ++msgid "Binding to mute/unmute the microphone." ++msgstr "システムの音量をミュート (無音) にするキーバインディングです。" ++ ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:106 + msgid "Take a screenshot" + msgstr "スクリーンショットを撮る" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:42 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:107 + msgid "Binding to take a screenshot." + msgstr "スクリーンショットを撮るキーバインディングです。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:43 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:111 + msgid "Take a screenshot of a window" + msgstr "ウィンドウのスクリーンショットを撮る" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:44 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:112 + msgid "Binding to take a screenshot of a window." + msgstr "ウィンドウのスクリーンショットを撮るキーバインディングです。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:45 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:116 + msgid "Take a screenshot of an area" + msgstr "選択領域のスクリーンショットを撮る" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:46 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:117 + msgid "Binding to take a screenshot of an area." + msgstr "選択領域のスクリーンショットを撮るキーバインディングです。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:47 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:121 + msgid "Copy a screenshot to clipboard" + msgstr "スクリーンショットをクリップボードにコピーする" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:48 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:122 + msgid "Binding to copy a screenshot to clipboard." + msgstr "スクリーンショットをクリップボードにコピーするキーバインディングです。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:49 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:126 + msgid "Copy a screenshot of a window to clipboard" + msgstr "ウィンドウのスクリーンショットをクリップボードにコピーする" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:50 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:127 + msgid "Binding to copy a screenshot of a window to clipboard." + msgstr "ウィンドウのスクリーンショットをクリップボードにコピーするキーバインディングです。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:51 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:131 + msgid "Copy a screenshot of an area to clipboard" + msgstr "選択領域のスクリーンショットをクリップボードにコピーする" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:52 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:132 + msgid "Binding to copy a screenshot of an area to clipboard." + msgstr "選択領域のスクリーンショットをクリップボードにコピーするキーバインディングです。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:53 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:136 + msgid "Record a short video of the screen" + msgstr "画面の動画 (スクリーンキャスト) を撮る" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:54 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:137 ++msgid "Binding to record a short video of the screen" ++msgstr "画面の動画 (スクリーンキャスト) を撮るキーバインディグ" ++ ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:141 + msgid "Launch web browser" + msgstr "ウェブブラウザーを起動する" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:55 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:142 + msgid "Binding to launch the web browser." + msgstr "ウェブブラウザーを起動するキーバインディングです。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:56 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:146 + msgid "Toggle magnifier" + msgstr "拡大鏡のオン/オフ切り替え" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:57 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:147 + msgid "Binding to show the screen magnifier" + msgstr "拡大鏡のオン/オフを切り替えるキーバインディングです" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:58 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:151 + msgid "Toggle screen reader" + msgstr "スクリーンリーダーのオン/オフ切り替え" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:59 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:152 + msgid "Binding to start the screen reader" + msgstr "スクリーンリーダーのオン/オフを切り替えるキーバインディングです" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:60 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:156 + msgid "Toggle on-screen keyboard" + msgstr "オンスクリーンキーボードのオン/オフ切り替え" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:61 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:157 + msgid "Binding to show the on-screen keyboard" + msgstr "オンスクリーンキーボードのオン/オフを切り替えるキーバインディングです" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:62 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:161 + msgid "Increase text size" + msgstr "文字サイズの拡大" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:63 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:162 + msgid "Binding to increase the text size" + msgstr "文字サイズを拡大するキーバインディングです" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:64 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:166 + msgid "Decrease text size" + msgstr "文字サイズの縮小" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:65 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:167 + msgid "Binding to decrease the text size" + msgstr "文字サイズを縮小するキーバインディングです" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:66 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:171 + msgid "Toggle contrast" + msgstr "コントラストの切り替え" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:67 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:172 + msgid "Binding to toggle the interface contrast" + msgstr "インターフェースのコントラストを切り替えるキーバインディングです" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:68 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:176 + msgid "Magnifier zoom in" + msgstr "拡大鏡ズームイン" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:69 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:177 + msgid "Binding for the magnifier to zoom in" +-msgstr "拡大鏡をズームインするキーバインディングです。" ++msgstr "拡大鏡をズームインするキーバインディングです" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:70 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:181 + msgid "Magnifier zoom out" + msgstr "拡大鏡ズームアウト" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:71 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:182 + msgid "Binding for the magnifier to zoom out" + msgstr "拡大鏡をズームアウトするキーバインディングです" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:72 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:186 ++msgid "Maximum length of screen recordings" ++msgstr "画面録画の最大長さ" ++ ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:187 ++msgid "" ++"The maximum length of single screen cast recordings in seconds or 0 for " ++"unlimited" ++msgstr "1 画面のキャスト録画の最大長さ (ミリ秒または、無制限には 0)" ++ ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:194 + msgid "Name" + msgstr "名前" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:73 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:195 + msgid "Name of the custom binding" + msgstr "独自のキーバインディングの名前です" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:74 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:199 + msgid "Binding" + msgstr "キーバインディング" + + # カスタムキーバインディングをバインドすること? +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:75 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:200 + msgid "Binding for the custom binding" + msgstr "独自のキーバインディングのためのキーバインディングです" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:76 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:204 + msgid "Command" + msgstr "コマンド" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:77 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:205 + msgid "Command to run when the binding is invoked" + msgstr "キーバインディングの呼び出し時に実行するコマンドです" + +-#: ../data/org.gnome.settings-daemon.plugins.power.gschema.xml.in.in.h:5 +-msgid "Percentage considered low" +-msgstr "バッテリー残量低下と認識するパーセンテージ" +- +-#: ../data/org.gnome.settings-daemon.plugins.power.gschema.xml.in.in.h:6 +-msgid "The percentage of the battery when it is considered low. Only valid when use-time-for-policy is false." +-msgstr "バッテリー残量が低下していると認識するパーセンテージです。use-time-for-policy が false のときだけ有効です。" +- +-#: ../data/org.gnome.settings-daemon.plugins.power.gschema.xml.in.in.h:7 +-msgid "Percentage considered critical" +-msgstr "バッテリー残量が危険領域と認識するパーセンテージ" +- +-#: ../data/org.gnome.settings-daemon.plugins.power.gschema.xml.in.in.h:8 +-msgid "The percentage of the battery when it is considered critical. Only valid when use-time-for-policy is false." +-msgstr "バッテリー残量が危険領域だと認識するパーセンテージです。use-time-for-policy が false のときだけ有効です。" +- +-#: ../data/org.gnome.settings-daemon.plugins.power.gschema.xml.in.in.h:9 +-msgid "Percentage action is taken" +-msgstr "アクションを実施するパーセンテージ" +- +-#: ../data/org.gnome.settings-daemon.plugins.power.gschema.xml.in.in.h:10 +-msgid "The percentage of the battery when the critical action is performed. Only valid when use-time-for-policy is false." +-msgstr "危険領域のアクションを実施するバッテリー残量のパーセンテージ。use-time-for-policy が false のときだけ有効です。" +- +-#: ../data/org.gnome.settings-daemon.plugins.power.gschema.xml.in.in.h:11 +-msgid "The time remaining when low" +-msgstr "残量低下時の残り時間" +- +-#: ../data/org.gnome.settings-daemon.plugins.power.gschema.xml.in.in.h:12 +-msgid "The time remaining in seconds of the battery when it is considered low. Only valid when use-time-for-policy is true." +-msgstr "残量低下時のバッテリーの残り秒数です。use-time-for-policy が true のときだけ有効です。" +- +-#: ../data/org.gnome.settings-daemon.plugins.power.gschema.xml.in.in.h:13 +-msgid "The time remaining when critical" +-msgstr "残量が危険領域時の残り時間" +- +-#: ../data/org.gnome.settings-daemon.plugins.power.gschema.xml.in.in.h:14 +-msgid "The time remaining in seconds of the battery when it is considered critical. Only valid when use-time-for-policy is true." +-msgstr "残量が危険領域時のバッテリーの残り秒数です。use-time-for-policy が true のときだけ有効です。" +- +-#: ../data/org.gnome.settings-daemon.plugins.power.gschema.xml.in.in.h:15 +-msgid "The time remaining when action is taken" +-msgstr "アクション実施時のバッテリーの残り秒数" +- +-#: ../data/org.gnome.settings-daemon.plugins.power.gschema.xml.in.in.h:16 +-msgid "The time remaining in seconds of the battery when critical action is taken. Only valid when use-time-for-policy is true." +-msgstr "危険領域時のアクション実施時のバッテリーの残り秒数です。use-time-for-policy が true のときだけ有効です。" +- +-#: ../data/org.gnome.settings-daemon.plugins.power.gschema.xml.in.in.h:17 +-msgid "Whether to use time-based notifications" +-msgstr "時間基準の通知を使用するかどうか" +- +-#: ../data/org.gnome.settings-daemon.plugins.power.gschema.xml.in.in.h:18 +-msgid "If time based notifications should be used. If set to false, then the percentage change is used instead, which may fix a broken ACPI BIOS." +-msgstr "時間基準の通知を使用するかどうかです。false に設定されている場合、パーセンテージの変化が代わりに使用され、壊れた ACPI BIOS を正してくれます。" +- +-#: ../data/org.gnome.settings-daemon.plugins.power.gschema.xml.in.in.h:19 +-msgid "If we should show the recalled battery warning for a broken battery" +-msgstr "壊れたバッテリーに対して、リコールされたバッテリーだという警告を再び表示させるかどうか" +- +-#: ../data/org.gnome.settings-daemon.plugins.power.gschema.xml.in.in.h:20 +-msgid "If we should show the recalled battery warning for a broken battery. Set this to false only if you know your battery is okay." +-msgstr "壊れたバッテリーに対して、リコールされたバッテリーだという警告を再び表示させるかどうかです。これを false に指定した場合、バッテリーが良好かどうかを知ることしかできません。" +- +-#: ../data/org.gnome.settings-daemon.plugins.updates.gschema.xml.in.in.h:5 +-msgid "Use mobile broadband connections" +-msgstr "モバイルブロードバンド接続を使用する" ++#: data/org.gnome.settings-daemon.plugins.power.gschema.xml.in:6 ++msgid "The brightness of the screen when idle" ++msgstr "アイドル時の画面の明るさ" + +-#: ../data/org.gnome.settings-daemon.plugins.updates.gschema.xml.in.in.h:6 +-msgid "Use mobile broadband connections such as GSM and CDMA to check for updates." +-msgstr "更新の確認に GSM や CDMA などのモバイルブロードバンド接続を使用します。" +- +-#: ../data/org.gnome.settings-daemon.plugins.updates.gschema.xml.in.in.h:7 +-msgid "Automatically download updates in the background without confirmation" +-msgstr "バックグラウンドで自動的に更新をダウンロードする" +- +-#: ../data/org.gnome.settings-daemon.plugins.updates.gschema.xml.in.in.h:8 +-msgid "Automatically download updates in the background without confirmation. Updates will be auto-downloaded when using wired network connnections, and mobile broadband if 'connection-use-mobile' is enabled." +-msgstr "バックグラウンドで自動的に更新をダウンロードします。有線ネットワーク接続を使用しているとき、また 'connection-use-mobile' が有効でモバイルブロードバンドを使用しているときに、自動的に更新をダウンロードします。" +- +-#: ../data/org.gnome.settings-daemon.plugins.updates.gschema.xml.in.in.h:9 +-msgid "How often to check for updates" +-msgstr "更新の確認頻度" +- +-#: ../data/org.gnome.settings-daemon.plugins.updates.gschema.xml.in.in.h:10 +-msgid "How often to check for updates. Value is in seconds. This is a maximum amount of time that can pass between a security update being published, and the update being automatically installed or the user notified." +-msgstr "更新の確認頻度です。値は秒単位です。この最大時間は、セキュリティ更新の間隔になり、更新は自動的にインストールされる、またはユーザーに通知されます。" +- +-#: ../data/org.gnome.settings-daemon.plugins.updates.gschema.xml.in.in.h:11 +-msgid "How often to notify the user that non-critical updates are available" +-msgstr "クリティカルでない更新をユーザーに通知する頻度" +- +-#: ../data/org.gnome.settings-daemon.plugins.updates.gschema.xml.in.in.h:12 +-msgid "How often to tell the user there are non-critical updates. Value is in seconds. Security update notifications are always shown after the check for updates, but non-critical notifications should be shown a lot less frequently." +-msgstr "クリティカルではない更新が利用可能である場合にユーザーに通知する頻度です。値は秒単位です。セキュリティの更新の通知は、更新の調査後に毎回表示され、クリティカルではない通知はそれより低頻度で表示されます。" +- +-#: ../data/org.gnome.settings-daemon.plugins.updates.gschema.xml.in.in.h:13 +-msgid "The last time we told the user about non-critical notifications" +-msgstr "ユーザーにクリティカルではない通知を最後に行った時間" +- +-#: ../data/org.gnome.settings-daemon.plugins.updates.gschema.xml.in.in.h:14 +-msgid "The last time we notified the user about non-critical updates. Value is in seconds since the epoch, or zero for never." +-msgstr "ユーザーにクリティカルではない更新の通知を最後に行った時間です。値は、エポックからの秒単位、または、通知されていない場合のゼロです。" +- +-#: ../data/org.gnome.settings-daemon.plugins.updates.gschema.xml.in.in.h:15 +-msgid "How often to check for distribution upgrades" +-msgstr "ディストリビューションの更新の確認頻度" +- +-#: ../data/org.gnome.settings-daemon.plugins.updates.gschema.xml.in.in.h:16 +-msgid "How often to check for distribution upgrades. Value is in seconds." +-msgstr "ディストリビューションの更新の確認頻度です。値は秒単位です。" +- +-#: ../data/org.gnome.settings-daemon.plugins.updates.gschema.xml.in.in.h:17 +-msgid "How often to refresh the package cache" +-msgstr "パッケージキャッシュのリフレッシュ頻度" +- +-#: ../data/org.gnome.settings-daemon.plugins.updates.gschema.xml.in.in.h:18 +-msgid "How often to refresh the package cache. Value is in seconds." +-msgstr "パッケージキャッシュのリフレッシュ頻度です。値は秒単位です。" +- +-#: ../data/org.gnome.settings-daemon.plugins.updates.gschema.xml.in.in.h:19 +-msgid "Check for updates when running on battery power" +-msgstr "バッテリー電源での動作時に更新を確認する" +- +-#: ../data/org.gnome.settings-daemon.plugins.updates.gschema.xml.in.in.h:20 +-msgid "Check for updates when running on battery power." +-msgstr "バッテリー電源で動作しているときに更新を確認します。" ++#: data/org.gnome.settings-daemon.plugins.power.gschema.xml.in:7 ++msgid "" ++"This is the laptop panel screen brightness used when the session is idle." ++msgstr "これは、セッションがアイドル状態のときに使用されるラップトップパネルの画面の明るさです。" + +-#: ../data/org.gnome.settings-daemon.plugins.updates.gschema.xml.in.in.h:21 +-msgid "Notify the user when distribution upgrades are available" +-msgstr "ディストリビューションの更新が利用可能になったときにユーザーに通知する" ++#: data/org.gnome.settings-daemon.plugins.power.gschema.xml.in:11 ++msgid "Dim the screen after a period of inactivity" ++msgstr "操作しなくなってから一定の期間の後に画面を暗くする" + +-#: ../data/org.gnome.settings-daemon.plugins.updates.gschema.xml.in.in.h:22 +-msgid "Notify the user when distribution upgrades are available." +-msgstr "ディストリビューションの更新が利用可能になったときにユーザーに通知します。" ++#: data/org.gnome.settings-daemon.plugins.power.gschema.xml.in:12 ++msgid "If the screen should be dimmed to save power when the computer is idle." ++msgstr "コンピューターがアイドル状態のときに節電のために画面を暗くする必要がある場合。" + +-#: ../data/org.gnome.settings-daemon.plugins.updates.gschema.xml.in.in.h:23 +-msgid "Ask the user if additional firmware should be installed" +-msgstr "追加のファームウェアをインストールするかユーザーに確認する" ++#: data/org.gnome.settings-daemon.plugins.power.gschema.xml.in:16 ++msgid "Sleep timeout computer when on AC" ++msgstr "AC 接続時のコンピューターのスリープタイムアウト" + +-#: ../data/org.gnome.settings-daemon.plugins.updates.gschema.xml.in.in.h:24 +-msgid "Ask the user if additional firmware should be installed if it is available." +-msgstr "追加のファームウェアが利用可能である場合、インストールするかユーザーに確認します。" ++#: data/org.gnome.settings-daemon.plugins.power.gschema.xml.in:17 ++msgid "" ++"The amount of time in seconds the computer on AC power needs to be inactive " ++"before it goes to sleep. A value of 0 means never." ++msgstr "AC 電源を使用しているコンピューターがスリープ状態になるまでの非アクティブの時間を秒単位で指定します。値が 0 の場合は、スリープ状態になりません。" + +-#: ../data/org.gnome.settings-daemon.plugins.updates.gschema.xml.in.in.h:25 +-msgid "Firmware files that should not be searched for" +-msgstr "検索しないファームウェアファイル" ++#: data/org.gnome.settings-daemon.plugins.power.gschema.xml.in:21 ++#: data/org.gnome.settings-daemon.plugins.power.gschema.xml.in:31 ++msgid "Whether to hibernate, suspend or do nothing when inactive" ++msgstr "非アクティブ時にハイバネーションまたはサスペンドを行うか、または何もしないかどうか" + +-#: ../data/org.gnome.settings-daemon.plugins.updates.gschema.xml.in.in.h:26 +-msgid "Firmware files that should not be searched for, separated by commas. These can include '*' and '?' characters." +-msgstr "検索しないファームウェアファイルです。カンマで区切ります。'*' と '?' 文字を含めることができます。" ++#: data/org.gnome.settings-daemon.plugins.power.gschema.xml.in:22 ++#: data/org.gnome.settings-daemon.plugins.power.gschema.xml.in:32 ++msgid "" ++"The type of sleeping that should be performed when the computer is inactive." ++msgstr "コンピューターが動作していない時に行うスリープのタイプ。" + +-#: ../data/org.gnome.settings-daemon.plugins.updates.gschema.xml.in.in.h:27 +-msgid "Devices that should be ignored" +-msgstr "無視するデバイス" ++#: data/org.gnome.settings-daemon.plugins.power.gschema.xml.in:26 ++msgid "Sleep timeout computer when on battery" ++msgstr "バッテリー使用時コンピューターのスリープタイムアウト" + +-#: ../data/org.gnome.settings-daemon.plugins.updates.gschema.xml.in.in.h:28 +-msgid "Devices that should be ignored, separated by commas. These can include '*' and '?' characters." +-msgstr "カンマで分離された無視するデバイスです。 '*' と '?' 文字を含めてもかまいません。" ++#: data/org.gnome.settings-daemon.plugins.power.gschema.xml.in:27 ++msgid "" ++"The amount of time in seconds the computer on battery power needs to be " ++"inactive before it goes to sleep. A value of 0 means never." ++msgstr "バッテリーのみで使用しているコンピューターがスリープ状態になるまでの非アクティブの時間を秒単位で指定します。値が 0 の場合は、スリープ状態になりません。" + +-#: ../data/org.gnome.settings-daemon.plugins.updates.gschema.xml.in.in.h:29 +-msgid "The filenames on removable media that designate it a software source." +-msgstr "ソフトウェアのソースとなるリムーバブルメディア上のファイル名です。" ++#: data/org.gnome.settings-daemon.plugins.power.gschema.xml.in:36 ++msgid "Enable the ALS sensor" ++msgstr "ALS センサーを有効にする" + +-#: ../data/org.gnome.settings-daemon.plugins.updates.gschema.xml.in.in.h:30 +-msgid "When removable media is inserted, it is checked to see if it contains any important filenames in the root directory. If the filename matches, then an updates check is performed. This allows post-install disks to be used to update running systems." +-msgstr "リムーバブルメディアが挿入された時、ルートディレクトリに重要なファイル名が含まれていないかどうか調査します。ファイル名が一致した場合、更新の調査が実行されます。これで、すでにインストールしたディスクで実行中のシステムを更新することが可能になります。" ++#: data/org.gnome.settings-daemon.plugins.power.gschema.xml.in:37 ++msgid "If the ambient light sensor functionality is enabled." ++msgstr "環境光センサー機能が有効な場合。" + +-#: ../data/org.gnome.settings-daemon.plugins.xrandr.gschema.xml.in.in.h:3 +-msgid "File for default configuration for RandR" +-msgstr "RandR の初期設定ファイル" ++#: data/org.gnome.settings-daemon.plugins.power.gschema.xml.in:41 ++msgid "Power button action" ++msgstr "電源ボタンアクション" + +-#: ../data/org.gnome.settings-daemon.plugins.xrandr.gschema.xml.in.in.h:4 +-msgid "The XRandR plugin will look for a default configuration in the file specified by this key. This is similar to the ~/.config/monitors.xml that normally gets stored in users' home directories. If a user does not have such a file, or has one that does not match the user's setup of monitors, then the file specified by this key will be used instead." +-msgstr "XRandR プラグインはこのキーで指定されたファイルをデフォルトの設定ファイルとして検索します。これは通常、ユーザーのホームディレクトリに保存されている ~/.config/monitors.xml と同様のものです。もしそのようなファイルが無い場合、あるいはあったとしてもモニターの設定に合わない場合、このキーで指定されたファイルが代わりに使われます。" ++#: data/org.gnome.settings-daemon.plugins.power.gschema.xml.in:42 ++msgid "" ++"The action to take when the system power button is pressed. This action is " ++"hard-coded (and the setting ignored) on virtual machines (power off) and " ++"tablets (suspend)." ++msgstr "システムの電源ボタンが押されたときに行うアクションです。このアクションは、仮想マシン (電源オフ) やタブレット (サスペンド) ではハードコードされています (設定は無視されます)。" + +-#: ../data/org.gnome.settings-daemon.plugins.xrandr.gschema.xml.in.in.h:7 +-msgid "Whether to turn off specific monitors after boot" +-msgstr "ブート後に特定のモニターをオフにするかどうか" ++#: data/org.gnome.settings-daemon.plugins.sharing.gschema.xml.in:6 ++msgid "On which connections the service is enabled" ++msgstr "サービスが有効になっている接続" + +-#: ../data/org.gnome.settings-daemon.plugins.xrandr.gschema.xml.in.in.h:8 +-msgid "'clone' will display the same thing on all monitors, 'dock' will switch off the internal monitor, 'do-nothing' will use the default Xorg behaviour (extend the desktop in recent versions). The default, 'follow-lid', will choose between 'do-nothing' and 'dock' depending on whether the lid is (respectively) open or closed." +-msgstr "'clone' はすべてのモニターで同じ表示を行います。'dock' は内部モニターをオフにします。'do-nothing' はデフォルトの Xorg の動作になります (最近のバージョンではデスクトップを拡張します)。デフォルト値となる 'follow-lid' は、蓋が開いているか閉じているかによって、それぞれ 'do-nothing' か 'dock' かどちらかと同じ挙動になります。" ++#: data/org.gnome.settings-daemon.plugins.sharing.gschema.xml.in:7 ++msgid "" ++"The list of NetworkManager connections (each one represented with its UUID) " ++"on which this service is enabled and started." ++msgstr "このサービスが有効化され、開始された NetworkManager 接続のリスト (各接続はその UUID で表されます)。" + +-#: ../data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in.in.h:3 ++#: data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in:6 + msgid "Antialiasing" + msgstr "アンチエイリアス" + +-#: ../data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in.in.h:4 +-msgid "The type of antialiasing to use when rendering fonts. Possible values are: \"none\" for no antialiasing, \"grayscale\" for standard grayscale antialiasing, and \"rgba\" for subpixel antialiasing (LCD screens only)." +-msgstr "フォントを描画する際に使用するアンチエイリアスの種類を指定します。利用可能な値: \"none\" はアンチエイリアスを無効にする、\"grayscale\" は標準的なグレースケールのアンチエイリアス、\"rgba\" はサブピクセルをアンチエイリアスする (LCD 画面の場合のみ)" ++#: data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in:7 ++msgid "" ++"The type of antialiasing to use when rendering fonts. Possible values are: " ++"“none” for no antialiasing, “grayscale” for standard grayscale antialiasing, " ++"and “rgba” for subpixel antialiasing (LCD screens only)." ++msgstr "フォントを描画する際に使用するアンチエイリアスの種類を指定します。利用可能な値: アンチエイリアスを無効にする \"none\"、標準的なグレースケールのアンチエイリアス \"grayscale\"、サブピクセルをアンチエイリアスする \"rgba\" (LCD 画面の場合のみ)。" + +-#: ../data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in.in.h:5 ++#: data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in:11 + msgid "Hinting" + msgstr "ヒンティング" + +-#: ../data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in.in.h:6 +-msgid "The type of hinting to use when rendering fonts. Possible values are: \"none\" for no hinting, \"slight\" for basic, \"medium\" for moderate, and \"full\" for maximum hinting (may cause distortion of letter forms)." +-msgstr "フォントを描画する際に使用するヒンティング (線幅を補正する) の種類を指定します。利用可能な値: \"none\" はヒンティングを無効にする、\"slight\" は基本的なヒンティングのみ、\"medium\" は穏やかなヒンティング、\"full\" は最大限のヒンティング (文字の形状に歪みが発生する可能性あり)" +- +-#: ../data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in.in.h:9 ++#: data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in:12 ++msgid "" ++"The type of hinting to use when rendering fonts. Possible values are: “none” " ++"for no hinting and “slight” for fitting only to the Y-axis like Microsoft’s " ++"ClearType, DirectWrite and Adobe’s proprietary font rendering engine. " ++"Ignores native hinting within the font, generates hints algorithmically. " ++"Used on Ubuntu by default. Recommended. The meaning of “medium” and “full” " ++"depends on the font format (.ttf, .otf, .pfa/.pfb) and the installed version " ++"of FreeType. They usually try to fit glyphs to both the X and the Y axis " ++"(except for .otf: Y-only). This can lead to distortion and/or inconsistent " ++"rendering depending on the quality of the font, the font format and the " ++"state of FreeType’s font engines." ++msgstr "フォントをレンダリングする際に使用するヒンティングのタイプ。指定可能な値: ヒンティングを行わない場合は \"none\"、Microsoft の ClearType や DirectWrite、Adobe の独自のフォントレンダリングエンジンのような Y 軸にのみフィットさせる \"slight\"。フォント内のネイティブヒンティングを無視し、アルゴリズム的にヒンティングを生成します。デフォルトで Ubuntu で使用されています。推奨されています。\"medium\" や \"full\" の意味は、フォントフォーマット (.ttf, .otf, .pfa/.pfb) と、インストールされている FreeType のバージョンによって異なります。これらのフォントは通常、グリフを X 軸と Y 軸の両方に合わせようとします (.otf: Y 軸のみを除く)。これは、フォントの品質やフォントフォーマット、FreeType のフォントエンジンの状態によっては、歪みが生じたり、レンダリングに一貫性がなくなったりする可能性があります。" ++ ++#: data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in:16 + msgid "RGBA order" + msgstr "RGBA の順番" + +-#: ../data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in.in.h:10 +-msgid "The order of subpixel elements on an LCD screen; only used when antialiasing is set to \"rgba\". Possible values are: \"rgb\" for red on left (most common), \"bgr\" for blue on left, \"vrgb\" for red on top, \"vbgr\" for red on bottom." +-msgstr "LCD 画面でサブピクセルの各要素の順番を指定します (これは Antialiasing を \"rgba\" にセットした時にのみ適用されます)。利用可能な値: \"rgb\" は左端が赤色 (最も一般的)、\"bgr\" は左端が青色、\"vrgb\" は上端が赤色、\"vbgr\" は下端が赤色" ++#: data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in:17 ++msgid "" ++"The order of subpixel elements on an LCD screen; only used when antialiasing " ++"is set to “rgba”. Possible values are: “rgb” for red on left (most common), " ++"“bgr” for blue on left, “vrgb” for red on top, “vbgr” for red on bottom." ++msgstr "LCD 画面でサブピクセルの各要素の順番を指定します (これは、アンチエイリアスを \"rgba\" にセットした時にのみ適用されます)。利用可能な値: \"rgb\" (左端が赤色) (最も一般的)、\"bgr\" (左端が青色)、\"vrgb\" (上端が赤色)、\"vbgr\" (下端が赤色)。" + +-#: ../data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in.in.h:11 ++#: data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in:21 + msgid "List of explicitly disabled GTK+ modules" + msgstr "明示的に利用不可能な GTK+ モジュールのリスト" + +-#: ../data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in.in.h:12 +-msgid "A list of strings representing the GTK+ modules that will not be loaded, even if enabled by default in their configuration." ++#: data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in:22 ++msgid "" ++"A list of strings representing the GTK+ modules that will not be loaded, " ++"even if enabled by default in their configuration." + msgstr "ロードしない GTK+ モジュールを示す文字列のリストです。デフォルト設定では有効になっているものも指定できます。" + +-#: ../data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in.in.h:13 ++#: data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in:26 + msgid "List of explicitly enabled GTK+ modules" + msgstr "明示的に利用可能な GTK+ モジュールのリスト" + +-#: ../data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in.in.h:14 +-msgid "A list of strings representing the GTK+ modules that will be loaded, usually in addition to conditional and forcibly disabled ones." ++#: data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in:27 ++msgid "" ++"A list of strings representing the GTK+ modules that will be loaded, usually " ++"in addition to conditional and forcibly disabled ones." + msgstr "ロードする GTK+ モジュールを示す文字列のリストです。デフォルト設定では無効になっているものも指定できます。" + +-#: ../gnome-settings-daemon/main.c:52 +-msgid "Enable debugging code" +-msgstr "デバッグ情報を有効にする" +- +-#: ../gnome-settings-daemon/main.c:53 +-msgid "Replace existing daemon" +-msgstr "既存のデーモンを置き換える" +- +-#: ../gnome-settings-daemon/main.c:54 +-msgid "Exit after a time (for debugging)" +-msgstr "しばらくしてから終了する (デバッグ用)" +- +-#: ../plugins/a11y-keyboard/a11y-keyboard.gnome-settings-plugin.in.h:1 +-msgid "Accessibility Keyboard" +-msgstr "アクセシビリティ・キーボード" +- +-#: ../plugins/a11y-keyboard/a11y-keyboard.gnome-settings-plugin.in.h:2 +-msgid "Accessibility keyboard plugin" +-msgstr "アクセシビリティ・キーボードのプラグイン" +- +-#: ../plugins/a11y-keyboard/gsd-a11y-keyboard-manager.c:400 +-msgid "Slow Keys Turned On" +-msgstr "スローキーをオンにする" +- +-#: ../plugins/a11y-keyboard/gsd-a11y-keyboard-manager.c:401 +-msgid "Slow Keys Turned Off" +-msgstr "スローキーをオフにする" +- +-#: ../plugins/a11y-keyboard/gsd-a11y-keyboard-manager.c:402 +-msgid "You just held down the Shift key for 8 seconds. This is the shortcut for the Slow Keys feature, which affects the way your keyboard works." +-msgstr "[SHIFT] キーを8秒間押下しました。これはスローキー機能のショートカットとして、キーボード操作に影響を与えるものです。" +- +-#: ../plugins/a11y-keyboard/gsd-a11y-keyboard-manager.c:412 +-#: ../plugins/a11y-keyboard/gsd-a11y-keyboard-manager.c:480 +-msgid "Universal Access" +-msgstr "ユニバーサルアクセス" +- +-#: ../plugins/a11y-keyboard/gsd-a11y-keyboard-manager.c:418 +-#: ../plugins/a11y-keyboard/gsd-a11y-keyboard-manager.c:486 +-msgid "Turn Off" +-msgstr "オフにする" +- +-#: ../plugins/a11y-keyboard/gsd-a11y-keyboard-manager.c:418 +-#: ../plugins/a11y-keyboard/gsd-a11y-keyboard-manager.c:486 +-msgid "Turn On" +-msgstr "オンにする" +- +-#: ../plugins/a11y-keyboard/gsd-a11y-keyboard-manager.c:424 +-#: ../plugins/a11y-keyboard/gsd-a11y-keyboard-manager.c:492 +-msgid "Leave On" +-msgstr "オンのままにする" +- +-#: ../plugins/a11y-keyboard/gsd-a11y-keyboard-manager.c:424 +-#: ../plugins/a11y-keyboard/gsd-a11y-keyboard-manager.c:492 +-msgid "Leave Off" +-msgstr "オフのままにする" +- +-#: ../plugins/a11y-keyboard/gsd-a11y-keyboard-manager.c:465 +-msgid "Sticky Keys Turned On" +-msgstr "固定キーをオンにする" +- +-#: ../plugins/a11y-keyboard/gsd-a11y-keyboard-manager.c:466 +-msgid "Sticky Keys Turned Off" +-msgstr "固定キーをオフにする" +- +-#: ../plugins/a11y-keyboard/gsd-a11y-keyboard-manager.c:468 +-msgid "You just pressed the Shift key 5 times in a row. This is the shortcut for the Sticky Keys feature, which affects the way your keyboard works." +-msgstr "[SHIFT] キーを連続して5回押下しました。これは固定キー機能のショートカットとして、キーボード操作に影響を与えるものです。" +- +-#: ../plugins/a11y-keyboard/gsd-a11y-keyboard-manager.c:470 +-msgid "You just pressed two keys at once, or pressed the Shift key 5 times in a row. This turns off the Sticky Keys feature, which affects the way your keyboard works." +-msgstr "同時に2つのキーを押下したか、あるいは [SHIFT] キーを連続して 5回押下しました。これは固定キー機能を無効にし、キーボード操作に影響を与えるものです。" +- +-#: ../plugins/a11y-settings/a11y-settings.gnome-settings-plugin.in.h:1 +-msgid "Accessibility settings" +-msgstr "アクセシビリティの設定" +- +-#: ../plugins/a11y-settings/a11y-settings.gnome-settings-plugin.in.h:2 +-msgid "Accessibility settings plugin" +-msgstr "アクセシビリティの設定プラグイン" +- +-#. Priority=100 +-#: ../plugins/clipboard/clipboard.gnome-settings-plugin.in.h:2 +-msgid "Clipboard" +-msgstr "クリップボード" +- +-#: ../plugins/clipboard/clipboard.gnome-settings-plugin.in.h:3 +-msgid "Clipboard plugin" +-msgstr "クリップボードのプラグイン" +- +-#: ../plugins/color/color.gnome-settings-plugin.in.h:1 +-#: ../plugins/color/gsd-color-calibrate.c:140 ++#: data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in:31 ++msgid "A dictionary of XSETTINGS to override" ++msgstr "オーバーライドする XSETTINGS の辞書" ++ ++#: data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in:32 ++msgid "" ++"This dictionary maps XSETTINGS names to overrides values. The values must be " ++"either strings, signed int32s or (in the case of colors), 4-tuples of uint16 " ++"(red, green, blue, alpha; 65535 is fully opaque)." ++msgstr "この辞書は、XSETTINGS の名前をオーバーライド値にマッピングします。この値は、文字列、符号付きの int32、あるいは (色の場合は) uint16 の 4 つのタプル (赤、緑、青、アルファ、65535 は完全に不透明) のいずれかでなければなりません。" ++ ++#: plugins/color/gsd-color-calibrate.c:139 + msgid "Color" + msgstr "色" + +-#: ../plugins/color/color.gnome-settings-plugin.in.h:2 +-msgid "Color plugin" +-msgstr "カラープラグイン" +- +-#: ../plugins/color/gsd-color-calibrate.c:145 ++#. TRANSLATORS: button: this is to open GCM ++#: plugins/color/gsd-color-calibrate.c:145 + msgid "Recalibrate now" + msgstr "再キャリブレーションを行う" + + #. TRANSLATORS: this is when the device has not been recalibrated in a while +-#: ../plugins/color/gsd-color-calibrate.c:188 ++#: plugins/color/gsd-color-calibrate.c:188 + msgid "Recalibration required" + msgstr "再キャリブレーションが要求されています" + + #. TRANSLATORS: this is when the display has not been recalibrated in a while +-#: ../plugins/color/gsd-color-calibrate.c:200 ++#: plugins/color/gsd-color-calibrate.c:200 + #, c-format +-msgid "The display '%s' should be recalibrated soon." +-msgstr "ディスプレイ '%s' は、すぐに再キャリブレーションすべきです。" ++msgid "The display “%s” should be recalibrated soon." ++msgstr "ディスプレイ '%s' は、すぐに再キャリブレーションする必要があります。" + + #. TRANSLATORS: this is when the printer has not been recalibrated in a while +-#: ../plugins/color/gsd-color-calibrate.c:209 ++#: plugins/color/gsd-color-calibrate.c:209 + #, c-format +-msgid "The printer '%s' should be recalibrated soon." +-msgstr "プリンター '%s' は、すぐに再キャリブレーションすべきです。" ++msgid "The printer “%s” should be recalibrated soon." ++msgstr "プリンター '%s' は、すぐに再キャリブレーションする必要があります。" + + #. TRANSLATORS: this is the application name +-#: ../plugins/color/gsd-color-calibrate.c:347 +-#: ../plugins/color/gsd-color-calibrate.c:363 ++#: plugins/color/gsd-color-calibrate.c:347 ++#: plugins/color/gsd-color-calibrate.c:363 + msgid "GNOME Settings Daemon Color Plugin" + msgstr "GNOME 設定デーモンのカラープラグイン" + + #. TRANSLATORS: this is a sound description +-#: ../plugins/color/gsd-color-calibrate.c:349 ++#: plugins/color/gsd-color-calibrate.c:349 + msgid "Color calibration device added" + msgstr "カラーキャリブレーションデバイスが追加されました" + + #. TRANSLATORS: this is a sound description +-#: ../plugins/color/gsd-color-calibrate.c:365 ++#: plugins/color/gsd-color-calibrate.c:365 + msgid "Color calibration device removed" + msgstr "カラーキャリブレーションデバイスが取り外されました" + +-#. Priority=100 +-#: ../plugins/cursor/cursor.gnome-settings-plugin.in.h:2 +-msgid "Cursor" +-msgstr "カーソル" +- +-#: ../plugins/cursor/cursor.gnome-settings-plugin.in.h:3 +-msgid "Show/hide cursor on tablet devices" +-msgstr "タブレットデバイスでカーソルの表示/非表示を行います" +- +-#. Priority=100 +-#: ../plugins/datetime/datetime.gnome-settings-plugin.in.h:2 +-msgid "Date and Time" +-msgstr "日付と時刻" +- +-#: ../plugins/datetime/datetime.gnome-settings-plugin.in.h:3 +-msgid "Automatically update timezone and display notifications" +-msgstr "自動的にタイムゾーンを更新して通知を表示します" +- + #. Translators: UTC here means the Coordinated Universal Time. + #. * %:::z will be replaced by the offset from UTC e.g. UTC+02 +-#: ../plugins/datetime/gsd-datetime-manager.c:104 ++#: plugins/datetime/gsd-datetime-manager.c:88 + msgid "UTC%:::z" + msgstr "UTC%:::z" + +-#: ../plugins/datetime/gsd-datetime-manager.c:108 ++#: plugins/datetime/gsd-datetime-manager.c:92 + #, c-format + msgid "Time Zone Updated to %s (%s)" + msgstr "タイムゾーンの更新: %s (%s)" + +-#: ../plugins/datetime/gsd-datetime-manager.c:128 ++#: plugins/datetime/gsd-datetime-manager.c:108 ++msgid "Settings" ++msgstr "設定" ++ ++#: plugins/datetime/gsd-datetime-manager.c:118 + msgid "Date & Time Settings" + msgstr "日付と時刻の設定" + +-#: ../plugins/datetime/gsd-datetime-manager.c:136 +-msgid "Settings" +-msgstr "設定" ++#: plugins/housekeeping/gsd-disk-space.c:575 ++msgid "Disk Space" ++msgstr "ディスクの空き容量" + +-#: ../plugins/dummy/dummy.gnome-settings-plugin.in.h:1 +-msgid "Dummy" +-msgstr "ダミー" ++#: plugins/housekeeping/gsd-disk-space.c:588 ++msgid "Examine" ++msgstr "検査" ++ ++#: plugins/housekeeping/gsd-disk-space.c:599 ++msgid "Empty Trash" ++msgstr "ゴミ箱を空にする" + +-#: ../plugins/dummy/dummy.gnome-settings-plugin.in.h:2 +-msgid "Dummy plugin" +-msgstr "ダミーのプラグイン" ++#: plugins/housekeeping/gsd-disk-space.c:607 ++msgid "Ignore" ++msgstr "無視" + +-#: ../plugins/housekeeping/gsd-disk-space.c:588 ++#: plugins/housekeeping/gsd-disk-space.c:638 + #, c-format +-msgid "Low Disk Space on \"%s\"" +-msgstr "\"%s\" ディスクの空き容量が少なくなりました" ++msgid "Low Disk Space on “%s”" ++msgstr "\"%s\" の空き容量が少なくなりました" + +-#: ../plugins/housekeeping/gsd-disk-space.c:590 ++#: plugins/housekeeping/gsd-disk-space.c:640 + #, c-format +-msgid "The volume \"%s\" has only %s disk space remaining. You may free up some space by emptying the trash." +-msgstr "ボリューム \"%s\" にはディスクの残りが %s しかありません。ゴミ箱を空にして容量を増やしましょう。" ++msgid "" ++"The volume “%s” has only %s disk space remaining. You may free up some " ++"space by emptying the trash." ++msgstr "ボリューム \"%s\" にはディスクの残りが %s しかありません。ゴミ箱を空にすることで容量を開放できることがあります。" + +-#: ../plugins/housekeeping/gsd-disk-space.c:594 +-#: ../plugins/housekeeping/gsd-ldsm-dialog.c:81 ++#: plugins/housekeeping/gsd-disk-space.c:644 + #, c-format +-msgid "The volume \"%s\" has only %s disk space remaining." ++msgid "The volume “%s” has only %s disk space remaining." + msgstr "ボリューム \"%s\" にはディスクの残りが %s しかありません。" + +-#. Set up all the window stuff here +-#: ../plugins/housekeeping/gsd-disk-space.c:599 +-#: ../plugins/housekeeping/gsd-ldsm-dialog.c:205 ++#: plugins/housekeeping/gsd-disk-space.c:649 + msgid "Low Disk Space" + msgstr "ディスクの空き容量が少ないです" + +-#: ../plugins/housekeeping/gsd-disk-space.c:601 ++#: plugins/housekeeping/gsd-disk-space.c:651 + #, c-format +-msgid "This computer has only %s disk space remaining. You may free up some space by emptying the trash." ++msgid "" ++"This computer has only %s disk space remaining. You may free up some space " ++"by emptying the trash." + msgstr "このコンピューターにはディスクの残りが %s しかありません。ゴミ箱を空にして容量を増やしましょう。" + +-#: ../plugins/housekeeping/gsd-disk-space.c:604 +-#: ../plugins/housekeeping/gsd-ldsm-dialog.c:84 ++#: plugins/housekeeping/gsd-disk-space.c:654 + #, c-format + msgid "This computer has only %s disk space remaining." + msgstr "このコンピューターにはディスクの残りが %s しかありません。" + +-#: ../plugins/housekeeping/gsd-disk-space.c:619 +-msgid "Disk space" +-msgstr "ディスクの空き容量" +- +-#: ../plugins/housekeeping/gsd-disk-space.c:626 +-msgid "Examine" +-msgstr "検査" +- +-#: ../plugins/housekeeping/gsd-disk-space.c:634 +-#: ../plugins/housekeeping/gsd-ldsm-dialog.c:434 +-msgid "Empty Trash" +-msgstr "ゴミ箱を空にする" +- +-#: ../plugins/housekeeping/gsd-disk-space.c:641 +-#: ../plugins/housekeeping/gsd-ldsm-dialog.c:449 +-msgid "Ignore" +-msgstr "無視" +- +-#: ../plugins/housekeeping/gsd-ldsm-dialog.c:66 +-msgid "Don't show any warnings again for this file system" +-msgstr "このファイルシステムの警告は一切表示しない" +- +-#: ../plugins/housekeeping/gsd-ldsm-dialog.c:68 +-msgid "Don't show any warnings again" +-msgstr "警告を一切表示しない" +- +-#: ../plugins/housekeeping/gsd-ldsm-dialog.c:100 +-msgid "You can free up disk space by emptying the Trash, removing unused programs or files, or moving files to another disk or partition." +-msgstr "ゴミ箱を空にしたり、使っていないプログラムやファイルを削除したり、他のディスクやパーティションにファイルを移動することで、ディスクの空き容量を増やせます。" +- +-#: ../plugins/housekeeping/gsd-ldsm-dialog.c:103 +-msgid "You can free up disk space by removing unused programs or files, or by moving files to another disk or partition." +-msgstr "使っていないプログラムやファイルを削除したり、他のディスクやパーティションにファイルを移動することで、ディスク容量を増やせます。" +- +-#: ../plugins/housekeeping/gsd-ldsm-dialog.c:108 +-msgid "You can free up disk space by emptying the Trash, removing unused programs or files, or moving files to an external disk." +-msgstr "ゴミ箱を空にしたり、使っていないプログラムやファイルを削除したり、外付けディスクにファイルを移動することで、ディスクの空き容量を増やせます。" ++#: plugins/media-keys/gsd-media-keys-manager.c:2288 ++msgid "Bluetooth disabled" ++msgstr "Bluetooth 無効" + +-#: ../plugins/housekeeping/gsd-ldsm-dialog.c:111 +-msgid "You can free up disk space by removing unused programs or files, or by moving files to an external disk." +-msgstr "使っていないプログラムやファイルを削除したり、外付けディスクにファイルを移動することで、ディスクの空き容量を増やせます。" ++#: plugins/media-keys/gsd-media-keys-manager.c:2291 ++msgid "Bluetooth enabled" ++msgstr "Bluetooth 有効" + +-#: ../plugins/housekeeping/gsd-ldsm-dialog.c:442 +-msgid "Examine…" +-msgstr "調査中…" ++#: plugins/media-keys/gsd-media-keys-manager.c:2295 ++msgid "Airplane mode enabled" ++msgstr "機内モード有効" + +-#: ../plugins/housekeeping/housekeeping.gnome-settings-plugin.in.h:1 +-msgid "Housekeeping" +-msgstr "ハウスキーピング" ++#: plugins/media-keys/gsd-media-keys-manager.c:2298 ++msgid "Airplane mode disabled" ++msgstr "機内モード無効" + +-#: ../plugins/housekeeping/housekeeping.gnome-settings-plugin.in.h:2 +-msgid "Automatically prunes thumbnail caches and other transient files, and warns about low disk space" +-msgstr "不要なサムネイルキャッシュやその他の一時ファイルを削除し、ディスクスペースの容量が小さくなれば警告します" ++#: plugins/media-keys/gsd-media-keys-manager.c:2326 ++msgid "Hardware Airplane Mode" ++msgstr "ハードウェア機内モード" + +-#. TRANSLATORS: wireless keyboard with internal battery +-#: ../plugins/keyboard/keyboard.gnome-settings-plugin.in.h:1 +-#: ../plugins/power/gpm-common.c:611 +-msgid "Keyboard" +-msgid_plural "Keyboards" +-msgstr[0] "キーボード" +- +-#: ../plugins/keyboard/keyboard.gnome-settings-plugin.in.h:2 +-msgid "Keyboard plugin" +-msgstr "キーボードプラグイン" +- +-#: ../plugins/media-keys/gsd-media-keys-manager.c:2020 ++#. Translators: this is a filename used for screencast ++#. * recording, where "%d" and "%t" date and time, e.g. ++#. * "Screencast from 07-17-2013 10:00:46 PM.webm" ++#: plugins/media-keys/gsd-media-keys-manager.c:2392 ++#, no-c-format + msgid "Screencast from %d %t.webm" +-msgstr "Screencast from %d %t.webm" ++msgstr "%d %t.webm のスクリーンショット" + +-#: ../plugins/media-keys/gsd-screenshot-utils.c:84 ++#: plugins/media-keys/gsd-screenshot-utils.c:82 + msgid "Unable to capture a screenshot" + msgstr "スクリーンショットの撮影に失敗" + +-#: ../plugins/media-keys/gsd-screenshot-utils.c:115 +-#: ../plugins/media-keys/gsd-screenshot-utils.c:155 ++#: plugins/media-keys/gsd-screenshot-utils.c:113 ++#: plugins/media-keys/gsd-screenshot-utils.c:155 + msgid "Screenshot taken" + msgstr "スクリーンショットを撮影" + + #. translators: this is the name of the file that gets made up + #. * with the screenshot +-#: ../plugins/media-keys/gsd-screenshot-utils.c:304 ++#: plugins/media-keys/gsd-screenshot-utils.c:306 + #, c-format + msgid "Screenshot from %s" +-msgstr "Screenshot from %s" +- +-#. translators: +-#. * The device has been disabled +-#: ../plugins/media-keys/gvc/gvc-mixer-control.c:1830 +-msgid "Disabled" +-msgstr "無効" +- +-#. translators: +-#. * The number of sound outputs on a particular device +-#: ../plugins/media-keys/gvc/gvc-mixer-control.c:1837 +-#, c-format +-msgid "%u Output" +-msgid_plural "%u Outputs" +-msgstr[0] "%u 出力" +- +-#. translators: +-#. * The number of sound inputs on a particular device +-#: ../plugins/media-keys/gvc/gvc-mixer-control.c:1847 +-#, c-format +-msgid "%u Input" +-msgid_plural "%u Inputs" +-msgstr[0] "%u 入力" +- +-#: ../plugins/media-keys/gvc/gvc-mixer-control.c:2371 +-msgid "System Sounds" +-msgstr "システムの効果音" ++msgstr "%s のスクリーンショット" + +-#. Priority=100 +-#: ../plugins/media-keys/media-keys.gnome-settings-plugin.in.h:2 +-msgid "Media keys" +-msgstr "メディアキー" +- +-#: ../plugins/media-keys/media-keys.gnome-settings-plugin.in.h:3 +-msgid "Media keys plugin" +-msgstr "メディアキーのプラグイン" +- +-#: ../plugins/media-keys/shortcuts-list.h:101 ++#: plugins/media-keys/shortcuts-list.h:46 ++#: plugins/media-keys/shortcuts-list.h:47 + msgid "Touchpad toggle" + msgstr "タッチパッドの切り替え" + +-#: ../plugins/media-keys/shortcuts-list.h:102 ++#: plugins/media-keys/shortcuts-list.h:48 + msgid "Touchpad On" + msgstr "タッチパッドをオン" + +-#: ../plugins/media-keys/shortcuts-list.h:103 ++#: plugins/media-keys/shortcuts-list.h:49 + msgid "Touchpad Off" + msgstr "タッチパッドをオフ" + +-#: ../plugins/media-keys/shortcuts-list.h:107 +-#: ../plugins/media-keys/shortcuts-list.h:108 +-msgid "Microphone Mute" +-msgstr "マイクミュート" +- +-#: ../plugins/media-keys/shortcuts-list.h:109 ++#: plugins/media-keys/shortcuts-list.h:56 + msgid "Quiet Volume Mute" + msgstr "ミュートにする" + +-#: ../plugins/media-keys/shortcuts-list.h:110 ++#: plugins/media-keys/shortcuts-list.h:57 + msgid "Quiet Volume Down" + msgstr "音量を下げる" + +-#: ../plugins/media-keys/shortcuts-list.h:111 ++#: plugins/media-keys/shortcuts-list.h:58 + msgid "Quiet Volume Up" + msgstr "音量を上げる" + +-#: ../plugins/media-keys/shortcuts-list.h:120 ++#: plugins/media-keys/shortcuts-list.h:59 ++msgid "Precise Volume Down" ++msgstr "音量を正確に下げる" ++ ++#: plugins/media-keys/shortcuts-list.h:60 ++msgid "Precise Volume Up" ++msgstr "音量を正確に上げる" ++ ++#: plugins/media-keys/shortcuts-list.h:70 + msgid "Lock Screen" + msgstr "画面をロックする" + +-#: ../plugins/media-keys/shortcuts-list.h:135 ++#: plugins/media-keys/shortcuts-list.h:72 ++msgid "Help" ++msgstr "ヘルプ" ++ ++#: plugins/media-keys/shortcuts-list.h:89 + msgid "Rewind" + msgstr "巻き戻し" + +-#: ../plugins/media-keys/shortcuts-list.h:136 ++#: plugins/media-keys/shortcuts-list.h:90 + msgid "Forward" + msgstr "早送り" + +-#: ../plugins/media-keys/shortcuts-list.h:137 ++#: plugins/media-keys/shortcuts-list.h:91 + msgid "Repeat" + msgstr "リピート" + +-#: ../plugins/media-keys/shortcuts-list.h:138 ++#: plugins/media-keys/shortcuts-list.h:92 + msgid "Random Play" + msgstr "ランダム再生" + +-#. Key code of the XF86Display key (Fn-F7 on Thinkpads, Fn-F4 on HP machines, etc.) +-#: ../plugins/media-keys/shortcuts-list.h:139 +-#: ../plugins/media-keys/shortcuts-list.h:141 +-msgid "Video Out" +-msgstr "ビデオ出力" +- +-#. Key code of the XF86RotateWindows key (present on some tablets) +-#: ../plugins/media-keys/shortcuts-list.h:143 +-msgid "Rotate Screen" +-msgstr "画面回転" +- +-#: ../plugins/media-keys/shortcuts-list.h:144 ++#: plugins/media-keys/shortcuts-list.h:93 + msgid "Orientation Lock" + msgstr "画面方向ロック" + +-#: ../plugins/media-keys/shortcuts-list.h:153 ++#: plugins/media-keys/shortcuts-list.h:102 + msgid "Power Off" + msgstr "電源オフ" + + #. the kernel / Xorg names really are like this... + #. translators: "Sleep" means putting the machine to sleep, either through hibernate or suspend +-#: ../plugins/media-keys/shortcuts-list.h:156 ++#: plugins/media-keys/shortcuts-list.h:105 + msgid "Sleep" + msgstr "スリープ" + +-#: ../plugins/media-keys/shortcuts-list.h:157 ++#: plugins/media-keys/shortcuts-list.h:106 + msgid "Suspend" + msgstr "サスペンド" + +-#: ../plugins/media-keys/shortcuts-list.h:158 ++#: plugins/media-keys/shortcuts-list.h:107 + msgid "Hibernate" + msgstr "ハイバーネート" + +-#: ../plugins/media-keys/shortcuts-list.h:159 ++#: plugins/media-keys/shortcuts-list.h:108 + msgid "Brightness Up" + msgstr "明るさを上げる" + +-#: ../plugins/media-keys/shortcuts-list.h:160 ++#: plugins/media-keys/shortcuts-list.h:109 + msgid "Brightness Down" + msgstr "明るさを下げる" + +-#: ../plugins/media-keys/shortcuts-list.h:161 ++#: plugins/media-keys/shortcuts-list.h:110 + msgid "Keyboard Brightness Up" + msgstr "キーボードの明るさを上げる" + +-#: ../plugins/media-keys/shortcuts-list.h:162 ++#: plugins/media-keys/shortcuts-list.h:111 + msgid "Keyboard Brightness Down" + msgstr "キーボードの明るさを下げる" + +-#: ../plugins/media-keys/shortcuts-list.h:163 ++#: plugins/media-keys/shortcuts-list.h:112 + msgid "Keyboard Brightness Toggle" + msgstr "キーボードライトの切り替え" + +-#: ../plugins/media-keys/shortcuts-list.h:164 ++#: plugins/media-keys/shortcuts-list.h:113 + msgid "Battery Status" + msgstr "バッテリー状態" + +-#. TRANSLATORS: wireless mice with internal batteries +-#: ../plugins/mouse/mouse.gnome-settings-plugin.in.h:1 +-#: ../plugins/power/gpm-common.c:607 +-msgid "Mouse" +-msgid_plural "Mice" +-msgstr[0] "マウス" ++#: plugins/media-keys/shortcuts-list.h:114 ++#: plugins/media-keys/shortcuts-list.h:115 ++#: plugins/media-keys/shortcuts-list.h:116 ++msgid "Toggle Airplane Mode" ++msgstr "機内モードの切り替え" + +-#: ../plugins/mouse/mouse.gnome-settings-plugin.in.h:2 +-msgid "Mouse plugin" +-msgstr "マウスプラグイン" ++#: plugins/media-keys/shortcuts-list.h:117 ++msgid "Toggle Bluetooth" ++msgstr "Bluetooth の切り替え" + +-#. Priority=100 +-#: ../plugins/orientation/orientation.gnome-settings-plugin.in.h:2 +-msgid "Orientation" +-msgstr "画面の向き" +- +-#: ../plugins/orientation/orientation.gnome-settings-plugin.in.h:3 +-msgid "Orientation plugin" +-msgstr "画面方向プラグイン" +- +-#: ../plugins/power/gpm-common.c:73 ++#: plugins/power/gpm-common.c:92 + msgid "Unknown time" + msgstr "残り時間不明" + +-#: ../plugins/power/gpm-common.c:78 ++#: plugins/power/gpm-common.c:97 + #, c-format + msgid "%i minute" + msgid_plural "%i minutes" + msgstr[0] "%i 分" + +-#: ../plugins/power/gpm-common.c:88 ++#: plugins/power/gpm-common.c:107 + #, c-format + msgid "%i hour" + msgid_plural "%i hours" +@@ -1387,1600 +1249,1816 @@ msgstr[0] "%i 時間" + + #. TRANSLATOR: "%i %s %i %s" are "%i hours %i minutes" + #. * Swap order with "%2$s %2$i %1$s %1$i if needed +-#: ../plugins/power/gpm-common.c:94 ++#: plugins/power/gpm-common.c:113 + #, c-format + msgid "%i %s %i %s" + msgstr "%i %s %i %s" + +-#: ../plugins/power/gpm-common.c:95 ++#: plugins/power/gpm-common.c:114 + msgid "hour" + msgid_plural "hours" + msgstr[0] "時間" + +-#: ../plugins/power/gpm-common.c:96 ++#: plugins/power/gpm-common.c:115 + msgid "minute" + msgid_plural "minutes" + msgstr[0] "分" + +-#. TRANSLATORS: The laptop battery is charged, and we know a time. +-#. * The parameter is the time, e.g. 7 hours 6 minutes +-#: ../plugins/power/gpm-common.c:343 +-#, c-format +-msgid "provides %s laptop runtime" +-msgstr "あと %s ノート PC のバッテリーで動作できます" +- +-#. TRANSLATORS: the device is discharging, and we have a time remaining +-#. * The first parameter is the device type, e.g. "Laptop battery" and +-#. * the second is the time, e.g. 7 hours 6 minutes +-#: ../plugins/power/gpm-common.c:354 +-#, c-format +-msgid "%s %s remaining" +-msgstr "残り %s %s" +- +-#. TRANSLATORS: device is charging, and we have a time to full and a percentage +-#. * The first parameter is the device type, e.g. "Laptop battery" and +-#. * the second is the time, e.g. "7 hours 6 minutes" +-#. TRANSLATORS: device is charging, and we have a time to full and a percentage. +-#. * The first parameter is the device type, e.g. "Laptop battery" and +-#. * the second is the time, e.g. "7 hours 6 minutes" +-#: ../plugins/power/gpm-common.c:375 ../plugins/power/gpm-common.c:392 +-#, c-format +-msgid "%s %s until charged" +-msgstr "充電完了まで %s %s" +- +-#. TRANSLATORS: the device is charging, and we have a time to full and empty. +-#. * The parameter is a time string, e.g. "7 hours 6 minutes" +-#: ../plugins/power/gpm-common.c:382 +-#, c-format +-msgid "provides %s battery runtime" +-msgstr "あと %s バッテリーで動作できます" +- +-#. TRANSLATORS: the type of data, e.g. Laptop battery +-#: ../plugins/power/gpm-common.c:473 +-msgid "Product:" +-msgstr "プロダクト:" +- +-#. TRANSLATORS: device is missing +-#. TRANSLATORS: device is charged +-#. TRANSLATORS: device is charging +-#. TRANSLATORS: device is discharging +-#: ../plugins/power/gpm-common.c:477 ../plugins/power/gpm-common.c:480 +-#: ../plugins/power/gpm-common.c:483 ../plugins/power/gpm-common.c:486 +-msgid "Status:" +-msgstr "状態:" +- +-#: ../plugins/power/gpm-common.c:477 +-msgid "Missing" +-msgstr "不明" +- +-#. TRANSLATORS: battery state +-#: ../plugins/power/gpm-common.c:480 ../plugins/power/gpm-common.c:749 +-msgid "Charged" +-msgstr "充電完了" +- +-#. TRANSLATORS: battery state +-#: ../plugins/power/gpm-common.c:483 ../plugins/power/gpm-common.c:737 +-msgid "Charging" +-msgstr "充電中" +- +-#. TRANSLATORS: battery state +-#: ../plugins/power/gpm-common.c:486 ../plugins/power/gpm-common.c:741 +-msgid "Discharging" +-msgstr "放電中" +- +-#. TRANSLATORS: percentage +-#: ../plugins/power/gpm-common.c:491 +-msgid "Percentage charge:" +-msgstr "充電率:" +- +-#. TRANSLATORS: manufacturer +-#: ../plugins/power/gpm-common.c:495 +-msgid "Vendor:" +-msgstr "ベンダー:" +- +-#. TRANSLATORS: how the battery is made, e.g. Lithium Ion +-#: ../plugins/power/gpm-common.c:500 +-msgid "Technology:" +-msgstr "種別:" +- +-#. TRANSLATORS: serial number of the battery +-#: ../plugins/power/gpm-common.c:504 +-msgid "Serial number:" +-msgstr "シリアル番号:" +- +-#. TRANSLATORS: model number of the battery +-#: ../plugins/power/gpm-common.c:508 +-msgid "Model:" +-msgstr "モデル:" +- +-#. TRANSLATORS: time to fully charged +-#: ../plugins/power/gpm-common.c:513 +-msgid "Charge time:" +-msgstr "充電時間:" +- +-#. TRANSLATORS: time to empty +-#: ../plugins/power/gpm-common.c:519 +-msgid "Discharge time:" +-msgstr "放電時間:" +- +-#. TRANSLATORS: Excellent, Good, Fair and Poor are all related to battery Capacity +-#: ../plugins/power/gpm-common.c:526 +-msgid "Excellent" +-msgstr "優" +- +-#: ../plugins/power/gpm-common.c:528 +-msgid "Good" +-msgstr "良" +- +-#: ../plugins/power/gpm-common.c:530 +-msgid "Fair" +-msgstr "可" +- +-#: ../plugins/power/gpm-common.c:532 +-msgid "Poor" +-msgstr "不可" +- +-#: ../plugins/power/gpm-common.c:536 +-msgid "Capacity:" +-msgstr "容量:" +- +-#: ../plugins/power/gpm-common.c:542 ../plugins/power/gpm-common.c:567 +-msgid "Current charge:" +-msgstr "現在の充電状態:" +- +-#: ../plugins/power/gpm-common.c:548 +-msgid "Last full charge:" +-msgstr "最近の完全充電:" +- +-# 直訳すると、デザイン料?定格充電としておく。 +-#: ../plugins/power/gpm-common.c:554 ../plugins/power/gpm-common.c:572 +-msgid "Design charge:" +-msgstr "定格充電:" +- +-#: ../plugins/power/gpm-common.c:559 +-msgid "Charge rate:" +-msgstr "充電率:" +- +-#. TRANSLATORS: system power cord +-#: ../plugins/power/gpm-common.c:591 +-msgid "AC adapter" +-msgid_plural "AC adapters" +-msgstr[0] "AC アダプター" +- +-#. TRANSLATORS: laptop primary battery +-#: ../plugins/power/gpm-common.c:595 +-msgid "Laptop battery" +-msgid_plural "Laptop batteries" +-msgstr[0] "ノート PC のバッテリー" +- +-#. TRANSLATORS: battery-backed AC power source +-#: ../plugins/power/gpm-common.c:599 +-msgid "UPS" +-msgid_plural "UPSs" +-msgstr[0] "UPS" +- +-#. TRANSLATORS: a monitor is a device to measure voltage and current +-#: ../plugins/power/gpm-common.c:603 +-msgid "Monitor" +-msgid_plural "Monitors" +-msgstr[0] "モニター" +- +-#. TRANSLATORS: portable device +-#: ../plugins/power/gpm-common.c:615 +-msgid "PDA" +-msgid_plural "PDAs" +-msgstr[0] "PDA" +- +-#. TRANSLATORS: cell phone (mobile...) +-#: ../plugins/power/gpm-common.c:619 +-msgid "Cell phone" +-msgid_plural "Cell phones" +-msgstr[0] "携帯電話" +- +-#. TRANSLATORS: media player, mp3 etc +-#: ../plugins/power/gpm-common.c:624 +-msgid "Media player" +-msgid_plural "Media players" +-msgstr[0] "メディアプレーヤー" +- +-#. TRANSLATORS: tablet device +-#: ../plugins/power/gpm-common.c:628 +-msgid "Tablet" +-msgid_plural "Tablets" +-msgstr[0] "タブレット" +- +-#. TRANSLATORS: tablet device +-#: ../plugins/power/gpm-common.c:632 +-msgid "Computer" +-msgid_plural "Computers" +-msgstr[0] "コンピューター" +- +-#. TRANSLATORS: battery technology +-#: ../plugins/power/gpm-common.c:696 +-msgid "Lithium Ion" +-msgstr "リチウムイオン" +- +-#. TRANSLATORS: battery technology +-#: ../plugins/power/gpm-common.c:700 +-msgid "Lithium Polymer" +-msgstr "リチウムポリマー" +- +-#. TRANSLATORS: battery technology +-#: ../plugins/power/gpm-common.c:704 +-msgid "Lithium Iron Phosphate" +-msgstr "リン酸鉄リチウムイオン" +- +-#. TRANSLATORS: battery technology +-#: ../plugins/power/gpm-common.c:708 +-msgid "Lead acid" +-msgstr "鉛蓄電池" +- +-#. TRANSLATORS: battery technology +-#: ../plugins/power/gpm-common.c:712 +-msgid "Nickel Cadmium" +-msgstr "ニッケルカドミウム" +- +-#. TRANSLATORS: battery technology +-#: ../plugins/power/gpm-common.c:716 +-msgid "Nickel metal hydride" +-msgstr "ニッケル水素" +- +-#. TRANSLATORS: battery technology +-#: ../plugins/power/gpm-common.c:720 +-msgid "Unknown technology" +-msgstr "種別不明" +- +-#. TRANSLATORS: battery state +-#: ../plugins/power/gpm-common.c:745 +-msgid "Empty" +-msgstr "空" +- +-#. TRANSLATORS: battery state +-#: ../plugins/power/gpm-common.c:753 +-msgid "Waiting to charge" +-msgstr "充電待ち" +- +-#. TRANSLATORS: battery state +-#: ../plugins/power/gpm-common.c:757 +-msgid "Waiting to discharge" +-msgstr "放電待ち" +- +-#. TRANSLATORS: device not present +-#: ../plugins/power/gpm-common.c:785 +-msgid "Laptop battery not present" +-msgstr "ノート PC のバッテリーがありません" +- +-#. TRANSLATORS: battery state +-#: ../plugins/power/gpm-common.c:789 +-msgid "Laptop battery is charging" +-msgstr "ノート PC のバッテリーの充電中" +- +-#. TRANSLATORS: battery state +-#: ../plugins/power/gpm-common.c:793 +-msgid "Laptop battery is discharging" +-msgstr "ノート PC のバッテリーの放電中" +- +-#. TRANSLATORS: battery state +-#: ../plugins/power/gpm-common.c:797 +-msgid "Laptop battery is empty" +-msgstr "ノート PC のバッテリーが空です" +- +-#. TRANSLATORS: battery state +-#: ../plugins/power/gpm-common.c:801 +-msgid "Laptop battery is charged" +-msgstr "ノート PC のバッテリーの充電完了" +- +-#. TRANSLATORS: battery state +-#: ../plugins/power/gpm-common.c:805 +-msgid "Laptop battery is waiting to charge" +-msgstr "ノート PC のバッテリーの充電待ちです" +- +-#. TRANSLATORS: battery state +-#: ../plugins/power/gpm-common.c:809 +-msgid "Laptop battery is waiting to discharge" +-msgstr "ノート PC のバッテリーの放電待ちです" +- +-#. TRANSLATORS: battery state +-#: ../plugins/power/gpm-common.c:818 +-msgid "UPS is charging" +-msgstr "UPS の充電中" +- +-#. TRANSLATORS: battery state +-#: ../plugins/power/gpm-common.c:822 +-msgid "UPS is discharging" +-msgstr "UPS の放電中" +- +-#. TRANSLATORS: battery state +-#: ../plugins/power/gpm-common.c:826 +-msgid "UPS is empty" +-msgstr "UPS のバッテリーが空です" +- +-#. TRANSLATORS: battery state +-#: ../plugins/power/gpm-common.c:830 +-msgid "UPS is charged" +-msgstr "UPS の充電完了" +- +-#. TRANSLATORS: battery state +-#: ../plugins/power/gpm-common.c:839 +-msgid "Mouse is charging" +-msgstr "マウスの充電中" +- +-#. TRANSLATORS: battery state +-#: ../plugins/power/gpm-common.c:843 +-msgid "Mouse is discharging" +-msgstr "マウスの放電中" +- +-#. TRANSLATORS: battery state +-#: ../plugins/power/gpm-common.c:847 +-msgid "Mouse is empty" +-msgstr "マウスのバッテリーが空です" +- +-#. TRANSLATORS: battery state +-#: ../plugins/power/gpm-common.c:851 +-msgid "Mouse is charged" +-msgstr "マウスの充電完了" +- +-#. TRANSLATORS: battery state +-#: ../plugins/power/gpm-common.c:860 +-msgid "Keyboard is charging" +-msgstr "キーボードの充電中" +- +-#. TRANSLATORS: battery state +-#: ../plugins/power/gpm-common.c:864 +-msgid "Keyboard is discharging" +-msgstr "キーボードの放電中" +- +-#. TRANSLATORS: battery state +-#: ../plugins/power/gpm-common.c:868 +-msgid "Keyboard is empty" +-msgstr "キーボードのバッテリーが空です" +- +-#. TRANSLATORS: battery state +-#: ../plugins/power/gpm-common.c:872 +-msgid "Keyboard is charged" +-msgstr "キーボードの充電完了" +- +-#. TRANSLATORS: battery state +-#: ../plugins/power/gpm-common.c:881 +-msgid "PDA is charging" +-msgstr "PDA の充電中" +- +-#. TRANSLATORS: battery state +-#: ../plugins/power/gpm-common.c:885 +-msgid "PDA is discharging" +-msgstr "PDA の放電中" +- +-#. TRANSLATORS: battery state +-#: ../plugins/power/gpm-common.c:889 +-msgid "PDA is empty" +-msgstr "PDA のバッテリーが空です" +- +-#. TRANSLATORS: battery state +-#: ../plugins/power/gpm-common.c:893 +-msgid "PDA is charged" +-msgstr "PDA の充電完了" +- +-#. TRANSLATORS: battery state +-#: ../plugins/power/gpm-common.c:902 +-msgid "Cell phone is charging" +-msgstr "携帯電話の充電中" +- +-#. TRANSLATORS: battery state +-#: ../plugins/power/gpm-common.c:906 +-msgid "Cell phone is discharging" +-msgstr "携帯電話の放電中" +- +-#. TRANSLATORS: battery state +-#: ../plugins/power/gpm-common.c:910 +-msgid "Cell phone is empty" +-msgstr "携帯電話のバッテリーが空です" +- +-#. TRANSLATORS: battery state +-#: ../plugins/power/gpm-common.c:914 +-msgid "Cell phone is charged" +-msgstr "携帯電話の充電完了" +- +-#. TRANSLATORS: battery state +-#: ../plugins/power/gpm-common.c:924 +-msgid "Media player is charging" +-msgstr "メディアプレーヤーの充電中" +- +-#. TRANSLATORS: battery state +-#: ../plugins/power/gpm-common.c:928 +-msgid "Media player is discharging" +-msgstr "メディアプレーヤーの放電中" +- +-#. TRANSLATORS: battery state +-#: ../plugins/power/gpm-common.c:932 +-msgid "Media player is empty" +-msgstr "メディアプレーヤーのバッテリーが空です" +- +-#. TRANSLATORS: battery state +-#: ../plugins/power/gpm-common.c:936 +-msgid "Media player is charged" +-msgstr "メディアプレーヤーの充電完了" +- +-#. TRANSLATORS: battery state +-#: ../plugins/power/gpm-common.c:945 +-msgid "Tablet is charging" +-msgstr "タブレットの充電中" +- +-#. TRANSLATORS: battery state +-#: ../plugins/power/gpm-common.c:949 +-msgid "Tablet is discharging" +-msgstr "タブレットの放電中" +- +-#. TRANSLATORS: battery state +-#: ../plugins/power/gpm-common.c:953 +-msgid "Tablet is empty" +-msgstr "タブレットのバッテリーが空です" +- +-#. TRANSLATORS: battery state +-#: ../plugins/power/gpm-common.c:957 +-msgid "Tablet is charged" +-msgstr "タブレットの充電完了" +- +-#. TRANSLATORS: battery state +-#: ../plugins/power/gpm-common.c:966 +-msgid "Computer is charging" +-msgstr "コンピューターの充電中" +- +-#. TRANSLATORS: battery state +-#: ../plugins/power/gpm-common.c:970 +-msgid "Computer is discharging" +-msgstr "コンピューターの放電中" +- +-#. TRANSLATORS: battery state +-#: ../plugins/power/gpm-common.c:974 +-msgid "Computer is empty" +-msgstr "コンピューターのバッテリーが空です" +- +-#. TRANSLATORS: battery state +-#: ../plugins/power/gpm-common.c:978 +-msgid "Computer is charged" +-msgstr "コンピューターの充電完了" +- + #. TRANSLATORS: this is the sound description +-#: ../plugins/power/gpm-common.c:1732 +-#: ../plugins/power/gsd-power-manager.c:1566 +-#: ../plugins/power/gsd-power-manager.c:1696 ++#: plugins/power/gpm-common.c:438 plugins/power/gsd-power-manager.c:717 ++#: plugins/power/gsd-power-manager.c:814 + msgid "Battery is critically low" + msgstr "バッテリーがひどく低下しています" + +-#. TRANSLATORS: the battery may be recalled by its vendor +-#: ../plugins/power/gsd-power-manager.c:849 +-msgid "Battery may be recalled" +-msgstr "バッテリーはリコール対象の可能性があります" +- +-# you may be at risk を 自己責任による変更物 と訳出したが、ここまで強い意味ではないかもしれない。 +-#: ../plugins/power/gsd-power-manager.c:852 +-#, c-format +-msgid "A battery in your computer may have been recalled by %s and you may be at risk." +-msgstr "お使いのバッテリーは、%s によりリコールされた可能性があり、危険を伴うおそれがあります。" +- +-#: ../plugins/power/gsd-power-manager.c:855 +-msgid "For more information visit the battery recall website." +-msgstr "詳細については、バッテリーのリコールに関するウェブサイトを参照してください。" +- +-#. TRANSLATORS: button text, visit the manufacturers recall website +-#: ../plugins/power/gsd-power-manager.c:866 +-msgid "Visit recall website" +-msgstr "リコールウェブサイトへ" +- +-#. TRANSLATORS: button text, do not show this bubble again +-#: ../plugins/power/gsd-power-manager.c:870 +-msgid "Do not show me this again" +-msgstr "この警告を一切表示しない" ++#. TRANSLATORS: this is the notification application name ++#: plugins/power/gsd-power-manager.c:347 ++msgid "Power" ++msgstr "電力" + + #. TRANSLATORS: UPS is now discharging +-#: ../plugins/power/gsd-power-manager.c:1120 ++#: plugins/power/gsd-power-manager.c:387 + msgid "UPS Discharging" + msgstr "UPS の充電中" + + #. TRANSLATORS: tell the user how much time they have got +-#: ../plugins/power/gsd-power-manager.c:1125 ++#: plugins/power/gsd-power-manager.c:392 + #, c-format + msgid "%s of UPS backup power remaining" +-msgstr "UPS のバックアップ電力の残り時間は %s です。" ++msgstr "UPS のバックアップ電力の残り時間は %s です" + +-#. TRANSLATORS: this is the notification application name +-#: ../plugins/power/gsd-power-manager.c:1146 +-#: ../plugins/power/gsd-power-manager.c:1376 +-#: ../plugins/power/gsd-power-manager.c:1549 +-#: ../plugins/power/gsd-power-manager.c:1687 +-#: ../plugins/power/gsd-power-manager.c:2921 +-#: ../plugins/power/power.gnome-settings-plugin.in.h:1 +-msgid "Power" +-msgstr "電力" ++#: plugins/power/gsd-power-manager.c:395 ++msgid "Unknown amount of UPS backup power remaining" ++msgstr "UPS のバックアップ電力の残りは不明です" + + #. TRANSLATORS: laptop battery low, and we only have one battery +-#: ../plugins/power/gsd-power-manager.c:1286 ++#: plugins/power/gsd-power-manager.c:470 + msgid "Battery low" + msgstr "バッテリー低下" + + #. TRANSLATORS: laptop battery low, and we have more than one kind of battery +-#: ../plugins/power/gsd-power-manager.c:1289 ++#: plugins/power/gsd-power-manager.c:473 + msgid "Laptop battery low" + msgstr "ノート PC のバッテリー低下" + + #. TRANSLATORS: tell the user how much time they have got +-#: ../plugins/power/gsd-power-manager.c:1296 ++#: plugins/power/gsd-power-manager.c:480 + #, c-format + msgid "Approximately %s remaining (%.0f%%)" + msgstr "約 %s 残っています (%.0f%%)" + + #. TRANSLATORS: UPS is starting to get a little low +-#: ../plugins/power/gsd-power-manager.c:1303 ++#: plugins/power/gsd-power-manager.c:485 + msgid "UPS low" + msgstr "UPS バッテリー低下" + + #. TRANSLATORS: tell the user how much time they have got +-#: ../plugins/power/gsd-power-manager.c:1309 ++#: plugins/power/gsd-power-manager.c:491 + #, c-format + msgid "Approximately %s of remaining UPS backup power (%.0f%%)" + msgstr "UPS バックアップ電力は約 %s 残っています (%.0f%%)" + + #. TRANSLATORS: mouse is getting a little low + #. TRANSLATORS: the mouse battery is very low +-#: ../plugins/power/gsd-power-manager.c:1314 +-#: ../plugins/power/gsd-power-manager.c:1473 ++#: plugins/power/gsd-power-manager.c:496 plugins/power/gsd-power-manager.c:630 + msgid "Mouse battery low" + msgstr "マウスのバッテリー低下" + + #. TRANSLATORS: tell user more details +-#: ../plugins/power/gsd-power-manager.c:1317 ++#: plugins/power/gsd-power-manager.c:499 + #, c-format + msgid "Wireless mouse is low in power (%.0f%%)" + msgstr "ワイヤレスマウスのバッテリーが低下しています (%.0f%%)" + + #. TRANSLATORS: keyboard is getting a little low + #. TRANSLATORS: the keyboard battery is very low +-#: ../plugins/power/gsd-power-manager.c:1321 +-#: ../plugins/power/gsd-power-manager.c:1481 ++#: plugins/power/gsd-power-manager.c:503 plugins/power/gsd-power-manager.c:638 + msgid "Keyboard battery low" + msgstr "キーボードのバッテリー低下" + + #. TRANSLATORS: tell user more details +-#: ../plugins/power/gsd-power-manager.c:1324 ++#: plugins/power/gsd-power-manager.c:506 + #, c-format + msgid "Wireless keyboard is low in power (%.0f%%)" + msgstr "ワイヤレスキーボードのバッテリーが低下しています (%.0f%%)" + + #. TRANSLATORS: PDA is getting a little low + #. TRANSLATORS: the PDA battery is very low +-#: ../plugins/power/gsd-power-manager.c:1328 +-#: ../plugins/power/gsd-power-manager.c:1490 ++#: plugins/power/gsd-power-manager.c:510 plugins/power/gsd-power-manager.c:647 + msgid "PDA battery low" + msgstr "PDA のバッテリー低下" + + #. TRANSLATORS: tell user more details +-#: ../plugins/power/gsd-power-manager.c:1331 ++#: plugins/power/gsd-power-manager.c:513 + #, c-format + msgid "PDA is low in power (%.0f%%)" + msgstr "PDA のバッテリーが低下しています (%.0f%%)" + + #. TRANSLATORS: cell phone (mobile) is getting a little low + #. TRANSLATORS: the cell battery is very low +-#: ../plugins/power/gsd-power-manager.c:1335 +-#: ../plugins/power/gsd-power-manager.c:1500 +-#: ../plugins/power/gsd-power-manager.c:1509 ++#: plugins/power/gsd-power-manager.c:517 plugins/power/gsd-power-manager.c:657 ++#: plugins/power/gsd-power-manager.c:666 + msgid "Cell phone battery low" + msgstr "携帯電話のバッテリー低下" + + #. TRANSLATORS: tell user more details +-#: ../plugins/power/gsd-power-manager.c:1338 ++#: plugins/power/gsd-power-manager.c:520 + #, c-format + msgid "Cell phone is low in power (%.0f%%)" + msgstr "携帯電話のバッテリーが低下しています (%.0f%%)" + + #. TRANSLATORS: media player, e.g. mp3 is getting a little low +-#: ../plugins/power/gsd-power-manager.c:1342 ++#: plugins/power/gsd-power-manager.c:524 + msgid "Media player battery low" + msgstr "メディアプレーヤーのバッテリー低下" + + #. TRANSLATORS: tell user more details +-#: ../plugins/power/gsd-power-manager.c:1345 ++#: plugins/power/gsd-power-manager.c:527 + #, c-format + msgid "Media player is low in power (%.0f%%)" + msgstr "メディアプレーヤーのバッテリーが低下しています (%.0f%%)" + + #. TRANSLATORS: graphics tablet, e.g. wacom is getting a little low + #. TRANSLATORS: the cell battery is very low +-#: ../plugins/power/gsd-power-manager.c:1349 +-#: ../plugins/power/gsd-power-manager.c:1518 ++#: plugins/power/gsd-power-manager.c:531 plugins/power/gsd-power-manager.c:675 + msgid "Tablet battery low" + msgstr "タブレットのバッテリー低下" + + #. TRANSLATORS: tell user more details +-#: ../plugins/power/gsd-power-manager.c:1352 ++#: plugins/power/gsd-power-manager.c:534 + #, c-format + msgid "Tablet is low in power (%.0f%%)" + msgstr "タブレットの電力が低下しています (%.0f%%)" + + #. TRANSLATORS: computer, e.g. ipad is getting a little low + #. TRANSLATORS: the cell battery is very low +-#: ../plugins/power/gsd-power-manager.c:1356 +-#: ../plugins/power/gsd-power-manager.c:1527 ++#: plugins/power/gsd-power-manager.c:538 plugins/power/gsd-power-manager.c:684 + msgid "Attached computer battery low" + msgstr "接続されたコンピューターのバッテリー低下" + + #. TRANSLATORS: tell user more details +-#: ../plugins/power/gsd-power-manager.c:1359 ++#: plugins/power/gsd-power-manager.c:541 + #, c-format + msgid "Attached computer is low in power (%.0f%%)" + msgstr "接続されたコンピューターのバッテリーが低下しています (%.0f%%)" + + #. TRANSLATORS: this is the sound description +-#: ../plugins/power/gsd-power-manager.c:1386 ++#: plugins/power/gsd-power-manager.c:562 + msgid "Battery is low" + msgstr "バッテリー低下" + + #. TRANSLATORS: laptop battery critically low, and only have one kind of battery +-#: ../plugins/power/gsd-power-manager.c:1427 ++#: plugins/power/gsd-power-manager.c:594 + msgid "Battery critically low" + msgstr "バッテリーがひどく低下" + + #. TRANSLATORS: laptop battery critically low, and we have more than one type of battery + #. TRANSLATORS: laptop battery is really, really, low +-#: ../plugins/power/gsd-power-manager.c:1430 +-#: ../plugins/power/gsd-power-manager.c:1601 ++#: plugins/power/gsd-power-manager.c:597 plugins/power/gsd-power-manager.c:744 + msgid "Laptop battery critically low" + msgstr "ノート PC のバッテリーがひどく低下" + +-#. TRANSLATORS: tell the use to insert the plug, as we're not going to do anything +-#: ../plugins/power/gsd-power-manager.c:1439 +-msgid "Plug in your AC adapter to avoid losing data." +-msgstr "データが失われないように AC アダプターを接続してください。" +- +-#. TRANSLATORS: give the user a ultimatum +-#: ../plugins/power/gsd-power-manager.c:1443 +-#, c-format +-msgid "Computer will suspend very soon unless it is plugged in." +-msgstr "アダプターを接続しない場合、コンピューターはまもなくサスペンドします。" +- + #. TRANSLATORS: give the user a ultimatum +-#: ../plugins/power/gsd-power-manager.c:1447 ++#: plugins/power/gsd-power-manager.c:606 + #, c-format + msgid "Computer will hibernate very soon unless it is plugged in." + msgstr "アダプターを接続しない場合、コンピューターはまもなくハイバネートします。" + + #. TRANSLATORS: give the user a ultimatum +-#: ../plugins/power/gsd-power-manager.c:1451 ++#: plugins/power/gsd-power-manager.c:610 + #, c-format + msgid "Computer will shutdown very soon unless it is plugged in." + msgstr "アダプターを接続しない場合、コンピューターはまもなくシャットダウンします。" + + #. TRANSLATORS: the UPS is very low + #. TRANSLATORS: UPS is really, really, low +-#: ../plugins/power/gsd-power-manager.c:1461 +-#: ../plugins/power/gsd-power-manager.c:1639 ++#: plugins/power/gsd-power-manager.c:618 plugins/power/gsd-power-manager.c:769 + msgid "UPS critically low" + msgstr "UPS の電源がひどく低下しています" + + #. TRANSLATORS: give the user a ultimatum +-#: ../plugins/power/gsd-power-manager.c:1467 ++#: plugins/power/gsd-power-manager.c:624 + #, c-format +-msgid "Approximately %s of remaining UPS power (%.0f%%). Restore AC power to your computer to avoid losing data." ++msgid "" ++"Approximately %s of remaining UPS power (%.0f%%). Restore AC power to your " ++"computer to avoid losing data." + msgstr "UPS 電源の残り時間は約 %s です(%.0f%%)。データを失わないように、コンピューターの AC 電源を復帰してください。" + + #. TRANSLATORS: the device is just going to stop working +-#: ../plugins/power/gsd-power-manager.c:1476 ++#: plugins/power/gsd-power-manager.c:633 + #, c-format +-msgid "Wireless mouse is very low in power (%.0f%%). This device will soon stop functioning if not charged." ++msgid "" ++"Wireless mouse is very low in power (%.0f%%). This device will soon stop " ++"functioning if not charged." + msgstr "ワイヤレスマウスの電源が非常に低くなっています(%.0f%%)。このデバイスは、充電されないとまもなく機能を停止します。" + + #. TRANSLATORS: the device is just going to stop working +-#: ../plugins/power/gsd-power-manager.c:1484 ++#: plugins/power/gsd-power-manager.c:641 + #, c-format +-msgid "Wireless keyboard is very low in power (%.0f%%). This device will soon stop functioning if not charged." ++msgid "" ++"Wireless keyboard is very low in power (%.0f%%). This device will soon stop " ++"functioning if not charged." + msgstr "ワイヤレスキーボードの電源が非常に低くなっています(%.0f%%)。このデバイスは、充電されないとまもなく機能を停止します。" + + #. TRANSLATORS: the device is just going to stop working +-#: ../plugins/power/gsd-power-manager.c:1493 ++#: plugins/power/gsd-power-manager.c:650 + #, c-format +-msgid "PDA is very low in power (%.0f%%). This device will soon stop functioning if not charged." ++msgid "" ++"PDA is very low in power (%.0f%%). This device will soon stop functioning if " ++"not charged." + msgstr "PDA の電源が非常に低くなっています(%.0f%%)。このデバイスは、充電されないとまもなく機能を停止します。" + + #. TRANSLATORS: the device is just going to stop working +-#: ../plugins/power/gsd-power-manager.c:1503 ++#: plugins/power/gsd-power-manager.c:660 + #, c-format +-msgid "Cell phone is very low in power (%.0f%%). This device will soon stop functioning if not charged." ++msgid "" ++"Cell phone is very low in power (%.0f%%). This device will soon stop " ++"functioning if not charged." + msgstr "携帯電話の電源が非常に低くなっています(%.0f%%)。このデバイスは、充電されないとまもなく機能を停止します。" + + #. TRANSLATORS: the device is just going to stop working +-#: ../plugins/power/gsd-power-manager.c:1512 ++#: plugins/power/gsd-power-manager.c:669 + #, c-format +-msgid "Media player is very low in power (%.0f%%). This device will soon stop functioning if not charged." ++msgid "" ++"Media player is very low in power (%.0f%%). This device will soon stop " ++"functioning if not charged." + msgstr "メディアプレーヤーの電源が非常に低下しています(%.0f%%)。このデバイスは、充電されないとまもなく機能を停止します。" + + #. TRANSLATORS: the device is just going to stop working +-#: ../plugins/power/gsd-power-manager.c:1521 ++#: plugins/power/gsd-power-manager.c:678 + #, c-format +-msgid "Tablet is very low in power (%.0f%%). This device will soon stop functioning if not charged." ++msgid "" ++"Tablet is very low in power (%.0f%%). This device will soon stop functioning " ++"if not charged." + msgstr "タブレットの電源が非常に低くなっています(%.0f%%)。このデバイスは、充電されないとまもなく機能を停止します。" + + #. TRANSLATORS: the device is just going to stop working +-#: ../plugins/power/gsd-power-manager.c:1530 ++#: plugins/power/gsd-power-manager.c:687 + #, c-format +-msgid "Attached computer is very low in power (%.0f%%). The device will soon shutdown if not charged." +-msgstr "接続されたコンピューターの電源が非常に低くなっています(%.0f%%)。このデバイスは、充電されないとまもなく機能を停止します。" +- +-#. TRANSLATORS: computer will shutdown without saving data +-#: ../plugins/power/gsd-power-manager.c:1609 +-msgid "The battery is below the critical level and this computer will power-off when the battery becomes completely empty." +-msgstr "バッテリーがクリティカルなレベルを下回っています。バッテリーが完全に空になると、このコンピューターは電源オフします。" +- +-#. TRANSLATORS: computer will suspend +-#: ../plugins/power/gsd-power-manager.c:1615 + msgid "" +-"The battery is below the critical level and this computer is about to suspend.\n" +-"NOTE: A small amount of power is required to keep your computer in a suspended state." +-msgstr "" +-"バッテリーがクリティカルなレベルを下回っています。このコンピューターはまもなくサスペンドします。\n" +-"注意: コンピューターのサスペンド状態を保つため、わずかな電力が必要です。" ++"Attached computer is very low in power (%.0f%%). The device will soon " ++"shutdown if not charged." ++msgstr "接続されたコンピューターの電源が非常に低くなっています(%.0f%%)。このデバイスは、充電されないとまもなく機能を停止します。" + + #. TRANSLATORS: computer will hibernate +-#: ../plugins/power/gsd-power-manager.c:1622 +-msgid "The battery is below the critical level and this computer is about to hibernate." ++#: plugins/power/gsd-power-manager.c:752 ++msgid "" ++"The battery is below the critical level and this computer is about to " ++"hibernate." + msgstr "バッテリーがクリティカルなレベルを下回っています。このコンピューターはまもなくハイバネートします。" + + #. TRANSLATORS: computer will just shutdown +-#: ../plugins/power/gsd-power-manager.c:1627 +-msgid "The battery is below the critical level and this computer is about to shutdown." ++#: plugins/power/gsd-power-manager.c:757 ++msgid "" ++"The battery is below the critical level and this computer is about to " ++"shutdown." + msgstr "バッテリーがクリティカルなレベルを下回っています。このコンピューターはまもなくシャットダウンします。" + +-#. TRANSLATORS: computer will shutdown without saving data +-#: ../plugins/power/gsd-power-manager.c:1647 +-msgid "UPS is below the critical level and this computer will power-off when the UPS becomes completely empty." +-msgstr "UPS がクリティカルなレベルを下回っています。 完全に空になるとこのコンピューターは電源オフします。" +- + #. TRANSLATORS: computer will hibernate +-#: ../plugins/power/gsd-power-manager.c:1653 +-msgid "UPS is below the critical level and this computer is about to hibernate." ++#: plugins/power/gsd-power-manager.c:777 ++msgid "" ++"UPS is below the critical level and this computer is about to hibernate." + msgstr "UPS がクリティカルなレベルを下回っています。このコンピューターはまもなくハイバネートします。" + + #. TRANSLATORS: computer will just shutdown +-#: ../plugins/power/gsd-power-manager.c:1658 ++#: plugins/power/gsd-power-manager.c:782 + msgid "UPS is below the critical level and this computer is about to shutdown." + msgstr "UPS がクリティカルなレベルを下回っています。このコンピューターはまもなくシャットダウンします。" + + #. TRANSLATORS: this is the sound description +-#: ../plugins/power/gsd-power-manager.c:2118 ++#: plugins/power/gsd-power-manager.c:1260 + msgid "Lid has been opened" + msgstr "ふたが開けられました" + + #. TRANSLATORS: this is the sound description +-#: ../plugins/power/gsd-power-manager.c:2156 ++#: plugins/power/gsd-power-manager.c:1294 + msgid "Lid has been closed" + msgstr "ふたが閉じられました" + +-#: ../plugins/power/gsd-power-manager.c:2899 +-msgid "Automatic logout" +-msgstr "自動ログアウト" ++#. TRANSLATORS: this is the sound description ++#: plugins/power/gsd-power-manager.c:1856 ++msgid "On battery power" ++msgstr "バッテリー電源使用時" + +-#: ../plugins/power/gsd-power-manager.c:2899 ++#. TRANSLATORS: this is the sound description ++#: plugins/power/gsd-power-manager.c:1861 ++msgid "On AC power" ++msgstr "AC 電源使用時" ++ ++#: plugins/power/gsd-power-manager.c:2051 ++msgid "Automatic logout" ++msgstr "自動ログアウト" ++ ++#: plugins/power/gsd-power-manager.c:2051 + msgid "You will soon log out because of inactivity." + msgstr "作業が行われていないため、まもなくログアウトします。" + +-#: ../plugins/power/gsd-power-manager.c:2904 +-msgid "Automatic suspend" +-msgstr "自動サスペンド" ++#: plugins/power/gsd-power-manager.c:2056 ++msgid "Automatic suspend" ++msgstr "自動サスペンド" ++ ++#: plugins/power/gsd-power-manager.c:2056 ++#: plugins/power/gsd-power-manager.c:2061 ++msgid "Computer will suspend very soon because of inactivity." ++msgstr "作業が行われていないため、コンピューターはまもなくサスペンドします。" ++ ++#: plugins/power/gsd-power-manager.c:2061 ++msgid "Automatic hibernation" ++msgstr "自動ハイバーネート" ++ ++#. SECURITY: ++#. - A normal active user on the local machine does not need permission ++#. to change the backlight brightness. ++#: plugins/power/org.gnome.settings-daemon.plugins.power.policy.in.in:21 ++msgid "Modify the laptop brightness" ++msgstr "ノート PC の輝度を変更します" ++ ++#: plugins/power/org.gnome.settings-daemon.plugins.power.policy.in.in:22 ++msgid "Authentication is required to modify the laptop brightness" ++msgstr "ノート PC の輝度を変更するには認証が必要です" ++ ++#. Translators: We are configuring new printer ++#: plugins/print-notifications/gsd-printer.c:890 ++msgid "Configuring new printer" ++msgstr "新しいプリンターを設定しています" ++ ++#. Translators: Just wait ++#: plugins/print-notifications/gsd-printer.c:892 ++msgid "Please wait…" ++msgstr "お待ちください..." ++ ++#. Translators: We have no driver installed for this printer ++#: plugins/print-notifications/gsd-printer.c:919 ++msgid "Missing printer driver" ++msgstr "プリンタードライバーが見つかりません" ++ ++#. Translators: We have no driver installed for the device ++#: plugins/print-notifications/gsd-printer.c:928 ++#, c-format ++msgid "No printer driver for %s." ++msgstr "%s のプリンタードライバーがありません。" ++ ++#. Translators: We have no driver installed for this printer ++#: plugins/print-notifications/gsd-printer.c:933 ++msgid "No driver for this printer." ++msgstr "このプリンターのドライバーがありません。" ++ ++#: plugins/print-notifications/gsd-printer.c:1031 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:290 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:538 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:920 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:1011 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:1055 ++msgid "Printers" ++msgstr "プリンター" ++ ++#. Translators: The printer is low on toner (same as in system-config-printer) ++#: plugins/print-notifications/gsd-print-notifications-manager.c:374 ++#, c-format ++msgid "Printer “%s” is low on toner." ++msgstr "プリンター '%s' のトナーが少なくなりました。" ++ ++#. Translators: The printer has no toner left (same as in system-config-printer) ++#: plugins/print-notifications/gsd-print-notifications-manager.c:378 ++#, c-format ++msgid "Printer “%s” has no toner left." ++msgstr "プリンター '%s' のトナーが残っていません。" ++ ++#. Translators: The printer is in the process of connecting to a shared network output device (same as in system-config-printer) ++#: plugins/print-notifications/gsd-print-notifications-manager.c:382 ++#, c-format ++msgid "Printer “%s” may not be connected." ++msgstr "プリンター '%s' が接続されていないようです。" ++ ++#. Translators: One or more covers on the printer are open (same as in system-config-printer) ++#: plugins/print-notifications/gsd-print-notifications-manager.c:386 ++#, c-format ++msgid "The cover is open on printer “%s”." ++msgstr "プリンター '%s' のカバーが開いています。" ++ ++#. Translators: A filter or backend is not installed (same as in system-config-printer) ++#: plugins/print-notifications/gsd-print-notifications-manager.c:390 ++#, c-format ++msgid "There is a missing print filter for printer “%s”." ++msgstr "プリンター '%s' のプリントフィルターが見つかりません。" ++ ++#. Translators: One or more doors on the printer are open (same as in system-config-printer) ++#: plugins/print-notifications/gsd-print-notifications-manager.c:395 ++#, c-format ++msgid "The door is open on printer “%s”." ++msgstr "プリンター '%s' のドアが開いています。" ++ ++#. Translators: "marker" is one color bin of the printer ++#: plugins/print-notifications/gsd-print-notifications-manager.c:399 ++#, c-format ++msgid "Printer “%s” is low on a marker supply." ++msgstr "プリンター '%s' のインクが少なくなりました。" ++ ++#. Translators: "marker" is one color bin of the printer ++#: plugins/print-notifications/gsd-print-notifications-manager.c:403 ++#, c-format ++msgid "Printer “%s” is out of a marker supply." ++msgstr "プリンター '%s' のインクがありません。" ++ ++#. Translators: At least one input tray is low on media (same as in system-config-printer) ++#: plugins/print-notifications/gsd-print-notifications-manager.c:407 ++#, c-format ++msgid "Printer “%s” is low on paper." ++msgstr "プリンター '%s' の用紙が少なくなっています。" ++ ++#. Translators: At least one input tray is empty (same as in system-config-printer) ++#: plugins/print-notifications/gsd-print-notifications-manager.c:411 ++#, c-format ++msgid "Printer “%s” is out of paper." ++msgstr "プリンター '%s' の用紙がなくなりました。" ++ ++#. Translators: The printer is offline (same as in system-config-printer) ++#: plugins/print-notifications/gsd-print-notifications-manager.c:415 ++#, c-format ++msgid "Printer “%s” is currently off-line." ++msgstr "プリンター '%s' は現在オフラインです。" ++ ++#. Translators: The printer has detected an error (same as in system-config-printer) ++#: plugins/print-notifications/gsd-print-notifications-manager.c:419 ++#, c-format ++msgid "There is a problem on printer “%s”." ++msgstr "プリンター '%s' で問題が発生しました。" ++ ++#. Translators: The printer has a job to print but the printer needs authentication to continue with the print ++#: plugins/print-notifications/gsd-print-notifications-manager.c:531 ++#, c-format ++msgid "%s Requires Authentication" ++msgstr "%s には認証が必要です" ++ ++#. Translators: A printer needs credentials to continue printing a job ++#: plugins/print-notifications/gsd-print-notifications-manager.c:533 ++#, c-format ++msgid "Credentials required in order to print" ++msgstr "印刷するために必要な認証情報" ++ ++#. Translators: The printer is low on toner (same as in system-config-printer) ++#: plugins/print-notifications/gsd-print-notifications-manager.c:600 ++msgid "Toner low" ++msgstr "トナーが少なくなりました" ++ ++#. Translators: The printer has no toner left (same as in system-config-printer) ++#: plugins/print-notifications/gsd-print-notifications-manager.c:602 ++msgid "Toner empty" ++msgstr "トナーが空になりました" ++ ++#. Translators: The printer is in the process of connecting to a shared network output device (same as in system-config-printer) ++#: plugins/print-notifications/gsd-print-notifications-manager.c:604 ++msgid "Not connected?" ++msgstr "接続されていませんか?" ++ ++#. Translators: One or more covers on the printer are open (same as in system-config-printer) ++#: plugins/print-notifications/gsd-print-notifications-manager.c:606 ++msgid "Cover open" ++msgstr "カバーが開いています" ++ ++#. Translators: A filter or backend is not installed (same as in system-config-printer) ++#: plugins/print-notifications/gsd-print-notifications-manager.c:608 ++msgid "Printer configuration error" ++msgstr "プリンターの設定エラーです" ++ ++#. Translators: One or more doors on the printer are open (same as in system-config-printer) ++#: plugins/print-notifications/gsd-print-notifications-manager.c:610 ++msgid "Door open" ++msgstr "ドアが開いています" ++ ++#. Translators: "marker" is one color bin of the printer ++#: plugins/print-notifications/gsd-print-notifications-manager.c:612 ++msgid "Marker supply low" ++msgstr "インクが少なくなりました" ++ ++#. Translators: "marker" is one color bin of the printer ++#: plugins/print-notifications/gsd-print-notifications-manager.c:614 ++msgid "Out of a marker supply" ++msgstr "インク切れです" ++ ++#. Translators: At least one input tray is low on media (same as in system-config-printer) ++#: plugins/print-notifications/gsd-print-notifications-manager.c:616 ++msgid "Paper low" ++msgstr "用紙が少なくなりました" ++ ++#. Translators: At least one input tray is empty (same as in system-config-printer) ++#: plugins/print-notifications/gsd-print-notifications-manager.c:618 ++msgid "Out of paper" ++msgstr "用紙切れです" ++ ++#. Translators: The printer is offline (same as in system-config-printer) ++#: plugins/print-notifications/gsd-print-notifications-manager.c:620 ++msgid "Printer off-line" ++msgstr "プリンターがオフラインです" ++ ++#. Translators: The printer has detected an error (same as in system-config-printer) ++#. Translators: This is a title of an error notification for a printer ++#: plugins/print-notifications/gsd-print-notifications-manager.c:622 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:997 ++msgid "Printer error" ++msgstr "プリンターエラー" ++ ++#. Translators: New printer has been added ++#: plugins/print-notifications/gsd-print-notifications-manager.c:670 ++msgid "Printer added" ++msgstr "プリンターが追加されました" ++ ++#. Translators: A print job has been stopped ++#: plugins/print-notifications/gsd-print-notifications-manager.c:687 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:725 ++msgctxt "print job state" ++msgid "Printing stopped" ++msgstr "印刷が停止されました" ++ ++#. Translators: "print-job xy" on a printer ++#: plugins/print-notifications/gsd-print-notifications-manager.c:689 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:695 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:701 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:707 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:719 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:727 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:735 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:743 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:751 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:775 ++#, c-format ++msgctxt "print job" ++msgid "“%s” on %s" ++msgstr "\"%s\" の \"%s\"" ++ ++#. Translators: A print job has been canceled ++#: plugins/print-notifications/gsd-print-notifications-manager.c:693 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:733 ++msgctxt "print job state" ++msgid "Printing canceled" ++msgstr "印刷がキャンセルされました" ++ ++#. Translators: A print job has been aborted ++#: plugins/print-notifications/gsd-print-notifications-manager.c:699 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:741 ++msgctxt "print job state" ++msgid "Printing aborted" ++msgstr "印刷が中止されました" ++ ++#. Translators: A print job has been completed ++#: plugins/print-notifications/gsd-print-notifications-manager.c:705 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:749 ++msgctxt "print job state" ++msgid "Printing completed" ++msgstr "印刷が完了しました" ++ ++#. Translators: A job is printing ++#: plugins/print-notifications/gsd-print-notifications-manager.c:717 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:773 ++msgctxt "print job state" ++msgid "Printing" ++msgstr "印刷" ++ ++#. Translators: This is a title of a report notification for a printer ++#: plugins/print-notifications/gsd-print-notifications-manager.c:991 ++msgid "Printer report" ++msgstr "プリンターの報告" ++ ++#. Translators: This is a title of a warning notification for a printer ++#: plugins/print-notifications/gsd-print-notifications-manager.c:994 ++msgid "Printer warning" ++msgstr "プリンターの警告" ++ ++#. Translators: "Printer 'MyPrinterName': 'Description of the report/warning/error from a PPD file'." ++#: plugins/print-notifications/gsd-print-notifications-manager.c:1004 ++#, c-format ++msgid "Printer “%s”: “%s”." ++msgstr "プリンター '%s': '%s'。" ++ ++#: plugins/smartcard/gsd-smartcard-service.c:288 ++msgid "User was not logged in with smartcard." ++msgstr "スマートカードではログインできません。" ++ ++#: plugins/subman/gsd-subscription-manager.c:1044 ++msgid "Subscription Has Expired" ++msgstr "サブスクリプションは期限切れです" ++ ++#: plugins/subman/gsd-subscription-manager.c:1045 ++msgid "Add or renew a subscription to continue receiving software updates." ++msgstr "ソフトウェアの更新を継続して受信するには、サブスクリプションを追加または更新します。" ++ ++#: plugins/subman/gsd-subscription-manager.c:1047 ++#: plugins/subman/gsd-subscription-manager.c:1063 ++#: plugins/subman/gsd-subscription-manager.c:1075 ++msgid "Subscription" ++msgstr "サブスクリプション" ++ ++#: plugins/subman/gsd-subscription-manager.c:1052 ++msgid "Subscribe System…" ++msgstr "システムのサブスクライブ..." ++ ++#: plugins/subman/gsd-subscription-manager.c:1060 ++msgid "Registration Successful" ++msgstr "登録成功" ++ ++#: plugins/subman/gsd-subscription-manager.c:1061 ++msgid "The system has been registered and software updates have been enabled." ++msgstr "システムが登録され、ソフトウェア更新が有効になりました。" ++ ++#: plugins/subman/gsd-subscription-manager.c:1072 ++msgid "System Not Registered" ++msgstr "システムは登録されていません" ++ ++#: plugins/subman/gsd-subscription-manager.c:1073 ++msgid "Please register your system to receive software updates." ++msgstr "ソフトウェア更新を受信するには、このシステムを登録してください。" ++ ++#: plugins/subman/gsd-subscription-manager.c:1080 ++msgid "Register System…" ++msgstr "システムの登録..." ++ ++#: plugins/subman/org.gnome.settings-daemon.plugins.subman.policy.in.in:17 ++msgid "Register the system" ++msgstr "システムの登録" ++ ++#: plugins/subman/org.gnome.settings-daemon.plugins.subman.policy.in.in:18 ++msgid "Authentication is required to register the system" ++msgstr "システムを登録するには、認証が必要です" ++ ++#. SECURITY: ++#. - A normal active user on the local machine does not need permission ++#. to change the LED setting for a Wacom tablet ++#: plugins/wacom/org.gnome.settings-daemon.plugins.wacom.policy.in.in:20 ++msgid "Modify the lit LED for a Wacom tablet" ++msgstr "Wacom タブレットの LED 設定の変更" ++ ++#: plugins/wacom/org.gnome.settings-daemon.plugins.wacom.policy.in.in:21 ++msgid "Authentication is required to modify the lit LED for a Wacom tablet" ++msgstr "Wacom タブレットの LED 設定の変更には認証が必要です" ++ ++#. SECURITY: ++#. - A normal active user on the local machine does not need permission ++#. to change the OLED images for a Wacom tablet ++#: plugins/wacom/org.gnome.settings-daemon.plugins.wacom.policy.in.in:35 ++msgid "Modify the OLED image for a Wacom tablet" ++msgstr "Wacom タブレットの OLED イメージの変更" ++ ++#: plugins/wacom/org.gnome.settings-daemon.plugins.wacom.policy.in.in:36 ++msgid "Authentication is required to modify the OLED image for a Wacom tablet" ++msgstr "Wacom タブレットの OLED イメージの変更には認証が必要です" ++ ++#~ msgid "GNOME Settings Daemon" ++#~ msgstr "GNOME 設定デーモン" ++ ++#~ msgid "Device hotplug custom command" ++#~ msgstr "デバイスのホットプラグの独自コマンド" ++ ++#~ msgid "" ++#~ "Command to be run when a device is added or removed. An exit value of 1 " ++#~ "means that the device will not be handled further by gnome-settings-" ++#~ "daemon." ++#~ msgstr "" ++#~ "デバイスの接続または取り外し時に実行するコマンドです。終了ステータスが 1 " ++#~ "である場合は、これ以上 gnome-settings-daemon によってデバイスが処理されな" ++#~ "いことを意味します。" ++ ++#~ msgid "Activation of this plugin" ++#~ msgstr "このプラグインを有効化する" ++ ++#~ msgid "" ++#~ "Whether this plugin would be activated by gnome-settings-daemon or not" ++#~ msgstr "このプラグインを gnome-settings-daemon で有効化するかどうかです" ++ ++#~ msgid "Priority to use for this plugin" ++#~ msgstr "このプラグインの優先度" ++ ++#~ msgid "" ++#~ "Priority to use for this plugin in gnome-settings-daemon startup queue" ++#~ msgstr "" ++#~ "gnome-settings-daemon の起動時のキューで、このプラグインが使用される優先度" ++ ++#~ msgid "Wacom tablet PC feature" ++#~ msgstr "Wacom タブレット PC の機能" ++ ++#~ msgid "Enable this to only report stylus events when the tip is pressed." ++#~ msgstr "" ++#~ "チップが押されたときにスタイラスイベントだけが送られるようにします。" ++ ++#~ msgid "Wacom last calibrated resolution" ++#~ msgstr "Wacom で最後にキャリブレーションした時の解像度" ++ ++#~ msgid "" ++#~ "Holds the last calibrated resolution to help check if calibration is " ++#~ "needed." ++#~ msgstr "" ++#~ "キャリブレーションが必要かどうか判断できるように、最後にキャリブレーション" ++#~ "した時の解像度を保持します。" ++ ++#~ msgid "Wacom display mapping" ++#~ msgstr "Wacom ディスプレイ・マッピング" ++ ++#~ msgid "" ++#~ "EDID information of monitor to map tablet to. Must be in the format " ++#~ "[vendor, product, serial]. [\"\",\"\",\"\"] disables mapping." ++#~ msgstr "" ++#~ "モニターとタブレットのマップで EDID 情報を使用します。書式は、[vendor, " ++#~ "product, serial] です。[\"\",\"\",\"\"] にするとマッピングできません。" ++ ++#~ msgid "Percentage considered low" ++#~ msgstr "バッテリー残量低下と認識するパーセンテージ" ++ ++#~ msgid "" ++#~ "The percentage of the battery when it is considered low. Only valid when " ++#~ "use-time-for-policy is false." ++#~ msgstr "" ++#~ "バッテリー残量が低下していると認識するパーセンテージです。use-time-for-" ++#~ "policy が false のときだけ有効です。" ++ ++#~ msgid "Percentage considered critical" ++#~ msgstr "バッテリー残量が危険領域と認識するパーセンテージ" ++ ++#~ msgid "" ++#~ "The percentage of the battery when it is considered critical. Only valid " ++#~ "when use-time-for-policy is false." ++#~ msgstr "" ++#~ "バッテリー残量が危険領域だと認識するパーセンテージです。use-time-for-" ++#~ "policy が false のときだけ有効です。" ++ ++#~ msgid "Percentage action is taken" ++#~ msgstr "アクションを実施するパーセンテージ" ++ ++#~ msgid "" ++#~ "The percentage of the battery when the critical action is performed. Only " ++#~ "valid when use-time-for-policy is false." ++#~ msgstr "" ++#~ "危険領域のアクションを実施するバッテリー残量のパーセンテージ。use-time-" ++#~ "for-policy が false のときだけ有効です。" ++ ++#~ msgid "The time remaining when low" ++#~ msgstr "残量低下時の残り時間" ++ ++#~ msgid "" ++#~ "The time remaining in seconds of the battery when it is considered low. " ++#~ "Only valid when use-time-for-policy is true." ++#~ msgstr "" ++#~ "残量低下時のバッテリーの残り秒数です。use-time-for-policy が true のときだ" ++#~ "け有効です。" ++ ++#~ msgid "The time remaining when critical" ++#~ msgstr "残量が危険領域時の残り時間" ++ ++#~ msgid "" ++#~ "The time remaining in seconds of the battery when it is considered " ++#~ "critical. Only valid when use-time-for-policy is true." ++#~ msgstr "" ++#~ "残量が危険領域時のバッテリーの残り秒数です。use-time-for-policy が true の" ++#~ "ときだけ有効です。" ++ ++#~ msgid "The time remaining when action is taken" ++#~ msgstr "アクション実施時のバッテリーの残り秒数" ++ ++#~ msgid "" ++#~ "The time remaining in seconds of the battery when critical action is " ++#~ "taken. Only valid when use-time-for-policy is true." ++#~ msgstr "" ++#~ "危険領域時のアクション実施時のバッテリーの残り秒数です。use-time-for-" ++#~ "policy が true のときだけ有効です。" ++ ++#~ msgid "Whether to use time-based notifications" ++#~ msgstr "時間基準の通知を使用するかどうか" ++ ++#~ msgid "" ++#~ "If time based notifications should be used. If set to false, then the " ++#~ "percentage change is used instead, which may fix a broken ACPI BIOS." ++#~ msgstr "" ++#~ "時間基準の通知を使用するかどうかです。false に設定されている場合、パーセン" ++#~ "テージの変化が代わりに使用され、壊れた ACPI BIOS を正してくれます。" ++ ++#~ msgid "If we should show the recalled battery warning for a broken battery" ++#~ msgstr "" ++#~ "壊れたバッテリーに対して、リコールされたバッテリーだという警告を再び表示さ" ++#~ "せるかどうか" ++ ++#~ msgid "" ++#~ "If we should show the recalled battery warning for a broken battery. Set " ++#~ "this to false only if you know your battery is okay." ++#~ msgstr "" ++#~ "壊れたバッテリーに対して、リコールされたバッテリーだという警告を再び表示さ" ++#~ "せるかどうかです。これを false に指定した場合、バッテリーが良好かどうかを" ++#~ "知ることしかできません。" ++ ++#~ msgid "Use mobile broadband connections" ++#~ msgstr "モバイルブロードバンド接続を使用する" ++ ++#~ msgid "" ++#~ "Use mobile broadband connections such as GSM and CDMA to check for " ++#~ "updates." ++#~ msgstr "" ++#~ "更新の確認に GSM や CDMA などのモバイルブロードバンド接続を使用します。" ++ ++#~ msgid "" ++#~ "Automatically download updates in the background without confirmation" ++#~ msgstr "バックグラウンドで自動的に更新をダウンロードする" ++ ++#~ msgid "" ++#~ "Automatically download updates in the background without confirmation. " ++#~ "Updates will be auto-downloaded when using wired network connnections, " ++#~ "and mobile broadband if 'connection-use-mobile' is enabled." ++#~ msgstr "" ++#~ "バックグラウンドで自動的に更新をダウンロードします。有線ネットワーク接続を" ++#~ "使用しているとき、また 'connection-use-mobile' が有効でモバイルブロードバ" ++#~ "ンドを使用しているときに、自動的に更新をダウンロードします。" ++ ++#~ msgid "How often to check for updates" ++#~ msgstr "更新の確認頻度" ++ ++#~ msgid "" ++#~ "How often to check for updates. Value is in seconds. This is a maximum " ++#~ "amount of time that can pass between a security update being published, " ++#~ "and the update being automatically installed or the user notified." ++#~ msgstr "" ++#~ "更新の確認頻度です。値は秒単位です。この最大時間は、セキュリティ更新の間隔" ++#~ "になり、更新は自動的にインストールされる、またはユーザーに通知されます。" ++ ++#~ msgid "How often to notify the user that non-critical updates are available" ++#~ msgstr "クリティカルでない更新をユーザーに通知する頻度" ++ ++#~ msgid "" ++#~ "How often to tell the user there are non-critical updates. Value is in " ++#~ "seconds. Security update notifications are always shown after the check " ++#~ "for updates, but non-critical notifications should be shown a lot less " ++#~ "frequently." ++#~ msgstr "" ++#~ "クリティカルではない更新が利用可能である場合にユーザーに通知する頻度です。" ++#~ "値は秒単位です。セキュリティの更新の通知は、更新の調査後に毎回表示され、ク" ++#~ "リティカルではない通知はそれより低頻度で表示されます。" ++ ++#~ msgid "The last time we told the user about non-critical notifications" ++#~ msgstr "ユーザーにクリティカルではない通知を最後に行った時間" ++ ++#~ msgid "" ++#~ "The last time we notified the user about non-critical updates. Value is " ++#~ "in seconds since the epoch, or zero for never." ++#~ msgstr "" ++#~ "ユーザーにクリティカルではない更新の通知を最後に行った時間です。値は、エ" ++#~ "ポックからの秒単位、または、通知されていない場合のゼロです。" ++ ++#~ msgid "How often to check for distribution upgrades" ++#~ msgstr "ディストリビューションの更新の確認頻度" ++ ++#~ msgid "How often to check for distribution upgrades. Value is in seconds." ++#~ msgstr "ディストリビューションの更新の確認頻度です。値は秒単位です。" ++ ++#~ msgid "How often to refresh the package cache" ++#~ msgstr "パッケージキャッシュのリフレッシュ頻度" ++ ++#~ msgid "How often to refresh the package cache. Value is in seconds." ++#~ msgstr "パッケージキャッシュのリフレッシュ頻度です。値は秒単位です。" ++ ++#~ msgid "Check for updates when running on battery power" ++#~ msgstr "バッテリー電源での動作時に更新を確認する" ++ ++#~ msgid "Check for updates when running on battery power." ++#~ msgstr "バッテリー電源で動作しているときに更新を確認します。" ++ ++#~ msgid "Notify the user when distribution upgrades are available" ++#~ msgstr "" ++#~ "ディストリビューションの更新が利用可能になったときにユーザーに通知する" ++ ++#~ msgid "Notify the user when distribution upgrades are available." ++#~ msgstr "" ++#~ "ディストリビューションの更新が利用可能になったときにユーザーに通知します。" ++ ++#~ msgid "Ask the user if additional firmware should be installed" ++#~ msgstr "追加のファームウェアをインストールするかユーザーに確認する" ++ ++#~ msgid "" ++#~ "Ask the user if additional firmware should be installed if it is " ++#~ "available." ++#~ msgstr "" ++#~ "追加のファームウェアが利用可能である場合、インストールするかユーザーに確認" ++#~ "します。" ++ ++#~ msgid "Firmware files that should not be searched for" ++#~ msgstr "検索しないファームウェアファイル" ++ ++#~ msgid "" ++#~ "Firmware files that should not be searched for, separated by commas. " ++#~ "These can include '*' and '?' characters." ++#~ msgstr "" ++#~ "検索しないファームウェアファイルです。カンマで区切ります。'*' と '?' 文字" ++#~ "を含めることができます。" ++ ++#~ msgid "Devices that should be ignored" ++#~ msgstr "無視するデバイス" ++ ++#~ msgid "" ++#~ "Devices that should be ignored, separated by commas. These can include " ++#~ "'*' and '?' characters." ++#~ msgstr "" ++#~ "カンマで分離された無視するデバイスです。 '*' と '?' 文字を含めてもかまいま" ++#~ "せん。" ++ ++#~ msgid "" ++#~ "The filenames on removable media that designate it a software source." ++#~ msgstr "ソフトウェアのソースとなるリムーバブルメディア上のファイル名です。" ++ ++#~ msgid "" ++#~ "When removable media is inserted, it is checked to see if it contains any " ++#~ "important filenames in the root directory. If the filename matches, then " ++#~ "an updates check is performed. This allows post-install disks to be used " ++#~ "to update running systems." ++#~ msgstr "" ++#~ "リムーバブルメディアが挿入された時、ルートディレクトリに重要なファイル名が" ++#~ "含まれていないかどうか調査します。ファイル名が一致した場合、更新の調査が実" ++#~ "行されます。これで、すでにインストールしたディスクで実行中のシステムを更新" ++#~ "することが可能になります。" ++ ++#~ msgid "File for default configuration for RandR" ++#~ msgstr "RandR の初期設定ファイル" ++ ++#~ msgid "" ++#~ "The XRandR plugin will look for a default configuration in the file " ++#~ "specified by this key. This is similar to the ~/.config/monitors.xml that " ++#~ "normally gets stored in users' home directories. If a user does not have " ++#~ "such a file, or has one that does not match the user's setup of monitors, " ++#~ "then the file specified by this key will be used instead." ++#~ msgstr "" ++#~ "XRandR プラグインはこのキーで指定されたファイルをデフォルトの設定ファイル" ++#~ "として検索します。これは通常、ユーザーのホームディレクトリに保存されてい" ++#~ "る ~/.config/monitors.xml と同様のものです。もしそのようなファイルが無い場" ++#~ "合、あるいはあったとしてもモニターの設定に合わない場合、このキーで指定され" ++#~ "たファイルが代わりに使われます。" ++ ++#~ msgid "Whether to turn off specific monitors after boot" ++#~ msgstr "ブート後に特定のモニターをオフにするかどうか" ++ ++#~ msgid "" ++#~ "'clone' will display the same thing on all monitors, 'dock' will switch " ++#~ "off the internal monitor, 'do-nothing' will use the default Xorg " ++#~ "behaviour (extend the desktop in recent versions). The default, 'follow-" ++#~ "lid', will choose between 'do-nothing' and 'dock' depending on whether " ++#~ "the lid is (respectively) open or closed." ++#~ msgstr "" ++#~ "'clone' はすべてのモニターで同じ表示を行います。'dock' は内部モニターをオ" ++#~ "フにします。'do-nothing' はデフォルトの Xorg の動作になります (最近のバー" ++#~ "ジョンではデスクトップを拡張します)。デフォルト値となる 'follow-lid' は、" ++#~ "蓋が開いているか閉じているかによって、それぞれ 'do-nothing' か 'dock' かど" ++#~ "ちらかと同じ挙動になります。" ++ ++#~ msgid "" ++#~ "The type of hinting to use when rendering fonts. Possible values are: " ++#~ "\"none\" for no hinting, \"slight\" for basic, \"medium\" for moderate, " ++#~ "and \"full\" for maximum hinting (may cause distortion of letter forms)." ++#~ msgstr "" ++#~ "フォントを描画する際に使用するヒンティング (線幅を補正する) の種類を指定し" ++#~ "ます。利用可能な値: \"none\" はヒンティングを無効にする、\"slight\" は基本" ++#~ "的なヒンティングのみ、\"medium\" は穏やかなヒンティング、\"full\" は最大限" ++#~ "のヒンティング (文字の形状に歪みが発生する可能性あり)" ++ ++#~ msgid "Enable debugging code" ++#~ msgstr "デバッグ情報を有効にする" ++ ++#~ msgid "Replace existing daemon" ++#~ msgstr "既存のデーモンを置き換える" ++ ++#~ msgid "Exit after a time (for debugging)" ++#~ msgstr "しばらくしてから終了する (デバッグ用)" ++ ++#~ msgid "Accessibility Keyboard" ++#~ msgstr "アクセシビリティ・キーボード" ++ ++#~ msgid "Accessibility keyboard plugin" ++#~ msgstr "アクセシビリティ・キーボードのプラグイン" ++ ++#~ msgid "Slow Keys Turned On" ++#~ msgstr "スローキーをオンにする" ++ ++#~ msgid "Slow Keys Turned Off" ++#~ msgstr "スローキーをオフにする" ++ ++#~ msgid "" ++#~ "You just held down the Shift key for 8 seconds. This is the shortcut for " ++#~ "the Slow Keys feature, which affects the way your keyboard works." ++#~ msgstr "" ++#~ "[SHIFT] キーを8秒間押下しました。これはスローキー機能のショートカットとし" ++#~ "て、キーボード操作に影響を与えるものです。" ++ ++#~ msgid "Universal Access" ++#~ msgstr "ユニバーサルアクセス" ++ ++#~ msgid "Turn Off" ++#~ msgstr "オフにする" ++ ++#~ msgid "Turn On" ++#~ msgstr "オンにする" ++ ++#~ msgid "Leave On" ++#~ msgstr "オンのままにする" ++ ++#~ msgid "Leave Off" ++#~ msgstr "オフのままにする" ++ ++#~ msgid "Sticky Keys Turned On" ++#~ msgstr "固定キーをオンにする" ++ ++#~ msgid "Sticky Keys Turned Off" ++#~ msgstr "固定キーをオフにする" ++ ++#~ msgid "" ++#~ "You just pressed the Shift key 5 times in a row. This is the shortcut " ++#~ "for the Sticky Keys feature, which affects the way your keyboard works." ++#~ msgstr "" ++#~ "[SHIFT] キーを連続して5回押下しました。これは固定キー機能のショートカット" ++#~ "として、キーボード操作に影響を与えるものです。" ++ ++#~ msgid "" ++#~ "You just pressed two keys at once, or pressed the Shift key 5 times in a " ++#~ "row. This turns off the Sticky Keys feature, which affects the way your " ++#~ "keyboard works." ++#~ msgstr "" ++#~ "同時に2つのキーを押下したか、あるいは [SHIFT] キーを連続して 5回押下しまし" ++#~ "た。これは固定キー機能を無効にし、キーボード操作に影響を与えるものです。" ++ ++#~ msgid "Accessibility settings" ++#~ msgstr "アクセシビリティの設定" ++ ++#~ msgid "Accessibility settings plugin" ++#~ msgstr "アクセシビリティの設定プラグイン" ++ ++#~ msgid "Clipboard" ++#~ msgstr "クリップボード" ++ ++#~ msgid "Clipboard plugin" ++#~ msgstr "クリップボードのプラグイン" ++ ++#~ msgid "Color plugin" ++#~ msgstr "カラープラグイン" ++ ++#~ msgid "Cursor" ++#~ msgstr "カーソル" ++ ++#~ msgid "Show/hide cursor on tablet devices" ++#~ msgstr "タブレットデバイスでカーソルの表示/非表示を行います" ++ ++#~ msgid "Date and Time" ++#~ msgstr "日付と時刻" ++ ++#~ msgid "Automatically update timezone and display notifications" ++#~ msgstr "自動的にタイムゾーンを更新して通知を表示します" ++ ++#~ msgid "Dummy" ++#~ msgstr "ダミー" ++ ++#~ msgid "Dummy plugin" ++#~ msgstr "ダミーのプラグイン" ++ ++#~ msgid "Don't show any warnings again for this file system" ++#~ msgstr "このファイルシステムの警告は一切表示しない" ++ ++#~ msgid "Don't show any warnings again" ++#~ msgstr "警告を一切表示しない" ++ ++#~ msgid "" ++#~ "You can free up disk space by emptying the Trash, removing unused " ++#~ "programs or files, or moving files to another disk or partition." ++#~ msgstr "" ++#~ "ゴミ箱を空にしたり、使っていないプログラムやファイルを削除したり、他のディ" ++#~ "スクやパーティションにファイルを移動することで、ディスクの空き容量を増やせ" ++#~ "ます。" ++ ++#~ msgid "" ++#~ "You can free up disk space by removing unused programs or files, or by " ++#~ "moving files to another disk or partition." ++#~ msgstr "" ++#~ "使っていないプログラムやファイルを削除したり、他のディスクやパーティション" ++#~ "にファイルを移動することで、ディスク容量を増やせます。" ++ ++#~ msgid "" ++#~ "You can free up disk space by emptying the Trash, removing unused " ++#~ "programs or files, or moving files to an external disk." ++#~ msgstr "" ++#~ "ゴミ箱を空にしたり、使っていないプログラムやファイルを削除したり、外付け" ++#~ "ディスクにファイルを移動することで、ディスクの空き容量を増やせます。" ++ ++#~ msgid "" ++#~ "You can free up disk space by removing unused programs or files, or by " ++#~ "moving files to an external disk." ++#~ msgstr "" ++#~ "使っていないプログラムやファイルを削除したり、外付けディスクにファイルを移" ++#~ "動することで、ディスクの空き容量を増やせます。" ++ ++#~ msgid "Examine…" ++#~ msgstr "調査中…" ++ ++#~ msgid "Housekeeping" ++#~ msgstr "ハウスキーピング" ++ ++#~ msgid "" ++#~ "Automatically prunes thumbnail caches and other transient files, and " ++#~ "warns about low disk space" ++#~ msgstr "" ++#~ "不要なサムネイルキャッシュやその他の一時ファイルを削除し、ディスクスペース" ++#~ "の容量が小さくなれば警告します" ++ ++#~ msgid "Keyboard" ++#~ msgid_plural "Keyboards" ++#~ msgstr[0] "キーボード" ++ ++#~ msgid "Keyboard plugin" ++#~ msgstr "キーボードプラグイン" ++ ++#~ msgid "Disabled" ++#~ msgstr "無効" ++ ++#~ msgid "%u Output" ++#~ msgid_plural "%u Outputs" ++#~ msgstr[0] "%u 出力" ++ ++#~ msgid "%u Input" ++#~ msgid_plural "%u Inputs" ++#~ msgstr[0] "%u 入力" ++ ++#~ msgid "System Sounds" ++#~ msgstr "システムの効果音" ++ ++#~ msgid "Media keys" ++#~ msgstr "メディアキー" ++ ++#~ msgid "Media keys plugin" ++#~ msgstr "メディアキーのプラグイン" ++ ++#~ msgid "Video Out" ++#~ msgstr "ビデオ出力" ++ ++#~ msgid "Rotate Screen" ++#~ msgstr "画面回転" ++ ++#~ msgid "Mouse" ++#~ msgid_plural "Mice" ++#~ msgstr[0] "マウス" ++ ++#~ msgid "Mouse plugin" ++#~ msgstr "マウスプラグイン" ++ ++#~ msgid "Orientation" ++#~ msgstr "画面の向き" ++ ++#~ msgid "Orientation plugin" ++#~ msgstr "画面方向プラグイン" ++ ++#~ msgid "provides %s laptop runtime" ++#~ msgstr "あと %s ノート PC のバッテリーで動作できます" ++ ++#~ msgid "%s %s remaining" ++#~ msgstr "残り %s %s" ++ ++#~ msgid "%s %s until charged" ++#~ msgstr "充電完了まで %s %s" ++ ++#~ msgid "provides %s battery runtime" ++#~ msgstr "あと %s バッテリーで動作できます" ++ ++#~ msgid "Product:" ++#~ msgstr "プロダクト:" ++ ++#~ msgid "Status:" ++#~ msgstr "状態:" ++ ++#~ msgid "Missing" ++#~ msgstr "不明" ++ ++#~ msgid "Charged" ++#~ msgstr "充電完了" ++ ++#~ msgid "Charging" ++#~ msgstr "充電中" ++ ++#~ msgid "Discharging" ++#~ msgstr "放電中" ++ ++#~ msgid "Percentage charge:" ++#~ msgstr "充電率:" ++ ++#~ msgid "Vendor:" ++#~ msgstr "ベンダー:" ++ ++#~ msgid "Technology:" ++#~ msgstr "種別:" ++ ++#~ msgid "Serial number:" ++#~ msgstr "シリアル番号:" ++ ++#~ msgid "Model:" ++#~ msgstr "モデル:" ++ ++#~ msgid "Discharge time:" ++#~ msgstr "放電時間:" ++ ++#~ msgid "Excellent" ++#~ msgstr "優" ++ ++#~ msgid "Good" ++#~ msgstr "良" ++ ++#~ msgid "Fair" ++#~ msgstr "可" ++ ++#~ msgid "Poor" ++#~ msgstr "不可" ++ ++#~ msgid "Capacity:" ++#~ msgstr "容量:" ++ ++#~ msgid "Current charge:" ++#~ msgstr "現在の充電状態:" ++ ++#~ msgid "Last full charge:" ++#~ msgstr "最近の完全充電:" ++ ++# 直訳すると、デザイン料?定格充電としておく。 ++#~ msgid "Design charge:" ++#~ msgstr "定格充電:" ++ ++#~ msgid "Charge rate:" ++#~ msgstr "充電率:" ++ ++#~ msgid "AC adapter" ++#~ msgid_plural "AC adapters" ++#~ msgstr[0] "AC アダプター" ++ ++#~ msgid "Laptop battery" ++#~ msgid_plural "Laptop batteries" ++#~ msgstr[0] "ノート PC のバッテリー" ++ ++#~ msgid "UPS" ++#~ msgid_plural "UPSs" ++#~ msgstr[0] "UPS" ++ ++#~ msgid "Monitor" ++#~ msgid_plural "Monitors" ++#~ msgstr[0] "モニター" ++ ++#~ msgid "PDA" ++#~ msgid_plural "PDAs" ++#~ msgstr[0] "PDA" ++ ++#~ msgid "Cell phone" ++#~ msgid_plural "Cell phones" ++#~ msgstr[0] "携帯電話" ++ ++#~ msgid "Media player" ++#~ msgid_plural "Media players" ++#~ msgstr[0] "メディアプレーヤー" ++ ++#~ msgid "Tablet" ++#~ msgid_plural "Tablets" ++#~ msgstr[0] "タブレット" ++ ++#~ msgid "Computer" ++#~ msgid_plural "Computers" ++#~ msgstr[0] "コンピューター" ++ ++#~ msgid "Lithium Ion" ++#~ msgstr "リチウムイオン" ++ ++#~ msgid "Lithium Polymer" ++#~ msgstr "リチウムポリマー" ++ ++#~ msgid "Lithium Iron Phosphate" ++#~ msgstr "リン酸鉄リチウムイオン" ++ ++#~ msgid "Lead acid" ++#~ msgstr "鉛蓄電池" ++ ++#~ msgid "Nickel Cadmium" ++#~ msgstr "ニッケルカドミウム" ++ ++#~ msgid "Nickel metal hydride" ++#~ msgstr "ニッケル水素" ++ ++#~ msgid "Unknown technology" ++#~ msgstr "種別不明" ++ ++#~ msgid "Empty" ++#~ msgstr "空" ++ ++#~ msgid "Waiting to charge" ++#~ msgstr "充電待ち" ++ ++#~ msgid "Waiting to discharge" ++#~ msgstr "放電待ち" ++ ++#~ msgid "Laptop battery not present" ++#~ msgstr "ノート PC のバッテリーがありません" ++ ++#~ msgid "Laptop battery is charging" ++#~ msgstr "ノート PC のバッテリーの充電中" ++ ++#~ msgid "Laptop battery is discharging" ++#~ msgstr "ノート PC のバッテリーの放電中" ++ ++#~ msgid "Laptop battery is empty" ++#~ msgstr "ノート PC のバッテリーが空です" ++ ++#~ msgid "Laptop battery is charged" ++#~ msgstr "ノート PC のバッテリーの充電完了" + +-#: ../plugins/power/gsd-power-manager.c:2904 +-#: ../plugins/power/gsd-power-manager.c:2909 +-msgid "Computer will suspend very soon because of inactivity." +-msgstr "作業が行われていないため、コンピューターはまもなくサスペンドします。" ++#~ msgid "Laptop battery is waiting to charge" ++#~ msgstr "ノート PC のバッテリーの充電待ちです" + +-#: ../plugins/power/gsd-power-manager.c:2909 +-msgid "Automatic hibernation" +-msgstr "自動ハイバーネート" ++#~ msgid "Laptop battery is waiting to discharge" ++#~ msgstr "ノート PC のバッテリーの放電待ちです" + +-#. SECURITY: +-#. - A normal active user on the local machine does not need permission +-#. to change the backlight brightness. +-#. +-#: ../plugins/power/org.gnome.settings-daemon.plugins.power.policy.in.in.h:5 +-msgid "Modify the laptop brightness" +-msgstr "ノート PC の輝度を変更します" ++#~ msgid "UPS is charging" ++#~ msgstr "UPS の充電中" + +-#: ../plugins/power/org.gnome.settings-daemon.plugins.power.policy.in.in.h:6 +-msgid "Authentication is required to modify the laptop brightness" +-msgstr "ノート PC の輝度を変更するには認証が必要です。" ++#~ msgid "UPS is discharging" ++#~ msgstr "UPS の放電中" + +-#: ../plugins/power/power.gnome-settings-plugin.in.h:2 +-msgid "Power plugin" +-msgstr "電源プラグイン" ++#~ msgid "UPS is empty" ++#~ msgstr "UPS のバッテリーが空です" + +-#. Translators: We are configuring new printer +-#: ../plugins/print-notifications/gsd-printer.c:891 +-msgid "Configuring new printer" +-msgstr "新しいプリンターを設定しています" ++#~ msgid "UPS is charged" ++#~ msgstr "UPS の充電完了" + +-#. Translators: Just wait +-#: ../plugins/print-notifications/gsd-printer.c:893 +-msgid "Please wait..." +-msgstr "お待ちください..." ++#~ msgid "Mouse is charging" ++#~ msgstr "マウスの充電中" + +-#. Translators: We have no driver installed for this printer +-#: ../plugins/print-notifications/gsd-printer.c:920 +-msgid "Missing printer driver" +-msgstr "プリンタードライバーが見つかりません" ++#~ msgid "Mouse is discharging" ++#~ msgstr "マウスの放電中" + +-#. Translators: We have no driver installed for the device +-#: ../plugins/print-notifications/gsd-printer.c:929 +-#, c-format +-msgid "No printer driver for %s." +-msgstr "%s のプリンタードライバーがありません。" ++#~ msgid "Mouse is empty" ++#~ msgstr "マウスのバッテリーが空です" + +-#. Translators: We have no driver installed for this printer +-#: ../plugins/print-notifications/gsd-printer.c:934 +-msgid "No driver for this printer." +-msgstr "このプリンターのドライバーがありません。" ++#~ msgid "Mouse is charged" ++#~ msgstr "マウスの充電完了" + +-#: ../plugins/print-notifications/gsd-printer.c:1032 +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:264 +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:703 +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:793 +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:836 +-msgid "Printers" +-msgstr "プリンター" ++#~ msgid "Keyboard is charging" ++#~ msgstr "キーボードの充電中" + +-#. Translators: The printer is low on toner (same as in system-config-printer) +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:361 +-msgid "Toner low" +-msgstr "トナーが少なくなりました" ++#~ msgid "Keyboard is discharging" ++#~ msgstr "キーボードの放電中" + +-#. Translators: The printer has no toner left (same as in system-config-printer) +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:363 +-msgid "Toner empty" +-msgstr "トナーが空になりました" ++#~ msgid "Keyboard is empty" ++#~ msgstr "キーボードのバッテリーが空です" + +-#. Translators: The printer is in the process of connecting to a shared network output device (same as in system-config-printer) +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:365 +-msgid "Not connected?" +-msgstr "接続されていませんか?" ++#~ msgid "Keyboard is charged" ++#~ msgstr "キーボードの充電完了" + +-#. Translators: One or more covers on the printer are open (same as in system-config-printer) +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:367 +-msgid "Cover open" +-msgstr "カバーが開いています" ++#~ msgid "PDA is charging" ++#~ msgstr "PDA の充電中" + +-#. Translators: A filter or backend is not installed (same as in system-config-printer) +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:369 +-msgid "Printer configuration error" +-msgstr "プリンターの設定エラーです" ++#~ msgid "PDA is discharging" ++#~ msgstr "PDA の放電中" + +-#. Translators: One or more doors on the printer are open (same as in system-config-printer) +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:371 +-msgid "Door open" +-msgstr "ドアが開いています" ++#~ msgid "PDA is empty" ++#~ msgstr "PDA のバッテリーが空です" + +-#. Translators: "marker" is one color bin of the printer +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:373 +-msgid "Marker supply low" +-msgstr "インクが少なくなりました" ++#~ msgid "PDA is charged" ++#~ msgstr "PDA の充電完了" + +-#. Translators: "marker" is one color bin of the printer +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:375 +-msgid "Out of a marker supply" +-msgstr "インク切れです" ++#~ msgid "Cell phone is charging" ++#~ msgstr "携帯電話の充電中" + +-#. Translators: At least one input tray is low on media (same as in system-config-printer) +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:377 +-msgid "Paper low" +-msgstr "用紙が少なくなりました" ++#~ msgid "Cell phone is discharging" ++#~ msgstr "携帯電話の放電中" + +-#. Translators: At least one input tray is empty (same as in system-config-printer) +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:379 +-msgid "Out of paper" +-msgstr "用紙切れです" ++#~ msgid "Cell phone is empty" ++#~ msgstr "携帯電話のバッテリーが空です" + +-#. Translators: The printer is offline (same as in system-config-printer) +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:381 +-msgid "Printer off-line" +-msgstr "プリンターがオフラインです" ++#~ msgid "Cell phone is charged" ++#~ msgstr "携帯電話の充電完了" + +-#. Translators: The printer has detected an error (same as in system-config-printer) +-#. Translators: This is a title of an error notification for a printer +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:383 +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:779 +-msgid "Printer error" +-msgstr "プリンターエラー" ++#~ msgid "Media player is charging" ++#~ msgstr "メディアプレーヤーの充電中" + +-#. Translators: The printer is low on toner (same as in system-config-printer) +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:387 +-#, c-format +-msgid "Printer '%s' is low on toner." +-msgstr "プリンター '%s' のトナーが少なくなりました。" ++#~ msgid "Media player is discharging" ++#~ msgstr "メディアプレーヤーの放電中" + +-#. Translators: The printer has no toner left (same as in system-config-printer) +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:389 +-#, c-format +-msgid "Printer '%s' has no toner left." +-msgstr "プリンター '%s' のトナーが残っていません。" ++#~ msgid "Media player is empty" ++#~ msgstr "メディアプレーヤーのバッテリーが空です" + +-#. Translators: The printer is in the process of connecting to a shared network output device (same as in system-config-printer) +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:391 +-#, c-format +-msgid "Printer '%s' may not be connected." +-msgstr "プリンター '%s' が接続されていないようです。" ++#~ msgid "Media player is charged" ++#~ msgstr "メディアプレーヤーの充電完了" + +-#. Translators: One or more covers on the printer are open (same as in system-config-printer) +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:393 +-#, c-format +-msgid "The cover is open on printer '%s'." +-msgstr "プリンター '%s' のカバーが開いています。" ++#~ msgid "Tablet is charging" ++#~ msgstr "タブレットの充電中" + +-#. Translators: A filter or backend is not installed (same as in system-config-printer) +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:395 +-#, c-format +-msgid "There is a missing print filter for printer '%s'." +-msgstr "プリンター '%s' のプリントフィルターが見つかりません。" ++#~ msgid "Tablet is discharging" ++#~ msgstr "タブレットの放電中" + +-#. Translators: One or more doors on the printer are open (same as in system-config-printer) +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:398 +-#, c-format +-msgid "The door is open on printer '%s'." +-msgstr "プリンター '%s' のドアが開いています。" ++#~ msgid "Tablet is empty" ++#~ msgstr "タブレットのバッテリーが空です" + +-#. Translators: "marker" is one color bin of the printer +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:400 +-#, c-format +-msgid "Printer '%s' is low on a marker supply." +-msgstr "プリンター '%s' のインクが少なくなりました。" ++#~ msgid "Tablet is charged" ++#~ msgstr "タブレットの充電完了" + +-#. Translators: "marker" is one color bin of the printer +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:402 +-#, c-format +-msgid "Printer '%s' is out of a marker supply." +-msgstr "プリンター '%s' のインクがありません。" ++#~ msgid "Computer is charging" ++#~ msgstr "コンピューターの充電中" + +-#. Translators: At least one input tray is low on media (same as in system-config-printer) +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:404 +-#, c-format +-msgid "Printer '%s' is low on paper." +-msgstr "プリンター '%s' の用紙が少なくなっています。" ++#~ msgid "Computer is discharging" ++#~ msgstr "コンピューターの放電中" + +-#. Translators: At least one input tray is empty (same as in system-config-printer) +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:406 +-#, c-format +-msgid "Printer '%s' is out of paper." +-msgstr "プリンター '%s' の用紙がなくなりました。" ++#~ msgid "Computer is empty" ++#~ msgstr "コンピューターのバッテリーが空です" + +-#. Translators: The printer is offline (same as in system-config-printer) +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:408 +-#, c-format +-msgid "Printer '%s' is currently off-line." +-msgstr "プリンター '%s' は現在オフラインです。" ++#~ msgid "Computer is charged" ++#~ msgstr "コンピューターの充電完了" + +-#. Translators: The printer has detected an error (same as in system-config-printer) +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:410 +-#, c-format +-msgid "There is a problem on printer '%s'." +-msgstr "プリンター '%s' で問題が発生しました。" ++#~ msgid "Battery may be recalled" ++#~ msgstr "バッテリーはリコール対象の可能性があります" + +-#. Translators: New printer has been added +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:457 +-msgid "Printer added" +-msgstr "プリンターが追加されました" ++# you may be at risk を 自己責任による変更物 と訳出したが、ここまで強い意味ではないかもしれない。 ++#~ msgid "" ++#~ "A battery in your computer may have been recalled by %s and you may be at " ++#~ "risk." ++#~ msgstr "" ++#~ "お使いのバッテリーは、%s によりリコールされた可能性があり、危険を伴うおそ" ++#~ "れがあります。" + +-#. Translators: A printer has been removed +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:465 +-msgid "Printer removed" +-msgstr "プリンターが削除されました" ++#~ msgid "For more information visit the battery recall website." ++#~ msgstr "" ++#~ "詳細については、バッテリーのリコールに関するウェブサイトを参照してくださ" ++#~ "い。" + +-#. Translators: A print job has been stopped +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:482 +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:520 +-msgctxt "print job state" +-msgid "Printing stopped" +-msgstr "印刷が停止されました" ++#~ msgid "Visit recall website" ++#~ msgstr "リコールウェブサイトへ" + +-#. Translators: "print-job xy" on a printer +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:484 +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:490 +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:496 +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:502 +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:514 +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:522 +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:530 +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:538 +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:546 +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:559 +-#, c-format +-msgctxt "print job" +-msgid "\"%s\" on %s" +-msgstr "\"%2$s\" のジョブ \"%1$s\"" ++#~ msgid "Do not show me this again" ++#~ msgstr "この警告を一切表示しない" + +-#. Translators: A print job has been canceled +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:488 +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:528 +-msgctxt "print job state" +-msgid "Printing canceled" +-msgstr "印刷がキャンセルされました" ++#~ msgid "Plug in your AC adapter to avoid losing data." ++#~ msgstr "データが失われないように AC アダプターを接続してください。" + +-#. Translators: A print job has been aborted +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:494 +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:536 +-msgctxt "print job state" +-msgid "Printing aborted" +-msgstr "印刷が中止されました" ++#~ msgid "Computer will suspend very soon unless it is plugged in." ++#~ msgstr "" ++#~ "アダプターを接続しない場合、コンピューターはまもなくサスペンドします。" + +-#. Translators: A print job has been completed +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:500 +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:544 +-msgctxt "print job state" +-msgid "Printing completed" +-msgstr "印刷が完了しました" ++#~ msgid "" ++#~ "The battery is below the critical level and this computer will power-" ++#~ "off when the battery becomes completely empty." ++#~ msgstr "" ++#~ "バッテリーがクリティカルなレベルを下回っています。バッテリーが完全に空にな" ++#~ "ると、このコンピューターは電源オフします。" + +-#. Translators: A job is printing +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:512 +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:557 +-msgctxt "print job state" +-msgid "Printing" +-msgstr "印刷" ++#~ msgid "" ++#~ "The battery is below the critical level and this computer is about to " ++#~ "suspend.\n" ++#~ "NOTE: A small amount of power is required to keep your computer in " ++#~ "a suspended state." ++#~ msgstr "" ++#~ "バッテリーがクリティカルなレベルを下回っています。このコンピューターはまも" ++#~ "なくサスペンドします。\n" ++#~ "注意: コンピューターのサスペンド状態を保つため、わずかな電力が必要" ++#~ "です。" + +-#. Translators: This is a title of a report notification for a printer +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:773 +-msgid "Printer report" +-msgstr "プリンターの報告" ++#~ msgid "" ++#~ "UPS is below the critical level and this computer will power-off " ++#~ "when the UPS becomes completely empty." ++#~ msgstr "" ++#~ "UPS がクリティカルなレベルを下回っています。 完全に空になるとこのコン" ++#~ "ピューターは電源オフします。" + +-#. Translators: This is a title of a warning notification for a printer +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:776 +-msgid "Printer warning" +-msgstr "プリンターの警告" ++#~ msgid "Power plugin" ++#~ msgstr "電源プラグイン" + +-#. Translators: "Printer 'MyPrinterName': 'Description of the report/warning/error from a PPD file'." +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:786 +-#, c-format +-msgid "Printer '%s': '%s'." +-msgstr "プリンター '%s': '%s'" ++#~ msgid "Printer removed" ++#~ msgstr "プリンターが削除されました" + +-#. Priority=100 +-#: ../plugins/print-notifications/print-notifications.gnome-settings-plugin.in.h:2 +-msgid "Print-notifications" +-msgstr "印刷通知" ++#~ msgid "Print-notifications" ++#~ msgstr "印刷通知" + +-#: ../plugins/print-notifications/print-notifications.gnome-settings-plugin.in.h:3 +-msgid "Print-notifications plugin" +-msgstr "印刷通知プラグイン" ++#~ msgid "Print-notifications plugin" ++#~ msgstr "印刷通知プラグイン" + +-#: ../plugins/remote-display/remote-display.gnome-settings-plugin.in.h:1 +-msgid "Remote Display" +-msgstr "リモートディスプレイ" ++#~ msgid "Remote Display" ++#~ msgstr "リモートディスプレイ" + +-#: ../plugins/remote-display/remote-display.gnome-settings-plugin.in.h:2 +-msgid "Disable animations on remote displays" +-msgstr "リモートディスプレイでアニメーションを無効にする" ++#~ msgid "Disable animations on remote displays" ++#~ msgstr "リモートディスプレイでアニメーションを無効にする" + +-#. Priority=100 +-#: ../plugins/rfkill/rfkill.gnome-settings-plugin.in.h:2 +-msgid "Rfkill" +-msgstr "Rfkill" ++#~ msgid "Rfkill" ++#~ msgstr "Rfkill" + +-#: ../plugins/rfkill/rfkill.gnome-settings-plugin.in.h:3 +-msgid "Rfkill plugin" +-msgstr "Rfkill プラグイン" ++#~ msgid "Rfkill plugin" ++#~ msgstr "Rfkill プラグイン" + +-#: ../plugins/screensaver-proxy/screensaver-proxy.gnome-settings-plugin.in.h:1 +-msgid "Screensaver Proxy" +-msgstr "スクリーンセーバープロキシ" ++#~ msgid "Screensaver Proxy" ++#~ msgstr "スクリーンセーバープロキシ" + +-#: ../plugins/screensaver-proxy/screensaver-proxy.gnome-settings-plugin.in.h:2 +-msgid "Proxy FreeDesktop screensaver inhibition to gnome-session" +-msgstr "gnome-session の機能を抑止する FreeDesktop スクリーンセーバープロキシ" ++#~ msgid "Proxy FreeDesktop screensaver inhibition to gnome-session" ++#~ msgstr "" ++#~ "gnome-session の機能を抑止する FreeDesktop スクリーンセーバープロキシ" + +-#: ../plugins/smartcard/gsd-smartcard-service.c:224 +-msgid "User was not logged in with smartcard." +-msgstr "スマートカードではログインできません" +- +-#: ../plugins/smartcard/smartcard.gnome-settings-plugin.in.h:1 +-msgid "Smartcard" +-msgstr "スマートカード" +- +-#: ../plugins/smartcard/smartcard.gnome-settings-plugin.in.h:2 +-msgid "Smartcard plugin" +-msgstr "スマートカードプラグイン" +- +-#: ../plugins/sound/sound.gnome-settings-plugin.in.h:1 +-msgid "Sound" +-msgstr "サウンド" +- +-#: ../plugins/sound/sound.gnome-settings-plugin.in.h:2 +-msgid "Sound Sample Cache plugin" +-msgstr "サウンドサンプルキャッシュのプラグイン" +- +-#. TRANSLATORS: we need to restart so the new hardware can re-request the firmware +-#: ../plugins/updates/gsd-updates-firmware.c:250 +-msgid "You will need to restart this computer before the hardware will work correctly." +-msgstr "ハードウェアを正しく動作させるには、コンピューターを再起動する必要があります。" +- +-#. TRANSLATORS: title of libnotify bubble +-#: ../plugins/updates/gsd-updates-firmware.c:253 +-#: ../plugins/updates/gsd-updates-firmware.c:281 +-#: ../plugins/updates/gsd-updates-firmware.c:309 +-msgid "Additional software was installed" +-msgstr "追加のソフトウェアがインストールされました" +- +-#: ../plugins/updates/gsd-updates-firmware.c:255 +-#: ../plugins/updates/gsd-updates-firmware.c:283 +-#: ../plugins/updates/gsd-updates-firmware.c:311 +-#: ../plugins/updates/gsd-updates-firmware.c:603 +-#: ../plugins/updates/gsd-updates-manager.c:383 +-#: ../plugins/updates/gsd-updates-manager.c:514 +-#: ../plugins/updates/gsd-updates-manager.c:578 +-#: ../plugins/updates/gsd-updates-manager.c:634 +-#: ../plugins/updates/gsd-updates-manager.c:1283 +-msgid "Software Updates" +-msgstr "ソフトウェアの更新" +- +-#. TRANSLATORS: we need to remove an replug so the new hardware can re-request the firmware +-#: ../plugins/updates/gsd-updates-firmware.c:278 +-msgid "You will need to remove and then reinsert the hardware before it will work correctly." +-msgstr "ハードウェアを正しく動作させるには、一度取り外してから接続し直す必要があります。" +- +-#. TRANSLATORS: we need to remove an replug so the new hardware can re-request the firmware +-#: ../plugins/updates/gsd-updates-firmware.c:306 +-msgid "Your hardware has been set up and is now ready to use." +-msgstr "ハードウェアの設定が完了し、使用可能になりました。" +- +-#. TRANSLATORS: we need another package to keep udev quiet +-#: ../plugins/updates/gsd-updates-firmware.c:587 +-msgid "Additional firmware is required to make hardware in this computer function correctly." +-msgstr "このコンピューターのハードウェアの機能を正常にするため、追加のファームウェアが必要です。" +- +-#. TRANSLATORS: title of libnotify bubble +-#: ../plugins/updates/gsd-updates-firmware.c:601 +-msgid "Additional firmware required" +-msgstr "追加のファームウェアの要求" +- +-#. TRANSLATORS: button label +-#: ../plugins/updates/gsd-updates-firmware.c:608 +-msgid "Install firmware" +-msgstr "ファームウェアのインストール" +- +-#. TRANSLATORS: we should ignore this device and not ask anymore +-#: ../plugins/updates/gsd-updates-firmware.c:611 +-msgid "Ignore devices" +-msgstr "デバイスを無視" +- +-#. TRANSLATORS: this is when the offline update failed +-#: ../plugins/updates/gsd-updates-manager.c:124 +-msgid "Failed To Update" +-msgstr "更新の失敗" +- +-#. TRANSLATORS: the transaction could not be completed +-#. * as a previous transaction was unfinished +-#: ../plugins/updates/gsd-updates-manager.c:130 +-msgid "A previous update was unfinished." +-msgstr "前回の更新が完了していません。" +- +-#. TRANSLATORS: the package manager needed to download +-#. * something with no network available +-#: ../plugins/updates/gsd-updates-manager.c:140 +-msgid "Network access was required but not available." +-msgstr "ネットワークアクセスが必要ですが、利用できません。" +- +-#. TRANSLATORS: if the package is not signed correctly +-#. * +-#: ../plugins/updates/gsd-updates-manager.c:149 +-msgid "An update was not signed in the correct way." +-msgstr "更新は正しい方法で署名されていません。" +- +-#. TRANSLATORS: the transaction failed in a way the user +-#. * probably cannot comprehend. Package management systems +-#. * really are teh suck. +-#: ../plugins/updates/gsd-updates-manager.c:159 +-msgid "The update could not be completed." +-msgstr "更新を完了できませんでした。" +- +-#. TRANSLATORS: the user aborted the update manually +-#: ../plugins/updates/gsd-updates-manager.c:164 +-msgid "The update was cancelled." +-msgstr "更新がキャンセルされました。" +- +-#. TRANSLATORS: the user must have updated manually after +-#. * the updates were prepared +-#: ../plugins/updates/gsd-updates-manager.c:170 +-msgid "An offline update was requested but no packages required updating." +-msgstr "オフラインの更新が要求されましたが、必要な更新パッケージはありません。" +- +-#. TRANSLATORS: we ran out of disk space +-#: ../plugins/updates/gsd-updates-manager.c:174 +-msgid "No space was left on the drive." +-msgstr "ドライブに空き領域がありません。" +- +-#. TRANSLATORS: the update process failed in a general +-#. * way, usually this message will come from source distros +-#. * like gentoo +-#: ../plugins/updates/gsd-updates-manager.c:182 +-msgid "An update failed to install correctly." +-msgstr "更新のインストールが正常に終わりませんでした。" +- +-#. TRANSLATORS: We didn't handle the error type +-#: ../plugins/updates/gsd-updates-manager.c:187 +-msgid "The offline update failed in an unexpected way." +-msgstr "オフラインの更新で予期せぬエラーが発生しました。" +- +-#. TRANSLATORS: these are geeky messages from the +-#. * package manager no mortal is supposed to understand, +-#. * but google might know what they mean +-#: ../plugins/updates/gsd-updates-manager.c:196 +-msgid "Detailed errors from the package manager follow:" +-msgstr "パッケージマネジャーからのエラーの詳細は次のとおり:" +- +-#. TRANSLATORS: a distro update is available, e.g. Fedora 8 to Fedora 9 +-#: ../plugins/updates/gsd-updates-manager.c:378 +-msgid "Distribution upgrades available" +-msgstr "ディストリビューションの更新が利用可能です。" +- +-#. TRANSLATORS: provides more information about the upgrade +-#: ../plugins/updates/gsd-updates-manager.c:388 +-msgid "More information" +-msgstr "更新の追加情報" +- +-#. TRANSLATORS: title in the libnotify popup +-#: ../plugins/updates/gsd-updates-manager.c:496 +-#: ../plugins/updates/gsd-updates-manager.c:560 +-msgid "Update" +-msgid_plural "Updates" +-msgstr[0] "更新" +- +-#. TRANSLATORS: message when there are security updates +-#: ../plugins/updates/gsd-updates-manager.c:499 +-msgid "An important software update is available" +-msgid_plural "Important software updates are available" +-msgstr[0] "重要なソフトウェアの更新が利用可能です" +- +-#. TRANSLATORS: button: open the update viewer to install updates +-#: ../plugins/updates/gsd-updates-manager.c:519 +-#: ../plugins/updates/gsd-updates-manager.c:583 +-msgid "Install updates" +-msgstr "更新のインストール" +- +-#. TRANSLATORS: message when there are non-security updates +-#: ../plugins/updates/gsd-updates-manager.c:563 +-msgid "A software update is available." +-msgid_plural "Software updates are available." +-msgstr[0] "ソフトウェアの更新が利用可能です。" +- +-#. TRANSLATORS: the updates mechanism +-#: ../plugins/updates/gsd-updates-manager.c:621 +-#: ../plugins/updates/updates.gnome-settings-plugin.in.h:1 +-msgid "Updates" +-msgstr "更新" +- +-#. TRANSLATORS: we failed to get the updates multiple times, +-#. * and now we need to inform the user that something might be wrong +-#: ../plugins/updates/gsd-updates-manager.c:625 +-msgid "Unable to access software updates" +-msgstr "ソフトウェアの更新にアクセスできません" +- +-#. TRANSLATORS: try again, this time launching the update viewer +-#: ../plugins/updates/gsd-updates-manager.c:628 +-msgid "Try again" +-msgstr "再試行" +- +-#. TRANSLATORS: the reason why we've inhibited it +-#: ../plugins/updates/gsd-updates-manager.c:1013 +-msgid "A transaction that cannot be interrupted is running" +-msgstr "実行時に中断できないトランザクションです" +- +-#. TRANSLATORS: title in the libnotify popup +-#: ../plugins/updates/gsd-updates-manager.c:1233 +-msgid "Software Update Installed" +-msgid_plural "Software Updates Installed" +-msgstr[0] "更新されたソフトウェアがインストールされました" +- +-#. TRANSLATORS: message when we've done offline updates +-#: ../plugins/updates/gsd-updates-manager.c:1238 +-msgid "An important OS update has been installed." +-msgid_plural "Important OS updates have been installed." +-msgstr[0] "重要な OS の更新がインストールされました。" +- +-#. TRANSLATORS: title in the libnotify popup +-#: ../plugins/updates/gsd-updates-manager.c:1264 +-msgid "Software Updates Failed" +-msgstr "ソフトウェアの更新に失敗しました" +- +-#. TRANSLATORS: message when we've not done offline updates +-#: ../plugins/updates/gsd-updates-manager.c:1267 +-msgid "An important OS update failed to be installed." +-msgstr "重要な OS 更新のインストールに失敗しました。" +- +-#. TRANSLATORS: button: review the offline update changes +-#: ../plugins/updates/gsd-updates-manager.c:1290 +-msgid "Review" +-msgstr "確認" +- +-#. TRANSLATORS: button: review the offline update changes +-#: ../plugins/updates/gsd-updates-manager.c:1294 +-msgid "Show details" +-msgstr "詳細の表示" +- +-#. TRANSLATORS: button: clear notification +-#: ../plugins/updates/gsd-updates-manager.c:1298 +-msgid "OK" +-msgstr "OK" +- +-#: ../plugins/updates/gsd-updates-manager.c:1438 +-msgid "Software Updates available" +-msgstr "ソフトウェアの更新が利用可能" +- +-#: ../plugins/updates/gsd-updates-manager.c:1439 +-msgid "Important OS and application updates are ready to be installed" +-msgstr "OS とアプリケーションの重要な更新をインストールする準備ができました" +- +-#: ../plugins/updates/gsd-updates-manager.c:1443 +-msgid "GNOME Software" +-msgstr "GNOME ソフトウェア" +- +-#. TRANSLATORS: don't install updates now +-#: ../plugins/updates/gsd-updates-manager.c:1448 +-msgid "Not Now" +-msgstr "あとで" +- +-#. TRANSLATORS: view available updates +-#: ../plugins/updates/gsd-updates-manager.c:1454 +-msgid "View" +-msgstr "表示" +- +-#. TRANSLATORS: install available updates +-#: ../plugins/updates/gsd-updates-manager.c:1460 +-msgid "Restart & Install" +-msgstr "再起動してインストール" +- +-#: ../plugins/updates/updates.gnome-settings-plugin.in.h:2 +-msgid "Updates plugin" +-msgstr "更新プラグイン" +- +-#: ../plugins/wacom/gsd-wacom-button-editor.c:51 +-msgctxt "Wacom action-type" +-msgid "None" +-msgstr "なし" +- +-#: ../plugins/wacom/gsd-wacom-button-editor.c:52 +-msgctxt "Wacom action-type" +-msgid "Send Keystroke" +-msgstr "キーストロークを送信" +- +-#: ../plugins/wacom/gsd-wacom-button-editor.c:53 +-msgctxt "Wacom action-type" +-msgid "Switch Monitor" +-msgstr "モニターを切り替える" +- +-#: ../plugins/wacom/gsd-wacom-button-editor.c:54 +-msgctxt "Wacom action-type" +-msgid "Show On-Screen Help" +-msgstr "オンスクリーンヘルプを表示" +- +-#: ../plugins/wacom/gsd-wacom-button-editor.c:184 +-msgctxt "keyboard shortcut" +-msgid "None" +-msgstr "なし" +- +-#: ../plugins/wacom/gsd-wacom-button-editor.c:459 +-msgid "Done" +-msgstr "完了" +- +-#. If no mode is available, we use "left-ring-mode-1" for backward compat +-#: ../plugins/wacom/gsd-wacom-device.c:1063 +-msgid "Left Ring" +-msgstr "左タッチホイール" +- +-#: ../plugins/wacom/gsd-wacom-device.c:1074 +-#, c-format +-msgid "Left Ring Mode #%d" +-msgstr "左タッチホイールのモード #%d" ++#~ msgid "Smartcard" ++#~ msgstr "スマートカード" + +-#. If no mode is available, we use "right-ring-mode-1" for backward compat +-#: ../plugins/wacom/gsd-wacom-device.c:1094 +-msgid "Right Ring" +-msgstr "右タッチホイール" ++#~ msgid "Smartcard plugin" ++#~ msgstr "スマートカードプラグイン" + +-#: ../plugins/wacom/gsd-wacom-device.c:1105 +-#, c-format +-msgid "Right Ring Mode #%d" +-msgstr "右タッチホイールのモード #%d" ++#~ msgid "Sound" ++#~ msgstr "サウンド" + +-#. If no mode is available, we use "left-strip-mode-1" for backward compat +-#: ../plugins/wacom/gsd-wacom-device.c:1147 +-msgid "Left Touchstrip" +-msgstr "左トラックパッド" ++#~ msgid "Sound Sample Cache plugin" ++#~ msgstr "サウンドサンプルキャッシュのプラグイン" + +-#: ../plugins/wacom/gsd-wacom-device.c:1158 +-#, c-format +-msgid "Left Touchstrip Mode #%d" +-msgstr "左トラックパッドのモード #%d" ++#~ msgid "" ++#~ "You will need to restart this computer before the hardware will work " ++#~ "correctly." ++#~ msgstr "" ++#~ "ハードウェアを正しく動作させるには、コンピューターを再起動する必要がありま" ++#~ "す。" + +-#. If no mode is available, we use "right-strip-mode-1" for backward compat +-#: ../plugins/wacom/gsd-wacom-device.c:1178 +-msgid "Right Touchstrip" +-msgstr "右トラックパッド" ++#~ msgid "Additional software was installed" ++#~ msgstr "追加のソフトウェアがインストールされました" + +-#: ../plugins/wacom/gsd-wacom-device.c:1189 +-#, c-format +-msgid "Right Touchstrip Mode #%d" +-msgstr "右トラックパッドのモード #%d" ++#~ msgid "Software Updates" ++#~ msgstr "ソフトウェアの更新" + +-#: ../plugins/wacom/gsd-wacom-device.c:1215 +-#, c-format +-msgid "Left Touchring Mode Switch" +-msgstr "左タッチホイールのモードスイッチ" ++#~ msgid "" ++#~ "You will need to remove and then reinsert the hardware before it will " ++#~ "work correctly." ++#~ msgstr "" ++#~ "ハードウェアを正しく動作させるには、一度取り外してから接続し直す必要があり" ++#~ "ます。" + +-#: ../plugins/wacom/gsd-wacom-device.c:1217 +-#, c-format +-msgid "Right Touchring Mode Switch" +-msgstr "右タッチホイールのモードスイッチ" ++#~ msgid "Your hardware has been set up and is now ready to use." ++#~ msgstr "ハードウェアの設定が完了し、使用可能になりました。" + +-#: ../plugins/wacom/gsd-wacom-device.c:1220 +-#, c-format +-msgid "Left Touchstrip Mode Switch" +-msgstr "左トラックパッドのモードスイッチ" ++#~ msgid "" ++#~ "Additional firmware is required to make hardware in this computer " ++#~ "function correctly." ++#~ msgstr "" ++#~ "このコンピューターのハードウェアの機能を正常にするため、追加のファームウェ" ++#~ "アが必要です。" + +-#: ../plugins/wacom/gsd-wacom-device.c:1222 +-#, c-format +-msgid "Right Touchstrip Mode Switch" +-msgstr "右トラックパッドのモードスイッチ" ++#~ msgid "Additional firmware required" ++#~ msgstr "追加のファームウェアの要求" + +-#: ../plugins/wacom/gsd-wacom-device.c:1227 +-#, c-format +-msgid "Mode Switch #%d" +-msgstr "モードスイッチ #%d" ++#~ msgid "Install firmware" ++#~ msgstr "ファームウェアのインストール" + +-#: ../plugins/wacom/gsd-wacom-device.c:1335 +-#, c-format +-msgid "Left Button #%d" +-msgstr "左ボタン #%d" ++#~ msgid "Ignore devices" ++#~ msgstr "デバイスを無視" + +-#: ../plugins/wacom/gsd-wacom-device.c:1338 +-#, c-format +-msgid "Right Button #%d" +-msgstr "右ボタン #%d" ++#~ msgid "Failed To Update" ++#~ msgstr "更新の失敗" + +-#: ../plugins/wacom/gsd-wacom-device.c:1341 +-#, c-format +-msgid "Top Button #%d" +-msgstr "上ボタン #%d" ++#~ msgid "A previous update was unfinished." ++#~ msgstr "前回の更新が完了していません。" + +-#: ../plugins/wacom/gsd-wacom-device.c:1344 +-#, c-format +-msgid "Bottom Button #%d" +-msgstr "下ボタン #%d" ++#~ msgid "Network access was required but not available." ++#~ msgstr "ネットワークアクセスが必要ですが、利用できません。" + +-#: ../plugins/wacom/gsd-wacom-key-shortcut-button.c:264 +-msgid "New shortcut…" +-msgstr "新しいショートカット…" ++#~ msgid "An update was not signed in the correct way." ++#~ msgstr "更新は正しい方法で署名されていません。" + +-#: ../plugins/wacom/gsd-wacom-manager.c:1079 +-#, c-format +-msgid "The \"%s\" tablet may not work as expected." +-msgstr "\"%s\" タブレットは期待通りに動作しない可能性があります。" ++#~ msgid "The update could not be completed." ++#~ msgstr "更新を完了できませんでした。" + +-#: ../plugins/wacom/gsd-wacom-manager.c:1080 +-msgid "Unknown Tablet Connected" +-msgstr "未知のタブレットを接続" ++#~ msgid "The update was cancelled." ++#~ msgstr "更新がキャンセルされました。" + +-#: ../plugins/wacom/gsd-wacom-manager.c:1083 +-#: ../plugins/wacom/gsd-wacom-manager.c:1658 +-msgid "Wacom Settings" +-msgstr "Wacom の設定" ++#~ msgid "An offline update was requested but no packages required updating." ++#~ msgstr "" ++#~ "オフラインの更新が要求されましたが、必要な更新パッケージはありません。" + +-#: ../plugins/wacom/gsd-wacom-manager.c:1651 +-#, c-format +-msgid "Tablet %s needs to be calibrated." +-msgstr "タブレット '%s' は、キャリブレーションする必要があります。" ++#~ msgid "No space was left on the drive." ++#~ msgstr "ドライブに空き領域がありません。" + +-#: ../plugins/wacom/gsd-wacom-manager.c:1653 +-msgid "Calibration needed" +-msgstr "キャリブレーションが必要" ++#~ msgid "An update failed to install correctly." ++#~ msgstr "更新のインストールが正常に終わりませんでした。" + +-#: ../plugins/wacom/gsd-wacom-manager.c:1667 +-msgid "Calibrate" +-msgstr "キャリブレーション" ++#~ msgid "The offline update failed in an unexpected way." ++#~ msgstr "オフラインの更新で予期せぬエラーが発生しました。" + +-#: ../plugins/wacom/gsd-wacom-osd-window.c:1048 +-#: ../plugins/wacom/gsd-wacom-osd-window.c:1068 +-#: ../plugins/wacom/gsd-wacom-osd-window.c:1079 +-msgctxt "Action type" +-msgid "None" +-msgstr "なし" ++#~ msgid "Detailed errors from the package manager follow:" ++#~ msgstr "パッケージマネジャーからのエラーの詳細は次のとおり:" + +-#: ../plugins/wacom/gsd-wacom-osd-window.c:1053 +-#, c-format +-msgctxt "Action type" +-msgid "Send Keystroke %s" +-msgstr "キーストローク %s を送信" ++#~ msgid "Distribution upgrades available" ++#~ msgstr "ディストリビューションの更新が利用可能です。" + +-#: ../plugins/wacom/gsd-wacom-osd-window.c:1071 +-msgctxt "Action type" +-msgid "Show On-Screen Help" +-msgstr "オンスクリーンヘルプを表示" ++#~ msgid "More information" ++#~ msgstr "更新の追加情報" + +-#: ../plugins/wacom/gsd-wacom-osd-window.c:1074 +-msgctxt "Action type" +-msgid "Switch Monitor" +-msgstr "モニターを切り替える" ++#~ msgid "Update" ++#~ msgid_plural "Updates" ++#~ msgstr[0] "更新" + +-#: ../plugins/wacom/gsd-wacom-osd-window.c:1112 +-#, c-format +-msgid "Mode %d: %s" +-msgstr "モード %d: %s" ++#~ msgid "An important software update is available" ++#~ msgid_plural "Important software updates are available" ++#~ msgstr[0] "重要なソフトウェアの更新が利用可能です" + +-#: ../plugins/wacom/gsd-wacom-osd-window.c:1321 +-msgid "(press any key to exit)" +-msgstr "(何かキーを押して終了)" ++#~ msgid "Install updates" ++#~ msgstr "更新のインストール" + +-#: ../plugins/wacom/gsd-wacom-osd-window.c:1330 +-msgid "Push a button to configure" +-msgstr "設定するボタンを押してください" ++#~ msgid "A software update is available." ++#~ msgid_plural "Software updates are available." ++#~ msgstr[0] "ソフトウェアの更新が利用可能です。" + +-#: ../plugins/wacom/gsd-wacom-osd-window.c:1330 +-msgid "(Esc to cancel)" +-msgstr "(Esc でキャンセル)" ++#~ msgid "Updates" ++#~ msgstr "更新" + +-#: ../plugins/wacom/gsd-wacom-osd-window.c:1960 +-msgid "Edit" +-msgstr "編集" ++#~ msgid "Unable to access software updates" ++#~ msgstr "ソフトウェアの更新にアクセスできません" + +-#. SECURITY: +-#. - A normal active user on the local machine does not need permission +-#. to change the LED setting for a Wacom tablet +-#. +-#: ../plugins/wacom/org.gnome.settings-daemon.plugins.wacom.policy.in.in.h:5 +-msgid "Modify the lit LED for a Wacom tablet" +-msgstr "Wacom タブレットの LED 設定の変更" ++#~ msgid "Try again" ++#~ msgstr "再試行" + +-#: ../plugins/wacom/org.gnome.settings-daemon.plugins.wacom.policy.in.in.h:6 +-msgid "Authentication is required to modify the lit LED for a Wacom tablet" +-msgstr "Wacom タブレットの LED 設定の変更には認証が必要です。" ++#~ msgid "A transaction that cannot be interrupted is running" ++#~ msgstr "実行時に中断できないトランザクションです" + +-#. SECURITY: +-#. - A normal active user on the local machine does not need permission +-#. to change the OLED images for a Wacom tablet +-#. +-#: ../plugins/wacom/org.gnome.settings-daemon.plugins.wacom.policy.in.in.h:11 +-msgid "Modify the OLED image for a Wacom tablet" +-msgstr "Wacom タブレットの OLED イメージの変更" ++#~ msgid "Software Update Installed" ++#~ msgid_plural "Software Updates Installed" ++#~ msgstr[0] "更新されたソフトウェアがインストールされました" + +-#: ../plugins/wacom/org.gnome.settings-daemon.plugins.wacom.policy.in.in.h:12 +-msgid "Authentication is required to modify the OLED image for a Wacom tablet" +-msgstr "Wacom タブレットの OLED イメージの変更には認証が必要です。" ++#~ msgid "An important OS update has been installed." ++#~ msgid_plural "Important OS updates have been installed." ++#~ msgstr[0] "重要な OS の更新がインストールされました。" + +-#: ../plugins/wacom/wacom.gnome-settings-plugin.in.h:1 +-msgid "Wacom" +-msgstr "Wacom" ++#~ msgid "Software Updates Failed" ++#~ msgstr "ソフトウェアの更新に失敗しました" + +-#: ../plugins/wacom/wacom.gnome-settings-plugin.in.h:2 +-msgid "Wacom plugin" +-msgstr "Wacom プラグイン" ++#~ msgid "An important OS update failed to be installed." ++#~ msgstr "重要な OS 更新のインストールに失敗しました。" + +-#: ../plugins/xrandr/gsd-xrandr-manager.c:977 +-#, c-format +-msgid "Could not refresh the screen information: %s" +-msgstr "スクリーンの情報を更新できませんでした: %s" ++#~ msgid "Review" ++#~ msgstr "確認" ++ ++#~ msgid "Show details" ++#~ msgstr "詳細の表示" ++ ++#~ msgid "OK" ++#~ msgstr "OK" ++ ++#~ msgid "Software Updates available" ++#~ msgstr "ソフトウェアの更新が利用可能" ++ ++#~ msgid "Important OS and application updates are ready to be installed" ++#~ msgstr "OS とアプリケーションの重要な更新をインストールする準備ができました" ++ ++#~ msgid "GNOME Software" ++#~ msgstr "GNOME ソフトウェア" ++ ++#~ msgid "Not Now" ++#~ msgstr "あとで" + +-#: ../plugins/xrandr/xrandr.gnome-settings-plugin.in.h:1 +-msgid "XRandR" +-msgstr "XRandR" ++#~ msgid "View" ++#~ msgstr "表示" + +-#: ../plugins/xrandr/xrandr.gnome-settings-plugin.in.h:2 +-msgid "Set up screen size and rotation settings" +-msgstr "画面の大きさや回転といった設定を管理します" ++#~ msgid "Restart & Install" ++#~ msgstr "再起動してインストール" + +-#: ../plugins/xsettings/xsettings.gnome-settings-plugin.in.h:1 +-msgid "X Settings" +-msgstr "X の設定" ++#~ msgid "Updates plugin" ++#~ msgstr "更新プラグイン" + +-#: ../plugins/xsettings/xsettings.gnome-settings-plugin.in.h:2 +-msgid "Manage X Settings" +-msgstr "X の設定を管理します" ++#~ msgctxt "Wacom action-type" ++#~ msgid "None" ++#~ msgstr "なし" ++ ++#~ msgctxt "Wacom action-type" ++#~ msgid "Send Keystroke" ++#~ msgstr "キーストロークを送信" ++ ++#~ msgctxt "Wacom action-type" ++#~ msgid "Switch Monitor" ++#~ msgstr "モニターを切り替える" ++ ++#~ msgctxt "Wacom action-type" ++#~ msgid "Show On-Screen Help" ++#~ msgstr "オンスクリーンヘルプを表示" ++ ++#~ msgctxt "keyboard shortcut" ++#~ msgid "None" ++#~ msgstr "なし" ++ ++#~ msgid "Done" ++#~ msgstr "完了" ++ ++#~ msgid "Left Ring" ++#~ msgstr "左タッチホイール" ++ ++#~ msgid "Left Ring Mode #%d" ++#~ msgstr "左タッチホイールのモード #%d" ++ ++#~ msgid "Right Ring" ++#~ msgstr "右タッチホイール" ++ ++#~ msgid "Right Ring Mode #%d" ++#~ msgstr "右タッチホイールのモード #%d" ++ ++#~ msgid "Left Touchstrip" ++#~ msgstr "左トラックパッド" ++ ++#~ msgid "Left Touchstrip Mode #%d" ++#~ msgstr "左トラックパッドのモード #%d" ++ ++#~ msgid "Right Touchstrip" ++#~ msgstr "右トラックパッド" ++ ++#~ msgid "Right Touchstrip Mode #%d" ++#~ msgstr "右トラックパッドのモード #%d" ++ ++#~ msgid "Left Touchring Mode Switch" ++#~ msgstr "左タッチホイールのモードスイッチ" ++ ++#~ msgid "Right Touchring Mode Switch" ++#~ msgstr "右タッチホイールのモードスイッチ" ++ ++#~ msgid "Left Touchstrip Mode Switch" ++#~ msgstr "左トラックパッドのモードスイッチ" ++ ++#~ msgid "Right Touchstrip Mode Switch" ++#~ msgstr "右トラックパッドのモードスイッチ" ++ ++#~ msgid "Mode Switch #%d" ++#~ msgstr "モードスイッチ #%d" ++ ++#~ msgid "Left Button #%d" ++#~ msgstr "左ボタン #%d" ++ ++#~ msgid "Right Button #%d" ++#~ msgstr "右ボタン #%d" ++ ++#~ msgid "Top Button #%d" ++#~ msgstr "上ボタン #%d" ++ ++#~ msgid "Bottom Button #%d" ++#~ msgstr "下ボタン #%d" ++ ++#~ msgid "New shortcut…" ++#~ msgstr "新しいショートカット…" ++ ++#~ msgid "The \"%s\" tablet may not work as expected." ++#~ msgstr "\"%s\" タブレットは期待通りに動作しない可能性があります。" ++ ++#~ msgid "Unknown Tablet Connected" ++#~ msgstr "未知のタブレットを接続" ++ ++#~ msgid "Tablet %s needs to be calibrated." ++#~ msgstr "タブレット '%s' は、キャリブレーションする必要があります。" ++ ++#~ msgid "Calibration needed" ++#~ msgstr "キャリブレーションが必要" ++ ++#~ msgid "Calibrate" ++#~ msgstr "キャリブレーション" ++ ++#~ msgctxt "Action type" ++#~ msgid "None" ++#~ msgstr "なし" ++ ++#~ msgctxt "Action type" ++#~ msgid "Send Keystroke %s" ++#~ msgstr "キーストローク %s を送信" ++ ++#~ msgctxt "Action type" ++#~ msgid "Show On-Screen Help" ++#~ msgstr "オンスクリーンヘルプを表示" ++ ++#~ msgctxt "Action type" ++#~ msgid "Switch Monitor" ++#~ msgstr "モニターを切り替える" ++ ++#~ msgid "Mode %d: %s" ++#~ msgstr "モード %d: %s" ++ ++#~ msgid "(press any key to exit)" ++#~ msgstr "(何かキーを押して終了)" ++ ++#~ msgid "Push a button to configure" ++#~ msgstr "設定するボタンを押してください" ++ ++#~ msgid "(Esc to cancel)" ++#~ msgstr "(Esc でキャンセル)" ++ ++#~ msgid "Edit" ++#~ msgstr "編集" ++ ++#~ msgid "Wacom" ++#~ msgstr "Wacom" ++ ++#~ msgid "Wacom plugin" ++#~ msgstr "Wacom プラグイン" ++ ++#~ msgid "Could not refresh the screen information: %s" ++#~ msgstr "スクリーンの情報を更新できませんでした: %s" ++ ++#~ msgid "XRandR" ++#~ msgstr "XRandR" ++ ++#~ msgid "Set up screen size and rotation settings" ++#~ msgstr "画面の大きさや回転といった設定を管理します" ++ ++#~ msgid "X Settings" ++#~ msgstr "X の設定" ++ ++#~ msgid "Manage X Settings" ++#~ msgstr "X の設定を管理します" + + #~ msgid "Could not enable mouse accessibility features" + #~ msgstr "マウスの操作性に関する機能を有効にできませんでした" + +-#~ msgid "Mouse accessibility requires Mousetweaks to be installed on your system." +-#~ msgstr "マウスのアクセシビリティに関する機能を有効にするには mousetweaks がインストールされている必要があります。" ++#~ msgid "" ++#~ "Mouse accessibility requires Mousetweaks to be installed on your system." ++#~ msgstr "" ++#~ "マウスのアクセシビリティに関する機能を有効にするには mousetweaks がインス" ++#~ "トールされている必要があります。" + + #~ msgid "received error or hang up from event source" + #~ msgstr "イベントの発生源からエラーを受け取ったか、ハングアップしました" +@@ -3010,7 +3088,8 @@ msgstr "X の設定を管理します" + #~ msgstr "バックアップしたディスプレイの設定に戻せませんでした" + + #~ msgid "The display will be reset to its previous configuration in %d second" +-#~ msgid_plural "The display will be reset to its previous configuration in %d seconds" ++#~ msgid_plural "" ++#~ "The display will be reset to its previous configuration in %d seconds" + #~ msgstr[0] " %d秒後に元のディスプレイの設定に戻ります" + + #~ msgid "Does the display look OK?" +@@ -3154,7 +3233,9 @@ msgstr "X の設定を管理します" + #~ msgid "You have just inserted a digital audio player." + #~ msgstr "デジタルオーディオプレーヤーが接続されました。" + +-#~ msgid "You have just inserted a medium with software intended to be automatically started." ++#~ msgid "" ++#~ "You have just inserted a medium with software intended to be " ++#~ "automatically started." + #~ msgstr "自動実行のソフトウェアメディアが挿入されました。" + + #~ msgid "You have just inserted a medium." +@@ -3163,8 +3244,12 @@ msgstr "X の設定を管理します" + #~ msgid "Choose what application to launch." + #~ msgstr "使用するアプリケーションを選択してください。" + +-#~ msgid "Select how to open \"%s\" and whether to perform this action in the future for other media of type \"%s\"." +-#~ msgstr "\"%s\" を開く方法を選択し、この動作を将来ほかのメディアタイプ \"%s\" でも実施するか選択してください。" ++#~ msgid "" ++#~ "Select how to open \"%s\" and whether to perform this action in the " ++#~ "future for other media of type \"%s\"." ++#~ msgstr "" ++#~ "\"%s\" を開く方法を選択し、この動作を将来ほかのメディアタイプ \"%s\" でも" ++#~ "実施するか選択してください。" + + #~ msgid "_Always perform this action" + #~ msgstr "常にこの動作を実施する(_A)" +@@ -3181,8 +3266,12 @@ msgstr "X の設定を管理します" + #~ msgid "Allowed keys" + #~ msgstr "利用可能なキーバインディング" + +-#~ msgid "If non-empty, keybindings will be ignored unless their settings directory is in the list. This is useful for lockdown." +-#~ msgstr "空でない場合、設定ディレクトリがこのリストになければ、キーバインディングは無視されます。これは主にロックダウンで有用です。" ++#~ msgid "" ++#~ "If non-empty, keybindings will be ignored unless their settings directory " ++#~ "is in the list. This is useful for lockdown." ++#~ msgstr "" ++#~ "空でない場合、設定ディレクトリがこのリストになければ、キーバインディングは" ++#~ "無視されます。これは主にロックダウンで有用です。" + + #~ msgid "Do you want to activate Slow Keys?" + #~ msgstr "スロー・キーを有効にしますか?" +@@ -3255,8 +3344,13 @@ msgstr "X の設定を管理します" + #~ msgid "_Layouts" + #~ msgstr "レイアウト(_L)" + +-#~ msgid "Could not get default terminal. Verify that your default terminal command is set and points to a valid application." +-#~ msgstr "デフォルトの端末を起動できませんでした。デフォルトの端末を起動するコマンドが指定され、それに対応するアプリケーションがインストールされているか確認してください。" ++#~ msgid "" ++#~ "Could not get default terminal. Verify that your default terminal command " ++#~ "is set and points to a valid application." ++#~ msgstr "" ++#~ "デフォルトの端末を起動できませんでした。デフォルトの端末を起動するコマンド" ++#~ "が指定され、それに対応するアプリケーションがインストールされているか確認し" ++#~ "てください。" + + #~ msgid "" + #~ "Couldn't execute command: %s\n" +@@ -3274,9 +3368,6 @@ msgstr "X の設定を管理します" + #~ msgid "Slot ID" + #~ msgstr "スロットID" + +-#~ msgid "The slot the card is in" +-#~ msgstr "カードの入っているスロット" +- + #~ msgid "Slot Series" + #~ msgstr "スロットシリーズ" + +@@ -3289,11 +3380,17 @@ msgstr "X の設定を管理します" + #~ msgid "Module" + #~ msgstr "モジュール" + +-#~ msgid "Priority to use for this plugin in gnome-settings-daemon startup queue." +-#~ msgstr "gnome-settings-daemon の起動時のキューで、このプラグインが使用される優先度。" ++#~ msgid "" ++#~ "Priority to use for this plugin in gnome-settings-daemon startup queue." ++#~ msgstr "" ++#~ "gnome-settings-daemon の起動時のキューで、このプラグインが使用される優先" ++#~ "度。" + +-#~ msgid "Whether this plugin would be activated by gnome-settings-daemon or not." +-#~ msgstr "このプラグインが gnome-settings-daemon でアクティベーションされるかどうか。" ++#~ msgid "" ++#~ "Whether this plugin would be activated by gnome-settings-daemon or not." ++#~ msgstr "" ++#~ "このプラグインが gnome-settings-daemon でアクティベーションされるかどう" ++#~ "か。" + + #~ msgid "Binding to enable or disable the touchpad." + #~ msgstr "タッチパッドを有効にするか無効にするかのキーバインディングです。" +@@ -3301,8 +3398,12 @@ msgstr "X の設定を管理します" + #~ msgid "Keyboard _Preferences" + #~ msgstr "キーボードの設定(_P)" + +-#~ msgid "Disable the keyboard layout indicator unconditionally, do not show it even if number of layouts is more than one." +-#~ msgstr "無条件にキーボードレイアウトの通知を無効にします。レイアウトの数が1より大きくても表示しません。" ++#~ msgid "" ++#~ "Disable the keyboard layout indicator unconditionally, do not show it " ++#~ "even if number of layouts is more than one." ++#~ msgstr "" ++#~ "無条件にキーボードレイアウトの通知を無効にします。レイアウトの数が1より大" ++#~ "きくても表示しません。" + + #~ msgid "Never show layout indicator" + #~ msgstr "レイアウトの通知を表示しない" +@@ -3310,8 +3411,13 @@ msgstr "X の設定を管理します" + #~ msgid "DPI" + #~ msgstr "DPI" + +-#~ msgid "The resolution used for converting font sizes to pixel sizes, in dots per inch. 0.0 DPI means that the X server's DPI will be used." +-#~ msgstr "フォントの大きさをピクセル単位の大きさに変換する際に使用する解像度を、ドット/インチ (DPI) 単位で表したものです。0.0 DPI ならば、X サーバーの DPI が使われます。" ++#~ msgid "" ++#~ "The resolution used for converting font sizes to pixel sizes, in dots per " ++#~ "inch. 0.0 DPI means that the X server's DPI will be used." ++#~ msgstr "" ++#~ "フォントの大きさをピクセル単位の大きさに変換する際に使用する解像度を、ドッ" ++#~ "ト/インチ (DPI) 単位で表したものです。0.0 DPI ならば、X サーバーの DPI が" ++#~ "使われます。" + + #~ msgid "Removing: %s" + #~ msgstr "削除中: %s" +@@ -3328,8 +3434,12 @@ msgstr "X の設定を管理します" + #~ msgid "Empty all of the items from the trash?" + #~ msgstr "ゴミ箱の中のすべてのアイテムを空にしますか?" + +-#~ msgid "If you choose to empty the trash, all items in it will be permanently lost. Please note that you can also delete them separately." +-#~ msgstr "ゴミ箱を空にすることを選択すると、すべてのアイテムは永遠に失なわれます。別途、それらを削除できることに留意してください。" ++#~ msgid "" ++#~ "If you choose to empty the trash, all items in it will be permanently " ++#~ "lost. Please note that you can also delete them separately." ++#~ msgstr "" ++#~ "ゴミ箱を空にすることを選択すると、すべてのアイテムは永遠に失なわれます。別" ++#~ "途、それらを削除できることに留意してください。" + + #~ msgid "_Empty Trash" + #~ msgstr "ゴミ箱を空にする(_E)" +@@ -3346,5 +3456,3 @@ msgstr "X の設定を管理します" + #~ msgid "Display keyboard LEDs on the panel" + #~ msgstr "キーボードの LED をパネルに表示する" + +-#~ msgid "Display pseudo-leds for keyboards that do not have physical LEDs for CapsLock, NumLock, and ScrollLock." +-#~ msgstr "物理的な LED を持たない CapsLock、NumLock、ScrollLock の擬似 LED を表示します。" +diff --git a/po/pt_BR.po b/po/pt_BR.po +index 2212fa96..cb68ba9e 100644 +--- a/po/pt_BR.po ++++ b/po/pt_BR.po +@@ -23,22 +23,22 @@ + # Artur de Aquino Morais , 2016. + # Bruno Lopes da Silva , 2018. + # Rafael Fontenelle , 2012-2019. ++# Felipe Borges , 2021. + # + msgid "" + msgstr "" + "Project-Id-Version: gnome-settings-daemon\n" +-"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-settings-daemon/" +-"issues\n" +-"POT-Creation-Date: 2018-11-06 15:48+0000\n" +-"PO-Revision-Date: 2019-02-20 07:58-0300\n" +-"Last-Translator: Rafael Fontenelle \n" +-"Language-Team: Portuguese - Brazil \n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2021-02-12 15:05+0100\n" ++"PO-Revision-Date: 2021-07-02 11:56+0200\n" ++"Last-Translator: Felipe Borges \n" ++"Language-Team: Brazilian Portuguese \n" + "Language: pt_BR\n" + "MIME-Version: 1.0\n" + "Content-Type: text/plain; charset=UTF-8\n" + "Content-Transfer-Encoding: 8bit\n" + "Plural-Forms: nplurals=2; plural=(n > 1)\n" +-"X-Generator: Gtranslator 3.31.90\n" ++"X-Generator: Gtranslator 40.0\n" + "X-Project-Style: gnome\n" + + #: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:12 +@@ -1150,29 +1150,28 @@ msgstr "Configurações" + msgid "Date & Time Settings" + msgstr "Configurações de data & hora" + +-#: plugins/housekeeping/gsd-disk-space.c:574 +-#| msgid "Disk space" ++#: plugins/housekeeping/gsd-disk-space.c:575 + msgid "Disk Space" + msgstr "Espaço no disco" + +-#: plugins/housekeeping/gsd-disk-space.c:587 ++#: plugins/housekeeping/gsd-disk-space.c:588 + msgid "Examine" + msgstr "Examinar" + +-#: plugins/housekeeping/gsd-disk-space.c:598 ++#: plugins/housekeeping/gsd-disk-space.c:599 + msgid "Empty Trash" + msgstr "Esvaziar lixeira" + +-#: plugins/housekeeping/gsd-disk-space.c:606 ++#: plugins/housekeeping/gsd-disk-space.c:607 + msgid "Ignore" + msgstr "Ignorar" + +-#: plugins/housekeeping/gsd-disk-space.c:637 ++#: plugins/housekeeping/gsd-disk-space.c:638 + #, c-format + msgid "Low Disk Space on “%s”" + msgstr "Pouco espaço em disco em “%s”" + +-#: plugins/housekeeping/gsd-disk-space.c:639 ++#: plugins/housekeeping/gsd-disk-space.c:640 + #, c-format + msgid "" + "The volume “%s” has only %s disk space remaining. You may free up some " +@@ -1181,16 +1180,16 @@ msgstr "" + "O volume “%s” tem apenas %s de espaço em disco restante. Você poderá liberar " + "algum espaço esvaziando a lixeira." + +-#: plugins/housekeeping/gsd-disk-space.c:643 ++#: plugins/housekeeping/gsd-disk-space.c:644 + #, c-format + msgid "The volume “%s” has only %s disk space remaining." + msgstr "O volume “%s” tem apenas %s de espaço em disco restante." + +-#: plugins/housekeeping/gsd-disk-space.c:648 ++#: plugins/housekeeping/gsd-disk-space.c:649 + msgid "Low Disk Space" + msgstr "Pouco espaço em disco" + +-#: plugins/housekeeping/gsd-disk-space.c:650 ++#: plugins/housekeeping/gsd-disk-space.c:651 + #, c-format + msgid "" + "This computer has only %s disk space remaining. You may free up some space " +@@ -1199,35 +1198,35 @@ msgstr "" + "O computador tem apenas %s de espaço em disco restante. Você poderá liberar " + "algum espaço esvaziando a lixeira." + +-#: plugins/housekeeping/gsd-disk-space.c:653 ++#: plugins/housekeeping/gsd-disk-space.c:654 + #, c-format + msgid "This computer has only %s disk space remaining." + msgstr "Este computador tem apenas %s de espaço em disco restante." + +-#: plugins/media-keys/gsd-media-keys-manager.c:2266 ++#: plugins/media-keys/gsd-media-keys-manager.c:2288 + msgid "Bluetooth disabled" + msgstr "Bluetooth desabilitado" + +-#: plugins/media-keys/gsd-media-keys-manager.c:2269 ++#: plugins/media-keys/gsd-media-keys-manager.c:2291 + msgid "Bluetooth enabled" + msgstr "Bluetooth habilitado" + +-#: plugins/media-keys/gsd-media-keys-manager.c:2273 ++#: plugins/media-keys/gsd-media-keys-manager.c:2295 + msgid "Airplane mode enabled" + msgstr "Modo avião habilitado" + +-#: plugins/media-keys/gsd-media-keys-manager.c:2276 ++#: plugins/media-keys/gsd-media-keys-manager.c:2298 + msgid "Airplane mode disabled" + msgstr "Modo avião desabilitado" + +-#: plugins/media-keys/gsd-media-keys-manager.c:2304 ++#: plugins/media-keys/gsd-media-keys-manager.c:2326 + msgid "Hardware Airplane Mode" + msgstr "Modo avião de hardware" + + #. Translators: this is a filename used for screencast + #. * recording, where "%d" and "%t" date and time, e.g. + #. * "Screencast from 07-17-2013 10:00:46 PM.webm" +-#: plugins/media-keys/gsd-media-keys-manager.c:2364 ++#: plugins/media-keys/gsd-media-keys-manager.c:2392 + #, no-c-format + msgid "Screencast from %d %t.webm" + msgstr "Gravação de tela de %d %t.webm" +@@ -1249,117 +1248,117 @@ msgid "Screenshot from %s" + msgstr "Captura de tela de %s" + + # toggle = "Alternador de" ou "Alternar" +-#: plugins/media-keys/shortcuts-list.h:45 + #: plugins/media-keys/shortcuts-list.h:46 ++#: plugins/media-keys/shortcuts-list.h:47 + msgid "Touchpad toggle" + msgstr "Alternador de touchpad" + +-#: plugins/media-keys/shortcuts-list.h:47 ++#: plugins/media-keys/shortcuts-list.h:48 + msgid "Touchpad On" + msgstr "Touchpad ligado" + +-#: plugins/media-keys/shortcuts-list.h:48 ++#: plugins/media-keys/shortcuts-list.h:49 + msgid "Touchpad Off" + msgstr "Touchpad desligado" + +-#: plugins/media-keys/shortcuts-list.h:55 ++#: plugins/media-keys/shortcuts-list.h:56 + msgid "Quiet Volume Mute" + msgstr "Mudo" + +-#: plugins/media-keys/shortcuts-list.h:56 ++#: plugins/media-keys/shortcuts-list.h:57 + msgid "Quiet Volume Down" + msgstr "Abaixar volume" + +-#: plugins/media-keys/shortcuts-list.h:57 ++#: plugins/media-keys/shortcuts-list.h:58 + msgid "Quiet Volume Up" + msgstr "Aumentar volume" + +-#: plugins/media-keys/shortcuts-list.h:58 ++#: plugins/media-keys/shortcuts-list.h:59 + msgid "Precise Volume Down" + msgstr "Abaixar volume preciso" + +-#: plugins/media-keys/shortcuts-list.h:59 ++#: plugins/media-keys/shortcuts-list.h:60 + msgid "Precise Volume Up" + msgstr "Aumentar volume preciso" + +-#: plugins/media-keys/shortcuts-list.h:69 ++#: plugins/media-keys/shortcuts-list.h:70 + msgid "Lock Screen" + msgstr "Bloquear tela" + +-#: plugins/media-keys/shortcuts-list.h:71 ++#: plugins/media-keys/shortcuts-list.h:72 + msgid "Help" + msgstr "Ajuda" + +-#: plugins/media-keys/shortcuts-list.h:88 ++#: plugins/media-keys/shortcuts-list.h:89 + msgid "Rewind" + msgstr "Retroceder" + +-#: plugins/media-keys/shortcuts-list.h:89 ++#: plugins/media-keys/shortcuts-list.h:90 + msgid "Forward" + msgstr "Avançar" + +-#: plugins/media-keys/shortcuts-list.h:90 ++#: plugins/media-keys/shortcuts-list.h:91 + msgid "Repeat" + msgstr "Repetir" + +-#: plugins/media-keys/shortcuts-list.h:91 ++#: plugins/media-keys/shortcuts-list.h:92 + msgid "Random Play" + msgstr "Reprodução aleatória" + +-#: plugins/media-keys/shortcuts-list.h:92 ++#: plugins/media-keys/shortcuts-list.h:93 + msgid "Orientation Lock" + msgstr "Bloqueio de orientação" + +-#: plugins/media-keys/shortcuts-list.h:101 ++#: plugins/media-keys/shortcuts-list.h:102 + msgid "Power Off" + msgstr "Desligar" + + #. the kernel / Xorg names really are like this... + #. translators: "Sleep" means putting the machine to sleep, either through hibernate or suspend +-#: plugins/media-keys/shortcuts-list.h:104 ++#: plugins/media-keys/shortcuts-list.h:105 + msgid "Sleep" + msgstr "Dormir" + +-#: plugins/media-keys/shortcuts-list.h:105 ++#: plugins/media-keys/shortcuts-list.h:106 + msgid "Suspend" + msgstr "Suspender" + +-#: plugins/media-keys/shortcuts-list.h:106 ++#: plugins/media-keys/shortcuts-list.h:107 + msgid "Hibernate" + msgstr "Hibernar" + +-#: plugins/media-keys/shortcuts-list.h:107 ++#: plugins/media-keys/shortcuts-list.h:108 + msgid "Brightness Up" + msgstr "Aumentar brilho" + +-#: plugins/media-keys/shortcuts-list.h:108 ++#: plugins/media-keys/shortcuts-list.h:109 + msgid "Brightness Down" + msgstr "Diminuir brilho" + +-#: plugins/media-keys/shortcuts-list.h:109 ++#: plugins/media-keys/shortcuts-list.h:110 + msgid "Keyboard Brightness Up" + msgstr "Aumentar brilho do teclado" + +-#: plugins/media-keys/shortcuts-list.h:110 ++#: plugins/media-keys/shortcuts-list.h:111 + msgid "Keyboard Brightness Down" + msgstr "Diminuir brilho do teclado" + + # Toggle = "Alternador de" ou "Alternar" +-#: plugins/media-keys/shortcuts-list.h:111 ++#: plugins/media-keys/shortcuts-list.h:112 + msgid "Keyboard Brightness Toggle" + msgstr "Alternador de brilho do teclado" + +-#: plugins/media-keys/shortcuts-list.h:112 ++#: plugins/media-keys/shortcuts-list.h:113 + msgid "Battery Status" + msgstr "Estado da bateria" + +-#: plugins/media-keys/shortcuts-list.h:113 + #: plugins/media-keys/shortcuts-list.h:114 + #: plugins/media-keys/shortcuts-list.h:115 ++#: plugins/media-keys/shortcuts-list.h:116 + msgid "Toggle Airplane Mode" + msgstr "Alternar modo avião" + +-#: plugins/media-keys/shortcuts-list.h:116 ++#: plugins/media-keys/shortcuts-list.h:117 + msgid "Toggle Bluetooth" + msgstr "Alternar Bluetooth" + +@@ -1401,126 +1400,126 @@ msgstr[0] "minuto" + msgstr[1] "minutos" + + #. TRANSLATORS: this is the sound description +-#: plugins/power/gpm-common.c:433 plugins/power/gsd-power-manager.c:693 +-#: plugins/power/gsd-power-manager.c:790 ++#: plugins/power/gpm-common.c:438 plugins/power/gsd-power-manager.c:717 ++#: plugins/power/gsd-power-manager.c:814 + msgid "Battery is critically low" + msgstr "Bateria está criticamente baixa" + + #. TRANSLATORS: this is the notification application name +-#: plugins/power/gsd-power-manager.c:325 ++#: plugins/power/gsd-power-manager.c:347 + msgid "Power" + msgstr "Energia" + + #. TRANSLATORS: UPS is now discharging +-#: plugins/power/gsd-power-manager.c:363 ++#: plugins/power/gsd-power-manager.c:387 + msgid "UPS Discharging" + msgstr "No-break descarregando" + + #. TRANSLATORS: tell the user how much time they have got +-#: plugins/power/gsd-power-manager.c:368 ++#: plugins/power/gsd-power-manager.c:392 + #, c-format + msgid "%s of UPS backup power remaining" + msgstr "Restam %s de energia reserva no no-break" + +-#: plugins/power/gsd-power-manager.c:371 ++#: plugins/power/gsd-power-manager.c:395 + msgid "Unknown amount of UPS backup power remaining" + msgstr "Resta uma quantidade desconhecida de energia reserva no no-break" + + #. TRANSLATORS: laptop battery low, and we only have one battery +-#: plugins/power/gsd-power-manager.c:446 ++#: plugins/power/gsd-power-manager.c:470 + msgid "Battery low" + msgstr "Bateria baixa" + + #. TRANSLATORS: laptop battery low, and we have more than one kind of battery +-#: plugins/power/gsd-power-manager.c:449 ++#: plugins/power/gsd-power-manager.c:473 + msgid "Laptop battery low" + msgstr "Bateria do laptop baixa" + + #. TRANSLATORS: tell the user how much time they have got +-#: plugins/power/gsd-power-manager.c:456 ++#: plugins/power/gsd-power-manager.c:480 + #, c-format + msgid "Approximately %s remaining (%.0f%%)" + msgstr "Aproximadamente %s restantes (%.0f%%)" + + #. TRANSLATORS: UPS is starting to get a little low +-#: plugins/power/gsd-power-manager.c:461 ++#: plugins/power/gsd-power-manager.c:485 + msgid "UPS low" + msgstr "Bateria do no-break baixa" + + #. TRANSLATORS: tell the user how much time they have got +-#: plugins/power/gsd-power-manager.c:467 ++#: plugins/power/gsd-power-manager.c:491 + #, c-format + msgid "Approximately %s of remaining UPS backup power (%.0f%%)" + msgstr "Aproximadamente %s de energia reserva restante no no-break (%.0f%%)" + + #. TRANSLATORS: mouse is getting a little low + #. TRANSLATORS: the mouse battery is very low +-#: plugins/power/gsd-power-manager.c:472 plugins/power/gsd-power-manager.c:606 ++#: plugins/power/gsd-power-manager.c:496 plugins/power/gsd-power-manager.c:630 + msgid "Mouse battery low" + msgstr "Mouse com bateria baixa" + + #. TRANSLATORS: tell user more details +-#: plugins/power/gsd-power-manager.c:475 ++#: plugins/power/gsd-power-manager.c:499 + #, c-format + msgid "Wireless mouse is low in power (%.0f%%)" + msgstr "A bateria do mouse sem fio está baixa (%.0f%%)" + + #. TRANSLATORS: keyboard is getting a little low + #. TRANSLATORS: the keyboard battery is very low +-#: plugins/power/gsd-power-manager.c:479 plugins/power/gsd-power-manager.c:614 ++#: plugins/power/gsd-power-manager.c:503 plugins/power/gsd-power-manager.c:638 + msgid "Keyboard battery low" + msgstr "Teclado com bateria baixa" + + #. TRANSLATORS: tell user more details +-#: plugins/power/gsd-power-manager.c:482 ++#: plugins/power/gsd-power-manager.c:506 + #, c-format + msgid "Wireless keyboard is low in power (%.0f%%)" + msgstr "A bateria do teclado sem fio está baixa (%.0f%%)" + + #. TRANSLATORS: PDA is getting a little low + #. TRANSLATORS: the PDA battery is very low +-#: plugins/power/gsd-power-manager.c:486 plugins/power/gsd-power-manager.c:623 ++#: plugins/power/gsd-power-manager.c:510 plugins/power/gsd-power-manager.c:647 + msgid "PDA battery low" + msgstr "PDA com bateria baixa" + + #. TRANSLATORS: tell user more details +-#: plugins/power/gsd-power-manager.c:489 ++#: plugins/power/gsd-power-manager.c:513 + #, c-format + msgid "PDA is low in power (%.0f%%)" + msgstr "A bateria do PDA está baixa (%.0f%%)" + + #. TRANSLATORS: cell phone (mobile) is getting a little low + #. TRANSLATORS: the cell battery is very low +-#: plugins/power/gsd-power-manager.c:493 plugins/power/gsd-power-manager.c:633 +-#: plugins/power/gsd-power-manager.c:642 ++#: plugins/power/gsd-power-manager.c:517 plugins/power/gsd-power-manager.c:657 ++#: plugins/power/gsd-power-manager.c:666 + msgid "Cell phone battery low" + msgstr "Telefone celular com bateria baixa" + + #. TRANSLATORS: tell user more details +-#: plugins/power/gsd-power-manager.c:496 ++#: plugins/power/gsd-power-manager.c:520 + #, c-format + msgid "Cell phone is low in power (%.0f%%)" + msgstr "A bateria do telefone celular está baixa (%.0f%%)" + + #. TRANSLATORS: media player, e.g. mp3 is getting a little low +-#: plugins/power/gsd-power-manager.c:500 ++#: plugins/power/gsd-power-manager.c:524 + msgid "Media player battery low" + msgstr "Reprodutor de mídia com bateria baixa" + + #. TRANSLATORS: tell user more details +-#: plugins/power/gsd-power-manager.c:503 ++#: plugins/power/gsd-power-manager.c:527 + #, c-format + msgid "Media player is low in power (%.0f%%)" + msgstr "A bateria do reprodutor de mídia está baixa (%.0f%%)" + + #. TRANSLATORS: graphics tablet, e.g. wacom is getting a little low + #. TRANSLATORS: the cell battery is very low +-#: plugins/power/gsd-power-manager.c:507 plugins/power/gsd-power-manager.c:651 ++#: plugins/power/gsd-power-manager.c:531 plugins/power/gsd-power-manager.c:675 + msgid "Tablet battery low" + msgstr "Tablet com bateria baixa" + + #. TRANSLATORS: tell user more details +-#: plugins/power/gsd-power-manager.c:510 ++#: plugins/power/gsd-power-manager.c:534 + #, c-format + msgid "Tablet is low in power (%.0f%%)" + msgstr "A bateria do tablet está baixa (%.0f%%)" +@@ -1528,52 +1527,52 @@ msgstr "A bateria do tablet está baixa (%.0f%%)" + # Dizer 'Computador conectado' remete a idéia de computador com acesso a internet, podendo confundir o usuário. A idéia aqui é dizer que é um dispositivo anexo ao computador--Enrico + #. TRANSLATORS: computer, e.g. ipad is getting a little low + #. TRANSLATORS: the cell battery is very low +-#: plugins/power/gsd-power-manager.c:514 plugins/power/gsd-power-manager.c:660 ++#: plugins/power/gsd-power-manager.c:538 plugins/power/gsd-power-manager.c:684 + msgid "Attached computer battery low" + msgstr "Dispositivo conectado com bateria baixa" + + #. TRANSLATORS: tell user more details +-#: plugins/power/gsd-power-manager.c:517 ++#: plugins/power/gsd-power-manager.c:541 + #, c-format + msgid "Attached computer is low in power (%.0f%%)" + msgstr "A bateria do dispositivo conectado à máquina está baixa (%.0f%%)" + + #. TRANSLATORS: this is the sound description +-#: plugins/power/gsd-power-manager.c:538 ++#: plugins/power/gsd-power-manager.c:562 + msgid "Battery is low" + msgstr "Bateria baixa" + + #. TRANSLATORS: laptop battery critically low, and only have one kind of battery +-#: plugins/power/gsd-power-manager.c:570 ++#: plugins/power/gsd-power-manager.c:594 + msgid "Battery critically low" + msgstr "Bateria criticamente baixa" + + #. TRANSLATORS: laptop battery critically low, and we have more than one type of battery + #. TRANSLATORS: laptop battery is really, really, low +-#: plugins/power/gsd-power-manager.c:573 plugins/power/gsd-power-manager.c:720 ++#: plugins/power/gsd-power-manager.c:597 plugins/power/gsd-power-manager.c:744 + msgid "Laptop battery critically low" + msgstr "Bateria do laptop criticamente baixa" + + #. TRANSLATORS: give the user a ultimatum +-#: plugins/power/gsd-power-manager.c:582 ++#: plugins/power/gsd-power-manager.c:606 + #, c-format + msgid "Computer will hibernate very soon unless it is plugged in." + msgstr "O computador irá hibernar em breve a menos que seja conectado." + + #. TRANSLATORS: give the user a ultimatum +-#: plugins/power/gsd-power-manager.c:586 ++#: plugins/power/gsd-power-manager.c:610 + #, c-format + msgid "Computer will shutdown very soon unless it is plugged in." + msgstr "O computador irá desligar em breve a menos que seja conectado." + + #. TRANSLATORS: the UPS is very low + #. TRANSLATORS: UPS is really, really, low +-#: plugins/power/gsd-power-manager.c:594 plugins/power/gsd-power-manager.c:745 ++#: plugins/power/gsd-power-manager.c:618 plugins/power/gsd-power-manager.c:769 + msgid "UPS critically low" + msgstr "Bateria do no-break criticamente baixa" + + #. TRANSLATORS: give the user a ultimatum +-#: plugins/power/gsd-power-manager.c:600 ++#: plugins/power/gsd-power-manager.c:624 + #, c-format + msgid "" + "Approximately %s of remaining UPS power (%.0f%%). Restore AC power to your " +@@ -1583,7 +1582,7 @@ msgstr "" + "computador na tomada para evitar perda de dados." + + #. TRANSLATORS: the device is just going to stop working +-#: plugins/power/gsd-power-manager.c:609 ++#: plugins/power/gsd-power-manager.c:633 + #, c-format + msgid "" + "Wireless mouse is very low in power (%.0f%%). This device will soon stop " +@@ -1593,7 +1592,7 @@ msgstr "" + "parar de funcionar em breve se não for carregado." + + #. TRANSLATORS: the device is just going to stop working +-#: plugins/power/gsd-power-manager.c:617 ++#: plugins/power/gsd-power-manager.c:641 + #, c-format + msgid "" + "Wireless keyboard is very low in power (%.0f%%). This device will soon stop " +@@ -1603,7 +1602,7 @@ msgstr "" + "parar de funcionar em breve se não for carregado." + + #. TRANSLATORS: the device is just going to stop working +-#: plugins/power/gsd-power-manager.c:626 ++#: plugins/power/gsd-power-manager.c:650 + #, c-format + msgid "" + "PDA is very low in power (%.0f%%). This device will soon stop functioning if " +@@ -1613,7 +1612,7 @@ msgstr "" + "funcionar em breve se não for carregado." + + #. TRANSLATORS: the device is just going to stop working +-#: plugins/power/gsd-power-manager.c:636 ++#: plugins/power/gsd-power-manager.c:660 + #, c-format + msgid "" + "Cell phone is very low in power (%.0f%%). This device will soon stop " +@@ -1623,7 +1622,7 @@ msgstr "" + "parar de funcionar em breve se não for carregado." + + #. TRANSLATORS: the device is just going to stop working +-#: plugins/power/gsd-power-manager.c:645 ++#: plugins/power/gsd-power-manager.c:669 + #, c-format + msgid "" + "Media player is very low in power (%.0f%%). This device will soon stop " +@@ -1633,7 +1632,7 @@ msgstr "" + "vai parar de funcionar em breve se não for carregado." + + #. TRANSLATORS: the device is just going to stop working +-#: plugins/power/gsd-power-manager.c:654 ++#: plugins/power/gsd-power-manager.c:678 + #, c-format + msgid "" + "Tablet is very low in power (%.0f%%). This device will soon stop functioning " +@@ -1643,7 +1642,7 @@ msgstr "" + "funcionar em breve se não for carregado." + + #. TRANSLATORS: the device is just going to stop working +-#: plugins/power/gsd-power-manager.c:663 ++#: plugins/power/gsd-power-manager.c:687 + #, c-format + msgid "" + "Attached computer is very low in power (%.0f%%). The device will soon " +@@ -1653,7 +1652,7 @@ msgstr "" + "dispositivo vai parar de funcionar em breve se não for carregado." + + #. TRANSLATORS: computer will hibernate +-#: plugins/power/gsd-power-manager.c:728 ++#: plugins/power/gsd-power-manager.c:752 + msgid "" + "The battery is below the critical level and this computer is about to " + "hibernate." +@@ -1662,7 +1661,7 @@ msgstr "" + "hibernar." + + #. TRANSLATORS: computer will just shutdown +-#: plugins/power/gsd-power-manager.c:733 ++#: plugins/power/gsd-power-manager.c:757 + msgid "" + "The battery is below the critical level and this computer is about to " + "shutdown." +@@ -1671,7 +1670,7 @@ msgstr "" + "desligar." + + #. TRANSLATORS: computer will hibernate +-#: plugins/power/gsd-power-manager.c:753 ++#: plugins/power/gsd-power-manager.c:777 + msgid "" + "UPS is below the critical level and this computer is about to hibernate." + msgstr "" +@@ -1679,50 +1678,50 @@ msgstr "" + "hibernar." + + #. TRANSLATORS: computer will just shutdown +-#: plugins/power/gsd-power-manager.c:758 ++#: plugins/power/gsd-power-manager.c:782 + msgid "UPS is below the critical level and this computer is about to shutdown." + msgstr "" + "O no-break está abaixo do nível crítico e este computador está prestes a " + "desligar." + + #. TRANSLATORS: this is the sound description +-#: plugins/power/gsd-power-manager.c:1320 ++#: plugins/power/gsd-power-manager.c:1260 + msgid "Lid has been opened" + msgstr "A tampa foi aberta" + + #. TRANSLATORS: this is the sound description +-#: plugins/power/gsd-power-manager.c:1354 ++#: plugins/power/gsd-power-manager.c:1294 + msgid "Lid has been closed" + msgstr "A tampa foi fechada" + + #. TRANSLATORS: this is the sound description +-#: plugins/power/gsd-power-manager.c:1916 ++#: plugins/power/gsd-power-manager.c:1856 + msgid "On battery power" + msgstr "Computador ligado à energia da bateria" + + #. TRANSLATORS: this is the sound description +-#: plugins/power/gsd-power-manager.c:1921 ++#: plugins/power/gsd-power-manager.c:1861 + msgid "On AC power" + msgstr "Ligado na tomada" + +-#: plugins/power/gsd-power-manager.c:2113 ++#: plugins/power/gsd-power-manager.c:2051 + msgid "Automatic logout" + msgstr "Encerramento de sessão automático" + +-#: plugins/power/gsd-power-manager.c:2113 ++#: plugins/power/gsd-power-manager.c:2051 + msgid "You will soon log out because of inactivity." + msgstr "Em breve sua sessão será encerrada devido inatividade." + +-#: plugins/power/gsd-power-manager.c:2118 ++#: plugins/power/gsd-power-manager.c:2056 + msgid "Automatic suspend" + msgstr "Suspensão automática" + +-#: plugins/power/gsd-power-manager.c:2118 +-#: plugins/power/gsd-power-manager.c:2123 ++#: plugins/power/gsd-power-manager.c:2056 ++#: plugins/power/gsd-power-manager.c:2061 + msgid "Computer will suspend very soon because of inactivity." + msgstr "Computador iá suspender em breve por causa de inatividade." + +-#: plugins/power/gsd-power-manager.c:2123 ++#: plugins/power/gsd-power-manager.c:2061 + msgid "Automatic hibernation" + msgstr "Hibernação automática" + +@@ -1765,236 +1764,284 @@ msgstr "Sem drivers para esta impressora." + + #: plugins/print-notifications/gsd-printer.c:1031 + #: plugins/print-notifications/gsd-print-notifications-manager.c:290 +-#: plugins/print-notifications/gsd-print-notifications-manager.c:531 +-#: plugins/print-notifications/gsd-print-notifications-manager.c:913 +-#: plugins/print-notifications/gsd-print-notifications-manager.c:1004 +-#: plugins/print-notifications/gsd-print-notifications-manager.c:1048 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:538 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:920 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:1011 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:1055 + msgid "Printers" + msgstr "Impressoras" + + #. Translators: The printer is low on toner (same as in system-config-printer) +-#: plugins/print-notifications/gsd-print-notifications-manager.c:367 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:374 + #, c-format + msgid "Printer “%s” is low on toner." + msgstr "A impressora “%s” está com toner baixo." + + #. Translators: The printer has no toner left (same as in system-config-printer) +-#: plugins/print-notifications/gsd-print-notifications-manager.c:371 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:378 + #, c-format + msgid "Printer “%s” has no toner left." + msgstr "A impressora “%s” está sem toner." + + #. Translators: The printer is in the process of connecting to a shared network output device (same as in system-config-printer) +-#: plugins/print-notifications/gsd-print-notifications-manager.c:375 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:382 + #, c-format + msgid "Printer “%s” may not be connected." + msgstr "A impressora “%s” pode não estar conectada." + + #. Translators: One or more covers on the printer are open (same as in system-config-printer) +-#: plugins/print-notifications/gsd-print-notifications-manager.c:379 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:386 + #, c-format + msgid "The cover is open on printer “%s”." + msgstr "A tampa da impressora “%s” está aberta." + + #. Translators: A filter or backend is not installed (same as in system-config-printer) +-#: plugins/print-notifications/gsd-print-notifications-manager.c:383 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:390 + #, c-format + msgid "There is a missing print filter for printer “%s”." + msgstr "Há um filtro de impressão faltando para a impressora “%s”." + + #. Translators: One or more doors on the printer are open (same as in system-config-printer) +-#: plugins/print-notifications/gsd-print-notifications-manager.c:388 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:395 + #, c-format + msgid "The door is open on printer “%s”." + msgstr "A porta da impressora “%s” está aberta." + + #. Translators: "marker" is one color bin of the printer +-#: plugins/print-notifications/gsd-print-notifications-manager.c:392 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:399 + #, c-format + msgid "Printer “%s” is low on a marker supply." + msgstr "A impressora “%s” está com um marcador de suprimento de tinta baixo." + + #. Translators: "marker" is one color bin of the printer +-#: plugins/print-notifications/gsd-print-notifications-manager.c:396 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:403 + #, c-format + msgid "Printer “%s” is out of a marker supply." + msgstr "A impressora “%s” está sem um marcador de suprimento de tinta." + + #. Translators: At least one input tray is low on media (same as in system-config-printer) +-#: plugins/print-notifications/gsd-print-notifications-manager.c:400 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:407 + #, c-format + msgid "Printer “%s” is low on paper." + msgstr "A impressora “%s” está com pouco papel." + + #. Translators: At least one input tray is empty (same as in system-config-printer) +-#: plugins/print-notifications/gsd-print-notifications-manager.c:404 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:411 + #, c-format + msgid "Printer “%s” is out of paper." + msgstr "A impressora “%s” está sem papel." + + #. Translators: The printer is offline (same as in system-config-printer) +-#: plugins/print-notifications/gsd-print-notifications-manager.c:408 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:415 + #, c-format + msgid "Printer “%s” is currently off-line." + msgstr "A impressora “%s” está atualmente desconectada." + + #. Translators: The printer has detected an error (same as in system-config-printer) +-#: plugins/print-notifications/gsd-print-notifications-manager.c:412 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:419 + #, c-format + msgid "There is a problem on printer “%s”." + msgstr "Há um problema com a impressora “%s”." + + #. Translators: The printer has a job to print but the printer needs authentication to continue with the print +-#: plugins/print-notifications/gsd-print-notifications-manager.c:524 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:531 + #, c-format + msgid "%s Requires Authentication" + msgstr "%s requer autenticação" + + #. Translators: A printer needs credentials to continue printing a job +-#: plugins/print-notifications/gsd-print-notifications-manager.c:526 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:533 + #, c-format + msgid "Credentials required in order to print" + msgstr "Credenciais são necessárias para imprimir" + + #. Translators: The printer is low on toner (same as in system-config-printer) +-#: plugins/print-notifications/gsd-print-notifications-manager.c:593 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:600 + msgid "Toner low" + msgstr "Toner baixo" + + #. Translators: The printer has no toner left (same as in system-config-printer) +-#: plugins/print-notifications/gsd-print-notifications-manager.c:595 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:602 + msgid "Toner empty" + msgstr "Toner vazio" + + #. Translators: The printer is in the process of connecting to a shared network output device (same as in system-config-printer) +-#: plugins/print-notifications/gsd-print-notifications-manager.c:597 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:604 + msgid "Not connected?" + msgstr "Não conectado?" + + #. Translators: One or more covers on the printer are open (same as in system-config-printer) +-#: plugins/print-notifications/gsd-print-notifications-manager.c:599 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:606 + msgid "Cover open" + msgstr "Tampa aberta" + + #. Translators: A filter or backend is not installed (same as in system-config-printer) +-#: plugins/print-notifications/gsd-print-notifications-manager.c:601 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:608 + msgid "Printer configuration error" + msgstr "Erro de configuração de impressora" + + #. Translators: One or more doors on the printer are open (same as in system-config-printer) +-#: plugins/print-notifications/gsd-print-notifications-manager.c:603 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:610 + msgid "Door open" + msgstr "Porta aberta" + + #. Translators: "marker" is one color bin of the printer +-#: plugins/print-notifications/gsd-print-notifications-manager.c:605 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:612 + msgid "Marker supply low" + msgstr "Marcador de suprimento de tinta baixo" + + #. Translators: "marker" is one color bin of the printer +-#: plugins/print-notifications/gsd-print-notifications-manager.c:607 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:614 + msgid "Out of a marker supply" + msgstr "Sem marcador de suprimento de tinta" + + #. Translators: At least one input tray is low on media (same as in system-config-printer) +-#: plugins/print-notifications/gsd-print-notifications-manager.c:609 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:616 + msgid "Paper low" + msgstr "Pouco papel" + + #. Translators: At least one input tray is empty (same as in system-config-printer) +-#: plugins/print-notifications/gsd-print-notifications-manager.c:611 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:618 + msgid "Out of paper" + msgstr "Sem papel" + + #. Translators: The printer is offline (same as in system-config-printer) +-#: plugins/print-notifications/gsd-print-notifications-manager.c:613 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:620 + msgid "Printer off-line" + msgstr "Impressora desconectada" + + #. Translators: The printer has detected an error (same as in system-config-printer) + #. Translators: This is a title of an error notification for a printer +-#: plugins/print-notifications/gsd-print-notifications-manager.c:615 +-#: plugins/print-notifications/gsd-print-notifications-manager.c:990 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:622 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:997 + msgid "Printer error" + msgstr "Erro de impressora" + + #. Translators: New printer has been added +-#: plugins/print-notifications/gsd-print-notifications-manager.c:663 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:670 + msgid "Printer added" + msgstr "Impressora adicionada" + + #. Translators: A print job has been stopped +-#: plugins/print-notifications/gsd-print-notifications-manager.c:680 +-#: plugins/print-notifications/gsd-print-notifications-manager.c:718 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:687 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:725 + msgctxt "print job state" + msgid "Printing stopped" + msgstr "Impressora parada" + + #. Translators: "print-job xy" on a printer +-#: plugins/print-notifications/gsd-print-notifications-manager.c:682 +-#: plugins/print-notifications/gsd-print-notifications-manager.c:688 +-#: plugins/print-notifications/gsd-print-notifications-manager.c:694 +-#: plugins/print-notifications/gsd-print-notifications-manager.c:700 +-#: plugins/print-notifications/gsd-print-notifications-manager.c:712 +-#: plugins/print-notifications/gsd-print-notifications-manager.c:720 +-#: plugins/print-notifications/gsd-print-notifications-manager.c:728 +-#: plugins/print-notifications/gsd-print-notifications-manager.c:736 +-#: plugins/print-notifications/gsd-print-notifications-manager.c:744 +-#: plugins/print-notifications/gsd-print-notifications-manager.c:768 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:689 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:695 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:701 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:707 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:719 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:727 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:735 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:743 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:751 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:775 + #, c-format + msgctxt "print job" + msgid "“%s” on %s" + msgstr "“%s” na %s" + + #. Translators: A print job has been canceled +-#: plugins/print-notifications/gsd-print-notifications-manager.c:686 +-#: plugins/print-notifications/gsd-print-notifications-manager.c:726 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:693 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:733 + msgctxt "print job state" + msgid "Printing canceled" + msgstr "Impressão cancelada" + + #. Translators: A print job has been aborted +-#: plugins/print-notifications/gsd-print-notifications-manager.c:692 +-#: plugins/print-notifications/gsd-print-notifications-manager.c:734 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:699 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:741 + msgctxt "print job state" + msgid "Printing aborted" + msgstr "Impressão abortada" + + #. Translators: A print job has been completed +-#: plugins/print-notifications/gsd-print-notifications-manager.c:698 +-#: plugins/print-notifications/gsd-print-notifications-manager.c:742 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:705 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:749 + msgctxt "print job state" + msgid "Printing completed" + msgstr "Impressão completa" + + #. Translators: A job is printing +-#: plugins/print-notifications/gsd-print-notifications-manager.c:710 +-#: plugins/print-notifications/gsd-print-notifications-manager.c:766 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:717 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:773 + msgctxt "print job state" + msgid "Printing" + msgstr "Imprimindo" + + #. Translators: This is a title of a report notification for a printer +-#: plugins/print-notifications/gsd-print-notifications-manager.c:984 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:991 + msgid "Printer report" + msgstr "Relatório da impressora" + + #. Translators: This is a title of a warning notification for a printer +-#: plugins/print-notifications/gsd-print-notifications-manager.c:987 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:994 + msgid "Printer warning" + msgstr "Advertência da impressora" + + #. Translators: "Printer 'MyPrinterName': 'Description of the report/warning/error from a PPD file'." +-#: plugins/print-notifications/gsd-print-notifications-manager.c:997 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:1004 + #, c-format + msgid "Printer “%s”: “%s”." + msgstr "Impressora “%s”: “%s”." + + # Não deve ser usado 'conectado' pois o fato de conectar o cartão inteligente não implica diretamente em inicio de sessão (ex: pode estar conectado, mas não ser reconhecido)--Enrico +-#: plugins/smartcard/gsd-smartcard-service.c:224 ++#: plugins/smartcard/gsd-smartcard-service.c:288 + msgid "User was not logged in with smartcard." + msgstr "O usuário não havia iniciado sessão com cartão inteligente." + ++#: plugins/subman/gsd-subscription-manager.c:1044 ++msgid "Subscription Has Expired" ++msgstr "Subscrição Expirou" ++ ++#: plugins/subman/gsd-subscription-manager.c:1045 ++msgid "Add or renew a subscription to continue receiving software updates." ++msgstr "" ++"Adicione ou renove a subscrição para continuar recebendo atualizações de " ++"software." ++ ++#: plugins/subman/gsd-subscription-manager.c:1047 ++#: plugins/subman/gsd-subscription-manager.c:1063 ++#: plugins/subman/gsd-subscription-manager.c:1075 ++msgid "Subscription" ++msgstr "Subscrição" ++ ++#: plugins/subman/gsd-subscription-manager.c:1052 ++msgid "Subscribe System…" ++msgstr "Registrar Sistema…" ++ ++#: plugins/subman/gsd-subscription-manager.c:1060 ++msgid "Registration Successful" ++msgstr "Registrado com Sucesso" ++ ++#: plugins/subman/gsd-subscription-manager.c:1061 ++msgid "The system has been registered and software updates have been enabled." ++msgstr "O sistema foi registrado e atualizações de software foram habilitidas." ++ ++#: plugins/subman/gsd-subscription-manager.c:1072 ++msgid "System Not Registered" ++msgstr "Sistema Não Registrado" ++ ++#: plugins/subman/gsd-subscription-manager.c:1073 ++msgid "Please register your system to receive software updates." ++msgstr "Por favor registre seu sistema para receber atualizações de software." ++ ++#: plugins/subman/gsd-subscription-manager.c:1080 ++msgid "Register System…" ++msgstr "Registrar o Sistema…" ++ ++#: plugins/subman/org.gnome.settings-daemon.plugins.subman.policy.in.in:17 ++msgid "Register the system" ++msgstr "Registrar o Sistema" ++ ++#: plugins/subman/org.gnome.settings-daemon.plugins.subman.policy.in.in:18 ++msgid "Authentication is required to register the system" ++msgstr "A autenticação é necessária para registrar o sistema" ++ + #. SECURITY: + #. - A normal active user on the local machine does not need permission + #. to change the LED setting for a Wacom tablet +diff --git a/po/zh_CN.po b/po/zh_CN.po +index 86f2f3e4..9492ec38 100644 +--- a/po/zh_CN.po ++++ b/po/zh_CN.po +@@ -25,9 +25,8 @@ + msgid "" + msgstr "" + "Project-Id-Version: gnome-settings-daemon master\n" +-"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +-"settings-daemon&keywords=I18N+L10N&component=general\n" +-"POT-Creation-Date: 2017-09-01 14:22+0000\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2021-02-12 15:05+0100\n" + "PO-Revision-Date: 2017-09-02 01:42+0800\n" + "Last-Translator: Mingcong Bai \n" + "Language-Team: Chinese (simplified) \n" +@@ -38,319 +37,315 @@ msgstr "" + "Plural-Forms: nplurals=1; plural=0;\n" + "X-Generator: Poedit 2.0.2\n" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:1 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:12 + msgid "Smartcard removal action" + msgstr "智能卡移除动作" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:2 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:13 + msgid "" + "Set this to one of “none”, “lock-screen”, or “force-logout”. The action will " + "get performed when the smartcard used for log in is removed." +-msgstr "" +-"设置为“none”、“lock_screen”或“force_logout”之一。 当用于登录的智能卡被移除" +-"时,将执行这个动作。" ++msgstr "设置为“none”、“lock_screen”或“force_logout”之一。 当用于登录的智能卡被移除时,将执行这个动作。" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:3 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:25 + msgid "Possible values are “on”, “off”, and “custom”." + msgstr "可用的值为“on”,“off”及“custom”。" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:4 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:35 + msgid "Keyboard Bell Custom Filename" + msgstr "自定义键盘响铃文件" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:5 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:36 + msgid "File name of the bell sound to be played." + msgstr "要播放的响铃声音文件名。" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:6 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:40 + msgid "Remember NumLock state" + msgstr "记住 NumLock 状态" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:7 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:41 + msgid "" + "When set to true, GNOME will remember the state of the NumLock LED between " + "sessions." + msgstr "当设为 true 时,GNOME 会在会话之间记住 NumLock LED 的状态。" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:8 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:45 + msgid "NumLock state" + msgstr "NumLock 状态" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:9 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:46 + msgid "The remembered state of the NumLock LED." + msgstr "要记住的 NumLock LED 状态。" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:10 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:52 + msgid "" + "Highlights the current location of the pointer when the Control key is " + "pressed and released." + msgstr "当按下并放开 Ctrl 键时,高亮显示鼠标指针的当前位置。" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:11 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:56 + msgid "Double click time" + msgstr "双击时间" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:12 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:57 + msgid "Length of a double click in milliseconds." + msgstr "双击时长(以毫秒为单位)。" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:13 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:61 + msgid "Drag threshold" + msgstr "触发拖拽动作的最小距离" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:14 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:62 + msgid "Distance before a drag is started." + msgstr "触发拖动的最小距离。" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:15 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:68 + msgid "Whether the tablet’s orientation is locked, or rotated automatically." + msgstr "是锁定数位板的方向,还是自动旋转。" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:16 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:76 + msgid "Mouse button orientation" + msgstr "鼠标键方向" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:17 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:77 + msgid "Swap left and right mouse buttons for left-handed mice." + msgstr "在左撇子鼠标上交换左右鼠标键。" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:18 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:81 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:143 + msgid "Single Click" + msgstr "单击" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:19 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:82 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:144 + msgid "" + "Acceleration multiplier for mouse motion. A value of -1 is the system " + "default." + msgstr "鼠标运动的加速乘数。-1 为系统默认值。" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:20 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:86 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:148 + msgid "Motion Threshold" + msgstr "触发加速的最小距离" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:21 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:87 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:149 + msgid "" + "Distance in pixels the pointer must move before accelerated mouse motion is " + "activated. A value of -1 is the system default." + msgstr "按像素计算的触发鼠标加速运动的最小距离。-1 为系统默认值。" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:22 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:91 + msgid "Middle button emulation" + msgstr "中键模拟" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:23 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:92 + msgid "" + "Enables middle mouse button emulation through simultaneous left and right " + "button click." + msgstr "启用通过同时点击左键和右键来模拟中键。" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:24 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:101 + msgid "Key Repeat Interval" + msgstr "键位重复间隔" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:25 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:102 + msgid "Delay between repeats in milliseconds." + msgstr "按毫秒计算的键位重复间的间隔。" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:26 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:106 + msgid "Initial Key Repeat Delay" + msgstr "初始键位重复间隔" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:27 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:107 + msgid "Initial key repeat delay in milliseconds." + msgstr "按毫秒计算的初始键位重复间隔。" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:28 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:113 + msgid "Disable touchpad while typing" + msgstr "在输入时禁用触摸板" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:29 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:114 + msgid "" + "Set this to TRUE if you have problems with accidentally hitting the touchpad " + "while typing." + msgstr "如果您打字时会因偶尔会碰到触摸板而造成麻烦,将其设置为真(TRUE)。" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:30 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:118 + msgid "Enable horizontal scrolling" + msgstr "启用水平滚动" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:31 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:119 + msgid "" + "Set this to TRUE to allow horizontal scrolling by the same method selected " + "with the scroll_method key." +-msgstr "" +-"设置为真(TRUE),即启用水平卷页且使用与 scroll_method 键值选定的同种方式。" ++msgstr "设置为真(TRUE),即启用水平卷页且使用与 scroll_method 键值选定的同种方式。" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:32 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:123 + msgid "Select the touchpad scroll method" + msgstr "选择触摸板滚动模式" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:33 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:124 + msgid "" + "Select the touchpad scroll method. Supported values are: “disabled”, “edge-" + "scrolling”, “two-finger-scrolling”." +-msgstr "" +-"选择触摸板滚动模式。支持的值有:“disabled”(禁用),“edge-scrolling”(边界滚" +-"动),“two-finger-scrolling”(双指滚动)。" ++msgstr "选择触摸板滚动模式。支持的值有:“disabled”(禁用),“edge-scrolling”(边界滚动),“two-finger-scrolling”(双指滚动)。" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:34 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:128 + msgid "Enable mouse clicks with touchpad" + msgstr "启用触摸板的鼠标点击功能" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:35 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:129 + msgid "" + "Set this to TRUE to be able to send mouse clicks by tapping on the touchpad." + msgstr "设置为真(TRUE),即可在轻敲触摸板时发送鼠标点击信息。" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:36 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:133 + msgid "Enable touchpad" + msgstr "启用触摸板" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:37 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:134 + msgid "Set this to TRUE to enable all touchpads." + msgstr "设置为真(TRUE)启用所有触摸板" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:38 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:138 + msgid "Touchpad button orientation" + msgstr "触摸板按键方向" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:39 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:139 + msgid "" + "Swap left and right mouse buttons for left-handed mice with “left”, “right” " + "for right-handed, “mouse” to follow the mouse setting." +-msgstr "" +-"设定“left”值以为左撇子鼠标交换左右鼠标按钮,为右撇子鼠标设定“right”值,设" +-"定“mouse”值以跟随鼠标设置。" ++msgstr "设定“left”值以为左撇子鼠标交换左右鼠标按钮,为右撇子鼠标设定“right”值,设定“mouse”值以跟随鼠标设置。" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:40 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:153 + msgid "Natural scrolling" + msgstr "自然滚动" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:41 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:154 + msgid "Set this to TRUE to enable natural (reverse) scrolling for touchpads." + msgstr "将此值设置为 TRUE 以为触摸板启用自然(反向)滚动。" + +-#: ../data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in.h:42 ++#: data/org.gnome.settings-daemon.peripherals.gschema.xml.in:161 + msgid "Mouse wheel emulation button. 0 to disable the feature." + msgstr "鼠标滚轮模拟键。设定 0 值以关闭此特性。" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:1 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:10 + msgid "Wacom stylus absolute mode" +-msgstr "Wacom 手写笔绝对模式" ++msgstr "Wacom 手写笔绝对模式" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:2 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:11 + msgid "Enable this to set the tablet to absolute mode." + msgstr "启用此设置数位板为绝对模式" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:3 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:15 + msgid "Wacom tablet area" + msgstr "Wacom 数位板区域" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:4 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:16 + msgid "Set this to x1, y1 and x2, y2 of the area usable by the tools." + msgstr "将此值设置到此工具可以使用区域的 x1, y1 和 x2, y2。" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:5 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:20 + msgid "Wacom tablet aspect ratio" + msgstr "Wacom 的数位板长宽比" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:6 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:21 + msgid "" + "Enable this to restrict the Wacom tablet area to match the aspect ratio of " + "the output." + msgstr "启用此设置限制数位板的区域以匹配输出的长宽比" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:7 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:25 + msgid "Wacom tablet rotation" + msgstr "Wacom 的数位板旋转" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:8 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:26 + msgid "" + "Set this to “none”, “cw” for 90 degree clockwise, “half” for 180 degree, and " + "“ccw” for 90 degree counterclockwise." +-msgstr "" +-"可以设置为“nono”,“cw”(顺时针 90 度),“half”(180 度),和“ccw”(逆时针90" +-"度)。" ++msgstr "可以设置为“nono”,“cw”(顺时针 90 度),“half”(180 度),和“ccw”(逆时针90度)。" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:9 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:30 + msgid "Wacom touch feature" + msgstr "Wacom 的触控功能" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:10 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:31 + msgid "Enable this to move the cursor when the user touches the tablet." + msgstr "启用此项以在用户碰到数位板时移动光标。" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:11 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:37 + msgid "Wacom stylus pressure curve" + msgstr "Wacom 手写笔压力曲线" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:12 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:38 + msgid "" + "Set this to x1, y1 and x2, y2 of the pressure curve applied to the stylus." + msgstr "将此值设置到 x1,y1 和 x2,y2 适用于手写笔压力曲线。" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:13 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:42 + msgid "Wacom stylus button mapping" +-msgstr "Wacom 手写笔按钮映射" ++msgstr "Wacom 手写笔按钮映射" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:14 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:43 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:60 + msgid "Set this to the logical button mapping." + msgstr "逻辑按键映射设置。" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:15 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:47 + msgid "Wacom stylus pressure threshold" + msgstr "Wacom 手写笔压力临界值" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:16 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:48 + msgid "" + "Set this to the pressure value at which a stylus click event is generated." + msgstr "当手写笔触摸活动发生时设置这个压力值" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:17 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:54 + msgid "Wacom eraser pressure curve" + msgstr "Wacom 擦写压力曲线" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:18 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:55 + msgid "" + "Set this to x1, y1 and x2, y2 of the pressure curve applied to the eraser." +-msgstr "将此值设置到 x1, y1 和 x2, y2 适用于擦写压力曲线。" ++msgstr "将此值设置到 x1, y1 和 x2, y2 适用于擦写压力曲线。" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:19 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:59 + msgid "Wacom eraser button mapping" + msgstr "Wacom 擦写按钮映射" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:20 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:64 + msgid "Wacom eraser pressure threshold" + msgstr "Wacom 擦写压力临界值" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:21 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:65 + msgid "" + "Set this to the pressure value at which an eraser click event is generated." + msgstr "将此设置到压力值" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:22 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:71 + msgid "Wacom button action type" + msgstr "Wacom 按钮动作类型" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:23 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:72 + msgid "The type of action triggered by the button being pressed." + msgstr "按钮按下时触发的动作类型。" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:24 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:76 + msgid "Key combination for the custom action" + msgstr "自定义动作的键绑定" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:25 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:77 + msgid "" + "The keyboard shortcut generated when the button is pressed for custom " + "actions." + msgstr "按下自定义动作的键时产生的键盘快捷方式。" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:26 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:81 + msgid "Key combinations for a touchring or touchstrip custom action" + msgstr "触摸环或触摸带自定义动作的的键组合" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:27 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:82 + msgid "" + "The keyboard shortcuts generated when a touchring or touchstrip is used for " + "custom actions (up followed by down)." +@@ -358,574 +353,568 @@ msgstr "当触摸环或触摸带用做自定义动作(先向上再向下)时, + + #. Translators: This is the OLED display on an Intuos4 tablet: + #. http://eu.shop.wacom.eu/images/articles/d9abd9f2d4d88aa0649cda97a8077e2b_8.jpg +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:30 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:88 + msgid "Button label for OLED display." + msgstr "OLED 显示屏的按钮标签。" + +-#: ../data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in.h:31 ++#: data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in:89 + msgid "Label will be rendered to OLED display belonging to the button" + msgstr "标签将被绘制到属于该按钮的 OLED 显示屏上" + +-#: ../data/org.gnome.settings-daemon.plugins.color.gschema.xml.in.in.h:1 ++#: data/org.gnome.settings-daemon.plugins.color.gschema.xml.in:6 + msgid "The duration a display profile is valid" + msgstr "显示配置的有效期" + +-#: ../data/org.gnome.settings-daemon.plugins.color.gschema.xml.in.in.h:2 ++#: data/org.gnome.settings-daemon.plugins.color.gschema.xml.in:7 + msgid "" + "This is the number of days after which the display color profile is " + "considered invalid." + msgstr "这是将显示颜色配置视为无效之前的持续天数" + +-#: ../data/org.gnome.settings-daemon.plugins.color.gschema.xml.in.in.h:3 ++#: data/org.gnome.settings-daemon.plugins.color.gschema.xml.in:11 + msgid "The duration a printer profile is valid" + msgstr "打印机配置的有效期" + +-#: ../data/org.gnome.settings-daemon.plugins.color.gschema.xml.in.in.h:4 ++#: data/org.gnome.settings-daemon.plugins.color.gschema.xml.in:12 + msgid "" + "This is the number of days after which the printer color profile is " + "considered invalid." + msgstr "这是将打印机配置视为无效之前的持续天数。" + +-#: ../data/org.gnome.settings-daemon.plugins.color.gschema.xml.in.in.h:5 ++#: data/org.gnome.settings-daemon.plugins.color.gschema.xml.in:16 + msgid "If the night light mode is enabled" + msgstr "夜光模式是否已启用" + +-#: ../data/org.gnome.settings-daemon.plugins.color.gschema.xml.in.in.h:6 ++#: data/org.gnome.settings-daemon.plugins.color.gschema.xml.in:17 + msgid "" + "Night light mode changes the color temperature of your display when the sun " +-"has gone down or at present times." +-msgstr "夜光模式可以根据太阳位置或当前时间修改您显示器的色温。" ++"has gone down or at preset times." ++msgstr "夜光模式可以在没有日光的情况或当前时间修改显示的色温。" + +-#: ../data/org.gnome.settings-daemon.plugins.color.gschema.xml.in.in.h:7 ++#: data/org.gnome.settings-daemon.plugins.color.gschema.xml.in:21 + msgid "Temperature of the display when enabled" + msgstr "显示器的色温模式启用时" + +-#: ../data/org.gnome.settings-daemon.plugins.color.gschema.xml.in.in.h:8 ++#: data/org.gnome.settings-daemon.plugins.color.gschema.xml.in:22 + msgid "" + "This temperature in Kelvin is used to modify the screen tones when night " + "light mode is enabled. Higher values are bluer, lower redder." +-msgstr "" +-"当夜光模式启用时,以开尔文表示的色温用来修改屏幕色调。数值越高蓝光量越多,反" +-"只红光量越多。" ++msgstr "当夜光模式启用时,以开尔文表示的色温用来修改屏幕色调。数值越高蓝光量越多,反只红光量越多。" + +-#: ../data/org.gnome.settings-daemon.plugins.color.gschema.xml.in.in.h:9 ++#: data/org.gnome.settings-daemon.plugins.color.gschema.xml.in:26 + msgid "Use the sunrise and sunset" + msgstr "使用日出和日落" + +-#: ../data/org.gnome.settings-daemon.plugins.color.gschema.xml.in.in.h:10 ++#: data/org.gnome.settings-daemon.plugins.color.gschema.xml.in:27 + msgid "" + "Calculate the sunrise and sunset times automatically, from the current " + "location." + msgstr "根据当前位置自动计算日出和日落。" + +-#: ../data/org.gnome.settings-daemon.plugins.color.gschema.xml.in.in.h:11 ++#: data/org.gnome.settings-daemon.plugins.color.gschema.xml.in:31 + msgid "The start time" + msgstr "开始时间" + +-#: ../data/org.gnome.settings-daemon.plugins.color.gschema.xml.in.in.h:12 ++#: data/org.gnome.settings-daemon.plugins.color.gschema.xml.in:32 + msgid "" + "When “night-light-schedule-automatic” is disabled, use this start time in " + "hours from midnight." +-msgstr "" +-"禁用“night-light-schedule-automatic”时,使用此距离午夜的小时数作为开始时间。" ++msgstr "禁用“night-light-schedule-automatic”时,使用此距离午夜的小时数作为开始时间。" + +-#: ../data/org.gnome.settings-daemon.plugins.color.gschema.xml.in.in.h:13 ++#: data/org.gnome.settings-daemon.plugins.color.gschema.xml.in:36 + msgid "The end time" + msgstr "结束时间" + +-#: ../data/org.gnome.settings-daemon.plugins.color.gschema.xml.in.in.h:14 ++#: data/org.gnome.settings-daemon.plugins.color.gschema.xml.in:37 + msgid "" + "When “night-light-schedule-automatic” is disabled, use this end time in " + "hours from midnight." +-msgstr "" +-"禁用“night-light-schedule-automatic”时,使用此距离午夜的小时数作为结束时间。" ++msgstr "禁用“night-light-schedule-automatic”时,使用此距离午夜的小时数作为结束时间。" + +-#: ../data/org.gnome.settings-daemon.plugins.color.gschema.xml.in.in.h:15 ++#: data/org.gnome.settings-daemon.plugins.color.gschema.xml.in:41 + msgid "The last detected position" + msgstr "最后定位点" + +-#: ../data/org.gnome.settings-daemon.plugins.color.gschema.xml.in.in.h:16 ++#: data/org.gnome.settings-daemon.plugins.color.gschema.xml.in:42 + msgid "" + "When location services are available this represents the last detected " + "location. The default value is an invalid value to ensure it is always " + "updated at startup." +-msgstr "" +-"定位服务启用时当前最后一次获取到的位置。默认是一个无效值以保证总是会在启动时" +-"更新。" ++msgstr "定位服务启用时当前最后一次获取到的位置。默认是一个无效值以保证总是会在启动时更新。" + +-#: ../data/org.gnome.settings-daemon.plugins.gschema.xml.in.in.h:1 ++#: data/org.gnome.settings-daemon.plugins.gschema.xml.in:6 + msgid "List of plugins that are allowed to be loaded" + msgstr "允许加载的插件列表" + +-#: ../data/org.gnome.settings-daemon.plugins.gschema.xml.in.in.h:2 ++#: data/org.gnome.settings-daemon.plugins.gschema.xml.in:7 + msgid "" + "A list of strings representing the plugins that are allowed to be loaded " + "(default: “all”). This is only evaluated on startup." +-msgstr "" +-"一个代表允许加载插件的字符串列表(默认为“all”)。启动时才会检查此列表。" ++msgstr "一个代表允许加载插件的字符串列表(默认为“all”)。启动时才会检查此列表。" + +-#: ../data/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml.in.in.h:1 ++#: data/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml.in:6 + msgid "Mount paths to ignore" + msgstr "要忽略的挂载路径" + +-#: ../data/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml.in.in.h:2 ++#: data/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml.in:7 + msgid "Specify a list of mount paths to ignore when they run low on space." + msgstr "指定当运行在低硬盘空间时要忽略的挂载路径清单" + +-#: ../data/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml.in.in.h:3 ++#: data/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml.in:12 + msgid "Free percentage notify threshold" + msgstr "触发通知的最低可用百分比" + +-#: ../data/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml.in.in.h:4 ++#: data/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml.in:13 + msgid "" + "Percentage free space threshold for initial warning of low disk space. If " + "the percentage free space drops below this, a warning will be shown." +-msgstr "" +-"触发低硬盘空间初次警告的最低可用空间百分比。如果可用空间的百分比低于该值,将" +-"显示一个警告" ++msgstr "触发低硬盘空间初次警告的最低可用空间百分比。如果可用空间的百分比低于该值,将显示一个警告" + +-#: ../data/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml.in.in.h:5 ++#: data/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml.in:18 + msgid "Subsequent free space percentage notify threshold" + msgstr "触发通知的最低后续可用空间百分比" + +-#: ../data/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml.in.in.h:6 ++#: data/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml.in:19 + msgid "" + "Specify the percentage that the free disk space should reduce by before " + "issuing a subsequent warning." + msgstr "在发布一个后续警告之前,指定应减少的可用硬盘空间百分比。" + +-#: ../data/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml.in.in.h:7 ++#: data/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml.in:23 + msgid "Free space notify threshold" + msgstr "触发通知的最低可用空间" + +-#: ../data/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml.in.in.h:8 ++#: data/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml.in:24 + msgid "" + "Specify an amount in GB. If the amount of free space is more than this, no " + "warning will be shown." + msgstr "以 GB 为单位指定某个量。如果可用空间超过该值,将不再显示警告。" + +-#: ../data/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml.in.in.h:9 ++#: data/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml.in:28 + msgid "Minimum notify period for repeated warnings" + msgstr "重复警告的最小通知周期" + +-#: ../data/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml.in.in.h:10 ++#: data/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml.in:29 + msgid "" + "Specify a time in minutes. Subsequent warnings for a volume will not appear " + "more often than this period." + msgstr "以分钟为单位指定某个时间。该周期内不会多次显示某个卷的后续警告。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:1 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:6 + msgid "Custom keybindings" + msgstr "自定义键绑定" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:2 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:7 + msgid "List of custom keybindings" + msgstr "自定义键绑定列表" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:3 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:11 + msgid "Launch calculator" + msgstr "启动计算器" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:4 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:12 + msgid "Binding to launch the calculator." + msgstr "调用计算器的键绑定。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:5 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:16 + msgid "Launch settings" + msgstr "启动设置" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:6 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:17 + msgid "Binding to launch GNOME settings." + msgstr "调用 GNOME 设置的键绑定。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:7 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:21 + msgid "Launch email client" + msgstr "启动电子邮件客户端" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:8 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:22 + msgid "Binding to launch the email client." + msgstr "调用电子邮件客户端的键绑定。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:9 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:26 + msgid "Eject" + msgstr "弹出" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:10 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:27 + msgid "Binding to eject an optical disc." + msgstr "弹出光盘的键绑定。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:11 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:31 + msgid "Launch help browser" + msgstr "启动帮助浏览器" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:12 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:32 + msgid "Binding to launch the help browser." + msgstr "调用帮助浏览器的键绑定。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:13 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:36 + msgid "Home folder" + msgstr "主文件夹" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:14 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:37 + msgid "Binding to open the Home folder." + msgstr "打开主文件夹的键绑定。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:15 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:41 + msgid "Launch media player" + msgstr "启动媒体播放机" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:16 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:42 + msgid "Binding to launch the media player." + msgstr "调用媒体播放机的键绑定。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:17 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:46 + msgid "Next track" + msgstr "下一音轨" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:18 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:47 + msgid "Binding to skip to next track." + msgstr "跳到下一音轨的键绑定。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:19 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:51 + msgid "Pause playback" + msgstr "暂停回放" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:20 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:52 + msgid "Binding to pause playback." + msgstr "暂停播放的键绑定。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:21 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:56 + msgid "Play (or play/pause)" + msgstr "播放(或播放/暂停)" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:22 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:57 + msgid "Binding to start playback (or toggle play/pause)." + msgstr "开始回放或切换 播放/暂停 的键绑定。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:23 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:61 + msgid "Log out" + msgstr "注销" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:24 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:62 + msgid "Binding to log out." + msgstr "注销的键绑定。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:25 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:66 + msgid "Previous track" + msgstr "上一音轨" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:26 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:67 + msgid "Binding to skip to previous track." + msgstr "跳到上一音轨的键绑定。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:27 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:71 + msgid "Lock screen" + msgstr "锁住屏幕" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:28 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:72 + msgid "Binding to lock the screen." + msgstr "锁住屏幕的键绑定。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:29 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:76 + msgid "Search" + msgstr "搜索" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:30 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:77 + msgid "Binding to launch the search tool." + msgstr "调用搜索工具的键绑定。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:31 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:81 + msgid "Stop playback" + msgstr "停止回放" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:32 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:82 + msgid "Binding to stop playback." + msgstr "停止回放的键绑定。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:33 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:86 + msgid "Volume down" + msgstr "音量降低" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:34 +-msgid "Binding to lower the system volume." +-msgstr "降低系统音量的键绑定。" ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:87 ++msgid "Binding to lower the volume." ++msgstr "降低音量。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:35 +-msgid "Volume mute" +-msgstr "静音" ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:91 ++msgid "Volume mute/unmute" ++msgstr "静音/取消静音" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:36 +-msgid "Binding to mute the system volume." +-msgstr "使系统静音的键绑定。" ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:92 ++msgid "Binding to mute/unmute the volume." ++msgstr "静音/取消静音。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:37 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:96 + msgid "Volume up" + msgstr "音量升高" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:38 +-msgid "Binding to raise the system volume." +-msgstr "升高系统音量的键绑定。" ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:97 ++msgid "Binding to raise the volume." ++msgstr "升高音量。" ++ ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:101 ++msgid "Microphone mute/unmute" ++msgstr "话筒静音/取消静音" ++ ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:102 ++msgid "Binding to mute/unmute the microphone." ++msgstr "话筒静音/取消静音。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:39 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:106 + msgid "Take a screenshot" + msgstr "截图" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:40 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:107 + msgid "Binding to take a screenshot." + msgstr "截图的快捷键绑定。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:41 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:111 + msgid "Take a screenshot of a window" + msgstr "截取窗口的截图" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:42 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:112 + msgid "Binding to take a screenshot of a window." + msgstr "截取窗口截图的快捷键绑定。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:43 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:116 + msgid "Take a screenshot of an area" + msgstr "截取一个区域的截图" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:44 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:117 + msgid "Binding to take a screenshot of an area." + msgstr "截取一个区域的截图快捷键绑定。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:45 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:121 + msgid "Copy a screenshot to clipboard" + msgstr "将截图复制到剪切板" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:46 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:122 + msgid "Binding to copy a screenshot to clipboard." + msgstr "将截图复制到剪切板的键绑定。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:47 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:126 + msgid "Copy a screenshot of a window to clipboard" + msgstr "复制窗口的截图到剪切板" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:48 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:127 + msgid "Binding to copy a screenshot of a window to clipboard." + msgstr "复制窗口截图到剪切板的键绑定。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:49 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:131 + msgid "Copy a screenshot of an area to clipboard" + msgstr "复制一个区域的截图到剪切板" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:50 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:132 + msgid "Binding to copy a screenshot of an area to clipboard." + msgstr "复制一个区域的截图到剪切板的快捷键。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:51 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:136 + msgid "Record a short video of the screen" + msgstr "录制屏幕操作的短视频" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:52 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:137 + msgid "Binding to record a short video of the screen" + msgstr "录制屏幕短视频的组合键绑定" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:53 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:141 + msgid "Launch web browser" + msgstr "启动网络浏览器" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:54 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:142 + msgid "Binding to launch the web browser." + msgstr "调用网络浏览器的键绑定。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:55 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:146 + msgid "Toggle magnifier" + msgstr "切换放大镜" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:56 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:147 + msgid "Binding to show the screen magnifier" + msgstr "显示屏幕放大镜的键绑定。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:57 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:151 + msgid "Toggle screen reader" + msgstr "切换屏幕阅读器" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:58 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:152 + msgid "Binding to start the screen reader" + msgstr "启动屏幕阅读器的键绑定" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:59 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:156 + msgid "Toggle on-screen keyboard" + msgstr "切换屏幕上键盘" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:60 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:157 + msgid "Binding to show the on-screen keyboard" + msgstr "显示屏幕键盘的键绑定。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:61 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:161 + msgid "Increase text size" + msgstr "增大文本字号" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:62 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:162 + msgid "Binding to increase the text size" + msgstr "增大文本字号的键绑定。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:63 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:166 + msgid "Decrease text size" + msgstr "减小文本字号" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:64 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:167 + msgid "Binding to decrease the text size" + msgstr "减小文本字号的键绑定。" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:65 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:171 + msgid "Toggle contrast" + msgstr "切换对比度" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:66 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:172 + msgid "Binding to toggle the interface contrast" + msgstr "界面对比度切换的键绑定" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:67 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:176 + msgid "Magnifier zoom in" + msgstr "放大镜放大" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:68 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:177 + msgid "Binding for the magnifier to zoom in" + msgstr "屏幕放大镜进行放大的键绑定" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:69 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:181 + msgid "Magnifier zoom out" + msgstr "放大镜缩小" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:70 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:182 + msgid "Binding for the magnifier to zoom out" + msgstr "屏幕放大镜进行缩小的键绑定" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:71 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:186 + msgid "Maximum length of screen recordings" + msgstr "屏幕录制的最大长度" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:72 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:187 + msgid "" + "The maximum length of single screen cast recordings in seconds or 0 for " + "unlimited" + msgstr "按秒计算的屏幕录制的最大长度,设置为 0 以取消限制" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:73 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:194 + msgid "Name" + msgstr "名称" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:74 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:195 + msgid "Name of the custom binding" + msgstr "自定义绑定的名称" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:75 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:199 + msgid "Binding" + msgstr "绑定" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:76 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:200 + msgid "Binding for the custom binding" + msgstr "用于自定义绑定的绑定" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:77 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:204 + msgid "Command" + msgstr "命令" + +-#: ../data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in.h:78 ++#: data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in:205 + msgid "Command to run when the binding is invoked" + msgstr "触发此绑定时运行的命令。" + +-#: ../data/org.gnome.settings-daemon.plugins.power.gschema.xml.in.in.h:1 ++#: data/org.gnome.settings-daemon.plugins.power.gschema.xml.in:6 + msgid "The brightness of the screen when idle" + msgstr "空闲时的屏幕亮度。" + +-#: ../data/org.gnome.settings-daemon.plugins.power.gschema.xml.in.in.h:2 ++#: data/org.gnome.settings-daemon.plugins.power.gschema.xml.in:7 + msgid "" + "This is the laptop panel screen brightness used when the session is idle." + msgstr "这是会话空闲时笔记本电脑屏幕使用的亮度。" + +-#: ../data/org.gnome.settings-daemon.plugins.power.gschema.xml.in.in.h:3 ++#: data/org.gnome.settings-daemon.plugins.power.gschema.xml.in:11 + msgid "Dim the screen after a period of inactivity" + msgstr "在空闲一段时间后黯淡屏幕" + +-#: ../data/org.gnome.settings-daemon.plugins.power.gschema.xml.in.in.h:4 ++#: data/org.gnome.settings-daemon.plugins.power.gschema.xml.in:12 + msgid "If the screen should be dimmed to save power when the computer is idle." + msgstr "是否在电脑空闲时黯淡屏幕以节省能源。" + +-#: ../data/org.gnome.settings-daemon.plugins.power.gschema.xml.in.in.h:5 ++#: data/org.gnome.settings-daemon.plugins.power.gschema.xml.in:16 + msgid "Sleep timeout computer when on AC" + msgstr "电脑插入交流电时的睡眠超时" + +-#: ../data/org.gnome.settings-daemon.plugins.power.gschema.xml.in.in.h:6 ++#: data/org.gnome.settings-daemon.plugins.power.gschema.xml.in:17 + msgid "" + "The amount of time in seconds the computer on AC power needs to be inactive " + "before it goes to sleep. A value of 0 means never." +-msgstr "" +-"按秒计算的,电脑插入交流电后进入睡眠状态之前的空闲时长。0 值意味着永远不睡" +-"眠。" ++msgstr "按秒计算的,电脑插入交流电后进入睡眠状态之前的空闲时长。0 值意味着永远不睡眠。" + +-#: ../data/org.gnome.settings-daemon.plugins.power.gschema.xml.in.in.h:7 ++#: data/org.gnome.settings-daemon.plugins.power.gschema.xml.in:21 ++#: data/org.gnome.settings-daemon.plugins.power.gschema.xml.in:31 + msgid "Whether to hibernate, suspend or do nothing when inactive" + msgstr "空闲时休眠,挂起或不作任何操作" + +-#: ../data/org.gnome.settings-daemon.plugins.power.gschema.xml.in.in.h:8 ++#: data/org.gnome.settings-daemon.plugins.power.gschema.xml.in:22 ++#: data/org.gnome.settings-daemon.plugins.power.gschema.xml.in:32 + msgid "" + "The type of sleeping that should be performed when the computer is inactive." + msgstr "电脑空闲时采用的睡眠类型。" + +-#: ../data/org.gnome.settings-daemon.plugins.power.gschema.xml.in.in.h:9 ++#: data/org.gnome.settings-daemon.plugins.power.gschema.xml.in:26 + msgid "Sleep timeout computer when on battery" + msgstr "电脑使用电池电源时的睡眠超时" + +-#: ../data/org.gnome.settings-daemon.plugins.power.gschema.xml.in.in.h:10 ++#: data/org.gnome.settings-daemon.plugins.power.gschema.xml.in:27 + msgid "" + "The amount of time in seconds the computer on battery power needs to be " + "inactive before it goes to sleep. A value of 0 means never." +-msgstr "" +-"按秒计算的,电脑使用电池时进入睡眠状态之前的空闲时长。0 值意味着永远不睡眠。" ++msgstr "按秒计算的,电脑使用电池时进入睡眠状态之前的空闲时长。0 值意味着永远不睡眠。" + +-#: ../data/org.gnome.settings-daemon.plugins.power.gschema.xml.in.in.h:11 ++#: data/org.gnome.settings-daemon.plugins.power.gschema.xml.in:36 + msgid "Enable the ALS sensor" + msgstr "启用 ALS 感应器" + +-#: ../data/org.gnome.settings-daemon.plugins.power.gschema.xml.in.in.h:12 ++#: data/org.gnome.settings-daemon.plugins.power.gschema.xml.in:37 + msgid "If the ambient light sensor functionality is enabled." + msgstr "是否启用环境光感应器。" + +-#: ../data/org.gnome.settings-daemon.plugins.power.gschema.xml.in.in.h:13 ++#: data/org.gnome.settings-daemon.plugins.power.gschema.xml.in:41 + msgid "Power button action" + msgstr "电源按钮动作" + +-#: ../data/org.gnome.settings-daemon.plugins.power.gschema.xml.in.in.h:14 ++#: data/org.gnome.settings-daemon.plugins.power.gschema.xml.in:42 + msgid "" + "The action to take when the system power button is pressed. This action is " + "hard-coded (and the setting ignored) on virtual machines (power off) and " + "tablets (suspend)." +-msgstr "" +-"按下系统电源按钮时进行的动作。该动作在虚拟机和平板电脑上是硬编码的(分别为关" +-"机和挂起)。" ++msgstr "按下系统电源按钮时进行的动作。该动作在虚拟机和平板电脑上是硬编码的(分别为关机和挂起)。" + +-#: ../data/org.gnome.settings-daemon.plugins.sharing.gschema.xml.in.in.h:1 ++#: data/org.gnome.settings-daemon.plugins.sharing.gschema.xml.in:6 + msgid "On which connections the service is enabled" + msgstr "服务已经被启用的连接" + +-#: ../data/org.gnome.settings-daemon.plugins.sharing.gschema.xml.in.in.h:2 ++#: data/org.gnome.settings-daemon.plugins.sharing.gschema.xml.in:7 + msgid "" + "The list of NetworkManager connections (each one represented with its UUID) " + "on which this service is enabled and started." + msgstr "服务已经被启用并启动的 NetworkManager 连接的列表(以UUID表示)。" + +-#: ../data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in.in.h:1 ++#: data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in:6 + msgid "Antialiasing" + msgstr "反锯齿" + +-#: ../data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in.in.h:2 ++#: data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in:7 + msgid "" + "The type of antialiasing to use when rendering fonts. Possible values are: " + "“none” for no antialiasing, “grayscale” for standard grayscale antialiasing, " + "and “rgba” for subpixel antialiasing (LCD screens only)." +-msgstr "" +-"绘制字体时使用的反锯齿类型。可能的设定有:“none”无反锯齿。“grayscale”标准灰度" +-"反锯齿。“rgba”次像素反锯齿(LCD 屏幕专用)。" ++msgstr "绘制字体时使用的反锯齿类型。可能的设定有:“none”无反锯齿。“grayscale”标准灰度反锯齿。“rgba”次像素反锯齿(LCD 屏幕专用)。" + +-#: ../data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in.in.h:3 ++#: data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in:11 + msgid "Hinting" + msgstr "微调" + +-#: ../data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in.in.h:4 ++#: data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in:12 + msgid "" + "The type of hinting to use when rendering fonts. Possible values are: “none” " + "for no hinting and “slight” for fitting only to the Y-axis like Microsoft’s " +@@ -937,437 +926,328 @@ msgid "" + "(except for .otf: Y-only). This can lead to distortion and/or inconsistent " + "rendering depending on the quality of the font, the font format and the " + "state of FreeType’s font engines." +-msgstr "" +-"渲染字体时要使用的微调设置。可能的数值有:“none”表示无微调。“slight”表示仅将" +-"字形对齐到 Y 轴,就像微软 ClearType、DirectWrite 和 Adobe 的专有字体渲染引擎" +-"一样。这将忽略字体内部的微调信息,直接使用自动算法进行微调。Ubuntu 默认使用这" +-"个设置,推荐使用这个设置。“medium”和“full”的含义取决于字体格式 (.ttf、.otf、." +-"pfa 或 .pfb) 和已安装的 FreeType 版本。这两者一般尝试将字符图形同时对齐到 X " +-"和 Y 轴(.otf 只对齐到 Y 轴)。这可能会导致混乱和/或不一致的渲染,取决于字体" +-"质量、字体格式和 FreeType 引擎的状态。" +- +-#: ../data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in.in.h:5 ++msgstr "渲染字体时要使用的微调设置。可能的数值有:“none”表示无微调。“slight”表示仅将字形对齐到 Y 轴,就像微软 ClearType、DirectWrite 和 Adobe 的专有字体渲染引擎一样。这将忽略字体内部的微调信息,直接使用自动算法进行微调。Ubuntu 默认使用这个设置,推荐使用这个设置。“medium”和“full”的含义取决于字体格式 (.ttf、.otf、.pfa 或 .pfb) 和已安装的 FreeType 版本。这两者一般尝试将字符图形同时对齐到 X 和 Y 轴(.otf 只对齐到 Y 轴)。这可能会导致混乱和/或不一致的渲染,取决于字体质量、字体格式和 FreeType 引擎的状态。" ++ ++#: data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in:16 + msgid "RGBA order" + msgstr "RGBA 顺序" + +-#: ../data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in.in.h:6 ++#: data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in:17 + msgid "" + "The order of subpixel elements on an LCD screen; only used when antialiasing " + "is set to “rgba”. Possible values are: “rgb” for red on left (most common), " + "“bgr” for blue on left, “vrgb” for red on top, “vbgr” for red on bottom." +-msgstr "" +-"LCD 屏幕上次像素的顺序;仅在反锯齿设为“rgba”时有用。可能的设定值有:“rgb”红色" +-"在左侧(最常见设置)。“bgr”蓝色在左侧。“vrgb”红色在上端。“vbgr”红色在底部。" ++msgstr "LCD 屏幕上次像素的顺序;仅在反锯齿设为“rgba”时有用。可能的设定值有:“rgb”红色在左侧(最常见设置)。“bgr”蓝色在左侧。“vrgb”红色在上端。“vbgr”红色在底部。" + +-#: ../data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in.in.h:7 ++#: data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in:21 + msgid "List of explicitly disabled GTK+ modules" + msgstr "单独指定禁止的 GTK+ 模块清单" + +-#: ../data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in.in.h:8 ++#: data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in:22 + msgid "" + "A list of strings representing the GTK+ modules that will not be loaded, " + "even if enabled by default in their configuration." + msgstr "代表将不被加载的 GTK+ 模块的字符串列表,即便是其默认配置中启用的。" + +-#: ../data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in.in.h:9 ++#: data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in:26 + msgid "List of explicitly enabled GTK+ modules" + msgstr "单独指定启用的 GTK+ 模块清单" + +-#: ../data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in.in.h:10 ++#: data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in:27 + msgid "" + "A list of strings representing the GTK+ modules that will be loaded, usually " + "in addition to conditional and forcibly disabled ones." +-msgstr "" +-"代表将加载的 GTK+ 模块的字符串列表,通常加上有条件的和强制禁止的一些模块。" ++msgstr "代表将加载的 GTK+ 模块的字符串列表,通常加上有条件的和强制禁止的一些模块。" + +-#: ../data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in.in.h:11 ++#: data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in:31 + msgid "A dictionary of XSETTINGS to override" + msgstr "要覆盖的 XSETTINGS 字典" + +-#: ../data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in.in.h:12 ++#: data/org.gnome.settings-daemon.plugins.xsettings.gschema.xml.in:32 + msgid "" + "This dictionary maps XSETTINGS names to overrides values. The values must be " + "either strings, signed int32s or (in the case of colors), 4-tuples of uint16 " + "(red, green, blue, alpha; 65535 is fully opaque)." +-msgstr "" +-"该字典用于映射需要覆盖的 XSETTINGS 为指定值。该值必须为字符串,signed int32 " +-"或 uint16 的四组数(用于颜色,分别对应红、绿、蓝、Alpha;Alpha 值为 65535 时" +-"表示不透明)。" +- +-#: ../plugins/a11y-keyboard/gsd-a11y-keyboard-manager.c:398 +-msgid "Slow Keys Turned On" +-msgstr "迟缓按键已打开" +- +-#: ../plugins/a11y-keyboard/gsd-a11y-keyboard-manager.c:399 +-msgid "Slow Keys Turned Off" +-msgstr "迟缓按键已关闭" +- +-#: ../plugins/a11y-keyboard/gsd-a11y-keyboard-manager.c:400 +-msgid "" +-"You just held down the Shift key for 8 seconds. This is the shortcut for " +-"the Slow Keys feature, which affects the way your keyboard works." +-msgstr "" +-"您已经按下了 Shift 键 8 秒。这是迟缓按键功能的快捷键,这将影响您键盘工作的方" +-"式。" +- +-#: ../plugins/a11y-keyboard/gsd-a11y-keyboard-manager.c:410 +-#: ../plugins/a11y-keyboard/gsd-a11y-keyboard-manager.c:478 +-msgid "Universal Access" +-msgstr "通用访问" +- +-#: ../plugins/a11y-keyboard/gsd-a11y-keyboard-manager.c:416 +-#: ../plugins/a11y-keyboard/gsd-a11y-keyboard-manager.c:484 +-msgid "Turn Off" +-msgstr "关闭" +- +-#: ../plugins/a11y-keyboard/gsd-a11y-keyboard-manager.c:416 +-#: ../plugins/a11y-keyboard/gsd-a11y-keyboard-manager.c:484 +-msgid "Turn On" +-msgstr "打开" +- +-#: ../plugins/a11y-keyboard/gsd-a11y-keyboard-manager.c:422 +-#: ../plugins/a11y-keyboard/gsd-a11y-keyboard-manager.c:490 +-msgid "Leave On" +-msgstr "保持打开" +- +-#: ../plugins/a11y-keyboard/gsd-a11y-keyboard-manager.c:422 +-#: ../plugins/a11y-keyboard/gsd-a11y-keyboard-manager.c:490 +-msgid "Leave Off" +-msgstr "保持关闭" +- +-#: ../plugins/a11y-keyboard/gsd-a11y-keyboard-manager.c:463 +-msgid "Sticky Keys Turned On" +-msgstr "粘滞键已打开" +- +-#: ../plugins/a11y-keyboard/gsd-a11y-keyboard-manager.c:464 +-msgid "Sticky Keys Turned Off" +-msgstr "粘滞键已关闭" +- +-#: ../plugins/a11y-keyboard/gsd-a11y-keyboard-manager.c:466 +-msgid "" +-"You just pressed the Shift key 5 times in a row. This is the shortcut for " +-"the Sticky Keys feature, which affects the way your keyboard works." +-msgstr "" +-"您刚刚连续按了五次 Shift 键。这是粘滞键特性的快捷键,这将影响您键盘的工作方" +-"式。" ++msgstr "该字典用于映射需要覆盖的 XSETTINGS 为指定值。该值必须为字符串,signed int32 或 uint16 的四组数(用于颜色,分别对应红、绿、蓝、Alpha;Alpha 值为 65535 时表示不透明)。" + +-#: ../plugins/a11y-keyboard/gsd-a11y-keyboard-manager.c:468 +-msgid "" +-"You just pressed two keys at once, or pressed the Shift key 5 times in a " +-"row. This turns off the Sticky Keys feature, which affects the way your " +-"keyboard works." +-msgstr "" +-"您刚刚同时按下了两个键,或连续按了五次 Shift 键。这是取消粘滞键特性的快捷键," +-"这将影响您键盘的工作方式。" +- +-#: ../plugins/color/gsd-color-calibrate.c:139 ++#: plugins/color/gsd-color-calibrate.c:139 + msgid "Color" + msgstr "颜色" + + #. TRANSLATORS: button: this is to open GCM +-#: ../plugins/color/gsd-color-calibrate.c:144 ++#: plugins/color/gsd-color-calibrate.c:145 + msgid "Recalibrate now" + msgstr "立即重新校准" + + #. TRANSLATORS: this is when the device has not been recalibrated in a while +-#: ../plugins/color/gsd-color-calibrate.c:187 ++#: plugins/color/gsd-color-calibrate.c:188 + msgid "Recalibration required" + msgstr "需要重新校准" + + #. TRANSLATORS: this is when the display has not been recalibrated in a while +-#: ../plugins/color/gsd-color-calibrate.c:199 ++#: plugins/color/gsd-color-calibrate.c:200 + #, c-format + msgid "The display “%s” should be recalibrated soon." + msgstr "显示“%s”应该尽快校准。" + + #. TRANSLATORS: this is when the printer has not been recalibrated in a while +-#: ../plugins/color/gsd-color-calibrate.c:208 ++#: plugins/color/gsd-color-calibrate.c:209 + #, c-format + msgid "The printer “%s” should be recalibrated soon." + msgstr "打印机“%s”应该尽快校准。" + + #. TRANSLATORS: this is the application name +-#: ../plugins/color/gsd-color-calibrate.c:346 +-#: ../plugins/color/gsd-color-calibrate.c:362 ++#: plugins/color/gsd-color-calibrate.c:347 ++#: plugins/color/gsd-color-calibrate.c:363 + msgid "GNOME Settings Daemon Color Plugin" + msgstr "GNOME 设置守护程序颜色插件" + + #. TRANSLATORS: this is a sound description +-#: ../plugins/color/gsd-color-calibrate.c:348 ++#: plugins/color/gsd-color-calibrate.c:349 + msgid "Color calibration device added" + msgstr "已添加颜色校准设备" + + #. TRANSLATORS: this is a sound description +-#: ../plugins/color/gsd-color-calibrate.c:364 ++#: plugins/color/gsd-color-calibrate.c:365 + msgid "Color calibration device removed" + msgstr "已移除颜色校准设备" + + #. Translators: UTC here means the Coordinated Universal Time. + #. * %:::z will be replaced by the offset from UTC e.g. UTC+02 +-#: ../plugins/datetime/gsd-datetime-manager.c:88 ++#: plugins/datetime/gsd-datetime-manager.c:88 + msgid "UTC%:::z" + msgstr "UTC%:::z" + +-#: ../plugins/datetime/gsd-datetime-manager.c:92 ++#: plugins/datetime/gsd-datetime-manager.c:92 + #, c-format + msgid "Time Zone Updated to %s (%s)" + msgstr "时区已更新为 %s (%s)" + +-#: ../plugins/datetime/gsd-datetime-manager.c:108 ++#: plugins/datetime/gsd-datetime-manager.c:108 + msgid "Settings" + msgstr "设置" + +-#: ../plugins/datetime/gsd-datetime-manager.c:118 ++#: plugins/datetime/gsd-datetime-manager.c:118 + msgid "Date & Time Settings" + msgstr "日期和时间设置" + +-#: ../plugins/housekeeping/gsd-disk-space.c:574 +-msgid "Disk space" ++#: plugins/housekeeping/gsd-disk-space.c:575 ++msgid "Disk Space" + msgstr "磁盘空间" + +-#: ../plugins/housekeeping/gsd-disk-space.c:586 ++#: plugins/housekeeping/gsd-disk-space.c:588 + msgid "Examine" + msgstr "查看" + +-#: ../plugins/housekeeping/gsd-disk-space.c:597 ++#: plugins/housekeeping/gsd-disk-space.c:599 + msgid "Empty Trash" + msgstr "清空回收站" + +-#: ../plugins/housekeeping/gsd-disk-space.c:605 ++#: plugins/housekeeping/gsd-disk-space.c:607 + msgid "Ignore" + msgstr "忽略" + +-#: ../plugins/housekeeping/gsd-disk-space.c:636 ++#: plugins/housekeeping/gsd-disk-space.c:638 + #, c-format + msgid "Low Disk Space on “%s”" + msgstr "%s 上的磁盘空间不足" + +-#: ../plugins/housekeeping/gsd-disk-space.c:638 ++#: plugins/housekeeping/gsd-disk-space.c:640 + #, c-format + msgid "" + "The volume “%s” has only %s disk space remaining. You may free up some " + "space by emptying the trash." + msgstr "巻 %s 仅剩余 %s 的磁盘空间,请清空回收站释放一部分空间。" + +-#: ../plugins/housekeeping/gsd-disk-space.c:642 ++#: plugins/housekeeping/gsd-disk-space.c:644 + #, c-format + msgid "The volume “%s” has only %s disk space remaining." + msgstr "卷 %s 仅剩余 %s 的硬盘空间。" + +-#: ../plugins/housekeeping/gsd-disk-space.c:647 ++#: plugins/housekeeping/gsd-disk-space.c:649 + msgid "Low Disk Space" + msgstr "磁盘空间不足" + +-#: ../plugins/housekeeping/gsd-disk-space.c:649 ++#: plugins/housekeeping/gsd-disk-space.c:651 + #, c-format + msgid "" + "This computer has only %s disk space remaining. You may free up some space " + "by emptying the trash." + msgstr "此计算机仅剩余 %s 的磁盘空间,请清空回收站释放一部分空间" + +-#: ../plugins/housekeeping/gsd-disk-space.c:652 ++#: plugins/housekeeping/gsd-disk-space.c:654 + #, c-format + msgid "This computer has only %s disk space remaining." + msgstr "此计算机仅剩余 %s 的硬盘空间。" + +-#: ../plugins/media-keys/gsd-media-keys-manager.c:2138 ++#: plugins/media-keys/gsd-media-keys-manager.c:2288 + msgid "Bluetooth disabled" + msgstr "已禁用蓝牙" + +-#: ../plugins/media-keys/gsd-media-keys-manager.c:2141 ++#: plugins/media-keys/gsd-media-keys-manager.c:2291 + msgid "Bluetooth enabled" + msgstr "已启用蓝牙" + +-#: ../plugins/media-keys/gsd-media-keys-manager.c:2145 ++#: plugins/media-keys/gsd-media-keys-manager.c:2295 + msgid "Airplane mode enabled" + msgstr "已启用飞行模式" + +-#: ../plugins/media-keys/gsd-media-keys-manager.c:2148 ++#: plugins/media-keys/gsd-media-keys-manager.c:2298 + msgid "Airplane mode disabled" + msgstr "已禁用飞行模式" + +-#: ../plugins/media-keys/gsd-media-keys-manager.c:2176 ++#: plugins/media-keys/gsd-media-keys-manager.c:2326 + msgid "Hardware Airplane Mode" + msgstr "硬件飞行模式" + + #. Translators: this is a filename used for screencast + #. * recording, where "%d" and "%t" date and time, e.g. + #. * "Screencast from 07-17-2013 10:00:46 PM.webm" +-#: ../plugins/media-keys/gsd-media-keys-manager.c:2236 ++#: plugins/media-keys/gsd-media-keys-manager.c:2392 + #, no-c-format + msgid "Screencast from %d %t.webm" + msgstr "%d 屏幕视频 %t.webm" + +-#: ../plugins/media-keys/gsd-screenshot-utils.c:82 ++#: plugins/media-keys/gsd-screenshot-utils.c:82 + msgid "Unable to capture a screenshot" + msgstr "无法获得屏幕截图" + +-#: ../plugins/media-keys/gsd-screenshot-utils.c:113 +-#: ../plugins/media-keys/gsd-screenshot-utils.c:155 ++#: plugins/media-keys/gsd-screenshot-utils.c:113 ++#: plugins/media-keys/gsd-screenshot-utils.c:155 + msgid "Screenshot taken" + msgstr "已截图" + + #. translators: this is the name of the file that gets made up + #. * with the screenshot +-#: ../plugins/media-keys/gsd-screenshot-utils.c:306 ++#: plugins/media-keys/gsd-screenshot-utils.c:306 + #, c-format + msgid "Screenshot from %s" + msgstr "%s 的屏幕截图" + +-#. translators: +-#. * The device has been disabled +-#: ../plugins/media-keys/gvc/gvc-mixer-control.c:1866 +-msgid "Disabled" +-msgstr "禁用" +- +-#. translators: +-#. * The number of sound outputs on a particular device +-#: ../plugins/media-keys/gvc/gvc-mixer-control.c:1873 +-#, c-format +-msgid "%u Output" +-msgid_plural "%u Outputs" +-msgstr[0] "%u 输出" +- +-#. translators: +-#. * The number of sound inputs on a particular device +-#: ../plugins/media-keys/gvc/gvc-mixer-control.c:1883 +-#, c-format +-msgid "%u Input" +-msgid_plural "%u Inputs" +-msgstr[0] "%u 输入" +- +-#: ../plugins/media-keys/gvc/gvc-mixer-control.c:2738 +-msgid "System Sounds" +-msgstr "系统声音" +- +-#: ../plugins/media-keys/shortcuts-list.h:45 ++#: plugins/media-keys/shortcuts-list.h:46 ++#: plugins/media-keys/shortcuts-list.h:47 + msgid "Touchpad toggle" + msgstr "触摸板开关" + +-#: ../plugins/media-keys/shortcuts-list.h:46 ++#: plugins/media-keys/shortcuts-list.h:48 + msgid "Touchpad On" + msgstr "触摸板开" + +-#: ../plugins/media-keys/shortcuts-list.h:47 ++#: plugins/media-keys/shortcuts-list.h:49 + msgid "Touchpad Off" + msgstr "触摸板关" + +-#: ../plugins/media-keys/shortcuts-list.h:51 +-#: ../plugins/media-keys/shortcuts-list.h:52 +-msgid "Microphone Mute" +-msgstr "话筒静音" +- +-#: ../plugins/media-keys/shortcuts-list.h:53 ++#: plugins/media-keys/shortcuts-list.h:56 + msgid "Quiet Volume Mute" + msgstr "安静 静音" + +-#: ../plugins/media-keys/shortcuts-list.h:54 ++#: plugins/media-keys/shortcuts-list.h:57 + msgid "Quiet Volume Down" + msgstr "安静 音量降低" + +-#: ../plugins/media-keys/shortcuts-list.h:55 ++#: plugins/media-keys/shortcuts-list.h:58 + msgid "Quiet Volume Up" + msgstr "安静 音量升高" + +-#: ../plugins/media-keys/shortcuts-list.h:56 ++#: plugins/media-keys/shortcuts-list.h:59 + msgid "Precise Volume Down" + msgstr "精确音量降低" + +-#: ../plugins/media-keys/shortcuts-list.h:57 ++#: plugins/media-keys/shortcuts-list.h:60 + msgid "Precise Volume Up" + msgstr "精确音量升高" + +-#: ../plugins/media-keys/shortcuts-list.h:67 ++#: plugins/media-keys/shortcuts-list.h:70 + msgid "Lock Screen" + msgstr "锁住屏幕" + +-#: ../plugins/media-keys/shortcuts-list.h:69 ++#: plugins/media-keys/shortcuts-list.h:72 + msgid "Help" + msgstr "帮助" + +-#: ../plugins/media-keys/shortcuts-list.h:83 ++#: plugins/media-keys/shortcuts-list.h:89 + msgid "Rewind" + msgstr "上一曲" + +-#: ../plugins/media-keys/shortcuts-list.h:84 ++#: plugins/media-keys/shortcuts-list.h:90 + msgid "Forward" + msgstr "下一曲" + +-#: ../plugins/media-keys/shortcuts-list.h:85 ++#: plugins/media-keys/shortcuts-list.h:91 + msgid "Repeat" + msgstr "重复" + +-#: ../plugins/media-keys/shortcuts-list.h:86 ++#: plugins/media-keys/shortcuts-list.h:92 + msgid "Random Play" + msgstr "随机播放" + +-#: ../plugins/media-keys/shortcuts-list.h:87 ++#: plugins/media-keys/shortcuts-list.h:93 + msgid "Orientation Lock" + msgstr "方向锁定" + +-#: ../plugins/media-keys/shortcuts-list.h:96 ++#: plugins/media-keys/shortcuts-list.h:102 + msgid "Power Off" + msgstr "电源关闭" + + #. the kernel / Xorg names really are like this... + #. translators: "Sleep" means putting the machine to sleep, either through hibernate or suspend +-#: ../plugins/media-keys/shortcuts-list.h:99 ++#: plugins/media-keys/shortcuts-list.h:105 + msgid "Sleep" + msgstr "睡眠" + +-#: ../plugins/media-keys/shortcuts-list.h:100 ++#: plugins/media-keys/shortcuts-list.h:106 + msgid "Suspend" + msgstr "挂起" + +-#: ../plugins/media-keys/shortcuts-list.h:101 ++#: plugins/media-keys/shortcuts-list.h:107 + msgid "Hibernate" + msgstr "休眠" + +-#: ../plugins/media-keys/shortcuts-list.h:102 ++#: plugins/media-keys/shortcuts-list.h:108 + msgid "Brightness Up" + msgstr "亮度增加" + +-#: ../plugins/media-keys/shortcuts-list.h:103 ++#: plugins/media-keys/shortcuts-list.h:109 + msgid "Brightness Down" + msgstr "亮度减少" + +-#: ../plugins/media-keys/shortcuts-list.h:104 ++#: plugins/media-keys/shortcuts-list.h:110 + msgid "Keyboard Brightness Up" + msgstr "键盘亮度增加" + +-#: ../plugins/media-keys/shortcuts-list.h:105 ++#: plugins/media-keys/shortcuts-list.h:111 + msgid "Keyboard Brightness Down" + msgstr "键盘亮度降低" + +-#: ../plugins/media-keys/shortcuts-list.h:106 ++#: plugins/media-keys/shortcuts-list.h:112 + msgid "Keyboard Brightness Toggle" + msgstr "键盘照明开关" + +-#: ../plugins/media-keys/shortcuts-list.h:107 ++#: plugins/media-keys/shortcuts-list.h:113 + msgid "Battery Status" + msgstr "电池电量状态" + +-#: ../plugins/media-keys/shortcuts-list.h:108 +-#: ../plugins/media-keys/shortcuts-list.h:109 +-#: ../plugins/media-keys/shortcuts-list.h:110 ++#: plugins/media-keys/shortcuts-list.h:114 ++#: plugins/media-keys/shortcuts-list.h:115 ++#: plugins/media-keys/shortcuts-list.h:116 + msgid "Toggle Airplane Mode" + msgstr "切换飞行模式" + +-#: ../plugins/media-keys/shortcuts-list.h:111 ++#: plugins/media-keys/shortcuts-list.h:117 + msgid "Toggle Bluetooth" + msgstr "切换蓝牙开关" + +-#: ../plugins/power/gpm-common.c:100 ++#: plugins/power/gpm-common.c:92 + msgid "Unknown time" + msgstr "未知时间" + +-#: ../plugins/power/gpm-common.c:105 ++#: plugins/power/gpm-common.c:97 + #, c-format + msgid "%i minute" + msgid_plural "%i minutes" + msgstr[0] "%i 分钟" + +-#: ../plugins/power/gpm-common.c:115 ++#: plugins/power/gpm-common.c:107 + #, c-format + msgid "%i hour" + msgid_plural "%i hours" +@@ -1375,202 +1255,194 @@ msgstr[0] "%i 小时" + + #. TRANSLATOR: "%i %s %i %s" are "%i hours %i minutes" + #. * Swap order with "%2$s %2$i %1$s %1$i if needed +-#: ../plugins/power/gpm-common.c:121 ++#: plugins/power/gpm-common.c:113 + #, c-format + msgid "%i %s %i %s" + msgstr "%i %s %i %s" + +-#: ../plugins/power/gpm-common.c:122 ++#: plugins/power/gpm-common.c:114 + msgid "hour" + msgid_plural "hours" + msgstr[0] "小时" + +-#: ../plugins/power/gpm-common.c:123 ++#: plugins/power/gpm-common.c:115 + msgid "minute" + msgid_plural "minutes" + msgstr[0] "分钟" + + #. TRANSLATORS: this is the sound description +-#: ../plugins/power/gpm-common.c:948 ../plugins/power/gsd-power-manager.c:685 +-#: ../plugins/power/gsd-power-manager.c:782 ++#: plugins/power/gpm-common.c:438 plugins/power/gsd-power-manager.c:717 ++#: plugins/power/gsd-power-manager.c:814 + msgid "Battery is critically low" + msgstr "电池电量严重不足" + + #. TRANSLATORS: this is the notification application name +-#: ../plugins/power/gsd-power-manager.c:323 ++#: plugins/power/gsd-power-manager.c:347 + msgid "Power" + msgstr "电源" + + #. TRANSLATORS: UPS is now discharging +-#: ../plugins/power/gsd-power-manager.c:355 ++#: plugins/power/gsd-power-manager.c:387 + msgid "UPS Discharging" + msgstr "UPS 正在放电" + + #. TRANSLATORS: tell the user how much time they have got +-#: ../plugins/power/gsd-power-manager.c:360 ++#: plugins/power/gsd-power-manager.c:392 + #, c-format + msgid "%s of UPS backup power remaining" + msgstr "剩余 %s 的 UPS 备用电量" + +-#: ../plugins/power/gsd-power-manager.c:363 ++#: plugins/power/gsd-power-manager.c:395 + msgid "Unknown amount of UPS backup power remaining" + msgstr "UPS 剩余备用电量未知" + + #. TRANSLATORS: laptop battery low, and we only have one battery +-#: ../plugins/power/gsd-power-manager.c:438 ++#: plugins/power/gsd-power-manager.c:470 + msgid "Battery low" + msgstr "电池电量低" + + #. TRANSLATORS: laptop battery low, and we have more than one kind of battery +-#: ../plugins/power/gsd-power-manager.c:441 ++#: plugins/power/gsd-power-manager.c:473 + msgid "Laptop battery low" + msgstr "笔记本电池电量低" + + #. TRANSLATORS: tell the user how much time they have got +-#: ../plugins/power/gsd-power-manager.c:448 ++#: plugins/power/gsd-power-manager.c:480 + #, c-format + msgid "Approximately %s remaining (%.0f%%)" + msgstr "约剩余 %s (%.0f%%)" + + #. TRANSLATORS: UPS is starting to get a little low +-#: ../plugins/power/gsd-power-manager.c:453 ++#: plugins/power/gsd-power-manager.c:485 + msgid "UPS low" + msgstr "UPS 电量低" + + #. TRANSLATORS: tell the user how much time they have got +-#: ../plugins/power/gsd-power-manager.c:459 ++#: plugins/power/gsd-power-manager.c:491 + #, c-format + msgid "Approximately %s of remaining UPS backup power (%.0f%%)" + msgstr "UPS 备用电量约剩余 %s (%.0f%%)" + + #. TRANSLATORS: mouse is getting a little low + #. TRANSLATORS: the mouse battery is very low +-#: ../plugins/power/gsd-power-manager.c:464 +-#: ../plugins/power/gsd-power-manager.c:598 ++#: plugins/power/gsd-power-manager.c:496 plugins/power/gsd-power-manager.c:630 + msgid "Mouse battery low" + msgstr "鼠标电池电量低" + + #. TRANSLATORS: tell user more details +-#: ../plugins/power/gsd-power-manager.c:467 ++#: plugins/power/gsd-power-manager.c:499 + #, c-format + msgid "Wireless mouse is low in power (%.0f%%)" + msgstr "无线鼠标电量低(%.0f%%)" + + #. TRANSLATORS: keyboard is getting a little low + #. TRANSLATORS: the keyboard battery is very low +-#: ../plugins/power/gsd-power-manager.c:471 +-#: ../plugins/power/gsd-power-manager.c:606 ++#: plugins/power/gsd-power-manager.c:503 plugins/power/gsd-power-manager.c:638 + msgid "Keyboard battery low" + msgstr "键盘电池电量低" + + #. TRANSLATORS: tell user more details +-#: ../plugins/power/gsd-power-manager.c:474 ++#: plugins/power/gsd-power-manager.c:506 + #, c-format + msgid "Wireless keyboard is low in power (%.0f%%)" + msgstr "无线键盘电量低(%.0f%%)" + + #. TRANSLATORS: PDA is getting a little low + #. TRANSLATORS: the PDA battery is very low +-#: ../plugins/power/gsd-power-manager.c:478 +-#: ../plugins/power/gsd-power-manager.c:615 ++#: plugins/power/gsd-power-manager.c:510 plugins/power/gsd-power-manager.c:647 + msgid "PDA battery low" + msgstr "PDA 电池电量低" + + #. TRANSLATORS: tell user more details +-#: ../plugins/power/gsd-power-manager.c:481 ++#: plugins/power/gsd-power-manager.c:513 + #, c-format + msgid "PDA is low in power (%.0f%%)" + msgstr "PDA 电量低(%.0f%%)" + + #. TRANSLATORS: cell phone (mobile) is getting a little low + #. TRANSLATORS: the cell battery is very low +-#: ../plugins/power/gsd-power-manager.c:485 +-#: ../plugins/power/gsd-power-manager.c:625 +-#: ../plugins/power/gsd-power-manager.c:634 ++#: plugins/power/gsd-power-manager.c:517 plugins/power/gsd-power-manager.c:657 ++#: plugins/power/gsd-power-manager.c:666 + msgid "Cell phone battery low" + msgstr "手机电池电量低" + + #. TRANSLATORS: tell user more details +-#: ../plugins/power/gsd-power-manager.c:488 ++#: plugins/power/gsd-power-manager.c:520 + #, c-format + msgid "Cell phone is low in power (%.0f%%)" + msgstr "手机电量低(%.0f%%)" + + #. TRANSLATORS: media player, e.g. mp3 is getting a little low +-#: ../plugins/power/gsd-power-manager.c:492 ++#: plugins/power/gsd-power-manager.c:524 + msgid "Media player battery low" + msgstr "媒体播放器电池电量低" + + #. TRANSLATORS: tell user more details +-#: ../plugins/power/gsd-power-manager.c:495 ++#: plugins/power/gsd-power-manager.c:527 + #, c-format + msgid "Media player is low in power (%.0f%%)" + msgstr "媒体播放器电量低(%.0f%%)" + + #. TRANSLATORS: graphics tablet, e.g. wacom is getting a little low + #. TRANSLATORS: the cell battery is very low +-#: ../plugins/power/gsd-power-manager.c:499 +-#: ../plugins/power/gsd-power-manager.c:643 ++#: plugins/power/gsd-power-manager.c:531 plugins/power/gsd-power-manager.c:675 + msgid "Tablet battery low" + msgstr "数位板电池电量低" + + #. TRANSLATORS: tell user more details +-#: ../plugins/power/gsd-power-manager.c:502 ++#: plugins/power/gsd-power-manager.c:534 + #, c-format + msgid "Tablet is low in power (%.0f%%)" + msgstr "数位板电量低(%.0f%%)" + + #. TRANSLATORS: computer, e.g. ipad is getting a little low + #. TRANSLATORS: the cell battery is very low +-#: ../plugins/power/gsd-power-manager.c:506 +-#: ../plugins/power/gsd-power-manager.c:652 ++#: plugins/power/gsd-power-manager.c:538 plugins/power/gsd-power-manager.c:684 + msgid "Attached computer battery low" + msgstr "连接的计算机电池电量低" + + #. TRANSLATORS: tell user more details +-#: ../plugins/power/gsd-power-manager.c:509 ++#: plugins/power/gsd-power-manager.c:541 + #, c-format + msgid "Attached computer is low in power (%.0f%%)" + msgstr "连接的计算机电量低(%.0f%%)" + + #. TRANSLATORS: this is the sound description +-#: ../plugins/power/gsd-power-manager.c:530 ++#: plugins/power/gsd-power-manager.c:562 + msgid "Battery is low" + msgstr "电池电量低" + + #. TRANSLATORS: laptop battery critically low, and only have one kind of battery +-#: ../plugins/power/gsd-power-manager.c:562 ++#: plugins/power/gsd-power-manager.c:594 + msgid "Battery critically low" + msgstr "电池电量严重不足" + + #. TRANSLATORS: laptop battery critically low, and we have more than one type of battery + #. TRANSLATORS: laptop battery is really, really, low +-#: ../plugins/power/gsd-power-manager.c:565 +-#: ../plugins/power/gsd-power-manager.c:712 ++#: plugins/power/gsd-power-manager.c:597 plugins/power/gsd-power-manager.c:744 + msgid "Laptop battery critically low" + msgstr "笔记本电池电量严重不足" + + #. TRANSLATORS: give the user a ultimatum +-#: ../plugins/power/gsd-power-manager.c:574 ++#: plugins/power/gsd-power-manager.c:606 + #, c-format + msgid "Computer will hibernate very soon unless it is plugged in." + msgstr "如果不插入,计算机将很快休眠。" + + #. TRANSLATORS: give the user a ultimatum +-#: ../plugins/power/gsd-power-manager.c:578 ++#: plugins/power/gsd-power-manager.c:610 + #, c-format + msgid "Computer will shutdown very soon unless it is plugged in." + msgstr "如果不插入,计算机将很快关机。" + + #. TRANSLATORS: the UPS is very low + #. TRANSLATORS: UPS is really, really, low +-#: ../plugins/power/gsd-power-manager.c:586 +-#: ../plugins/power/gsd-power-manager.c:737 ++#: plugins/power/gsd-power-manager.c:618 plugins/power/gsd-power-manager.c:769 + msgid "UPS critically low" + msgstr "UPS 电量严重不足" + + #. TRANSLATORS: give the user a ultimatum +-#: ../plugins/power/gsd-power-manager.c:592 ++#: plugins/power/gsd-power-manager.c:624 + #, c-format + msgid "" + "Approximately %s of remaining UPS power (%.0f%%). Restore AC power to your " +@@ -1578,7 +1450,7 @@ msgid "" + msgstr "UPS 电量约剩余 %s(%.0f%%)。请恢复计算机的交流供电,以免丢失数据。" + + #. TRANSLATORS: the device is just going to stop working +-#: ../plugins/power/gsd-power-manager.c:601 ++#: plugins/power/gsd-power-manager.c:633 + #, c-format + msgid "" + "Wireless mouse is very low in power (%.0f%%). This device will soon stop " +@@ -1586,7 +1458,7 @@ msgid "" + msgstr "无线鼠标电量非常低(%.0f%%)。如果不充电,此设备将很快停止工作。" + + #. TRANSLATORS: the device is just going to stop working +-#: ../plugins/power/gsd-power-manager.c:609 ++#: plugins/power/gsd-power-manager.c:641 + #, c-format + msgid "" + "Wireless keyboard is very low in power (%.0f%%). This device will soon stop " +@@ -1594,7 +1466,7 @@ msgid "" + msgstr "无线键盘电量非常低(%.0f%%)。如果不充电,此设备将很快停止工作。" + + #. TRANSLATORS: the device is just going to stop working +-#: ../plugins/power/gsd-power-manager.c:618 ++#: plugins/power/gsd-power-manager.c:650 + #, c-format + msgid "" + "PDA is very low in power (%.0f%%). This device will soon stop functioning if " +@@ -1602,7 +1474,7 @@ msgid "" + msgstr "PDA 电量非常低(%.0f%%)。如果不充电,此设备将很快停止工作。" + + #. TRANSLATORS: the device is just going to stop working +-#: ../plugins/power/gsd-power-manager.c:628 ++#: plugins/power/gsd-power-manager.c:660 + #, c-format + msgid "" + "Cell phone is very low in power (%.0f%%). This device will soon stop " +@@ -1610,7 +1482,7 @@ msgid "" + msgstr "手机电量非常低(%.0f%%)。如果不充电,此设备将很快停止工作。" + + #. TRANSLATORS: the device is just going to stop working +-#: ../plugins/power/gsd-power-manager.c:637 ++#: plugins/power/gsd-power-manager.c:669 + #, c-format + msgid "" + "Media player is very low in power (%.0f%%). This device will soon stop " +@@ -1618,7 +1490,7 @@ msgid "" + msgstr "媒体播放器电量非常低(%.0f%%)。如果不充电,此设备将很快停止工作。" + + #. TRANSLATORS: the device is just going to stop working +-#: ../plugins/power/gsd-power-manager.c:646 ++#: plugins/power/gsd-power-manager.c:678 + #, c-format + msgid "" + "Tablet is very low in power (%.0f%%). This device will soon stop functioning " +@@ -1626,7 +1498,7 @@ msgid "" + msgstr "数位板电量非常低(%.0f%%)。如果不充电,此设备将很快停止工作。" + + #. TRANSLATORS: the device is just going to stop working +-#: ../plugins/power/gsd-power-manager.c:655 ++#: plugins/power/gsd-power-manager.c:687 + #, c-format + msgid "" + "Attached computer is very low in power (%.0f%%). The device will soon " +@@ -1634,351 +1506,470 @@ msgid "" + msgstr "连接的计算机电量非常低(%.0f%%)。如果不充电,此设备将很快停止工作。" + + #. TRANSLATORS: computer will hibernate +-#: ../plugins/power/gsd-power-manager.c:720 ++#: plugins/power/gsd-power-manager.c:752 + msgid "" + "The battery is below the critical level and this computer is about to " + "hibernate." + msgstr "电池电量水平已经超过了严重的界限,此计算机即将休眠。" + + #. TRANSLATORS: computer will just shutdown +-#: ../plugins/power/gsd-power-manager.c:725 ++#: plugins/power/gsd-power-manager.c:757 + msgid "" + "The battery is below the critical level and this computer is about to " + "shutdown." + msgstr "电池电量水平已经超过了严重的界限,此计算机即将关机。" + + #. TRANSLATORS: computer will hibernate +-#: ../plugins/power/gsd-power-manager.c:745 ++#: plugins/power/gsd-power-manager.c:777 + msgid "" + "UPS is below the critical level and this computer is about to hibernate." + msgstr "UPS 电量水平已经超过了严重的界限,此计算机即将休眠。" + + #. TRANSLATORS: computer will just shutdown +-#: ../plugins/power/gsd-power-manager.c:750 ++#: plugins/power/gsd-power-manager.c:782 + msgid "UPS is below the critical level and this computer is about to shutdown." + msgstr "UPS 电量水平已经超过了严重的界限,此计算机即将关机。" + + #. TRANSLATORS: this is the sound description +-#: ../plugins/power/gsd-power-manager.c:1251 ++#: plugins/power/gsd-power-manager.c:1260 + msgid "Lid has been opened" + msgstr "盖子已打开" + + #. TRANSLATORS: this is the sound description +-#: ../plugins/power/gsd-power-manager.c:1289 ++#: plugins/power/gsd-power-manager.c:1294 + msgid "Lid has been closed" + msgstr "盖子已合上" + + #. TRANSLATORS: this is the sound description +-#: ../plugins/power/gsd-power-manager.c:1882 ++#: plugins/power/gsd-power-manager.c:1856 + msgid "On battery power" + msgstr "电池供电" + + #. TRANSLATORS: this is the sound description +-#: ../plugins/power/gsd-power-manager.c:1887 ++#: plugins/power/gsd-power-manager.c:1861 + msgid "On AC power" + msgstr "电源供电" + +-#: ../plugins/power/gsd-power-manager.c:2079 ++#: plugins/power/gsd-power-manager.c:2051 + msgid "Automatic logout" + msgstr "自动注销" + +-#: ../plugins/power/gsd-power-manager.c:2079 ++#: plugins/power/gsd-power-manager.c:2051 + msgid "You will soon log out because of inactivity." + msgstr "因为长时间未活动,您即将被注销。" + +-#: ../plugins/power/gsd-power-manager.c:2084 ++#: plugins/power/gsd-power-manager.c:2056 + msgid "Automatic suspend" + msgstr "自动挂起" + +-#: ../plugins/power/gsd-power-manager.c:2084 +-#: ../plugins/power/gsd-power-manager.c:2089 ++#: plugins/power/gsd-power-manager.c:2056 ++#: plugins/power/gsd-power-manager.c:2061 + msgid "Computer will suspend very soon because of inactivity." + msgstr "由于长时间未活动,计算机将很快挂起。" + +-#: ../plugins/power/gsd-power-manager.c:2089 ++#: plugins/power/gsd-power-manager.c:2061 + msgid "Automatic hibernation" + msgstr "自动休眠" + + #. SECURITY: + #. - A normal active user on the local machine does not need permission + #. to change the backlight brightness. +-#. +-#: ../plugins/power/org.gnome.settings-daemon.plugins.power.policy.in.in.h:5 ++#: plugins/power/org.gnome.settings-daemon.plugins.power.policy.in.in:21 + msgid "Modify the laptop brightness" + msgstr "更改笔记本亮度" + +-#: ../plugins/power/org.gnome.settings-daemon.plugins.power.policy.in.in.h:6 ++#: plugins/power/org.gnome.settings-daemon.plugins.power.policy.in.in:22 + msgid "Authentication is required to modify the laptop brightness" + msgstr "更改笔记本亮度需要认证" + + #. Translators: We are configuring new printer +-#: ../plugins/print-notifications/gsd-printer.c:890 ++#: plugins/print-notifications/gsd-printer.c:890 + msgid "Configuring new printer" + msgstr "配置新的打印机" + + #. Translators: Just wait +-#: ../plugins/print-notifications/gsd-printer.c:892 ++#: plugins/print-notifications/gsd-printer.c:892 + msgid "Please wait…" + msgstr "请稍候…" + + #. Translators: We have no driver installed for this printer +-#: ../plugins/print-notifications/gsd-printer.c:919 ++#: plugins/print-notifications/gsd-printer.c:919 + msgid "Missing printer driver" + msgstr "未找到打印机驱动" + + #. Translators: We have no driver installed for the device +-#: ../plugins/print-notifications/gsd-printer.c:928 ++#: plugins/print-notifications/gsd-printer.c:928 + #, c-format + msgid "No printer driver for %s." + msgstr "找不到 %s 的打印驱动。" + + #. Translators: We have no driver installed for this printer +-#: ../plugins/print-notifications/gsd-printer.c:933 ++#: plugins/print-notifications/gsd-printer.c:933 + msgid "No driver for this printer." + msgstr "找不到打印机的驱动。" + +-#: ../plugins/print-notifications/gsd-printer.c:1031 +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:270 +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:748 +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:838 +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:881 ++#: plugins/print-notifications/gsd-printer.c:1031 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:290 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:538 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:920 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:1011 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:1055 + msgid "Printers" + msgstr "打印机" + + #. Translators: The printer is low on toner (same as in system-config-printer) +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:346 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:374 + #, c-format + msgid "Printer “%s” is low on toner." + msgstr "打印机“%s”的墨粉已不多。" + + #. Translators: The printer has no toner left (same as in system-config-printer) +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:350 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:378 + #, c-format + msgid "Printer “%s” has no toner left." + msgstr "打印机“%s”已经无墨粉。" + + #. Translators: The printer is in the process of connecting to a shared network output device (same as in system-config-printer) +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:354 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:382 + #, c-format + msgid "Printer “%s” may not be connected." + msgstr "打印机“%s”可能没有连接。" + + #. Translators: One or more covers on the printer are open (same as in system-config-printer) +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:358 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:386 + #, c-format + msgid "The cover is open on printer “%s”." + msgstr "打印机“%s”的机盖处于打开状态。" + + #. Translators: A filter or backend is not installed (same as in system-config-printer) +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:362 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:390 + #, c-format + msgid "There is a missing print filter for printer “%s”." + msgstr "打印机“%s”的打印过滤功能缺失。" + + #. Translators: One or more doors on the printer are open (same as in system-config-printer) +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:367 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:395 + #, c-format + msgid "The door is open on printer “%s”." + msgstr "打印机“%s”的机盖处于打开状态。" + + #. Translators: "marker" is one color bin of the printer +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:371 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:399 + #, c-format + msgid "Printer “%s” is low on a marker supply." + msgstr "打印机“%s”的标记墨量少。" + + #. Translators: "marker" is one color bin of the printer +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:375 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:403 + #, c-format + msgid "Printer “%s” is out of a marker supply." + msgstr "打印机“%s”标记墨已用完。" + + #. Translators: At least one input tray is low on media (same as in system-config-printer) +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:379 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:407 + #, c-format + msgid "Printer “%s” is low on paper." + msgstr "打印机“%s”的纸张量少。" + + #. Translators: At least one input tray is empty (same as in system-config-printer) +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:383 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:411 + #, c-format + msgid "Printer “%s” is out of paper." + msgstr "打印机“%s”缺纸。" + + #. Translators: The printer is offline (same as in system-config-printer) +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:387 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:415 + #, c-format + msgid "Printer “%s” is currently off-line." + msgstr "打印机“%s”当前离线。" + + #. Translators: The printer has detected an error (same as in system-config-printer) +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:391 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:419 + #, c-format + msgid "There is a problem on printer “%s”." + msgstr "打印机“%s”上有错误。" + ++#. Translators: The printer has a job to print but the printer needs authentication to continue with the print ++#: plugins/print-notifications/gsd-print-notifications-manager.c:531 ++#, c-format ++msgid "%s Requires Authentication" ++msgstr "%s 需要认证" ++ ++#. Translators: A printer needs credentials to continue printing a job ++#: plugins/print-notifications/gsd-print-notifications-manager.c:533 ++#, c-format ++msgid "Credentials required in order to print" ++msgstr "打印所需的凭证" ++ + #. Translators: The printer is low on toner (same as in system-config-printer) +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:439 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:600 + msgid "Toner low" + msgstr "墨已不多" + + #. Translators: The printer has no toner left (same as in system-config-printer) +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:441 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:602 + msgid "Toner empty" + msgstr "缺墨" + + #. Translators: The printer is in the process of connecting to a shared network output device (same as in system-config-printer) +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:443 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:604 + msgid "Not connected?" + msgstr "没有连接?" + + #. Translators: One or more covers on the printer are open (same as in system-config-printer) +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:445 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:606 + msgid "Cover open" + msgstr "有机盖打开" + + #. Translators: A filter or backend is not installed (same as in system-config-printer) +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:447 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:608 + msgid "Printer configuration error" + msgstr "打印机配置错误" + + #. Translators: One or more doors on the printer are open (same as in system-config-printer) +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:449 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:610 + msgid "Door open" + msgstr "仓门打开" + + #. Translators: "marker" is one color bin of the printer +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:451 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:612 + msgid "Marker supply low" + msgstr "标记墨量低" + + #. Translators: "marker" is one color bin of the printer +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:453 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:614 + msgid "Out of a marker supply" + msgstr "标记墨已用完" + + #. Translators: At least one input tray is low on media (same as in system-config-printer) +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:455 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:616 + msgid "Paper low" + msgstr "纸张量少" + + #. Translators: At least one input tray is empty (same as in system-config-printer) +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:457 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:618 + msgid "Out of paper" + msgstr "缺纸" + + #. Translators: The printer is offline (same as in system-config-printer) +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:459 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:620 + msgid "Printer off-line" + msgstr "没有连接打印机" + + #. Translators: The printer has detected an error (same as in system-config-printer) + #. Translators: This is a title of an error notification for a printer +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:461 +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:824 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:622 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:997 + msgid "Printer error" + msgstr "打印机错误" + + #. Translators: New printer has been added +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:509 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:670 + msgid "Printer added" + msgstr "打印机已添加" + + #. Translators: A print job has been stopped +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:526 +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:564 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:687 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:725 + msgctxt "print job state" + msgid "Printing stopped" + msgstr "打印已暂停" + + #. Translators: "print-job xy" on a printer +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:528 +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:534 +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:540 +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:546 +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:558 +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:566 +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:574 +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:582 +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:590 +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:603 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:689 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:695 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:701 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:707 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:719 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:727 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:735 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:743 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:751 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:775 + #, c-format + msgctxt "print job" + msgid "“%s” on %s" + msgstr "%2$s 上的“%1$s”" + + #. Translators: A print job has been canceled +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:532 +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:572 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:693 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:733 + msgctxt "print job state" + msgid "Printing canceled" + msgstr "打印已取消" + + #. Translators: A print job has been aborted +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:538 +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:580 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:699 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:741 + msgctxt "print job state" + msgid "Printing aborted" + msgstr "打印中止" + + #. Translators: A print job has been completed +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:544 +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:588 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:705 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:749 + msgctxt "print job state" + msgid "Printing completed" + msgstr "打印完成" + + #. Translators: A job is printing +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:556 +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:601 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:717 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:773 + msgctxt "print job state" + msgid "Printing" + msgstr "正在打印" + + #. Translators: This is a title of a report notification for a printer +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:818 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:991 + msgid "Printer report" + msgstr "打印机报告" + + #. Translators: This is a title of a warning notification for a printer +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:821 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:994 + msgid "Printer warning" + msgstr "打印机警告" + + #. Translators: "Printer 'MyPrinterName': 'Description of the report/warning/error from a PPD file'." +-#: ../plugins/print-notifications/gsd-print-notifications-manager.c:831 ++#: plugins/print-notifications/gsd-print-notifications-manager.c:1004 + #, c-format + msgid "Printer “%s”: “%s”." + msgstr "打印机“%s”:“%s”。" + +-#: ../plugins/smartcard/gsd-smartcard-service.c:224 ++#: plugins/smartcard/gsd-smartcard-service.c:288 + msgid "User was not logged in with smartcard." + msgstr "用户未使用智能卡登录。" + ++#: plugins/subman/gsd-subscription-manager.c:1044 ++msgid "Subscription Has Expired" ++msgstr "订阅已过期。" ++ ++#: plugins/subman/gsd-subscription-manager.c:1045 ++msgid "Add or renew a subscription to continue receiving software updates." ++msgstr "添加或更新订阅以继续接收软件更新。" ++ ++#: plugins/subman/gsd-subscription-manager.c:1047 ++#: plugins/subman/gsd-subscription-manager.c:1063 ++#: plugins/subman/gsd-subscription-manager.c:1075 ++msgid "Subscription" ++msgstr "订阅" ++ ++#: plugins/subman/gsd-subscription-manager.c:1052 ++msgid "Subscribe System…" ++msgstr "订阅系统......" ++ ++#: plugins/subman/gsd-subscription-manager.c:1060 ++msgid "Registration Successful" ++msgstr "注册成功" ++ ++#: plugins/subman/gsd-subscription-manager.c:1061 ++msgid "The system has been registered and software updates have been enabled." ++msgstr "系统已注册,软件更新已启用。" ++ ++#: plugins/subman/gsd-subscription-manager.c:1072 ++msgid "System Not Registered" ++msgstr "系统未注册" ++ ++#: plugins/subman/gsd-subscription-manager.c:1073 ++msgid "Please register your system to receive software updates." ++msgstr "请注册您的系统以接收软件更新。" ++ ++#: plugins/subman/gsd-subscription-manager.c:1080 ++msgid "Register System…" ++msgstr "注册系统......" ++ ++#: plugins/subman/org.gnome.settings-daemon.plugins.subman.policy.in.in:17 ++msgid "Register the system" ++msgstr "注册系统" ++ ++#: plugins/subman/org.gnome.settings-daemon.plugins.subman.policy.in.in:18 ++msgid "Authentication is required to register the system" ++msgstr "注册系统需要认证" ++ + #. SECURITY: + #. - A normal active user on the local machine does not need permission + #. to change the LED setting for a Wacom tablet +-#. +-#: ../plugins/wacom/org.gnome.settings-daemon.plugins.wacom.policy.in.in.h:5 ++#: plugins/wacom/org.gnome.settings-daemon.plugins.wacom.policy.in.in:20 + msgid "Modify the lit LED for a Wacom tablet" + msgstr "修改 Wacom 数位板的 lit LED" + +-#: ../plugins/wacom/org.gnome.settings-daemon.plugins.wacom.policy.in.in.h:6 ++#: plugins/wacom/org.gnome.settings-daemon.plugins.wacom.policy.in.in:21 + msgid "Authentication is required to modify the lit LED for a Wacom tablet" + msgstr "修改 Wacom 数位板的 lit LED 需要认证" + + #. SECURITY: + #. - A normal active user on the local machine does not need permission + #. to change the OLED images for a Wacom tablet +-#. +-#: ../plugins/wacom/org.gnome.settings-daemon.plugins.wacom.policy.in.in.h:11 ++#: plugins/wacom/org.gnome.settings-daemon.plugins.wacom.policy.in.in:35 + msgid "Modify the OLED image for a Wacom tablet" + msgstr "修改 Wacom 数位板的 OLED 图像" + +-#: ../plugins/wacom/org.gnome.settings-daemon.plugins.wacom.policy.in.in.h:12 ++#: plugins/wacom/org.gnome.settings-daemon.plugins.wacom.policy.in.in:36 + msgid "Authentication is required to modify the OLED image for a Wacom tablet" + msgstr "修改 Wacom 数位板的 OLED 图像需要认证" + ++#~ msgid "Slow Keys Turned On" ++#~ msgstr "迟缓按键已打开" ++ ++#~ msgid "Slow Keys Turned Off" ++#~ msgstr "迟缓按键已关闭" ++ ++#~ msgid "" ++#~ "You just held down the Shift key for 8 seconds. This is the shortcut for " ++#~ "the Slow Keys feature, which affects the way your keyboard works." ++#~ msgstr "" ++#~ "您已经按下了 Shift 键 8 秒。这是迟缓按键功能的快捷键,这将影响您键盘工作的" ++#~ "方式。" ++ ++#~ msgid "Universal Access" ++#~ msgstr "通用访问" ++ ++#~ msgid "Turn Off" ++#~ msgstr "关闭" ++ ++#~ msgid "Turn On" ++#~ msgstr "打开" ++ ++#~ msgid "Leave On" ++#~ msgstr "保持打开" ++ ++#~ msgid "Leave Off" ++#~ msgstr "保持关闭" ++ ++#~ msgid "Sticky Keys Turned On" ++#~ msgstr "粘滞键已打开" ++ ++#~ msgid "Sticky Keys Turned Off" ++#~ msgstr "粘滞键已关闭" ++ ++#~ msgid "" ++#~ "You just pressed the Shift key 5 times in a row. This is the shortcut " ++#~ "for the Sticky Keys feature, which affects the way your keyboard works." ++#~ msgstr "" ++#~ "您刚刚连续按了五次 Shift 键。这是粘滞键特性的快捷键,这将影响您键盘的工作" ++#~ "方式。" ++ ++#~ msgid "" ++#~ "You just pressed two keys at once, or pressed the Shift key 5 times in a " ++#~ "row. This turns off the Sticky Keys feature, which affects the way your " ++#~ "keyboard works." ++#~ msgstr "" ++#~ "您刚刚同时按下了两个键,或连续按了五次 Shift 键。这是取消粘滞键特性的快捷" ++#~ "键,这将影响您键盘的工作方式。" ++ ++#~ msgid "Disabled" ++#~ msgstr "禁用" ++ ++#~ msgid "%u Output" ++#~ msgid_plural "%u Outputs" ++#~ msgstr[0] "%u 输出" ++ ++#~ msgid "%u Input" ++#~ msgid_plural "%u Inputs" ++#~ msgstr[0] "%u 输入" ++ ++#~ msgid "System Sounds" ++#~ msgstr "系统声音" ++ + #~ msgid "File for default configuration for RandR" + #~ msgstr "RandR 默认配置文件" + +@@ -3040,7 +3031,6 @@ msgstr "修改 Wacom 数位板的 OLED 图像需要认证" + #~ msgid "encountered unexpected error while waiting for smartcard events" + #~ msgstr "等待智能卡事件时遇到意外错误" + +-#, fuzzy + #~ msgid "Configure device" + #~ msgstr "忽略设备" + +@@ -3082,7 +3072,6 @@ msgstr "修改 Wacom 数位板的 OLED 图像需要认证" + #~ msgid "Binding to select the next input source" + #~ msgstr "选择下一输入源的键绑定。" + +-#, fuzzy + #~ msgid "Switch input source backward" + #~ msgstr "切换输入源" + +@@ -3098,11 +3087,9 @@ msgstr "修改 Wacom 数位板的 OLED 图像需要认证" + #~ msgid "_Turn On" + #~ msgstr "打开(_T)" + +-#, fuzzy + #~ msgid "_Leave On" + #~ msgstr "保持打开(_L)" + +-#, fuzzy + #~ msgid "_Leave Off" + #~ msgstr "保持关闭(_L)" + +@@ -3917,7 +3904,6 @@ msgstr "修改 Wacom 数位板的 OLED 图像需要认证" + #~ msgid "GConf key %s set to type %s but its expected type was %s\n" + #~ msgstr "GConf 键 %s 被设为 %s 类型,但是期望的类型是 %s\n" + +-#, fuzzy + #~ msgid "Keyboard Layout \"%s\"" + #~ msgstr "键盘布局" + +@@ -3928,9 +3914,6 @@ msgstr "修改 Wacom 数位板的 OLED 图像需要认证" + #~ "无法将机器转入休眠。\n" + #~ "请检查机器是否已正确配置。" + +-#~ msgid "Binding to suspend the computer." +-#~ msgstr "挂起计算机的键绑定。" +- + #~ msgid "GNOME Volume Control" + #~ msgstr "GNOME 音量控制" + +@@ -3967,5 +3950,3 @@ msgstr "修改 Wacom 数位板的 OLED 图像需要认证" + #~ "\n" + #~ "此对话中将无法使用屏幕保护功能。" + +-#~ msgid "Screensaver plugin" +-#~ msgstr "屏保插件" +-- +2.31.1 + diff --git a/EMPTY b/EMPTY deleted file mode 100644 index 0519ecb..0000000 --- a/EMPTY +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/gnome-settings-daemon.spec b/gnome-settings-daemon.spec new file mode 100644 index 0000000..32a008b --- /dev/null +++ b/gnome-settings-daemon.spec @@ -0,0 +1,1474 @@ +%global glib2_version 2.56 +%global geocode_glib_version 3.10.0 +%global gnome_desktop_version 3.27.90 +%global gsettings_desktop_schemas_version 3.32.0-4 +%global gtk3_version 3.15.3 +%global libgweather_version 3.9.5 +%global geoclue_version 2.3.1 + +%if %{undefined centos} +%bcond_without subman +%endif + +Name: gnome-settings-daemon +Version: 3.32.0 +Release: 16%{?dist} +Summary: The daemon sharing settings from GNOME to GTK+/KDE applications + +License: GPLv2+ +URL: https://download.gnome.org/sources/%{name} +Source0: https://download.gnome.org/sources/%{name}/3.32/%{name}-%{version}.tar.xz +Source1: org.gnome.settings-daemon.plugins.power.gschema.override + +BuildRequires: meson >= 0.44.0 +BuildRequires: gcc +BuildRequires: cups-devel +BuildRequires: gettext +BuildRequires: perl-interpreter +BuildRequires: git +BuildRequires: pkgconfig(alsa) +BuildRequires: pkgconfig(colord) >= 1.0.2 +BuildRequires: pkgconfig(fontconfig) +BuildRequires: pkgconfig(geoclue-2.0) >= %{geoclue_version} +BuildRequires: pkgconfig(geocode-glib-1.0) >= %{geocode_glib_version} +BuildRequires: pkgconfig(glib-2.0) >= %{glib2_version} +BuildRequires: pkgconfig(gnome-desktop-3.0) >= %{gnome_desktop_version} +BuildRequires: pkgconfig(gsettings-desktop-schemas) >= %{gsettings_desktop_schemas_version} +BuildRequires: pkgconfig(gtk+-3.0) >= %{gtk3_version} +BuildRequires: pkgconfig(gudev-1.0) +BuildRequires: pkgconfig(gweather-3.0) >= %{libgweather_version} +%if %{with subman} +BuildRequires: pkgconfig(json-glib-1.0) +%endif +BuildRequires: pkgconfig(lcms2) >= 2.2 +BuildRequires: pkgconfig(libcanberra-gtk3) +BuildRequires: pkgconfig(libgeoclue-2.0) +BuildRequires: pkgconfig(libnm) +BuildRequires: pkgconfig(libnotify) +BuildRequires: pkgconfig(libpulse) +BuildRequires: pkgconfig(libpulse-mainloop-glib) +BuildRequires: pkgconfig(librsvg-2.0) +BuildRequires: pkgconfig(nss) +BuildRequires: pkgconfig(polkit-gobject-1) +BuildRequires: pkgconfig(upower-glib) +BuildRequires: pkgconfig(x11) +BuildRequires: pkgconfig(xi) +BuildRequires: pkgconfig(wayland-client) +%ifnarch s390 s390x +BuildRequires: pkgconfig(libwacom) >= 0.7 +BuildRequires: pkgconfig(xorg-wacom) +%endif + +Requires: colord +Requires: iio-sensor-proxy +Requires: geoclue2 >= %{geoclue_version} +Requires: geocode-glib%{?_isa} >= %{geocode_glib_version} +Requires: glib2%{?_isa} >= %{glib2_version} +Requires: gnome-desktop3%{?_isa} >= %{gnome_desktop_version} +Requires: gsettings-desktop-schemas%{?_isa} >= %{gsettings_desktop_schemas_version} +Requires: gtk3%{?_isa} >= %{gtk3_version} +Requires: libgweather%{?_isa} >= %{libgweather_version} + +Obsoletes: %{name}-updates < 3.13.1 +Obsoletes: drwright < 3.5.0-3 +Obsoletes: gnome-settings-daemon-devel < 3.23.1 + +# The "org.gnome.SettingsDaemon.A11yKeyboard" has been been removed, now +# handled in gnome-shell/mutter instead; this conflict here makes sure not to +# break older gdm and gnome-session releases that expect the functionality +Conflicts: gdm < 1:3.27.90 +Conflicts: gnome-session < 3.27.90 +# The orientation and xrandr plugins were removed in 3.25.4 and their +# functionality was moved to mutter; this conflict here makes sure not to break +# older gdm, gnome-session and gnome-shell releases that expect the functionality +Conflicts: gnome-shell < 3.25.4 + +# account plugin +Patch00001: 0001-account-first-cut-at-account-plugin.patch +Patch00002: 0002-account-reshow-the-notification-when-screen-unlocks.patch +Patch00003: 0003-account-display-nag-screen-periodically.patch +Patch00004: 0004-account-don-t-poll-more-frequently-than-notification.patch + +Patch10001: 0001-smartcard-Cancel-cancellable-when-stopping.patch + +Patch20001: 0001-xsettings-Add-an-entry-for-the-overlay-scrolling-set.patch + +# Handle org.gnome.Shell.Screencast Stopped signal (#1705392) +Patch30001: 0001-media-keys-Mark-screen-cast-as-stopped-if-it-was-sig.patch + +Patch40001: 0001-housekeeping-Add-a-GPU-memory-usage-notification.patch + +# subscription manager integration +Patch50001: 0001-subman-Add-a-new-plugin-to-provide-system-subscripti.patch +Patch50002: 0002-subman-Add-InstalledProducts-dbus-property-for-g-c-c.patch +Patch50003: 0003-subman-Increase-RHSM-dbus-call-timeouts.patch +Patch50004: 0004-subman-Drop-userlang-field.patch +Patch50005: 0005-subman-Use-user-locale-for-registration-subscription.patch +Patch50006: 0006-subman-Handle-subscription-manager-giving-invalid-st.patch +Patch50007: 0007-subman-Force-re-subscribe-if-the-admin-already-subsc.patch +Patch50008: 0008-subman-Don-t-send-secrets-through-command-line.patch +Patch50009: 0009-subman-Don-t-treat-failure-to-attach-as-fatal.patch +Patch50010: 0010-subman-Add-new-no-installed-products-state.patch +Patch50011: 0011-subman-Fix-some-build-warnings.patch +Patch50012: 0012-subman-Add-DBus-API-to-subscribe-for-updates-on-alre.patch +Patch50013: 0013-subman-Improve-subscription-status-handling.patch +Patch50014: 0014-subman-Drop-LAST-from-status-enum.patch +Patch50015: 0015-subman-Clean-up-notification-behavior.patch +Patch50016: 0016-subman-Update-POTFILES.in.patch +# https://bugzilla.redhat.com/show_bug.cgi?id=1876291 +Patch50017: 0017-Update-translations.patch + +Patch60001: 0001-power-Only-disable-Suspend-Hibernate-actions-inside-.patch + +%description +A daemon to share settings from GNOME to other applications. It also +handles global keybindings, as well as a number of desktop-wide settings. + +%package devel +Summary: Development files for %{name} +Requires: %{name}%{?_isa} = %{version}-%{release} + +%description devel +The %{name}-devel package contains libraries and header files for +developing applications that use %{name}. + +%prep +%autosetup -S git + +%build +%meson +%meson_build + +%install +%meson_install + +cp %{SOURCE1} $RPM_BUILD_ROOT%{_datadir}/glib-2.0/schemas + +%find_lang %{name} --with-gnome + +mkdir $RPM_BUILD_ROOT%{_libdir}/gnome-settings-daemon-3.0/gtk-modules + +%files -f %{name}.lang +%license COPYING +%doc AUTHORS NEWS + +# list daemons explicitly, so we notice if one goes missing +# some of these don't have a separate gschema +%{_libexecdir}/gsd-account +%{_sysconfdir}/xdg/autostart/org.gnome.SettingsDaemon.Account.desktop +%{_datadir}/glib-2.0/schemas/org.gnome.settings-daemon.plugins.account.gschema.xml + +%{_libexecdir}/gsd-clipboard +%{_sysconfdir}/xdg/autostart/org.gnome.SettingsDaemon.Clipboard.desktop + +%{_libexecdir}/gsd-datetime +%{_sysconfdir}/xdg/autostart/org.gnome.SettingsDaemon.Datetime.desktop + +%{_libexecdir}/gsd-dummy + +%{_libexecdir}/gsd-housekeeping +%{_sysconfdir}/xdg/autostart/org.gnome.SettingsDaemon.Housekeeping.desktop +%{_datadir}/glib-2.0/schemas/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml + +%{_libexecdir}/gsd-keyboard +%{_sysconfdir}/xdg/autostart/org.gnome.SettingsDaemon.Keyboard.desktop + +%{_libexecdir}/gsd-media-keys +%{_sysconfdir}/xdg/autostart/org.gnome.SettingsDaemon.MediaKeys.desktop +%{_datadir}/glib-2.0/schemas/org.gnome.settings-daemon.plugins.media-keys.gschema.xml + +%{_libexecdir}/gsd-mouse +%{_sysconfdir}/xdg/autostart/org.gnome.SettingsDaemon.Mouse.desktop +%{_libexecdir}/gsd-locate-pointer + +%{_libexecdir}/gsd-backlight-helper +%{_datadir}/polkit-1/actions/org.gnome.settings-daemon.plugins.power.policy +%{_libexecdir}/gsd-power +%{_sysconfdir}/xdg/autostart/org.gnome.SettingsDaemon.Power.desktop +%{_datadir}/glib-2.0/schemas/org.gnome.settings-daemon.plugins.power.gschema.xml +%{_datadir}/glib-2.0/schemas/org.gnome.settings-daemon.plugins.power.gschema.override + +%{_libexecdir}/gsd-print-notifications +%{_sysconfdir}/xdg/autostart/org.gnome.SettingsDaemon.PrintNotifications.desktop +%{_libexecdir}/gsd-printer + +%{_libexecdir}/gsd-rfkill +%{_sysconfdir}/xdg/autostart/org.gnome.SettingsDaemon.Rfkill.desktop + +%{_libexecdir}/gsd-screensaver-proxy +%{_sysconfdir}/xdg/autostart/org.gnome.SettingsDaemon.ScreensaverProxy.desktop + +%{_libexecdir}/gsd-smartcard +%{_sysconfdir}/xdg/autostart/org.gnome.SettingsDaemon.Smartcard.desktop + +%{_libexecdir}/gsd-sound +%{_sysconfdir}/xdg/autostart/org.gnome.SettingsDaemon.Sound.desktop + +%{_datadir}/glib-2.0/schemas/org.gnome.settings-daemon.peripherals.gschema.xml +%{_datadir}/glib-2.0/schemas/org.gnome.settings-daemon.peripherals.wacom.gschema.xml +%{_sysconfdir}/xdg/autostart/org.gnome.SettingsDaemon.Wacom.desktop + +%ifnarch s390 s390x +%{_libexecdir}/gsd-wacom +%{_libexecdir}/gsd-wacom-led-helper +%{_libexecdir}/gsd-wacom-oled-helper +%{_datadir}/polkit-1/actions/org.gnome.settings-daemon.plugins.wacom.policy +%endif + +%{_libexecdir}/gsd-xsettings +%{_sysconfdir}/xdg/autostart/org.gnome.SettingsDaemon.XSettings.desktop +%{_datadir}/glib-2.0/schemas/org.gnome.settings-daemon.plugins.xsettings.gschema.xml + +%{_libexecdir}/gsd-a11y-settings +%{_sysconfdir}/xdg/autostart/org.gnome.SettingsDaemon.A11ySettings.desktop + +%{_libexecdir}/gsd-color +%{_sysconfdir}/xdg/autostart/org.gnome.SettingsDaemon.Color.desktop +%{_datadir}/glib-2.0/schemas/org.gnome.settings-daemon.plugins.color.gschema.xml + +%{_libexecdir}/gsd-sharing +%{_sysconfdir}/xdg/autostart/org.gnome.SettingsDaemon.Sharing.desktop +%{_datadir}/glib-2.0/schemas/org.gnome.settings-daemon.plugins.sharing.gschema.xml + +%{_sysconfdir}/xdg/autostart/org.gnome.SettingsDaemon.Subscription.desktop +%{_libexecdir}/gsd-subman +%{_libexecdir}/gsd-subman-helper +%{_datadir}/polkit-1/actions/org.gnome.settings-daemon.plugins.subman.policy +%{_datadir}/polkit-1/rules.d/org.gnome.settings-daemon.plugins.subman.rules + +%{_libdir}/gnome-settings-daemon-3.0/libgsd.so + +/usr/lib/udev/rules.d/*.rules +%{_datadir}/gnome-settings-daemon/ +%{_datadir}/GConf/gsettings/gnome-settings-daemon.convert + +%{_datadir}/glib-2.0/schemas/org.gnome.settings-daemon.enums.xml +%{_datadir}/glib-2.0/schemas/org.gnome.settings-daemon.plugins.gschema.xml + +%files devel +%{_includedir}/gnome-settings-daemon-3.0 +%{_libdir}/pkgconfig/gnome-settings-daemon.pc + +%changelog +* Fri Sep 10 2021 Kalev Lember - 3.32.0-16 +- Update pt_BR translations +- Resolves: #1978612 + +* Fri Aug 06 2021 Carlos Garnacho - 3.32.0-15 +- Keep auto-logout working inside VMs + Resolves: #1904139 + +* Mon Mar 01 2021 Kalev Lember - 3.32.0-14 +- Update fr, ja, zh_CN translations +- Resolves: #1876291 + +* Thu Jan 21 2021 Ray Strode - 3.32.0-13 +- Add back subscription-manager plugin + Related: #1870837 + +* Tue Jan 05 2021 Jonas Ådahl - 3.32.0-12 +- Handle org.gnome.Shell.Screencast Stopped signal + Related: #1705392 + +* Wed Sep 02 2020 Ray Strode - 3.32.0-11 +- Remove subman plugin for now + Resolves: #1872457 + +* Thu Aug 13 2020 Carl George - 3.32.0-10 +- Disable subman plugin on CentOS + Resolves: #1827030 + +* Fri Nov 22 2019 Benjamin Otte - 3.32.0-9 +- Update gsettings-deskto-schemas dependency for new setting + Resolves: #1775683, #1723462 + +* Thu Nov 21 2019 Benjamin Otte - 3.32.0-8 +- Add upstream setting for overlay scrolling + Resolves: #1723462 + +* Mon Nov 18 2019 Kalev Lember - 3.32.0-7 +- Add a new plugin to provide system subscription information +- Resolves: #1720249 + +* Mon Nov 04 2019 Marek Kasik - 3.32.0-6 +- Initialize a variable from previous commit. +- Previous commit made it possible to use uninitialized variable. +- Detected by Coverity. +- Related: #1742710 + +* Mon Nov 04 2019 Marek Kasik - 3.32.0-5 +- Cancel cancellable when stopping smartcard plugin to avoid crash +- Resolves: #1742710 + +* Tue Jul 09 2019 Richard Hughes - 3.32.0-4 +- Remove the subman plugin -- move to a 8.2 feature instead. +- Resolves: #1720249 + +* Mon Jun 17 2019 Richard Hughes - 3.32.0-3 +- Add a new plugin to provide system subscription information +- Resolves: #1720249 + +* Mon Jun 10 2019 Ray Strode - 3.32.0-2 +- Add dropped patches + Related: #1674382 + +* Thu May 23 2019 Florian Müllner - 3.32.0-1 +- Update to 3.32.0 + Resolves: #1698929 + +* Mon Jan 14 2019 Carlos Garnacho - 3.28.1-2 +- Enable IBus for OSK purposes, necessary for focus tracking + Resolves: #1626105 + +* Thu Apr 12 2018 Kalev Lember - 3.28.1-1 +- Update to 3.28.1 + +* Tue Apr 10 2018 Michael Catanzaro - 3.28.0-2 +- Disable automatic suspend + +* Mon Mar 12 2018 Kalev Lember - 3.28.0-1 +- Update to 3.28.0 + +* Mon Mar 05 2018 Kalev Lember - 3.27.92-1 +- Update to 3.27.92 + +* Fri Mar 02 2018 Kalev Lember - 3.27.91-1 +- Update to 3.27.91 + +* Sat Feb 10 2018 Bastien Nocera - 3.27.90-4 ++ gnome-settings-daemon-3.27.90-4 +- Rebuild against newer gnome-desktop3 package + +* Fri Feb 09 2018 Bastien Nocera - 3.27.90-3 ++ gnome-settings-daemon-3.27.90-3 +- Really fix gsd-* helper linkage +- Build fix for highly parallel builds + +* Wed Feb 07 2018 Kalev Lember - 3.27.90-2 +- Fix missing libcommon.so library + +* Tue Feb 06 2018 Kalev Lember - 3.27.90-1 +- Update to 3.27.90 +- Switch to meson build system + +* Mon Feb 05 2018 Kalev Lember - 3.26.2-5 +- Rebuilt for libgweather soname bump + +* Sat Jan 20 2018 Björn Esser - 3.26.2-4 +- Rebuilt for switch to libxcrypt + +* Fri Jan 12 2018 Bastien Nocera - 3.26.2-3 +- Fix gdm session trying to change the backlight, resulting in a lot + of spurious error messages (#1322588) + +* Fri Jan 05 2018 Igor Gnatenko - 3.26.2-2 +- Remove obsolete scriptlets + +* Thu Nov 02 2017 Kalev Lember - 3.26.2-1 +- Update to 3.26.2 + +* Sun Oct 08 2017 Kalev Lember - 3.26.1-1 +- Update to 3.26.1 + +* Wed Sep 13 2017 Kalev Lember - 3.26.0-1 +- Update to 3.26.0 + +* Tue Sep 05 2017 Kalev Lember - 3.25.92-1 +- Update to 3.25.92 + +* Thu Aug 24 2017 Kalev Lember - 3.25.91-1 +- Update to 3.25.91 + +* Tue Aug 15 2017 Kalev Lember - 3.25.90-1 +- Update to 3.25.90 + +* Mon Jul 31 2017 Kalev Lember - 3.25.4-2 +- Add explicit conflicts to not break older gdm, gnome-session and gnome-shell + +* Mon Jul 31 2017 Kalev Lember - 3.25.4-1 +- Update to 3.25.4 + +* Wed Jul 26 2017 Fedora Release Engineering - 3.25.2-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild + +* Mon Jun 12 2017 Kalev Lember - 3.25.2-1 +- Update to 3.25.2 + +* Wed May 10 2017 Kalev Lember - 3.24.2-1 +- Update to 3.24.2 + +* Wed Apr 12 2017 Kalev Lember - 3.24.1-1 +- Update to 3.24.1 + +* Tue Mar 21 2017 Kalev Lember - 3.24.0-1 +- Update to 3.24.0 + +* Thu Mar 16 2017 Kalev Lember - 3.23.92-1 +- Update to 3.23.92 + +* Wed Feb 15 2017 Richard Hughes - 3.23.90-1 +- Update to 3.23.90 + +* Fri Feb 10 2017 Fedora Release Engineering - 3.23.3-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild + +* Thu Jan 12 2017 Bastien Nocera - 3.23.3-1 ++ gnome-settings-daemon-3.23.3-1 +- Update to 3.23.3 + +* Tue Oct 11 2016 Bastien Nocera - 3.23.2-1 ++ gnome-settings-daemon-3.23.2-1 +- Update to 3.23.2 + +* Thu Sep 22 2016 Kalev Lember - 3.22.0-1 +- Update to 3.22.0 + +* Wed Sep 14 2016 Kalev Lember - 3.21.92.1-1 +- Update to 3.21.92.1 + +* Wed Sep 14 2016 Kalev Lember - 3.21.92-1 +- Update to 3.21.92 +- Don't set group tags + +* Fri Aug 26 2016 Kalev Lember - 3.21.90-1 +- Update to 3.21.90 + +* Sun Apr 17 2016 Bastien Nocera - 3.20.1-3 +- Fix crasher in newly enabled audio device selection dialogue + +* Sun Apr 17 2016 Bastien Nocera - 3.20.1-2 +- Require alsa to enable the audio device selection dialogue + +* Wed Apr 13 2016 Kalev Lember - 3.20.1-1 +- Update to 3.20.1 + +* Tue Mar 22 2016 Kalev Lember - 3.20.0-1 +- Update to 3.20.0 + +* Thu Mar 17 2016 Kalev Lember - 3.19.92-1 +- Update to 3.19.92 + +* Fri Mar 04 2016 Kalev Lember - 3.19.91-1 +- Update to 3.19.91 + +* Wed Feb 17 2016 Richard Hughes - 3.19.90-1 +- Update to 3.19.90 + +* Wed Feb 03 2016 Fedora Release Engineering - 3.19.5-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild + +* Wed Jan 20 2016 Kalev Lember - 3.19.5-1 +- Update to 3.19.5 + +* Thu Dec 17 2015 Kalev Lember - 3.19.4-1 +- Update to 3.19.4 + +* Tue Dec 15 2015 Kalev Lember - 3.19.3-1 +- Update to 3.19.3 + +* Tue Nov 10 2015 Kalev Lember - 3.18.2-1 +- Update to 3.18.2 + +* Mon Oct 12 2015 Kalev Lember - 3.18.1-1 +- Update to 3.18.1 + +* Mon Sep 21 2015 Kalev Lember - 3.18.0-1 +- Update to 3.18.0 + +* Mon Sep 14 2015 Kalev Lember - 3.17.92-1 +- Update to 3.17.92 + +* Mon Aug 17 2015 Kalev Lember - 3.17.90-1 +- Update to 3.17.90 +- Use make_install macro + +* Wed Jul 22 2015 David King - 3.17.3-1 +- Update to 3.17.3 +- Use pkgconfig for BuildRequires + +* Wed Jun 17 2015 Fedora Release Engineering - 3.17.2-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild + +* Thu Jun 11 2015 Richard Hughes - 3.17.2-2 +- Add runtime dep on iio-sensor-proxy for the ambient light sensor + +* Fri Jun 05 2015 Kalev Lember - 3.17.2-1 +- Update to 3.17.2 + +* Tue May 12 2015 Kalev Lember - 3.16.2-1 +- Update to 3.16.2 + +* Tue Apr 14 2015 Kalev Lember - 3.16.1-1 +- Update to 3.16.1 + +* Mon Mar 23 2015 Kalev Lember - 3.16.0-1 +- Update to 3.16.0 + +* Tue Mar 17 2015 Kalev Lember - 3.15.92-1 +- Update to 3.15.92 + +* Tue Mar 03 2015 Kalev Lember - 3.15.91-1 +- Update to 3.15.91 +- Use the %%license macro for the COPYING file + +* Tue Feb 17 2015 Richard Hughes - 3.15.90-1 +- Update to 3.15.90 + +* Thu Jan 22 2015 Richard Hughes - 3.15.4-1 +- Update to 3.15.4 + +* Thu Nov 27 2014 Kalev Lember - 3.15.1-1 +- Update to 3.15.1 + +* Tue Nov 11 2014 Kalev Lember - 3.14.2-1 +- Update to 3.14.2 + +* Sat Nov 01 2014 Richard Hughes - 3.14.1-3 +- Fix compile on RHEL + +* Sun Oct 26 2014 Kalev Lember - 3.14.1-2 +- Obsolete drwright + +* Tue Oct 14 2014 Rui Matos - 3.14.1-1 +- Update to 3.14.1 + +* Mon Sep 22 2014 Kalev Lember - 3.14.0-1 +- Update to 3.14.0 + +* Tue Sep 16 2014 Kalev Lember - 3.13.92-1 +- Update to 3.13.92 + +* Wed Sep 03 2014 Kalev Lember - 3.13.91-1 +- Update to 3.13.91 + +* Mon Aug 18 2014 Kalev Lember - 3.13.90-1 +- Update to 3.13.90 + +* Sat Aug 16 2014 Fedora Release Engineering - 3.13.4-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild + +* Wed Jul 23 2014 Kalev Lember - 3.13.4-1 +- Update to 3.13.4 + +* Thu Jun 26 2014 Richard Hughes - 3.13.3-1 +- Update to 3.13.3 + +* Wed Jun 25 2014 Richard Hughes - 3.13.2-1 +- Update to 3.13.2 + +* Sat Jun 07 2014 Fedora Release Engineering - 3.13.1-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild + +* Thu May 01 2014 Kalev Lember - 3.13.1-1 +- Update to 3.13.1 +- Remove and obsolete the updates plugin + +* Wed Apr 16 2014 Kalev Lember - 3.12.1-1 +- Update to 3.12.1 +- Tighten subpackage deps + +* Mon Apr 14 2014 Kalev Lember - 3.12.0.1-3 +- Drop control-center-filesystem dependency + +* Sat Apr 05 2014 Kalev Lember - 3.12.0.1-2 +- Update dep versions + +* Wed Mar 26 2014 Richard Hughes - 3.12.0.1-1 +- Update to 3.12.0.1 + +* Mon Mar 24 2014 Richard Hughes - 3.12.0-1 +- Update to 3.12.0 + +* Tue Mar 18 2014 Richard Hughes - 3.11.92-1 +- Update to 3.11.92 + +* Tue Mar 04 2014 Richard Hughes - 3.11.91-1 +- Update to 3.11.91 + +* Wed Feb 19 2014 Richard Hughes - 3.11.90-2 +- Rebuilt for gnome-desktop soname bump + +* Tue Feb 18 2014 Richard Hughes - 3.11.90-1 +- Update to 3.11.90 + +* Tue Feb 04 2014 Richard Hughes - 3.11.5-1 +- Update to 3.11.5 + +* Thu Jan 30 2014 Richard Hughes - 3.11.3-2 +- Rebuild for libpackagekit-glib soname bump + +* Tue Dec 17 2013 Richard Hughes - 3.11.3-1 +- Update to 3.11.3 + +* Mon Nov 25 2013 Richard Hughes - 3.11.2-1 +- Update to 3.11.2 + +* Thu Oct 31 2013 Florian Müllner - 3.11.1-1 +- Update to 3.11.1 + +* Mon Oct 28 2013 Richard Hughes - 3.10.1-1 +- Update to 3.10.1 + +* Fri Oct 11 2013 Richard Hughes - 3.10.0-3 +- Apply the previous patch on Fedora too. + +* Fri Oct 11 2013 Richard Hughes - 3.10.0-2 +- Grab a patch from upstream to fix the multiple notifications about updates. +- Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1009132 + +* Tue Sep 24 2013 Kalev Lember - 3.10.0-1 +- Update to 3.10.0 + +* Wed Sep 18 2013 Kalev Lember - 3.9.92-1 +- Update to 3.9.92 + +* Tue Sep 17 2013 Richard Hughes - 3.9.91.1-2 +- Grab a patch from upstream so that the offline updates feature can + actually work when reboot returns with success. + +* Tue Sep 03 2013 Matthias Clasen - 3.9.91.1-1 +- Update to 3.9.91.1 + +* Tue Sep 03 2013 Kalev Lember - 3.9.91-1 +- Update to 3.9.91 +- Include the new datetime plugin + +* Fri Aug 23 2013 Kalev Lember - 3.9.90-2 +- Keep middle click paste enabled for now + +* Thu Aug 22 2013 Kalev Lember - 3.9.90-1 +- Update to 3.9.90 + +* Fri Aug 09 2013 Kalev Lember - 3.9.5-1 +- Update to 3.9.5 +- Remove empty /etc/gnome-settings-daemon directory +- Install new rfkill plugin and add back the smartcard plugin + +* Tue Jul 30 2013 Richard Hughes - 3.9.3-3 +- Rebuild for colord soname bump + +* Mon Jul 22 2013 Bastien Nocera 3.9.3-2 +- Remove obsolete GStreamer 0.10 BRs + +* Thu Jun 20 2013 Kalev Lember - 3.9.3-1 +- Update to 3.9.3 + +* Sun Jun 02 2013 Kalev Lember - 3.9.2-1 +- Update to 3.9.2 +- Drop the ibus-kkc-libpinyin patch; the hardcoded input sources + list is gone from g-s-d +- Set the minimum required gnome-desktop3 version + +* Tue May 14 2013 Richard Hughes - 3.8.2-1 +- Update to 3.8.2 + +* Thu May 9 2013 Jens Petersen - 3.8.1-2 +- default ibus engine in Fedora is now kkc for Japanese + and libpinyin for Chinese (#948117) + +* Tue Apr 16 2013 Richard Hughes - 3.8.1-1 +- Update to 3.8.1 + +* Tue Mar 26 2013 Richard Hughes - 3.8.0-1 +- Update to 3.8.0 + +* Tue Mar 19 2013 Matthias Clasen - 3.7.92-1 +- Update to 3.7.92 + +* Tue Mar 5 2013 Matthias Clasen - 3.7.91-1 +- Update to 3.7.91 + +* Wed Feb 20 2013 Richard Hughes - 3.7.90-1 +- Update to 3.7.90 + +* Thu Feb 07 2013 Richard Hughes - 3.7.5.1-1 +- Update to 3.7.5.1 + +* Wed Feb 06 2013 Debarshi Ray - 3.7.5-2 +- Bump the gtk3 BuildRequires + +* Tue Feb 05 2013 Richard Hughes - 3.7.5-1 +- Update to 3.7.5 + +* Wed Jan 16 2013 Richard Hughes - 3.7.4-1 +- Update to 3.7.4 + +* Mon Dec 31 2012 Dan Horák - 3.7.3-2 +- fix filelist for s390(x) (and ppc/ppc64 in RHEL) + +* Thu Dec 20 2012 Kalev Lember - 3.7.3-1 +- Update to 3.7.3 +- Adjust the spec file for the (temporarly) disabled smartcard plugin + +* Tue Nov 20 2012 Richard Hughes - 3.7.1-1 +- Update to 3.7.1 +- Remove upstreamed patches + +* Wed Nov 14 2012 Kalev Lember - 3.6.3-1 +- Update to 3.6.3 +- Drop the static man page patch and BR docbook-style-xsl instead + +* Thu Nov 08 2012 Bastien Nocera 3.6.2-1 +- Update to 3.6.2 + +* Thu Oct 18 2012 Matthias Clasen - 3.6.1-3 +- Fix a typo in the suspend patch (#858259) + +* Mon Oct 08 2012 Dan Horák - 3.6.1-2 +- fix build on s390(x) + +* Mon Oct 08 2012 Bastien Nocera 3.6.1-1 +- Update to 3.6.1 + +* Fri Oct 5 2012 Olivier Fourdan - 3.6.0-5 +- Adds Wacom OSD window from upstream bug #679062 + +* Wed Oct 3 2012 Matthias Clasen - 3.6.0-4 +- Fix an inhibitor leak in the previous patch + +* Tue Oct 2 2012 Matthias Clasen - 3.6.0-3 +- Fix lid close handling with new systemd + +* Fri Sep 28 2012 Peter Robinson - 3.6.0-2 +- Split out PackageKit into a sub package. Fixes #699348 + +* Tue Sep 25 2012 Richard Hughes - 3.6.0-1 +- Update to 3.6.0 + +* Wed Sep 19 2012 Richard Hughes - 3.5.92-1 +- Update to 3.5.92 + +* Wed Sep 05 2012 Cosimo Cecchi - 3.5.91-1 +- Update to 3.5.91 + +* Wed Aug 22 2012 Richard Hughes - 3.5.90-1 +- Update to 3.5.90 + +* Tue Aug 21 2012 Richard Hughes - 3.5.6-1 +- Update to 3.5.6 + +* Fri Jul 27 2012 Fedora Release Engineering - 3.5.5-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild + +* Tue Jul 24 2012 Dan Horák - 3.5.5-3 +- fix build without wacom + +* Thu Jul 19 2012 Matthias Clasen - 3.5.5-2 +- Fix the updates plugin to load + +* Thu Jul 19 2012 Matthias Clasen - 3.5.5-1 +- Update to 3.5.5 + +* Tue Jul 17 2012 Dan Horák - 3.5.4-3 +- fix build on s390(x) - cherry-picked from f17 branch +- allow build without wacom on ppc/ppc64 + +* Tue Jul 17 2012 Matthias Clasen - 3.5.4-2 +- Rebuild against new PackageKit + +* Wed Jun 27 2012 Richard Hughes - 3.5.4-1 +- Update to 3.5.4 + +* Tue Jun 26 2012 Richard Hughes - 3.5.3-1 +- Update to 3.5.3 + +* Thu Jun 14 2012 Matthias Clasen - 3.5.2-4 +- Drop calculator patch, no longer needed + +* Thu Jun 07 2012 Matthias Clasen - 3.5.2-3 +- Fix file lists + +* Thu Jun 07 2012 Richard Hughes - 3.5.2-2 +- Add missing BR + +* Wed Jun 06 2012 Richard Hughes - 3.5.2-1 +- Update to 3.5.2 + +* Fri May 18 2012 Richard Hughes - 3.4.2-1 +- Update to 3.4.2 + +* Mon Apr 16 2012 Richard Hughes - 3.4.1-1 +- Update to 3.4.1 + +* Mon Mar 26 2012 Richard Hughes - 3.4.0-1 +- New upstream version. + +* Tue Mar 20 2012 Richard Hughes 3.3.92-1 +- Update to 3.3.92 + +* Mon Mar 05 2012 Bastien Nocera 3.3.91-1 +- Update to 3.3.91 + +* Wed Feb 22 2012 Bastien Nocera 3.3.90.1-1 +- Update to 3.3.90.1 + +* Thu Feb 9 2012 Matthias Clasen 3.3.5-2 +- Use systemd for session tracking + +* Tue Feb 7 2012 Matthias Clasen 3.3.5-1 +- Update to 3.3.5 + +* Fri Jan 20 2012 Matthias Clasen 3.3.4-2 +- Some crash fixes + +* Tue Jan 17 2012 Bastien Nocera 3.3.4-1 +- Update to 3.3.4 + +* Fri Jan 13 2012 Fedora Release Engineering - 3.3.3.1-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild + +* Tue Dec 27 2011 Matthias Clasen - 3.3.3.1-2 +- Fix a path problem in the gnome-settings-daemon autostart file + +* Fri Dec 23 2011 Matthias Clasen - 3.3.3.1-1 +- Update to 3.3.3.1 + +* Wed Dec 21 2011 Matthias Clasen - 3.3.3-1 +- Update to 3.3.3 + +* Wed Nov 23 2011 Matthias Clasen - 3.3.2-1 +- Update to 3.3.2 + +* Fri Nov 11 2011 Bastien Nocera 3.2.2-1 +- Update to 3.2.2 + +* Wed Oct 26 2011 Fedora Release Engineering - 3.2.1-4 +- Rebuilt for glibc bug#747377 + +* Tue Oct 25 2011 Marek Kasik - 3.2.1-3 +- Fix a typo in registration of an object on DBus (#747318) + +* Mon Oct 24 2011 Matthias Clasen - 3.2.1-2 +- Fix calculator keybinding (#745367) + +* Mon Oct 17 2011 Bastien Nocera 3.2.1-1 +- Update to 3.2.1 + +* Wed Oct 12 2011 Adam Williamson - 3.2.0-2 +- backport some greatest hits from git to stop the same bugs being + reported over and over (all will be in 3.2.1) + +* Tue Sep 27 2011 Ray - 3.2.0-1 +- Update to 3.2.0 + +* Tue Sep 20 2011 Matthias Clasen - 3.1.92-1 +- Update to 3.1.92 + +* Tue Sep 6 2011 Matthias Clasen - 3.1.91-1 +- Update to 3.1.91 + +* Tue Jul 26 2011 Cosimo Cecchi - 3.1.4-2 +- Add a patch to make the fallback mounter to build correctly +- Include the new power plugin + +* Mon Jul 25 2011 Matthias Clasen - 3.1.4-1 +- Update to 3.1.4 + +* Fri Jul 22 2011 Tomas Bzatek - 3.1.3-2 +- Add support for chrony (#723212) + +* Mon Jul 04 2011 Bastien Nocera 3.1.3-1 +- Update to 3.1.3 + +* Tue Jun 21 2011 Tomas Bzatek - 3.1.2-2 +- Fix fortify fail in gsd-color-manager.c (#714625) + +* Wed Jun 15 2011 Tomas Bzatek - 3.1.2-1 +- Update to 3.1.2 + +* Wed Jun 15 2011 Bastien Nocera 3.1.1-3 +- Rebuild for new gnome-desktop3 libs + +* Mon Jun 13 2011 Marek Kasik 3.1.1-2 +- Remove requirement of system-config-printer-udev (#704381) + +* Wed May 11 2011 Tomas Bzatek - 3.1.1-1 +- Update to 3.1.1 + +* Sat May 07 2011 Christopher Aillon - 3.0.1-5 +- Update gsettings schema scriptlet + +* Mon May 2 2011 Matthias Clasen 3.0.1-4 +- Try to fix a crash (#698533) + +* Thu Apr 28 2011 Bastien Nocera 3.0.1-2 +- Fix setting ntpd usage with SystemD + +* Tue Apr 26 2011 Bastien Nocera 3.0.1-1 +- Update to 3.0.1 + +* Wed Apr 06 2011 Bastien Nocera 3.0.0.1-1 +- Update to 3.0.0.1 + +* Mon Apr 04 2011 Bastien Nocera 3.0.0-1 +- Update to 3.0.0 + +* Wed Mar 30 2011 Marek Kasik 2.91.93-2 +- Make CUPS' subscriptions expirable + +* Fri Mar 25 2011 Bastien Nocera 2.91.93-1 +- Update to 2.91.93 + +* Mon Mar 21 2011 Matthias Clasen 2.91.92-1 +- Update 2.91.92 + +* Wed Mar 16 2011 Richard Hughes 2.91.91-3 +- Add a patch from upstream to fix the updates plugin. + +* Fri Mar 11 2011 Bastien Nocera 2.91.91-2 +- Add libXxf86misc-devel requires so that key repeat/delay works + +* Tue Mar 08 2011 Bastien Nocera 2.91.91-1 +- Update to 2.91.91 + +* Fri Feb 25 2011 Matthias Clasen - 2.91.90-4 +- Fix undefined symbols in the updates plugin + +* Wed Feb 23 2011 Matthias Clasen - 2.91.90-3 +- BR PackageKit and cups +- Explicitly list plugins so we notice if they go missing + +* Wed Feb 23 2011 Cosimo Cecchi - 2.91.90-2 +- Include an upstream patch to fix a possible crasher + +* Tue Feb 22 2011 Matthias Clasen 2.91.90-1 +- Update to 2.91.90 + +* Wed Feb 16 2011 Bastien Nocera 2.91.9-6 +- Fix crasher when media keys GSettings value changes + +* Sun Feb 13 2011 Christopher Aillon - 2.91.9-5 +- Rebuild for new libxklavier + +* Fri Feb 11 2011 Matthias Clasen 2.91.9-4 +- Rebuild against newer gtk + +* Tue Feb 08 2011 Fedora Release Engineering - 2.91.9-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild + +* Tue Feb 08 2011 Bastien Nocera 2.91.9-2 +- Fix setting timezones in the date & time panel (#674999) + +* Wed Feb 2 2011 Matthias Clasen 2.91.9-1 +- 2.91.9 + +* Tue Jan 11 2011 Matthias Clasen 2.91.8-1 +- 2.91.8 + +* Tue Jan 11 2011 Matthias Clasen 2.91.7-2 +- Own %%{_libdir}/gnome-settings-daemon-3.0/gtk-modules + +* Mon Jan 10 2011 Matthias Clasen 2.91.7-1 +- Update to 2.91.7 + +* Sat Jan 8 2011 Matthias Clasen 2.91.6.2-1 +- Update to 2.91.6.2 + +* Fri Dec 3 2010 Matthias Clasen 2.91.5.1-1 +- Update to 2.91.5.1 + +* Thu Dec 2 2010 Dan Williams - 2.91.5-4 +- Re-add patch handling org.gnome.media-handling gsettings schema rename + +* Wed Dec 1 2010 Dan Williams - 2.91.5-3 +- Fix various cases of forgetting to draw the background + +* Tue Nov 30 2010 Owen Taylor - 2.91.5-2 +- Add a patch handling org.gnome.media-handling gsettings schema rename + +* Tue Nov 30 2010 Tomas Bzatek 2.91.5-1 +- Update to 2.91.5 + +* Fri Nov 26 2010 Bastien Nocera 2.91.4-2 +- Fix crasher on startup + +* Thu Nov 25 2010 Bastien Nocera 2.91.4-1 +- Update to 2.91.4 + +* Wed Nov 17 2010 Richard Hughes 2.91.3-1 +- Update to 2.91.3 + +* Wed Nov 10 2010 Bastien Nocera 2.91.2.1-0.4. +- Update to 2.91.2.1 + +* Wed Nov 3 2010 Matthias Clasen 2.91.2-0.4.20101102 +- Rebuild against new libnotify + +* Tue Nov 2 2010 Matthias Clasen 2.91.2-0.3.20101102 +- Make theme changing work + +* Tue Nov 02 2010 Richard Hughes 2.91.2-0.2.20101102 +- Add BR gsettings-desktop-schemas-devel + +* Tue Nov 02 2010 Richard Hughes 2.91.2-0.1.20101102 +- Update to a git snapshot to fix rawhide. + +* Wed Oct 06 2010 Richard Hughes 2.91.0-3 +- Fix the pkgconfig file manually + +* Wed Oct 06 2010 Richard Hughes 2.91.0-2 +- Rebuild against the new libgnomekbd library + +* Mon Oct 4 2010 Matthias Clasen - 2.91.0-1 +- Update to 2.91.0 + +* Wed Sep 29 2010 jkeating - 2.90.1-2 +- Rebuilt for gcc bug 634757 + +* Wed Sep 22 2010 Bastien Nocera 2.90.1-1 +- Update to 2.90.1 + +* Tue Aug 31 2010 Matthias Clasen 2.31.91-1 +- Update to 2.31.91 + +* Fri Aug 27 2010 Matthias Clasen 2.31.6-2 +- Fix a problem with warning bubbles in virtual machines (#624624) + +* Tue Aug 3 2010 Matthias Clasen 2.31.6-1 +- Update to 2.31.6 + +* Tue Jul 13 2010 Matthias Clasen 2.31.5.1-1 +- Update to 2.31.5.1 + +* Mon Jul 12 2010 Matthias Clasen 2.31.5-1 +- Update to 2.31.5 + +* Wed Jun 30 2010 Matthias Clasen 2.31.4.2-1 +- Update to 2.31.4.2 + +* Tue Jun 29 2010 Matthias Clasen 2.31.4.1-1 +- Update to 2.31.4.1 + +* Tue Jun 29 2010 Matthias Clasen 2.31.4-1 +- Update to 2.31.4 + +* Mon Jun 28 2010 Bastien Nocera 2.31.3-3 +- Don't remove the sound plugin if we want the caches to be + updated + +* Tue Jun 8 2010 Matthias Clasen 2.31.3-1 +- Update to 2.31.3 + +* Thu May 27 2010 Matthias Clasen 2.31.2-1 +- Update to 2.31.2 + +* Sun May 16 2010 Matthias Clasen 2.31.1-1 +- Update to 2.31.1 + +* Fri Apr 30 2010 Matthias Clasen 2.30.1-4 +- Waah, one more mistake in these macros + +* Tue Apr 27 2010 Matthias Clasen 2.30.1-3 +- Nobody understands macro processors... + +* Tue Apr 27 2010 Matthias Clasen 2.30.1-2 +- Fix a typo + +* Mon Apr 26 2010 Matthias Clasen 2.30.1-1 +- Update to 2.30.1 +- Spec file cleanups + +* Mon Mar 29 2010 Matthias Clasen 2.30.0-1 +- Update to 2.30.0 + +* Mon Mar 22 2010 Bastien Nocera 2.29.92-3 +- Disable the font plugin by default + +* Wed Mar 10 2010 Bastien Nocera 2.29.92-2 +- Remove unneeded icons, already upstream + +* Tue Mar 09 2010 Bastien Nocera 2.29.92-1 +- Update to 2.29.92 + +* Sat Feb 27 2010 Matthias Clasen 2.29.91.1-2 +- Fix Fn-F8 OSD icon +- Modernize scriptlets + +* Wed Feb 24 2010 Matthias Clasen 2.29.91.1-1 +- Update to 2.29.91.1 + +* Wed Feb 17 2010 Matthias Clasen 2.29.90-2 +- Set a name for the keyboard statusicon + +* Wed Feb 10 2010 Tomas Bzatek 2.29.90-1 +- Update to 2.29.90 + +* Tue Jan 26 2010 Matthias Clasen 2.29.6-1 +- Update to 2.29.6 + +* Fri Dec 18 2009 Matthias Clasen 2.28.1-10 +- Avoid warning messages from the OSD code + +* Tue Dec 15 2009 Matthias Clasen 2.28.1-9 +- Survive when running without XKB (#547780) + +* Thu Nov 12 2009 Matthias Clasen 2.28.1-8 +- Avoid a 'whitespace leak' around the display statusicon (gnome #601696) + +* Mon Nov 9 2009 Matthias Clasen 2.28.1-7 +- React to screen changes when showing the background (gnome #601203) + +* Thu Nov 05 2009 Bastien Nocera 2.28.1-6 +- Fix the volume going over 100% in the OSD + +* Wed Oct 28 2009 Bastien Nocera 2.28.1-5 +- Update OSD code again + +* Tue Oct 27 2009 Bastien Nocera 2.28.1-4 +- Fix bluriness in OSD + +* Mon Oct 26 2009 Matthias Clasen - 2.28.1-3 +- Change default font rendering to use slight hinting + +* Mon Oct 26 2009 Peter Hutterer 2.28.1-2 +- left-handed-touchpad.patch: change physical touchpad buttons to + left-handed, not tapping though (#498249) + +* Mon Oct 19 2009 Matthias Clasen - 2.28.1-1 +- Update to 2.28.1 + +* Thu Oct 1 2009 Matthias Clasen - 2.28.0-4 +- Fix keyboard variant handling + +* Fri Sep 25 2009 Matthias Clasen - 2.28.0-3 +- Align the OSD visuals with the notification theme + +* Tue Sep 22 2009 Adam Jackson 2.28.0-2 +- BuildRequires: libcanberra-devel + +* Mon Sep 21 2009 Matthias Clasen - 2.28.0-1 +- Update to 2.28.0 + +* Wed Sep 09 2009 Bastien Nocera 2.27.92-2 +- Update left-hand touchpad patch + +* Mon Sep 7 2009 Matthias Clasen - 2.27.92-1 +- Update to 2.27.92 + +* Sun Aug 30 2009 Matthias Clasen - 2.27.91-3 +- Make 'Locate Pointer' work with metacity again + +* Wed Aug 26 2009 Peter Hutterer 2.27.91-2 +- buttonmapping.patch: Don't check for IsXExtensionDevice, only skip button + mappings for core devices instead (#502129). + +* Mon Aug 24 2009 Bastien Nocera 2.27.91-1 +- Update to 2.27.91 + +* Fri Aug 14 2009 Bastien Nocera 2.27.90-2 +- Update gnome-volume-control code + +* Fri Aug 14 2009 Bastien Nocera 2.27.90-1 +- Update to 2.27.90 + +* Tue Jul 28 2009 Matthias Clasen 2.27.5-1 +- Update to 2.27.5 + +* Fri Jul 24 2009 Fedora Release Engineering - 2.27.4-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild + +* Tue Jul 21 2009 Matthias Clasen 2.27.4-3 +- Make locate-pointer not interfere with media keys + +* Wed Jul 15 2009 Matthias Clasen 2.27.4-2 +- Rebuild against new libgnomekbd + +* Tue Jul 14 2009 Matthias Clasen 2.27.4-1 +- Update ot 2.27.4 + +* Tue Jun 30 2009 Matthias Clasen 2.27.3-2 +- Rebuild against new libxklavier + +* Tue Jun 16 2009 Matthias Clasen 2.27.3-1 +- Update to 2.27.3 + +* Mon Jun 8 2009 Matthias Clasen 2.27.1-2 +- Make the 'locate pointer' effect cope with changing compositing + managers + +* Sat May 16 2009 Matthias Clasen 2.27.1-1 +- Update to 2.27.1 + +* Fri May 08 2009 Bastien Nocera 2.26.1-4 +- Remove useless patch, see: +http://bugzilla.gnome.org/show_bug.cgi?id=580761 for details + +* Wed Apr 29 2009 Bastien Nocera 2.26.1-3 +- Don't set touchpads to be left-handed, otherwise the tap + behaves like the 2nd mouse button (#483639) + +* Mon Apr 27 2009 Matthias Clasen - 2.26.1-2 +- Don't drop schemas translations from po files + +* Tue Apr 14 2009 Matthias Clasen - 2.26.1-1 +- Update to 2.26.1 + +* Wed Apr 8 2009 Matthias Clasen - 2.26.0-2 +- Support touchpads + +* Mon Mar 16 2009 Matthias Clasen - 2.26.0-1 +- Update to 2.26.0 + +* Mon Mar 2 2009 Matthias Clasen - 2.25.92-1 +- Update to 2.25.92 + +* Tue Feb 24 2009 Fedora Release Engineering - 2.25.90-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild + +* Thu Feb 5 2009 Matthias Clasen - 2.25.90-2 +- Fix a warning (#484132) + +* Wed Feb 4 2009 Matthias Clasen - 2.25.90-1 +- Update to 2.25.90 + +* Mon Jan 19 2009 - Ray Strode - 2.25.3-4 +- Update fade patch for new gnome-desktop release + +* Thu Dec 18 2008 - Bastien Nocera - 2.25.3-3 +- Rebuild + +* Thu Dec 18 2008 - Ray Strode - 2.25.3-2 +- Drop touchpad patch for now + +* Thu Dec 18 2008 - Bastien Nocera - 2.25.3-1 +- Update to 2.25.3 + +* Thu Dec 18 2008 - Bastien Nocera - 2.25.2-11 +- Fix touchpad patches + +* Wed Dec 17 2008 Matthias Clasen - 2.25.2-10 +- Rebuild against new gnome-desktop + +* Wed Dec 10 2008 Ray Strode - 2.25.2-9 +- Don't call SetPointerMapping when using Xinput since + it duplicates effort but gets touchpads wrong (bug 324721) + +* Wed Dec 10 2008 Ray Strode - 2.25.2-8 +- Shutdown cleanly when bus goes away (bug 445898 again) + +* Wed Dec 10 2008 Ray Strode - 2.25.2-7 +- Don't map touch pad tap to right-click for left-handed + users (bug 324721) + +* Wed Dec 10 2008 Ray Strode - 2.25.2-6 +- Listen for DeviceAdded signals when configuring mouse + (in addition to DeviceEnabled). This may help with + bug 474758. + +* Tue Dec 9 2008 Ray Strode - 2.25.2-5 +- Shutdown cleanly on TERM signal (bug 445898) + +* Sun Dec 7 2008 Behdad Esfahbod - 2.25.2-4 +- Add gnome-settings-daemon-2.24.1-umask.patch + +* Thu Dec 4 2008 Ray Strode - 2.25.2-2 +- Rebase fade patch to apply with Behdad's updates to + g-s-d + +* Wed Dec 3 2008 Matthias Clasen - 2.25.2-1 +- Ypdate to 2.25.2 + +* Thu Nov 13 2008 Matthias Clasen - 2.25.1-4 +- Rebuild + +* Wed Nov 12 2008 Matthias Clasen - 2.25.1-2 +- Update to 2.25.1 + +* Fri Oct 24 2008 Ray Strode - 2.24.0-14 +- At fontconfig-devel buildrequires (bug 468304) + +* Wed Oct 15 2008 Matthias Clasen - 2.24.0-13 +- Save some space + +* Tue Oct 14 2008 Ray Strode - 2.24.0-12 +- Hold off on settings-daemon fade if nautilus is going to do + it anyway. + +* Tue Oct 14 2008 Matthias Clasen - 2.24.0-11 +- Show the shutdown dialog when the power button is pressed + +* Tue Oct 14 2008 Matthias Clasen - 2.24.0-9 +- Drop a patch that is no longer needed with the evdev ruleset + in xkeyboard-config + +* Sun Oct 12 2008 Matthias Clasen - 2.24.0-7 +- Try harder not to override peoples configured keyboard layouts + +* Sun Oct 12 2008 Ray Strode - 2.24.0-6 +- Update fade patch to skip crossfade when changing frames in + slideshow background. + +* Fri Oct 10 2008 Matthias Clasen - 2.24.0-5 +- Fix the picking up of the gdm keyboard layout even more + +* Tue Sep 30 2008 Matthias Clasen - 2.24.0-3 +- Fix the picking up of the gdm keyboard layout + +* Sun Sep 28 2008 Ray Strode - 2.24.0-2 +- Don't draw background twice at startup + +* Tue Sep 23 2008 Matthias Clasen - 2.24.0-1 +- Update to 2.24.0 + +* Thu Sep 18 2008 Ray Strode - 2.23.92-3 +- When switching desktop backgrounds fade between them + +* Thu Sep 11 2008 Soren Sandmann - 2.23.92-2 +- Fix various bugs in the fn-F7 support + +* Mon Sep 8 2008 Matthias Clasen - 2.23.92-1 +- Update to 2.23.92 + +* Fri Sep 5 2008 Matthias Clasen - 2.23.91-5 +- Try harder to use the keyboard layout that gdm tells us + +* Thu Sep 04 2008 Soren Sandmann - 2.23.91-4 +- Use the fn-F7 key, not the F7 key. + +* Wed Sep 03 2008 Soren Sandmann - 2.23.91-3 +- Bump gnome-desktop requirement + +* Wed Sep 03 2008 Soren Sandmann - 2.23.91-2 +- Add patch to do fn-f7 cycling + +* Mon Sep 01 2008 - Bastien Nocera - 2.23.91-1 +- Update to 2.23.91 + +* Thu Aug 28 2008 Jon McCann - 2.23.91-0.2008.08.28.2 +- BuildRequires libnotify-devel + +* Thu Aug 28 2008 Jon McCann - 2.23.91-0.2008.08.28.1 +- Update to snapshot + +* Fri Aug 22 2008 Matthias Clasen - 2.23.90-1 +- Update to 2.23.90 + +* Thu Aug 14 2008 Lennart Poettering - 2.23.6-3 +- Rerun autotools after patching configure.ac + +* Thu Aug 14 2008 Lennart Poettering - 2.23.6-2 +- Apply patch from gnome bug 545386. This hasn't been accepted in this form yet + by upstream, will however very likely be merged in a similar form. +- Disable esd/sounds module since we don't need it to start PA anymore + +* Tue Aug 5 2008 Matthias Clasen - 2.23.6-1 +- Update to 2.23.6 + +* Fri Jul 25 2008 Matthias Clasen - 2.23.5-3 +- Use standard icon names in the volume OSD + +* Fri Jul 25 2008 - Bastien Nocera - 2.23.5-2 +- Fix build, call gtk-update-icon-cache as required + +* Thu Jul 24 2008 Soren Sandmann - 2.23.5-1 +- Update to 2.23.5 + +* Wed Jun 18 2008 Matthias Clasen - 2.23.4-1 +- Update to 2.23.4 + +* Tue Jun 17 2008 Colin Walters - 2.23.3-2 +- Add (now upstreamed) patch to legacy ESD preference; see + http://bugzilla.gnome.org/show_bug.cgi?id=533198 + https://bugzilla.redhat.com/show_bug.cgi?id=430624 + +* Wed Jun 4 2008 Matthias Clasen - 2.23.3-1 +- Update to 2.23.3 + +* Wed May 14 2008 Matthias Clasen - 2.23.2-0.2008.05.14.2 +- Fix BuildRequires + +* Wed May 14 2008 Jon McCann - 2.23.2-0.2008.05.14.1 +- Build snapshot + +* Tue May 13 2008 Matthias Clasen - 2.23.1-1-5 +- Rebuild + +* Mon May 5 2008 Matthias Clasen - 2.23.1-1-4 +- Pick up the keyboard layout from the login screen + +* Mon May 5 2008 Matthias Clasen - 2.23.1-1-3 +- Fix background drawing without nautilus + +* Tue Apr 29 2008 - Bastien Nocera - 2.23.1.1-2 +- Add patch from upstream to avoid the Stop button triggering an Eject (#346201) + +* Fri Apr 25 2008 Matthias Clasen - 2.23.1.1-1 +- Update to 2.23.1.1 + +* Tue Apr 22 2008 Matthias Clasen - 2.22.1-2008.03.26.6 +- Make the xrandr plugin survive the absence of Xrandr + +* Sat Apr 5 2008 - Soren Sandmann - 2.22.1-2008.03.26.5 +- Update randr plugin + +* Mon Mar 31 2008 - Ray Strode - 2.22.1-0.2008.03.26.4 +- Over the releases we've accumulated default.png, default-wide.png default-5_4.png + and default.jpg. We haven't been able to drop them because it would leave some + users with white backgrounds on upgrade. This patch just falls back to the + default image if the user's background doesn't exist. + +* Wed Mar 26 2008 - Bastien Nocera - 2.22.1-0.2008.03.26.3 +- Add patch for the mouse plugin not to eat multimedia key events (#438942) + +* Wed Mar 26 2008 Jon McCann - 2.22.1-0.2008.03.26.2 +- Rebuild + +* Wed Mar 26 2008 Jon McCann - 2.22.1-0.2008.03.26.1 +- Update to snapshot +- Enable profiling + +* Wed Mar 26 2008 - Bastien Nocera - 2.22.0-3 +- apps_gnome_settings_daemon_default_editor.schemas is obsolete (#438937) + +* Thu Mar 20 2008 Matthias Clasen 2.22.0-2 +- Fix interaction between "Locate Pointer" and volume keys + +* Mon Mar 10 2008 Matthias Clasen 2.22.0-1 +- Update to 2.22.0 + +* Sun Mar 9 2008 Ray Strode - 2.21.92-3 +- Don't set keyboard model on startup from gconf if evdev is being used. + Evdev needs to use its own keyboard model to work right. + +* Sun Mar 2 2008 Soren Sandmann - 2.21.92-2 +- Update randr patch to handle video key + +* Fri Feb 29 2008 Jon McCann - 2.21.92-1 +- Update to 2.21.92 + +* Tue Feb 12 2008 Soren Sandmann - 2.21.91-3 +- Add patch to make the xrandr plugin listen for client messages from + the control panel and reread the configuration file. + +* Mon Feb 11 2008 Matthias Clasen - 2.21.91-2 +- Remove obsolete control-center translations + +* Mon Feb 11 2008 - Bastien Nocera - 2.21.91-1 +- Update to 2.21.91 +- Remove obsolete patches + +* Thu Feb 7 2008 Matthias Clasen - 2.21.90.1-3 +- Load xkb settings initially + +* Thu Jan 31 2008 - Bastien Nocera - 2.21.90.1-2 +- Fix the path for g-s-d, from upstream patch + +* Tue Jan 29 2008 - Bastien Nocera - 2.21.90.1-1 +- Update to 2.21.90.1 + +* Tue Jan 29 2008 - Bastien Nocera - 2.21.90-1 +- Update to 2.21.90 + +* Tue Jan 15 2008 Matthias Clasen - 2.21.5.2-2 +- Incorporate review feedback (#428833) + +* Tue Jan 15 2008 Matthias Clasen - 2.21.5.2-1 +- Update to 2.21.5.2 + +* Tue Jan 15 2008 Matthias Clasen - 2.21.5.1-1 +- Update to 2.21.5.1 +- Fix up BuildRequires + +* Thu Dec 06 2007 - Bastien Nocera - 2.21.5-1 +- First package + diff --git a/org.gnome.settings-daemon.plugins.power.gschema.override b/org.gnome.settings-daemon.plugins.power.gschema.override new file mode 100644 index 0000000..17c223f --- /dev/null +++ b/org.gnome.settings-daemon.plugins.power.gschema.override @@ -0,0 +1,3 @@ +[org.gnome.settings-daemon.plugins.power] +sleep-inactive-ac-timeout=0 +sleep-inactive-battery-timeout=0 diff --git a/sources b/sources new file mode 100644 index 0000000..ce74edd --- /dev/null +++ b/sources @@ -0,0 +1 @@ +SHA512 (gnome-settings-daemon-3.32.0.tar.xz) = 9b4c322ae063f62a934c730a4aed0de1486de60007dd84c31829f607e656cd90d03c0ddae0d0bb477dbc68f0313be06a6c566d54d111817177afb64b1784542a