changeset 148:c3624b2a7059

[/trunk] Changeset 160 by mikael * Add roster_msg_setflag() (which updates ROSTER_FLAG_MSG flag for buddy and his _group_.
author mikael
date Sat, 30 Apr 2005 22:45:00 +0000
parents 7571de4aed73
children 9f74832eb4f8
files mcabber/src/TODO mcabber/src/roster.c mcabber/src/roster.h mcabber/src/screen.c
diffstat 4 files changed, 52 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/mcabber/src/TODO	Fri Apr 29 19:56:28 2005 +0000
+++ b/mcabber/src/TODO	Sat Apr 30 22:45:00 2005 +0000
@@ -2,9 +2,9 @@
 BUGS:
 
 * Presence notification is always accepted.
-* Messages in hidden (shrunk) groups are not visible.
-  Maybe we should create "*_msg_[gs]etflag()" functions, which
-  would update groups message flags too. (?)
+* Do not show message flag for unfolded groups.
+* Resize not handled.
+* I have seen a segfault, but don't know how to reproduce it...
 
 
 TODO:
--- a/mcabber/src/roster.c	Fri Apr 29 19:56:28 2005 +0000
+++ b/mcabber/src/roster.c	Sat Apr 30 22:45:00 2005 +0000
@@ -226,7 +226,52 @@
   else
     roster_usr->flags &= ~flags;
 }
-    
+
+//  roster_msg_setflag()
+// Set the ROSTER_FLAG_MSG to the given value for the given jid.
+// It will update the buddy's group message flag.
+void roster_msg_setflag(const char *jid, guint value)
+{
+  GSList *sl_user;
+  roster *roster_usr, *roster_grp;
+
+  sl_user = roster_find(jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT);
+  if (sl_user == NULL)
+    return;
+
+  roster_usr = (roster*)sl_user->data;
+  roster_grp = (roster*)roster_usr->list->data;
+  if (value) {
+    // Message flag is TRUE.  This is easy, we just have to set both flags
+    // to TRUE...
+    roster_usr->flags |= ROSTER_FLAG_MSG;
+    roster_grp->flags |= ROSTER_FLAG_MSG; // group
+  } else {
+    // Message flag is FALSE.
+    guint msg = FALSE;
+    roster_usr->flags &= ~ROSTER_FLAG_MSG;
+    // For the group value we need to watch all buddies in this group;
+    // if one is flagged, then the group will be flagged.
+    // I will re-use sl_user and roster_usr here, as they aren't used
+    // anymore.
+    sl_user = roster_grp->list;
+    while (sl_user) {
+      roster_usr = (roster*)sl_user->data;
+      if (roster_usr->flags & ROSTER_FLAG_MSG) {
+        msg = TRUE;
+        break;
+      }
+      sl_user = g_slist_next(sl_user);
+    }
+    if (!msg)
+      roster_grp->flags &= ~ROSTER_FLAG_MSG;
+    else
+      roster_grp->flags |= ROSTER_FLAG_MSG;
+      // Actually the "else" part is useless, because the group
+      // ROSTER_FLAG_MSG should already be set...
+  }
+}
+
 void roster_settype(const char *jid, guint type)
 {
   GSList *sl_user;
@@ -272,12 +317,6 @@
   return FALSE;
 }
 
-// char *roster_getgroup(...)   / Or *GSList?  Which use??
-// ... setgroup(char*) ??
-// guchar roster_getflags(...)
-// guchar roster_getname(...)   / setname ??
-// roster_del_group?
-
 
 /* ### BuddyList functions ### */
 
--- a/mcabber/src/roster.h	Fri Apr 29 19:56:28 2005 +0000
+++ b/mcabber/src/roster.h	Sat Apr 30 22:45:00 2005 +0000
@@ -36,6 +36,7 @@
 void    roster_del_user(const char *jid);
 void    roster_setstatus(const char *jid, enum imstatus bstat);
 void    roster_setflags(const char *jid, guint flags, guint value);
+void    roster_msg_setflag(const char *jid, guint value);
 void    roster_settype(const char *jid, guint type);
 enum imstatus roster_getstatus(const char *jid);
 guint   roster_gettype(const char *jid);
--- a/mcabber/src/screen.c	Fri Apr 29 19:56:28 2005 +0000
+++ b/mcabber/src/screen.c	Sat Apr 30 22:45:00 2005 +0000
@@ -290,7 +290,7 @@
     top_panel(win_entry->panel);
     currentWindow = win_entry;
     chatmode = TRUE;
-    roster_setflags(winId, ROSTER_FLAG_MSG, FALSE);
+    roster_msg_setflag(winId, FALSE);
     roster_setflags(winId, ROSTER_FLAG_LOCK, TRUE);
     update_roster = TRUE;
 
@@ -386,7 +386,7 @@
     update_panels();
     doupdate();
   } else {
-    roster_setflags(winId, ROSTER_FLAG_MSG, TRUE);
+    roster_msg_setflag(winId, TRUE);
     update_roster = TRUE;
   }
 }