New object EmpathyIdle to manage autoaway and extended autoaway states.
authorXavier Claessens <xclaesse@gmail.com>
Wed, 16 May 2007 16:26:31 +0000 (16:26 +0000)
committerXavier Claessens <xclaesse@src.gnome.org>
Wed, 16 May 2007 16:26:31 +0000 (16:26 +0000)
2006-05-16  Xavier Claessens  <xclaesse@gmail.com>

* libempathy-gtk/empathy-status-icon.c:
* libempathy/empathy-idle.c:
* libempathy/empathy-idle.h:
* libempathy/Makefile.am:
* po/POTFILES.in: New object EmpathyIdle to manage autoaway and
extended autoaway states.

svn path=/trunk/; revision=70

ChangeLog
data/salut.profile
libempathy-gtk/empathy-status-icon.c
libempathy/Makefile.am
libempathy/empathy-idle.c [new file with mode: 0644]
libempathy/empathy-idle.h [new file with mode: 0644]
po/POTFILES.in

index 7a3ce4c..82e4929 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2006-05-16  Xavier Claessens  <xclaesse@gmail.com>
+
+       * libempathy-gtk/empathy-status-icon.c:
+       * libempathy/empathy-idle.c:
+       * libempathy/empathy-idle.h:
+       * libempathy/Makefile.am:
+       * po/POTFILES.in: New object EmpathyIdle to manage autoaway and
+       extended autoaway states.
+
 2006-05-15  Xavier Claessens  <xclaesse@gmail.com>
 
        * configure.ac:
index 22c9c18..2082881 100644 (file)
@@ -2,6 +2,6 @@
 Manager=salut
 Protocol=salut
 DisplayName=Salut
-IconName = im-jabber
+IconName = empathy-proto-jabber
 ConfigurationUI = salut
 
index 5b764c6..2108227 100644 (file)
@@ -24,7 +24,6 @@
 
 #include <string.h>
 
-#include <glib/gi18n.h>
 #include <gtk/gtk.h>
 #include <glade/glade.h>
 
@@ -33,6 +32,7 @@
 #include <libempathy/gossip-debug.h>
 #include <libempathy/gossip-utils.h>
 #include <libempathy/gossip-conf.h>
+#include <libempathy/empathy-idle.h>
 
 #include "empathy-status-icon.h"
 #include "gossip-presence-chooser.h"
@@ -40,6 +40,7 @@
 #include "gossip-ui-utils.h"
 #include "gossip-accounts-dialog.h"
 
+
 #define GET_PRIV(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), \
                       EMPATHY_TYPE_STATUS_ICON, EmpathyStatusIconPriv))
 
@@ -48,6 +49,8 @@
 struct _EmpathyStatusIconPriv {
        MissionControl *mc;
        GtkStatusIcon  *icon;
+       EmpathyIdle    *idle;
+
        GtkWindow      *window;
 
        GtkWidget      *popup_menu;
@@ -102,6 +105,7 @@ empathy_status_icon_init (EmpathyStatusIcon *icon)
 
        priv->icon = gtk_status_icon_new ();
        priv->mc = gossip_mission_control_new ();
+       priv->idle = empathy_idle_new ();
 
        status_icon_create_menu (icon);
 
@@ -135,6 +139,7 @@ status_icon_finalize (GObject *object)
        g_object_unref (priv->mc);
        g_object_unref (priv->icon);
        g_object_unref (priv->window);
+       g_object_unref (priv->idle);
 }
 
 EmpathyStatusIcon *
index 9ce2027..4f1f1aa 100644 (file)
@@ -28,6 +28,7 @@ libempathy_la_SOURCES =                                                       \
        empathy-contact-manager.c       empathy-contact-manager.h               \
        empathy-tp-chat.c               empathy-tp-chat.h                       \
        empathy-chandler.c              empathy-chandler.h                      \
+       empathy-idle.c                  empathy-idle.h                          \
        empathy-marshal-main.c
 
 libempathy_la_LIBADD =         \
diff --git a/libempathy/empathy-idle.c b/libempathy/empathy-idle.c
new file mode 100644 (file)
index 0000000..80d7574
--- /dev/null
@@ -0,0 +1,226 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2007 Collabora Ltd.
+ *
+ * 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, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ * 
+ * Authors: Xavier Claessens <xclaesse@gmail.com>
+ */
+
+#include <config.h>
+
+#include <glib/gi18n.h>
+#include <dbus/dbus-glib.h>
+
+#include <libtelepathy/tp-helpers.h>
+
+#include <libmissioncontrol/mission-control.h>
+
+#include "empathy-idle.h"
+#include "gossip-utils.h" 
+#include "gossip-debug.h"
+
+#define GET_PRIV(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), \
+                      EMPATHY_TYPE_IDLE, EmpathyIdlePriv))
+
+#define DEBUG_DOMAIN "Idle"
+
+/* Number of seconds before entering extended autoaway. */
+#define EXT_AWAY_TIME (30*60)
+
+enum {
+       LAST_SIGNAL
+};
+
+struct _EmpathyIdlePriv {
+       MissionControl *mc;
+       DBusGProxy     *gs_proxy;
+       gboolean        is_active;
+       McPresence      last_state;
+       gchar          *last_status;
+       guint           ext_away_timeout;
+};
+
+static void     empathy_idle_class_init (EmpathyIdleClass *klass);
+static void     empathy_idle_init       (EmpathyIdle      *idle);
+static void     idle_finalize           (GObject          *object);
+static void     idle_active_changed_cb  (DBusGProxy       *gs_proxy,
+                                        gboolean          is_active,
+                                        EmpathyIdle      *idle);
+static void     idle_ext_away_start     (EmpathyIdle      *idle);
+static void     idle_ext_away_stop      (EmpathyIdle      *idle);
+static gboolean idle_ext_away_cb        (EmpathyIdle      *idle);
+
+//static guint signals[LAST_SIGNAL];
+
+G_DEFINE_TYPE (EmpathyIdle, empathy_idle, G_TYPE_OBJECT)
+
+static void
+empathy_idle_class_init (EmpathyIdleClass *klass)
+{
+       GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+       object_class->finalize = idle_finalize;
+
+       g_type_class_add_private (object_class, sizeof (EmpathyIdlePriv));
+}
+
+static void
+empathy_idle_init (EmpathyIdle *idle)
+{
+       EmpathyIdlePriv *priv;
+
+       priv = GET_PRIV (idle);
+
+       priv->is_active = FALSE;
+       priv->mc = gossip_mission_control_new ();
+       priv->gs_proxy = dbus_g_proxy_new_for_name (tp_get_bus (),
+                                                   "org.gnome.ScreenSaver",
+                                                   "/org/gnome/ScreenSaver",
+                                                   "org.gnome.ScreenSaver");
+       if (!priv->gs_proxy) {
+               gossip_debug (DEBUG_DOMAIN, "Failed to get gs proxy");
+               return;
+       }
+
+       dbus_g_proxy_add_signal (priv->gs_proxy, "ActiveChanged",
+                                G_TYPE_BOOLEAN,
+                                G_TYPE_INVALID);
+       dbus_g_proxy_connect_signal (priv->gs_proxy, "ActiveChanged",
+                                    G_CALLBACK (idle_active_changed_cb),
+                                    idle, NULL);
+}
+
+static void
+idle_finalize (GObject *object)
+{
+       EmpathyIdlePriv *priv;
+
+       priv = GET_PRIV (object);
+
+       g_free (priv->last_status);
+       g_object_unref (priv->mc);
+
+       if (priv->gs_proxy) {
+               g_object_unref (priv->gs_proxy);
+       }
+
+       idle_ext_away_stop (EMPATHY_IDLE (object));
+}
+
+EmpathyIdle *
+empathy_idle_new (void)
+{
+       static EmpathyIdle *idle = NULL;
+
+       if (!idle) {
+               idle = g_object_new (EMPATHY_TYPE_IDLE, NULL);
+               g_object_add_weak_pointer (G_OBJECT (idle), (gpointer) &idle);
+       } else {
+               g_object_ref (idle);
+       }
+
+       return idle;
+}
+
+static void
+idle_active_changed_cb (DBusGProxy  *gs_proxy,
+                       gboolean     is_active,
+                       EmpathyIdle *idle)
+{
+       EmpathyIdlePriv *priv;
+
+       priv = GET_PRIV (idle);
+
+       gossip_debug (DEBUG_DOMAIN, "Screensaver state changed, %s -> %s",
+                     priv->is_active ? "yes" : "no",
+                     is_active ? "yes" : "no");
+
+       if (is_active && !priv->is_active) {
+               /* The screensaver is now running */
+               g_free (priv->last_status);
+               idle_ext_away_stop (idle);
+
+               priv->last_state = mission_control_get_presence_actual (priv->mc, NULL);
+               priv->last_status = mission_control_get_presence_message_actual (priv->mc, NULL);
+
+               gossip_debug (DEBUG_DOMAIN, "Going to autoaway");
+               mission_control_set_presence (priv->mc,
+                                             MC_PRESENCE_AWAY,
+                                             _("Autoaway"),
+                                             NULL, NULL);
+               idle_ext_away_start (idle);
+       } else if (!is_active && priv->is_active) {
+               /* The screensaver stoped */
+               idle_ext_away_stop (idle);
+
+               gossip_debug (DEBUG_DOMAIN, "Restoring state to %d %s",
+                             priv->last_state,
+                             priv->last_status);
+
+               mission_control_set_presence (priv->mc,
+                                             priv->last_state,
+                                             priv->last_status,
+                                             NULL, NULL);
+       }
+
+       priv->is_active = is_active;
+}
+
+static void
+idle_ext_away_start (EmpathyIdle *idle)
+{
+       EmpathyIdlePriv *priv;
+
+       priv = GET_PRIV (idle);
+
+       idle_ext_away_stop (idle);
+       priv->ext_away_timeout = g_timeout_add (EXT_AWAY_TIME * 1000,
+                                               (GSourceFunc) idle_ext_away_cb,
+                                               idle);
+}
+
+static void
+idle_ext_away_stop (EmpathyIdle *idle)
+{
+       EmpathyIdlePriv *priv;
+
+       priv = GET_PRIV (idle);
+
+       if (priv->ext_away_timeout) {
+               g_source_remove (priv->ext_away_timeout);
+               priv->ext_away_timeout = 0;
+       }
+}
+
+static gboolean
+idle_ext_away_cb (EmpathyIdle *idle)
+{
+       EmpathyIdlePriv *priv;
+
+       priv = GET_PRIV (idle);
+
+       gossip_debug (DEBUG_DOMAIN, "Going to extended autoaway");
+       mission_control_set_presence (priv->mc,
+                                     MC_PRESENCE_EXTENDED_AWAY,
+                                     _("Extended autoaway"),
+                                     NULL, NULL);
+
+       priv->ext_away_timeout = 0;
+
+       return FALSE;
+}
+
diff --git a/libempathy/empathy-idle.h b/libempathy/empathy-idle.h
new file mode 100644 (file)
index 0000000..df8846b
--- /dev/null
@@ -0,0 +1,54 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2007 Collabora Ltd.
+ *
+ * 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, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ * Authors: Xavier Claessens <xclaesse@gmail.com>
+ */
+
+#ifndef __EMPATHY_IDLE_H__
+#define __EMPATHY_IDLE_H__
+
+#include <glib.h>
+
+G_BEGIN_DECLS
+
+#define EMPATHY_TYPE_IDLE         (empathy_idle_get_type ())
+#define EMPATHY_IDLE(o)           (G_TYPE_CHECK_INSTANCE_CAST ((o), EMPATHY_TYPE_IDLE, EmpathyIdle))
+#define EMPATHY_IDLE_CLASS(k)     (G_TYPE_CHECK_CLASS_CAST ((k), EMPATHY_TYPE_IDLE, EmpathyIdleClass))
+#define EMPATHY_IS_IDLE(o)        (G_TYPE_CHECK_INSTANCE_TYPE ((o), EMPATHY_TYPE_IDLE))
+#define EMPATHY_IS_IDLE_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE ((k), EMPATHY_TYPE_IDLE))
+#define EMPATHY_IDLE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), EMPATHY_TYPE_IDLE, EmpathyIdleClass))
+
+typedef struct _EmpathyIdle      EmpathyIdle;
+typedef struct _EmpathyIdleClass EmpathyIdleClass;
+typedef struct _EmpathyIdlePriv  EmpathyIdlePriv;
+
+struct _EmpathyIdle {
+       GObject parent;
+};
+
+struct _EmpathyIdleClass {
+       GObjectClass parent_class;
+};
+
+GType        empathy_idle_get_type (void) G_GNUC_CONST;
+EmpathyIdle *empathy_idle_new      (void);
+
+G_END_DECLS
+
+#endif /* __EMPATHY_IDLE_H__ */
index 7079f4c..5ca5eb8 100644 (file)
@@ -4,6 +4,7 @@
 data/empathy.desktop.in
 data/empathy.schemas.in
 
+libempathy/empathy-idle.c
 libempathy/gossip-contact.c
 libempathy/gossip-presence.c