[krb5-auth-dialog] Add gnome-control-center panel



commit 0d489eac9ce9b7d7d4ef401e88afc5370c16fe39
Author: Guido Günther <agx sigxcpu org>
Date:   Tue Jan 25 14:25:01 2011 +0100

    Add gnome-control-center panel

 .gitignore                         |    2 +
 Makefile.am                        |    2 +-
 cc-panel/.gitignore                |    2 +
 cc-panel/Makefile.am               |   55 +++
 cc-panel/cc-ka-panel.c             |  843 ++++++++++++++++++++++++++++++++++++
 cc-panel/cc-ka-panel.h             |   45 ++
 cc-panel/gnome-ka-panel.desktop.in |   17 +
 cc-panel/ka-module.c               |   20 +
 cc-panel/ka-panel.ui               |  675 +++++++++++++++++++++++++++++
 configure.ac                       |    9 +
 po/POTFILES.in                     |    3 +
 11 files changed, 1672 insertions(+), 1 deletions(-)
---
diff --git a/.gitignore b/.gitignore
index 59d6393..8870ea5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,9 @@
 *.a
 *.o
+*.lo
 autom4te.cache/
 .deps/
+.libs/
 aclocal.m4
 config.cache
 config.guess
diff --git a/Makefile.am b/Makefile.am
index 4bc81e1..953cd39 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,6 +1,6 @@
 NULL = 
 
-SUBDIRS = secmem src po etpo icons preferences help examples plugins
+SUBDIRS = secmem src po etpo icons preferences help examples plugins cc-panel
 
 EXTRA_DIST = \
 	krb5-auth-dialog.spec \
diff --git a/cc-panel/.gitignore b/cc-panel/.gitignore
new file mode 100644
index 0000000..a75ce07
--- /dev/null
+++ b/cc-panel/.gitignore
@@ -0,0 +1,2 @@
+libka.la
+gnome-ka-panel.desktop
diff --git a/cc-panel/Makefile.am b/cc-panel/Makefile.am
new file mode 100644
index 0000000..d4d412c
--- /dev/null
+++ b/cc-panel/Makefile.am
@@ -0,0 +1,55 @@
+NULL =
+
+ccpanelsdir = $(PANELS_DIR)
+ccpanels_LTLIBRARIES = libka.la
+
+libka_la_SOURCES = \
+	ka-module.c \
+	cc-ka-panel.c \
+	$(top_srcdir)/src/ka-gconf-tools.c \
+	$(top_srcdir)/src/ka-gconf-tools.h \
+	$(top_srcdir)/src/ka-tools.c \
+	$(top_srcdir)/src/ka-tools.h \
+	cc-ka-panel.h
+
+INCLUDES = \
+	-I$(top_srcdir)/src \
+	$(GTK_CFLAGS) \
+	$(GCONF_CFLAGS) \
+        $(CONTROL_CENTER_CFLAGS) \
+	$(WARN_CFLAGS) \
+	$(AM_CFLAGS) \
+	-DKA_DATA_DIR=\""$(pkgdatadir)"\" \
+	-DDATA_DIR=\""$(datadir)"\" \
+	-DLOCALE_DIR=\""$(localedir)/"\" \
+	$(NULL)
+
+libka_la_LIBADD = \
+	$(GCONF_LIBS) \
+	$(GTK_LIBS) \
+	$(CONTROL_CENTER_LIBS) \
+	$(NULL)
+
+AM_CPPFLAGS = \
+	$(DISABLE_DEPRECATED) \
+	$(NULL)
+
+libka_la_LDFLAGS = -export_dynamic -avoid-version -module -no-undefined -export-symbols-regex '^g_io_module_(load|unload)'
+
+desktopdir = $(datadir)/applications
+desktop_in_files = gnome-ka-panel.desktop.in
+desktop_DATA = $(desktop_in_files:.desktop.in=.desktop)
+
+ INTLTOOL_DESKTOP_RULE@
+
+pkgdatadir = $(datadir)/krb5-auth-dialog
+pkgdata_DATA =			\
+	ka-panel.ui \
+	$(NULL)
+
+CLEANFILES = $(desktop_DATA)
+
+EXTRA_DIST = \
+	$(desktop_in_files) \
+	$(pkgdata_DATA) \
+	$(NULL)
diff --git a/cc-panel/cc-ka-panel.c b/cc-panel/cc-ka-panel.c
new file mode 100644
index 0000000..5f66234
--- /dev/null
+++ b/cc-panel/cc-ka-panel.c
@@ -0,0 +1,843 @@
+/*
+ * Copyright (C) 2011 Guido Guenther <agx sigxcpu org>
+ *
+ * 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, 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.
+ *
+ */
+
+#include "config.h"
+#include "cc-ka-panel.h"
+
+#include "ka-gconf-tools.h"
+#include "ka-tools.h"
+
+#include <glib/gi18n.h>
+
+G_DEFINE_DYNAMIC_TYPE (CcKaPanel, cc_ka_panel, CC_TYPE_PANEL)
+
+#define GET_PRIVATE(o) \
+  (G_TYPE_INSTANCE_GET_PRIVATE ((o), CC_TYPE_KA_PANEL, CcKaPanelPrivate))
+
+#define WID(b, w) (GtkWidget *) gtk_builder_get_object (b, w)
+
+#define PKINIT_SMARTCARD "PKCS11:" SC_PKCS11
+#define PKINIT_FILE "FILE:"
+
+#define N_LISTENERS 8
+
+typedef struct _CcKaPanelPrivate CcKaPanelPrivate;
+
+struct _CcKaPanelPrivate {
+    GtkBuilder *builder;
+
+    GConfClient *client;
+
+    GtkWidget *notebook;
+    GtkWidget *principal_entry;
+    GtkWidget *pkuserid_entry;
+    GtkWidget *pkuserid_button;
+    GtkWidget *smartcard_toggle;
+    GtkWidget *pkanchors_entry;
+    GtkWidget *pkanchors_button;
+    GtkWidget *forwardable_toggle;
+    GtkWidget *proxiable_toggle;
+    GtkWidget *renewable_toggle;
+    GtkWidget *trayicon_toggle;
+    GtkWidget *prompt_mins_entry;
+
+    guint     listeners [N_LISTENERS];
+    int       n_listeners;
+};
+
+static void
+cc_ka_panel_principal_notify (GConfClient *client G_GNUC_UNUSED,
+                              guint cnx_id G_GNUC_UNUSED,
+                              GConfEntry *entry,
+                              CcKaPanelPrivate *priv)
+{
+    const char *principal;
+
+    if (!entry->value || entry->value->type != GCONF_VALUE_STRING)
+      return;
+
+    principal = gconf_value_get_string (entry->value);
+
+    if (!principal || !strlen(principal))
+        gtk_entry_set_text (GTK_ENTRY (priv->principal_entry), "");
+    else {
+        const char *old_principal;
+
+        old_principal = gtk_entry_get_text (GTK_ENTRY (priv->principal_entry));
+        if (!old_principal || (old_principal && strcmp (old_principal, principal)))
+            gtk_entry_set_text (GTK_ENTRY (priv->principal_entry), principal);
+    }
+}
+
+static void
+cc_ka_panel_principal_changed (GtkEntry *entry,
+                               CcKaPanelPrivate *priv)
+{
+    const char *principal;
+
+    principal = gtk_entry_get_text (entry);
+
+    if (!principal || !strlen(principal))
+        gconf_client_unset (priv->client, KA_GCONF_KEY_PRINCIPAL, NULL);
+    else
+        gconf_client_set_string (priv->client, KA_GCONF_KEY_PRINCIPAL, principal, NULL);
+}
+
+
+static void
+cc_ka_panel_setup_principal_entry (CcKaPanelPrivate *priv)
+{
+    char     *principal = NULL;
+
+    priv->principal_entry = WID (priv->builder, "principal_entry");
+    g_assert (priv->principal_entry != NULL);
+
+    if (!ka_gconf_get_string (priv->client, KA_GCONF_KEY_PRINCIPAL, &principal))
+        g_warning ("Getting principal failed");
+
+    if (principal && strlen(principal))
+        gtk_entry_set_text (GTK_ENTRY (priv->principal_entry), principal);
+    if (principal)
+        g_free (principal);
+
+    g_signal_connect (priv->principal_entry, "changed",
+                      G_CALLBACK (cc_ka_panel_principal_changed), priv);
+
+    if (!gconf_client_key_is_writable (priv->client, KA_GCONF_KEY_PRINCIPAL, NULL)) {
+        gtk_widget_set_sensitive (priv->principal_entry, FALSE);
+    }
+
+    priv->listeners [priv->n_listeners] =
+        gconf_client_notify_add (priv->client,
+                                 KA_GCONF_KEY_PRINCIPAL,
+                                 (GConfClientNotifyFunc) cc_ka_panel_principal_notify,
+                                 priv, NULL, NULL);
+    priv->n_listeners++;
+}
+
+
+static void
+cc_ka_panel_pkuserid_notify (GConfClient *client G_GNUC_UNUSED,
+                             guint cnx_id G_GNUC_UNUSED,
+                             GConfEntry *entry,
+                             CcKaPanelPrivate *priv)
+{
+    const char *pkuserid;
+
+    if (!entry->value || entry->value->type != GCONF_VALUE_STRING)
+        return;
+
+    pkuserid = gconf_value_get_string (entry->value);
+
+    if (!pkuserid || !strlen(pkuserid))
+        gtk_entry_set_text (GTK_ENTRY (priv->pkuserid_entry), "");
+    else {
+        const char *old_pkuserid;
+
+        old_pkuserid = gtk_entry_get_text (GTK_ENTRY (priv->pkuserid_entry));
+        if (!old_pkuserid || (old_pkuserid && strcmp (old_pkuserid, pkuserid)))
+            gtk_entry_set_text (GTK_ENTRY (priv->pkuserid_entry), pkuserid);
+    }
+}
+
+
+static void
+cc_ka_panel_pkuserid_changed (GtkEntry *entry,
+                              CcKaPanelPrivate *priv)
+{
+    const char *pkuserid;
+
+    pkuserid = gtk_entry_get_text (entry);
+
+    if (!pkuserid || !strlen(pkuserid))
+        gconf_client_unset (priv->client, KA_GCONF_KEY_PK_USERID, NULL);
+    else
+        gconf_client_set_string (priv->client, KA_GCONF_KEY_PK_USERID, pkuserid, NULL);
+}
+
+
+static void
+cc_ka_panel_setup_pkuserid_entry (CcKaPanelPrivate *priv)
+{
+    char     *pkuserid = NULL;
+
+    priv->pkuserid_entry = WID(priv->builder, "pkuserid_entry");
+    g_assert (priv->pkuserid_entry != NULL);
+
+    if (!ka_gconf_get_string (priv->client, KA_GCONF_KEY_PK_USERID, &pkuserid))
+        g_warning ("Getting pkuserid failed");
+
+    if (pkuserid && strlen(pkuserid))
+        gtk_entry_set_text (GTK_ENTRY (priv->pkuserid_entry), pkuserid);
+    if (pkuserid)
+        g_free (pkuserid);
+
+    g_signal_connect (priv->pkuserid_entry, "changed",
+                      G_CALLBACK (cc_ka_panel_pkuserid_changed), priv);
+    if (!gconf_client_key_is_writable (priv->client, KA_GCONF_KEY_PK_USERID, NULL)) {
+        gtk_widget_set_sensitive (priv->pkuserid_entry, FALSE);
+    }
+
+    priv->listeners [priv->n_listeners] =
+        gconf_client_notify_add (priv->client,
+                                 KA_GCONF_KEY_PK_USERID,
+                                 (GConfClientNotifyFunc) cc_ka_panel_pkuserid_notify,
+                                 priv, NULL, NULL);
+    priv->n_listeners++;
+}
+
+
+static void
+ka_preferences_pkanchors_notify (GConfClient *client G_GNUC_UNUSED,
+                                 guint cnx_id G_GNUC_UNUSED,
+                                 GConfEntry *entry,
+                                 CcKaPanelPrivate *priv)
+{
+    const char *pkanchors;
+
+    if (!entry->value || entry->value->type != GCONF_VALUE_STRING)
+        return;
+
+    pkanchors = gconf_value_get_string (entry->value);
+
+    if (!pkanchors || !strlen(pkanchors))
+        gtk_entry_set_text (GTK_ENTRY (priv->pkanchors_entry), "");
+    else {
+        const char *old_pkanchors;
+
+        old_pkanchors = gtk_entry_get_text (GTK_ENTRY (priv->pkanchors_entry));
+        if (!old_pkanchors || (old_pkanchors && strcmp (old_pkanchors, pkanchors)))
+            gtk_entry_set_text (GTK_ENTRY (priv->pkanchors_entry), pkanchors);
+    }
+}
+
+
+static void
+cc_ka_panel_pkanchors_changed (GtkEntry *entry,
+                               CcKaPanelPrivate *priv)
+{
+    const char *pkanchors;
+
+    pkanchors = gtk_entry_get_text (entry);
+
+    if (!pkanchors || !strlen(pkanchors))
+        gconf_client_unset (priv->client, KA_GCONF_KEY_PK_ANCHORS, NULL);
+    else
+        gconf_client_set_string (priv->client, KA_GCONF_KEY_PK_ANCHORS,
+                                 pkanchors, NULL);
+}
+
+
+static void
+cc_ka_panel_setup_pkanchors_entry (CcKaPanelPrivate *priv)
+{
+    char *pkanchors = NULL;
+
+    priv->pkanchors_entry = WID(priv->builder, "pkanchors_entry");
+    g_assert (priv->pkanchors_entry != NULL);
+
+    if (!ka_gconf_get_string (priv->client, KA_GCONF_KEY_PK_ANCHORS, &pkanchors))
+        g_warning ("Getting pkanchors failed");
+
+    if (pkanchors && strlen(pkanchors))
+        gtk_entry_set_text (GTK_ENTRY (priv->pkanchors_entry), pkanchors);
+    if (pkanchors)
+        g_free (pkanchors);
+
+    g_signal_connect (priv->pkanchors_entry, "changed",
+                      G_CALLBACK (cc_ka_panel_pkanchors_changed), priv);
+    if (!gconf_client_key_is_writable (priv->client, KA_GCONF_KEY_PK_ANCHORS, NULL)) {
+        gtk_widget_set_sensitive (priv->pkanchors_entry, FALSE);
+    }
+
+    priv->listeners [priv->n_listeners] =
+        gconf_client_notify_add (priv->client,
+                                 KA_GCONF_KEY_PK_ANCHORS,
+                                 (GConfClientNotifyFunc) ka_preferences_pkanchors_notify,
+                                 priv, NULL, NULL);
+    priv->n_listeners++;
+}
+
+
+static void
+ka_preferences_toggle_pkuserid_entry (gboolean state, CcKaPanelPrivate *priv)
+{
+    gtk_widget_set_sensitive (priv->pkuserid_entry, state);
+    gtk_widget_set_sensitive (priv->pkuserid_button, state);
+}
+
+
+static void
+cc_ka_panel_smartcard_toggled (GtkToggleButton *toggle,
+                               CcKaPanelPrivate *priv)
+{
+    gboolean smartcard = gtk_toggle_button_get_active (toggle);
+    static gchar *old_path = NULL;
+
+    if (smartcard) {
+        const char *path;
+
+        path = gtk_entry_get_text (GTK_ENTRY(priv->pkuserid_entry));
+        if (g_strcmp0 (path, PKINIT_SMARTCARD)) {
+            g_free (old_path);
+            old_path = g_strdup (path);
+        }
+        ka_preferences_toggle_pkuserid_entry (FALSE, priv);
+        gconf_client_set_string (priv->client, KA_GCONF_KEY_PK_USERID, PKINIT_SMARTCARD, NULL);
+    } else {
+        ka_preferences_toggle_pkuserid_entry (TRUE, priv);
+        if (old_path)
+            gconf_client_set_string (priv->client, KA_GCONF_KEY_PK_USERID, old_path, NULL);
+        else
+            gconf_client_unset (priv->client, KA_GCONF_KEY_PK_USERID, NULL);
+    }
+}
+
+
+static void
+cc_ka_panel_setup_smartcard_toggle(CcKaPanelPrivate *priv)
+{
+    char *pkuserid = NULL;
+
+    priv->smartcard_toggle = WID (priv->builder, "smartcard_toggle");
+    g_assert (priv->smartcard_toggle != NULL);
+
+    if (!ka_gconf_get_string (priv->client, KA_GCONF_KEY_PK_USERID, &pkuserid))
+        g_warning ("Getting pkanchors failed");
+
+    g_signal_connect (priv->smartcard_toggle, "toggled",
+                      G_CALLBACK (cc_ka_panel_smartcard_toggled), priv);
+
+    if (!g_strcmp0 (pkuserid, PKINIT_SMARTCARD))
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->smartcard_toggle), TRUE);
+    else
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->smartcard_toggle), FALSE);
+
+    if (pkuserid)
+        g_free (pkuserid);
+}
+
+
+static void
+cc_ka_panel_browse_certs (CcKaPanelPrivate *priv, GtkEntry *entry)
+{
+    GtkWidget *filechooser;
+    GtkFileFilter *cert_filter, *all_filter;
+    gchar *filename = NULL;
+    const gchar *current;
+    gint ret;
+
+    filechooser = gtk_file_chooser_dialog_new(_("Choose Certificate"),
+                                              GTK_WINDOW (gtk_widget_get_toplevel (priv->notebook)),
+                                              GTK_FILE_CHOOSER_ACTION_OPEN,
+                                              GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+                                              GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
+                                              NULL);
+
+    current = gtk_entry_get_text (entry);
+    if (current && g_str_has_prefix (current, PKINIT_FILE) &&
+        strlen(current) > strlen (PKINIT_FILE)) {
+        gtk_file_chooser_select_filename (GTK_FILE_CHOOSER(filechooser),
+                                          (const gchar*)&current[strlen(PKINIT_FILE)]);
+    }
+
+    cert_filter = g_object_ref_sink (gtk_file_filter_new ());
+    gtk_file_filter_add_mime_type (cert_filter, "application/x-x509-ca-cert");
+    gtk_file_filter_set_name (cert_filter, _("X509 Certificates"));
+    gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (filechooser), cert_filter);
+    all_filter = g_object_ref_sink (gtk_file_filter_new ());
+    gtk_file_filter_add_pattern (all_filter, "*");
+    gtk_file_filter_set_name (all_filter, _("all files"));
+    gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (filechooser), all_filter);
+
+    ret = gtk_dialog_run (GTK_DIALOG(filechooser));
+    if (ret == GTK_RESPONSE_ACCEPT)
+        filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(filechooser));
+    gtk_widget_destroy (GTK_WIDGET(filechooser));
+
+    if (filename) {
+        gchar *cert = g_strconcat( PKINIT_FILE, filename, NULL);
+        gtk_entry_set_text (entry, cert);
+        g_free (filename);
+        g_free (cert);
+  }
+    g_object_unref (cert_filter);
+    g_object_unref (all_filter);
+}
+
+static void
+cc_ka_panel_browse_pkuserids (GtkButton *button G_GNUC_UNUSED,
+                                       CcKaPanelPrivate *priv)
+{
+    cc_ka_panel_browse_certs (priv,
+                              GTK_ENTRY(priv->pkuserid_entry));
+}
+
+static void
+cc_ka_panel_browse_pkanchors(GtkButton *button G_GNUC_UNUSED,
+                                       CcKaPanelPrivate *priv)
+{
+    cc_ka_panel_browse_certs (priv,
+                              GTK_ENTRY(priv->pkanchors_entry));
+}
+
+static void
+cc_ka_panel_setup_pkuserid_button (CcKaPanelPrivate *priv)
+{
+    priv->pkuserid_button = WID (priv->builder, "pkuserid_button");
+    g_assert (priv->pkuserid_button != NULL);
+
+    g_signal_connect (priv->pkuserid_button, "clicked",
+                      G_CALLBACK (cc_ka_panel_browse_pkuserids), priv);
+
+}
+
+static void
+cc_ka_panel_setup_pkanchors_button (CcKaPanelPrivate *priv)
+{
+    priv->pkanchors_button = WID (priv->builder, "pkanchors_button");
+    g_assert (priv->pkanchors_button != NULL);
+
+    g_signal_connect (priv->pkanchors_button, "clicked",
+                      G_CALLBACK (cc_ka_panel_browse_pkanchors), priv);
+
+}
+
+
+static void
+cc_ka_panel_forwardable_toggled (GtkToggleButton *toggle,
+                                           CcKaPanelPrivate *priv)
+{
+    gboolean forwardable;
+
+    forwardable = gtk_toggle_button_get_active (toggle);
+
+    gconf_client_set_bool (priv->client, KA_GCONF_KEY_FORWARDABLE, forwardable, NULL);
+}
+
+
+static void
+cc_ka_panel_forwardable_notify (GConfClient *client G_GNUC_UNUSED,
+                                    guint cnx_id G_GNUC_UNUSED,
+                                    GConfEntry *entry,
+                                    CcKaPanelPrivate *priv)
+{
+    gboolean forwardable;
+
+    if (!entry->value || entry->value->type != GCONF_VALUE_BOOL)
+      return;
+
+    forwardable = gconf_value_get_bool (entry->value) != FALSE;
+
+    if (forwardable != gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->forwardable_toggle)))
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->forwardable_toggle), forwardable);
+}
+
+
+static gboolean
+cc_ka_panel_setup_forwardable_toggle (CcKaPanelPrivate *priv)
+{
+    gboolean forwardable;
+
+    priv->forwardable_toggle = WID (priv->builder, "forwardable_toggle");
+    g_assert (priv->forwardable_toggle != NULL);
+
+    forwardable = gconf_client_get_bool (priv->client, KA_GCONF_KEY_FORWARDABLE, NULL);
+
+    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->forwardable_toggle), forwardable);
+
+    g_signal_connect (priv->forwardable_toggle, "toggled",
+                      G_CALLBACK (cc_ka_panel_forwardable_toggled), priv);
+
+    if (!gconf_client_key_is_writable (priv->client, KA_GCONF_KEY_FORWARDABLE, NULL)) {
+        gtk_widget_set_sensitive (priv->forwardable_toggle, FALSE);
+    }
+
+    priv->listeners [priv->n_listeners] =
+        gconf_client_notify_add (priv->client,
+                                 KA_GCONF_KEY_FORWARDABLE,
+                                 (GConfClientNotifyFunc) cc_ka_panel_forwardable_notify,
+                                 priv, NULL, NULL);
+    priv->n_listeners++;
+    return forwardable;
+}
+
+
+static void
+cc_ka_panel_proxiable_toggled (GtkToggleButton *toggle,
+                                     CcKaPanelPrivate *priv)
+{
+    gboolean proxiable;
+
+    proxiable = gtk_toggle_button_get_active (toggle);
+
+    gconf_client_set_bool (priv->client, KA_GCONF_KEY_PROXIABLE, proxiable, NULL);
+}
+
+
+static void
+cc_ka_panel_proxiable_notify (GConfClient *client G_GNUC_UNUSED,
+                                    guint cnx_id G_GNUC_UNUSED,
+                                    GConfEntry *entry,
+                                    CcKaPanelPrivate *priv)
+{
+    gboolean proxiable;
+
+    if (!entry->value || entry->value->type != GCONF_VALUE_BOOL)
+        return;
+
+    proxiable = gconf_value_get_bool (entry->value) != FALSE;
+
+    if (proxiable != gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->proxiable_toggle)))
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->proxiable_toggle), proxiable);
+}
+
+
+static gboolean
+cc_ka_panel_setup_proxiable_toggle (CcKaPanelPrivate *priv)
+{
+    gboolean proxiable;
+
+    priv->proxiable_toggle = WID (priv->builder, "proxiable_toggle");
+    g_assert (priv->proxiable_toggle != NULL);
+
+    proxiable = gconf_client_get_bool (priv->client, KA_GCONF_KEY_PROXIABLE, NULL);
+
+    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->proxiable_toggle), proxiable);
+
+    g_signal_connect (priv->proxiable_toggle, "toggled",
+                      G_CALLBACK (cc_ka_panel_proxiable_toggled), priv);
+
+    if (!gconf_client_key_is_writable (priv->client, KA_GCONF_KEY_PROXIABLE, NULL)) {
+        gtk_widget_set_sensitive (priv->proxiable_toggle, FALSE);
+    }
+
+    priv->listeners [priv->n_listeners] =
+        gconf_client_notify_add (priv->client,
+                                 KA_GCONF_KEY_PROXIABLE,
+                                 (GConfClientNotifyFunc) cc_ka_panel_proxiable_notify,
+                                 priv, NULL, NULL);
+    priv->n_listeners++;
+    return proxiable;
+}
+
+
+static void
+cc_ka_panel_renewable_toggled (GtkToggleButton *toggle,
+                               CcKaPanelPrivate *priv)
+{
+    gboolean renewable;
+
+    renewable = gtk_toggle_button_get_active (toggle);
+
+    gconf_client_set_bool (priv->client, KA_GCONF_KEY_RENEWABLE, renewable, NULL);
+}
+
+
+static void
+cc_ka_panel_renewable_notify (GConfClient *client G_GNUC_UNUSED,
+                                    guint cnx_id G_GNUC_UNUSED,
+                                    GConfEntry *entry,
+                                    CcKaPanelPrivate *priv)
+{
+    gboolean renewable;
+
+    if (!entry->value || entry->value->type != GCONF_VALUE_BOOL)
+        return;
+
+    renewable = gconf_value_get_bool (entry->value) != FALSE;
+
+    if (renewable != gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->renewable_toggle)))
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->renewable_toggle), renewable);
+}
+
+
+static gboolean
+cc_ka_panel_setup_renewable_toggle (CcKaPanelPrivate *priv)
+{
+    gboolean renewable;
+
+    priv->renewable_toggle = WID (priv->builder, "renewable_toggle");
+    g_assert (priv->renewable_toggle != NULL);
+
+    renewable = gconf_client_get_bool (priv->client, KA_GCONF_KEY_RENEWABLE, NULL);
+
+    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->renewable_toggle), renewable);
+
+    g_signal_connect (priv->renewable_toggle, "toggled",
+                      G_CALLBACK (cc_ka_panel_renewable_toggled), priv);
+
+    if (!gconf_client_key_is_writable (priv->client, KA_GCONF_KEY_RENEWABLE, NULL)) {
+        gtk_widget_set_sensitive (priv->renewable_toggle, FALSE);
+    }
+
+    priv->listeners [priv->n_listeners] =
+        gconf_client_notify_add (priv->client,
+                                 KA_GCONF_KEY_RENEWABLE,
+                                 (GConfClientNotifyFunc) cc_ka_panel_renewable_notify,
+                                 priv, NULL, NULL);
+    priv->n_listeners++;
+    return renewable;
+}
+
+static void
+cc_ka_panel_trayicon_toggled (GtkToggleButton *toggle,
+                              CcKaPanelPrivate *priv)
+{
+    gboolean trayicon;
+
+    trayicon = gtk_toggle_button_get_active (toggle);
+    gconf_client_set_bool (priv->client, KA_GCONF_KEY_SHOW_TRAYICON, trayicon, NULL);
+}
+
+
+static void
+cc_ka_panel_trayicon_notify (GConfClient *client G_GNUC_UNUSED,
+                             guint cnx_id G_GNUC_UNUSED,
+                             GConfEntry *entry,
+                             CcKaPanelPrivate *priv)
+{
+    gboolean trayicon;
+
+    if (!entry->value || entry->value->type != GCONF_VALUE_BOOL)
+        return;
+
+    trayicon = gconf_value_get_bool (entry->value) != FALSE;
+
+    if (trayicon != gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->trayicon_toggle)))
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->trayicon_toggle), trayicon);
+}
+
+
+static gboolean
+cc_ka_panel_setup_trayicon_toggle (CcKaPanelPrivate *priv)
+{
+    gboolean trayicon;
+
+    priv->trayicon_toggle = WID (priv->builder, "trayicon_toggle");
+    g_assert (priv->trayicon_toggle != NULL);
+
+    trayicon = gconf_client_get_bool (priv->client, KA_GCONF_KEY_SHOW_TRAYICON, NULL);
+
+    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->trayicon_toggle), trayicon);
+
+    g_signal_connect (priv->trayicon_toggle, "toggled",
+                      G_CALLBACK (cc_ka_panel_trayicon_toggled), priv);
+
+    if (!gconf_client_key_is_writable (priv->client, KA_GCONF_KEY_SHOW_TRAYICON, NULL)) {
+        gtk_widget_set_sensitive (priv->trayicon_toggle, FALSE);
+    }
+
+    priv->listeners [priv->n_listeners] =
+        gconf_client_notify_add (priv->client,
+                                 KA_GCONF_KEY_SHOW_TRAYICON,
+                                 (GConfClientNotifyFunc) cc_ka_panel_trayicon_notify,
+                                 priv, NULL, NULL);
+    priv->n_listeners++;
+    return trayicon;
+}
+
+
+static void
+cc_ka_panel_prompt_mins_changed (GtkSpinButton *button,
+                                     CcKaPanelPrivate *priv)
+{
+    gint prompt_mins;
+
+    prompt_mins = gtk_spin_button_get_value_as_int (button);
+    gconf_client_set_int (priv->client, KA_GCONF_KEY_PROMPT_MINS, prompt_mins, NULL);
+}
+
+
+static void
+cc_ka_panel_prompt_mins_notify (GConfClient *client G_GNUC_UNUSED,
+                                guint cnx_id G_GNUC_UNUSED,
+                                GConfEntry *entry,
+                                CcKaPanelPrivate *priv)
+{
+    gint prompt_mins;
+
+    if (!entry->value || entry->value->type != GCONF_VALUE_INT)
+        return;
+
+    prompt_mins = gconf_value_get_int (entry->value);
+
+    if (prompt_mins != gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (priv->prompt_mins_entry)))
+        gtk_spin_button_set_value (GTK_SPIN_BUTTON (priv->prompt_mins_entry), prompt_mins);
+}
+
+
+static gint
+cc_ka_panel_setup_prompt_mins_entry (CcKaPanelPrivate *priv)
+{
+    gint prompt_mins;
+
+    priv->prompt_mins_entry = WID (priv->builder, "prompt_mins_entry");
+    g_assert (priv->prompt_mins_entry != NULL);
+
+    prompt_mins = gconf_client_get_int (priv->client, KA_GCONF_KEY_PROMPT_MINS, NULL);
+
+    gtk_spin_button_set_value (GTK_SPIN_BUTTON (priv->prompt_mins_entry), prompt_mins);
+
+    g_signal_connect (priv->prompt_mins_entry, "value-changed",
+                      G_CALLBACK (cc_ka_panel_prompt_mins_changed), priv);
+
+    if (!gconf_client_key_is_writable (priv->client, KA_GCONF_KEY_PROMPT_MINS, NULL)) {
+        gtk_widget_set_sensitive (priv->prompt_mins_entry, FALSE);
+    }
+
+    priv->listeners [priv->n_listeners] =
+        gconf_client_notify_add (priv->client,
+                                 KA_GCONF_KEY_PROMPT_MINS,
+                                 (GConfClientNotifyFunc) cc_ka_panel_prompt_mins_notify,
+                                 priv, NULL, NULL);
+    priv->n_listeners++;
+    return prompt_mins;
+}
+
+static void
+cc_ka_panel_get_property (GObject    *self,
+                          guint       property_id,
+                          GValue     *value G_GNUC_UNUSED,
+                          GParamSpec *pspec)
+{
+    switch (property_id) {
+        default:
+          G_OBJECT_WARN_INVALID_PROPERTY_ID (self, property_id, pspec);
+    }
+}
+
+static void
+cc_ka_panel_set_property (GObject      *self,
+                          guint         property_id,
+                          const GValue *value G_GNUC_UNUSED,
+                          GParamSpec   *pspec)
+{
+    switch (property_id) {
+        default:
+          G_OBJECT_WARN_INVALID_PROPERTY_ID (self, property_id, pspec);
+    }
+}
+
+static void
+cc_ka_panel_dispose (GObject *self)
+{
+    CcKaPanelPrivate *priv = GET_PRIVATE (self);
+
+    if (priv->builder != NULL) {
+        g_object_unref (priv->builder);
+        priv->builder = NULL;
+    }
+    G_OBJECT_CLASS (cc_ka_panel_parent_class)->dispose (self);
+}
+
+static void
+cc_ka_panel_finalize (GObject *self)
+{
+    CcKaPanelPrivate *priv = GET_PRIVATE (self);
+
+    if (priv->client) {
+        int i;
+
+        for (i = 0; i < priv->n_listeners; i++) {
+            if (priv->listeners [i])
+                gconf_client_notify_remove (priv->client, priv->listeners [i]);
+            priv->listeners [i] = 0;
+        }
+        priv->n_listeners = 0;
+
+      gconf_client_remove_dir (priv->client, KA_GCONF_PATH, NULL);
+
+      g_object_unref (priv->client);
+      priv->client = NULL;
+  }
+
+    G_OBJECT_CLASS (cc_ka_panel_parent_class)->finalize (self);
+}
+
+static void
+cc_ka_panel_class_init (CcKaPanelClass *klass)
+{
+    GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+    g_type_class_add_private (klass, sizeof (CcKaPanelPrivate));
+
+    object_class->get_property = cc_ka_panel_get_property;
+    object_class->set_property = cc_ka_panel_set_property;
+    object_class->dispose = cc_ka_panel_dispose;
+    object_class->finalize = cc_ka_panel_finalize;
+}
+
+static void
+cc_ka_panel_class_finalize (CcKaPanelClass *klass G_GNUC_UNUSED)
+{
+}
+
+static void
+cc_ka_panel_init (CcKaPanel *self)
+{
+    GError *error = NULL;
+
+    CcKaPanelPrivate *priv = GET_PRIVATE (self);
+
+    priv->builder = gtk_builder_new ();
+    gtk_builder_add_from_file(priv->builder, KA_DATA_DIR G_DIR_SEPARATOR_S
+                              "ka-panel.ui", &error);
+    if (error != NULL) {
+        g_warning ("Could not load interface file: %s", error->message);
+        g_error_free (error);
+        return;
+
+    }
+    priv->client = gconf_client_get_default ();
+    gconf_client_add_dir (priv->client, KA_GCONF_PATH,
+                          GCONF_CLIENT_PRELOAD_ONELEVEL, NULL);
+
+    cc_ka_panel_setup_principal_entry (priv);
+    cc_ka_panel_setup_pkuserid_entry (priv);
+    cc_ka_panel_setup_pkuserid_button (priv);
+    cc_ka_panel_setup_smartcard_toggle (priv);
+    cc_ka_panel_setup_pkanchors_entry(priv);
+    cc_ka_panel_setup_pkanchors_button (priv);
+    cc_ka_panel_setup_forwardable_toggle (priv);
+    cc_ka_panel_setup_proxiable_toggle (priv);
+    cc_ka_panel_setup_renewable_toggle (priv);
+    cc_ka_panel_setup_trayicon_toggle (priv);
+    cc_ka_panel_setup_prompt_mins_entry (priv);
+
+    g_assert (priv->n_listeners == N_LISTENERS);
+
+    priv->notebook = WID (priv->builder, "ka_notebook");
+    gtk_widget_reparent (priv->notebook, (GtkWidget *) self);
+
+    gtk_widget_show (priv->notebook);
+}
+
+void
+cc_ka_panel_register (GIOModule *module)
+{
+    cc_ka_panel_register_type (G_TYPE_MODULE (module));
+    g_io_extension_point_implement (CC_SHELL_PANEL_EXTENSION_POINT,
+                                    CC_TYPE_KA_PANEL,
+                                    "ka-panel", 0);
+}
+
+/*
+ * vim:ts:sts=4:sw=4:et:
+ */
diff --git a/cc-panel/cc-ka-panel.h b/cc-panel/cc-ka-panel.h
new file mode 100644
index 0000000..d8fdda0
--- /dev/null
+++ b/cc-panel/cc-ka-panel.h
@@ -0,0 +1,45 @@
+/* cc-ka-panel.h */
+
+#ifndef _CC_KA_PANEL
+#define _CC_KA_PANEL
+
+#include <libgnome-control-center/cc-panel.h>
+
+G_BEGIN_DECLS
+
+#define CC_TYPE_KA_PANEL cc_ka_panel_get_type()
+
+#define CC_KA_PANEL(obj) \
+  (G_TYPE_CHECK_INSTANCE_CAST ((obj),CC_TYPE_KA_PANEL, CcKaPanel))
+
+#define CC_KA_PANEL_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_CAST ((klass), CC_TYPE_KA_PANEL, CcKaPanelClass))
+
+#define CC_IS_KA_PANEL(obj) \
+  (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CC_TYPE_KA_PANEL))
+
+#define CC_IS_KA_PANEL_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_TYPE ((klass), CC_TYPE_KA_PANEL))
+
+#define CC_KA_PANEL_GET_CLASS(obj) \
+  (G_TYPE_INSTANCE_GET_CLASS ((obj), CC_TYPE_KA_PANEL, CcKaPanelClass))
+
+typedef struct {
+    CcPanel parent;
+} CcKaPanel;
+
+typedef struct {
+    CcPanelClass parent_class;
+} CcKaPanelClass;
+
+GType cc_ka_panel_get_type (void) G_GNUC_CONST;
+
+void cc_ka_panel_register (GIOModule *module);
+
+G_END_DECLS
+
+#endif /* _CC_KA_PANEL */
+
+/*
+ * vim:ts:sts=4:sw=4:et:
+ */
diff --git a/cc-panel/gnome-ka-panel.desktop.in b/cc-panel/gnome-ka-panel.desktop.in
new file mode 100644
index 0000000..f7105c5
--- /dev/null
+++ b/cc-panel/gnome-ka-panel.desktop.in
@@ -0,0 +1,17 @@
+[Desktop Entry]
+_Name=Kerberos Authentication
+_Comment=Set your Kerberos network authentication preferences
+Exec=gnome-ka-properties
+Icon=krb-valid-ticket
+Terminal=false
+Type=Application
+StartupNotify=true
+# The X-GNOME-Settings-Panel is necessary to show in the main shell UI
+Categories=GNOME;GTK;Settings;DesktopSettings;X-GNOME-Settings-Panel;
+OnlyShowIn=GNOME;
+X-GNOME-Settings-Panel=ka-panel
+X-GNOME-Bugzilla-Bugzilla=GNOME
+X-GNOME-Bugzilla-Product=krb5-auth-dialog
+X-GNOME-Bugzilla-Component=general
+# Translators: those are keywords for the example control-center panel
+_X-GNOME-Keywords=Kerberos;Authentication
diff --git a/cc-panel/ka-module.c b/cc-panel/ka-module.c
new file mode 100644
index 0000000..17ab5bd
--- /dev/null
+++ b/cc-panel/ka-module.c
@@ -0,0 +1,20 @@
+#include <config.h>
+
+#include "cc-ka-panel.h"
+
+#include <glib/gi18n.h>
+
+void
+g_io_module_load (GIOModule *module)
+{
+  bindtextdomain (GETTEXT_PACKAGE, LOCALE_DIR);
+  bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
+
+  /* register the panel */
+  cc_ka_panel_register (module);
+}
+
+void
+g_io_module_unload (GIOModule *module G_GNUC_UNUSED)
+{
+}
diff --git a/cc-panel/ka-panel.ui b/cc-panel/ka-panel.ui
new file mode 100644
index 0000000..10dbc14
--- /dev/null
+++ b/cc-panel/ka-panel.ui
@@ -0,0 +1,675 @@
+<?xml version="1.0"?>
+<interface>
+  <requires lib="gtk+" version="2.16"/>
+  <!-- interface-naming-policy project-wide -->
+  <object class="GtkWindow" id="window1">
+    <child>
+      <object class="GtkNotebook" id="ka_notebook">
+        <property name="visible">True</property>
+        <property name="can_focus">True</property>
+        <child>
+          <object class="GtkVBox" id="vbox1">
+            <property name="visible">True</property>
+            <property name="border_width">12</property>
+            <property name="orientation">vertical</property>
+            <property name="spacing">18</property>
+            <child>
+              <object class="GtkVBox" id="vbox2">
+                <property name="visible">True</property>
+                <property name="orientation">vertical</property>
+                <property name="spacing">12</property>
+                <child>
+                  <object class="GtkLabel" id="label4">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="label" translatable="yes">Kerberos User</property>
+                    <attributes>
+                      <attribute name="weight" value="bold"/>
+                    </attributes>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkHBox" id="hbox1">
+                    <property name="visible">True</property>
+                    <property name="spacing">12</property>
+                    <child>
+                      <object class="GtkImage" id="access">
+                        <property name="visible">True</property>
+                        <property name="yalign">0</property>
+                        <property name="icon_name">krb-valid-ticket</property>
+                        <property name="icon-size">6</property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="position">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkVBox" id="vbox5">
+                        <property name="visible">True</property>
+                        <property name="orientation">vertical</property>
+                        <property name="spacing">6</property>
+                        <child>
+                          <object class="GtkFrame" id="frame4">
+                            <property name="visible">True</property>
+                            <property name="label_xalign">0</property>
+                            <property name="shadow_type">none</property>
+                            <child>
+                              <object class="GtkAlignment" id="alignment4">
+                                <property name="visible">True</property>
+                                <property name="left_padding">12</property>
+                                <child>
+                                  <object class="GtkEntry" id="principal_entry">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="invisible_char">&#x25CF;</property>
+                                    <property name="activates_default">True</property>
+                                  </object>
+                                </child>
+                              </object>
+                            </child>
+                            <child type="label">
+                              <object class="GtkLabel" id="label3">
+                                <property name="visible">True</property>
+                                <property name="label" translatable="yes">Kerberos principal:</property>
+                                <property name="use_markup">True</property>
+                              </object>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="position">0</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkFrame" id="frame1">
+                            <property name="visible">True</property>
+                            <property name="label_xalign">0</property>
+                            <property name="shadow_type">none</property>
+                            <child>
+                              <object class="GtkAlignment" id="alignment1">
+                                <property name="visible">True</property>
+                                <property name="left_padding">12</property>
+                                <child>
+                                  <object class="GtkVBox" id="vbox6">
+                                    <property name="visible">True</property>
+                                    <property name="orientation">vertical</property>
+                                    <child>
+                                      <object class="GtkFrame" id="frame2">
+                                        <property name="visible">True</property>
+                                        <property name="label_xalign">0</property>
+                                        <property name="shadow_type">none</property>
+                                        <child>
+                                          <object class="GtkAlignment" id="alignment2">
+                                            <property name="visible">True</property>
+                                            <property name="left_padding">24</property>
+                                            <child>
+                                              <object class="GtkVBox" id="vbox11">
+                                                <property name="visible">True</property>
+                                                <property name="orientation">vertical</property>
+                                                <child>
+                                                  <object class="GtkCheckButton" id="smartcard_toggle">
+                                                    <property name="label" translatable="yes">Use Smartcard</property>
+                                                    <property name="visible">True</property>
+                                                    <property name="can_focus">True</property>
+                                                    <property name="receives_default">False</property>
+                                                    <property name="tooltip_text" translatable="yes">If checked, use a security token (Smartcard) to authenticate.</property>
+                                                    <property name="draw_indicator">True</property>
+                                                  </object>
+                                                  <packing>
+                                                    <property name="position">0</property>
+                                                  </packing>
+                                                </child>
+                                                <child>
+                                                  <object class="GtkHBox" id="hbox13">
+                                                    <property name="visible">True</property>
+                                                    <child>
+                                                      <object class="GtkEntry" id="pkuserid_entry">
+                                                        <property name="visible">True</property>
+                                                        <property name="can_focus">True</property>
+                                                        <property name="tooltip_text" translatable="yes">Certificate and private key used for authentication</property>
+                                                        <property name="invisible_char">&#x25CF;</property>
+                                                        <property name="activates_default">True</property>
+                                                      </object>
+                                                      <packing>
+                                                        <property name="position">0</property>
+                                                      </packing>
+                                                    </child>
+                                                    <child>
+                                                      <object class="GtkButton" id="pkuserid_button">
+                                                        <property name="label" translatable="yes">_Browse...</property>
+                                                        <property name="visible">True</property>
+                                                        <property name="can_focus">True</property>
+                                                        <property name="receives_default">True</property>
+                                                        <property name="use_underline">True</property>
+                                                      </object>
+                                                      <packing>
+                                                        <property name="expand">False</property>
+                                                        <property name="position">1</property>
+                                                      </packing>
+                                                    </child>
+                                                  </object>
+                                                  <packing>
+                                                    <property name="position">1</property>
+                                                  </packing>
+                                                </child>
+                                              </object>
+                                            </child>
+                                          </object>
+                                        </child>
+                                        <child type="label">
+                                          <object class="GtkLabel" id="label21">
+                                            <property name="visible">True</property>
+                                            <property name="label" translatable="yes">Userid:</property>
+                                            <property name="use_markup">True</property>
+                                          </object>
+                                        </child>
+                                      </object>
+                                      <packing>
+                                        <property name="position">0</property>
+                                      </packing>
+                                    </child>
+                                    <child>
+                                      <object class="GtkFrame" id="frame3">
+                                        <property name="visible">True</property>
+                                        <property name="label_xalign">0</property>
+                                        <property name="shadow_type">none</property>
+                                        <child>
+                                          <object class="GtkAlignment" id="alignment3">
+                                            <property name="visible">True</property>
+                                            <property name="left_padding">24</property>
+                                            <child>
+                                              <object class="GtkHBox" id="hbox6">
+                                                <property name="visible">True</property>
+                                                <child>
+                                                  <object class="GtkEntry" id="pkanchors_entry">
+                                                    <property name="visible">True</property>
+                                                    <property name="can_focus">True</property>
+                                                    <property name="invisible_char">&#x25CF;</property>
+                                                    <property name="activates_default">True</property>
+                                                  </object>
+                                                  <packing>
+                                                    <property name="position">0</property>
+                                                  </packing>
+                                                </child>
+                                                <child>
+                                                  <object class="GtkButton" id="pkanchors_button">
+                                                    <property name="label" translatable="yes">_Browse...</property>
+                                                    <property name="visible">True</property>
+                                                    <property name="can_focus">True</property>
+                                                    <property name="receives_default">True</property>
+                                                    <property name="use_underline">True</property>
+                                                  </object>
+                                                  <packing>
+                                                    <property name="expand">False</property>
+                                                    <property name="position">1</property>
+                                                  </packing>
+                                                </child>
+                                              </object>
+                                            </child>
+                                          </object>
+                                        </child>
+                                        <child type="label">
+                                          <object class="GtkLabel" id="label22">
+                                            <property name="visible">True</property>
+                                            <property name="label" translatable="yes">X509 trust anchors:</property>
+                                            <property name="use_markup">True</property>
+                                          </object>
+                                        </child>
+                                      </object>
+                                      <packing>
+                                        <property name="position">1</property>
+                                      </packing>
+                                    </child>
+                                  </object>
+                                </child>
+                              </object>
+                            </child>
+                            <child type="label">
+                              <object class="GtkLabel" id="fram1">
+                                <property name="visible">True</property>
+                                <property name="label" translatable="yes">PKINIT:</property>
+                              </object>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
+                      </object>
+                      <packing>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkVBox" id="vbox3">
+                <property name="visible">True</property>
+                <property name="orientation">vertical</property>
+                <property name="spacing">12</property>
+                <child>
+                  <object class="GtkLabel" id="label5">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="label" translatable="yes">Ticket Options</property>
+                    <attributes>
+                      <attribute name="weight" value="bold"/>
+                    </attributes>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkHBox" id="hbox2">
+                    <property name="visible">True</property>
+                    <property name="spacing">12</property>
+                    <child>
+                      <object class="GtkImage" id="image1">
+                        <property name="visible">True</property>
+                        <property name="yalign">0</property>
+                        <property name="icon_name">system-lock-screen</property>
+                        <property name="icon-size">6</property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="position">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkVBox" id="vbox4">
+                        <property name="visible">True</property>
+                        <property name="orientation">vertical</property>
+                        <property name="spacing">6</property>
+                        <child>
+                          <object class="GtkLabel" id="label10">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Requested Kerberos tickets should be:</property>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">False</property>
+                            <property name="position">0</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkHBox" id="hbox3">
+                            <property name="visible">True</property>
+                            <child>
+                              <object class="GtkLabel" id="label11">
+                                <property name="visible">True</property>
+                                <property name="label">    </property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">0</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkCheckButton" id="forwardable_toggle">
+                                <property name="label" translatable="yes">forwardable</property>
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="receives_default">False</property>
+                                <property name="tooltip_text" translatable="yes">If checked, request forwardable tickets</property>
+                                <property name="draw_indicator">True</property>
+                              </object>
+                              <packing>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">False</property>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkHBox" id="hbox4">
+                            <property name="visible">True</property>
+                            <child>
+                              <object class="GtkLabel" id="label12">
+                                <property name="visible">True</property>
+                                <property name="label">    </property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">0</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkCheckButton" id="renewable_toggle">
+                                <property name="label" translatable="yes">renewable</property>
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="receives_default">False</property>
+                                <property name="tooltip_text" translatable="yes">If checked, request renewable tickets</property>
+                                <property name="draw_indicator">True</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="position">2</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkHBox" id="hbox11">
+                            <property name="visible">True</property>
+                            <child>
+                              <object class="GtkLabel" id="label19">
+                                <property name="visible">True</property>
+                                <property name="label">    </property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">0</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkCheckButton" id="proxiable_toggle">
+                                <property name="label" translatable="yes">proxiable</property>
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="receives_default">False</property>
+                                <property name="tooltip_text" translatable="yes">If checked, request proxiable tickets</property>
+                                <property name="draw_indicator">True</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="position">3</property>
+                          </packing>
+                        </child>
+                      </object>
+                      <packing>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+        </child>
+        <child type="tab">
+          <object class="GtkLabel" id="label1">
+            <property name="visible">True</property>
+            <property name="label" translatable="yes">Kerberos</property>
+          </object>
+          <packing>
+            <property name="tab_fill">False</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkVBox" id="vbox9">
+            <property name="visible">True</property>
+            <property name="border_width">12</property>
+            <property name="orientation">vertical</property>
+            <property name="spacing">18</property>
+            <child>
+              <object class="GtkVBox" id="vbox8">
+                <property name="visible">True</property>
+                <property name="orientation">vertical</property>
+                <property name="spacing">12</property>
+                <child>
+                  <object class="GtkLabel" id="label17">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="label" translatable="yes">Notifications</property>
+                    <attributes>
+                      <attribute name="weight" value="bold"/>
+                    </attributes>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkHBox" id="hbox9">
+                    <property name="visible">True</property>
+                    <property name="spacing">12</property>
+                    <child>
+                      <object class="GtkImage" id="image3">
+                        <property name="visible">True</property>
+                        <property name="yalign">0</property>
+                        <property name="stock">gtk-dialog-warning</property>
+                        <property name="icon-size">6</property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="position">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkHBox" id="hbox8">
+                        <property name="visible">True</property>
+                        <property name="spacing">6</property>
+                        <child>
+                          <object class="GtkLabel" id="label14">
+                            <property name="visible">True</property>
+                            <property name="label">    </property>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">False</property>
+                            <property name="position">0</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkLabel" id="label15">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes" comments="Used in combination: 'Warn x minutes before expiry'">Warn</property>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">False</property>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkSpinButton" id="prompt_mins_entry">
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="tooltip_text" translatable="yes">Send notification about ticket expiry that many minutes before it finally expires</property>
+                            <property name="invisible_char">&#x25CF;</property>
+                            <property name="snap_to_ticks">True</property>
+                            <property name="numeric">True</property>
+                            <property name="adjustment">adjustment1</property>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">False</property>
+                            <property name="position">2</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkLabel" id="label16">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes" comments="Used in combination: 'Warn x minutes before expiry'">minutes before expiry</property>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">False</property>
+                            <property name="position">3</property>
+                          </packing>
+                        </child>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkVBox" id="vbox10">
+                <property name="visible">True</property>
+                <property name="orientation">vertical</property>
+                <property name="spacing">12</property>
+                <child>
+                  <object class="GtkLabel" id="label18">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="label" translatable="yes">Appearance</property>
+                    <attributes>
+                      <attribute name="weight" value="bold"/>
+                    </attributes>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkHBox" id="hbox10">
+                    <property name="visible">True</property>
+                    <property name="spacing">12</property>
+                    <child>
+                      <object class="GtkImage" id="image2">
+                        <property name="visible">True</property>
+                        <property name="xalign">0</property>
+                        <property name="yalign">0</property>
+                        <property name="stock">gtk-zoom-in</property>
+                        <property name="icon-size">6</property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="position">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkVBox" id="vbox7">
+                        <property name="visible">True</property>
+                        <property name="orientation">vertical</property>
+                        <child>
+                          <object class="GtkHBox" id="hbox7">
+                            <property name="visible">True</property>
+                            <property name="spacing">6</property>
+                            <child>
+                              <object class="GtkLabel" id="label13">
+                                <property name="visible">True</property>
+                                <property name="label">    </property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">0</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkCheckButton" id="trayicon_toggle">
+                                <property name="label" translatable="yes">Show tray icon</property>
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="receives_default">False</property>
+                                <property name="tooltip_text" translatable="yes">If checked, display the tray icon in the status bar</property>
+                                <property name="draw_indicator">True</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="position">0</property>
+                          </packing>
+                        </child>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child type="tab">
+          <object class="GtkLabel" id="label2">
+            <property name="visible">True</property>
+            <property name="label" translatable="yes">Applet</property>
+          </object>
+          <packing>
+            <property name="position">1</property>
+            <property name="tab_fill">False</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+  </object>
+  <object class="GtkAdjustment" id="adjustment1">
+    <property name="upper">1000</property>
+    <property name="step_increment">1</property>
+    <property name="page_increment">10</property>
+    <property name="page_size">10</property>
+  </object>
+</interface>
diff --git a/configure.ac b/configure.ac
index 8a02673..415ea10 100644
--- a/configure.ac
+++ b/configure.ac
@@ -221,6 +221,13 @@ if test "x$with_libnotify" = "xyes" ; then
     LIBS="$savedLIBS"
 fi
 
+dnl libgnome-control-center
+dnl for the new panel
+PKG_CHECK_MODULES(CONTROL_CENTER, [
+ libgnome-control-center >= 2.31.4])
+PANELS_DIR="${libdir}/control-center-1/panels"
+AC_SUBST(PANELS_DIR)
+
 dnl secmem
 dnl Checks for library functions.
 AC_CHECK_FUNCS(seteuid stpcpy mmap)
@@ -301,6 +308,7 @@ preferences/krb5-auth-dialog-preferences.1
 help/Makefile
 examples/Makefile
 plugins/Makefile
+cc-panel/Makefile
 ])
 
 AC_MSG_NOTICE([])
@@ -324,6 +332,7 @@ AC_MSG_NOTICE([  Network Manager: $NETWORK_MANAGER_CFLAGS $NETWORK_MANAGER_LIBS]
 else
 AC_MSG_NOTICE([  Network Manager: no])
 fi
+AC_MSG_NOTICE([         gnome-cc: $CONTROL_CENTER_CFLAGS $CONTROL_CENTER_LIBS])
 AC_MSG_NOTICE([])
 AC_MSG_NOTICE([Miscellaneous])
 AC_MSG_NOTICE([])
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 1c06eb2..dbc8ecb 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -11,3 +11,6 @@ secmem/util.c
 preferences/ka-preferences.c
 preferences/krb5-auth-dialog-preferences.desktop.in
 [type: gettext/glade]preferences/krb5-auth-dialog-preferences.xml
+cc-panel/gnome-ka-panel.desktop.in
+[type: gettext/glade]cc-panel/ka-panel.ui
+cc-panel/cc-ka-panel.c



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]