# HG changeset patch # User Mikael Berthe # Date 1148805742 -7200 # Node ID afdd81c2c44dd2e1b4cfc4f21068e0ec4222d896 # Parent 9e6d9f0cf9eb140081f4057a02dda7bb5c43686e Allow /rename for groups diff -r 9e6d9f0cf9eb -r afdd81c2c44d mcabber/src/commands.c --- 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); diff -r 9e6d9f0cf9eb -r afdd81c2c44d mcabber/src/roster.c --- 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) diff -r 9e6d9f0cf9eb -r afdd81c2c44d mcabber/src/roster.h --- 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);