summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcr-gtk3/GcrGtk3-3.metadata5
-rw-r--r--gcr-gtk3/eggimagemenuitem.c734
-rw-r--r--gcr-gtk3/eggimagemenuitem.h80
-rw-r--r--gcr-gtk3/frob-combo-selector.c98
-rw-r--r--gcr-gtk3/frob-gnupg-selector.c94
-rw-r--r--gcr-gtk3/frob-import-button.c251
-rw-r--r--gcr-gtk3/frob-key.c88
-rw-r--r--gcr-gtk3/frob-prompt.c279
-rw-r--r--gcr-gtk3/frob-request.c97
-rw-r--r--gcr-gtk3/frob-system-prompt.c145
-rw-r--r--gcr-gtk3/frob-tree-selector.c212
-rw-r--r--gcr-gtk3/frob-unlock-options.c83
-rw-r--r--gcr-gtk3/gcr-certificate-exporter.c570
-rw-r--r--gcr-gtk3/gcr-certificate-exporter.h74
-rw-r--r--gcr-gtk3/gcr-certificate-renderer-private.h49
-rw-r--r--gcr-gtk3/gcr-certificate-renderer.c925
-rw-r--r--gcr-gtk3/gcr-certificate-renderer.h73
-rw-r--r--gcr-gtk3/gcr-certificate-request-renderer.c531
-rw-r--r--gcr-gtk3/gcr-certificate-request-renderer.h71
-rw-r--r--gcr-gtk3/gcr-certificate-widget.c733
-rw-r--r--gcr-gtk3/gcr-certificate-widget.h64
-rw-r--r--gcr-gtk3/gcr-collection-model.c1654
-rw-r--r--gcr-gtk3/gcr-collection-model.h102
-rw-r--r--gcr-gtk3/gcr-combo-selector.c250
-rw-r--r--gcr-gtk3/gcr-combo-selector.h67
-rw-r--r--gcr-gtk3/gcr-crypto-types.xml1
-rw-r--r--gcr-gtk3/gcr-dialog-util.c171
-rw-r--r--gcr-gtk3/gcr-dialog-util.h40
-rw-r--r--gcr-gtk3/gcr-display-scrolled.c173
-rw-r--r--gcr-gtk3/gcr-display-scrolled.h57
-rw-r--r--gcr-gtk3/gcr-display-view.c1232
-rw-r--r--gcr-gtk3/gcr-display-view.h116
-rw-r--r--gcr-gtk3/gcr-failure-renderer.c228
-rw-r--r--gcr-gtk3/gcr-failure-renderer.h67
-rw-r--r--gcr-gtk3/gcr-gnupg-renderer.c852
-rw-r--r--gcr-gtk3/gcr-gnupg-renderer.h77
-rw-r--r--gcr-gtk3/gcr-gtk3.h17
-rw-r--r--gcr-gtk3/gcr-import-button.c592
-rw-r--r--gcr-gtk3/gcr-import-button.h74
-rw-r--r--gcr-gtk3/gcr-key-renderer.c481
-rw-r--r--gcr-gtk3/gcr-key-renderer.h66
-rw-r--r--gcr-gtk3/gcr-key-widget.c210
-rw-r--r--gcr-gtk3/gcr-key-widget.h61
-rw-r--r--gcr-gtk3/gcr-list-selector-private.h39
-rw-r--r--gcr-gtk3/gcr-list-selector.c442
-rw-r--r--gcr-gtk3/gcr-list-selector.h71
-rw-r--r--gcr-gtk3/gcr-live-search.c656
-rw-r--r--gcr-gtk3/gcr-live-search.h84
-rw-r--r--gcr-gtk3/gcr-pkcs11-import-dialog.c271
-rw-r--r--gcr-gtk3/gcr-pkcs11-import-dialog.h62
-rw-r--r--gcr-gtk3/gcr-pkcs11-import-dialog.ui255
-rw-r--r--gcr-gtk3/gcr-pkcs11-import-interaction.c249
-rw-r--r--gcr-gtk3/gcr-pkcs11-import-interaction.h38
-rw-r--r--gcr-gtk3/gcr-prompt-dialog.c1060
-rw-r--r--gcr-gtk3/gcr-prompt-dialog.h63
-rw-r--r--gcr-gtk3/gcr-renderer.c309
-rw-r--r--gcr-gtk3/gcr-renderer.h88
-rw-r--r--gcr-gtk3/gcr-section.c204
-rw-r--r--gcr-gtk3/gcr-section.h29
-rw-r--r--gcr-gtk3/gcr-tree-selector.c346
-rw-r--r--gcr-gtk3/gcr-tree-selector.h70
-rw-r--r--gcr-gtk3/gcr-unlock-options-widget.c501
-rw-r--r--gcr-gtk3/gcr-unlock-options-widget.h82
-rw-r--r--gcr-gtk3/gcr-unlock-options-widget.ui117
-rw-r--r--gcr-gtk3/gcr-unlock-renderer.c345
-rw-r--r--gcr-gtk3/gcr-unlock-renderer.h83
-rw-r--r--gcr-gtk3/gcr-viewer-widget.c680
-rw-r--r--gcr-gtk3/gcr-viewer-widget.h62
-rw-r--r--gcr-gtk3/gcr-viewer.c181
-rw-r--r--gcr-gtk3/gcr-viewer.h85
-rw-r--r--gcr-gtk3/meson.build50
-rw-r--r--gcr-gtk4/meson.build3
-rw-r--r--tools/frob-unlock.c123
-rw-r--r--tools/gcr-prompter-tool.c258
-rw-r--r--tools/gcr-prompter.desktop.in.in9
-rw-r--r--tools/gcr-viewer-tool.c126
-rw-r--r--tools/gcr-viewer-window.c201
-rw-r--r--tools/gcr-viewer-window.h68
-rw-r--r--tools/gcr-viewer.desktop.in.in7
-rw-r--r--tools/gtk3/meson.build7
-rw-r--r--tools/gtk3/viewer.c139
-rw-r--r--tools/gtk4/meson.build (renamed from gcr-gtk4/viewer/meson.build)2
-rw-r--r--tools/gtk4/viewer.c (renamed from gcr-gtk4/viewer/viewer.c)2
-rw-r--r--tools/meson.build70
84 files changed, 984 insertions, 18397 deletions
diff --git a/gcr-gtk3/GcrGtk3-3.metadata b/gcr-gtk3/GcrGtk3-3.metadata
deleted file mode 100644
index 85cb51a..0000000
--- a/gcr-gtk3/GcrGtk3-3.metadata
+++ /dev/null
@@ -1,5 +0,0 @@
-// Metadata file for Vala API generation.
-// See https://live.gnome.org/Vala/UpstreamGuide for more information
-
-CertificateRenderer
- .label skip=true \ No newline at end of file
diff --git a/gcr-gtk3/eggimagemenuitem.c b/gcr-gtk3/eggimagemenuitem.c
deleted file mode 100644
index 47d2d9e..0000000
--- a/gcr-gtk3/eggimagemenuitem.c
+++ /dev/null
@@ -1,734 +0,0 @@
-/* GTK - The GIMP Toolkit
- * Copyright (C) 2001 Red Hat, Inc.
- *
- * This library 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 of the License, or (at your option) any later version.
- *
- * This library 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 library. If not, see <http://www.gnu.org/licenses/>.
- */
-
-/*
- * GtkImageMenuItem was was deprecated from GTK+ and reasoning explained
- * here: https://docs.google.com/document/d/1KCVPoYQBqMbDP11tHPpjW6uaEHrvLUmcDPqKAppCY8o/pub
- * Gcr wants to use image menu items in button drop downs using the device icons
- * (for the import button). So just copy it here with the stock and activatable
- * sutff removed
- */
-
-/*
- * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
- * file for a list of people on the GTK+ Team. See the ChangeLog
- * files for a list of changes. These files are distributed with
- * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
- */
-
-#include "config.h"
-
-#include "eggimagemenuitem.h"
-
-struct _EggImageMenuItemPrivate
-{
- GtkWidget *image;
-
- gchar *label;
- guint always_show_image : 1;
- guint16 toggle_size;
-};
-
-enum {
- PROP_0,
- PROP_IMAGE,
- PROP_ALWAYS_SHOW_IMAGE
-};
-
-static void egg_image_menu_item_destroy (GtkWidget *widget);
-static void egg_image_menu_item_get_preferred_width (GtkWidget *widget,
- gint *minimum,
- gint *natural);
-static void egg_image_menu_item_get_preferred_height (GtkWidget *widget,
- gint *minimum,
- gint *natural);
-static void egg_image_menu_item_get_preferred_height_for_width (GtkWidget *widget,
- gint width,
- gint *minimum,
- gint *natural);
-static void egg_image_menu_item_size_allocate (GtkWidget *widget,
- GtkAllocation *allocation);
-static void egg_image_menu_item_map (GtkWidget *widget);
-static void egg_image_menu_item_remove (GtkContainer *container,
- GtkWidget *child);
-static void egg_image_menu_item_toggle_size_request (GtkMenuItem *menu_item,
- gint *requisition);
-static void egg_image_menu_item_toggle_size_allocate (GtkMenuItem *menu_item,
- gint allocation);
-static void egg_image_menu_item_set_label (GtkMenuItem *menu_item,
- const gchar *label);
-static const gchar * egg_image_menu_item_get_label (GtkMenuItem *menu_item);
-
-static void egg_image_menu_item_forall (GtkContainer *container,
- gboolean include_internals,
- GtkCallback callback,
- gpointer callback_data);
-
-static void egg_image_menu_item_finalize (GObject *object);
-static void egg_image_menu_item_set_property (GObject *object,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec);
-static void egg_image_menu_item_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec);
-static void egg_image_menu_item_screen_changed (GtkWidget *widget,
- GdkScreen *previous_screen);
-
-static void egg_image_menu_item_recalculate (EggImageMenuItem *image_menu_item);
-
-G_DEFINE_TYPE_WITH_PRIVATE (EggImageMenuItem, egg_image_menu_item, GTK_TYPE_MENU_ITEM);
-
-static void
-egg_image_menu_item_class_init (EggImageMenuItemClass *klass)
-{
- GObjectClass *gobject_class = (GObjectClass*) klass;
- GtkWidgetClass *widget_class = (GtkWidgetClass*) klass;
- GtkMenuItemClass *menu_item_class = (GtkMenuItemClass*) klass;
- GtkContainerClass *container_class = (GtkContainerClass*) klass;
-
- widget_class->destroy = egg_image_menu_item_destroy;
- widget_class->screen_changed = egg_image_menu_item_screen_changed;
- widget_class->get_preferred_width = egg_image_menu_item_get_preferred_width;
- widget_class->get_preferred_height = egg_image_menu_item_get_preferred_height;
- widget_class->get_preferred_height_for_width = egg_image_menu_item_get_preferred_height_for_width;
- widget_class->size_allocate = egg_image_menu_item_size_allocate;
- widget_class->map = egg_image_menu_item_map;
-
- container_class->forall = egg_image_menu_item_forall;
- container_class->remove = egg_image_menu_item_remove;
-
- menu_item_class->toggle_size_request = egg_image_menu_item_toggle_size_request;
- menu_item_class->toggle_size_allocate = egg_image_menu_item_toggle_size_allocate;
- menu_item_class->set_label = egg_image_menu_item_set_label;
- menu_item_class->get_label = egg_image_menu_item_get_label;
-
- gobject_class->finalize = egg_image_menu_item_finalize;
- gobject_class->set_property = egg_image_menu_item_set_property;
- gobject_class->get_property = egg_image_menu_item_get_property;
-
- g_object_class_install_property (gobject_class,
- PROP_IMAGE,
- g_param_spec_object ("image",
- "Image widget",
- "Child widget to appear next to the menu text",
- GTK_TYPE_WIDGET,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_STATIC_STRINGS));
-
- g_object_class_install_property (gobject_class,
- PROP_ALWAYS_SHOW_IMAGE,
- g_param_spec_boolean ("always-show-image",
- "Always show image",
- "Whether the image will always be shown",
- FALSE,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS));
-}
-
-static void
-egg_image_menu_item_init (EggImageMenuItem *image_menu_item)
-{
- EggImageMenuItemPrivate *priv;
-
- image_menu_item->priv = egg_image_menu_item_get_instance_private (image_menu_item);
- priv = image_menu_item->priv;
-
- priv->image = NULL;
- priv->label = NULL;
-}
-
-static void
-egg_image_menu_item_finalize (GObject *object)
-{
- EggImageMenuItemPrivate *priv = EGG_IMAGE_MENU_ITEM (object)->priv;
-
- g_free (priv->label);
- priv->label = NULL;
-
- G_OBJECT_CLASS (egg_image_menu_item_parent_class)->finalize (object);
-}
-
-static void
-egg_image_menu_item_set_property (GObject *object,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- EggImageMenuItem *image_menu_item = EGG_IMAGE_MENU_ITEM (object);
-
- switch (prop_id)
- {
- case PROP_IMAGE:
- egg_image_menu_item_set_image (image_menu_item, (GtkWidget *) g_value_get_object (value));
- break;
- case PROP_ALWAYS_SHOW_IMAGE:
- egg_image_menu_item_set_always_show_image (image_menu_item, g_value_get_boolean (value));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-egg_image_menu_item_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- EggImageMenuItem *image_menu_item = EGG_IMAGE_MENU_ITEM (object);
-
- switch (prop_id)
- {
- case PROP_IMAGE:
- g_value_set_object (value, egg_image_menu_item_get_image (image_menu_item));
- break;
- case PROP_ALWAYS_SHOW_IMAGE:
- g_value_set_boolean (value, egg_image_menu_item_get_always_show_image (image_menu_item));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static gboolean
-show_image (EggImageMenuItem *image_menu_item)
-{
- EggImageMenuItemPrivate *priv = image_menu_item->priv;
- GtkSettings *settings = gtk_widget_get_settings (GTK_WIDGET (image_menu_item));
- gboolean show;
-
- if (priv->always_show_image)
- show = TRUE;
- else
- g_object_get (settings, "gtk-menu-images", &show, NULL);
-
- return show;
-}
-
-static void
-egg_image_menu_item_map (GtkWidget *widget)
-{
- EggImageMenuItem *image_menu_item = EGG_IMAGE_MENU_ITEM (widget);
- EggImageMenuItemPrivate *priv = image_menu_item->priv;
-
- GTK_WIDGET_CLASS (egg_image_menu_item_parent_class)->map (widget);
-
- if (priv->image)
- g_object_set (priv->image,
- "visible", show_image (image_menu_item),
- NULL);
-}
-
-static void
-egg_image_menu_item_destroy (GtkWidget *widget)
-{
- EggImageMenuItem *image_menu_item = EGG_IMAGE_MENU_ITEM (widget);
- EggImageMenuItemPrivate *priv = image_menu_item->priv;
-
- if (priv->image)
- gtk_container_remove (GTK_CONTAINER (image_menu_item),
- priv->image);
-
- GTK_WIDGET_CLASS (egg_image_menu_item_parent_class)->destroy (widget);
-}
-
-static void
-egg_image_menu_item_toggle_size_request (GtkMenuItem *menu_item,
- gint *requisition)
-{
- EggImageMenuItem *image_menu_item = EGG_IMAGE_MENU_ITEM (menu_item);
- EggImageMenuItemPrivate *priv = image_menu_item->priv;
- GtkPackDirection pack_dir;
- GtkWidget *parent;
- GtkWidget *widget = GTK_WIDGET (menu_item);
-
- parent = gtk_widget_get_parent (widget);
-
- if (GTK_IS_MENU_BAR (parent))
- pack_dir = gtk_menu_bar_get_child_pack_direction (GTK_MENU_BAR (parent));
- else
- pack_dir = GTK_PACK_DIRECTION_LTR;
-
- *requisition = 0;
-
- if (priv->image && gtk_widget_get_visible (priv->image))
- {
- GtkRequisition image_requisition;
- guint toggle_spacing;
-
- gtk_widget_get_preferred_size (priv->image, &image_requisition, NULL);
-
- gtk_widget_style_get (GTK_WIDGET (menu_item),
- "toggle-spacing", &toggle_spacing,
- NULL);
-
- if (pack_dir == GTK_PACK_DIRECTION_LTR || pack_dir == GTK_PACK_DIRECTION_RTL)
- {
- if (image_requisition.width > 0)
- *requisition = image_requisition.width + toggle_spacing;
- }
- else
- {
- if (image_requisition.height > 0)
- *requisition = image_requisition.height + toggle_spacing;
- }
- }
-}
-
-static void
-egg_image_menu_item_toggle_size_allocate (GtkMenuItem *menu_item,
- gint allocation)
-{
- EggImageMenuItem *image_menu_item = EGG_IMAGE_MENU_ITEM (menu_item);
- image_menu_item->priv->toggle_size = allocation;
- GTK_MENU_ITEM_CLASS (egg_image_menu_item_parent_class)->toggle_size_allocate (menu_item, allocation);
-}
-
-static void
-egg_image_menu_item_recalculate (EggImageMenuItem *image_menu_item)
-{
- EggImageMenuItemPrivate *priv = image_menu_item->priv;
-
- GTK_MENU_ITEM_CLASS
- (egg_image_menu_item_parent_class)->set_label (GTK_MENU_ITEM (image_menu_item), priv->label);
-}
-
-static void
-egg_image_menu_item_set_label (GtkMenuItem *menu_item,
- const gchar *label)
-{
- EggImageMenuItemPrivate *priv = EGG_IMAGE_MENU_ITEM (menu_item)->priv;
-
- if (priv->label != label)
- {
- g_free (priv->label);
- priv->label = g_strdup (label);
-
- egg_image_menu_item_recalculate (EGG_IMAGE_MENU_ITEM (menu_item));
-
- g_object_notify (G_OBJECT (menu_item), "label");
-
- }
-}
-
-static const gchar *
-egg_image_menu_item_get_label (GtkMenuItem *menu_item)
-{
- EggImageMenuItemPrivate *priv = EGG_IMAGE_MENU_ITEM (menu_item)->priv;
-
- return priv->label;
-}
-
-static void
-egg_image_menu_item_get_preferred_width (GtkWidget *widget,
- gint *minimum,
- gint *natural)
-{
- EggImageMenuItem *image_menu_item = EGG_IMAGE_MENU_ITEM (widget);
- EggImageMenuItemPrivate *priv = image_menu_item->priv;
- GtkPackDirection pack_dir;
- GtkWidget *parent;
-
- parent = gtk_widget_get_parent (widget);
-
- if (GTK_IS_MENU_BAR (parent))
- pack_dir = gtk_menu_bar_get_child_pack_direction (GTK_MENU_BAR (parent));
- else
- pack_dir = GTK_PACK_DIRECTION_LTR;
-
- GTK_WIDGET_CLASS (egg_image_menu_item_parent_class)->get_preferred_width (widget, minimum, natural);
-
- if ((pack_dir == GTK_PACK_DIRECTION_TTB || pack_dir == GTK_PACK_DIRECTION_BTT) &&
- priv->image &&
- gtk_widget_get_visible (priv->image))
- {
- gint child_minimum, child_natural;
-
- gtk_widget_get_preferred_width (priv->image, &child_minimum, &child_natural);
-
- *minimum = MAX (*minimum, child_minimum);
- *natural = MAX (*natural, child_natural);
- }
-}
-
-static void
-egg_image_menu_item_get_preferred_height (GtkWidget *widget,
- gint *minimum,
- gint *natural)
-{
- EggImageMenuItem *image_menu_item = EGG_IMAGE_MENU_ITEM (widget);
- EggImageMenuItemPrivate *priv = image_menu_item->priv;
- gint child_height = 0;
- GtkPackDirection pack_dir;
- GtkWidget *parent;
-
- parent = gtk_widget_get_parent (widget);
-
- if (GTK_IS_MENU_BAR (parent))
- pack_dir = gtk_menu_bar_get_child_pack_direction (GTK_MENU_BAR (parent));
- else
- pack_dir = GTK_PACK_DIRECTION_LTR;
-
- if (priv->image && gtk_widget_get_visible (priv->image))
- {
- GtkRequisition child_requisition;
-
- gtk_widget_get_preferred_size (priv->image, &child_requisition, NULL);
-
- child_height = child_requisition.height;
- }
-
- GTK_WIDGET_CLASS (egg_image_menu_item_parent_class)->get_preferred_height (widget, minimum, natural);
-
- if (pack_dir == GTK_PACK_DIRECTION_RTL || pack_dir == GTK_PACK_DIRECTION_LTR)
- {
- *minimum = MAX (*minimum, child_height);
- *natural = MAX (*natural, child_height);
- }
-}
-
-static void
-egg_image_menu_item_get_preferred_height_for_width (GtkWidget *widget,
- gint width,
- gint *minimum,
- gint *natural)
-{
- EggImageMenuItem *image_menu_item = EGG_IMAGE_MENU_ITEM (widget);
- EggImageMenuItemPrivate *priv = image_menu_item->priv;
- gint child_height = 0;
- GtkPackDirection pack_dir;
- GtkWidget *parent;
-
- parent = gtk_widget_get_parent (widget);
-
- if (GTK_IS_MENU_BAR (parent))
- pack_dir = gtk_menu_bar_get_child_pack_direction (GTK_MENU_BAR (parent));
- else
- pack_dir = GTK_PACK_DIRECTION_LTR;
-
- if (priv->image && gtk_widget_get_visible (priv->image))
- {
- GtkRequisition child_requisition;
-
- gtk_widget_get_preferred_size (priv->image, &child_requisition, NULL);
-
- child_height = child_requisition.height;
- }
-
- GTK_WIDGET_CLASS
- (egg_image_menu_item_parent_class)->get_preferred_height_for_width (widget, width, minimum, natural);
-
- if (pack_dir == GTK_PACK_DIRECTION_RTL || pack_dir == GTK_PACK_DIRECTION_LTR)
- {
- *minimum = MAX (*minimum, child_height);
- *natural = MAX (*natural, child_height);
- }
-}
-
-
-static void
-egg_image_menu_item_size_allocate (GtkWidget *widget,
- GtkAllocation *allocation)
-{
- EggImageMenuItem *image_menu_item = EGG_IMAGE_MENU_ITEM (widget);
- EggImageMenuItemPrivate *priv = image_menu_item->priv;
- GtkAllocation widget_allocation;
- GtkPackDirection pack_dir;
- GtkWidget *parent;
-
- parent = gtk_widget_get_parent (widget);
-
- if (GTK_IS_MENU_BAR (parent))
- pack_dir = gtk_menu_bar_get_child_pack_direction (GTK_MENU_BAR (parent));
- else
- pack_dir = GTK_PACK_DIRECTION_LTR;
-
- GTK_WIDGET_CLASS (egg_image_menu_item_parent_class)->size_allocate (widget, allocation);
-
- if (priv->image && gtk_widget_get_visible (priv->image))
- {
- gint x, y, offset;
- GtkStyleContext *context;
- GtkStateFlags state;
- GtkBorder padding;
- GtkRequisition child_requisition;
- GtkAllocation child_allocation;
- guint horizontal_padding, toggle_spacing;
- gint toggle_size;
-
- toggle_size = priv->toggle_size;
- gtk_widget_style_get (widget,
- "horizontal-padding", &horizontal_padding,
- "toggle-spacing", &toggle_spacing,
- NULL);
-
- /* Man this is lame hardcoding action, but I can't
- * come up with a solution that's really better.
- */
-
- gtk_widget_get_preferred_size (priv->image, &child_requisition, NULL);
-
- gtk_widget_get_allocation (widget, &widget_allocation);
-
- context = gtk_widget_get_style_context (widget);
- state = gtk_widget_get_state_flags (widget);
- gtk_style_context_get_padding (context, state, &padding);
- offset = gtk_container_get_border_width (GTK_CONTAINER (image_menu_item));
-
- if (pack_dir == GTK_PACK_DIRECTION_LTR ||
- pack_dir == GTK_PACK_DIRECTION_RTL)
- {
- if ((gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR) ==
- (pack_dir == GTK_PACK_DIRECTION_LTR))
- x = offset + horizontal_padding + padding.left +
- (toggle_size - toggle_spacing - child_requisition.width) / 2;
- else
- x = widget_allocation.width - offset - horizontal_padding - padding.right -
- toggle_size + toggle_spacing +
- (toggle_size - toggle_spacing - child_requisition.width) / 2;
-
- y = (widget_allocation.height - child_requisition.height) / 2;
- }
- else
- {
- if ((gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR) ==
- (pack_dir == GTK_PACK_DIRECTION_TTB))
- y = offset + horizontal_padding + padding.top +
- (toggle_size - toggle_spacing - child_requisition.height) / 2;
- else
- y = widget_allocation.height - offset - horizontal_padding - padding.bottom -
- toggle_size + toggle_spacing +
- (toggle_size - toggle_spacing - child_requisition.height) / 2;
-
- x = (widget_allocation.width - child_requisition.width) / 2;
- }
-
- child_allocation.width = child_requisition.width;
- child_allocation.height = child_requisition.height;
- child_allocation.x = widget_allocation.x + MAX (x, 0);
- child_allocation.y = widget_allocation.y + MAX (y, 0);
-
- gtk_widget_size_allocate (priv->image, &child_allocation);
- }
-}
-
-static void
-egg_image_menu_item_forall (GtkContainer *container,
- gboolean include_internals,
- GtkCallback callback,
- gpointer callback_data)
-{
- EggImageMenuItem *image_menu_item = EGG_IMAGE_MENU_ITEM (container);
- EggImageMenuItemPrivate *priv = image_menu_item->priv;
-
- GTK_CONTAINER_CLASS (egg_image_menu_item_parent_class)->forall (container,
- include_internals,
- callback,
- callback_data);
-
- if (include_internals && priv->image)
- (* callback) (priv->image, callback_data);
-}
-
-GtkWidget*
-egg_image_menu_item_new (void)
-{
- return g_object_new (EGG_TYPE_IMAGE_MENU_ITEM, NULL);
-}
-
-GtkWidget*
-egg_image_menu_item_new_with_label (const gchar *label)
-{
- return g_object_new (EGG_TYPE_IMAGE_MENU_ITEM,
- "label", label,
- NULL);
-}
-
-GtkWidget*
-egg_image_menu_item_new_with_mnemonic (const gchar *label)
-{
- return g_object_new (EGG_TYPE_IMAGE_MENU_ITEM,
- "use-underline", TRUE,
- "label", label,
- NULL);
-}
-
-void
-egg_image_menu_item_set_always_show_image (EggImageMenuItem *image_menu_item,
- gboolean always_show)
-{
- EggImageMenuItemPrivate *priv;
-
- g_return_if_fail (EGG_IS_IMAGE_MENU_ITEM (image_menu_item));
-
- priv = image_menu_item->priv;
-
- if (priv->always_show_image != always_show)
- {
- priv->always_show_image = always_show;
-
- if (priv->image)
- {
- if (show_image (image_menu_item))
- gtk_widget_show (priv->image);
- else
- gtk_widget_hide (priv->image);
- }
-
- g_object_notify (G_OBJECT (image_menu_item), "always-show-image");
- }
-}
-
-gboolean
-egg_image_menu_item_get_always_show_image (EggImageMenuItem *image_menu_item)
-{
- g_return_val_if_fail (EGG_IS_IMAGE_MENU_ITEM (image_menu_item), FALSE);
-
- return image_menu_item->priv->always_show_image;
-}
-
-void
-egg_image_menu_item_set_image (EggImageMenuItem *image_menu_item,
- GtkWidget *image)
-{
- EggImageMenuItemPrivate *priv;
-
- g_return_if_fail (EGG_IS_IMAGE_MENU_ITEM (image_menu_item));
-
- priv = image_menu_item->priv;
-
- if (image == priv->image)
- return;
-
- if (priv->image)
- gtk_container_remove (GTK_CONTAINER (image_menu_item),
- priv->image);
-
- priv->image = image;
-
- if (image == NULL)
- return;
-
- gtk_widget_set_parent (image, GTK_WIDGET (image_menu_item));
- g_object_set (image,
- "visible", show_image (image_menu_item),
- "no-show-all", TRUE,
- NULL);
-
- g_object_notify (G_OBJECT (image_menu_item), "image");
-}
-
-GtkWidget*
-egg_image_menu_item_get_image (EggImageMenuItem *image_menu_item)
-{
- g_return_val_if_fail (EGG_IS_IMAGE_MENU_ITEM (image_menu_item), NULL);
-
- return image_menu_item->priv->image;
-}
-
-static void
-egg_image_menu_item_remove (GtkContainer *container,
- GtkWidget *child)
-{
- EggImageMenuItem *image_menu_item = EGG_IMAGE_MENU_ITEM (container);
- EggImageMenuItemPrivate *priv = image_menu_item->priv;
-
- if (child == priv->image)
- {
- gboolean widget_was_visible;
-
- widget_was_visible = gtk_widget_get_visible (child);
-
- gtk_widget_unparent (child);
- priv->image = NULL;
-
- if (widget_was_visible &&
- gtk_widget_get_visible (GTK_WIDGET (container)))
- gtk_widget_queue_resize (GTK_WIDGET (container));
-
- g_object_notify (G_OBJECT (image_menu_item), "image");
- }
- else
- {
- GTK_CONTAINER_CLASS (egg_image_menu_item_parent_class)->remove (container, child);
- }
-}
-
-static void
-show_image_change_notify (EggImageMenuItem *image_menu_item)
-{
- EggImageMenuItemPrivate *priv = image_menu_item->priv;
-
- if (priv->image)
- {
- if (show_image (image_menu_item))
- gtk_widget_show (priv->image);
- else
- gtk_widget_hide (priv->image);
- }
-}
-
-static void
-traverse_container (GtkWidget *widget,
- gpointer data)
-{
- if (EGG_IS_IMAGE_MENU_ITEM (widget))
- show_image_change_notify (EGG_IMAGE_MENU_ITEM (widget));
- else if (GTK_IS_CONTAINER (widget))
- gtk_container_forall (GTK_CONTAINER (widget), traverse_container, NULL);
-}
-
-static void
-egg_image_menu_item_setting_changed (GtkSettings *settings)
-{
- GList *list, *l;
-
- list = gtk_window_list_toplevels ();
-
- for (l = list; l; l = l->next)
- gtk_container_forall (GTK_CONTAINER (l->data),
- traverse_container, NULL);
-
- g_list_free (list);
-}
-
-static void
-egg_image_menu_item_screen_changed (GtkWidget *widget,
- GdkScreen *previous_screen)
-{
- GtkSettings *settings;
- gulong show_image_connection;
-
- if (!gtk_widget_has_screen (widget))
- return;
-
- settings = gtk_widget_get_settings (widget);
-
- show_image_connection =
- g_signal_handler_find (settings, G_SIGNAL_MATCH_FUNC, 0, 0,
- NULL, egg_image_menu_item_setting_changed, NULL);
-
- if (show_image_connection)
- return;
-
- g_signal_connect (settings, "notify::gtk-menu-images",
- G_CALLBACK (egg_image_menu_item_setting_changed), NULL);
-
- show_image_change_notify (EGG_IMAGE_MENU_ITEM (widget));
-}
diff --git a/gcr-gtk3/eggimagemenuitem.h b/gcr-gtk3/eggimagemenuitem.h
deleted file mode 100644
index 6576a1d..0000000
--- a/gcr-gtk3/eggimagemenuitem.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/* GTK - The GIMP Toolkit
- * Copyright (C) Red Hat, Inc.
- *
- * This library 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 of the License, or (at your option) any later version.
- *
- * This library 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 library. If not, see <http://www.gnu.org/licenses/>.
- */
-
-/*
- * GtkImageMenuItem was was deprecated from GTK+ and reasoning explained
- * here: https://docs.google.com/document/d/1KCVPoYQBqMbDP11tHPpjW6uaEHrvLUmcDPqKAppCY8o/pub
- * Gcr wants to use image menu items in button drop downs using the device icons
- * (for the import button). So just copy it here with the stock and activatable
- * sutff removed
- */
-
-/*
- * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
- * file for a list of people on the GTK+ Team. See the ChangeLog
- * files for a list of changes. These files are distributed with
- * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
- */
-
-#ifndef __EGG_IMAGE_MENUITEM_H__
-#define __EGG_IMAGE_MENUITEM_H__
-
-#include <gtk/gtk.h>
-
-G_BEGIN_DECLS
-
-#define EGG_TYPE_IMAGE_MENU_ITEM (egg_image_menu_item_get_type ())
-#define EGG_IMAGE_MENU_ITEM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EGG_TYPE_IMAGE_MENU_ITEM, EggImageMenuItem))
-#define EGG_IMAGE_MENU_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EGG_TYPE_IMAGE_MENU_ITEM, EggImageMenuItemClass))
-#define EGG_IS_IMAGE_MENU_ITEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EGG_TYPE_IMAGE_MENU_ITEM))
-#define EGG_IS_IMAGE_MENU_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EGG_TYPE_IMAGE_MENU_ITEM))
-#define EGG_IMAGE_MENU_ITEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EGG_TYPE_IMAGE_MENU_ITEM, EggImageMenuItemClass))
-
-
-typedef struct _EggImageMenuItem EggImageMenuItem;
-typedef struct _EggImageMenuItemPrivate EggImageMenuItemPrivate;
-typedef struct _EggImageMenuItemClass EggImageMenuItemClass;
-
-struct _EggImageMenuItem
-{
- GtkMenuItem menu_item;
-
- /*< private >*/
- EggImageMenuItemPrivate *priv;
-};
-
-struct _EggImageMenuItemClass
-{
- GtkMenuItemClass parent_class;
-};
-
-GType egg_image_menu_item_get_type (void) G_GNUC_CONST;
-GtkWidget* egg_image_menu_item_new (void);
-GtkWidget* egg_image_menu_item_new_with_label (const gchar *label);
-GtkWidget* egg_image_menu_item_new_with_mnemonic (const gchar *label);
-void egg_image_menu_item_set_always_show_image (EggImageMenuItem *image_menu_item,
- gboolean always_show);
-gboolean egg_image_menu_item_get_always_show_image (EggImageMenuItem *image_menu_item);
-void egg_image_menu_item_set_image (EggImageMenuItem *image_menu_item,
- GtkWidget *image);
-GtkWidget* egg_image_menu_item_get_image (EggImageMenuItem *image_menu_item);
-
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (EggImageMenuItem, g_object_unref)
-
-G_END_DECLS
-
-#endif /* __EGG_IMAGE_MENUITEM_H__ */
diff --git a/gcr-gtk3/frob-combo-selector.c b/gcr-gtk3/frob-combo-selector.c
deleted file mode 100644
index 3ec9a3e..0000000
--- a/gcr-gtk3/frob-combo-selector.c
+++ /dev/null
@@ -1,98 +0,0 @@
-
-#include "config.h"
-
-#include "gcr/gcr.h"
-#include "gcr-gtk3/gcr-gtk3.h"
-
-#include <gtk/gtk.h>
-
-#include <unistd.h>
-#include <string.h>
-#include <errno.h>
-
-static void
-on_parser_parsed (GcrParser *parser, gpointer user_data)
-{
- GcrSimpleCollection *collection = user_data;
- GcrRenderer *renderer;
-
- renderer = gcr_renderer_create (gcr_parser_get_parsed_label (parser),
- gcr_parser_get_parsed_attributes (parser));
-
- if (renderer) {
- gcr_simple_collection_add (collection, G_OBJECT (renderer));
- g_object_unref (renderer);
- }
-}
-
-static void
-add_to_selector (GcrParser *parser, const gchar *path)
-{
- GError *err = NULL;
- guchar *data;
- gsize n_data;
- GBytes *bytes;
-
- if (!g_file_get_contents (path, (gchar**)&data, &n_data, NULL))
- g_error ("couldn't read file: %s", path);
-
- bytes = g_bytes_new_take (data, n_data);
- if (!gcr_parser_parse_bytes (parser, bytes, &err))
- g_error ("couldn't parse data: %s", err->message);
-
- g_bytes_unref (bytes);
-}
-
-int
-main (int argc, char *argv[])
-{
- GcrCollection *collection;
- GcrComboSelector *selector;
- GtkDialog *dialog;
- GcrParser *parser;
- GObject *selected;
- int i;
-
- gtk_init (&argc, &argv);
-
- dialog = GTK_DIALOG (gtk_dialog_new ());
- g_object_ref_sink (dialog);
-
- collection = gcr_simple_collection_new ();
- selector = gcr_combo_selector_new (collection);
-
- gtk_widget_show (GTK_WIDGET (selector));
- gtk_container_add (GTK_CONTAINER (gtk_dialog_get_content_area (dialog)), GTK_WIDGET (selector));
-
- gtk_window_set_default_size (GTK_WINDOW (dialog), 550, 400);
- gtk_container_set_border_width (GTK_CONTAINER (dialog), 20);
-
- parser = gcr_parser_new ();
- g_signal_connect (parser, "parsed", G_CALLBACK (on_parser_parsed), collection);
-
- if (argc == 1) {
- add_to_selector (parser, SRCDIR "/gcr-gtk3/fixtures/ca-certificates.crt");
- } else {
- for (i = 1; i < argc; ++i)
- add_to_selector (parser, argv[i]);
- }
-
- g_object_unref (parser);
- g_object_unref (collection);
-
- gtk_dialog_run (dialog);
-
- selected = gcr_combo_selector_get_selected (selector);
- if (selected == NULL) {
- g_print ("nothing selected\n");
- } else {
- gchar *label;
- g_object_get (selected, "label", &label, NULL);
- g_print ("selected: %s\n", label);
- }
-
- gtk_widget_destroy (GTK_WIDGET (dialog));
- g_object_unref (dialog);
-
- return 0;
-}
diff --git a/gcr-gtk3/frob-gnupg-selector.c b/gcr-gtk3/frob-gnupg-selector.c
deleted file mode 100644
index 7af6e30..0000000
--- a/gcr-gtk3/frob-gnupg-selector.c
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2011 Collabora Ltd.
- *
- * 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/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#include "config.h"
-
-#include "gcr/gcr.h"
-#include "gcr/gcr-gnupg-collection.h"
-#include "gcr/gcr-gnupg-key.h"
-
-#include "gcr-gtk3/gcr-live-search.h"
-#include "gcr-gtk3/gcr-list-selector-private.h"
-
-#include <gtk/gtk.h>
-
-#include <unistd.h>
-#include <string.h>
-#include <errno.h>
-
-static void
-on_collection_loaded (GObject *source, GAsyncResult *result, gpointer unused)
-{
- GError *error = NULL;
-
- _gcr_gnupg_collection_load_finish (GCR_GNUPG_COLLECTION (source), result, &error);
- if (error) {
- g_warning ("collection load failed: %s", error->message);
- g_clear_error (&error);
- }
-}
-
-int
-main (int argc, char *argv[])
-{
- GcrCollection *collection;
- GcrListSelector *selector;
- GtkWidget *scroll;
- GtkDialog *dialog;
- GtkWidget *search;
- GtkBox *box;
-
- gtk_init (&argc, &argv);
-
- dialog = GTK_DIALOG (gtk_dialog_new ());
- g_object_ref_sink (dialog);
-
- collection = _gcr_gnupg_collection_new (NULL);
- selector = gcr_list_selector_new (collection);
- search = _gcr_live_search_new (GTK_WIDGET (selector));
- _gcr_list_selector_set_live_search (selector, GCR_LIVE_SEARCH (search));
-
- scroll = gtk_scrolled_window_new (NULL, NULL);
- gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scroll), GTK_SHADOW_ETCHED_IN);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
- gtk_container_add (GTK_CONTAINER (scroll), GTK_WIDGET (selector));
-
- box = GTK_BOX (gtk_dialog_get_content_area (dialog));
- gtk_box_pack_start (box, GTK_WIDGET (scroll), TRUE, TRUE, 0);
- gtk_box_pack_end (box, search, FALSE, TRUE, 0);
-
- gtk_widget_show (GTK_WIDGET (selector));
- gtk_widget_show (scroll);
-
- _gcr_gnupg_collection_load_async (GCR_GNUPG_COLLECTION (collection), NULL,
- on_collection_loaded, NULL);
-
- gtk_window_set_default_size (GTK_WINDOW (dialog), 550, 400);
- gtk_container_set_border_width (GTK_CONTAINER (dialog), 20);
-
- g_object_unref (collection);
-
- gtk_dialog_run (dialog);
- gtk_widget_destroy (GTK_WIDGET (dialog));
- g_object_unref (dialog);
-
- return 0;
-}
diff --git a/gcr-gtk3/frob-import-button.c b/gcr-gtk3/frob-import-button.c
deleted file mode 100644
index 8b4d4c6..0000000
--- a/gcr-gtk3/frob-import-button.c
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- * Copyright (C) 2014 Stef Walter
- *
- * 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/>.
- *
- * Author: Stef Walter <stefw@redhat.com>
- */
-
-#include "config.h"
-
-#include "gcr-gtk3/gcr-gtk3.h"
-
-#include "gcr/gcr-importer.h"
-
-#include <gtk/gtk.h>
-
-#include <unistd.h>
-#include <string.h>
-#include <errno.h>
-
-typedef GObject MockImporter;
-typedef GObjectClass MockImporterClass;
-
-enum {
- PROP_0,
- PROP_LABEL,
- PROP_ICON,
- PROP_URI,
- PROP_INTERACTION
-};
-
-GType mock_importer_get_type (void) G_GNUC_CONST;
-
-static GList *
-mock_importer_create_for_parsed (GcrParsed *parsed)
-{
- GcrImporter *self;
- GIcon *icon;
-
- icon = g_themed_icon_new ("dialog-warning");
- self = g_object_new (mock_importer_get_type (),
- "label", gcr_parsed_get_label (parsed),
- "icon", icon,
- NULL);
- g_object_unref (icon);
- return g_list_append (NULL, self);
-}
-
-static gboolean
-mock_importer_queue_for_parsed (GcrImporter *importer,
- GcrParsed *parsed)
-{
- return TRUE;
-}
-
-static void
-mock_importer_import_async (GcrImporter *importer,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data)
-{
- GTask *task;
-
- task = g_task_new (importer, cancellable, callback, user_data);
- g_task_set_source_tag (task, mock_importer_import_async);
-
- g_printerr ("Import %p\n", importer);
- g_task_return_boolean (task, TRUE);
- g_clear_object (&task);
-}
-
-
-static gboolean
-mock_importer_import_finish (GcrImporter *importer,
- GAsyncResult *result,
- GError **error)
-{
- return g_task_propagate_boolean (G_TASK (result), error);
-}
-
-
-static void
-mock_importer_iface (GcrImporterIface *iface)
-{
- iface->create_for_parsed = mock_importer_create_for_parsed;
- iface->queue_for_parsed = mock_importer_queue_for_parsed;
- iface->import_async = mock_importer_import_async;
- iface->import_finish = mock_importer_import_finish;
-}
-
-G_DEFINE_TYPE_WITH_CODE (MockImporter, mock_importer, G_TYPE_OBJECT,
- G_IMPLEMENT_INTERFACE (GCR_TYPE_IMPORTER, mock_importer_iface);
-);
-
-static void
-value_free (gpointer value)
-{
- g_boxed_free (G_TYPE_VALUE, value);
-}
-
-static void
-mock_importer_init (MockImporter *self)
-{
-
-}
-
-static void
-mock_importer_set_property (GObject *obj,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- g_object_set_data_full (obj, pspec->name, g_boxed_copy (G_TYPE_VALUE, value), value_free);
-}
-
-static void
-mock_importer_get_property (GObject *obj,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- GValue *val = g_object_get_data (obj, pspec->name);
- g_return_if_fail (val != NULL);
- g_value_copy (val, value);
-}
-
-static void
-mock_importer_class_init (MockImporterClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
- gobject_class->set_property = mock_importer_set_property;
- gobject_class->get_property = mock_importer_get_property;
-
- g_object_class_install_property (gobject_class, PROP_LABEL,
- g_param_spec_string ("label", "", "",
- NULL,
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
-
- g_object_class_install_property (gobject_class, PROP_ICON,
- g_param_spec_object ("icon", "", "",
- G_TYPE_ICON,
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
-
- g_object_class_override_property (gobject_class, PROP_URI, "uri");
- g_object_class_override_property (gobject_class, PROP_INTERACTION, "interaction");
-}
-
-typedef MockImporter MockImporterTwo;
-typedef MockImporterClass MockImporterTwoClass;
-
-GType mock_importer_two_get_type (void) G_GNUC_CONST;
-
-G_DEFINE_TYPE (MockImporterTwo, mock_importer_two, mock_importer_get_type ());
-
-static void
-mock_importer_two_init (MockImporterTwo *self)
-{
-
-}
-
-static void
-mock_importer_two_class_init (MockImporterTwoClass *klass)
-{
-
-}
-
-
-static void
-on_parser_parsed (GcrParser *parser,
- gpointer user_data)
-{
- gcr_import_button_add_parsed (user_data,
- gcr_parser_get_parsed (parser));
-}
-
-static void
-parse_file (GcrParser *parser,
- const gchar *path)
-{
- GError *err = NULL;
- guchar *data;
- gsize n_data;
- GBytes *bytes;
-
- if (!g_file_get_contents (path, (gchar**)&data, &n_data, NULL))
- g_error ("couldn't read file: %s", path);
-
- bytes = g_bytes_new_take (data, n_data);
- if (!gcr_parser_parse_bytes (parser, bytes, &err))
- g_error ("couldn't parse data: %s", err->message);
-
- g_bytes_unref (bytes);
-}
-
-int
-main (int argc, char *argv[])
-{
- GtkDialog *dialog;
- GcrParser *parser;
- GtkWidget *button;
- int i;
-
- gtk_init (&argc, &argv);
-
- gcr_importer_register (mock_importer_get_type (), gck_attributes_new (0));
- gcr_importer_register (mock_importer_two_get_type (), gck_attributes_new (0));
-
- dialog = GTK_DIALOG (gtk_dialog_new ());
- g_object_ref_sink (dialog);
-
- button = GTK_WIDGET (gcr_import_button_new ("Import Button"));
- gtk_widget_show (button);
-
- gtk_widget_set_halign (button, 0.5);
- gtk_widget_set_valign (button, 0.5);
-
- gtk_container_add (GTK_CONTAINER (gtk_dialog_get_content_area (dialog)), button);
-
- gtk_window_set_default_size (GTK_WINDOW (dialog), 200, 300);
- gtk_container_set_border_width (GTK_CONTAINER (dialog), 20);
-
- parser = gcr_parser_new ();
- g_signal_connect (parser, "parsed", G_CALLBACK (on_parser_parsed), button);
-
- if (argc == 1) {
- parse_file (parser, SRCDIR "/gcr-gtk3/fixtures/ca-certificates.crt");
- } else {
- for (i = 1; i < argc; ++i)
- parse_file (parser, argv[i]);
- }
-
- g_object_unref (parser);
-
- gtk_dialog_run (dialog);
-
- gtk_widget_destroy (GTK_WIDGET (dialog));
- g_object_unref (dialog);
-
- return 0;
-}
diff --git a/gcr-gtk3/frob-key.c b/gcr-gtk3/frob-key.c
deleted file mode 100644
index ae0a106..0000000
--- a/gcr-gtk3/frob-key.c
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2010 Collabora Ltd.
- *
- * 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/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#include "config.h"
-
-#include "gcr/gcr.h"
-#include "gcr-gtk3/gcr-gtk3.h"
-
-#include <gtk/gtk.h>
-
-#include <unistd.h>
-#include <string.h>
-#include <errno.h>
-
-static void
-on_parser_parsed (GcrParser *parser, gpointer unused)
-{
- GcrKeyWidget *details;
- GtkDialog *dialog;
-
- dialog = GTK_DIALOG (gtk_dialog_new ());
- g_object_ref_sink (dialog);
-
- details = gcr_key_widget_new (gcr_parser_get_parsed_attributes (parser));
- gtk_widget_show (GTK_WIDGET (details));
- gtk_container_add (GTK_CONTAINER (gtk_dialog_get_content_area (dialog)), GTK_WIDGET (details));
-
- gtk_window_set_default_size (GTK_WINDOW (dialog), 550, 400);
- gtk_container_set_border_width (GTK_CONTAINER (dialog), 20);
- gtk_dialog_run (dialog);
-
- g_object_unref (dialog);
- g_object_unref (details);
-}
-
-static void
-test_key (const gchar *path)
-{
- GcrParser *parser;
- GError *err = NULL;
- GBytes *bytes;
- guchar *data;
- gsize n_data;
-
- if (!g_file_get_contents (path, (gchar**)&data, &n_data, NULL))
- g_error ("couldn't read file: %s", path);
-
- parser = gcr_parser_new ();
- g_signal_connect (parser, "parsed", G_CALLBACK (on_parser_parsed), NULL);
- bytes = g_bytes_new_take (data, n_data);
- if (!gcr_parser_parse_bytes (parser, bytes, &err))
- g_error ("couldn't parse data: %s", err->message);
-
- g_object_unref (parser);
- g_bytes_unref (bytes);
-}
-
-int
-main(int argc, char *argv[])
-{
- gtk_init (&argc, &argv);
- g_set_prgname ("frob-key");
-
- if (argc > 1)
- test_key (argv[1]);
- else
- test_key (SRCDIR "/gcr-gtk3/fixtures/pem-dsa-1024.key");
-
- return 0;
-}
diff --git a/gcr-gtk3/frob-prompt.c b/gcr-gtk3/frob-prompt.c
deleted file mode 100644
index 8ac11c7..0000000
--- a/gcr-gtk3/frob-prompt.c
+++ /dev/null
@@ -1,279 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2011 Collabora Ltd.
- *
- * 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/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#include "config.h"
-
-#include "gcr/gcr.h"
-#include "gcr-gtk3/gcr-gtk3.h"
-
-#include <gtk/gtk.h>
-#ifdef GDK_WINDOWING_X11
-#include <gdk/gdkx.h>
-#endif
-#ifdef GDK_WINDOWING_WAYLAND
-#include <gdk/gdkwayland.h>
-#endif
-
-static const gchar *file_name = NULL;
-static gchar *prompt_type = NULL;
-static gint prompt_delay = 0;
-static gboolean prompt_window = FALSE;
-
-static gboolean
-on_delay_timeout (gpointer data)
-{
- GMainLoop *loop = data;
- g_main_loop_quit (loop);
- return FALSE;
-}
-
-#ifdef GDK_WINDOWING_X11
-static void
-set_caller_window_x11 (GcrPrompt *prompt, GdkWindow *window)
-{
- gchar *caller_id = NULL;
-
- if (!GDK_IS_X11_WINDOW (window))
- return;
-
- caller_id = g_strdup_printf ("%lu", (gulong)GDK_WINDOW_XID (window));
- gcr_prompt_set_caller_window (prompt, caller_id);
- g_free (caller_id);
-}
-#endif
-
-#ifdef GDK_WINDOWING_WAYLAND
-static void
-on_window_wl_export_handle (GdkWindow *window,
- const char *handle,
- gpointer user_data)
-{
- GcrPrompt *prompt = GCR_PROMPT (user_data);
-
- g_return_if_fail (handle);
-
- gcr_prompt_set_caller_window (prompt, handle);
-}
-
-static void
-set_caller_window_wl (GcrPrompt *prompt, GdkWindow *window)
-{
- if (!GDK_IS_WAYLAND_WINDOW (window))
- return;
-
- if (!gdk_wayland_window_export_handle (window, on_window_wl_export_handle, prompt, NULL))
- g_warning ("Couldn't export Wayland window handle");
-}
-#endif
-
-static void
-prompt_perform (GtkWidget *parent)
-{
- GKeyFile *file;
- GError *error = NULL;
- gchar **groups, **keys;
- GValue value = { 0, };
- GParamSpec *spec;
- GcrPrompt *prompt;
- const gchar *key;
- const gchar *password;
- GcrPromptReply reply;
- gboolean cont = TRUE;
- GMainLoop *loop;
- gchar *type;
- gchar *choice;
- guint i, j;
-
- file = g_key_file_new ();
- if (!g_key_file_load_from_file (file, file_name, G_KEY_FILE_NONE, &error))
- g_error ("couldn't load prompt info: %s", error->message);
-
- if (!prompt_type || g_str_equal (prompt_type, "dialog"))
- prompt = g_object_new (GCR_TYPE_PROMPT_DIALOG, NULL);
- else if (g_str_equal (prompt_type, "system"))
- prompt = gcr_system_prompt_open_for_prompter ("org.gnome.keyring.SystemPrompter", 5, NULL, &error);
- else if (g_str_equal (prompt_type, "private"))
- prompt = gcr_system_prompt_open_for_prompter ("org.gnome.keyring.PrivatePrompter", 5, NULL, &error);
- else
- g_error ("invalid type: %s", prompt_type);
-
- if (error != NULL)
- g_error ("couldn't create prompt: %s", error->message);
-
- if (parent) {
- GdkWindow *window;
-
- window = gtk_widget_get_window (parent);
-#ifdef GDK_WINDOWING_X11
- set_caller_window_x11 (prompt, window);
-#endif
-#ifdef GDK_WINDOWING_WAYLAND
- set_caller_window_wl (prompt, window);
-#endif
- }
-
- loop = g_main_loop_new (NULL, FALSE);
- groups = g_key_file_get_groups (file, NULL);
- for (i = 0; cont && groups[i] != NULL; i++) {
-
- if (i != 0) {
- g_timeout_add_seconds (prompt_delay, on_delay_timeout, loop);
- g_main_loop_run (loop);
- }
-
- keys = g_key_file_get_keys (file, groups[i], NULL, NULL);
- for (j = 0; keys[j] != NULL; j++) {
- key = keys[j];
- if (g_str_equal (key, "type"))
- continue;
- spec = g_object_class_find_property (G_OBJECT_GET_CLASS (prompt), key);
- if (spec == NULL)
- g_error ("couldn't find property %s on prompt %s",
- key, G_OBJECT_TYPE_NAME (prompt));
- g_value_init (&value, spec->value_type);
- switch (spec->value_type) {
- case G_TYPE_STRING:
- g_value_take_string (&value, g_key_file_get_string (file, groups[i], key, NULL));
- break;
- case G_TYPE_INT:
- g_value_set_int (&value, g_key_file_get_integer (file, groups[i], key, NULL));
- break;
- case G_TYPE_BOOLEAN:
- g_value_set_boolean (&value, g_key_file_get_boolean (file, groups[i], key, NULL));
- break;
- default:
- g_error ("unsupported type %s for property %s",
- g_type_name (spec->value_type), key);
- break;
- }
-
- g_object_set_property (G_OBJECT (prompt), key, &value);
- g_value_unset (&value);
- }
-
- g_strfreev (keys);
-
- type = g_key_file_get_value (file, groups[i], "type", NULL);
- if (g_strcmp0 (type, "password") == 0) {
- password = gcr_prompt_password_run (prompt, NULL, &error);
- if (error != NULL)
- g_error ("couldn't prompt for password: %s", error->message);
- g_print ("prompt password: %s\n", password);
- g_print ("password strength: %d\n", gcr_prompt_get_password_strength (prompt));
- cont = (password != NULL);
- } else if (g_strcmp0 (type, "confirm") == 0) {
- reply = gcr_prompt_confirm_run (prompt, NULL, &error);
- if (error != NULL)
- g_error ("couldn't prompt for confirm: %s", error->message);
- g_print ("prompt confirm: %d\n", reply);
- cont = (reply != GCR_PROMPT_REPLY_CANCEL);
- } else {
- g_error ("unsupported prompt type: %s", type);
- }
- g_free (type);
-
- choice = gcr_prompt_get_choice_label (prompt);
- if (choice)
- g_print ("choice chosen: %s", gcr_prompt_get_choice_chosen (prompt) ? "true" : "false");
- g_free (choice);
- g_print ("\n");
- }
-
- g_main_loop_unref (loop);
- g_object_unref (prompt);
- g_strfreev (groups);
- g_key_file_free (file);
-
-}
-
-static void
-on_prompt_clicked (GtkToolButton *button,
- gpointer user_data)
-{
- prompt_perform (user_data);
-}
-
-static gboolean
-on_window_delete (GtkWidget *widget,
- GdkEvent *event,
- gpointer user_data)
-{
- gtk_main_quit ();
- return FALSE;
-}
-
-static GOptionEntry option_entries[] = {
- { "type", 'c', 0, G_OPTION_ARG_STRING, &prompt_type,
- "'system', 'private' or 'dialog'", "type" },
- { "delay", 'd', 0, G_OPTION_ARG_INT, &prompt_delay,
- "delay in seconds between prompts", "delay" },
- { "window", 'w', 0, G_OPTION_ARG_NONE, &prompt_window,
- "prompt with a parent window", NULL },
- { NULL }
-};
-
-int
-main (int argc, char *argv[])
-{
- GOptionContext *context;
- GtkWidget *window;
- GtkToolbar *toolbar;
- GtkToolItem *item;
- GError *error = NULL;
-
- g_set_prgname ("frob-prompt");
-
- context = g_option_context_new ("");
- g_option_context_add_main_entries (context, option_entries, GETTEXT_PACKAGE);
- g_option_context_add_group (context, gtk_get_option_group (TRUE));
-
- if (!g_option_context_parse (context, &argc, &argv, &error))
- g_error ("%s", error->message);
-
- g_option_context_free (context);
-
- if (argc < 2)
- g_error ("specify file");
- file_name = argv[1];
-
- if (prompt_window) {
- window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- g_signal_connect (window, "delete-event", G_CALLBACK (on_window_delete), NULL);
-
- toolbar = GTK_TOOLBAR (gtk_toolbar_new ());
- gtk_toolbar_set_style (toolbar, GTK_TOOLBAR_TEXT);
- item = gtk_tool_button_new (NULL, "Prompt");
- g_signal_connect (item, "clicked", G_CALLBACK (on_prompt_clicked), window);
- gtk_toolbar_insert (toolbar, item, 0);
- gtk_container_add (GTK_CONTAINER (window), GTK_WIDGET (toolbar));
-
- gtk_window_set_default_size (GTK_WINDOW (window), 400, 80);
- gtk_widget_show_all (window);
-
- gtk_main ();
-
- } else {
- prompt_perform (NULL);
- }
-
- g_free (prompt_type);
- return 0;
-}
diff --git a/gcr-gtk3/frob-request.c b/gcr-gtk3/frob-request.c
deleted file mode 100644
index 0c7e857..0000000
--- a/gcr-gtk3/frob-request.c
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2011 Collabora Ltd.
- *
- * 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/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#include "config.h"
-
-#include "gcr/gcr.h"
-
-#include "gcr-gtk3/gcr-certificate-request-renderer.h"
-
-#include <gtk/gtk.h>
-
-#include <unistd.h>
-#include <string.h>
-#include <errno.h>
-
-static void
-on_parser_parsed (GcrParser *parser,
- gpointer user_data)
-{
- GcrViewer *viewer;
- GcrRenderer *renderer;
- GtkDialog *dialog = GTK_DIALOG (user_data);
-
- viewer = gcr_viewer_new_scrolled ();
- renderer = _gcr_certificate_request_renderer_new_for_attributes (gcr_parser_get_parsed_label (parser),
- gcr_parser_get_parsed_attributes (parser));
- gcr_viewer_add_renderer (viewer, renderer);
- g_object_unref (renderer);
- gtk_widget_show (GTK_WIDGET (viewer));
- gtk_container_add (GTK_CONTAINER (gtk_dialog_get_content_area (dialog)), GTK_WIDGET (viewer));
-
- gtk_container_set_border_width (GTK_CONTAINER (dialog), 20);
-}
-
-static void
-test_request (const gchar *path)
-{
- GcrParser *parser;
- GError *err = NULL;
- guchar *data;
- gsize n_data;
- GtkWidget *dialog;
- GBytes *bytes;
-
- if (!g_file_get_contents (path, (gchar**)&data, &n_data, NULL))
- g_error ("couldn't read file: %s", path);
-
- dialog = gtk_dialog_new ();
- g_object_ref_sink (dialog);
-
- parser = gcr_parser_new ();
- g_signal_connect (parser, "parsed", G_CALLBACK (on_parser_parsed), dialog);
- bytes = g_bytes_new_take (data, n_data);
- if (!gcr_parser_parse_data (parser, data, n_data, &err))
- g_error ("couldn't parse data: %s", err->message);
-
- g_object_unref (parser);
- g_bytes_unref (bytes);
-
- gtk_widget_show (dialog);
- g_signal_connect (dialog, "delete-event", G_CALLBACK (gtk_main_quit), NULL);
- gtk_main ();
-
- g_object_unref (dialog);
-}
-
-int
-main(int argc, char *argv[])
-{
- gtk_init (&argc, &argv);
- g_set_prgname ("frob-request");
-
- if (argc > 1)
- test_request (argv[1]);
- else
- test_request (SRCDIR "/gcr-gtk3/fixtures/der-rsa-2048.p10");
-
- return 0;
-}
diff --git a/gcr-gtk3/frob-system-prompt.c b/gcr-gtk3/frob-system-prompt.c
deleted file mode 100644
index 330f8bd..0000000
--- a/gcr-gtk3/frob-system-prompt.c
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2011 Collabora Ltd.
- *
- * 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/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#include "config.h"
-
-#include "gcr/gcr.h"
-
-#include <gtk/gtk.h>
-#ifdef GDK_WINDOWING_X11
-#include <gdk/gdkx.h>
-#endif
-#ifdef GDK_WINDOWING_WAYLAND
-#include <gdk/gdkwayland.h>
-#endif
-
-#include <unistd.h>
-#include <string.h>
-#include <errno.h>
-
-static void
-run_prompt (GcrPrompt *prompt)
-{
- const char *password;
- GError *error = NULL;
-
- password = gcr_prompt_password_run (GCR_PROMPT (prompt), NULL, &error);
- if (error != NULL) {
- g_warning ("couldn't prompt for password: %s", error->message);
- g_error_free (error);
- g_object_unref (prompt);
- return;
- }
-
- g_print ("password: %s\n", password);
- g_object_unref (prompt);
-}
-
-static void
-on_gdk_wl_window_exported (GdkWindow *window,
- const char *handle,
- gpointer user_data)
-{
- GcrPrompt *prompt = GCR_PROMPT (user_data);
-
- g_return_if_fail (handle);
-
- gcr_prompt_set_caller_window (prompt, handle);
- run_prompt (prompt);
-}
-
-static void
-on_prompt_clicked (GtkToolButton *button,
- gpointer user_data)
-{
- GcrPrompt *prompt;
- GError *error = NULL;
- GtkWidget *parent = user_data;
- GdkWindow *window;
- gchar *caller_id;
-
- prompt = gcr_system_prompt_open (-1, NULL, &error);
- if (error != NULL) {
- g_warning ("couldn't open prompt: %s", error->message);
- g_error_free (error);
- return;
- }
-
- gcr_prompt_set_title (GCR_PROMPT (prompt), "This is the title");
- gcr_prompt_set_message (GCR_PROMPT (prompt), "This is the message");
- gcr_prompt_set_description (GCR_PROMPT (prompt), "This is the description");
-
- window = gtk_widget_get_window (parent);
-#ifdef GDK_WINDOWING_X11
- if (GDK_IS_X11_WINDOW (window)) {
- caller_id = g_strdup_printf ("%lu", (gulong)GDK_WINDOW_XID (window));
- gcr_prompt_set_caller_window (prompt, caller_id);
- g_free (caller_id);
- }
-#endif
-#ifdef GDK_WINDOWING_WAYLAND
- if (GDK_IS_WAYLAND_WINDOW (window)) {
- if (!gdk_wayland_window_export_handle (window, on_gdk_wl_window_exported, prompt, NULL)) {
- g_warning ("Couldn't export Wayland window handle");
- } else {
- return; /* Don't run the prompt before the async method finished */
- }
- }
-#endif
-
- run_prompt (prompt);
-}
-
-static gboolean
-on_window_delete (GtkWidget *widget,
- GdkEvent *event,
- gpointer user_data)
-{
- gtk_main_quit ();
- return FALSE;
-}
-
-int
-main (int argc, char *argv[])
-{
- GtkWidget *window;
- GtkToolbar *toolbar;
- GtkToolItem *item;
-
- gtk_init (&argc, &argv);
-
- window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- g_signal_connect (window, "delete-event", G_CALLBACK (on_window_delete), NULL);
-
- toolbar = GTK_TOOLBAR (gtk_toolbar_new ());
- gtk_toolbar_set_style (toolbar, GTK_TOOLBAR_TEXT);
- item = gtk_tool_button_new (NULL, "Prompt");
- g_signal_connect (item, "clicked", G_CALLBACK (on_prompt_clicked), window);
- gtk_toolbar_insert (toolbar, item, 0);
- gtk_container_add (GTK_CONTAINER (window), GTK_WIDGET (toolbar));
-
- gtk_window_set_default_size (GTK_WINDOW (window), 400, 80);
- gtk_widget_show_all (window);
-
- gtk_main ();
-
- return 0;
-}
diff --git a/gcr-gtk3/frob-tree-selector.c b/gcr-gtk3/frob-tree-selector.c
deleted file mode 100644
index e2567b7..0000000
--- a/gcr-gtk3/frob-tree-selector.c
+++ /dev/null
@@ -1,212 +0,0 @@
-
-#include "config.h"
-
-#include "gcr/gcr.h"
-#include "gcr-gtk3/gcr-gtk3.h"
-
-#include <gtk/gtk.h>
-
-#include <unistd.h>
-#include <string.h>
-#include <errno.h>
-
-#define TEST_TYPE_COLLECTION (test_collection_get_type ())
-#define TEST_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TEST_TYPE_COLLECTION, TestCollection))
-#define TEST_IS_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TEST_TYPE_COLLECTION))
-
-typedef struct _TestCollection TestCollection;
-typedef struct _TestCollectionClass TestCollectionClass;
-typedef struct _TestCollectionPrivate TestCollectionPrivate;
-
-struct _TestCollection {
- GcrSimpleCollection parent;
- gchar *label;
-};
-
-struct _TestCollectionClass {
- GcrSimpleCollectionClass parent_class;
-};
-
-GType test_collection_get_type (void) G_GNUC_CONST;
-
-enum {
- PROP_0,
- PROP_LABEL,
-};
-
-G_DEFINE_TYPE (TestCollection, test_collection, GCR_TYPE_SIMPLE_COLLECTION);
-
-static GHashTable *all_collections = NULL;
-
-static void
-test_collection_init (TestCollection *self)
-{
-
-}
-
-static void
-test_collection_finalize (GObject *obj)
-{
- TestCollection *self = TEST_COLLECTION (obj);
- g_free (self->label);
- g_hash_table_remove (all_collections, self);
- G_OBJECT_CLASS (test_collection_parent_class)->finalize (obj);
-}
-
-static void
-test_collection_get_property (GObject *obj,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- TestCollection *self = TEST_COLLECTION (obj);
- switch (prop_id) {
- case PROP_LABEL:
- g_value_set_string (value, self->label);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-test_collection_class_init (TestCollectionClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
- gobject_class->get_property = test_collection_get_property;
- gobject_class->finalize = test_collection_finalize;
-
- g_object_class_install_property (gobject_class, PROP_LABEL,
- g_param_spec_string ("label", "label", "label", NULL,
- G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
-}
-
-static GcrSimpleCollection *
-test_collection_instance (const gchar *label)
-{
- TestCollection *collection = NULL;
-
- g_assert (label);
-
- if (!all_collections) {
- all_collections = g_hash_table_new (g_str_hash, g_str_equal);
- } else {
- collection = g_hash_table_lookup (all_collections, label);
- if (collection != NULL)
- return GCR_SIMPLE_COLLECTION (g_object_ref (collection));
- }
-
- collection = g_object_new (TEST_TYPE_COLLECTION, NULL);
- collection->label = g_strdup (label);
- g_hash_table_insert (all_collections, collection->label, collection);
- return GCR_SIMPLE_COLLECTION (collection);
-}
-
-static void
-on_parser_parsed (GcrParser *parser, gpointer user_data)
-{
- GcrSimpleCollection *collection = user_data;
- GcrSimpleCollection *testcol;
- GcrRenderer *renderer;
- gchar *group;
-
- renderer = gcr_renderer_create (gcr_parser_get_parsed_label (parser),
- gcr_parser_get_parsed_attributes (parser));
- if (renderer == NULL)
- return;
-
- if (GCR_IS_CERTIFICATE (renderer))
- group = gcr_certificate_get_subject_part (GCR_CERTIFICATE (renderer), "O");
- else
- group = g_strdup (G_OBJECT_TYPE_NAME (renderer));
-
-
- testcol = test_collection_instance (group);
- if (!gcr_collection_contains (GCR_COLLECTION (collection), G_OBJECT (testcol)))
- gcr_simple_collection_add (collection, G_OBJECT (testcol));
-
- gcr_simple_collection_add (GCR_SIMPLE_COLLECTION (testcol), G_OBJECT (renderer));
- g_object_unref (renderer);
- g_object_unref (testcol);
- g_free (group);
-}
-
-static void
-add_to_selector (GcrParser *parser, const gchar *path)
-{
- GError *err = NULL;
- guchar *data;
- gsize n_data;
- GBytes *bytes;
-
- if (!g_file_get_contents (path, (gchar**)&data, &n_data, NULL))
- g_error ("couldn't read file: %s", path);
-
- bytes = g_bytes_new_take (data, n_data);
- if (!gcr_parser_parse_bytes (parser, bytes, &err))
- g_error ("couldn't parse data: %s", err->message);
-
- g_bytes_unref (bytes);
-}
-
-int
-main (int argc, char *argv[])
-{
- GcrCollection *collection;
- GcrTreeSelector *selector;
- GtkDialog *dialog;
- GcrParser *parser;
- GtkWidget *scroll;
- GList *selected, *l;
- int i;
-
- gtk_init (&argc, &argv);
-
- dialog = GTK_DIALOG (gtk_dialog_new ());
- g_object_ref_sink (dialog);
-
- collection = gcr_simple_collection_new ();
- selector = gcr_tree_selector_new (collection, GCR_CERTIFICATE_COLUMNS);
-
- scroll = gtk_scrolled_window_new (NULL, NULL);
- gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scroll), GTK_SHADOW_ETCHED_IN);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
- gtk_container_add (GTK_CONTAINER (scroll), GTK_WIDGET (selector));
- gtk_widget_show_all (scroll);
-
- gtk_widget_show (GTK_WIDGET (selector));
- gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (dialog)), GTK_WIDGET (scroll), TRUE, TRUE, 0);
-
- gtk_window_set_default_size (GTK_WINDOW (dialog), 550, 400);
- gtk_container_set_border_width (GTK_CONTAINER (dialog), 20);
-
- parser = gcr_parser_new ();
- g_signal_connect (parser, "parsed", G_CALLBACK (on_parser_parsed), collection);
-
- if (argc == 1) {
- add_to_selector (parser, SRCDIR "/gcr-gtk3/fixtures/ca-certificates.crt");
- } else {
- for (i = 1; i < argc; ++i)
- add_to_selector (parser, argv[i]);
- }
-
- g_object_unref (parser);
- g_object_unref (collection);
-
- gtk_dialog_run (dialog);
-
- selected = gcr_tree_selector_get_selected (selector);
- for (l = selected; l; l = g_list_next (l)) {
- gchar *label;
- g_object_get (l->data, "label", &label, NULL);
- g_print ("selected: %s\n", label);
- g_free (label);
- }
- g_list_free (selected);
-
- gtk_widget_destroy (GTK_WIDGET (dialog));
- g_object_unref (dialog);
-
- return 0;
-}
diff --git a/gcr-gtk3/frob-unlock-options.c b/gcr-gtk3/frob-unlock-options.c
deleted file mode 100644
index 23455cc..0000000
--- a/gcr-gtk3/frob-unlock-options.c
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2010 Collabora Ltd.
- *
- * 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/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#include "config.h"
-
-#include "gcr/gcr.h"
-#include "gcr-gtk3/gcr-gtk3.h"
-
-#include <gtk/gtk.h>
-
-#include <unistd.h>
-#include <string.h>
-#include <errno.h>
-
-static void
-test_unlock_options (void)
-{
- GcrUnlockOptionsWidget *unlock;
- GtkDialog *dialog;
-
- dialog = GTK_DIALOG (gtk_dialog_new ());
- g_object_ref_sink (dialog);
-
- unlock = GCR_UNLOCK_OPTIONS_WIDGET (gcr_unlock_options_widget_new ());
- gtk_widget_show (GTK_WIDGET (unlock));
- gtk_container_add (GTK_CONTAINER (gtk_dialog_get_content_area (dialog)), GTK_WIDGET (unlock));
-
- gcr_unlock_options_widget_set_sensitive (unlock, GCR_UNLOCK_OPTION_IDLE, FALSE,
- "This is a test of the tooltip.");
- gcr_unlock_options_widget_set_sensitive (unlock, GCR_UNLOCK_OPTION_ALWAYS, TRUE, NULL);
- gcr_unlock_options_widget_set_label (unlock, GCR_UNLOCK_OPTION_IDLE, "Disabled label test");
- gcr_unlock_options_widget_set_ttl (unlock, 80);
- gcr_unlock_options_widget_set_choice (unlock, GCR_UNLOCK_OPTION_ALWAYS);
-
- gtk_window_set_default_size (GTK_WINDOW (dialog), 400, 400);
- gtk_dialog_run (dialog);
-
- g_printerr ("choice: %s\n",
- gcr_unlock_options_widget_get_choice (unlock));
-
- g_printerr ("ttl: %u\n",
- gcr_unlock_options_widget_get_ttl (unlock));
-
- g_printerr ("idle sensitive: %s\n",
- gcr_unlock_options_widget_get_sensitive (unlock, GCR_UNLOCK_OPTION_IDLE) ? "T" : "F");
-
- g_printerr ("always sensitive: %s\n",
- gcr_unlock_options_widget_get_sensitive (unlock, GCR_UNLOCK_OPTION_ALWAYS) ? "T" : "F");
-
- g_printerr ("label: %s\n",
- gcr_unlock_options_widget_get_label (unlock, GCR_UNLOCK_OPTION_ALWAYS));
-
- g_object_unref (dialog);
-}
-
-int
-main(int argc, char *argv[])
-{
- gtk_init (&argc, &argv);
- g_set_prgname ("frob-unlock-options");
-
- test_unlock_options ();
-
- return 0;
-}
diff --git a/gcr-gtk3/gcr-certificate-exporter.c b/gcr-gtk3/gcr-certificate-exporter.c
deleted file mode 100644
index 4b1817f..0000000
--- a/gcr-gtk3/gcr-certificate-exporter.c
+++ /dev/null
@@ -1,570 +0,0 @@
-/*
- * Copyright (C) 2011 Collabora Ltd.
- *
- * 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/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#include "config.h"
-
-#include "gcr/gcr-certificate.h"
-
-#include "gcr-certificate-exporter.h"
-
-#include "egg/egg-armor.h"
-#include "egg/egg-openssl.h"
-
-#include <glib/gi18n-lib.h>
-
-enum {
- PROP_0,
- PROP_CERTIFICATE,
- PROP_LABEL,
- PROP_TRANSIENT_FOR
-};
-
-struct _GcrCertificateExporterPrivate {
-
- /* Setup stuff */
- GcrCertificate *certificate;
- gchar *label;
- GtkWindow *transient_for;
-
- /* Used during operation */
- GtkFileChooser *chooser_dialog;
- GFile *output_file;
- GByteArray *buffer;
- guint buffer_at;
-
- /* Async stuff */
- GAsyncReadyCallback callback;
- gpointer user_data;
- GCancellable *cancellable;
- GError *error;
- gboolean completed;
-};
-
-static const gchar *BAD_FILENAME_CHARS = "/\\<>|?*";
-
-/* Forward declarations */
-static void _gcr_certificate_exporter_async_result_init (GAsyncResultIface *iface);
-static void write_to_outputstream (GcrCertificateExporter *self, GOutputStream *os);
-
-G_DEFINE_TYPE_WITH_CODE (GcrCertificateExporter, _gcr_certificate_exporter, G_TYPE_OBJECT,
- G_ADD_PRIVATE (GcrCertificateExporter);
- G_IMPLEMENT_INTERFACE (G_TYPE_ASYNC_RESULT, _gcr_certificate_exporter_async_result_init));
-
-typedef void (*PrepareDataFunc) (GcrCertificateExporter *self);
-
-/* -----------------------------------------------------------------------------
- * INTERNAL
- */
-
-static void
-prepare_data_for_der (GcrCertificateExporter *self)
-{
- gconstpointer data;
- gsize n_data;
-
- data = gcr_certificate_get_der_data (self->pv->certificate, &n_data);
- g_return_if_fail (data);
-
- self->pv->buffer = g_byte_array_new ();
- g_byte_array_append (self->pv->buffer, data, n_data);
-}
-
-static void
-prepare_data_for_pem (GcrCertificateExporter *self)
-{
- gconstpointer data;
- gpointer encoded;
- gsize n_data, n_encoded;
-
- data = gcr_certificate_get_der_data (self->pv->certificate, &n_data);
- g_return_if_fail (data);
-
- self->pv->buffer = g_byte_array_new ();
-
- encoded = egg_armor_write (data, n_data,
- g_quark_from_static_string ("CERTIFICATE"),
- NULL, &n_encoded);
-
- g_byte_array_append (self->pv->buffer, encoded, n_encoded);
- g_free (encoded);
-}
-
-static void
-complete_async_result (GcrCertificateExporter *self)
-{
- g_assert (self->pv->callback);
- g_assert (!self->pv->completed);
-
- if (self->pv->chooser_dialog)
- gtk_widget_hide (GTK_WIDGET (self->pv->chooser_dialog));
-
- self->pv->completed = TRUE;
- (self->pv->callback) (G_OBJECT (self), G_ASYNC_RESULT (self),
- self->pv->user_data);
-}
-
-static void
-on_outputstream_write_ready (GObject *source, GAsyncResult *res, gpointer user_data)
-{
- GcrCertificateExporter *self = GCR_CERTIFICATE_EXPORTER (user_data);
- GOutputStream *os = G_OUTPUT_STREAM (source);
- gssize written;
-
- written = g_output_stream_write_finish (os, res, &self->pv->error);
-
- if (self->pv->error) {
- complete_async_result (self);
- return;
- }
-
- g_return_if_fail (written >= 0);
- g_return_if_fail (written <= self->pv->buffer->len - self->pv->buffer_at);
- self->pv->buffer_at += written;
-
- /* Write next bit, or finished */
- write_to_outputstream (self, os);
-}
-
-static void
-on_outputstream_closed (GObject *source, GAsyncResult *res, gpointer user_data)
-{
- GcrCertificateExporter *self = GCR_CERTIFICATE_EXPORTER (user_data);
- g_output_stream_close_finish (G_OUTPUT_STREAM (source), res, &self->pv->error);
- complete_async_result (self);
-}
-
-static void
-write_to_outputstream (GcrCertificateExporter *self, GOutputStream *os)
-{
- gtk_widget_hide (GTK_WIDGET (self->pv->chooser_dialog));
- g_assert (GTK_IS_WIDGET (self->pv->chooser_dialog));
-
- /* Are we all done? */
- g_assert (self->pv->buffer_at <= self->pv->buffer->len);
- if (self->pv->buffer_at == self->pv->buffer->len) {
- g_output_stream_close_async (os, G_PRIORITY_DEFAULT,
- self->pv->cancellable,
- on_outputstream_closed, self);
- return;
- }
-
- g_output_stream_write_async (os, self->pv->buffer->data + self->pv->buffer_at,
- self->pv->buffer->len - self->pv->buffer_at,
- G_PRIORITY_DEFAULT, self->pv->cancellable,
- on_outputstream_write_ready, self);
-}
-
-static void
-on_replace_file_ready (GObject *source, GAsyncResult *res, gpointer user_data)
-{
- GcrCertificateExporter *self = GCR_CERTIFICATE_EXPORTER (user_data);
- GFile *file = G_FILE (source);
- GFileOutputStream *os;
-
- os = g_file_replace_finish (file, res, &self->pv->error);
-
- if (self->pv->error) {
- complete_async_result (self);
- return;
- }
-
- write_to_outputstream (self, G_OUTPUT_STREAM (os));
-}
-
-static void
-on_replace_dialog_response (GtkDialog *dialog, gint response_id, gpointer user_data)
-{
- GcrCertificateExporter *self = GCR_CERTIFICATE_EXPORTER (user_data);
-
- if (response_id == GTK_RESPONSE_ACCEPT) {
- g_file_replace_async (self->pv->output_file, NULL, FALSE, G_FILE_CREATE_NONE,
- G_PRIORITY_DEFAULT, self->pv->cancellable,
- on_replace_file_ready, self);
- }
-
- gtk_widget_destroy (GTK_WIDGET (dialog));
-}
-
-static void
-on_cancel_replace_dialog (GCancellable *cancellable, gpointer user_data)
-{
- gtk_widget_destroy (user_data);
-}
-
-static void
-on_create_file_ready (GObject *source, GAsyncResult *res, gpointer user_data)
-{
- GcrCertificateExporter *self = GCR_CERTIFICATE_EXPORTER (user_data);
- GFileOutputStream *os;
- GtkWidget *dialog;
-
- os = g_file_create_finish (self->pv->output_file, res, &self->pv->error);
-
- /* Try again this time replacing the file */
- if (g_error_matches (self->pv->error, G_IO_ERROR, G_IO_ERROR_EXISTS)) {
- g_clear_error (&self->pv->error);
-
- dialog = gtk_message_dialog_new_with_markup (GTK_WINDOW (self->pv->chooser_dialog),
- GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION,
- GTK_BUTTONS_NONE, "<b>%s</b>\n\n%s",
- _("A file already exists with this name."),
- _("Do you want to replace it with a new file?"));
- gtk_dialog_add_buttons (GTK_DIALOG (dialog),
- _("_Cancel"), GTK_RESPONSE_CANCEL,
- _("_Replace"), GTK_RESPONSE_ACCEPT, NULL);
-
- g_signal_connect (dialog, "response",
- G_CALLBACK (on_replace_dialog_response), self);
- if (self->pv->cancellable)
- g_cancellable_connect (self->pv->cancellable,
- G_CALLBACK (on_cancel_replace_dialog),
- g_object_ref (dialog), g_object_unref);
- gtk_widget_show (dialog);
-
- return;
- }
-
- if (self->pv->error) {
- complete_async_result (self);
- return;
- }
-
- write_to_outputstream (self, G_OUTPUT_STREAM (os));
-}
-
-static void
-on_chooser_dialog_response (GtkDialog *dialog, gint response_id, gpointer user_data)
-{
- GcrCertificateExporter *self = GCR_CERTIFICATE_EXPORTER (user_data);
- GtkFileFilter *filter;
- PrepareDataFunc prepare_data;
-
- if (response_id != GTK_RESPONSE_ACCEPT) {
- g_set_error (&self->pv->error, G_IO_ERROR, G_IO_ERROR_CANCELLED,
- _("The operation was cancelled."));
- complete_async_result (self);
- return;
- }
-
- if (self->pv->output_file)
- g_object_unref (self->pv->output_file);
- self->pv->output_file = gtk_file_chooser_get_file (self->pv->chooser_dialog);
- g_return_if_fail (self->pv->output_file);
-
- filter = gtk_file_chooser_get_filter (self->pv->chooser_dialog);
- prepare_data = g_object_get_data (G_OBJECT (filter), "prepare-data-func");
- g_assert (prepare_data);
-
- if (self->pv->buffer)
- g_byte_array_free (self->pv->buffer, TRUE);
- self->pv->buffer = NULL;
- self->pv->buffer_at = 0;
-
- /* Prepare the for writing out */
- (prepare_data) (self);
-
- /* Try to open the file */
- g_file_create_async (self->pv->output_file, G_FILE_CREATE_NONE, G_PRIORITY_DEFAULT,
- self->pv->cancellable, on_create_file_ready,
- self);
-}
-
-static void
-on_cancel_chooser_dialog (GCancellable *cancellable, gpointer user_data)
-{
- GtkDialog *dialog = GTK_DIALOG (user_data);
- gtk_dialog_response (dialog, GTK_RESPONSE_CANCEL);
-}
-
-static void
-exporter_display_chooser (GcrCertificateExporter *self)
-{
- GtkFileFilter* filter;
- GtkWidget *dialog;
- gchar *filename;
-
- g_assert (!self->pv->chooser_dialog);
-
- dialog = gtk_file_chooser_dialog_new (_("Export certificate"),
- NULL, GTK_FILE_CHOOSER_ACTION_SAVE,
- _("_Cancel"), GTK_RESPONSE_CANCEL,
- _("_Save"), GTK_RESPONSE_ACCEPT,
- NULL);
-
- self->pv->chooser_dialog = GTK_FILE_CHOOSER (g_object_ref_sink (dialog));
- gtk_dialog_set_default_response (GTK_DIALOG (dialog),
- GTK_RESPONSE_ACCEPT);
- gtk_file_chooser_set_local_only (self->pv->chooser_dialog, FALSE);
-
- filter = gtk_file_filter_new ();
- gtk_file_filter_set_name (filter, _("Certificate files"));
- gtk_file_filter_add_mime_type (filter, "application/x-x509-ca-cert");
- gtk_file_filter_add_mime_type (filter, "application/x-x509-user-cert");
- gtk_file_filter_add_mime_type (filter, "application/pkix-cert");
- gtk_file_filter_add_pattern (filter, "*.cer");
- gtk_file_filter_add_pattern (filter, "*.crt");
- g_object_set_data (G_OBJECT (filter), "prepare-data-func", prepare_data_for_der);
- gtk_file_chooser_add_filter (self->pv->chooser_dialog, filter);
- gtk_file_chooser_set_filter (self->pv->chooser_dialog, filter);
-
- filter = gtk_file_filter_new ();
- gtk_file_filter_set_name (filter, _("PEM files"));
- gtk_file_filter_add_mime_type (filter, "text/plain");
- gtk_file_filter_add_pattern (filter, "*.pem");
- g_object_set_data (G_OBJECT (filter), "prepare-data-func", prepare_data_for_pem);
- gtk_file_chooser_add_filter (self->pv->chooser_dialog, filter);
-
- filename = g_strconcat (self->pv->label, ".crt", NULL);
- g_strdelimit (filename, BAD_FILENAME_CHARS, '_');
- gtk_file_chooser_set_current_name (self->pv->chooser_dialog, filename);
- g_free (filename);
-
- g_signal_connect (self->pv->chooser_dialog, "response",
- G_CALLBACK (on_chooser_dialog_response), self);
- if (self->pv->cancellable)
- g_cancellable_connect (self->pv->cancellable,
- G_CALLBACK (on_cancel_chooser_dialog), self, NULL);
-
- gtk_dialog_run (GTK_DIALOG (self->pv->chooser_dialog));
-}
-
-/* -----------------------------------------------------------------------------
- * OBJECT
- */
-
-static void
-_gcr_certificate_exporter_init (GcrCertificateExporter *self)
-{
- self->pv = _gcr_certificate_exporter_get_instance_private (self);
-}
-
-static void
-_gcr_certificate_exporter_dispose (GObject *obj)
-{
- GcrCertificateExporter *self = GCR_CERTIFICATE_EXPORTER (obj);
-
- if (self->pv->certificate)
- g_object_unref (self->pv->certificate);
- self->pv->certificate = NULL;
-
- if (self->pv->cancellable)
- g_object_unref (self->pv->cancellable);
- self->pv->cancellable = NULL;
-
- G_OBJECT_CLASS (_gcr_certificate_exporter_parent_class)->dispose (obj);
-}
-
-static void
-_gcr_certificate_exporter_finalize (GObject *obj)
-{
- GcrCertificateExporter *self = GCR_CERTIFICATE_EXPORTER (obj);
-
- g_free (self->pv->label);
-
- /*
- * Should have been freed in _export_finish, which holds a ref to self
- * so this should never be reached without being finished.
- */
- g_assert (!self->pv->chooser_dialog);
- g_assert (!self->pv->output_file);
- g_assert (!self->pv->buffer);
-
- g_clear_error (&self->pv->error);
-
- G_OBJECT_CLASS (_gcr_certificate_exporter_parent_class)->finalize (obj);
-}
-
-static void
-_gcr_certificate_exporter_set_property (GObject *obj, guint prop_id, const GValue *value,
- GParamSpec *pspec)
-{
- GcrCertificateExporter *self = GCR_CERTIFICATE_EXPORTER (obj);
- GcrCertificate *cert;
-
- switch (prop_id) {
- case PROP_CERTIFICATE:
- cert = g_value_dup_object (value);
- if (self->pv->certificate)
- g_object_unref (self->pv->certificate);
- self->pv->certificate = cert;
- g_object_notify (G_OBJECT (self), "certificate");
- break;
- case PROP_LABEL:
- g_free (self->pv->label);
- self->pv->label = g_value_dup_string (value);
- g_object_notify (obj, "label");
- break;
- case PROP_TRANSIENT_FOR:
- self->pv->transient_for = g_value_get_object (value);
- g_object_notify (obj, "transient-for");
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-_gcr_certificate_exporter_get_property (GObject *obj, guint prop_id, GValue *value,
- GParamSpec *pspec)
-{
- GcrCertificateExporter *self = GCR_CERTIFICATE_EXPORTER (obj);
-
- switch (prop_id) {
- case PROP_CERTIFICATE:
- g_value_set_object (value, self->pv->certificate);
- break;
- case PROP_LABEL:
- g_value_take_string (value, self->pv->label);
- break;
- case PROP_TRANSIENT_FOR:
- g_value_set_object (value, self->pv->transient_for);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-_gcr_certificate_exporter_class_init (GcrCertificateExporterClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-
- _gcr_certificate_exporter_parent_class = g_type_class_peek_parent (klass);
-
- gobject_class->dispose = _gcr_certificate_exporter_dispose;
- gobject_class->finalize = _gcr_certificate_exporter_finalize;
- gobject_class->set_property = _gcr_certificate_exporter_set_property;
- gobject_class->get_property = _gcr_certificate_exporter_get_property;
-
- g_object_class_install_property (gobject_class, PROP_CERTIFICATE,
- g_param_spec_object ("certificate", "Certificate", "Certificate to display.",
- GCR_TYPE_CERTIFICATE,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
- g_object_class_install_property (gobject_class, PROP_LABEL,
- g_param_spec_string ("label", "Label", "Label of certificate.",
- _("Certificate"),
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
- g_object_class_install_property (gobject_class, PROP_TRANSIENT_FOR,
- g_param_spec_object ("transient-for", "Transient For", "Transient for this Window",
- GTK_TYPE_WINDOW,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-}
-
-static GObject*
-_gcr_certificate_exporter_get_source_object (GAsyncResult *result)
-{
- g_return_val_if_fail (GCR_IS_CERTIFICATE_EXPORTER (result), NULL);
- return G_OBJECT (result);
-}
-
-static gpointer
-_gcr_certificate_exporter_get_user_data (GAsyncResult *result)
-{
- g_return_val_if_fail (GCR_IS_CERTIFICATE_EXPORTER (result), NULL);
- return GCR_CERTIFICATE_EXPORTER (result)->pv->user_data;
-}
-
-static void
-_gcr_certificate_exporter_async_result_init (GAsyncResultIface *iface)
-{
- iface->get_source_object = _gcr_certificate_exporter_get_source_object;
- iface->get_user_data = _gcr_certificate_exporter_get_user_data;
-}
-
-/* -----------------------------------------------------------------------------
- * PUBLIC
- */
-
-GcrCertificateExporter*
-_gcr_certificate_exporter_new (GcrCertificate *certificate, const gchar *label,
- GtkWindow *transient_for)
-{
- return g_object_new (GCR_TYPE_CERTIFICATE_EXPORTER,
- "certificate", certificate,
- "label", label,
- "transient-for", transient_for,
- NULL);
-}
-
-void
-_gcr_certificate_exporter_export_async (GcrCertificateExporter *self,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data)
-{
- g_return_if_fail (GCR_IS_CERTIFICATE_EXPORTER (self));
- g_return_if_fail (callback);
-
- /* Must not have already started */
- g_return_if_fail (!self->pv->callback);
- g_return_if_fail (!self->pv->cancellable);
-
- self->pv->callback = callback;
- self->pv->user_data = user_data;
- if (cancellable)
- self->pv->cancellable = g_object_ref (cancellable);
-
- /* Matching in export_finish */
- g_object_ref (self);
-
- exporter_display_chooser (self);
-}
-
-gboolean
-_gcr_certificate_exporter_export_finish (GcrCertificateExporter *self,
- GAsyncResult *result,
- GError **error)
-{
- gboolean ret = TRUE;
-
- g_return_val_if_fail (G_ASYNC_RESULT (self) == result, FALSE);
- g_return_val_if_fail (!error || !*error, FALSE);
- g_return_val_if_fail (self->pv->completed, FALSE);
-
- /* Cleanup all the operation stuff */
- self->pv->callback = NULL;
-
- if (self->pv->chooser_dialog)
- g_object_unref (self->pv->chooser_dialog);
- self->pv->chooser_dialog = NULL;
-
- if (self->pv->output_file)
- g_object_unref (self->pv->output_file);
- self->pv->output_file = NULL;
-
- if (self->pv->buffer)
- g_byte_array_free (self->pv->buffer, TRUE);
- self->pv->buffer = NULL;
- self->pv->buffer_at = 0;
-
- self->pv->completed = FALSE;
-
- if (self->pv->error) {
- g_propagate_error (error, self->pv->error);
- ret = FALSE;
- }
-
- /* Matches in export_async */
- g_object_unref (self);
- return ret;
-}
diff --git a/gcr-gtk3/gcr-certificate-exporter.h b/gcr-gtk3/gcr-certificate-exporter.h
deleted file mode 100644
index d5dd9c2..0000000
--- a/gcr-gtk3/gcr-certificate-exporter.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (C) 2011 Collabora Ltd.
- *
- * 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/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly."
-#endif
-
-#ifndef __GCR_CERTIFICATE_EXPORTER_H__
-#define __GCR_CERTIFICATE_EXPORTER_H__
-
-#include <glib-object.h>
-#include <gtk/gtk.h>
-
-#include "gcr/gcr-types.h"
-
-G_BEGIN_DECLS
-
-#define GCR_TYPE_CERTIFICATE_EXPORTER (_gcr_certificate_exporter_get_type ())
-#define GCR_CERTIFICATE_EXPORTER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_CERTIFICATE_EXPORTER, GcrCertificateExporter))
-#define GCR_CERTIFICATE_EXPORTER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_CERTIFICATE_EXPORTER, GcrCertificateExporterClass))
-#define GCR_IS_CERTIFICATE_EXPORTER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_CERTIFICATE_EXPORTER))
-#define GCR_IS_CERTIFICATE_EXPORTER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_CERTIFICATE_EXPORTER))
-#define GCR_CERTIFICATE_EXPORTER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_CERTIFICATE_EXPORTER, GcrCertificateExporterClass))
-
-typedef struct _GcrCertificateExporter GcrCertificateExporter;
-typedef struct _GcrCertificateExporterClass GcrCertificateExporterClass;
-typedef struct _GcrCertificateExporterPrivate GcrCertificateExporterPrivate;
-
-struct _GcrCertificateExporter {
- /*< private >*/
- GObject parent;
- GcrCertificateExporterPrivate *pv;
-};
-
-struct _GcrCertificateExporterClass {
- GObjectClass parent_class;
-};
-
-GType _gcr_certificate_exporter_get_type (void);
-
-GcrCertificateExporter* _gcr_certificate_exporter_new (GcrCertificate *certificate,
- const gchar *label,
- GtkWindow *transient_for);
-
-void _gcr_certificate_exporter_export_async (GcrCertificateExporter *self,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data);
-
-gboolean _gcr_certificate_exporter_export_finish (GcrCertificateExporter *self,
- GAsyncResult *result,
- GError **error);
-
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrCertificateExporter, g_object_unref)
-
-G_END_DECLS
-
-#endif /* __GCR_CERTIFICATE_EXPORTER_H__ */
diff --git a/gcr-gtk3/gcr-certificate-renderer-private.h b/gcr-gtk3/gcr-certificate-renderer-private.h
deleted file mode 100644
index 53f3bda..0000000
--- a/gcr-gtk3/gcr-certificate-renderer-private.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2010 Stefan Walter
- *
- * 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/>.
- */
-
-#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly."
-#endif
-
-#ifndef __GCR_CERTIFICATE_RENDERER_PRIVATE_H__
-#define __GCR_CERTIFICATE_RENDERER_PRIVATE_H__
-
-#include "gcr-display-view.h"
-#include "gcr-renderer.h"
-
-G_BEGIN_DECLS
-
-void _gcr_certificate_renderer_append_distinguished_name (GcrRenderer *renderer,
- GcrDisplayView *view,
- GNode *dn);
-
-void _gcr_certificate_renderer_append_subject_public_key (GcrRenderer *renderer,
- GcrDisplayView *view,
- guint key_size,
- GNode *subject_public_key);
-
-void _gcr_certificate_renderer_append_signature (GcrRenderer *renderer,
- GcrDisplayView *view,
- GNode *asn);
-
-void _gcr_certificate_renderer_append_extension (GcrRenderer *renderer,
- GcrDisplayView *view,
- GNode *asn);
-
-G_END_DECLS
-
-#endif /* __GCR_CERTIFICATE_RENDERER_PRIVATE_H__ */
diff --git a/gcr-gtk3/gcr-certificate-renderer.c b/gcr-gtk3/gcr-certificate-renderer.c
deleted file mode 100644
index 65be5ba..0000000
--- a/gcr-gtk3/gcr-certificate-renderer.c
+++ /dev/null
@@ -1,925 +0,0 @@
-/*
- * Copyright (C) 2010 Stefan Walter
- *
- * 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 "config.h"
-
-#include "gcr/gcr-certificate.h"
-#include "gcr/gcr-certificate-extensions.h"
-#include "gcr/gcr-fingerprint.h"
-#include "gcr/gcr-icons.h"
-#include "gcr/gcr-oids.h"
-#include "gcr/gcr-simple-certificate.h"
-
-#include "gcr-certificate-exporter.h"
-#include "gcr-certificate-renderer.h"
-#include "gcr-certificate-renderer-private.h"
-#include "gcr-display-view.h"
-#include "gcr-renderer.h"
-
-#include "egg/egg-asn1x.h"
-#include "egg/egg-asn1-defs.h"
-#include "egg/egg-dn.h"
-#include "egg/egg-oid.h"
-#include "egg/egg-hex.h"
-
-#include "gck/gck.h"
-
-#include <gdk/gdk.h>
-#include <glib/gi18n-lib.h>
-
-/**
- * GcrCertificateRenderer:
- *
- * An implementation of #GcrRenderer which renders certificates.
- */
-
-/**
- * GcrCertificateRendererClass:
- * @parent_class: The parent class.
- *
- * The class for #GcrCertificateRenderer.
- */
-
-enum {
- PROP_0,
- PROP_CERTIFICATE,
- PROP_LABEL,
- PROP_ATTRIBUTES
-};
-
-struct _GcrCertificateRendererPrivate {
- GcrCertificate *opt_cert;
- GckAttributes *opt_attrs;
- guint key_size;
- gchar *label;
-};
-
-static void gcr_renderer_iface_init (GcrRendererIface *iface);
-static void gcr_renderer_certificate_iface_init (GcrCertificateIface *iface);
-
-G_DEFINE_TYPE_WITH_CODE (GcrCertificateRenderer, gcr_certificate_renderer, G_TYPE_OBJECT,
- G_ADD_PRIVATE (GcrCertificateRenderer);
- G_IMPLEMENT_INTERFACE (GCR_TYPE_RENDERER, gcr_renderer_iface_init);
- GCR_CERTIFICATE_MIXIN_IMPLEMENT_COMPARABLE ();
- G_IMPLEMENT_INTERFACE (GCR_TYPE_CERTIFICATE, gcr_renderer_certificate_iface_init);
-);
-
-/* -----------------------------------------------------------------------------
- * INTERNAL
- */
-
-static gchar*
-calculate_label (GcrCertificateRenderer *self)
-{
- gchar *label;
-
- if (self->pv->label)
- return g_strdup (self->pv->label);
-
- if (self->pv->opt_attrs) {
- if (gck_attributes_find_string (self->pv->opt_attrs, CKA_LABEL, &label))
- return label;
- }
-
- label = gcr_certificate_get_subject_cn (GCR_CERTIFICATE (self));
- if (label != NULL)
- return label;
-
- return g_strdup (_("Certificate"));
-}
-
-static gboolean
-append_extension_basic_constraints (GcrRenderer *renderer,
- GcrDisplayView *view,
- GBytes *data)
-{
- gboolean is_ca = FALSE;
- gint path_len = -1;
- gchar *number;
-
- if (!_gcr_certificate_extension_basic_constraints (data, &is_ca, &path_len))
- return FALSE;
-
- _gcr_display_view_append_heading (view, renderer, _("Basic Constraints"));
-
- _gcr_display_view_append_value (view, renderer, _("Certificate Authority"),
- is_ca ? _("Yes") : _("No"), FALSE);
-
- number = g_strdup_printf ("%d", path_len);
- _gcr_display_view_append_value (view, renderer, _("Max Path Length"),
- path_len < 0 ? _("Unlimited") : number, FALSE);
- g_free (number);
-
- return TRUE;
-}
-
-static gboolean
-append_extension_extended_key_usage (GcrRenderer *renderer,
- GcrDisplayView *view,
- GBytes *data)
-{
- GQuark *oids;
- GString *text;
- guint i;
-
- oids = _gcr_certificate_extension_extended_key_usage (data);
- if (oids == NULL)
- return FALSE;
-
- _gcr_display_view_append_heading (view, renderer, _("Extended Key Usage"));
-
- text = g_string_new ("");
- for (i = 0; oids[i] != 0; i++) {
- if (i > 0)
- g_string_append_unichar (text, GCR_DISPLAY_VIEW_LINE_BREAK);
- g_string_append (text, egg_oid_get_description (oids[i]));
- }
-
- g_free (oids);
-
- _gcr_display_view_append_value (view, renderer, _("Allowed Purposes"),
- text->str, FALSE);
-
- g_string_free (text, TRUE);
-
- return TRUE;
-}
-
-static gboolean
-append_extension_subject_key_identifier (GcrRenderer *renderer,
- GcrDisplayView *view,
- GBytes *data)
-{
- gpointer keyid;
- gsize n_keyid;
-
- keyid = _gcr_certificate_extension_subject_key_identifier (data, &n_keyid);
- if (keyid == NULL)
- return FALSE;
-
- _gcr_display_view_append_heading (view, renderer, _("Subject Key Identifier"));
- _gcr_display_view_append_hex (view, renderer, _("Key Identifier"), keyid, n_keyid);
-
- g_free (keyid);
-
- return TRUE;
-}
-
-static const struct {
- guint usage;
- const gchar *description;
-} usage_descriptions[] = {
- { GCR_KEY_USAGE_DIGITAL_SIGNATURE, N_("Digital signature") },
- { GCR_KEY_USAGE_NON_REPUDIATION, N_("Non repudiation") },
- { GCR_KEY_USAGE_KEY_ENCIPHERMENT, N_("Key encipherment") },
- { GCR_KEY_USAGE_DATA_ENCIPHERMENT, N_("Data encipherment") },
- { GCR_KEY_USAGE_KEY_AGREEMENT, N_("Key agreement") },
- { GCR_KEY_USAGE_KEY_CERT_SIGN, N_("Certificate signature") },
- { GCR_KEY_USAGE_CRL_SIGN, N_("Revocation list signature") },
- { GCR_KEY_USAGE_ENCIPHER_ONLY, N_("Encipher only") },
- { GCR_KEY_USAGE_DECIPHER_ONLY, N_("Decipher only") }
-};
-
-static gboolean
-append_extension_key_usage (GcrRenderer *renderer,
- GcrDisplayView *view,
- GBytes *data)
-{
- gulong key_usage;
- GString *text;
- guint i;
-
- if (!_gcr_certificate_extension_key_usage (data, &key_usage))
- return FALSE;
-
- text = g_string_new ("");
-
- for (i = 0; i < G_N_ELEMENTS (usage_descriptions); i++) {
- if (key_usage & usage_descriptions[i].usage) {
- if (text->len > 0)
- g_string_append_unichar (text, GCR_DISPLAY_VIEW_LINE_BREAK);
- g_string_append (text, _(usage_descriptions[i].description));
- }
- }
-
- _gcr_display_view_append_heading (view, renderer, _("Key Usage"));
- _gcr_display_view_append_value (view, renderer, _("Usages"), text->str, FALSE);
-
- g_string_free (text, TRUE);
-
- return TRUE;
-}
-
-static gboolean
-append_extension_subject_alt_name (GcrRenderer *renderer,
- GcrDisplayView *view,
- GBytes *data)
-{
- GArray *general_names;
- GcrGeneralName *general;
- guint i;
-
- general_names = _gcr_certificate_extension_subject_alt_name (data);
- if (general_names == NULL)
- return FALSE;
-
- _gcr_display_view_append_heading (view, renderer, _("Subject Alternative Names"));
-
- for (i = 0; i < general_names->len; i++) {
- general = &g_array_index (general_names, GcrGeneralName, i);
- if (general->display == NULL)
- _gcr_display_view_append_hex (view, renderer, general->description,
- g_bytes_get_data (general->raw, NULL),
- g_bytes_get_size (general->raw));
- else
- _gcr_display_view_append_value (view, renderer, general->description,
- general->display, FALSE);
- }
-
- _gcr_general_names_free (general_names);
-
- return TRUE;
-}
-
-static gboolean
-append_extension_hex (GcrRenderer *renderer,
- GcrDisplayView *view,
- GQuark oid,
- gconstpointer data,
- gsize n_data)
-{
- const gchar *text;
-
- _gcr_display_view_append_heading (view, renderer, _("Extension"));
-
- /* Extension type */
- text = egg_oid_get_description (oid);
- _gcr_display_view_append_value (view, renderer, _("Identifier"), text, FALSE);
- _gcr_display_view_append_hex (view, renderer, _("Value"), data, n_data);
-
- return TRUE;
-}
-
-static void
-on_export_completed (GObject *source, GAsyncResult *result, gpointer user_data)
-{
- GtkWindow *parent = GTK_WINDOW (user_data);
- GcrCertificateExporter *exporter = GCR_CERTIFICATE_EXPORTER (source);
- GError *error = NULL;
- GtkWidget *dialog;
-
- if (!_gcr_certificate_exporter_export_finish (exporter, result, &error)) {
- if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
- dialog = gtk_message_dialog_new_with_markup (parent,
- GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR,
- GTK_BUTTONS_OK, "<big>%s</big>\n\n%s",
- _("Couldn’t export the certificate."),
- error->message);
- gtk_widget_show (dialog);
- g_signal_connect (dialog, "delete-event",
- G_CALLBACK (gtk_widget_destroy), dialog);
- g_signal_connect_swapped(dialog, "response", G_CALLBACK (gtk_widget_destroy), dialog);
- }
- }
-
- /* Matches ref in on_certificate_export */
- if (parent)
- g_object_unref (parent);
-}
-
-static void
-on_certificate_export (GtkMenuItem *menuitem, gpointer user_data)
-{
- GcrCertificateRenderer *self = GCR_CERTIFICATE_RENDERER (user_data);
- GcrCertificateExporter *exporter;
- gchar *label;
- GtkWidget *parent;
-
- label = calculate_label (self);
-
- parent = gtk_widget_get_toplevel (GTK_WIDGET (menuitem));
- if (parent && !GTK_IS_WINDOW (parent))
- parent = NULL;
-
- exporter = _gcr_certificate_exporter_new (GCR_CERTIFICATE (self), label,
- GTK_WINDOW (parent));
-
- g_free (label);
-
- _gcr_certificate_exporter_export_async (exporter, NULL, on_export_completed,
- parent ? g_object_ref (parent) : NULL);
-}
-
-/* -----------------------------------------------------------------------------
- * OBJECT
- */
-
-static void
-gcr_certificate_renderer_init (GcrCertificateRenderer *self)
-{
- self->pv = gcr_certificate_renderer_get_instance_private (self);
-}
-
-static void
-gcr_certificate_renderer_dispose (GObject *obj)
-{
- GcrCertificateRenderer *self = GCR_CERTIFICATE_RENDERER (obj);
-
- if (self->pv->opt_cert)
- g_object_unref (self->pv->opt_cert);
- self->pv->opt_cert = NULL;
-
- G_OBJECT_CLASS (gcr_certificate_renderer_parent_class)->dispose (obj);
-}
-
-static void
-gcr_certificate_renderer_finalize (GObject *obj)
-{
- GcrCertificateRenderer *self = GCR_CERTIFICATE_RENDERER (obj);
-
- g_assert (!self->pv->opt_cert);
-
- if (self->pv->opt_attrs)
- gck_attributes_unref (self->pv->opt_attrs);
- self->pv->opt_attrs = NULL;
-
- g_free (self->pv->label);
- self->pv->label = NULL;
-
- G_OBJECT_CLASS (gcr_certificate_renderer_parent_class)->finalize (obj);
-}
-
-static void
-gcr_certificate_renderer_set_property (GObject *obj, guint prop_id, const GValue *value,
- GParamSpec *pspec)
-{
- GcrCertificateRenderer *self = GCR_CERTIFICATE_RENDERER (obj);
-
- switch (prop_id) {
- case PROP_CERTIFICATE:
- gcr_certificate_renderer_set_certificate (self, g_value_get_object (value));
- break;
- case PROP_LABEL:
- g_free (self->pv->label);
- self->pv->label = g_value_dup_string (value);
- g_object_notify (obj, "label");
- gcr_renderer_emit_data_changed (GCR_RENDERER (self));
- break;
- case PROP_ATTRIBUTES:
- gck_attributes_unref (self->pv->opt_attrs);
- self->pv->opt_attrs = g_value_get_boxed (value);
- if (self->pv->opt_attrs)
- gck_attributes_ref (self->pv->opt_attrs);
- if (self->pv->opt_cert) {
- g_object_unref (self->pv->opt_cert);
- g_object_notify (G_OBJECT (self), "certificate");
- self->pv->opt_cert = NULL;
- }
- gcr_renderer_emit_data_changed (GCR_RENDERER (self));
- g_object_notify (G_OBJECT (self), "attributes");
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-gcr_certificate_renderer_get_property (GObject *obj, guint prop_id, GValue *value,
- GParamSpec *pspec)
-{
- GcrCertificateRenderer *self = GCR_CERTIFICATE_RENDERER (obj);
-
- switch (prop_id) {
- case PROP_CERTIFICATE:
- g_value_set_object (value, self->pv->opt_cert);
- break;
- case PROP_LABEL:
- g_value_take_string (value, calculate_label (self));
- break;
- case PROP_ATTRIBUTES:
- g_value_set_boxed (value, self->pv->opt_attrs);
- break;
- default:
- gcr_certificate_mixin_get_property (obj, prop_id, value, pspec);
- break;
- }
-}
-
-static void
-gcr_certificate_renderer_class_init (GcrCertificateRendererClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
- GckBuilder builder = GCK_BUILDER_INIT;
-
- gcr_certificate_renderer_parent_class = g_type_class_peek_parent (klass);
-
- gobject_class->dispose = gcr_certificate_renderer_dispose;
- gobject_class->finalize = gcr_certificate_renderer_finalize;
- gobject_class->set_property = gcr_certificate_renderer_set_property;
- gobject_class->get_property = gcr_certificate_renderer_get_property;
-
- /**
- * GcrCertificateRenderer:certificate:
- *
- * The certificate to display. May be %NULL.
- */
- g_object_class_install_property (gobject_class, PROP_CERTIFICATE,
- g_param_spec_object ("certificate", "Certificate", "Certificate to display.",
- GCR_TYPE_CERTIFICATE,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
- /**
- * GcrCertificateRenderer:attributes:
- *
- * The certificate attributes to display. One of the attributes must be
- * a CKA_VALUE type attribute which contains a DER encoded certificate.
- */
- g_object_class_install_property (gobject_class, PROP_ATTRIBUTES,
- g_param_spec_boxed ("attributes", "Attributes", "Certificate pkcs11 attributes",
- GCK_TYPE_ATTRIBUTES,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
- /**
- * GcrCertificateRenderer:label:
- *
- * The label to display.
- */
- g_object_class_install_property (gobject_class, PROP_LABEL,
- g_param_spec_string ("label", "Label", "Certificate Label",
- "",
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
- gcr_certificate_mixin_class_init (gobject_class);
-
- /* Register this as a renderer which can be loaded */
- gck_builder_add_ulong (&builder, CKA_CLASS, CKO_CERTIFICATE);
- gcr_renderer_register (GCR_TYPE_CERTIFICATE_RENDERER, gck_builder_end (&builder));
-}
-
-static void
-gcr_certificate_renderer_render (GcrRenderer *renderer, GcrViewer *viewer)
-{
- GcrCertificateRenderer *self;
- GNode *extension;
- gconstpointer data;
- gsize n_data;
- GcrDisplayView *view;
- GcrCertificate *cert;
- GBytes *number;
- gulong version;
- guint bits, index;
- gchar *display;
- GBytes *bytes;
- GNode *asn;
- GDate date;
- GIcon *icon;
-
- self = GCR_CERTIFICATE_RENDERER (renderer);
-
- if (GCR_IS_DISPLAY_VIEW (viewer)) {
- view = GCR_DISPLAY_VIEW (viewer);
-
- } else {
- g_warning ("GcrCertificateRenderer only works with internal specific "
- "GcrViewer returned by gcr_viewer_new().");
- return;
- }
-
- _gcr_display_view_begin (view, renderer);
- cert = GCR_CERTIFICATE (self);
-
- data = gcr_certificate_get_der_data (cert, &n_data);
- if (!data) {
- _gcr_display_view_end (view, renderer);
- return;
- }
-
- icon = gcr_certificate_get_icon (cert);
- _gcr_display_view_set_icon (view, GCR_RENDERER (self), icon);
- g_object_unref (icon);
-
- bytes = g_bytes_new_static (data, n_data);
- asn = egg_asn1x_create_and_decode (pkix_asn1_tab, "Certificate", bytes);
- g_return_if_fail (asn != NULL);
- g_bytes_unref (bytes);
-
- display = calculate_label (self);
- _gcr_display_view_append_title (view, renderer, display);
- g_free (display);
-
- display = egg_dn_read_part (egg_asn1x_node (asn, "tbsCertificate", "subject", "rdnSequence", NULL), "CN");
- _gcr_display_view_append_content (view, renderer, _("Identity"), display);
- g_free (display);
-
- display = egg_dn_read_part (egg_asn1x_node (asn, "tbsCertificate", "issuer", "rdnSequence", NULL), "CN");
- _gcr_display_view_append_content (view, renderer, _("Verified by"), display);
- g_free (display);
-
- if (egg_asn1x_get_time_as_date (egg_asn1x_node (asn, "tbsCertificate", "validity", "notAfter", NULL), &date)) {
- display = g_malloc0 (128);
- if (!g_date_strftime (display, 128, "%x", &date))
- g_return_if_reached ();
- _gcr_display_view_append_content (view, renderer, _("Expires"), display);
- g_free (display);
- }
-
- _gcr_display_view_start_details (view, renderer);
-
- /* The subject */
- _gcr_display_view_append_heading (view, renderer, _("Subject Name"));
- _gcr_certificate_renderer_append_distinguished_name (renderer, view,
- egg_asn1x_node (asn, "tbsCertificate", "subject", "rdnSequence", NULL));
-
- /* The Issuer */
- _gcr_display_view_append_heading (view, renderer, _("Issuer Name"));
- _gcr_certificate_renderer_append_distinguished_name (renderer, view,
- egg_asn1x_node (asn, "tbsCertificate", "issuer", "rdnSequence", NULL));
-
- /* The Issued Parameters */
- _gcr_display_view_append_heading (view, renderer, _("Issued Certificate"));
-
- if (!egg_asn1x_get_integer_as_ulong (egg_asn1x_node (asn, "tbsCertificate", "version", NULL), &version))
- g_return_if_reached ();
- display = g_strdup_printf ("%lu", version + 1);
- _gcr_display_view_append_value (view, renderer, _("Version"), display, FALSE);
- g_free (display);
-
- number = egg_asn1x_get_integer_as_raw (egg_asn1x_node (asn, "tbsCertificate", "serialNumber", NULL));
- g_return_if_fail (number != NULL);
- _gcr_display_view_append_hex (view, renderer, _("Serial Number"),
- g_bytes_get_data (number, NULL),
- g_bytes_get_size (number));
- g_bytes_unref (number);
-
- display = g_malloc0 (128);
- if (egg_asn1x_get_time_as_date (egg_asn1x_node (asn, "tbsCertificate", "validity", "notBefore", NULL), &date)) {
- if (!g_date_strftime (display, 128, "%Y-%m-%d", &date))
- g_return_if_reached ();
- _gcr_display_view_append_value (view, renderer, _("Not Valid Before"), display, FALSE);
- }
- if (egg_asn1x_get_time_as_date (egg_asn1x_node (asn, "tbsCertificate", "validity", "notAfter", NULL), &date)) {
- if (!g_date_strftime (display, 128, "%Y-%m-%d", &date))
- g_return_if_reached ();
- _gcr_display_view_append_value (view, renderer, _("Not Valid After"), display, FALSE);
- }
- g_free (display);
-
- /* Fingerprints */
- _gcr_display_view_append_heading (view, renderer, _("Certificate Fingerprints"));
-
- _gcr_display_view_append_fingerprint (view, renderer, data, n_data, "SHA1", G_CHECKSUM_SHA1);
- _gcr_display_view_append_fingerprint (view, renderer, data, n_data, "MD5", G_CHECKSUM_MD5);
-
- /* Public Key Info */
- _gcr_display_view_append_heading (view, renderer, _("Public Key Info"));
- bits = gcr_certificate_get_key_size (cert);
- _gcr_certificate_renderer_append_subject_public_key (renderer, view, bits,
- egg_asn1x_node (asn, "tbsCertificate",
- "subjectPublicKeyInfo", NULL));
-
- /* Extensions */
- for (index = 1; TRUE; ++index) {
- extension = egg_asn1x_node (asn, "tbsCertificate", "extensions", index, NULL);
- if (extension == NULL)
- break;
- _gcr_certificate_renderer_append_extension (renderer, view, extension);
- }
-
- /* Signature */
- _gcr_display_view_append_heading (view, renderer, _("Signature"));
- _gcr_certificate_renderer_append_signature (renderer, view, asn);
-
- egg_asn1x_destroy (asn);
- _gcr_display_view_end (view, renderer);
-}
-
-static void
-gcr_certificate_renderer_populate_popup (GcrRenderer *self, GcrViewer *viewer,
- GtkMenu *menu)
-{
- GtkWidget *item;
-
- item = gtk_separator_menu_item_new ();
- gtk_widget_show (item);
- gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), item);
-
- item = gtk_menu_item_new_with_label (_("Export Certificate\xE2\x80\xA6"));
- gtk_widget_show (item);
- g_signal_connect_data (item, "activate", G_CALLBACK (on_certificate_export),
- g_object_ref (self), (GClosureNotify)g_object_unref, 0);
- gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), item);
-}
-
-static void
-gcr_renderer_iface_init (GcrRendererIface *iface)
-{
- iface->populate_popup = gcr_certificate_renderer_populate_popup;
- iface->render_view = gcr_certificate_renderer_render;
-}
-
-static const guchar *
-gcr_certificate_renderer_get_der_data (GcrCertificate *cert,
- gsize *n_data)
-{
- GcrCertificateRenderer *self = GCR_CERTIFICATE_RENDERER (cert);
- const GckAttribute *attr;
-
- g_assert (n_data);
-
- if (self->pv->opt_cert)
- return gcr_certificate_get_der_data (self->pv->opt_cert, n_data);
-
- if (self->pv->opt_attrs) {
- attr = gck_attributes_find (self->pv->opt_attrs, CKA_VALUE);
- g_return_val_if_fail (attr, NULL);
- *n_data = attr->length;
- return attr->value;
- }
-
- return NULL;
-}
-
-static void
-gcr_renderer_certificate_iface_init (GcrCertificateIface *iface)
-{
- iface->get_der_data = gcr_certificate_renderer_get_der_data;
-}
-
-/* -----------------------------------------------------------------------------
- * PUBLIC
- */
-
-/**
- * gcr_certificate_renderer_new:
- * @certificate: The certificate to display
- *
- * Create a new certificate renderer to display the certificate.
- *
- * Returns: (transfer full): a newly allocated #GcrCertificateRenderer, which
- * should be released with g_object_unref()
- */
-GcrCertificateRenderer *
-gcr_certificate_renderer_new (GcrCertificate *certificate)
-{
- return g_object_new (GCR_TYPE_CERTIFICATE_RENDERER, "certificate", certificate, NULL);
-}
-
-/**
- * gcr_certificate_renderer_new_for_attributes:
- * @label: (nullable): the label to display
- * @attrs: The attributes to display
- *
- * Create a new certificate renderer to display the label and attributes. One
- * of the attributes should be a CKA_VALUE type attribute containing a DER
- * encoded certificate.
- *
- * Returns: (transfer full): a newly allocated #GcrCertificateRenderer, which
- * should be released with g_object_unref()
- */
-GcrCertificateRenderer *
-gcr_certificate_renderer_new_for_attributes (const gchar *label, struct _GckAttributes *attrs)
-{
- return g_object_new (GCR_TYPE_CERTIFICATE_RENDERER, "label", label, "attributes", attrs, NULL);
-}
-
-/**
- * gcr_certificate_renderer_get_certificate:
- * @self: The renderer
- *
- * Get the certificate displayed in the renderer. If no certificate was
- * explicitly set, then the renderer will return itself since it acts as
- * a valid certificate.
- *
- * Returns: (transfer none): The certificate, owned by the renderer.
- */
-GcrCertificate *
-gcr_certificate_renderer_get_certificate (GcrCertificateRenderer *self)
-{
- g_return_val_if_fail (GCR_IS_CERTIFICATE_RENDERER (self), NULL);
- if (self->pv->opt_cert)
- return self->pv->opt_cert;
- return GCR_CERTIFICATE (self);
-}
-
-/**
- * gcr_certificate_renderer_set_certificate:
- * @self: The renderer
- * @certificate: (nullable): the certificate to display
- *
- * Set a certificate to display in the renderer.
- */
-void
-gcr_certificate_renderer_set_certificate (GcrCertificateRenderer *self, GcrCertificate *certificate)
-{
- g_return_if_fail (GCR_IS_CERTIFICATE_RENDERER (self));
-
- if (self->pv->opt_cert)
- g_object_unref (self->pv->opt_cert);
- self->pv->opt_cert = certificate;
- if (self->pv->opt_cert)
- g_object_ref (self->pv->opt_cert);
-
- if (self->pv->opt_attrs) {
- gck_attributes_unref (self->pv->opt_attrs);
- self->pv->opt_attrs = NULL;
- }
-
- gcr_renderer_emit_data_changed (GCR_RENDERER (self));
- g_object_notify (G_OBJECT (self), "certificate");
-}
-
-typedef struct {
- GcrRenderer *renderer;
- GcrDisplayView *view;
-} AppendDnClosure;
-
-static void
-on_parsed_dn_part (guint index,
- GQuark oid,
- GNode *value,
- gpointer user_data)
-{
- GcrRenderer *renderer = ((AppendDnClosure *)user_data)->renderer;
- GcrDisplayView *view = ((AppendDnClosure *)user_data)->view;
- const gchar *attr;
- const gchar *desc;
- gchar *field = NULL;
- gchar *display;
-
- attr = egg_oid_get_name (oid);
- desc = egg_oid_get_description (oid);
-
- /* Combine them into something sane */
- if (attr && desc) {
- if (strcmp (attr, desc) == 0)
- field = g_strdup (attr);
- else
- field = g_strdup_printf ("%s (%s)", attr, desc);
- } else if (!attr && !desc) {
- field = g_strdup ("");
- } else if (attr) {
- field = g_strdup (attr);
- } else if (desc) {
- field = g_strdup (desc);
- } else {
- g_assert_not_reached ();
- }
-
- display = egg_dn_print_value (oid, value);
- if (display == NULL)
- display = g_strdup ("");
-
- _gcr_display_view_append_value (view, renderer, field, display, FALSE);
- g_free (field);
- g_free (display);
-}
-
-
-void
-_gcr_certificate_renderer_append_distinguished_name (GcrRenderer *renderer,
- GcrDisplayView *view,
- GNode *dn)
-{
- AppendDnClosure closure;
-
- g_return_if_fail (GCR_IS_RENDERER (renderer));
- g_return_if_fail (GCR_IS_DISPLAY_VIEW (view));
- g_return_if_fail (dn != NULL);
-
- closure.renderer = renderer;
- closure.view = view;
- egg_dn_parse (dn, on_parsed_dn_part, &closure);
-}
-
-void
-_gcr_certificate_renderer_append_subject_public_key (GcrRenderer *renderer,
- GcrDisplayView *view,
- guint key_nbits,
- GNode *subject_public_key)
-{
- const gchar *text;
- gchar *display;
- GBytes *value;
- guchar *raw;
- gsize n_raw;
- GQuark oid;
- guint bits;
-
- oid = egg_asn1x_get_oid_as_quark (egg_asn1x_node (subject_public_key,
- "algorithm", "algorithm", NULL));
- text = egg_oid_get_description (oid);
- _gcr_display_view_append_value (view, renderer, _("Key Algorithm"), text, FALSE);
-
- value = egg_asn1x_get_element_raw (egg_asn1x_node (subject_public_key,
- "algorithm", "parameters", NULL));
- if (value) {
- _gcr_display_view_append_hex (view, renderer, _("Key Parameters"),
- g_bytes_get_data (value, NULL),
- g_bytes_get_size (value));
- g_bytes_unref (value);
- }
-
- if (key_nbits > 0) {
- display = g_strdup_printf ("%u", key_nbits);
- _gcr_display_view_append_value (view, renderer, _("Key Size"), display, FALSE);
- g_free (display);
- }
-
- value = egg_asn1x_get_element_raw (subject_public_key);
- raw = gcr_fingerprint_from_subject_public_key_info (g_bytes_get_data (value, NULL),
- g_bytes_get_size (value),
- G_CHECKSUM_SHA1, &n_raw);
- _gcr_display_view_append_hex (view, renderer, _("Key SHA1 Fingerprint"), raw, n_raw);
- g_bytes_unref (value);
- g_free (raw);
-
- value = egg_asn1x_get_bits_as_raw (egg_asn1x_node (subject_public_key, "subjectPublicKey", NULL), &bits);
- _gcr_display_view_append_hex (view, renderer, _("Public Key"),
- g_bytes_get_data (value, NULL), bits / 8);
- g_bytes_unref (value);
-}
-
-void
-_gcr_certificate_renderer_append_signature (GcrRenderer *renderer,
- GcrDisplayView *view,
- GNode *asn)
-{
- const gchar *text;
- GBytes *value;
- GQuark oid;
- guint bits;
-
- oid = egg_asn1x_get_oid_as_quark (egg_asn1x_node (asn, "signatureAlgorithm", "algorithm", NULL));
- text = egg_oid_get_description (oid);
- _gcr_display_view_append_value (view, renderer, _("Signature Algorithm"), text, FALSE);
-
- value = egg_asn1x_get_element_raw (egg_asn1x_node (asn, "signatureAlgorithm", "parameters", NULL));
- if (value) {
- _gcr_display_view_append_hex (view, renderer, _("Signature Parameters"),
- g_bytes_get_data (value, NULL),
- g_bytes_get_size (value));
- g_bytes_unref (value);
- }
-
- value = egg_asn1x_get_bits_as_raw (egg_asn1x_node (asn, "signature", NULL), &bits);
- _gcr_display_view_append_hex (view, renderer, _("Signature"),
- g_bytes_get_data (value, NULL), bits / 8);
- g_bytes_unref (value);
-}
-
-void
-_gcr_certificate_renderer_append_extension (GcrRenderer *renderer,
- GcrDisplayView *view,
- GNode *node)
-{
- GQuark oid;
- GBytes *value;
- gboolean critical;
- gboolean ret = FALSE;
-
- /* Dig out the OID */
- oid = egg_asn1x_get_oid_as_quark (egg_asn1x_node (node, "extnID", NULL));
- g_return_if_fail (oid);
-
- /* Extension value */
- value = egg_asn1x_get_string_as_bytes (egg_asn1x_node (node, "extnValue", NULL));
-
- /* The custom parsers */
- if (oid == GCR_OID_BASIC_CONSTRAINTS)
- ret = append_extension_basic_constraints (renderer, view, value);
- else if (oid == GCR_OID_EXTENDED_KEY_USAGE)
- ret = append_extension_extended_key_usage (renderer, view, value);
- else if (oid == GCR_OID_SUBJECT_KEY_IDENTIFIER)
- ret = append_extension_subject_key_identifier (renderer, view, value);
- else if (oid == GCR_OID_KEY_USAGE)
- ret = append_extension_key_usage (renderer, view, value);
- else if (oid == GCR_OID_SUBJECT_ALT_NAME)
- ret = append_extension_subject_alt_name (renderer, view, value);
-
- /* Otherwise the default raw display */
- if (ret == FALSE)
- ret = append_extension_hex (renderer, view, oid,
- g_bytes_get_data (value, NULL),
- g_bytes_get_size (value));
-
- /* Critical */
- if (ret == TRUE && egg_asn1x_get_boolean (egg_asn1x_node (node, "critical", NULL), &critical)) {
- _gcr_display_view_append_value (view, renderer, _("Critical"),
- critical ? _("Yes") : _("No"), FALSE);
- }
-}
diff --git a/gcr-gtk3/gcr-certificate-renderer.h b/gcr-gtk3/gcr-certificate-renderer.h
deleted file mode 100644
index c5a6c92..0000000
--- a/gcr-gtk3/gcr-certificate-renderer.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (C) 2010 Stefan Walter
- *
- * 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/>.
- */
-
-#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly."
-#endif
-
-#ifndef __GCR_CERTIFICATE_RENDERER_H__
-#define __GCR_CERTIFICATE_RENDERER_H__
-
-#include <glib-object.h>
-#include <gtk/gtk.h>
-
-#include "gcr/gcr-certificate.h"
-#include "gcr/gcr-types.h"
-
-#include "gcr-renderer.h"
-
-G_BEGIN_DECLS
-
-#define GCR_TYPE_CERTIFICATE_RENDERER (gcr_certificate_renderer_get_type ())
-#define GCR_CERTIFICATE_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_CERTIFICATE_RENDERER, GcrCertificateRenderer))
-#define GCR_CERTIFICATE_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_CERTIFICATE_RENDERER, GcrCertificateRendererClass))
-#define GCR_IS_CERTIFICATE_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_CERTIFICATE_RENDERER))
-#define GCR_IS_CERTIFICATE_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_CERTIFICATE_RENDERER))
-#define GCR_CERTIFICATE_RENDERER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_CERTIFICATE_RENDERER, GcrCertificateRendererClass))
-
-typedef struct _GcrCertificateRenderer GcrCertificateRenderer;
-typedef struct _GcrCertificateRendererClass GcrCertificateRendererClass;
-typedef struct _GcrCertificateRendererPrivate GcrCertificateRendererPrivate;
-
-struct _GcrCertificateRenderer {
- GObject parent;
-
- /*< private >*/
- GcrCertificateRendererPrivate *pv;
-};
-
-struct _GcrCertificateRendererClass {
- GObjectClass parent_class;
-};
-
-GType gcr_certificate_renderer_get_type (void);
-
-GcrCertificateRenderer* gcr_certificate_renderer_new (GcrCertificate *certificate);
-
-GcrCertificateRenderer* gcr_certificate_renderer_new_for_attributes (const gchar *label,
- struct _GckAttributes *attrs);
-
-GcrCertificate* gcr_certificate_renderer_get_certificate (GcrCertificateRenderer *self);
-
-void gcr_certificate_renderer_set_certificate (GcrCertificateRenderer *self,
- GcrCertificate *certificate);
-
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrCertificateRenderer, g_object_unref)
-
-G_END_DECLS
-
-#endif /* __GCR_CERTIFICATE_RENDERER_H__ */
diff --git a/gcr-gtk3/gcr-certificate-request-renderer.c b/gcr-gtk3/gcr-certificate-request-renderer.c
deleted file mode 100644
index f239a9b..0000000
--- a/gcr-gtk3/gcr-certificate-request-renderer.c
+++ /dev/null
@@ -1,531 +0,0 @@
-/*
- * Copyright (C) 2010 Stefan Walter
- *
- * 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 "config.h"
-
-#include "gcr/gcr-oids.h"
-#include "gcr/gcr-subject-public-key.h"
-
-#include "gcr-certificate-renderer-private.h"
-#include "gcr-certificate-request-renderer.h"
-#include "gcr-display-view.h"
-
-#include "egg/egg-asn1x.h"
-#include "egg/egg-asn1-defs.h"
-#include "egg/egg-dn.h"
-#include "egg/egg-oid.h"
-
-#include "gck/gck.h"
-
-#include <glib/gi18n-lib.h>
-
-/**
- * GcrCertificateRequestRenderer:
- *
- * An implementation of #GcrRenderer which renders certificate requests
- */
-
-/**
- * GcrCertificateRequestRendererClass:
- * @parent_class: The parent class
- *
- * The class for #GcrCertificateRequestRenderer
- */
-
-enum {
- PROP_0,
- PROP_LABEL,
- PROP_ATTRIBUTES
-};
-
-struct _GcrCertificateRequestRendererPrivate {
- GckAttributes *attrs;
- gchar *label;
-
- guint key_size;
- gulong type;
- GNode *asn;
-};
-
-static void _gcr_certificate_request_renderer_iface (GcrRendererIface *iface);
-
-G_DEFINE_TYPE_WITH_CODE (GcrCertificateRequestRenderer, _gcr_certificate_request_renderer, G_TYPE_OBJECT,
- G_ADD_PRIVATE (GcrCertificateRequestRenderer);
- G_IMPLEMENT_INTERFACE (GCR_TYPE_RENDERER, _gcr_certificate_request_renderer_iface);
-);
-
-static gchar*
-calculate_label (GcrCertificateRequestRenderer *self)
-{
- gchar *label = NULL;
-
- if (self->pv->label)
- return g_strdup (self->pv->label);
-
- if (self->pv->attrs) {
- if (gck_attributes_find_string (self->pv->attrs, CKA_LABEL, &label))
- return label;
- }
-
- if (self->pv->asn && self->pv->type == CKQ_GCR_PKCS10) {
- label = egg_dn_read_part (egg_asn1x_node (self->pv->asn,
- "certificationRequestInfo",
- "subject",
- "rdnSequence",
- NULL), "CN");
- }
-
- if (label != NULL)
- return label;
-
- return g_strdup (_("Certificate request"));
-}
-
-static void
-_gcr_certificate_request_renderer_init (GcrCertificateRequestRenderer *self)
-{
- self->pv = _gcr_certificate_request_renderer_get_instance_private (self);
-}
-
-static void
-_gcr_certificate_request_renderer_finalize (GObject *obj)
-{
- GcrCertificateRequestRenderer *self = GCR_CERTIFICATE_REQUEST_RENDERER (obj);
-
- if (self->pv->attrs)
- gck_attributes_unref (self->pv->attrs);
- self->pv->attrs = NULL;
-
- g_free (self->pv->label);
- self->pv->label = NULL;
-
- egg_asn1x_destroy (self->pv->asn);
-
- G_OBJECT_CLASS (_gcr_certificate_request_renderer_parent_class)->finalize (obj);
-}
-
-static void
-_gcr_certificate_request_renderer_set_property (GObject *obj,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- GcrCertificateRequestRenderer *self = GCR_CERTIFICATE_REQUEST_RENDERER (obj);
-
- switch (prop_id) {
- case PROP_LABEL:
- g_free (self->pv->label);
- self->pv->label = g_value_dup_string (value);
- g_object_notify (obj, "label");
- gcr_renderer_emit_data_changed (GCR_RENDERER (self));
- break;
- case PROP_ATTRIBUTES:
- _gcr_certificate_request_renderer_set_attributes (self, g_value_get_boxed (value));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-_gcr_certificate_request_renderer_get_property (GObject *obj,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- GcrCertificateRequestRenderer *self = GCR_CERTIFICATE_REQUEST_RENDERER (obj);
-
- switch (prop_id) {
- case PROP_LABEL:
- g_value_take_string (value, calculate_label (self));
- break;
- case PROP_ATTRIBUTES:
- g_value_set_boxed (value, self->pv->attrs);
- break;
- default:
- gcr_certificate_mixin_get_property (obj, prop_id, value, pspec);
- break;
- }
-}
-
-static void
-_gcr_certificate_request_renderer_class_init (GcrCertificateRequestRendererClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
- GckBuilder builder = GCK_BUILDER_INIT;
-
- gobject_class->finalize = _gcr_certificate_request_renderer_finalize;
- gobject_class->set_property = _gcr_certificate_request_renderer_set_property;
- gobject_class->get_property = _gcr_certificate_request_renderer_get_property;
-
- /**
- * GcrCertificateRequestRenderer:attributes:
- *
- * The certificate attributes to display. One of the attributes must be
- * a CKA_VALUE type attribute which contains a DER encoded certificate.
- */
- g_object_class_install_property (gobject_class, PROP_ATTRIBUTES,
- g_param_spec_boxed ("attributes", "Attributes", "Certificate pkcs11 attributes",
- GCK_TYPE_ATTRIBUTES,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
- /**
- * GcrCertificateRequestRenderer:label:
- *
- * The label to display.
- */
- g_object_class_install_property (gobject_class, PROP_LABEL,
- g_param_spec_string ("label", "Label", "Certificate Label",
- "",
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
- /* Register this as a renderer which can be loaded */
- gck_builder_add_ulong (&builder, CKA_CLASS, CKO_GCR_CERTIFICATE_REQUEST);
- gck_builder_add_ulong (&builder, CKA_GCR_CERTIFICATE_REQUEST_TYPE, CKQ_GCR_PKCS10);
- gcr_renderer_register (GCR_TYPE_CERTIFICATE_REQUEST_RENDERER, gck_builder_end (&builder));
-
- gck_builder_add_ulong (&builder, CKA_CLASS, CKO_GCR_CERTIFICATE_REQUEST);
- gck_builder_add_ulong (&builder, CKA_GCR_CERTIFICATE_REQUEST_TYPE, CKQ_GCR_SPKAC);
- gcr_renderer_register (GCR_TYPE_CERTIFICATE_REQUEST_RENDERER, gck_builder_end (&builder));
-}
-
-static gboolean
-append_extension_request (GcrRenderer *renderer,
- GcrDisplayView *view,
- GNode *attribute)
-{
- GBytes *value;
- GNode *node;
- GNode *asn;
- guint i;
-
- node = egg_asn1x_node (attribute, "values", 1, NULL);
- if (node == NULL)
- return FALSE;
-
- value = egg_asn1x_get_element_raw (node);
- asn = egg_asn1x_create_and_decode (pkix_asn1_tab, "ExtensionRequest", value);
- if (asn == NULL)
- return FALSE;
-
- for (i = 1; TRUE; i++) {
- node = egg_asn1x_node (asn, i, NULL);
- if (node == NULL)
- break;
- _gcr_certificate_renderer_append_extension (renderer, view, node);
- }
-
- egg_asn1x_destroy (asn);
- return TRUE;
-}
-
-static void
-append_attribute (GcrRenderer *renderer,
- GcrDisplayView *view,
- GNode *attribute)
-{
- GQuark oid;
- GBytes *value;
- const gchar *text;
- GNode *node;
- gboolean ret = FALSE;
- gint i;
-
- /* Dig out the OID */
- oid = egg_asn1x_get_oid_as_quark (egg_asn1x_node (attribute, "type", NULL));
- g_return_if_fail (oid);
-
- if (oid == GCR_OID_PKCS9_ATTRIBUTE_EXTENSION_REQ)
- ret = append_extension_request (renderer, view, attribute);
-
- if (!ret) {
- _gcr_display_view_append_heading (view, renderer, _("Attribute"));
-
- /* Extension type */
- text = egg_oid_get_description (oid);
- _gcr_display_view_append_value (view, renderer, _("Type"), text, FALSE);
-
- for (i = 1; TRUE; i++) {
- node = egg_asn1x_node (attribute, "values", i, NULL);
- if (node == NULL)
- break;
- value = egg_asn1x_get_element_raw (node);
- _gcr_display_view_append_hex (view, renderer, _("Value"),
- g_bytes_get_data (value, NULL),
- g_bytes_get_size (value));
- g_bytes_unref (value);
- }
- }
-}
-
-static guint
-ensure_key_size (GcrCertificateRequestRenderer *self,
- GNode *public_key)
-{
- if (self->pv->key_size)
- return self->pv->key_size;
-
- self->pv->key_size = _gcr_subject_public_key_calculate_size (public_key);
- return self->pv->key_size;
-}
-
-static void
-render_pkcs10_certificate_req (GcrCertificateRequestRenderer *self,
- GcrDisplayView *view)
-{
- GcrRenderer *renderer = GCR_RENDERER (self);
- GNode *public_key;
- GNode *attribute;
- GNode *subject;
- gchar *display;
- gulong version;
- guint bits;
- guint i;
-
- display = calculate_label (self);
- _gcr_display_view_append_title (view, renderer, display);
- g_free (display);
-
- _gcr_display_view_append_content (view, renderer, _("Certificate request"), NULL);
-
- subject = egg_asn1x_node (self->pv->asn, "certificationRequestInfo",
- "subject", "rdnSequence", NULL);
- display = egg_dn_read_part (subject, "CN");
- _gcr_display_view_append_content (view, renderer, _("Identity"), display);
- g_free (display);
-
- _gcr_display_view_start_details (view, renderer);
-
- /* The subject */
- _gcr_display_view_append_heading (view, renderer, _("Subject Name"));
- _gcr_certificate_renderer_append_distinguished_name (renderer, view, subject);
-
- /* The certificate request type */
- _gcr_display_view_append_heading (view, renderer, _("Certificate request"));
- _gcr_display_view_append_value (view, renderer, _("Type"), "PKCS#10", FALSE);
- if (!egg_asn1x_get_integer_as_ulong (egg_asn1x_node (self->pv->asn,
- "certificationRequestInfo",
- "version", NULL), &version))
- g_return_if_reached ();
- display = g_strdup_printf ("%lu", version + 1);
- _gcr_display_view_append_value (view, renderer, _("Version"), display, FALSE);
- g_free (display);
-
- _gcr_display_view_append_heading (view, renderer, _("Public Key Info"));
- public_key = egg_asn1x_node (self->pv->asn, "certificationRequestInfo", "subjectPKInfo", NULL);
- bits = ensure_key_size (self, public_key);
- _gcr_certificate_renderer_append_subject_public_key (renderer, view,
- bits, public_key);
-
- /* Attributes */
- for (i = 1; TRUE; ++i) {
- /* Make sure it is present */
- attribute = egg_asn1x_node (self->pv->asn, "certificationRequestInfo", "attributes", i, NULL);
- if (attribute == NULL)
- break;
- append_attribute (renderer, view, attribute);
- }
-
- /* Signature */
- _gcr_display_view_append_heading (view, renderer, _("Signature"));
- _gcr_certificate_renderer_append_signature (renderer, view, self->pv->asn);
-}
-
-static void
-render_spkac_certificate_req (GcrCertificateRequestRenderer *self,
- GcrDisplayView *view)
-{
- GcrRenderer *renderer = GCR_RENDERER (self);
- GNode *public_key;
- gchar *display;
- guint bits;
-
- display = calculate_label (self);
- _gcr_display_view_append_title (view, renderer, display);
- g_free (display);
-
- _gcr_display_view_append_content (view, renderer, _("Certificate request"), NULL);
-
- _gcr_display_view_start_details (view, renderer);
-
- /* The certificate request type */
- _gcr_display_view_append_heading (view, renderer, _("Certificate request"));
- _gcr_display_view_append_value (view, renderer, _("Type"), "SPKAC", FALSE);
-
- display = egg_asn1x_get_string_as_utf8 (egg_asn1x_node (self->pv->asn, "publicKeyAndChallenge",
- "challenge", NULL), NULL);
- _gcr_display_view_append_value (view, renderer, _("Challenge"), display, FALSE);
- g_free (display);
-
- _gcr_display_view_append_heading (view, renderer, _("Public Key Info"));
- public_key = egg_asn1x_node (self->pv->asn, "publicKeyAndChallenge", "spki", NULL);
- bits = ensure_key_size (self, public_key);
- _gcr_certificate_renderer_append_subject_public_key (renderer, view,
- bits, public_key);
-
- /* Signature */
- _gcr_display_view_append_heading (view, renderer, _("Signature"));
- _gcr_certificate_renderer_append_signature (renderer, view, self->pv->asn);
-}
-
-static void
-gcr_certificate_request_renderer_render (GcrRenderer *renderer,
- GcrViewer *viewer)
-{
- GcrCertificateRequestRenderer *self;
- GcrDisplayView *view;
- GIcon *icon;
-
- self = GCR_CERTIFICATE_REQUEST_RENDERER (renderer);
-
- if (GCR_IS_DISPLAY_VIEW (viewer)) {
- view = GCR_DISPLAY_VIEW (viewer);
-
- } else {
- g_warning ("GcrCertificateRequestRenderer only works with internal specific "
- "GcrViewer returned by gcr_viewer_new().");
- return;
- }
-
- _gcr_display_view_begin (view, renderer);
-
- icon = g_themed_icon_new ("dialog-question");
- _gcr_display_view_set_icon (view, GCR_RENDERER (self), icon);
- g_object_unref (icon);
-
- switch (self->pv->type) {
- case CKQ_GCR_PKCS10:
- render_pkcs10_certificate_req (self, view);
- break;
- case CKQ_GCR_SPKAC:
- render_spkac_certificate_req (self, view);
- break;
- default:
- g_warning ("unknown request type in GcrCertificateRequestRenderer");
- break;
- }
-
- _gcr_display_view_end (view, renderer);
-}
-
-static void
-_gcr_certificate_request_renderer_iface (GcrRendererIface *iface)
-{
- iface->render_view = gcr_certificate_request_renderer_render;
-}
-
-/**
- * gcr_certificate_request_renderer_new_for_attributes:
- * @label: (nullable): the label to display
- * @attrs: the attributes to display
- *
- * Create a new certificate request renderer to display the label and attributes.
- * One of the attributes should be a CKA_VALUE type attribute containing a DER
- * encoded PKCS#10 certificate request or an SPKAC request.
- *
- * Returns: (transfer full): a newly allocated #GcrCertificateRequestRenderer, which
- * should be released with g_object_unref()
- */
-GcrRenderer *
-_gcr_certificate_request_renderer_new_for_attributes (const gchar *label,
- GckAttributes *attrs)
-{
- return g_object_new (GCR_TYPE_CERTIFICATE_REQUEST_RENDERER,
- "label", label,
- "attributes", attrs,
- NULL);
-}
-
-/**
- * gcr_certificate_request_renderer_get_attributes:
- * @self: the renderer
- *
- * Get the PKCS#11 attributes, if any, set for this renderer to display.
- *
- * Returns: (nullable) (transfer none): the attributes, owned by the renderer
- */
-GckAttributes *
-_gcr_certificate_request_renderer_get_attributes (GcrCertificateRequestRenderer *self)
-{
- g_return_val_if_fail (GCR_IS_CERTIFICATE_REQUEST_RENDERER (self), NULL);
- return self->pv->attrs;
-}
-
-/**
- * gcr_certificate_request_renderer_set_attributes:
- * @self: the renderer
- * @attrs: (nullable): attributes to set
- *
- * Set the PKCS#11 attributes for this renderer to display. One of the attributes
- * should be a `CKA_VALUE` type attribute containing a DER encoded PKCS#10
- * certificate request or an SPKAC request.
- */
-void
-_gcr_certificate_request_renderer_set_attributes (GcrCertificateRequestRenderer *self,
- GckAttributes *attrs)
-{
- const GckAttribute *value;
- GNode *asn = NULL;
- gulong type = 0;
- GBytes *bytes;
-
- g_return_if_fail (GCR_IS_CERTIFICATE_REQUEST_RENDERER (self));
-
- if (attrs) {
- value = gck_attributes_find (attrs, CKA_VALUE);
- if (value == NULL) {
- g_warning ("no CKA_VALUE found in attributes passed to "
- "GcrCertificateRequestRenderer attributes property");
- return;
- }
-
- bytes = g_bytes_new_with_free_func (value->value, value->length,
- gck_attributes_unref, gck_attributes_ref (attrs));
-
- asn = egg_asn1x_create_and_decode (pkix_asn1_tab, "pkcs-10-CertificationRequest", bytes);
- if (asn != NULL) {
- type = CKQ_GCR_PKCS10;
- } else {
- asn = egg_asn1x_create_and_decode (pkix_asn1_tab, "SignedPublicKeyAndChallenge", bytes);
- if (asn != NULL) {
- type = CKQ_GCR_SPKAC;
- } else {
- g_warning ("the data contained in the CKA_VALUE attribute passed to "
- "GcrCertificateRequestRenderer was not valid DER encoded PKCS#10 "
- "or SPKAC");
- }
- }
-
- g_bytes_unref (bytes);
-
- if (type == 0)
- return;
-
- gck_attributes_ref (attrs);
- }
-
- if (self->pv->attrs)
- gck_attributes_unref (self->pv->attrs);
- self->pv->attrs = attrs;
- self->pv->asn = asn;
- self->pv->type = type;
- self->pv->key_size = 0; /* calculated later */
-
- gcr_renderer_emit_data_changed (GCR_RENDERER (self));
- g_object_notify (G_OBJECT (self), "attributes");
-}
diff --git a/gcr-gtk3/gcr-certificate-request-renderer.h b/gcr-gtk3/gcr-certificate-request-renderer.h
deleted file mode 100644
index d43d8fe..0000000
--- a/gcr-gtk3/gcr-certificate-request-renderer.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2010 Stefan Walter
- *
- * 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/>.
- */
-
-#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly."
-#endif
-
-#ifndef __GCR_CERTIFICATE_REQUEST_RENDERER_H__
-#define __GCR_CERTIFICATE_REQUEST_RENDERER_H__
-
-#include <glib-object.h>
-#include <gtk/gtk.h>
-
-#include "gcr/gcr-certificate.h"
-#include "gcr/gcr-types.h"
-
-#include "gcr-renderer.h"
-
-G_BEGIN_DECLS
-
-#define GCR_TYPE_CERTIFICATE_REQUEST_RENDERER (_gcr_certificate_request_renderer_get_type ())
-#define GCR_CERTIFICATE_REQUEST_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_CERTIFICATE_REQUEST_RENDERER, GcrCertificateRequestRenderer))
-#define GCR_CERTIFICATE_REQUEST_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_CERTIFICATE_REQUEST_RENDERER, GcrCertificateRequestRendererClass))
-#define GCR_IS_CERTIFICATE_REQUEST_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_CERTIFICATE_REQUEST_RENDERER))
-#define GCR_IS_CERTIFICATE_REQUEST_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_CERTIFICATE_REQUEST_RENDERER))
-#define GCR_CERTIFICATE_REQUEST_RENDERER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_CERTIFICATE_REQUEST_RENDERER, GcrCertificateRequestRendererClass))
-
-typedef struct _GcrCertificateRequestRenderer GcrCertificateRequestRenderer;
-typedef struct _GcrCertificateRequestRendererClass GcrCertificateRequestRendererClass;
-typedef struct _GcrCertificateRequestRendererPrivate GcrCertificateRequestRendererPrivate;
-
-struct _GcrCertificateRequestRenderer {
- GObject parent;
-
- /*< private >*/
- GcrCertificateRequestRendererPrivate *pv;
-};
-
-struct _GcrCertificateRequestRendererClass {
- GObjectClass parent_class;
-};
-
-GType _gcr_certificate_request_renderer_get_type (void);
-
-GcrRenderer * _gcr_certificate_request_renderer_new_for_attributes (const gchar *label,
- struct _GckAttributes *attrs);
-
-GckAttributes * _gcr_certificate_request_renderer_get_attributes (GcrCertificateRequestRenderer *self);
-
-void _gcr_certificate_request_renderer_set_attributes (GcrCertificateRequestRenderer *self,
- GckAttributes *attrs);
-
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrCertificateRequestRenderer, g_object_unref)
-
-G_END_DECLS
-
-#endif /* __GCR_CERTIFICATE_REQUEST_RENDERER_H__ */
diff --git a/gcr-gtk3/gcr-certificate-widget.c b/gcr-gtk3/gcr-certificate-widget.c
index bfc6b36..e5fefdc 100644
--- a/gcr-gtk3/gcr-certificate-widget.c
+++ b/gcr-gtk3/gcr-certificate-widget.c
@@ -1,172 +1,500 @@
/*
- * Copyright (C) 2010 Stefan Walter
- *
- * 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/>.
+ * Copyright 2021 Collabora Ltd.
+ * Copyright Corentin Noël <corentin.noel@collabora.com>
+ * SPDX-License-Identifier: LGPL-2.1-or-later
*/
#include "config.h"
-#include "gcr/gcr-certificate.h"
+#include <glib/gi18n-lib.h>
-#include "gcr-certificate-renderer.h"
-#include "gcr-certificate-widget.h"
-#include "gcr-renderer.h"
-#include "gcr-viewer.h"
+#include <gcr-gtk3/gcr-certificate-widget.h>
+#include "gcr/gcr-certificate-extensions.h"
+#include "gcr/gcr-fingerprint.h"
+#include "gcr/gcr-oids.h"
-#include "gck/gck.h"
+#include "gcr-section.h"
-#include <gdk/gdk.h>
-#include <glib/gi18n-lib.h>
+#include "egg/egg-asn1x.h"
+#include "egg/egg-asn1-defs.h"
+#include "egg/egg-dn.h"
+#include "egg/egg-oid.h"
+#include "egg/egg-hex.h"
-/**
- * GcrCertificateWidget:
- *
- * A widget that can be used to display a certificate.
- *
- * A certificate widget is normally in a collapsed state showing only
- * details, but can be expanded by the user.
- *
- * Use [ctor@CertificateWidget.new] to create a new certificate widget. Only
- * one certificate can be displayed. It contains a [iface@Viewer] internally
- * and [class@CertificateRenderer] is used to render the certificate to the
- * viewer.
- *
- * To show more than one certificate in a view, create the viewer and
- * add renderers to it.
- */
+struct _GcrCertificateWidget
+{
+ GtkBox parent_instance;
-enum {
- PROP_0,
- PROP_CERTIFICATE,
- PROP_ATTRIBUTES
+ GcrCertificate *certificate;
+ GtkWidget *reveal_button;
+ GtkWidget *revealer;
+ GtkWidget *secondary_info;
+ GtkSizeGroup *size_group;
};
-struct _GcrCertificateWidgetPrivate {
- GcrViewer *viewer;
- GcrCertificateRenderer *renderer;
+G_DEFINE_TYPE (GcrCertificateWidget, gcr_certificate_widget, GTK_TYPE_BOX)
+
+enum {
+ PROP_CERTIFICATE = 1,
+ N_PROPERTIES
};
-G_DEFINE_TYPE_WITH_PRIVATE (GcrCertificateWidget, gcr_certificate_widget, GTK_TYPE_BIN);
+static GParamSpec *obj_properties[N_PROPERTIES] = { NULL, };
-/* -----------------------------------------------------------------------------
- * OBJECT
- */
+static void
+gcr_certificate_widget_finalize (GObject *object)
+{
+ GcrCertificateWidget *self = (GcrCertificateWidget *)object;
+
+ g_clear_object (&self->size_group);
+
+ G_OBJECT_CLASS (gcr_certificate_widget_parent_class)->finalize (object);
+}
-static GObject*
-gcr_certificate_widget_constructor (GType type, guint n_props, GObjectConstructParam *props)
+static void
+gcr_certificate_widget_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
{
- GObject *obj = G_OBJECT_CLASS (gcr_certificate_widget_parent_class)->constructor (type, n_props, props);
- GcrCertificateWidget *self = NULL;
+ GcrCertificateWidget *self = GCR_CERTIFICATE_WIDGET (object);
- g_return_val_if_fail (obj, NULL);
+ switch (prop_id)
+ {
+ case PROP_CERTIFICATE:
+ g_value_set_object (value, gcr_certificate_widget_get_certificate (self));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
- self = GCR_CERTIFICATE_WIDGET (obj);
+static void
+gcr_certificate_widget_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ GcrCertificateWidget *self = GCR_CERTIFICATE_WIDGET (object);
- self->pv->viewer = gcr_viewer_new_scrolled ();
- gtk_container_add (GTK_CONTAINER (self), GTK_WIDGET (self->pv->viewer));
- gtk_widget_show (GTK_WIDGET (self->pv->viewer));
+ switch (prop_id)
+ {
+ case PROP_CERTIFICATE:
+ gcr_certificate_widget_set_certificate (self, g_value_get_object (value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
+}
- gcr_viewer_add_renderer (self->pv->viewer, GCR_RENDERER (self->pv->renderer));
- return obj;
+static void
+gcr_certificate_widget_class_init (GcrCertificateWidgetClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ object_class->finalize = gcr_certificate_widget_finalize;
+ object_class->get_property = gcr_certificate_widget_get_property;
+ object_class->set_property = gcr_certificate_widget_set_property;
+
+ obj_properties[PROP_CERTIFICATE] =
+ g_param_spec_object ("certificate",
+ "Certificate",
+ "Certificate to display.",
+ GCR_TYPE_CERTIFICATE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
+ g_object_class_install_properties (object_class,
+ N_PROPERTIES,
+ obj_properties);
+}
+
+static void
+on_reveal_button_clicked (GtkWidget *button,
+ GcrCertificateWidget *self)
+{
+ g_assert (GCR_IS_CERTIFICATE_WIDGET (self));
+ gtk_widget_hide (button);
+ gtk_revealer_set_reveal_child (GTK_REVEALER (self->revealer), TRUE);
}
static void
gcr_certificate_widget_init (GcrCertificateWidget *self)
{
- self->pv = gcr_certificate_widget_get_instance_private (self);
- self->pv->renderer = gcr_certificate_renderer_new (NULL);
+ gtk_orientable_set_orientation (GTK_ORIENTABLE (self), GTK_ORIENTATION_VERTICAL);
+ self->reveal_button = gtk_button_new_with_label ("…");
+ gtk_widget_set_halign (self->reveal_button, GTK_ALIGN_CENTER);
+ gtk_box_pack_end (GTK_BOX (self), self->reveal_button, FALSE, TRUE, 0);
+ self->secondary_info = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+ self->revealer = g_object_new (GTK_TYPE_REVEALER,
+ "child", self->secondary_info,
+ "transition-type", GTK_REVEALER_TRANSITION_TYPE_SLIDE_DOWN,
+ NULL);
+ gtk_box_pack_end (GTK_BOX (self), self->revealer, FALSE, TRUE, 0);
+ g_signal_connect (self->reveal_button, "clicked", G_CALLBACK (on_reveal_button_clicked), self);
+ self->size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
+}
+
+static GtkWidget*
+_gcr_certificate_widget_add_section (GcrCertificateWidget *self,
+ const gchar *title,
+ GIcon *icon,
+ gboolean important)
+{
+ GtkWidget *widget;
+
+ g_assert (GCR_IS_CERTIFICATE_WIDGET (self));
+
+ if (icon)
+ widget = gcr_section_new_with_icon (title, icon);
+ else
+ widget = gcr_section_new (title);
+
+ gtk_size_group_add_widget (self->size_group, widget);
+ if (important)
+ gtk_box_pack_start (GTK_BOX (self), widget, FALSE, TRUE, 0);
+ else
+ gtk_container_add (GTK_CONTAINER (self->secondary_info), widget);
+
+ return widget;
+}
+
+static GtkWidget*
+create_value_label (const gchar *label)
+{
+ return g_object_new (GTK_TYPE_LABEL,
+ "label", label,
+ "xalign", 1.0,
+ "halign", GTK_ALIGN_END,
+ "hexpand", TRUE,
+ "selectable", TRUE,
+ "wrap", TRUE,
+ NULL);
+}
+
+static gchar*
+calculate_label (GcrCertificateWidget *self)
+{
+ gchar *label;
+
+ label = gcr_certificate_get_subject_cn (self->certificate);
+ if (label != NULL)
+ return label;
+
+ return g_strdup (_("Certificate"));
}
static void
-gcr_certificate_widget_finalize (GObject *obj)
+on_parsed_dn_part (guint index,
+ GQuark oid,
+ GNode *value,
+ gpointer user_data)
{
- GcrCertificateWidget *self = GCR_CERTIFICATE_WIDGET (obj);
+ GtkWidget *section = user_data;
+ const gchar *attr;
+ const gchar *desc;
+ gchar *field = NULL;
+ gchar *display;
+
+ attr = egg_oid_get_name (oid);
+ desc = egg_oid_get_description (oid);
+
+ /* Combine them into something sane */
+ if (attr && desc) {
+ if (strcmp (attr, desc) == 0)
+ field = g_strdup (attr);
+ else
+ field = g_strdup_printf ("%s (%s)", attr, desc);
+ } else if (!attr && !desc) {
+ field = g_strdup ("");
+ } else if (attr) {
+ field = g_strdup (attr);
+ } else if (desc) {
+ field = g_strdup (desc);
+ } else {
+ g_assert_not_reached ();
+ }
- g_assert (self->pv->renderer);
- g_object_unref (self->pv->renderer);
- self->pv->renderer = NULL;
+ display = egg_dn_print_value (oid, value);
+ if (display == NULL)
+ display = g_strdup ("");
- g_assert (self->pv->viewer);
- self->pv->viewer = NULL;
+ gcr_section_add_child (GCR_SECTION (section), field, create_value_label (display));
- G_OBJECT_CLASS (gcr_certificate_widget_parent_class)->finalize (obj);
+ g_free (field);
+ g_free (display);
+}
+
+static inline gchar *
+hex_encode_bytes (GBytes *bytes)
+{
+ gsize size;
+ gconstpointer data = g_bytes_get_data (bytes, &size);
+ return egg_hex_encode_full (data, size, TRUE, " ", 1);
}
static void
-gcr_certificate_widget_set_property (GObject *obj, guint prop_id, const GValue *value,
- GParamSpec *pspec)
+append_subject_public_key (GcrCertificateWidget *self,
+ GcrSection *section,
+ GNode *subject_public_key)
{
- GcrCertificateWidget *self = GCR_CERTIFICATE_WIDGET (obj);
+ guint key_nbits;
+ const gchar *text;
+ gchar *display;
+ GBytes *value;
+ guchar *raw;
+ gsize n_raw;
+ GQuark oid;
+ guint bits;
+
+ key_nbits = gcr_certificate_get_key_size (self->certificate);
+
+ oid = egg_asn1x_get_oid_as_quark (egg_asn1x_node (subject_public_key,
+ "algorithm", "algorithm", NULL));
+ text = egg_oid_get_description (oid);
+ gcr_section_add_child (section, _("Key Algorithm"), create_value_label (text));
+
+ value = egg_asn1x_get_element_raw (egg_asn1x_node (subject_public_key,
+ "algorithm", "parameters", NULL));
+ if (value) {
+ display = hex_encode_bytes (value);
+ gcr_section_add_child (section, _("Key Parameters"), create_value_label (display));
+ g_clear_pointer (&display, g_free);
+ g_bytes_unref (value);
+ }
- switch (prop_id) {
- case PROP_CERTIFICATE:
- gcr_certificate_widget_set_certificate (self, g_value_get_object (value));
- break;
- case PROP_ATTRIBUTES:
- gcr_certificate_widget_set_attributes (self, g_value_get_boxed (value));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
+ if (key_nbits > 0) {
+ display = g_strdup_printf ("%u", key_nbits);
+ gcr_section_add_child (section, _("Key Size"), create_value_label (display));
+ g_clear_pointer (&display, g_free);
}
+
+ value = egg_asn1x_get_element_raw (subject_public_key);
+ raw = gcr_fingerprint_from_subject_public_key_info (g_bytes_get_data (value, NULL),
+ g_bytes_get_size (value),
+ G_CHECKSUM_SHA1, &n_raw);
+ g_bytes_unref (value);
+ display = egg_hex_encode_full (raw, n_raw, TRUE, " ", 1);
+ g_free (raw);
+ gcr_section_add_child (section, _("Key SHA1 Fingerprint"), create_value_label (text));
+ g_clear_pointer (&display, g_free);
+
+ value = egg_asn1x_get_bits_as_raw (egg_asn1x_node (subject_public_key, "subjectPublicKey", NULL), &bits);
+ display = egg_hex_encode_full (g_bytes_get_data (value, NULL), bits / 8, TRUE, " ", 1);
+ gcr_section_add_child (section, _("Public Key"), create_value_label (text));
+ g_clear_pointer (&display, g_free);
+ g_bytes_unref (value);
}
-static void
-gcr_certificate_widget_get_property (GObject *obj, guint prop_id, GValue *value,
- GParamSpec *pspec)
+static GcrSection *
+append_extension_basic_constraints (GcrCertificateWidget *self,
+ GBytes *data)
{
- GcrCertificateWidget *self = GCR_CERTIFICATE_WIDGET (obj);
+ GcrSection *section;
+ gboolean is_ca = FALSE;
+ gint path_len = -1;
+ gchar *number;
- switch (prop_id) {
- case PROP_CERTIFICATE:
- g_value_set_object (value, gcr_certificate_widget_get_certificate (self));
- break;
- case PROP_ATTRIBUTES:
- g_value_set_boxed (value, gcr_certificate_widget_get_attributes (self));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
+ if (!_gcr_certificate_extension_basic_constraints (data, &is_ca, &path_len))
+ return NULL;
+
+ section = GCR_SECTION (_gcr_certificate_widget_add_section (self, _("Basic Constraints"), NULL, FALSE));
+ gcr_section_add_child (section, _("Certificate Authority"), create_value_label (is_ca ? _("Yes") : _("No")));
+
+ number = g_strdup_printf ("%d", path_len);
+ gcr_section_add_child (section, _("Max Path Length"), create_value_label (path_len < 0 ? _("Unlimited") : number));
+ g_free (number);
+
+ return section;
+}
+
+static GcrSection *
+append_extension_extended_key_usage (GcrCertificateWidget *self,
+ GBytes *data)
+{
+ GcrSection *section;
+ GQuark *oids;
+ GString *text;
+ guint i;
+
+ oids = _gcr_certificate_extension_extended_key_usage (data);
+ if (oids == NULL)
+ return NULL;
+
+ text = g_string_new ("");
+ for (i = 0; oids[i] != 0; i++) {
+ if (i > 0)
+ g_string_append_unichar (text, '\n');
+ g_string_append (text, egg_oid_get_description (oids[i]));
}
+
+ g_free (oids);
+
+ section = GCR_SECTION (_gcr_certificate_widget_add_section (self, _("Extended Key Usage"), NULL, FALSE));
+ gcr_section_add_child (section, _("Allowed Purposes"), create_value_label (text->str));
+
+ g_string_free (text, TRUE);
+
+ return section;
}
-static void
-gcr_certificate_widget_class_init (GcrCertificateWidgetClass *klass)
+static GcrSection *
+append_extension_subject_key_identifier (GcrCertificateWidget *self,
+ GBytes *data)
{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+ GcrSection *section;
+ gpointer keyid;
+ gsize n_keyid;
+
+ keyid = _gcr_certificate_extension_subject_key_identifier (data, &n_keyid);
+ if (keyid == NULL)
+ return NULL;
- gcr_certificate_widget_parent_class = g_type_class_peek_parent (klass);
+ section = GCR_SECTION (_gcr_certificate_widget_add_section (self, _("Subject Key Identifier"), NULL, FALSE));
+ gchar *display = egg_hex_encode_full (keyid, n_keyid, TRUE, " ", 1);
+ g_free (keyid);
+ gcr_section_add_child (section, _("Key Identifier"), create_value_label (display));
+ g_free (display);
- gobject_class->constructor = gcr_certificate_widget_constructor;
- gobject_class->finalize = gcr_certificate_widget_finalize;
- gobject_class->set_property = gcr_certificate_widget_set_property;
- gobject_class->get_property = gcr_certificate_widget_get_property;
+ return section;
+}
+
+static const struct {
+ guint usage;
+ const gchar *description;
+} usage_descriptions[] = {
+ { GCR_KEY_USAGE_DIGITAL_SIGNATURE, N_("Digital signature") },
+ { GCR_KEY_USAGE_NON_REPUDIATION, N_("Non repudiation") },
+ { GCR_KEY_USAGE_KEY_ENCIPHERMENT, N_("Key encipherment") },
+ { GCR_KEY_USAGE_DATA_ENCIPHERMENT, N_("Data encipherment") },
+ { GCR_KEY_USAGE_KEY_AGREEMENT, N_("Key agreement") },
+ { GCR_KEY_USAGE_KEY_CERT_SIGN, N_("Certificate signature") },
+ { GCR_KEY_USAGE_CRL_SIGN, N_("Revocation list signature") },
+ { GCR_KEY_USAGE_ENCIPHER_ONLY, N_("Encipher only") },
+ { GCR_KEY_USAGE_DECIPHER_ONLY, N_("Decipher only") }
+};
- g_object_class_install_property (gobject_class, PROP_CERTIFICATE,
- g_param_spec_object("certificate", "Certificate", "Certificate to display.",
- GCR_TYPE_CERTIFICATE,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+static GcrSection *
+append_extension_key_usage (GcrCertificateWidget *self,
+ GBytes *data)
+{
+ GcrSection *section;
+ gulong key_usage;
+ GString *text;
+ guint i;
+
+ if (!_gcr_certificate_extension_key_usage (data, &key_usage))
+ return NULL;
+
+ text = g_string_new ("");
+
+ for (i = 0; i < G_N_ELEMENTS (usage_descriptions); i++) {
+ if (key_usage & usage_descriptions[i].usage) {
+ if (text->len > 0)
+ g_string_append_unichar (text, '\n');
+ g_string_append (text, _(usage_descriptions[i].description));
+ }
+ }
- g_object_class_install_property (gobject_class, PROP_ATTRIBUTES,
- g_param_spec_boxed ("attributes", "Attributes", "Attributes which contain the certificate",
- GCK_TYPE_ATTRIBUTES,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ section = GCR_SECTION (_gcr_certificate_widget_add_section (self, _("Key Usage"), NULL, FALSE));
+ gcr_section_add_child (section, _("Usages"), create_value_label (text->str));
+
+ g_string_free (text, TRUE);
+
+ return section;
}
-/* -----------------------------------------------------------------------------
- * PUBLIC
- */
+static GcrSection *
+append_extension_subject_alt_name (GcrCertificateWidget *self,
+ GBytes *data)
+{
+ GcrSection *section;
+ GArray *general_names;
+ GcrGeneralName *general;
+ guint i;
+
+ general_names = _gcr_certificate_extension_subject_alt_name (data);
+ if (general_names == NULL)
+ return FALSE;
+
+ section = GCR_SECTION (_gcr_certificate_widget_add_section (self, _("Subject Alternative Names"), NULL, FALSE));
+
+ for (i = 0; i < general_names->len; i++) {
+ general = &g_array_index (general_names, GcrGeneralName, i);
+ if (general->display == NULL) {
+ gchar *display = hex_encode_bytes (general->raw);
+ gcr_section_add_child (section, general->description, create_value_label (display));
+ g_free (display);
+ } else
+ gcr_section_add_child (section, general->description, create_value_label (general->display));
+ }
+
+ _gcr_general_names_free (general_names);
+
+ return section;
+}
+
+static GcrSection *
+append_extension_hex (GcrCertificateWidget *self,
+ GQuark oid,
+ GBytes *value)
+{
+ GcrSection *section;
+ const gchar *text;
+ gchar *display;
+
+ section = GCR_SECTION (_gcr_certificate_widget_add_section (self, _("Extension"), NULL, FALSE));
+
+ /* Extension type */
+ text = egg_oid_get_description (oid);
+ gcr_section_add_child (section, _("Identifier"), create_value_label (text));
+ display = hex_encode_bytes (value);
+ gcr_section_add_child (section, _("Value"), create_value_label (display));
+ g_free (display);
+
+ return section;
+}
+
+static void
+append_extension (GcrCertificateWidget *self,
+ GNode *node)
+{
+ GQuark oid;
+ GBytes *value;
+ gboolean critical;
+ GcrSection *section = NULL;
+
+ /* Dig out the OID */
+ oid = egg_asn1x_get_oid_as_quark (egg_asn1x_node (node, "extnID", NULL));
+ g_return_if_fail (oid);
+
+ /* Extension value */
+ value = egg_asn1x_get_string_as_bytes (egg_asn1x_node (node, "extnValue", NULL));
+
+ /* The custom parsers */
+ if (oid == GCR_OID_BASIC_CONSTRAINTS)
+ section = append_extension_basic_constraints (self, value);
+ else if (oid == GCR_OID_EXTENDED_KEY_USAGE)
+ section = append_extension_extended_key_usage (self, value);
+ else if (oid == GCR_OID_SUBJECT_KEY_IDENTIFIER)
+ section = append_extension_subject_key_identifier (self, value);
+ else if (oid == GCR_OID_KEY_USAGE)
+ section = append_extension_key_usage (self, value);
+ else if (oid == GCR_OID_SUBJECT_ALT_NAME)
+ section = append_extension_subject_alt_name (self, value);
+
+ /* Otherwise the default raw display */
+ if (!section) {
+ section = append_extension_hex (self, oid, value);
+ }
+
+ /* Critical */
+ if (section && egg_asn1x_get_boolean (egg_asn1x_node (node, "critical", NULL), &critical)) {
+ gcr_section_add_child (section, _("Critical"), create_value_label (critical ? _("Yes") : _("No")));
+ }
+
+ g_bytes_unref (value);
+}
/**
* gcr_certificate_widget_new:
@@ -174,9 +502,10 @@ gcr_certificate_widget_class_init (GcrCertificateWidgetClass *klass)
*
* Create a new certificate widget which displays a given certificate.
*
- * Returns: (transfer full): a new certificate widget
+ * Returns: (transfer full): a newly allocated #GcrCertificateWidget, which
+ * should be freed with g_object_unref()
*/
-GcrCertificateWidget *
+GtkWidget *
gcr_certificate_widget_new (GcrCertificate *certificate)
{
return g_object_new (GCR_TYPE_CERTIFICATE_WIDGET, "certificate", certificate, NULL);
@@ -194,7 +523,7 @@ GcrCertificate *
gcr_certificate_widget_get_certificate (GcrCertificateWidget *self)
{
g_return_val_if_fail (GCR_IS_CERTIFICATE_WIDGET (self), NULL);
- return gcr_certificate_renderer_get_certificate (self->pv->renderer);
+ return self->certificate;
}
/**
@@ -207,38 +536,142 @@ gcr_certificate_widget_get_certificate (GcrCertificateWidget *self)
void
gcr_certificate_widget_set_certificate (GcrCertificateWidget *self, GcrCertificate *certificate)
{
+ GtkWidget *section, *label;
+ PangoAttrList *attributes;
+ gchar *display;
+ GIcon *icon;
+ GBytes *bytes, *number;
+ GNode *asn, *subject_public_key;
+ GQuark oid;
+ gconstpointer data;
+ gsize n_data;
+ GDate date;
+ gulong version;
+ guint bits, index;
+
g_return_if_fail (GCR_IS_CERTIFICATE_WIDGET (self));
- gcr_certificate_renderer_set_certificate (self->pv->renderer, certificate);
-}
-/**
- * gcr_certificate_widget_get_attributes:
- * @self: The certificate widget
- *
- * Get the attributes displayed in the widget. The attributes should contain
- * a certificate.
- *
- * Returns: (nullable) (transfer none): the attributes, owned by the widget
- */
-GckAttributes *
-gcr_certificate_widget_get_attributes (GcrCertificateWidget *self)
-{
- g_return_val_if_fail (GCR_IS_CERTIFICATE_WIDGET (self), NULL);
- return gcr_renderer_get_attributes (GCR_RENDERER (self->pv->renderer));
-}
+ g_set_object (&self->certificate, certificate);
-/**
- * gcr_certificate_widget_set_attributes:
- * @self: The certificate widget
- * @attrs: (nullable): the attributes to display
- *
- * Set the attributes displayed in the widget. The attributes should contain
- * a certificate.
- */
-void
-gcr_certificate_widget_set_attributes (GcrCertificateWidget *self,
- GckAttributes *attrs)
-{
- g_return_if_fail (GCR_IS_CERTIFICATE_WIDGET (self));
- gcr_renderer_set_attributes (GCR_RENDERER (self->pv->renderer), attrs);
+ data = gcr_certificate_get_der_data (self->certificate, &n_data);
+ if (!data) {
+ g_set_object (&self->certificate, NULL);
+ }
+
+ icon = gcr_certificate_get_icon (self->certificate);
+ display = calculate_label (self);
+ section = _gcr_certificate_widget_add_section (self, display, icon, TRUE);
+ g_clear_pointer (&display, g_free);
+ g_object_unref (icon);
+
+ bytes = g_bytes_new_static (data, n_data);
+ asn = egg_asn1x_create_and_decode (pkix_asn1_tab, "Certificate", bytes);
+ g_bytes_unref (bytes);
+
+ display = egg_dn_read_part (egg_asn1x_node (asn, "tbsCertificate", "subject", "rdnSequence", NULL), "CN");
+ gcr_section_add_child (GCR_SECTION (section), _("Identity"), create_value_label (display));
+ g_clear_pointer (&display, g_free);
+
+ display = egg_dn_read_part (egg_asn1x_node (asn, "tbsCertificate", "issuer", "rdnSequence", NULL), "CN");
+ gcr_section_add_child (GCR_SECTION (section), _("Verified by"), create_value_label (display));
+ g_clear_pointer (&display, g_free);
+
+ if (egg_asn1x_get_time_as_date (egg_asn1x_node (asn, "tbsCertificate", "validity", "notAfter", NULL), &date)) {
+ display = g_malloc0 (128);
+ if (!g_date_strftime (display, 128, "%x", &date))
+ g_return_if_reached ();
+ gcr_section_add_child (GCR_SECTION (section), _("Expires"), create_value_label (display));
+ g_clear_pointer (&display, g_free);
+ }
+
+ /* The subject */
+ section = _gcr_certificate_widget_add_section (self, _("Subject Name"), NULL, FALSE);
+ egg_dn_parse (egg_asn1x_node (asn, "tbsCertificate", "subject", "rdnSequence", NULL), on_parsed_dn_part, section);
+
+ /* The Issuer */
+ section = _gcr_certificate_widget_add_section (self, _("Issuer Name"), NULL, FALSE);
+ egg_dn_parse (egg_asn1x_node (asn, "tbsCertificate", "issuer", "rdnSequence", NULL), on_parsed_dn_part, section);
+
+ /* The Issued Parameters */
+ section = _gcr_certificate_widget_add_section (self, _("Issued Certificate"), NULL, FALSE);
+
+ if (!egg_asn1x_get_integer_as_ulong (egg_asn1x_node (asn, "tbsCertificate", "version", NULL), &version)) {
+ g_critical ("Unable to parse certificate version");
+ } else {
+ display = g_strdup_printf ("%lu", version + 1);
+ gcr_section_add_child (GCR_SECTION (section), _("Version"), create_value_label (display));
+ g_clear_pointer (&display, g_free);
+ }
+
+ number = egg_asn1x_get_integer_as_raw (egg_asn1x_node (asn, "tbsCertificate", "serialNumber", NULL));
+ if (!number) {
+ g_critical ("Unable to parse certificate serial number");
+ } else {
+ display = hex_encode_bytes (number);
+ gcr_section_add_child (GCR_SECTION (section), _("Serial Number"), create_value_label (display));
+ g_clear_pointer (&display, g_free);
+ g_bytes_unref (number);
+ }
+
+ display = g_malloc0 (128);
+ if (egg_asn1x_get_time_as_date (egg_asn1x_node (asn, "tbsCertificate", "validity", "notBefore", NULL), &date)) {
+ if (!g_date_strftime (display, 128, "%x", &date))
+ g_return_if_reached ();
+ gcr_section_add_child (GCR_SECTION (section), _("Not Valid Before"), create_value_label (display));
+ }
+ if (egg_asn1x_get_time_as_date (egg_asn1x_node (asn, "tbsCertificate", "validity", "notAfter", NULL), &date)) {
+ if (!g_date_strftime (display, 128, "%x", &date))
+ g_return_if_reached ();
+ gcr_section_add_child (GCR_SECTION (section), _("Not Valid After"), create_value_label (display));
+ }
+ g_clear_pointer (&display, g_free);
+
+ /* Fingerprints */
+ section = _gcr_certificate_widget_add_section (self, _("Certificate Fingerprints"), NULL, FALSE);
+ display = g_compute_checksum_for_bytes (G_CHECKSUM_SHA1, bytes);
+ gcr_section_add_child (GCR_SECTION (section), "SHA1", create_value_label (display));
+ g_clear_pointer (&display, g_free);
+ display = g_compute_checksum_for_bytes (G_CHECKSUM_MD5, bytes);
+ gcr_section_add_child (GCR_SECTION (section), "MD5", create_value_label (display));
+ g_clear_pointer (&display, g_free);
+
+ /* Public Key Info */
+ section = _gcr_certificate_widget_add_section (self, _("Public Key Info"), NULL, FALSE);
+ subject_public_key = egg_asn1x_node (asn, "tbsCertificate", "subjectPublicKeyInfo", NULL);
+ append_subject_public_key (self, GCR_SECTION (section), subject_public_key);
+
+ /* Extensions */
+ for (index = 1; TRUE; ++index) {
+ GNode *extension = egg_asn1x_node (asn, "tbsCertificate", "extensions", index, NULL);
+ if (extension == NULL)
+ break;
+ append_extension (self, extension);
+ }
+
+ /* Signature */
+ section = _gcr_certificate_widget_add_section (self, _("Signature"), NULL, FALSE);
+
+ oid = egg_asn1x_get_oid_as_quark (egg_asn1x_node (asn, "signatureAlgorithm", "algorithm", NULL));
+ gcr_section_add_child (GCR_SECTION (section), _("Signature Algorithm"), create_value_label (egg_oid_get_description (oid)));
+
+ bytes = egg_asn1x_get_element_raw (egg_asn1x_node (asn, "signatureAlgorithm", "parameters", NULL));
+ if (bytes) {
+ display = hex_encode_bytes (bytes);
+ gcr_section_add_child (GCR_SECTION (section), _("Signature Parameters"), create_value_label (display));
+ g_clear_pointer (&display, g_free);
+ g_bytes_unref (bytes);
+ }
+
+ bytes = egg_asn1x_get_bits_as_raw (egg_asn1x_node (asn, "signature", NULL), &bits);
+ display = egg_hex_encode_full (g_bytes_get_data (bytes, NULL), bits / 8, TRUE, " ", 1);
+ g_bytes_unref (bytes);
+ label = create_value_label (display);
+ attributes = pango_attr_list_new ();
+ pango_attr_list_insert (attributes, pango_attr_family_new ("Monospace"));
+ gtk_label_set_attributes (GTK_LABEL (label), attributes);
+ pango_attr_list_unref (attributes);
+ gcr_section_add_child (GCR_SECTION (section), _("Signature"), label);
+ g_clear_pointer (&display, g_free);
+
+ egg_asn1x_destroy (asn);
}
diff --git a/gcr-gtk3/gcr-certificate-widget.h b/gcr-gtk3/gcr-certificate-widget.h
index c6727a6..dab5a82 100644
--- a/gcr-gtk3/gcr-certificate-widget.h
+++ b/gcr-gtk3/gcr-certificate-widget.h
@@ -1,22 +1,12 @@
/*
- * Copyright (C) 2010 Stefan Walter
- *
- * 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/>.
+ * Copyright 2021 Collabora Ltd.
+ * Copyright 2010 Stefan Walter
+ * Copyright Corentin Noël <corentin.noel@collabora.com>
+ * SPDX-License-Identifier: LGPL-2.1-or-later
*/
#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly."
+#error "Only <gcr/gcr.h> can be included directly."
#endif
#ifndef __GCR_CERTIFICATE_WIDGET_H__
@@ -24,49 +14,19 @@
#include <glib-object.h>
#include <gtk/gtk.h>
-
-#include "gcr/gcr-certificate.h"
-#include "gcr/gcr-types.h"
+#include <gcr/gcr-certificate.h>
G_BEGIN_DECLS
-#define GCR_TYPE_CERTIFICATE_WIDGET (gcr_certificate_widget_get_type ())
-#define GCR_CERTIFICATE_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_CERTIFICATE_WIDGET, GcrCertificateWidget))
-#define GCR_CERTIFICATE_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_CERTIFICATE_WIDGET, GcrCertificateWidgetClass))
-#define GCR_IS_CERTIFICATE_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_CERTIFICATE_WIDGET))
-#define GCR_IS_CERTIFICATE_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_CERTIFICATE_WIDGET))
-#define GCR_CERTIFICATE_WIDGET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_CERTIFICATE_WIDGET, GcrCertificateWidgetClass))
-
-typedef struct _GcrCertificateWidget GcrCertificateWidget;
-typedef struct _GcrCertificateWidgetClass GcrCertificateWidgetClass;
-typedef struct _GcrCertificateWidgetPrivate GcrCertificateWidgetPrivate;
-
-struct _GcrCertificateWidget {
- /*< private >*/
- GtkBin parent;
- GcrCertificateWidgetPrivate *pv;
-};
-
-struct _GcrCertificateWidgetClass {
- /*< private >*/
- GtkBinClass parent_class;
-};
-
-GType gcr_certificate_widget_get_type (void);
-
-GcrCertificateWidget* gcr_certificate_widget_new (GcrCertificate *certificate);
-
-GcrCertificate* gcr_certificate_widget_get_certificate (GcrCertificateWidget *self);
-
-void gcr_certificate_widget_set_certificate (GcrCertificateWidget *self,
- GcrCertificate *certificate);
+#define GCR_TYPE_CERTIFICATE_WIDGET gcr_certificate_widget_get_type ()
+G_DECLARE_FINAL_TYPE (GcrCertificateWidget, gcr_certificate_widget, GCR, CERTIFICATE_WIDGET, GtkBox)
-GckAttributes * gcr_certificate_widget_get_attributes (GcrCertificateWidget *self);
+GtkWidget *gcr_certificate_widget_new (GcrCertificate *certificate);
-void gcr_certificate_widget_set_attributes (GcrCertificateWidget *self,
- GckAttributes *attrs);
+GcrCertificate *gcr_certificate_widget_get_certificate (GcrCertificateWidget *self);
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrCertificateWidget, g_object_unref)
+void gcr_certificate_widget_set_certificate (GcrCertificateWidget *self,
+ GcrCertificate *certificate);
G_END_DECLS
diff --git a/gcr-gtk3/gcr-collection-model.c b/gcr-gtk3/gcr-collection-model.c
deleted file mode 100644
index 29be449..0000000
--- a/gcr-gtk3/gcr-collection-model.c
+++ /dev/null
@@ -1,1654 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2010 Stefan Walter
- * Copyright (C) 2011 Collabora Ltd.
- *
- * 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/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#include "config.h"
-
-#include "gcr-collection-model.h"
-
-#include "gcr-gtk3/gcr-enum-types.h"
-
-#include <gtk/gtk.h>
-
-#include <string.h>
-#include <unistd.h>
-
-/**
- * GcrCollectionModel:
- *
- * Ain implementation of a [iface@Gtk.TreeModel] which contains a row for each
- * object in a [iface@Gcr.Collection].
- *
- * As objects are added or removed from the collection, rows are added and
- * removed from this model.
- *
- * The row values come from the properties of the objects in the collection. Use
- * [ctor@CollectionModel.new] to create a new collection model. To have more
- * control over the values use a set of [struct@Gcr.Column] structures to
- * define the columns. This can be done with [ctor@CollectionModel.new_full] or
- * [method@CollectionModel.set_columns].
- *
- * Each row can have a selected state, which is represented by a boolean column.
- * The selected state can be toggled with gcr_collection_model_toggle_selected()
- * or set with gcr_collection_model_set_selected_objects() and retrieved with
- * [method@CollectionModel.get_selected_objects].
- *
- * To determine which object a row represents and vice versa, use the
- * [method@CollectionModel.iter_for_object] or
- * [method@CollectionModel.object_for_iter] functions.
- */
-
-/**
- * GcrCollectionModelClass:
- * @parent_class: The parent class
- *
- * The class for #GcrCollectionModel.
- */
-
-/**
- * GcrCollectionModelMode:
- * @GCR_COLLECTION_MODEL_LIST: only objects in the top collection, no child objects
- * @GCR_COLLECTION_MODEL_TREE: show objects in the collection, and child objects in a tree form
- *
- * If a [class@CollectionModel] is created with a mode of
- * %GCR_COLLECTION_MODEL_TREE, then any included objects that are themselves a
- * [iface@Gcr.Collection], will have all child
- * objects include as child rows in a tree form.
- */
-
-#define COLLECTION_MODEL_STAMP 0xAABBCCDD
-
-enum {
- PROP_0,
- PROP_COLLECTION,
- PROP_COLUMNS,
- PROP_MODE
-};
-
-typedef struct {
- GObject *object;
- GSequenceIter *parent;
- GSequence *children;
-} GcrCollectionRow;
-
-typedef struct {
- GtkTreeIterCompareFunc sort_func;
- gpointer user_data;
- GDestroyNotify destroy_func;
-} GcrCollectionSortClosure;
-
-typedef struct _GcrCollectionColumn {
- gchar *property;
- GType *type;
- GtkTreeIterCompareFunc sort_func;
- gpointer sort_data;
- GDestroyNotify sort_destroy;
-} GcrCollectionColumn;
-
-struct _GcrCollectionModelPrivate {
- GcrCollectionModelMode mode;
- GcrCollection *collection;
- GHashTable *selected;
- GSequence *root_sequence;
- GHashTable *object_to_seq;
-
- const GcrColumn *columns;
- guint n_columns;
-
- /* Sort information */
- gint sort_column_id;
- GtkSortType sort_order_type;
- GcrCollectionSortClosure *column_sort_closures;
- GcrCollectionSortClosure default_sort_closure;
-
- /* Sequence ordering information */
- GCompareDataFunc order_current;
- gpointer order_argument;
-};
-
-/* Forward declarations */
-static void gcr_collection_model_tree_model_init (GtkTreeModelIface *iface);
-static void gcr_collection_model_tree_sortable_init (GtkTreeSortableIface *iface);
-
-G_DEFINE_TYPE_EXTENDED (GcrCollectionModel, gcr_collection_model, G_TYPE_OBJECT, 0,
- G_ADD_PRIVATE (GcrCollectionModel);
- G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_MODEL, gcr_collection_model_tree_model_init)
- G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_SORTABLE, gcr_collection_model_tree_sortable_init)
-);
-
-typedef gint (*CompareValueFunc) (const GValue *va,
- const GValue *vb);
-
-static gint
-compare_int_value (const GValue *va,
- const GValue *vb)
-{
- gint a = g_value_get_int (va);
- gint b = g_value_get_int (vb);
- if (a > b) return 1;
- else if (a < b) return -1;
- return 0;
-}
-
-static gint
-compare_uint_value (const GValue *va,
- const GValue *vb)
-{
- guint a = g_value_get_uint (va);
- guint b = g_value_get_uint (vb);
- if (a > b) return 1;
- else if (a < b) return -1;
- return 0;
-}
-
-static gint
-compare_long_value (const GValue *va,
- const GValue *vb)
-{
- glong a = g_value_get_long (va);
- glong b = g_value_get_long (vb);
- if (a > b) return 1;
- else if (a < b) return -1;
- return 0;
-}
-
-static gint
-compare_ulong_value (const GValue *va,
- const GValue *vb)
-{
- gulong a = g_value_get_ulong (va);
- gulong b = g_value_get_ulong (vb);
- if (a > b) return 1;
- else if (a < b) return -1;
- return 0;
-}
-
-static gint
-compare_string_value (const GValue *va,
- const GValue *vb)
-{
- const gchar *a = g_value_get_string (va);
- const gchar *b = g_value_get_string (vb);
- gchar *case_a;
- gchar *case_b;
- gboolean ret;
-
- if (a == b)
- return 0;
- else if (!a)
- return -1;
- else if (!b)
- return 1;
-
- case_a = g_utf8_casefold (a, -1);
- case_b = g_utf8_casefold (b, -1);
- ret = g_utf8_collate (case_a, case_b);
- g_free (case_a);
- g_free (case_b);
-
- return ret;
-}
-
-static gint
-compare_date_value (const GValue *va,
- const GValue *vb)
-{
- GDate *a = g_value_get_boxed (va);
- GDate *b = g_value_get_boxed (vb);
-
- if (a == b)
- return 0;
- else if (!a)
- return -1;
- else if (!b)
- return 1;
- else
- return g_date_compare (a, b);
-}
-
-static CompareValueFunc
-lookup_compare_func (GType type)
-{
- switch (type) {
- case G_TYPE_INT:
- return compare_int_value;
- case G_TYPE_UINT:
- return compare_uint_value;
- case G_TYPE_LONG:
- return compare_long_value;
- case G_TYPE_ULONG:
- return compare_ulong_value;
- case G_TYPE_STRING:
- return compare_string_value;
- }
-
- if (type == G_TYPE_DATE)
- return compare_date_value;
-
- return NULL;
-}
-
-static gint
-order_sequence_by_closure (gconstpointer a,
- gconstpointer b,
- gpointer user_data)
-{
- GcrCollectionModel *self = GCR_COLLECTION_MODEL (user_data);
- GcrCollectionSortClosure *closure = self->pv->order_argument;
- const GcrCollectionRow *row_a = a;
- const GcrCollectionRow *row_b = b;
- GtkTreeIter iter_a;
- GtkTreeIter iter_b;
-
- g_assert (closure);
- g_assert (closure->sort_func);
-
- if (!gcr_collection_model_iter_for_object (self, row_a->object, &iter_a))
- g_return_val_if_reached (0);
- if (!gcr_collection_model_iter_for_object (self, row_b->object, &iter_b))
- g_return_val_if_reached (0);
-
- return (closure->sort_func) (GTK_TREE_MODEL (self),
- &iter_a, &iter_b, closure->user_data);
-}
-
-static gint
-order_sequence_by_closure_reverse (gconstpointer a,
- gconstpointer b,
- gpointer user_data)
-{
- return 0 - order_sequence_by_closure (a, b, user_data);
-}
-
-static gint
-order_sequence_as_unsorted (gconstpointer a,
- gconstpointer b,
- gpointer user_data)
-{
- const GcrCollectionRow *row_a = a;
- const GcrCollectionRow *row_b = b;
- return GPOINTER_TO_INT (row_a->object) - GPOINTER_TO_INT (row_b->object);
-}
-
-static gint
-order_sequence_as_unsorted_reverse (gconstpointer a,
- gconstpointer b,
- gpointer user_data)
-{
- const GcrCollectionRow *row_a = a;
- const GcrCollectionRow *row_b = b;
- return GPOINTER_TO_INT (row_b->object) - GPOINTER_TO_INT (row_a->object);
-}
-
-static void
-lookup_object_property (GObject *object,
- const gchar *property_name,
- GValue *value)
-{
- if (g_object_class_find_property (G_OBJECT_GET_CLASS (object), property_name))
- g_object_get_property (object, property_name, value);
-
- /* Other types have sane defaults */
- else if (G_VALUE_TYPE (value) == G_TYPE_STRING)
- g_value_set_string (value, "");
-}
-
-static gint
-order_sequence_by_property (gconstpointer a,
- gconstpointer b,
- gpointer user_data)
-{
- const GcrCollectionRow *row_a = a;
- const GcrCollectionRow *row_b = b;
- GcrCollectionModel *self = GCR_COLLECTION_MODEL (user_data);
- const GcrColumn *column = self->pv->order_argument;
- GValue value_a = { 0, };
- GValue value_b = { 0, };
- CompareValueFunc compare;
- gint ret;
-
- g_assert (column);
-
- /* Sort according to property values */
- column = &self->pv->columns[self->pv->sort_column_id];
- g_value_init (&value_a, column->property_type);
- lookup_object_property (row_a->object, column->property_name, &value_a);
- g_value_init (&value_b, column->property_type);
- lookup_object_property (row_b->object, column->property_name, &value_b);
-
- compare = lookup_compare_func (column->property_type);
- g_assert (compare != NULL);
-
- ret = (compare) (&value_a, &value_b);
-
- g_value_unset (&value_a);
- g_value_unset (&value_b);
-
- return ret;
-}
-
-static gint
-order_sequence_by_property_reverse (gconstpointer a,
- gconstpointer b,
- gpointer user_data)
-{
- return 0 - order_sequence_by_property (a, b, user_data);
-}
-
-static GHashTable*
-selected_hash_table_new (void)
-{
- return g_hash_table_new (g_direct_hash, g_direct_equal);
-}
-
-static gboolean
-sequence_iter_to_tree (GcrCollectionModel *self,
- GSequenceIter *seq,
- GtkTreeIter *iter)
-{
- GcrCollectionRow *row;
-
- g_return_val_if_fail (seq != NULL, FALSE);
-
- if (g_sequence_iter_is_end (seq))
- return FALSE;
-
- row = g_sequence_get (seq);
- g_return_val_if_fail (row != NULL && G_IS_OBJECT (row->object), FALSE);
-
- memset (iter, 0, sizeof (*iter));
- iter->stamp = COLLECTION_MODEL_STAMP;
- iter->user_data = row->object;
- iter->user_data2 = seq;
- return TRUE;
-}
-
-static GSequenceIter *
-sequence_iter_for_tree (GcrCollectionModel *self,
- GtkTreeIter *iter)
-{
- g_return_val_if_fail (iter != NULL, NULL);
- g_return_val_if_fail (iter->stamp == COLLECTION_MODEL_STAMP, NULL);
- return iter->user_data2;
-}
-
-static GtkTreePath *
-sequence_iter_to_path (GcrCollectionModel *self,
- GSequenceIter *seq)
-{
- GcrCollectionRow *row;
- GtkTreePath *path;
-
- path = gtk_tree_path_new ();
- while (seq) {
- gtk_tree_path_prepend_index (path, g_sequence_iter_get_position (seq));
- row = g_sequence_get (seq);
- seq = row->parent;
- }
- return path;
-}
-
-static GSequence *
-child_sequence_for_tree (GcrCollectionModel *self,
- GtkTreeIter *iter)
-{
- GcrCollectionRow *row;
- GSequenceIter *seq;
-
- if (iter == NULL) {
- return self->pv->root_sequence;
- } else {
- seq = sequence_iter_for_tree (self, iter);
- g_return_val_if_fail (seq != NULL, NULL);
- row = g_sequence_get (seq);
- return row->children;
- }
-}
-
-static void
-on_object_notify (GObject *object, GParamSpec *spec, GcrCollectionModel *self)
-{
- GtkTreeIter iter;
- GtkTreePath *path;
- gboolean found = FALSE;
- guint i;
-
- g_return_if_fail (spec->name);
-
- for (i = 0; i < self->pv->n_columns - 1; ++i) {
- g_assert (self->pv->columns[i].property_name);
- if (g_str_equal (self->pv->columns[i].property_name, spec->name)) {
- found = TRUE;
- break;
- }
- }
-
- /* Tell the tree view that this row changed */
- if (found) {
- if (!gcr_collection_model_iter_for_object (self, object, &iter))
- g_return_if_reached ();
- path = gtk_tree_model_get_path (GTK_TREE_MODEL (self), &iter);
- g_return_if_fail (path);
- gtk_tree_model_row_changed (GTK_TREE_MODEL (self), path, &iter);
- gtk_tree_path_free (path);
- }
-}
-
-static void
-on_object_gone (gpointer unused, GObject *was_object)
-{
- g_warning ("object contained in GcrCollection and included in GcrCollectionModel "
- "was destroyed before it was removed from the collection");
-}
-
-static void on_collection_added (GcrCollection *collection,
- GObject *object,
- gpointer user_data);
-
-static void on_collection_removed (GcrCollection *collection,
- GObject *object,
- gpointer user_data);
-
-static void add_object_to_sequence (GcrCollectionModel *self,
- GSequence *sequence,
- GSequenceIter *parent,
- GObject *object,
- gboolean emit);
-
-static void remove_object_from_sequence (GcrCollectionModel *self,
- GSequence *sequence,
- GSequenceIter *seq,
- GObject *object,
- gboolean emit);
-
-static void
-add_children_to_sequence (GcrCollectionModel *self,
- GSequence *sequence,
- GSequenceIter *parent,
- GcrCollection *collection,
- GList *children,
- GHashTable *exclude,
- gboolean emit)
-{
- GList *l;
-
- for (l = children; l; l = g_list_next (l)) {
- if (!exclude || g_hash_table_lookup (exclude, l->data) == NULL)
- add_object_to_sequence (self, sequence, parent, l->data, emit);
- }
-
- /* Now listen in for any changes */
- g_signal_connect_after (collection, "added", G_CALLBACK (on_collection_added), self);
- g_signal_connect_after (collection, "removed", G_CALLBACK (on_collection_removed), self);
-}
-
-static void
-add_object_to_sequence (GcrCollectionModel *self,
- GSequence *sequence,
- GSequenceIter *parent,
- GObject *object,
- gboolean emit)
-{
- GcrCollectionRow *row;
- GcrCollection *collection;
- GSequenceIter *seq;
- GtkTreeIter iter;
- GtkTreePath *path;
- GList *children;
-
- g_assert (GCR_IS_COLLECTION_MODEL (self));
- g_assert (G_IS_OBJECT (object));
- g_assert (self->pv->order_current);
-
- if (g_hash_table_lookup (self->pv->object_to_seq, object)) {
- g_warning ("object was already added to the GcrCollectionModel. Perhaps "
- "a loop exists in a tree structure?");
- return;
- }
-
- row = g_slice_new0 (GcrCollectionRow);
- row->object = object;
- row->parent = parent;
- row->children = NULL;
-
- seq = g_sequence_insert_sorted (sequence, row, self->pv->order_current, self);
- g_hash_table_insert (self->pv->object_to_seq, object, seq);
- g_object_weak_ref (G_OBJECT (object), (GWeakNotify)on_object_gone, self);
- g_signal_connect (object, "notify", G_CALLBACK (on_object_notify), self);
-
- if (emit) {
- if (!sequence_iter_to_tree (self, seq, &iter))
- g_assert_not_reached ();
- path = sequence_iter_to_path (self, seq);
- g_assert (path != NULL);
- gtk_tree_model_row_inserted (GTK_TREE_MODEL (self), path, &iter);
- gtk_tree_path_free (path);
- }
-
- if (self->pv->mode == GCR_COLLECTION_MODEL_TREE &&
- GCR_IS_COLLECTION (object)) {
- row->children = g_sequence_new (NULL);
- collection = GCR_COLLECTION (object);
- children = gcr_collection_get_objects (collection);
- add_children_to_sequence (self, row->children, seq,
- collection, children, NULL, emit);
- g_list_free (children);
- }
-}
-
-static void
-on_collection_added (GcrCollection *collection,
- GObject *object,
- gpointer user_data)
-{
- GcrCollectionModel *self = GCR_COLLECTION_MODEL (user_data);
- GSequence *sequence;
- GSequenceIter *parent;
- GcrCollectionRow *row;
-
- if (collection == self->pv->collection) {
- sequence = self->pv->root_sequence;
- parent = NULL;
- } else {
- parent = g_hash_table_lookup (self->pv->object_to_seq, G_OBJECT (collection));
- row = g_sequence_get (parent);
- g_assert (row->children);
- sequence = row->children;
- }
-
- add_object_to_sequence (self, sequence, parent, object, TRUE);
-}
-
-static void
-remove_children_from_sequence (GcrCollectionModel *self,
- GSequence *sequence,
- GcrCollection *collection,
- GHashTable *exclude,
- gboolean emit)
-{
- GSequenceIter *seq, *next;
- GcrCollectionRow *row;
-
- g_signal_handlers_disconnect_by_func (collection, on_collection_added, self);
- g_signal_handlers_disconnect_by_func (collection, on_collection_removed, self);
-
- for (seq = g_sequence_get_begin_iter (sequence);
- !g_sequence_iter_is_end (seq); seq = next) {
- next = g_sequence_iter_next (seq);
- row = g_sequence_get (seq);
- if (!exclude || g_hash_table_lookup (exclude, row->object) == NULL)
- remove_object_from_sequence (self, sequence, seq, row->object, emit);
- }
-}
-
-static void
-remove_object_from_sequence (GcrCollectionModel *self,
- GSequence *sequence,
- GSequenceIter *seq,
- GObject *object,
- gboolean emit)
-{
- GcrCollectionRow *row;
- GtkTreePath *path = NULL;
-
- if (emit) {
- path = sequence_iter_to_path (self, seq);
- g_assert (path != NULL);
- }
-
- row = g_sequence_get (seq);
- g_assert (row->object == object);
-
- g_object_weak_unref (object, on_object_gone, self);
- g_signal_handlers_disconnect_by_func (object, on_object_notify, self);
-
- if (row->children) {
- g_assert (self->pv->mode == GCR_COLLECTION_MODEL_TREE);
- g_assert (GCR_IS_COLLECTION (object));
- remove_children_from_sequence (self, row->children,
- GCR_COLLECTION (object), NULL, emit);
- g_assert (g_sequence_get_length (row->children) == 0);
- g_sequence_free (row->children);
- row->children = NULL;
- }
-
- if (self->pv->selected)
- g_hash_table_remove (self->pv->selected, object);
- if (!g_hash_table_remove (self->pv->object_to_seq, object))
- g_assert_not_reached ();
-
- g_sequence_remove (seq);
- g_slice_free (GcrCollectionRow, row);
-
- /* Fire signal for this removed row */
- if (path != NULL) {
- gtk_tree_model_row_deleted (GTK_TREE_MODEL (self), path);
- gtk_tree_path_free (path);
- }
-
-}
-
-static void
-on_collection_removed (GcrCollection *collection,
- GObject *object,
- gpointer user_data)
-{
- GcrCollectionModel *self = GCR_COLLECTION_MODEL (user_data);
- GSequenceIter *seq;
- GSequence *sequence;
-
- seq = g_hash_table_lookup (self->pv->object_to_seq, object);
- g_return_if_fail (seq != NULL);
-
- sequence = g_sequence_iter_get_sequence (seq);
- g_assert (sequence != NULL);
-
- remove_object_from_sequence (self, sequence, seq, object, TRUE);
-}
-
-static void
-free_owned_columns (gpointer data)
-{
- GcrColumn *columns;
- g_assert (data);
-
- /* Only the property column is in use */
- for (columns = data; columns->property_name; ++columns)
- g_free ((gchar*)columns->property_name);
- g_free (data);
-}
-
-static GtkTreeModelFlags
-gcr_collection_model_real_get_flags (GtkTreeModel *model)
-{
- return GTK_TREE_MODEL_ITERS_PERSIST;
-}
-
-static gint
-gcr_collection_model_real_get_n_columns (GtkTreeModel *model)
-{
- GcrCollectionModel *self = GCR_COLLECTION_MODEL (model);
- return self->pv->n_columns;
-}
-
-static GType
-gcr_collection_model_real_get_column_type (GtkTreeModel *model,
- gint column_id)
-{
- GcrCollectionModel *self = GCR_COLLECTION_MODEL (model);
- g_return_val_if_fail (column_id >= 0 && column_id <= self->pv->n_columns, 0);
-
- /* The last is the selected column */
- if (column_id == self->pv->n_columns)
- return G_TYPE_BOOLEAN;
-
- return self->pv->columns[column_id].column_type;
-}
-
-static gboolean
-gcr_collection_model_real_get_iter (GtkTreeModel *model,
- GtkTreeIter *iter,
- GtkTreePath *path)
-{
- GcrCollectionModel *self = GCR_COLLECTION_MODEL (model);
- const gint *indices;
- GSequence *sequence;
- GSequenceIter *seq;
- GcrCollectionRow *row;
- gint count;
- gint i;
-
- sequence = self->pv->root_sequence;
- seq = NULL;
-
- indices = gtk_tree_path_get_indices_with_depth (path, &count);
- if (count == 0)
- return FALSE;
-
- for (i = 0; i < count; i++) {
- if (!sequence)
- return FALSE;
- seq = g_sequence_get_iter_at_pos (sequence, indices[i]);
- if (g_sequence_iter_is_end (seq))
- return FALSE;
- row = g_sequence_get (seq);
- sequence = row->children;
- }
-
- return sequence_iter_to_tree (self, seq, iter);
-}
-
-static GtkTreePath*
-gcr_collection_model_real_get_path (GtkTreeModel *model,
- GtkTreeIter *iter)
-{
- GcrCollectionModel *self = GCR_COLLECTION_MODEL (model);
- GSequenceIter *seq;
-
- if (iter == NULL)
- return gtk_tree_path_new ();
-
- seq = sequence_iter_for_tree (self, iter);
- g_return_val_if_fail (seq != NULL, NULL);
- return sequence_iter_to_path (self, seq);
-}
-
-static void
-gcr_collection_model_real_get_value (GtkTreeModel *model,
- GtkTreeIter *iter,
- gint column_id,
- GValue *value)
-{
- GcrCollectionModel *self = GCR_COLLECTION_MODEL (model);
- GObject *object;
- GValue original;
- const GcrColumn *column;
- GParamSpec *spec;
-
- object = gcr_collection_model_object_for_iter (self, iter);
- g_return_if_fail (G_IS_OBJECT (object));
- g_return_if_fail (column_id >= 0 && column_id < self->pv->n_columns);
-
- /* The selected column? Last one */
- if (column_id == self->pv->n_columns - 1) {
- g_value_init (value, G_TYPE_BOOLEAN);
- g_value_set_boolean (value, gcr_collection_model_is_selected (self, iter));
- return;
- }
-
- /* Figure out which property */
- column = &self->pv->columns[column_id];
- g_assert (column->property_name);
- g_value_init (value, column->column_type);
-
- /* Lookup the property on the object */
- spec = g_object_class_find_property (G_OBJECT_GET_CLASS (object), column->property_name);
- if (spec != NULL) {
- /* A transformer is specified, or mismatched types */
- if (column->transformer || column->column_type != column->property_type) {
- memset (&original, 0, sizeof (original));
- g_value_init (&original, column->property_type);
- g_object_get_property (object, column->property_name, &original);
-
- if (column->transformer) {
- (column->transformer) (&original, value);
- } else {
- g_warning ("%s property of %s class was of type %s instead of type %s"
- " and cannot be converted due to lack of transformer",
- column->property_name, G_OBJECT_TYPE_NAME (object),
- g_type_name (column->property_type),
- g_type_name (column->column_type));
- spec = NULL;
- }
-
- /* Simple, no transformation necessary */
- } else {
- g_object_get_property (object, column->property_name, value);
- }
- }
-
- if (spec == NULL) {
-
- /* All the number types have sane defaults */
- if (column->column_type == G_TYPE_STRING)
- g_value_set_string (value, "");
- }
-}
-
-static gboolean
-gcr_collection_model_real_iter_next (GtkTreeModel *model,
- GtkTreeIter *iter)
-{
- GcrCollectionModel *self = GCR_COLLECTION_MODEL (model);
- GSequenceIter *seq = sequence_iter_for_tree (self, iter);
- g_return_val_if_fail (seq != NULL, FALSE);
- return sequence_iter_to_tree (self, g_sequence_iter_next (seq), iter);
-}
-
-static gboolean
-gcr_collection_model_real_iter_children (GtkTreeModel *model,
- GtkTreeIter *iter,
- GtkTreeIter *parent)
-{
- GcrCollectionModel *self = GCR_COLLECTION_MODEL (model);
- GSequence *sequence = child_sequence_for_tree (self, parent);
- return sequence && sequence_iter_to_tree (self, g_sequence_get_begin_iter (sequence), iter);
-}
-
-static gboolean
-gcr_collection_model_real_iter_has_child (GtkTreeModel *model,
- GtkTreeIter *iter)
-{
- GcrCollectionModel *self = GCR_COLLECTION_MODEL (model);
- GSequence *sequence = child_sequence_for_tree (self, iter);
- return sequence && !g_sequence_iter_is_end (g_sequence_get_begin_iter (sequence));
-}
-
-static gint
-gcr_collection_model_real_iter_n_children (GtkTreeModel *model,
- GtkTreeIter *iter)
-{
- GcrCollectionModel *self = GCR_COLLECTION_MODEL (model);
- GSequence *sequence = child_sequence_for_tree (self, iter);
- return sequence ? g_sequence_get_length (sequence) : 0;
-}
-
-static gboolean
-gcr_collection_model_real_iter_nth_child (GtkTreeModel *model,
- GtkTreeIter *iter,
- GtkTreeIter *parent,
- gint n)
-{
- GcrCollectionModel *self = GCR_COLLECTION_MODEL (model);
- GSequence *sequence;
- GSequenceIter *seq;
-
- sequence = child_sequence_for_tree (self, parent);
- if (sequence == NULL)
- return FALSE;
- seq = g_sequence_get_iter_at_pos (sequence, n);
- return sequence_iter_to_tree (self, seq, iter);
-}
-
-static gboolean
-gcr_collection_model_real_iter_parent (GtkTreeModel *model,
- GtkTreeIter *iter,
- GtkTreeIter *child)
-{
- GcrCollectionModel *self = GCR_COLLECTION_MODEL (model);
- GSequenceIter *seq;
- GcrCollectionRow *row;
-
- seq = sequence_iter_for_tree (self, child);
- g_return_val_if_fail (seq != NULL, FALSE);
- row = g_sequence_get (seq);
- if (row->parent == NULL)
- return FALSE;
- return sequence_iter_to_tree (self, row->parent, iter);
-}
-
-static void
-gcr_collection_model_real_ref_node (GtkTreeModel *model,
- GtkTreeIter *iter)
-{
- /* Nothing to do */
-}
-
-static void
-gcr_collection_model_real_unref_node (GtkTreeModel *model,
- GtkTreeIter *iter)
-{
- /* Nothing to do */
-}
-
-static void
-gcr_collection_model_tree_model_init (GtkTreeModelIface *iface)
-{
- iface->get_flags = gcr_collection_model_real_get_flags;
- iface->get_n_columns = gcr_collection_model_real_get_n_columns;
- iface->get_column_type = gcr_collection_model_real_get_column_type;
- iface->get_iter = gcr_collection_model_real_get_iter;
- iface->get_path = gcr_collection_model_real_get_path;
- iface->get_value = gcr_collection_model_real_get_value;
- iface->iter_next = gcr_collection_model_real_iter_next;
- iface->iter_children = gcr_collection_model_real_iter_children;
- iface->iter_has_child = gcr_collection_model_real_iter_has_child;
- iface->iter_n_children = gcr_collection_model_real_iter_n_children;
- iface->iter_nth_child = gcr_collection_model_real_iter_nth_child;
- iface->iter_parent = gcr_collection_model_real_iter_parent;
- iface->ref_node = gcr_collection_model_real_ref_node;
- iface->unref_node = gcr_collection_model_real_unref_node;
-}
-
-static void
-collection_resort_sequence (GcrCollectionModel *self,
- GSequenceIter *parent,
- GSequence *sequence)
-{
- GPtrArray *previous;
- GSequenceIter *seq, *next;
- gint *new_order;
- GtkTreePath *path;
- GtkTreeIter iter;
- GcrCollectionRow *row;
- gint index;
- gint i;
-
- /* Make note of how things stand, and at same time resort all kids */
- previous = g_ptr_array_new ();
- for (seq = g_sequence_get_begin_iter (sequence);
- !g_sequence_iter_is_end (seq); seq = next) {
- next = g_sequence_iter_next (seq);
- row = g_sequence_get (seq);
- if (row->children)
- collection_resort_sequence (self, seq, row->children);
- g_ptr_array_add (previous, row->object);
- }
-
- if (previous->len == 0) {
- g_ptr_array_free (previous, TRUE);
- return;
- }
-
- /* Actually perform the sort */
- g_sequence_sort (sequence, self->pv->order_current, self);
-
- /* Now go through and map out how things changed */
- new_order = g_new0 (gint, previous->len);
- for (i = 0; i < previous->len; i++) {
- seq = g_hash_table_lookup (self->pv->object_to_seq, previous->pdata[i]);
- g_assert (seq != NULL);
- index = g_sequence_iter_get_position (seq);
- g_assert (index >= 0 && index < previous->len);
- new_order[index] = i;
- }
-
- g_ptr_array_free (previous, TRUE);
-
- path = sequence_iter_to_path (self, parent);
- if (parent == NULL) {
- gtk_tree_model_rows_reordered (GTK_TREE_MODEL (self), path, NULL, new_order);
- } else {
- if (!sequence_iter_to_tree (self, parent, &iter))
- g_assert_not_reached ();
- gtk_tree_model_rows_reordered (GTK_TREE_MODEL (self), path, &iter, new_order);
- }
- gtk_tree_path_free (path);
- g_free (new_order);
-}
-
-static gboolean
-gcr_collection_model_get_sort_column_id (GtkTreeSortable *sortable,
- gint *sort_column_id,
- GtkSortType *order)
-{
- GcrCollectionModel *self = GCR_COLLECTION_MODEL (sortable);
-
- if (order)
- *order = self->pv->sort_order_type;
- if (sort_column_id)
- *sort_column_id = self->pv->sort_column_id;
- return (self->pv->sort_column_id != GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID &&
- self->pv->sort_column_id != GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID);
-}
-
-static void
-gcr_collection_model_set_sort_column_id (GtkTreeSortable *sortable,
- gint sort_column_id,
- GtkSortType order)
-{
- GcrCollectionModel *self = GCR_COLLECTION_MODEL (sortable);
- GCompareDataFunc func;
- gpointer argument;
- const GcrColumn *column;
- gboolean reverse;
-
- reverse = (order == GTK_SORT_DESCENDING);
-
- if (sort_column_id == GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID) {
- func = reverse ? order_sequence_as_unsorted_reverse : order_sequence_as_unsorted;
- argument = NULL;
-
- } else if (sort_column_id == GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID) {
- func = reverse ? order_sequence_by_closure_reverse : order_sequence_by_closure;
- argument = &self->pv->default_sort_closure;
-
- } else if (sort_column_id >= 0 && sort_column_id < self->pv->n_columns) {
- if (self->pv->column_sort_closures[sort_column_id].sort_func) {
- func = reverse ? order_sequence_by_closure_reverse : order_sequence_by_closure;
- argument = &self->pv->column_sort_closures[sort_column_id];
- } else {
- column = &self->pv->columns[sort_column_id];
- if (!(column->flags & GCR_COLUMN_SORTABLE))
- return;
- if (!lookup_compare_func (column->property_type)) {
- g_warning ("no sort implementation defined for type '%s' on column '%s'",
- g_type_name (column->property_type), column->property_name);
- return;
- }
-
- func = reverse ? order_sequence_by_property_reverse : order_sequence_by_property;
- argument = (gpointer)column;
- }
- } else {
- g_warning ("invalid sort_column_id passed to gtk_tree_sortable_set_sort_column_id(): %d",
- sort_column_id);
- return;
- }
-
- if (sort_column_id != self->pv->sort_column_id ||
- order != self->pv->sort_order_type) {
- self->pv->sort_column_id = sort_column_id;
- self->pv->sort_order_type = order;
- gtk_tree_sortable_sort_column_changed (sortable);
- }
-
- if (func != self->pv->order_current ||
- argument != self->pv->order_argument) {
- self->pv->order_current = func;
- self->pv->order_argument = (gpointer)argument;
- collection_resort_sequence (self, NULL, self->pv->root_sequence);
- }
-}
-
-static void
-clear_sort_closure (GcrCollectionSortClosure *closure)
-{
- if (closure->destroy_func)
- (closure->destroy_func) (closure->user_data);
- closure->sort_func = NULL;
- closure->destroy_func = NULL;
- closure->user_data = NULL;
-}
-
-static void
-set_sort_closure (GcrCollectionSortClosure *closure,
- GtkTreeIterCompareFunc func,
- gpointer data,
- GDestroyNotify destroy)
-{
- clear_sort_closure (closure);
- closure->sort_func = func;
- closure->user_data = data;
- closure->destroy_func = destroy;
-}
-
-static void
-gcr_collection_model_set_sort_func (GtkTreeSortable *sortable,
- gint sort_column_id,
- GtkTreeIterCompareFunc func,
- gpointer data,
- GDestroyNotify destroy)
-{
- GcrCollectionModel *self = GCR_COLLECTION_MODEL (sortable);
-
- g_return_if_fail (sort_column_id >= 0 && sort_column_id < self->pv->n_columns);
-
- set_sort_closure (&self->pv->column_sort_closures[sort_column_id],
- func, data, destroy);
-
- /* Resorts if necessary */
- if (self->pv->sort_column_id == sort_column_id) {
- gcr_collection_model_set_sort_column_id (sortable,
- self->pv->sort_column_id,
- self->pv->sort_order_type);
- }
-}
-
-static void
-gcr_collection_model_set_default_sort_func (GtkTreeSortable *sortable,
- GtkTreeIterCompareFunc func,
- gpointer data, GDestroyNotify destroy)
-{
- GcrCollectionModel *self = GCR_COLLECTION_MODEL (sortable);
-
- set_sort_closure (&self->pv->default_sort_closure,
- func, data, destroy);
-
- /* Resorts if necessary */
- if (self->pv->sort_column_id == GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID) {
- gcr_collection_model_set_sort_column_id (sortable,
- self->pv->sort_column_id,
- self->pv->sort_order_type);
- }
-}
-
-static gboolean
-gcr_collection_model_has_default_sort_func (GtkTreeSortable *sortable)
-{
- GcrCollectionModel *self = GCR_COLLECTION_MODEL (sortable);
-
- return (self->pv->default_sort_closure.sort_func != NULL);
-}
-
-static void
-gcr_collection_model_tree_sortable_init (GtkTreeSortableIface *iface)
-{
- iface->get_sort_column_id = gcr_collection_model_get_sort_column_id;
- iface->set_sort_column_id = gcr_collection_model_set_sort_column_id;
- iface->set_sort_func = gcr_collection_model_set_sort_func;
- iface->set_default_sort_func = gcr_collection_model_set_default_sort_func;
- iface->has_default_sort_func = gcr_collection_model_has_default_sort_func;
-}
-
-static void
-gcr_collection_model_init (GcrCollectionModel *self)
-{
- self->pv = gcr_collection_model_get_instance_private (self);
-
- self->pv->root_sequence = g_sequence_new (NULL);
- self->pv->object_to_seq = g_hash_table_new (g_direct_hash, g_direct_equal);
- self->pv->sort_column_id = GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID;
- self->pv->sort_order_type = GTK_SORT_ASCENDING;
- self->pv->order_current = order_sequence_as_unsorted;
-}
-
-static void
-gcr_collection_model_set_property (GObject *object, guint prop_id,
- const GValue *value, GParamSpec *pspec)
-{
- GcrCollectionModel *self = GCR_COLLECTION_MODEL (object);
- GcrColumn *columns;
-
- switch (prop_id) {
- case PROP_MODE:
- self->pv->mode = g_value_get_enum (value);
- break;
- case PROP_COLLECTION:
- gcr_collection_model_set_collection (self, g_value_get_object (value));
- break;
- case PROP_COLUMNS:
- columns = g_value_get_pointer (value);
- if (columns)
- gcr_collection_model_set_columns (self, columns);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-gcr_collection_model_get_property (GObject *object, guint prop_id,
- GValue *value, GParamSpec *pspec)
-{
- GcrCollectionModel *self = GCR_COLLECTION_MODEL (object);
-
- switch (prop_id) {
- case PROP_MODE:
- g_value_set_enum (value, self->pv->mode);
- break;
- case PROP_COLLECTION:
- g_value_set_object (value, self->pv->collection);
- break;
- case PROP_COLUMNS:
- g_value_set_pointer (value, (gpointer)self->pv->columns);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-gcr_collection_model_dispose (GObject *object)
-{
- GcrCollectionModel *self = GCR_COLLECTION_MODEL (object);
-
- /* Disconnect from all rows */
- if (self->pv->collection) {
- remove_children_from_sequence (self, self->pv->root_sequence,
- self->pv->collection, NULL, FALSE);
- g_object_unref (self->pv->collection);
- self->pv->collection = NULL;
- }
-
- G_OBJECT_CLASS (gcr_collection_model_parent_class)->dispose (object);
-}
-
-static void
-gcr_collection_model_finalize (GObject *object)
-{
- GcrCollectionModel *self = GCR_COLLECTION_MODEL (object);
- guint i;
-
- g_assert (!self->pv->collection);
-
- g_assert (g_sequence_get_length (self->pv->root_sequence) == 0);
- g_sequence_free (self->pv->root_sequence);
- g_assert (g_hash_table_size (self->pv->object_to_seq) == 0);
- g_hash_table_destroy (self->pv->object_to_seq);
-
- if (self->pv->selected) {
- g_assert (g_hash_table_size (self->pv->selected) == 0);
- g_hash_table_destroy (self->pv->selected);
- self->pv->selected = NULL;
- }
-
- self->pv->columns = NULL;
- for (i = 0; i < self->pv->n_columns; i++)
- clear_sort_closure (&self->pv->column_sort_closures[i]);
- g_free (self->pv->column_sort_closures);
- clear_sort_closure (&self->pv->default_sort_closure);
-
- G_OBJECT_CLASS (gcr_collection_model_parent_class)->finalize (object);
-}
-
-static void
-gcr_collection_model_class_init (GcrCollectionModelClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
- gcr_collection_model_parent_class = g_type_class_peek_parent (klass);
-
- gobject_class->dispose = gcr_collection_model_dispose;
- gobject_class->finalize = gcr_collection_model_finalize;
- gobject_class->set_property = gcr_collection_model_set_property;
- gobject_class->get_property = gcr_collection_model_get_property;
-
- g_object_class_install_property (gobject_class, PROP_MODE,
- g_param_spec_enum ("mode", "Mode", "Tree or list mode",
- GCR_TYPE_COLLECTION_MODEL_MODE, GCR_COLLECTION_MODEL_TREE,
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
-
- g_object_class_install_property (gobject_class, PROP_COLLECTION,
- g_param_spec_object ("collection", "Object Collection", "Collection to get objects from",
- GCR_TYPE_COLLECTION,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
- g_object_class_install_property (gobject_class, PROP_COLUMNS,
- g_param_spec_pointer ("columns", "Columns", "Columns for the model",
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
-}
-
-/**
- * gcr_collection_model_new: (skip)
- * @collection: the collection to represent
- * @mode: whether list or tree mode
- * @...: the column names and types
- *
- * Create a new #GcrCollectionModel. The variable argument list should contain
- * pairs of property names, and #GType values. The variable argument list should
- * be terminated with %NULL.
- *
- * Returns: (transfer full): a newly allocated model, which should be released
- * with g_object_unref().
- */
-GcrCollectionModel*
-gcr_collection_model_new (GcrCollection *collection,
- GcrCollectionModelMode mode,
- ...)
-{
- GcrColumn column;
- GcrCollectionModel *self;
- const gchar *arg;
- GArray *array;
- va_list va;
-
- /* With a null terminator */
- array = g_array_new (TRUE, TRUE, sizeof (GcrColumn));
-
- va_start (va, mode);
- while ((arg = va_arg (va, const gchar*)) != NULL) {
- memset (&column, 0, sizeof (column));
- column.property_name = g_strdup (arg);
- column.property_type = va_arg (va, GType);
- column.column_type = column.property_type;
- g_array_append_val (array, column);
- }
- va_end (va);
-
- self = gcr_collection_model_new_full (collection, mode, (GcrColumn*)array->data);
- g_object_set_data_full (G_OBJECT (self), "gcr_collection_model_new",
- g_array_free (array, FALSE), free_owned_columns);
- return self;
-}
-
-/**
- * gcr_collection_model_new_full: (skip)
- * @collection: the collection to represent
- * @mode: whether list or tree mode
- * @columns: the columns the model should contain
- *
- * Create a new #GcrCollectionModel.
- *
- * Returns: (transfer full): a newly allocated model, which should be released
- * with g_object_unref()
- */
-GcrCollectionModel*
-gcr_collection_model_new_full (GcrCollection *collection,
- GcrCollectionModelMode mode,
- const GcrColumn *columns)
-{
- GcrCollectionModel *self = g_object_new (GCR_TYPE_COLLECTION_MODEL,
- "collection", collection,
- "mode", mode,
- NULL);
- gcr_collection_model_set_columns (self, columns);
- return self;
-}
-
-/**
- * gcr_collection_model_set_columns: (skip)
- * @self: The model
- * @columns: The columns the model should contain
- *
- * Set the columns that the model should contain. @columns is an array of
- * #GcrColumn structures, with the last one containing %NULL for all values.
- *
- * This function can only be called once, and only if the model was not created
- * without a set of columns. This function cannot be called after the model
- * has been added to a view.
- *
- * The columns are accessed as static data. They should continue to remain
- * in memory for longer than the GcrCollectionModel object.
- *
- * Returns: The number of columns
- */
-guint
-gcr_collection_model_set_columns (GcrCollectionModel *self,
- const GcrColumn *columns)
-{
- const GcrColumn *col;
- guint n_columns;
-
- g_return_val_if_fail (GCR_IS_COLLECTION_MODEL (self), 0);
- g_return_val_if_fail (columns, 0);
- g_return_val_if_fail (self->pv->n_columns == 0, 0);
-
- /* Count the number of columns, extra column for selected */
- for (col = columns, n_columns = 1; col->property_name; ++col)
- ++n_columns;
-
- /* We expect the columns to stay around */
- self->pv->columns = columns;
- self->pv->n_columns = n_columns;
- self->pv->column_sort_closures = g_new0 (GcrCollectionSortClosure, self->pv->n_columns);
-
- return n_columns - 1;
-}
-
-/**
- * gcr_collection_model_get_collection:
- * @self: a collection model
- *
- * Get the collection which this model represents
- *
- * Returns: (transfer none): the collection, owned by the model
- */
-GcrCollection *
-gcr_collection_model_get_collection (GcrCollectionModel *self)
-{
- g_return_val_if_fail (GCR_IS_COLLECTION_MODEL (self), NULL);
- return self->pv->collection;
-}
-
-/**
- * gcr_collection_model_set_collection:
- * @self: a collection model
- * @collection: (nullable): the collection or %NULL
- *
- * Set the collection which this model represents
- */
-void
-gcr_collection_model_set_collection (GcrCollectionModel *self,
- GcrCollection *collection)
-{
- GcrCollection *previous;
- GHashTable *exclude;
- GList *children = NULL;
- GList *l;
-
- g_return_if_fail (GCR_IS_COLLECTION_MODEL (self));
- g_return_if_fail (collection == NULL || GCR_IS_COLLECTION (collection));
-
- if (collection == self->pv->collection)
- return;
-
- if (collection)
- g_object_ref (collection);
- previous = self->pv->collection;
- self->pv->collection = collection;
-
- if (collection)
- children = gcr_collection_get_objects (collection);
-
- if (previous) {
- exclude = g_hash_table_new (g_direct_hash, g_direct_equal);
- for (l = children; l != NULL; l = g_list_next (l))
- g_hash_table_insert (exclude, l->data, l->data);
-
- remove_children_from_sequence (self, self->pv->root_sequence,
- previous, exclude, TRUE);
-
- g_hash_table_destroy (exclude);
- g_object_unref (previous);
- }
-
- if (collection) {
- add_children_to_sequence (self, self->pv->root_sequence,
- NULL, collection, children,
- self->pv->object_to_seq, TRUE);
- g_list_free (children);
- }
-
- g_object_notify (G_OBJECT (self), "collection");
-}
-
-/**
- * gcr_collection_model_object_for_iter:
- * @self: The model
- * @iter: The row
- *
- * Get the object that is represented by the given row in the model.
- *
- * Returns: (transfer none): The object, owned by the model.
- */
-GObject *
-gcr_collection_model_object_for_iter (GcrCollectionModel *self, const GtkTreeIter *iter)
-{
- g_return_val_if_fail (GCR_IS_COLLECTION_MODEL (self), NULL);
- g_return_val_if_fail (iter != NULL, NULL);
- g_return_val_if_fail (iter->stamp == COLLECTION_MODEL_STAMP, NULL);
- g_return_val_if_fail (G_IS_OBJECT (iter->user_data), NULL);
-
- return G_OBJECT (iter->user_data);
-}
-
-/**
- * gcr_collection_model_iter_for_object:
- * @self: The model
- * @object: The object
- * @iter: The row for the object
- *
- * Set @iter to the row for the given object. If the object is not in this
- * model, then %FALSE will be returned.
- *
- * Returns: %TRUE if the object was present.
- */
-gboolean
-gcr_collection_model_iter_for_object (GcrCollectionModel *self, GObject *object,
- GtkTreeIter *iter)
-{
- GSequenceIter *seq;
-
- g_return_val_if_fail (GCR_IS_COLLECTION_MODEL (self), FALSE);
- g_return_val_if_fail (G_IS_OBJECT (object), FALSE);
- g_return_val_if_fail (iter != NULL, FALSE);
-
- seq = g_hash_table_lookup (self->pv->object_to_seq, object);
- if (seq == NULL)
- return FALSE;
-
- return sequence_iter_to_tree (self, seq, iter);
-}
-
-/**
- * gcr_collection_model_column_for_selected:
- * @self: The model
- *
- * Get the column identifier for the column that contains the values
- * of the selected state.
- *
- * Returns: The column identifier.
- */
-gint
-gcr_collection_model_column_for_selected (GcrCollectionModel *self)
-{
- g_return_val_if_fail (GCR_IS_COLLECTION_MODEL (self), 0);
- g_assert (self->pv->n_columns > 0);
- return self->pv->n_columns - 1;
-}
-
-/**
- * gcr_collection_model_toggle_selected:
- * @self: The model
- * @iter: The row
- *
- * Toggle the selected state of a given row.
- */
-void
-gcr_collection_model_toggle_selected (GcrCollectionModel *self, GtkTreeIter *iter)
-{
- GObject *object;
-
- g_return_if_fail (GCR_IS_COLLECTION_MODEL (self));
-
- object = gcr_collection_model_object_for_iter (self, iter);
- g_return_if_fail (G_IS_OBJECT (object));
-
- if (!self->pv->selected)
- self->pv->selected = selected_hash_table_new ();
-
- if (g_hash_table_lookup (self->pv->selected, object))
- g_hash_table_remove (self->pv->selected, object);
- else
- g_hash_table_insert (self->pv->selected, object, object);
-}
-
-/**
- * gcr_collection_model_change_selected:
- * @self: The model
- * @iter: The row
- * @selected: Whether the row should be selected or not.
- *
- * Set whether a given row is toggled selected or not.
- */
-void
-gcr_collection_model_change_selected (GcrCollectionModel *self, GtkTreeIter *iter, gboolean selected)
-{
- GtkTreePath *path;
- GObject *object;
-
- g_return_if_fail (GCR_IS_COLLECTION_MODEL (self));
-
- object = gcr_collection_model_object_for_iter (self, iter);
- g_return_if_fail (G_IS_OBJECT (object));
-
- if (!self->pv->selected)
- self->pv->selected = g_hash_table_new (g_direct_hash, g_direct_equal);
-
- if (selected)
- g_hash_table_insert (self->pv->selected, object, object);
- else
- g_hash_table_remove (self->pv->selected, object);
-
- /* Tell the view that this row changed */
- path = gtk_tree_model_get_path (GTK_TREE_MODEL (self), iter);
- g_return_if_fail (path);
- gtk_tree_model_row_changed (GTK_TREE_MODEL (self), path, iter);
- gtk_tree_path_free (path);
-}
-
-/**
- * gcr_collection_model_is_selected:
- * @self: The model
- * @iter: The row
- *
- * Check whether a given row has been toggled as selected.
- *
- * Returns: Whether the row has been selected.
- */
-gboolean
-gcr_collection_model_is_selected (GcrCollectionModel *self, GtkTreeIter *iter)
-{
- GObject *object;
-
- g_return_val_if_fail (GCR_IS_COLLECTION_MODEL (self), FALSE);
-
- object = gcr_collection_model_object_for_iter (self, iter);
- g_return_val_if_fail (G_IS_OBJECT (object), FALSE);
-
- if (!self->pv->selected)
- return FALSE;
-
- return g_hash_table_lookup (self->pv->selected, object) ? TRUE : FALSE;
-}
-
-/**
- * gcr_collection_model_get_selected_objects:
- * @self: the collection model
- *
- * Get a list of checked/selected objects.
- *
- * Returns: (transfer container) (element-type GObject.Object): a list of selected
- * objects, which should be freed with g_list_free()
- */
-GList *
-gcr_collection_model_get_selected_objects (GcrCollectionModel *self)
-{
- GHashTableIter iter;
- GList *result = NULL;
- gpointer key;
-
- g_return_val_if_fail (GCR_IS_COLLECTION_MODEL (self), NULL);
-
- if (!self->pv->selected)
- return NULL;
-
- g_hash_table_iter_init (&iter, self->pv->selected);
- while (g_hash_table_iter_next (&iter, &key, NULL))
- result = g_list_prepend (result, key);
- return result;
-}
-
-/**
- * gcr_collection_model_set_selected_objects:
- * @self: the collection model
- * @selected: (element-type GObject.Object): a list of objects to select
- *
- * Set the checked/selected objects.
- */
-void
-gcr_collection_model_set_selected_objects (GcrCollectionModel *self,
- GList *selected)
-{
- GHashTable *newly_selected;
- GList *old_selection;
- GtkTreeIter iter;
- GList *l;
-
- old_selection = gcr_collection_model_get_selected_objects (self);
- newly_selected = selected_hash_table_new ();
-
- /* Select all the objects in selected which aren't already selected */
- for (l = selected; l; l = g_list_next (l)) {
- if (!self->pv->selected || !g_hash_table_lookup (self->pv->selected, l->data)) {
- if (!gcr_collection_model_iter_for_object (self, l->data, &iter))
- g_return_if_reached ();
- gcr_collection_model_change_selected (self, &iter, TRUE);
- }
-
- /* Note that we've seen this one */
- g_hash_table_insert (newly_selected, l->data, l->data);
- }
-
- /* Unselect all the objects which aren't supposed to be selected */
- for (l = old_selection; l; l = g_list_next (l)) {
- if (!g_hash_table_lookup (newly_selected, l->data)) {
- if (!gcr_collection_model_iter_for_object (self, l->data, &iter))
- g_return_if_reached ();
- gcr_collection_model_change_selected (self, &iter, FALSE);
- }
- }
-
- g_list_free (old_selection);
- g_hash_table_destroy (newly_selected);
-}
diff --git a/gcr-gtk3/gcr-collection-model.h b/gcr-gtk3/gcr-collection-model.h
deleted file mode 100644
index a202046..0000000
--- a/gcr-gtk3/gcr-collection-model.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2010 Stefan Walter
- * Copyright (C) 2011 Collabora Ltd.
- *
- * 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/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#ifndef __GCR_COLLECTION_MODEL_H__
-#define __GCR_COLLECTION_MODEL_H__
-
-#include <gtk/gtk.h>
-
-#include "gcr/gcr-collection.h"
-#include "gcr/gcr-column.h"
-
-typedef enum {
- GCR_COLLECTION_MODEL_LIST = 0,
- GCR_COLLECTION_MODEL_TREE
-} GcrCollectionModelMode;
-
-#define GCR_TYPE_COLLECTION_MODEL (gcr_collection_model_get_type ())
-#define GCR_COLLECTION_MODEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_COLLECTION_MODEL, GcrCollectionModel))
-#define GCR_COLLECTION_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_COLLECTION_MODEL, GcrCollectionModelClass))
-#define GCR_IS_COLLECTION_MODEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_COLLECTION_MODEL))
-#define GCR_IS_COLLECTION_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_COLLECTION_MODEL))
-#define GCR_COLLECTION_MODEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_COLLECTION_MODEL, GcrCollectionModelClass))
-
-typedef struct _GcrCollectionModel GcrCollectionModel;
-typedef struct _GcrCollectionModelClass GcrCollectionModelClass;
-typedef struct _GcrCollectionModelPrivate GcrCollectionModelPrivate;
-
-struct _GcrCollectionModel {
- GObject parent;
-
- /*< private >*/
- GcrCollectionModelPrivate *pv;
-};
-
-struct _GcrCollectionModelClass {
- GObjectClass parent_class;
-};
-
-GType gcr_collection_model_get_type (void);
-
-GcrCollectionModel* gcr_collection_model_new (GcrCollection *collection,
- GcrCollectionModelMode mode,
- ...) G_GNUC_NULL_TERMINATED;
-
-GcrCollectionModel* gcr_collection_model_new_full (GcrCollection *collection,
- GcrCollectionModelMode mode,
- const GcrColumn *columns);
-
-guint gcr_collection_model_set_columns (GcrCollectionModel *self,
- const GcrColumn *columns);
-
-GcrCollection * gcr_collection_model_get_collection (GcrCollectionModel *self);
-
-void gcr_collection_model_set_collection (GcrCollectionModel *self,
- GcrCollection *collection);
-
-GObject* gcr_collection_model_object_for_iter (GcrCollectionModel *self,
- const GtkTreeIter *iter);
-
-gboolean gcr_collection_model_iter_for_object (GcrCollectionModel *self,
- GObject *object,
- GtkTreeIter *iter);
-
-gint gcr_collection_model_column_for_selected (GcrCollectionModel *self);
-
-void gcr_collection_model_toggle_selected (GcrCollectionModel *self,
- GtkTreeIter *iter);
-
-void gcr_collection_model_change_selected (GcrCollectionModel *self,
- GtkTreeIter *iter,
- gboolean selected);
-
-gboolean gcr_collection_model_is_selected (GcrCollectionModel *self,
- GtkTreeIter *iter);
-
-GList* gcr_collection_model_get_selected_objects (GcrCollectionModel *self);
-
-void gcr_collection_model_set_selected_objects (GcrCollectionModel *self,
- GList *selected);
-
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrCollectionModel, g_object_unref)
-
-#endif /* __GCR_COLLECTION_MODEL_H__ */
diff --git a/gcr-gtk3/gcr-combo-selector.c b/gcr-gtk3/gcr-combo-selector.c
deleted file mode 100644
index cac6419..0000000
--- a/gcr-gtk3/gcr-combo-selector.c
+++ /dev/null
@@ -1,250 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2010 Stefan Walter
- *
- * 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 "config.h"
-
-#include "gcr/gcr-internal.h"
-
-#include "gcr-collection-model.h"
-#include "gcr-combo-selector.h"
-
-#include <glib/gi18n-lib.h>
-
-#include <string.h>
-
-/**
- * GcrComboSelector:
- *
- * A widget that can be used to select a certificate or key. It allows
- * the user to select one object from the selector at a time.
- */
-
-enum {
- PROP_0,
- PROP_COLLECTION
-};
-
-struct _GcrComboSelectorPrivate {
- GcrCollection *collection;
- GcrCollectionModel *model;
-};
-
-G_DEFINE_TYPE_WITH_PRIVATE (GcrComboSelector, gcr_combo_selector, GTK_TYPE_COMBO_BOX);
-
-/* -----------------------------------------------------------------------------
- * OBJECT
- */
-
-static GObject*
-gcr_combo_selector_constructor (GType type, guint n_props, GObjectConstructParam *props)
-{
- GcrComboSelector *self = GCR_COMBO_SELECTOR (G_OBJECT_CLASS (gcr_combo_selector_parent_class)->constructor(type, n_props, props));
- GtkCellRenderer *cell;
-
- g_return_val_if_fail (self, NULL);
-
- self->pv->model = gcr_collection_model_new (self->pv->collection,
- GCR_COLLECTION_MODEL_LIST,
- "icon", G_TYPE_ICON,
- "markup", G_TYPE_STRING,
- NULL);
-
- gtk_combo_box_set_model (GTK_COMBO_BOX (self), GTK_TREE_MODEL (self->pv->model));
-
- /* The icon */
- cell = gtk_cell_renderer_pixbuf_new ();
- g_object_set (cell, "stock-size", GTK_ICON_SIZE_DND, NULL);
- gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (self), cell, FALSE);
- gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (self), cell, "gicon", 0);
-
- /* The markup */
- cell = gtk_cell_renderer_text_new ();
- gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (self), cell, TRUE);
- gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (self), cell, "markup", 1);
-
- return G_OBJECT (self);
-}
-
-static void
-gcr_combo_selector_init (GcrComboSelector *self)
-{
- self->pv = gcr_combo_selector_get_instance_private (self);
-}
-
-static void
-gcr_combo_selector_dispose (GObject *obj)
-{
- GcrComboSelector *self = GCR_COMBO_SELECTOR (obj);
-
- if (self->pv->model)
- g_object_unref (self->pv->model);
- self->pv->model = NULL;
-
- if (self->pv->collection)
- g_object_unref (self->pv->collection);
- self->pv->collection = NULL;
-
- G_OBJECT_CLASS (gcr_combo_selector_parent_class)->dispose (obj);
-}
-
-static void
-gcr_combo_selector_finalize (GObject *obj)
-{
- GcrComboSelector *self = GCR_COMBO_SELECTOR (obj);
-
- g_assert (!self->pv->collection);
- g_assert (!self->pv->model);
-
- G_OBJECT_CLASS (gcr_combo_selector_parent_class)->finalize (obj);
-}
-
-static void
-gcr_combo_selector_set_property (GObject *obj, guint prop_id, const GValue *value,
- GParamSpec *pspec)
-{
- GcrComboSelector *self = GCR_COMBO_SELECTOR (obj);
-
- switch (prop_id) {
- case PROP_COLLECTION:
- g_return_if_fail (!self->pv->collection);
- self->pv->collection = g_value_dup_object (value);
- g_return_if_fail (self->pv->collection);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-gcr_combo_selector_get_property (GObject *obj, guint prop_id, GValue *value,
- GParamSpec *pspec)
-{
- GcrComboSelector *self = GCR_COMBO_SELECTOR (obj);
-
- switch (prop_id) {
- case PROP_COLLECTION:
- g_value_set_object (value, gcr_combo_selector_get_collection (self));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-gcr_combo_selector_class_init (GcrComboSelectorClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-
- gobject_class->constructor = gcr_combo_selector_constructor;
- gobject_class->dispose = gcr_combo_selector_dispose;
- gobject_class->finalize = gcr_combo_selector_finalize;
- gobject_class->set_property = gcr_combo_selector_set_property;
- gobject_class->get_property = gcr_combo_selector_get_property;
-
- /**
- * GcrComboSelector:collection:
- *
- * The collection which contains the objects to display in the selector.
- */
- g_object_class_install_property (gobject_class, PROP_COLLECTION,
- g_param_spec_object ("collection", "Collection", "Collection to select from",
- GCR_TYPE_COLLECTION,
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
-}
-
-/* -----------------------------------------------------------------------------
- * PUBLIC
- */
-
-/**
- * gcr_combo_selector_new:
- * @collection: The collection that contains the objects to display
- *
- * Create a new #GcrTreeSelector.
- *
- * Returns: A newly allocated selector, which should be released with
- * g_object_unref().
- */
-GcrComboSelector*
-gcr_combo_selector_new (GcrCollection *collection)
-{
- return g_object_new (GCR_TYPE_COMBO_SELECTOR,
- "collection", collection,
- NULL);
-}
-
-/**
- * gcr_combo_selector_get_collection:
- * @self: The selector
- *
- * Get the collection that this selector is displaying objects from.
- *
- * Returns: (transfer none): The collection, owned by the selector.
- */
-GcrCollection *
-gcr_combo_selector_get_collection (GcrComboSelector *self)
-{
- g_return_val_if_fail (GCR_IS_COMBO_SELECTOR (self), NULL);
- return self->pv->collection;
-}
-
-/**
- * gcr_combo_selector_get_selected:
- * @self: The selector
- *
- * Get the selected object in the selector, or %NULL if nothing selected.
- *
- * Returns: (transfer none): the selected object, owned by the selector, or %NULL
- */
-GObject *
-gcr_combo_selector_get_selected (GcrComboSelector *self)
-{
- GtkTreeIter iter;
-
- g_return_val_if_fail (GCR_IS_COMBO_SELECTOR (self), NULL);
- gtk_combo_box_get_active_iter (GTK_COMBO_BOX (self), &iter);
-
- return gcr_collection_model_object_for_iter (self->pv->model, &iter);
-}
-
-/**
- * gcr_combo_selector_set_selected:
- * @self: The selector
- * @selected: (nullable): the object to select or %NULL
- *
- * Set the currently selected object in the selector, or clear the selection
- * if selected is set to %NULL.
- */
-void
-gcr_combo_selector_set_selected (GcrComboSelector *self, GObject *selected)
-{
- GtkTreeIter iter;
-
- g_return_if_fail (GCR_IS_COMBO_SELECTOR (self));
-
- if (selected) {
- if (!gcr_collection_model_iter_for_object (self->pv->model, selected, &iter))
- g_return_if_reached ();
- gtk_combo_box_set_active_iter (GTK_COMBO_BOX (self), &iter);
- } else {
- gtk_combo_box_set_active_iter (GTK_COMBO_BOX (self), NULL);
- }
-}
diff --git a/gcr-gtk3/gcr-combo-selector.h b/gcr-gtk3/gcr-combo-selector.h
deleted file mode 100644
index e46ef8a..0000000
--- a/gcr-gtk3/gcr-combo-selector.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2010 Stefan Walter
- *
- * 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_COMBO_SELECTOR_H__
-#define __GCR_COMBO_SELECTOR_H__
-
-#include "gcr/gcr-types.h"
-
-#include <gtk/gtk.h>
-
-G_BEGIN_DECLS
-
-#define GCR_TYPE_COMBO_SELECTOR (gcr_combo_selector_get_type ())
-#define GCR_COMBO_SELECTOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_COMBO_SELECTOR, GcrComboSelector))
-#define GCR_COMBO_SELECTOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_COMBO_SELECTOR, GcrComboSelectorClass))
-#define GCR_IS_COMBO_SELECTOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_COMBO_SELECTOR))
-#define GCR_IS_COMBO_SELECTOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_COMBO_SELECTOR))
-#define GCR_COMBO_SELECTOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_COMBO_SELECTOR, GcrComboSelectorClass))
-
-typedef struct _GcrComboSelector GcrComboSelector;
-typedef struct _GcrComboSelectorClass GcrComboSelectorClass;
-typedef struct _GcrComboSelectorPrivate GcrComboSelectorPrivate;
-
-struct _GcrComboSelector {
- GtkComboBox parent;
-
- /*< private >*/
- GcrComboSelectorPrivate *pv;
-};
-
-struct _GcrComboSelectorClass {
- /*< private >*/
- GtkComboBoxClass parent_class;
-};
-
-GType gcr_combo_selector_get_type (void);
-
-GcrComboSelector* gcr_combo_selector_new (GcrCollection *collection);
-
-GcrCollection* gcr_combo_selector_get_collection (GcrComboSelector *self);
-
-GObject* gcr_combo_selector_get_selected (GcrComboSelector *self);
-
-void gcr_combo_selector_set_selected (GcrComboSelector *self,
- GObject *selected);
-
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrComboSelector, g_object_unref)
-
-G_END_DECLS
-
-#endif /* __GCR_COMBO_SELECTOR_H__ */
diff --git a/gcr-gtk3/gcr-crypto-types.xml b/gcr-gtk3/gcr-crypto-types.xml
index 4b5037b..2f402c9 100644
--- a/gcr-gtk3/gcr-crypto-types.xml
+++ b/gcr-gtk3/gcr-crypto-types.xml
@@ -166,3 +166,4 @@
</magic>
</mime-type>
</mime-info>
+
diff --git a/gcr-gtk3/gcr-dialog-util.c b/gcr-gtk3/gcr-dialog-util.c
deleted file mode 100644
index e9c7fa0..0000000
--- a/gcr-gtk3/gcr-dialog-util.c
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2011 Collabora Ltd
- *
- * 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/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#include "config.h"
-
-#include "gcr-dialog-util.h"
-
-#include <string.h>
-
-typedef struct {
- GtkDialog *dialog;
- gboolean was_modal;
- gboolean destroyed;
- gulong response_sig;
- gulong unmap_sig;
- gulong delete_sig;
- gulong destroy_sig;
-} DialogRunClosure;
-
-static void
-dialog_run_closure_free (gpointer data)
-{
- DialogRunClosure *closure = data;
- g_object_unref (closure->dialog);
- g_assert (closure->response_sig == 0);
- g_assert (closure->unmap_sig == 0);
- g_assert (closure->delete_sig == 0);
- g_assert (closure->destroy_sig == 0);
- g_free (closure);
-}
-
-static void
-complete_task (GTask *task, int response_id)
-{
- DialogRunClosure *closure = g_task_get_task_data (task);
-
- g_object_ref (task);
-
- if (!closure->destroyed) {
- if (!closure->was_modal)
- gtk_window_set_modal (GTK_WINDOW (closure->dialog), FALSE);
-
- g_signal_handler_disconnect (closure->dialog, closure->response_sig);
- closure->response_sig = 0;
- g_signal_handler_disconnect (closure->dialog, closure->unmap_sig);
- closure->unmap_sig = 0;
- g_signal_handler_disconnect (closure->dialog, closure->delete_sig);
- closure->delete_sig = 0;
- g_signal_handler_disconnect (closure->dialog, closure->destroy_sig);
- closure->destroy_sig = 0;
- }
-
- g_task_return_int (task, response_id);
- g_clear_object (&task);
-}
-
-static void
-on_dialog_unmap (GtkDialog *dialog,
- gpointer user_data)
-{
- GTask *task = G_TASK (user_data);
-
- complete_task (task, GTK_RESPONSE_NONE);
-}
-
-static void
-on_dialog_response (GtkDialog *dialog,
- gint response_id,
- gpointer user_data)
-{
- GTask *task = G_TASK (user_data);
- complete_task (task, response_id);
-}
-
-static gint
-on_dialog_delete (GtkDialog *dialog,
- GdkEventAny *event,
- gpointer user_data)
-{
- GTask *task = G_TASK (user_data);
- complete_task (task, GTK_RESPONSE_NONE);
- return TRUE; /* Do not destroy */
-}
-
-static void
-on_dialog_destroy (GtkDialog *dialog,
- gpointer user_data)
-{
- GTask *task = G_TASK (user_data);
- DialogRunClosure *closure = g_task_get_task_data (task);
-
- /* complete will be called by run_unmap_handler */
- closure->destroyed = TRUE;
-}
-
-void
-_gcr_dialog_util_run_async (GtkDialog *dialog,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data)
-{
- GTask *task;
- DialogRunClosure *closure;
-
- g_return_if_fail (GTK_IS_DIALOG (dialog));
- g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
-
- task = g_task_new (dialog, cancellable, callback, user_data);
- g_task_set_source_tag (task, _gcr_dialog_util_run_async);
-
- closure = g_new0 (DialogRunClosure, 1);
- closure->dialog = g_object_ref (dialog);
- closure->was_modal = gtk_window_get_modal (GTK_WINDOW (dialog));
- if (!closure->was_modal)
- gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
-
- if (!gtk_widget_get_visible (GTK_WIDGET (dialog)))
- gtk_widget_show (GTK_WIDGET (dialog));
-
- g_task_set_task_data (task, closure, dialog_run_closure_free);
-
- closure->response_sig = g_signal_connect_data (dialog, "response",
- G_CALLBACK (on_dialog_response),
- g_object_ref (task),
- (GClosureNotify)g_object_unref, 0);
-
- closure->unmap_sig = g_signal_connect_data (dialog, "unmap",
- G_CALLBACK (on_dialog_unmap),
- g_object_ref (task),
- (GClosureNotify)g_object_unref, 0);
-
- closure->delete_sig = g_signal_connect_data (dialog, "delete-event",
- G_CALLBACK (on_dialog_delete),
- g_object_ref (task),
- (GClosureNotify)g_object_unref, 0);
-
- closure->destroy_sig = g_signal_connect_data (dialog, "destroy",
- G_CALLBACK (on_dialog_destroy),
- g_object_ref (task),
- (GClosureNotify)g_object_unref, 0);
-
- g_clear_object (&task);
-}
-
-
-gint
-_gcr_dialog_util_run_finish (GtkDialog *dialog,
- GAsyncResult *result)
-{
- g_return_val_if_fail (g_task_is_valid (result, dialog), GTK_RESPONSE_NONE);
-
- return g_task_propagate_int (G_TASK (result), NULL);
-}
diff --git a/gcr-gtk3/gcr-dialog-util.h b/gcr-gtk3/gcr-dialog-util.h
deleted file mode 100644
index b40b14c..0000000
--- a/gcr-gtk3/gcr-dialog-util.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2011 Collabora Ltd.
- *
- * 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/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#ifndef GCR_DIALOG_UTIL_H
-#define GCR_DIALOG_UTIL_H
-
-#include <gtk/gtk.h>
-#include <gio/gio.h>
-
-G_BEGIN_DECLS
-
-void _gcr_dialog_util_run_async (GtkDialog *dialog,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data);
-
-gint _gcr_dialog_util_run_finish (GtkDialog *dialog,
- GAsyncResult *result);
-
-G_END_DECLS
-
-#endif /* __GCR_TOKEN_MANAGER_H__ */
diff --git a/gcr-gtk3/gcr-display-scrolled.c b/gcr-gtk3/gcr-display-scrolled.c
deleted file mode 100644
index 964acee..0000000
--- a/gcr-gtk3/gcr-display-scrolled.c
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Copyright (C) 2011 Collabora Ltd.
- *
- * 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/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-
-#include "config.h"
-
-#include "gcr-display-scrolled.h"
-#include "gcr-viewer.h"
-
-static void _gcr_display_scrolled_viewer_iface (GcrViewerIface *iface);
-
-struct _GcrDisplayScrolledPrivate {
- GcrViewer *internal;
-};
-
-G_DEFINE_TYPE_WITH_CODE (GcrDisplayScrolled, _gcr_display_scrolled, GTK_TYPE_SCROLLED_WINDOW,
- G_ADD_PRIVATE (GcrDisplayScrolled);
- G_IMPLEMENT_INTERFACE (GCR_TYPE_VIEWER, _gcr_display_scrolled_viewer_iface));
-
-/* -----------------------------------------------------------------------------
- * INTERNAL
- */
-
-/* -----------------------------------------------------------------------------
- * OBJECT
- */
-
-static void
-_gcr_display_scrolled_init (GcrDisplayScrolled *self)
-{
- self->pv = _gcr_display_scrolled_get_instance_private (self);
- self->pv->internal = gcr_viewer_new ();
-}
-
-static void
-_gcr_display_scrolled_constructed (GObject *object)
-{
- GcrDisplayScrolled *self = GCR_DISPLAY_SCROLLED (object);
-
- gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (self), GTK_SHADOW_ETCHED_IN);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (self), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
- gtk_container_add (GTK_CONTAINER (self), GTK_WIDGET (self->pv->internal));
- gtk_widget_show (GTK_WIDGET (self->pv->internal));
-}
-
-static void
-_gcr_display_scrolled_get_preferred_height (GtkWidget *widget, gint *minimal_height,
- gint *natural_height)
-{
- GcrDisplayScrolled *self = GCR_DISPLAY_SCROLLED (widget);
- gint minimal, natural;
-
- GTK_WIDGET_CLASS (_gcr_display_scrolled_parent_class)->get_preferred_height (widget,
- minimal_height,
- natural_height);
-
- minimal = 0;
- natural = 0;
-
- gtk_widget_get_preferred_height (GTK_WIDGET (self->pv->internal),
- &minimal, &natural);
-
- /* This is messy, we add a extra for the etching height */
- *minimal_height = MAX (minimal + 3, *minimal_height);
- *natural_height = MAX (natural + 3, *natural_height);
-}
-
-static void
-_gcr_display_scrolled_get_preferred_width (GtkWidget *widget, gint *minimal_width,
- gint *natural_width)
-{
- GcrDisplayScrolled *self = GCR_DISPLAY_SCROLLED (widget);
- gint minimal, natural;
-
- GTK_WIDGET_CLASS (_gcr_display_scrolled_parent_class)->get_preferred_width (widget,
- minimal_width,
- natural_width);
-
- minimal = 0;
- natural = 0;
-
- gtk_widget_get_preferred_width (GTK_WIDGET (self->pv->internal),
- &minimal, &natural);
-
- /* This is messy, we add a extra for the scrollbar width, etching */
- *minimal_width = MAX (minimal + 32, *minimal_width);
- *natural_width = MAX (natural + 32, *natural_width);
-}
-
-static void
-_gcr_display_scrolled_class_init (GcrDisplayScrolledClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
- GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
-
- widget_class->get_preferred_height = _gcr_display_scrolled_get_preferred_height;
- widget_class->get_preferred_width = _gcr_display_scrolled_get_preferred_width;
-
- object_class->constructed = _gcr_display_scrolled_constructed;
-}
-
-static void
-_gcr_display_scrolled_real_add_renderer (GcrViewer *viewer, GcrRenderer *renderer)
-{
- GcrDisplayScrolled *self = GCR_DISPLAY_SCROLLED (viewer);
- gcr_viewer_add_renderer (self->pv->internal, renderer);
-}
-
-static void
-_gcr_display_scrolled_real_insert_renderer (GcrViewer *viewer,
- GcrRenderer *renderer,
- GcrRenderer *before)
-{
- GcrDisplayScrolled *self = GCR_DISPLAY_SCROLLED (viewer);
- gcr_viewer_insert_renderer (self->pv->internal, renderer, before);
-}
-
-static void
-_gcr_display_scrolled_real_remove_renderer (GcrViewer *viewer, GcrRenderer *renderer)
-{
- GcrDisplayScrolled *self = GCR_DISPLAY_SCROLLED (viewer);
- gcr_viewer_remove_renderer (self->pv->internal, renderer);
-}
-
-static guint
-_gcr_display_scrolled_real_count_renderers (GcrViewer *viewer)
-{
- GcrDisplayScrolled *self = GCR_DISPLAY_SCROLLED (viewer);
- return gcr_viewer_count_renderers (self->pv->internal);
-}
-
-static GcrRenderer*
-_gcr_display_scrolled_real_get_renderer (GcrViewer *viewer, guint index_)
-{
- GcrDisplayScrolled *self = GCR_DISPLAY_SCROLLED (viewer);
- return gcr_viewer_get_renderer (self->pv->internal, index_);
-}
-
-static void
-_gcr_display_scrolled_viewer_iface (GcrViewerIface *iface)
-{
- iface->add_renderer = _gcr_display_scrolled_real_add_renderer;
- iface->insert_renderer = _gcr_display_scrolled_real_insert_renderer;
- iface->remove_renderer = _gcr_display_scrolled_real_remove_renderer;
- iface->count_renderers = _gcr_display_scrolled_real_count_renderers;
- iface->get_renderer = _gcr_display_scrolled_real_get_renderer;
-}
-
-/* -----------------------------------------------------------------------------
- * PUBLIC
- */
-
-GcrDisplayScrolled*
-_gcr_display_scrolled_new (void)
-{
- return g_object_new (GCR_TYPE_DISPLAY_SCROLLED, NULL);
-}
diff --git a/gcr-gtk3/gcr-display-scrolled.h b/gcr-gtk3/gcr-display-scrolled.h
deleted file mode 100644
index 8726ae2..0000000
--- a/gcr-gtk3/gcr-display-scrolled.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2011 Collabora Ltd.
- *
- * 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/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#ifndef __GCR_DISPLAY_SCROLLED_H__
-#define __GCR_DISPLAY_SCROLLED_H__
-
-#include <glib-object.h>
-#include <gtk/gtk.h>
-
-G_BEGIN_DECLS
-
-#define GCR_TYPE_DISPLAY_SCROLLED (_gcr_display_scrolled_get_type ())
-#define GCR_DISPLAY_SCROLLED(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_DISPLAY_SCROLLED, GcrDisplayScrolled))
-#define GCR_DISPLAY_SCROLLED_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_DISPLAY_SCROLLED, GcrDisplayScrolledClass))
-#define GCR_IS_DISPLAY_SCROLLED(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_DISPLAY_SCROLLED))
-#define GCR_IS_DISPLAY_SCROLLED_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_DISPLAY_SCROLLED))
-#define GCR_DISPLAY_SCROLLED_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_DISPLAY_SCROLLED, GcrDisplayScrolledClass))
-
-typedef struct _GcrDisplayScrolled GcrDisplayScrolled;
-typedef struct _GcrDisplayScrolledClass GcrDisplayScrolledClass;
-typedef struct _GcrDisplayScrolledPrivate GcrDisplayScrolledPrivate;
-
-struct _GcrDisplayScrolled {
- /*< private >*/
- GtkScrolledWindow parent;
- GcrDisplayScrolledPrivate *pv;
-};
-
-struct _GcrDisplayScrolledClass {
- GtkScrolledWindowClass parent_class;
-};
-
-GType _gcr_display_scrolled_get_type (void);
-
-GcrDisplayScrolled* _gcr_display_scrolled_new (void);
-
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrDisplayScrolled, g_object_unref)
-
-G_END_DECLS
-
-#endif /* __GCR_DISPLAY_SCROLLED_H__ */
diff --git a/gcr-gtk3/gcr-display-view.c b/gcr-gtk3/gcr-display-view.c
deleted file mode 100644
index 766a3a2..0000000
--- a/gcr-gtk3/gcr-display-view.c
+++ /dev/null
@@ -1,1232 +0,0 @@
-/*
- * Copyright (C) 2010 Stefan Walter
- *
- * 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 "config.h"
-
-#include "gcr-display-view.h"
-#include "gcr-renderer.h"
-#include "gcr-viewer.h"
-
-#include "egg/egg-oid.h"
-#include "egg/egg-hex.h"
-
-#include <gdk/gdk.h>
-#include <glib/gi18n-lib.h>
-
-static void _gcr_display_view_viewer_iface (GcrViewerIface *iface);
-
-#define ZWSP "\342\200\213"
-#define NORMAL_MARGIN 10
-#define FIELD_MARGIN 17
-#define COLUMN_MARGIN 6
-#define ICON_MARGIN 8
-#define MESSAGE_PADDING 8
-
-typedef struct _GcrDisplayItem {
- GcrDisplayView *display_view;
- GcrRenderer *renderer;
- gboolean expanded;
- gboolean details;
- GtkTextMark *beginning;
- GtkTextMark *ending;
- GtkWidget *details_widget;
- GtkTextChildAnchor *area_anchor;
- GtkTextTag *extra_tag;
- gint field_width;
- GdkPixbuf *pixbuf;
- GtkTextTag *field_tag;
- GtkTextTag *details_tag;
- gulong data_changed_id;
-} GcrDisplayItem;
-
-struct _GcrDisplayViewPrivate {
- GtkTextBuffer *buffer;
- GPtrArray *renderers;
- GHashTable *items;
- GtkTextTag *title_tag;
- GtkTextTag *content_tag;
- GtkTextTag *heading_tag;
- GtkTextTag *message_tag;
- GtkTextTag *monospace_tag;
- GtkTextTag *area_tag;
- GcrDisplayItem *current_item;
- gint text_height;
- GdkCursor *cursor;
-
- gboolean have_measurements;
- gint minimal_width;
- gint natural_width;
- gint minimal_height;
- gint natural_height;
-};
-
-G_DEFINE_TYPE_WITH_CODE (GcrDisplayView, _gcr_display_view, GTK_TYPE_TEXT_VIEW,
- G_ADD_PRIVATE (GcrDisplayView);
- G_IMPLEMENT_INTERFACE (GCR_TYPE_VIEWER, _gcr_display_view_viewer_iface));
-
-/* -----------------------------------------------------------------------------
- * INTERNAL
- */
-
-static void
-ensure_measurements (GcrDisplayView *self)
-{
- PangoLayout *layout;
- PangoRectangle extents;
- gint icon_width;
- gint icon_height;
- GHashTableIter iter;
- GcrDisplayItem *item;
- gpointer value;
- gboolean expanded;
-
- if (self->pv->have_measurements)
- return;
-
- /* See if anything is expanded? */
- expanded = FALSE;
- g_hash_table_iter_init (&iter, self->pv->items);
- while (g_hash_table_iter_next (&iter, NULL, &value)) {
- item = value;
- if (item->expanded) {
- expanded = TRUE;
- break;
- }
- }
-
- /*
- * We use a string in our widget font as the basis for our measurements.
- * These are just estimates of what we need, and what looks goodish.
- * There's room here for improvement. If this is causes problems for
- * you or bothers you, scratch that itch:
- */
-
- layout = gtk_widget_create_pango_layout (GTK_WIDGET (self), "0123456789");
- pango_layout_get_extents (layout, NULL, &extents);
- pango_extents_to_pixels (&extents, NULL);
- g_object_unref (layout);
-
- if (!gtk_icon_size_lookup (GTK_ICON_SIZE_DIALOG, &icon_width, &icon_height)) {
- icon_width = 48;
- icon_height = 48;
- }
-
- if (expanded) {
- /* If expanded, display more 10 lines at least */
- self->pv->minimal_height = extents.height * 14;
- self->pv->natural_height = extents.height * 25;
- } else {
- /* If not expanded we can get by with 9 lines */
- self->pv->minimal_height = extents.height * 8;
- self->pv->natural_height = extents.height * 9;
- }
-
- self->pv->minimal_width = icon_width + (extents.width * 5);
- self->pv->natural_width = icon_width + (extents.width * 8);
- self->pv->have_measurements = TRUE;
-}
-
-static void
-ensure_text_height (GcrDisplayView *self)
-{
- PangoRectangle extents;
- PangoLayout *layout;
-
- if (self->pv->text_height > 0)
- return;
-
- layout = gtk_widget_create_pango_layout (GTK_WIDGET (self), "Wp");
- pango_layout_get_extents (layout, NULL, &extents);
- pango_extents_to_pixels (&extents, NULL);
- g_object_unref (layout);
-
- self->pv->text_height = extents.height;
-}
-
-static void
-recalculate_and_resize (GcrDisplayView *self)
-{
- self->pv->have_measurements = FALSE;
- gtk_widget_queue_resize (GTK_WIDGET (self));
-}
-
-static GtkTextTagTable*
-create_tag_table (GcrDisplayView *self)
-{
- GtkTextTagTable *tags;
- gint width, height;
-
- g_assert (GCR_IS_DISPLAY_VIEW (self));
-
- tags = gtk_text_tag_table_new ();
-
- if (!gtk_icon_size_lookup (GTK_ICON_SIZE_DIALOG, &width, &height))
- width = 48;
-
- self->pv->title_tag = g_object_new (GTK_TYPE_TEXT_TAG,
- "name", "title",
- "scale", PANGO_SCALE_LARGE,
- "right-margin", (ICON_MARGIN * 2) + width,
- "pixels-below-lines", 6,
- "weight", PANGO_WEIGHT_BOLD,
- NULL);
- gtk_text_tag_table_add (tags, self->pv->title_tag);
-
- self->pv->content_tag = g_object_new (GTK_TYPE_TEXT_TAG,
- "name", "content",
- "right-margin", (ICON_MARGIN * 2) + width,
- "left-margin", FIELD_MARGIN,
- "pixels-below-lines", 3,
- "wrap-mode", GTK_WRAP_WORD,
- NULL);
- gtk_text_tag_table_add (tags, self->pv->content_tag);
-
- self->pv->message_tag = g_object_new (GTK_TYPE_TEXT_TAG,
- "name", "message",
- "right-margin", (ICON_MARGIN * 2) + width,
- "rise", 3 * PANGO_SCALE,
- "pixels-below-lines", 3,
- "wrap-mode", GTK_WRAP_WORD,
- NULL);
- gtk_text_tag_table_add (tags, self->pv->message_tag);
-
- self->pv->heading_tag = g_object_new (GTK_TYPE_TEXT_TAG,
- "name", "heading",
- "pixels-above-lines", 9,
- "pixels-below-lines", 3,
- "weight", PANGO_WEIGHT_BOLD,
- NULL);
- gtk_text_tag_table_add (tags, self->pv->heading_tag);
-
- self->pv->monospace_tag = g_object_new (GTK_TYPE_TEXT_TAG,
- "name", "monospace",
- "family", "monospace",
- NULL);
- gtk_text_tag_table_add (tags, self->pv->monospace_tag);
-
- self->pv->area_tag = g_object_new (GTK_TYPE_TEXT_TAG,
- "name", "area",
- "justification", GTK_JUSTIFY_CENTER,
- NULL);
- gtk_text_tag_table_add (tags, self->pv->area_tag);
-
- return tags;
-}
-
-static void
-on_expander_realize (GtkWidget *widget, gpointer user_data)
-{
- GdkCursor *cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget), GDK_ARROW);
- gdk_window_set_cursor (gtk_widget_get_window (widget), cursor);
- g_object_unref (cursor);
-}
-
-static void
-on_expander_expanded (GObject *object, GParamSpec *param_spec, gpointer user_data)
-{
- GtkExpander *expander = GTK_EXPANDER (object);
- GcrDisplayItem *item = user_data;
- item->expanded = gtk_expander_get_expanded (expander);
- gcr_renderer_render_view (item->renderer, GCR_VIEWER (item->display_view));
- recalculate_and_resize (item->display_view);
-}
-
-static GcrDisplayItem*
-create_display_item (GcrDisplayView *self, GcrRenderer *renderer)
-{
- GcrDisplayItem *item;
- GtkTextTagTable *tags;
- GtkTextIter iter;
- GtkWidget *widget;
- GtkWidget *label;
- GtkStyleContext *style;
- gchar *text;
-
- item = g_new0 (GcrDisplayItem, 1);
- item->display_view = self;
- item->renderer = renderer;
-
- tags = gtk_text_buffer_get_tag_table (self->pv->buffer);
-
- g_assert (!item->field_tag);
- item->field_width = 0;
- item->field_tag = g_object_new (GTK_TYPE_TEXT_TAG,
- "left-margin", item->field_width + FIELD_MARGIN,
- "indent", item->field_width,
- "pixels-below-lines", 3,
- "wrap-mode", GTK_WRAP_WORD_CHAR,
- NULL);
- gtk_text_tag_table_add (tags, item->field_tag);
-
- g_assert (!item->details_tag);
- item->details_tag = g_object_new (GTK_TYPE_TEXT_TAG, NULL);
- gtk_text_tag_table_add (tags, item->details_tag);
-
- /*
- * Add two lines space that delimit this from later items. The
- * item will live between the two zero width spaces.
- */
- gtk_text_buffer_get_end_iter (self->pv->buffer, &iter);
- gtk_text_buffer_insert (self->pv->buffer, &iter, "\n\n", -1);
- if (!gtk_text_iter_backward_char (&iter))
- g_assert_not_reached ();
-
- /* The mark that determines the beginning of this item, with left gravity. */
- item->beginning = gtk_text_buffer_create_mark (self->pv->buffer, NULL, &iter, TRUE);
- g_object_ref (item->beginning);
-
- /* The mark that determines the end of this item, with right gravity. */
- item->ending = gtk_text_buffer_create_mark (self->pv->buffer, NULL, &iter, FALSE);
- g_object_ref (item->ending);
-
- widget = gtk_expander_new_with_mnemonic ("");
- label = gtk_expander_get_label_widget (GTK_EXPANDER (widget));
- text = g_strdup_printf ("<b>%s</b>", _("_Details"));
- gtk_label_set_markup_with_mnemonic (GTK_LABEL (label), text);
- g_signal_connect (widget, "notify::expanded", G_CALLBACK (on_expander_expanded), item);
- g_signal_connect (widget, "realize", G_CALLBACK (on_expander_realize), NULL);
- item->expanded = gtk_expander_get_expanded (GTK_EXPANDER (widget));
- g_free (text);
-
- gtk_widget_set_halign (widget, 0.5);
- gtk_widget_set_valign (widget, 0.5);
- gtk_widget_set_margin_top (widget, 6);
- gtk_widget_set_margin_bottom (widget, 9);
- gtk_widget_show_all (widget);
-
- item->details_widget = gtk_event_box_new ();
- gtk_event_box_set_visible_window (GTK_EVENT_BOX (item->details_widget), FALSE);
- gtk_container_add (GTK_CONTAINER (item->details_widget), widget);
- g_signal_connect (item->details_widget, "realize", G_CALLBACK (on_expander_realize), NULL);
- style = gtk_widget_get_style_context (GTK_WIDGET (item->details_widget));
- gtk_style_context_add_class (style, "gcr-red");
- g_object_ref (item->details_widget);
-
- return item;
-}
-
-static void
-destroy_display_item (gpointer data)
-{
- GcrDisplayItem *item = data;
- GtkTextIter iter, end;
- GtkTextTagTable *tags;
- GcrDisplayView *self;
-
- g_assert (item);
-
- g_assert (GCR_IS_DISPLAY_VIEW (item->display_view));
- self = item->display_view;
-
- tags = gtk_text_buffer_get_tag_table (self->pv->buffer);
- gtk_text_tag_table_remove (tags, item->field_tag);
- gtk_text_tag_table_remove (tags, item->details_tag);
-
- g_object_unref (item->field_tag);
- g_object_unref (item->details_tag);
-
- if (item->pixbuf)
- g_object_unref (item->pixbuf);
- item->pixbuf = NULL;
-
- g_assert (item->details_widget);
- g_object_unref (item->details_widget);
- item->details_widget = NULL;
-
- g_clear_object (&item->area_anchor);
-
- g_return_if_fail (!gtk_text_mark_get_deleted (item->beginning));
- g_return_if_fail (!gtk_text_mark_get_deleted (item->ending));
-
- /* Setup iters to encompass our delemiter characters see create_display_item() */
- gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &iter, item->beginning);
- gtk_text_iter_backward_char (&iter);
- gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &end, item->ending);
- gtk_text_iter_forward_char (&end);
- gtk_text_buffer_delete (self->pv->buffer, &iter, &end);
-
- gtk_text_buffer_delete_mark (self->pv->buffer, item->beginning);
- gtk_text_buffer_delete_mark (self->pv->buffer, item->ending);
-
- g_object_unref (item->beginning);
- g_object_unref (item->ending);
-
- g_free (item);
-}
-
-static GcrDisplayItem*
-lookup_display_item (GcrDisplayView *self, GcrRenderer *renderer)
-{
- GcrDisplayItem *item = g_hash_table_lookup (self->pv->items, renderer);
- g_return_val_if_fail (item, NULL);
- g_assert (item->display_view == self);
- return item;
-}
-
-static GcrDisplayItem*
-find_item_at_iter (GcrDisplayView *self, GtkTextIter *iter)
-{
- GHashTableIter hi;
- GcrDisplayItem *item;
- gpointer value;
- GtkTextIter start, end;
-
- g_hash_table_iter_init (&hi, self->pv->items);
- while (g_hash_table_iter_next (&hi, NULL, &value)) {
- item = value;
-
- gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &start, item->beginning);
- gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &end, item->ending);
-
- if (gtk_text_iter_compare (iter, &start) >= 0 &&
- gtk_text_iter_compare (iter, &end) < 0)
- return item;
- }
-
- return NULL;
-}
-
-static void
-on_renderer_data_changed (GcrRenderer *renderer,
- gpointer user_data)
-{
- GcrDisplayView *self = GCR_DISPLAY_VIEW (user_data);
-
- /* Item may be removed, but not yet destroyed */
- if (!g_hash_table_lookup (self->pv->items, renderer))
- return;
-
- /* Just ask the renderer to render itself on us */
- gcr_renderer_render_view (renderer, GCR_VIEWER (self));
-}
-
-static void
-paint_item_icon (GcrDisplayView *self,
- GcrDisplayItem *item,
- GdkRectangle *visible,
- cairo_t *cr)
-{
- GtkTextIter iter;
- GdkRectangle location;
- GtkTextView *view;
-
- if (item->pixbuf == NULL)
- return;
-
- view = GTK_TEXT_VIEW (self);
- gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &iter, item->beginning);
- gtk_text_view_get_iter_location (view, &iter, &location);
-
- location.height = gdk_pixbuf_get_height (item->pixbuf);
- location.width = gdk_pixbuf_get_width (item->pixbuf);
- location.x = visible->width - location.width - ICON_MARGIN;
-
- if (!gdk_rectangle_intersect (visible, &location, NULL))
- return;
-
- gtk_text_view_buffer_to_window_coords (view, GTK_TEXT_WINDOW_TEXT,
- location.x, location.y,
- &location.x, &location.y);
-
- cairo_save (cr);
- gdk_cairo_set_source_pixbuf (cr, item->pixbuf, location.x, location.y);
- cairo_rectangle (cr, location.x, location.y, location.width, location.height);
- cairo_fill (cr);
- cairo_restore (cr);
-}
-
-static void
-paint_item_border (GcrDisplayView *self,
- GcrDisplayItem *item,
- GtkStyleContext *context,
- GdkRectangle *visible,
- gint index,
- cairo_t *cr)
-{
- GtkTextView *view;
- GtkTextIter iter, end;
- GdkRectangle location;
-
- if (index == 0)
- return;
-
- view = GTK_TEXT_VIEW (self);
- gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &iter, item->beginning);
- gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &end, item->ending);
-
- /* Don't paint for non-visible items */
- if (gtk_text_iter_compare (&iter, &end) == 0)
- return;
-
- ensure_text_height (self);
-
- gtk_text_view_get_iter_location (view, &iter, &location);
-
- location.height = 2;
- location.width = visible->width - (NORMAL_MARGIN * 2);
- location.x = NORMAL_MARGIN;
- location.y -= self->pv->text_height / 2;
-
- if (!gdk_rectangle_intersect (visible, &location, NULL))
- return;
-
- gtk_render_background (context, cr, location.x, location.y - 0.5, location.width, 1);
-}
-
-static void
-paint_extras (GcrDisplayView *self, cairo_t *cr)
-{
- GdkRectangle visible;
- GcrDisplayItem *item;
- GtkStyleContext *context;
- guint i;
-
- gtk_text_view_get_visible_rect (GTK_TEXT_VIEW (self), &visible);
- context = gtk_widget_get_style_context (GTK_WIDGET (self));
-
- for (i = 0; i < self->pv->renderers->len; i++) {
- item = g_hash_table_lookup (self->pv->items, self->pv->renderers->pdata[i]);
- g_assert (item != NULL);
- paint_item_icon (self, item, &visible, cr);
- paint_item_border (self, item, context, &visible, i, cr);
- }
-}
-
-/* -----------------------------------------------------------------------------
- * OBJECT
- */
-
-static GObject*
-_gcr_display_view_constructor (GType type, guint n_props, GObjectConstructParam *props)
-{
- GObject *obj = G_OBJECT_CLASS (_gcr_display_view_parent_class)->constructor (type, n_props, props);
- GcrDisplayView *self = NULL;
- GtkTextView *view = NULL;
- GtkTextTagTable *tags;
-
- g_return_val_if_fail (obj, NULL);
-
- self = GCR_DISPLAY_VIEW (obj);
- view = GTK_TEXT_VIEW (obj);
-
- tags = create_tag_table (self);
- self->pv->buffer = gtk_text_buffer_new (tags);
- g_object_unref (tags);
-
- gtk_text_view_set_buffer (view, self->pv->buffer);
- gtk_text_view_set_editable (view, FALSE);
- gtk_text_view_set_left_margin (view, NORMAL_MARGIN);
- gtk_text_view_set_right_margin (view, NORMAL_MARGIN);
- gtk_text_view_set_cursor_visible (view, FALSE);
-
- return obj;
-}
-
-static void
-_gcr_display_view_init (GcrDisplayView *self)
-{
- self->pv = _gcr_display_view_get_instance_private (self);
- self->pv->items = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, destroy_display_item);
- self->pv->renderers = g_ptr_array_new_with_free_func (g_object_unref);
-}
-
-static void
-_gcr_display_view_dispose (GObject *obj)
-{
- GcrDisplayView *self = GCR_DISPLAY_VIEW (obj);
- GcrRenderer *renderer;
- GcrDisplayItem *item;
-
- while (self->pv->renderers->len) {
- renderer = g_ptr_array_index (self->pv->renderers, 0);
- item = g_hash_table_lookup (self->pv->items, renderer);
- g_return_if_fail (item);
- g_signal_handler_disconnect (renderer, item->data_changed_id);
- if (!g_hash_table_remove (self->pv->items, renderer))
- g_return_if_reached ();
- g_ptr_array_remove_index_fast (self->pv->renderers, 0);
- }
-
- if (self->pv->buffer)
- g_object_unref (self->pv->buffer);
- self->pv->buffer = NULL;
-
- g_assert (g_hash_table_size (self->pv->items) == 0);
-
- G_OBJECT_CLASS (_gcr_display_view_parent_class)->dispose (obj);
-}
-
-static void
-_gcr_display_view_finalize (GObject *obj)
-{
- GcrDisplayView *self = GCR_DISPLAY_VIEW (obj);
-
- if (self->pv->buffer)
- g_object_unref (self->pv->buffer);
- self->pv->buffer = NULL;
-
- g_assert (g_hash_table_size (self->pv->items) == 0);
- g_hash_table_destroy (self->pv->items);
- self->pv->items = NULL;
-
- g_assert (self->pv->renderers);
- g_assert (self->pv->renderers->len == 0);
- g_ptr_array_free (self->pv->renderers, TRUE);
- self->pv->renderers = NULL;
-
- g_assert (self->pv->content_tag);
- g_object_unref (self->pv->content_tag);
- self->pv->content_tag = NULL;
-
- g_assert (self->pv->heading_tag);
- g_object_unref (self->pv->heading_tag);
- self->pv->heading_tag = NULL;
-
- g_assert (self->pv->monospace_tag);
- g_object_unref (self->pv->monospace_tag);
- self->pv->monospace_tag = NULL;
-
- g_assert (self->pv->title_tag);
- g_object_unref (self->pv->title_tag);
- self->pv->title_tag = NULL;
-
- g_clear_object (&self->pv->cursor);
-
- G_OBJECT_CLASS (_gcr_display_view_parent_class)->finalize (obj);
-}
-
-static void
-_gcr_display_view_realize (GtkWidget *widget)
-{
- GcrDisplayView *self = GCR_DISPLAY_VIEW (widget);
- GdkDisplay *display;
-
- if (GTK_WIDGET_CLASS (_gcr_display_view_parent_class)->realize)
- GTK_WIDGET_CLASS (_gcr_display_view_parent_class)->realize (widget);
-
- if (!self->pv->cursor) {
- display = gtk_widget_get_display (GTK_WIDGET (self));
- self->pv->cursor = gdk_cursor_new_for_display (display, GDK_ARROW);
- }
-
- gdk_window_set_cursor (gtk_text_view_get_window (GTK_TEXT_VIEW (self), GTK_TEXT_WINDOW_WIDGET),
- self->pv->cursor);
-}
-
-static gboolean
-_gcr_display_view_button_press_event (GtkWidget *widget, GdkEventButton *event)
-{
- GtkTextView *text_view = GTK_TEXT_VIEW (widget);
- GcrDisplayView *self = GCR_DISPLAY_VIEW (widget);
- GcrDisplayItem *item;
- gboolean handled = FALSE;
- GtkTextIter iter;
- gint x, y;
-
- if (GTK_WIDGET_CLASS (_gcr_display_view_parent_class)->button_press_event)
- handled = GTK_WIDGET_CLASS (_gcr_display_view_parent_class)->button_press_event (
- widget, event);
-
- if (event->window == gtk_text_view_get_window (text_view, GTK_TEXT_WINDOW_TEXT)) {
- gtk_text_view_window_to_buffer_coords (text_view, GTK_TEXT_WINDOW_TEXT,
- event->x, event->y, &x, &y);
- gtk_text_view_get_iter_at_location (text_view, &iter, x, y);
-
- item = find_item_at_iter (self, &iter);
- self->pv->current_item = item;
- }
-
- return handled;
-}
-
-static gboolean
-_gcr_display_view_draw (GtkWidget *widget, cairo_t *cr)
-{
- GdkWindow *window;
- gboolean handled = TRUE;
-
- /* Have GtkTextView draw the text first. */
- if (GTK_WIDGET_CLASS (_gcr_display_view_parent_class)->draw)
- handled = GTK_WIDGET_CLASS (_gcr_display_view_parent_class)->draw (widget, cr);
-
- window = gtk_text_view_get_window (GTK_TEXT_VIEW (widget), GTK_TEXT_WINDOW_TEXT);
- if (gtk_cairo_should_draw_window (cr, window))
- paint_extras (GCR_DISPLAY_VIEW (widget), cr);
-
- return handled;
-}
-
-static void
-_gcr_display_get_preferred_height (GtkWidget *widget, gint *minimal_height,
- gint *natural_height)
-{
- GcrDisplayView *self = GCR_DISPLAY_VIEW (widget);
- ensure_measurements (self);
- *minimal_height = self->pv->minimal_height;
- *natural_height = self->pv->natural_height;
-}
-
-static void
-_gcr_display_get_preferred_width (GtkWidget *widget, gint *minimal_width,
- gint *natural_width)
-{
- GcrDisplayView *self = GCR_DISPLAY_VIEW (widget);
- ensure_measurements (self);
- *minimal_width = self->pv->minimal_width;
- *natural_width = self->pv->natural_width;
-}
-
-static void
-_gcr_display_view_populate_popup (GtkTextView *text_view,
-#if GTK_CHECK_VERSION (3, 8, 0)
- GtkWidget *menu
-#else
- GtkMenu *menu
-#endif
- )
-{
- GcrDisplayView *self = GCR_DISPLAY_VIEW (text_view);
-
- if (GTK_TEXT_VIEW_CLASS (_gcr_display_view_parent_class)->populate_popup)
- GTK_TEXT_VIEW_CLASS (_gcr_display_view_parent_class)->populate_popup (text_view, menu);
-
- /* Ask the current renderer to add menu items */
- if (self->pv->current_item)
- gcr_renderer_popuplate_popup (self->pv->current_item->renderer,
- GCR_VIEWER (self), GTK_MENU (menu));
-}
-
-static void
-_gcr_display_view_class_init (GcrDisplayViewClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
- GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
- GtkTextViewClass *text_view_class = GTK_TEXT_VIEW_CLASS (klass);
-
- _gcr_display_view_parent_class = g_type_class_peek_parent (klass);
-
- gobject_class->constructor = _gcr_display_view_constructor;
- gobject_class->dispose = _gcr_display_view_dispose;
- gobject_class->finalize = _gcr_display_view_finalize;
-
- widget_class->realize = _gcr_display_view_realize;
- widget_class->button_press_event = _gcr_display_view_button_press_event;
- widget_class->get_preferred_height = _gcr_display_get_preferred_height;
- widget_class->get_preferred_width = _gcr_display_get_preferred_width;
- widget_class->draw = _gcr_display_view_draw;
-
- text_view_class->populate_popup = _gcr_display_view_populate_popup;
-
- /* Load a CSS once */
- do {
- GtkCssProvider* provider = gtk_css_provider_new ();
- GdkDisplay* display = gdk_display_get_default ();
- GdkScreen* screen = gdk_display_get_default_screen (display);
- GError *err = NULL;
-
- gtk_style_context_add_provider_for_screen (screen,
- GTK_STYLE_PROVIDER(provider),
- GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
-
- if (!gtk_css_provider_load_from_data (GTK_CSS_PROVIDER(provider),
- ".gcr-red * { background-color: red; }\n", -1, &err)) {
- g_warning ("couldn't load style: %s",
- err && err->message ? err->message : "");
- }
- g_object_unref (provider);
- } while (0);
-}
-
-static void
-_gcr_display_view_real_insert_renderer (GcrViewer *viewer,
- GcrRenderer *renderer,
- GcrRenderer *before)
-{
- GcrDisplayView *self = GCR_DISPLAY_VIEW (viewer);
- GcrDisplayItem *item;
- guint i;
-
- if (before != NULL)
- g_return_if_fail (g_hash_table_lookup (self->pv->items, before) != NULL);
-
- item = create_display_item (self, renderer);
- g_object_ref (renderer);
-
- /* Insert it at the right place */
- if (before != NULL) {
- g_ptr_array_add (self->pv->renderers, NULL);
- for (i = self->pv->renderers->len; i > 0; i--) {
- self->pv->renderers->pdata[i] = self->pv->renderers->pdata[i - 1];
- if (self->pv->renderers->pdata[i] == before) {
- self->pv->renderers->pdata[i - 1] = renderer;
- break;
- }
- }
-
- /* Must have been found */
- g_assert (i > 0);
-
- /* No before, just add to end */
- } else {
- g_ptr_array_add (self->pv->renderers, renderer);
- }
-
- g_hash_table_insert (self->pv->items, renderer, item);
-
- gcr_renderer_render_view (renderer, viewer);
- item->data_changed_id = g_signal_connect (renderer, "data-changed",
- G_CALLBACK (on_renderer_data_changed), self);
-}
-
-static void
-_gcr_display_view_real_add_renderer (GcrViewer *viewer, GcrRenderer *renderer)
-{
- _gcr_display_view_real_insert_renderer (viewer, renderer, NULL);
-}
-
-static void
-_gcr_display_view_real_remove_renderer (GcrViewer *viewer, GcrRenderer *renderer)
-{
- GcrDisplayView *self = GCR_DISPLAY_VIEW (viewer);
- GcrDisplayItem *item;
-
- item = lookup_display_item (self, renderer);
- g_return_if_fail (item);
-
- /* Unhook the callback */
- g_signal_handler_disconnect (renderer, item->data_changed_id);
-
- /* Destroys the display item */
- g_assert (item->display_view == self);
- g_hash_table_remove (self->pv->items, renderer);
-
- /* Unrefs the renderer */
- if (!g_ptr_array_remove (self->pv->renderers, renderer))
- g_return_if_reached ();
-}
-
-static guint
-_gcr_display_view_real_count_renderers (GcrViewer *viewer)
-{
- GcrDisplayView *self = GCR_DISPLAY_VIEW (viewer);
- return self->pv->renderers->len;
-}
-
-static GcrRenderer*
-_gcr_display_view_real_get_renderer (GcrViewer *viewer, guint index_)
-{
- GcrDisplayView *self = GCR_DISPLAY_VIEW (viewer);
- g_return_val_if_fail (index_ < self->pv->renderers->len, NULL);
- return g_ptr_array_index (self->pv->renderers, index_);
-}
-
-static void
-_gcr_display_view_viewer_iface (GcrViewerIface *iface)
-{
- iface->add_renderer = (gpointer)_gcr_display_view_real_add_renderer;
- iface->insert_renderer = (gpointer)_gcr_display_view_real_insert_renderer;
- iface->remove_renderer = (gpointer)_gcr_display_view_real_remove_renderer;
- iface->count_renderers = (gpointer)_gcr_display_view_real_count_renderers;
- iface->get_renderer = (gpointer)_gcr_display_view_real_get_renderer;
-}
-
-/* -----------------------------------------------------------------------------
- * PUBLIC
- */
-
-GcrDisplayView*
-_gcr_display_view_new (void)
-{
- return g_object_new (GCR_TYPE_DISPLAY_VIEW, NULL);
-}
-
-void
-_gcr_display_view_begin (GcrDisplayView *self,
- GcrRenderer *renderer)
-{
- GtkTextIter start, iter;
- GcrDisplayItem *item;
- GList *widgets, *l;
-
- g_return_if_fail (GCR_IS_DISPLAY_VIEW (self));
- item = lookup_display_item (self, renderer);
- g_return_if_fail (item);
-
- /* Remove the details widget so it doesn't get destroyed */
- if (gtk_widget_get_parent (item->details_widget))
- gtk_container_remove (GTK_CONTAINER (self), item->details_widget);
-
- /* Remove area widgets so they don't get destroyed unnecessarily */
- if (item->area_anchor) {
- g_assert (!gtk_text_child_anchor_get_deleted (item->area_anchor));
- widgets = gtk_text_child_anchor_get_widgets (item->area_anchor);
- for (l = widgets; l != NULL; l = g_list_next (l))
- gtk_container_remove (GTK_CONTAINER (self), l->data);
- g_list_free (widgets);
- g_object_unref (item->area_anchor);
- item->area_anchor = NULL;
- }
-
- gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &start, item->beginning);
- gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &iter, item->ending);
- gtk_text_buffer_delete (self->pv->buffer, &start, &iter);
-
- item->extra_tag = NULL;
- item->field_width = 0;
- item->details = FALSE;
-}
-
-void
-_gcr_display_view_end (GcrDisplayView *self,
- GcrRenderer *renderer)
-{
- GcrDisplayItem *item;
-
- g_return_if_fail (GCR_IS_DISPLAY_VIEW (self));
- item = lookup_display_item (self, renderer);
- g_return_if_fail (item);
-}
-
-void
-_gcr_display_view_start_details (GcrDisplayView *self, GcrRenderer *renderer)
-{
- GtkTextChildAnchor *anchor;
- GcrDisplayItem *item;
- GtkTextIter iter;
-
- g_return_if_fail (GCR_IS_DISPLAY_VIEW (self));
- item = lookup_display_item (self, renderer);
- g_return_if_fail (item);
-
- if (item->details) {
- g_warning ("A GcrRenderer implementation has called %s twice in one render",
- G_STRFUNC);
- return;
- }
-
- item->extra_tag = item->details_tag;
- item->details = TRUE;
-
- gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &iter, item->ending);
- anchor = gtk_text_buffer_create_child_anchor (self->pv->buffer, &iter);
- gtk_text_view_add_child_at_anchor (GTK_TEXT_VIEW (self), item->details_widget, anchor);
- gtk_widget_show_all (item->details_widget);
- gtk_text_buffer_insert (self->pv->buffer, &iter, "\n", 1);
-}
-
-void
-_gcr_display_view_append_content (GcrDisplayView *self, GcrRenderer *renderer,
- const gchar *content, const gchar *details)
-{
- GcrDisplayItem *item;
- GtkTextIter iter;
- gchar *memory = NULL;
-
- g_return_if_fail (GCR_IS_DISPLAY_VIEW (self));
- g_return_if_fail (content);
-
- item = lookup_display_item (self, renderer);
- g_return_if_fail (item);
-
- if (item->details && !item->expanded)
- return;
-
- if (details)
- content = memory = g_strdup_printf ("%s: %s", content, details);
-
- gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &iter, item->ending);
- gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, content, -1,
- self->pv->content_tag, item->extra_tag, NULL);
- gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, "\n", 1,
- item->extra_tag, NULL);
-
- g_free (memory);
-}
-
-void
-_gcr_display_view_append_value (GcrDisplayView *self, GcrRenderer *renderer, const gchar *field,
- const gchar *value, gboolean monospace)
-{
- GcrDisplayItem *item;
- PangoRectangle extents;
- PangoTabArray *tabs;
- PangoLayout *layout;
- GtkTextIter iter;
- gchar *text;
-
- g_return_if_fail (GCR_IS_DISPLAY_VIEW (self));
- g_return_if_fail (field);
-
- item = lookup_display_item (self, renderer);
- g_return_if_fail (item);
-
- if (item->details && !item->expanded)
- return;
-
- text = g_strdup_printf ("%s:", field);
- if (value == NULL)
- value = "";
-
- /* Measure the width of the field */
- layout = gtk_widget_create_pango_layout (GTK_WIDGET (self), text);
- pango_layout_get_extents (layout, NULL, &extents);
- pango_extents_to_pixels (&extents, NULL);
- g_object_unref (layout);
-
- /* An estimate of the text height */
- self->pv->text_height = extents.height;
-
- /* Make the tab wide enough to accomodate */
- if (extents.width > item->field_width) {
- item->field_width = extents.width + COLUMN_MARGIN;
- tabs = pango_tab_array_new (1, TRUE);
- pango_tab_array_set_tab (tabs, 0, PANGO_TAB_LEFT, item->field_width);
- g_object_set (item->field_tag,
- "left-margin", FIELD_MARGIN,
- "indent", 0 - item->field_width,
- "tabs", tabs,
- NULL);
- pango_tab_array_free (tabs);
- }
-
- gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &iter, item->ending);
- gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, text, -1,
- item->field_tag, item->extra_tag, NULL);
- gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, "\t", 1,
- item->extra_tag, NULL);
- gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, value, -1, item->field_tag,
- monospace ? self->pv->monospace_tag : item->extra_tag,
- monospace ? item->extra_tag : NULL, NULL);
- gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, "\n", 1,
- item->extra_tag, NULL);
-
- g_free (text);
-}
-
-void
-_gcr_display_view_append_hex (GcrDisplayView *self, GcrRenderer *renderer,
- const gchar *field, gconstpointer value, gsize n_value)
-{
- gchar *display;
-
- display = egg_hex_encode_full (value, n_value, TRUE, " ", 1);
- _gcr_display_view_append_value (self, renderer, field, display, TRUE);
- g_free (display);
-}
-
-void
-_gcr_display_view_append_title (GcrDisplayView *self, GcrRenderer *renderer, const gchar *title)
-{
- GcrDisplayItem *item;
- GtkTextIter iter;
-
- g_return_if_fail (GCR_IS_DISPLAY_VIEW (self));
- g_return_if_fail (title);
-
- item = lookup_display_item (self, renderer);
- g_return_if_fail (item);
-
- if (item->details && !item->expanded)
- return;
-
- gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &iter, item->ending);
- gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, title, -1,
- self->pv->title_tag, item->extra_tag, NULL);
- gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, "\n", 1,
- item->extra_tag, NULL);
-}
-
-void
-_gcr_display_view_append_heading (GcrDisplayView *self, GcrRenderer *renderer, const gchar *heading)
-{
- GcrDisplayItem *item;
- GtkTextIter iter;
-
- g_return_if_fail (GCR_IS_DISPLAY_VIEW (self));
- g_return_if_fail (heading);
-
- item = lookup_display_item (self, renderer);
- g_return_if_fail (item);
-
- if (item->details && !item->expanded)
- return;
-
- gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &iter, item->ending);
- gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, heading, -1,
- self->pv->heading_tag, item->extra_tag, NULL);
- gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, "\n", 1,
- item->extra_tag, NULL);
-}
-
-void
-_gcr_display_view_append_fingerprint (GcrDisplayView *self, GcrRenderer *renderer, const guchar *data,
- gsize n_data, const gchar *name, GChecksumType type)
-{
- GChecksum *checksum;
- guint8 *buffer;
- gsize n_buffer;
-
- g_return_if_fail (GCR_IS_DISPLAY_VIEW (self));
-
- checksum = g_checksum_new (type);
- g_return_if_fail (checksum);
- g_checksum_update (checksum, data, n_data);
-
- n_buffer = g_checksum_type_get_length (type);
- g_return_if_fail (n_buffer);
- buffer = g_malloc0 (n_buffer);
-
- g_checksum_get_digest (checksum, buffer, &n_buffer);
- g_checksum_free (checksum);
-
- _gcr_display_view_append_hex (self, renderer, name, buffer, n_buffer);
-
- g_free (buffer);
-}
-
-void
-_gcr_display_view_append_message (GcrDisplayView *self,
- GcrRenderer *renderer,
- GtkMessageType message_type,
- const gchar *message)
-{
- const gchar *name = NULL;
- GtkWidget *image = NULL;
- GcrDisplayItem *item;
- GtkTextChildAnchor *anchor;
- GtkTextIter iter;
-
- g_return_if_fail (GCR_IS_DISPLAY_VIEW (self));
- g_return_if_fail (GCR_IS_RENDERER (renderer));
-
- item = lookup_display_item (self, renderer);
- g_return_if_fail (item);
-
- switch (message_type) {
- case GTK_MESSAGE_INFO:
- name = "dialog-information";
- break;
-
- case GTK_MESSAGE_QUESTION:
- name = "dialog-question";
- break;
-
- case GTK_MESSAGE_WARNING:
- name = "dialog-warning";
- break;
-
- case GTK_MESSAGE_ERROR:
- name = "dialog-error";
- break;
-
- case GTK_MESSAGE_OTHER:
- break;
-
- default:
- g_warning ("unknown GtkMessageType: %u", message_type);
- break;
- }
-
- gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &iter, item->ending);
-
- if (name != NULL) {
- image = gtk_image_new_from_icon_name (name, GTK_ICON_SIZE_MENU);
-#if GTK_CHECK_VERSION (3, 12, 0)
- gtk_widget_set_margin_start (image, MESSAGE_PADDING);
- gtk_widget_set_margin_end (image, MESSAGE_PADDING);
-#else
- gtk_widget_set_margin_left (image, MESSAGE_PADDING);
- gtk_widget_set_margin_right (image, MESSAGE_PADDING);
-#endif
- gtk_widget_show (image);
-
- anchor = gtk_text_buffer_create_child_anchor (self->pv->buffer, &iter);
- gtk_text_view_add_child_at_anchor (GTK_TEXT_VIEW (self), image, anchor);
- }
-
- gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, message, -1,
- self->pv->message_tag, item->extra_tag, NULL);
- gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, "\n", 1,
- item->extra_tag, NULL);
-}
-
-void
-_gcr_display_view_set_icon (GcrDisplayView *self, GcrRenderer *renderer, GIcon *icon)
-{
- GcrDisplayItem *item;
- GdkScreen *screen;
- GtkIconTheme *icon_theme;
- gint width, height;
- GtkIconInfo *info;
-
- g_return_if_fail (GCR_IS_DISPLAY_VIEW (self));
- item = lookup_display_item (self, renderer);
- g_return_if_fail (item);
-
- if (item->pixbuf)
- g_object_unref (item->pixbuf);
- item->pixbuf = NULL;
-
- if (!icon)
- return;
-
- screen = gtk_widget_get_screen (GTK_WIDGET (self));
- icon_theme = gtk_icon_theme_get_for_screen (screen);
-
- if (!gtk_icon_size_lookup (GTK_ICON_SIZE_DIALOG, &width, &height))
- g_return_if_reached ();
-
- info = gtk_icon_theme_lookup_by_gicon (icon_theme, icon, MIN (width, height),
- GTK_ICON_LOOKUP_USE_BUILTIN);
-
- if (info) {
- GtkStyleContext *style = gtk_widget_get_style_context (GTK_WIDGET (self));
- item->pixbuf = gtk_icon_info_load_symbolic_for_context (info, style, FALSE, NULL);
-#if GTK_CHECK_VERSION(3, 8, 0)
- g_object_unref (info);
-#else
- gtk_icon_info_free (info);
-#endif
- }
-}
-
-void
-_gcr_display_view_add_widget_area (GcrDisplayView *self,
- GcrRenderer *renderer,
- GtkWidget *area)
-{
- GtkTextIter iter, start;
- GcrDisplayItem *item;
-
- g_return_if_fail (GCR_IS_DISPLAY_VIEW (self));
- g_return_if_fail (GTK_IS_WIDGET (area));
-
- item = lookup_display_item (self, renderer);
- g_return_if_fail (item != NULL);
- g_return_if_fail (item->area_anchor == NULL);
-
- gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &start, item->ending);
- iter = start;
-
- gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, "\n" ZWSP, -1, self->pv->area_tag, NULL);
- gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &iter, item->ending);
-
- item->area_anchor = gtk_text_buffer_create_child_anchor (self->pv->buffer, &iter);
- g_object_ref (item->area_anchor);
- gtk_text_view_add_child_at_anchor (GTK_TEXT_VIEW (self), area, item->area_anchor);
- gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, ZWSP "\n", -1, self->pv->area_tag, NULL);
-}
diff --git a/gcr-gtk3/gcr-display-view.h b/gcr-gtk3/gcr-display-view.h
deleted file mode 100644
index 99c3bed..0000000
--- a/gcr-gtk3/gcr-display-view.h
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright (C) 2010 Stefan Walter
- *
- * 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_DISPLAY_VIEW_H__
-#define __GCR_DISPLAY_VIEW_H__
-
-#include <glib-object.h>
-#include <gtk/gtk.h>
-
-#include "gcr/gcr-certificate.h"
-#include "gcr/gcr-types.h"
-
-#include "gcr-viewer.h"
-
-G_BEGIN_DECLS
-
-#define GCR_DISPLAY_VIEW_LINE_BREAK 0x2028
-
-#define GCR_TYPE_DISPLAY_VIEW (_gcr_display_view_get_type ())
-#define GCR_DISPLAY_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_DISPLAY_VIEW, GcrDisplayView))
-#define GCR_DISPLAY_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_DISPLAY_VIEW, GcrDisplayViewClass))
-#define GCR_IS_DISPLAY_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_DISPLAY_VIEW))
-#define GCR_IS_DISPLAY_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_DISPLAY_VIEW))
-#define GCR_DISPLAY_VIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_DISPLAY_VIEW, GcrDisplayViewClass))
-
-typedef struct _GcrDisplayView GcrDisplayView;
-typedef struct _GcrDisplayViewClass GcrDisplayViewClass;
-typedef struct _GcrDisplayViewPrivate GcrDisplayViewPrivate;
-
-struct _GcrDisplayView {
- /*< private >*/
- GtkTextView parent;
- GcrDisplayViewPrivate *pv;
-};
-
-struct _GcrDisplayViewClass {
- GtkTextViewClass parent_class;
-};
-
-GType _gcr_display_view_get_type (void);
-
-GcrDisplayView* _gcr_display_view_new (void);
-
-void _gcr_display_view_begin (GcrDisplayView *self,
- GcrRenderer *renderer);
-
-void _gcr_display_view_end (GcrDisplayView *self,
- GcrRenderer *renderer);
-
-void _gcr_display_view_append_value (GcrDisplayView *self,
- GcrRenderer *renderer,
- const gchar *field,
- const gchar *value,
- gboolean monospace);
-
-void _gcr_display_view_append_hex (GcrDisplayView *self,
- GcrRenderer *renderer,
- const gchar *field,
- gconstpointer value,
- gsize n_value);
-
-void _gcr_display_view_append_title (GcrDisplayView *self,
- GcrRenderer *renderer,
- const gchar *title);
-
-void _gcr_display_view_append_content (GcrDisplayView *self,
- GcrRenderer *renderer,
- const gchar *content,
- const gchar *details);
-
-void _gcr_display_view_start_details (GcrDisplayView *self,
- GcrRenderer *renderer);
-
-void _gcr_display_view_append_heading (GcrDisplayView *self,
- GcrRenderer *renderer,
- const gchar *heading);
-
-void _gcr_display_view_append_fingerprint (GcrDisplayView *self,
- GcrRenderer *renderer,
- const guchar *data,
- gsize n_data,
- const gchar *name,
- GChecksumType type);
-
-void _gcr_display_view_append_message (GcrDisplayView *self,
- GcrRenderer *renderer,
- GtkMessageType message_type,
- const gchar *message);
-
-void _gcr_display_view_set_icon (GcrDisplayView *self,
- GcrRenderer *renderer,
- GIcon *icon);
-
-void _gcr_display_view_add_widget_area (GcrDisplayView *self,
- GcrRenderer *render,
- GtkWidget *area);
-
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrDisplayView, g_object_unref)
-
-G_END_DECLS
-
-#endif /* __GCR_DISPLAY_VIEW_H__ */
diff --git a/gcr-gtk3/gcr-failure-renderer.c b/gcr-gtk3/gcr-failure-renderer.c
deleted file mode 100644
index bd6baf2..0000000
--- a/gcr-gtk3/gcr-failure-renderer.c
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
- * Copyright (C) 2010 Stefan Walter
- *
- * 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 "config.h"
-
-#include "gcr/gcr-icons.h"
-#include "gcr/gcr-parser.h"
-
-#include "gcr-display-view.h"
-#include "gcr-failure-renderer.h"
-#include "gcr-secure-entry-buffer.h"
-
-#include <gdk/gdk.h>
-#include <glib/gi18n-lib.h>
-
-/**
- * GcrFailureRenderer:
- *
- * A renderer that can be used for unsupported data.
- */
-
-enum {
- PROP_0,
- PROP_LABEL,
- PROP_ATTRIBUTES
-};
-
-struct _GcrFailureRendererPrivate {
- gchar *label;
- GError *error;
-};
-
-static void gcr_renderer_iface_init (GcrRendererIface *iface);
-
-G_DEFINE_TYPE_WITH_CODE (GcrFailureRenderer, gcr_failure_renderer, G_TYPE_OBJECT,
- G_ADD_PRIVATE (GcrFailureRenderer);
- G_IMPLEMENT_INTERFACE (GCR_TYPE_RENDERER, gcr_renderer_iface_init);
-);
-
-static void
-gcr_failure_renderer_init (GcrFailureRenderer *self)
-{
- self->pv = gcr_failure_renderer_get_instance_private (self);
-}
-
-static void
-gcr_failure_renderer_finalize (GObject *obj)
-{
- GcrFailureRenderer *self = GCR_FAILURE_RENDERER (obj);
-
- g_error_free (self->pv->error);
- g_free (self->pv->label);
-
- G_OBJECT_CLASS (gcr_failure_renderer_parent_class)->finalize (obj);
-}
-
-static void
-gcr_failure_renderer_set_property (GObject *obj,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- GcrFailureRenderer *self = GCR_FAILURE_RENDERER (obj);
-
- switch (prop_id) {
- case PROP_LABEL:
- g_free (self->pv->label);
- self->pv->label = g_value_dup_string (value);
- g_object_notify (obj, "label");
- gcr_renderer_emit_data_changed (GCR_RENDERER (self));
- break;
- case PROP_ATTRIBUTES:
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-gcr_failure_renderer_get_property (GObject *obj,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- GcrFailureRenderer *self = GCR_FAILURE_RENDERER (obj);
-
- switch (prop_id) {
- case PROP_LABEL:
- g_value_take_string (value, self->pv->label);
- break;
- case PROP_ATTRIBUTES:
- g_value_set_boxed (value, NULL);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-gcr_failure_renderer_class_init (GcrFailureRendererClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-
- gobject_class->finalize = gcr_failure_renderer_finalize;
- gobject_class->set_property = gcr_failure_renderer_set_property;
- gobject_class->get_property = gcr_failure_renderer_get_property;
-
- g_object_class_install_property (gobject_class, PROP_LABEL,
- g_param_spec_string ("label", "Label", "Failure Label",
- "",
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
- g_object_class_install_property (gobject_class, PROP_ATTRIBUTES,
- g_param_spec_boxed ("attributes", "Attributes", "Renderer attributes",
- GCK_TYPE_ATTRIBUTES,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-}
-
-static void
-gcr_failure_renderer_render (GcrRenderer *renderer,
- GcrViewer *viewer)
-{
- GcrFailureRenderer *self = GCR_FAILURE_RENDERER (renderer);
- GcrDisplayView *view;
- gchar *display;
- GIcon *icon;
-
- if (GCR_IS_DISPLAY_VIEW (viewer)) {
- view = GCR_DISPLAY_VIEW (viewer);
-
- } else {
- g_warning ("GcrFailureRenderer only works with internal specific "
- "GcrViewer returned by gcr_viewer_new().");
- return;
- }
-
- _gcr_display_view_begin (view, renderer);
-
- if (g_error_matches (self->pv->error, GCR_DATA_ERROR, GCR_ERROR_UNRECOGNIZED))
- icon = g_themed_icon_new ("dialog-warning");
- else
- icon = g_themed_icon_new ("dialog-error");
- _gcr_display_view_set_icon (view, renderer, icon);
- g_object_unref (icon);
-
- _gcr_display_view_append_title (view, renderer, self->pv->label);
-
- if (self->pv->label)
- display = g_strdup_printf (_("Could not display “%s”"), self->pv->label);
- else
- display = g_strdup (_("Could not display file"));
- _gcr_display_view_append_content (view, renderer, display, NULL);
- g_free (display);
-
- if (self->pv->error->message)
- _gcr_display_view_append_value (view, renderer, _("Reason"),
- self->pv->error->message, FALSE);
-
- _gcr_display_view_end (view, renderer);
-}
-
-static void
-gcr_renderer_iface_init (GcrRendererIface *iface)
-{
- iface->render_view = gcr_failure_renderer_render;
-}
-
-/**
- * gcr_failure_renderer_new:
- * @label: (nullable): the label for the failure
- * @error: the error to display
- *
- * Create a new renderer for an error.
- *
- * Returns: (transfer full) (type GcrFailureRenderer): the new renderer
- */
-GcrRenderer *
-gcr_failure_renderer_new (const gchar *label,
- GError *error)
-{
- GcrFailureRenderer *renderer;
-
- renderer = g_object_new (GCR_TYPE_FAILURE_RENDERER,
- "label", label,
- NULL);
-
- renderer->pv->error = g_error_copy (error);
- return GCR_RENDERER (renderer);
-}
-
-/**
- * gcr_failure_renderer_new_unsupported:
- * @label: the label for the failure
- *
- * Create a new renderer for unsupported data.
- *
- * Returns: (transfer full): the new renderer
- */
-GcrRenderer *
-gcr_failure_renderer_new_unsupported (const gchar *label)
-{
- GcrRenderer *renderer;
- GError *error;
-
- error = g_error_new (GCR_DATA_ERROR, GCR_ERROR_UNRECOGNIZED,
- _("Cannot display a file of this type."));
-
- renderer = gcr_failure_renderer_new (label, error);
-
- g_error_free (error);
- return renderer;
-}
diff --git a/gcr-gtk3/gcr-failure-renderer.h b/gcr-gtk3/gcr-failure-renderer.h
deleted file mode 100644
index 4dd1027..0000000
--- a/gcr-gtk3/gcr-failure-renderer.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) 2011 Collabora Ltd.
- *
- * 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/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly."
-#endif
-
-#ifndef __GCR_FAILURE_RENDERER_H__
-#define __GCR_FAILURE_RENDERER_H__
-
-#include <glib-object.h>
-#include <gtk/gtk.h>
-
-#include "gcr-renderer.h"
-
-G_BEGIN_DECLS
-
-#define GCR_TYPE_FAILURE_RENDERER (gcr_failure_renderer_get_type ())
-#define GCR_FAILURE_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_FAILURE_RENDERER, GcrFailureRenderer))
-#define GCR_FAILURE_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_FAILURE_RENDERER, GcrFailureRendererClass))
-#define GCR_IS_FAILURE_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_FAILURE_RENDERER))
-#define GCR_IS_FAILURE_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_FAILURE_RENDERER))
-#define GCR_FAILURE_RENDERER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_FAILURE_RENDERER, GcrFailureRendererClass))
-
-typedef struct _GcrFailureRenderer GcrFailureRenderer;
-typedef struct _GcrFailureRendererClass GcrFailureRendererClass;
-typedef struct _GcrFailureRendererPrivate GcrFailureRendererPrivate;
-
-struct _GcrFailureRenderer {
- /*< private >*/
- GObject parent;
- GcrFailureRendererPrivate *pv;
-};
-
-struct _GcrFailureRendererClass {
- /*< private >*/
- GObjectClass parent_class;
-};
-
-GType gcr_failure_renderer_get_type (void);
-
-GcrRenderer * gcr_failure_renderer_new (const gchar *label,
- GError *error);
-
-GcrRenderer * gcr_failure_renderer_new_unsupported (const gchar *label);
-
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrFailureRenderer, g_object_unref)
-
-G_END_DECLS
-
-#endif /* __GCR_FAILURE_RENDERER_H__ */
diff --git a/gcr-gtk3/gcr-gnupg-renderer.c b/gcr-gtk3/gcr-gnupg-renderer.c
deleted file mode 100644
index 73fb5d6..0000000
--- a/gcr-gtk3/gcr-gnupg-renderer.c
+++ /dev/null
@@ -1,852 +0,0 @@
-/*
- * Copyright (C) 2011 Collabora Ltd.
- *
- * 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/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#include "config.h"
-
-#include "gcr/gcr-icons.h"
-#include "gcr/gcr-gnupg-records.h"
-#include "gcr/gcr-openpgp.h"
-#include "gcr/gcr-simple-certificate.h"
-#include "gcr/gcr-types.h"
-
-#include "gcr-display-view.h"
-#include "gcr-gnupg-renderer.h"
-#include "gcr-renderer.h"
-
-#include "gck/gck.h"
-
-#include "egg/egg-hex.h"
-
-#include <gdk/gdk.h>
-#include <glib/gi18n-lib.h>
-
-#include <stdlib.h>
-
-enum {
- PROP_0,
- PROP_RECORDS,
- PROP_LABEL,
- PROP_ATTRIBUTES
-};
-
-struct _GcrGnupgRendererPrivate {
- GPtrArray *records;
- GckAttributes *attrs;
- gchar *label;
-};
-
-static void _gcr_gnupg_renderer_iface_init (GcrRendererIface *iface);
-
-G_DEFINE_TYPE_WITH_CODE (GcrGnupgRenderer, _gcr_gnupg_renderer, G_TYPE_OBJECT,
- G_ADD_PRIVATE (GcrGnupgRenderer);
- G_IMPLEMENT_INTERFACE (GCR_TYPE_RENDERER, _gcr_gnupg_renderer_iface_init);
-);
-
-/* -----------------------------------------------------------------------------
- * INTERNAL
- */
-
-static gchar *
-calculate_label (GcrGnupgRenderer *self)
-{
- gchar *userid;
- gchar *label = NULL;
-
- if (self->pv->attrs) {
- if (gck_attributes_find_string (self->pv->attrs, CKA_LABEL, &label))
- return label;
- }
-
- userid = _gcr_gnupg_records_get_user_id (self->pv->records);
- if (userid != NULL) {
- if (!_gcr_gnupg_records_parse_user_id (userid, &label, NULL, NULL))
- label = NULL;
- }
-
- if (label != NULL)
- return label;
-
- if (self->pv->label)
- return g_strdup (self->pv->label);
-
- return g_strdup (_("PGP Key"));
-}
-
-static void
-_gcr_gnupg_renderer_init (GcrGnupgRenderer *self)
-{
- self->pv = _gcr_gnupg_renderer_get_instance_private (self);
-}
-
-static void
-_gcr_gnupg_renderer_finalize (GObject *obj)
-{
- GcrGnupgRenderer *self = GCR_GNUPG_RENDERER (obj);
-
- gck_attributes_unref (self->pv->attrs);
- g_free (self->pv->label);
- if (self->pv->records)
- g_ptr_array_unref (self->pv->records);
-
- G_OBJECT_CLASS (_gcr_gnupg_renderer_parent_class)->finalize (obj);
-}
-
-static void
-_gcr_gnupg_renderer_set_property (GObject *obj,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- GcrGnupgRenderer *self = GCR_GNUPG_RENDERER (obj);
-
- switch (prop_id) {
- case PROP_RECORDS:
- _gcr_gnupg_renderer_set_records (self, g_value_get_boxed (value));
- break;
- case PROP_LABEL:
- g_free (self->pv->label);
- self->pv->label = g_value_dup_string (value);
- g_object_notify (obj, "label");
- gcr_renderer_emit_data_changed (GCR_RENDERER (self));
- break;
- case PROP_ATTRIBUTES:
- _gcr_gnupg_renderer_set_attributes (self, g_value_get_boxed (value));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-_gcr_gnupg_renderer_get_property (GObject *obj,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- GcrGnupgRenderer *self = GCR_GNUPG_RENDERER (obj);
-
- switch (prop_id) {
- case PROP_RECORDS:
- g_value_set_object (value, self->pv->records);
- break;
- case PROP_LABEL:
- g_value_take_string (value, calculate_label (self));
- break;
- case PROP_ATTRIBUTES:
- g_value_set_boxed (value, self->pv->attrs);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-_gcr_gnupg_renderer_class_init (GcrGnupgRendererClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
- GckBuilder builder = GCK_BUILDER_INIT;
-
- _gcr_gnupg_renderer_parent_class = g_type_class_peek_parent (klass);
-
- gobject_class->finalize = _gcr_gnupg_renderer_finalize;
- gobject_class->set_property = _gcr_gnupg_renderer_set_property;
- gobject_class->get_property = _gcr_gnupg_renderer_get_property;
-
- g_object_class_install_property (gobject_class, PROP_RECORDS,
- g_param_spec_boxed ("records", "Records", "Gnupg records to display",
- G_TYPE_PTR_ARRAY,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
- g_object_class_install_property (gobject_class, PROP_ATTRIBUTES,
- g_param_spec_boxed ("attributes", "Attributes", "Certificate pkcs11 attributes",
- GCK_TYPE_ATTRIBUTES,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
- g_object_class_install_property (gobject_class, PROP_LABEL,
- g_param_spec_string ("label", "Label", "Certificate Label",
- "",
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
- /* Register this as a renderer which can be loaded */
- gck_builder_add_ulong (&builder, CKA_CLASS, CKO_GCR_GNUPG_RECORDS);
- gcr_renderer_register (GCR_TYPE_GNUPG_RENDERER, gck_builder_end (&builder));
-}
-
-static const gchar *
-name_for_algo (guint algo)
-{
- switch (algo)
- {
- case GCR_OPENPGP_ALGO_RSA:
- case GCR_OPENPGP_ALGO_RSA_E:
- case GCR_OPENPGP_ALGO_RSA_S:
- return _("RSA");
- case GCR_OPENPGP_ALGO_ELG_E:
- return _("Elgamal");
- case GCR_OPENPGP_ALGO_DSA:
- return _("DSA");
- default:
- return NULL;
- }
-}
-
-static const gchar *
-capability_for_code (gchar code)
-{
- switch (code) {
- case 'e': case 'E':
- return _("Encrypt");
- case 's': case 'S':
- return _("Sign");
- case 'c': case 'C':
- return _("Certify");
- case 'a': case 'A':
- return _("Authenticate");
- case 'D':
- return C_("capability", "Disabled");
- default:
- return NULL;
- }
-}
-
-static gchar *
-capabilities_for_codes (const gchar *codes)
-{
- const gchar *cap;
- GString *result;
- guint i;
-
- result = g_string_new ("");
- for (i = 0; codes[i] != 0; i++) {
- if (result->len)
- g_string_append_unichar (result, GCR_DISPLAY_VIEW_LINE_BREAK);
- cap = capability_for_code (codes[i]);
- if (cap != NULL)
- g_string_append (result, cap);
- else
- g_string_append_c (result, codes[i]);
- }
- return g_string_free (result, FALSE);
-}
-
-static const gchar *
-status_for_code (gchar code)
-{
- switch (code) {
- case 'o':
- return _("Unknown");
- case 'i':
- return _("Invalid");
- case 'd':
- return C_("ownertrust", "Disabled");
- case 'r':
- return _("Revoked");
- case 'e':
- return _("Expired");
- case 'q': case '-':
- return _("Undefined trust");
- case 'n':
- return _("Distrusted");
- case 'm':
- return _("Marginally trusted");
- case 'f':
- return _("Fully trusted");
- case 'u':
- return _("Ultimately trusted");
- default:
- return NULL;
- }
-}
-
-static const gchar *
-message_for_code (gchar code,
- GtkMessageType *message_type)
-{
- *message_type = GTK_MESSAGE_OTHER;
- switch (code) {
- case 'o':
- *message_type = GTK_MESSAGE_QUESTION;
- return _("The information in this key has not yet been verified");
- case 'i':
- *message_type = GTK_MESSAGE_ERROR;
- return _("This key is invalid");
- case 'd':
- *message_type = GTK_MESSAGE_WARNING;
- return _("This key has been disabled");
- case 'r':
- *message_type = GTK_MESSAGE_ERROR;
- return _("This key has been revoked");
- case 'e':
- *message_type = GTK_MESSAGE_ERROR;
- return _("This key has expired");
- case 'q': case '-':
- return NULL;
- case 'n':
- *message_type = GTK_MESSAGE_WARNING;
- return _("This key is distrusted");
- case 'm':
- *message_type = GTK_MESSAGE_OTHER;
- return _("This key is marginally trusted");
- case 'f':
- *message_type = GTK_MESSAGE_OTHER;
- return _("This key is fully trusted");
- case 'u':
- *message_type = GTK_MESSAGE_OTHER;
- return _("This key is ultimately trusted");
- default:
- return NULL;
- }
-}
-
-static void
-append_key_record (GcrGnupgRenderer *self,
- GcrDisplayView *view,
- GcrRecord *record,
- const gchar *title)
-{
- GcrRenderer *renderer = GCR_RENDERER (self);
- const gchar *value;
- gchar *display;
- GDateTime *date;
- gchar code;
- guint algo;
- guint bits;
-
- _gcr_display_view_append_heading (view, renderer, title);
-
- /* Key ID */
- value = _gcr_record_get_raw (record, GCR_RECORD_KEY_KEYID);
- if (value != NULL)
- _gcr_display_view_append_value (view, renderer, _("Key ID"), value, TRUE);
-
- /* Algorithm */
- if (_gcr_record_get_uint (record, GCR_RECORD_KEY_ALGO, &algo)) {
- display = NULL;
- value = name_for_algo (algo);
- if (value == NULL)
- value = display = g_strdup_printf ("%u", algo);
- _gcr_display_view_append_value (view, renderer, _("Algorithm"), value, FALSE);
- g_free (display);
- }
-
- /* Key Size */
- if (_gcr_record_get_uint (record, GCR_RECORD_KEY_BITS, &bits)) {
- display = g_strdup_printf ("%u", bits);
- _gcr_display_view_append_value (view, renderer, _("Key Size"), display, FALSE);
- g_free (display);
- }
-
- /* Created */
- date = _gcr_record_get_date (record, GCR_RECORD_KEY_TIMESTAMP);
- if (date != NULL) {
- display = g_date_time_format (date, "%x");
- _gcr_display_view_append_value (view, renderer, _("Created"), display, FALSE);
- g_free (display);
- g_date_time_unref (date);
- }
-
- /* Expiry */
- date = _gcr_record_get_date (record, GCR_RECORD_KEY_EXPIRY);
- if (date != NULL) {
- display = g_date_time_format (date, "%x");
- _gcr_display_view_append_value (view, renderer, _("Expiry"), display, FALSE);
- g_free (display);
- g_date_time_unref (date);
- }
-
- /* Capabilities */
- value = _gcr_record_get_raw (record, GCR_RECORD_PUB_CAPS);
- if (value != NULL && value[0] != '\0') {
- display = capabilities_for_codes (value);
- _gcr_display_view_append_value (view, renderer, _("Capabilities"), display, FALSE);
- g_free (display);
- }
-
- /* Owner Trust */
- code = _gcr_record_get_char (record, GCR_RECORD_KEY_OWNERTRUST);
- if (code != 0) {
- display = NULL;
- value = status_for_code (code);
- if (value == NULL) {
- value = display = g_new0 (gchar, 2);
- display[0] = code;
- }
- _gcr_display_view_append_value (view, renderer, _("Owner trust"), value, FALSE);
- g_free (display);
- }
-}
-
-static void
-append_uid_record (GcrGnupgRenderer *self,
- GcrDisplayView *view,
- GcrRecord *record)
-{
- GcrRenderer *renderer = GCR_RENDERER (self);
- gchar *userid;
- gchar *name;
- gchar *comment;
- gchar *email;
- GDateTime *date;
- gchar *display;
-
- _gcr_display_view_append_heading (view, renderer, _("User ID"));
-
- userid = _gcr_record_get_string (record, GCR_RECORD_UID_USERID);
- if (userid == NULL) {
- _gcr_display_view_append_value (view, renderer, _("Value"), _("Unknown"), FALSE);
- return;
- }
-
- if (_gcr_gnupg_records_parse_user_id (userid, &name, &email, &comment)) {
- if (name != NULL)
- _gcr_display_view_append_value (view, renderer, _("Name"), name, FALSE);
- g_free (name);
- if (email != NULL)
- _gcr_display_view_append_value (view, renderer, _("Email"), email, FALSE);
- g_free (email);
- if (comment != NULL)
- _gcr_display_view_append_value (view, renderer, _("Comment"), comment, FALSE);
- g_free (comment);
-
- /* Unparseable user id */
- } else {
- _gcr_display_view_append_value (view, renderer, _("Value"), userid, FALSE);
- }
-
- /* Created */
- date = _gcr_record_get_date (record, GCR_RECORD_UID_TIMESTAMP);
- if (date != NULL) {
- display = g_date_time_format (date, "%x");
- _gcr_display_view_append_value (view, renderer, _("Created"), display, FALSE);
- g_free (display);
- g_date_time_unref (date);
- }
-
- /* Expiry */
- date = _gcr_record_get_date (record, GCR_RECORD_UID_EXPIRY);
- if (date != NULL) {
- display = g_date_time_format (date, "%x");
- _gcr_display_view_append_value (view, renderer, _("Expiry"), display, FALSE);
- g_free (display);
- g_date_time_unref (date);
- }
-
- g_free (userid);
-}
-
-static void
-append_uat_record (GcrGnupgRenderer *self,
- GcrDisplayView *view,
- GcrRecord *record)
-{
- GcrRenderer *renderer = GCR_RENDERER (self);
- gchar **parts;
- gchar *display;
- const gchar *value;
- GDateTime *date;
-
- _gcr_display_view_append_heading (view, renderer, _("User Attribute"));
-
- /* Size */
- value = _gcr_record_get_raw (record, GCR_RECORD_UAT_COUNT_SIZE);
- if (value != NULL) {
- parts = g_strsplit (value, " ", 2);
- if (parts && parts[0] && parts[1])
- _gcr_display_view_append_value (view, renderer, _("Size"), parts[1], FALSE);
- g_strfreev (parts);
- }
-
- /* Created */
- date = _gcr_record_get_date (record, GCR_RECORD_KEY_TIMESTAMP);
- if (date != NULL) {
- display = g_date_time_format (date, "%x");
- _gcr_display_view_append_value (view, renderer, _("Created"), display, FALSE);
- g_free (display);
- g_date_time_unref (date);
- }
-
- /* Expiry */
- date = _gcr_record_get_date (record, GCR_RECORD_KEY_EXPIRY);
- if (date != NULL) {
- display = g_date_time_format (date, "%x");
- _gcr_display_view_append_value (view, renderer, _("Expiry"), display, FALSE);
- g_free (display);
- g_date_time_unref (date);
- }
-}
-
-static const gchar *
-signature_klass_string (const gchar *klass)
-{
- char *end;
- guint val;
-
- val = strtoul (klass, &end, 16);
- if (end != klass + 2)
- return NULL;
-
- switch (val) {
- case 0x00:
- return _("Signature of a binary document");
- case 0x01:
- return _("Signature of a canonical text document");
- case 0x02:
- return _("Standalone signature");
- case 0x10:
- return _("Generic certification of key");
- case 0x11:
- return _("Persona certification of key");
- case 0x12:
- return _("Casual certification of key");
- case 0x13:
- return _("Positive certification of key");
- case 0x18:
- return _("Subkey binding signature");
- case 0x19:
- return _("Primary key binding signature");
- case 0x1F:
- return _("Signature directly on key");
- case 0x20:
- return _("Key revocation signature");
- case 0x28:
- return _("Subkey revocation signature");
- case 0x30:
- return _("Certification revocation signature");
- case 0x40:
- return _("Timestamp signature");
- case 0x50:
- return _("Third-party confirmation signature");
- default:
- return NULL;
- }
-}
-
-static void
-append_sig_record (GcrGnupgRenderer *self,
- GcrDisplayView *view,
- GcrRecord *record,
- const gchar *keyid)
-{
- GcrRenderer *renderer = GCR_RENDERER (self);
- const gchar *sigid;
- gchar *display;
- const gchar *value;
- const gchar *klass;
- guint algo;
-
- /* Hide self-signatures. There's so many of them */
- sigid = _gcr_record_get_raw (record, GCR_RECORD_SIG_KEYID);
- if (sigid && keyid && g_str_equal (sigid, keyid))
- return;
-
- _gcr_display_view_append_heading (view, renderer, _("Signature"));
-
- /* Key ID */
- if (sigid != NULL)
- _gcr_display_view_append_value (view, renderer, _("Key ID"), sigid, TRUE);
-
- /* Algorithm */
- if (_gcr_record_get_uint (record, GCR_RECORD_SIG_ALGO, &algo)) {
- display = NULL;
- value = name_for_algo (algo);
- if (value == NULL)
- value = display = g_strdup_printf ("%u", algo);
- _gcr_display_view_append_value (view, renderer, _("Algorithm"), value, FALSE);
- g_free (display);
- }
-
- /* User ID */
- display = _gcr_record_get_string (record, GCR_RECORD_SIG_USERID);
- if (display != NULL)
- _gcr_display_view_append_value (view, renderer, _("User ID"), display, FALSE);
- g_free (display);
-
- /* Signature class */
- klass = _gcr_record_get_raw (record, GCR_RECORD_SIG_CLASS);
- if (klass != NULL) {
- value = NULL;
- if (strlen (klass) >= 2) {
- value = signature_klass_string (klass);
- if (value != NULL) {
- _gcr_display_view_append_value (view, renderer, _("Class"), value, FALSE);
- if (klass[2] == 'l')
- _gcr_display_view_append_value (view, renderer, _("Type"), _("Local only"), FALSE);
- else if (klass[2] == 'x')
- _gcr_display_view_append_value (view, renderer, _("Type"), _("Exportable"), FALSE);
- }
- }
- if (value == NULL)
- _gcr_display_view_append_value (view, renderer, _("Class"), klass, FALSE);
- }
-}
-
-static void
-append_rvk_record (GcrGnupgRenderer *self,
- GcrDisplayView *view,
- GcrRecord *record)
-{
- GcrRenderer *renderer = GCR_RENDERER (self);
- const gchar *value;
- gchar *display;
- guint algo;
-
- _gcr_display_view_append_heading (view, renderer, _("Revocation Key"));
-
- /* Algorithm */
- if (_gcr_record_get_uint (record, GCR_RECORD_RVK_ALGO, &algo)) {
- display = NULL;
- value = name_for_algo (algo);
- if (value == NULL)
- value = display = g_strdup_printf ("%u", algo);
- _gcr_display_view_append_value (view, renderer, _("Algorithm"), value, FALSE);
- g_free (display);
- }
-
- value = _gcr_record_get_raw (record, GCR_RECORD_RVK_FINGERPRINT);
- if (value != NULL)
- _gcr_display_view_append_value (view, renderer, _("Fingerprint"), value, TRUE);
-}
-
-static void
-append_fpr_record (GcrGnupgRenderer *self,
- GcrDisplayView *view,
- GcrRecord *record,
- GQuark last_schema)
-{
- GcrRenderer *renderer = GCR_RENDERER (self);
- const gchar *value;
- gpointer raw;
- gsize n_raw;
-
- if (last_schema != GCR_RECORD_SCHEMA_PUB &&
- last_schema != GCR_RECORD_SCHEMA_SUB &&
- last_schema != GCR_RECORD_SCHEMA_SEC &&
- last_schema != GCR_RECORD_SCHEMA_SSB)
- return;
-
- value = _gcr_record_get_raw (record, GCR_RECORD_FPR_FINGERPRINT);
- if (value != NULL) {
- raw = egg_hex_decode (value, -1, &n_raw);
- if (raw != NULL)
- _gcr_display_view_append_hex (view, renderer, _("Fingerprint"), raw, n_raw);
- else
- _gcr_display_view_append_value (view, renderer, _("Fingerprint"), value, TRUE);
- g_free (raw);
- }
-}
-
-static void
-_gcr_gnupg_renderer_render (GcrRenderer *renderer,
- GcrViewer *viewer)
-{
- GtkMessageType message_type;
- GcrGnupgRenderer *self;
- GcrDisplayView *view;
- GDateTime *date;
- const gchar *value;
- gchar *display;
- gchar *userid;
- gchar *email;
- gchar *comment;
- GIcon *icon;
- GQuark schema;
- GQuark last_schema;
- gchar code;
- guint i;
-
- self = GCR_GNUPG_RENDERER (renderer);
-
- if (GCR_IS_DISPLAY_VIEW (viewer)) {
- view = GCR_DISPLAY_VIEW (viewer);
-
- } else {
- g_warning ("GcrGnupgRenderer only works with internal specific "
- "GcrViewer returned by gcr_viewer_new().");
- return;
- }
-
- _gcr_display_view_begin (view, renderer);
-
- if (self->pv->records == NULL || self->pv->records->len == 0) {
- _gcr_display_view_end (view, renderer);
- return;
- }
-
- icon = _gcr_gnupg_records_get_icon (self->pv->records);
- _gcr_display_view_set_icon (view, GCR_RENDERER (self), icon);
- g_object_unref (icon);
-
- display = calculate_label (self);
- _gcr_display_view_append_title (view, renderer, display);
- g_free (display);
-
- userid = _gcr_gnupg_records_get_user_id (self->pv->records);
- if (userid != NULL) {
- if (_gcr_gnupg_records_parse_user_id (userid, NULL, &email, &comment)) {
- if (email != NULL)
- _gcr_display_view_append_content (view, renderer, _("Email"), email);
- g_free (email);
- if (comment != NULL)
- _gcr_display_view_append_content (view, renderer, _("Comment"), comment);
- g_free (comment);
- }
- g_free (userid);
- }
-
- code = _gcr_record_get_char (self->pv->records->pdata[0], GCR_RECORD_TRUST);
- if (code != 'e') {
- date = _gcr_record_get_date (self->pv->records->pdata[0], GCR_RECORD_KEY_EXPIRY);
- if (date != NULL) {
- display = g_date_time_format (date, "%x");
- _gcr_display_view_append_content (view, renderer, _("Expires"), display);
- g_date_time_unref (date);
- g_free (display);
- }
- }
-
- /* The warning or status */
- value = message_for_code (code, &message_type);
- if (value != NULL)
- _gcr_display_view_append_message (view, renderer, message_type, value);
-
- _gcr_display_view_start_details (view, renderer);
-
- value = _gcr_gnupg_records_get_keyid (self->pv->records);
- last_schema = 0;
-
- for (i = 0; i < self->pv->records->len; i++) {
- schema = _gcr_record_get_schema (self->pv->records->pdata[i]);
- if (schema == GCR_RECORD_SCHEMA_PUB)
- append_key_record (self, view, self->pv->records->pdata[i], _("Public Key"));
- else if (schema == GCR_RECORD_SCHEMA_SUB)
- append_key_record (self, view, self->pv->records->pdata[i], _("Public Subkey"));
- else if (schema == GCR_RECORD_SCHEMA_SEC)
- append_key_record (self, view, self->pv->records->pdata[i], _("Secret Key"));
- else if (schema == GCR_RECORD_SCHEMA_SSB)
- append_key_record (self, view, self->pv->records->pdata[i], _("Secret Subkey"));
- else if (schema == GCR_RECORD_SCHEMA_UID)
- append_uid_record (self, view, self->pv->records->pdata[i]);
- else if (schema == GCR_RECORD_SCHEMA_UAT)
- append_uat_record (self, view, self->pv->records->pdata[i]);
- else if (schema == GCR_RECORD_SCHEMA_SIG)
- append_sig_record (self, view, self->pv->records->pdata[i], value);
- else if (schema == GCR_RECORD_SCHEMA_RVK)
- append_rvk_record (self, view, self->pv->records->pdata[i]);
- else if (schema == GCR_RECORD_SCHEMA_FPR)
- append_fpr_record (self, view, self->pv->records->pdata[i], last_schema);
- last_schema = schema;
- }
-
- _gcr_display_view_end (view, renderer);
-}
-
-static void
-_gcr_gnupg_renderer_iface_init (GcrRendererIface *iface)
-{
- iface->render_view = _gcr_gnupg_renderer_render;
-}
-
-GcrGnupgRenderer *
-_gcr_gnupg_renderer_new (GPtrArray *records)
-{
- g_return_val_if_fail (records != NULL, NULL);
-
- return g_object_new (GCR_TYPE_GNUPG_RENDERER,
- "records", records,
- NULL);
-}
-
-GcrGnupgRenderer *
-_gcr_gnupg_renderer_new_for_attributes (const gchar *label,
- GckAttributes *attrs)
-{
- g_return_val_if_fail (attrs != NULL, NULL);
-
- return g_object_new (GCR_TYPE_GNUPG_RENDERER,
- "label", label,
- "attributes", attrs,
- NULL);
-}
-
-GPtrArray *
-_gcr_gnupg_renderer_get_records (GcrGnupgRenderer *self)
-{
- g_return_val_if_fail (GCR_IS_GNUPG_RENDERER (self), NULL);
- return self->pv->records;
-}
-
-void
-_gcr_gnupg_renderer_set_records (GcrGnupgRenderer *self,
- GPtrArray *records)
-{
- g_return_if_fail (GCR_IS_GNUPG_RENDERER (self));
-
- if (records)
- g_ptr_array_ref (records);
- if (self->pv->records)
- g_ptr_array_unref (self->pv->records);
- self->pv->records = records;
-
- if (self->pv->attrs) {
- gck_attributes_unref (self->pv->attrs);
- self->pv->attrs = NULL;
- g_object_notify (G_OBJECT (self), "attributes");
- }
-
- gcr_renderer_emit_data_changed (GCR_RENDERER (self));
- g_object_notify (G_OBJECT (self), "records");
-}
-
-GckAttributes*
-_gcr_gnupg_renderer_get_attributes (GcrGnupgRenderer *self)
-{
- g_return_val_if_fail (GCR_IS_GNUPG_RENDERER (self), NULL);
- return self->pv->attrs;
-}
-
-void
-_gcr_gnupg_renderer_set_attributes (GcrGnupgRenderer *self,
- GckAttributes *attrs)
-{
- const GckAttribute *attr;
- GPtrArray *records;
-
- g_return_if_fail (GCR_IS_GNUPG_RENDERER (self));
-
- attr = gck_attributes_find (attrs, CKA_VALUE);
- g_return_if_fail (attr != NULL);
- records = _gcr_records_parse_colons (attr->value, attr->length);
- g_return_if_fail (records != NULL);
-
- if (attrs)
- gck_attributes_ref (attrs);
- gck_attributes_unref (self->pv->attrs);
- self->pv->attrs = attrs;
-
- if (self->pv->records)
- g_ptr_array_unref (self->pv->records);
- self->pv->records = records;
- g_object_notify (G_OBJECT (self), "records");
-
- gcr_renderer_emit_data_changed (GCR_RENDERER (self));
- g_object_notify (G_OBJECT (self), "attributes");
-
-}
diff --git a/gcr-gtk3/gcr-gnupg-renderer.h b/gcr-gtk3/gcr-gnupg-renderer.h
deleted file mode 100644
index fc68713..0000000
--- a/gcr-gtk3/gcr-gnupg-renderer.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (C) 2011 Collabora Ltd.
- *
- * 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/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#if !defined (__GCR_H_INSIDE__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> can be included directly."
-#endif
-
-#ifndef __GCR_GNUPG_RENDERER_H__
-#define __GCR_GNUPG_RENDERER_H__
-
-#include <glib-object.h>
-#include <gtk/gtk.h>
-
-#include "gcr/gcr-record.h"
-
-G_BEGIN_DECLS
-
-#define GCR_TYPE_GNUPG_RENDERER (_gcr_gnupg_renderer_get_type ())
-#define GCR_GNUPG_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_GNUPG_RENDERER, GcrGnupgRenderer))
-#define GCR_GNUPG_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_GNUPG_RENDERER, GcrGnupgRendererClass))
-#define GCR_IS_GNUPG_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_GNUPG_RENDERER))
-#define GCR_IS_GNUPG_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_GNUPG_RENDERER))
-#define GCR_GNUPG_RENDERER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_GNUPG_RENDERER, GcrGnupgRendererClass))
-
-typedef struct _GcrGnupgRenderer GcrGnupgRenderer;
-typedef struct _GcrGnupgRendererClass GcrGnupgRendererClass;
-typedef struct _GcrGnupgRendererPrivate GcrGnupgRendererPrivate;
-
-struct _GcrGnupgRenderer {
- GObject parent;
-
- /*< private >*/
- GcrGnupgRendererPrivate *pv;
-};
-
-struct _GcrGnupgRendererClass {
- GObjectClass parent_class;
-};
-
-GType _gcr_gnupg_renderer_get_type (void);
-
-GcrGnupgRenderer * _gcr_gnupg_renderer_new (GPtrArray *records);
-
-GcrGnupgRenderer * _gcr_gnupg_renderer_new_for_attributes (const gchar *label,
- GckAttributes *attrs);
-
-GPtrArray * _gcr_gnupg_renderer_get_records (GcrGnupgRenderer *self);
-
-void _gcr_gnupg_renderer_set_records (GcrGnupgRenderer *self,
- GPtrArray *records);
-
-GckAttributes * _gcr_gnupg_renderer_get_attributes (GcrGnupgRenderer *self);
-
-void _gcr_gnupg_renderer_set_attributes (GcrGnupgRenderer *self,
- GckAttributes *attrs);
-
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrGnupgRenderer, g_object_unref)
-
-G_END_DECLS
-
-#endif /* __GCR_GNUPG_RENDERER_H__ */
diff --git a/gcr-gtk3/gcr-gtk3.h b/gcr-gtk3/gcr-gtk3.h
index 67b99d8..53b5850 100644
--- a/gcr-gtk3/gcr-gtk3.h
+++ b/gcr-gtk3/gcr-gtk3.h
@@ -32,25 +32,8 @@
#define __GCR_INSIDE_HEADER__
-#include <gcr-gtk3/gcr-certificate-renderer.h>
#include <gcr-gtk3/gcr-certificate-widget.h>
-#include <gcr-gtk3/gcr-collection-model.h>
-#include <gcr-gtk3/gcr-combo-selector.h>
-#include <gcr-gtk3/gcr-enum-types.h>
-#include <gcr-gtk3/gcr-key-renderer.h>
-#include <gcr-gtk3/gcr-key-widget.h>
-#include <gcr-gtk3/gcr-failure-renderer.h>
-#include <gcr-gtk3/gcr-key-renderer.h>
-#include <gcr-gtk3/gcr-key-widget.h>
-#include <gcr-gtk3/gcr-import-button.h>
-#include <gcr-gtk3/gcr-list-selector.h>
-#include <gcr-gtk3/gcr-prompt-dialog.h>
-#include <gcr-gtk3/gcr-renderer.h>
#include <gcr-gtk3/gcr-secure-entry-buffer.h>
-#include <gcr-gtk3/gcr-tree-selector.h>
-#include <gcr-gtk3/gcr-unlock-options-widget.h>
-#include <gcr-gtk3/gcr-viewer.h>
-#include <gcr-gtk3/gcr-viewer-widget.h>
#undef __GCR_INSIDE_HEADER__
diff --git a/gcr-gtk3/gcr-import-button.c b/gcr-gtk3/gcr-import-button.c
deleted file mode 100644
index f3a6478..0000000
--- a/gcr-gtk3/gcr-import-button.c
+++ /dev/null
@@ -1,592 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2011 Collabora Ltd.
- *
- * 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/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#include "config.h"
-
-#include "gcr/gcr-internal.h"
-#include "gcr/gcr-library.h"
-#include "gcr/gcr-marshal.h"
-#include "gcr/gcr-parser.h"
-#include "gcr/gcr-version.h"
-
-#include "eggimagemenuitem.h"
-#include "gcr-import-button.h"
-#include "gcr-pkcs11-import-interaction.h"
-
-#include <glib/gi18n-lib.h>
-
-enum {
- PROP_0,
- PROP_LABEL
-};
-
-/**
- * GcrImportButton:
- *
- * A button which imports keys and certificates.
- *
- * The import button shows a spinner when the button is activated. When more
- * than one importer is available, it shows a drop down to select which to
- * import to.
- */
-
-/**
- * GcrImportButtonClass:
- * @parent_class: The parent class
- * @importing: Emitted when the import begins.
- * @imported: Emitted when the import completes, or fails.
- *
- * Class struct for [class@ImportButton].
- */
-
-struct _GcrImportButtonPrivate {
- GList *queued;
- GList *importers;
- gboolean ready;
- gboolean created;
- gboolean importing;
- gchar *imported;
- GtkWidget *spinner;
- GtkWidget *arrow;
- GtkWidget *label;
- GCancellable *cancellable;
- GtkMenu *menu;
-};
-
-enum {
- IMPORTING,
- IMPORTED,
- LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL] = { 0 };
-
-static GQuark QUARK_IMPORTER = 0;
-
-#if GCR_CHECK_VERSION(4,0,0)
-#error Port this class to derive from GtkMenuButton during 4.x ABI bump
-#endif
-
-G_DEFINE_TYPE_WITH_PRIVATE (GcrImportButton, gcr_import_button, GTK_TYPE_BUTTON);
-
-static void
-gcr_import_button_init (GcrImportButton *self)
-{
- self->pv = gcr_import_button_get_instance_private (self);
- self->pv->cancellable = g_cancellable_new ();
-
- self->pv->label = gtk_label_new ("");
- gtk_label_set_use_underline (GTK_LABEL (self->pv->label), TRUE);
-}
-
-static void
-update_import_button (GcrImportButton *self)
-{
- gchar *message;
- gchar *label;
-
- /* Initializing, set a spinner */
- if (self->pv->queued && !self->pv->ready) {
- gtk_widget_show (self->pv->spinner);
- gtk_spinner_start (GTK_SPINNER (self->pv->spinner));
- gtk_widget_hide (self->pv->arrow);
- gtk_widget_set_sensitive (GTK_WIDGET (self), FALSE);
- gtk_widget_set_tooltip_text (GTK_WIDGET (self), _("Initializing\xE2\x80\xA6"));
-
- /* Importing, set a spinner */
- } else if (self->pv->importing) {
- gtk_widget_show (self->pv->spinner);
- gtk_spinner_start (GTK_SPINNER (self->pv->spinner));
- gtk_widget_hide (self->pv->arrow);
- gtk_widget_set_sensitive (GTK_WIDGET (self), FALSE);
- gtk_widget_set_tooltip_text (GTK_WIDGET (self), _("Import is in progress\xE2\x80\xA6"));
-
- } else if (self->pv->imported) {
- gtk_widget_hide (self->pv->spinner);
- gtk_spinner_stop (GTK_SPINNER (self->pv->spinner));
- gtk_widget_hide (self->pv->arrow);
- gtk_widget_set_sensitive (GTK_WIDGET (self), FALSE);
- message = g_strdup_printf (_("Imported to: %s"), self->pv->imported);
- gtk_widget_set_tooltip_text (GTK_WIDGET (self), message);
- g_free (message);
-
- /* Not importing, but have importers */
- } else if (self->pv->importers) {
-
- gtk_widget_hide (self->pv->spinner);
- gtk_spinner_stop (GTK_SPINNER (self->pv->spinner));
- gtk_widget_set_sensitive (GTK_WIDGET (self), TRUE);
-
- /* More than one importer */
- if (self->pv->importers->next) {
- gtk_widget_show (self->pv->arrow);
- gtk_widget_set_tooltip_text (GTK_WIDGET (self), NULL);
-
- /* Only one importer */
- } else {
- gtk_widget_hide (self->pv->arrow);
- g_object_get (self->pv->importers->data, "label", &label, NULL);
- message = g_strdup_printf (_("Import to: %s"), label);
- gtk_widget_set_tooltip_text (GTK_WIDGET (self), message);
- g_free (message);
- g_free (label);
- }
-
- /* No importers, none compatible */
- } else if (self->pv->created) {
- gtk_widget_hide (self->pv->spinner);
- gtk_spinner_stop (GTK_SPINNER (self->pv->spinner));
- gtk_widget_hide (self->pv->arrow);
-
- gtk_widget_set_sensitive (GTK_WIDGET (self), FALSE);
- gtk_widget_set_tooltip_text (GTK_WIDGET (self), _("Cannot import because there are no compatible importers"));
-
- /* No importers yet added */
- } else {
- gtk_widget_hide (self->pv->spinner);
- gtk_spinner_stop (GTK_SPINNER (self->pv->spinner));
- gtk_widget_hide (self->pv->arrow);
-
- gtk_widget_set_sensitive (GTK_WIDGET (self), FALSE);
- gtk_widget_set_tooltip_text (GTK_WIDGET (self), _("No data to import"));
- }
-}
-
-static void
-on_library_pkcs11_ready (GObject *source,
- GAsyncResult *result,
- gpointer user_data)
-{
- GcrImportButton *self = GCR_IMPORT_BUTTON (user_data);
- GList *queued, *l;
-
- self->pv->ready = TRUE;
-
- /* Process the parsed items that have been seen */
- queued = self->pv->queued;
- self->pv->queued = NULL;
- for (l = queued; l != NULL; l = g_list_next (l))
- gcr_import_button_add_parsed (self, l->data);
- g_assert (self->pv->queued == NULL);
- g_list_free_full (queued, gcr_parsed_unref);
-}
-
-static void
-gcr_import_button_constructed (GObject *obj)
-{
- GcrImportButton *self = GCR_IMPORT_BUTTON (obj);
- GtkWidget *grid;
-
- G_OBJECT_CLASS (gcr_import_button_parent_class)->constructed (obj);
-
- self->pv->spinner = gtk_spinner_new ();
- self->pv->arrow = gtk_image_new_from_icon_name ("pan-down-symbolic", GTK_ICON_SIZE_BUTTON);
- grid = gtk_grid_new ();
-
- gtk_orientable_set_orientation (GTK_ORIENTABLE (grid), GTK_ORIENTATION_HORIZONTAL);
- gtk_container_add (GTK_CONTAINER (grid), self->pv->spinner);
- gtk_container_add (GTK_CONTAINER (grid), self->pv->label);
- gtk_container_add (GTK_CONTAINER (grid), self->pv->arrow);
- gtk_grid_set_row_spacing (GTK_GRID (grid), 3);
- gtk_widget_set_hexpand (grid, TRUE);
- gtk_widget_set_halign (grid, GTK_ALIGN_CENTER);
-
- gtk_widget_show (self->pv->label);
- gtk_widget_show (grid);
-
- gtk_container_add (GTK_CONTAINER (self), grid);
-
- update_import_button (self);
-
- gcr_pkcs11_initialize_async (NULL, on_library_pkcs11_ready, g_object_ref (self));
-}
-
-static void
-gcr_import_button_set_property (GObject *obj,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- GcrImportButton *self = GCR_IMPORT_BUTTON (obj);
-
- switch (prop_id) {
- case PROP_LABEL:
- gtk_label_set_label (GTK_LABEL (self->pv->label), g_value_get_string (value));
- g_object_notify (obj, "label");
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-gcr_import_button_get_property (GObject *obj,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- GcrImportButton *self = GCR_IMPORT_BUTTON (obj);
-
- switch (prop_id) {
- case PROP_LABEL:
- g_value_set_string (value, gtk_label_get_label (GTK_LABEL (self->pv->label)));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-gcr_import_button_dispose (GObject *obj)
-{
- GcrImportButton *self = GCR_IMPORT_BUTTON (obj);
-
- gck_list_unref_free (self->pv->importers);
- self->pv->importers = NULL;
- g_cancellable_cancel (self->pv->cancellable);
- g_clear_object (&self->pv->menu);
-
- g_list_free_full (self->pv->queued, gcr_parsed_unref);
- self->pv->queued = NULL;
-
- G_OBJECT_CLASS (gcr_import_button_parent_class)->dispose (obj);
-}
-
-static void
-gcr_import_button_finalize (GObject *obj)
-{
- GcrImportButton *self = GCR_IMPORT_BUTTON (obj);
-
- g_object_unref (self->pv->cancellable);
-
- G_OBJECT_CLASS (gcr_import_button_parent_class)->finalize (obj);
-}
-
-static void
-on_import_complete (GObject *importer,
- GAsyncResult *result,
- gpointer user_data)
-{
- GcrImportButton *self = GCR_IMPORT_BUTTON (user_data);
- GError *error = NULL;
-
- g_return_if_fail (self->pv->imported == NULL);
-
- self->pv->importing = FALSE;
-
- gcr_importer_import_finish (GCR_IMPORTER (importer), result, &error);
- if (error == NULL) {
- g_object_get (importer, "label", &self->pv->imported, NULL);
- gck_list_unref_free (self->pv->importers);
- self->pv->importers = NULL;
- }
-
- g_signal_emit (self, signals[IMPORTED], 0, importer, error);
- g_clear_error (&error);
-
- update_import_button (self);
-}
-
-static void
-begin_import (GcrImportButton *self,
- GcrImporter *importer)
-{
- GTlsInteraction *interaction;
- GtkWindow *window;
-
- g_return_if_fail (self->pv->importing == FALSE);
-
- g_signal_emit (self, signals[IMPORTING], 0, importer);
-
- self->pv->importing = TRUE;
- g_free (self->pv->imported);
- self->pv->imported = NULL;
-
- /* TODO: Hack. Need to figure out how to pair these up... */
- if (g_strcmp0 (G_OBJECT_TYPE_NAME (importer), "GcrPkcs11Importer") == 0) {
- window = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (self)));
- interaction = _gcr_pkcs11_import_interaction_new (window);
- gcr_importer_set_interaction (importer, interaction);
- g_object_unref (interaction);
- }
-
- gcr_importer_import_async (importer,
- self->pv->cancellable,
- on_import_complete,
- g_object_ref (self));
-}
-
-static void
-on_importer_menu_activated (GtkMenuItem *menu_item,
- gpointer user_data)
-{
- GcrImportButton *self = GCR_IMPORT_BUTTON (user_data);
- GcrImporter *importer;
-
- importer = g_object_get_qdata (G_OBJECT (menu_item), QUARK_IMPORTER);
- g_return_if_fail (GCR_IMPORTER (importer));
- g_return_if_fail (self->pv->importing == FALSE);
-
- begin_import (self, importer);
- update_import_button (self);
-}
-
-static void
-update_importer_menu (GcrImportButton *self)
-{
- GtkWidget *menu_item;
- GtkWidget *image;
- GList *children, *l;
- GIcon *icon;
- gchar *label;
-
- if (!self->pv->menu) {
- self->pv->menu = GTK_MENU (gtk_menu_new ());
- g_object_ref_sink (self->pv->menu);
- }
-
- children = gtk_container_get_children (GTK_CONTAINER (self->pv->menu));
- for (l = children; l != NULL; l = g_list_next (l))
- gtk_container_remove (GTK_CONTAINER (self->pv->menu), l->data);
- g_list_free (children);
-
- for (l = self->pv->importers; l != NULL; l = g_list_next (l)) {
- g_object_get (l->data, "label", &label, "icon", &icon, NULL);
- menu_item = egg_image_menu_item_new_with_label (label);
- g_signal_connect (menu_item, "activate", G_CALLBACK (on_importer_menu_activated), self);
- g_object_set_qdata (G_OBJECT (menu_item), QUARK_IMPORTER, l->data);
- image = gtk_image_new_from_gicon (icon, GTK_ICON_SIZE_MENU);
- egg_image_menu_item_set_image (EGG_IMAGE_MENU_ITEM (menu_item), image);
- egg_image_menu_item_set_always_show_image (EGG_IMAGE_MENU_ITEM (menu_item), TRUE);
- gtk_widget_show (image);
- gtk_widget_show (menu_item);
- gtk_container_add (GTK_CONTAINER (self->pv->menu), menu_item);
- g_object_unref (icon);
- g_free (label);
- }
-}
-
-#if !GTK_CHECK_VERSION (3,22,0)
-static void
-on_menu_position (GtkMenu *menu,
- gint *x,
- gint *y,
- gboolean *push_in,
- gpointer user_data)
-{
- GcrImportButton *self = GCR_IMPORT_BUTTON (user_data);
- GtkWidget *widget = GTK_WIDGET (self);
- GtkAllocation allocation;
- GtkRequisition menu_req;
- GdkRectangle monitor;
- GdkWindow *window;
- GtkWidget *toplevel;
- GdkScreen *screen;
- gint monitor_num;
- gint sx = 0;
- gint sy = 0;
-
- g_return_if_fail (x != NULL);
- g_return_if_fail (y != NULL);
- g_return_if_fail (push_in != NULL);
-
- gtk_widget_get_allocation (widget, &allocation);
-
- if (!gtk_widget_get_has_window (widget)) {
- sx += allocation.x;
- sy += allocation.y;
- }
-
- window = gtk_widget_get_window (widget);
- gdk_window_get_root_coords (window, sx, sy, &sx, &sy);
-
- gtk_widget_get_preferred_size (GTK_WIDGET (menu), NULL, &menu_req);
- if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR)
- *x = sx;
- else
- *x = sx + allocation.width - menu_req.width;
- *y = sy;
-
- screen = gtk_widget_get_screen (widget);
- monitor_num = gdk_screen_get_monitor_at_window (screen, window);
- if (monitor_num < 0)
- monitor_num = 0;
- gdk_screen_get_monitor_geometry (screen, monitor_num, &monitor);
-
- if (*x < monitor.x)
- *x = monitor.x;
- else if (*x + menu_req.width > monitor.x + monitor.width)
- *x = monitor.x + monitor.width - menu_req.width;
-
- if (monitor.y + monitor.height - *y - allocation.height >= menu_req.height)
- *y += allocation.height;
- else if (*y - monitor.y >= menu_req.height)
- *y -= menu_req.height;
- else if (monitor.y + monitor.height - *y - allocation.height > *y - monitor.y)
- *y += allocation.height;
- else
- *y -= menu_req.height;
-
- gtk_menu_set_monitor (menu, monitor_num);
-
- toplevel = gtk_widget_get_parent (GTK_WIDGET (menu));
- if (GTK_IS_WINDOW (toplevel) && gtk_widget_get_visible (toplevel))
- gtk_window_set_type_hint (GTK_WINDOW (window), GDK_WINDOW_TYPE_HINT_DROPDOWN_MENU);
-
- *push_in = FALSE;
-}
-#endif
-
-static void
-gcr_import_button_clicked (GtkButton *button)
-{
- GcrImportButton *self = GCR_IMPORT_BUTTON (button);
-
- g_return_if_fail (self->pv->importing == FALSE);
- g_return_if_fail (self->pv->importers != NULL);
-
- /* More than one importer, show the menu */
- if (self->pv->importers->next) {
- update_importer_menu (self);
-#if GTK_CHECK_VERSION (3,22,0)
- if (gtk_widget_get_direction (GTK_WIDGET (self)) == GTK_TEXT_DIR_LTR)
- gtk_menu_popup_at_widget (self->pv->menu,
- GTK_WIDGET (self),
- GDK_GRAVITY_SOUTH_WEST, GDK_GRAVITY_NORTH_WEST,
- NULL);
- else
- gtk_menu_popup_at_widget (self->pv->menu,
- GTK_WIDGET (self),
- GDK_GRAVITY_SOUTH_EAST, GDK_GRAVITY_NORTH_EAST,
- NULL);
-
-#else
- gtk_menu_popup (self->pv->menu, NULL, NULL, on_menu_position,
- self, 1, gtk_get_current_event_time ());
-#endif
-
- /* Only one importer, import on click */
- } else {
- begin_import (self, self->pv->importers->data);
- }
-
- update_import_button (self);
-}
-
-static void
-gcr_import_button_class_init (GcrImportButtonClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
- GtkButtonClass *button_class = GTK_BUTTON_CLASS (klass);
-
- gobject_class->constructed = gcr_import_button_constructed;
- gobject_class->dispose = gcr_import_button_dispose;
- gobject_class->finalize = gcr_import_button_finalize;
- gobject_class->get_property = gcr_import_button_get_property;
- gobject_class->set_property = gcr_import_button_set_property;
-
- button_class->clicked = gcr_import_button_clicked;
-
- g_object_class_override_property (gobject_class, PROP_LABEL, "label");
-
- /**
- * GcrImportButton::importing:
- * @self: the import button
- * @importer: the importer that will be imported to
- *
- * Signal emitted when an import begins.
- */
- signals[IMPORTING] = g_signal_new ("importing", GCR_TYPE_IMPORT_BUTTON, G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (GcrImportButtonClass, importing),
- NULL, NULL, NULL,
- G_TYPE_NONE, 1, G_TYPE_OBJECT);
-
- /**
- * GcrImportButton::imported:
- * @self: the import button
- * @importer: the importer that was imported to
- * @error: if import was successful %NULL, or an error
- *
- * Signal emitted when an import completes or fails.
- */
- signals[IMPORTED] = g_signal_new ("imported", GCR_TYPE_IMPORT_BUTTON, G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (GcrImportButtonClass, imported),
- NULL, NULL, _gcr_marshal_VOID__OBJECT_BOXED,
- G_TYPE_NONE, 2, G_TYPE_OBJECT, G_TYPE_ERROR);
-
- QUARK_IMPORTER = g_quark_from_static_string ("gcr-import-button-importer");
-}
-
-/**
- * gcr_import_button_new:
- * @label: (nullable): label to display on the button
- *
- * Create a new #GcrImportButton.
- *
- * Returns: (transfer full): a newly created #GcrImportButton
- */
-GcrImportButton *
-gcr_import_button_new (const gchar *label)
-{
- return g_object_new (GCR_TYPE_IMPORT_BUTTON,
- "label", label,
- NULL);
-}
-
-/**
- * gcr_import_button_add_parsed:
- * @self: an import button
- * @parsed: a parsed item
- *
- * Queue an item to import via the button
- */
-void
-gcr_import_button_add_parsed (GcrImportButton *self,
- GcrParsed *parsed)
-{
- GList *importers;
-
- g_return_if_fail (GCR_IS_IMPORT_BUTTON (self));
- g_return_if_fail (parsed != NULL);
-
- if (!self->pv->ready) {
- self->pv->queued = g_list_prepend (self->pv->queued, gcr_parsed_ref (parsed));
- update_import_button (self);
- return;
- }
-
- g_free (self->pv->imported);
- self->pv->imported = NULL;
-
- if (self->pv->created) {
- importers = gcr_importer_queue_and_filter_for_parsed (self->pv->importers, parsed);
- } else {
- importers = gcr_importer_create_for_parsed (parsed);
- self->pv->created = TRUE;
- }
-
- gck_list_unref_free (self->pv->importers);
- self->pv->importers = importers;
-
- update_import_button (self);
-}
diff --git a/gcr-gtk3/gcr-import-button.h b/gcr-gtk3/gcr-import-button.h
deleted file mode 100644
index 5a06408..0000000
--- a/gcr-gtk3/gcr-import-button.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2011 Collabora Ltd.
- *
- * 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/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#ifndef __GCR_IMPORT_BUTTON_H__
-#define __GCR_IMPORT_BUTTON_H__
-
-#include "gcr/gcr-importer.h"
-
-#include <gtk/gtk.h>
-
-G_BEGIN_DECLS
-
-#define GCR_TYPE_IMPORT_BUTTON (gcr_import_button_get_type ())
-#define GCR_IMPORT_BUTTON(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_IMPORT_BUTTON, GcrImportButton))
-#define GCR_IMPORT_BUTTON_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_IMPORT_BUTTON, GcrImportButtonClass))
-#define GCR_IS_IMPORT_BUTTON(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_IMPORT_BUTTON))
-#define GCR_IS_IMPORT_BUTTON_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_IMPORT_BUTTON))
-#define GCR_IMPORT_BUTTON_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_IMPORT_BUTTON, GcrImportButtonClass))
-
-typedef struct _GcrImportButton GcrImportButton;
-typedef struct _GcrImportButtonClass GcrImportButtonClass;
-typedef struct _GcrImportButtonPrivate GcrImportButtonPrivate;
-
-struct _GcrImportButton {
- GtkButton parent;
-
- /*< private >*/
- GcrImportButtonPrivate *pv;
-};
-
-struct _GcrImportButtonClass {
- GtkButtonClass parent_class;
-
- void (*importing) (GcrImportButton *self,
- GcrImporter *importer);
-
- void (*imported) (GcrImportButton *self,
- GcrImporter *importer,
- GError *error);
-
- /*< private >*/
- gpointer padding[10];
-};
-
-GType gcr_import_button_get_type (void) G_GNUC_CONST;
-
-GcrImportButton * gcr_import_button_new (const gchar *label);
-
-void gcr_import_button_add_parsed (GcrImportButton *self,
- GcrParsed *parsed);
-
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrImportButton, g_object_unref)
-
-G_END_DECLS
-
-#endif /* __GCR_IMPORT_BUTTON_H__ */
diff --git a/gcr-gtk3/gcr-key-renderer.c b/gcr-gtk3/gcr-key-renderer.c
deleted file mode 100644
index 850a2ca..0000000
--- a/gcr-gtk3/gcr-key-renderer.c
+++ /dev/null
@@ -1,481 +0,0 @@
-/*
- * Copyright (C) 2010 Stefan Walter
- *
- * 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 "config.h"
-
-#include "gcr/gcr-fingerprint.h"
-#include "gcr/gcr-icons.h"
-#include "gcr/gcr-subject-public-key.h"
-
-#include "gcr-key-renderer.h"
-#include "gcr-display-view.h"
-#include "gcr-renderer.h"
-#include "gcr-viewer.h"
-
-#include "gck/gck.h"
-
-#include "egg/egg-asn1x.h"
-
-#include <gdk/gdk.h>
-#include <glib/gi18n-lib.h>
-
-/**
- * GcrKeyRenderer:
- *
- * An implementation of #GcrRenderer which renders keys.
- */
-
-/**
- * GcrKeyRendererClass:
- * @parent_class: The parent class.
- *
- * The class for #GcrKeyRenderer.
- */
-
-enum {
- PROP_0,
- PROP_LABEL,
- PROP_ATTRIBUTES,
- PROP_OBJECT
-};
-
-struct _GcrKeyRendererPrivate {
- guint key_size;
- gchar *label;
- GckAttributes *attributes;
- GckObject *object;
- GIcon *icon;
- gulong notify_sig;
- GBytes *spk;
-};
-
-static void gcr_key_renderer_renderer_iface (GcrRendererIface *iface);
-
-G_DEFINE_TYPE_WITH_CODE (GcrKeyRenderer, gcr_key_renderer, G_TYPE_OBJECT,
- G_ADD_PRIVATE (GcrKeyRenderer);
- G_IMPLEMENT_INTERFACE (GCR_TYPE_RENDERER, gcr_key_renderer_renderer_iface));
-
-/* -----------------------------------------------------------------------------
- * INTERNAL
- */
-
-static gchar*
-calculate_label (GcrKeyRenderer *self)
-{
- gchar *label;
-
- if (self->pv->label)
- return g_strdup (self->pv->label);
-
- if (self->pv->attributes) {
- if (gck_attributes_find_string (self->pv->attributes, CKA_LABEL, &label))
- return label;
- }
-
- return g_strdup (_("Key"));
-}
-
-static GckAttributes *
-calculate_attrs (GcrKeyRenderer *self)
-{
- if (self->pv->attributes)
- return gck_attributes_ref (self->pv->attributes);
-
- if (GCK_IS_OBJECT_CACHE (self->pv->object))
- return gck_object_cache_get_attributes (GCK_OBJECT_CACHE (self->pv->object));
-
- return NULL;
-}
-
-static guchar *
-calculate_fingerprint (GcrKeyRenderer *self,
- GckAttributes *attrs,
- GChecksumType algorithm,
- gsize *n_fingerprint)
-{
- if (self->pv->spk)
- return gcr_fingerprint_from_subject_public_key_info (g_bytes_get_data (self->pv->spk, NULL),
- g_bytes_get_size (self->pv->spk),
- algorithm, n_fingerprint);
-
- return gcr_fingerprint_from_attributes (attrs, algorithm, n_fingerprint);
-}
-
-static void
-on_subject_public_key (GObject *source,
- GAsyncResult *result,
- gpointer user_data)
-{
- GcrKeyRenderer *self = GCR_KEY_RENDERER (user_data);
- GError *error = NULL;
- GNode *node;
-
- node = _gcr_subject_public_key_load_finish (result, &error);
- if (error != NULL) {
- g_message ("couldn't load key information: %s", error->message);
- g_clear_error (&error);
-
- } else {
- if (self->pv->spk)
- g_bytes_unref (self->pv->spk);
- self->pv->spk = NULL;
-
- self->pv->spk = egg_asn1x_encode (node, NULL);
- if (self->pv->spk == NULL)
- g_warning ("invalid subjectPublicKey loaded: %s",
- egg_asn1x_message (node));
- egg_asn1x_destroy (node);
-
- gcr_renderer_emit_data_changed (GCR_RENDERER (self));
- }
-
- g_object_unref (self);
-}
-
-static void
-update_subject_public_key (GcrKeyRenderer *self)
-{
- if (self->pv->spk)
- g_bytes_unref (self->pv->spk);
- self->pv->spk = NULL;
-
- if (!self->pv->object)
- return;
-
- _gcr_subject_public_key_load_async (self->pv->object, NULL,
- on_subject_public_key,
- g_object_ref (self));
-}
-
-static void
-on_object_cache_attributes (GObject *obj,
- GParamSpec *spec,
- gpointer user_data)
-{
- GcrKeyRenderer *self = GCR_KEY_RENDERER (user_data);
- update_subject_public_key (self);
- gcr_renderer_emit_data_changed (GCR_RENDERER (self));
-}
-
-static void
-gcr_key_renderer_init (GcrKeyRenderer *self)
-{
- self->pv = gcr_key_renderer_get_instance_private (self);
- self->pv->icon = g_themed_icon_new (GCR_ICON_KEY);
-}
-
-static void
-gcr_key_renderer_dispose (GObject *obj)
-{
- GcrKeyRenderer *self = GCR_KEY_RENDERER (obj);
-
- if (self->pv->spk)
- g_bytes_unref (self->pv->spk);
- self->pv->spk = NULL;
-
- if (self->pv->object && self->pv->notify_sig) {
- g_signal_handler_disconnect (self->pv->object, self->pv->notify_sig);
- self->pv->notify_sig = 0;
- }
- g_clear_object (&self->pv->object);
-
- G_OBJECT_CLASS (gcr_key_renderer_parent_class)->dispose (obj);
-}
-
-static void
-gcr_key_renderer_finalize (GObject *obj)
-{
- GcrKeyRenderer *self = GCR_KEY_RENDERER (obj);
-
- if (self->pv->attributes)
- gck_attributes_unref (self->pv->attributes);
- self->pv->attributes = NULL;
-
- g_free (self->pv->label);
- self->pv->label = NULL;
-
- if (self->pv->icon)
- g_object_unref (self->pv->icon);
- self->pv->icon = NULL;
-
- G_OBJECT_CLASS (gcr_key_renderer_parent_class)->finalize (obj);
-}
-
-static void
-gcr_key_renderer_set_property (GObject *obj, guint prop_id, const GValue *value,
- GParamSpec *pspec)
-{
- GcrKeyRenderer *self = GCR_KEY_RENDERER (obj);
-
- switch (prop_id) {
- case PROP_LABEL:
- g_free (self->pv->label);
- self->pv->label = g_value_dup_string (value);
- g_object_notify (obj, "label");
- gcr_renderer_emit_data_changed (GCR_RENDERER (self));
- break;
- case PROP_ATTRIBUTES:
- gck_attributes_unref (self->pv->attributes);
- self->pv->attributes = g_value_dup_boxed (value);
- gcr_renderer_emit_data_changed (GCR_RENDERER (self));
- break;
- case PROP_OBJECT:
- g_clear_object (&self->pv->object);
- self->pv->object = g_value_dup_object (value);
- if (self->pv->object) {
- gck_attributes_unref (self->pv->attributes);
- self->pv->attributes = NULL;
- }
- if (GCK_IS_OBJECT_CACHE (self->pv->object)) {
- self->pv->notify_sig = g_signal_connect (self->pv->object,
- "notify::attributes",
- G_CALLBACK (on_object_cache_attributes),
- self);
- on_object_cache_attributes (G_OBJECT (self->pv->object), NULL, self);
- }
- g_object_notify (obj, "attributes");
- g_object_notify (obj, "object");
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-gcr_key_renderer_get_property (GObject *obj, guint prop_id, GValue *value,
- GParamSpec *pspec)
-{
- GcrKeyRenderer *self = GCR_KEY_RENDERER (obj);
-
- switch (prop_id) {
- case PROP_LABEL:
- g_value_take_string (value, calculate_label (self));
- break;
- case PROP_ATTRIBUTES:
- g_value_take_boxed (value, calculate_attrs (self));
- break;
- case PROP_OBJECT:
- g_value_set_object (value, self->pv->object);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-gcr_key_renderer_class_init (GcrKeyRendererClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
- GckBuilder builder = GCK_BUILDER_INIT;
-
- gcr_key_renderer_parent_class = g_type_class_peek_parent (klass);
-
- gobject_class->dispose = gcr_key_renderer_dispose;
- gobject_class->finalize = gcr_key_renderer_finalize;
- gobject_class->set_property = gcr_key_renderer_set_property;
- gobject_class->get_property = gcr_key_renderer_get_property;
-
- g_object_class_override_property (gobject_class, PROP_LABEL, "label");
- g_object_class_override_property (gobject_class, PROP_ATTRIBUTES, "attributes");
-
- g_object_class_install_property (gobject_class, PROP_OBJECT,
- g_param_spec_object ("object", "Object", "Key Object", GCK_TYPE_OBJECT,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
- /* Register this as a view which can be loaded */
- gck_builder_add_ulong (&builder, CKA_CLASS, CKO_PRIVATE_KEY);
- gcr_renderer_register (GCR_TYPE_KEY_RENDERER, gck_builder_end (&builder));
-}
-
-static void
-gcr_key_renderer_real_render (GcrRenderer *renderer, GcrViewer *viewer)
-{
- GcrKeyRenderer *self;
- GcrDisplayView *view;
- const gchar *text = "";
- GckAttributes *attrs;
- gpointer fingerprint;
- gsize n_fingerprint;
- gchar *display;
- gulong klass;
- gulong key_type;
- guint size;
-
- self = GCR_KEY_RENDERER (renderer);
-
- if (GCR_IS_DISPLAY_VIEW (viewer)) {
- view = GCR_DISPLAY_VIEW (viewer);
-
- } else {
- g_warning ("GcrKeyRenderer only works with internal specific "
- "GcrViewer returned by gcr_viewer_new().");
- return;
- }
-
- _gcr_display_view_begin (view, renderer);
-
- attrs = calculate_attrs (self);
- if (attrs == NULL) {
- _gcr_display_view_end (view, renderer);
- return;
- }
-
- if (!gck_attributes_find_ulong (attrs, CKA_CLASS, &klass) ||
- !gck_attributes_find_ulong (attrs, CKA_KEY_TYPE, &key_type)) {
- g_warning ("private key does not have the CKA_CLASS and CKA_KEY_TYPE attributes");
- _gcr_display_view_end (view, renderer);
- gck_attributes_unref (attrs);
- return;
- }
-
- _gcr_display_view_set_icon (view, renderer, self->pv->icon);
-
- display = calculate_label (self);
- _gcr_display_view_append_title (view, renderer, display);
- g_free (display);
-
- if (klass == CKO_PRIVATE_KEY) {
- if (key_type == CKK_RSA)
- text = _("Private RSA Key");
- else if (key_type == CKK_DSA)
- text = _("Private DSA Key");
- else if (key_type == CKK_EC)
- text = _("Private Elliptic Curve Key");
- else
- text = _("Private Key");
- } else if (klass == CKO_PUBLIC_KEY) {
- if (key_type == CKK_RSA)
- text = _("Public DSA Key");
- else if (key_type == CKK_DSA)
- text = _("Public DSA Key");
- else if (key_type == CKK_EC)
- text = _("Public Elliptic Curve Key");
- else
- text = _("Public Key");
- }
-
- _gcr_display_view_append_content (view, renderer, text, NULL);
-
- size = _gcr_subject_public_key_attributes_size (attrs);
- if (size > 0) {
- display = g_strdup_printf (g_dngettext (GETTEXT_PACKAGE, "%u bit", "%u bits", size), size);
- _gcr_display_view_append_content (view, renderer, _("Strength"), display);
- g_free (display);
- }
-
- _gcr_display_view_start_details (view, renderer);
-
- if (key_type == CKK_RSA)
- text = _("RSA");
- else if (key_type == CKK_DSA)
- text = _("DSA");
- else if (key_type == CKK_EC)
- text = _("Elliptic Curve");
- else
- text = _("Unknown");
- _gcr_display_view_append_value (view, renderer, _("Algorithm"), text, FALSE);
-
- if (size == 0)
- display = g_strdup (_("Unknown"));
- else
- display = g_strdup_printf ("%u", size);
- _gcr_display_view_append_value (view, renderer, _("Size"), display, FALSE);
- g_free (display);
-
- /* Fingerprints */
- _gcr_display_view_append_heading (view, renderer, _("Fingerprints"));
-
- fingerprint = calculate_fingerprint (self, attrs, G_CHECKSUM_SHA1, &n_fingerprint);
- if (fingerprint) {
- _gcr_display_view_append_hex (view, renderer, _("SHA1"), fingerprint, n_fingerprint);
- g_free (fingerprint);
- }
- fingerprint = calculate_fingerprint (self, attrs, G_CHECKSUM_SHA256, &n_fingerprint);
- if (fingerprint) {
- _gcr_display_view_append_hex (view, renderer, _("SHA256"), fingerprint, n_fingerprint);
- g_free (fingerprint);
- }
-
- _gcr_display_view_end (view, renderer);
- gck_attributes_unref (attrs);
-}
-
-static void
-gcr_key_renderer_renderer_iface (GcrRendererIface *iface)
-{
- iface->render_view = gcr_key_renderer_real_render;
-}
-
-/* -----------------------------------------------------------------------------
- * PUBLIC
- */
-
-/**
- * gcr_key_renderer_new:
- * @label: (nullable): label describing the key
- * @attrs: (nullable): key to display, or %NULL
- *
- * Create a new key renderer which renders a given key in the attributes.
- *
- * Returns: (transfer full): a newly allocated #GcrKeyRenderer, which should be
- * freed with g_object_unref()
- */
-GcrKeyRenderer*
-gcr_key_renderer_new (const gchar *label, GckAttributes *attrs)
-{
- return g_object_new (GCR_TYPE_KEY_RENDERER, "label", label, "attributes", attrs, NULL);
-}
-
-/**
- * gcr_key_renderer_set_attributes:
- * @self: The key renderer
- * @attrs: (nullable): the attributes to display
- *
- * Get the attributes displayed in the renderer. The attributes should represent
- * either an RSA, DSA, or EC key in PKCS#11 style.
- */
-void
-gcr_key_renderer_set_attributes (GcrKeyRenderer *self, GckAttributes *attrs)
-{
- g_return_if_fail (GCR_IS_KEY_RENDERER (self));
-
- if (self->pv->attributes)
- gck_attributes_unref (self->pv->attributes);
- self->pv->attributes = attrs;
- if (self->pv->attributes)
- gck_attributes_ref (self->pv->attributes);
-
- g_object_notify (G_OBJECT (self), "attributes");
- gcr_renderer_emit_data_changed (GCR_RENDERER (self));
-}
-
-/**
- * gcr_key_renderer_get_attributes:
- * @self: The key renderer
- *
- * Get the attributes displayed in the renderer.
- *
- * Returns: (transfer none) (nullable): the attributes, owned by the renderer
- */
-GckAttributes*
-gcr_key_renderer_get_attributes (GcrKeyRenderer *self)
-{
- g_return_val_if_fail (GCR_IS_KEY_RENDERER (self), NULL);
- return self->pv->attributes;
-}
diff --git a/gcr-gtk3/gcr-key-renderer.h b/gcr-gtk3/gcr-key-renderer.h
deleted file mode 100644
index 0ff592f..0000000
--- a/gcr-gtk3/gcr-key-renderer.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (C) 2010 Stefan Walter
- *
- * 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/>.
- */
-
-#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly."
-#endif
-
-#ifndef __GCR_KEY_RENDERER_H__
-#define __GCR_KEY_RENDERER_H__
-
-#include <glib-object.h>
-#include <gtk/gtk.h>
-
-#include "gcr/gcr-types.h"
-
-G_BEGIN_DECLS
-
-#define GCR_TYPE_KEY_RENDERER (gcr_key_renderer_get_type ())
-#define GCR_KEY_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_KEY_RENDERER, GcrKeyRenderer))
-#define GCR_KEY_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_KEY_RENDERER, GcrKeyRendererClass))
-#define GCR_IS_KEY_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_KEY_RENDERER))
-#define GCR_IS_KEY_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_KEY_RENDERER))
-#define GCR_KEY_RENDERER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_KEY_RENDERER, GcrKeyRendererClass))
-
-typedef struct _GcrKeyRenderer GcrKeyRenderer;
-typedef struct _GcrKeyRendererClass GcrKeyRendererClass;
-typedef struct _GcrKeyRendererPrivate GcrKeyRendererPrivate;
-
-struct _GcrKeyRenderer {
- GObject parent;
-
- /*< private >*/
- GcrKeyRendererPrivate *pv;
-};
-
-struct _GcrKeyRendererClass {
- GObjectClass parent_class;
-};
-
-GType gcr_key_renderer_get_type (void);
-
-GcrKeyRenderer* gcr_key_renderer_new (const gchar *label,
- GckAttributes *attrs);
-
-void gcr_key_renderer_set_attributes (GcrKeyRenderer *self,
- GckAttributes *attrs);
-
-GckAttributes* gcr_key_renderer_get_attributes (GcrKeyRenderer *self);
-
-G_END_DECLS
-
-#endif /* __GCR_KEY_RENDERER_H__ */
diff --git a/gcr-gtk3/gcr-key-widget.c b/gcr-gtk3/gcr-key-widget.c
deleted file mode 100644
index 708671c..0000000
--- a/gcr-gtk3/gcr-key-widget.c
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * Copyright (C) 2010 Stefan Walter
- *
- * 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 "config.h"
-
-#include "gcr-key-renderer.h"
-#include "gcr-key-widget.h"
-#include "gcr-renderer.h"
-#include "gcr-viewer.h"
-
-#include "gck/gck.h"
-
-#include <gdk/gdk.h>
-#include <glib/gi18n-lib.h>
-
-/**
- * GcrKeyWidget:
- *
- * A key widget and renderer
- *
- * A key widget can be used to display a RSA, DSA or EC key. The widget is
- * normally in a collapsed state showing only details, but can be expanded by
- * the user.
- *
- * Use [ctor@KeyWidget.new] to create a new key widget. Only one key can be
- * displayed. A key widget contains a [iface@Viewer] internally and
- * [class@KeyRenderer] is used to render the key to the viewer. To show more
- * than one key in a view, create the viewer and add renderers to it.
- */
-
-enum {
- PROP_0,
- PROP_ATTRIBUTES
-};
-
-struct _GcrKeyWidget {
- GtkBin parent;
-
- /*< private >*/
- GcrKeyWidgetPrivate *pv;
-};
-
-struct _GcrKeyWidgetClass {
- /*< private >*/
- GtkBinClass parent_class;
-};
-
-struct _GcrKeyWidgetPrivate {
- GcrViewer *viewer;
- GcrKeyRenderer *renderer;
-};
-
-G_DEFINE_TYPE_WITH_PRIVATE (GcrKeyWidget, gcr_key_widget, GTK_TYPE_BIN);
-
-/* -----------------------------------------------------------------------------
- * OBJECT
- */
-
-static GObject*
-gcr_key_widget_constructor (GType type, guint n_props, GObjectConstructParam *props)
-{
- GObject *obj = G_OBJECT_CLASS (gcr_key_widget_parent_class)->constructor (type, n_props, props);
- GcrKeyWidget *self = NULL;
-
- g_return_val_if_fail (obj, NULL);
-
- self = GCR_KEY_WIDGET (obj);
-
- self->pv->viewer = gcr_viewer_new_scrolled ();
- gtk_container_add (GTK_CONTAINER (self), GTK_WIDGET (self->pv->viewer));
- gtk_widget_show (GTK_WIDGET (self->pv->viewer));
-
- gcr_viewer_add_renderer (self->pv->viewer, GCR_RENDERER (self->pv->renderer));
- return obj;
-}
-
-static void
-gcr_key_widget_init (GcrKeyWidget *self)
-{
- self->pv = gcr_key_widget_get_instance_private (self);
- self->pv->renderer = gcr_key_renderer_new (NULL, NULL);
-}
-
-static void
-gcr_key_widget_finalize (GObject *obj)
-{
- GcrKeyWidget *self = GCR_KEY_WIDGET (obj);
-
- g_assert (self->pv->renderer);
- g_object_unref (self->pv->renderer);
- self->pv->renderer = NULL;
-
- g_assert (self->pv->viewer);
- self->pv->viewer = NULL;
-
- G_OBJECT_CLASS (gcr_key_widget_parent_class)->finalize (obj);
-}
-
-static void
-gcr_key_widget_set_property (GObject *obj, guint prop_id, const GValue *value,
- GParamSpec *pspec)
-{
- GcrKeyWidget *self = GCR_KEY_WIDGET (obj);
-
- switch (prop_id) {
- case PROP_ATTRIBUTES:
- gcr_key_widget_set_attributes (self, g_value_get_boxed (value));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-gcr_key_widget_get_property (GObject *obj, guint prop_id, GValue *value,
- GParamSpec *pspec)
-{
- GcrKeyWidget *self = GCR_KEY_WIDGET (obj);
-
- switch (prop_id) {
- case PROP_ATTRIBUTES:
- g_value_set_boxed (value, gcr_key_widget_get_attributes (self));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-gcr_key_widget_class_init (GcrKeyWidgetClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-
- gcr_key_widget_parent_class = g_type_class_peek_parent (klass);
-
- gobject_class->constructor = gcr_key_widget_constructor;
- gobject_class->finalize = gcr_key_widget_finalize;
- gobject_class->set_property = gcr_key_widget_set_property;
- gobject_class->get_property = gcr_key_widget_get_property;
-
- g_object_class_install_property (gobject_class, PROP_ATTRIBUTES,
- g_param_spec_boxed ("attributes", "Attributes", "The data displayed in the widget",
- GCK_TYPE_ATTRIBUTES,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-}
-
-/* -----------------------------------------------------------------------------
- * PUBLIC
- */
-
-/**
- * gcr_key_widget_new:
- * @attrs: (nullable): key to display, or %NULL
- *
- * Create a new key widget which displays a given key in the attributes.
- *
- * Returns: A newly allocated #GcrKeyWidget, which should be freed
- * with g_object_unref().
- */
-GcrKeyWidget*
-gcr_key_widget_new (GckAttributes *attrs)
-{
- return g_object_new (GCR_TYPE_KEY_WIDGET, "attributes", attrs, NULL);
-}
-
-/**
- * gcr_key_widget_set_attributes:
- * @self: The key widget
- * @attrs: (nullable): the attributes to display
- *
- * Get the attributes displayed in the widget. The attributes should represent
- * either an RSA, DSA or EC key in PKCS#11 style.
- */
-void
-gcr_key_widget_set_attributes (GcrKeyWidget *self, GckAttributes *attrs)
-{
- g_return_if_fail (GCR_IS_KEY_WIDGET (self));
- gcr_key_renderer_set_attributes (self->pv->renderer, attrs);
-}
-
-/**
- * gcr_key_widget_get_attributes:
- * @self: The key widget
- *
- * Get the attributes displayed in the widget.
- *
- * Returns: (nullable) (transfer none): The attributes, owned by the widget.
- */
-GckAttributes*
-gcr_key_widget_get_attributes (GcrKeyWidget *self)
-{
- g_return_val_if_fail (GCR_IS_KEY_WIDGET (self), NULL);
- return gcr_key_renderer_get_attributes (self->pv->renderer);
-}
diff --git a/gcr-gtk3/gcr-key-widget.h b/gcr-gtk3/gcr-key-widget.h
deleted file mode 100644
index bdbb797..0000000
--- a/gcr-gtk3/gcr-key-widget.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (C) 2010 Stefan Walter
- *
- * 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/>.
- */
-
-#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly."
-#endif
-
-#ifndef __GCR_KEY_WIDGET_H__
-#define __GCR_KEY_WIDGET_H__
-
-#include <glib-object.h>
-#include <gtk/gtk.h>
-
-#include "gcr/gcr-types.h"
-
-G_BEGIN_DECLS
-
-#define GCR_TYPE_KEY_WIDGET (gcr_key_widget_get_type ())
-#define GCR_KEY_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_KEY_WIDGET, GcrKeyWidget))
-#define GCR_KEY_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_KEY_WIDGET, GcrKeyWidgetClass))
-#define GCR_IS_KEY_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_KEY_WIDGET))
-#define GCR_IS_KEY_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_KEY_WIDGET))
-#define GCR_KEY_WIDGET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_KEY_WIDGET, GcrKeyWidgetClass))
-
-typedef struct _GcrKeyWidget GcrKeyWidget;
-typedef struct _GcrKeyWidgetClass GcrKeyWidgetClass;
-typedef struct _GcrKeyWidgetPrivate GcrKeyWidgetPrivate;
-
-/*
- * TODO: GcrKeyWidget and GcrKeyWidgetClass are hidden until
- * we can figure out what they should be derived from.
- */
-
-GType gcr_key_widget_get_type (void);
-
-GcrKeyWidget* gcr_key_widget_new (GckAttributes *attrs);
-
-void gcr_key_widget_set_attributes (GcrKeyWidget *self,
- GckAttributes *attrs);
-
-GckAttributes* gcr_key_widget_get_attributes (GcrKeyWidget *self);
-
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrKeyWidget, g_object_unref)
-
-G_END_DECLS
-
-#endif /* __GCR_KEY_WIDGET_H__ */
diff --git a/gcr-gtk3/gcr-list-selector-private.h b/gcr-gtk3/gcr-list-selector-private.h
deleted file mode 100644
index b1c4739..0000000
--- a/gcr-gtk3/gcr-list-selector-private.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2011 Collabora Ltd.
- *
- * 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/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#ifndef __GCR_LIST_SELECTOR_PRIVATE_H__
-#define __GCR_LIST_SELECTOR_PRIVATE_H__
-
-#include "gcr/gcr-types.h"
-
-#include "gcr-list-selector.h"
-#include "gcr-live-search.h"
-
-#include <gtk/gtk.h>
-
-G_BEGIN_DECLS
-
-void _gcr_list_selector_set_live_search (GcrListSelector *self,
- GcrLiveSearch *search);
-
-G_END_DECLS
-
-#endif /* __GCR_LIST_SELECTOR_PRIVATE_H__ */
diff --git a/gcr-gtk3/gcr-list-selector.c b/gcr-gtk3/gcr-list-selector.c
deleted file mode 100644
index 9445c6a..0000000
--- a/gcr-gtk3/gcr-list-selector.c
+++ /dev/null
@@ -1,442 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2011 Collabora Ltd.
- * Copyright (C) 2010 Stefan Walter
- *
- * 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/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#include "config.h"
-
-#include "gcr/gcr-internal.h"
-
-#include "gcr-collection-model.h"
-#include "gcr-list-selector.h"
-#include "gcr-list-selector-private.h"
-#include "gcr-live-search.h"
-
-#include <glib/gi18n-lib.h>
-
-#include <string.h>
-
-/**
- * GcrListSelector:
- *
- * A selector widget to select 1 or more certificates or keys from a list.
- *
- * Live search is available for quick filtering.
- */
-
-enum {
- PROP_0,
- PROP_COLLECTION
-};
-
-struct _GcrListSelectorPrivate {
- GcrCollection *collection;
- GcrCollectionModel *model;
-
- GtkTreeModelFilter *filter;
- GtkWidget *search_widget;
-};
-
-G_DEFINE_TYPE_WITH_PRIVATE (GcrListSelector, gcr_list_selector, GTK_TYPE_TREE_VIEW);
-
-static gboolean
-object_is_visible (GcrListSelector *self, GObject *object)
-{
- gchar *text;
- gboolean visible;
-
- if (g_object_class_find_property (G_OBJECT_GET_CLASS (object), "search-text"))
- g_object_get (object, "search-text", &text, NULL);
- else
- g_object_get (object, "label", &text, NULL);
-
- visible = _gcr_live_search_match (GCR_LIVE_SEARCH (self->pv->search_widget), text);
- g_free (text);
-
- return visible;
-}
-
-static gboolean
-on_tree_filter_visible_func (GtkTreeModel *model, GtkTreeIter *iter,
- gpointer user_data)
-{
- GcrListSelector *self = GCR_LIST_SELECTOR (user_data);
- GObject *object;
-
- if (self->pv->search_widget == NULL ||
- !gtk_widget_get_visible (self->pv->search_widget))
- return TRUE;
-
- object = gcr_collection_model_object_for_iter (self->pv->model, iter);
- if (object != NULL)
- return object_is_visible (self, object);
-
- return FALSE;
-}
-
-static gboolean
-on_tree_view_start_search (GtkTreeView *view, gpointer user_data)
-{
- GcrListSelector *self = GCR_LIST_SELECTOR (view);
-
- if (self->pv->search_widget == NULL)
- return FALSE;
-
- if (gtk_widget_get_visible (self->pv->search_widget))
- gtk_widget_grab_focus (self->pv->search_widget);
- else
- gtk_widget_show (self->pv->search_widget);
-
- return TRUE;
-}
-
-static void
-on_search_widget_text_notify (GcrLiveSearch *search, GParamSpec *pspec,
- gpointer user_data)
-{
- GcrListSelector *self = GCR_LIST_SELECTOR (user_data);
-#if 0
- GtkTreeViewColumn *focus_column;
- GtkTreeModel *model;
- GtkTreeIter iter;
- GtkTreePath *path;
- gboolean set_cursor = FALSE;
-#endif
-
- gtk_tree_model_filter_refilter (self->pv->filter);
-
-#if 0
- /* Set cursor on the first object. */
-
- model = gtk_tree_view_get_model (GTK_TREE_VIEW (self));
- gtk_tree_view_get_cursor (GTK_TREE_VIEW (view), &path, &focus_column);
-
- if (path == NULL) {
- path = gtk_tree_path_new_from_string ("0");
- set_cursor = TRUE;
- }
-
- if (set_cursor) {
- /* FIXME: Workaround for GTK bug #621651, we have to make sure
- * the path is valid. */
- if (gtk_tree_model_get_iter (model, &iter, path)) {
- gtk_tree_view_set_cursor (GTK_TREE_VIEW (view), path,
- focus_column, FALSE);
- }
- }
-
- gtk_tree_path_free (path);
-#endif
-}
-
-static void
-on_search_widget_activate (GtkWidget *search, gpointer user_data)
-{
- GcrListSelector *self = GCR_LIST_SELECTOR (user_data);
- GtkTreePath *path;
- GtkTreeViewColumn *focus_column;
-
- gtk_tree_view_get_cursor (GTK_TREE_VIEW (self), &path, &focus_column);
- if (path != NULL) {
- gtk_tree_view_row_activated (GTK_TREE_VIEW (self), path, focus_column);
- gtk_tree_path_free (path);
-
- gtk_widget_hide (search);
- }
-}
-
-static gboolean
-on_search_widget_key_navigation (GtkWidget *search, GdkEvent *event, gpointer user_data)
-{
- GcrListSelector *self = GCR_LIST_SELECTOR (user_data);
- GdkEvent *new_event;
- gboolean ret = FALSE;
-
- new_event = gdk_event_copy (event);
- gtk_widget_grab_focus (GTK_WIDGET (self));
- ret = gtk_widget_event (GTK_WIDGET (self), new_event);
- gtk_widget_grab_focus (search);
-
- gdk_event_free (new_event);
-
- return ret;
-}
-
-static void
-on_check_column_toggled (GtkCellRendererToggle *cell, gchar *path, gpointer user_data)
-{
- GcrListSelector *self = GCR_LIST_SELECTOR (user_data);
- GtkTreeIter iter, model_iter;
-
- g_assert (path != NULL);
-
- if (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (self->pv->filter), &iter, path)) {
- gtk_tree_model_filter_convert_iter_to_child_iter (self->pv->filter, &model_iter, &iter);
- gcr_collection_model_toggle_selected (self->pv->model, &model_iter);
- }
-}
-
-static void
-gcr_list_selector_constructed (GObject *object)
-{
- GcrListSelector *self = GCR_LIST_SELECTOR (object);
- GtkCellRenderer *cell;
- GtkTreeViewColumn *column;
- guint column_id;
-
- G_OBJECT_CLASS (gcr_list_selector_parent_class)->constructed (object);
-
- gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (self), FALSE);
-
- self->pv->model = gcr_collection_model_new (self->pv->collection,
- GCR_COLLECTION_MODEL_LIST,
- "icon", G_TYPE_ICON,
- "markup", G_TYPE_STRING,
- NULL);
-
- self->pv->filter = GTK_TREE_MODEL_FILTER (gtk_tree_model_filter_new (
- GTK_TREE_MODEL (self->pv->model), NULL));
- gtk_tree_model_filter_set_visible_func (self->pv->filter,
- on_tree_filter_visible_func, self, NULL);
-
- gtk_tree_view_set_model (GTK_TREE_VIEW (self), GTK_TREE_MODEL (self->pv->filter));
-
- /* The check */
-
- cell = gtk_cell_renderer_toggle_new ();
- g_signal_connect (cell, "toggled", G_CALLBACK (on_check_column_toggled), self);
-
- column_id = gcr_collection_model_column_for_selected (self->pv->model);
- column = gtk_tree_view_column_new_with_attributes ("", cell, "active", column_id, NULL);
- gtk_tree_view_column_set_resizable (column, FALSE);
- gtk_tree_view_append_column (GTK_TREE_VIEW (self), column);
-
- column = gtk_tree_view_column_new ();
-
- /* The icon */
- cell = gtk_cell_renderer_pixbuf_new ();
- g_object_set (cell, "stock-size", GTK_ICON_SIZE_DND, NULL);
- gtk_tree_view_column_pack_start (column, cell, FALSE);
- gtk_tree_view_column_add_attribute (column, cell, "gicon", 0);
-
- /* The markup */
- cell = gtk_cell_renderer_text_new ();
- gtk_tree_view_column_pack_start (column, cell, TRUE);
- gtk_tree_view_column_add_attribute (column, cell, "markup", 1);
-
- gtk_tree_view_append_column (GTK_TREE_VIEW (self), column);
-}
-
-static void
-gcr_list_selector_init (GcrListSelector *self)
-{
- self->pv = gcr_list_selector_get_instance_private (self);
-}
-
-static void
-gcr_list_selector_dispose (GObject *obj)
-{
- GcrListSelector *self = GCR_LIST_SELECTOR (obj);
-
- if (self->pv->filter)
- g_object_unref (self->pv->filter);
- self->pv->filter = NULL;
-
- if (self->pv->model)
- g_object_unref (self->pv->model);
- self->pv->model = NULL;
-
- if (self->pv->collection)
- g_object_unref (self->pv->collection);
- self->pv->collection = NULL;
-
- _gcr_list_selector_set_live_search (self, NULL);
-
- G_OBJECT_CLASS (gcr_list_selector_parent_class)->dispose (obj);
-}
-
-static void
-gcr_list_selector_finalize (GObject *obj)
-{
- GcrListSelector *self = GCR_LIST_SELECTOR (obj);
-
- g_assert (!self->pv->collection);
- g_assert (!self->pv->model);
-
- G_OBJECT_CLASS (gcr_list_selector_parent_class)->finalize (obj);
-}
-
-static void
-gcr_list_selector_set_property (GObject *obj, guint prop_id, const GValue *value,
- GParamSpec *pspec)
-{
- GcrListSelector *self = GCR_LIST_SELECTOR (obj);
-
- switch (prop_id) {
- case PROP_COLLECTION:
- g_return_if_fail (!self->pv->collection);
- self->pv->collection = g_value_dup_object (value);
- g_return_if_fail (self->pv->collection);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-gcr_list_selector_get_property (GObject *obj, guint prop_id, GValue *value,
- GParamSpec *pspec)
-{
- GcrListSelector *self = GCR_LIST_SELECTOR (obj);
-
- switch (prop_id) {
- case PROP_COLLECTION:
- g_value_set_object (value, gcr_list_selector_get_collection (self));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-gcr_list_selector_class_init (GcrListSelectorClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-
- gobject_class->constructed = gcr_list_selector_constructed;
- gobject_class->dispose = gcr_list_selector_dispose;
- gobject_class->finalize = gcr_list_selector_finalize;
- gobject_class->set_property = gcr_list_selector_set_property;
- gobject_class->get_property = gcr_list_selector_get_property;
-
- /**
- * GcrListSelector:collection:
- *
- * The collection which contains the objects to display in the selector.
- */
- g_object_class_install_property (gobject_class, PROP_COLLECTION,
- g_param_spec_object ("collection", "Collection", "Collection to select from",
- GCR_TYPE_COLLECTION,
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
-}
-
-/* -----------------------------------------------------------------------------
- * PUBLIC
- */
-
-/**
- * gcr_list_selector_new:
- * @collection: The collection that contains the objects to display
- *
- * Create a new #GcrListSelector.
- *
- * Returns: (transfer full): a newly allocated selector, which should be
- * released with g_object_unref()
- */
-GcrListSelector *
-gcr_list_selector_new (GcrCollection *collection)
-{
- return g_object_new (GCR_TYPE_LIST_SELECTOR,
- "collection", collection,
- NULL);
-}
-
-/**
- * gcr_list_selector_get_collection:
- * @self: The selector
- *
- * Get the collection that this selector is displaying objects from.
- *
- * Returns: (transfer none): The collection, owned by the selector.
- */
-GcrCollection *
-gcr_list_selector_get_collection (GcrListSelector *self)
-{
- g_return_val_if_fail (GCR_IS_LIST_SELECTOR (self), NULL);
- return self->pv->collection;
-}
-
-/**
- * gcr_list_selector_get_selected:
- * @self: The selector
- *
- * Get a list of selected objects.
- *
- * Returns: (transfer container) (element-type GObject.Object): the list of
- * selected objects, to be released with g_list_free()
- */
-GList*
-gcr_list_selector_get_selected (GcrListSelector *self)
-{
- g_return_val_if_fail (GCR_IS_LIST_SELECTOR (self), NULL);
- return gcr_collection_model_get_selected_objects (self->pv->model);
-}
-
-/**
- * gcr_list_selector_set_selected:
- * @self: The selector
- * @selected: (element-type GObject.Object): the list of objects to select
- *
- * Select certain objects in the selector.
- */
-void
-gcr_list_selector_set_selected (GcrListSelector *self, GList *selected)
-{
- g_return_if_fail (GCR_IS_LIST_SELECTOR (self));
- gcr_collection_model_set_selected_objects (self->pv->model, selected);
-}
-
-
-void
-_gcr_list_selector_set_live_search (GcrListSelector *self, GcrLiveSearch *search)
-{
- g_return_if_fail (GCR_IS_LIST_SELECTOR (self));
-
- /* remove old handlers if old search was not null */
- if (self->pv->search_widget != NULL) {
- g_signal_handlers_disconnect_by_func (self, on_tree_view_start_search, NULL);
-
- g_signal_handlers_disconnect_by_func (self->pv->search_widget,
- on_search_widget_text_notify, self);
- g_signal_handlers_disconnect_by_func (self->pv->search_widget,
- on_search_widget_activate, self);
- g_signal_handlers_disconnect_by_func (self->pv->search_widget,
- on_search_widget_key_navigation, self);
- g_object_unref (self->pv->search_widget);
- self->pv->search_widget = NULL;
- }
-
- /* connect handlers if new search is not null */
- if (search != NULL) {
- self->pv->search_widget = GTK_WIDGET (g_object_ref (search));
-
- g_signal_connect (self, "start-interactive-search",
- G_CALLBACK (on_tree_view_start_search), NULL);
-
- g_signal_connect (self->pv->search_widget, "notify::text",
- G_CALLBACK (on_search_widget_text_notify), self);
- g_signal_connect (self->pv->search_widget, "activate",
- G_CALLBACK (on_search_widget_activate), self);
- g_signal_connect (self->pv->search_widget, "key-navigation",
- G_CALLBACK (on_search_widget_key_navigation), self);
- }
-}
diff --git a/gcr-gtk3/gcr-list-selector.h b/gcr-gtk3/gcr-list-selector.h
deleted file mode 100644
index 0d980bb..0000000
--- a/gcr-gtk3/gcr-list-selector.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2011 Collabora Ltd.
- * Copyright (C) 2010 Stefan Walter
- *
- * 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/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#ifndef __GCR_LIST_SELECTOR_H__
-#define __GCR_LIST_SELECTOR_H__
-
-#include "gcr/gcr-types.h"
-
-#include <gtk/gtk.h>
-
-G_BEGIN_DECLS
-
-#define GCR_TYPE_LIST_SELECTOR (gcr_list_selector_get_type ())
-#define GCR_LIST_SELECTOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_LIST_SELECTOR, GcrListSelector))
-#define GCR_LIST_SELECTOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_LIST_SELECTOR, GcrListSelectorClass))
-#define GCR_IS_LIST_SELECTOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_LIST_SELECTOR))
-#define GCR_IS_LIST_SELECTOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_LIST_SELECTOR))
-#define GCR_LIST_SELECTOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_LIST_SELECTOR, GcrListSelectorClass))
-
-typedef struct _GcrListSelector GcrListSelector;
-typedef struct _GcrListSelectorClass GcrListSelectorClass;
-typedef struct _GcrListSelectorPrivate GcrListSelectorPrivate;
-
-struct _GcrListSelector {
- GtkTreeView parent;
-
- /*< private >*/
- GcrListSelectorPrivate *pv;
-};
-
-struct _GcrListSelectorClass {
-
- /*< private >*/
- GtkTreeViewClass parent_class;
-};
-
-GType gcr_list_selector_get_type (void);
-
-GcrListSelector* gcr_list_selector_new (GcrCollection *collection);
-
-GcrCollection* gcr_list_selector_get_collection (GcrListSelector *self);
-
-GList* gcr_list_selector_get_selected (GcrListSelector *self);
-
-void gcr_list_selector_set_selected (GcrListSelector *self,
- GList *selected);
-
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrListSelector, g_object_unref)
-
-G_END_DECLS
-
-#endif /* __GCR_LIST_SELECTOR_H__ */
diff --git a/gcr-gtk3/gcr-live-search.c b/gcr-gtk3/gcr-live-search.c
deleted file mode 100644
index a70bf30..0000000
--- a/gcr-gtk3/gcr-live-search.c
+++ /dev/null
@@ -1,656 +0,0 @@
-/*
- * Copyright (C) 2011 Collabora Ltd.
- * Copyright (C) 2010 Collabora Ltd.
- * Copyright (C) 2007-2010 Nokia Corporation.
- *
- * This library 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 library 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 library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Authors: Felix Kaser <felix.kaser@collabora.co.uk>
- * Xavier Claessens <xavier.claessens@collabora.co.uk>
- * Claudio Saavedra <csaavedra@igalia.com>
- * Stef Walter <stefw@collabora.co.uk>
- */
-
-/* Code borrowed from Empathy */
-
-#include "config.h"
-
-#include "gcr-live-search.h"
-
-#include "gcr/gcr-marshal.h"
-
-#include <gtk/gtk.h>
-#include <gdk/gdkkeysyms.h>
-
-#include <string.h>
-
-struct _GcrLiveSearchPrivate {
- GtkWidget *search_entry;
- GtkWidget *hook_widget;
- GPtrArray *stripped_words;
-};
-
-G_DEFINE_TYPE_WITH_PRIVATE (GcrLiveSearch, _gcr_live_search, GTK_TYPE_BOX)
-
-enum {
- PROP_0,
- PROP_HOOK_WIDGET,
- PROP_TEXT
-};
-
-enum {
- ACTIVATE,
- KEYNAV,
- LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL];
-
-static void on_hook_widget_destroy (GtkWidget *object, gpointer user_data);
-
-static gunichar
-stripped_char (gunichar ch)
-{
- gunichar retval = 0;
- GUnicodeType utype;
- gunichar decomp[4];
- gsize dlen;
-
- utype = g_unichar_type (ch);
-
- switch (utype) {
- case G_UNICODE_CONTROL:
- case G_UNICODE_FORMAT:
- case G_UNICODE_UNASSIGNED:
- case G_UNICODE_NON_SPACING_MARK:
- case G_UNICODE_SPACING_MARK:
- case G_UNICODE_ENCLOSING_MARK:
- /* Ignore those */
- break;
- case G_UNICODE_PRIVATE_USE:
- case G_UNICODE_SURROGATE:
- case G_UNICODE_LOWERCASE_LETTER:
- case G_UNICODE_MODIFIER_LETTER:
- case G_UNICODE_OTHER_LETTER:
- case G_UNICODE_TITLECASE_LETTER:
- case G_UNICODE_UPPERCASE_LETTER:
- case G_UNICODE_DECIMAL_NUMBER:
- case G_UNICODE_LETTER_NUMBER:
- case G_UNICODE_OTHER_NUMBER:
- case G_UNICODE_CONNECT_PUNCTUATION:
- case G_UNICODE_DASH_PUNCTUATION:
- case G_UNICODE_CLOSE_PUNCTUATION:
- case G_UNICODE_FINAL_PUNCTUATION:
- case G_UNICODE_INITIAL_PUNCTUATION:
- case G_UNICODE_OTHER_PUNCTUATION:
- case G_UNICODE_OPEN_PUNCTUATION:
- case G_UNICODE_CURRENCY_SYMBOL:
- case G_UNICODE_MODIFIER_SYMBOL:
- case G_UNICODE_MATH_SYMBOL:
- case G_UNICODE_OTHER_SYMBOL:
- case G_UNICODE_LINE_SEPARATOR:
- case G_UNICODE_PARAGRAPH_SEPARATOR:
- case G_UNICODE_SPACE_SEPARATOR:
- default:
- ch = g_unichar_tolower (ch);
- dlen = g_unichar_fully_decompose (ch, FALSE, decomp, 4);
- if (dlen > 0)
- retval = decomp[0];
- }
-
- return retval;
-}
-
-static void
-append_word (GPtrArray **word_array, GString **word)
-{
- if (*word != NULL) {
- if (*word_array == NULL)
- *word_array = g_ptr_array_new_with_free_func (g_free);
- g_ptr_array_add (*word_array, g_string_free (*word, FALSE));
- *word = NULL;
- }
-}
-
-GPtrArray *
-_gcr_live_search_strip_utf8_string (const gchar *string)
-{
- GPtrArray *word_array = NULL;
- GString *word = NULL;
- const gchar *p;
-
- if (string == NULL || *string == '\0')
- return NULL;
-
- for (p = string; *p != '\0'; p = g_utf8_next_char (p)) {
- gunichar sc;
-
- /* Make the char lower-case, remove its accentuation marks, and ignore it
- * if it is just unicode marks */
- sc = stripped_char (g_utf8_get_char (p));
- if (sc == 0)
- continue;
-
- /* If it is not alpha-num, it is separator between words */
- if (!g_unichar_isalnum (sc)) {
- append_word (&word_array, &word);
- continue;
- }
-
- /* It is alpha-num, append this char to current word, or start new word */
- if (word == NULL)
- word = g_string_new (NULL);
- g_string_append_unichar (word, sc);
- }
-
- append_word (&word_array, &word);
-
- return word_array;
-}
-
-static gboolean
-live_search_match_prefix (const gchar *string, const gchar *prefix)
-{
- const gchar *p;
- const gchar *prefix_p;
- gboolean next_word = FALSE;
-
- if (prefix == NULL || prefix[0] == 0)
- return TRUE;
-
- if (string == NULL || *string == '\0')
- return FALSE;
-
- prefix_p = prefix;
- for (p = string; *p != '\0'; p = g_utf8_next_char (p)) {
- gunichar sc;
-
- /* Make the char lower-case, remove its accentuation marks, and ignore it
- * if it is just unicode marks */
- sc = stripped_char (g_utf8_get_char (p));
- if (sc == 0)
- continue;
-
- /* If we want to go to next word, ignore alpha-num chars */
- if (next_word && g_unichar_isalnum (sc))
- continue;
- next_word = FALSE;
-
- /* Ignore word separators */
- if (!g_unichar_isalnum (sc))
- continue;
-
- /* If this char does not match prefix_p, go to next word and start again
- * from the beginning of prefix */
- if (sc != g_utf8_get_char (prefix_p)) {
- next_word = TRUE;
- prefix_p = prefix;
- continue;
- }
-
- /* prefix_p match, verify to next char. If this was the last of prefix,
- * it means it completely machted and we are done. */
- prefix_p = g_utf8_next_char (prefix_p);
- if (*prefix_p == '\0')
- return TRUE;
- }
-
- return FALSE;
-}
-
-gboolean
-_gcr_live_search_match_words (const gchar *string, GPtrArray *words)
-{
- guint i;
-
- if (words == NULL)
- return TRUE;
-
- for (i = 0; i < words->len; i++)
- if (!live_search_match_prefix (string, g_ptr_array_index (words, i)))
- return FALSE;
-
- return TRUE;
-}
-
-static gboolean
-fire_key_navigation_sig (GcrLiveSearch *self, GdkEventKey *event)
-{
- gboolean ret;
-
- g_signal_emit (self, signals[KEYNAV], 0, event, &ret);
- return ret;
-}
-
-static gboolean
-on_search_entry_key_pressed (GtkEntry *entry, GdkEventKey *event, gpointer user_data)
-{
- GcrLiveSearch *self = GCR_LIVE_SEARCH (user_data);
-
- /* if esc key pressed, hide the search */
- if (event->keyval == GDK_KEY_Escape) {
- gtk_widget_hide (GTK_WIDGET (self));
- return TRUE;
- }
-
- /* emit key navigation signal, so other widgets can respond to it properly */
- if (event->keyval == GDK_KEY_Up || event->keyval == GDK_KEY_Down
- || event->keyval == GDK_KEY_Page_Up || event->keyval == GDK_KEY_Page_Down) {
- return fire_key_navigation_sig (self, event);
- }
-
- if (event->keyval == GDK_KEY_Home || event->keyval == GDK_KEY_End ||
- event->keyval == GDK_KEY_space) {
- /* If the live search is visible, the entry should catch the Home/End
- * and space events */
- if (!gtk_widget_get_visible (GTK_WIDGET (self))) {
- return fire_key_navigation_sig (self, event);
- }
- }
-
- return FALSE;
-}
-
-static void
-on_search_entry_text_changed (GtkEntry *entry, gpointer user_data)
-{
- GcrLiveSearch *self = GCR_LIVE_SEARCH (user_data);
- const gchar *text;
-
- text = gtk_entry_get_text (entry);
-
- if (text == NULL || *text == '\0')
- gtk_widget_hide (GTK_WIDGET (self));
- else
- gtk_widget_show (GTK_WIDGET (self));
-
- if (self->pv->stripped_words != NULL)
- g_ptr_array_unref (self->pv->stripped_words);
-
- self->pv->stripped_words = _gcr_live_search_strip_utf8_string (text);
-
- g_object_notify (G_OBJECT (self), "text");
-}
-
-static void
-on_search_entry_close_pressed (GtkEntry *entry, GtkEntryIconPosition icon_pos,
- GdkEvent *event, gpointer user_data)
-{
- GcrLiveSearch *self = GCR_LIVE_SEARCH (user_data);
- gtk_widget_hide (GTK_WIDGET (self));
-}
-
-static gboolean
-on_hook_widget_key_press_event (GtkWidget *widget, GdkEventKey *event,
- gpointer user_data)
-{
- GcrLiveSearch *self = GCR_LIVE_SEARCH (user_data);
- GdkEvent *new_event;
- gboolean ret;
-
- /* dont forward this event to the entry, else the event is consumed by the
- * entry and does not close the window */
- if (!gtk_widget_get_visible (GTK_WIDGET (self)) &&
- event->keyval == GDK_KEY_Escape)
- return FALSE;
-
- /* do not show the search if CTRL and/or ALT are pressed with a key
- * this is needed, because otherwise the CTRL + F accel would not work,
- * because the entry consumes it */
- if (event->state & (GDK_MOD1_MASK | GDK_CONTROL_MASK) ||
- event->keyval == GDK_KEY_Control_L ||
- event->keyval == GDK_KEY_Control_R)
- return FALSE;
-
- /* dont forward the up/down and Page Up/Down arrow keys to the entry,
- * they are needed for navigation in the treeview and are not needed in
- * the search entry */
- if (event->keyval == GDK_KEY_Up || event->keyval == GDK_KEY_Down ||
- event->keyval == GDK_KEY_Page_Up || event->keyval == GDK_KEY_Page_Down)
- return FALSE;
-
- if (event->keyval == GDK_KEY_Home || event->keyval == GDK_KEY_End ||
- event->keyval == GDK_KEY_space) {
- /* Home/End and space keys have to be forwarded to the entry only if
- * the live search is visible (to move the cursor inside the entry). */
- if (!gtk_widget_get_visible (GTK_WIDGET (self)))
- return FALSE;
- }
-
- /* realize the widget if it is not realized yet */
- gtk_widget_realize (self->pv->search_entry);
- if (!gtk_widget_has_focus (self->pv->search_entry)) {
- gtk_widget_grab_focus (self->pv->search_entry);
- gtk_editable_set_position (GTK_EDITABLE (self->pv->search_entry), -1);
- }
-
- /* forward the event to the search entry */
- new_event = gdk_event_copy ((GdkEvent *) event);
- ret = gtk_widget_event (self->pv->search_entry, new_event);
- gdk_event_free (new_event);
-
- return ret;
-}
-
-static void
-on_search_entry_activate (GtkEntry *entry, GcrLiveSearch *self)
-{
- g_signal_emit (self, signals[ACTIVATE], 0);
-}
-
-static void
-live_search_release_hook_widget (GcrLiveSearch *self)
-{
- /* remove old handlers if old source was not null */
- if (self->pv->hook_widget != NULL) {
- g_signal_handlers_disconnect_by_func (self->pv->hook_widget,
- on_hook_widget_key_press_event, self);
- g_signal_handlers_disconnect_by_func (self->pv->hook_widget,
- on_hook_widget_destroy, self);
- g_object_unref (self->pv->hook_widget);
- self->pv->hook_widget = NULL;
- }
-}
-
-static void
-on_hook_widget_destroy (GtkWidget *object, gpointer user_data)
-{
- GcrLiveSearch *self = GCR_LIVE_SEARCH (user_data);
-
- /* unref the hook widget and hide search */
- gtk_widget_hide (GTK_WIDGET (self));
- live_search_release_hook_widget (self);
-}
-
-static void
-live_search_dispose (GObject *obj)
-{
- GcrLiveSearch *self = GCR_LIVE_SEARCH (obj);
-
- live_search_release_hook_widget (self);
-
- G_OBJECT_CLASS (_gcr_live_search_parent_class)->dispose (obj);
-}
-
-static void
-live_search_finalize (GObject *obj)
-{
- GcrLiveSearch *self = GCR_LIVE_SEARCH (obj);
-
- if (self->pv->stripped_words != NULL)
- g_ptr_array_unref (self->pv->stripped_words);
-
- G_OBJECT_CLASS (_gcr_live_search_parent_class)->finalize (obj);
-}
-
-static void
-live_search_get_property (GObject *object, guint param_id,
- GValue *value, GParamSpec *pspec)
-{
- GcrLiveSearch *self = GCR_LIVE_SEARCH (object);
-
- switch (param_id) {
- case PROP_HOOK_WIDGET:
- g_value_set_object (value, _gcr_live_search_get_hook_widget (self));
- break;
- case PROP_TEXT:
- g_value_set_string (value, _gcr_live_search_get_text (self));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
- break;
- }
-}
-
-static void
-live_search_set_property (GObject *object, guint param_id,
- const GValue *value, GParamSpec *pspec)
-{
- GcrLiveSearch *self = GCR_LIVE_SEARCH (object);
-
- switch (param_id) {
- case PROP_HOOK_WIDGET:
- _gcr_live_search_set_hook_widget (self, g_value_get_object (value));
- break;
- case PROP_TEXT:
- _gcr_live_search_set_text (self, g_value_get_string (value));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
- break;
- };
-}
-
-static void
-live_search_unmap (GtkWidget *widget)
-{
- GcrLiveSearch *self = GCR_LIVE_SEARCH (widget);
-
- GTK_WIDGET_CLASS (_gcr_live_search_parent_class)->unmap (widget);
-
- /* unmap can happen if a parent gets hidden, in that case we want to hide
- * the live search as well, so when it gets mapped again, the live search
- * won't be shown. */
- gtk_widget_hide (widget);
-
- gtk_entry_set_text (GTK_ENTRY (self->pv->search_entry), "");
- gtk_widget_grab_focus (self->pv->hook_widget);
-}
-
-static void
-live_search_show (GtkWidget *widget)
-{
- GcrLiveSearch *self = GCR_LIVE_SEARCH (widget);
-
- if (!gtk_widget_has_focus (self->pv->search_entry))
- gtk_widget_grab_focus (self->pv->search_entry);
-
- GTK_WIDGET_CLASS (_gcr_live_search_parent_class)->show (widget);
-}
-
-static void
-live_search_grab_focus (GtkWidget *widget)
-{
- GcrLiveSearch *self = GCR_LIVE_SEARCH (widget);
-
- if (!gtk_widget_has_focus (self->pv->search_entry)) {
- gtk_widget_grab_focus (self->pv->search_entry);
- gtk_editable_set_position (GTK_EDITABLE (self->pv->search_entry), -1);
- }
-}
-
-static void
-_gcr_live_search_class_init (GcrLiveSearchClass *klass)
-{
- GObjectClass *object_class = (GObjectClass *) klass;
- GtkWidgetClass *widget_class = (GtkWidgetClass *) klass;
- GParamSpec *param_spec;
-
- object_class->finalize = live_search_finalize;
- object_class->dispose = live_search_dispose;
- object_class->get_property = live_search_get_property;
- object_class->set_property = live_search_set_property;
-
- widget_class->unmap = live_search_unmap;
- widget_class->show = live_search_show;
- widget_class->grab_focus = live_search_grab_focus;
-
- signals[ACTIVATE] = g_signal_new ("activate",
- G_TYPE_FROM_CLASS (object_class),
- G_SIGNAL_RUN_LAST,
- 0,
- NULL, NULL, NULL,
- G_TYPE_NONE, 0);
-
- signals[KEYNAV] = g_signal_new ("key-navigation",
- G_TYPE_FROM_CLASS (object_class),
- G_SIGNAL_RUN_LAST,
- 0,
- g_signal_accumulator_true_handled, NULL,
- _gcr_marshal_BOOLEAN__BOXED,
- G_TYPE_BOOLEAN, 1, GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
-
- param_spec = g_param_spec_object ("hook-widget", "Live Search Hook Widget",
- "The live search catches key-press-events on this widget",
- GTK_TYPE_WIDGET,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_STATIC_STRINGS);
- g_object_class_install_property (object_class, PROP_HOOK_WIDGET, param_spec);
-
- param_spec = g_param_spec_string ("text", "Live Search Text",
- "The text of the live search entry",
- "",
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_STATIC_STRINGS);
- g_object_class_install_property (object_class, PROP_TEXT, param_spec);
-}
-
-static void
-_gcr_live_search_init (GcrLiveSearch *self)
-{
- self->pv = _gcr_live_search_get_instance_private (self);
-
- gtk_widget_set_no_show_all (GTK_WIDGET (self), TRUE);
-
- self->pv->search_entry = gtk_entry_new ();
- gtk_entry_set_icon_from_icon_name (GTK_ENTRY (self->pv->search_entry),
- GTK_ENTRY_ICON_SECONDARY, "window-close");
- gtk_entry_set_icon_activatable (GTK_ENTRY (self->pv->search_entry),
- GTK_ENTRY_ICON_SECONDARY, TRUE);
- gtk_entry_set_icon_sensitive (GTK_ENTRY (self->pv->search_entry),
- GTK_ENTRY_ICON_SECONDARY, TRUE);
- gtk_widget_show (self->pv->search_entry);
-
- gtk_box_pack_start (GTK_BOX (self), self->pv->search_entry, TRUE, TRUE, 0);
-
- g_signal_connect (self->pv->search_entry, "icon_release",
- G_CALLBACK (on_search_entry_close_pressed), self);
- g_signal_connect (self->pv->search_entry, "changed",
- G_CALLBACK (on_search_entry_text_changed), self);
- g_signal_connect (self->pv->search_entry, "key-press-event",
- G_CALLBACK (on_search_entry_key_pressed), self);
- g_signal_connect (self->pv->search_entry, "activate",
- G_CALLBACK (on_search_entry_activate), self);
-
- self->pv->hook_widget = NULL;
-}
-
-/**
- * _gcr_live_search_new:
- * @hook: (nullable): the widget to hook
- *
- * Create a new #GcrLiveSearch.
- *
- * Returns: (transfer full) (type GcrUi.LiveSearch): The new widget
- */
-GtkWidget *
-_gcr_live_search_new (GtkWidget *hook)
-{
- g_return_val_if_fail (hook == NULL || GTK_IS_WIDGET (hook), NULL);
-
- return g_object_new (GCR_TYPE_LIVE_SEARCH,
- "hook-widget", hook,
- NULL);
-}
-
-/* public methods */
-
-GtkWidget *
-_gcr_live_search_get_hook_widget (GcrLiveSearch *self)
-{
- g_return_val_if_fail (GCR_IS_LIVE_SEARCH (self), NULL);
-
- return self->pv->hook_widget;
-}
-
-void
-_gcr_live_search_set_hook_widget (GcrLiveSearch *self, GtkWidget *hook)
-{
- g_return_if_fail (GCR_IS_LIVE_SEARCH (self));
- g_return_if_fail (hook == NULL || GTK_IS_WIDGET (hook));
-
- /* release the actual widget */
- live_search_release_hook_widget (self);
-
- /* connect handlers if new source is not null */
- if (hook != NULL) {
- self->pv->hook_widget = g_object_ref (hook);
- g_signal_connect (self->pv->hook_widget, "key-press-event",
- G_CALLBACK (on_hook_widget_key_press_event),
- self);
- g_signal_connect (self->pv->hook_widget, "destroy",
- G_CALLBACK (on_hook_widget_destroy),
- self);
- }
-}
-
-const gchar *
-_gcr_live_search_get_text (GcrLiveSearch *self)
-{
- g_return_val_if_fail (GCR_IS_LIVE_SEARCH (self), NULL);
-
- return gtk_entry_get_text (GTK_ENTRY (self->pv->search_entry));
-}
-
-void
-_gcr_live_search_set_text (GcrLiveSearch *self, const gchar *text)
-{
- g_return_if_fail (GCR_IS_LIVE_SEARCH (self));
- g_return_if_fail (text != NULL);
-
- gtk_entry_set_text (GTK_ENTRY (self->pv->search_entry), text);
-}
-
-/**
- * _gcr_live_search_match:
- * @self: a #GcrLiveSearch
- * @string: a string where to search, must be valid UTF-8.
- *
- * Search if one of the words in @string string starts with the current text
- * of @self.
- *
- * Searching for "aba" in "Abasto" will match, searching in "Moraba" will not,
- * and searching in "A tool (abacus)" will do.
- *
- * The match is not case-sensitive, and regardless of the accentuation marks.
- *
- * Returns: %TRUE if a match is found, %FALSE otherwise.
- *
- **/
-gboolean
-_gcr_live_search_match (GcrLiveSearch *self, const gchar *string)
-{
- g_return_val_if_fail (GCR_IS_LIVE_SEARCH (self), FALSE);
-
- return _gcr_live_search_match_words (string, self->pv->stripped_words);
-}
-
-gboolean
-_gcr_live_search_match_string (const gchar *string, const gchar *prefix)
-{
- GPtrArray *words;
- gboolean match;
-
- words = _gcr_live_search_strip_utf8_string (prefix);
- match = _gcr_live_search_match_words (string, words);
- if (words != NULL)
- g_ptr_array_unref (words);
-
- return match;
-}
-
-GPtrArray *
-_gcr_live_search_get_words (GcrLiveSearch *self)
-{
- return self->pv->stripped_words;
-}
diff --git a/gcr-gtk3/gcr-live-search.h b/gcr-gtk3/gcr-live-search.h
deleted file mode 100644
index cf048fd..0000000
--- a/gcr-gtk3/gcr-live-search.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (C) 2011 Collabora Ltd.
- * Copyright (C) 2010 Collabora Ltd.
- * Copyright (C) 2007-2010 Nokia Corporation.
- *
- * This library 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 library 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 library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Authors: Felix Kaser <felix.kaser@collabora.co.uk>
- * Xavier Claessens <xavier.claessens@collabora.co.uk>
- * Claudio Saavedra <csaavedra@igalia.com>
- * Stef Walter <stefw@collabora.co.uk>
- */
-
-/* Code borrowed from Empathy */
-
-#ifndef __GCR_LIVE_SEARCH_H__
-#define __GCR_LIVE_SEARCH_H__
-
-#include <gtk/gtk.h>
-
-G_BEGIN_DECLS
-
-#define GCR_TYPE_LIVE_SEARCH (_gcr_live_search_get_type ())
-#define GCR_LIVE_SEARCH(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GCR_TYPE_LIVE_SEARCH, GcrLiveSearch))
-#define GCR_LIVE_SEARCH_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), GCR_TYPE_LIVE_SEARCH, GcrLiveSearchClass))
-#define GCR_IS_LIVE_SEARCH(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GCR_TYPE_LIVE_SEARCH))
-#define GCR_IS_LIVE_SEARCH_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GCR_TYPE_LIVE_SEARCH))
-#define GCR_LIVE_SEARCH_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GCR_TYPE_LIVE_SEARCH, GcrLiveSearchClass))
-
-typedef struct _GcrLiveSearch GcrLiveSearch;
-typedef struct _GcrLiveSearchClass GcrLiveSearchClass;
-typedef struct _GcrLiveSearchPrivate GcrLiveSearchPrivate;
-
-struct _GcrLiveSearch {
- /*< private >*/
- GtkBox parent;
- GcrLiveSearchPrivate *pv;
-};
-
-struct _GcrLiveSearchClass {
- GtkBoxClass parent_class;
-};
-
-GType _gcr_live_search_get_type (void) G_GNUC_CONST;
-
-GtkWidget * _gcr_live_search_new (GtkWidget *hook);
-
-GtkWidget * _gcr_live_search_get_hook_widget (GcrLiveSearch *self);
-void _gcr_live_search_set_hook_widget (GcrLiveSearch *self,
- GtkWidget *hook);
-
-const gchar * _gcr_live_search_get_text (GcrLiveSearch *self);
-void _gcr_live_search_set_text (GcrLiveSearch *self,
- const gchar *text);
-
-gboolean _gcr_live_search_match (GcrLiveSearch *self,
- const gchar *string);
-
-GPtrArray * _gcr_live_search_strip_utf8_string (const gchar *string);
-
-gboolean _gcr_live_search_match_words (const gchar *string,
- GPtrArray *words);
-
-GPtrArray * _gcr_live_search_get_words (GcrLiveSearch *self);
-
-/* Made public for unit tests */
-gboolean _gcr_live_search_match_string (const gchar *string,
- const gchar *prefix);
-
-G_END_DECLS
-
-#endif /* __GCR_LIVE_SEARCH_H__ */
diff --git a/gcr-gtk3/gcr-pkcs11-import-dialog.c b/gcr-gtk3/gcr-pkcs11-import-dialog.c
deleted file mode 100644
index 01272b8..0000000
--- a/gcr-gtk3/gcr-pkcs11-import-dialog.c
+++ /dev/null
@@ -1,271 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2008 Stefan Walter
- *
- * 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 "config.h"
-
-#include "gcr/gcr-icons.h"
-
-#include "gcr-dialog-util.h"
-#include "gcr-secure-entry-buffer.h"
-#include "gcr-pkcs11-import-dialog.h"
-
-#include "egg/egg-secure-memory.h"
-
-#include <gtk/gtk.h>
-
-#include <glib/gi18n-lib.h>
-
-EGG_SECURE_DECLARE (import_dialog);
-
-enum {
- PROP_0,
- PROP_IMPORTER
-};
-
-struct _GcrPkcs11ImportDialog {
- GtkDialog parent;
- GtkBuilder *builder;
- GtkWidget *password_area;
- GtkLabel *token_label;
- GtkImage *token_image;
- GtkEntry *password_entry;
- GtkEntry *label_entry;
- gboolean label_changed;
-};
-
-G_DEFINE_TYPE (GcrPkcs11ImportDialog, _gcr_pkcs11_import_dialog, GTK_TYPE_DIALOG);
-
-static void
-on_label_changed (GtkEditable *editable,
- gpointer user_data)
-{
- GcrPkcs11ImportDialog *self = GCR_PKCS11_IMPORT_DIALOG (user_data);
- self->label_changed = TRUE;
-}
-
-static void
-_gcr_pkcs11_import_dialog_constructed (GObject *obj)
-{
- GcrPkcs11ImportDialog *self = GCR_PKCS11_IMPORT_DIALOG (obj);
- GError *error = NULL;
- GtkEntryBuffer *buffer;
- GtkWidget *widget;
- GtkBox *contents;
- GtkWidget *button;
-
- G_OBJECT_CLASS (_gcr_pkcs11_import_dialog_parent_class)->constructed (obj);
-
- if (!gtk_builder_add_from_resource (self->builder, "/org/gnome/gcr/gcr-gtk3/gcr-pkcs11-import-dialog.ui", &error)) {
- g_warning ("couldn't load ui builder file: %s", error->message);
- return;
- }
-
- /* Fill in the dialog from builder */
- widget = GTK_WIDGET (gtk_builder_get_object (self->builder, "pkcs11-import-dialog"));
- contents = GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (self)));
- gtk_box_pack_start (contents, widget, TRUE, TRUE, 0);
-
- /* The password area */
- self->password_area = GTK_WIDGET (gtk_builder_get_object (self->builder, "unlock-area"));
- gtk_widget_hide (self->password_area);
-
- /* Add a secure entry */
- buffer = gcr_secure_entry_buffer_new ();
- self->password_entry = GTK_ENTRY (gtk_builder_get_object (self->builder, "password-entry"));
- gtk_entry_set_buffer (self->password_entry, buffer);
- gtk_entry_set_activates_default (self->password_entry, TRUE);
- g_object_unref (buffer);
-
- self->token_label = GTK_LABEL (gtk_builder_get_object (self->builder, "token-description"));
- self->token_image = GTK_IMAGE (gtk_builder_get_object (self->builder, "token-image"));
-
- /* Setup the label */
- self->label_entry = GTK_ENTRY (gtk_builder_get_object (self->builder, "label-entry"));
- g_signal_connect (self->label_entry, "changed", G_CALLBACK (on_label_changed), self);
- gtk_entry_set_activates_default (self->label_entry, TRUE);
-
- /* Add our various buttons */
- button = gtk_dialog_add_button (GTK_DIALOG (self), _("_Cancel"), GTK_RESPONSE_CANCEL);
- gtk_button_set_use_underline (GTK_BUTTON (button), TRUE);
- button = gtk_dialog_add_button (GTK_DIALOG (self), _("_OK"), GTK_RESPONSE_OK);
- gtk_button_set_use_underline (GTK_BUTTON (button), TRUE);
- gtk_dialog_set_default_response (GTK_DIALOG (self), GTK_RESPONSE_OK);
-
- gtk_window_set_modal (GTK_WINDOW (self), TRUE);
-}
-
-static void
-_gcr_pkcs11_import_dialog_init (GcrPkcs11ImportDialog *self)
-{
- self->builder = gtk_builder_new ();
-}
-
-static void
-_gcr_pkcs11_import_dialog_finalize (GObject *obj)
-{
- GcrPkcs11ImportDialog *self = GCR_PKCS11_IMPORT_DIALOG (obj);
-
- g_object_unref (self->builder);
-
- G_OBJECT_CLASS (_gcr_pkcs11_import_dialog_parent_class)->finalize (obj);
-}
-
-static void
-_gcr_pkcs11_import_dialog_class_init (GcrPkcs11ImportDialogClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-
- gobject_class->constructed = _gcr_pkcs11_import_dialog_constructed;
- gobject_class->finalize = _gcr_pkcs11_import_dialog_finalize;
-}
-
-GcrPkcs11ImportDialog *
-_gcr_pkcs11_import_dialog_new (GtkWindow *parent)
-{
- GcrPkcs11ImportDialog *dialog;
-
- g_return_val_if_fail (parent == NULL || GTK_IS_WINDOW (parent), NULL);
-
- dialog = g_object_new (GCR_TYPE_PKCS11_IMPORT_DIALOG,
- "transient-for", parent,
- NULL);
-
- return g_object_ref_sink (dialog);
-}
-
-void
-_gcr_pkcs11_import_dialog_get_supplements (GcrPkcs11ImportDialog *self,
- GckBuilder *builder)
-{
- const gchar *label;
-
- g_return_if_fail (GCR_IS_PKCS11_IMPORT_DIALOG (self));
- g_return_if_fail (builder != NULL);
-
- label = gtk_entry_get_text (self->label_entry);
- if (self->label_changed && label != NULL && label[0])
- gck_builder_set_string (builder, CKA_LABEL, label);
-}
-
-void
-_gcr_pkcs11_import_dialog_set_supplements (GcrPkcs11ImportDialog *self,
- GckBuilder *builder)
-{
- gchar *label;
-
- g_return_if_fail (GCR_IS_PKCS11_IMPORT_DIALOG (self));
- g_return_if_fail (builder != NULL);
-
- if (!gck_builder_find_string (builder, CKA_LABEL, &label))
- label = NULL;
-
- if (label == NULL)
- gtk_entry_set_placeholder_text (self->label_entry, _("Automatically chosen"));
- gtk_entry_set_text (self->label_entry, label == NULL ? "" : label);
- g_free (label);
-
- self->label_changed = FALSE;
-}
-
-gboolean
-_gcr_pkcs11_import_dialog_run (GcrPkcs11ImportDialog *self)
-{
- gboolean ret = FALSE;
-
- g_return_val_if_fail (GCR_IS_PKCS11_IMPORT_DIALOG (self), FALSE);
-
- if (gtk_dialog_run (GTK_DIALOG (self)) == GTK_RESPONSE_OK) {
- ret = TRUE;
- }
-
- gtk_widget_hide (GTK_WIDGET (self));
-
- return ret;
-}
-
-void
-_gcr_pkcs11_import_dialog_run_async (GcrPkcs11ImportDialog *self,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data)
-{
- g_return_if_fail (GCR_IS_PKCS11_IMPORT_DIALOG (self));
-
- _gcr_dialog_util_run_async (GTK_DIALOG (self), cancellable, callback, user_data);
-}
-
-gboolean
-_gcr_pkcs11_import_dialog_run_finish (GcrPkcs11ImportDialog *self,
- GAsyncResult *result)
-{
- gint response;
-
- g_return_val_if_fail (GCR_IS_PKCS11_IMPORT_DIALOG (self), FALSE);
-
- response = _gcr_dialog_util_run_finish (GTK_DIALOG (self), result);
-
- gtk_widget_hide (GTK_WIDGET (self));
-
- return (response == GTK_RESPONSE_OK) ? TRUE : FALSE;
-}
-
-GTlsInteractionResult
-_gcr_pkcs11_import_dialog_run_ask_password (GcrPkcs11ImportDialog *self,
- GTlsPassword *password,
- GCancellable *cancellable,
- GError **error)
-{
- GckTokenInfo *token_info;
- const gchar *value;
- GckSlot *slot;
- GIcon *icon;
- gboolean ret;
-
- g_return_val_if_fail (GCR_IS_PKCS11_IMPORT_DIALOG (self), G_TLS_INTERACTION_UNHANDLED);
- g_return_val_if_fail (G_IS_TLS_PASSWORD (password), G_TLS_INTERACTION_UNHANDLED);
- g_return_val_if_fail (error == NULL || *error == NULL, G_TLS_INTERACTION_UNHANDLED);
-
- if (GCK_IS_PASSWORD (password)) {
- slot = gck_password_get_token (GCK_PASSWORD (password));
- token_info = gck_slot_get_token_info (slot);
- icon = gcr_icon_for_token (token_info);
- gtk_image_set_from_gicon (self->token_image, icon, GTK_ICON_SIZE_BUTTON);
- gck_token_info_free (token_info);
- g_object_unref (icon);
- }
-
- gtk_label_set_text (self->token_label, g_tls_password_get_description (password));
-
- gtk_widget_show (self->password_area);
-
- ret = _gcr_pkcs11_import_dialog_run (self);
-
- gtk_widget_hide (self->password_area);
-
- if (!ret) {
- g_set_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED,
- _("The user cancelled the operation"));
- return G_TLS_INTERACTION_FAILED;
- }
-
- value = gtk_entry_get_text (self->password_entry);
- g_tls_password_set_value_full (password, egg_secure_strdup (value),
- -1, egg_secure_free);
- return G_TLS_INTERACTION_HANDLED;
-}
diff --git a/gcr-gtk3/gcr-pkcs11-import-dialog.h b/gcr-gtk3/gcr-pkcs11-import-dialog.h
deleted file mode 100644
index 57f799a..0000000
--- a/gcr-gtk3/gcr-pkcs11-import-dialog.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2008 Stefan Walter
- * Copyright (C) 2011 Collabora Ltd.
- *
- * 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/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#ifndef __GCR_PKCS11_IMPORT_DIALOG_H__
-#define __GCR_PKCS11_IMPORT_DIALOG_H__
-
-#include <gck/gck.h>
-
-#include <gtk/gtk.h>
-
-G_BEGIN_DECLS
-
-#define GCR_TYPE_PKCS11_IMPORT_DIALOG (_gcr_pkcs11_import_dialog_get_type ())
-G_DECLARE_FINAL_TYPE (GcrPkcs11ImportDialog, _gcr_pkcs11_import_dialog,
- GCR, PKCS11_IMPORT_DIALOG,
- GtkDialog)
-
-GcrPkcs11ImportDialog * _gcr_pkcs11_import_dialog_new (GtkWindow *parent);
-
-void _gcr_pkcs11_import_dialog_get_supplements (GcrPkcs11ImportDialog *self,
- GckBuilder *builder);
-
-void _gcr_pkcs11_import_dialog_set_supplements (GcrPkcs11ImportDialog *self,
- GckBuilder *builder);
-
-gboolean _gcr_pkcs11_import_dialog_run (GcrPkcs11ImportDialog *self);
-
-void _gcr_pkcs11_import_dialog_run_async (GcrPkcs11ImportDialog *self,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data);
-
-gboolean _gcr_pkcs11_import_dialog_run_finish (GcrPkcs11ImportDialog *self,
- GAsyncResult *result);
-
-GTlsInteractionResult _gcr_pkcs11_import_dialog_run_ask_password (GcrPkcs11ImportDialog *self,
- GTlsPassword *password,
- GCancellable *cancellable,
- GError **error);
-
-G_END_DECLS
-
-#endif /* __GCR_PKCS11_IMPORT_DIALOG_H__ */
diff --git a/gcr-gtk3/gcr-pkcs11-import-dialog.ui b/gcr-gtk3/gcr-pkcs11-import-dialog.ui
deleted file mode 100644
index b95d0ff..0000000
--- a/gcr-gtk3/gcr-pkcs11-import-dialog.ui
+++ /dev/null
@@ -1,255 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<interface>
- <!-- interface-requires gtk+ 2.12 -->
- <object class="GtkVBox" id="pkcs11-import-dialog">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="border_width">6</property>
- <property name="spacing">6</property>
- <child>
- <object class="GtkFrame" id="unlock-area">
- <property name="visible">True</property>
- <property name="can_focus">False</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="can_focus">False</property>
- <property name="left_padding">12</property>
- <child>
- <object class="GtkBox" id="box1">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="orientation">vertical</property>
- <property name="spacing">6</property>
- <child>
- <object class="GtkLabel" id="password-description">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">In order to import, please enter the password.</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</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>
- <property name="row_spacing">6</property>
- <property name="column_spacing">12</property>
- <child>
- <object class="GtkEntry" id="password-entry">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="invisible_char">●</property>
- <property name="visibility">False</property>
- <property name="width_chars">20</property>
- <property name="invisible_char_set">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="GtkLabel" id="password-label">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="xalign">0</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="GtkLabel" id="token-label">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Token:</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="GtkBox" id="box2">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="spacing">6</property>
- <child>
- <object class="GtkImage" id="token-image">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="stock">gtk-missing-image</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="token-description">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="xalign">0</property>
- <property name="label"></property>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- </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="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- </child>
- </object>
- </child>
- <child type="label">
- <object class="GtkLabel" id="label5">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Unlock</property>
- <attributes>
- <attribute name="weight" value="bold"/>
- </attributes>
- </object>
- </child>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkFrame" id="settings-area">
- <property name="visible">True</property>
- <property name="can_focus">False</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="can_focus">False</property>
- <property name="left_padding">12</property>
- <child>
- <object class="GtkGrid" id="grid1">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">12</property>
- <child>
- <object class="GtkLabel" id="label-label">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Label:</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="GtkEntry" id="label-entry">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="invisible_char">●</property>
- <property name="width_chars">20</property>
- <property name="invisible_char_set">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>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- </object>
- </child>
- </object>
- </child>
- <child type="label">
- <object class="GtkLabel" id="label4">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="margin_bottom">6</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Import settings</property>
- <attributes>
- <attribute name="weight" value="bold"/>
- </attributes>
- </object>
- </child>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <object class="GtkSizeGroup" id="entry-size-group">
- <property name="mode">GTK_SIZE_GROUP_HORIZONTAL</property>
- <widgets>
- <widget name="password-label"/>
- <widget name="token-label"/>
- <widget name="label-label"/>
- </widgets>
- </object>
-</interface>
diff --git a/gcr-gtk3/gcr-pkcs11-import-interaction.c b/gcr-gtk3/gcr-pkcs11-import-interaction.c
deleted file mode 100644
index bb0dc5d..0000000
--- a/gcr-gtk3/gcr-pkcs11-import-interaction.c
+++ /dev/null
@@ -1,249 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2008 Stefan Walter
- *
- * 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 "config.h"
-
-#include "gcr/gcr-import-interaction.h"
-
-#include "gcr-dialog-util.h"
-#include "gcr-pkcs11-import-interaction.h"
-
-#include <glib/gi18n-lib.h>
-
-enum {
- PROP_0,
- PROP_PARENT_WINDOW
-};
-
-struct _GcrPkcs11ImportInteraction {
- GTlsInteraction parent;
- gboolean supplemented;
- GtkWindow *parent_window;
- GcrPkcs11ImportDialog *dialog;
-};
-
-static void _gcr_pkcs11_import_interaction_iface_init (GcrImportInteractionIface *iface);
-
-G_DEFINE_TYPE_WITH_CODE(GcrPkcs11ImportInteraction, _gcr_pkcs11_import_interaction, G_TYPE_TLS_INTERACTION,
- G_IMPLEMENT_INTERFACE (GCR_TYPE_IMPORT_INTERACTION, _gcr_pkcs11_import_interaction_iface_init));
-
-static void
-_gcr_pkcs11_import_interaction_init (GcrPkcs11ImportInteraction *self)
-{
- self->dialog = _gcr_pkcs11_import_dialog_new (self->parent_window);
-}
-
-static void
-_gcr_pkcs11_import_interaction_dispose (GObject *obj)
-{
- GcrPkcs11ImportInteraction *self = GCR_PKCS11_IMPORT_INTERACTION (obj);
-
- g_clear_object (&self->dialog);
-
- G_OBJECT_CLASS (_gcr_pkcs11_import_interaction_parent_class)->dispose (obj);
-}
-
-static void
-_gcr_pkcs11_import_interaction_set_property (GObject *obj,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- GcrPkcs11ImportInteraction *self = GCR_PKCS11_IMPORT_INTERACTION (obj);
-
- switch (prop_id) {
- case PROP_PARENT_WINDOW:
- gtk_window_set_transient_for (GTK_WINDOW (self->dialog),
- g_value_get_object (value));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-_gcr_pkcs11_import_interaction_get_property (GObject *obj,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- GcrPkcs11ImportInteraction *self = GCR_PKCS11_IMPORT_INTERACTION (obj);
-
- switch (prop_id) {
- case PROP_PARENT_WINDOW:
- g_value_set_object (value, gtk_window_get_transient_for (GTK_WINDOW (self->dialog)));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static GTlsInteractionResult
-_gcr_pkcs11_import_interaction_ask_password (GTlsInteraction *interaction,
- GTlsPassword *password,
- GCancellable *cancellable,
- GError **error)
-{
- GcrPkcs11ImportInteraction *self = GCR_PKCS11_IMPORT_INTERACTION (interaction);
-
- g_return_val_if_fail (self->dialog != NULL, G_TLS_INTERACTION_UNHANDLED);
-
- self->supplemented = TRUE;
- return _gcr_pkcs11_import_dialog_run_ask_password (self->dialog, password, cancellable, error);
-}
-
-static void
-_gcr_pkcs11_import_interaction_supplement_prep (GcrImportInteraction *interaction,
- GckBuilder *builder)
-{
- GcrPkcs11ImportInteraction *self = GCR_PKCS11_IMPORT_INTERACTION (interaction);
-
- self->supplemented = FALSE;
- _gcr_pkcs11_import_dialog_set_supplements (self->dialog, builder);
-}
-
-static GTlsInteractionResult
-_gcr_pkcs11_import_interaction_supplement (GcrImportInteraction *interaction,
- GckBuilder *builder,
- GCancellable *cancellable,
- GError **error)
-{
- GcrPkcs11ImportInteraction *self = GCR_PKCS11_IMPORT_INTERACTION (interaction);
-
- g_return_val_if_fail (self->dialog != NULL, G_TLS_INTERACTION_UNHANDLED);
-
- if (self->supplemented)
- return G_TLS_INTERACTION_HANDLED;
-
- self->supplemented = TRUE;
- if (_gcr_pkcs11_import_dialog_run (self->dialog)) {
- _gcr_pkcs11_import_dialog_get_supplements (self->dialog, builder);
- return G_TLS_INTERACTION_HANDLED;
-
- } else {
- g_set_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED, _("The user cancelled the operation"));
- return G_TLS_INTERACTION_FAILED;
- }
-}
-
-static void
-on_dialog_run_async (GObject *source,
- GAsyncResult *result,
- gpointer user_data)
-{
- GTask *task = G_TASK (user_data);
- GckBuilder *builder = g_task_get_task_data (task);
-
- if (_gcr_pkcs11_import_dialog_run_finish (GCR_PKCS11_IMPORT_DIALOG (source), result)) {
- _gcr_pkcs11_import_dialog_get_supplements (GCR_PKCS11_IMPORT_DIALOG (source), builder);
- g_task_return_boolean (task, TRUE);
-
- } else {
- g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_CANCELLED,
- _("The user cancelled the operation"));
- }
-
- g_clear_object (&task);
-}
-
-static void
-_gcr_pkcs11_import_interaction_supplement_async (GcrImportInteraction *interaction,
- GckBuilder *builder,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data)
-{
- GcrPkcs11ImportInteraction *self = GCR_PKCS11_IMPORT_INTERACTION (interaction);
- GTask *task;
-
- g_return_if_fail (self->dialog != NULL);
-
- task = g_task_new (interaction, cancellable, callback, user_data);
- g_task_set_source_tag (task, _gcr_pkcs11_import_interaction_supplement_async);
-
- /* If dialog was already shown, then short circuit */
- if (self->supplemented) {
- g_task_return_boolean (task, TRUE);
-
- } else {
- self->supplemented = TRUE;
- g_task_set_task_data (task, gck_builder_ref (builder),
- (GDestroyNotify) gck_builder_unref);
- _gcr_pkcs11_import_dialog_run_async (self->dialog, cancellable,
- on_dialog_run_async,
- g_object_ref (task));
- }
-
- g_clear_object (&task);
-}
-
-static GTlsInteractionResult
-_gcr_pkcs11_import_interaction_supplement_finish (GcrImportInteraction *interaction,
- GAsyncResult *result,
- GError **error)
-{
- GcrPkcs11ImportInteraction *self = GCR_PKCS11_IMPORT_INTERACTION (interaction);
-
- g_return_val_if_fail (self->dialog != NULL, G_TLS_INTERACTION_UNHANDLED);
- g_return_val_if_fail (g_task_is_valid (result, interaction), G_TLS_INTERACTION_UNHANDLED);
-
- if (!g_task_propagate_boolean (G_TASK (result), error))
- return G_TLS_INTERACTION_FAILED;
-
- return G_TLS_INTERACTION_HANDLED;
-
-}
-
-static void
-_gcr_pkcs11_import_interaction_iface_init (GcrImportInteractionIface *iface)
-{
- iface->supplement_prep = _gcr_pkcs11_import_interaction_supplement_prep;
- iface->supplement = _gcr_pkcs11_import_interaction_supplement;
- iface->supplement_async = _gcr_pkcs11_import_interaction_supplement_async;
- iface->supplement_finish = _gcr_pkcs11_import_interaction_supplement_finish;
-}
-
-static void
-_gcr_pkcs11_import_interaction_class_init (GcrPkcs11ImportInteractionClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
- GTlsInteractionClass *interaction_class = G_TLS_INTERACTION_CLASS (klass);
-
- gobject_class->dispose = _gcr_pkcs11_import_interaction_dispose;
- gobject_class->set_property = _gcr_pkcs11_import_interaction_set_property;
- gobject_class->get_property = _gcr_pkcs11_import_interaction_get_property;
-
- interaction_class->ask_password = _gcr_pkcs11_import_interaction_ask_password;
-
- g_object_class_install_property (gobject_class, PROP_PARENT_WINDOW,
- g_param_spec_object ("parent-window", "Parent Window", "Prompt Parent Window",
- GTK_TYPE_WINDOW,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-}
-
-GTlsInteraction *
-_gcr_pkcs11_import_interaction_new (GtkWindow *parent_window)
-{
- g_return_val_if_fail (parent_window == NULL || GTK_IS_WINDOW (parent_window), NULL);
- return g_object_new (GCR_TYPE_PKCS11_IMPORT_INTERACTION,
- "parent-window", parent_window,
- NULL);
-}
diff --git a/gcr-gtk3/gcr-pkcs11-import-interaction.h b/gcr-gtk3/gcr-pkcs11-import-interaction.h
deleted file mode 100644
index a36db2e..0000000
--- a/gcr-gtk3/gcr-pkcs11-import-interaction.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2011 Collabora Ltd.
- *
- * 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/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#ifndef __GCR_PKCS11_IMPORT_INTERACTION_H__
-#define __GCR_PKCS11_IMPORT_INTERACTION_H__
-
-#include "gcr-pkcs11-import-dialog.h"
-
-G_BEGIN_DECLS
-
-#define GCR_TYPE_PKCS11_IMPORT_INTERACTION (_gcr_pkcs11_import_interaction_get_type ())
-G_DECLARE_FINAL_TYPE (GcrPkcs11ImportInteraction, _gcr_pkcs11_import_interaction,
- GCR, PKCS11_IMPORT_INTERACTION,
- GTlsInteraction)
-
-GTlsInteraction * _gcr_pkcs11_import_interaction_new (GtkWindow *parent_window);
-
-G_END_DECLS
-
-#endif /* __GCR_PKCS11_IMPORT_INTERACTION_H__ */
diff --git a/gcr-gtk3/gcr-prompt-dialog.c b/gcr-gtk3/gcr-prompt-dialog.c
deleted file mode 100644
index 80726ba..0000000
--- a/gcr-gtk3/gcr-prompt-dialog.c
+++ /dev/null
@@ -1,1060 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2011 Stefan Walter
- *
- * 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/>.
- *
- * Author: Stef Walter <stef@thewalter.net>
- */
-
-#include "config.h"
-
-#include "gcr/gcr-prompt.h"
-
-#include "gcr-prompt-dialog.h"
-#include "gcr-secure-entry-buffer.h"
-
-#include <gtk/gtk.h>
-#ifdef GDK_WINDOWING_X11
-#include <gdk/gdkx.h>
-#endif
-#ifdef GDK_WINDOWING_WAYLAND
-#include <gdk/gdkwayland.h>
-#endif
-#include <glib/gi18n.h>
-
-/**
- * GcrPromptDialog:
- *
- * A [iface@Gcr.Prompt] implementation which shows a GTK dialog. The dialog
- * will remain visible (but insensitive) between prompts. If the user cancels
- * the dialog between prompts, then the dialog will be hidden.
- */
-
-#ifdef GCR_DISABLE_GRABS
-#define GRAB_KEYBOARD 0
-#else
-#define GRAB_KEYBOARD 1
-#endif
-
-typedef enum {
- PROMPT_NONE,
- PROMPT_CONFIRMING,
- PROMPT_PASSWORDING
-} PromptMode;
-
-enum {
- PROP_0,
- PROP_MESSAGE,
- PROP_DESCRIPTION,
- PROP_WARNING,
- PROP_CHOICE_LABEL,
- PROP_CHOICE_CHOSEN,
- PROP_PASSWORD_NEW,
- PROP_PASSWORD_STRENGTH,
- PROP_CALLER_WINDOW,
- PROP_CONTINUE_LABEL,
- PROP_CANCEL_LABEL,
-
- PROP_PASSWORD_VISIBLE,
- PROP_CONFIRM_VISIBLE,
- PROP_WARNING_VISIBLE,
- PROP_CHOICE_VISIBLE,
-};
-
-struct _GcrPromptDialogPrivate {
- gchar *title;
- gchar *message;
- gchar *description;
- gchar *warning;
- gchar *choice_label;
- gboolean choice_chosen;
- gboolean password_new;
- guint password_strength;
- gchar *caller_window;
- gchar *continue_label;
- gchar *cancel_label;
-
- GSimpleAsyncResult *async_result;
- GcrPromptReply last_reply;
- GtkWidget *widget_grid;
- GtkWidget *continue_button;
- GtkWidget *spinner;
- GtkWidget *image;
- GtkWidget *password_entry;
- GtkEntryBuffer *password_buffer;
- GtkEntryBuffer *confirm_buffer;
- PromptMode mode;
-#if GTK_CHECK_VERSION (3,20,0)
- GdkSeat *grabbed_seat;
-#else
- GdkDevice *grabbed_device;
-#endif
- gulong grab_broken_id;
- gboolean grab_disabled;
- gboolean was_closed;
-};
-
-static void gcr_prompt_dialog_prompt_iface (GcrPromptIface *iface);
-
-static gboolean ungrab_keyboard (GtkWidget *win,
- GdkEvent *event,
- gpointer unused);
-
-G_DEFINE_TYPE_WITH_CODE (GcrPromptDialog, gcr_prompt_dialog, GTK_TYPE_DIALOG,
- G_ADD_PRIVATE (GcrPromptDialog);
- G_IMPLEMENT_INTERFACE (GCR_TYPE_PROMPT, gcr_prompt_dialog_prompt_iface);
-);
-
-#ifdef GDK_WINDOWING_X11
-static gboolean
-update_transient_for_x11 (GcrPromptDialog *self, GdkWindow *window)
-{
- gint64 handle;
- gchar *end;
- GdkDisplay *display;
- GdkWindow *transient_for;
-
- if (!GDK_IS_X11_WINDOW (window))
- return FALSE;
-
- handle = g_ascii_strtoll (self->pv->caller_window, &end, 10);
- if (!end || *end != '\0') {
- g_warning ("couldn't parse caller-window property: %s", self->pv->caller_window);
- return FALSE;
- }
-
- display = gtk_widget_get_display (GTK_WIDGET (self));
- transient_for = gdk_x11_window_foreign_new_for_display (display, (Window)handle);
- if (transient_for == NULL) {
- g_warning ("caller-window property doesn't represent a window on current display: %s",
- self->pv->caller_window);
- return FALSE;
- }
-
- gdk_window_set_transient_for (window, transient_for);
- g_object_unref (transient_for);
- return TRUE;
-}
-#endif
-
-#ifdef GDK_WINDOWING_WAYLAND
-static gboolean
-update_transient_for_wl (GcrPromptDialog *self, GdkWindow *window)
-{
- if (!GDK_IS_WAYLAND_WINDOW (window))
- return FALSE;
-
- if (gdk_wayland_window_set_transient_for_exported (window, self->pv->caller_window)) {
- g_debug ("Succesfully set transient for WL window %s", self->pv->caller_window);
- return TRUE;
- }
-
- g_warning ("caller-window property doesn't represent a window on current display: %s",
- self->pv->caller_window);
- return FALSE;
-}
-#endif
-
-static void
-update_transient_for (GcrPromptDialog *self)
-{
- GdkWindow *window;
- gboolean success = FALSE;
-
- if (self->pv->caller_window == NULL || g_str_equal (self->pv->caller_window, "")) {
- gtk_window_set_modal (GTK_WINDOW (self), FALSE);
- return;
- }
-
- window = gtk_widget_get_window (GTK_WIDGET (self));
- if (window == NULL)
- return;
-
-#ifdef GDK_WINDOWING_X11
- if (!success)
- success |= update_transient_for_x11 (self, window);
-#endif
-#ifdef GDK_WINDOWING_WAYLAND
- if (!success)
- success |= update_transient_for_wl (self, window);
-#endif
-
- if (!success) {
- g_warning ("Couldn't set transient to caller window");
- }
-
- gtk_window_set_modal (GTK_WINDOW (self), TRUE);
-}
-
-static void
-gcr_prompt_dialog_init (GcrPromptDialog *self)
-{
- self->pv = gcr_prompt_dialog_get_instance_private (self);
-
- /*
- * This is a stupid hack to work around to help the window act like
- * a normal object with regards to reference counting and unref.
- */
- gtk_window_set_has_user_ref_count (GTK_WINDOW (self), FALSE);
-}
-
-static void
-gcr_prompt_dialog_set_property (GObject *obj,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- GcrPromptDialog *self = GCR_PROMPT_DIALOG (obj);
-
- switch (prop_id) {
- case PROP_MESSAGE:
- g_free (self->pv->message);
- self->pv->message = g_value_dup_string (value);
- g_object_notify (obj, "message");
- break;
- case PROP_DESCRIPTION:
- g_free (self->pv->description);
- self->pv->description = g_value_dup_string (value);
- g_object_notify (obj, "description");
- break;
- case PROP_WARNING:
- g_free (self->pv->warning);
- self->pv->warning = g_value_dup_string (value);
- if (self->pv->warning && self->pv->warning[0] == '\0') {
- g_free (self->pv->warning);
- self->pv->warning = NULL;
- }
- g_object_notify (obj, "warning");
- g_object_notify (obj, "warning-visible");
- break;
- case PROP_CHOICE_LABEL:
- g_free (self->pv->choice_label);
- self->pv->choice_label = g_value_dup_string (value);
- if (self->pv->choice_label && self->pv->choice_label[0] == '\0') {
- g_free (self->pv->choice_label);
- self->pv->choice_label = NULL;
- }
- g_object_notify (obj, "choice-label");
- g_object_notify (obj, "choice-visible");
- break;
- case PROP_CHOICE_CHOSEN:
- self->pv->choice_chosen = g_value_get_boolean (value);
- g_object_notify (obj, "choice-chosen");
- break;
- case PROP_PASSWORD_NEW:
- self->pv->password_new = g_value_get_boolean (value);
- g_object_notify (obj, "password-new");
- g_object_notify (obj, "confirm-visible");
- break;
- case PROP_CALLER_WINDOW:
- g_free (self->pv->caller_window);
- self->pv->caller_window = g_value_dup_string (value);
- if (self->pv->caller_window && self->pv->caller_window[0] == '\0') {
- g_free (self->pv->caller_window);
- self->pv->caller_window = NULL;
- }
- update_transient_for (self);
- g_object_notify (obj, "caller-window");
- break;
- case PROP_CONTINUE_LABEL:
- g_free (self->pv->continue_label);
- self->pv->continue_label = g_value_dup_string (value);
- g_object_notify (obj, "continue-label");
- break;
- case PROP_CANCEL_LABEL:
- g_free (self->pv->cancel_label);
- self->pv->cancel_label = g_value_dup_string (value);
- g_object_notify (obj, "cancel-label");
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-gcr_prompt_dialog_get_property (GObject *obj,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- GcrPromptDialog *self = GCR_PROMPT_DIALOG (obj);
-
- switch (prop_id) {
- case PROP_MESSAGE:
- g_value_set_string (value, self->pv->message);
- break;
- case PROP_DESCRIPTION:
- g_value_set_string (value, self->pv->description);
- break;
- case PROP_WARNING:
- g_value_set_string (value, self->pv->warning);
- break;
- case PROP_CHOICE_LABEL:
- g_value_set_string (value, self->pv->choice_label);
- break;
- case PROP_CHOICE_CHOSEN:
- g_value_set_boolean (value, self->pv->choice_chosen);
- break;
- case PROP_PASSWORD_NEW:
- g_value_set_boolean (value, self->pv->password_new);
- break;
- case PROP_PASSWORD_STRENGTH:
- g_value_set_int (value, self->pv->password_strength);
- break;
- case PROP_CALLER_WINDOW:
- g_value_set_string (value, self->pv->caller_window);
- break;
- case PROP_PASSWORD_VISIBLE:
- g_value_set_boolean (value, self->pv->mode == PROMPT_PASSWORDING);
- break;
- case PROP_CONFIRM_VISIBLE:
- g_value_set_boolean (value, self->pv->password_new &&
- self->pv->mode == PROMPT_PASSWORDING);
- break;
- case PROP_WARNING_VISIBLE:
- g_value_set_boolean (value, self->pv->warning && self->pv->warning[0]);
- break;
- case PROP_CHOICE_VISIBLE:
- g_value_set_boolean (value, self->pv->choice_label && self->pv->choice_label[0]);
- break;
- case PROP_CONTINUE_LABEL:
- g_value_set_string (value, self->pv->continue_label);
- break;
- case PROP_CANCEL_LABEL:
- g_value_set_string (value, self->pv->cancel_label);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-
-static void
-on_password_changed (GtkEditable *editable,
- gpointer user_data)
-{
- int upper, lower, digit, misc;
- const char *password;
- gdouble pwstrength;
- int length, i;
-
- password = gtk_entry_get_text (GTK_ENTRY (editable));
-
- /*
- * This code is based on the Master Password dialog in Firefox
- * (pref-masterpass.js)
- * Original code triple-licensed under the MPL, GPL, and LGPL
- * so is license-compatible with this file
- */
-
- length = strlen (password);
- upper = 0;
- lower = 0;
- digit = 0;
- misc = 0;
-
- for ( i = 0; i < length ; i++) {
- if (g_ascii_isdigit (password[i]))
- digit++;
- else if (g_ascii_islower (password[i]))
- lower++;
- else if (g_ascii_isupper (password[i]))
- upper++;
- else
- misc++;
- }
-
- if (length > 5)
- length = 5;
- if (digit > 3)
- digit = 3;
- if (upper > 3)
- upper = 3;
- if (misc > 3)
- misc = 3;
-
- pwstrength = ((length * 0.1) - 0.2) +
- (digit * 0.1) +
- (misc * 0.15) +
- (upper * 0.1);
-
- if (pwstrength < 0.0)
- pwstrength = 0.0;
- if (pwstrength > 1.0)
- pwstrength = 1.0;
-
- gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (user_data), pwstrength);
-}
-
-
-static const gchar*
-grab_status_message (GdkGrabStatus status)
-{
- switch (status) {
- case GDK_GRAB_SUCCESS:
- g_return_val_if_reached ("");
- break;
- case GDK_GRAB_ALREADY_GRABBED:
- return "already grabbed";
- case GDK_GRAB_INVALID_TIME:
- return "invalid time";
- case GDK_GRAB_NOT_VIEWABLE:
- return "not viewable";
- case GDK_GRAB_FROZEN:
- return "frozen";
- default:
- g_message ("unknown grab status: %d", (int)status);
- return "unknown";
- }
-}
-
-static gboolean
-on_grab_broken (GtkWidget *widget,
- GdkEventGrabBroken * event,
- gpointer user_data)
-{
- ungrab_keyboard (widget, (GdkEvent *)event, user_data);
- return TRUE;
-}
-
-#if GTK_CHECK_VERSION (3,20,0)
-static gboolean
-grab_keyboard (GtkWidget *widget,
- GdkEvent *event,
- gpointer user_data)
-{
- GcrPromptDialog *self = GCR_PROMPT_DIALOG (user_data);
- GdkGrabStatus status;
- GdkSeat *seat;
- GdkDisplay *display;
-
- if (self->pv->grabbed_seat || !GRAB_KEYBOARD)
- return FALSE;
-
- display = gtk_widget_get_display (widget);
- seat = gdk_display_get_default_seat (display);
- status = gdk_seat_grab (seat, gtk_widget_get_window (widget),
- GDK_SEAT_CAPABILITY_ALL,
- TRUE, NULL, event, NULL, NULL);
- if (status == GDK_GRAB_SUCCESS) {
- self->pv->grab_broken_id = g_signal_connect (widget, "grab-broken-event",
- G_CALLBACK (on_grab_broken), self);
- gtk_grab_add (widget);
- self->pv->grabbed_seat = seat;
- } else {
- g_message ("could not grab keyboard: %s", grab_status_message (status));
- }
-
- /* Always return false, so event is handled elsewhere */
- return FALSE;
-}
-
-static gboolean
-ungrab_keyboard (GtkWidget *widget,
- GdkEvent *event,
- gpointer user_data)
-{
- GcrPromptDialog *self = GCR_PROMPT_DIALOG (user_data);
-
- if (self->pv->grabbed_seat) {
- g_signal_handler_disconnect (widget, self->pv->grab_broken_id);
- gdk_seat_ungrab (self->pv->grabbed_seat);
- gtk_grab_remove (widget);
- self->pv->grabbed_seat = NULL;
- self->pv->grab_broken_id = 0;
- }
-
- /* Always return false, so event is handled elsewhere */
- return FALSE;
-}
-#else
-static gboolean
-grab_keyboard (GtkWidget *widget,
- GdkEvent *event,
- gpointer user_data)
-{
- GcrPromptDialog *self = GCR_PROMPT_DIALOG (user_data);
- GdkGrabStatus status;
- guint32 at;
- GdkDevice *device = NULL;
- GdkDeviceManager *manager;
- GdkDisplay *display;
- GList *devices, *l;
-
- if (self->pv->grabbed_device || !GRAB_KEYBOARD)
- return FALSE;
-
- display = gtk_widget_get_display (widget);
- manager = gdk_display_get_device_manager (display);
- devices = gdk_device_manager_list_devices (manager, GDK_DEVICE_TYPE_MASTER);
- for (l = devices; l; l = g_list_next (l)) {
- device = l->data;
- if (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD)
- break;
- }
- g_list_free (devices);
-
- if (!device) {
- g_message ("couldn't find device to grab");
- return FALSE;
- }
-
- at = event ? gdk_event_get_time (event) : GDK_CURRENT_TIME;
- status = gdk_device_grab (device, gtk_widget_get_window (widget),
- GDK_OWNERSHIP_APPLICATION, TRUE,
- GDK_KEY_PRESS | GDK_KEY_RELEASE, NULL, at);
- if (status == GDK_GRAB_SUCCESS) {
- self->pv->grab_broken_id = g_signal_connect (widget, "grab-broken-event",
- G_CALLBACK (on_grab_broken), self);
- gtk_device_grab_add (widget, device, TRUE);
- self->pv->grabbed_device = device;
- } else {
- g_message ("could not grab keyboard: %s", grab_status_message (status));
- }
-
- /* Always return false, so event is handled elsewhere */
- return FALSE;
-}
-
-static gboolean
-ungrab_keyboard (GtkWidget *widget,
- GdkEvent *event,
- gpointer user_data)
-{
- guint32 at = event ? gdk_event_get_time (event) : GDK_CURRENT_TIME;
- GcrPromptDialog *self = GCR_PROMPT_DIALOG (user_data);
-
- if (self->pv->grabbed_device) {
- g_signal_handler_disconnect (widget, self->pv->grab_broken_id);
- gdk_device_ungrab (self->pv->grabbed_device, at);
- gtk_device_grab_remove (widget, self->pv->grabbed_device);
- self->pv->grabbed_device = NULL;
- self->pv->grab_broken_id = 0;
- }
-
- /* Always return false, so event is handled elsewhere */
- return FALSE;
-}
-#endif
-
-static gboolean
-window_state_changed (GtkWidget *win, GdkEventWindowState *event, gpointer data)
-{
- GdkWindowState state = gdk_window_get_state (gtk_widget_get_window (win));
- GcrPromptDialog *self = GCR_PROMPT_DIALOG (data);
-
- if (state & GDK_WINDOW_STATE_WITHDRAWN ||
- state & GDK_WINDOW_STATE_ICONIFIED ||
- state & GDK_WINDOW_STATE_FULLSCREEN ||
- state & GDK_WINDOW_STATE_MAXIMIZED) {
- self->pv->grab_disabled = TRUE;
- ungrab_keyboard (win, (GdkEvent*)event, data);
- } else if (self->pv->grab_disabled) {
- self->pv->grab_disabled = FALSE;
- grab_keyboard (win, (GdkEvent*)event, data);
- }
-
- return FALSE;
-}
-
-static void
-gcr_prompt_dialog_constructed (GObject *obj)
-{
- GcrPromptDialog *self = GCR_PROMPT_DIALOG (obj);
- GtkDialog *dialog;
- PangoAttrList *attrs;
- GtkWidget *widget;
- GtkWidget *entry;
- GtkWidget *content;
- GtkWidget *button;
- GtkGrid *grid;
-
- G_OBJECT_CLASS (gcr_prompt_dialog_parent_class)->constructed (obj);
-
- dialog = GTK_DIALOG (self);
- button = gtk_dialog_add_button (dialog, _("_Cancel"), GTK_RESPONSE_CANCEL);
- g_object_bind_property (self, "cancel-label", button, "label", G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE);
- gtk_button_set_use_underline (GTK_BUTTON (button), TRUE);
- button = gtk_dialog_add_button (dialog, _("_OK"), GTK_RESPONSE_OK);
- g_object_bind_property (self, "continue-label", button, "label", G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE);
- gtk_button_set_use_underline (GTK_BUTTON (button), TRUE);
- self->pv->continue_button = button;
-
- gtk_window_set_type_hint (GTK_WINDOW (dialog), GDK_WINDOW_TYPE_HINT_NORMAL);
- gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
- gtk_window_set_keep_above (GTK_WINDOW (dialog), TRUE);
- gtk_dialog_set_default_response (dialog, GTK_RESPONSE_OK);
-
- content = gtk_dialog_get_content_area (dialog);
-
- grid = GTK_GRID (gtk_grid_new ());
- gtk_container_set_border_width (GTK_CONTAINER (grid), 6);
- gtk_widget_set_hexpand (GTK_WIDGET (grid), TRUE);
- gtk_grid_set_column_homogeneous (grid, FALSE);
- gtk_grid_set_column_spacing (grid, 12);
- gtk_grid_set_row_spacing (grid, 6);
-
- /* The prompt image */
- self->pv->image = gtk_image_new_from_icon_name ("dialog-password", GTK_ICON_SIZE_DIALOG);
- gtk_widget_set_valign (self->pv->image, GTK_ALIGN_START);
- gtk_grid_attach (grid, self->pv->image, -1, 0, 1, 4);
- gtk_widget_show (self->pv->image);
-
- /* The prompt spinner on the continue button */
- widget = gtk_dialog_get_widget_for_response (GTK_DIALOG (dialog),
- GTK_RESPONSE_OK);
- self->pv->spinner = gtk_spinner_new ();
- gtk_button_set_image (GTK_BUTTON (widget), self->pv->spinner);
- gtk_button_set_image_position (GTK_BUTTON (widget), GTK_POS_LEFT);
-
- /* The message label */
- widget = gtk_label_new ("");
- attrs = pango_attr_list_new ();
- pango_attr_list_insert (attrs, pango_attr_weight_new (PANGO_WEIGHT_BOLD));
- pango_attr_list_insert (attrs, pango_attr_scale_new (PANGO_SCALE_LARGE));
- gtk_label_set_attributes (GTK_LABEL (widget), attrs);
- pango_attr_list_unref (attrs);
- gtk_label_set_line_wrap (GTK_LABEL (widget), TRUE);
- gtk_widget_set_halign (widget, GTK_ALIGN_START);
- gtk_widget_set_hexpand (widget, TRUE);
- gtk_widget_set_margin_bottom (widget, 8);
- g_object_bind_property (self, "message", widget, "label", G_BINDING_DEFAULT);
- gtk_grid_attach (grid, widget, 0, 0, 2, 1);
- gtk_widget_show (widget);
-
- /* The description label */
- widget = gtk_label_new ("");
- gtk_label_set_line_wrap (GTK_LABEL (widget), TRUE);
- gtk_widget_set_halign (widget, GTK_ALIGN_START);
- gtk_widget_set_hexpand (widget, TRUE);
- gtk_widget_set_margin_bottom (widget, 4);
- g_object_bind_property (self, "description", widget, "label", G_BINDING_DEFAULT);
- gtk_grid_attach (grid, widget, 0, 1, 2, 1);
- gtk_widget_show (widget);
-
- /* The password label */
- widget = gtk_label_new (_("Password:"));
- gtk_widget_set_halign (widget, GTK_ALIGN_START);
- gtk_widget_set_hexpand (widget, FALSE);
- g_object_bind_property (self, "password-visible", widget, "visible", G_BINDING_DEFAULT);
- gtk_grid_attach (grid, widget, 0, 2, 1, 1);
-
- /* The password entry */
- self->pv->password_buffer = gcr_secure_entry_buffer_new ();
- entry = gtk_entry_new_with_buffer (self->pv->password_buffer);
- gtk_entry_set_visibility (GTK_ENTRY (entry), FALSE);
- gtk_entry_set_activates_default (GTK_ENTRY (entry), TRUE);
- gtk_widget_set_hexpand (entry, TRUE);
- g_object_bind_property (self, "password-visible", entry, "visible", G_BINDING_DEFAULT);
- gtk_grid_attach (grid, entry, 1, 2, 1, 1);
- self->pv->password_entry = entry;
-
- /* The confirm label */
- widget = gtk_label_new (_("Confirm:"));
- gtk_widget_set_halign (widget, GTK_ALIGN_START);
- gtk_widget_set_hexpand (widget, FALSE);
- g_object_bind_property (self, "confirm-visible", widget, "visible", G_BINDING_DEFAULT);
- gtk_grid_attach (grid, widget, 0, 3, 1, 1);
-
- /* The confirm entry */
- self->pv->confirm_buffer = gcr_secure_entry_buffer_new ();
- widget = gtk_entry_new_with_buffer (self->pv->confirm_buffer);
- gtk_widget_set_hexpand (widget, TRUE);
- gtk_entry_set_visibility (GTK_ENTRY (widget), FALSE);
- gtk_entry_set_activates_default (GTK_ENTRY (widget), TRUE);
- g_object_bind_property (self, "confirm-visible", widget, "visible", G_BINDING_DEFAULT);
- gtk_grid_attach (grid, widget, 1, 3, 1, 1);
-
- /* The quality progress bar */
- widget = gtk_progress_bar_new ();
- gtk_widget_set_hexpand (widget, TRUE);
- g_object_bind_property (self, "confirm-visible", widget, "visible", G_BINDING_DEFAULT);
- gtk_grid_attach (grid, widget, 1, 4, 1, 1);
- g_signal_connect (entry, "changed", G_CALLBACK (on_password_changed), widget);
-
- /* The warning */
- widget = gtk_label_new ("");
- attrs = pango_attr_list_new ();
- pango_attr_list_insert (attrs, pango_attr_style_new (PANGO_STYLE_ITALIC));
- gtk_label_set_attributes (GTK_LABEL (widget), attrs);
- pango_attr_list_unref (attrs);
- gtk_widget_set_hexpand (widget, FALSE);
- g_object_bind_property (self, "warning", widget, "label", G_BINDING_DEFAULT);
- g_object_bind_property (self, "warning-visible", widget, "visible", G_BINDING_DEFAULT);
- gtk_grid_attach (grid, widget, 0, 5, 2, 1);
- gtk_widget_show (widget);
-
- /* The checkbox */
- widget = g_object_new (GTK_TYPE_CHECK_BUTTON, "use-underline", TRUE, NULL);
- g_object_bind_property (self, "choice-label", widget, "label", G_BINDING_DEFAULT);
- g_object_bind_property (self, "choice-visible", widget, "visible", G_BINDING_DEFAULT);
- g_object_bind_property (self, "choice-chosen", widget, "active", G_BINDING_BIDIRECTIONAL);
- gtk_widget_set_hexpand (widget, FALSE);
- gtk_grid_attach (grid, widget, 0, 6, 2, 1);
-
- gtk_container_add (GTK_CONTAINER (content), GTK_WIDGET (grid));
- gtk_widget_show (GTK_WIDGET (grid));
- self->pv->widget_grid = GTK_WIDGET (grid);
-
- g_signal_connect (self, "map-event", G_CALLBACK (grab_keyboard), self);
- g_signal_connect (self, "unmap-event", G_CALLBACK (ungrab_keyboard), self);
- g_signal_connect (self, "window-state-event", G_CALLBACK (window_state_changed), self);
-
-}
-
-static gboolean
-handle_password_response (GcrPromptDialog *self)
-{
- const gchar *password;
- const gchar *confirm;
- const gchar *env;
- gint strength;
-
- password = gtk_entry_buffer_get_text (self->pv->password_buffer);
-
- /* Is it a new password? */
- if (self->pv->password_new) {
- confirm = gtk_entry_buffer_get_text (self->pv->confirm_buffer);
-
- /* Do the passwords match? */
- if (!g_str_equal (password, confirm)) {
- gcr_prompt_set_warning (GCR_PROMPT (self), _("Passwords do not match."));
- return FALSE;
- }
-
- /* Don't allow blank passwords if in paranoid mode */
- env = g_getenv ("GNOME_KEYRING_PARANOID");
- if (env && *env) {
- gcr_prompt_set_warning (GCR_PROMPT (self), _("Password cannot be blank"));
- return FALSE;
- }
- }
-
- if (g_str_equal (password, ""))
- strength = 0;
- else
- strength = 1;
-
- self->pv->password_strength = strength;
- g_object_notify (G_OBJECT (self), "password-strength");
- return TRUE;
-}
-
-static void
-gcr_prompt_dialog_response (GtkDialog *dialog,
- gint response_id)
-{
- GcrPromptDialog *self = GCR_PROMPT_DIALOG (dialog);
- GSimpleAsyncResult *res;
-
- /*
- * If this is called while no prompting is going on, then the dialog
- * is waiting for the caller to perform some action. Close the dialog.
- */
-
- if (self->pv->mode == PROMPT_NONE) {
- g_return_if_fail (response_id != GTK_RESPONSE_OK);
- gcr_prompt_close (GCR_PROMPT (self));
- return;
- }
-
- switch (response_id) {
- case GTK_RESPONSE_OK:
- switch (self->pv->mode) {
- case PROMPT_PASSWORDING:
- if (!handle_password_response (self))
- return;
- break;
- default:
- break;
- }
- self->pv->last_reply = GCR_PROMPT_REPLY_CONTINUE;
- break;
-
- default:
- self->pv->last_reply = GCR_PROMPT_REPLY_CANCEL;
- break;
- }
-
- gtk_widget_set_sensitive (self->pv->continue_button, FALSE);
- gtk_widget_set_sensitive (self->pv->widget_grid, FALSE);
- gtk_widget_show (self->pv->spinner);
- gtk_spinner_start (GTK_SPINNER (self->pv->spinner));
- self->pv->mode = PROMPT_NONE;
-
- res = self->pv->async_result;
- self->pv->async_result = NULL;
-
- g_simple_async_result_complete (res);
- g_object_unref (res);
-}
-
-static void
-gcr_prompt_dialog_dispose (GObject *obj)
-{
- GcrPromptDialog *self = GCR_PROMPT_DIALOG (obj);
-
- gcr_prompt_dialog_response (GTK_DIALOG (self), GTK_RESPONSE_DELETE_EVENT);
- g_assert (self->pv->async_result == NULL);
-
- gcr_prompt_close (GCR_PROMPT (self));
-
- ungrab_keyboard (GTK_WIDGET (self), NULL, self);
-#if GTK_CHECK_VERSION (3,20,0)
- g_assert (self->pv->grabbed_seat == NULL);
-#else
- g_assert (self->pv->grabbed_device == NULL);
-#endif
-
- G_OBJECT_CLASS (gcr_prompt_dialog_parent_class)->dispose (obj);
-}
-
-static void
-gcr_prompt_dialog_finalize (GObject *obj)
-{
- GcrPromptDialog *self = GCR_PROMPT_DIALOG (obj);
-
- g_free (self->pv->title);
- g_free (self->pv->message);
- g_free (self->pv->description);
- g_free (self->pv->warning);
- g_free (self->pv->choice_label);
- g_free (self->pv->caller_window);
-
- g_object_unref (self->pv->password_buffer);
- g_object_unref (self->pv->confirm_buffer);
-
- G_OBJECT_CLASS (gcr_prompt_dialog_parent_class)->finalize (obj);
-}
-
-static void
-gcr_prompt_dialog_class_init (GcrPromptDialogClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
- GtkDialogClass *dialog_class = GTK_DIALOG_CLASS (klass);
-
- gobject_class->constructed = gcr_prompt_dialog_constructed;
- gobject_class->get_property = gcr_prompt_dialog_get_property;
- gobject_class->set_property = gcr_prompt_dialog_set_property;
- gobject_class->dispose = gcr_prompt_dialog_dispose;
- gobject_class->finalize = gcr_prompt_dialog_finalize;
-
- dialog_class->response = gcr_prompt_dialog_response;
-
- g_object_class_override_property (gobject_class, PROP_MESSAGE, "message");
-
- g_object_class_override_property (gobject_class, PROP_DESCRIPTION, "description");
-
- g_object_class_override_property (gobject_class, PROP_WARNING, "warning");
-
- g_object_class_override_property (gobject_class, PROP_PASSWORD_NEW, "password-new");
-
- g_object_class_override_property (gobject_class, PROP_PASSWORD_STRENGTH, "password-strength");
-
- g_object_class_override_property (gobject_class, PROP_CHOICE_LABEL, "choice-label");
-
- g_object_class_override_property (gobject_class, PROP_CHOICE_CHOSEN, "choice-chosen");
-
- g_object_class_override_property (gobject_class, PROP_CALLER_WINDOW, "caller-window");
-
- g_object_class_override_property (gobject_class, PROP_CONTINUE_LABEL, "continue-label");
-
- g_object_class_override_property (gobject_class, PROP_CANCEL_LABEL, "cancel-label");
-
- /**
- * GcrPromptDialog:password-visible:
- *
- * Whether the password entry is visible or not.
- */
- g_object_class_install_property (gobject_class, PROP_PASSWORD_VISIBLE,
- g_param_spec_boolean ("password-visible", "Password visible", "Password field is visible",
- FALSE,
- G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
-
- /**
- * GcrPromptDialog:confirm-visible:
- *
- * Whether the password confirm entry is visible or not.
- */
- g_object_class_install_property (gobject_class, PROP_CONFIRM_VISIBLE,
- g_param_spec_boolean ("confirm-visible", "Confirm visible", "Confirm field is visible",
- FALSE,
- G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
-
- /**
- * GcrPromptDialog:warning-visible:
- *
- * Whether the warning label is visible or not.
- */
- g_object_class_install_property (gobject_class, PROP_WARNING_VISIBLE,
- g_param_spec_boolean ("warning-visible", "Warning visible", "Warning is visible",
- FALSE,
- G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
-
- /**
- * GcrPromptDialog:choice-visible:
- *
- * Whether the choice check box is visible or not.
- */
- g_object_class_install_property (gobject_class, PROP_CHOICE_VISIBLE,
- g_param_spec_boolean ("choice-visible", "Choice visible", "Choice is visible",
- FALSE,
- G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
-}
-
-static void
-gcr_prompt_dialog_password_async (GcrPrompt *prompt,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data)
-{
- GcrPromptDialog *self = GCR_PROMPT_DIALOG (prompt);
- GObject *obj;
-
- if (self->pv->async_result != NULL) {
- g_warning ("this prompt is already prompting");
- return;
- }
-
- self->pv->mode = PROMPT_PASSWORDING;
- self->pv->async_result = g_simple_async_result_new (G_OBJECT (self), callback, user_data,
- gcr_prompt_dialog_password_async);
-
- gtk_entry_buffer_set_text (self->pv->password_buffer, "", 0);
- gtk_entry_buffer_set_text (self->pv->confirm_buffer, "", 0);
-
- if (self->pv->was_closed) {
- self->pv->last_reply = GCR_PROMPT_REPLY_CANCEL;
- g_simple_async_result_complete_in_idle (self->pv->async_result);
- return;
- }
-
- gtk_image_set_from_icon_name (GTK_IMAGE (self->pv->image),
- "dialog-password", GTK_ICON_SIZE_DIALOG);
- gtk_widget_set_sensitive (self->pv->continue_button, TRUE);
- gtk_widget_set_sensitive (self->pv->widget_grid, TRUE);
- gtk_widget_hide (self->pv->spinner);
- gtk_spinner_stop (GTK_SPINNER (self->pv->spinner));
-
- obj = G_OBJECT (self);
- g_object_notify (obj, "password-visible");
- g_object_notify (obj, "confirm-visible");
- g_object_notify (obj, "warning-visible");
- g_object_notify (obj, "choice-visible");
-
- gtk_widget_grab_focus (self->pv->password_entry);
- gtk_widget_show (GTK_WIDGET (self));
-}
-
-static const gchar *
-gcr_prompt_dialog_password_finish (GcrPrompt *prompt,
- GAsyncResult *result,
- GError **error)
-{
- GcrPromptDialog *self = GCR_PROMPT_DIALOG (prompt);
-
- g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (prompt),
- gcr_prompt_dialog_password_async), NULL);
-
- if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error))
- return NULL;
-
- if (self->pv->last_reply == GCR_PROMPT_REPLY_CONTINUE)
- return gtk_entry_buffer_get_text (self->pv->password_buffer);
- return NULL;
-}
-
-static void
-gcr_prompt_dialog_confirm_async (GcrPrompt *prompt,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data)
-{
- GcrPromptDialog *self = GCR_PROMPT_DIALOG (prompt);
- GtkWidget *button;
- GObject *obj;
-
- if (self->pv->async_result != NULL) {
- g_warning ("this prompt is already prompting");
- return;
- }
-
- self->pv->mode = PROMPT_CONFIRMING;
- self->pv->async_result = g_simple_async_result_new (G_OBJECT (self), callback, user_data,
- gcr_prompt_dialog_confirm_async);
-
- if (self->pv->was_closed) {
- self->pv->last_reply = GCR_PROMPT_REPLY_CANCEL;
- g_simple_async_result_complete_in_idle (self->pv->async_result);
- return;
- }
-
- gtk_image_set_from_icon_name (GTK_IMAGE (self->pv->image),
- "dialog-question", GTK_ICON_SIZE_DIALOG);
- gtk_widget_set_sensitive (self->pv->continue_button, TRUE);
- gtk_widget_set_sensitive (self->pv->widget_grid, TRUE);
- gtk_widget_hide (self->pv->spinner);
- gtk_spinner_stop (GTK_SPINNER (self->pv->spinner));
-
- button = gtk_dialog_get_widget_for_response (GTK_DIALOG (self), GTK_RESPONSE_OK);
- gtk_widget_grab_focus (button);
-
- obj = G_OBJECT (self);
- g_object_notify (obj, "password-visible");
- g_object_notify (obj, "confirm-visible");
- g_object_notify (obj, "warning-visible");
- g_object_notify (obj, "choice-visible");
-
- gtk_widget_show (GTK_WIDGET (self));
-}
-
-static GcrPromptReply
-gcr_prompt_dialog_confirm_finish (GcrPrompt *prompt,
- GAsyncResult *result,
- GError **error)
-{
- GcrPromptDialog *self = GCR_PROMPT_DIALOG (prompt);
-
- g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (prompt),
- gcr_prompt_dialog_confirm_async), GCR_PROMPT_REPLY_CANCEL);
-
- if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error))
- return GCR_PROMPT_REPLY_CANCEL;
-
- return self->pv->last_reply;
-}
-
-static void
-gcr_prompt_dialog_close (GcrPrompt *prompt)
-{
- GcrPromptDialog *self = GCR_PROMPT_DIALOG (prompt);
- if (!self->pv->was_closed) {
- self->pv->was_closed = TRUE;
- gtk_widget_hide (GTK_WIDGET (self));
- }
-}
-
-static void
-gcr_prompt_dialog_prompt_iface (GcrPromptIface *iface)
-{
- iface->prompt_password_async = gcr_prompt_dialog_password_async;
- iface->prompt_password_finish = gcr_prompt_dialog_password_finish;
- iface->prompt_confirm_async = gcr_prompt_dialog_confirm_async;
- iface->prompt_confirm_finish = gcr_prompt_dialog_confirm_finish;
- iface->prompt_close = gcr_prompt_dialog_close;
-}
diff --git a/gcr-gtk3/gcr-prompt-dialog.h b/gcr-gtk3/gcr-prompt-dialog.h
deleted file mode 100644
index 9a94457..0000000
--- a/gcr-gtk3/gcr-prompt-dialog.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2011 Stefan Walter
- *
- * 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/>.
- *
- * Author: Stef Walter <stef@thewalter.net>
- */
-
-#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly."
-#endif
-
-#ifndef __GCR_PROMPT_DIALOG_H__
-#define __GCR_PROMPT_DIALOG_H__
-
-#include <gtk/gtk.h>
-
-#include <glib-object.h>
-
-G_BEGIN_DECLS
-
-#define GCR_TYPE_PROMPT_DIALOG (gcr_prompt_dialog_get_type ())
-#define GCR_PROMPT_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_PROMPT_DIALOG, GcrPromptDialog))
-#define GCR_PROMPT_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_PROMPT_DIALOG, GcrPromptDialogClass))
-#define GCR_IS_PROMPT_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_PROMPT_DIALOG))
-#define GCR_IS_PROMPT_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_PROMPT_DIALOG))
-#define GCR_PROMPT_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_PROMPT_DIALOG, GcrPromptDialogClass))
-
-typedef struct _GcrPromptDialog GcrPromptDialog;
-typedef struct _GcrPromptDialogClass GcrPromptDialogClass;
-typedef struct _GcrPromptDialogPrivate GcrPromptDialogPrivate;
-
-struct _GcrPromptDialog {
- GtkDialog parent;
-
- /*< private >*/
- GcrPromptDialogPrivate *pv;
-};
-
-struct _GcrPromptDialogClass {
- GtkDialogClass parent_class;
-};
-
-GType gcr_prompt_dialog_get_type (void);
-
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrPromptDialog, g_object_unref)
-
-G_END_DECLS
-
-#endif /* __GCR_PROMPT_DIALOG_H__ */
diff --git a/gcr-gtk3/gcr-renderer.c b/gcr-gtk3/gcr-renderer.c
deleted file mode 100644
index a10d639..0000000
--- a/gcr-gtk3/gcr-renderer.c
+++ /dev/null
@@ -1,309 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2010 Stefan Walter
- *
- * 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 "config.h"
-
-#include "gcr-renderer.h"
-
-#include "gcr-certificate-renderer.h"
-#include "gcr-certificate-request-renderer.h"
-#include "gcr-gnupg-renderer.h"
-#include "gcr-key-renderer.h"
-
-#include "gck/gck.h"
-
-#include <gtk/gtk.h>
-
-/**
- * GcrRenderer:
- *
- * An interface that's implemented by renderers which wish to render data to a
- * [iface@Viewer].
- *
- * The interaction between [iface@Renderer] and [iface@Viewer] is not stable
- * yet, and so new renderers cannot be implemented outside the Gcr library at
- * this time.
- *
- * To lookup a renderer for a given set of attributes, use the gcr_renderer_create()
- * function. This will create and initialize a renderer that's capable of viewing
- * the data in those attributes.
- */
-
-/**
- * GcrRendererIface:
- * @parent: the parent interface type
- * @data_changed: signal emitted when data being rendered changes
- * @render_view: method invoked to render the data into a viewer
- * @populate_popup: method invoked to populate a popup menu with additional
- * renderer options
- *
- * The interface for #GcrRenderer
- */
-
-enum {
- DATA_CHANGED,
- LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL] = { 0 };
-
-typedef struct _GcrRegistered {
- GckAttributes *attrs;
- GType renderer_type;
-} GcrRegistered;
-
-static GArray *registered_renderers = NULL;
-static gboolean registered_sorted = FALSE;
-
-static void
-gcr_renderer_default_init (GcrRendererIface *iface)
-{
- static gboolean initialized = FALSE;
- if (!initialized) {
-
- /**
- * GcrRenderer:label:
- *
- * The label to display.
- */
- g_object_interface_install_property (iface,
- g_param_spec_string ("label", "Label", "The label for the renderer",
- "",
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
- /**
- * GcrRenderer:attributes:
- *
- * The attributes to display.
- */
- g_object_interface_install_property (iface,
- g_param_spec_boxed ("attributes", "Attributes", "The data displayed in the renderer",
- GCK_TYPE_ATTRIBUTES,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
- /**
- * GcrRenderer::data-changed:
- *
- * A signal that is emitted by the renderer when it's data
- * changed and should be rerendered.
- */
- signals[DATA_CHANGED] = g_signal_new ("data-changed", GCR_TYPE_RENDERER, G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (GcrRendererIface, data_changed),
- NULL, NULL, NULL, G_TYPE_NONE, 0);
-
- initialized = TRUE;
- }
-}
-
-typedef GcrRendererIface GcrRendererInterface;
-
-G_DEFINE_INTERFACE (GcrRenderer, gcr_renderer, G_TYPE_OBJECT);
-
-/**
- * gcr_renderer_render_view:
- * @self: The renderer
- * @viewer: The viewer to render to.
- *
- * Render the contents of the renderer to the given viewer.
- */
-void
-gcr_renderer_render_view (GcrRenderer *self, GcrViewer *viewer)
-{
- g_return_if_fail (GCR_IS_RENDERER (self));
- g_return_if_fail (GCR_RENDERER_GET_INTERFACE (self)->render_view);
- GCR_RENDERER_GET_INTERFACE (self)->render_view (self, viewer);
-}
-
-/**
- * gcr_renderer_popuplate_popup:
- * @self: The renderer
- * @viewer: The viewer that is displaying a popup
- * @menu: The popup menu being displayed
- *
- * Called by #GcrViewer when about to display a popup menu for the content
- * displayed by the renderer. The renderer can add a menu item if desired.
- */
-void
-gcr_renderer_popuplate_popup (GcrRenderer *self, GcrViewer *viewer,
- GtkMenu *menu)
-{
- g_return_if_fail (GCR_IS_RENDERER (self));
- if (GCR_RENDERER_GET_INTERFACE (self)->populate_popup)
- GCR_RENDERER_GET_INTERFACE (self)->populate_popup (self, viewer, menu);
-}
-
-/**
- * gcr_renderer_emit_data_changed:
- * @self: The renderer
- *
- * Emit the #GcrRenderer::data-changed signal on the renderer. This is used by
- * renderer implementations.
- */
-void
-gcr_renderer_emit_data_changed (GcrRenderer *self)
-{
- g_return_if_fail (GCR_IS_RENDERER (self));
- g_signal_emit (self, signals[DATA_CHANGED], 0);
-}
-
-/**
- * gcr_renderer_get_attributes:
- * @self: The renderer
- *
- * Get the PKCS#11 attributes, if any, set for this renderer to display.
- *
- * Returns: (nullable) (transfer none): the attributes, owned by the renderer
- */
-GckAttributes *
-gcr_renderer_get_attributes (GcrRenderer *self)
-{
- GckAttributes *attrs;
-
- g_return_val_if_fail (GCR_IS_RENDERER (self), NULL);
-
- g_object_get (self, "attributes", &attrs, NULL);
- if (attrs != NULL)
- gck_attributes_unref (attrs);
- return attrs;
-}
-
-/**
- * gcr_renderer_set_attributes:
- * @self: The renderer
- * @attrs: (nullable): attributes to set
- *
- * Set the PKCS#11 attributes for this renderer to display.
- */
-void
-gcr_renderer_set_attributes (GcrRenderer *self,
- GckAttributes *attrs)
-{
- g_return_if_fail (GCR_IS_RENDERER (self));
-
- g_object_set (self, "attributes", attrs, NULL);
-}
-
-static gint
-sort_registered_by_n_attrs (gconstpointer a, gconstpointer b)
-{
- const GcrRegistered *ra = a;
- const GcrRegistered *rb = b;
- gulong na, nb;
-
- g_assert (a);
- g_assert (b);
-
- na = gck_attributes_count (ra->attrs);
- nb = gck_attributes_count (rb->attrs);
-
- /* Note we're sorting in reverse order */
- if (na < nb)
- return 1;
- return (na == nb) ? 0 : -1;
-}
-
-/**
- * gcr_renderer_create:
- * @label: (nullable): The label for the renderer
- * @attrs: The attributes to render
- *
- * Create and initialize a renderer for the given attributes and label. These
- * renderers should have been preregistered via gcr_renderer_register().
- *
- * Returns: (transfer full) (nullable): a new renderer, or %NULL if no renderer
- * matched the attributes; the render should be released with g_object_unref()
- */
-GcrRenderer *
-gcr_renderer_create (const gchar *label, GckAttributes *attrs)
-{
- GcrRegistered *registered;
- gboolean matched;
- gulong n_attrs;
- gulong j;
- gsize i;
-
- g_return_val_if_fail (attrs, NULL);
-
- gcr_renderer_register_well_known ();
-
- if (!registered_renderers)
- return NULL;
-
- if (!registered_sorted) {
- g_array_sort (registered_renderers, sort_registered_by_n_attrs);
- registered_sorted = TRUE;
- }
-
- for (i = 0; i < registered_renderers->len; ++i) {
- registered = &(g_array_index (registered_renderers, GcrRegistered, i));
- n_attrs = gck_attributes_count (registered->attrs);
-
- matched = TRUE;
-
- for (j = 0; j < n_attrs; ++j) {
- if (!gck_attributes_contains (attrs, gck_attributes_at (registered->attrs, j))) {
- matched = FALSE;
- break;
- }
- }
-
- if (matched)
- return g_object_new (registered->renderer_type, "label", label,
- "attributes", attrs, NULL);
- }
-
- return NULL;
-}
-
-/**
- * gcr_renderer_register:
- * @renderer_type: The renderer class type
- * @attrs: The attributes to match
- *
- * Register a renderer to be created when matching attributes are passed to
- * gcr_renderer_create().
- */
-void
-gcr_renderer_register (GType renderer_type, GckAttributes *attrs)
-{
- GcrRegistered registered;
-
- if (!registered_renderers)
- registered_renderers = g_array_new (FALSE, FALSE, sizeof (GcrRegistered));
-
- registered.renderer_type = renderer_type;
- registered.attrs = gck_attributes_ref_sink (attrs);
- g_array_append_val (registered_renderers, registered);
- registered_sorted = FALSE;
-}
-
-/**
- * gcr_renderer_register_well_known:
- *
- * Register all the well known renderers for certificates and keys known to the
- * Gcr library.
- */
-void
-gcr_renderer_register_well_known (void)
-{
- g_type_class_unref (g_type_class_ref (GCR_TYPE_CERTIFICATE_RENDERER));
- g_type_class_unref (g_type_class_ref (GCR_TYPE_CERTIFICATE_REQUEST_RENDERER));
- g_type_class_unref (g_type_class_ref (GCR_TYPE_KEY_RENDERER));
- g_type_class_unref (g_type_class_ref (GCR_TYPE_GNUPG_RENDERER));
-}
diff --git a/gcr-gtk3/gcr-renderer.h b/gcr-gtk3/gcr-renderer.h
deleted file mode 100644
index 1b81469..0000000
--- a/gcr-gtk3/gcr-renderer.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2010 Stefan Walter
- *
- * 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_RENDERER_H__
-#define __GCR_RENDERER_H__
-
-#include <glib-object.h>
-
-#include "gcr/gcr-column.h"
-#include "gcr/gcr-types.h"
-
-#include "gcr-viewer.h"
-
-G_BEGIN_DECLS
-
-#define GCR_TYPE_RENDERER (gcr_renderer_get_type())
-#define GCR_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_RENDERER, GcrRenderer))
-#define GCR_IS_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_RENDERER))
-#define GCR_RENDERER_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GCR_TYPE_RENDERER, GcrRendererIface))
-
-typedef struct _GcrRendererIface GcrRendererIface;
-
-struct _GcrRendererIface {
- GTypeInterface parent;
-
- /* signals */
- void (*data_changed) (GcrRenderer *self);
-
- /* virtual */
- void (*render_view) (GcrRenderer *self, GcrViewer *viewer);
-
- void (*populate_popup) (GcrRenderer *self, GcrViewer *viewer, GtkMenu *menu);
-
- /*< private >*/
- gpointer dummy1;
-
- gpointer dummy2;
- gpointer dummy3;
- gpointer dummy4;
- gpointer dummy5;
- gpointer dummy6;
- gpointer dummy7;
-
-};
-
-GType gcr_renderer_get_type (void) G_GNUC_CONST;
-
-void gcr_renderer_render_view (GcrRenderer *self,
- GcrViewer *viewer);
-
-void gcr_renderer_popuplate_popup (GcrRenderer *self,
- GcrViewer *viewer,
- GtkMenu *menu);
-
-void gcr_renderer_emit_data_changed (GcrRenderer *self);
-
-GcrRenderer* gcr_renderer_create (const gchar *label,
- GckAttributes *attrs);
-
-void gcr_renderer_register (GType renderer_type,
- GckAttributes *attrs);
-
-GckAttributes * gcr_renderer_get_attributes (GcrRenderer *self);
-
-void gcr_renderer_set_attributes (GcrRenderer *self,
- GckAttributes *attrs);
-
-void gcr_renderer_register_well_known (void);
-
-G_END_DECLS
-
-#endif /* __GCR_RENDERER_H__ */
diff --git a/gcr-gtk3/gcr-section.c b/gcr-gtk3/gcr-section.c
new file mode 100644
index 0000000..24c1502
--- /dev/null
+++ b/gcr-gtk3/gcr-section.c
@@ -0,0 +1,204 @@
+/*
+ * Copyright 2021 Collabora Ltd.
+ * Copyright Corentin Noël <corentin.noel@collabora.com>
+ * SPDX-License-Identifier: LGPL-2.1-or-later
+ */
+
+#include "gcr-section.h"
+
+struct _GcrSection
+{
+ GtkGrid parent_instance;
+
+ GtkWidget *frame;
+ GtkWidget *label;
+ GtkWidget *image;
+ GtkWidget *listbox;
+ GtkSizeGroup *size_group;
+};
+
+G_DEFINE_TYPE (GcrSection, gcr_section, GTK_TYPE_GRID)
+
+enum {
+ PROP_TITLE = 1,
+ PROP_ICON,
+ N_PROPERTIES
+};
+
+static GParamSpec *obj_properties[N_PROPERTIES] = { NULL, };
+
+static void
+gcr_section_dispose (GObject *object)
+{
+ GcrSection *self = (GcrSection *)object;
+
+ g_clear_object (&self->size_group);
+ /* g_clear_pointer (&self->label, gtk_widget_unparent); */
+ /* g_clear_pointer (&self->image, gtk_widget_unparent); */
+ /* g_clear_pointer (&self->frame, gtk_widget_unparent); */
+
+ G_OBJECT_CLASS (gcr_section_parent_class)->dispose (object);
+}
+
+static void
+gcr_section_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ GcrSection *self = GCR_SECTION (object);
+
+ switch (prop_id)
+ {
+ case PROP_TITLE:
+ g_value_set_string (value, gtk_label_get_label (GTK_LABEL (self->label)));
+ break;
+ case PROP_ICON:
+ {
+ GIcon *icon;
+ gtk_image_get_gicon (GTK_IMAGE (self->image), &icon, NULL);
+ g_value_set_object (value, icon);
+ }
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
+}
+
+static void
+gcr_section_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ GcrSection *self = GCR_SECTION (object);
+
+ switch (prop_id)
+ {
+ case PROP_TITLE:
+ gtk_label_set_label (GTK_LABEL (self->label), g_value_get_string (value));
+ break;
+ case PROP_ICON:
+ if (!self->image)
+ {
+ self->image = gtk_image_new ();
+ gtk_grid_attach (GTK_GRID (self), self->image, 1, 0, 1, 1);
+ gtk_container_child_set (GTK_CONTAINER (self), self->frame, "width", 2, NULL);
+ }
+
+ gtk_image_set_from_gicon (GTK_IMAGE (self->image), g_value_get_object (value), GTK_ICON_SIZE_BUTTON);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
+}
+
+static void
+gcr_section_class_init (GcrSectionClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ object_class->dispose = gcr_section_dispose;
+ object_class->get_property = gcr_section_get_property;
+ object_class->set_property = gcr_section_set_property;
+ obj_properties[PROP_TITLE] =
+ g_param_spec_string ("title",
+ "Title",
+ "The title of the section",
+ NULL,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS);
+
+ obj_properties[PROP_ICON] =
+ g_param_spec_object ("icon",
+ "Icon",
+ "The Icon to use",
+ G_TYPE_ICON,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS);
+
+ g_object_class_install_properties (object_class,
+ N_PROPERTIES,
+ obj_properties);
+}
+
+static void
+gcr_section_init (GcrSection *self)
+{
+ gtk_orientable_set_orientation (GTK_ORIENTABLE (self), GTK_ORIENTATION_VERTICAL);
+ self->label = gtk_label_new (NULL);
+ g_object_set (G_OBJECT (self->label),
+ "margin-start", 12,
+ "margin-end", 12,
+ "margin-top", 8,
+ "margin-bottom", 8,
+ "xalign", 0.0,
+ "halign", GTK_ALIGN_START,
+ "hexpand", TRUE,
+ NULL);
+ gtk_style_context_add_class (gtk_widget_get_style_context (self->label), "heading");
+ gtk_style_context_add_class (gtk_widget_get_style_context (self->label), "h4");
+ self->listbox = gtk_list_box_new ();
+ gtk_list_box_set_selection_mode (GTK_LIST_BOX (self->listbox), GTK_SELECTION_NONE);
+ self->frame = gtk_frame_new (NULL);
+ g_object_set (G_OBJECT (self->frame),
+ "child", self->listbox,
+ "hexpand", TRUE,
+ NULL);
+ self->size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
+ gtk_container_add (GTK_CONTAINER (self), self->label);
+ gtk_container_add (GTK_CONTAINER (self), self->frame);
+
+ g_object_set (self,
+ "margin-start", 12,
+ "margin-end", 12,
+ "margin-top", 8,
+ "margin-bottom", 8,
+ NULL);
+}
+
+GtkWidget *
+gcr_section_new (const gchar *title)
+{
+ return g_object_new (GCR_TYPE_SECTION, "title", title, NULL);
+}
+
+GtkWidget *
+gcr_section_new_with_icon (const gchar *title,
+ GIcon *icon)
+{
+ return g_object_new (GCR_TYPE_SECTION, "title", title, "icon", icon, NULL);
+}
+
+void
+gcr_section_add_child (GcrSection *self,
+ const gchar *description,
+ GtkWidget *child)
+{
+ GtkWidget *row, *box, *label;
+ g_return_if_fail (GCR_IS_SECTION (self));
+
+ row = gtk_list_box_row_new ();
+ box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
+ gtk_container_add (GTK_CONTAINER (row), box);
+ label = gtk_label_new (description);
+ gtk_label_set_xalign (GTK_LABEL (label), 0.0);
+ g_object_set (label,
+ "margin-start", 12,
+ "margin-end", 12,
+ "margin-top", 8,
+ "margin-bottom", 8,
+ "xalign", 0.0,
+ "halign", GTK_ALIGN_START,
+ NULL);
+ gtk_style_context_add_class (gtk_widget_get_style_context (label), "caption");
+ g_object_set (child,
+ "margin-start", 12,
+ "margin-end", 12,
+ "margin-top", 8,
+ "margin-bottom", 8,
+ "halign", GTK_ALIGN_END,
+ NULL);
+ gtk_size_group_add_widget (self->size_group, label);
+ gtk_container_add (GTK_CONTAINER (box), label);
+ gtk_container_add (GTK_CONTAINER (box), child);
+ gtk_container_add (GTK_CONTAINER (self->listbox), row);
+}
diff --git a/gcr-gtk3/gcr-section.h b/gcr-gtk3/gcr-section.h
new file mode 100644
index 0000000..69950cc
--- /dev/null
+++ b/gcr-gtk3/gcr-section.h
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2021 Collabora Ltd.
+ * Copyright Corentin Noël <corentin.noel@collabora.com>
+ * SPDX-License-Identifier: LGPL-2.1-or-later
+ */
+
+#ifndef __GCR_SECTION_H__
+#define __GCR_SECTION_H__
+
+#include <glib.h>
+#include <glib-object.h>
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+#define GCR_TYPE_SECTION gcr_section_get_type()
+G_DECLARE_FINAL_TYPE (GcrSection, gcr_section, GCR, SECTION, GtkGrid)
+
+GtkWidget *gcr_section_new (const gchar *title);
+GtkWidget *gcr_section_new_with_icon (const gchar *title,
+ GIcon *icon);
+
+void gcr_section_add_child (GcrSection *self,
+ const gchar *description,
+ GtkWidget *child);
+
+G_END_DECLS
+
+#endif /* __GCR_SECTION_H__ */
diff --git a/gcr-gtk3/gcr-tree-selector.c b/gcr-gtk3/gcr-tree-selector.c
deleted file mode 100644
index e4db6ea..0000000
--- a/gcr-gtk3/gcr-tree-selector.c
+++ /dev/null
@@ -1,346 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2010 Stefan Walter
- *
- * 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 "config.h"
-
-#include "gcr/gcr-internal.h"
-
-#include "gcr-collection-model.h"
-#include "gcr-tree-selector.h"
-
-#include <glib/gi18n-lib.h>
-
-#include <string.h>
-
-/**
- * GcrTreeSelector:
- *
- * A tree selector can be used to select certificates or keys. It allows
- * the user to select multiple objects from a tree.
- */
-
-enum {
- PROP_0,
- PROP_COLLECTION,
- PROP_COLUMNS
-};
-
-struct _GcrTreeSelectorPrivate {
- GcrCollection *collection;
- const GcrColumn *columns;
- GcrCollectionModel *model;
-};
-
-G_DEFINE_TYPE_WITH_PRIVATE (GcrTreeSelector, gcr_tree_selector, GTK_TYPE_TREE_VIEW);
-
-/* -----------------------------------------------------------------------------
- * INTERNAL
- */
-
-static void
-on_check_column_toggled (GtkCellRendererToggle *cell, gchar *path, GcrCollectionModel *model)
-{
- GtkTreeIter iter;
-
- g_assert (path != NULL);
-
- if (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (model), &iter, path))
- gcr_collection_model_toggle_selected (model, &iter);
-}
-
-static void
-add_string_column (GcrTreeSelector *self, const GcrColumn *column, gint column_id)
-{
- GtkCellRenderer *cell;
- GtkTreeViewColumn *col;
- const gchar *label;
-
- g_assert (column->column_type == G_TYPE_STRING);
- g_assert (!(column->flags & GCR_COLUMN_HIDDEN));
-
- cell = gtk_cell_renderer_text_new ();
- g_object_set (G_OBJECT (cell), "ellipsize", PANGO_ELLIPSIZE_END, NULL);
- label = column->label ? g_dpgettext2 (NULL, "column", column->label) : "";
- col = gtk_tree_view_column_new_with_attributes (label, cell, "text", column_id, NULL);
- gtk_tree_view_column_set_resizable (col, TRUE);
- if (column->flags & GCR_COLUMN_SORTABLE)
- gtk_tree_view_column_set_sort_column_id (col, column_id);
- gtk_tree_view_append_column (GTK_TREE_VIEW (self), col);
-}
-
-static void
-add_icon_column (GcrTreeSelector *self, const GcrColumn *column, gint column_id)
-{
- GtkCellRenderer *cell;
- GtkTreeViewColumn *col;
- const gchar *label;
-
- g_assert (column->column_type == G_TYPE_ICON);
- g_assert (!(column->flags & GCR_COLUMN_HIDDEN));
-
- cell = gtk_cell_renderer_pixbuf_new ();
- g_object_set (cell, "stock-size", GTK_ICON_SIZE_BUTTON, NULL);
- label = column->label ? g_dpgettext2 (NULL, "column", column->label) : "";
- col = gtk_tree_view_column_new_with_attributes (label, cell, "gicon", column_id, NULL);
- gtk_tree_view_column_set_resizable (col, TRUE);
- if (column->flags & GCR_COLUMN_SORTABLE)
- gtk_tree_view_column_set_sort_column_id (col, column_id);
- gtk_tree_view_append_column (GTK_TREE_VIEW (self), col);
-}
-
-static void
-add_check_column (GcrTreeSelector *self, guint column_id)
-{
- GtkCellRenderer *cell;
- GtkTreeViewColumn *col;
-
- cell = gtk_cell_renderer_toggle_new ();
- g_signal_connect (cell, "toggled", G_CALLBACK (on_check_column_toggled), self->pv->model);
-
- col = gtk_tree_view_column_new_with_attributes ("", cell, "active", column_id, NULL);
- gtk_tree_view_column_set_resizable (col, FALSE);
- gtk_tree_view_append_column (GTK_TREE_VIEW (self), col);
-}
-
-/* -----------------------------------------------------------------------------
- * OBJECT
- */
-
-static GObject*
-gcr_tree_selector_constructor (GType type, guint n_props, GObjectConstructParam *props)
-{
- GcrTreeSelector *self = GCR_TREE_SELECTOR (G_OBJECT_CLASS (gcr_tree_selector_parent_class)->constructor(type, n_props, props));
- const GcrColumn *column;
- guint i;
-
- g_return_val_if_fail (self, NULL);
- g_return_val_if_fail (self->pv->columns, NULL);
-
- self->pv->model = gcr_collection_model_new_full (self->pv->collection,
- GCR_COLLECTION_MODEL_TREE,
- self->pv->columns);
-
- gtk_tree_view_set_model (GTK_TREE_VIEW (self), GTK_TREE_MODEL (self->pv->model));
-
- /* First add the check mark column */
- add_check_column (self, gcr_collection_model_column_for_selected (self->pv->model));
-
- for (column = self->pv->columns, i = 0; column->property_name; ++column, ++i) {
- if (column->flags & GCR_COLUMN_HIDDEN)
- continue;
-
- if (column->column_type == G_TYPE_STRING)
- add_string_column (self, column, i);
- else if (column->column_type == G_TYPE_ICON)
- add_icon_column (self, column, i);
- else
- g_warning ("skipping unsupported column '%s' of type: %s",
- column->property_name, g_type_name (column->column_type));
- }
-
- return G_OBJECT (self);
-}
-
-static void
-gcr_tree_selector_init (GcrTreeSelector *self)
-{
- self->pv = gcr_tree_selector_get_instance_private (self);
-}
-
-static void
-gcr_tree_selector_dispose (GObject *obj)
-{
- GcrTreeSelector *self = GCR_TREE_SELECTOR (obj);
-
- if (self->pv->model)
- g_object_unref (self->pv->model);
- self->pv->model = NULL;
-
- if (self->pv->collection)
- g_object_unref (self->pv->collection);
- self->pv->collection = NULL;
-
- G_OBJECT_CLASS (gcr_tree_selector_parent_class)->dispose (obj);
-}
-
-static void
-gcr_tree_selector_finalize (GObject *obj)
-{
- GcrTreeSelector *self = GCR_TREE_SELECTOR (obj);
-
- g_assert (!self->pv->collection);
- g_assert (!self->pv->model);
-
- G_OBJECT_CLASS (gcr_tree_selector_parent_class)->finalize (obj);
-}
-
-static void
-gcr_tree_selector_set_property (GObject *obj, guint prop_id, const GValue *value,
- GParamSpec *pspec)
-{
- GcrTreeSelector *self = GCR_TREE_SELECTOR (obj);
- switch (prop_id) {
- case PROP_COLLECTION:
- g_return_if_fail (!self->pv->collection);
- self->pv->collection = g_value_dup_object (value);
- g_return_if_fail (self->pv->collection);
- break;
- case PROP_COLUMNS:
- g_return_if_fail (!self->pv->columns);
- self->pv->columns = g_value_get_pointer (value);
- g_return_if_fail (self->pv->columns);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-gcr_tree_selector_get_property (GObject *obj, guint prop_id, GValue *value,
- GParamSpec *pspec)
-{
- GcrTreeSelector *self = GCR_TREE_SELECTOR (obj);
-
- switch (prop_id) {
- case PROP_COLLECTION:
- g_value_set_object (value, gcr_tree_selector_get_collection (self));
- break;
- case PROP_COLUMNS:
- g_value_set_pointer (value, (gpointer)gcr_tree_selector_get_columns (self));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-gcr_tree_selector_class_init (GcrTreeSelectorClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-
- gobject_class->constructor = gcr_tree_selector_constructor;
- gobject_class->dispose = gcr_tree_selector_dispose;
- gobject_class->finalize = gcr_tree_selector_finalize;
- gobject_class->set_property = gcr_tree_selector_set_property;
- gobject_class->get_property = gcr_tree_selector_get_property;
-
- /**
- * GcrTreeSelector:collection:
- *
- * The collection which contains the objects to display in the selector.
- */
- g_object_class_install_property (gobject_class, PROP_COLLECTION,
- g_param_spec_object ("collection", "Collection", "Collection to select from",
- GCR_TYPE_COLLECTION,
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
-
- /**
- * GcrTreeSelector:columns:
- *
- * The columns to use to display the objects.
- */
- g_object_class_install_property (gobject_class, PROP_COLUMNS,
- g_param_spec_pointer ("columns", "Columns", "Columns to display in selector",
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
-}
-
-/* -----------------------------------------------------------------------------
- * PUBLIC
- */
-
-/**
- * gcr_tree_selector_new: (skip)
- * @collection: The collection that contains the objects to display
- * @columns: The columns to use to display the objects
- *
- * Create a new #GcrTreeSelector.
- *
- * Returns: (transfer full): a newly allocated selector, which should be
- * released with g_object_unref()
- */
-GcrTreeSelector *
-gcr_tree_selector_new (GcrCollection *collection, const GcrColumn *columns)
-{
- return g_object_new (GCR_TYPE_TREE_SELECTOR,
- "collection", collection,
- "columns", columns,
- NULL);
-}
-
-/**
- * gcr_tree_selector_get_collection:
- * @self: The selector
- *
- * Get the collection that this selector is displaying objects from.
- *
- * Returns: (transfer none): the collection, owned by the selector
- */
-GcrCollection *
-gcr_tree_selector_get_collection (GcrTreeSelector *self)
-{
- g_return_val_if_fail (GCR_IS_TREE_SELECTOR (self), NULL);
- return self->pv->collection;
-}
-
-/**
- * gcr_tree_selector_get_columns: (skip)
- * @self: The selector
- *
- * Get the columns displayed in a selector in multiple mode.
- *
- * Returns: (transfer none): The columns, owned by the selector.
- */
-const GcrColumn *
-gcr_tree_selector_get_columns (GcrTreeSelector *self)
-{
- g_return_val_if_fail (GCR_IS_TREE_SELECTOR (self), NULL);
- return self->pv->columns;
-}
-
-/**
- * gcr_tree_selector_get_selected:
- * @self: The selector
- *
- * Get a list of selected objects.
- *
- * Returns: (transfer container) (element-type GObject.Object): the list of selected
- * objects, to be released with g_list_free()
- */
-GList*
-gcr_tree_selector_get_selected (GcrTreeSelector *self)
-{
- g_return_val_if_fail (GCR_IS_TREE_SELECTOR (self), NULL);
- return gcr_collection_model_get_selected_objects (self->pv->model);
-}
-
-/**
- * gcr_tree_selector_set_selected:
- * @self: The selector
- * @selected: (element-type GObject.Object): the list of objects to select
- *
- * Select certain objects in the selector.
- */
-void
-gcr_tree_selector_set_selected (GcrTreeSelector *self, GList *selected)
-{
- g_return_if_fail (GCR_IS_TREE_SELECTOR (self));
- gcr_collection_model_set_selected_objects (self->pv->model, selected);
-}
diff --git a/gcr-gtk3/gcr-tree-selector.h b/gcr-gtk3/gcr-tree-selector.h
deleted file mode 100644
index de16602..0000000
--- a/gcr-gtk3/gcr-tree-selector.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2010 Stefan Walter
- *
- * 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_TREE_SELECTOR_H__
-#define __GCR_TREE_SELECTOR_H__
-
-#include "gcr/gcr-types.h"
-
-#include <gtk/gtk.h>
-
-G_BEGIN_DECLS
-
-#define GCR_TYPE_TREE_SELECTOR (gcr_tree_selector_get_type ())
-#define GCR_TREE_SELECTOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_TREE_SELECTOR, GcrTreeSelector))
-#define GCR_TREE_SELECTOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_TREE_SELECTOR, GcrTreeSelectorClass))
-#define GCR_IS_TREE_SELECTOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_TREE_SELECTOR))
-#define GCR_IS_TREE_SELECTOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_TREE_SELECTOR))
-#define GCR_TREE_SELECTOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_TREE_SELECTOR, GcrTreeSelectorClass))
-
-typedef struct _GcrTreeSelector GcrTreeSelector;
-typedef struct _GcrTreeSelectorClass GcrTreeSelectorClass;
-typedef struct _GcrTreeSelectorPrivate GcrTreeSelectorPrivate;
-
-struct _GcrTreeSelector {
- GtkTreeView parent;
-
- /*< private >*/
- GcrTreeSelectorPrivate *pv;
-};
-
-struct _GcrTreeSelectorClass {
- /*< private >*/
- GtkTreeViewClass parent_class;
-};
-
-GType gcr_tree_selector_get_type (void);
-
-GcrTreeSelector* gcr_tree_selector_new (GcrCollection *collection,
- const GcrColumn *columns);
-
-GcrCollection* gcr_tree_selector_get_collection (GcrTreeSelector *self);
-
-const GcrColumn* gcr_tree_selector_get_columns (GcrTreeSelector *self);
-
-GList* gcr_tree_selector_get_selected (GcrTreeSelector *self);
-
-void gcr_tree_selector_set_selected (GcrTreeSelector *self,
- GList *selected);
-
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrTreeSelector, g_object_unref)
-
-G_END_DECLS
-
-#endif /* __GCR_TREE_SELECTOR_H__ */
diff --git a/gcr-gtk3/gcr-unlock-options-widget.c b/gcr-gtk3/gcr-unlock-options-widget.c
deleted file mode 100644
index dec76b1..0000000
--- a/gcr-gtk3/gcr-unlock-options-widget.c
+++ /dev/null
@@ -1,501 +0,0 @@
-/*
- * Copyright (C) 2010 Stefan Walter
- *
- * 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 "config.h"
-
-#include "gcr-unlock-options-widget.h"
-
-#include <glib/gi18n-lib.h>
-
-/**
- * GcrUnlockOptionsWidget:
- *
- * This widget displays a set of unlock options for the user to select.
- *
- * The user can choose between keeping caching the unlock indefinitely, or for
- * a given amount of time.
- *
- * Each option has a different name, for example #GCR_UNLOCK_OPTION_ALWAYS. These
- * names are used together with the various functions like
- * [method@UnlockOptionsWidget.get_choice].
- */
-
-/**
- * GCR_UNLOCK_OPTION_ALWAYS:
- *
- * Option name for caching unlock indefinitely.
- */
-
-/**
- * GCR_UNLOCK_OPTION_IDLE:
- *
- * Option name for caching unlock for a certain amount of idle time.
- */
-
-/**
- * GCR_UNLOCK_OPTION_SESSION:
- *
- * Option name for caching unlock for the current session.
- */
-
-/**
- * GCR_UNLOCK_OPTION_TIMEOUT:
- *
- * Option name for caching unlock for a certain amount of time.
- */
-
-enum {
- PROP_0,
- PROP_CHOICE,
- PROP_TTL
-};
-
-struct _GcrUnlockOptionsWidget {
- GtkBin parent;
-
- /*< private >*/
- GcrUnlockOptionsWidgetPrivate *pv;
-};
-
-struct _GcrUnlockOptionsWidgetClass {
- GtkBinClass parent_class;
-};
-
-struct _GcrUnlockOptionsWidgetPrivate {
- GtkBuilder *builder;
- gchar *choice;
-};
-
-G_DEFINE_TYPE_WITH_PRIVATE (GcrUnlockOptionsWidget, gcr_unlock_options_widget, GTK_TYPE_BIN);
-
-/* -----------------------------------------------------------------------------
- * INTERNAL
- */
-
-static GtkToggleButton*
-builder_get_toggle_button (GtkBuilder *builder, const gchar *name)
-{
- GObject *object = gtk_builder_get_object (builder, name);
- g_return_val_if_fail (GTK_IS_TOGGLE_BUTTON (object), NULL);
- return GTK_TOGGLE_BUTTON (object);
-}
-
-static GtkSpinButton*
-builder_get_spin_button (GtkBuilder *builder, const gchar *name)
-{
- GObject *object = gtk_builder_get_object (builder, name);
- g_return_val_if_fail (GTK_IS_SPIN_BUTTON (object), NULL);
- return GTK_SPIN_BUTTON (object);
-}
-
-static const gchar*
-widget_name_for_option (const gchar *option)
-{
- g_return_val_if_fail (option, NULL);
- if (g_str_equal (option, GCR_UNLOCK_OPTION_ALWAYS))
- return "lock_always_choice";
- else if (g_str_equal (option, GCR_UNLOCK_OPTION_SESSION))
- return "lock_session_choice";
- else if (g_str_equal (option, GCR_UNLOCK_OPTION_TIMEOUT))
- return "lock_timeout_choice";
- else if (g_str_equal (option, GCR_UNLOCK_OPTION_IDLE))
- return "lock_idle_choice";
- else
- return NULL;
-}
-
-static GtkToggleButton*
-widget_button_for_option (GcrUnlockOptionsWidget *self, const gchar *option)
-{
- const gchar *name = widget_name_for_option (option);
- g_return_val_if_fail (name, NULL);
- return builder_get_toggle_button (self->pv->builder, name);
-}
-
-static const gchar*
-widget_button_to_option (GcrUnlockOptionsWidget *self, GtkToggleButton *button)
-{
- const gchar *option;
- g_return_val_if_fail (button, NULL);
- option = g_object_get_data (G_OBJECT (button), "unlock-choice");
- g_return_val_if_fail (option, NULL);
- return option;
-}
-
-static void
-on_choice_toggled (GtkToggleButton *button, GcrUnlockOptionsWidget *self)
-{
- GtkWidget *spin;
- GtkToggleButton *after, *idle;
-
- spin = GTK_WIDGET (gtk_builder_get_object (self->pv->builder, "lock_minutes_spin"));
- after = builder_get_toggle_button (self->pv->builder, "lock_timeout_choice");
- idle = builder_get_toggle_button (self->pv->builder, "lock_idle_choice");
- gtk_widget_set_sensitive (spin, gtk_toggle_button_get_active (after) ||
- gtk_toggle_button_get_active (idle));
-
- if (gtk_toggle_button_get_active (button)) {
- g_free (self->pv->choice);
- self->pv->choice = g_strdup (widget_button_to_option (self, button));
- }
-}
-
-/* -----------------------------------------------------------------------------
- * OBJECT
- */
-
-
-static GObject*
-gcr_unlock_options_widget_constructor (GType type, guint n_props, GObjectConstructParam *props)
-{
- GObject *obj = G_OBJECT_CLASS (gcr_unlock_options_widget_parent_class)->constructor (type, n_props, props);
- GcrUnlockOptionsWidget *self = NULL;
- GtkToggleButton *button;
- GtkWidget *widget;
-
- if (obj) {
- self = GCR_UNLOCK_OPTIONS_WIDGET (obj);
-
- if (!gtk_builder_add_from_resource (self->pv->builder, "/org/gnome/gcr/gcr-gtk3/gcr-unlock-options-widget.ui", NULL))
- g_return_val_if_reached (obj);
-
- widget = GTK_WIDGET (gtk_builder_get_object (self->pv->builder, "unlock-options-widget"));
- g_return_val_if_fail (GTK_IS_WIDGET (widget), obj);
- gtk_container_add (GTK_CONTAINER (self), widget);
- gtk_widget_show (widget);
-
- button = builder_get_toggle_button (self->pv->builder, "lock_always_choice");
- g_signal_connect (button, "toggled", G_CALLBACK (on_choice_toggled), self);
- g_object_set_data (G_OBJECT (button), "unlock-choice", GCR_UNLOCK_OPTION_ALWAYS);
-
- button = builder_get_toggle_button (self->pv->builder, "lock_session_choice");
- g_signal_connect (button, "toggled", G_CALLBACK (on_choice_toggled), self);
- g_object_set_data (G_OBJECT (button), "unlock-choice", GCR_UNLOCK_OPTION_SESSION);
- on_choice_toggled (button, self);
-
- button = builder_get_toggle_button (self->pv->builder, "lock_timeout_choice");
- g_signal_connect (button, "toggled", G_CALLBACK (on_choice_toggled), self);
- g_object_set_data (G_OBJECT (button), "unlock-choice", GCR_UNLOCK_OPTION_TIMEOUT);
-
- button = builder_get_toggle_button (self->pv->builder, "lock_idle_choice");
- g_signal_connect (button, "toggled", G_CALLBACK (on_choice_toggled), self);
- g_object_set_data (G_OBJECT (button), "unlock-choice", GCR_UNLOCK_OPTION_IDLE);
- }
-
- return obj;
-}
-
-static void
-gcr_unlock_options_widget_init (GcrUnlockOptionsWidget *self)
-{
- self->pv = gcr_unlock_options_widget_get_instance_private (self);
- self->pv->builder = gtk_builder_new ();
-}
-
-static void
-gcr_unlock_options_widget_dispose (GObject *obj)
-{
- GcrUnlockOptionsWidget *self = GCR_UNLOCK_OPTIONS_WIDGET (obj);
-
- if (self->pv->builder)
- g_object_unref (self->pv->builder);
- self->pv->builder = NULL;
-
- G_OBJECT_CLASS (gcr_unlock_options_widget_parent_class)->dispose (obj);
-}
-
-static void
-gcr_unlock_options_widget_finalize (GObject *obj)
-{
- GcrUnlockOptionsWidget *self = GCR_UNLOCK_OPTIONS_WIDGET (obj);
-
- g_assert (!self->pv->builder);
- g_free (self->pv->choice);
- self->pv->choice = NULL;
-
- G_OBJECT_CLASS (gcr_unlock_options_widget_parent_class)->finalize (obj);
-}
-
-static void
-gcr_unlock_options_widget_set_property (GObject *obj, guint prop_id, const GValue *value,
- GParamSpec *pspec)
-{
- GcrUnlockOptionsWidget *self = GCR_UNLOCK_OPTIONS_WIDGET (obj);
-
- switch (prop_id) {
- case PROP_CHOICE:
- gcr_unlock_options_widget_set_choice (self, g_value_get_string (value));
- break;
- case PROP_TTL:
- gcr_unlock_options_widget_set_ttl (self, g_value_get_uint (value));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-gcr_unlock_options_widget_get_property (GObject *obj, guint prop_id, GValue *value,
- GParamSpec *pspec)
-{
- GcrUnlockOptionsWidget *self = GCR_UNLOCK_OPTIONS_WIDGET (obj);
-
- switch (prop_id) {
- case PROP_CHOICE:
- g_value_set_string (value, gcr_unlock_options_widget_get_choice (self));
- break;
- case PROP_TTL:
- g_value_set_uint (value, gcr_unlock_options_widget_get_ttl (self));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-gcr_unlock_options_widget_class_init (GcrUnlockOptionsWidgetClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-
- gcr_unlock_options_widget_parent_class = g_type_class_peek_parent (klass);
-
- gobject_class->constructor = gcr_unlock_options_widget_constructor;
- gobject_class->dispose = gcr_unlock_options_widget_dispose;
- gobject_class->finalize = gcr_unlock_options_widget_finalize;
- gobject_class->set_property = gcr_unlock_options_widget_set_property;
- gobject_class->get_property = gcr_unlock_options_widget_get_property;
-
- g_object_class_install_property (gobject_class, PROP_CHOICE,
- g_param_spec_string ("choice", "Choice", "Unlock Option Choice",
- NULL,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
- g_object_class_install_property (gobject_class, PROP_TTL,
- g_param_spec_uint ("ttl", "TTL", "Unlock Option Timeout in Seconds",
- 0, G_MAXUINT, 0,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-}
-
-/* -----------------------------------------------------------------------------
- * PUBLIC
- */
-
-/**
- * gcr_unlock_options_widget_new:
- *
- * Create a new #GcrUnlockOptionsWidget.
- *
- * Returns: (transfer full) (type GcrUnlockOptionsWidget): a new #GcrUnlockOptionsWidget
- */
-GtkWidget *
-gcr_unlock_options_widget_new (void)
-{
- return g_object_new (GCR_TYPE_UNLOCK_OPTIONS_WIDGET, NULL);
-}
-
-/**
- * gcr_unlock_options_widget_get_choice:
- * @self: The unlock options widget
- *
- * Get the currently selected option, like %GCR_UNLOCK_OPTION_ALWAYS.
- *
- * Returns: The currently selected option name.
- */
-const gchar*
-gcr_unlock_options_widget_get_choice (GcrUnlockOptionsWidget *self)
-{
- g_return_val_if_fail (GCR_IS_UNLOCK_OPTIONS_WIDGET (self), NULL);
- return self->pv->choice;
-}
-
-/**
- * gcr_unlock_options_widget_set_choice:
- * @self: The unlock options widget
- * @option: The option name
- *
- * Set the currently selected option. Use an option name like
- * %GCR_UNLOCK_OPTION_ALWAYS.
- */
-void
-gcr_unlock_options_widget_set_choice (GcrUnlockOptionsWidget *self, const gchar *option)
-{
- GtkToggleButton *button;
-
- g_return_if_fail (GCR_IS_UNLOCK_OPTIONS_WIDGET (self));
- g_return_if_fail (option);
-
- button = widget_button_for_option (self, option);
- gtk_toggle_button_set_active (button, TRUE);
-}
-
-/**
- * gcr_unlock_options_widget_get_ttl:
- * @self: The unlock options widget
- *
- * Get the timeout setting set for unlock options that have a timeout.
- * This will also return a valid value if the currently selected option
- * does not have a timeout.
- *
- * Returns: The unlock timeout in seconds.
- */
-guint
-gcr_unlock_options_widget_get_ttl (GcrUnlockOptionsWidget *self)
-{
- GtkSpinButton *spin;
- gint amount;
-
- g_return_val_if_fail (GCR_IS_UNLOCK_OPTIONS_WIDGET (self), 0);
-
- spin = builder_get_spin_button (self->pv->builder, "lock_minutes_spin");
- amount = gtk_spin_button_get_value_as_int (spin);
- return amount * 60;
-}
-
-/**
- * gcr_unlock_options_widget_set_ttl:
- * @self: The unlock options widget
- * @ttl: The timeout to set, in seconds
- *
- * Set the current setting for the timeout. This can be set even when the
- * currently selected option does not have a timeout.
- */
-void
-gcr_unlock_options_widget_set_ttl (GcrUnlockOptionsWidget *self, guint ttl)
-{
- GtkSpinButton *spin;
- guint amount;
-
- g_return_if_fail (GCR_IS_UNLOCK_OPTIONS_WIDGET (self));
-
- amount = ttl / 60;
- if (!amount || ttl % 60)
- amount += 1;
-
- spin = builder_get_spin_button (self->pv->builder, "lock_minutes_spin");
- gtk_spin_button_set_value (spin, amount);
-}
-
-/**
- * gcr_unlock_options_widget_get_label:
- * @self: The unlock options widget
- * @option: The option name
- *
- * Get the label for one of the options. Use an option name like
- * %GCR_UNLOCK_OPTION_ALWAYS.
- *
- * Returns: The current label for the option.
- */
-const gchar*
-gcr_unlock_options_widget_get_label (GcrUnlockOptionsWidget *self, const gchar *option)
-{
- GtkToggleButton *button;
- const gchar *name;
-
- g_return_val_if_fail (GCR_IS_UNLOCK_OPTIONS_WIDGET (self), NULL);
- g_return_val_if_fail (option, NULL);
-
- name = widget_name_for_option (option);
- g_return_val_if_fail (name, NULL);
-
- button = builder_get_toggle_button (self->pv->builder, name);
- g_return_val_if_fail (button, NULL);
-
- return gtk_button_get_label (GTK_BUTTON (button));
-}
-
-/**
- * gcr_unlock_options_widget_set_label:
- * @self: The unlock options widget
- * @option: The option name
- * @text: The new label
- *
- * Set the label for one of the options. Use an option name like
- * %GCR_UNLOCK_OPTION_ALWAYS.
- */
-void
-gcr_unlock_options_widget_set_label (GcrUnlockOptionsWidget *self, const gchar *option,
- const gchar *text)
-{
- GtkToggleButton *button;
- const gchar *name;
-
- g_return_if_fail (GCR_IS_UNLOCK_OPTIONS_WIDGET (self));
- g_return_if_fail (option);
- g_return_if_fail (text);
-
- name = widget_name_for_option (option);
- g_return_if_fail (name);
-
- button = builder_get_toggle_button (self->pv->builder, name);
- g_return_if_fail (button);
-
- gtk_button_set_label (GTK_BUTTON (button), text);
-}
-
-/**
- * gcr_unlock_options_widget_get_sensitive:
- * @self: The unlock options widget
- * @option: The option name
- *
- * Get the sensitivity state for one of the options. Use an option name like
- * %GCR_UNLOCK_OPTION_ALWAYS.
- *
- * Returns: Whether the option is sensitive or not.
- */
-gboolean
-gcr_unlock_options_widget_get_sensitive (GcrUnlockOptionsWidget *self, const gchar *option)
-{
- GtkToggleButton *button;
- GtkStateType state;
-
- g_return_val_if_fail (GCR_IS_UNLOCK_OPTIONS_WIDGET (self), FALSE);
- g_return_val_if_fail (option, FALSE);
-
- button = widget_button_for_option (self, option);
- state = gtk_widget_get_state_flags (GTK_WIDGET (button));
- return (state & GTK_STATE_FLAG_INSENSITIVE) != GTK_STATE_FLAG_INSENSITIVE;
-}
-
-/**
- * gcr_unlock_options_widget_set_sensitive:
- * @self: The unlock options widget
- * @option: The option name
- * @sensitive: The sensitivity state.
- * @reason: A user displayable string which contains the reason for the sensitivity.
- *
- * Set the sensitivity state for one of the options. Use an option name like
- * %GCR_UNLOCK_OPTION_ALWAYS. The reason will be displayed as a tooltip.
- */
-void
-gcr_unlock_options_widget_set_sensitive (GcrUnlockOptionsWidget *self, const gchar *option,
- gboolean sensitive, const gchar *reason)
-{
- GtkToggleButton *button;
-
- g_return_if_fail (GCR_IS_UNLOCK_OPTIONS_WIDGET (self));
- g_return_if_fail (option);
-
- button = widget_button_for_option (self, option);
- gtk_widget_set_sensitive (GTK_WIDGET (button), sensitive);
-
- if (!sensitive && reason)
- gtk_widget_set_tooltip_text (GTK_WIDGET (button), reason);
- else if (sensitive)
- gtk_widget_set_has_tooltip (GTK_WIDGET (button), FALSE);
-}
diff --git a/gcr-gtk3/gcr-unlock-options-widget.h b/gcr-gtk3/gcr-unlock-options-widget.h
deleted file mode 100644
index bd1f396..0000000
--- a/gcr-gtk3/gcr-unlock-options-widget.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (C) 2010 Stefan Walter
- *
- * 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/>.
- */
-
-#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly."
-#endif
-
-#ifndef __GCR_UNLOCK_OPTIONS_WIDGET_H__
-#define __GCR_UNLOCK_OPTIONS_WIDGET_H__
-
-#include <glib-object.h>
-#include <gtk/gtk.h>
-
-#include "gcr/gcr-types.h"
-#include "gcr/gcr-unlock-options.h"
-
-G_BEGIN_DECLS
-
-#define GCR_TYPE_UNLOCK_OPTIONS_WIDGET (gcr_unlock_options_widget_get_type ())
-#define GCR_UNLOCK_OPTIONS_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_UNLOCK_OPTIONS_WIDGET, GcrUnlockOptionsWidget))
-#define GCR_UNLOCK_OPTIONS_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_UNLOCK_OPTIONS_WIDGET, GcrUnlockOptionsWidgetClass))
-#define GCR_IS_UNLOCK_OPTIONS_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_UNLOCK_OPTIONS_WIDGET))
-#define GCR_IS_UNLOCK_OPTIONS_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_UNLOCK_OPTIONS_WIDGET))
-#define GCR_UNLOCK_OPTIONS_WIDGET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_UNLOCK_OPTIONS_WIDGET, GcrUnlockOptionsWidgetClass))
-
-typedef struct _GcrUnlockOptionsWidget GcrUnlockOptionsWidget;
-typedef struct _GcrUnlockOptionsWidgetClass GcrUnlockOptionsWidgetClass;
-typedef struct _GcrUnlockOptionsWidgetPrivate GcrUnlockOptionsWidgetPrivate;
-
-/*
- * TODO: GcrUnlockOptionsWidget and GcrUnlockOptionsWidgetClass are hidden until
- * we can figure out what they should be derived from.
- */
-
-GType gcr_unlock_options_widget_get_type (void);
-
-GtkWidget* gcr_unlock_options_widget_new (void);
-
-const gchar* gcr_unlock_options_widget_get_choice (GcrUnlockOptionsWidget *self);
-
-void gcr_unlock_options_widget_set_choice (GcrUnlockOptionsWidget *self,
- const gchar *option);
-
-guint gcr_unlock_options_widget_get_ttl (GcrUnlockOptionsWidget *self);
-
-void gcr_unlock_options_widget_set_ttl (GcrUnlockOptionsWidget *self,
- guint ttl);
-
-const gchar* gcr_unlock_options_widget_get_label (GcrUnlockOptionsWidget *self,
- const gchar *option);
-
-void gcr_unlock_options_widget_set_label (GcrUnlockOptionsWidget *self,
- const gchar *option,
- const gchar *text);
-
-gboolean gcr_unlock_options_widget_get_sensitive (GcrUnlockOptionsWidget *self,
- const gchar *option);
-
-void gcr_unlock_options_widget_set_sensitive (GcrUnlockOptionsWidget *self,
- const gchar *option,
- gboolean sensitive,
- const gchar *reason);
-
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrUnlockOptionsWidget, g_object_unref)
-
-G_END_DECLS
-
-#endif /* __GCR_UNLOCK_OPTIONS_WIDGET_H__ */
diff --git a/gcr-gtk3/gcr-unlock-options-widget.ui b/gcr-gtk3/gcr-unlock-options-widget.ui
deleted file mode 100644
index d8e786e..0000000
--- a/gcr-gtk3/gcr-unlock-options-widget.ui
+++ /dev/null
@@ -1,117 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<interface>
- <requires lib="gtk+" version="2.16"/>
- <!-- interface-naming-policy project-wide -->
- <object class="GtkAdjustment" id="spin_adjustment">
- <property name="lower">1</property>
- <property name="upper">999</property>
- <property name="step_increment">1</property>
- <property name="page_increment">10</property>
- </object>
- <object class="GtkVBox" id="unlock-options-widget">
- <property name="visible">True</property>
- <property name="spacing">6</property>
- <child>
- <object class="GtkRadioButton" id="lock_always_choice">
- <property name="label" translatable="yes">Automatically unlock this keyring whenever I’m logged in</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="active">True</property>
- <property name="draw_indicator">True</property>
- <property name="group">lock_session_choice</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkRadioButton" id="lock_session_choice">
- <property name="label" translatable="yes">Lock this keyring when I log out</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="active">True</property>
- <property name="draw_indicator">True</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkHBox" id="hbox2">
- <property name="visible">True</property>
- <property name="spacing">6</property>
- <child>
- <object class="GtkVBox" id="vbox5">
- <property name="visible">True</property>
- <property name="spacing">6</property>
- <child>
- <object class="GtkRadioButton" id="lock_timeout_choice">
- <property name="label" translatable="yes">Lock this keyring after</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="draw_indicator">True</property>
- <property name="group">lock_session_choice</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkRadioButton" id="lock_idle_choice">
- <property name="label" translatable="yes">Lock this keyring if idle for</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="draw_indicator">True</property>
- <property name="group">lock_session_choice</property>
- </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="GtkSpinButton" id="lock_minutes_spin">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="invisible_char">•</property>
- <property name="adjustment">spin_adjustment</property>
- <property name="climb_rate">1</property>
- <property name="numeric">True</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="label2">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes" comments="Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'.">minutes</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
-</interface>
diff --git a/gcr-gtk3/gcr-unlock-renderer.c b/gcr-gtk3/gcr-unlock-renderer.c
deleted file mode 100644
index f32dfef..0000000
--- a/gcr-gtk3/gcr-unlock-renderer.c
+++ /dev/null
@@ -1,345 +0,0 @@
-/*
- * Copyright (C) 2010 Stefan Walter
- *
- * 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 "config.h"
-
-#include "gcr/gcr-icons.h"
-#include "gcr/gcr-parser.h"
-
-#include "gcr-display-view.h"
-#include "gcr-secure-entry-buffer.h"
-#include "gcr-unlock-renderer.h"
-
-#include <gdk/gdk.h>
-#include <glib/gi18n-lib.h>
-
-enum {
- PROP_0,
- PROP_LABEL,
- PROP_ATTRIBUTES
-};
-
-struct _GcrUnlockRendererPrivate {
- GtkEntry *entry;
- GtkLabel *warning;
-
- GBytes *locked_data;
- gchar *label;
- gboolean unlocked;
- GList *renderers;
- guint unlock_tries;
-
- /* block widget destroys during render */
- gint no_destroy;
-};
-
-enum {
- UNLOCK_CLICKED,
- LAST_SIGNAL,
-};
-
-static guint signals[LAST_SIGNAL] = { 0 };
-
-static void gcr_renderer_iface_init (GcrRendererIface *iface);
-
-G_DEFINE_TYPE_WITH_CODE (GcrUnlockRenderer, _gcr_unlock_renderer, GTK_TYPE_BIN,
- G_ADD_PRIVATE (GcrUnlockRenderer);
- G_IMPLEMENT_INTERFACE (GCR_TYPE_RENDERER, gcr_renderer_iface_init);
-);
-
-static gchar*
-calculate_label (GcrUnlockRenderer *self)
-{
- if (self->pv->label)
- return g_strdup_printf (_("Unlock: %s"), self->pv->label);
-
- return g_strdup (_("Unlock"));
-}
-
-void
-_gcr_unlock_renderer_show_warning (GcrUnlockRenderer *self,
- const gchar *message)
-{
- gchar *text;
-
- g_return_if_fail (GCR_UNLOCK_RENDERER (self));
- g_return_if_fail (message != NULL);
-
- text = g_strdup_printf ("<i>%s</i>", message);
- gtk_label_set_markup (self->pv->warning, text);
- g_free (text);
-
- gtk_widget_show (GTK_WIDGET (self->pv->warning));
-}
-
-static void
-on_unlock_button_clicked (GtkButton *button,
- gpointer user_data)
-{
- GcrUnlockRenderer *self = GCR_UNLOCK_RENDERER (user_data);
- g_signal_emit (self, signals[UNLOCK_CLICKED], 0);
-}
-
-static void
-on_entry_activated (GtkEntry *entry,
- gpointer user_data)
-{
- GtkButton *button = GTK_BUTTON (user_data);
- gtk_button_clicked (button);
-}
-
-static void
-_gcr_unlock_renderer_init (GcrUnlockRenderer *self)
-{
- GtkWidget *box, *vbox;
- GtkWidget *button;
- GtkEntryBuffer *buffer;
-
- self->pv = _gcr_unlock_renderer_get_instance_private (self);
-
- box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
-
- buffer = gcr_secure_entry_buffer_new ();
- self->pv->entry = GTK_ENTRY (gtk_entry_new_with_buffer (buffer));
- gtk_entry_set_visibility (self->pv->entry, FALSE);
- gtk_box_pack_start (GTK_BOX (box), GTK_WIDGET (self->pv->entry), TRUE, FALSE, 0);
- gtk_widget_show (GTK_WIDGET (self->pv->entry));
- g_object_unref (buffer);
- gtk_entry_set_placeholder_text (self->pv->entry, _("Password"));
-
- button = gtk_button_new_with_label (_("Unlock"));
- gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 0);
- g_signal_connect (button, "clicked", G_CALLBACK (on_unlock_button_clicked), self);
- g_signal_connect (self->pv->entry, "activate", G_CALLBACK (on_entry_activated), button);
- gtk_widget_show (button);
-
- vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
- gtk_box_pack_start (GTK_BOX (vbox), box, FALSE, FALSE, 0);
- gtk_widget_show (box);
-
- self->pv->warning = GTK_LABEL (gtk_label_new (""));
- gtk_box_pack_start (GTK_BOX (vbox), GTK_WIDGET (self->pv->warning), FALSE, FALSE, 0);
- gtk_widget_hide (GTK_WIDGET (self->pv->warning));
-
- gtk_container_add (GTK_CONTAINER (self), vbox);
- gtk_widget_show (vbox);
-}
-
-static void
-_gcr_unlock_renderer_finalize (GObject *obj)
-{
- GcrUnlockRenderer *self = GCR_UNLOCK_RENDERER (obj);
-
- g_bytes_unref (self->pv->locked_data);
- g_free (self->pv->label);
- g_list_free_full (self->pv->renderers, g_object_unref);
-
- G_OBJECT_CLASS (_gcr_unlock_renderer_parent_class)->finalize (obj);
-}
-
-static void
-_gcr_unlock_renderer_set_property (GObject *obj,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- GcrUnlockRenderer *self = GCR_UNLOCK_RENDERER (obj);
-
- switch (prop_id) {
- case PROP_LABEL:
- g_free (self->pv->label);
- self->pv->label = g_value_dup_string (value);
- g_object_notify (obj, "label");
- gcr_renderer_emit_data_changed (GCR_RENDERER (self));
- break;
- case PROP_ATTRIBUTES:
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-_gcr_unlock_renderer_get_property (GObject *obj,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- GcrUnlockRenderer *self = GCR_UNLOCK_RENDERER (obj);
-
- switch (prop_id) {
- case PROP_LABEL:
- g_value_take_string (value, calculate_label (self));
- break;
- case PROP_ATTRIBUTES:
- g_value_set_boxed (value, NULL);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-_gcr_unlock_renderer_class_init (GcrUnlockRendererClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-
- gobject_class->finalize = _gcr_unlock_renderer_finalize;
- gobject_class->set_property = _gcr_unlock_renderer_set_property;
- gobject_class->get_property = _gcr_unlock_renderer_get_property;
-
- g_object_class_install_property (gobject_class, PROP_LABEL,
- g_param_spec_string ("label", "Label", "Unlock Label",
- "",
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
- g_object_class_install_property (gobject_class, PROP_ATTRIBUTES,
- g_param_spec_boxed ("attributes", "Attributes", "Certificate pkcs11 attributes",
- GCK_TYPE_ATTRIBUTES,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
- signals[UNLOCK_CLICKED] = g_signal_new ("unlock-clicked", GCR_TYPE_UNLOCK_RENDERER, G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (GcrUnlockRendererClass, unlock_clicked),
- NULL, NULL, NULL, G_TYPE_NONE, 0);
-}
-
-static void
-gcr_unlock_renderer_render (GcrRenderer *renderer,
- GcrViewer *viewer)
-{
- GcrUnlockRenderer *self = GCR_UNLOCK_RENDERER (renderer);
- GcrDisplayView *view;
- gchar *display;
- GList *renderers;
- GIcon *icon;
- GList *l;
-
- if (GCR_IS_DISPLAY_VIEW (viewer)) {
- view = GCR_DISPLAY_VIEW (viewer);
-
- } else {
- g_warning ("GcrUnlockRenderer only works with internal specific "
- "GcrViewer returned by gcr_viewer_new().");
- return;
- }
-
- /*
- * If we were successfully unlocked, then this will contain a list of
- * renderers to add to the viewer.
- */
- if (self->pv->unlocked) {
-
- /* We used prepend above, so list is backwards */
- renderers = g_list_reverse (self->pv->renderers);
- self->pv->renderers = NULL;
-
- for (l = renderers; l != NULL; l = g_list_next (l))
- gcr_viewer_insert_renderer (viewer, l->data, renderer);
- g_list_free_full (renderers, g_object_unref);
-
- /* And finally remove ourselves from the viewer */
- gcr_viewer_remove_renderer (viewer, GCR_RENDERER (self));
- /*
- * Not yet unlocked, display the unlock dialog.
- */
- } else {
-
- _gcr_display_view_begin (view, renderer);
-
- icon = g_themed_icon_new ("emblem-readonly");
- _gcr_display_view_set_icon (view, renderer, icon);
- g_object_unref (icon);
-
- display = calculate_label (self);
- _gcr_display_view_append_title (view, renderer, display);
- g_free (display);
-
- if (self->pv->label)
- display = g_strdup_printf (_("The contents of “%s” are locked. In order to view the contents, enter the correct password."),
- self->pv->label);
- else
- display = g_strdup (_("The contents are locked. In order to view the contents, enter the correct password."));
- _gcr_display_view_append_content (view, renderer, display, NULL);
- g_free (display);
-
- _gcr_display_view_add_widget_area (view, renderer, GTK_WIDGET (self));
- gtk_widget_show (GTK_WIDGET (self));
-
- _gcr_display_view_end (view, renderer);
- }
-}
-
-static void
-gcr_renderer_iface_init (GcrRendererIface *iface)
-{
- iface->render_view = gcr_unlock_renderer_render;
-}
-
-GcrUnlockRenderer*
-_gcr_unlock_renderer_new (const gchar *label,
- GBytes *locked_data)
-{
- GcrUnlockRenderer *renderer;
-
- renderer = g_object_new (GCR_TYPE_UNLOCK_RENDERER,
- "label", label,
- NULL);
- g_object_ref_sink (renderer);
-
- renderer->pv->locked_data = g_bytes_ref (locked_data);
- return renderer;
-}
-
-GcrUnlockRenderer *
-_gcr_unlock_renderer_new_for_parsed (GcrParser *parser)
-{
- g_return_val_if_fail (GCR_IS_PARSER (parser), NULL);
- return _gcr_unlock_renderer_new (gcr_parser_get_parsed_label (parser),
- gcr_parser_get_parsed_bytes (parser));
-}
-
-const gchar *
-_gcr_unlock_renderer_get_password (GcrUnlockRenderer *self)
-{
- g_return_val_if_fail (GCR_IS_UNLOCK_RENDERER (self), NULL);
- return gtk_entry_get_text (self->pv->entry);
-}
-
-void
-_gcr_unlock_renderer_set_password (GcrUnlockRenderer *self,
- const gchar *text)
-{
- g_return_if_fail (GCR_IS_UNLOCK_RENDERER (self));
- g_return_if_fail (text != NULL);
- gtk_entry_set_text (self->pv->entry, text);
-}
-
-void
-_gcr_unlock_renderer_focus_password (GcrUnlockRenderer *self)
-{
- g_return_if_fail (GCR_IS_UNLOCK_RENDERER (self));
- gtk_widget_grab_focus (GTK_WIDGET (self->pv->entry));
-}
-
-GBytes *
-_gcr_unlock_renderer_get_locked_data (GcrUnlockRenderer *self)
-{
- g_return_val_if_fail (GCR_IS_UNLOCK_RENDERER (self), NULL);
- return self->pv->locked_data;
-}
diff --git a/gcr-gtk3/gcr-unlock-renderer.h b/gcr-gtk3/gcr-unlock-renderer.h
deleted file mode 100644
index 32de573..0000000
--- a/gcr-gtk3/gcr-unlock-renderer.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (C) 2011 Collabora Ltd.
- *
- * 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/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly."
-#endif
-
-#ifndef __GCR_UNLOCK_RENDERER_H__
-#define __GCR_UNLOCK_RENDERER_H__
-
-#include <glib-object.h>
-#include <gtk/gtk.h>
-
-#include "gcr/gcr-types.h"
-
-#include "gcr-renderer.h"
-
-G_BEGIN_DECLS
-
-#define GCR_TYPE_UNLOCK_RENDERER (_gcr_unlock_renderer_get_type ())
-#define GCR_UNLOCK_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_UNLOCK_RENDERER, GcrUnlockRenderer))
-#define GCR_UNLOCK_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_UNLOCK_RENDERER, GcrUnlockRendererClass))
-#define GCR_IS_UNLOCK_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_UNLOCK_RENDERER))
-#define GCR_IS_UNLOCK_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_UNLOCK_RENDERER))
-#define GCR_UNLOCK_RENDERER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_UNLOCK_RENDERER, GcrUnlockRendererClass))
-
-typedef struct _GcrUnlockRenderer GcrUnlockRenderer;
-typedef struct _GcrUnlockRendererClass GcrUnlockRendererClass;
-typedef struct _GcrUnlockRendererPrivate GcrUnlockRendererPrivate;
-
-struct _GcrUnlockRenderer {
- /*< private >*/
- GtkBin parent;
- GcrUnlockRendererPrivate *pv;
-};
-
-struct _GcrUnlockRendererClass {
- GtkBinClass parent_class;
-
- /* signals */
- void (*unlock_clicked) (GcrUnlockRenderer *unlock);
-};
-
-GType _gcr_unlock_renderer_get_type (void);
-
-GcrUnlockRenderer * _gcr_unlock_renderer_new (const gchar *label,
- GBytes *locked_data);
-
-GcrUnlockRenderer * _gcr_unlock_renderer_new_for_parsed (GcrParser *parser);
-
-const gchar * _gcr_unlock_renderer_get_password (GcrUnlockRenderer *self);
-
-void _gcr_unlock_renderer_set_password (GcrUnlockRenderer *self,
- const gchar *text);
-
-void _gcr_unlock_renderer_focus_password (GcrUnlockRenderer *self);
-
-void _gcr_unlock_renderer_show_warning (GcrUnlockRenderer *self,
- const gchar *message);
-
-GBytes * _gcr_unlock_renderer_get_locked_data (GcrUnlockRenderer *self);
-
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrUnlockRenderer, g_object_unref)
-
-G_END_DECLS
-
-#endif /* __GCR_UNLOCK_RENDERER_H__ */
diff --git a/gcr-gtk3/gcr-viewer-widget.c b/gcr-gtk3/gcr-viewer-widget.c
deleted file mode 100644
index 81f2322..0000000
--- a/gcr-gtk3/gcr-viewer-widget.c
+++ /dev/null
@@ -1,680 +0,0 @@
-/* gcr-viewer-widget: Widget for viewer
-
- Copyright (C) 2011 Collabora Ltd.
-
- The Gnome Keyring Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public License as
- published by the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version.
-
- The Gnome Keyring Library 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with the Gnome Library; see the file COPYING.LIB. If not,
- see <http://www.gnu.org/licenses/>.
-
- Author: Stef Walter <stefw@collabora.co.uk>
-*/
-
-#include "config.h"
-
-#include "gcr/gcr-importer.h"
-#include "gcr/gcr-marshal.h"
-#include "gcr/gcr-parser.h"
-
-#include "gcr-display-scrolled.h"
-#include "gcr-failure-renderer.h"
-#include "gcr-renderer.h"
-#include "gcr-unlock-renderer.h"
-#include "gcr-viewer-widget.h"
-#include "gcr-viewer.h"
-
-#include <glib/gi18n-lib.h>
-#include <gtk/gtk.h>
-
-#include <locale.h>
-#include <string.h>
-
-/**
- * GcrViewerWidget:
- *
- * A viewer widget which can display certificates and keys that are
- * located in files.
- */
-
-enum {
- PROP_0,
- PROP_PARSER,
- PROP_DISPLAY_NAME
-};
-
-/*
- * Not yet figured out how to expose these without locking down our
- * implementation, the parent class we derive from.
- */
-
-typedef struct _GcrViewerWidgetPrivate GcrViewerWidgetPrivate;
-
-struct _GcrViewerWidget {
- /*< private >*/
- GtkBox parent;
- GcrViewerWidgetPrivate *pv;
-};
-
-struct _GcrViewerWidgetPrivate {
- GcrViewer *viewer;
- GtkInfoBar *message_bar;
- GtkLabel *message_label;
- GQueue *files_to_load;
- GcrParser *parser;
- GCancellable *cancellable;
- GList *unlocks;
- gboolean loading;
- gchar *display_name;
- gboolean display_name_explicit;
-};
-
-enum {
- ADDED,
- LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL] = { 0, };
-
-static void viewer_load_next_file (GcrViewerWidget *self);
-static void viewer_stop_loading_files (GcrViewerWidget *self);
-
-G_DEFINE_TYPE_WITH_PRIVATE (GcrViewerWidget, gcr_viewer_widget, GTK_TYPE_BOX);
-
-static const gchar *
-get_parsed_label_or_display_name (GcrViewerWidget *self,
- GcrParser *parser)
-{
- const gchar *label;
-
- label = gcr_parser_get_parsed_label (parser);
- if (label == NULL)
- label = self->pv->display_name;
-
- return label;
-}
-
-static void
-on_parser_parsed (GcrParser *parser,
- gpointer user_data)
-{
- GcrViewerWidget *self = GCR_VIEWER_WIDGET (user_data);
- GckAttributes *attrs;
- GcrRenderer *renderer;
- const gchar *label;
- gboolean actual = TRUE;
-
- label = get_parsed_label_or_display_name (self, parser);
- attrs = gcr_parser_get_parsed_attributes (parser);
-
- renderer = gcr_renderer_create (label, attrs);
-
- if (renderer == NULL) {
- renderer = gcr_failure_renderer_new_unsupported (label);
- actual = FALSE;
- }
-
- /* And show the data */
- gcr_viewer_add_renderer (self->pv->viewer, renderer);
-
- /* Let callers know we're rendering data */
- if (actual == TRUE)
- g_signal_emit (self, signals[ADDED], 0, renderer,
- gcr_parser_get_parsed (parser));
-
- g_object_unref (renderer);
-}
-
-static gboolean
-on_parser_authenticate_for_unlock (GcrParser *parser,
- guint count,
- gpointer user_data)
-{
- GcrUnlockRenderer *unlock = GCR_UNLOCK_RENDERER (user_data);
- const gchar *password;
-
- if (count == 0) {
- password = _gcr_unlock_renderer_get_password (unlock);
- gcr_parser_add_password (parser, password);
- }
-
- return TRUE;
-}
-
-static void
-on_unlock_renderer_clicked (GcrUnlockRenderer *unlock,
- gpointer user_data)
-{
- GcrViewerWidget *self = GCR_VIEWER_WIDGET (user_data);
- GError *error = NULL;
- GBytes *data;
- gulong sig;
-
- /* Override our main authenticate signal handler */
- sig = g_signal_connect (self->pv->parser, "authenticate",
- G_CALLBACK (on_parser_authenticate_for_unlock), unlock);
-
- data = _gcr_unlock_renderer_get_locked_data (unlock);
- if (gcr_parser_parse_bytes (self->pv->parser, data, &error)) {
-
- /* Done with this unlock renderer */
- gcr_viewer_remove_renderer (self->pv->viewer, GCR_RENDERER (unlock));
- self->pv->unlocks = g_list_remove (self->pv->unlocks, unlock);
- g_object_unref (unlock);
-
- } else if (g_error_matches (error, GCR_DATA_ERROR, GCR_ERROR_LOCKED)){
- _gcr_unlock_renderer_show_warning (unlock, _("The password was incorrect"));
- _gcr_unlock_renderer_focus_password (unlock);
- _gcr_unlock_renderer_set_password (unlock, "");
- g_error_free (error);
-
- } else {
- _gcr_unlock_renderer_show_warning (unlock, error->message);
- g_error_free (error);
- }
-
- g_signal_handler_disconnect (self->pv->parser, sig);
-}
-
-static gboolean
-on_parser_authenticate_for_data (GcrParser *parser,
- guint count,
- gpointer user_data)
-{
- GcrViewerWidget *self = GCR_VIEWER_WIDGET (user_data);
- GcrUnlockRenderer *unlock;
-
- unlock = _gcr_unlock_renderer_new_for_parsed (parser);
- if (unlock != NULL) {
- g_object_set (unlock, "label", get_parsed_label_or_display_name (self, parser), NULL);
- gcr_viewer_add_renderer (self->pv->viewer, GCR_RENDERER (unlock));
- g_signal_connect (unlock, "unlock-clicked", G_CALLBACK (on_unlock_renderer_clicked), self);
- self->pv->unlocks = g_list_prepend (self->pv->unlocks, unlock);
- }
-
- return TRUE;
-}
-
-static void
-gcr_viewer_widget_init (GcrViewerWidget *self)
-{
- GtkWidget *area;
-
- self->pv = gcr_viewer_widget_get_instance_private (self);
-
- gtk_orientable_set_orientation (GTK_ORIENTABLE (self),
- GTK_ORIENTATION_VERTICAL);
-
- self->pv->viewer = gcr_viewer_new_scrolled ();
- gtk_box_pack_start (GTK_BOX (self), GTK_WIDGET (self->pv->viewer), TRUE, TRUE, 0);
- gtk_widget_show (GTK_WIDGET (self->pv->viewer));
-
- self->pv->message_label = GTK_LABEL (gtk_label_new (""));
- gtk_label_set_use_markup (self->pv->message_label, TRUE);
- gtk_label_set_ellipsize (self->pv->message_label, PANGO_ELLIPSIZE_END);
- gtk_widget_show (GTK_WIDGET (self->pv->message_label));
-
- self->pv->message_bar = GTK_INFO_BAR (gtk_info_bar_new ());
- gtk_box_pack_start (GTK_BOX (self), GTK_WIDGET (self->pv->message_bar), FALSE, TRUE, 0);
- area = gtk_info_bar_get_content_area (self->pv->message_bar);
- gtk_container_add (GTK_CONTAINER (area), GTK_WIDGET (self->pv->message_label));
-
- self->pv->files_to_load = g_queue_new ();
- self->pv->parser = gcr_parser_new ();
- self->pv->cancellable = g_cancellable_new ();
- self->pv->unlocks = NULL;
-
- g_signal_connect (self->pv->parser, "parsed", G_CALLBACK (on_parser_parsed), self);
- g_signal_connect_after (self->pv->parser, "authenticate", G_CALLBACK (on_parser_authenticate_for_data), self);
-}
-
-static void
-gcr_viewer_widget_get_property (GObject *obj,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- GcrViewerWidget *self = GCR_VIEWER_WIDGET (obj);
-
- switch (prop_id) {
- case PROP_PARSER:
- g_value_set_object (value, gcr_viewer_widget_get_parser (self));
- break;
- case PROP_DISPLAY_NAME:
- g_value_set_string (value, gcr_viewer_widget_get_display_name (self));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-gcr_viewer_widget_set_property (GObject *obj,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- GcrViewerWidget *self = GCR_VIEWER_WIDGET (obj);
-
- switch (prop_id) {
- case PROP_DISPLAY_NAME:
- gcr_viewer_widget_set_display_name (self, g_value_get_string (value));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-gcr_viewer_widget_dispose (GObject *obj)
-{
- GcrViewerWidget *self = GCR_VIEWER_WIDGET (obj);
- GList *l;
-
- g_signal_handlers_disconnect_by_func (self->pv->parser, on_parser_parsed, self);
-
- for (l = self->pv->unlocks; l != NULL; l = g_list_next (l)) {
- g_signal_handlers_disconnect_by_func (l->data, on_unlock_renderer_clicked, self);
- g_object_unref (l->data);
- }
- g_list_free (self->pv->unlocks);
- self->pv->unlocks = NULL;
-
- while (!g_queue_is_empty (self->pv->files_to_load))
- g_object_unref (g_queue_pop_head (self->pv->files_to_load));
-
- g_cancellable_cancel (self->pv->cancellable);
-
- G_OBJECT_CLASS (gcr_viewer_widget_parent_class)->dispose (obj);
-}
-
-static void
-gcr_viewer_widget_finalize (GObject *obj)
-{
- GcrViewerWidget *self = GCR_VIEWER_WIDGET (obj);
-
- g_assert (g_queue_is_empty (self->pv->files_to_load));
- g_queue_free (self->pv->files_to_load);
-
- g_free (self->pv->display_name);
- g_object_unref (self->pv->cancellable);
- g_object_unref (self->pv->parser);
-
- G_OBJECT_CLASS (gcr_viewer_widget_parent_class)->finalize (obj);
-}
-
-static void
-gcr_viewer_widget_class_init (GcrViewerWidgetClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-
- gobject_class->dispose = gcr_viewer_widget_dispose;
- gobject_class->finalize = gcr_viewer_widget_finalize;
- gobject_class->get_property = gcr_viewer_widget_get_property;
- gobject_class->set_property = gcr_viewer_widget_set_property;
-
- /**
- * GcrViewerWidget:parser:
- *
- * The parser used to parse loaded data into viewable items.
- */
- g_object_class_install_property (gobject_class, PROP_PARSER,
- g_param_spec_object ("parser", "Parser", "Parser used to parse viewable items",
- GCR_TYPE_PARSER,
- G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
-
- /**
- * GcrViewerWidget:display-name:
- *
- * Display name for data being displayed. This is automatically
- * calculated from a loaded file, or can be explicitly set.
- *
- * Used as a hint when displaying a title for the data, but may be
- * overridden by the parsed data.
- */
- g_object_class_install_property (gobject_class, PROP_DISPLAY_NAME,
- g_param_spec_string ("display-name", "Display name", "Display name",
- NULL,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
- /**
- * GcrViewerWidget::added:
- * @self: the viewer widget
- * @renderer: (type GcrRenderer): the renderer that was added
- * @parsed: (type GcrParsed): the parsed item that was added
- *
- * This signal is emitted when an item is added to the viewer widget.
- */
- signals[ADDED] = g_signal_new ("added", GCR_TYPE_VIEWER_WIDGET, G_SIGNAL_RUN_LAST,
- 0, NULL, NULL, _gcr_marshal_VOID__OBJECT_BOXED,
- G_TYPE_NONE, 2, G_TYPE_OBJECT, GCR_TYPE_PARSED);
-}
-
-static void
-on_parser_parse_stream_returned (GObject *source,
- GAsyncResult *result,
- gpointer user_data)
-{
- GcrViewerWidget *self = GCR_VIEWER_WIDGET (user_data);
- GError *error = NULL;
- GcrRenderer *renderer;
-
- gcr_parser_parse_stream_finish (self->pv->parser, result, &error);
-
- if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED) ||
- g_error_matches (error, GCR_DATA_ERROR, GCR_ERROR_CANCELLED)) {
- viewer_stop_loading_files (self);
-
- } else if (g_error_matches (error, GCR_DATA_ERROR, GCR_ERROR_LOCKED)) {
- /* Just skip this one, an unlock renderer was added */
-
- } else if (error) {
- renderer = gcr_failure_renderer_new (self->pv->display_name, error);
- gcr_viewer_add_renderer (self->pv->viewer, renderer);
- g_object_unref (renderer);
- g_error_free (error);
- }
-
- viewer_load_next_file (self);
-}
-
-static void
-update_display_name (GcrViewerWidget *self,
- gchar *display_name)
-{
- if (!self->pv->display_name_explicit) {
- g_free (self->pv->display_name);
- self->pv->display_name = g_strdup (display_name);
- g_object_notify (G_OBJECT (self), "display-name");
- }
-}
-
-static void
-on_file_read_returned (GObject *source,
- GAsyncResult *result,
- gpointer user_data)
-{
- GcrViewerWidget *self = GCR_VIEWER_WIDGET (user_data);
- GFile *file = G_FILE (source);
- GError *error = NULL;
- GFileInputStream *fis;
- GcrRenderer *renderer;
- gchar *basename, *display_name;
-
- fis = g_file_read_finish (file, result, &error);
-
- basename = g_file_get_basename (file);
- display_name = g_filename_display_name (basename);
- g_free (basename);
-
- update_display_name (self, display_name);
-
- if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
- viewer_stop_loading_files (self);
-
- } else if (error) {
- renderer = gcr_failure_renderer_new (self->pv->display_name, error);
- gcr_viewer_add_renderer (self->pv->viewer, renderer);
- g_object_unref (renderer);
- g_error_free (error);
-
- viewer_load_next_file (self);
-
- } else {
- gcr_parser_set_filename (self->pv->parser, display_name);
- gcr_parser_parse_stream_async (self->pv->parser,
- G_INPUT_STREAM (fis),
- self->pv->cancellable,
- on_parser_parse_stream_returned,
- self);
- g_object_unref (fis);
- }
- g_free (display_name);
-}
-
-static void
-viewer_stop_loading_files (GcrViewerWidget *self)
-{
- self->pv->loading = FALSE;
-}
-
-static void
-viewer_load_next_file (GcrViewerWidget *self)
-{
- GFile* file;
-
- file = g_queue_pop_head (self->pv->files_to_load);
- if (file == NULL) {
- viewer_stop_loading_files (self);
- return;
- }
-
- g_file_read_async (file, G_PRIORITY_DEFAULT, self->pv->cancellable,
- on_file_read_returned, self);
-
- g_object_unref (file);
-}
-
-/**
- * gcr_viewer_widget_new:
- *
- * Create a new viewer widget.
- *
- * Returns: (transfer full): A new #GcrViewerWidget object
- */
-GcrViewerWidget *
-gcr_viewer_widget_new (void)
-{
- return g_object_new (GCR_TYPE_VIEWER_WIDGET, NULL);
-}
-
-/**
- * gcr_viewer_widget_load_file:
- * @self: a viewer widget
- * @file: a file to load
- *
- * Display contents of a file in the viewer widget. Multiple files can
- * be loaded.
- */
-void
-gcr_viewer_widget_load_file (GcrViewerWidget *self,
- GFile *file)
-{
- g_return_if_fail (GCR_IS_VIEWER_WIDGET (self));
- g_return_if_fail (G_IS_FILE (file));
-
- g_queue_push_tail (self->pv->files_to_load, g_object_ref (file));
-
- if (!self->pv->loading)
- viewer_load_next_file (self);
-}
-
-/**
- * gcr_viewer_widget_load_bytes:
- * @self: a viewer widget
- * @display_name: (nullable): label for the loaded data
- * @data: data to load
- *
- * Parse and load some data to be displayed into the viewer widgets. The data
- * may contain multiple parseable items if the format can contain multiple
- * items.
- */
-void
-gcr_viewer_widget_load_bytes (GcrViewerWidget *self,
- const gchar *display_name,
- GBytes *data)
-{
- GError *error = NULL;
- GcrRenderer *renderer;
-
- g_return_if_fail (GCR_IS_VIEWER_WIDGET (self));
- g_return_if_fail (data != NULL);
-
- g_free (self->pv->display_name);
- self->pv->display_name = g_strdup (display_name);
-
- if (!gcr_parser_parse_bytes (self->pv->parser, data, &error)) {
- renderer = gcr_failure_renderer_new (display_name, error);
- gcr_viewer_add_renderer (self->pv->viewer, renderer);
- g_object_unref (renderer);
- g_error_free (error);
- }
-}
-
-/**
- * gcr_viewer_widget_load_data:
- * @self: a viewer widget
- * @display_name: (nullable): label for the loaded data
- * @data: (array length=n_data): data to load
- * @n_data: length of data to load
- *
- * Parse and load some data to be displayed into the viewer widgets. The data
- * may contain multiple parseable items if the format can contain multiple
- * items.
- *
- * This function will copy the data. Use [method@ViewerWidget.load_bytes] to avoid
- * copying the data.
- */
-void
-gcr_viewer_widget_load_data (GcrViewerWidget *self,
- const gchar *display_name,
- const guchar *data,
- gsize n_data)
-{
- GBytes *bytes;
-
- g_return_if_fail (GCR_IS_VIEWER_WIDGET (self));
-
- bytes = g_bytes_new (data, n_data);
- gcr_viewer_widget_load_bytes (self, display_name, bytes);
- g_bytes_unref (bytes);
-}
-
-/**
- * gcr_viewer_widget_get_viewer:
- * @self: a viewer widget
- *
- * Get the viewer used to display the viewable items.
- *
- * Returns: (transfer none): the viewer
- */
-GcrViewer *
-gcr_viewer_widget_get_viewer (GcrViewerWidget *self)
-{
- g_return_val_if_fail (GCR_IS_VIEWER_WIDGET (self), NULL);
- return self->pv->viewer;
-}
-
-/**
- * gcr_viewer_widget_get_parser:
- * @self: a viewer widget
- *
- * Get the parser used to parse loaded data into viewable items.
- *
- * Returns: (transfer none): the parser
- */
-GcrParser *
-gcr_viewer_widget_get_parser (GcrViewerWidget *self)
-{
- g_return_val_if_fail (GCR_IS_VIEWER_WIDGET (self), NULL);
- return self->pv->parser;
-}
-
-/**
- * gcr_viewer_widget_show_error:
- * @self: a viewer widget
- * @message: descriptive error message
- * @error: (nullable): detailed error
- *
- * Show an error on the viewer widget. This is displayed on a info bar near
- * the edge of the widget.
- */
-void
-gcr_viewer_widget_show_error (GcrViewerWidget *self,
- const gchar *message,
- GError *error)
-{
- gchar *markup;
-
- g_return_if_fail (GCR_IS_VIEWER_WIDGET (self));
- g_return_if_fail (message != NULL);
-
- if (error)
- markup = g_markup_printf_escaped ("<b>%s</b>: %s", message, error->message);
- else
- markup = g_markup_printf_escaped ("%s", message);
-
- gtk_info_bar_set_message_type (self->pv->message_bar, GTK_MESSAGE_ERROR);
- gtk_label_set_markup (self->pv->message_label, markup);
- gtk_widget_show (GTK_WIDGET (self->pv->message_bar));
- g_free (markup);
-}
-
-/**
- * gcr_viewer_widget_clear_error:
- * @self: a viewer widget
- *
- * Clear the error displayed on the viewer widget.
- */
-void
-gcr_viewer_widget_clear_error (GcrViewerWidget *self)
-{
- g_return_if_fail (GCR_IS_VIEWER_WIDGET (self));
- gtk_widget_hide (GTK_WIDGET (self->pv->message_bar));
-}
-
-/**
- * gcr_viewer_widget_get_display_name:
- * @self: a viewer widget
- *
- * Get the display name for data being displayed. This is automatically
- * calculated from a loaded file, or can be explicitly set.
- *
- * Used as a hint when displaying a title for the data, but may be
- * overridden by the parsed data.
- *
- * Returns: the display name
- */
-const gchar *
-gcr_viewer_widget_get_display_name (GcrViewerWidget *self)
-{
- g_return_val_if_fail (GCR_IS_VIEWER_WIDGET (self), NULL);
-
- if (!self->pv->display_name_explicit && !self->pv->display_name)
- self->pv->display_name = g_strdup (_("Certificate Viewer"));
-
- return self->pv->display_name;
-}
-
-/**
- * gcr_viewer_widget_set_display_name:
- * @self: a viewer widget
- * @display_name: the display name
- *
- * Set the display name for data being displayed. Once explicitly
- * set it will no longer be calculated automatically by loading data.
- *
- * Used as a hint when displaying a title for the data, but may be
- * overridden by the parsed data.
- */
-void
-gcr_viewer_widget_set_display_name (GcrViewerWidget *self,
- const gchar *display_name)
-{
- g_return_if_fail (GCR_IS_VIEWER_WIDGET (self));
-
- g_free (self->pv->display_name);
- self->pv->display_name = g_strdup (display_name);
- self->pv->display_name_explicit = TRUE;
- g_object_notify (G_OBJECT (self), "display-name");
-}
diff --git a/gcr-gtk3/gcr-viewer-widget.h b/gcr-gtk3/gcr-viewer-widget.h
deleted file mode 100644
index 93515c5..0000000
--- a/gcr-gtk3/gcr-viewer-widget.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* gcr-viewer-widget.h: Widget for viewer
-
- Copyright (C) 2011 Collabora Ltd.
-
- The Gnome Keyring Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public License as
- published by the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version.
-
- The Gnome Keyring Library 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with the Gnome Library; see the file COPYING.LIB. If not,
- see <http://www.gnu.org/licenses/>.
-
- Author: Stef Walter <stefw@collabora.co.uk>
-*/
-
-#ifndef GCR_VIEWER_WIDGET_H
-#define GCR_VIEWER_WIDGET_H
-
-#include <gtk/gtk.h>
-
-#define GCR_TYPE_VIEWER_WIDGET (gcr_viewer_widget_get_type ())
-G_DECLARE_FINAL_TYPE (GcrViewerWidget, gcr_viewer_widget,
- GCR, VIEWER_WIDGET,
- GtkBox)
-
-GcrViewerWidget * gcr_viewer_widget_new (void);
-
-void gcr_viewer_widget_load_file (GcrViewerWidget *self,
- GFile *file);
-
-void gcr_viewer_widget_load_bytes (GcrViewerWidget *self,
- const gchar *display_name,
- GBytes *data);
-
-void gcr_viewer_widget_load_data (GcrViewerWidget *self,
- const gchar *display_name,
- const guchar *data,
- gsize n_data);
-
-GcrViewer * gcr_viewer_widget_get_viewer (GcrViewerWidget *self);
-
-GcrParser * gcr_viewer_widget_get_parser (GcrViewerWidget *self);
-
-void gcr_viewer_widget_show_error (GcrViewerWidget *self,
- const gchar *message,
- GError *error);
-
-void gcr_viewer_widget_clear_error (GcrViewerWidget *self);
-
-const gchar * gcr_viewer_widget_get_display_name (GcrViewerWidget *self);
-
-void gcr_viewer_widget_set_display_name (GcrViewerWidget *self,
- const gchar *display_name);
-
-#endif /* GCR_VIEWER_WIDGET_H */
diff --git a/gcr-gtk3/gcr-viewer.c b/gcr-gtk3/gcr-viewer.c
deleted file mode 100644
index fe71402..0000000
--- a/gcr-gtk3/gcr-viewer.c
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- * Copyright (C) 2008 Stefan Walter
- *
- * 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 "config.h"
-
-#include "gcr-display-scrolled.h"
-#include "gcr-display-view.h"
-#include "gcr-renderer.h"
-#include "gcr-viewer.h"
-
-/**
- * GcrViewer:
- *
- * An abstract interface that represents a widget that can hold
- * various renderers and display their contents.
- *
- * The interaction between [iface@Renderer] and [iface@Viewer] is not stable
- * yet, and so viewers cannot be implemented outside the Gcr library at this
- * time.
- *
- * Use the [func@Viewer.new] and [func@Viewer.new_scrolled] to get default
- * implementations of viewers.
- */
-
-/**
- * GcrViewerIface:
- * @parent: The parent interface
- * @add_renderer: Virtual method to add a renderer
- * @insert_renderer: Virtual method to insert a renderer
- * @remove_renderer: Virtual method to remove a renderer
- * @count_renderers: Virtual method to count renderers
- * @get_renderer: Virtual method to get a renderer
- *
- * The interface for #GcrViewer
- */
-
-typedef GcrViewerIface GcrViewerInterface;
-
-G_DEFINE_INTERFACE (GcrViewer, gcr_viewer, GTK_TYPE_WIDGET);
-
-static void
-gcr_viewer_default_init (GcrViewerIface *iface)
-{
-
-}
-
-/* -----------------------------------------------------------------------------
- * PUBLIC
- */
-
-/**
- * gcr_viewer_new:
- *
- * Get an implementation of #GcrViewer that supports a view
- * of multiple renderers.
- *
- * Returns: (transfer full): a newly allocated #GcrViewer, which should be
- * released with g_object_unref()
- */
-GcrViewer *
-gcr_viewer_new (void)
-{
- return GCR_VIEWER (_gcr_display_view_new ());
-}
-
-/**
- * gcr_viewer_new_scrolled:
- *
- * Get an implementation of #GcrViewer that supports a scrolled view
- * of multiple renderers.
- *
- * Returns: (transfer floating): a #GcrViewer which is also a #GtkWidget
- */
-GcrViewer*
-gcr_viewer_new_scrolled (void)
-{
- return GCR_VIEWER (_gcr_display_scrolled_new ());
-}
-
-/**
- * gcr_viewer_add_renderer: (virtual add_renderer)
- * @viewer: The viewer
- * @renderer: The renderer to add
- *
- * Add a renderer to this viewer.
- */
-void
-gcr_viewer_add_renderer (GcrViewer *viewer,
- GcrRenderer *renderer)
-{
- g_return_if_fail (GCR_IS_VIEWER (viewer));
- g_return_if_fail (GCR_IS_RENDERER (renderer));
- g_return_if_fail (GCR_VIEWER_GET_INTERFACE (viewer)->add_renderer);
- GCR_VIEWER_GET_INTERFACE (viewer)->add_renderer (viewer, renderer);
-}
-
-/**
- * gcr_viewer_insert_renderer: (virtual insert_renderer)
- * @viewer: the viewer
- * @renderer: the renderer to insert
- * @before: (nullable): the renderer to insert before
- *
- * Insert a renderer at a specific point in the viewer
- */
-void
-gcr_viewer_insert_renderer (GcrViewer *viewer,
- GcrRenderer *renderer,
- GcrRenderer *before)
-{
- g_return_if_fail (GCR_IS_VIEWER (viewer));
- g_return_if_fail (GCR_IS_RENDERER (renderer));
- g_return_if_fail (!before || GCR_IS_RENDERER (before));
- g_return_if_fail (GCR_VIEWER_GET_INTERFACE (viewer)->insert_renderer);
- GCR_VIEWER_GET_INTERFACE (viewer)->insert_renderer (viewer, renderer, before);
-}
-
-/**
- * gcr_viewer_remove_renderer: (virtual remove_renderer)
- * @viewer: The viewer
- * @renderer: The renderer to remove
- *
- * Remove a renderer from this viewer.
- */
-void
-gcr_viewer_remove_renderer (GcrViewer *viewer,
- GcrRenderer *renderer)
-{
- g_return_if_fail (GCR_IS_VIEWER (viewer));
- g_return_if_fail (GCR_IS_RENDERER (renderer));
- g_return_if_fail (GCR_VIEWER_GET_INTERFACE (viewer)->remove_renderer);
- GCR_VIEWER_GET_INTERFACE (viewer)->remove_renderer (viewer, renderer);
-}
-
-/**
- * gcr_viewer_count_renderers: (virtual count_renderers)
- * @viewer: The viewer
- *
- * Get the number of renderers present in the viewer.
- *
- * Returns: The number of renderers.
- */
-guint
-gcr_viewer_count_renderers (GcrViewer *viewer)
-{
- g_return_val_if_fail (GCR_IS_VIEWER (viewer), 0);
- g_return_val_if_fail (GCR_VIEWER_GET_INTERFACE (viewer)->count_renderers, 0);
- return GCR_VIEWER_GET_INTERFACE (viewer)->count_renderers (viewer);
-}
-
-/**
- * gcr_viewer_get_renderer: (virtual get_renderer)
- * @viewer: The viewer
- * @index_: The index of the renderer to get
- *
- * Get a pointer to the renderer at the given index. It is an error to request
- * an index that is out of bounds.
- *
- * Returns: (transfer none): the render, owned by the viewer
- */
-GcrRenderer*
-gcr_viewer_get_renderer (GcrViewer *viewer,
- guint index_)
-{
- g_return_val_if_fail (GCR_IS_VIEWER (viewer), NULL);
- g_return_val_if_fail (GCR_VIEWER_GET_INTERFACE (viewer)->get_renderer, NULL);
- return GCR_VIEWER_GET_INTERFACE (viewer)->get_renderer (viewer, index_);
-}
diff --git a/gcr-gtk3/gcr-viewer.h b/gcr-gtk3/gcr-viewer.h
deleted file mode 100644
index fe8df50..0000000
--- a/gcr-gtk3/gcr-viewer.h
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright (C) 2010 Stefan Walter
- *
- * 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_VIEWER_H__
-#define __GCR_VIEWER_H__
-
-#include <glib-object.h>
-#include <gtk/gtk.h>
-
-#include "gcr/gcr-types.h"
-
-G_BEGIN_DECLS
-
-#define GCR_TYPE_VIEWER (gcr_viewer_get_type())
-#define GCR_VIEWER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_VIEWER, GcrViewer))
-#define GCR_IS_VIEWER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_VIEWER))
-#define GCR_VIEWER_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GCR_TYPE_VIEWER, GcrViewerIface))
-
-typedef struct _GcrRenderer GcrRenderer;
-typedef struct _GcrViewer GcrViewer;
-typedef struct _GcrViewerIface GcrViewerIface;
-
-struct _GcrViewerIface {
- GTypeInterface parent;
-
- void (*add_renderer) (GcrViewer *viewer,
- GcrRenderer *renderer);
-
- void (*insert_renderer) (GcrViewer *viewer,
- GcrRenderer *renderer,
- GcrRenderer *before);
-
- void (*remove_renderer) (GcrViewer *viewer,
- GcrRenderer *renderer);
-
- guint (*count_renderers) (GcrViewer *viewer);
-
- GcrRenderer* (*get_renderer) (GcrViewer *viewer,
- guint index_);
-
- /*< private >*/
- gpointer dummy1;
- gpointer dummy2;
- gpointer dummy3;
- gpointer dummy4;
-};
-
-GType gcr_viewer_get_type (void);
-
-GcrViewer* gcr_viewer_new (void);
-
-GcrViewer* gcr_viewer_new_scrolled (void);
-
-void gcr_viewer_add_renderer (GcrViewer *viewer,
- GcrRenderer *renderer);
-
-void gcr_viewer_insert_renderer (GcrViewer *viewer,
- GcrRenderer *renderer,
- GcrRenderer *before);
-
-void gcr_viewer_remove_renderer (GcrViewer *viewer,
- GcrRenderer *renderer);
-
-guint gcr_viewer_count_renderers (GcrViewer *viewer);
-
-GcrRenderer* gcr_viewer_get_renderer (GcrViewer *viewer,
- guint index_);
-
-G_END_DECLS
-
-#endif /* __GCR_VIEWER_H__ */
diff --git a/gcr-gtk3/meson.build b/gcr-gtk3/meson.build
index 6f3b76c..b3d2a7f 100644
--- a/gcr-gtk3/meson.build
+++ b/gcr-gtk3/meson.build
@@ -3,56 +3,18 @@ subdir('icons')
gcr_gtk3_headers_install_dir = gcr_headers_subdir / 'gcr-gtk3'
gcr_gtk3_public_sources = files(
- 'gcr-certificate-renderer.c',
'gcr-certificate-widget.c',
- 'gcr-collection-model.c',
- 'gcr-combo-selector.c',
- 'gcr-failure-renderer.c',
- 'gcr-key-renderer.c',
- 'gcr-key-widget.c',
- 'gcr-import-button.c',
- 'gcr-list-selector.c',
- 'gcr-prompt-dialog.c',
- 'gcr-renderer.c',
'gcr-secure-entry-buffer.c',
- 'gcr-tree-selector.c',
- 'gcr-unlock-options-widget.c',
- 'gcr-viewer.c',
- 'gcr-viewer-widget.c',
)
gcr_gtk3_private_sources = files(
- 'eggimagemenuitem.c',
- 'gcr-certificate-exporter.c',
- 'gcr-certificate-request-renderer.c',
- 'gcr-dialog-util.c',
- 'gcr-display-scrolled.c',
- 'gcr-display-view.c',
- 'gcr-gnupg-renderer.c',
- 'gcr-live-search.c',
- 'gcr-pkcs11-import-dialog.c',
- 'gcr-pkcs11-import-interaction.c',
- 'gcr-unlock-renderer.c',
+ 'gcr-section.c',
)
gcr_gtk3_headers = files(
'gcr-gtk3.h',
- 'gcr-certificate-renderer.h',
'gcr-certificate-widget.h',
- 'gcr-collection-model.h',
- 'gcr-combo-selector.h',
- 'gcr-failure-renderer.h',
- 'gcr-key-renderer.h',
- 'gcr-key-widget.h',
- 'gcr-import-button.h',
- 'gcr-list-selector.h',
- 'gcr-prompt-dialog.h',
- 'gcr-renderer.h',
'gcr-secure-entry-buffer.h',
- 'gcr-tree-selector.h',
- 'gcr-unlock-options-widget.h',
- 'gcr-viewer.h',
- 'gcr-viewer-widget.h',
)
# Generated sources
@@ -157,7 +119,6 @@ if get_option('introspection')
gcr_vapi,
'gtk+-3.0'
],
- metadata_dirs: meson.current_source_dir(),
vapi_dirs: [
build_root / 'gck',
build_root / 'gcr',
@@ -178,15 +139,6 @@ install_data('gcr-crypto-types.xml',
# Manual UI testing programs
gcr_gtk3_manual_tests = [
'frob-certificate',
- 'frob-combo-selector',
- 'frob-gnupg-selector',
- 'frob-import-button',
- 'frob-key',
- 'frob-tree-selector',
- 'frob-prompt',
- 'frob-request',
- 'frob-system-prompt',
- 'frob-unlock-options',
]
gcr_gtk3_test_cflags = [
diff --git a/gcr-gtk4/meson.build b/gcr-gtk4/meson.build
index 8b461c2..5a49210 100644
--- a/gcr-gtk4/meson.build
+++ b/gcr-gtk4/meson.build
@@ -125,6 +125,3 @@ if get_option('introspection')
install: true,
)
endif
-
-# gcr-viewer-gtk4
-subdir('viewer')
diff --git a/tools/frob-unlock.c b/tools/frob-unlock.c
deleted file mode 100644
index 83636c9..0000000
--- a/tools/frob-unlock.c
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2011 Collabora Ltd.
- *
- * 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/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#include "config.h"
-
-#include "gcr/gcr.h"
-
-#include "gcr-gtk3/gcr-unlock-renderer.h"
-#include "tools/gcr-viewer-window.h"
-
-#include <gtk/gtk.h>
-
-#include <unistd.h>
-#include <string.h>
-#include <errno.h>
-
-static gboolean
-delete_event(GtkWidget *widget,
- GdkEvent *event,
- gpointer data)
-{
- gtk_main_quit ();
- return FALSE;
-}
-
-static void
-on_parser_parsed (GcrParser *parser, gpointer unused)
-{
-
-}
-
-static void
-on_unlock_clicked (GcrUnlockRenderer *renderer,
- GcrParser *parser)
-{
- const gchar *password;
- password = _gcr_unlock_renderer_get_password (renderer);
- gcr_parser_add_password (parser, password);
- gtk_main_quit ();
-}
-
-static void
-on_parser_authenticate (GcrParser *parser,
- gint count,
- gpointer user_data)
-{
- GcrUnlockRenderer *renderer;
- GtkWindow *window;
-
- window = GTK_WINDOW (gcr_viewer_window_new ());
- g_object_ref_sink (window);
-
- renderer = _gcr_unlock_renderer_new_for_parsed (parser);
- g_signal_connect (renderer, "unlock-clicked", G_CALLBACK (on_unlock_clicked), parser);
- gcr_viewer_add_renderer (gcr_viewer_window_get_viewer (GCR_VIEWER_WINDOW (window)), GCR_RENDERER (renderer));
- g_object_unref (renderer);
-
- gtk_window_set_default_size (window, 550, 400);
- gtk_container_set_border_width (GTK_CONTAINER (window), 20);
-
- g_signal_connect (window, "delete-event", G_CALLBACK (delete_event), NULL);
- gtk_widget_show (GTK_WIDGET (window));
-
- gtk_main ();
-
- g_object_unref (window);
-}
-
-static void
-test_key (const gchar *path)
-{
- GcrParser *parser;
- GError *err = NULL;
- guchar *data;
- gsize n_data;
- GBytes *bytes;
-
- if (!g_file_get_contents (path, (gchar**)&data, &n_data, NULL))
- g_error ("couldn't read file: %s", path);
-
- parser = gcr_parser_new ();
- g_signal_connect (parser, "parsed", G_CALLBACK (on_parser_parsed), NULL);
- g_signal_connect (parser, "authenticate", G_CALLBACK (on_parser_authenticate), NULL);
- bytes = g_bytes_new_take (data, n_data);
- if (!gcr_parser_parse_bytes (parser, bytes, &err))
- g_error ("couldn't parse data: %s", err->message);
-
- g_object_unref (parser);
- g_bytes_unref (bytes);
-}
-
-int
-main(int argc, char *argv[])
-{
- gtk_init (&argc, &argv);
- g_set_prgname ("frob-unlock");
-
- if (argc > 1) {
- test_key (argv[1]);
- } else {
- test_key (SRCDIR "/gcr-gtk3/fixtures/email.p12");
- }
-
- return 0;
-}
diff --git a/tools/gcr-prompter-tool.c b/tools/gcr-prompter-tool.c
deleted file mode 100644
index b6392ac..0000000
--- a/tools/gcr-prompter-tool.c
+++ /dev/null
@@ -1,258 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* gcr-viewer-tool.c: Command line utility
-
- Copyright (C) 2011 Collabora Ltd.
-
- The Gnome Keyring Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public License as
- published by the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version.
-
- The Gnome Keyring Library 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with the Gnome Library; see the file COPYING.LIB. If not,
- see <http://www.gnu.org/licenses/>.
-
- Author: Stef Walter <stefw@collabora.co.uk>
-*/
-
-#include "config.h"
-
-#include "gcr/gcr.h"
-#include "gcr/gcr-dbus-constants.h"
-#include "gcr-gtk3/gcr-gtk3.h"
-
-#include <glib/gi18n.h>
-#include <gtk/gtk.h>
-
-#include <locale.h>
-#include <stdlib.h>
-#include <string.h>
-#include <syslog.h>
-
-#define QUIT_TIMEOUT 10
-
-static GcrSystemPrompter *the_prompter = NULL;
-static gboolean registered_prompter = FALSE;
-static gboolean acquired_system_prompter = FALSE;
-static gboolean acquired_private_prompter = FALSE;
-static guint timeout_source = 0;
-
-static gboolean
-on_timeout_quit (gpointer unused)
-{
- g_debug ("%d second inactivity timeout, quitting", QUIT_TIMEOUT);
- gtk_main_quit ();
-
- return FALSE; /* Don't run again */
-}
-
-static void
-start_timeout (void)
-{
- if (g_getenv ("GCR_PERSIST") != NULL)
- return;
-
- if (!timeout_source)
- timeout_source = g_timeout_add_seconds (QUIT_TIMEOUT, on_timeout_quit, NULL);
-}
-
-static void
-stop_timeout (void)
-{
- if (timeout_source)
- g_source_remove (timeout_source);
- timeout_source = 0;
-}
-
-static void
-on_prompter_prompting (GObject *obj,
- GParamSpec *param,
- gpointer user_data)
-{
- if (gcr_system_prompter_get_prompting (the_prompter))
- stop_timeout ();
- else
- start_timeout ();
-}
-
-static void
-on_bus_acquired (GDBusConnection *connection,
- const gchar *name,
- gpointer user_data)
-{
- g_debug ("bus acquired: %s", name);
-
- if (!registered_prompter)
- gcr_system_prompter_register (the_prompter, connection);
-
- registered_prompter = TRUE;
-}
-
-static void
-on_name_acquired (GDBusConnection *connection,
- const gchar *name,
- gpointer user_data)
-{
- g_debug ("acquired name: %s", name);
-
- if (g_strcmp0 (name, GCR_DBUS_PROMPTER_SYSTEM_BUS_NAME) == 0)
- acquired_system_prompter = TRUE;
-
- else if (g_strcmp0 (name, GCR_DBUS_PROMPTER_PRIVATE_BUS_NAME) == 0)
- acquired_private_prompter = TRUE;
-}
-
-static void
-on_name_lost (GDBusConnection *connection,
- const gchar *name,
- gpointer user_data)
-{
- g_debug ("lost name: %s", name);
-
- /* Called like so when no connection can be made */
- if (connection == NULL) {
- g_warning ("couldn't connect to session bus");
- gtk_main_quit ();
-
- } else if (g_strcmp0 (name, GCR_DBUS_PROMPTER_SYSTEM_BUS_NAME) == 0) {
- acquired_system_prompter = FALSE;
-
- } else if (g_strcmp0 (name, GCR_DBUS_PROMPTER_PRIVATE_BUS_NAME) == 0) {
- acquired_private_prompter = FALSE;
-
- }
-}
-
-static void
-log_handler (const gchar *log_domain,
- GLogLevelFlags log_level,
- const gchar *message,
- gpointer user_data)
-{
- int level;
-
- /* Note that crit and err are the other way around in syslog */
-
- switch (G_LOG_LEVEL_MASK & log_level) {
- case G_LOG_LEVEL_ERROR:
- level = LOG_CRIT;
- break;
- case G_LOG_LEVEL_CRITICAL:
- level = LOG_ERR;
- break;
- case G_LOG_LEVEL_WARNING:
- level = LOG_WARNING;
- break;
- case G_LOG_LEVEL_MESSAGE:
- level = LOG_NOTICE;
- break;
- case G_LOG_LEVEL_INFO:
- level = LOG_INFO;
- break;
- case G_LOG_LEVEL_DEBUG:
- level = LOG_DEBUG;
- break;
- default:
- level = LOG_ERR;
- break;
- }
-
- /* Log to syslog first */
- if (log_domain)
- syslog (level, "%s: %s", log_domain, message);
- else
- syslog (level, "%s", message);
-
- /* And then to default handler for aborting and stuff like that */
- g_log_default_handler (log_domain, log_level, message, user_data);
-}
-
-static void
-printerr_handler (const gchar *string)
-{
- /* Print to syslog and stderr */
- syslog (LOG_WARNING, "%s", string);
- fprintf (stderr, "%s", string);
-}
-
-static void
-prepare_logging ()
-{
- GLogLevelFlags flags = G_LOG_FLAG_FATAL | G_LOG_LEVEL_ERROR |
- G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING |
- G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_INFO;
-
- openlog ("gcr-prompter", LOG_PID, LOG_AUTH);
-
- g_log_set_handler (NULL, flags, log_handler, NULL);
- g_log_set_handler ("Glib", flags, log_handler, NULL);
- g_log_set_handler ("Gtk", flags, log_handler, NULL);
- g_log_set_handler ("Gnome", flags, log_handler, NULL);
- g_log_set_handler ("Gcr", flags, log_handler, NULL);
- g_log_set_handler ("Gck", flags, log_handler, NULL);
- g_log_set_default_handler (log_handler, NULL);
- g_set_printerr_handler (printerr_handler);
-}
-
-int
-main (int argc, char *argv[])
-{
- guint system_owner_id;
- guint private_owner_id;
-
- gtk_init (&argc, &argv);
-
-#ifdef HAVE_LOCALE_H
- /* internationalisation */
- setlocale (LC_ALL, "");
-#endif
-
-#ifdef HAVE_GETTEXT
- bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
- textdomain (GETTEXT_PACKAGE);
- bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
-#endif
-
- prepare_logging ();
-
- the_prompter = gcr_system_prompter_new (GCR_SYSTEM_PROMPTER_SINGLE,
- GCR_TYPE_PROMPT_DIALOG);
- g_signal_connect (the_prompter, "notify::prompting",
- G_CALLBACK (on_prompter_prompting), NULL);
-
- system_owner_id = g_bus_own_name (G_BUS_TYPE_SESSION,
- GCR_DBUS_PROMPTER_SYSTEM_BUS_NAME,
- G_BUS_NAME_OWNER_FLAGS_REPLACE,
- on_bus_acquired,
- on_name_acquired,
- on_name_lost,
- NULL,
- NULL);
-
- private_owner_id = g_bus_own_name (G_BUS_TYPE_SESSION,
- GCR_DBUS_PROMPTER_PRIVATE_BUS_NAME,
- G_BUS_NAME_OWNER_FLAGS_REPLACE,
- on_bus_acquired,
- on_name_acquired,
- on_name_lost,
- NULL,
- NULL);
-
- start_timeout ();
- gtk_main ();
-
- if (registered_prompter)
- gcr_system_prompter_unregister (the_prompter, TRUE);
-
- g_bus_unown_name (system_owner_id);
- g_bus_unown_name (private_owner_id);
-
- g_object_unref (the_prompter);
-
- return 0;
-}
diff --git a/tools/gcr-prompter.desktop.in.in b/tools/gcr-prompter.desktop.in.in
deleted file mode 100644
index 086ec17..0000000
--- a/tools/gcr-prompter.desktop.in.in
+++ /dev/null
@@ -1,9 +0,0 @@
-[Desktop Entry]
-Name=Access Prompt
-Comment=Unlock access to passwords and other secrets
-# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
-Icon=security-medium
-Exec=@libexecdir@/gcr-prompter
-Terminal=false
-Type=Application
-NoDisplay=true
diff --git a/tools/gcr-viewer-tool.c b/tools/gcr-viewer-tool.c
deleted file mode 100644
index 0117d70..0000000
--- a/tools/gcr-viewer-tool.c
+++ /dev/null
@@ -1,126 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* gcr-viewer-tool.c: Command line utility
-
- Copyright (C) 2011 Collabora Ltd.
-
- The Gnome Keyring Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public License as
- published by the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version.
-
- The Gnome Keyring Library 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with the Gnome Library; see the file COPYING.LIB. If not,
- see <http://www.gnu.org/licenses/>.
-
- Author: Stef Walter <stefw@collabora.co.uk>
-*/
-
-#include "config.h"
-
-#include "gcr-viewer-window.h"
-
-#include <glib/gi18n.h>
-#include <gtk/gtk.h>
-
-#include <locale.h>
-#include <stdlib.h>
-#include <string.h>
-
-static gchar **remaining_args = NULL;
-
-static gboolean
-print_version_and_exit (const gchar *option_name, const gchar *value,
- gpointer data, GError **error)
-{
- g_print("%s -- %s\n", _("GCR Certificate and Key Viewer"), VERSION);
- exit (0);
- return TRUE;
-}
-
-static const GOptionEntry options[] = {
- { "version", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK,
- print_version_and_exit, N_("Show the application's version"), NULL},
- { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY,
- &remaining_args, NULL, N_("[file...]") },
- { NULL }
-};
-
-static gboolean
-on_idle_load_files (gpointer user_data)
-{
- GcrViewerWindow *window = GCR_VIEWER_WINDOW (user_data);
- GFile *file;
- gint i;
-
- if (remaining_args) {
- for (i = 0; remaining_args[i] != NULL; ++i) {
- file = g_file_new_for_commandline_arg (remaining_args[i]);
- gcr_viewer_window_load (window, file);
- g_object_unref (file);
- }
-
- g_strfreev (remaining_args);
- remaining_args = NULL;
- }
-
- return FALSE; /* Don't run this again */
-}
-
-static void
-on_window_destroy (GtkWidget *widget,
- gpointer unused)
-{
- gtk_widget_hide (widget);
- gtk_main_quit ();
-}
-
-int
-main (int argc, char *argv[])
-{
- GOptionContext *context;
- GError *error = NULL;
- GtkWindow *window;
-
-#ifdef HAVE_LOCALE_H
- /* internationalisation */
- setlocale (LC_ALL, "");
-#endif
-
-#ifdef HAVE_GETTEXT
- bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
- textdomain (GETTEXT_PACKAGE);
- bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
-#endif
-
- context = g_option_context_new (N_("- View certificate and key files"));
- g_option_context_set_translation_domain (context, GETTEXT_PACKAGE);
- g_option_context_add_main_entries (context, options, GETTEXT_PACKAGE);
-
- g_option_context_add_group (context, gtk_get_option_group (TRUE));
-
- if (! g_option_context_parse (context, &argc, &argv, &error)) {
- g_critical ("Failed to parse arguments: %s", error->message);
- g_error_free (error);
- g_option_context_free (context);
- return 1;
- }
-
- g_option_context_free (context);
- g_set_application_name (_("Certificate Viewer"));
-
- gtk_init (&argc, &argv);
-
- window = gcr_viewer_window_new ();
- gtk_widget_show (GTK_WIDGET (window));
-
- g_idle_add (on_idle_load_files, window);
- g_signal_connect (window, "destroy", G_CALLBACK (on_window_destroy), NULL);
- gtk_main ();
-
- return 0;
-}
diff --git a/tools/gcr-viewer-window.c b/tools/gcr-viewer-window.c
deleted file mode 100644
index a25e10e..0000000
--- a/tools/gcr-viewer-window.c
+++ /dev/null
@@ -1,201 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* gcr-viewer-window.c: Window for viewer
-
- Copyright (C) 2011 Collabora Ltd.
-
- The Gnome Keyring Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public License as
- published by the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version.
-
- The Gnome Keyring Library 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with the Gnome Library; see the file COPYING.LIB. If not,
- see <http://www.gnu.org/licenses/>.
-
- Author: Stef Walter <stefw@collabora.co.uk>
-*/
-
-#include "config.h"
-
-#include "gcr-viewer-window.h"
-
-#include <glib/gi18n-lib.h>
-#include <gtk/gtk.h>
-
-#include <locale.h>
-#include <string.h>
-
-struct _GcrViewerWindowPrivate {
- GcrViewerWidget *viewer;
- GcrImportButton *import;
-};
-
-G_DEFINE_TYPE_WITH_PRIVATE (GcrViewerWindow, gcr_viewer_window, GTK_TYPE_WINDOW);
-
-static void
-on_viewer_renderer_added (GcrViewerWidget *viewer,
- GcrRenderer *renderer,
- GcrParsed *parsed,
- gpointer user_data)
-{
- GcrViewerWindow *self = GCR_VIEWER_WINDOW (user_data);
- gcr_import_button_add_parsed (self->pv->import, parsed);
-}
-
-static void
-gcr_viewer_window_init (GcrViewerWindow *self)
-{
- self->pv = gcr_viewer_window_get_instance_private (self);
-}
-
-static void
-on_import_button_importing (GcrImportButton *button,
- GcrImporter *importer,
- gpointer user_data)
-{
- GcrViewerWindow *self = GCR_VIEWER_WINDOW (user_data);
- gcr_viewer_widget_clear_error (self->pv->viewer);
-}
-
-static void
-on_import_button_imported (GcrImportButton *button,
- GcrImporter *importer,
- GError *error,
- gpointer user_data)
-{
- GcrViewerWindow *self = GCR_VIEWER_WINDOW (user_data);
-
- if (error == NULL) {
- g_object_set (button, "label", _("Imported"), NULL);
-
- } else {
- if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
- gcr_viewer_widget_show_error (self->pv->viewer, _("Import failed"), error);
- }
-}
-
-static void
-on_close_clicked (GtkButton *button,
- gpointer user_data)
-{
- GcrViewerWindow *self = GCR_VIEWER_WINDOW (user_data);
- gtk_widget_destroy (GTK_WIDGET (self));
-}
-
-static void
-gcr_viewer_window_constructed (GObject *obj)
-{
- GcrViewerWindow *self = GCR_VIEWER_WINDOW (obj);
- GtkWidget *bbox;
- GtkWidget *box;
- GtkWidget *button;
-
- G_OBJECT_CLASS (gcr_viewer_window_parent_class)->constructed (obj);
-
- bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
- gtk_box_set_spacing (GTK_BOX (bbox), 12);
- gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), GTK_BUTTONBOX_END);
- gtk_widget_show (bbox);
-
- self->pv->import = gcr_import_button_new (_("Import"));
- g_signal_connect_object (self->pv->import, "importing",
- G_CALLBACK (on_import_button_importing),
- self, 0);
- g_signal_connect_object (self->pv->import, "imported",
- G_CALLBACK (on_import_button_imported),
- self, 0);
- gtk_widget_show (GTK_WIDGET (self->pv->import));
-
- button = gtk_button_new_with_mnemonic (_("_Close"));
- g_signal_connect_object (button, "clicked",
- G_CALLBACK (on_close_clicked),
- self, 0);
- gtk_widget_show (button);
-
- gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, TRUE, 0);
- gtk_box_pack_start (GTK_BOX (bbox), GTK_WIDGET (self->pv->import), FALSE, TRUE, 0);
-
- gtk_widget_set_halign (bbox, 0.5);
- gtk_widget_set_valign (bbox, 0.5);
-#if GTK_CHECK_VERSION (3, 12, 0)
- gtk_widget_set_margin_end (bbox, 12);
-#else
- gtk_widget_set_margin_right (bbox, 12);
-#endif
-
- self->pv->viewer = gcr_viewer_widget_new ();
- g_object_bind_property (self->pv->viewer, "display-name",
- self, "title", G_BINDING_SYNC_CREATE);
- g_signal_connect_object (self->pv->viewer, "added",
- G_CALLBACK (on_viewer_renderer_added),
- self, 0);
- gtk_widget_show (GTK_WIDGET (self->pv->viewer));
-
- box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
- gtk_widget_show (box);
-
- gtk_box_pack_start (GTK_BOX (box), GTK_WIDGET (self->pv->viewer), TRUE, TRUE, 0);
- gtk_box_pack_start (GTK_BOX (box), bbox, FALSE, FALSE, 6);
-
- gtk_container_add (GTK_CONTAINER (self), box);
-
- gtk_window_set_default_size (GTK_WINDOW (self), 250, 400);
-}
-
-static void
-gcr_viewer_window_class_init (GcrViewerWindowClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-
- gobject_class->constructed = gcr_viewer_window_constructed;
-}
-
-/**
- * gcr_viewer_window_new:
- *
- * Create a new viewer window.
- *
- * Returns: (transfer full) (type GcrUi.ViewerWindow): a new viewer window
- */
-GtkWindow *
-gcr_viewer_window_new (void)
-{
- return g_object_new (GCR_TYPE_VIEWER_WINDOW, NULL);
-}
-
-/**
- * gcr_viewer_window_load:
- * @self: a viewer window
- * @file: file to load
- *
- * Load a file into a viewer window. It may not appear immediately.
- */
-void
-gcr_viewer_window_load (GcrViewerWindow *self,
- GFile *file)
-{
- g_return_if_fail (GCR_IS_VIEWER_WINDOW (self));
- g_return_if_fail (G_IS_FILE (file));
-
- return gcr_viewer_widget_load_file (self->pv->viewer, file);
-}
-
-/**
- * gcr_viewer_window_get_viewer:
- * @self: a viewer window
- *
- * Get the actual viewer showing information in the window.
- *
- * Returns: the viewer
- */
-GcrViewer *
-gcr_viewer_window_get_viewer (GcrViewerWindow *self)
-{
- g_return_val_if_fail (GCR_IS_VIEWER_WINDOW (self), NULL);
- return gcr_viewer_widget_get_viewer (self->pv->viewer);
-}
diff --git a/tools/gcr-viewer-window.h b/tools/gcr-viewer-window.h
deleted file mode 100644
index 6af2e30..0000000
--- a/tools/gcr-viewer-window.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* gcr-viewer-window.h: Window for viewer
-
- Copyright (C) 2011 Collabora Ltd.
-
- The Gnome Keyring Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public License as
- published by the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version.
-
- The Gnome Keyring Library 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with the Gnome Library; see the file COPYING.LIB. If not,
- see <http://www.gnu.org/licenses/>.
-
- Author: Stef Walter <stefw@collabora.co.uk>
-*/
-
-#ifndef GCR_VIEWER_WINDOW_H
-#define GCR_VIEWER_WINDOW_H
-
-#include <gtk/gtk.h>
-
-#ifndef GCR_DISABLE_DEPRECATED
-
-#include "gcr/gcr.h"
-#include "gcr-gtk3/gcr-gtk3.h"
-
-#define GCR_TYPE_VIEWER_WINDOW (gcr_viewer_window_get_type ())
-#define GCR_VIEWER_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_VIEWER_WINDOW, GcrViewerWindow))
-#define GCR_VIEWER_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_VIEWER_WINDOW, GcrViewerWindowClass))
-#define GCR_IS_VIEWER_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_VIEWER_WINDOW))
-#define GCR_IS_VIEWER_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_VIEWER_WINDOW))
-#define GCR_VIEWER_WINDOW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_VIEWER_WINDOW, GcrViewerWindowClass))
-
-typedef struct _GcrViewerWindow GcrViewerWindow;
-typedef struct _GcrViewerWindowClass GcrViewerWindowClass;
-typedef struct _GcrViewerWindowPrivate GcrViewerWindowPrivate;
-
-struct _GcrViewerWindow {
- /*< private >*/
- GtkWindow parent;
- GcrViewerWindowPrivate *pv;
-};
-
-struct _GcrViewerWindowClass {
- /*< private >*/
- GtkWindowClass parent_class;
-};
-
-GType gcr_viewer_window_get_type (void);
-
-GtkWindow * gcr_viewer_window_new (void);
-
-void gcr_viewer_window_load (GcrViewerWindow *self,
- GFile *file);
-
-GcrViewer * gcr_viewer_window_get_viewer (GcrViewerWindow *self);
-
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrViewerWindow, g_object_unref)
-
-#endif /* GCR_DISABLE_DEPRECATED */
-
-#endif /* GCR_VIEWER_WINDOW_H */
diff --git a/tools/gcr-viewer.desktop.in.in b/tools/gcr-viewer.desktop.in.in
deleted file mode 100644
index d3b0f57..0000000
--- a/tools/gcr-viewer.desktop.in.in
+++ /dev/null
@@ -1,7 +0,0 @@
-[Desktop Entry]
-Name=View file
-MimeType=application/pkcs12;application/pkcs12+pem;application/pkcs7-mime;application/pkcs7-mime+pem;application/pkcs8;application/pkcs8+pem;application/pkix-cert;application/pkix-cert+pem;application/pkix-crl;application/pkix-crl+pem;application/x-pem-file;application/x-pem-key;application/x-pkcs12;application/x-pkcs7-certificates;application/x-x509-ca-cert;application/x-x509-user-cert;application/pkcs10;application/pkcs10+pem;application/x-spkac;application/x-spkac+base64;
-Exec=@bindir@/gcr-viewer
-Type=Application
-Terminal=false
-NoDisplay=true
diff --git a/tools/gtk3/meson.build b/tools/gtk3/meson.build
new file mode 100644
index 0000000..e2da60f
--- /dev/null
+++ b/tools/gtk3/meson.build
@@ -0,0 +1,7 @@
+gcr_viewer_gtk3 = executable('gcr-viewer-gtk3',
+ 'viewer.c',
+ dependencies: [ gcr_gtk3_dep, gcr_gtk3_deps ],
+ c_args: gcr_gtk3_cflags,
+ include_directories: config_h_dir,
+ install: true,
+)
diff --git a/tools/gtk3/viewer.c b/tools/gtk3/viewer.c
new file mode 100644
index 0000000..e8e6e7c
--- /dev/null
+++ b/tools/gtk3/viewer.c
@@ -0,0 +1,139 @@
+/*
+ * Copyright 2011,2021 Collabora Ltd.
+ * Copyright Corentin Noël <corentin.noel@collabora.com>
+ * Copyright Stef Walter <stefw@collabora.co.uk>
+ * SPDX-License-Identifier: LGPL-2.0-or-later
+ */
+
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+#include <gcr-gtk3/gcr-gtk3.h>
+
+#include "config.h"
+
+static gchar **remaining_args = NULL;
+
+static gboolean
+print_version_and_exit (const gchar *option_name,
+ const gchar *value,
+ gpointer data,
+ GError **error)
+{
+ g_print("%s -- %s\n", _("GCR Certificate Viewer"), VERSION);
+ exit (0);
+ return TRUE;
+}
+
+static const GOptionEntry options[] = {
+ { "version", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK,
+ print_version_and_exit, N_("Show the application's version"), NULL},
+ { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY,
+ &remaining_args, NULL, N_("[file...]") },
+ { NULL }
+};
+
+static void
+on_parser_parsed (GcrParser *parser,
+ gpointer user_data)
+{
+ GcrCertificate **cert = user_data;
+ GckAttributes *attributes;
+ const GckAttribute *attr;
+
+ attributes = gcr_parser_get_parsed_attributes (parser);
+ attr = gck_attributes_find (attributes, CKA_VALUE);
+ *cert = gcr_simple_certificate_new (attr->value, attr->length);
+}
+
+GcrCertificate *
+simple_certificate_new_from_file (GFile *file,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GcrCertificate *cert = NULL;
+ GcrParser *parser;
+ GBytes *bytes;
+
+ g_return_val_if_fail (G_IS_FILE (file), NULL);
+ g_return_val_if_fail (!error || !*error, NULL);
+
+
+ bytes = g_file_load_bytes (file, cancellable, NULL, error);
+ if (!bytes) {
+ return NULL;
+ }
+
+ parser = gcr_parser_new ();
+ g_signal_connect (parser, "parsed", G_CALLBACK (on_parser_parsed), &cert);
+ if (!gcr_parser_parse_bytes (parser, bytes, error)) {
+ g_bytes_unref (bytes);
+ g_object_unref (parser);
+ g_object_unref (cert);
+ return NULL;
+ }
+
+ g_bytes_unref (bytes);
+ g_object_unref (parser);
+ return cert;
+}
+
+
+static void
+activate (GtkApplication* app,
+ gpointer user_data)
+{
+ GtkWidget *window;
+ GtkWidget *box;
+ GtkWidget *scrolled;
+ GCancellable *cancellable = NULL;
+
+ window = gtk_application_window_new (app);
+ gtk_window_set_title (GTK_WINDOW (window), "Window");
+ gtk_window_set_default_size (GTK_WINDOW (window), 400, 300);
+ scrolled = gtk_scrolled_window_new (NULL, NULL);
+ box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
+ g_object_set (G_OBJECT (scrolled),
+ "child", box,
+ "hscrollbar-policy", GTK_POLICY_NEVER,
+ NULL);
+
+ if (remaining_args) {
+ for (int i = 0; remaining_args[i] != NULL; ++i) {
+ GFile *file;
+ GError *error = NULL;
+ GcrCertificate *certificate;
+ GtkWidget *widget;
+
+ file = g_file_new_for_commandline_arg (remaining_args[i]);
+ certificate = simple_certificate_new_from_file (file, cancellable, &error);
+ g_object_unref (file);
+ widget = gcr_certificate_widget_new (GCR_CERTIFICATE (certificate));
+ g_object_unref (certificate);
+ gtk_widget_set_halign (widget, GTK_ALIGN_CENTER);
+ gtk_container_add (GTK_CONTAINER (box), widget);
+ }
+
+ g_clear_pointer (&remaining_args, g_strfreev);
+ remaining_args = NULL;
+ }
+
+ gtk_container_add (GTK_CONTAINER (window), scrolled);
+ gtk_widget_show_all (window);
+}
+
+int
+main (int argc,
+ char **argv)
+{
+ GtkApplication *app;
+ int status;
+
+ app = gtk_application_new ("org.gnome.GcrViewerGtk4", G_APPLICATION_FLAGS_NONE);
+ g_application_add_main_option_entries (G_APPLICATION (app), options);
+ g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
+ status = g_application_run (G_APPLICATION (app), argc, argv);
+ g_object_unref (app);
+
+ return status;
+}
diff --git a/gcr-gtk4/viewer/meson.build b/tools/gtk4/meson.build
index c33fae9..f15e00b 100644
--- a/gcr-gtk4/viewer/meson.build
+++ b/tools/gtk4/meson.build
@@ -1,4 +1,4 @@
-gcr_viewer = executable('gcr-viewer-gtk4',
+gcr_viewer_gtk4 = executable('gcr-viewer-gtk4',
'viewer.c',
dependencies: [ gcr_gtk4_dep, gcr_gtk4_deps ],
c_args: gcr_gtk4_cflags,
diff --git a/gcr-gtk4/viewer/viewer.c b/tools/gtk4/viewer.c
index 986cecd..9440b28 100644
--- a/gcr-gtk4/viewer/viewer.c
+++ b/tools/gtk4/viewer.c
@@ -20,7 +20,7 @@ print_version_and_exit (const gchar *option_name,
gpointer data,
GError **error)
{
- g_print("%s -- %s\n", _("GCR Certificate and Key Viewer"), VERSION);
+ g_print("%s -- %s\n", _("GCR Certificate Viewer"), VERSION);
exit (0);
return TRUE;
}
diff --git a/tools/meson.build b/tools/meson.build
index a8d2309..4db190e 100644
--- a/tools/meson.build
+++ b/tools/meson.build
@@ -1,65 +1,7 @@
-# gcr-viewer
-gcr_viewer = executable('gcr-viewer',
- 'gcr-viewer-tool.c',
- 'gcr-viewer-window.c',
- dependencies: [ gcr_gtk3_dep, gcr_gtk3_deps ],
- c_args: gcr_gtk3_cflags,
- include_directories: config_h_dir,
- install: true,
-)
+if get_option('gtk3')
+ subdir('gtk3')
+endif
-i18n.merge_file(
- input: configure_file(
- input: 'gcr-viewer.desktop.in.in',
- output: '@BASENAME@',
- configuration: { 'bindir': gcr_prefix / get_option('bindir') },
- ),
- output: '@BASENAME@',
- type: 'desktop',
- po_dir: podir,
- install: true,
- install_dir: get_option('datadir') / 'applications',
-)
-
-# gcr-prompter
-gcr_prompter = executable('gcr-prompter',
- 'gcr-prompter-tool.c',
- dependencies: [ gcr_gtk3_dep, gcr_gtk3_deps ],
- c_args: gcr_gtk3_cflags,
- include_directories: config_h_dir,
- install: true,
- install_dir: get_option('libexecdir'),
-)
-
-i18n.merge_file(
- input: configure_file(
- input: 'gcr-prompter.desktop.in.in',
- output: '@BASENAME@',
- configuration: { 'libexecdir': gcr_prefix / get_option('libexecdir') },
- ),
- output: '@BASENAME@',
- type: 'desktop',
- po_dir: podir,
- install: true,
- install_dir: get_option('datadir') / 'applications',
-)
-
-
-# Manual UI testing programs
-gcr_tools_manual_tests = [
- 'frob-unlock',
-]
-
-gcr_tools_test_cflags = [
- '-DSRCDIR="@0@"'.format(source_root),
-]
-
-foreach _test : gcr_tools_manual_tests
- test_bin = executable('test-'+_test,
- '@0@.c'.format(_test),
- 'gcr-viewer-window.c',
- dependencies: [ gcr_gtk3_deps, gcr_gtk3_dep ],
- c_args: [ gcr_gtk3_cflags, gcr_tools_test_cflags ],
- include_directories: config_h_dir,
- )
-endforeach
+if get_option('gtk4')
+ subdir('gtk4')
+endif