[gnome-control-center] Add initial implementation of the new Sharing panel
- From: Thomas Wood <thos src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-control-center] Add initial implementation of the new Sharing panel
- Date: Mon, 14 Jan 2013 18:26:00 +0000 (UTC)
commit b30d0133b98aa3288df2a70bf24279569adf2ab8
Author: Thomas Wood <thomas wood intel com>
Date: Mon Jan 14 17:58:44 2013 +0000
Add initial implementation of the new Sharing panel
https://bugzilla.gnome.org/show_bug.cgi?id=687772
configure.ac | 3 +
man/gnome-control-center.xml | 8 +
panels/Makefile.am | 3 +-
panels/sharing/Makefile.am | 52 +
panels/sharing/cc-media-sharing.c | 142 +++
panels/sharing/cc-media-sharing.h | 30 +
panels/sharing/cc-remote-login.c | 148 +++
panels/sharing/cc-remote-login.h | 30 +
panels/sharing/cc-sharing-panel.c | 767 ++++++++++++++
panels/sharing/cc-sharing-panel.h | 73 ++
panels/sharing/file-share-properties.c | 60 ++
panels/sharing/file-share-properties.h | 25 +
panels/sharing/gnome-sharing-panel.desktop.in.in | 13 +
panels/sharing/sharing.gresource.xml | 6 +
panels/sharing/sharing.ui | 1181 ++++++++++++++++++++++
panels/sharing/vino-preferences.c | 113 ++
panels/sharing/vino-preferences.h | 50 +
po/POTFILES.in | 3 +
po/POTFILES.skip | 1 +
shell/Makefile.am | 1 +
shell/cc-panel-loader.c | 2 +
21 files changed, 2710 insertions(+), 1 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index a8803cc..75d87de 100644
--- a/configure.ac
+++ b/configure.ac
@@ -165,6 +165,7 @@ PKG_CHECK_MODULES(USER_ACCOUNTS_PANEL, $COMMON_MODULES
gdk-pixbuf-2.0 >= $GDKPIXBUF_REQUIRED_VERSION
pwquality
accountsservice >= $ACCOUNTSSERVICE_REQUIRED_VERSION)
+PKG_CHECK_MODULES(SHARING_PANEL, $COMMON_MODULES egg-list-box)
PKG_CHECK_MODULES(GVC, gobject-2.0 libpulse libpulse-mainloop-glib)
AM_CONDITIONAL(HAVE_INTROSPECTION, false)
@@ -432,6 +433,8 @@ panels/online-accounts/icons/48x48/Makefile
panels/online-accounts/icons/256x256/Makefile
panels/search/Makefile
panels/search/gnome-search-panel.desktop.in
+panels/sharing/Makefile
+panels/sharing/gnome-sharing-panel.desktop.in
panels/sound/Makefile
panels/sound/gvc/Makefile
panels/sound/data/Makefile
diff --git a/man/gnome-control-center.xml b/man/gnome-control-center.xml
index 321f8e4..d05aac4 100644
--- a/man/gnome-control-center.xml
+++ b/man/gnome-control-center.xml
@@ -235,6 +235,14 @@
</varlistentry>
<varlistentry>
+ <term><option>sharing</option></term>
+
+ <listitem><para>The sharing panel contains
+ settings that control what is shared over the
+ network.</para></listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><option>sound</option></term>
<listitem><para>The sound panel shows
diff --git a/panels/Makefile.am b/panels/Makefile.am
index a805b4c..7becf2c 100644
--- a/panels/Makefile.am
+++ b/panels/Makefile.am
@@ -16,7 +16,8 @@ SUBDIRS= \
user-accounts \
datetime \
search \
- privacy
+ privacy \
+ sharing
if BUILD_WACOM
SUBDIRS += wacom
diff --git a/panels/sharing/Makefile.am b/panels/sharing/Makefile.am
new file mode 100644
index 0000000..464b1a1
--- /dev/null
+++ b/panels/sharing/Makefile.am
@@ -0,0 +1,52 @@
+# This is used in PANEL_CFLAGS
+cappletname = sharing
+
+uidir = $(pkgdatadir)/ui/sharing
+
+AM_CPPFLAGS = \
+ $(PANEL_CFLAGS) \
+ $(SHARING_PANEL_CFLAGS) \
+ $(NULL)
+
+noinst_LTLIBRARIES = libsharing.la
+
+BUILT_SOURCES = \
+ cc-sharing-resources.c \
+ cc-sharing-resources.h \
+ $(NULL)
+
+libsharing_la_SOURCES = \
+ $(BUILT_SOURCES) \
+ cc-sharing-panel.c \
+ cc-sharing-panel.h \
+ cc-remote-login.c \
+ cc-remote-login.h \
+ cc-media-sharing.c \
+ cc-media-sharing.h \
+ vino-preferences.c \
+ vino-preferences.h \
+ file-share-properties.c \
+ file-share-properties.h \
+ $(NULL)
+
+
+resource_files = $(shell glib-compile-resources --generate-dependencies $(srcdir)/sharing.gresource.xml)
+cc-sharing-resources.c: sharing.gresource.xml $(resource_files)
+ $(AM_V_GEN) glib-compile-resources --target=$@ --sourcedir=$(srcdir) --generate-source --c-name cc_sharing $<
+cc-sharing-resources.h: sharing.gresource.xml $(resource_files)
+ $(AM_V_GEN) glib-compile-resources --target=$@ --sourcedir=$(srcdir) --generate-header --c-name cc_sharing $<
+
+
+libsharing_la_LIBADD = $(PANEL_LIBS) $(SHARING_PANEL_LIBS)
+libsharing_la_LDFLAGS = $(PANEL_LDFLAGS)
+
+ INTLTOOL_DESKTOP_RULE@
+
+desktopdir = $(datadir)/applications
+desktop_in_files = gnome-sharing-panel.desktop.in
+desktop_DATA = $(desktop_in_files:.desktop.in=.desktop)
+
+CLEANFILES = $(desktop_in_files) $(desktop_DATA)
+EXTRA_DIST = $(resource_files)
+
+-include $(top_srcdir)/git.mk
diff --git a/panels/sharing/cc-media-sharing.c b/panels/sharing/cc-media-sharing.c
new file mode 100644
index 0000000..03dcc9e
--- /dev/null
+++ b/panels/sharing/cc-media-sharing.c
@@ -0,0 +1,142 @@
+/*
+ * Copyright (C) 2013 Intel, 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.
+ *
+ * Author: Thomas Wood <thomas wood intel com>
+ *
+ */
+
+#include "cc-media-sharing.h"
+
+static GKeyFile*
+cc_media_sharing_open_key_file (void)
+{
+ gchar *path;
+ GKeyFile *file;
+
+ file = g_key_file_new ();
+
+ path = g_build_filename (g_get_user_config_dir (), "rygel.conf", NULL);
+
+ g_key_file_load_from_file (file, path,
+ G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS,
+ NULL);
+
+ g_free (path);
+
+ return file;
+}
+
+void
+cc_media_sharing_get_preferences (gboolean *enabled,
+ gchar ***folders)
+{
+ GKeyFile *file;
+
+ file = cc_media_sharing_open_key_file ();
+
+ if (enabled)
+ *enabled = g_key_file_get_boolean (file, "general", "upnp-enabled", NULL);
+
+ if (folders)
+ {
+ gsize length;
+ gchar **str_list;
+
+ str_list = g_key_file_get_string_list (file, "MediaExport", "uris",
+ &length, NULL);
+
+ *folders = str_list;
+
+ while (str_list && *str_list)
+ {
+ if (g_str_equal (*str_list, "@MUSIC@"))
+ {
+ g_free (*str_list);
+ *str_list = g_strdup (g_get_user_special_dir (G_USER_DIRECTORY_MUSIC));
+ }
+
+ if (g_str_equal (*str_list, "@VIDEOS@"))
+ {
+ g_free (*str_list);
+ *str_list = g_strdup (g_get_user_special_dir (G_USER_DIRECTORY_VIDEOS));
+ }
+
+ if (g_str_equal (*str_list, "@PICTURES@"))
+ {
+ g_free (*str_list);
+ *str_list = g_strdup (g_get_user_special_dir (G_USER_DIRECTORY_PICTURES));
+ }
+ str_list++;
+ }
+ }
+
+ g_key_file_free (file);
+}
+
+void
+cc_media_sharing_set_preferences (gboolean enabled,
+ gchar **folders)
+{
+ GKeyFile *file;
+ gchar **str_list;
+ gchar *path;
+ gsize length;
+ gchar *data;
+
+ file = cc_media_sharing_open_key_file ();
+
+ g_key_file_set_boolean (file, "general", "upnp-enabled", enabled);
+
+ str_list = folders;
+ length = 0;
+
+ while (str_list && *str_list)
+ {
+ if (g_str_equal (*str_list, g_get_user_special_dir (G_USER_DIRECTORY_MUSIC)))
+ {
+ g_free (*str_list);
+ *str_list = g_strdup ("@MUSIC@");
+ }
+
+ if (g_str_equal (*str_list, g_get_user_special_dir (G_USER_DIRECTORY_VIDEOS)))
+ {
+ g_free (*str_list);
+ *str_list = g_strdup ("@VIDEOS@");
+ }
+
+ if (g_str_equal (*str_list, g_get_user_special_dir (G_USER_DIRECTORY_PICTURES)))
+ {
+ g_free (*str_list);
+ *str_list = g_strdup ("@PICTURES@");
+ }
+
+ str_list++;
+ length++;
+ }
+
+ g_key_file_set_string_list (file, "MediaExport", "uris", (const gchar**) folders, length);
+
+ data = g_key_file_to_data (file, NULL, NULL);
+
+ path = g_build_filename (g_get_user_config_dir (), "rygel.conf", NULL);
+
+ g_file_set_contents (path, data, -1, NULL);
+
+ g_free (path);
+
+ g_key_file_free (file);
+}
diff --git a/panels/sharing/cc-media-sharing.h b/panels/sharing/cc-media-sharing.h
new file mode 100644
index 0000000..4a81c5f
--- /dev/null
+++ b/panels/sharing/cc-media-sharing.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2013 Intel, 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.
+ *
+ * Author: Thomas Wood <thomas wood intel com>
+ *
+ */
+
+#ifndef __CC_MEDIA_SHARING_H__
+#define __CC_MEDIA_SHARING_H__
+
+#include <glib.h>
+
+void cc_media_sharing_get_preferences (gboolean *enabled, gchar ***folders);
+void cc_media_sharing_set_preferences (gboolean enabled, gchar **folders);
+
+#endif /* __CC_MEDIA_SHARING_H__ */
diff --git a/panels/sharing/cc-remote-login.c b/panels/sharing/cc-remote-login.c
new file mode 100644
index 0000000..0d04604
--- /dev/null
+++ b/panels/sharing/cc-remote-login.c
@@ -0,0 +1,148 @@
+/*
+ * Copyright (C) 2013 Intel, 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.
+ *
+ * Author: Thomas Wood <thomas wood intel com>
+ *
+ */
+#include "cc-remote-login.h"
+#include <gio/gio.h>
+
+#define SSHD_SERVICE "sshd.service"
+
+static void
+active_state_ready_callback (GObject *source_object,
+ GAsyncResult *result,
+ gpointer gtkswitch)
+{
+ GVariant *active_variant, *tmp_variant;
+ const gchar *active_state;
+ gboolean active;
+ GError *error = NULL;
+
+ active_variant = g_dbus_connection_call_finish (G_DBUS_CONNECTION (source_object),
+ result, &error);
+
+ if (!active_variant)
+ {
+ g_warning ("Error getting remote login state: %s", error->message);
+ g_clear_error (&error);
+ return;
+ }
+
+ g_variant_get (active_variant, "(v)", &tmp_variant);
+ active_state = g_variant_get_string (tmp_variant, NULL);
+
+ active = g_str_equal (active_state, "active");
+
+ g_variant_unref (active_variant);
+ g_variant_unref (tmp_variant);
+
+ /* set the switch to the correct state */
+ gtk_switch_set_active (gtkswitch, active);
+
+ /* TODO: enable the switch when cc_remote_login_set_enabled is implemented */
+ /* gtk_widget_set_sensitive (gtkswitch, TRUE); */
+}
+
+static void
+path_ready_callback (GObject *source_object,
+ GAsyncResult *result,
+ gpointer gtkswitch)
+{
+ GVariant *path_variant;
+ gchar *object_path;
+ GError *error = NULL;
+
+ path_variant = g_dbus_connection_call_finish (G_DBUS_CONNECTION (source_object),
+ result, &error);
+
+ if (!path_variant)
+ {
+ g_warning ("Error getting remote login state: %s", error->message);
+ g_clear_error (&error);
+ return;
+ }
+
+ g_variant_get (path_variant, "(o)", &object_path);
+
+ g_dbus_connection_call (G_DBUS_CONNECTION (source_object),
+ "org.freedesktop.systemd1",
+ object_path,
+ "org.freedesktop.DBus.Properties",
+ "Get",
+ g_variant_new ("(ss)",
+ "org.freedesktop.systemd1.Unit",
+ "ActiveState"),
+ (GVariantType*) "(v)",
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ active_state_ready_callback,
+ gtkswitch);
+
+
+ g_variant_unref (path_variant);
+
+}
+
+static void
+bus_ready_callback (GObject *source_object,
+ GAsyncResult *result,
+ gpointer gtkswitch)
+{
+ GDBusConnection *connection;
+ GError *error = NULL;
+
+ connection = g_bus_get_finish (result, &error);
+
+ if (!connection)
+ {
+ g_warning ("Error getting remote login state: %s", error->message);
+ g_clear_error (&error);
+ return;
+ }
+
+ g_dbus_connection_call (connection,
+ "org.freedesktop.systemd1",
+ "/org/freedesktop/systemd1",
+ "org.freedesktop.systemd1.Manager",
+ "GetUnit",
+ g_variant_new ("(s)", SSHD_SERVICE),
+ (GVariantType*) "(o)",
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ path_ready_callback,
+ gtkswitch);
+}
+
+
+void
+cc_remote_login_get_enabled (GtkSwitch *gtkswitch)
+{
+ /* disable the switch until the current state is known */
+ gtk_widget_set_sensitive (gtkswitch, FALSE);
+
+ g_bus_get (G_BUS_TYPE_SYSTEM, NULL, bus_ready_callback, gtkswitch);
+}
+
+gboolean
+cc_remote_login_set_enabled (gboolean enabled)
+{
+ /* not implemented yet */
+ return FALSE;
+}
diff --git a/panels/sharing/cc-remote-login.h b/panels/sharing/cc-remote-login.h
new file mode 100644
index 0000000..fe6b6d2
--- /dev/null
+++ b/panels/sharing/cc-remote-login.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2013 Intel, 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.
+ *
+ * Author: Thomas Wood <thomas wood intel com>
+ *
+ */
+
+#ifndef __CC_REMOTE_LOGIN_H__
+#define __CC_REMOTE_LOGIN_H__
+
+#include <gtk/gtk.h>
+
+void cc_remote_login_get_enabled (GtkSwitch *gtkswitch);
+gboolean cc_remote_login_set_enabled (gboolean enabled);
+
+#endif /* __CC_REMOTE_LOGIN_H__ **/
diff --git a/panels/sharing/cc-sharing-panel.c b/panels/sharing/cc-sharing-panel.c
new file mode 100644
index 0000000..5c7bfe5
--- /dev/null
+++ b/panels/sharing/cc-sharing-panel.c
@@ -0,0 +1,767 @@
+/*
+ * Copyright (C) 2013 Intel, 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.
+ *
+ * Author: Thomas Wood <thomas wood intel com>
+ *
+ */
+
+#include "cc-sharing-panel.h"
+#include "egg-list-box/egg-list-box.h"
+#include "shell/cc-hostname-entry.h"
+
+#include "cc-sharing-resources.h"
+#include "vino-preferences.h"
+#include "cc-remote-login.h"
+#include "file-share-properties.h"
+#include "cc-media-sharing.h"
+
+#include <glib/gi18n.h>
+
+CC_PANEL_REGISTER (CcSharingPanel, cc_sharing_panel)
+
+#define PANEL_PRIVATE(o) \
+ (G_TYPE_INSTANCE_GET_PRIVATE ((o), CC_TYPE_SHARING_PANEL, CcSharingPanelPrivate))
+
+
+static GtkWidget *
+_gtk_builder_get_widget (GtkBuilder *builder,
+ const gchar *name)
+{
+ GtkWidget *w;
+
+ w = (GtkWidget*) gtk_builder_get_object (builder, name);
+
+ g_assert (w != NULL);
+
+ return w;
+}
+
+#define WID(y) _gtk_builder_get_widget (priv->builder, y)
+
+#define VINO_SCHEMA_ID "org.gnome.Vino"
+#define FILE_SHARING_SCHEMA_ID "org.gnome.desktop.file-sharing"
+
+struct _CcSharingPanelPrivate
+{
+ GtkBuilder *builder;
+
+ GtkWidget *hostname_entry;
+
+ GtkWidget *bluetooth_sharing_dialog;
+ GtkWidget *media_sharing_dialog;
+ GtkWidget *personal_file_sharing_dialog;
+ GtkWidget *remote_login_dialog;
+ GtkWidget *screen_sharing_dialog;
+};
+
+static void
+cc_sharing_panel_dispose (GObject *object)
+{
+ CcSharingPanelPrivate *priv = CC_SHARING_PANEL (object)->priv;
+
+ g_clear_object (&priv->builder);
+
+ if (priv->bluetooth_sharing_dialog)
+ {
+ gtk_widget_destroy (priv->bluetooth_sharing_dialog);
+ priv->bluetooth_sharing_dialog = NULL;
+ }
+
+ if (priv->media_sharing_dialog)
+ {
+ gtk_widget_destroy (priv->media_sharing_dialog);
+ priv->media_sharing_dialog = NULL;
+ }
+
+ if (priv->personal_file_sharing_dialog)
+ {
+ gtk_widget_destroy (priv->personal_file_sharing_dialog);
+ priv->personal_file_sharing_dialog = NULL;
+ }
+
+ if (priv->remote_login_dialog)
+ {
+ gtk_widget_destroy (priv->remote_login_dialog);
+ priv->remote_login_dialog = NULL;
+ }
+
+ if (priv->screen_sharing_dialog)
+ {
+ gtk_widget_destroy (priv->screen_sharing_dialog);
+ priv->screen_sharing_dialog = NULL;
+ }
+
+ G_OBJECT_CLASS (cc_sharing_panel_parent_class)->dispose (object);
+}
+
+static void
+cc_sharing_panel_class_init (CcSharingPanelClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ g_type_class_add_private (klass, sizeof (CcSharingPanelPrivate));
+
+ object_class->dispose = cc_sharing_panel_dispose;
+}
+
+static void
+cc_sharing_panel_run_dialog (CcSharingPanel *self,
+ const gchar *dialog_name)
+{
+ CcSharingPanelPrivate *priv = self->priv;
+ GtkWidget *dialog, *parent;
+
+ dialog = WID (dialog_name);
+
+ parent = cc_shell_get_toplevel (cc_panel_get_shell (CC_PANEL (self)));
+
+ gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (parent));
+ gtk_dialog_run (GTK_DIALOG (dialog));
+}
+
+static void
+cc_sharing_panel_main_list_box_child_activated (EggListBox *listbox,
+ GtkWidget *widget,
+ CcSharingPanel *self)
+{
+ gchar *widget_name, *found;
+
+ widget_name = g_strdup (gtk_buildable_get_name (GTK_BUILDABLE (widget)));
+
+ if (!widget_name)
+ return;
+
+ egg_list_box_select_child (listbox, NULL);
+
+ /* replace "button" with "dialog" */
+ found = g_strrstr (widget_name, "button");
+
+ if (!found)
+ goto out;
+
+ memcpy (found, "dialog", 6);
+
+ cc_sharing_panel_run_dialog (self, widget_name);
+
+out:
+ g_free (widget_name);
+}
+
+static void
+cc_sharing_panel_main_list_box_update_separator (GtkWidget **separator,
+ GtkWidget *child,
+ GtkWidget *before,
+ gpointer user_data)
+{
+ if (before == NULL)
+ {
+ g_clear_object (separator);
+ return;
+ }
+
+ if (*separator != NULL)
+ return;
+
+ *separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
+ g_object_ref_sink (*separator);
+}
+
+static gboolean
+cc_sharing_panel_switch_to_label_transform_func (GBinding *binding,
+ const GValue *source_value,
+ GValue *target_value,
+ gpointer user_data)
+{
+ gboolean active;
+
+ if (!G_VALUE_HOLDS_BOOLEAN (source_value))
+ return FALSE;
+
+ if (!G_VALUE_HOLDS_STRING (target_value))
+ return FALSE;
+
+ active = g_value_get_boolean (source_value);
+
+ if (active)
+ g_value_set_string (target_value, C_("service is enabled", "On"));
+ else
+ g_value_set_string (target_value, C_("service is disabled", "Off"));
+
+ return TRUE;
+}
+
+static void
+cc_sharing_panel_bind_switch_to_label (GtkWidget *gtkswitch,
+ GtkWidget *label)
+{
+ g_object_bind_property_full (gtkswitch, "active", label, "label",
+ G_BINDING_SYNC_CREATE,
+ cc_sharing_panel_switch_to_label_transform_func,
+ NULL, NULL, NULL);
+}
+
+static void
+cc_sharing_panel_bind_switch_to_widgets (GtkWidget *gtkswitch,
+ GtkWidget *first_widget,
+ ...)
+{
+ va_list w;
+ GtkWidget *widget;
+
+ va_start (w, first_widget);
+
+ g_object_bind_property (gtkswitch, "active", first_widget,
+ "sensitive", G_BINDING_SYNC_CREATE);
+
+ while ((widget = va_arg (w, GtkWidget*)))
+ {
+ g_object_bind_property (gtkswitch, "active", widget,
+ "sensitive", G_BINDING_SYNC_CREATE);
+ }
+
+ va_end (w);
+}
+
+static gboolean
+bluetooth_get_accept_files (GValue *value,
+ GVariant *variant,
+ gpointer user_data)
+{
+ gboolean bonded;
+
+ bonded = g_str_equal (g_variant_get_string (variant, NULL), "bonded");
+
+ g_value_set_boolean (value, bonded);
+
+ return TRUE;
+}
+
+static GVariant *
+bluetooth_set_accept_files (const GValue *value,
+ const GVariantType *type,
+ gpointer user_data)
+{
+ if (g_value_get_boolean (value))
+ return g_variant_new_string ("bonded");
+ else
+ return g_variant_new_string ("always");
+}
+
+static void
+cc_sharing_panel_setup_bluetooth_sharing_dialog (CcSharingPanel *self)
+{
+ CcSharingPanelPrivate *priv = self->priv;
+ GSettings *settings;
+
+ cc_sharing_panel_bind_switch_to_label (WID ("share-public-folder-switch"),
+ WID ("bluetooth-sharing-status-label"));
+
+ cc_sharing_panel_bind_switch_to_widgets (WID ("share-public-folder-switch"),
+ WID ("only-share-trusted-devices-switch"),
+ WID ("only-share-trusted-devices-label"),
+ NULL);
+
+ cc_sharing_panel_bind_switch_to_widgets (WID ("save-received-files-to-downloads-switch"),
+ WID ("receive-files-grid"),
+ NULL);
+
+ settings = g_settings_new (FILE_SHARING_SCHEMA_ID);
+ g_settings_bind (settings, "bluetooth-enabled",
+ WID ("share-public-folder-switch"), "active",
+ G_SETTINGS_BIND_DEFAULT);
+ g_settings_bind (settings, "bluetooth-require-pairing",
+ WID ("only-share-trusted-devices-switch"), "active",
+ G_SETTINGS_BIND_DEFAULT);
+ g_settings_bind (settings, "bluetooth-obexpush-enabled",
+ WID ("save-received-files-to-downloads-switch"), "active",
+ G_SETTINGS_BIND_DEFAULT);
+
+ g_settings_bind_with_mapping (settings, "bluetooth-accept-files",
+ WID ("only-receive-from-trusted-devices-switch"),
+ "active",
+ G_SETTINGS_BIND_DEFAULT,
+ bluetooth_get_accept_files,
+ bluetooth_set_accept_files, NULL, NULL);
+
+}
+
+static void
+cc_sharing_panel_add_folder (GtkWidget *button,
+ CcSharingPanel *self)
+{
+ CcSharingPanelPrivate *priv = self->priv;
+ GtkWidget *dialog;
+ GtkListStore *store;
+ gchar *folder;
+
+ dialog = gtk_file_chooser_dialog_new (_("Choose a Folder"),
+ GTK_WINDOW (gtk_widget_get_toplevel (button)),
+ GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+ GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
+ NULL);
+ gtk_dialog_run (GTK_DIALOG (dialog));
+
+ gtk_widget_hide (dialog);
+
+ store = (GtkListStore *) gtk_builder_get_object (priv->builder,
+ "shared-folders-liststore");
+
+ folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog));
+
+ if (folder && !g_str_equal (folder, ""))
+ gtk_list_store_insert_with_values (store, NULL, -1, 0, folder, -1);
+
+ g_free (folder);
+
+ gtk_widget_destroy (dialog);
+}
+
+static void
+cc_sharing_panel_remove_folder (GtkButton *button,
+ CcSharingPanel *self)
+{
+ CcSharingPanelPrivate *priv = self->priv;
+ GtkTreeSelection *selection;
+ GtkTreeIter iter;
+ GtkTreeModel *model;
+
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (WID ("shared-folders-treeview")));
+
+ gtk_tree_selection_get_selected (selection, &model, &iter);
+
+ gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
+}
+
+static void
+cc_sharing_panel_selection_changed (GtkTreeSelection *selection,
+ CcSharingPanel *self)
+{
+ CcSharingPanelPrivate *priv = self->priv;
+
+ if (gtk_tree_selection_count_selected_rows (selection) > 0)
+ gtk_widget_set_sensitive (WID ("remove-button"), TRUE);
+ else
+ gtk_widget_set_sensitive (WID ("remove-button"), FALSE);
+}
+
+static void
+cc_sharing_panel_media_sharing_dialog_response (GtkDialog *dialog,
+ gint reponse_id,
+ CcSharingPanel *self)
+{
+ CcSharingPanelPrivate *priv = self->priv;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ gboolean valid;
+ GPtrArray *folders;
+
+ model = (GtkTreeModel *) gtk_builder_get_object (priv->builder,
+ "shared-folders-liststore");
+
+ valid = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (model), &iter);
+ folders = g_ptr_array_new_with_free_func (g_free);
+
+ while (valid)
+ {
+ gchar *folder;
+
+ gtk_tree_model_get (model, &iter, 0, &folder, -1);
+
+ g_ptr_array_add (folders, folder);
+
+ valid = gtk_tree_model_iter_next (model, &iter);
+ }
+
+ g_ptr_array_add (folders, NULL);
+
+ cc_media_sharing_set_preferences (gtk_switch_get_active (GTK_SWITCH (WID ("share-media-switch"))),
+ (gchar **) folders->pdata);
+
+
+ g_ptr_array_free (folders, TRUE);
+}
+
+static void
+cc_sharing_panel_setup_media_sharing_dialog (CcSharingPanel *self)
+{
+ CcSharingPanelPrivate *priv = self->priv;
+ gchar **folders, **list;
+ gboolean enabled;
+ GtkListStore *store;
+
+ cc_sharing_panel_bind_switch_to_label (WID ("share-media-switch"),
+ WID ("media-sharing-status-label"));
+
+
+ cc_sharing_panel_bind_switch_to_widgets (WID ("share-media-switch"),
+ WID ("shared-folders-box"),
+ NULL);
+
+ g_signal_connect (WID ("add-button"), "clicked",
+ G_CALLBACK (cc_sharing_panel_add_folder), self);
+ g_signal_connect (WID ("remove-button"), "clicked",
+ G_CALLBACK (cc_sharing_panel_remove_folder), self);
+
+ g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW (WID ("shared-folders-treeview"))),
+ "changed", G_CALLBACK (cc_sharing_panel_selection_changed), self);
+
+ g_signal_connect (WID ("media-sharing-dialog"), "response",
+ G_CALLBACK (cc_sharing_panel_media_sharing_dialog_response),
+ self);
+
+ cc_media_sharing_get_preferences (&enabled, &folders);
+
+ gtk_switch_set_active (GTK_SWITCH (WID ("share-media-switch")), enabled);
+
+ list = folders;
+ store = (GtkListStore *) gtk_builder_get_object (priv->builder,
+ "shared-folders-liststore");
+ while (list && *list)
+ {
+ gtk_list_store_insert_with_values (store, NULL, -1, 0, *list, -1);
+ list++;
+ }
+
+ g_strfreev (folders);
+}
+
+static gboolean
+cc_sharing_panel_label_activate_link (GtkLabel *label,
+ gchar *uri,
+ GtkMenu *menu)
+{
+ gtk_menu_popup (menu, NULL, NULL, NULL, NULL, 0, gtk_get_current_event_time ());
+
+ g_object_set_data_full (G_OBJECT (menu), "uri-text", g_strdup (uri), g_free);
+
+ return TRUE;
+}
+
+static void
+copy_uri_to_clipboard (GtkMenuItem *item,
+ GtkMenu *menu)
+{
+ GtkClipboard *clipboard;
+ const gchar *text;
+
+ text = g_object_get_data (G_OBJECT (menu), "uri-text");
+
+ clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
+ gtk_clipboard_set_text (clipboard, text, -1);
+}
+
+static void
+cc_sharing_panel_setup_label_with_hostname (CcSharingPanel *self,
+ GtkWidget *label)
+{
+ gchar *text;
+ gchar *hostname;
+ GtkWidget *menu;
+ GtkWidget *menu_item;
+
+ /* create the menu */
+ menu = gtk_menu_new ();
+
+ menu_item = gtk_menu_item_new_with_label (_("Copy"));
+ gtk_widget_show (menu_item);
+
+ g_signal_connect (menu_item, "activate", G_CALLBACK (copy_uri_to_clipboard),
+ menu);
+
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
+
+ /* set the hostname */
+ hostname = cc_hostname_entry_get_hostname (CC_HOSTNAME_ENTRY (self->priv->hostname_entry));
+
+ text = g_strdup_printf (gtk_label_get_label (GTK_LABEL (label)), hostname,
+ hostname);
+
+ gtk_label_set_label (GTK_LABEL (label), text);
+
+ /* show the menu when the link is activated */
+ g_signal_connect (label, "activate-link",
+ G_CALLBACK (cc_sharing_panel_label_activate_link), menu);
+
+ /* destroy the menu when the label is destroyed */
+ g_signal_connect_swapped (label, "destroy", G_CALLBACK (gtk_widget_destroy),
+ menu);
+
+ g_free (hostname);
+ g_free (text);
+}
+
+static gboolean
+file_sharing_get_require_password (GValue *value,
+ GVariant *variant,
+ gpointer user_data)
+{
+ if (g_str_equal (g_variant_get_string (variant, NULL), "always"))
+ g_value_set_boolean (value, TRUE);
+ else
+ g_value_set_boolean (value, FALSE);
+
+ return TRUE;
+}
+
+static GVariant *
+file_sharing_set_require_password (const GValue *value,
+ const GVariantType *type,
+ gpointer user_data)
+{
+ if (g_value_get_boolean (value))
+ return g_variant_new_string ("always");
+ else
+ return g_variant_new_string ("never");
+}
+
+static void
+file_sharing_password_changed (GtkEntry *entry)
+{
+ file_share_write_out_password (gtk_entry_get_text (entry));
+}
+
+static void
+cc_sharing_panel_setup_personal_file_sharing_dialog (CcSharingPanel *self)
+{
+ CcSharingPanelPrivate *priv = self->priv;
+ GSettings *settings;
+
+
+ cc_sharing_panel_bind_switch_to_label (WID ("share-public-folder-on-network-switch"),
+ WID ("personal-file-sharing-status-label"));
+
+ cc_sharing_panel_bind_switch_to_widgets (WID ("share-public-folder-on-network-switch"),
+ WID ("require-password-grid"),
+ NULL);
+
+ cc_sharing_panel_bind_switch_to_widgets (WID ("personal-file-sharing-require-password-switch"),
+ WID ("personal-file-sharing-password-entry"),
+ WID ("personal-file-sharing-password-label"),
+ NULL);
+
+ cc_sharing_panel_setup_label_with_hostname (self,
+ WID ("personal-file-sharing-label"));
+
+ /* the password cannot be read, so just make sure the entry is not empty */
+ gtk_entry_set_text (GTK_ENTRY (WID ("personal-file-sharing-password-entry")),
+ "password");
+
+ settings = g_settings_new (FILE_SHARING_SCHEMA_ID);
+ g_settings_bind (settings, "enabled",
+ WID ("share-public-folder-on-network-switch"), "active",
+ G_SETTINGS_BIND_DEFAULT);
+
+ g_settings_bind_with_mapping (settings, "require-password",
+ WID ("personal-file-sharing-require-password-switch"),
+ "active",
+ G_SETTINGS_BIND_DEFAULT,
+ file_sharing_get_require_password,
+ file_sharing_set_require_password, NULL, NULL);
+
+ g_signal_connect (WID ("personal-file-sharing-password-entry"),
+ "notify::text", G_CALLBACK (file_sharing_password_changed),
+ NULL);
+}
+
+static void
+remote_login_switch_activate (GtkSwitch *remote_login_switch,
+ CcSharingPanel *self)
+{
+ cc_remote_login_set_enabled (gtk_switch_get_active (remote_login_switch));
+}
+
+static void
+cc_sharing_panel_setup_remote_login_dialog (CcSharingPanel *self)
+{
+ CcSharingPanelPrivate *priv = self->priv;
+
+ cc_sharing_panel_bind_switch_to_label (WID ("remote-login-switch"),
+ WID ("remote-login-status-label"));
+
+ cc_sharing_panel_setup_label_with_hostname (self, WID ("remote-login-label"));
+
+ g_signal_connect (WID ("remote-login-switch"), "notify::active",
+ G_CALLBACK (remote_login_switch_activate), self);
+ gtk_widget_set_sensitive (WID ("remote-login-switch"), FALSE);
+
+ cc_remote_login_get_enabled (GTK_SWITCH (WID ("remote-login-switch")));
+
+}
+
+static gboolean
+cc_sharing_panel_check_schema_available (CcSharingPanel *self,
+ const gchar *schema_id)
+{
+ const gchar * const* schema_list;
+
+ if (schema_id == NULL)
+ return FALSE;
+
+ schema_list = g_settings_list_schemas ();
+
+ while (*schema_list)
+ {
+ if (g_str_equal (*schema_list, schema_id))
+ return TRUE;
+
+ schema_list++;
+ }
+
+ return FALSE;
+}
+
+static void
+cc_sharing_panel_setup_screen_sharing_dialog (CcSharingPanel *self)
+{
+ CcSharingPanelPrivate *priv = self->priv;
+ GSettings *settings;
+
+ cc_sharing_panel_bind_switch_to_label (WID ("remote-view-switch"),
+ WID ("screen-sharing-status-label"));
+
+ cc_sharing_panel_bind_switch_to_widgets (WID ("remote-view-switch"),
+ WID ("remote-control-switch"),
+ WID ("remote-control-label"),
+ WID ("remote-control-grid"),
+ NULL);
+
+ cc_sharing_panel_bind_switch_to_widgets (WID ("remote-control-switch"),
+ WID ("approve-all-connections-switch"),
+ WID ("remote-control-require-password-switch"),
+ WID ("remote-control-require-password-label"),
+ WID ("approve-all-connections-label"),
+ WID ("password-box"),
+ NULL);
+
+ cc_sharing_panel_bind_switch_to_widgets (WID ("remote-control-require-password-switch"),
+ WID ("remote-control-password-entry"),
+ WID ("remote-control-password-label"),
+ NULL);
+
+ cc_sharing_panel_setup_label_with_hostname (self,
+ WID ("screen-sharing-label"));
+
+ /* settings bindings */
+ settings = g_settings_new (VINO_SCHEMA_ID);
+ g_settings_bind (settings, "enabled", WID ("remote-view-switch"), "active",
+ G_SETTINGS_BIND_DEFAULT);
+ g_settings_bind (settings, "view-only", WID ("remote-control-switch"),
+ "active",
+ G_SETTINGS_BIND_DEFAULT | G_SETTINGS_BIND_INVERT_BOOLEAN);
+ g_settings_bind (settings, "prompt-enabled",
+ WID ("approve-all-connections-switch"), "active",
+ G_SETTINGS_BIND_DEFAULT);
+ g_settings_bind_with_mapping (settings, "authentication-methods",
+ WID ("remote-control-require-password-switch"),
+ "active",
+ G_SETTINGS_BIND_DEFAULT,
+ vino_get_authtype, vino_set_authtype, NULL, NULL);
+
+ g_settings_bind_with_mapping (settings, "vnc-password",
+ WID ("remote-control-password-entry"),
+ "text",
+ G_SETTINGS_BIND_DEFAULT,
+ vino_get_password, vino_set_password, NULL, NULL);
+}
+
+static void
+cc_sharing_panel_init (CcSharingPanel *self)
+{
+ CcSharingPanelPrivate *priv = self->priv = PANEL_PRIVATE (self);
+ GError *err = NULL;
+ gchar *objects[] = {
+ "sharing-panel",
+ "bluetooth-sharing-dialog",
+ "shared-folders-liststore",
+ "media-sharing-dialog",
+ "personal-file-sharing-dialog",
+ "remote-login-dialog",
+ "screen-sharing-dialog",
+ NULL };
+
+ g_resources_register (cc_sharing_get_resource ());
+
+ priv->builder = gtk_builder_new ();
+
+ gtk_builder_add_objects_from_resource (priv->builder,
+ "/org/gnome/control-center/sharing/sharing.ui",
+ objects, &err);
+
+ if (err)
+ g_error ("Error loading CcSharingPanel user interface: %s", err->message);
+
+ priv->hostname_entry = WID ("hostname-entry");
+
+ gtk_container_add (GTK_CONTAINER (self), WID ("sharing-panel"));
+
+ g_signal_connect (WID ("main-list-box"), "child-activated",
+ G_CALLBACK (cc_sharing_panel_main_list_box_child_activated), self);
+
+ priv->bluetooth_sharing_dialog = WID ("bluetooth-sharing-dialog");
+ priv->media_sharing_dialog = WID ("media-sharing-dialog");
+ priv->personal_file_sharing_dialog = WID ("personal-file-sharing-dialog");
+ priv->remote_login_dialog = WID ("remote-login-dialog");
+ priv->screen_sharing_dialog = WID ("screen-sharing-dialog");
+
+ g_signal_connect (priv->bluetooth_sharing_dialog, "response",
+ G_CALLBACK (gtk_widget_hide), NULL);
+ g_signal_connect (priv->media_sharing_dialog, "response",
+ G_CALLBACK (gtk_widget_hide), NULL);
+ g_signal_connect (priv->personal_file_sharing_dialog, "response",
+ G_CALLBACK (gtk_widget_hide), NULL);
+ g_signal_connect (priv->remote_login_dialog, "response",
+ G_CALLBACK (gtk_widget_hide), NULL);
+ g_signal_connect (priv->screen_sharing_dialog, "response",
+ G_CALLBACK (gtk_widget_hide), NULL);
+
+ egg_list_box_set_activate_on_single_click (EGG_LIST_BOX (WID ("main-list-box")),
+ TRUE);
+ egg_list_box_set_separator_funcs (EGG_LIST_BOX (WID ("main-list-box")),
+ cc_sharing_panel_main_list_box_update_separator,
+ NULL, NULL);
+
+ /* bluetooth */
+ if (cc_sharing_panel_check_schema_available (self, FILE_SHARING_SCHEMA_ID))
+ cc_sharing_panel_setup_bluetooth_sharing_dialog (self);
+ else
+ gtk_widget_hide (WID ("bluetooth-sharing-button"));
+
+ /* media sharing */
+ cc_sharing_panel_setup_media_sharing_dialog (self);
+
+ /* personal file sharing */
+ if (cc_sharing_panel_check_schema_available (self, FILE_SHARING_SCHEMA_ID))
+ cc_sharing_panel_setup_personal_file_sharing_dialog (self);
+ else
+ gtk_widget_hide (WID ("personal-file-sharing-button"));
+
+ /* remote login */
+ cc_sharing_panel_setup_remote_login_dialog (self);
+
+ /* screen sharing */
+ if (cc_sharing_panel_check_schema_available (self, VINO_SCHEMA_ID))
+ cc_sharing_panel_setup_screen_sharing_dialog (self);
+ else
+ gtk_widget_hide (WID ("screen-sharing-button"));
+}
+
+CcSharingPanel *
+cc_sharing_panel_new (void)
+{
+ return g_object_new (CC_TYPE_SHARING_PANEL, NULL);
+}
diff --git a/panels/sharing/cc-sharing-panel.h b/panels/sharing/cc-sharing-panel.h
new file mode 100644
index 0000000..9004fd8
--- /dev/null
+++ b/panels/sharing/cc-sharing-panel.h
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2013 Intel, 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.
+ *
+ * Author: Thomas Wood <thomas wood intel com>
+ *
+ */
+
+#ifndef __CC_SHARING_PANEL_H__
+#define __CC_SHARING_PANEL_H__
+
+#include <shell/cc-shell.h>
+
+G_BEGIN_DECLS
+
+#define CC_TYPE_SHARING_PANEL cc_sharing_panel_get_type()
+
+#define CC_SHARING_PANEL(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+ CC_TYPE_SHARING_PANEL, CcSharingPanel))
+
+#define CC_SHARING_PANEL_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST ((klass), \
+ CC_TYPE_SHARING_PANEL, CcSharingPanelClass))
+
+#define CC_SHARING_IS_PANEL(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+ CC_TYPE_SHARING_PANEL))
+
+#define CC_SHARING_IS_PANEL_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE ((klass), \
+ CC_TYPE_SHARING_PANEL))
+
+#define CC_SHARING_PANEL_GET_CLASS(obj) \
+ (G_TYPE_INSTANCE_GET_CLASS ((obj), \
+ CC_TYPE_SHARING_PANEL, CcSharingPanelClass))
+
+typedef struct _CcSharingPanel CcSharingPanel;
+typedef struct _CcSharingPanelClass CcSharingPanelClass;
+typedef struct _CcSharingPanelPrivate CcSharingPanelPrivate;
+
+struct _CcSharingPanel
+{
+ CcPanel parent;
+
+ CcSharingPanelPrivate *priv;
+};
+
+struct _CcSharingPanelClass
+{
+ CcPanelClass parent_class;
+};
+
+GType cc_sharing_panel_get_type (void) G_GNUC_CONST;
+
+CcSharingPanel *cc_sharing_panel_new (void);
+
+G_END_DECLS
+
+#endif /* __CC_SHARING_PANEL_H__ */
diff --git a/panels/sharing/file-share-properties.c b/panels/sharing/file-share-properties.c
new file mode 100644
index 0000000..1be0d7a
--- /dev/null
+++ b/panels/sharing/file-share-properties.c
@@ -0,0 +1,60 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
+
+/*
+ * Copyright (C) 2004 Red Hat, Inc.
+ *
+ * Nautilus 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.
+ *
+ * Nautilus 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Authors: Alexander Larsson <alexl redhat com>
+ *
+ */
+
+#include "file-share-properties.h"
+
+#include <string.h>
+#include <stdio.h>
+
+#include <glib.h>
+
+
+#define REALM "Please log in as the user guest"
+#define USER "guest"
+
+void
+file_share_write_out_password (const char *password)
+{
+ char *to_hash;
+ char *ascii_digest;
+ char *line;
+ char *filename;
+ FILE *file;
+
+ to_hash = g_strdup_printf ("%s:%s:%s", USER, REALM, password);
+ ascii_digest = g_compute_checksum_for_string (G_CHECKSUM_MD5, to_hash, strlen (to_hash));
+ g_free (to_hash);
+ line = g_strdup_printf ("%s:%s:%s\n", USER, REALM, ascii_digest);
+ g_free (ascii_digest);
+
+ filename = g_build_filename (g_get_user_config_dir (), "user-share", "passwd", NULL);
+
+ file = fopen (filename, "w");
+ if (file != NULL) {
+ fwrite (line, strlen (line), 1, file);
+ fclose (file);
+ }
+
+ g_free (filename);
+ g_free (line);
+}
diff --git a/panels/sharing/file-share-properties.h b/panels/sharing/file-share-properties.h
new file mode 100644
index 0000000..d82455c
--- /dev/null
+++ b/panels/sharing/file-share-properties.h
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2013 Intel, 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 __FILE_SHARE_PROPERTIES_H__
+#define __FILE_SHARE_PROPERTIES_H__
+
+void file_share_write_out_password (const char *password);
+
+#endif /* __FILE_SHARE_PROPERTIES_H__ */
diff --git a/panels/sharing/gnome-sharing-panel.desktop.in.in b/panels/sharing/gnome-sharing-panel.desktop.in.in
new file mode 100644
index 0000000..46e754a
--- /dev/null
+++ b/panels/sharing/gnome-sharing-panel.desktop.in.in
@@ -0,0 +1,13 @@
+[Desktop Entry]
+_Name=Sharing
+_Comment=Sharing
+Exec=gnome-control-center sharing
+Icon=preferences-desktop-sharing
+Terminal=false
+Type=Application
+StartupNotify=true
+Categories=GNOME;GTK;Settings;DesktopSettings;X-GNOME-Settings-Panel;X-GNOME-PersonalSettings
+OnlyShowIn=GNOME;Unity;
+X-GNOME-Settings-Panel=sharing
+# Translators: those are keywords for the sharing control-center panel
+_Keywords=Share, sharing, ssh, host, name, remote, desktop, bluetooth, obex
diff --git a/panels/sharing/sharing.gresource.xml b/panels/sharing/sharing.gresource.xml
new file mode 100644
index 0000000..347355d
--- /dev/null
+++ b/panels/sharing/sharing.gresource.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gresources>
+ <gresource prefix="/org/gnome/control-center/sharing">
+ <file preprocess="xml-stripblanks">sharing.ui</file>
+ </gresource>
+</gresources>
diff --git a/panels/sharing/sharing.ui b/panels/sharing/sharing.ui
new file mode 100644
index 0000000..56b7e85
--- /dev/null
+++ b/panels/sharing/sharing.ui
@@ -0,0 +1,1181 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <!-- interface-requires gtk+ 3.0 -->
+ <object class="GtkDialog" id="bluetooth-sharing-dialog">
+ <property name="can_focus">False</property>
+ <property name="border_width">5</property>
+ <property name="title" translatable="yes">Bluetooth Sharing</property>
+ <property name="type_hint">dialog</property>
+ <child internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox6">
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child internal-child="action_area">
+ <object class="GtkButtonBox" id="dialog-action_area6">
+ <property name="can_focus">False</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="button6">
+ <property name="label">gtk-close</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkGrid" id="grid1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_bottom">12</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Bluetooth Sharing allows you to share files with other Bluetooth enabled devices</property>
+ <property name="wrap">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ <property name="width">2</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSwitch" id="share-public-folder-switch">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSwitch" id="only-share-trusted-devices-switch">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">2</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="hexpand">True</property>
+ <property name="label" translatable="yes"><b>Share Public Folder</b></property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="only-share-trusted-devices-label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Only share with Trusted Devices</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkGrid" id="receive-files-grid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="hexpand">True</property>
+ <property name="label" translatable="yes">Only Receive From Trusted Devices</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSwitch" id="only-receive-from-trusted-devices-switch">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">4</property>
+ <property name="width">2</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes"><b>Save Received Files to Downloads Folder</b></property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">3</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSwitch" id="save-received-files-to-downloads-switch">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">3</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="0">button6</action-widget>
+ </action-widgets>
+ </object>
+ <object class="GtkWindow" id="main-window">
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="sharing-panel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_left">128</property>
+ <property name="margin_right">128</property>
+ <property name="margin_top">16</property>
+ <property name="margin_bottom">16</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="label6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes"><b>Computer Name</b></property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="CcHostnameEntry" id="hostname-entry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="margin_bottom">12</property>
+ <property name="invisible_char">â</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow2">
+ <property name="width_request">400</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="vexpand">True</property>
+ <property name="vscrollbar_policy">never</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkViewport" id="viewport1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="EggListBox" id="main-list-box">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="bluetooth-sharing-button">
+ <property name="border-width">12</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkLabel" id="label7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="hexpand">True</property>
+ <property name="label">Bluetooth Sharing</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="bluetooth-sharing-status-label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label">Off</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="personal-file-sharing-button">
+ <property name="border-width">12</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkLabel" id="label8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="hexpand">True</property>
+ <property name="label">Personal File Sharing</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="personal-file-sharing-status-label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label">Off</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="screen-sharing-button">
+ <property name="border-width">12</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkLabel" id="label9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="hexpand">True</property>
+ <property name="label">Screen Sharing</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="screen-sharing-status-label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label">Off</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="media-sharing-button">
+ <property name="border-width">12</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkLabel" id="label10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="hexpand">True</property>
+ <property name="label">Media Sharing</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="media-sharing-status-label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label">Off</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="remote-login-button">
+ <property name="border-width">12</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkLabel" id="label11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="hexpand">True</property>
+ <property name="label">Remote Login</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="remote-login-status-label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label">Off</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label12">
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Some services are disabled because of no network access.</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <object class="GtkDialog" id="media-sharing-dialog">
+ <property name="can_focus">False</property>
+ <property name="border_width">5</property>
+ <property name="title" translatable="yes">Media Sharing</property>
+ <property name="type_hint">dialog</property>
+ <child internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox2">
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child internal-child="action_area">
+ <object class="GtkButtonBox" id="dialog-action_area2">
+ <property name="can_focus">False</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="button9">
+ <property name="label">gtk-close</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkGrid" id="grid4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkLabel" id="label13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_bottom">12</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Share Music, Photos and Videos with others on the current network.</property>
+ <property name="wrap">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ <property name="width">2</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSwitch" id="share-media-switch">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="hexpand">True</property>
+ <property name="label" translatable="yes"><b>Share Media On This Network</b></property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Shared Folders</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ <property name="width">2</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="shared-folders-box">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="vexpand">True</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkTreeView" id="shared-folders-treeview">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="model">shared-folders-liststore</property>
+ <property name="headers_visible">False</property>
+ <property name="headers_clickable">False</property>
+ <property name="search_column">0</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection" id="treeview-selection"/>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="treeviewcolumn1">
+ <property name="title" translatable="yes">column</property>
+ <child>
+ <object class="GtkCellRendererText" id="cellrenderertext1"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolbar" id="toolbar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="icon_size">1</property>
+ <style>
+ <class name="inline-toolbar"/>
+ </style>
+ <child>
+ <object class="GtkToolButton" id="add-button">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Add Folder</property>
+ <property name="use_underline">True</property>
+ <property name="icon_name">list-add-symbolic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="remove-button">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Remove Folder</property>
+ <property name="use_underline">True</property>
+ <property name="icon_name">list-remove-symbolic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">3</property>
+ <property name="width">2</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="0">button9</action-widget>
+ </action-widgets>
+ </object>
+ <object class="GtkDialog" id="personal-file-sharing-dialog">
+ <property name="can_focus">False</property>
+ <property name="border_width">5</property>
+ <property name="title" translatable="yes">Personal File Sharing</property>
+ <property name="type_hint">dialog</property>
+ <child internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox5">
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child internal-child="action_area">
+ <object class="GtkButtonBox" id="dialog-action_area5">
+ <property name="can_focus">False</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="button7">
+ <property name="label">gtk-close</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkGrid" id="grid2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkLabel" id="personal-file-sharing-label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_bottom">12</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Personal File Sharing allows you to share your Public folder with others on your current network using: <a href="dav://%s">dav://%s</a></property>
+ <property name="use_markup">True</property>
+ <property name="wrap">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ <property name="width">2</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSwitch" id="share-public-folder-on-network-switch">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="hexpand">True</property>
+ <property name="label" translatable="yes"><b>Share Public Folder On This Network</b></property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkGrid" id="require-password-grid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkLabel" id="label17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Require Password</property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="personal-file-sharing-password-label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="hexpand">True</property>
+ <property name="label" translatable="yes">Password</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSwitch" id="personal-file-sharing-require-password-switch">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="personal-file-sharing-password-entry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="visibility">False</property>
+ <property name="invisible_char">â</property>
+ <property name="shadow_type">none</property>
+ <property name="invisible_char_set">True</property>
+ <property name="input_purpose">password</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ <property name="width">2</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="0">button7</action-widget>
+ </action-widgets>
+ </object>
+ <object class="GtkDialog" id="remote-login-dialog">
+ <property name="can_focus">False</property>
+ <property name="border_width">5</property>
+ <property name="title" translatable="yes">Remote Login</property>
+ <property name="type_hint">dialog</property>
+ <child internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox4">
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child internal-child="action_area">
+ <object class="GtkButtonBox" id="dialog-action_area4">
+ <property name="can_focus">False</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="button8">
+ <property name="label">gtk-close</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkGrid" id="grid5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkLabel" id="remote-login-label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_bottom">12</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Allow remote users to connect using the Secure Shell command:
+<a href="ssh %s">ssh %s</a></property>
+ <property name="use_markup">True</property>
+ <property name="wrap">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ <property name="width">2</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSwitch" id="remote-login-switch">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="hexpand">True</property>
+ <property name="label" translatable="yes"><b>Remote Login</b></property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="0">button8</action-widget>
+ </action-widgets>
+ </object>
+ <object class="GtkDialog" id="screen-sharing-dialog">
+ <property name="can_focus">False</property>
+ <property name="border_width">5</property>
+ <property name="title" translatable="yes">Screen Sharing</property>
+ <property name="type_hint">dialog</property>
+ <child internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox1">
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child internal-child="action_area">
+ <object class="GtkButtonBox" id="dialog-action_area1">
+ <property name="can_focus">False</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="button10">
+ <property name="label">gtk-close</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkGrid" id="grid3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkLabel" id="screen-sharing-label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_bottom">12</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Allow remote users to view or control your screen by connecting to: <a href="vnc://%s">vnc://%s</a></property>
+ <property name="use_markup">True</property>
+ <property name="wrap">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ <property name="width">2</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSwitch" id="remote-view-switch">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSwitch" id="remote-control-switch">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">2</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label20">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="hexpand">True</property>
+ <property name="label" translatable="yes"><b>Remote View</b></property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="remote-control-label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes"><b>Remote Control</b></property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkGrid" id="remote-control-grid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkLabel" id="remote-control-require-password-label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Require Password</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="approve-all-connections-label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="hexpand">True</property>
+ <property name="label" translatable="yes">Approve All Connections</property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSwitch" id="remote-control-require-password-switch">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSwitch" id="approve-all-connections-switch">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="password-box">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkLabel" id="remote-control-password-label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="hexpand">True</property>
+ <property name="label" translatable="yes">Password</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="remote-control-password-entry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="visibility">False</property>
+ <property name="invisible_char">â</property>
+ <property name="shadow_type">none</property>
+ <property name="invisible_char_set">True</property>
+ <property name="input_purpose">password</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ <property name="width">2</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">3</property>
+ <property name="width">2</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="0">button10</action-widget>
+ </action-widgets>
+ </object>
+ <object class="GtkListStore" id="shared-folders-liststore">
+ <columns>
+ <!-- column-name Folder -->
+ <column type="gchararray"/>
+ </columns>
+ </object>
+</interface>
diff --git a/panels/sharing/vino-preferences.c b/panels/sharing/vino-preferences.c
new file mode 100644
index 0000000..f92d5c3
--- /dev/null
+++ b/panels/sharing/vino-preferences.c
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2003 Sun Microsystems, Inc.
+ * Copyright (C) 2006 Jonh Wendell <wendell bani com br>
+ * Copyright  2010 Codethink Limited
+ * Copyright (C) 2013 Intel, 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., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ *
+ * Authors:
+ * Mark McLoughlin <mark skynet ie>
+ * Jonh Wendell <wendell bani com br>
+ * Ryan Lortie <desrt desrt ca>
+ */
+
+#include "vino-preferences.h"
+#include <string.h>
+
+#include <glib/gi18n.h>
+
+gboolean
+vino_get_authtype (GValue *value,
+ GVariant *variant,
+ gpointer user_data)
+{
+ GVariantIter iter;
+ const gchar *type;
+
+ g_variant_iter_init (&iter, variant);
+ g_value_set_boolean (value, TRUE);
+
+ while (g_variant_iter_next (&iter, "s", &type))
+ if (strcmp (type, "none") == 0)
+ g_value_set_boolean (value, FALSE);
+
+ return TRUE;
+}
+
+GVariant *
+vino_set_authtype (const GValue *value,
+ const GVariantType *type,
+ gpointer user_data)
+{
+ const gchar *authtype;
+
+ if (g_value_get_boolean (value))
+ authtype = "vnc";
+ else
+ authtype = "none";
+
+ return g_variant_new_strv (&authtype, 1);
+}
+
+gboolean
+vino_get_password (GValue *value,
+ GVariant *variant,
+ gpointer user_data)
+{
+ const gchar *setting;
+
+ setting = g_variant_get_string (variant, NULL);
+
+ if (strcmp (setting, "keyring") == 0)
+ {
+ /* "keyring" is the default value, even though vino doesn't support it at
+ * the moment */
+
+ g_value_set_static_string (value, "");
+ return TRUE;
+ }
+ else
+ {
+ gchar *decoded;
+ gsize length;
+ gboolean ok;
+
+ decoded = (gchar *) g_base64_decode (setting, &length);
+
+ if ((ok = g_utf8_validate (decoded, length, NULL)))
+ g_value_take_string (value, g_strndup (decoded, length));
+
+ return ok;
+ }
+}
+
+GVariant *
+vino_set_password (const GValue *value,
+ const GVariantType *type,
+ gpointer user_data)
+{
+ const gchar *string;
+ gchar *base64;
+
+ string = g_value_get_string (value);
+
+ base64 = g_base64_encode ((guchar *) string, strlen (string));
+ return g_variant_new_from_data (G_VARIANT_TYPE_STRING,
+ base64, strlen (base64) + 1,
+ TRUE, g_free, base64);
+}
+
diff --git a/panels/sharing/vino-preferences.h b/panels/sharing/vino-preferences.h
new file mode 100644
index 0000000..98ec938
--- /dev/null
+++ b/panels/sharing/vino-preferences.h
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2003 Sun Microsystems, Inc.
+ * Copyright (C) 2006 Jonh Wendell <wendell bani com br>
+ * Copyright  2010 Codethink Limited
+ * Copyright (C) 2013 Intel, 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., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ *
+ * Authors:
+ * Mark McLoughlin <mark skynet ie>
+ * Jonh Wendell <wendell bani com br>
+ * Ryan Lortie <desrt desrt ca>
+ */
+
+#ifndef __VINO_PREFERENCES_H__
+#define __VINO_PREFERENCES_H__
+
+#include <glib.h>
+#include <glib-object.h>
+
+GVariant * vino_set_authtype (const GValue *value,
+ const GVariantType *type,
+ gpointer user_data);
+gboolean vino_get_authtype (GValue *value,
+ GVariant *variant,
+ gpointer user_data);
+
+GVariant *
+vino_set_password (const GValue *value,
+ const GVariantType *type,
+ gpointer user_data);
+gboolean
+vino_get_password (GValue *value,
+ GVariant *variant,
+ gpointer user_data);
+
+#endif /* __VINO_PREFERENCES_H__ */
diff --git a/po/POTFILES.in b/po/POTFILES.in
index dea1a86..031ac17 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -98,6 +98,9 @@ panels/search/cc-search-panel.c
panels/search/gnome-search-panel.desktop.in.in
[type: gettext/glade]panels/search/search-locations-dialog.ui
[type: gettext/glade]panels/search/search.ui
+panels/sharing/cc-sharing-panel.c
+panels/sharing/gnome-sharing-panel.desktop.in.in
+[type: gettext/glade]panels/sharing/sharing.ui
panels/sound/cc-sound-panel.c
panels/sound/data/gnome-sound-panel.desktop.in.in
panels/sound/data/sounds/gnome-sounds-default.xml.in.in
diff --git a/po/POTFILES.skip b/po/POTFILES.skip
index 1995fca..383b5bf 100644
--- a/po/POTFILES.skip
+++ b/po/POTFILES.skip
@@ -15,6 +15,7 @@ panels/privacy/gnome-privacy-panel.desktop.in
panels/region/gnome-region-panel.desktop.in
panels/screen/gnome-screen-panel.desktop.in
panels/search/gnome-search-panel.desktop.in
+panels/sharing/gnome-sharing-panel.desktop.in
panels/sound/data/gnome-sound-panel.desktop.in
panels/sound/data/sounds/gnome-sounds-default.xml.in
panels/universal-access/gnome-universal-access-panel.desktop.in
diff --git a/shell/Makefile.am b/shell/Makefile.am
index a238cb1..75454e3 100644
--- a/shell/Makefile.am
+++ b/shell/Makefile.am
@@ -59,6 +59,7 @@ gnome_control_center_LDADD = \
$(top_builddir)/panels/region/libregion.la \
$(top_builddir)/panels/screen/libscreen.la \
$(top_builddir)/panels/search/libsearch.la \
+ $(top_builddir)/panels/sharing/libsharing.la \
$(top_builddir)/panels/sound/libsound.la \
$(top_builddir)/panels/universal-access/libuniversal-access.la \
$(top_builddir)/panels/user-accounts/libuser-accounts.la
diff --git a/shell/cc-panel-loader.c b/shell/cc-panel-loader.c
index 0c699d3..8ab65a5 100644
--- a/shell/cc-panel-loader.c
+++ b/shell/cc-panel-loader.c
@@ -50,6 +50,7 @@ extern GType cc_privacy_panel_get_type (void);
extern GType cc_region_panel_get_type (void);
extern GType cc_screen_panel_get_type (void);
extern GType cc_search_panel_get_type (void);
+extern GType cc_sharing_panel_get_type (void);
extern GType cc_sound_panel_get_type (void);
extern GType cc_ua_panel_get_type (void);
extern GType cc_user_panel_get_type (void);
@@ -84,6 +85,7 @@ static struct {
{ "region", cc_region_panel_get_type },
{ "screen", cc_screen_panel_get_type },
{ "search", cc_search_panel_get_type },
+ { "sharing", cc_sharing_panel_get_type },
{ "sound", cc_sound_panel_get_type },
{ "universal-access", cc_ua_panel_get_type },
{ "user-accounts", cc_user_panel_get_type },
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]