info: Implement setting of "PrettyHostname"

This property can be used to name services running on the machine
such as media sharing, device sharing, or externally visible
services such as the Bluetooth name.

We don't set the statis hostname yet though, this will need
to be done to follow the recommendations from systemd.

https://bugzilla.gnome.org/show_bug.cgi?id=650044
This commit is contained in:
Bastien Nocera 2011-05-12 14:46:50 +01:00
parent c3e7514ed6
commit a089d7e710
4 changed files with 139 additions and 13 deletions

View file

@ -97,7 +97,8 @@ PKG_CHECK_MODULES(DATETIME_PANEL, $COMMON_MODULES dbus-glib-1
polkit-gobject-1 >= $POLKIT_REQUIRED_VERSION
gdk-pixbuf-2.0 >= $GDKPIXBUF_REQUIRED_VERSION)
PKG_CHECK_MODULES(DISPLAY_PANEL, $COMMON_MODULES dbus-glib-1 gnome-desktop-3.0 >= 3.1.0)
PKG_CHECK_MODULES(INFO_PANEL, $COMMON_MODULES libgtop-2.0)
PKG_CHECK_MODULES(INFO_PANEL, $COMMON_MODULES libgtop-2.0
polkit-gobject-1 >= $POLKIT_REQUIRED_VERSION)
PKG_CHECK_MODULES(KEYBOARD_PANEL, $COMMON_MODULES gconf-2.0 x11)
PKG_CHECK_MODULES(MEDIA_PANEL, $COMMON_MODULES)
PKG_CHECK_MODULES(MOUSE_PANEL, $COMMON_MODULES xi >= 1.2

View file

@ -8,6 +8,7 @@ INCLUDES = \
-DGNOMECC_DATA_DIR="\"$(pkgdatadir)\"" \
-DDATADIR="\"$(datadir)\"" \
-DLIBEXECDIR="\"$(libexecdir)\"" \
-I$(top_srcdir)/libgnome-control-center/ \
$(NULL)
ccpanelsdir = $(PANELS_DIR)

View file

@ -24,6 +24,7 @@
#include "cc-info-panel.h"
#include <sys/vfs.h>
#include <polkit/polkit.h>
#include <glib.h>
#include <glib/gi18n.h>
@ -68,9 +69,10 @@ struct _CcInfoPanelPrivate
GCancellable *cancellable;
GDBusConnection *session_bus;
GDBusProxy *pk_proxy;
GDBusProxy *pk_transaction_proxy;
GSettings *session_settings;
GDBusProxy *pk_proxy;
GDBusProxy *pk_transaction_proxy;
GDBusProxy *hostnamed_proxy;
GSettings *session_settings;
GraphicsData *graphics_data;
};
@ -504,6 +506,12 @@ cc_info_panel_finalize (GObject *object)
g_free (priv->gnome_date);
g_free (priv->gnome_distributor);
if (priv->hostnamed_proxy != NULL)
{
g_object_unref (priv->hostnamed_proxy);
priv->hostnamed_proxy = NULL;
}
G_OBJECT_CLASS (cc_info_panel_parent_class)->finalize (object);
}
@ -591,8 +599,8 @@ format_size_for_display (goffset size)
static void
query_done (GFile *file,
GAsyncResult *res,
CcInfoPanel *self)
GAsyncResult *res,
CcInfoPanel *self)
{
GFileInfo *info;
GError *error = NULL;
@ -1037,6 +1045,118 @@ info_panel_setup_selector (CcInfoPanel *self)
gtk_widget_show_all (GTK_WIDGET (view));
}
static char *
info_panel_get_hostname (CcInfoPanel *self)
{
GVariant *variant;
char *str;
variant = g_dbus_proxy_get_cached_property (self->priv->hostnamed_proxy,
"PrettyHostname");
if (!variant)
{
GError *error = NULL;
GVariant *inner;
/* Work around systemd-hostname not sending us back
* the property value when changing values */
variant = g_dbus_proxy_call_sync (self->priv->hostnamed_proxy,
"org.freedesktop.DBus.Properties.Get",
g_variant_new ("(ss)", "org.freedesktop.hostname1", "PrettyHostname"),
G_DBUS_CALL_FLAGS_NONE,
-1,
NULL,
&error);
if (variant == NULL)
{
g_warning ("Failed to get property 'PrettyHostname': %s", error->message);
g_error_free (error);
return NULL;
}
g_variant_get (variant, "(v)", &inner);
str = g_variant_dup_string (inner, NULL);
g_variant_unref (variant);
}
else
{
str = g_variant_dup_string (variant, NULL);
g_variant_unref (variant);
}
/* Empty strings means that we need to fallback */
if (str != NULL &&
*str == '\0')
{
g_free (str);
str = NULL;
}
return str;
}
static void
text_changed_cb (GtkEntry *entry,
CcInfoPanel *self)
{
const char *text;
GVariant *variant;
GError *error = NULL;
text = gtk_entry_get_text (GTK_ENTRY (entry));
variant = g_dbus_proxy_call_sync (self->priv->hostnamed_proxy,
"SetPrettyHostname",
g_variant_new ("(sb)", text, FALSE),
G_DBUS_CALL_FLAGS_NONE,
-1, NULL, &error);
if (variant == NULL)
{
g_warning ("Could not set PrettyHostname: %s", error->message);
g_error_free (error);
}
else
{
g_variant_unref (variant);
}
}
static void
info_panel_setup_hostname (CcInfoPanel *self,
GPermission *permission)
{
char *str;
GtkWidget *entry;
entry = WID ("name_entry");
gtk_widget_show (WID ("label4"));
gtk_widget_show (entry);
if (g_permission_get_allowed (permission) != FALSE)
gtk_widget_set_sensitive (entry, TRUE);
self->priv->hostnamed_proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
G_DBUS_PROXY_FLAGS_NONE,
NULL,
"org.freedesktop.hostname1",
"/org/freedesktop/hostname1",
"org.freedesktop.hostname1",
NULL,
NULL);
/* This could only happen if the policy file was installed
* but not hostnamed, which points to a system bug */
g_assert (self->priv->hostnamed_proxy);
str = info_panel_get_hostname (self);
gtk_entry_set_text (GTK_ENTRY (entry), str);
g_free (str);
g_signal_connect (G_OBJECT (entry), "changed",
G_CALLBACK (text_changed_cb), self);
}
static void
info_panel_setup_overview (CcInfoPanel *self)
{
@ -1045,6 +1165,12 @@ info_panel_setup_overview (CcInfoPanel *self)
glibtop_mem mem;
const glibtop_sysinfo *info;
char *text;
GPermission *permission;
permission = polkit_permission_new_sync ("org.freedesktop.hostname1.set-static-hostname", NULL, NULL, NULL);
/* Is hostnamed installed? */
if (permission != NULL)
info_panel_setup_hostname (self, permission);
res = load_gnome_version (&self->priv->gnome_version,
&self->priv->gnome_distributor,

View file

@ -165,13 +165,11 @@
</packing>
</child>
<child>
<object class="GtkEntry" id="entry1">
<property name="can_focus">True</property>
<property name="no_show_all">True</property>
<property name="invisible_char">●</property>
<property name="width_chars">12</property>
<property name="invisible_char_set">True</property>
<property name="caps_lock_warning">False</property>
<object class="GtkEntry" id="name_entry">
<property name="visible">False</property>
<property name="xalign">0</property>
<property name="text"></property>
<property name="sensitive">False</property>
</object>
<packing>
<property name="left_attach">1</property>