diff options
-rw-r--r-- | ChangeLog | 11 | ||||
-rw-r--r-- | doc/libempathy/tmpl/empathy-idle.sgml | 10 | ||||
-rw-r--r-- | libempathy-gtk/empathy-status-icon.c | 2 | ||||
-rw-r--r-- | libempathy/empathy-idle.c | 81 | ||||
-rw-r--r-- | libempathy/empathy-idle.h | 34 |
5 files changed, 120 insertions, 18 deletions
@@ -1,3 +1,14 @@ +2007-09-20 Xavier Claessens <xclaesse@gmail.com> + + * 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 <xclaesse@gmail.com> * 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 </para> +<!-- ##### ARG EmpathyIdle:auto-away ##### --> +<para> + +</para> + +<!-- ##### ARG EmpathyIdle:auto-disconnect ##### --> +<para> + +</para> + <!-- ##### ARG EmpathyIdle:flash-state ##### --> <para> 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 |