]> git.0d.be Git - empathy.git/commitdiff
Merge branch 'tp-tube'
authorGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>
Mon, 27 Apr 2009 10:16:38 +0000 (11:16 +0100)
committerGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>
Mon, 27 Apr 2009 10:16:38 +0000 (11:16 +0100)
27 files changed:
.gitignore
Makefile.am
autogen.sh
configure.ac
empathy.doap
extensions/Makefile.am
libempathy-gtk/Makefile.am
libempathy/Makefile.am
libempathy/empathy-tp-chat.c
libempathy/empathy-tp-file.c
libempathy/empathy-tp-file.h
m4/shave.m4 [new file with mode: 0644]
megaphone/data/Makefile.am
nothere/data/Makefile.am
po/es.po
python/pyempathy/Makefile.am
python/pyempathy/pyempathy.defs
python/pyempathygtk/Makefile.am
python/pyempathygtk/pyempathygtk.defs
shave-libtool.in [new file with mode: 0644]
shave.in [new file with mode: 0644]
src/Makefile.am
src/empathy-ft-manager.c
src/empathy-main-window.c
src/empathy-main-window.ui
tools/Makefile.am
tools/shave.mk [new file with mode: 0644]

index 6f644672c05492018474c3a6f2414b0901eb3fa8..e67be83e0465280b1f0e7c1537036d8e5717bb02 100644 (file)
@@ -44,3 +44,5 @@ cscope.out
 tags
 TAGS
 gnome-doc-utils.make
+shave
+shave-libtool
index 20e1962342cf9516a781444a9f6c8c7ce44260cd..3929d3931e0bc52871e9471e01a7cc2383604bcd 100644 (file)
@@ -38,7 +38,7 @@ DISTCLEANFILES =              \
 distuninstallcheck_listfiles = find . -type f -print | grep -v '^\./var/scrollkeeper'
 
 distclean-local:
-       if test $(srdcir) = .; then :; else \
+       if test "x$(srdcir)" = "x."; then :; else \
                rm -f ChangeLog; \
        fi
 
index b1a24fc3a6e984fcc9ba92b8a2790509de1779cb..e1bf4d55fca93d0429f4fb3e22ee2e85936d742b 100755 (executable)
@@ -13,6 +13,14 @@ REQUIRED_AUTOMAKE_VERSION=1.9
     exit 1
 }
 
+# Fix to make shave + libtool 1.x + gtk-doc work.
+# See http://git.lespiau.name/cgit/shave/tree/README#n83
+sed -e 's#) --mode=compile#) --tag=CC --mode=compile#' gtk-doc.make \
+    > gtk-doc.temp \
+        && mv gtk-doc.temp gtk-doc.make
+sed -e 's#) --mode=link#) --tag=CC --mode=link#' gtk-doc.make \
+                > gtk-doc.temp \
+        && mv gtk-doc.temp gtk-doc.make
 
 which gnome-autogen.sh || {
     echo "You need to install gnome-common from the GNOME CVS"
index 0ff17396d009a367aefc24d767f078f00b004221..7d2d5d2ace6c61395711e81933e214ab0672b03d 100644 (file)
@@ -303,6 +303,8 @@ AM_CONDITIONAL(HAVE_PYTHON, test "x$have_python" = "xyes")
 
 # -----------------------------------------------------------
 
+SHAVE_INIT(.)
+
 AC_OUTPUT([
    Makefile
    data/Makefile
@@ -333,4 +335,6 @@ AC_OUTPUT([
    tests/Makefile
    tests/xml/Makefile
    tools/Makefile
+   shave
+   shave-libtool
 ])
index acd6494bc7f391a1a8bf116f9013f2c66ae05d36..e37ed35c3e05460b11a141d578d1db0d3f294c24 100644 (file)
@@ -14,7 +14,7 @@
   <maintainer>
     <foaf:Person>
       <foaf:name>Xavier Claessens</foaf:name>
-      <foaf:mbox rdf:resource="xclaesse@gmail.com" />
+      <foaf:mbox rdf:resource="mailto:xclaesse@gmail.com" />
       <gnome:userid>xclaesse</gnome:userid>
     </foaf:Person>
   </maintainer>
index e5b1ea1135a51977920d64fd990633283a631ea2..7591109e8312531b01296e763cc03516f5ee6cfc 100644 (file)
@@ -1,3 +1,5 @@
+include $(top_srcdir)/tools/shave.mk
+
 tools_dir = $(top_srcdir)/tools
 
 AM_CPPFLAGS = $(DISABLE_DEPRECATED)
@@ -60,45 +62,45 @@ XSLTPROCFLAGS = --nonet --novalid
 
 _gen/all.xml: all.xml $(wildcard *.xml)
        $(mkdir_p) _gen
-       $(XSLTPROC) $(XSLTPROCFLAGS) --xinclude $(tools_dir)/identity.xsl \
+       $(QUIET_GEN)$(XSLTPROC) $(XSLTPROCFLAGS) --xinclude $(tools_dir)/identity.xsl \
                $< > $@
 
 extensions.html: _gen/all.xml $(tools_dir)/doc-generator.xsl
-       $(XSLTPROC) $(XSLTPROCFLAGS) \
+       $(QUIET_GEN)$(XSLTPROC) $(XSLTPROCFLAGS) \
                --param "allow-undefined-interfaces" "true()" \
                $(tools_dir)/doc-generator.xsl \
                $< > $@
 
 _gen/gtypes.h _gen/gtypes-body.h: _gen/all.xml \
        $(top_srcdir)/tools/glib-gtypes-generator.py
-       $(PYTHON) $(top_srcdir)/tools/glib-gtypes-generator.py \
+       $(QUIET_GEN)$(PYTHON) $(top_srcdir)/tools/glib-gtypes-generator.py \
                $< _gen/gtypes Emp
 
 _gen/signals-marshal.list: _gen/all.xml \
        $(tools_dir)/glib-signals-marshal-gen.py
-       $(PYTHON) $(tools_dir)/glib-signals-marshal-gen.py $< > $@
+       $(QUIET_GEN)$(PYTHON) $(tools_dir)/glib-signals-marshal-gen.py $< > $@
 
 _gen/signals-marshal.h: _gen/signals-marshal.list Makefile.am
-       $(GLIB_GENMARSHAL) --header --prefix=_emp_ext_marshal $< > $@
+       $(QUIET_GEN)$(GLIB_GENMARSHAL) --header --prefix=_emp_ext_marshal $< > $@
 
 _gen/signals-marshal.c: _gen/signals-marshal.list Makefile.am
-       { echo '#include "_gen/signals-marshal.h"' && \
+       $(QUIET_GEN){ echo '#include "_gen/signals-marshal.h"' && \
        $(GLIB_GENMARSHAL) --body --prefix=_emp_ext_marshal $< ; } > $@
 
 _gen/register-dbus-glib-marshallers-body.h: _gen/all.xml \
        $(tools_dir)/glib-client-marshaller-gen.py
-       $(PYTHON) $(tools_dir)/glib-client-marshaller-gen.py $< \
+       $(QUIET_GEN)$(PYTHON) $(tools_dir)/glib-client-marshaller-gen.py $< \
                _emp_ext > $@
 
 _gen/enums.h: _gen/all.xml \
        $(tools_dir)/c-constants-gen.py
-       $(PYTHON) $(tools_dir)/c-constants-gen.py \
+       $(QUIET_GEN)$(PYTHON) $(tools_dir)/c-constants-gen.py \
                Emp \
                $< > $@
 
 _gen/interfaces-body.h _gen/interfaces.h: _gen/all.xml \
        $(tools_dir)/glib-interfaces-gen.py
-       $(PYTHON) $(tools_dir)/glib-interfaces-gen.py \
+       $(QUIET_GEN)$(PYTHON) $(tools_dir)/glib-interfaces-gen.py \
                Emp _gen/interfaces-body.h _gen/interfaces.h $<
 
 # Generated files which must be generated per "category". Each TpProxy
@@ -107,12 +109,12 @@ _gen/interfaces-body.h _gen/interfaces.h: _gen/all.xml \
 
 _gen/misc.xml: misc.xml $(wildcard *.xml)
        $(mkdir_p) _gen
-       $(XSLTPROC) $(XSLTPROCFLAGS) --xinclude $(tools_dir)/identity.xsl \
+       $(QUIET_GEN)$(XSLTPROC) $(XSLTPROCFLAGS) --xinclude $(tools_dir)/identity.xsl \
                $< > $@
 
 _gen/cli-misc-body.h _gen/cli-misc.h: _gen/misc.xml \
        $(tools_dir)/glib-client-gen.py
-       $(PYTHON) $(tools_dir)/glib-client-gen.py \
+       $(QUIET_GEN)$(PYTHON) $(tools_dir)/glib-client-gen.py \
                --group=misc \
                --subclass=TpProxy \
                --subclass-assert=TP_IS_PROXY \
@@ -122,7 +124,7 @@ _gen/cli-misc-body.h _gen/cli-misc.h: _gen/misc.xml \
 
 _gen/svc-misc.c _gen/svc-misc.h: _gen/misc.xml \
        $(tools_dir)/glib-ginterface-gen.py
-       $(PYTHON) $(tools_dir)/glib-ginterface-gen.py \
+       $(QUIET_GEN)$(PYTHON) $(tools_dir)/glib-ginterface-gen.py \
                --filename=_gen/svc-misc \
                --signal-marshal-prefix=_emp_ext \
                --include='<telepathy-glib/dbus.h>' \
index 2065589e3594b19d11419d9f2318e1bcfcb7fbe9..210b6d4b041defa33d94008fb8fc08a863185917 100644 (file)
@@ -1,3 +1,5 @@
+include $(top_srcdir)/tools/shave.mk
+
 AM_CPPFLAGS =                                           \
        -I.                                             \
        -I$(top_srcdir)                                 \
@@ -133,7 +135,7 @@ ui_DATA =                                   \
        empathy-new-message-dialog.ui
 
 empathy-gtk-marshal.list: $(libempathy_gtk_la_SOURCES) Makefile.am
-       ( cd $(srcdir) && \
+       $(QUIET_GEN)( cd $(srcdir) && \
        sed -n -e 's/.*empathy_gtk_marshal_\([[:upper:][:digit:]]*__[[:upper:][:digit:]_]*\).*/\1/p' \
        $(libempathy_gtk_la_SOURCES) ) \
        | sed -e 's/__/:/' -e 'y/_/,/' | sort -u > $@.tmp
@@ -144,16 +146,16 @@ empathy-gtk-marshal.list: $(libempathy_gtk_la_SOURCES) Makefile.am
        fi
 
 %-marshal.h: %-marshal.list Makefile
-       $(GLIB_GENMARSHAL) --header --prefix=_$(subst -,_,$*)_marshal $< > $*-marshal.h
+       $(QUIET_GEN)$(GLIB_GENMARSHAL) --header --prefix=_$(subst -,_,$*)_marshal $< > $*-marshal.h
 
 %-marshal.c: %-marshal.list Makefile
-       echo "#include \"empathy-gtk-marshal.h\"" > $@ && \
+       $(QUIET_GEN)echo "#include \"empathy-gtk-marshal.h\"" > $@ && \
        $(GLIB_GENMARSHAL) --body --prefix=_$(subst -,_,$*)_marshal $< >> $*-marshal.c
 
 empathy-gtk-enum-types.h: stamp-empathy-gtk-enum-types.h
-       @true
+       $(QUIET_GEN)true
 stamp-empathy-gtk-enum-types.h: Makefile $(libempathy_gtk_headers)
-       (cd $(srcdir) \
+       $(QUIET_GEN)(cd $(srcdir) \
        && glib-mkenums \
                        --fhead "#ifndef __LIBEMPATHY_GTK_ENUM_TYPES_H__\n" \
                        --fhead "#define __LIBEMPATHY_GTK_ENUM_TYPES_H__ 1\n\n" \
@@ -170,7 +172,7 @@ stamp-empathy-gtk-enum-types.h: Makefile $(libempathy_gtk_headers)
        && echo timestamp > $(@F)
 
 empathy-gtk-enum-types.c: Makefile $(libempathy_gtk_headers)
-       (cd $(srcdir) \
+       $(QUIET_GEN)(cd $(srcdir) \
        && glib-mkenums \
                        --fhead "#include <config.h>\n" \
                        --fhead "#include <glib-object.h>\n" \
index ba1f6f8c71cba5edeac9e722e949aa90aa89345c..67966695ea91c56da87587882d25d7f18646a16c 100644 (file)
@@ -1,3 +1,5 @@
+include $(top_srcdir)/tools/shave.mk
+
 AM_CPPFLAGS =                                           \
        -I.                                             \
        -I$(top_srcdir)                                 \
@@ -104,7 +106,7 @@ libempathy_include_HEADERS =                        \
        empathy-enum-types.h
 
 empathy-marshal.list: $(libempathy_la_SOURCES) Makefile.am
-       ( cd $(srcdir) && \
+       $(QUIET_GEN)( cd $(srcdir) && \
        sed -n -e 's/.*empathy_marshal_\([[:upper:][:digit:]]*__[[:upper:][:digit:]_]*\).*/\1/p' \
        $(libempathy_la_SOURCES) ) \
        | sed -e 's/__/:/' -e 'y/_/,/' | sort -u > $@.tmp
@@ -115,16 +117,16 @@ empathy-marshal.list: $(libempathy_la_SOURCES) Makefile.am
        fi
 
 %-marshal.h: %-marshal.list Makefile
-       $(GLIB_GENMARSHAL) --header --prefix=_$(subst -,_,$*)_marshal $< > $*-marshal.h
+       $(QUIET_GEN)$(GLIB_GENMARSHAL) --header --prefix=_$(subst -,_,$*)_marshal $< > $*-marshal.h
 
 %-marshal.c: %-marshal.list Makefile
-       echo "#include \"empathy-marshal.h\"" > $@ && \
+       $(QUIET_GEN)echo "#include \"empathy-marshal.h\"" > $@ && \
        $(GLIB_GENMARSHAL) --body --prefix=_$(subst -,_,$*)_marshal $< >> $*-marshal.c
 
 empathy-enum-types.h: stamp-empathy-enum-types.h
-       @true
+       $(QUIET_GEN)true
 stamp-empathy-enum-types.h: $(libempathy_headers) Makefile
-       (cd $(srcdir) \
+       $(QUIET_GEN)(cd $(srcdir) \
        && glib-mkenums \
                        --fhead "#ifndef __LIBEMPATHY_ENUM_TYPES_H__\n" \
                        --fhead "#define __LIBEMPATHY_ENUM_TYPES_H__ 1\n\n" \
@@ -141,7 +143,7 @@ stamp-empathy-enum-types.h: $(libempathy_headers) Makefile
        && echo timestamp > $(@F)
 
 empathy-enum-types.c: $(libempathy_headers) Makefile
-       (cd $(srcdir) \
+       $(QUIET_GEN)(cd $(srcdir) \
        && glib-mkenums \
                        --fhead "#include <config.h>\n" \
                        --fhead "#include <glib-object.h>\n" \
index 54e08d07139cebb04b921338a88dd5ab936349e5..2f951e04053baafab9ddd8aaba085019c00a932e 100644 (file)
@@ -753,6 +753,10 @@ tp_chat_check_if_ready (EmpathyTpChat *chat)
 
        DEBUG ("Ready!");
 
+       tp_cli_channel_type_text_connect_to_received (priv->channel,
+                                                     tp_chat_received_cb,
+                                                     NULL, NULL,
+                                                     G_OBJECT (chat), NULL);
        priv->listing_pending_messages = TRUE;
        tp_cli_channel_type_text_call_list_pending_messages (priv->channel, -1,
                                                             FALSE,
@@ -760,10 +764,6 @@ tp_chat_check_if_ready (EmpathyTpChat *chat)
                                                             NULL, NULL,
                                                             G_OBJECT (chat));
 
-       tp_cli_channel_type_text_connect_to_received (priv->channel,
-                                                     tp_chat_received_cb,
-                                                     NULL, NULL,
-                                                     G_OBJECT (chat), NULL);
        tp_cli_channel_type_text_connect_to_sent (priv->channel,
                                                  tp_chat_sent_cb,
                                                  NULL, NULL,
index 6796f5a0bf82e044ba12799de1c15d7f1f1c63e9..079390c3782ff5a0c7d2aad6919f47e847523373 100644 (file)
@@ -1,4 +1,3 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
 /*
  * Copyright (C) 2007-2008 Collabora Ltd.
  * Copyright (C) 2007 Marco Barisione <marco@barisione.org>
 
 /**
  * SECTION:empathy-tp-file
- * @short_description: File channel
- * @see_also: #EmpathyTpFile, #EmpathyContact, empathy_dispatcher_send_file()
- * @include: libempthy/empathy-tp-file.h
+ * @title: EmpathyTpFile
+ * @short_description: Object which represents a Telepathy file channel
+ * @include: libempathy/empathy-tp-file.h
  *
- * The #EmpathyTpFile object represents a Telepathy file channel.
+ * #EmpathyTpFile is an object which represents a Telepathy file channel.
+ */
+
+/**
+ * EmpathyTpFile:
+ * @parent: parent object
+ *
+ * Object which represents a Telepathy file channel.
  */
 
 /**
@@ -69,6 +75,7 @@
 
 #define N_BUFFERS 2
 #define BUFFER_SIZE 4096
+#define STALLED_TIMEOUT 5
 
 typedef struct {
   GInputStream *in;
@@ -298,7 +305,11 @@ struct _EmpathyTpFilePriv {
 
   gboolean incoming;
   TpFileTransferStateChangeReason state_change_reason;
-  time_t start_time;
+  time_t last_update_time;
+  guint64 last_update_transferred_bytes;
+  gdouble speed;
+  gint remaining_time;
+  guint stalled_id;
   GValue *socket_address;
   GCancellable *cancellable;
 };
@@ -317,6 +328,13 @@ enum {
   PROP_CONTENT_HASH,
 };
 
+enum {
+       REFRESH,
+       LAST_SIGNAL
+};
+
+static guint signals[LAST_SIGNAL];
+
 G_DEFINE_TYPE (EmpathyTpFile, empathy_tp_file, G_TYPE_OBJECT);
 
 static void
@@ -391,9 +409,25 @@ tp_file_finalize (GObject *object)
   if (tp_file->priv->cancellable)
     g_object_unref (tp_file->priv->cancellable);
 
+  if (tp_file->priv->stalled_id != 0)
+    g_source_remove (tp_file->priv->stalled_id);
+
   G_OBJECT_CLASS (empathy_tp_file_parent_class)->finalize (object);
 }
 
+static gboolean
+tp_file_stalled_cb (EmpathyTpFile *tp_file)
+{
+  /* We didn't get transferred bytes update for a while, the transfer is
+   * stalled. */
+
+  tp_file->priv->speed = 0;
+  tp_file->priv->remaining_time = -1;
+  g_signal_emit (tp_file, signals[REFRESH], 0);
+
+  return FALSE;
+}
+
 static void
 tp_file_start_transfer (EmpathyTpFile *tp_file)
 {
@@ -425,7 +459,11 @@ tp_file_start_transfer (EmpathyTpFile *tp_file)
 
   DEBUG ("Start the transfer");
 
-  tp_file->priv->start_time = empathy_time_get_current ();
+  tp_file->priv->last_update_time = empathy_time_get_current ();
+  tp_file->priv->last_update_transferred_bytes = tp_file->priv->transferred_bytes;
+  tp_file->priv->stalled_id = g_timeout_add_seconds (STALLED_TIMEOUT,
+    (GSourceFunc) tp_file_stalled_cb, tp_file);
+
   tp_file->priv->cancellable = g_cancellable_new ();
   if (tp_file->priv->incoming)
     {
@@ -487,19 +525,47 @@ tp_file_transferred_bytes_changed_cb (TpChannel *channel,
                                       GObject *weak_object)
 {
   EmpathyTpFile *tp_file = EMPATHY_TP_FILE (weak_object);
+  time_t curr_time, elapsed_time;
+  guint64 transferred_bytes;
 
+  /* If we didn't progress since last update, return */
   if (tp_file->priv->transferred_bytes == count)
     return;
 
+  /* Update the transferred bytes count */
   tp_file->priv->transferred_bytes = count;
   g_object_notify (G_OBJECT (tp_file), "transferred-bytes");
+
+  /* We got a progress, reset the stalled timeout */
+  if (tp_file->priv->stalled_id != 0)
+    g_source_remove (tp_file->priv->stalled_id);
+  tp_file->priv->stalled_id = g_timeout_add_seconds (STALLED_TIMEOUT,
+    (GSourceFunc) tp_file_stalled_cb, tp_file);
+
+  /* Calculate the transfer speed and remaining time estimation. We recalculate
+   * that each second to get more dynamic values that react faster to network
+   * changes. This is better than calculating the average from the begining of
+   * the transfer, I think. */
+  curr_time = empathy_time_get_current ();
+  elapsed_time = curr_time - tp_file->priv->last_update_time;
+  if (elapsed_time >= 1)
+    {
+      transferred_bytes = count - tp_file->priv->last_update_transferred_bytes;
+      tp_file->priv->speed = (gdouble) transferred_bytes / (gdouble) elapsed_time;
+      tp_file->priv->remaining_time = (tp_file->priv->size - count) /
+        tp_file->priv->speed;
+      tp_file->priv->last_update_transferred_bytes = count;
+      tp_file->priv->last_update_time = curr_time;
+
+      g_signal_emit (tp_file, signals[REFRESH], 0);
+    }
 }
 
 static void
 tp_file_check_if_ready (EmpathyTpFile *tp_file)
 {
   if (tp_file->priv->ready || tp_file->priv->contact == NULL ||
-      tp_file->priv->state == 0)
+      tp_file->priv->state == TP_FILE_TRANSFER_STATE_NONE)
     return;
 
   tp_file->priv->ready = TRUE;
@@ -518,7 +584,7 @@ tp_file_got_contact_cb (EmpathyTpContactFactory *factory,
   if (error)
     {
       DEBUG ("Error: %s", error->message);
-      empathy_tp_file_close (tp_file);
+      empathy_tp_file_cancel (tp_file);
       return;
     }
 
@@ -764,12 +830,13 @@ tp_file_weak_notify_cb (gpointer channel,
 
 /**
  * empathy_tp_file_new:
- * @channel: a Telepathy channel
+ * @channel: a #TpChannel
  *
  * Creates a new #EmpathyTpFile wrapping @channel, or return a new ref to an
- * existing #EmpathyTpFile for that channel.
+ * existing #EmpathyTpFile for that channel. The returned #EmpathyTpFile
+ * should be unrefed with g_object_unref() when finished with.
  *
- * Returns: a new #EmpathyTpFile
+ * Return value: a new #EmpathyTpFile
  */
 EmpathyTpFile *
 empathy_tp_file_new (TpChannel *channel)
@@ -803,9 +870,9 @@ empathy_tp_file_new (TpChannel *channel)
  * empathy_tp_file_get_channel
  * @tp_file: an #EmpathyTpFile
  *
- * Returns the Telepathy file transfer channel
+ * Returns the #TpChannel associated with @tp_file.
  *
- * Returns: the #TpChannel
+ * Returns: the #TpChannel associated with @tp_file
  */
 TpChannel *
 empathy_tp_file_get_channel (EmpathyTpFile *tp_file)
@@ -874,7 +941,7 @@ tp_file_method_cb (TpChannel *channel,
  * @error: a #GError set if there is an error when opening @gfile
  *
  * Accepts a file transfer that's in the "local pending" state (i.e.
- * TP_FILE_TRANSFER_STATE_LOCAL_PENDING).
+ * %TP_FILE_TRANSFER_STATE_LOCAL_PENDING).
  */
 void
 empathy_tp_file_accept (EmpathyTpFile *tp_file,
@@ -913,7 +980,7 @@ empathy_tp_file_accept (EmpathyTpFile *tp_file,
  * @error: a #GError set if there is an error when opening @gfile
  *
  * Offers a file transfer that's in the "not offered" state (i.e.
- * TP_FILE_TRANSFER_STATE_NOT_OFFERED).
+ * %TP_FILE_TRANSFER_STATE_NOT_OFFERED).
  */
 void
 empathy_tp_file_offer (EmpathyTpFile *tp_file, GFile *gfile, GError **error)
@@ -934,6 +1001,14 @@ empathy_tp_file_offer (EmpathyTpFile *tp_file, GFile *gfile, GError **error)
       &nothing, tp_file_method_cb, NULL, NULL, G_OBJECT (tp_file));
 }
 
+/**
+ * empathy_tp_file_get_contact:
+ * @tp_file: an #EmpathyTpFile
+ *
+ * Returns the #EmpathyContact that @tp_file is open with.
+ *
+ * Return value: the #EmpathyContact that @tp_file is open with.
+ */
 EmpathyContact *
 empathy_tp_file_get_contact (EmpathyTpFile *tp_file)
 {
@@ -948,6 +1023,14 @@ empathy_tp_file_get_filename (EmpathyTpFile *tp_file)
   return tp_file->priv->filename;
 }
 
+/**
+ * empathy_tp_file_is_incoming:
+ * @tp_file: an #EmpathyTpFile
+ *
+ * Returns whether @tp_file is incoming.
+ *
+ * Return value: %TRUE if the @tp_file is incoming, otherwise %FALSE
+ */
 gboolean
 empathy_tp_file_is_incoming (EmpathyTpFile *tp_file)
 {
@@ -955,6 +1038,16 @@ empathy_tp_file_is_incoming (EmpathyTpFile *tp_file)
   return tp_file->priv->incoming;
 }
 
+/**
+ * empathy_tp_file_get_state:
+ * @tp_file: an #EmpathyTpFile
+ * @reason: return location for state change reason, or %NULL
+ *
+ * Gets the current state of @tp_file. If @reason is not %NULL, then
+ * it is set to the reason of the last state change.
+ *
+ * Return value: a #TpFileTransferState
+ */
 TpFileTransferState
 empathy_tp_file_get_state (EmpathyTpFile *tp_file,
                            TpFileTransferStateChangeReason *reason)
@@ -968,6 +1061,14 @@ empathy_tp_file_get_state (EmpathyTpFile *tp_file,
   return tp_file->priv->state;
 }
 
+/**
+ * empathy_tp_file_get_size:
+ * @tp_file: an #EmpathyTpFile
+ *
+ * Gets the size of the file being transferred over @tp_file, in bytes.
+ *
+ * Return value: the size of the file being transferred, in bytes
+ */
 guint64
 empathy_tp_file_get_size (EmpathyTpFile *tp_file)
 {
@@ -976,6 +1077,14 @@ empathy_tp_file_get_size (EmpathyTpFile *tp_file)
   return tp_file->priv->size;
 }
 
+/**
+ * empathy_tp_file_get_transferred_bytes:
+ * @tp_file: an #EmpathyTpFile
+ *
+ * Gets the number of transferred bytes of @tp_file so far, in bytes.
+ *
+ * Return value: number of transferred bytes of @tp_file, in bytes
+ */
 guint64
 empathy_tp_file_get_transferred_bytes (EmpathyTpFile *tp_file)
 {
@@ -983,13 +1092,17 @@ empathy_tp_file_get_transferred_bytes (EmpathyTpFile *tp_file)
   return tp_file->priv->transferred_bytes;
 }
 
+/**
+ * empathy_tp_file_get_remaining_time:
+ * @tp_file: a #EmpathyTpFile
+ *
+ * Gets the estimated time remaining of @tp_file, in seconds.
+ *
+ * Return value: the estimated time remaining of @tp_file, in seconds
+ **/
 gint
 empathy_tp_file_get_remaining_time (EmpathyTpFile *tp_file)
 {
-  time_t curr_time, elapsed_time;
-  gdouble time_per_byte;
-  gdouble remaining_time;
-
   g_return_val_if_fail (EMPATHY_IS_TP_FILE (tp_file), -1);
 
   if (tp_file->priv->size == EMPATHY_TP_FILE_UNKNOWN_SIZE)
@@ -998,14 +1111,28 @@ empathy_tp_file_get_remaining_time (EmpathyTpFile *tp_file)
   if (tp_file->priv->transferred_bytes == tp_file->priv->size)
     return 0;
 
-  curr_time = empathy_time_get_current ();
-  elapsed_time = curr_time - tp_file->priv->start_time;
-  time_per_byte = (gdouble) elapsed_time /
-      (gdouble) tp_file->priv->transferred_bytes;
-  remaining_time = time_per_byte * (tp_file->priv->size -
-      tp_file->priv->transferred_bytes);
+  return tp_file->priv->remaining_time;
+}
+
+/**
+ * empathy_tp_file_get_speed:
+ * @tp_file: an #EmpathyTpFile
+ *
+ * Gets the current speed of the transfer @tp_file, in bytes per
+ * second.
+ *
+ * Return value: the current speed of the transfer @tp_file, in
+ *               bytes per second
+ **/
+gdouble
+empathy_tp_file_get_speed (EmpathyTpFile *tp_file)
+{
+  g_return_val_if_fail (EMPATHY_IS_TP_FILE (tp_file), 0);
 
-  return (gint) remaining_time;
+  if (tp_file->priv->transferred_bytes == tp_file->priv->size)
+    return 0;
+
+  return tp_file->priv->speed;
 }
 
 const gchar *
@@ -1015,6 +1142,12 @@ empathy_tp_file_get_content_type (EmpathyTpFile *tp_file)
   return tp_file->priv->content_type;
 }
 
+/**
+ * empathy_tp_file_cancel:
+ * @tp_file: an #EmpathyTpFile
+ *
+ * Cancels the file transfer, @tp_file.
+ */
 void
 empathy_tp_file_cancel (EmpathyTpFile *tp_file)
 {
@@ -1028,12 +1161,18 @@ empathy_tp_file_cancel (EmpathyTpFile *tp_file)
     g_cancellable_cancel (tp_file->priv->cancellable);
 }
 
-void
-empathy_tp_file_close (EmpathyTpFile *tp_file)
-{
-  empathy_tp_file_cancel (tp_file);
-}
-
+/**
+ * empathy_tp_file_is_ready:
+ * @tp_file: an #EmpathyTpFile
+ *
+ * Returns whether the file channel @tp_file is ready for use.
+ *
+ * @tp_file is classed as ready if its state is no longer
+ * %TP_FILE_TRANSFER_STATE_NONE, or if details about the remote
+ * contact have been fully received.
+ *
+ * Return value: %TRUE if @tp_file is ready for use
+ */
 gboolean
 empathy_tp_file_is_ready (EmpathyTpFile *tp_file)
 {
@@ -1053,6 +1192,12 @@ empathy_tp_file_class_init (EmpathyTpFileClass *klass)
   object_class->set_property = tp_file_set_property;
 
   /* Construct-only properties */
+
+  /**
+   * EmpathyTpFile:channel:
+   *
+   * The #TpChannel associated with the #EmpathyTpFile.
+   */
   g_object_class_install_property (object_class,
       PROP_CHANNEL,
       g_param_spec_object ("channel",
@@ -1062,6 +1207,11 @@ empathy_tp_file_class_init (EmpathyTpFileClass *klass)
           G_PARAM_READWRITE |
           G_PARAM_CONSTRUCT_ONLY));
 
+  /**
+   * EmpathyTpFile:state:
+   *
+   * The #TpFileTransferState of the #EmpathyTpFile.
+   */
   g_object_class_install_property (object_class,
       PROP_STATE,
       g_param_spec_uint ("state",
@@ -1073,6 +1223,11 @@ empathy_tp_file_class_init (EmpathyTpFileClass *klass)
           G_PARAM_READWRITE |
           G_PARAM_CONSTRUCT));
 
+  /**
+   * EmpathyTpFile:incoming:
+   *
+   * Whether the #EmpathyTpFile is incoming.
+   */
   g_object_class_install_property (object_class,
       PROP_INCOMING,
       g_param_spec_boolean ("incoming",
@@ -1082,6 +1237,12 @@ empathy_tp_file_class_init (EmpathyTpFileClass *klass)
           G_PARAM_READWRITE |
           G_PARAM_CONSTRUCT));
 
+  /**
+   * EmpathyTpFile:ready:
+   *
+   * Whether the #EmpathyTpFile is ready to use. This property returns
+   * the same as empathy_tp_file_is_ready().
+   */
   g_object_class_install_property (object_class,
       PROP_READY,
       g_param_spec_boolean ("ready",
@@ -1090,6 +1251,11 @@ empathy_tp_file_class_init (EmpathyTpFileClass *klass)
           FALSE,
           G_PARAM_READABLE));
 
+  /**
+   * EmpathyTpFile:filename:
+   *
+   * The name of the file being transferred.
+   */
   g_object_class_install_property (object_class,
       PROP_FILENAME,
       g_param_spec_string ("filename",
@@ -1098,6 +1264,11 @@ empathy_tp_file_class_init (EmpathyTpFileClass *klass)
           "",
           G_PARAM_READWRITE));
 
+  /**
+   * EmpathyTpFile:size:
+   *
+   * The size of the file being transferred.
+   */
   g_object_class_install_property (object_class,
       PROP_SIZE,
       g_param_spec_uint64 ("size",
@@ -1108,6 +1279,11 @@ empathy_tp_file_class_init (EmpathyTpFileClass *klass)
           G_MAXUINT64,
           G_PARAM_READWRITE));
 
+  /**
+   * EmpathyTpFile:content-type:
+   *
+   * The content-type of the file being transferred.
+   */
   g_object_class_install_property (object_class,
       PROP_CONTENT_TYPE,
       g_param_spec_string ("content-type",
@@ -1116,6 +1292,12 @@ empathy_tp_file_class_init (EmpathyTpFileClass *klass)
           "",
           G_PARAM_READWRITE));
 
+  /**
+   * EmpathyTpFile:content-hash-type:
+   *
+   * The type of hash type stored in #EmpathyTpFile:content-hash,
+   * from #TpFileHashType.
+   */
   g_object_class_install_property (object_class,
       PROP_CONTENT_HASH_TYPE,
       g_param_spec_uint ("content-hash-type",
@@ -1126,6 +1308,11 @@ empathy_tp_file_class_init (EmpathyTpFileClass *klass)
           0,
           G_PARAM_READWRITE));
 
+  /**
+   * EmpathyTpFile:content-hash:
+   *
+   * A hash of the contents of the file being transferred.
+   */
   g_object_class_install_property (object_class,
       PROP_CONTENT_HASH,
       g_param_spec_string ("content-hash",
@@ -1134,6 +1321,11 @@ empathy_tp_file_class_init (EmpathyTpFileClass *klass)
           "",
           G_PARAM_READWRITE));
 
+  /**
+   * EmpathyTpFile:transferred-bytes:
+   *
+   * The number of bytes transferred in the #EmpathyTpFile.
+   */
   g_object_class_install_property (object_class,
       PROP_TRANSFERRED_BYTES,
       g_param_spec_uint64 ("transferred-bytes",
@@ -1144,6 +1336,23 @@ empathy_tp_file_class_init (EmpathyTpFileClass *klass)
           0,
           G_PARAM_READWRITE));
 
+  /**
+   * EmpathyTpFile::refresh:
+   * @tp_file: the #EmpathyTpFile
+   *
+   * The progress of @tp_file has changed. This can either be an update
+   * in the number of bytes transferred, or it can be to inform of the
+   * transfer stalling.
+   *
+   * This signal is designed for clients to provide more user feedback
+   * when something to do with @tp_file changes. To avoid emitting this
+   * signal too much, it is guaranteed that it will only ever be fired
+   * at least every two seconds.
+   */
+  signals[REFRESH] = g_signal_new ("refresh", G_TYPE_FROM_CLASS (klass),
+      G_SIGNAL_RUN_LAST, 0, NULL, NULL,
+      g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
+
   g_type_class_add_private (object_class, sizeof (EmpathyTpFilePriv));
 }
 
index 5f239c8e0df5a999935ad734f412a15605ad36b4..1d444315325c5225a46535876c72595ae81559d3 100644 (file)
@@ -52,6 +52,7 @@ struct _EmpathyTpFile
 {
   GObject      parent;
 
+  /*<private>*/
   EmpathyTpFilePriv *priv;
 };
 
@@ -68,7 +69,6 @@ TpChannel *empathy_tp_file_get_channel (EmpathyTpFile *tp_file);
 void empathy_tp_file_accept (EmpathyTpFile *tp_file, guint64 offset,
   GFile *gfile, GError **error);
 void empathy_tp_file_cancel (EmpathyTpFile *tp_file);
-void empathy_tp_file_close (EmpathyTpFile *tp_file);
 void empathy_tp_file_offer (EmpathyTpFile *tp_file, GFile *gfile,
   GError **error);
 
@@ -80,6 +80,7 @@ TpFileTransferState empathy_tp_file_get_state (
 guint64 empathy_tp_file_get_size (EmpathyTpFile *tp_file);
 guint64 empathy_tp_file_get_transferred_bytes (EmpathyTpFile *tp_file);
 gint empathy_tp_file_get_remaining_time (EmpathyTpFile *tp_file);
+gdouble empathy_tp_file_get_speed (EmpathyTpFile *tp_file);
 const gchar *empathy_tp_file_get_content_type (EmpathyTpFile *tp_file);
 gboolean empathy_tp_file_is_ready (EmpathyTpFile *tp_file);
 
diff --git a/m4/shave.m4 b/m4/shave.m4
new file mode 100644 (file)
index 0000000..0a3509e
--- /dev/null
@@ -0,0 +1,77 @@
+dnl Make automake/libtool output more friendly to humans
+dnl  Damien Lespiau <damien.lespiau@gmail.com>
+dnl
+dnl SHAVE_INIT([shavedir],[default_mode])
+dnl
+dnl shavedir: the directory where the shave scripts are, it defaults to
+dnl           $(top_builddir)
+dnl default_mode: (enable|disable) default shave mode.  This parameter
+dnl               controls shave's behaviour when no option has been
+dnl               given to configure.  It defaults to disable.
+dnl
+dnl * SHAVE_INIT should be called late in your configure.(ac|in) file (just
+dnl   before AC_CONFIG_FILE/AC_OUTPUT is perfect.  This macro rewrites CC and
+dnl   LIBTOOL, you don't want the configure tests to have these variables
+dnl   re-defined.
+dnl * This macro requires GNU make's -s option.
+
+AC_DEFUN([_SHAVE_ARG_ENABLE],
+[
+  AC_ARG_ENABLE([shave],
+    AS_HELP_STRING(
+      [--enable-shave],
+      [use shave to make the build pretty [[default=$1]]]),,
+      [enable_shave=$1]
+    )
+])
+
+AC_DEFUN([SHAVE_INIT],
+[
+  dnl you can tweak the default value of enable_shave
+  m4_if([$2], [enable], [_SHAVE_ARG_ENABLE(yes)], [_SHAVE_ARG_ENABLE(no)])
+
+  if test x"$enable_shave" = xyes; then
+    dnl where can we find the shave scripts?
+    m4_if([$1],,
+      [shavedir="$ac_pwd"],
+      [shavedir="$ac_pwd/$1"])
+    AC_SUBST(shavedir)
+
+    dnl make is now quiet
+    AC_SUBST([MAKEFLAGS], [-s])
+    AC_SUBST([AM_MAKEFLAGS], ['`test -z $V && echo -s`'])
+
+    dnl we need sed
+    AC_CHECK_PROG(SED,sed,sed,false)
+
+    dnl substitute libtool
+    SHAVE_SAVED_LIBTOOL=$LIBTOOL
+    LIBTOOL="${SHELL} ${shavedir}/shave-libtool '${SHAVE_SAVED_LIBTOOL}'"
+    AC_SUBST(LIBTOOL)
+
+    dnl substitute cc/cxx
+    SHAVE_SAVED_CC=$CC
+    SHAVE_SAVED_CXX=$CXX
+    SHAVE_SAVED_FC=$FC
+    SHAVE_SAVED_F77=$F77
+    SHAVE_SAVED_OBJC=$OBJC
+    CC="${SHELL} ${shavedir}/shave cc ${SHAVE_SAVED_CC}"
+    CXX="${SHELL} ${shavedir}/shave cxx ${SHAVE_SAVED_CXX}"
+    FC="${SHELL} ${shavedir}/shave fc ${SHAVE_SAVED_FC}"
+    F77="${SHELL} ${shavedir}/shave f77 ${SHAVE_SAVED_F77}"
+    OBJC="${SHELL} ${shavedir}/shave objc ${SHAVE_SAVED_OBJC}"
+    AC_SUBST(CC)
+    AC_SUBST(CXX)
+    AC_SUBST(FC)
+    AC_SUBST(F77)
+    AC_SUBST(OBJC)
+
+    V=@
+  else
+    V=1
+  fi
+  Q='$(V:1=)'
+  AC_SUBST(V)
+  AC_SUBST(Q)
+])
+
index c2e378fae17622219902b01dd64ed894ddaa419f..875756cd0f14249906fa0316d5e31eed5065ed18 100644 (file)
@@ -1,3 +1,5 @@
+include $(top_srcdir)/tools/shave.mk
+
 # Panel applet bonobo stuff
 serverdir = $(libdir)/bonobo/servers
 server_in_files = GNOME_Megaphone_Applet.server.in
@@ -21,7 +23,7 @@ megaphonebindir = $(libexecdir)
 @INTLTOOL_SCHEMAS_RULE@
 
 $(server_in_files): $(server_in_files:.server.in=.server.in.in)
-       sed -e "s|\@LIBEXECDIR\@|$(megaphonebindir)|" $< > $@
+       $(QUIET_GEN)sed -e "s|\@LIBEXECDIR\@|$(megaphonebindir)|" $< > $@
 
 DISTCLEANFILES = \
        $(server_DATA) \
index ce60c3cb292e4cbdb6133e9576b67c178d21c13d..730406577579089ece0de28cb95055e0d3e51ce2 100644 (file)
@@ -1,3 +1,5 @@
+include $(top_srcdir)/tools/shave.mk
+
 # Panel applet bonobo stuff
 serverdir = $(libdir)/bonobo/servers
 server_in_files = GNOME_NotHere_Applet.server.in
@@ -21,7 +23,7 @@ notherebindir = $(libexecdir)
 @INTLTOOL_SCHEMAS_RULE@
 
 $(server_in_files): $(server_in_files:.server.in=.server.in.in)
-       sed -e "s|\@LIBEXECDIR\@|$(notherebindir)|" $< > $@
+       $(QUIET_GEN)sed -e "s|\@LIBEXECDIR\@|$(notherebindir)|" $< > $@
 
 DISTCLEANFILES = \
        $(server_DATA) \
index 7e5b0c26df6178b18462e3afaaa7449185357d12..a1c0627b19c900e20bd513ae02e7fbb297a0800e 100644 (file)
--- a/po/es.po
+++ b/po/es.po
@@ -8,8 +8,8 @@ msgstr ""
 "Project-Id-Version: empathy.HEAD\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
 "product=empathy&component=general\n"
-"POT-Creation-Date: 2009-04-21 15:44+0000\n"
-"PO-Revision-Date: 2009-04-21 21:02+0200\n"
+"POT-Creation-Date: 2009-04-24 20:08+0000\n"
+"PO-Revision-Date: 2009-04-25 20:26+0200\n"
 "Last-Translator: Jorge González <jorgegonz@svn.gnome.org>\n"
 "Language-Team: Español <gnome-es-list@gnome.org>\n"
 "MIME-Version: 1.0\n"
@@ -355,31 +355,31 @@ msgstr ""
 "predeterminado es ordenar por el nombre del contacto con el valor \"name"
 "\" (nombre). Un valor \"state\" (estado) ordenará la lista por el estado."
 
-#: ../libempathy/empathy-tp-contact-list.c:732 ../src/empathy.c:271
+#: ../libempathy/empathy-tp-contact-list.c:727 ../src/empathy.c:278
 msgid "People nearby"
 msgstr "Gente cerca"
 
-#: ../libempathy/empathy-utils.c:252
+#: ../libempathy/empathy-utils.c:251
 msgid "Available"
 msgstr "Disponible"
 
-#: ../libempathy/empathy-utils.c:254
+#: ../libempathy/empathy-utils.c:253
 msgid "Busy"
 msgstr "Ocupado"
 
-#: ../libempathy/empathy-utils.c:257
+#: ../libempathy/empathy-utils.c:256
 msgid "Away"
 msgstr "Ausente"
 
-#: ../libempathy/empathy-utils.c:259
+#: ../libempathy/empathy-utils.c:258
 msgid "Hidden"
 msgstr "Oculto"
 
-#: ../libempathy/empathy-utils.c:262
+#: ../libempathy/empathy-utils.c:261
 msgid "Offline"
 msgstr "Desconectado"
 
-#: ../libempathy-gtk/empathy-account-chooser.c:325
+#: ../libempathy-gtk/empathy-account-chooser.c:419
 msgid "All"
 msgstr "Todo"
 
@@ -449,7 +449,7 @@ msgstr "_UIN ICQ:"
 msgid "_Charset:"
 msgstr "Conjunto de _caracteres:"
 
-#: ../libempathy-gtk/empathy-account-widget-irc.c:244
+#: ../libempathy-gtk/empathy-account-widget-irc.c:241
 msgid "New Network"
 msgstr "Red nueva"
 
@@ -570,114 +570,118 @@ msgstr "_Ignorar invitaciones a conferencias y salas de chat"
 msgid "_Room List locale:"
 msgstr "Configuración de la lista de _salas:"
 
-#: ../libempathy-gtk/empathy-avatar-chooser.c:462
-#: ../libempathy-gtk/empathy-avatar-chooser.c:538
+#: ../libempathy-gtk/empathy-avatar-chooser.c:449
+#: ../libempathy-gtk/empathy-avatar-chooser.c:525
 msgid "Couldn't convert image"
 msgstr "No se pudo convertir la imagen"
 
-#: ../libempathy-gtk/empathy-avatar-chooser.c:463
+#: ../libempathy-gtk/empathy-avatar-chooser.c:450
 msgid "None of the accepted image formats is supported on your system"
 msgstr "Su sistema no soporta ninguno de los formatos de imagen aceptados"
 
-#: ../libempathy-gtk/empathy-avatar-chooser.c:957
+#: ../libempathy-gtk/empathy-avatar-chooser.c:933
 msgid "Select Your Avatar Image"
 msgstr "Seleccione su imagen de avatar"
 
-#: ../libempathy-gtk/empathy-avatar-chooser.c:960
+#: ../libempathy-gtk/empathy-avatar-chooser.c:936
 msgid "No Image"
 msgstr "Sin imagen"
 
-#: ../libempathy-gtk/empathy-avatar-chooser.c:1022
+#: ../libempathy-gtk/empathy-avatar-chooser.c:998
 msgid "Images"
 msgstr "Imágenes"
 
-#: ../libempathy-gtk/empathy-avatar-chooser.c:1026
+#: ../libempathy-gtk/empathy-avatar-chooser.c:1002
 msgid "All Files"
 msgstr "Todos los archivos"
 
-#: ../libempathy-gtk/empathy-avatar-image.c:294
+#: ../libempathy-gtk/empathy-avatar-image.c:324
 msgid "Click to enlarge"
 msgstr "Pulse para agrandar"
 
-#: ../libempathy-gtk/empathy-chat.c:180
+#: ../libempathy-gtk/empathy-chat.c:178
 msgid "Failed to reconnect this chat"
 msgstr "Falló al reconectar a este chat"
 
-#: ../libempathy-gtk/empathy-chat.c:398
+#: ../libempathy-gtk/empathy-chat.c:396
 msgid "Unsupported command"
 msgstr "Comando no soportado"
 
-#: ../libempathy-gtk/empathy-chat.c:533
+#: ../libempathy-gtk/empathy-chat.c:531
 msgid "offline"
 msgstr "desconectado"
 
-#: ../libempathy-gtk/empathy-chat.c:536
+#: ../libempathy-gtk/empathy-chat.c:534
 msgid "invalid contact"
 msgstr "contacto no válido"
 
-#: ../libempathy-gtk/empathy-chat.c:539
+#: ../libempathy-gtk/empathy-chat.c:537
 msgid "permission denied"
 msgstr "permiso denegado"
 
-#: ../libempathy-gtk/empathy-chat.c:542
+#: ../libempathy-gtk/empathy-chat.c:540
 msgid "too long message"
 msgstr "mensaje demasiado largo"
 
-#: ../libempathy-gtk/empathy-chat.c:545
+#: ../libempathy-gtk/empathy-chat.c:543
 msgid "not implemented"
 msgstr "no implementado"
 
-#: ../libempathy-gtk/empathy-chat.c:548
+#: ../libempathy-gtk/empathy-chat.c:546
 msgid "unknown"
 msgstr "desconocido"
 
-#: ../libempathy-gtk/empathy-chat.c:552
+#: ../libempathy-gtk/empathy-chat.c:550
 #, c-format
 msgid "Error sending message '%s': %s"
 msgstr "Error al enviar el mensaje Â«%s»: %s"
 
-#: ../libempathy-gtk/empathy-chat.c:582
+#: ../libempathy-gtk/empathy-chat.c:580
 #, c-format
 msgid "Topic set to: %s"
 msgstr "El tema se ha establecido a: %s"
 
-#: ../libempathy-gtk/empathy-chat.c:584
+#: ../libempathy-gtk/empathy-chat.c:582
 msgid "No topic defined"
 msgstr "No se ha definido el tema"
 
-#: ../libempathy-gtk/empathy-chat.c:977
+#: ../libempathy-gtk/empathy-chat.c:951
+msgid "(No Suggestions)"
+msgstr "(Sin sugerencias)"
+
+#: ../libempathy-gtk/empathy-chat.c:1005
 msgid "Insert Smiley"
 msgstr "Insertar emoticono"
 
 #. send button
-#: ../libempathy-gtk/empathy-chat.c:995
+#: ../libempathy-gtk/empathy-chat.c:1023
 #: ../libempathy-gtk/empathy-ui-utils.c:1507
 msgid "_Send"
 msgstr "E_nviar"
 
-#: ../libempathy-gtk/empathy-chat.c:1029
-msgid "_Check Word Spelling..."
-msgstr "_Comprobar ortografía…"
+#: ../libempathy-gtk/empathy-chat.c:1057
+msgid "_Spelling Suggestions"
+msgstr "_Sugerencias ortográficas"
 
-#: ../libempathy-gtk/empathy-chat.c:1147
+#: ../libempathy-gtk/empathy-chat.c:1171
 #, c-format
 msgid "%s has joined the room"
 msgstr "%s ha entrado en la sala"
 
-#: ../libempathy-gtk/empathy-chat.c:1150
+#: ../libempathy-gtk/empathy-chat.c:1174
 #, c-format
 msgid "%s has left the room"
 msgstr "%s ha dejado la sala"
 
-#: ../libempathy-gtk/empathy-chat.c:1265 ../src/empathy-call-window.c:756
+#: ../libempathy-gtk/empathy-chat.c:1289 ../src/empathy-call-window.c:757
 msgid "Disconnected"
 msgstr "Desconectado"
 
-#: ../libempathy-gtk/empathy-chat.c:1660
+#: ../libempathy-gtk/empathy-chat.c:1700
 msgid "Connected"
 msgstr "Conectado"
 
-#: ../libempathy-gtk/empathy-chat.c:1710
+#: ../libempathy-gtk/empathy-chat.c:1750
 #: ../libempathy-gtk/empathy-log-window.c:501
 msgid "Conversation"
 msgstr "Conversación"
@@ -700,23 +704,20 @@ msgstr "_Abrir enlace"
 msgid "%A %B %d %Y"
 msgstr "%A %d %B %Y"
 
-#: ../libempathy-gtk/empathy-contact-dialogs.c:181
-msgid "Personal Information"
-msgstr "Información personal"
-
-#: ../libempathy-gtk/empathy-contact-dialogs.c:184
+#: ../libempathy-gtk/empathy-contact-dialogs.c:179
+#: ../libempathy-gtk/empathy-contact-dialogs.c:237
 msgid "Edit Contact Information"
 msgstr "Editar información del contacto"
 
-#: ../libempathy-gtk/empathy-contact-dialogs.c:187
-msgid "Contact Information"
-msgstr "Información del contacto"
+#: ../libempathy-gtk/empathy-contact-dialogs.c:288
+msgid "Personal Information"
+msgstr "Información personal"
 
-#: ../libempathy-gtk/empathy-contact-dialogs.c:269
+#: ../libempathy-gtk/empathy-contact-dialogs.c:368
 msgid "I would like to add you to my contact list."
 msgstr "Me gustaría añadirte a mi lista de contactos."
 
-#: ../libempathy-gtk/empathy-contact-dialogs.c:293
+#: ../libempathy-gtk/empathy-contact-dialogs.c:392
 msgid "New Contact"
 msgstr "Contacto nuevo"
 
@@ -728,30 +729,30 @@ msgstr "Decidir _luego"
 msgid "Subscription Request"
 msgstr "Petición de suscripción"
 
-#: ../libempathy-gtk/empathy-contact-list-view.c:1255
+#: ../libempathy-gtk/empathy-contact-list-view.c:1315
 #, c-format
 msgid "Do you really want to remove the group '%s'?"
 msgstr "¿Realmente quiere quitar el grupo Â«%s»?"
 
-#: ../libempathy-gtk/empathy-contact-list-view.c:1257
+#: ../libempathy-gtk/empathy-contact-list-view.c:1317
 msgid "Removing group"
 msgstr "Quitando grupo"
 
-#: ../libempathy-gtk/empathy-contact-list-view.c:1304
-#: ../libempathy-gtk/empathy-contact-list-view.c:1383
+#: ../libempathy-gtk/empathy-contact-list-view.c:1364
+#: ../libempathy-gtk/empathy-contact-list-view.c:1443
 msgid "_Remove"
 msgstr "_Quitar"
 
-#: ../libempathy-gtk/empathy-contact-list-view.c:1334
+#: ../libempathy-gtk/empathy-contact-list-view.c:1394
 #, c-format
 msgid "Do you really want to remove the contact '%s'?"
 msgstr "¿Realmente quiere quitar el contacto Â«%s»?"
 
-#: ../libempathy-gtk/empathy-contact-list-view.c:1336
+#: ../libempathy-gtk/empathy-contact-list-view.c:1396
 msgid "Removing contact"
 msgstr "Quitando el contacto"
 
-#: ../libempathy-gtk/empathy-contact-list-view.c:1341
+#: ../libempathy-gtk/empathy-contact-list-view.c:1401
 msgid "Sorry, I don't want you in my contact list anymore."
 msgstr "Lo siento, no te quiero en mi lista de contactos."
 
@@ -761,7 +762,6 @@ msgid "_Chat"
 msgstr "_Chat"
 
 #: ../libempathy-gtk/empathy-contact-menu.c:161
-#| msgid "_Call"
 msgctxt "menu item"
 msgid "_Call"
 msgstr "_Llamar"
@@ -792,24 +792,24 @@ msgstr "Invitando a esta sala"
 msgid "_Invite to chatroom"
 msgstr "_Invitar a la sala"
 
-#: ../libempathy-gtk/empathy-contact-selector.c:112
+#: ../libempathy-gtk/empathy-contact-selector.c:129
 msgid "Select a contact"
 msgstr "Seleccionar un contacto"
 
-#: ../libempathy-gtk/empathy-contact-widget.c:353
+#: ../libempathy-gtk/empathy-contact-widget.c:413
 msgid "Save Avatar"
 msgstr "Guardar avatar"
 
-#: ../libempathy-gtk/empathy-contact-widget.c:409
+#: ../libempathy-gtk/empathy-contact-widget.c:469
 msgid "Unable to save avatar"
 msgstr "No se pudo guardar el avatar"
 
-#: ../libempathy-gtk/empathy-contact-widget.c:904
+#: ../libempathy-gtk/empathy-contact-widget.c:952
 msgid "Select"
 msgstr "Seleccionar"
 
-#: ../libempathy-gtk/empathy-contact-widget.c:913
-#: ../src/empathy-main-window.c:882
+#: ../libempathy-gtk/empathy-contact-widget.c:961
+#: ../src/empathy-main-window.c:879
 msgid "Group"
 msgstr "Grupo"
 
@@ -952,66 +952,60 @@ msgstr "Conversación nueva"
 #. COL_DISPLAY_MARKUP
 #. COL_STATUS_CUSTOMISABLE
 #. COL_TYPE
-#: ../libempathy-gtk/empathy-presence-chooser.c:162
+#: ../libempathy-gtk/empathy-presence-chooser.c:169
 msgid "Custom Message..."
 msgstr "Mensaje personalizado…"
 
-#: ../libempathy-gtk/empathy-presence-chooser.c:217
+#: ../libempathy-gtk/empathy-presence-chooser.c:225
 msgid "Edit Custom Messages..."
 msgstr "Editar mensajes personalizados…"
 
-#: ../libempathy-gtk/empathy-presence-chooser.c:316
+#: ../libempathy-gtk/empathy-presence-chooser.c:324
 msgid "Click to remove this status as a favorite"
 msgstr "Pulse pare eliminar este estado de los favoritos"
 
-#: ../libempathy-gtk/empathy-presence-chooser.c:325
+#: ../libempathy-gtk/empathy-presence-chooser.c:333
 msgid "Click to make this status a favorite"
 msgstr "Pulse para hacer este estado uno favorito"
 
-#: ../libempathy-gtk/empathy-presence-chooser.c:359
+#: ../libempathy-gtk/empathy-presence-chooser.c:367
 msgid "Set status"
 msgstr "Establecer estado"
 
-#: ../libempathy-gtk/empathy-presence-chooser.c:766
+#: ../libempathy-gtk/empathy-presence-chooser.c:776
 msgid "Set your presence and current status"
 msgstr "Establecer su presencia y estado actual"
 
 #. Custom messages
-#: ../libempathy-gtk/empathy-presence-chooser.c:987
+#: ../libempathy-gtk/empathy-presence-chooser.c:1011
 msgid "Custom messages..."
 msgstr "Mensajes personalizados…"
 
-#: ../libempathy-gtk/empathy-presence-chooser.ui.h:1
-msgid "Custom message"
-msgstr "Mensaje personalizado…"
+#: ../libempathy-gtk/empathy-status-preset-dialog.c:360
+msgid "Enter Custom Message"
+msgstr "Introducir mensaje personalizado"
 
-#: ../libempathy-gtk/empathy-presence-chooser.ui.h:2
-msgid "Message:"
-msgstr "Mensaje:"
+#: ../libempathy-gtk/empathy-status-preset-dialog.c:482
+msgid "Edit Custom Messages"
+msgstr "Editar mensajes personalizados"
 
-#: ../libempathy-gtk/empathy-presence-chooser.ui.h:3
-msgid "Save message"
-msgstr "Guardar mensaje"
-
-#: ../libempathy-gtk/empathy-presence-chooser.ui.h:4
-msgid "Status:"
-msgstr "Estado:"
-
-#: ../libempathy-gtk/empathy-spell-dialog.c:81
-msgid "Word"
-msgstr "Palabra"
+#: ../libempathy-gtk/empathy-status-preset-dialog.ui.h:1
+msgid "Add _New Preset"
+msgstr ""
 
-#: ../libempathy-gtk/empathy-spell-dialog.c:255
-msgid "Suggestions for the word"
-msgstr "Sugerencias para la palabra"
+#: ../libempathy-gtk/empathy-status-preset-dialog.ui.h:2
+#, fuzzy
+#| msgid "Save message"
+msgid "Saved Presets"
+msgstr "Guardar mensaje"
 
-#: ../libempathy-gtk/empathy-spell-dialog.ui.h:1
-msgid "Spell Checker"
-msgstr "Corrector ortográfico"
+#: ../libempathy-gtk/empathy-status-preset-dialog.ui.h:3
+msgid "gtk-add"
+msgstr "gtk-add"
 
-#: ../libempathy-gtk/empathy-spell-dialog.ui.h:2
-msgid "Suggestions for the word:"
-msgstr "Sugerencias para la palabra:"
+#: ../libempathy-gtk/empathy-status-preset-dialog.ui.h:4
+msgid "gtk-remove"
+msgstr "gtk-remove"
 
 #: ../libempathy-gtk/empathy-theme-manager.c:60
 msgid "Classic"
@@ -1263,7 +1257,7 @@ msgid "Megaphone"
 msgstr "Megáfono"
 
 #: ../megaphone/data/GNOME_Megaphone_Applet.server.in.in.h:2
-#: ../megaphone/src/megaphone-applet.c:417
+#: ../megaphone/src/megaphone-applet.c:527
 msgid "Talk!"
 msgstr "Hablar"
 
@@ -1281,11 +1275,11 @@ msgstr "_Información"
 msgid "_Preferences"
 msgstr "_Preferencias"
 
-#: ../megaphone/src/megaphone-applet.c:255
+#: ../megaphone/src/megaphone-applet.c:168
 msgid "Please configure a contact."
 msgstr "Configure un contacto."
 
-#: ../megaphone/src/megaphone-applet.c:348
+#: ../megaphone/src/megaphone-applet.c:258
 msgid "Select contact..."
 msgstr "Seleccione un contacto…"
 
@@ -1298,19 +1292,19 @@ msgstr "Presencia"
 msgid "Set your own presence"
 msgstr "Establezca su propia presencia"
 
-#: ../src/empathy.c:430
+#: ../src/empathy.c:437
 msgid "Don't connect on startup"
 msgstr "No conectarse automáticamente al inicio"
 
-#: ../src/empathy.c:434
+#: ../src/empathy.c:441
 msgid "Don't show the contact list on startup"
 msgstr "No mostrar la lista de contactos al inicio"
 
-#: ../src/empathy.c:438
+#: ../src/empathy.c:445
 msgid "Show the accounts dialog"
 msgstr "Mostrar el diálogo de las cuentas"
 
-#: ../src/empathy.c:450
+#: ../src/empathy.c:457
 msgid "- Empathy Instant Messenger"
 msgstr "- Mensajería instantánea Empathy"
 
@@ -1365,12 +1359,12 @@ msgid "Accounts"
 msgstr "Cuentas"
 
 #. To translator: %s is the protocol name
-#: ../src/empathy-accounts-dialog.c:833
+#: ../src/empathy-accounts-dialog.c:834
 #, c-format
 msgid "New %s account"
 msgstr "Cuenta de %s nueva"
 
-#: ../src/empathy-accounts-dialog.c:943
+#: ../src/empathy-accounts-dialog.c:944
 #, c-format
 msgid ""
 "You are about to remove your %s account!\n"
@@ -1379,7 +1373,7 @@ msgstr ""
 "Va a eliminar su cuenta %s\n"
 "¿Seguro que quiere continuar?"
 
-#: ../src/empathy-accounts-dialog.c:949
+#: ../src/empathy-accounts-dialog.c:950
 msgid ""
 "Any associated conversations and chat rooms will NOT be removed if you "
 "decide to proceed.\n"
@@ -1429,48 +1423,47 @@ msgid "Type:"
 msgstr "Tipo:"
 
 #: ../src/empathy-accounts-dialog.ui.h:10
-#| msgid "_Add Contact..."
 msgid "_Add..."
 msgstr "_Añadir…"
 
-#: ../src/empathy-call-window.c:319
+#: ../src/empathy-call-window.c:320
 msgid "Contrast"
 msgstr "Contraste"
 
-#: ../src/empathy-call-window.c:322
+#: ../src/empathy-call-window.c:323
 msgid "Brightness"
 msgstr "Brillo"
 
-#: ../src/empathy-call-window.c:325
+#: ../src/empathy-call-window.c:326
 msgid "Gamma"
 msgstr "Gamma"
 
-#: ../src/empathy-call-window.c:429
+#: ../src/empathy-call-window.c:430
 msgid "Volume"
 msgstr "Volumen"
 
-#: ../src/empathy-call-window.c:532
+#: ../src/empathy-call-window.c:533
 msgid "_Sidebar"
 msgstr "Barra _lateral"
 
-#: ../src/empathy-call-window.c:550
+#: ../src/empathy-call-window.c:551
 msgid "Dialpad"
 msgstr "Teclado de llamada"
 
-#: ../src/empathy-call-window.c:556
+#: ../src/empathy-call-window.c:557
 msgid "Audio input"
 msgstr "Entrada de sonido"
 
-#: ../src/empathy-call-window.c:560
+#: ../src/empathy-call-window.c:561
 msgid "Video input"
 msgstr "Entrada de vídeo"
 
-#: ../src/empathy-call-window.c:573
+#: ../src/empathy-call-window.c:574
 msgid "Connecting..."
 msgstr "Conectando…"
 
 #. Translators: number of minutes:seconds the caller has been connected
-#: ../src/empathy-call-window.c:837
+#: ../src/empathy-call-window.c:839
 #, c-format
 msgid "Connected â€” %d:%02dm"
 msgstr "Conectado â€” %d:%02dm"
@@ -1550,59 +1543,59 @@ msgstr "_Rechazar"
 msgid "_Answer"
 msgstr "Re_spuesta"
 
-#: ../src/empathy-event-manager.c:516
+#: ../src/empathy-event-manager.c:507
 #, c-format
 msgid "Incoming call from %s"
 msgstr "Llamada entrante de %s"
 
-#: ../src/empathy-event-manager.c:564
+#: ../src/empathy-event-manager.c:547
 #, c-format
 msgid "%s is offering you an invitation"
 msgstr "%s le está ofreciendo una invitación"
 
-#: ../src/empathy-event-manager.c:570
+#: ../src/empathy-event-manager.c:553
 msgid "An external application will be started to handle it."
 msgstr "Se iniciará una aplicación externa para manejarla."
 
-#: ../src/empathy-event-manager.c:575
+#: ../src/empathy-event-manager.c:558
 msgid "You don't have the needed external application to handle it."
 msgstr "No tiene la aplicación externa necesaria para manejarla."
 
-#: ../src/empathy-event-manager.c:698
+#: ../src/empathy-event-manager.c:685
 msgid "Room invitation"
 msgstr "Invitación a una sala"
 
-#: ../src/empathy-event-manager.c:701
+#: ../src/empathy-event-manager.c:688
 #, c-format
 msgid "%s is inviting you to join %s"
 msgstr "%s le está invitando a unirse a %s"
 
 #. Decline button
-#: ../src/empathy-event-manager.c:709 ../src/empathy-ft-manager.c:1031
+#: ../src/empathy-event-manager.c:696 ../src/empathy-ft-manager.c:1037
 msgid "_Decline"
 msgstr "_Rechazar"
 
-#: ../src/empathy-event-manager.c:714
+#: ../src/empathy-event-manager.c:701
 #: ../src/empathy-new-chatroom-dialog.ui.h:6
 msgid "_Join"
 msgstr "_Unirse"
 
-#: ../src/empathy-event-manager.c:744
+#: ../src/empathy-event-manager.c:740
 #, c-format
 msgid "%s invited you to join %s"
 msgstr "%s le ha invitado a unirse a %s"
 
-#: ../src/empathy-event-manager.c:867
+#: ../src/empathy-event-manager.c:848
 #, c-format
 msgid "Incoming file transfer from %s"
 msgstr "Transferencia de archivo entrante de %s"
 
-#: ../src/empathy-event-manager.c:961
+#: ../src/empathy-event-manager.c:923
 #, c-format
 msgid "Subscription requested by %s"
 msgstr "Petición de suscripción de %s"
 
-#: ../src/empathy-event-manager.c:965
+#: ../src/empathy-event-manager.c:927
 #, c-format
 msgid ""
 "\n"
@@ -1652,109 +1645,115 @@ msgid "Unknown reason"
 msgstr "Razón desconocida"
 
 #. translators: first %s is filename, second %s is the contact name
-#: ../src/empathy-ft-manager.c:226
+#: ../src/empathy-ft-manager.c:228
 #, c-format
 msgid "Receiving \"%s\" from %s"
 msgstr "Recibiendo Â«%s» de %s"
 
 #. translators: first %s is filename, second %s is the contact name
-#: ../src/empathy-ft-manager.c:229
+#: ../src/empathy-ft-manager.c:231
 #, c-format
 msgid "Sending \"%s\" to %s"
 msgstr "Enviando Â«%s» a %s"
 
-#: ../src/empathy-ft-manager.c:239
+#: ../src/empathy-ft-manager.c:242
 msgctxt "file size"
 msgid "Unknown"
 msgstr "Desconocido"
 
 #. translators: first %s is the transferred size, second %s is
 #. * the total file size
-#: ../src/empathy-ft-manager.c:247
+#: ../src/empathy-ft-manager.c:251
 #, c-format
-msgid "%s of %s"
-msgstr "%s de %s"
+#| msgid "%s of %s"
+msgid "%s of %s at %s/s"
+msgstr "%s de %s en %s/s"
 
-#: ../src/empathy-ft-manager.c:254
+#: ../src/empathy-ft-manager.c:259
 msgid "Waiting for the other participant's response"
 msgstr "Esperando la respuesta del otro participante"
 
-#: ../src/empathy-ft-manager.c:264
+#: ../src/empathy-ft-manager.c:269
 #, c-format
 msgid "\"%s\" received from %s"
 msgstr "«%s» recibido de %s"
 
-#: ../src/empathy-ft-manager.c:270
+#: ../src/empathy-ft-manager.c:275
 #, c-format
 msgid "\"%s\" sent to %s"
 msgstr "«%s» enviado a %s"
 
-#: ../src/empathy-ft-manager.c:273
+#: ../src/empathy-ft-manager.c:278
 msgid "File transfer completed"
 msgstr "Transferencia de archivo completada"
 
-#: ../src/empathy-ft-manager.c:282
+#: ../src/empathy-ft-manager.c:287
 #, c-format
 msgid "\"%s\" receiving from %s"
 msgstr "«%s» recibiendo de %s"
 
-#: ../src/empathy-ft-manager.c:288
+#: ../src/empathy-ft-manager.c:293
 #, c-format
 msgid "\"%s\" sending to %s"
 msgstr "«%s» enviando a %s"
 
-#: ../src/empathy-ft-manager.c:291
+#: ../src/empathy-ft-manager.c:296
 #, c-format
 msgid "File transfer canceled: %s"
 msgstr "Transferencia de archivo cancelada: %s"
 
-#: ../src/empathy-ft-manager.c:306
+#: ../src/empathy-ft-manager.c:310
+msgctxt "remaining time"
+msgid "Stalled"
+msgstr "Parado"
+
+#: ../src/empathy-ft-manager.c:313
 msgctxt "remaining time"
 msgid "Unknown"
 msgstr "Desconocido"
 
-#: ../src/empathy-ft-manager.c:366
+#: ../src/empathy-ft-manager.c:372
 msgctxt "file transfer percent"
 msgid "Unknown"
 msgstr "Desconocido"
 
-#: ../src/empathy-ft-manager.c:662
+#: ../src/empathy-ft-manager.c:668
 msgid "%"
 msgstr "%"
 
-#: ../src/empathy-ft-manager.c:674
+#: ../src/empathy-ft-manager.c:680
 msgid "File"
 msgstr "Archivo"
 
-#: ../src/empathy-ft-manager.c:696
+#: ../src/empathy-ft-manager.c:702
 msgid "Remaining"
 msgstr "Restantes"
 
-#: ../src/empathy-ft-manager.c:894
+#: ../src/empathy-ft-manager.c:900
 msgid "Cannot save file to this location"
 msgstr "No se puede guardar el archivo en esta ubicación"
 
-#: ../src/empathy-ft-manager.c:940
+#: ../src/empathy-ft-manager.c:946
 msgid "Save file as..."
 msgstr "Guardar archivo como…"
 
-#: ../src/empathy-ft-manager.c:1010
+#: ../src/empathy-ft-manager.c:1016
 msgid "unknown size"
 msgstr "tamaño desconocido"
 
-#: ../src/empathy-ft-manager.c:1016
+#: ../src/empathy-ft-manager.c:1022
 #, c-format
 msgid "%s would like to send you a file"
 msgstr "%s quiere enviarle un archivo"
 
 #. Translators: the first %s is the file name, the second %s is the file size
-#: ../src/empathy-ft-manager.c:1022
+#: ../src/empathy-ft-manager.c:1028
 #, c-format
 msgid "Do you want to accept the file \"%s\" (%s)?"
 msgstr "¿Quiere aceptar el archivo Â«%s» (%s)?"
 
 #. Accept button
-#: ../src/empathy-ft-manager.c:1040
+#: ../src/empathy-ft-manager.c:1046
 msgid "_Accept"
 msgstr "_Aceptar"
 
@@ -1793,71 +1792,71 @@ msgstr ""
 msgid "Import Accounts"
 msgstr "Importar cuentas"
 
-#: ../src/empathy-main-window.c:393
+#: ../src/empathy-main-window.c:392
 msgid "_Edit account"
 msgstr "_Editar cuenta"
 
-#: ../src/empathy-main-window.c:496
+#: ../src/empathy-main-window.c:495
 msgid "No error specified"
 msgstr "No se especificó el error"
 
-#: ../src/empathy-main-window.c:499
+#: ../src/empathy-main-window.c:498
 msgid "Network error"
 msgstr "Error de red"
 
-#: ../src/empathy-main-window.c:502
+#: ../src/empathy-main-window.c:501
 msgid "Authentication failed"
 msgstr "Falló la autenticación"
 
-#: ../src/empathy-main-window.c:505
+#: ../src/empathy-main-window.c:504
 msgid "Encryption error"
 msgstr "Error de cifrado"
 
-#: ../src/empathy-main-window.c:508
+#: ../src/empathy-main-window.c:507
 msgid "Name in use"
 msgstr "Nombre en uso"
 
-#: ../src/empathy-main-window.c:511
+#: ../src/empathy-main-window.c:510
 msgid "Certificate not provided"
 msgstr "No se proporcionó el certificado"
 
-#: ../src/empathy-main-window.c:514
+#: ../src/empathy-main-window.c:513
 msgid "Certificate untrusted"
 msgstr "Certificado sin confianza"
 
-#: ../src/empathy-main-window.c:517
+#: ../src/empathy-main-window.c:516
 msgid "Certificate expired"
 msgstr "El certificado ha expirado"
 
-#: ../src/empathy-main-window.c:520
+#: ../src/empathy-main-window.c:519
 msgid "Certificate not activated"
 msgstr "El certificado no está activado"
 
-#: ../src/empathy-main-window.c:523
+#: ../src/empathy-main-window.c:522
 msgid "Certificate hostname mismatch"
 msgstr "El nombre del equipo del certificado no coincide"
 
-#: ../src/empathy-main-window.c:526
+#: ../src/empathy-main-window.c:525
 msgid "Certificate fingerprint mismatch"
 msgstr "La huella del certificado no coincide"
 
-#: ../src/empathy-main-window.c:529
+#: ../src/empathy-main-window.c:528
 msgid "Certificate self-signed"
 msgstr "Certificado firmado consigo mismo"
 
-#: ../src/empathy-main-window.c:532
+#: ../src/empathy-main-window.c:531
 msgid "Certificate error"
 msgstr "Error del certificado"
 
-#: ../src/empathy-main-window.c:535
+#: ../src/empathy-main-window.c:534
 msgid "Unknown error"
 msgstr "Error desconocido"
 
-#: ../src/empathy-main-window.c:865
+#: ../src/empathy-main-window.c:862
 msgid "Contact"
 msgstr "Contacto"
 
-#: ../src/empathy-main-window.c:1205
+#: ../src/empathy-main-window.c:1178
 msgid "Show and edit accounts"
 msgstr "Mostrar y editar cuentas"
 
@@ -1921,7 +1920,7 @@ msgstr "Sala de chat"
 msgid "Members"
 msgstr "Miembros"
 
-#: ../src/empathy-new-chatroom-dialog.c:447
+#: ../src/empathy-new-chatroom-dialog.c:449
 #, c-format
 msgctxt ""
 "Room/Join's roomlist tooltip. Parametersare a channel name, yes/no, yes/no "
@@ -1937,13 +1936,13 @@ msgstr ""
 "Contraseña necesaria: %s\n"
 "Miembros: %s"
 
-#: ../src/empathy-new-chatroom-dialog.c:449
-#: ../src/empathy-new-chatroom-dialog.c:450
+#: ../src/empathy-new-chatroom-dialog.c:451
+#: ../src/empathy-new-chatroom-dialog.c:452
 msgid "Yes"
 msgstr "Sí"
 
-#: ../src/empathy-new-chatroom-dialog.c:449
-#: ../src/empathy-new-chatroom-dialog.c:450
+#: ../src/empathy-new-chatroom-dialog.c:451
+#: ../src/empathy-new-chatroom-dialog.c:452
 msgid "No"
 msgstr "No"
 
@@ -2142,6 +2141,33 @@ msgstr ""
 "Se le ha ofrecido una invitación para el servicio %s pero no tiene la "
 "aplicación necesaria para manejarla"
 
+#~ msgid "_Check Word Spelling..."
+#~ msgstr "_Comprobar ortografía…"
+
+#~ msgid "Contact Information"
+#~ msgstr "Información del contacto"
+
+#~ msgid "Custom message"
+#~ msgstr "Mensaje personalizado…"
+
+#~ msgid "Message:"
+#~ msgstr "Mensaje:"
+
+#~ msgid "Status:"
+#~ msgstr "Estado:"
+
+#~ msgid "Word"
+#~ msgstr "Palabra"
+
+#~ msgid "Suggestions for the word"
+#~ msgstr "Sugerencias para la palabra"
+
+#~ msgid "Spell Checker"
+#~ msgstr "Corrector ortográfico"
+
+#~ msgid "Suggestions for the word:"
+#~ msgstr "Sugerencias para la palabra:"
+
 #~ msgid "Forget password and clear the entry."
 #~ msgstr "Olvidar la contraseña y limpiar la entrada."
 
@@ -2323,15 +2349,9 @@ msgstr ""
 #~ "Indica si se debe mostrar una ventana emergente cuando un contacto vuelva "
 #~ "a estar disponible."
 
-#~ msgid "gtk-clear"
-#~ msgstr "gtk-clear"
-
 #~ msgid "gtk-cancel"
 #~ msgstr "gtk-cancel"
 
-#~ msgid "gtk-ok"
-#~ msgstr "gtk-ok"
-
 #~ msgid "Invitation Error"
 #~ msgstr "Error en la invitación"
 
index 8ec61ff8e99815765436425f10f59028d2cc9e00..ef6faa0a74e4bf2b547a578917eb53e151589d19 100644 (file)
@@ -1,3 +1,5 @@
+include $(top_srcdir)/tools/shave.mk
+
 PYDEFS=`pkg-config --variable=defsdir pygtk-2.0`
 
 AM_CPPFLAGS =                                           \
@@ -31,7 +33,7 @@ empathy_la_LDFLAGS =                                  \
        -module -avoid-version
 
 pyempathy.c: pyempathy.override pyempathy.defs
-       $(PYGOBJECTCODEGEN)                             \
+       $(QUIET_GEN)$(PYGOBJECTCODEGEN)                         \
                --prefix empathy                        \
                --register $(PYDEFS)/gdk-types.defs     \
                --register $(PYDEFS)/gtk-types.defs     \
index 3e9fd624c146d10ec31ef0f7d8d4871aa2fc6394..6f8f0f65d47982eaadcfda3567aabbab7a19ceac 100644 (file)
   (return-type "EmpathyTpChat*")
 )
 
+(define-method set_tp_chat
+  (of-object "EmpathyChatroom")
+  (c-name "empathy_chatroom_set_tp_chat")
+  (return-type "none")
+  (parameters
+    '("EmpathyTpChat*" "tp_chat")
+  )
+)
+
+(define-method is_favorite
+  (of-object "EmpathyChatroom")
+  (c-name "empathy_chatroom_is_favorite")
+  (return-type "gboolean")
+)
+
+(define-method set_favorite
+  (of-object "EmpathyChatroom")
+  (c-name "empathy_chatroom_set_favorite")
+  (return-type "none")
+  (parameters
+    '("gboolean" "favorite")
+  )
+)
+
 
 
 ;; From empathy-chatroom-manager.h
   )
 )
 
+(define-function contact_new_for_log
+  (c-name "empathy_contact_new_for_log")
+  (return-type "EmpathyContact*")
+  (parameters
+    '("McAccount*" "account")
+    '("const-gchar*" "id")
+    '("const-gchar*" "name")
+    '("gboolean" "is_user")
+  )
+)
+
 (define-method get_tp_contact
   (of-object "EmpathyContact")
   (c-name "empathy_contact_get_tp_contact")
   (parameters
     '("guint" "n_ids")
     '("const-gchar*-const*" "ids")
-    '("EmpathyTpContactFactoryGotContactsCb" "callback")
+    '("EmpathyTpContactFactoryContactsByIdCb" "callback")
     '("gpointer" "user_data")
     '("GDestroyNotify" "destroy")
     '("GObject*" "weak_object")
   (parameters
     '("guint" "n_handles")
     '("const-TpHandle*" "handles")
-    '("EmpathyTpContactFactoryGotContactsCb" "callback")
+    '("EmpathyTpContactFactoryContactsByHandleCb" "callback")
+    '("gpointer" "user_data")
+    '("GDestroyNotify" "destroy")
+    '("GObject*" "weak_object")
+  )
+)
+
+(define-method get_from_id
+  (of-object "EmpathyTpContactFactory")
+  (c-name "empathy_tp_contact_factory_get_from_id")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "id")
+    '("EmpathyTpContactFactoryContactCb" "callback")
+    '("gpointer" "user_data")
+    '("GDestroyNotify" "destroy")
+    '("GObject*" "weak_object")
+  )
+)
+
+(define-method get_from_handle
+  (of-object "EmpathyTpContactFactory")
+  (c-name "empathy_tp_contact_factory_get_from_handle")
+  (return-type "none")
+  (parameters
+    '("TpHandle" "handle")
+    '("EmpathyTpContactFactoryContactCb" "callback")
     '("gpointer" "user_data")
     '("GDestroyNotify" "destroy")
     '("GObject*" "weak_object")
   (return-type "none")
 )
 
-(define-method close
-  (of-object "EmpathyTpFile")
-  (c-name "empathy_tp_file_close")
-  (return-type "none")
-)
-
 (define-method offer
   (of-object "EmpathyTpFile")
   (c-name "empathy_tp_file_offer")
   (return-type "gint")
 )
 
+(define-method get_speed
+  (of-object "EmpathyTpFile")
+  (c-name "empathy_tp_file_get_speed")
+  (return-type "gdouble")
+)
+
 (define-method get_content_type
   (of-object "EmpathyTpFile")
   (c-name "empathy_tp_file_get_content_type")
index 84204e76402c85b1430a63d3b20853cd9d90824a..3f4c6d52dada79e2655154cb89955f7e3d795dba 100644 (file)
@@ -1,3 +1,5 @@
+include $(top_srcdir)/tools/shave.mk
+
 PYDEFS=`pkg-config --variable=defsdir pygtk-2.0`
 
 AM_CPPFLAGS =                                           \
@@ -31,7 +33,7 @@ empathygtk_la_LDFLAGS =                                       \
        -module -avoid-version
 
 pyempathygtk.c: pyempathygtk.override pyempathygtk.defs
-       $(PYGOBJECTCODEGEN)                                                     \
+       $(QUIET_GEN)$(PYGOBJECTCODEGEN)                                                 \
                --prefix empathy                                        \
                --register $(PYDEFS)/gdk-types.defs                     \
                --register $(PYDEFS)/gtk-types.defs                     \
index df829a0313eaaf5391a9caa64908c0f32a113da0..816261d3994cb09f795692c5aa0147c5f94339d1 100644 (file)
   (return-type "GtkWidget*")
 )
 
-(define-method get_account
+(define-method dup_account
   (of-object "EmpathyAccountChooser")
-  (c-name "empathy_account_chooser_get_account")
+  (c-name "empathy_account_chooser_dup_account")
   (return-type "McAccount*")
 )
 
   )
 )
 
-(define-method get_selected
+(define-method dup_selected
   (of-object "EmpathyContactListView")
-  (c-name "empathy_contact_list_view_get_selected")
+  (c-name "empathy_contact_list_view_dup_selected")
   (return-type "EmpathyContact*")
 )
 
   (return-type "GtkWidget*")
 )
 
-(define-function profile_chooser_get_selected
-  (c-name "empathy_profile_chooser_get_selected")
+(define-function profile_chooser_dup_selected
+  (c-name "empathy_profile_chooser_dup_selected")
   (return-type "McProfile*")
   (parameters
     '("GtkWidget*" "widget")
diff --git a/shave-libtool.in b/shave-libtool.in
new file mode 100644 (file)
index 0000000..1f3a720
--- /dev/null
@@ -0,0 +1,69 @@
+#!/bin/sh
+
+# we need sed
+SED=@SED@
+if test -z "$SED" ; then
+SED=sed
+fi
+
+lt_unmangle ()
+{
+   last_result=`echo $1 | $SED -e 's#.libs/##' -e 's#[0-9a-zA-Z_\-\.]*_la-##'`
+}
+
+# the real libtool to use
+LIBTOOL="$1"
+shift
+
+# if 1, don't print anything, the underlaying wrapper will do it
+pass_though=0
+
+# scan the arguments, keep the right ones for libtool, and discover the mode
+preserved_args=
+while test "$#" -gt 0; do
+    opt="$1"
+    shift
+
+    case $opt in
+    --mode=*)
+        mode=`echo $opt | $SED -e 's/[-_a-zA-Z0-9]*=//'`
+        preserved_args="$preserved_args $opt"
+        ;;
+    -o)
+        lt_output="$1"
+        preserved_args="$preserved_args $opt"
+       ;;
+    *)
+        preserved_args="$preserved_args $opt"
+        ;;
+      esac
+done
+
+case "$mode" in
+compile)
+    # shave will be called and print the actual CC/CXX/LINK line
+    preserved_args="$preserved_args --shave-mode=$mode"
+    pass_though=1
+    ;;
+link)
+    preserved_args="$preserved_args --shave-mode=$mode"
+    Q="  LINK  "
+    ;;
+*)
+    # let's u
+    # echo "*** libtool: Unimplemented mode: $mode, fill a bug report"
+    ;;
+esac
+
+lt_unmangle "$lt_output"
+output=$last_result
+
+if test -z $V; then
+    if test $pass_though -eq 0; then
+        echo "$Q$output"
+    fi
+    $LIBTOOL --silent $preserved_args
+else
+    echo $LIBTOOL $preserved_args
+    $LIBTOOL $preserved_args
+fi
diff --git a/shave.in b/shave.in
new file mode 100644 (file)
index 0000000..5c16f27
--- /dev/null
+++ b/shave.in
@@ -0,0 +1,79 @@
+#!/bin/sh
+
+# we need sed
+SED=@SED@
+if test -z "$SED" ; then
+SED=sed
+fi
+
+lt_unmangle ()
+{
+   last_result=`echo $1 | $SED -e 's#.libs/##' -e 's#[0-9a-zA-Z_\-\.]*_la-##'`
+}
+
+# the tool to wrap (cc, cxx, ar, ranlib, ..)
+tool="$1"
+shift
+
+# the reel tool (to call)
+REEL_TOOL="$1"
+shift
+
+pass_through=0
+preserved_args=
+while test "$#" -gt 0; do
+    opt="$1"
+    shift
+
+    case $opt in
+    --shave-mode=*)
+        mode=`echo $opt | $SED -e 's/[-_a-zA-Z0-9]*=//'`
+       ;;
+    -o)
+        lt_output="$1"
+        preserved_args="$preserved_args $opt"
+       ;;
+    *)
+        preserved_args="$preserved_args $opt"
+        ;;
+      esac
+done
+
+# mode=link is handled in the libtool wrapper
+case "$mode,$tool" in
+link,*)
+    pass_through=1
+    ;;
+*,cxx)
+    Q="  CXX   "
+    ;;
+*,cc)
+    Q="  CC    "
+    ;;
+*,fc)
+    Q="  FC    "
+    ;;
+*,f77)
+    Q="  F77   "
+    ;;
+*,objc)
+    Q="  OBJC   "
+    ;;
+*,*)
+    # should not happen
+    Q="  CC    "
+    ;;
+esac
+
+lt_unmangle "$lt_output"
+output=$last_result
+
+if test -z $V; then
+    if test $pass_through -eq 0; then
+        echo "$Q$output"
+    fi
+    $REEL_TOOL $preserved_args
+else
+    echo $REEL_TOOL $preserved_args
+    $REEL_TOOL $preserved_args
+fi
index 76a5aa77da951ed35c0db2f0397fd1386ce0483b..f24ef3e95aa6873f2c60a4d8704b2d8939ffb0cb 100644 (file)
@@ -1,3 +1,5 @@
+include $(top_srcdir)/tools/shave.mk
+
 AM_CPPFLAGS =                                          \
        -I$(top_srcdir)                                 \
        $(EMPATHY_CFLAGS)                               \
@@ -63,7 +65,7 @@ dist_man_MANS =                       \
 
 # rules for making the glib enum objects
 %-enumtypes.h: %.h Makefile.in
-       glib-mkenums \
+       $(QUIET_GEN)glib-mkenums \
        --fhead "#ifndef __$(shell echo $* | tr [:lower:]- [:upper:]_)_ENUM_TYPES_H__\n#define __$(shell echo $* | tr [:lower:]- [:upper:]_)_ENUM_TYPES_H__\n\n#include <glib-object.h>\n\nG_BEGIN_DECLS\n" \
        --fprod "/* enumerations from \"@filename@\" */\n" \
        --vhead "GType @enum_name@_get_type (void);\n#define $(shell echo $* | tr [:lower:]- [:upper:]_ | sed 's/_.*//')_TYPE_@ENUMSHORT@ (@enum_name@_get_type())\n"         \
@@ -71,7 +73,7 @@ dist_man_MANS =                       \
        $< > $@
 
 %-enumtypes.c: %.h Makefile.in
-       glib-mkenums \
+       $(QUIET_GEN)glib-mkenums \
        --fhead "#include <$*.h>\n#include <$*-enumtypes.h>" \
        --fprod "\n/* enumerations from \"@filename@\" */" \
        --vhead "GType\n@enum_name@_get_type (void)\n{\n  static GType etype = 0;\n  if (etype == 0) {\n    static const G@Type@Value values[] = {"     \
index 98e58d4f318ce7d632b2bd1cb3938eef56182e06..87531f0fe72266fa7f250c3229a169094c9a4086 100644 (file)
@@ -200,6 +200,7 @@ ft_manager_update_ft_row (EmpathyFTManager *ft_manager,
   TpFileTransferState state;
   TpFileTransferStateChangeReason reason;
   gboolean incoming;
+  gdouble speed;
 
   row_ref = ft_manager_get_row_from_tp_file (ft_manager, tp_file);
   g_return_if_fail (row_ref != NULL);
@@ -210,6 +211,7 @@ ft_manager_update_ft_row (EmpathyFTManager *ft_manager,
   total_size = empathy_tp_file_get_size (tp_file);
   state = empathy_tp_file_get_state (tp_file, &reason);
   incoming = empathy_tp_file_is_incoming (tp_file);
+  speed = empathy_tp_file_get_speed (tp_file);
 
   switch (state)
     {
@@ -234,6 +236,7 @@ ft_manager_update_ft_row (EmpathyFTManager *ft_manager,
           {
             gchar *total_size_str;
             gchar *transferred_bytes_str;
+            gchar *speed_str;
 
             if (total_size == EMPATHY_TP_FILE_UNKNOWN_SIZE)
               total_size_str = g_strdup (C_("file size", "Unknown"));
@@ -241,13 +244,15 @@ ft_manager_update_ft_row (EmpathyFTManager *ft_manager,
               total_size_str = g_format_size_for_display (total_size);
 
             transferred_bytes_str = g_format_size_for_display (transferred_bytes);
+            speed_str = g_format_size_for_display (speed);
 
             /* translators: first %s is the transferred size, second %s is
              * the total file size */
-            second_line = g_strdup_printf (_("%s of %s"), transferred_bytes_str,
-                total_size_str);
+            second_line = g_strdup_printf (_("%s of %s at %s/s"),
+                transferred_bytes_str, total_size_str, speed_str);
             g_free (transferred_bytes_str);
             g_free (total_size_str);
+            g_free (speed_str);
 
           }
         else
@@ -301,8 +306,10 @@ ft_manager_update_ft_row (EmpathyFTManager *ft_manager,
 
   if (remaining < 0)
     {
-      if (state != TP_FILE_TRANSFER_STATE_COMPLETED &&
-          state != TP_FILE_TRANSFER_STATE_CANCELLED)
+      if (state == TP_FILE_TRANSFER_STATE_OPEN)
+        remaining_str = g_strdup (C_("remaining time", "Stalled"));      
+      else if (state != TP_FILE_TRANSFER_STATE_COMPLETED &&
+               state != TP_FILE_TRANSFER_STATE_CANCELLED)
         remaining_str = g_strdup (C_("remaining time", "Unknown"));
     }
   else
@@ -334,9 +341,8 @@ ft_manager_update_ft_row (EmpathyFTManager *ft_manager,
 }
 
 static void
-ft_manager_transferred_bytes_changed_cb (EmpathyTpFile *tp_file,
-                                         GParamSpec *pspec,
-                                         EmpathyFTManager *ft_manager)
+ft_manager_refresh_cb (EmpathyTpFile *tp_file,
+                       EmpathyFTManager *ft_manager)
 {
   ft_manager_update_ft_row (ft_manager, tp_file);
 }
@@ -441,7 +447,7 @@ ft_manager_remove_file_from_model (EmpathyFTManager *ft_manager,
   if (update_selection)
     gtk_tree_selection_select_iter (selection, &iter);
 
-  empathy_tp_file_close (tp_file);
+  empathy_tp_file_cancel (tp_file);
 }
 
 static gboolean
@@ -840,8 +846,8 @@ ft_manager_add_tp_file_to_list (EmpathyFTManager *ft_manager,
   ft_manager_update_ft_row (ft_manager, tp_file);
   g_signal_connect (tp_file, "notify::state",
       G_CALLBACK (ft_manager_state_changed_cb), ft_manager);
-  g_signal_connect (tp_file, "notify::transferred-bytes",
-      G_CALLBACK (ft_manager_transferred_bytes_changed_cb), ft_manager);
+  g_signal_connect (tp_file, "refresh",
+      G_CALLBACK (ft_manager_refresh_cb), ft_manager);
 
   gtk_window_present (GTK_WINDOW (ft_manager->priv->window));
 }
index b9993a8f543edc65dbefc9b49119506f91658f20..5cbf877e5b739a8b38931bec4ee45625c2af159b 100644 (file)
@@ -58,6 +58,7 @@
 #include "empathy-new-chatroom-dialog.h"
 #include "empathy-chatrooms-window.h"
 #include "empathy-event-manager.h"
+#include "empathy-ft-manager.h"
 
 #define DEBUG_FLAG EMPATHY_DEBUG_OTHER
 #include <libempathy/empathy-debug.h>
@@ -682,6 +683,20 @@ main_window_chat_add_contact_cb (GtkAction         *action,
        empathy_new_contact_dialog_show (GTK_WINDOW (window->window));
 }
 
+static void
+main_window_chat_show_ft_manager (GtkAction         *action,
+                                 EmpathyMainWindow *window)
+{
+       EmpathyFTManager *manager;
+       GtkWidget *dialog;
+
+       manager = empathy_ft_manager_dup_singleton ();
+       dialog = empathy_ft_manager_get_dialog (manager);
+
+       gtk_window_present (GTK_WINDOW (dialog));
+       g_object_unref (manager);
+}
+
 static void
 main_window_chat_show_offline_cb (GtkToggleAction   *action,
                                  EmpathyMainWindow *window)
@@ -1122,6 +1137,7 @@ empathy_main_window_show (void)
                              "room_join_favorites", "activate", main_window_room_join_favorites_cb,
                              "room_manage_favorites", "activate", main_window_room_manage_favorites_cb,
                              "chat_add_contact", "activate", main_window_chat_add_contact_cb,
+                             "chat_show_ft_manager", "activate", main_window_chat_show_ft_manager,
                              "chat_show_offline", "toggled", main_window_chat_show_offline_cb,
                              "edit", "activate", main_window_edit_cb,
                              "edit_accounts", "activate", main_window_edit_accounts_cb,
index cd45bc7d7fc5faf8a9472dba955bcf023171aaf7..23d55f95b8b7ca3783a238527d3b61e95439f5e8 100644 (file)
             <property name="label" translatable="yes">_Add Contact...</property>
           </object>
         </child>
+        <child>
+          <object class="GtkAction" id="chat_show_ft_manager">
+            <property name="icon-name">document-send</property>
+            <property name="name">chat_show_ft_manager</property>
+            <property name="label" translatable="yes">Show _File Transfers</property>
+          </object>
+        </child>
         <child>
           <object class="GtkToggleAction" id="chat_show_offline">
             <property name="name">chat_show_offline</property>
           <separator/>
           <menuitem action="chat_add_contact"/>
           <separator/>
+          <menuitem action="chat_show_ft_manager"/>
+          <separator/>
           <menuitem action="chat_show_offline"/>
           <separator/>
           <menuitem action="chat_quit"/>
index 817100087e17b3cb160a1e2d9e3681d5aa9e5e0d..05da7439bb8c9609f35438b1b3a6e169d9536c7b 100644 (file)
@@ -1,3 +1,5 @@
+include $(top_srcdir)/tools/shave.mk
+
 abs_top_builddir = @abs_top_builddir@
 
 noinst_SCRIPTS = telepathy-glib-env
@@ -36,23 +38,23 @@ CLEANFILES = libtpcodegen.pyc libtpcodegen.pyo libglibcodegen.pyc libglibcodegen
 all: $(EXTRA_DIST)
 
 libglibcodegen.py: libtpcodegen.py
-       touch $@
+       $(QUIET_GEN)touch $@
 c-constants-gen.py: libglibcodegen.py
-       touch $@
+       $(QUIET_GEN)touch $@
 glib-client-marshaller-gen.py: libglibcodegen.py
-       touch $@
+       $(QUIET_GEN)touch $@
 glib-errors-enum-body-gen.py: libglibcodegen.py
-       touch $@
+       $(QUIET_GEN)touch $@
 glib-errors-enum-header-gen.py: libglibcodegen.py
-       touch $@
+       $(QUIET_GEN)touch $@
 glib-ginterface-gen.py: libglibcodegen.py
-       touch $@
+       $(QUIET_GEN)touch $@
 glib-gtypes-generator.py: libglibcodegen.py
-       touch $@
+       $(QUIET_GEN)touch $@
 glib-interfaces-gen.py: libglibcodegen.py
-       touch $@
+       $(QUIET_GEN)touch $@
 glib-signals-marshal-gen.py: libglibcodegen.py
-       touch $@
+       $(QUIET_GEN)touch $@
 
 TELEPATHY_SPEC_SRCDIR = $(top_srcdir)/../telepathy-spec
 maintainer-update-from-telepathy-spec:
diff --git a/tools/shave.mk b/tools/shave.mk
new file mode 100644 (file)
index 0000000..53cb3bf
--- /dev/null
@@ -0,0 +1 @@
+QUIET_GEN = $(Q:@=@echo '  GEN   '$@;)