vinagre r270 - branches/unstable/src



Author: jwendell
Date: Fri Mar 21 13:17:50 2008
New Revision: 270
URL: http://svn.gnome.org/viewvc/vinagre?rev=270&view=rev

Log:
Make bookmarks a GObject

Modified:
   branches/unstable/src/vinagre-bookmarks.c
   branches/unstable/src/vinagre-bookmarks.h
   branches/unstable/src/vinagre-commands.c
   branches/unstable/src/vinagre-connect.c
   branches/unstable/src/vinagre-connection.c
   branches/unstable/src/vinagre-fav.c
   branches/unstable/src/vinagre-fav.h
   branches/unstable/src/vinagre-window-private.h
   branches/unstable/src/vinagre-window.c
   branches/unstable/src/vinagre-window.h

Modified: branches/unstable/src/vinagre-bookmarks.c
==============================================================================
--- branches/unstable/src/vinagre-bookmarks.c	(original)
+++ branches/unstable/src/vinagre-bookmarks.c	Fri Mar 21 13:17:50 2008
@@ -2,7 +2,7 @@
  * vinagre-bookmarks.c
  * This file is part of vinagre
  *
- * Copyright (C) 2007  Jonh Wendell <wendell bani com br>
+ * Copyright (C) 2007,2008  Jonh Wendell <wendell bani com br>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -26,105 +26,153 @@
 #include <glade/glade.h>
 #include <string.h>
 
-#define VINAGRE_FAVORITES_FILE  "vinagre.bookmarks"
+struct _VinagreBookmarksPrivate
+{
+  GKeyFile *file;
+  GSList *conns;
+};
 
-GKeyFile *bookmarks = NULL;
+enum
+{
+  BOOKMARK_CHANGED,
+  LAST_SIGNAL
+};
+
+#define VINAGRE_BOOKMARKS_FILE  "vinagre.bookmarks"
+#define VINAGRE_CONNECTION_PRIVATE(o)  (G_TYPE_INSTANCE_GET_PRIVATE ((o), VINAGRE_TYPE_CONNECTION, VinagreConnectionPrivate))
+G_DEFINE_TYPE (VinagreBookmarks, vinagre_bookmarks, G_TYPE_OBJECT);
+
+static VinagreBookmarks *book_singleton = NULL;
+static guint signals[LAST_SIGNAL] = { 0 };
+
+/* Prototypes */
+static void vinagre_bookmarks_init_file    (VinagreBookmarks *book);
+static void vinagre_bookmarks_update_conns (VinagreBookmarks *book);
+static void vinagre_bookmarks_save_file    (VinagreBookmarks *book);
+static void vinagre_bookmarks_clear_conns  (VinagreBookmarks *book);
 
-static gchar *
-filename (void)
+
+static void
+vinagre_bookmarks_init (VinagreBookmarks *book)
 {
-  return g_build_filename (g_get_home_dir (),
-			   ".gnome2",
-			   VINAGRE_FAVORITES_FILE,
-			   NULL);
+  book->priv = G_TYPE_INSTANCE_GET_PRIVATE (book, VINAGRE_TYPE_BOOKMARKS, VinagreBookmarksPrivate);
+
+  book->priv->conns = NULL;
+
+  vinagre_bookmarks_init_file (book);
+  vinagre_bookmarks_update_conns (book);
 }
 
 static void
-vinagre_bookmarks_save_file (void)
+vinagre_bookmarks_finalize (GObject *object)
 {
-  gchar    *file;
-  gchar    *data;
-  gsize    length;
-  GError   *error;
+  VinagreBookmarks *book = VINAGRE_BOOKMARKS (object);
 
-  error = NULL;
-  data = g_key_file_to_data (bookmarks,
-			     &length,
-			     &error);
-  if (!data)
-    {
-      if (error)
-	{
-	  g_warning (_("Error while saving bookmarks: %s"), error->message);
-	  g_error_free (error);
-	}
+  g_key_file_free (book->priv->file);
+  book->priv->file = NULL;
+  vinagre_bookmarks_clear_conns (book);
 
-      return;
+  G_OBJECT_CLASS (vinagre_bookmarks_parent_class)->finalize (object);
+}
 
-    }
+static void
+vinagre_bookmarks_class_init (VinagreBookmarksClass *klass)
+{
+  GObjectClass* object_class = G_OBJECT_CLASS (klass);
+  GObjectClass* parent_class = G_OBJECT_CLASS (klass);
 
-  file  = filename ();
-  error = NULL;
+  g_type_class_add_private (klass, sizeof (VinagreBookmarksPrivate));
 
-  if (!g_file_set_contents (file,
-			    data,
-			    length,
-			    &error))
-    {
-      if (error)
-	{
-	  g_warning (_("Error while saving bookmarks: %s"), error->message);
-	  g_error_free (error);
-	}
-    }
+  object_class->finalize = vinagre_bookmarks_finalize;
 
-  g_free (file);
-  g_free (data);
+  signals[BOOKMARK_CHANGED] =
+		g_signal_new ("changed",
+			      G_OBJECT_CLASS_TYPE (object_class),
+			      G_SIGNAL_RUN_FIRST,
+			      G_STRUCT_OFFSET (VinagreBookmarksClass, changed),
+			      NULL, NULL,
+			      g_cclosure_marshal_VOID__VOID,
+			      G_TYPE_NONE,
+			      0);
 }
 
-void
-vinagre_bookmarks_init (void)
+VinagreBookmarks *
+vinagre_bookmarks_get_default (void)
 {
-  gchar    *file;
-  gboolean loaded;
-  GError   *error;
-
-  g_return_if_fail (bookmarks == NULL);
+  if (G_UNLIKELY (!book_singleton))
+    book_singleton = VINAGRE_BOOKMARKS (g_object_new (VINAGRE_TYPE_BOOKMARKS,
+                                                      NULL));
+  return book_singleton;
+}
 
-  bookmarks = g_key_file_new ();
+static VinagreConnection *
+vinagre_bookmarks_find_conn (VinagreBookmarks  *book,
+                             VinagreConnection *conn)
+{
+  GSList *l, *next;
 
-  loaded = FALSE;
-  error  = NULL;
+  for (l = book->priv->conns; l; l = next)
+    {
+      VinagreConnection *local = VINAGRE_CONNECTION (l->data);
 
-  file = filename ();
-  if (g_file_test (file, G_FILE_TEST_EXISTS))
-    loaded = g_key_file_load_from_file (bookmarks,
-					file,
-					G_KEY_FILE_NONE,
-					&error);
-  g_free (file);
+      if ( (g_str_equal (vinagre_connection_get_host (conn),
+                         vinagre_connection_get_host (local)))
+          &&
+            (vinagre_connection_get_port (conn) == vinagre_connection_get_port (local) ) )
+        return local;
 
-  if (!loaded)
-    {
-      if (error)
-	{
-	  g_warning (_("Error while initializing bookmarks: %s"), error->message);
-	  g_error_free (error);
-	}
+      next = l->next;
     }
+
+  return NULL;
 }
 
-void
-vinagre_bookmarks_finalize (void)
+static void
+vinagre_bookmarks_add_conn (VinagreBookmarks  *book,
+                            VinagreConnection *conn)
 {
-  g_return_if_fail (bookmarks != NULL);
+  book->priv->conns = g_slist_prepend (book->priv->conns,
+                                       vinagre_connection_clone (conn));
+  vinagre_bookmarks_save_file (book);
+}
+
+static void
+vinagre_bookmarks_edit_conn (VinagreBookmarks  *book,
+                             VinagreConnection *old_conn,
+                             VinagreConnection *conn)
+{
+  VinagreConnection *local = vinagre_bookmarks_find_conn (book, old_conn);
+
+  g_return_if_fail (VINAGRE_IS_CONNECTION (local));
+
+  g_object_unref (local);
+  book->priv->conns = g_slist_remove (book->priv->conns,
+                                      local);
+  book->priv->conns = g_slist_prepend (book->priv->conns,
+                                       vinagre_connection_clone (conn));
+  
+  vinagre_bookmarks_save_file (book);
+}
+
+static void
+vinagre_bookmarks_del_conn (VinagreBookmarks  *book,
+                            VinagreConnection *conn)
+{
+  VinagreConnection *local = vinagre_bookmarks_find_conn (book, conn);
+
+  g_return_if_fail (VINAGRE_IS_CONNECTION (local));
 
-  g_key_file_free (bookmarks);
+  book->priv->conns = g_slist_remove (book->priv->conns,
+                                      local);
+  g_object_unref (local);
+  
+  vinagre_bookmarks_save_file (book);
 }
 
 gboolean
-vinagre_bookmarks_add (VinagreConnection *conn,
-		       VinagreWindow     *window)
+vinagre_bookmarks_add (VinagreBookmarks  *book,
+                       VinagreConnection *conn,
+		       GtkWindow         *window)
 {
   gint result;
   GladeXML    *xml;
@@ -132,13 +180,13 @@
   GtkWidget   *dialog;
   const gchar *name;
 
+  g_return_val_if_fail (VINAGRE_IS_BOOKMARKS (book), FALSE);
   g_return_val_if_fail (VINAGRE_IS_CONNECTION (conn), FALSE);
-  g_return_val_if_fail (VINAGRE_IS_WINDOW (window), FALSE);
 
   glade_file = vinagre_utils_get_glade_filename ();
   xml = glade_xml_new (glade_file, "add_to_bookmarks_dialog", NULL);
   dialog = glade_xml_get_widget (xml, "add_to_bookmarks_dialog");
-  gtk_window_set_transient_for (GTK_WINDOW(dialog), GTK_WINDOW(window));
+  gtk_window_set_transient_for (GTK_WINDOW(dialog), window);
 
   gtk_widget_show_all (dialog);
  
@@ -150,17 +198,17 @@
       if (strlen(name) < 1)
 	name = vinagre_connection_get_host (conn);
 
-      g_key_file_set_string (bookmarks,
+      g_key_file_set_string (book->priv->file,
 			     name,
 			     "host",
 			     vinagre_connection_get_host (conn));
-      g_key_file_set_integer (bookmarks,
+      g_key_file_set_integer (book->priv->file,
 			      name,
 			      "port",
 			      vinagre_connection_get_port (conn));
 
       vinagre_connection_set_name (conn, name);
-      vinagre_bookmarks_save_file ();
+      vinagre_bookmarks_add_conn (book, conn);
     }
 
   gtk_widget_destroy (GTK_WIDGET (dialog));
@@ -170,22 +218,22 @@
 }
 
 gboolean
-vinagre_bookmarks_edit (VinagreConnection *conn,
-		        VinagreWindow     *window)
+vinagre_bookmarks_edit (VinagreBookmarks  *book,
+                        VinagreConnection *conn,
+		        GtkWindow         *window)
 {
   gint result;
   GladeXML    *xml;
   const gchar *glade_file;
   GtkWidget   *dialog, *host_entry, *name_entry, *port_entry;
-  const gchar *name;
 
+  g_return_val_if_fail (VINAGRE_IS_BOOKMARKS (book), FALSE);
   g_return_val_if_fail (VINAGRE_IS_CONNECTION (conn), FALSE);
-  g_return_val_if_fail (VINAGRE_IS_WINDOW (window), FALSE);
 
   glade_file = vinagre_utils_get_glade_filename ();
   xml = glade_xml_new (glade_file, "edit_bookmark_dialog", NULL);
   dialog = glade_xml_get_widget (xml, "edit_bookmark_dialog");
-  gtk_window_set_transient_for (GTK_WINDOW(dialog), GTK_WINDOW(window));
+  gtk_window_set_transient_for (GTK_WINDOW(dialog), window);
 
   name_entry = glade_xml_get_widget (xml, "edit_bookmark_name_entry");
   host_entry = glade_xml_get_widget (xml, "edit_bookmark_host_entry");
@@ -201,27 +249,33 @@
 
   if (result == GTK_RESPONSE_OK)
     {
+      const gchar *name;
+      VinagreConnection *old_conn = vinagre_connection_clone (conn);
 
-      g_key_file_remove_group (bookmarks, vinagre_connection_get_name (conn), NULL);
+      g_key_file_remove_group (book->priv->file, vinagre_connection_get_name (conn), NULL);
 
       name = gtk_entry_get_text (GTK_ENTRY (name_entry));
       vinagre_connection_set_host (conn, gtk_entry_get_text (GTK_ENTRY (host_entry)));
       vinagre_connection_set_port (conn, gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (port_entry)));
 
-      if (strlen(vinagre_connection_get_name (conn)) < 1)
-	name = vinagre_connection_get_host (conn);
+      if (strlen (name) < 1)
+        if (strlen(vinagre_connection_get_name (conn)) < 1)
+	  name = vinagre_connection_get_host (conn);
+        else
+          name = vinagre_connection_get_name (conn);
 
-      g_key_file_set_string (bookmarks,
+      g_key_file_set_string (book->priv->file,
 			     name,
 			     "host",
 			     vinagre_connection_get_host (conn));
-      g_key_file_set_integer (bookmarks,
+      g_key_file_set_integer (book->priv->file,
 			      name,
 			      "port",
 			      vinagre_connection_get_port (conn));
 
       vinagre_connection_set_name (conn, name);
-      vinagre_bookmarks_save_file ();
+      vinagre_bookmarks_edit_conn (book, old_conn, conn);
+      g_object_unref (old_conn);
     }
 
   gtk_widget_destroy (GTK_WIDGET (dialog));
@@ -230,59 +284,27 @@
   return (result == GTK_RESPONSE_OK);
 }
 
-GList *
-vinagre_bookmarks_get_all (void)
-{
-  GList *list = NULL;
-  gsize length, i;
-  gchar **conns;
-  VinagreConnection *conn;
-  gchar *s_value;
-  gint i_value;
-
-  g_return_val_if_fail (bookmarks != NULL, NULL);
-
-  conns = g_key_file_get_groups (bookmarks, &length);
-  for (i=0; i<length; i++)
-    {
-      conn = vinagre_connection_new ();
-      vinagre_connection_set_name (conn, conns[i]);
-
-      s_value = g_key_file_get_string (bookmarks, conns[i], "host", NULL);
-      vinagre_connection_set_host (conn, s_value);
-      g_free (s_value);
-
-      i_value = g_key_file_get_integer (bookmarks, conns[i], "port", NULL);
-      vinagre_connection_set_port (conn, i_value);
-
-      list = g_list_append (list, conn);
-    }
-  g_strfreev (conns);
-
-  return list;
-}
-
 gboolean
-vinagre_bookmarks_del (VinagreConnection *conn,
-		       VinagreWindow     *window)
+vinagre_bookmarks_del (VinagreBookmarks  *book,
+                       VinagreConnection *conn,
+		       GtkWindow         *window)
 {
   gint       result;
   GtkWidget *dialog;
   gchar     *name;
   GError    *error = NULL;
 
-  g_return_val_if_fail (bookmarks != NULL, FALSE);
+  g_return_val_if_fail (VINAGRE_IS_BOOKMARKS (book), FALSE);
   g_return_val_if_fail (VINAGRE_IS_CONNECTION (conn), FALSE);
-  g_return_val_if_fail (VINAGRE_IS_WINDOW (window), FALSE);
 
   name = vinagre_connection_get_best_name (conn);
-  if (!g_key_file_has_group (bookmarks, name))
+  if (!g_key_file_has_group (book->priv->file, name))
     {
       g_free (name);
       return FALSE;
     }
 
-  dialog = gtk_message_dialog_new (GTK_WINDOW (window),
+  dialog = gtk_message_dialog_new (window,
 				   GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
 				   GTK_MESSAGE_QUESTION,
 				   GTK_BUTTONS_OK_CANCEL,
@@ -297,7 +319,7 @@
 
   if (result == GTK_RESPONSE_OK)
     {
-      g_key_file_remove_group (bookmarks, name, &error);
+      g_key_file_remove_group (book->priv->file, name, &error);
       if (error)
 	{
 	  g_warning (_("Error while removing %s from bookmarks: %s"),
@@ -307,7 +329,7 @@
 	  g_free (name);
 	  return FALSE;
 	}
-      vinagre_bookmarks_save_file ();
+      vinagre_bookmarks_del_conn (book, conn);
     }
 
   g_free (name);
@@ -315,49 +337,161 @@
 }
 
 VinagreConnection *
-vinagre_bookmarks_exists (const char *host, int port)
+vinagre_bookmarks_exists (VinagreBookmarks *book,
+                          const gchar *host,
+                          gint port)
 {
   VinagreConnection *conn = NULL;
-  gsize length, i;
-  gchar **conns = NULL;
-  gchar *s_host = NULL;
-  gint  i_port;
+  GSList *l, *next;
 
-  g_return_val_if_fail (bookmarks != NULL, NULL);
+  g_return_val_if_fail (VINAGRE_IS_BOOKMARKS (book), NULL);
 
-  conns = g_key_file_get_groups (bookmarks, &length);
-  for (i=0; i<length; i++)
+  for (l = book->priv->conns; l; l = next)
     {
-      s_host = g_key_file_get_string (bookmarks, conns[i], "host", NULL);
-      i_port = g_key_file_get_integer (bookmarks, conns[i], "port", NULL);
+      VinagreConnection *con = VINAGRE_CONNECTION (l->data);
 
-      if ( (g_str_equal (host, s_host)) && (port == i_port) )
-	{
-	  conn = vinagre_connection_new ();
-	  vinagre_connection_set_name (conn, conns[i]);
+      if ( (g_str_equal (host, vinagre_connection_get_host (con))) &&
+            (port == vinagre_connection_get_port (con) ) )
+        {
+          conn = vinagre_connection_clone (con);
+          break;
+        }
+      next = l->next;
+    }
+  
+  return conn;
+}
+
+GSList *
+vinagre_bookmarks_get_all (VinagreBookmarks *book)
+{
+  g_return_val_if_fail (VINAGRE_IS_BOOKMARKS (book), NULL);
+
+  return book->priv->conns;
+}
+
+static gchar *
+filename (void)
+{
+  return g_build_filename (g_get_home_dir (),
+			   ".gnome2",
+			   VINAGRE_BOOKMARKS_FILE,
+			   NULL);
+}
 
-	  vinagre_connection_set_host (conn, host);
-	  vinagre_connection_set_port (conn, port);
+static void
+vinagre_bookmarks_init_file (VinagreBookmarks *book)
+{
+  gchar    *file;
+  gboolean loaded = TRUE;
+  GError   *error = NULL;
 
-	  g_free (s_host);
-	  s_host = NULL;
+  book->priv->file = g_key_file_new ();
 
-	  break;
+  file = filename ();
+
+  if (g_file_test (file, G_FILE_TEST_EXISTS))
+    loaded = g_key_file_load_from_file (book->priv->file,
+					file,
+					G_KEY_FILE_NONE,
+					&error);
+  g_free (file);
+
+  if (!loaded)
+    {
+      if (error)
+	{
+	  g_warning (_("Error while initializing bookmarks: %s"), error->message);
+	  g_error_free (error);
 	}
+    }
+}
 
-      if (s_host)
-        {
-	  g_free (s_host);
-          s_host = NULL;
-        }
+static void
+vinagre_bookmarks_save_file (VinagreBookmarks *book)
+{
+  gchar    *file;
+  gchar    *data;
+  gsize    length;
+  GError   *error;
+
+  error = NULL;
+  data = g_key_file_to_data (book->priv->file,
+			     &length,
+			     &error);
+  if (!data)
+    {
+      if (error)
+	{
+	  g_warning (_("Error while saving bookmarks: %s"), error->message);
+	  g_error_free (error);
+	}
+
+      return;
+
+    }
+
+  file  = filename ();
+  error = NULL;
+
+  if (!g_file_set_contents (file,
+			    data,
+			    length,
+			    &error))
+    {
+      if (error)
+	{
+	  g_warning (_("Error while saving bookmarks: %s"), error->message);
+	  g_error_free (error);
+          g_free (file);
+          g_free (data);
+          return;
+	}
     }
 
-  if (s_host)
-    g_free (s_host);
+  g_free (file);
+  g_free (data);
 
-  if (conns)
-    g_strfreev (conns);
+  g_signal_emit (book, signals[BOOKMARK_CHANGED], 0);
+}
 
-  return conn;
+static void
+vinagre_bookmarks_clear_conns (VinagreBookmarks *book)
+{
+  g_slist_foreach (book->priv->conns, (GFunc) g_object_unref, NULL);
+  g_slist_free (book->priv->conns);
+
+  book->priv->conns = NULL;
+}
+
+static void
+vinagre_bookmarks_update_conns (VinagreBookmarks *book)
+{
+  gsize length, i;
+  gchar **conns;
+
+  vinagre_bookmarks_clear_conns (book);
+
+  conns = g_key_file_get_groups (book->priv->file, &length);
+  for (i=0; i<length; i++)
+    {
+      VinagreConnection *conn;
+      gchar *s_value;
+      gint i_value;
+
+      conn = vinagre_connection_new ();
+      vinagre_connection_set_name (conn, conns[i]);
+
+      s_value = g_key_file_get_string (book->priv->file, conns[i], "host", NULL);
+      vinagre_connection_set_host (conn, s_value);
+      g_free (s_value);
+
+      i_value = g_key_file_get_integer (book->priv->file, conns[i], "port", NULL);
+      vinagre_connection_set_port (conn, i_value);
+
+      book->priv->conns = g_slist_prepend (book->priv->conns, conn);
+    }
+
+  g_strfreev (conns);
 }
 /* vim: ts=8 */

Modified: branches/unstable/src/vinagre-bookmarks.h
==============================================================================
--- branches/unstable/src/vinagre-bookmarks.h	(original)
+++ branches/unstable/src/vinagre-bookmarks.h	Fri Mar 21 13:17:50 2008
@@ -2,7 +2,7 @@
  * vinagre-bookmarks.h
  * This file is part of vinagre
  *
- * Copyright (C) 2007  Jonh Wendell <wendell bani com br>
+ * Copyright (C) 2007,2008  Jonh Wendell <wendell bani com br>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -18,26 +18,61 @@
  * along with this program. If not, see <http://www.gnu.org/licenses/>.
  */
 
-#ifndef __VINAGRE_FAVORITES_H__
-#define __VINAGRE_FAVORITES_H__
+#ifndef __VINAGRE_BOOKMARKS_H__
+#define __VINAGRE_BOOKMARKS_H__
 
 #include <glib.h>
 
 #include "vinagre-connection.h"
+
+G_BEGIN_DECLS
+
+#define VINAGRE_TYPE_BOOKMARKS             (vinagre_bookmarks_get_type ())
+#define VINAGRE_BOOKMARKS(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), VINAGRE_TYPE_BOOKMARKS, VinagreBookmarks))
+#define VINAGRE_BOOKMARKS_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), VINAGRE_TYPE_BOOKMARKS, VinagreBookmarksClass))
+#define VINAGRE_IS_BOOKMARKS(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VINAGRE_TYPE_BOOKMARKS))
+#define VINAGRE_IS_BOOKMARKS_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass), VINAGRE_TYPE_BOOKMARKS))
+#define VINAGRE_BOOKMARKS_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), VINAGRE_TYPE_BOOKMARKS, VinagreBookmarksClass))
+
+typedef struct _VinagreBookmarksClass   VinagreBookmarksClass;
+typedef struct _VinagreBookmarks        VinagreBookmarks;
+typedef struct _VinagreBookmarksPrivate VinagreBookmarksPrivate;
+
+struct _VinagreBookmarksClass
+{
+  GObjectClass parent_class;
+
+  /* Signals */
+  void (* changed) (VinagreBookmarks *book);
+};
+
+struct _VinagreBookmarks
+{
+  GObject parent_instance;
+  VinagreBookmarksPrivate *priv;
+};
+
 #include "vinagre-window.h"
 
-void			vinagre_bookmarks_init		(void);
-void			vinagre_bookmarks_finalize	(void);
+GType vinagre_bookmarks_get_type (void) G_GNUC_CONST;
 
-gboolean		vinagre_bookmarks_add		(VinagreConnection *conn,
-							 VinagreWindow     *window);
-gboolean		vinagre_bookmarks_del		(VinagreConnection *conn,
-							 VinagreWindow     *window);
-gboolean		vinagre_bookmarks_edit		(VinagreConnection *conn,
-							 VinagreWindow     *window);
+VinagreBookmarks   *vinagre_bookmarks_get_default (void);
 
-GList			*vinagre_bookmarks_get_all	(void);
-VinagreConnection	*vinagre_bookmarks_exists	(const char *host, int port);
+gboolean            vinagre_bookmarks_add   (VinagreBookmarks  *book,
+                                             VinagreConnection *conn,
+                                             GtkWindow         *window);
+gboolean            vinagre_bookmarks_del   (VinagreBookmarks  *book,
+                                             VinagreConnection *conn,
+                                             GtkWindow         *window);
+gboolean            vinagre_bookmarks_edit  (VinagreBookmarks  *book,
+                                             VinagreConnection *conn,
+                                             GtkWindow         *window);
+
+GSList             *vinagre_bookmarks_get_all (VinagreBookmarks *book);
+VinagreConnection  *vinagre_bookmarks_exists  (VinagreBookmarks *book,
+                                               const gchar *host,
+                                               gint port);
 
-#endif  /* __VINAGRE_FAVORITES_H__ */
+G_END_DECLS
+#endif  /* __VINAGRE_BOOKMARKS_H__ */
 /* vim: ts=8 */

Modified: branches/unstable/src/vinagre-commands.c
==============================================================================
--- branches/unstable/src/vinagre-commands.c	(original)
+++ branches/unstable/src/vinagre-commands.c	Fri Mar 21 13:17:50 2008
@@ -246,18 +246,18 @@
   VinagreConnection *conn;
   gchar             *name;
 
+  g_return_if_fail (VINAGRE_IS_WINDOW (window));
+
   conn = vinagre_tab_get_conn (VINAGRE_TAB (window->priv->active_tab));
-  g_return_if_fail (conn != NULL);
+  g_return_if_fail (VINAGRE_IS_CONNECTION (conn));
 
-  name = vinagre_connection_get_best_name (conn);
+  vinagre_bookmarks_add (window->priv->book,
+                         conn,
+                         GTK_WINDOW (window));
 
-  vinagre_bookmarks_add (conn, window);
+  name = vinagre_connection_get_best_name (conn);
   vinagre_tab_set_title (VINAGRE_TAB (window->priv->active_tab),
 			 name);
-
-  vinagre_fav_update_list (VINAGRE_FAV (window->priv->fav_panel));
-  vinagre_window_update_bookmarks_list_menu (window);
-
   g_free (name);
 }
 
@@ -265,20 +265,31 @@
 vinagre_cmd_bookmarks_edit (GtkAction     *action,
 			    VinagreWindow *window)
 {
-  g_return_if_fail (window->priv->fav_conn_selected != NULL);
+  g_return_if_fail (VINAGRE_IS_WINDOW (window));
+  g_return_if_fail (VINAGRE_IS_CONNECTION (window->priv->fav_conn_selected));
 
-  if (vinagre_bookmarks_edit (window->priv->fav_conn_selected, window))
-    {
-      vinagre_fav_update_list (VINAGRE_FAV (window->priv->fav_panel));
-      vinagre_window_update_bookmarks_list_menu (window);
-    }
+  vinagre_bookmarks_edit (window->priv->book,
+                          window->priv->fav_conn_selected,
+                          GTK_WINDOW (window));
+}
+
+void
+vinagre_cmd_bookmarks_del (GtkAction     *action,
+			   VinagreWindow *window)
+{
+  g_return_if_fail (VINAGRE_IS_WINDOW (window));
+  g_return_if_fail (VINAGRE_IS_CONNECTION (window->priv->fav_conn_selected));
+
+  vinagre_bookmarks_del (window->priv->book,
+                         window->priv->fav_conn_selected,
+                         GTK_WINDOW (window));
 }
 
 void
 vinagre_cmd_bookmarks_open (GtkAction     *action,
 			    VinagreWindow *window)
 {
-  VinagreConnection *conn = NULL;
+  VinagreConnection *conn;
 
   g_return_if_fail (VINAGRE_IS_WINDOW (window));
 
@@ -286,24 +297,11 @@
   if (!conn)
     conn = window->priv->fav_conn_selected;
 
-  g_return_if_fail (conn != NULL);
+  g_return_if_fail (VINAGRE_IS_CONNECTION (conn));
 
   vinagre_cmd_open_bookmark (window, conn);
 }
 
-void
-vinagre_cmd_bookmarks_del (GtkAction     *action,
-			   VinagreWindow *window)
-{
-  g_return_if_fail (window->priv->fav_conn_selected != NULL);
-
-  if (vinagre_bookmarks_del (window->priv->fav_conn_selected, window))
-    {
-      vinagre_fav_update_list (VINAGRE_FAV (window->priv->fav_panel));
-      vinagre_window_update_bookmarks_list_menu (window);
-    }
-}
-
 /* Make url in about dialog clickable */
 static void
 vinagre_about_dialog_handle_url (GtkAboutDialog *about,

Modified: branches/unstable/src/vinagre-connect.c
==============================================================================
--- branches/unstable/src/vinagre-connect.c	(original)
+++ branches/unstable/src/vinagre-connect.c	Fri Mar 21 13:17:50 2008
@@ -109,7 +109,9 @@
 
       gtk_widget_hide (GTK_WIDGET (dialog.dialog));
 
-      conn = vinagre_bookmarks_exists (host, port);
+      conn = vinagre_bookmarks_exists (vinagre_window_get_bookmarks (window),
+                                       host,
+                                       port);
       if (!conn)
 	{
 	  conn = vinagre_connection_new ();

Modified: branches/unstable/src/vinagre-connection.c
==============================================================================
--- branches/unstable/src/vinagre-connection.c	(original)
+++ branches/unstable/src/vinagre-connection.c	Fri Mar 21 13:17:50 2008
@@ -53,6 +53,8 @@
 #define VINAGRE_CONNECTION_PRIVATE(o)  (G_TYPE_INSTANCE_GET_PRIVATE ((o), VINAGRE_TYPE_CONNECTION, VinagreConnectionPrivate))
 G_DEFINE_TYPE (VinagreConnection, vinagre_connection, G_TYPE_OBJECT);
 
+static VinagreBookmarks *main_bookmark = NULL;
+
 static void
 vinagre_connection_init (VinagreConnection *conn)
 {
@@ -64,6 +66,8 @@
   conn->priv->password = NULL;
   conn->priv->name = NULL;
   conn->priv->desktop_name = NULL;
+
+  //main_bookmark = vinagre_bookmarks_get_default ();
 }
 
 static void
@@ -465,7 +469,7 @@
   host = server[0];
   port = server[1] ? atoi (server[1]) : 5900;
 
-  conn = vinagre_bookmarks_exists (host, port);
+  conn = vinagre_bookmarks_exists (main_bookmark, host, port);
   if (!conn)
     {
       conn = vinagre_connection_new ();
@@ -528,7 +532,7 @@
       port = g_key_file_get_integer (file, "connection", "port", NULL);
       if (host)
 	{
-	  conn = vinagre_bookmarks_exists (host, port);
+	  conn = vinagre_bookmarks_exists (main_bookmark, host, port);
 	  if (!conn)
 	    {
 	      conn = vinagre_connection_new ();

Modified: branches/unstable/src/vinagre-fav.c
==============================================================================
--- branches/unstable/src/vinagre-fav.c	(original)
+++ branches/unstable/src/vinagre-fav.c	Fri Mar 21 13:17:50 2008
@@ -35,6 +35,7 @@
   VinagreWindow *window;
   GtkWidget     *tree;
   GtkTreeModel  *model;
+  VinagreConnection *conn_selected;
 };
 
 G_DEFINE_TYPE(VinagreFav, vinagre_fav, GTK_TYPE_VBOX)
@@ -68,8 +69,6 @@
 static void
 vinagre_fav_finalize (GObject *object)
 {
-//  VinagreFav *fav = VINAGRE_FAV (object);
-
   G_OBJECT_CLASS (vinagre_fav_parent_class)->finalize (object);
 }
 
@@ -193,6 +192,8 @@
 			  -1);
     }
 
+  fav->priv->conn_selected = conn;
+
   /* Emits the signal saying that user has selected a bookmark */
   g_signal_emit (G_OBJECT (fav), 
 		 signals[FAV_SELECTED],
@@ -345,6 +346,26 @@
   return FALSE;
 }
 
+static gboolean
+vinagre_fav_tooltip (GtkWidget *widget,
+                     gint x, gint y, gboolean k,
+                     GtkTooltip *tooltip,
+                     VinagreFav *fav)
+{
+  gchar *tip;
+
+  if (!VINAGRE_IS_CONNECTION (fav->priv->conn_selected))
+    return FALSE;
+
+  tip = g_markup_printf_escaped (
+				  "<b>%s</b> %s\n"
+				  "<b>%s</b> %d",
+				  _("Host:"), vinagre_connection_get_host (fav->priv->conn_selected),
+				  _("Port:"), vinagre_connection_get_port (fav->priv->conn_selected));
+
+  gtk_tooltip_set_markup (tooltip, tip);
+  g_free (tip);
+}
 
 static void
 vinagre_fav_create_tree (VinagreFav *fav)
@@ -406,10 +427,16 @@
 		    G_CALLBACK (fav_popup_menu),
 		    fav);
 
+  gtk_widget_set_has_tooltip (fav->priv->tree, TRUE);
+  g_signal_connect (fav->priv->tree,
+		    "query-tooltip",
+		    G_CALLBACK (vinagre_fav_tooltip),
+		    fav);
 
-  vinagre_fav_update_list (fav);
+  g_idle_add ((GSourceFunc)vinagre_fav_update_list, fav);
 
   gtk_container_add (GTK_CONTAINER(scroll), fav->priv->tree);
+
   gtk_widget_show (fav->priv->tree);
   g_object_unref (G_OBJECT (fav->priv->model));
 }
@@ -431,6 +458,7 @@
   GtkWidget *label_box, *label, *close_button;
 
   fav->priv = VINAGRE_FAV_GET_PRIVATE (fav);
+  fav->priv->conn_selected = NULL;
 
   /* setup label */
   label_box = gtk_hbox_new (FALSE, 0);
@@ -451,6 +479,11 @@
 
   /* setup the tree */
   vinagre_fav_create_tree (fav);
+
+  g_signal_connect_swapped (vinagre_bookmarks_get_default (),
+                            "changed",
+                            G_CALLBACK (vinagre_fav_update_list),
+                            fav);
 }
 
 GtkWidget *
@@ -463,27 +496,32 @@
 				   NULL));
 }
 
-void
+gboolean
 vinagre_fav_update_list (VinagreFav *fav)
 {
   GtkTreeIter        iter;
   GtkListStore      *store;
-  GList             *list;
-  VinagreConnection *conn;
-  gchar             *name;
+  GSList            *list, *l, *next;
   GdkPixbuf         *pixbuf;
-
-  g_return_if_fail (VINAGRE_IS_FAV (fav));
+    
+  g_return_val_if_fail (VINAGRE_IS_FAV (fav), FALSE);
 
   store = GTK_LIST_STORE (fav->priv->model);
   gtk_list_store_clear (store);
 
-  list = vinagre_bookmarks_get_all ();
-  while (list)
+  list = vinagre_bookmarks_get_all (vinagre_bookmarks_get_default ());
+
+  for (l = list; l; l = next)
     {
-      conn = (VinagreConnection *) list->data;
-      name = vinagre_connection_get_best_name (conn);
+      gchar *name = NULL;
+      VinagreConnection *conn;
 
+      next = l->next;
+
+      conn = (VinagreConnection *) l->data;
+      g_assert (VINAGRE_IS_CONNECTION (conn));
+
+      name = vinagre_connection_get_best_name (conn);
       pixbuf = vinagre_connection_get_icon (conn);
 
       gtk_list_store_append (store, &iter);
@@ -492,12 +530,12 @@
                           NAME_COL, name,
                           CONN_COL, conn,
                           -1);
-      list = list->next;
-      g_free (name);
+      if (name)
+        g_free (name);
       if (pixbuf != NULL)
 	g_object_unref (pixbuf);
     }
 
-  g_list_free (list);
+  return FALSE;
 }
 /* vim: ts=8 */

Modified: branches/unstable/src/vinagre-fav.h
==============================================================================
--- branches/unstable/src/vinagre-fav.h	(original)
+++ branches/unstable/src/vinagre-fav.h	Fri Mar 21 13:17:50 2008
@@ -61,7 +61,7 @@
 
 GtkWidget 	*vinagre_fav_new 		(VinagreWindow *window);
 
-void		vinagre_fav_update_list		(VinagreFav *fav);
+gboolean	vinagre_fav_update_list		(VinagreFav *fav);
 
 G_END_DECLS
 

Modified: branches/unstable/src/vinagre-window-private.h
==============================================================================
--- branches/unstable/src/vinagre-window-private.h	(original)
+++ branches/unstable/src/vinagre-window-private.h	Fri Mar 21 13:17:50 2008
@@ -23,6 +23,7 @@
 
 #include "vinagre-window.h"
 #include "vinagre-connection.h"
+#include "vinagre-bookmarks.h"
 
 G_BEGIN_DECLS
 
@@ -55,6 +56,7 @@
 
   GtkWidget       *active_tab;
   VinagreConnection *fav_conn_selected;
+  VinagreBookmarks  *book;
 	
   gint            width;
   gint            height;

Modified: branches/unstable/src/vinagre-window.c
==============================================================================
--- branches/unstable/src/vinagre-window.c	(original)
+++ branches/unstable/src/vinagre-window.c	Fri Mar 21 13:17:50 2008
@@ -62,9 +62,6 @@
       window->priv->manager = NULL;
     }
 
-
-  vinagre_bookmarks_finalize ();
-
   G_OBJECT_CLASS (vinagre_window_parent_class)->finalize (object);
 }
 
@@ -542,13 +539,10 @@
 vinagre_window_update_bookmarks_list_menu (VinagreWindow *window)
 {
   VinagreWindowPrivate *p = window->priv;
-  GList                *actions, *l, *favs;
-  gint                  n, i;
-  guint                 id;
-  VinagreConnection    *conn;
-  gchar                *action_name, *action_label;
-  GtkAction            *action;
-  gchar                *name, *tooltip;
+  GList  *actions, *l;
+  GSList *favs;
+  gint   n, i;
+  guint  id;
 
   g_return_if_fail (p->bookmarks_list_action_group != NULL);
 
@@ -564,40 +558,41 @@
       gtk_action_group_remove_action (p->bookmarks_list_action_group,
 				      GTK_ACTION (l->data));
     }
-    g_list_free (actions);
+  g_list_free (actions);
 
   /* Get the bookmarks from file */
-  favs = vinagre_bookmarks_get_all ();
-  n = g_list_length (favs);
+  favs = vinagre_bookmarks_get_all (window->priv->book);
+  n = g_slist_length (favs);
   i = 0;
 
   id = (n > 0) ? gtk_ui_manager_new_merge_id (p->manager) : 0;
 
   while (favs)
     {
+      VinagreConnection *conn;
+      gchar             *action_name, *action_label;
+      GtkAction         *action;
+      gchar             *name, *tooltip;
+
       conn = (VinagreConnection *) favs->data;
+      g_assert (VINAGRE_IS_CONNECTION (conn));
+
       name = vinagre_connection_get_best_name (conn);
 
-      action_name = g_strdup_printf ("Fav_%d", i);
+      action_name = g_strdup_printf ("Bookmark_%d", i);
       /* Translators: This is server:port, a statusbar tooltip when mouse is over a bookmark item on menu */
       tooltip = g_strdup_printf (_("Open %s:%d"),
                                  vinagre_connection_get_host (conn),
                                  vinagre_connection_get_port (conn));
-      action_label = vinagre_utils_escape_underscores (
-		     name,
-		     -1);
+      action_label = vinagre_utils_escape_underscores (name, -1);
       action = gtk_action_new (action_name,
 			       action_label,
 			       tooltip,
 			       NULL);
       g_object_set (G_OBJECT (action), "icon-name", "application-x-vnc", NULL);
-      g_object_set_data_full (G_OBJECT (action),
-			      "conn",
-			      conn,
-			      (GDestroyNotify) g_object_unref);
+      g_object_set_data (G_OBJECT (action), "conn", conn);
       gtk_action_group_add_action (p->bookmarks_list_action_group,
 				   GTK_ACTION (action));
-
       g_signal_connect (action,
 			"activate",
 			G_CALLBACK (vinagre_cmd_bookmarks_open),
@@ -620,8 +615,6 @@
       i++;
     }
 
-  g_list_free (favs);
-
   p->bookmarks_list_menu_ui_id = id;
 }
 
@@ -909,7 +902,7 @@
   window->priv->signal_notebook = 0;
   window->priv->machines_connected = 0;
 
-  vinagre_bookmarks_init ();
+  window->priv->book = vinagre_bookmarks_get_default ();
 
   main_box = gtk_vbox_new (FALSE, 0);
   gtk_container_add (GTK_CONTAINER (window), main_box);
@@ -943,6 +936,11 @@
   set_machine_menu_sensitivity (window);
 
   vinagre_window_update_bookmarks_list_menu (window);
+  g_signal_connect_swapped (window->priv->book,
+                            "changed",
+                            G_CALLBACK (vinagre_window_update_bookmarks_list_menu),
+                            window);
+
   vinagre_window_init_clipboard (window);
 }
 
@@ -1073,13 +1071,22 @@
 }
 
 VinagreTab *
-vinagre_window_get_active_tab	(VinagreWindow *window)
+vinagre_window_get_active_tab (VinagreWindow *window)
 {
   g_return_val_if_fail (VINAGRE_IS_WINDOW (window), NULL);
 
   return VINAGRE_TAB (window->priv->active_tab);
 }
 
+VinagreBookmarks *
+vinagre_window_get_bookmarks (VinagreWindow *window)
+{
+  g_return_val_if_fail (VINAGRE_IS_WINDOW (window), NULL);
+
+  return window->priv->book;
+}
+
+
 GtkUIManager *
 vinagre_window_get_ui_manager (VinagreWindow *window)
 {

Modified: branches/unstable/src/vinagre-window.h
==============================================================================
--- branches/unstable/src/vinagre-window.h	(original)
+++ branches/unstable/src/vinagre-window.h	Fri Mar 21 13:17:50 2008
@@ -38,6 +38,7 @@
 typedef struct _VinagreWindowClass   VinagreWindowClass;
 
 #include "vinagre-tab.h"
+#include "vinagre-bookmarks.h"
 
 struct _VinagreWindow 
 {
@@ -78,6 +79,7 @@
 GtkWidget	*vinagre_window_get_notebook		(VinagreWindow	       *window);
 GtkActionGroup	*vinagre_window_get_main_action		(VinagreWindow         *window);
 GtkActionGroup	*vinagre_window_get_sensitive_action	(VinagreWindow         *window);
+VinagreBookmarks *vinagre_window_get_bookmarks          (VinagreWindow         *window);
 
 void		vinagre_window_update_bookmarks_list_menu (VinagreWindow       *window);
 



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