[seahorse] common: SeahorseViewable tracks which Window is per object



commit 245d4a9aa3acba9ffb7a160a13269b91d86dd933
Author: Stef Walter <stefw gnome org>
Date:   Thu Jun 20 10:20:56 2013 +0200

    common: SeahorseViewable tracks which Window is per object
    
    Don't rely on SeahorseObjectWidget for this, since we'd rather
    not use SeahorseWidget and SeahorseObjectWidget in new code.

 common/viewable.vala                   |   27 ++++++++++++++++++++++++++-
 gkr/seahorse-gkr-dialogs.h             |    4 ++--
 gkr/seahorse-gkr-item-properties.c     |    6 ++++--
 gkr/seahorse-gkr-item.c                |   11 +++++------
 gkr/seahorse-gkr-keyring-properties.c  |    5 +++--
 gkr/seahorse-gkr-keyring.c             |   12 ++++++------
 libseahorse/seahorse-catalog.c         |    4 +---
 libseahorse/seahorse-search-provider.c |    2 +-
 pgp/seahorse-pgp-dialogs.h             |    2 +-
 pgp/seahorse-pgp-key-properties.c      |    8 ++++++--
 pgp/seahorse-pgp-key.c                 |   10 +++++-----
 pkcs11/seahorse-certificate.c          |   11 ++++++-----
 pkcs11/seahorse-pkcs11-properties.c    |   28 ++--------------------------
 pkcs11/seahorse-pkcs11-properties.h    |    2 +-
 pkcs11/seahorse-private-key.c          |    9 +++++----
 src/seahorse-sidebar.c                 |    3 +--
 ssh/seahorse-ssh-dialogs.h             |    2 +-
 ssh/seahorse-ssh-key-properties.c      |    5 +++--
 ssh/seahorse-ssh-key.c                 |   10 +++++-----
 19 files changed, 84 insertions(+), 77 deletions(-)
---
diff --git a/common/viewable.vala b/common/viewable.vala
index 29c345b..1bb79e2 100644
--- a/common/viewable.vala
+++ b/common/viewable.vala
@@ -26,11 +26,36 @@ namespace Seahorse
 {
 
 public interface Viewable : GLib.Object {
-       public abstract void show_viewer(Gtk.Window? parent);
+       public abstract Gtk.Window? create_viewer(Gtk.Window? parent);
 
        public static bool can_view(GLib.Object object) {
                return object is Viewable;
        }
+
+       public static bool view(GLib.Object object,
+                               Gtk.Window? parent) {
+               if (!Viewable.can_view(object))
+                       return false;
+
+               Gtk.Window? window = null;
+
+               window = object.get_data("viewable-window");
+               if (window == null) {
+                       var viewable = (Viewable)object;
+                       window = viewable.create_viewer(parent);
+                       if (window == null)
+                               return false;
+
+                       object.set_data("viewable-window", window);
+                       window.destroy.connect(() => {
+                               object.set_data_full("viewable-window", null, null);
+                       });
+               }
+
+               window.present();
+               window.show();
+               return true;
+       }
 }
 
 }
diff --git a/gkr/seahorse-gkr-dialogs.h b/gkr/seahorse-gkr-dialogs.h
index fa565f0..98cc0fa 100644
--- a/gkr/seahorse-gkr-dialogs.h
+++ b/gkr/seahorse-gkr-dialogs.h
@@ -34,8 +34,8 @@ void            seahorse_gkr_add_item_show            (GtkWindow *parent);
 
 void            seahorse_gkr_add_keyring_show         (GtkWindow *parent);
 
-void            seahorse_gkr_item_properties_show     (SeahorseGkrItem *git, GtkWindow *parent);
+GtkWindow *     seahorse_gkr_item_properties_show     (SeahorseGkrItem *git, GtkWindow *parent);
 
-void            seahorse_gkr_keyring_properties_show  (SeahorseGkrKeyring *gkr, GtkWindow *parent);
+GtkWindow *     seahorse_gkr_keyring_properties_show  (SeahorseGkrKeyring *gkr, GtkWindow *parent);
 
 #endif /* __SEAHORSE_GKR_DIALOGS__ */
diff --git a/gkr/seahorse-gkr-item-properties.c b/gkr/seahorse-gkr-item-properties.c
index 9ee8f95..e1f40c6 100644
--- a/gkr/seahorse-gkr-item-properties.c
+++ b/gkr/seahorse-gkr-item-properties.c
@@ -536,7 +536,7 @@ properties_response (GtkDialog *dialog, int response, SeahorseWidget *swidget)
     seahorse_widget_destroy (swidget);
 }
 
-void
+GtkWindow *
 seahorse_gkr_item_properties_show (SeahorseGkrItem *git, GtkWindow *parent)
 {
     GObject *object = G_OBJECT (git);
@@ -547,7 +547,7 @@ seahorse_gkr_item_properties_show (SeahorseGkrItem *git, GtkWindow *parent)
     
     /* This happens if the window is already open */
     if (swidget == NULL)
-        return;
+        return NULL;
 
     seahorse_gkr_item_refresh (git);
 
@@ -562,4 +562,6 @@ seahorse_gkr_item_properties_show (SeahorseGkrItem *git, GtkWindow *parent)
 
     setup_main (swidget);
     setup_details (swidget);
+
+    return g_object_ref (seahorse_widget_get_toplevel (swidget));
 }
diff --git a/gkr/seahorse-gkr-item.c b/gkr/seahorse-gkr-item.c
index 3c6d798..37d4759 100644
--- a/gkr/seahorse-gkr-item.c
+++ b/gkr/seahorse-gkr-item.c
@@ -766,18 +766,17 @@ seahorse_gkr_item_deletable_iface (SeahorseDeletableIface *iface)
        iface->get_deletable = seahorse_gkr_item_get_deletable;
 }
 
-static void
-seahorse_gkr_item_show_viewer (SeahorseViewable *viewable,
-                               GtkWindow *parent)
+static GtkWindow *
+seahorse_gkr_item_create_viewer (SeahorseViewable *viewable,
+                                 GtkWindow *parent)
 {
-       seahorse_gkr_item_properties_show (SEAHORSE_GKR_ITEM (viewable),
-                                          parent);
+       return seahorse_gkr_item_properties_show (SEAHORSE_GKR_ITEM (viewable), parent);
 }
 
 static void
 seahorse_gkr_item_viewable_iface (SeahorseViewableIface *iface)
 {
-       iface->show_viewer = seahorse_gkr_item_show_viewer;
+       iface->create_viewer = seahorse_gkr_item_create_viewer;
 }
 
 SeahorseGkrItem *
diff --git a/gkr/seahorse-gkr-keyring-properties.c b/gkr/seahorse-gkr-keyring-properties.c
index d290e51..876ca28 100644
--- a/gkr/seahorse-gkr-keyring-properties.c
+++ b/gkr/seahorse-gkr-keyring-properties.c
@@ -93,7 +93,7 @@ on_keyring_properties_response (GtkDialog *dialog,
        seahorse_widget_destroy (swidget);
 }
 
-void
+GtkWindow *
 seahorse_gkr_keyring_properties_show (SeahorseGkrKeyring *gkr, GtkWindow *parent)
 {
        GObject *object = G_OBJECT (gkr);
@@ -103,6 +103,7 @@ seahorse_gkr_keyring_properties_show (SeahorseGkrKeyring *gkr, GtkWindow *parent
     
        /* This happens if the window is already open */
        if (swidget == NULL)
-               return;
+               return NULL;
        setup_main (swidget);
+       return g_object_ref (seahorse_widget_get_toplevel (swidget));
 }
diff --git a/gkr/seahorse-gkr-keyring.c b/gkr/seahorse-gkr-keyring.c
index 005617c..e7313b0 100644
--- a/gkr/seahorse-gkr-keyring.c
+++ b/gkr/seahorse-gkr-keyring.c
@@ -504,18 +504,18 @@ seahorse_keyring_lockable_iface (SeahorseLockableIface *iface)
        iface->unlock_finish = seahorse_gkr_keyring_unlock_finish;
 }
 
-static void
-seahorse_gkr_keyring_show_viewer (SeahorseViewable *viewable,
-                                  GtkWindow *parent)
+static GtkWindow *
+seahorse_gkr_keyring_create_viewer (SeahorseViewable *viewable,
+                                    GtkWindow *parent)
 {
-       seahorse_gkr_keyring_properties_show (SEAHORSE_GKR_KEYRING (viewable),
-                                             parent);
+       return seahorse_gkr_keyring_properties_show (SEAHORSE_GKR_KEYRING (viewable),
+                                                    parent);
 }
 
 static void
 seahorse_keyring_viewable_iface (SeahorseViewableIface *iface)
 {
-       iface->show_viewer = seahorse_gkr_keyring_show_viewer;
+       iface->create_viewer = seahorse_gkr_keyring_create_viewer;
 }
 
 gboolean
diff --git a/libseahorse/seahorse-catalog.c b/libseahorse/seahorse-catalog.c
index 403f402..e1ec564 100644
--- a/libseahorse/seahorse-catalog.c
+++ b/libseahorse/seahorse-catalog.c
@@ -584,9 +584,7 @@ void
 seahorse_catalog_show_properties (SeahorseCatalog *self,
                                   GObject* obj)
 {
-       if (seahorse_viewable_can_view (obj))
-               seahorse_viewable_show_viewer (SEAHORSE_VIEWABLE (obj),
-                                              seahorse_catalog_get_window (self));
+       seahorse_viewable_view (obj, seahorse_catalog_get_window (self));
 }
 
 GtkWindow *
diff --git a/libseahorse/seahorse-search-provider.c b/libseahorse/seahorse-search-provider.c
index d435383..95cbe18 100644
--- a/libseahorse/seahorse-search-provider.c
+++ b/libseahorse/seahorse-search-provider.c
@@ -286,7 +286,7 @@ handle_activate_result (SeahorseShellSearchProvider2 *skeleton,
        window = GTK_WINDOW (seahorse_widget_get_widget (key_manager, key_manager->name));
        gtk_window_present_with_time (window, timestamp);
 
-       seahorse_viewable_show_viewer (SEAHORSE_VIEWABLE (object), window);
+       seahorse_viewable_view (object, window);
 
        seahorse_shell_search_provider2_complete_activate_result (skeleton,
                                                                  invocation);
diff --git a/pgp/seahorse-pgp-dialogs.h b/pgp/seahorse-pgp-dialogs.h
index 498c5c7..33e38e7 100644
--- a/pgp/seahorse-pgp-dialogs.h
+++ b/pgp/seahorse-pgp-dialogs.h
@@ -33,7 +33,7 @@
 
 SeahorsePgpKey* seahorse_signer_get                 (GtkWindow *parent);
 
-void            seahorse_pgp_key_properties_show    (SeahorsePgpKey *pkey,
+GtkWindow *     seahorse_pgp_key_properties_show    (SeahorsePgpKey *pkey,
                                                      GtkWindow *parent);
 
 #endif /* __SEAHORSE_PGP_DIALOGS_H__ */
diff --git a/pgp/seahorse-pgp-key-properties.c b/pgp/seahorse-pgp-key-properties.c
index 8c28486..f8764f7 100644
--- a/pgp/seahorse-pgp-key-properties.c
+++ b/pgp/seahorse-pgp-key-properties.c
@@ -1959,7 +1959,7 @@ setup_private_properties (SeahorsePgpKey *pkey, GtkWindow *parent)
     return swidget;
 }
 
-void
+GtkWindow *
 seahorse_pgp_key_properties_show (SeahorsePgpKey *pkey, GtkWindow *parent)
 {
        SeahorseWidget *swidget;
@@ -1974,6 +1974,10 @@ seahorse_pgp_key_properties_show (SeahorsePgpKey *pkey, GtkWindow *parent)
                swidget = setup_public_properties (pkey, parent);
        else
                swidget = setup_private_properties (pkey, parent);
-       if (swidget)
+       if (swidget) {
                seahorse_widget_show (swidget);
+               return g_object_ref (seahorse_widget_get_toplevel (swidget));
+       }
+
+       return NULL;
 }
diff --git a/pgp/seahorse-pgp-key.c b/pgp/seahorse-pgp-key.c
index 0f3478e..1060148 100644
--- a/pgp/seahorse-pgp-key.c
+++ b/pgp/seahorse-pgp-key.c
@@ -482,17 +482,17 @@ seahorse_pgp_key_class_init (SeahorsePgpKeyClass *klass)
                                     "", G_PARAM_READABLE));
 }
 
-static void
-seahorse_pgp_key_show_viewer (SeahorseViewable *viewable,
-                              GtkWindow *parent)
+static GtkWindow *
+seahorse_pgp_key_create_viewer (SeahorseViewable *viewable,
+                                GtkWindow *parent)
 {
-       seahorse_pgp_key_properties_show (SEAHORSE_PGP_KEY (viewable), parent);
+       return seahorse_pgp_key_properties_show (SEAHORSE_PGP_KEY (viewable), parent);
 }
 
 static void
 seahorse_pgp_key_viewable_iface (SeahorseViewableIface *iface)
 {
-       iface->show_viewer = seahorse_pgp_key_show_viewer;
+       iface->create_viewer = seahorse_pgp_key_create_viewer;
 }
 
 gchar*
diff --git a/pkcs11/seahorse-certificate.c b/pkcs11/seahorse-certificate.c
index 722d831..99abec5 100644
--- a/pkcs11/seahorse-certificate.c
+++ b/pkcs11/seahorse-certificate.c
@@ -412,18 +412,19 @@ seahorse_certificate_deletable_iface (SeahorseDeletableIface *iface)
        iface->get_deletable = seahorse_certificate_get_deletable;
 }
 
-static void
-seahorse_certificate_show_viewer (SeahorseViewable *viewable,
-                                  GtkWindow *parent)
+static GtkWindow *
+seahorse_certificate_create_viewer (SeahorseViewable *viewable,
+                                    GtkWindow *parent)
 {
-       GtkWindow *viewer = seahorse_pkcs11_properties_show (G_OBJECT (viewable), parent);
+       GtkWindow *viewer = seahorse_pkcs11_properties_new (G_OBJECT (viewable), parent);
        gtk_widget_show (GTK_WIDGET (viewer));
+       return viewer;
 }
 
 static void
 seahorse_certificate_viewable_iface (SeahorseViewableIface *iface)
 {
-       iface->show_viewer = seahorse_certificate_show_viewer;
+       iface->create_viewer = seahorse_certificate_create_viewer;
 }
 
 GIcon *
diff --git a/pkcs11/seahorse-pkcs11-properties.c b/pkcs11/seahorse-pkcs11-properties.c
index f5c6811..e60b539 100644
--- a/pkcs11/seahorse-pkcs11-properties.c
+++ b/pkcs11/seahorse-pkcs11-properties.c
@@ -73,8 +73,6 @@ enum {
        PROP_OBJECT
 };
 
-static GQuark QUARK_WINDOW = 0;
-
 G_DEFINE_TYPE (SeahorsePkcs11Properties, seahorse_pkcs11_properties, GTK_TYPE_WINDOW);
 
 static void
@@ -338,7 +336,6 @@ seahorse_pkcs11_properties_constructed (GObject *obj)
        gtk_ui_manager_ensure_update (self->ui_manager);
 
        g_return_if_fail (self->object != NULL);
-       g_object_set_qdata (self->object, QUARK_WINDOW, self);
 
        g_signal_connect_object (self->object, "notify::label", G_CALLBACK (on_object_label_changed),
                                 self, G_CONNECT_AFTER);
@@ -422,12 +419,6 @@ seahorse_pkcs11_properties_finalize (GObject *obj)
        g_clear_object (&self->request_key);
        g_object_unref (self->actions);
        g_object_unref (self->ui_manager);
-
-       if (self->object) {
-               if (g_object_get_qdata (self->object, QUARK_WINDOW) == self)
-                       g_object_set_qdata (self->object, QUARK_WINDOW, NULL);
-       }
-
        g_clear_object (&self->object);
 
        G_OBJECT_CLASS (seahorse_pkcs11_properties_parent_class)->finalize (obj);
@@ -449,8 +440,6 @@ seahorse_pkcs11_properties_class_init (SeahorsePkcs11PropertiesClass *klass)
        g_object_class_install_property (gobject_class, PROP_OBJECT,
                   g_param_spec_object ("object", "Object", "Certificate or key to display", G_TYPE_OBJECT,
                                        G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
-
-       QUARK_WINDOW = g_quark_from_static_string ("seahorse-pkcs11-properties-window");
 }
 
 /* -----------------------------------------------------------------------------
@@ -458,22 +447,9 @@ seahorse_pkcs11_properties_class_init (SeahorsePkcs11PropertiesClass *klass)
  */
 
 GtkWindow *
-seahorse_pkcs11_properties_show (GObject  *object,
-                                 GtkWindow *parent)
+seahorse_pkcs11_properties_new (GObject  *object,
+                                GtkWindow *parent)
 {
-       GObject *previous;
-       GtkWindow *window;
-
-       /* Try to show an already present window */
-       previous = g_object_get_qdata (object, QUARK_WINDOW);
-       if (GTK_IS_WINDOW (previous)) {
-               window = GTK_WINDOW (previous);
-               if (gtk_widget_get_visible (GTK_WIDGET (window))) {
-                       gtk_window_present (window);
-                       return window;
-               }
-       }
-
        return g_object_new (SEAHORSE_TYPE_PKCS11_PROPERTIES,
                             "object", object,
                             "transient-for", parent,
diff --git a/pkcs11/seahorse-pkcs11-properties.h b/pkcs11/seahorse-pkcs11-properties.h
index da93b39..a2a2d8c 100644
--- a/pkcs11/seahorse-pkcs11-properties.h
+++ b/pkcs11/seahorse-pkcs11-properties.h
@@ -36,7 +36,7 @@ typedef struct _SeahorsePkcs11Properties SeahorsePkcs11Properties;
 
 GType            seahorse_pkcs11_properties_get_type            (void);
 
-GtkWindow *      seahorse_pkcs11_properties_show                (GObject *object,
+GtkWindow *      seahorse_pkcs11_properties_new                 (GObject *object,
                                                                  GtkWindow *parent);
 
 GObject *        seahorse_pkcs11_properties_get_object          (SeahorsePkcs11Properties *self);
diff --git a/pkcs11/seahorse-private-key.c b/pkcs11/seahorse-private-key.c
index 7f1735b..becfcbd 100644
--- a/pkcs11/seahorse-private-key.c
+++ b/pkcs11/seahorse-private-key.c
@@ -337,18 +337,19 @@ seahorse_private_key_exportable_iface (SeahorseExportableIface *iface)
        iface->get_exportable = seahorse_private_key_get_exportable;
 }
 
-static void
-seahorse_private_key_show_viewer (SeahorseViewable *viewable,
+static GtkWindow *
+seahorse_private_key_create_viewer (SeahorseViewable *viewable,
                                   GtkWindow *parent)
 {
-       GtkWindow *viewer = seahorse_pkcs11_properties_show (G_OBJECT (viewable), parent);
+       GtkWindow *viewer = seahorse_pkcs11_properties_new (G_OBJECT (viewable), parent);
        gtk_widget_show (GTK_WIDGET (viewer));
+       return viewer;
 }
 
 static void
 seahorse_private_key_viewable_iface (SeahorseViewableIface *iface)
 {
-       iface->show_viewer = seahorse_private_key_show_viewer;
+       iface->create_viewer = seahorse_private_key_create_viewer;
 }
 
 SeahorseCertificate *
diff --git a/src/seahorse-sidebar.c b/src/seahorse-sidebar.c
index a2bbcb5..b7fcb78 100644
--- a/src/seahorse-sidebar.c
+++ b/src/seahorse-sidebar.c
@@ -904,9 +904,8 @@ static void
 on_place_properties (GtkMenuItem *item,
                      gpointer user_data)
 {
-       SeahorseViewable *viewable = SEAHORSE_VIEWABLE (user_data);
        GtkWidget *window = gtk_widget_get_toplevel (GTK_WIDGET (item));
-       seahorse_viewable_show_viewer (viewable, GTK_WINDOW (window));
+       seahorse_viewable_view (user_data, GTK_WINDOW (window));
 }
 
 static void
diff --git a/ssh/seahorse-ssh-dialogs.h b/ssh/seahorse-ssh-dialogs.h
index e315813..8fcd02a 100644
--- a/ssh/seahorse-ssh-dialogs.h
+++ b/ssh/seahorse-ssh-dialogs.h
@@ -9,7 +9,7 @@
 void        seahorse_ssh_upload_prompt         (GList *keys,
                                                 GtkWindow *parent);
 
-void        seahorse_ssh_key_properties_show   (SeahorseSSHKey *skey,
+GtkWindow * seahorse_ssh_key_properties_show   (SeahorseSSHKey *skey,
                                                 GtkWindow *parent);
 
 void        seahorse_ssh_generate_show         (SeahorseSSHSource *sksrc,
diff --git a/ssh/seahorse-ssh-key-properties.c b/ssh/seahorse-ssh-key-properties.c
index 2dfecc5..329cd57 100644
--- a/ssh/seahorse-ssh-key-properties.c
+++ b/ssh/seahorse-ssh-key-properties.c
@@ -334,7 +334,7 @@ properties_response (GtkDialog *dialog, int response, SeahorseWidget *swidget)
     seahorse_widget_destroy (swidget);
 }
 
-void
+GtkWindow *
 seahorse_ssh_key_properties_show (SeahorseSSHKey *skey,
                                   GtkWindow *parent)
 {
@@ -346,7 +346,7 @@ seahorse_ssh_key_properties_show (SeahorseSSHKey *skey,
     
     /* This happens if the window is already open */
     if (swidget == NULL)
-        return;
+        return NULL;
 
     /* 
      * The signals don't need to keep getting connected. Everytime a key changes the
@@ -371,4 +371,5 @@ seahorse_ssh_key_properties_show (SeahorseSSHKey *skey,
     seahorse_bind_objects (NULL, skey, (SeahorseTransfer)key_notify, swidget);
 
     seahorse_widget_show (swidget);
+    return g_object_ref (seahorse_widget_get_toplevel (swidget));
 }
diff --git a/ssh/seahorse-ssh-key.c b/ssh/seahorse-ssh-key.c
index e32c2e3..81bbd97 100644
--- a/ssh/seahorse-ssh-key.c
+++ b/ssh/seahorse-ssh-key.c
@@ -350,17 +350,17 @@ seahorse_ssh_key_deletable_iface (SeahorseDeletableIface *iface)
        iface->get_deletable = seahorse_ssh_key_get_deletable;
 }
 
-static void
-seahorse_ssh_key_show_viewer (SeahorseViewable *viewable,
-                              GtkWindow *parent)
+static GtkWindow *
+seahorse_ssh_key_create_viewer (SeahorseViewable *viewable,
+                                GtkWindow *parent)
 {
-       seahorse_ssh_key_properties_show (SEAHORSE_SSH_KEY (viewable), parent);
+       return seahorse_ssh_key_properties_show (SEAHORSE_SSH_KEY (viewable), parent);
 }
 
 static void
 seahorse_ssh_key_viewable_iface (SeahorseViewableIface *iface)
 {
-       iface->show_viewer = seahorse_ssh_key_show_viewer;
+       iface->create_viewer = seahorse_ssh_key_create_viewer;
 }
 
 SeahorseSSHKey* 


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