For internal use by the PKCS#11 token sidebar. --- po/POTFILES.in | 1 + ui/Makefile.am | 2 + ui/gcr-tokens-sidebar-row.c | 212 +++++++++++++++++++++++++++++++++++++++++++ ui/gcr-tokens-sidebar-row.h | 39 ++++++++ ui/gcr-tokens-sidebar-row.ui | 97 ++++++++++++++++++++ ui/gcr-ui.symbols | 3 + ui/gcr.gresource.xml | 1 + 7 files changed, 355 insertions(+) create mode 100644 ui/gcr-tokens-sidebar-row.c create mode 100644 ui/gcr-tokens-sidebar-row.h create mode 100644 ui/gcr-tokens-sidebar-row.ui
diff --git a/po/POTFILES.in b/po/POTFILES.in index a57d084..5afd4f2 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -34,6 +34,7 @@ ui/gcr-prompt-dialog.c ui/gcr-prompter.desktop.in.in ui/gcr-token-login-dialog.c [type: gettext/glade]ui/gcr-token-login-dialog.ui +ui/gcr-tokens-sidebar-row.c ui/gcr-certificate-exporter.c [type: gettext/glade]ui/gcr-unlock-options-widget.ui ui/gcr-unlock-renderer.c diff --git a/ui/Makefile.am b/ui/Makefile.am index 0b515ff..12fdd5f 100644 --- a/ui/Makefile.am +++ b/ui/Makefile.am @@ -63,6 +63,7 @@ ui_HEADER_FILES = \ ui/gcr-renderer.h \ ui/gcr-secure-entry-buffer.h \ ui/gcr-token-login-dialog.h \ + ui/gcr-tokens-sidebar-row.h \ ui/gcr-tree-selector.h \ ui/gcr-unlock-options-widget.h \ ui/gcr-viewer.h \ @@ -109,6 +110,7 @@ ui_PRIVATE_FILES = \ ui/gcr-pkcs11-import-dialog.c ui/gcr-pkcs11-import-dialog.h \ ui/gcr-pkcs11-import-interaction.c ui/gcr-pkcs11-import-interaction.h \ ui/gcr-token-login-dialog.c ui/gcr-token-login-dialog.h \ + ui/gcr-tokens-sidebar-row.c ui/gcr-tokens-sidebar-row.h \ ui/gcr-unlock-renderer.c ui/gcr-unlock-renderer.h \ ui/gcr-viewer-window.c ui/gcr-viewer-window.h \ $(NULL) diff --git a/ui/gcr-tokens-sidebar-row.c b/ui/gcr-tokens-sidebar-row.c new file mode 100644 index 0000000..4c9229a --- /dev/null +++ b/ui/gcr-tokens-sidebar-row.c @@ -0,0 +1,212 @@ +/* + * Copyright (C) 2016 Lubomir Rintel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see <http://www.gnu.org/licenses/>. + */ + +#include "gcr-tokens-sidebar-row.h" + +#include <glib/gi18n.h> +#include <gck/gck.h> + +/** + * SECTION:gcr-tokens-sidebar-row + * @title: GcrTokensSidebarRow + * @short_description: The PKCS11 Tokens Sidebar Row + * @see_also: #GcrTokensSidebarRow + * + * #GcrTokensSidebarRow is the tokens sidebar row widget. + */ + +enum { + TOKEN_LOGIN, + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL] = { 0 }; + +struct _GcrTokensSidebarRowPrivate +{ + GckSlot *slot; + GtkEventBox *event_box; + GtkImage *icon_widget; + GtkLabel *label_widget; + GtkButton *login_button; +}; + +G_DEFINE_TYPE_WITH_CODE (GcrTokensSidebarRow, gcr_tokens_sidebar_row, GTK_TYPE_LIST_BOX_ROW, + G_ADD_PRIVATE (GcrTokensSidebarRow)); + +enum +{ + PROP_0, + PROP_SLOT, +}; + +static void +get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +{ + GcrTokensSidebarRow *self = GCR_TOKENS_SIDEBAR_ROW (object); + GcrTokensSidebarRowPrivate *priv = self->priv; + + switch (prop_id) { + case PROP_SLOT: + if (priv->slot) + g_value_set_object (value, priv->slot); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +{ + GcrTokensSidebarRow *self = GCR_TOKENS_SIDEBAR_ROW (object); + GcrTokensSidebarRowPrivate *priv = self->priv; + gboolean needs_login = FALSE; + + switch (prop_id) { + case PROP_SLOT: + /* Construct only. */ + priv->slot = g_value_dup_object (value); + + if (priv->slot) { + GckTokenInfo *info; + + info = gck_slot_get_token_info (priv->slot); + g_return_if_fail (info); + gtk_label_set_text (priv->label_widget, info->label); + needs_login = info->flags & CKF_LOGIN_REQUIRED; + gck_token_info_free (info); + } else { + gtk_widget_hide (GTK_WIDGET (priv->icon_widget)); + gtk_widget_set_no_show_all (GTK_WIDGET (priv->icon_widget), TRUE); + gtk_label_set_markup (priv->label_widget, _("<b>All tokens</b>")); + } + + if (!needs_login) { + gtk_widget_hide (GTK_WIDGET (priv->login_button)); + gtk_widget_set_no_show_all (GTK_WIDGET (priv->login_button), TRUE); + } + + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +finalize (GObject *object) +{ + GcrTokensSidebarRow *self = GCR_TOKENS_SIDEBAR_ROW (object); + GcrTokensSidebarRowPrivate *priv = self->priv; + + g_clear_object (&priv->slot); + + G_OBJECT_CLASS (gcr_tokens_sidebar_row_parent_class)->finalize (object); +} + + +static void +login_clicked (GtkButton *button, gpointer user_data) +{ + GcrTokensSidebarRow *self = GCR_TOKENS_SIDEBAR_ROW (user_data); + + g_signal_emit (self, signals[TOKEN_LOGIN], 0); +} + +static void +gcr_tokens_sidebar_row_class_init (GcrTokensSidebarRowClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->get_property = get_property; + object_class->set_property = set_property; + object_class->finalize = finalize; + + /** + * GcrTokensSidebarRowClass::token-login: + * + * Emitted with the login button is clicked. + */ + signals[TOKEN_LOGIN] = g_signal_new ("token-login", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_FIRST, + 0, NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, + 0); + + /** + * GcrTokensSidebarRowClass::slot: + * + * The PKCS#11 slot or %NULL for all slots. + */ + g_object_class_install_property (object_class, PROP_SLOT, + g_param_spec_object ("slot", "Slot", "PKCS#11 Slot", + GCK_TYPE_SLOT, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/gcr/ui/gcr-tokens-sidebar-row.ui"); + + gtk_widget_class_bind_template_child_private (widget_class, GcrTokensSidebarRow, event_box); + gtk_widget_class_bind_template_child_private (widget_class, GcrTokensSidebarRow, icon_widget); + gtk_widget_class_bind_template_child_private (widget_class, GcrTokensSidebarRow, label_widget); + gtk_widget_class_bind_template_child_private (widget_class, GcrTokensSidebarRow, login_button); + gtk_widget_class_bind_template_callback (widget_class, login_clicked); + + gtk_widget_class_set_css_name (widget_class, "row"); +} + +static void +gcr_tokens_sidebar_row_init (GcrTokensSidebarRow *self) +{ + self->priv = gcr_tokens_sidebar_row_get_instance_private (self); + gtk_widget_init_template (GTK_WIDGET (self)); +} + +/** + * gcr_tokens_sidebar_row_get_slot: + * @self: The #GcrTokensSidebarRow + * + * The slot getter. + * + * Returns: the associated slot, or %NULL + */ +GckSlot * +gcr_tokens_sidebar_row_get_slot (GcrTokensSidebarRow *self) +{ + GcrTokensSidebarRowPrivate *priv = self->priv; + + return priv->slot; +} + +/** + * gcr_tokens_sidebar_row_new: + * @slot: the associated %slot + * + * Creates the new #GcrTokensSidebarRow for given slot. + * If %NULL is given for the slot, then the "All slots" row + * is created. + * + * Returns: the newly created #GcrTokensSidebarRow + */ +GtkWidget * +gcr_tokens_sidebar_row_new (GckSlot *slot) +{ + return GTK_WIDGET (g_object_new (GCR_TYPE_TOKENS_SIDEBAR_ROW, + "slot", slot, NULL)); +} diff --git a/ui/gcr-tokens-sidebar-row.h b/ui/gcr-tokens-sidebar-row.h new file mode 100644 index 0000000..56b7cd9 --- /dev/null +++ b/ui/gcr-tokens-sidebar-row.h @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2016 Lubomir Rintel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef __GCR_TOKENS_SIDEBAR_ROW_H__ +#define __GCR_TOKENS_SIDEBAR_ROW_H__ + +#include <gtk/gtk.h> +#include <gck/gck.h> + +typedef struct _GcrTokensSidebarRowPrivate GcrTokensSidebarRowPrivate; + +struct _GcrTokensSidebarRow +{ + GtkListBoxRow parent_instance; + GcrTokensSidebarRowPrivate *priv; +}; + +#define GCR_TYPE_TOKENS_SIDEBAR_ROW gcr_tokens_sidebar_row_get_type () +G_DECLARE_FINAL_TYPE (GcrTokensSidebarRow, gcr_tokens_sidebar_row, GCR, TOKENS_SIDEBAR_ROW, GtkListBoxRow); + +GtkWidget *gcr_tokens_sidebar_row_new (GckSlot *slot); + +GckSlot *gcr_tokens_sidebar_row_get_slot (GcrTokensSidebarRow *self); + +#endif /* __GCR_TOKENS_SIDEBAR_ROW_H__ */ diff --git a/ui/gcr-tokens-sidebar-row.ui b/ui/gcr-tokens-sidebar-row.ui new file mode 100644 index 0000000..c27d494 --- /dev/null +++ b/ui/gcr-tokens-sidebar-row.ui @@ -0,0 +1,97 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.20.0 --> +<interface domain="gtk30"> + <requires lib="gtk+" version="3.10"/> + <template class="GcrTokensSidebarRow" parent="GtkListBoxRow"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">1</property> + <property name="margin_bottom">1</property> + <child> + <object class="GtkRevealer" id="revealer"> + <property name="visible">1</property> + <property name="reveal-child">1</property> + <property name="can_focus">False</property> + <child> + <object class="GtkEventBox" id="event_box"> + <property name="can_focus">False</property> + <child> + <object class="GtkBox"> + <property name="can_focus">False</property> + <child> + <object class="GtkImage" id="icon_widget"> + <property name="can_focus">False</property> + <property name="icon_name">media-flash-symbolic</property> + <style> + <class name="sidebar-icon"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label_widget"> + <property name="can_focus">False</property> + <property name="hexpand">False</property> + <property name="xalign">0</property> + <style> + <class name="sidebar-label"/> + </style> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="login_button"> + <property name="can_focus">False</property> + <property name="receives_default">False</property> + <property name="halign">center</property> + <property name="valign">center</property> + <property name="margin_start">4</property> + <signal name="clicked" handler="login_clicked" swapped="no"/> + <child> + <object class="GtkImage"> + <property name="can_focus">False</property> + <property name="icon_name">dialog-password-symbolic</property> + <property name="icon_size">1</property> + </object> + </child> + <style> + <class name="image-button"/> + <class name="sidebar-button"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + </child> + </object> + </child> + <style> + <class name="sidebar-revealer"/> + </style> + </object> + </child> + <style> + <class name="sidebar-row"/> + </style> + </template> + <object class="GtkSizeGroup"> + <property name="mode">vertical</property> + <widgets> + <widget name="login_button"/> + <widget name="label_widget"/> + <widget name="icon_widget"/> + </widgets> + </object> +</interface> diff --git a/ui/gcr-ui.symbols b/ui/gcr-ui.symbols index c7640e1..85db159 100644 --- a/ui/gcr-ui.symbols +++ b/ui/gcr-ui.symbols @@ -80,6 +80,9 @@ gcr_token_login_dialog_get_pin_value gcr_token_login_dialog_get_remember_pin gcr_token_login_dialog_get_type gcr_token_login_dialog_new +gcr_tokens_sidebar_row_get_slot +gcr_tokens_sidebar_row_get_type +gcr_tokens_sidebar_row_new gcr_tree_selector_get_collection gcr_tree_selector_get_columns gcr_tree_selector_get_selected diff --git a/ui/gcr.gresource.xml b/ui/gcr.gresource.xml index 9e98153..00fdc53 100644 --- a/ui/gcr.gresource.xml +++ b/ui/gcr.gresource.xml @@ -4,5 +4,6 @@ <file preprocess="xml-stripblanks">gcr-pkcs11-import-dialog.ui</file> <file preprocess="xml-stripblanks">gcr-unlock-options-widget.ui</file> <file preprocess="xml-stripblanks">gcr-token-login-dialog.ui</file> + <file preprocess="xml-stripblanks">gcr-tokens-sidebar-row.ui</file> </gresource> </gresources> -- 2.9.3 _______________________________________________ gnome-keyring-list mailing list gnome-keyring-list@gnome.org https://mail.gnome.org/mailman/listinfo/gnome-keyring-list