vinagre r285 - in branches/unstable: . data src



Author: jwendell
Date: Thu Apr 10 01:46:20 2008
New Revision: 285
URL: http://svn.gnome.org/viewvc/vinagre?rev=285&view=rev

Log:
2008-04-09  Jonh Wendell <jwendell gnome org>

	Show avahi-found hosts in side panel and bookmark menu. Closes #512918.
	
	* configure.ac:
	 - Bump avahi dependency to 0.6.22
	 - Avahi dependency is mandatory now
	 - Also depends on avahi-gobject
	* src/vinagre-mdns.[ch]: New files, mdns class
	* vinagre-window.[ch],
	* vinagre-fav.c: Make use of new mdns class


Added:
   branches/unstable/src/vinagre-mdns.c
   branches/unstable/src/vinagre-mdns.h
Modified:
   branches/unstable/   (props changed)
   branches/unstable/ChangeLog
   branches/unstable/configure.ac
   branches/unstable/data/vinagre-ui.xml
   branches/unstable/src/   (props changed)
   branches/unstable/src/Makefile.am
   branches/unstable/src/vinagre-bookmarks.c
   branches/unstable/src/vinagre-commands.c
   branches/unstable/src/vinagre-connect.c
   branches/unstable/src/vinagre-fav.c
   branches/unstable/src/vinagre-window-private.h
   branches/unstable/src/vinagre-window.c
   branches/unstable/src/vinagre-window.h

Modified: branches/unstable/configure.ac
==============================================================================
--- branches/unstable/configure.ac	(original)
+++ branches/unstable/configure.ac	Thu Apr 10 01:46:20 2008
@@ -39,6 +39,7 @@
 GCONF_REQUIRED=2.16.0
 GTHREAD_REQUIRED=2.0.0
 GTK_VNC_REQUIRED=0.3.4
+AVAHI_REQUIRED=0.6.22
 
 PKG_CHECK_MODULES(VINAGRE, \ 
   glib-2.0 >= $GLIB_REQUIRED \
@@ -48,7 +49,9 @@
   gconf-2.0 >= $GCONF_REQUIRED \
   gthread-2.0 >= $GTHREAD_REQUIRED \
   gnome-keyring-1 \
-  gtk-vnc-1.0 >= $GTK_VNC_REQUIRED)
+  gtk-vnc-1.0 >= $GTK_VNC_REQUIRED \
+  avahi-ui >= $AVAHI_REQUIRED \
+  avahi-gobject >= $AVAHI_REQUIRED)
 AC_SUBST(VINAGRE_CFLAGS)
 AC_SUBST(VINAGRE_LIBS)
 
@@ -60,32 +63,6 @@
 AM_GCONF_SOURCE_2
 
 
-#*******************************************************************************
-# Check for Avahi
-#*******************************************************************************
-
-AVAHI_REQUIRED=0.6.18
-
-AC_ARG_ENABLE(avahi,
-        AS_HELP_STRING([--enable-avahi],[Enable use of avahi]),
-        [case "${enableval}" in
-                yes) VINAGRE_ENABLE_AVAHI=yes ;;
-                no)  VINAGRE_ENABLE_AVAHI=no ;;
-                *) AC_MSG_ERROR(bad value ${enableval} for --enable-avahi) ;;
-        esac],
-        [VINAGRE_ENABLE_AVAHI=no])
-
-AVAHI_CFLAGS=
-AVAHI_LIBS=
-if test "x$VINAGRE_ENABLE_AVAHI" = "xyes" ; then
-    PKG_CHECK_MODULES(AVAHI,
-		      [avahi-ui >= $AVAHI_REQUIRED])
-    AVAHI_CFLAGS="$AVAHI_CFLAGS -DVINAGRE_HAVE_AVAHI"
-fi
-AC_SUBST(AVAHI_CFLAGS)
-AC_SUBST(AVAHI_LIBS)
-AM_CONDITIONAL(VINAGRE_AVAHI, [test "x$VINAGRE_ENABLE_AVAHI" = "xyes"])
-
 dnl define a MAINT-like variable REBUILD which is set
 dnl if Perl, so autogenerated sources can be rebuilt
 AC_PATH_PROGS(PERL, perl5 perl)
@@ -121,6 +98,4 @@
 
 	Compiler ...................:  ${CC} 
 	Compiler Flags .............:  ${CFLAGS}
-
-	Avahi support ..............:  ${VINAGRE_ENABLE_AVAHI}
 "

Modified: branches/unstable/data/vinagre-ui.xml
==============================================================================
--- branches/unstable/data/vinagre-ui.xml	(original)
+++ branches/unstable/data/vinagre-ui.xml	Thu Apr 10 01:46:20 2008
@@ -51,6 +51,8 @@
       <menuitem name="BookmarksDelMenu" action="BookmarksDel"/>
       <separator/>
       <placeholder name="BookmarksList"/>
+      <separator/>
+      <placeholder name="AvahiList"/>
     </menu>
 
     <menu name="HelpMenu" action="Help">

Modified: branches/unstable/src/Makefile.am
==============================================================================
--- branches/unstable/src/Makefile.am	(original)
+++ branches/unstable/src/Makefile.am	Thu Apr 10 01:46:20 2008
@@ -9,7 +9,6 @@
 	-DVINAGRE_DATADIR=\""$(datadir)/vinagre"\"	\
 	-DPACKAGE_LOCALE_DIR=\""$(datadir)/locale"\"	\
 	$(VINAGRE_CFLAGS)				\
-	$(AVAHI_CFLAGS)					\
 	$(NULL)
 
 bin_PROGRAMS = vinagre
@@ -29,12 +28,12 @@
 	vinagre-ui.h vinagre-window-private.h		\
 	vinagre-enums.h vinagre-enums.c			\
 	gossip-cell-renderer-expander.c gossip-cell-renderer-expander.h \
+	vinagre-mdns.h vinagre-mdns.c \
 	$(NULL)
 
 vinagre_LDADD = \
 	$(VINAGRE_LIBS)		\
 	$(GTKVNC_LIBS)		\
-	$(AVAHI_LIBS)		\
 	$(NULL)
 
 vinagre_enum_headers = \

Modified: branches/unstable/src/vinagre-bookmarks.c
==============================================================================
--- branches/unstable/src/vinagre-bookmarks.c	(original)
+++ branches/unstable/src/vinagre-bookmarks.c	Thu Apr 10 01:46:20 2008
@@ -42,7 +42,7 @@
 };
 
 #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;

Modified: branches/unstable/src/vinagre-commands.c
==============================================================================
--- branches/unstable/src/vinagre-commands.c	(original)
+++ branches/unstable/src/vinagre-commands.c	Thu Apr 10 01:46:20 2008
@@ -263,7 +263,7 @@
   conn = vinagre_tab_get_conn (VINAGRE_TAB (tab));
   g_return_if_fail (VINAGRE_IS_CONNECTION (conn));
 
-  vinagre_bookmarks_add (window->priv->book,
+  vinagre_bookmarks_add (vinagre_bookmarks_get_default (),
                          conn,
                          GTK_WINDOW (window));
 
@@ -283,7 +283,7 @@
   g_return_if_fail (VINAGRE_IS_WINDOW (window));
   g_return_if_fail (VINAGRE_IS_CONNECTION (window->priv->fav_conn_selected));
 
-  vinagre_bookmarks_edit (window->priv->book,
+  vinagre_bookmarks_edit (vinagre_bookmarks_get_default (),
                           window->priv->fav_conn_selected,
                           GTK_WINDOW (window));
 }
@@ -295,7 +295,7 @@
   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,
+  vinagre_bookmarks_del (vinagre_bookmarks_get_default (),
                          window->priv->fav_conn_selected,
                          GTK_WINDOW (window));
 }

Modified: branches/unstable/src/vinagre-connect.c
==============================================================================
--- branches/unstable/src/vinagre-connect.c	(original)
+++ branches/unstable/src/vinagre-connect.c	Thu Apr 10 01:46:20 2008
@@ -22,19 +22,12 @@
 #include <glib/gi18n.h>
 #include <glib.h>
 #include <glade/glade.h>
+#include <avahi-ui/avahi-ui.h>
 
 #include "vinagre-connect.h"
 #include "vinagre-utils.h"
 #include "vinagre-bookmarks.h"
 
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#ifdef VINAGRE_HAVE_AVAHI
-#include <avahi-ui/avahi-ui.h>
-#endif
-
 typedef struct {
   GladeXML  *xml;
   GtkWidget *dialog;
@@ -43,7 +36,6 @@
   GtkWidget *find_button;
 } VinagreConnectDialog;
 
-#ifdef VINAGRE_HAVE_AVAHI
 static void
 vinagre_connect_find_button_cb (GtkButton            *button,
 				VinagreConnectDialog *dialog)
@@ -73,7 +65,6 @@
 
   gtk_widget_destroy (d);
 }
-#endif
 
 VinagreConnection *vinagre_connect (VinagreWindow *window)
 {
@@ -91,13 +82,11 @@
   dialog.port_entry  = glade_xml_get_widget (dialog.xml, "port_entry");
   dialog.find_button = glade_xml_get_widget (dialog.xml, "find_button");
 
-#ifdef VINAGRE_HAVE_AVAHI
   gtk_widget_show (dialog.find_button);
   g_signal_connect (dialog.find_button,
 		    "clicked",
 		    G_CALLBACK (vinagre_connect_find_button_cb),
 		    &dialog);
-#endif
 
   gtk_widget_show_all (dialog.dialog);
   result = gtk_dialog_run (GTK_DIALOG (dialog.dialog));
@@ -109,7 +98,7 @@
 
       gtk_widget_hide (GTK_WIDGET (dialog.dialog));
 
-      conn = vinagre_bookmarks_exists (vinagre_window_get_bookmarks (window),
+      conn = vinagre_bookmarks_exists (vinagre_bookmarks_get_default (),
                                        host,
                                        port);
       if (!conn)

Modified: branches/unstable/src/vinagre-fav.c
==============================================================================
--- branches/unstable/src/vinagre-fav.c	(original)
+++ branches/unstable/src/vinagre-fav.c	Thu Apr 10 01:46:20 2008
@@ -26,6 +26,7 @@
 #include "vinagre-fav.h"
 #include "vinagre-utils.h"
 #include "vinagre-bookmarks.h"
+#include "vinagre-mdns.h"
 #include "vinagre-window-private.h"
 #include "gossip-cell-renderer-expander.h"
  
@@ -56,6 +57,7 @@
   CONN_COL,
   IS_FOLDER_COL,
   IS_GROUP_COL,
+  IS_AVAHI_COL,
   NUM_COLS
 };
 
@@ -198,15 +200,20 @@
 {
   GtkTreeIter iter;
   VinagreConnection *conn = NULL;
+  gboolean avahi;
 
   if (gtk_tree_selection_get_selected (selection, NULL, &iter))
     {
       gtk_tree_model_get (fav->priv->model, 
 			  &iter,
-			  CONN_COL, &conn, 
+			  CONN_COL, &conn,
+                          IS_AVAHI_COL, &avahi,
 			  -1);
     }
 
+  if (avahi)
+    conn = NULL;
+
   /* Emits the signal saying that user has selected a bookmark */
   g_signal_emit (G_OBJECT (fav), 
 		 signals[FAV_SELECTED],
@@ -317,7 +324,7 @@
 {
   GtkTreePath *path = NULL;
   GtkTreeIter iter;
-  gboolean folder, group;
+  gboolean folder, group, avahi;
 
   if (!((GDK_BUTTON_PRESS == event->type) && (3 == event->button)))
     return FALSE;
@@ -338,8 +345,9 @@
 		            &iter,
                             IS_FOLDER_COL, &folder,
                             IS_GROUP_COL, &group,
+                            IS_AVAHI_COL, &avahi,
 		            -1);
-        if (folder || group)
+        if (folder || group || avahi)
           {
             gtk_tree_path_free (path);
             return FALSE;
@@ -375,7 +383,7 @@
                      GtkTooltip *tooltip,
                      VinagreFav *fav)
 {
-  gchar *tip;
+  gchar *tip, *name;
   GtkTreePath *path = NULL;
   gint bx, by;
   GtkTreeIter iter;
@@ -408,13 +416,17 @@
   if (folder || group)
     return FALSE;
 
-  tip = g_markup_printf_escaped ("<b>%s</b> %s\n"
-				 "<b>%s</b> %d",
+  name = vinagre_connection_get_best_name (conn);
+  tip = g_markup_printf_escaped ("<b>%s</b>\n"
+                                 "<small><b>%s</b> %s</small>\n"
+				 "<small><b>%s</b> %d</small>",
+                                 name,
 				 _("Host:"), vinagre_connection_get_host (conn),
 				 _("Port:"), vinagre_connection_get_port (conn));
 
   gtk_tooltip_set_markup (tooltip, tip);
   g_free (tip);
+  g_free (name);
 
   return TRUE;
 }
@@ -606,6 +618,7 @@
 							 G_TYPE_STRING,
 							 VINAGRE_TYPE_CONNECTION,
                                                          G_TYPE_BOOLEAN,
+                                                         G_TYPE_BOOLEAN,
                                                          G_TYPE_BOOLEAN));
 
   fav->priv->tree = gtk_tree_view_new_with_model (fav->priv->model);
@@ -711,6 +724,10 @@
                             "changed",
                             G_CALLBACK (vinagre_fav_update_list),
                             fav);
+  g_signal_connect_swapped (vinagre_mdns_get_default (),
+                            "changed",
+                            G_CALLBACK (vinagre_fav_update_list),
+                            fav);
 }
 
 GtkWidget *
@@ -737,6 +754,7 @@
   store = GTK_TREE_STORE (fav->priv->model);
   gtk_tree_store_clear (store);
 
+  /* bookmarks */
   list = vinagre_bookmarks_get_all (vinagre_bookmarks_get_default ());
 
   gtk_tree_store_append (store, &parent_iter, NULL);
@@ -744,6 +762,7 @@
                       NAME_COL, _("Bookmarks"),
                       IS_GROUP_COL, TRUE,
                       IS_FOLDER_COL, FALSE,
+                      IS_AVAHI_COL, FALSE,
                       -1);
 
   for (l = list; l; l = next)
@@ -766,6 +785,7 @@
                           CONN_COL, conn,
                           IS_FOLDER_COL, FALSE,
                           IS_GROUP_COL, FALSE,
+                          IS_AVAHI_COL, FALSE,
                           -1);
       if (name)
         g_free (name);
@@ -777,6 +797,51 @@
   gtk_tree_view_expand_row (GTK_TREE_VIEW (fav->priv->tree), path, FALSE);
   g_free (path);
 
+  /* avahi */
+  list = vinagre_mdns_get_all (vinagre_mdns_get_default ());
+  if (!list)
+    return FALSE;
+
+  gtk_tree_store_append (store, &parent_iter, NULL);
+  gtk_tree_store_set (store, &parent_iter,
+                      NAME_COL, _("Hosts near to me"),
+                      IS_GROUP_COL, TRUE,
+                      IS_FOLDER_COL, FALSE,
+                      IS_AVAHI_COL, FALSE,
+                      -1);
+
+  for (l = list; l; l = next)
+    {
+      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_tree_store_append (store, &iter, &parent_iter);
+      gtk_tree_store_set (store, &iter,
+                          IMAGE_COL, pixbuf,
+                          NAME_COL, name,
+                          CONN_COL, conn,
+                          IS_FOLDER_COL, FALSE,
+                          IS_GROUP_COL, FALSE,
+                          IS_AVAHI_COL, TRUE,
+                          -1);
+      if (name)
+        g_free (name);
+      if (pixbuf != NULL)
+	g_object_unref (pixbuf);
+    }
+
+  path = gtk_tree_path_new_from_string ("1");
+  gtk_tree_view_expand_row (GTK_TREE_VIEW (fav->priv->tree), path, FALSE);
+  g_free (path);
+
   return FALSE;
 }
 /* vim: ts=8 */

Added: branches/unstable/src/vinagre-mdns.c
==============================================================================
--- (empty file)
+++ branches/unstable/src/vinagre-mdns.c	Thu Apr 10 01:46:20 2008
@@ -0,0 +1,243 @@
+/*
+ * vinagre-mdns.c
+ * This file is part of vinagre
+ *
+ * Copyright (C) Jonh Wendell 2008 <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 the
+ * Free Software Foundation, either version 2 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 General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License along
+ * with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "vinagre-mdns.h"
+#include "vinagre-connection.h"
+#include <avahi-gobject/ga-service-browser.h>
+#include <avahi-gobject/ga-service-resolver.h>
+#include <glib/gi18n.h>
+
+struct _VinagreMdnsPrivate
+{
+  GSList           *conns;
+  GaServiceBrowser *browser;
+  GaClient         *client;
+};
+
+enum
+{
+  MDNS_CHANGED,
+  LAST_SIGNAL
+};
+
+G_DEFINE_TYPE (VinagreMdns, vinagre_mdns, G_TYPE_OBJECT);
+
+static VinagreMdns *mdns_singleton = NULL;
+static guint signals[LAST_SIGNAL] = { 0 };
+
+static void
+mdns_resolver_found (GaServiceResolver *resolver,
+                     AvahiIfIndex         iface,
+                     GaProtocol           proto,
+                     gchar               *name,
+                     gchar               *type,
+                     gchar               *domain,
+                     gchar               *host_name,
+                     AvahiAddress        *a,
+                     gint                 port,
+                     AvahiStringList     *txt,
+                     GaLookupResultFlags flags,
+                     VinagreMdns         *mdns)
+{
+  VinagreConnection *conn;
+
+  conn = vinagre_connection_new ();
+  g_object_set (conn,
+                "name", name,
+                "port", port,
+                "host", host_name,
+                NULL);
+
+  mdns->priv->conns = g_slist_prepend (mdns->priv->conns, conn);
+
+  g_object_unref (resolver);
+
+  g_signal_emit (mdns, signals[MDNS_CHANGED], 0);
+}
+
+static void
+mdns_resolver_failure (GaServiceResolver *resolver,
+                       GError            *error,
+                       VinagreMdns       *mdns)
+{
+  g_warning ("%s", error->message);
+  g_object_unref (resolver);
+}
+
+static void
+mdns_browser_new_cb (GaServiceBrowser   *browser,
+                     AvahiIfIndex        iface,
+                     GaProtocol          proto,
+                     gchar              *name,
+                     gchar              *type,
+                     gchar              *domain,
+                     GaLookupResultFlags flags,
+                     VinagreMdns        *mdns)
+{
+  GaServiceResolver *resolver;
+  GError *error = NULL;
+
+  resolver = ga_service_resolver_new (iface,
+                                      proto,
+                                      name,
+                                      type,
+                                      domain,
+                                      GA_PROTOCOL_UNSPEC,
+                                      GA_LOOKUP_NO_FLAGS);
+
+  g_signal_connect (resolver,
+                    "found",
+                    G_CALLBACK (mdns_resolver_found),
+                    mdns);
+  g_signal_connect (resolver,
+                    "failure",
+                    G_CALLBACK (mdns_resolver_failure),
+                    mdns);
+
+  if (!ga_service_resolver_attach (resolver,
+                                   mdns->priv->client,
+                                   &error))
+    {
+      g_warning (_("Failed to resolve avahi hostname: %s\n"), error->message);
+      g_error_free (error);
+    }
+}
+
+static void
+mdns_browser_del_cb (GaServiceBrowser   *browser,
+                     AvahiIfIndex        iface,
+                     GaProtocol          proto,
+                     gchar              *name,
+                     gchar              *type,
+                     gchar              *domain,
+                     GaLookupResultFlags flags,
+                     VinagreMdns        *mdns)
+{
+  GSList *l;
+
+  for (l = mdns->priv->conns; l; l = l->next)
+    {
+      VinagreConnection *conn = VINAGRE_CONNECTION (l->data);
+      if (strcmp (vinagre_connection_get_name (conn), name) == 0)
+        {
+          g_object_unref (conn);
+          mdns->priv->conns = g_slist_remove (mdns->priv->conns, conn);
+          g_signal_emit (mdns, signals[MDNS_CHANGED], 0);
+          return;
+        }
+    }
+}
+
+static void
+vinagre_mdns_init (VinagreMdns *mdns)
+{
+  GError *error = NULL;
+
+  mdns->priv = G_TYPE_INSTANCE_GET_PRIVATE (mdns, VINAGRE_TYPE_MDNS, VinagreMdnsPrivate);
+
+  mdns->priv->conns = NULL;
+  mdns->priv->browser = ga_service_browser_new ("_rfb._tcp");
+  mdns->priv->client = ga_client_new (GA_CLIENT_FLAG_NO_FLAGS);
+
+  g_signal_connect (mdns->priv->browser,
+                    "new-service",
+                    G_CALLBACK (mdns_browser_new_cb),
+                    mdns);
+  g_signal_connect (mdns->priv->browser,
+                    "removed-service",
+                    G_CALLBACK (mdns_browser_del_cb),
+                    mdns);
+
+  if (!ga_client_start (mdns->priv->client, &error))
+    {
+        g_warning (_("Failed to browse for hosts: %s\n"), error->message);
+        g_error_free (error);
+        return;
+    }
+
+  if (!ga_service_browser_attach (mdns->priv->browser,
+                                  mdns->priv->client,
+                                  &error))
+    {
+        g_warning (_("Failed to browse for hosts: %s\n"), error->message);
+        g_error_free (error);
+    }
+}
+
+static void
+vinagre_mdns_clear_conns (VinagreMdns *mdns)
+{
+  g_slist_foreach (mdns->priv->conns, (GFunc) g_object_unref, NULL);
+  g_slist_free (mdns->priv->conns);
+
+  mdns->priv->conns = NULL;
+}
+
+static void
+vinagre_mdns_finalize (GObject *object)
+{
+  VinagreMdns *mdns = VINAGRE_MDNS (object);
+
+  g_object_unref (mdns->priv->browser);
+  g_object_unref (mdns->priv->client);
+
+  vinagre_mdns_clear_conns (mdns);
+
+  G_OBJECT_CLASS (vinagre_mdns_parent_class)->finalize (object);
+}
+
+static void
+vinagre_mdns_class_init (VinagreMdnsClass *klass)
+{
+  GObjectClass* object_class = G_OBJECT_CLASS (klass);
+  GObjectClass* parent_class = G_OBJECT_CLASS (klass);
+
+  g_type_class_add_private (klass, sizeof (VinagreMdnsPrivate));
+
+  object_class->finalize = vinagre_mdns_finalize;
+
+  signals[MDNS_CHANGED] =
+		g_signal_new ("changed",
+			      G_OBJECT_CLASS_TYPE (object_class),
+			      G_SIGNAL_RUN_FIRST,
+			      G_STRUCT_OFFSET (VinagreMdnsClass, changed),
+			      NULL, NULL,
+			      g_cclosure_marshal_VOID__VOID,
+			      G_TYPE_NONE,
+			      0);
+
+}
+
+VinagreMdns *
+vinagre_mdns_get_default (void)
+{
+  if (G_UNLIKELY (!mdns_singleton))
+    mdns_singleton = VINAGRE_MDNS (g_object_new (VINAGRE_TYPE_MDNS,
+                                                 NULL));
+  return mdns_singleton;
+}
+
+GSList *
+vinagre_mdns_get_all (VinagreMdns *mdns)
+{
+  g_return_val_if_fail (VINAGRE_IS_MDNS (mdns), NULL);
+
+  return mdns->priv->conns;
+}

Added: branches/unstable/src/vinagre-mdns.h
==============================================================================
--- (empty file)
+++ branches/unstable/src/vinagre-mdns.h	Thu Apr 10 01:46:20 2008
@@ -0,0 +1,62 @@
+/*
+ * vinagre-mdns.h
+ * This file is part of vinagre
+ *
+ * Copyright (C) Jonh Wendell 2008 <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 the
+ * Free Software Foundation, either version 2 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 General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License along
+ * with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _VINAGRE_MDNS_H_
+#define _VINAGRE_MDNS_H_
+
+#include <glib-object.h>
+#include <glib.h>
+
+G_BEGIN_DECLS
+
+#define VINAGRE_TYPE_MDNS             (vinagre_mdns_get_type ())
+#define VINAGRE_MDNS(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), VINAGRE_TYPE_MDNS, VinagreMdns))
+#define VINAGRE_MDNS_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), VINAGRE_TYPE_MDNS, VinagreMdnsClass))
+#define VINAGRE_IS_MDNS(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VINAGRE_TYPE_MDNS))
+#define VINAGRE_IS_MDNS_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass), VINAGRE_TYPE_MDNS))
+#define VINAGRE_MDNS_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), VINAGRE_TYPE_MDNS, VinagreMdnsClass))
+
+typedef struct _VinagreMdnsClass   VinagreMdnsClass;
+typedef struct _VinagreMdns        VinagreMdns;
+typedef struct _VinagreMdnsPrivate VinagreMdnsPrivate;
+
+struct _VinagreMdnsClass
+{
+  GObjectClass parent_class;
+
+  /* Signals */
+  void (* changed) (VinagreMdns *mdns);
+};
+
+struct _VinagreMdns
+{
+  GObject parent_instance;
+  VinagreMdnsPrivate *priv;
+};
+
+GType        vinagre_mdns_get_type    (void) G_GNUC_CONST;
+
+VinagreMdns *vinagre_mdns_get_default (void);
+GSList      *vinagre_mdns_get_all     (VinagreMdns *mdns);
+
+G_END_DECLS
+
+#endif /* _VINAGRE_MDNS_H_ */
+/* vim: ts=8 */

Modified: branches/unstable/src/vinagre-window-private.h
==============================================================================
--- branches/unstable/src/vinagre-window-private.h	(original)
+++ branches/unstable/src/vinagre-window-private.h	Thu Apr 10 01:46:20 2008
@@ -23,7 +23,6 @@
 
 #include "vinagre-window.h"
 #include "vinagre-connection.h"
-#include "vinagre-bookmarks.h"
 
 G_BEGIN_DECLS
 
@@ -56,7 +55,6 @@
 
   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	Thu Apr 10 01:46:20 2008
@@ -36,6 +36,7 @@
 #include "vinagre-utils.h"
 #include "vinagre-bookmarks.h"
 #include "vinagre-ui.h"
+#include "vinagre-mdns.h"
 
 #include "vinagre-window-private.h"
 
@@ -542,8 +543,8 @@
 {
   VinagreWindowPrivate *p = window->priv;
   GList  *actions, *l;
-  GSList *favs;
-  gint   n, i;
+  GSList *favs, *mdnss;
+  gint   n, m, i;
   guint  id;
 
   g_return_if_fail (p->bookmarks_list_action_group != NULL);
@@ -562,12 +563,13 @@
     }
   g_list_free (actions);
 
-  /* Get the bookmarks from file */
-  favs = vinagre_bookmarks_get_all (window->priv->book);
+  favs = vinagre_bookmarks_get_all (vinagre_bookmarks_get_default ());
+  mdnss = vinagre_mdns_get_all (vinagre_mdns_get_default ());
   n = g_slist_length (favs);
+  m = g_slist_length (mdnss);
   i = 0;
 
-  id = (n > 0) ? gtk_ui_manager_new_merge_id (p->manager) : 0;
+  id = (n > 0||m > 0) ? gtk_ui_manager_new_merge_id (p->manager) : 0;
 
   while (favs)
     {
@@ -617,6 +619,56 @@
       i++;
     }
 
+  /* avahi */
+  i = 0;
+  while (mdnss)
+    {
+      VinagreConnection *conn;
+      gchar             *action_name, *action_label;
+      GtkAction         *action;
+      gchar             *name, *tooltip;
+
+      conn = (VinagreConnection *) mdnss->data;
+      g_assert (VINAGRE_IS_CONNECTION (conn));
+
+      name = vinagre_connection_get_best_name (conn);
+
+      action_name = g_strdup_printf ("Avahi_%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 = 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 (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),
+			window);
+
+      gtk_ui_manager_add_ui (p->manager,
+			     id,
+			     "/MenuBar/BookmarksMenu/AvahiList",
+			     action_name, action_name,
+			     GTK_UI_MANAGER_MENUITEM,
+			     FALSE);
+
+      g_object_unref (action);
+      g_free (action_name);
+      g_free (action_label);
+      g_free (name);
+      g_free (tooltip);
+
+      mdnss = mdnss->next;
+      i++;
+    }
+
   p->bookmarks_list_menu_ui_id = id;
 }
 
@@ -905,8 +957,6 @@
   window->priv->fullscreen = FALSE;
   window->priv->signal_notebook = 0;
 
-  window->priv->book = vinagre_bookmarks_get_default ();
-
   main_box = gtk_vbox_new (FALSE, 0);
   gtk_container_add (GTK_CONTAINER (window), main_box);
   gtk_widget_show (main_box);
@@ -939,7 +989,11 @@
   vinagre_window_update_machine_menu_sensitivity (window);
 
   vinagre_window_update_bookmarks_list_menu (window);
-  g_signal_connect_swapped (window->priv->book,
+  g_signal_connect_swapped (vinagre_bookmarks_get_default (),
+                            "changed",
+                            G_CALLBACK (vinagre_window_update_bookmarks_list_menu),
+                            window);
+  g_signal_connect_swapped (vinagre_mdns_get_default (),
                             "changed",
                             G_CALLBACK (vinagre_window_update_bookmarks_list_menu),
                             window);
@@ -1081,15 +1135,6 @@
   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	Thu Apr 10 01:46:20 2008
@@ -79,7 +79,6 @@
 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]