From c51d527f11b2d253ed13788830136bc1787029b1 Mon Sep 17 00:00:00 2001 From: Xavier Claessens Date: Thu, 20 Sep 2007 10:46:27 +0000 Subject: Add 2 properties to EmpathyIdle to activate auto-away and auto-disconnect, 2007-09-20 Xavier Claessens * libempathy-gtk/empathy-status-icon.c: * libempathy/empathy-idle.c: * libempathy/empathy-idle.h: * doc/libempathy/tmpl/empathy-idle.sgml: Add 2 properties to EmpathyIdle to activate auto-away and auto-disconnect, default to off. Only empathy main client will turn them on, like that if other processes are running with an EmpathyIdle instance they won't change presence in the same time than Empathy client. svn path=/trunk/; revision=301 --- ChangeLog | 11 +++++ doc/libempathy/tmpl/empathy-idle.sgml | 10 +++++ libempathy-gtk/empathy-status-icon.c | 2 + libempathy/empathy-idle.c | 81 +++++++++++++++++++++++++++++++++-- libempathy/empathy-idle.h | 34 +++++++++------ 5 files changed, 120 insertions(+), 18 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5df2d6cd5..d90001b45 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2007-09-20 Xavier Claessens + + * libempathy-gtk/empathy-status-icon.c: + * libempathy/empathy-idle.c: + * libempathy/empathy-idle.h: + * doc/libempathy/tmpl/empathy-idle.sgml: Add 2 properties to EmpathyIdle + to activate auto-away and auto-disconnect, default to off. Only empathy + main client will turn them on, like that if other processes are + running with an EmpathyIdle instance they won't change presence in the + same time than Empathy client. + 2007-09-19 Xavier Claessens * libempathy-gtk/empathy-smiley-manager.c: Fix a leak. diff --git a/doc/libempathy/tmpl/empathy-idle.sgml b/doc/libempathy/tmpl/empathy-idle.sgml index 8971b783f..68edcafed 100644 --- a/doc/libempathy/tmpl/empathy-idle.sgml +++ b/doc/libempathy/tmpl/empathy-idle.sgml @@ -29,6 +29,16 @@ EmpathyIdle + + + + + + + + + + diff --git a/libempathy-gtk/empathy-status-icon.c b/libempathy-gtk/empathy-status-icon.c index 1fdc00953..4fc1ca055 100644 --- a/libempathy-gtk/empathy-status-icon.c +++ b/libempathy-gtk/empathy-status-icon.c @@ -157,6 +157,8 @@ empathy_status_icon_init (EmpathyStatusIcon *icon) priv->icon = gtk_status_icon_new (); priv->idle = empathy_idle_new (); + empathy_idle_set_auto_away (priv->idle, TRUE); + empathy_idle_set_auto_disconnect (priv->idle, TRUE); priv->manager = empathy_contact_manager_new (); priv->mc = empathy_mission_control_new (); priv->text_filter = empathy_filter_new ("org.gnome.Empathy.Chat", diff --git a/libempathy/empathy-idle.c b/libempathy/empathy-idle.c index 4c7344e9b..87389277c 100644 --- a/libempathy/empathy-idle.c +++ b/libempathy/empathy-idle.c @@ -54,13 +54,15 @@ struct _EmpathyIdlePriv { MissionControl *mc; DBusGProxy *gs_proxy; DBusGProxy *nm_proxy; - gboolean is_idle; McPresence state; McPresence flash_state; gchar *status; McPresence saved_state; gchar *saved_status; + gboolean is_idle; gboolean nm_connected; + gboolean auto_away; + gboolean auto_disconnect; guint ext_away_timeout; }; @@ -92,7 +94,9 @@ enum { PROP_0, PROP_STATE, PROP_STATUS, - PROP_FLASH_STATE + PROP_FLASH_STATE, + PROP_AUTO_AWAY, + PROP_AUTO_DISCONNECT }; G_DEFINE_TYPE (EmpathyIdle, empathy_idle, G_TYPE_OBJECT) @@ -130,6 +134,22 @@ empathy_idle_class_init (EmpathyIdleClass *klass) MC_PRESENCE_UNSET, G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + PROP_AUTO_AWAY, + g_param_spec_boolean ("auto-away", + "Automatic set presence to away", + "Should it set presence to away if inactive", + FALSE, + G_PARAM_READWRITE)); + + g_object_class_install_property (object_class, + PROP_AUTO_DISCONNECT, + g_param_spec_boolean ("auto-disconnect", + "Automatic set presence to offline", + "Should it set presence to offline if NM is disconnected", + FALSE, + G_PARAM_READWRITE)); + g_type_class_add_private (object_class, sizeof (EmpathyIdlePriv)); } @@ -258,6 +278,12 @@ idle_get_property (GObject *object, case PROP_FLASH_STATE: g_value_set_enum (value, empathy_idle_get_flash_state (idle)); break; + case PROP_AUTO_AWAY: + g_value_set_boolean (value, empathy_idle_get_auto_away (idle)); + break; + case PROP_AUTO_DISCONNECT: + g_value_set_boolean (value, empathy_idle_get_auto_disconnect (idle)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); break; @@ -286,6 +312,9 @@ idle_set_property (GObject *object, case PROP_FLASH_STATE: empathy_idle_set_flash_state (idle, g_value_get_enum (value)); break; + case PROP_AUTO_AWAY: + empathy_idle_set_auto_away (idle, g_value_get_boolean (value)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); break; @@ -414,6 +443,44 @@ empathy_idle_set_presence (EmpathyIdle *idle, NULL, NULL); } +gboolean +empathy_idle_get_auto_away (EmpathyIdle *idle) +{ + EmpathyIdlePriv *priv = GET_PRIV (idle); + + return priv->auto_away; +} + +void +empathy_idle_set_auto_away (EmpathyIdle *idle, + gboolean auto_away) +{ + EmpathyIdlePriv *priv = GET_PRIV (idle); + + priv->auto_away = auto_away; + + g_object_notify (G_OBJECT (idle), "auto-away"); +} + +gboolean +empathy_idle_get_auto_disconnect (EmpathyIdle *idle) +{ + EmpathyIdlePriv *priv = GET_PRIV (idle); + + return priv->auto_disconnect; +} + +void +empathy_idle_set_auto_disconnect (EmpathyIdle *idle, + gboolean auto_disconnect) +{ + EmpathyIdlePriv *priv = GET_PRIV (idle); + + priv->auto_disconnect = auto_disconnect; + + g_object_notify (G_OBJECT (idle), "auto-disconnect"); +} + static void idle_presence_changed_cb (MissionControl *mc, McPresence state, @@ -450,8 +517,10 @@ idle_session_idle_changed_cb (DBusGProxy *gs_proxy, is_idle ? "yes" : "no"); if (priv->state <= MC_PRESENCE_OFFLINE || - priv->state == MC_PRESENCE_HIDDEN) { - /* We are not online so nothing to do here */ + priv->state == MC_PRESENCE_HIDDEN || + !priv->auto_away) { + /* We are not online or we don't want to go auto away, + * nothing to do here */ priv->is_idle = is_idle; return; } @@ -507,6 +576,10 @@ idle_nm_state_change_cb (DBusGProxy *proxy, empathy_debug (DEBUG_DOMAIN, "New network state (%d)", state); + if (!priv->auto_disconnect) { + return; + } + if (state != NM_STATE_CONNECTED && priv->nm_connected) { /* We are no more connected */ idle_ext_away_stop (idle); diff --git a/libempathy/empathy-idle.h b/libempathy/empathy-idle.h index 011d2494a..b2f3e634a 100644 --- a/libempathy/empathy-idle.h +++ b/libempathy/empathy-idle.h @@ -48,20 +48,26 @@ struct _EmpathyIdleClass { GObjectClass parent_class; }; -GType empathy_idle_get_type (void) G_GNUC_CONST; -EmpathyIdle *empathy_idle_new (void); -McPresence empathy_idle_get_state (EmpathyIdle *idle); -void empathy_idle_set_state (EmpathyIdle *idle, - McPresence state); -const gchar *empathy_idle_get_status (EmpathyIdle *idle); -void empathy_idle_set_status (EmpathyIdle *idle, - const gchar *status); -McPresence empathy_idle_get_flash_state (EmpathyIdle *idle); -void empathy_idle_set_flash_state (EmpathyIdle *idle, - McPresence state); -void empathy_idle_set_presence (EmpathyIdle *idle, - McPresence state, - const gchar *status); +GType empathy_idle_get_type (void) G_GNUC_CONST; +EmpathyIdle *empathy_idle_new (void); +McPresence empathy_idle_get_state (EmpathyIdle *idle); +void empathy_idle_set_state (EmpathyIdle *idle, + McPresence state); +const gchar *empathy_idle_get_status (EmpathyIdle *idle); +void empathy_idle_set_status (EmpathyIdle *idle, + const gchar *status); +McPresence empathy_idle_get_flash_state (EmpathyIdle *idle); +void empathy_idle_set_flash_state (EmpathyIdle *idle, + McPresence state); +void empathy_idle_set_presence (EmpathyIdle *idle, + McPresence state, + const gchar *status); +gboolean empathy_idle_get_auto_away (EmpathyIdle *idle); +void empathy_idle_set_auto_away (EmpathyIdle *idle, + gboolean auto_away); +gboolean empathy_idle_get_auto_disconnect (EmpathyIdle *idle); +void empathy_idle_set_auto_disconnect (EmpathyIdle *idle, + gboolean auto_disconnect); G_END_DECLS -- cgit v1.2.3