+static void
+status_icon_update_tooltip (EmpathyStatusIcon *icon)
+{
+ EmpathyStatusIconPriv *priv = GET_PRIV (icon);
+ const gchar *tooltip = NULL;
+
+ if (priv->event) {
+ tooltip = priv->event->message;
+ }
+
+ if (!tooltip) {
+ tooltip = empathy_idle_get_status (priv->idle);
+ }
+
+ gtk_status_icon_set_tooltip (priv->icon, tooltip);
+}
+
+static void
+status_icon_update_icon (EmpathyStatusIcon *icon)
+{
+ EmpathyStatusIconPriv *priv = GET_PRIV (icon);
+ const gchar *icon_name;
+
+ if (priv->event && priv->showing_event_icon) {
+ icon_name = priv->event->icon_name;
+ } else {
+ McPresence state;
+
+ state = empathy_idle_get_state (priv->idle);
+ icon_name = empathy_icon_name_for_presence (state);
+ }
+
+ gtk_status_icon_set_from_icon_name (priv->icon, icon_name);
+}
+
+static gboolean
+status_icon_blink_timeout_cb (EmpathyStatusIcon *icon)
+{
+ EmpathyStatusIconPriv *priv = GET_PRIV (icon);
+
+ priv->showing_event_icon = !priv->showing_event_icon;
+ status_icon_update_icon (icon);
+
+ return TRUE;
+}
+
+static void
+status_icon_event_added_cb (EmpathyEventManager *manager,
+ EmpathyEvent *event,
+ EmpathyStatusIcon *icon)
+{
+ EmpathyStatusIconPriv *priv = GET_PRIV (icon);
+
+ if (priv->event) {
+ return;
+ }
+
+ DEBUG ("New event %p", event);
+
+ priv->event = event;
+ priv->showing_event_icon = TRUE;
+
+ status_icon_update_icon (icon);
+ status_icon_update_tooltip (icon);
+
+ if (!priv->blink_timeout) {
+ priv->blink_timeout = g_timeout_add (BLINK_TIMEOUT,
+ (GSourceFunc) status_icon_blink_timeout_cb,
+ icon);
+ }
+}
+
+static void
+status_icon_event_removed_cb (EmpathyEventManager *manager,
+ EmpathyEvent *event,
+ EmpathyStatusIcon *icon)
+{
+ EmpathyStatusIconPriv *priv = GET_PRIV (icon);
+
+ if (event != priv->event) {
+ return;
+ }
+
+ priv->event = empathy_event_manager_get_top_event (priv->event_manager);
+
+ status_icon_update_tooltip (icon);
+ status_icon_update_icon (icon);
+
+ if (!priv->event && priv->blink_timeout) {
+ g_source_remove (priv->blink_timeout);
+ priv->blink_timeout = 0;
+ }
+}
+