--- a/mcabber/src/commands.c Sat May 27 19:46:20 2006 +0200
+++ b/mcabber/src/commands.c Sun May 28 10:42:22 2006 +0200
@@ -1185,6 +1185,18 @@
g_free(buffer);
}
+static void move_group_member(gpointer bud, void *groupnamedata)
+{
+ const char *jid, *name, *groupname;
+
+ groupname = (char *)groupnamedata;
+
+ jid = buddy_getjid(bud);
+ name = buddy_getname(bud);
+
+ jb_updatebuddy(jid, name, *groupname ? groupname : NULL);
+}
+
static void do_rename(char *arg)
{
gpointer bud;
@@ -1193,11 +1205,6 @@
char *newname, *p;
char *name_utf8;
- if (!*arg) {
- scr_LogPrint(LPRINT_NORMAL, "Please specify a new name.");
- return;
- }
-
if (!current_buddy) return;
bud = BUDDATA(current_buddy);
@@ -1205,12 +1212,13 @@
group = buddy_getgroupname(bud);
type = buddy_gettype(bud);
- if (type & ROSTER_TYPE_GROUP) {
- scr_LogPrint(LPRINT_NORMAL, "You can't rename groups.");
+ if (type & ROSTER_TYPE_SPECIAL) {
+ scr_LogPrint(LPRINT_NORMAL, "You can't rename this item.");
return;
}
- if (type & ROSTER_TYPE_SPECIAL) {
- scr_LogPrint(LPRINT_NORMAL, "You can't rename this item.");
+
+ if (!*arg && !(type & ROSTER_TYPE_GROUP)) {
+ scr_LogPrint(LPRINT_NORMAL, "Please specify a new name.");
return;
}
@@ -1222,8 +1230,18 @@
strip_arg_special_chars(newname);
name_utf8 = to_utf8(newname);
- buddy_setname(bud, name_utf8);
- jb_updatebuddy(jid, name_utf8, group);
+
+ if (type & ROSTER_TYPE_GROUP) {
+ // Rename a whole group
+ foreach_group_member(bud, &move_group_member, name_utf8);
+ // Let's jump to the previous buddy, because this group name should
+ // disappear when we receive the server answer.
+ scr_RosterUp();
+ } else {
+ // Rename a single buddy
+ buddy_setname(bud, name_utf8);
+ jb_updatebuddy(jid, name_utf8, group);
+ }
g_free(name_utf8);
g_free(newname);
--- a/mcabber/src/roster.c Sat May 27 19:46:20 2006 +0200
+++ b/mcabber/src/roster.c Sun May 28 10:42:22 2006 +0200
@@ -259,7 +259,7 @@
sample.name = (gchar*)jidname;
comp = (GCompareFunc)&roster_compare_name_type;
} else
- return NULL; // should not happen
+ return NULL; // Should not happen...
while (sl_roster_elt) {
roster *roster_elt = (roster*)sl_roster_elt->data;
@@ -293,7 +293,6 @@
p_group = roster_find(name, namesearch, ROSTER_TYPE_GROUP);
}
return p_group;
-
}
// Returns a pointer to the new user, or existing user with that name
@@ -1258,6 +1257,30 @@
}
}
+// foreach_group_member(group, pfunction, param)
+// Call pfunction(buddy, param) for each buddy in the specified group.
+void foreach_group_member(gpointer groupdata,
+ void (*pfunc)(gpointer rosterdata, void *param),
+ void *param)
+{
+ roster *roster_elt;
+ GSList *sl_roster_usrelt;
+ roster *roster_usrelt;
+
+ roster_elt = groupdata;
+
+ if (!(roster_elt->type & ROSTER_TYPE_GROUP))
+ return;
+
+ sl_roster_usrelt = roster_elt->list;
+ while (sl_roster_usrelt) { // user list loop
+ roster_usrelt = (roster*) sl_roster_usrelt->data;
+
+ pfunc(roster_usrelt, param);
+ sl_roster_usrelt = g_slist_next(sl_roster_usrelt);
+ }
+}
+
// compl_list(type)
// Returns a list of jid's or groups. (For commands completion)
// type: ROSTER_TYPE_USER (jid's) or ROSTER_TYPE_GROUP (group names)
--- a/mcabber/src/roster.h Sat May 27 19:46:20 2006 +0200
+++ b/mcabber/src/roster.h Sun May 28 10:42:22 2006 +0200
@@ -143,6 +143,9 @@
void foreach_buddy(guint roster_type,
void (*pfunc)(gpointer rosterdata, void *param),
void *param);
+void foreach_group_member(gpointer groupdata,
+ void (*pfunc)(gpointer rosterdata, void *param),
+ void *param);
gpointer unread_msg(gpointer rosterdata);
GSList *compl_list(guint type);