diff src/savedstatuses.c @ 14128:a8a033a89ee0

[gaim-migrate @ 16766] I'm hoping this will fix a lot of the remaining idle-away problems, like not correctly returning from idle-away. This change also causes the gtkstatusbox to show your idle-away status when you are idle-away. Please test everything and let me know if there are any problems. committer: Tailor Script <tailor@pidgin.im>
author Mark Doliner <mark@kingant.net>
date Tue, 15 Aug 2006 08:22:29 +0000
parents ec858948d292
children
line wrap: on
line diff
--- a/src/savedstatuses.c	Tue Aug 15 07:23:13 2006 +0000
+++ b/src/savedstatuses.c	Tue Aug 15 08:22:29 2006 +0000
@@ -25,6 +25,7 @@
 #include "internal.h"
 
 #include "debug.h"
+#include "idle.h"
 #include "notify.h"
 #include "savedstatuses.h"
 #include "dbus-maybe.h"
@@ -676,9 +677,9 @@
 	 * If we just deleted our current status or our idleaway status,
 	 * then set the appropriate pref back to 0.
 	 */
-	current = gaim_prefs_get_int("/core/savedstatus/current");
+	current = gaim_prefs_get_int("/core/savedstatus/default");
 	if (current == creation_time)
-		gaim_prefs_set_int("/core/savedstatus/current", 0);
+		gaim_prefs_set_int("/core/savedstatus/default", 0);
 
 	idleaway = gaim_prefs_get_int("/core/savedstatus/idleaway");
 	if (idleaway == creation_time)
@@ -725,12 +726,21 @@
 }
 
 GaimSavedStatus *
-gaim_savedstatus_get_current()
+gaim_savedstatus_get_current(void)
+{
+	if (gaim_savedstatus_is_idleaway())
+		return gaim_savedstatus_get_idleaway();
+	else
+		return gaim_savedstatus_get_default();
+}
+
+GaimSavedStatus *
+gaim_savedstatus_get_default()
 {
 	int creation_time;
 	GaimSavedStatus *saved_status = NULL;
 
-	creation_time = gaim_prefs_get_int("/core/savedstatus/current");
+	creation_time = gaim_prefs_get_int("/core/savedstatus/default");
 
 	if (creation_time != 0)
 		saved_status = g_hash_table_lookup(creation_times, &creation_time);
@@ -744,7 +754,7 @@
 		 * using?  In any case, add a default status.
 		 */
 		saved_status = gaim_savedstatus_new(NULL, GAIM_STATUS_AVAILABLE);
-		gaim_prefs_set_int("/core/savedstatus/current",
+		gaim_prefs_set_int("/core/savedstatus/default",
 						   gaim_savedstatus_get_creation_time(saved_status));
 	}
 
@@ -780,6 +790,51 @@
 	return saved_status;
 }
 
+gboolean
+gaim_savedstatus_is_idleaway()
+{
+	return gaim_prefs_get_bool("/core/savedstatus/isidleaway");
+}
+
+void
+gaim_savedstatus_set_idleaway(gboolean idleaway)
+{
+	GList *accounts, *node;
+	GaimSavedStatus *old, *saved_status;
+
+	if (gaim_savedstatus_is_idleaway() == idleaway)
+		/* Don't need to do anything */
+		return;
+
+	/* Changing our status makes us un-idle */
+	if (!idleaway)
+		gaim_idle_touch();
+
+	old = gaim_savedstatus_get_current();
+	gaim_prefs_set_bool("/core/savedstatus/isidleaway", idleaway);
+	saved_status = gaim_savedstatus_get_current();
+
+	accounts = gaim_accounts_get_all_active();
+	for (node = accounts; node != NULL; node = node->next)
+	{
+		GaimAccount *account;
+		GaimPresence *presence;
+		GaimStatus *status;
+
+		account = node->data;
+		presence = gaim_account_get_presence(account);
+		status = gaim_presence_get_active_status(presence);
+
+		if (!idleaway || gaim_status_is_available(status))
+			gaim_savedstatus_activate_for_account(saved_status, account);
+	}
+
+	g_list_free(accounts);
+
+	gaim_signal_emit(gaim_savedstatuses_get_handle(), "savedstatus-changed",
+					 saved_status, old);
+}
+
 GaimSavedStatus *
 gaim_savedstatus_get_startup()
 {
@@ -1001,12 +1056,12 @@
 
 	g_list_free(accounts);
 
-	gaim_prefs_set_int("/core/savedstatus/current",
+	gaim_prefs_set_int("/core/savedstatus/default",
 					   gaim_savedstatus_get_creation_time(saved_status));
+	gaim_savedstatus_set_idleaway(FALSE);
 
 	gaim_signal_emit(gaim_savedstatuses_get_handle(), "savedstatus-changed",
 					 saved_status, old);
-
 }
 
 void
@@ -1070,10 +1125,11 @@
 	 * saved status and return that to the user.
 	 */
 	gaim_prefs_add_none("/core/savedstatus");
-	gaim_prefs_add_int("/core/savedstatus/current", 0);
+	gaim_prefs_add_int("/core/savedstatus/default", 0);
 	gaim_prefs_add_int("/core/savedstatus/startup", 0);
 	gaim_prefs_add_bool("/core/savedstatus/startup_current_status", TRUE);
 	gaim_prefs_add_int("/core/savedstatus/idleaway", 0);
+	gaim_prefs_add_bool("/core/savedstatus/isidleaway", FALSE);
 
 	load_statuses();