# HG changeset patch # User mikael@frmp8452 # Date 1120328625 -3600 # Node ID 49e9e02dd6d0badbfe71b04114e71836df9a484a # Parent b7dd4c337888067b8b68bfd9ad97af4d064dbec1 Add "/roster search" command diff -r b7dd4c337888 -r 49e9e02dd6d0 mcabber/doc/mcabber.1 --- a/mcabber/doc/mcabber.1 Sat Jul 02 12:06:10 2005 +0100 +++ b/mcabber/doc/mcabber.1 Sat Jul 02 19:23:45 2005 +0100 @@ -114,7 +114,7 @@ The buffer command manipulates the current buddy's buffer (chat window)\&. \fBclear\fR clear the current buddy chat window - \fBtop\fR jump to the top of the current buddy chat buffer + \fBtop\fR jump to the top of the current buddy chat buffer \fBbottom\fR jump to the bottom of the current buddy chat buffer .TP @@ -129,9 +129,9 @@ \fB/group\fR fold|unfold|toggle The group command changes the current group display\&. - \fBfold\fR fold (shrink) the current group tree in the roster - \fBunfold\fR unfold (expand) the current group tree in the roster - \fBtoggle\fR toggle the state (fold/unfold) of the current tree + \fBfold\fR fold (shrink) the current group tree in the roster + \fBunfold\fR unfold (expand) the current group tree in the roster + \fBtoggle\fR toggle the state (fold/unfold) of the current tree .TP \fB/info\fR @@ -145,25 +145,26 @@ \fB/msay\fR begin|verbatim|send|abort Send a multi\-line message\&. To write a single message with several lines, the \fImulti\-line mode\fR should be used\&. In multi\-line mode, each line (except command lines) typed in the input line will be added to the multi\-line message\&. Once the message is finished, it can be sent to the current selected buddy with the "msay /send" command\&. The \fIverbatim\fR multi\-line mode disables commands, so that it is possible to enter lines starting with a slash\&. Only the "/msay" command (with send or abort parameters) can be used to exit verbatim mode\&. - \fBbegin\fR enter multi\-line mode - \fBverbatim\fR enter verbatim multi\-line mode - \fBsend\fR send the current multi\-line message to the currently selected buddy - \fBabort\fR leave multi\-line mode without sending the message + \fBbegin\fR enter multi\-line mode + \fBverbatim\fR enter verbatim multi\-line mode + \fBsend\fR send the current multi\-line message to the currently selected buddy + \fBabort\fR leave multi\-line mode without sending the message .TP \fB/rename\fR nickname Rename current buddy to the given nickname\&. This command does not work for groups, at the moment (but you can move the buddies to another group with the /move command)\&. .TP -\fB/roster\fR hide_offline|show_offline|top|bottom -The roster command manipulates the roster/buddylist\&. +\fB/roster\fR +The roster command manipulates the roster/buddylist\&. Here are the available parameters: - \fBhide_offline\fR hide offline buddies - \fBshow_offline\fR show offline buddies - \fBtop\fR jump to the top of the roster - \fBbottom\fR jump to the bottom of the roster - \fIunread_first\fR jump to the first unread message - \fIunread_next\fR jump to the next unread message + \fBbottom\fR jump to the bottom of the roster + \fBtop\fR jump to the top of the roster + \fBhide_offline\fR hide offline buddies + \fBshow_offline\fR show offline buddies + \fBsearch\fR bud search for a buddy with a name or buddy containing "bud" (only in the displayed buddylist) + \fBunread_first\fR jump to the first unread message + \fBunread_next\fR jump to the next unread message .TP \fB/say\fR text diff -r b7dd4c337888 -r 49e9e02dd6d0 mcabber/doc/mcabber.1.html --- a/mcabber/doc/mcabber.1.html Sat Jul 02 12:06:10 2005 +0100 +++ b/mcabber/doc/mcabber.1.html Sat Jul 02 19:23:45 2005 +0100 @@ -351,13 +351,32 @@ the buddies to another group with the /move command).
-/roster hide_offline|show_offline|top|bottom +/roster bottom|top|hide_offline|show_offline|unread_first|unread_next +
+
+/roster search bud
- The roster command manipulates the roster/buddylist. + The roster command manipulates the roster/buddylist. Here are the available parameters: + + + + + + + + - - - - @@ -444,7 +455,7 @@ diff -r b7dd4c337888 -r 49e9e02dd6d0 mcabber/doc/mcabber.1.txt --- a/mcabber/doc/mcabber.1.txt Sat Jul 02 12:06:10 2005 +0100 +++ b/mcabber/doc/mcabber.1.txt Sat Jul 02 19:23:45 2005 +0100 @@ -135,13 +135,15 @@ This command does not work for groups, at the moment (but you can move the buddies to another group with the /move command). -/roster hide_offline|show_offline|top|bottom:: - The 'roster' command manipulates the roster/buddylist. +/roster bottom|top|hide_offline|show_offline|unread_first|unread_next:: +/roster search bud:: + The 'roster' command manipulates the roster/buddylist. Here are the available parameters: + 'bottom';; jump to the bottom of the roster + 'top';; jump to the top of the roster 'hide_offline';; hide offline buddies 'show_offline';; show offline buddies - 'top';; jump to the top of the roster - 'bottom';; jump to the bottom of the roster + 'search' bud;; search for a buddy with a name or buddy containing "bud" (only in the displayed buddylist) 'unread_first';; jump to the first unread message 'unread_next';; jump to the next unread message diff -r b7dd4c337888 -r 49e9e02dd6d0 mcabber/src/commands.c --- a/mcabber/src/commands.c Sat Jul 02 12:06:10 2005 +0100 +++ b/mcabber/src/commands.c Sat Jul 02 19:23:45 2005 +0100 @@ -104,9 +104,10 @@ // Roster category compl_add_category_word(COMPL_ROSTER, "bottom"); + compl_add_category_word(COMPL_ROSTER, "top"); compl_add_category_word(COMPL_ROSTER, "hide_offline"); compl_add_category_word(COMPL_ROSTER, "show_offline"); - compl_add_category_word(COMPL_ROSTER, "top"); + compl_add_category_word(COMPL_ROSTER, "search"); compl_add_category_word(COMPL_ROSTER, "unread_first"); compl_add_category_word(COMPL_ROSTER, "unread_next"); @@ -276,6 +277,20 @@ scr_RosterUnreadMessage(0); } else if (!strcasecmp(arg, "unread_next")) { scr_RosterUnreadMessage(1); + } else if (!strncasecmp(arg, "search", 6)) { + char *string = arg+6; + if (*string && (*string != ' ')) { + scr_LogPrint("Unrecognized parameter!"); + return; + } + while (*string == ' ') + string++; + if (!*string) { + scr_LogPrint("What name or jid are you looking for?"); + return; + } + scr_RosterSearch(string); + update_roster = TRUE; } else scr_LogPrint("Unrecognized parameter!"); } diff -r b7dd4c337888 -r 49e9e02dd6d0 mcabber/src/roster.c --- a/mcabber/src/roster.c Sat Jul 02 12:06:10 2005 +0100 +++ b/mcabber/src/roster.c Sat Jul 02 19:23:45 2005 +0100 @@ -19,6 +19,7 @@ * USA */ +#define _GNU_SOURCE /* for strcasestr() */ #include #include "roster.h" @@ -627,6 +628,31 @@ return roster_usr->flags; } +// buddy_search(string) +// Look for a buddy whose name or jid contains string. +// Search begins at current_buddy; if no match is found in the the buddylist, +// return NULL; +GList *buddy_search(char *string) +{ + GList *buddy = current_buddy; + roster *roster_usr; + if (!buddylist || !current_buddy) return NULL; + for (;;) { + buddy = g_list_next(buddy); + if (!buddy) + buddy = buddylist; + + roster_usr = (roster*)buddy->data; + if (roster_usr->jid && strcasestr(roster_usr->jid, string)) + return buddy; + if (roster_usr->name && strcasestr(roster_usr->name, string)) + return buddy; + + if (buddy == current_buddy) + return NULL; // Back to the beginning, and no match found + } +} + // 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 b7dd4c337888 -r 49e9e02dd6d0 mcabber/src/roster.h --- a/mcabber/src/roster.h Sat Jul 02 12:06:10 2005 +0100 +++ b/mcabber/src/roster.h Sat Jul 02 19:23:45 2005 +0100 @@ -60,6 +60,7 @@ const char *buddy_getstatusmsg(gpointer rosterdata); void buddy_setflags(gpointer rosterdata, guint flags, guint value); guint buddy_getflags(gpointer rosterdata); +GList *buddy_search(char *string); gpointer unread_msg(gpointer rosterdata); GSList *compl_list(guint type); diff -r b7dd4c337888 -r 49e9e02dd6d0 mcabber/src/screen.c --- a/mcabber/src/screen.c Sat Jul 02 12:06:10 2005 +0100 +++ b/mcabber/src/screen.c Sat Jul 02 19:23:45 2005 +0100 @@ -843,6 +843,34 @@ scr_ShowBuddyWindow(); } +// scr_RosterSearch(str) +// Look forward for a buddy with jid/name containing str. +void scr_RosterSearch(char *str) +{ + GList *matching_buddy; + enum imstatus prev_st = imstatus_size; // undef + + if (current_buddy) { + matching_buddy = buddy_search(str); + if (matching_buddy) { + prev_st = buddy_getstatus(BUDDATA(current_buddy)); + buddy_setflags(BUDDATA(current_buddy), ROSTER_FLAG_LOCK, FALSE); + current_buddy = matching_buddy; + if (chatmode) + buddy_setflags(BUDDATA(current_buddy), ROSTER_FLAG_LOCK, TRUE); + // We should rebuild the buddylist but not everytime + // Here we check if we were locking a buddy who is actually offline, + // and hide_offline_buddies is TRUE. In which case we need to rebuild. + if (prev_st == offline && buddylist_get_hide_offline_buddies()) + buddylist_build(); + update_roster = TRUE; + } + } + + if (chatmode) + scr_ShowBuddyWindow(); +} + // scr_RosterUnreadMessage(next) // Go to a new message. If next is not null, try to go to the next new // message. If it is not possible or if next is NULL, go to the first new diff -r b7dd4c337888 -r 49e9e02dd6d0 mcabber/src/screen.h --- a/mcabber/src/screen.h Sat Jul 02 12:06:10 2005 +0100 +++ b/mcabber/src/screen.h Sat Jul 02 19:23:45 2005 +0100 @@ -44,6 +44,7 @@ // For commands... void scr_RosterTop(void); void scr_RosterBottom(void); +void scr_RosterSearch(char *); void scr_BufferTop(void); void scr_BufferBottom(void); void scr_Clear(void);
+bottom + +jump to the bottom of the roster +
+top + +jump to the top of the roster +
hide_offline @@ -374,18 +393,10 @@
-top +search bud -jump to the top of the roster -
-bottom - -jump to the bottom of the roster +search for a buddy with a name or buddy containing "bud" (only in the displayed buddylist)