changeset 236:72fd1273f2b7

[/trunk] Changeset 249 by mikael * Update TODO * Add /roster parameters "unread_first" and "unread_next" * Add Ctrl-q as a shortcut for "/roster unread_next" * Update Documentation (ctrl-q + unread_*) * Update ChangeLog
author mikael
date Fri, 10 Jun 2005 19:03:06 +0000
parents f7f07794d2df
children c8df64f43625
files mcabber/ChangeLog mcabber/doc/mcabber.1 mcabber/doc/mcabber.1.html mcabber/doc/mcabber.1.txt mcabber/src/TODO mcabber/src/commands.c mcabber/src/roster.c mcabber/src/roster.h mcabber/src/screen.c mcabber/src/screen.h
diffstat 10 files changed, 128 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/mcabber/ChangeLog	Fri Jun 10 18:42:38 2005 +0000
+++ b/mcabber/ChangeLog	Fri Jun 10 19:03:06 2005 +0000
@@ -1,5 +1,13 @@
 mcabber (0.6.1)
 
+  * Fix backspace handling (KEY_BACKSPACE isn't reliable)
+  * Implement Ctrl-q (jump to first/next unread message)
+  * Display a warning when the locale is UTF-8
+  * Display log notice when sending a notification request message
+  * Update INSTALL and mcabberrc.example files for better explanations
+  * Comment out useless code (fix a compilation error with gcc 4)
+  * Add Makefile for the doc subdir; manpage will be installed now
+
  -- Mikael, ?
 
 mcabber (0.6.0)
--- a/mcabber/doc/mcabber.1	Fri Jun 10 18:42:38 2005 +0000
+++ b/mcabber/doc/mcabber.1	Fri Jun 10 19:03:06 2005 +0000
@@ -98,7 +98,7 @@
 
 Ctrl\-t		Transpose chars
 
-Ctrl\-q		Jump to the next unread message (Not yet implemented)
+Ctrl\-q		Jump to the next unread message
 
 
 .SH "COMMANDS"
@@ -155,6 +155,8 @@
  \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
 
 .TP
 \fB/say\fR text
--- a/mcabber/doc/mcabber.1.html	Fri Jun 10 18:42:38 2005 +0000
+++ b/mcabber/doc/mcabber.1.html	Fri Jun 10 19:03:06 2005 +0000
@@ -220,7 +220,7 @@
 </td>
 <td>
 
-Jump to the next unread message (Not yet implemented)
+Jump to the next unread message
 
 </td>
 </tr>
@@ -418,6 +418,26 @@
 
 </td>
 </tr>
+<tr valign="top">
+<td>
+<b>unread_first</b>
+</td>
+<td>
+
+jump to the first unread message
+
+</td>
+</tr>
+<tr valign="top">
+<td>
+<b>unread_next</b>
+</td>
+<td>
+
+jump to the next unread message
+
+</td>
+</tr>
 </table>
 </dd>
 <dt><b>
@@ -477,8 +497,8 @@
 </p>
 <div id="footer">
 <p>
-Version 0.6.0<br />
-Last updated 07-Jun-2005 22:11:00 CEST
+Version 0.6.1<br />
+Last updated 10-Jun-2005 22:47:25 CEST
 </p>
 </div>
 </div>
--- a/mcabber/doc/mcabber.1.txt	Fri Jun 10 18:42:38 2005 +0000
+++ b/mcabber/doc/mcabber.1.txt	Fri Jun 10 19:03:06 2005 +0000
@@ -1,7 +1,7 @@
 MCABBER(1)
 ===========
 Mikael BERTHE <mcabber@lilotux.net>
-v0.6.0, June 2005
+v0.6.1, June 2005
 
 NAME
 ----
@@ -71,7 +71,7 @@
 Ctrl-k::        Delete from the cursor to the end of line
 Ctrl-w::        Backward kill word
 Ctrl-t::        Transpose chars
-Ctrl-q::        Jump to the next unread message (Not yet implemented)
+Ctrl-q::        Jump to the next unread message
 
 COMMANDS
 --------
@@ -125,6 +125,8 @@
         'show_offline';; show offline buddies
         'top';;          jump to the top of the roster
         'bottom';;       jump to the bottom of the roster
+        'unread_first';; jump to the first unread message
+        'unread_next';;  jump to the next unread message
 
 /say text::
         Send the text message to the currently selected buddy.  Can be useful
--- a/mcabber/src/TODO	Fri Jun 10 18:42:38 2005 +0000
+++ b/mcabber/src/TODO	Fri Jun 10 19:03:06 2005 +0000
@@ -9,7 +9,6 @@
 TODO:
 
 * Presence notification is always accepted.  We should ask...
-* Unread message queue (/roster next_message & Ctrl-q)
 * Multi-lines messages
 * Resource priority
 * UTF-8 support
@@ -23,18 +22,18 @@
   (i.e. hide roster window)
 * Create .mcabber and .mcabber/histo dirs if needed.
 * Search for a user
-* Get info about a user
+* Get info from server about a user
 * Publish personal information
 * Handle message type "error"
 * Show status changes in buddy window (if open)?
 * Auto away
+* Ctrl-o
 
 * File transfer? :)
 * Conferences
 
 * Commands! :-)
-  - /roster <hide_offline|show_offline|top|bottom>
-    + next_message (Ctrl-q?)
+  - /roster <hide_offline|show_offline|top|bottom|unread_first|unread_next>
     + search jid|name
   - /buffer <clear|top|bottom>
     + /buffer % 50          (jump to 50 %)
--- a/mcabber/src/commands.c	Fri Jun 10 18:42:38 2005 +0000
+++ b/mcabber/src/commands.c	Fri Jun 10 19:03:06 2005 +0000
@@ -104,6 +104,8 @@
   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, "unread_first");
+  compl_add_category_word(COMPL_ROSTER, "unread_next");
 
   // Roster category
   compl_add_category_word(COMPL_BUFFER, "bottom");
@@ -246,6 +248,10 @@
     buddylist_set_hide_offline_buddies(FALSE);
     buddylist_build();
     update_roster = TRUE;
+  } else if (!strcasecmp(arg, "unread_first")) {
+    scr_RosterUnreadMessage(0);
+  } else if (!strcasecmp(arg, "unread_next")) {
+    scr_RosterUnreadMessage(1);
   } else
     scr_LogPrint("Unrecognized parameter!");
 }
--- a/mcabber/src/roster.c	Fri Jun 10 18:42:38 2005 +0000
+++ b/mcabber/src/roster.c	Fri Jun 10 19:03:06 2005 +0000
@@ -42,14 +42,10 @@
 
 static int hide_offline_buddies;
 static GSList *groups;
+static GSList *unread_list;
 GList *buddylist;
 GList *current_buddy;
 
-#ifdef MCABBER_TESTUNIT
-// Export groups for testing routines
-GSList **pgroups = &groups;
-#endif
-
 
 /* ### Roster functions ### */
 
@@ -182,6 +178,9 @@
   if (roster_usr->status_msg) g_free((gchar*)roster_usr->status_msg);
   g_free(roster_usr);
 
+  // Remove (if present) from unread messages list
+  unread_list = g_slist_delete_link(unread_list, sl_user);
+
   // That's a little complex, we need to dereference twice
   sl_group = ((roster*)sl_user->data)->list;
   sl_group_listptr = &((roster*)(sl_group->data))->list;
@@ -275,6 +274,7 @@
 //  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.
+// Update the unread messages list too.
 void roster_msg_setflag(const char *jid, guint value)
 {
   GSList *sl_user;
@@ -291,10 +291,17 @@
     // to TRUE...
     roster_usr->flags |= ROSTER_FLAG_MSG;
     roster_grp->flags |= ROSTER_FLAG_MSG; // group
+    // Append the roster_usr to unread_list, but avoid duplicates
+    if (!g_slist_find(unread_list, roster_usr))
+      unread_list = g_slist_append(unread_list, roster_usr);
   } else {
     // Message flag is FALSE.
     guint msg = FALSE;
     roster_usr->flags &= ~ROSTER_FLAG_MSG;
+    if (unread_list) {
+      GSList *node = g_slist_find(unread_list, roster_usr);
+      if (node) unread_list = g_slist_delete_link(unread_list, node);
+    }
     // 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
@@ -645,3 +652,23 @@
   return list;
 }
 
+//  unread_msg(rosterdata)
+// Return the next buddy with an unread message.  If the parameter is NULL,
+// return the first buddy with an unread message.
+gpointer unread_msg(gpointer rosterdata)
+{
+  GSList *unread, *next_unread;
+
+  if (!unread_list) return NULL;
+  // First unread message
+  if (!rosterdata) return unread_list->data;
+
+  unread = g_slist_find(unread_list, rosterdata);
+  if (!unread) return unread_list->data;
+
+  next_unread = g_slist_next(unread);
+  if (next_unread) return next_unread->data;
+
+  return unread_list->data;
+}
+
--- a/mcabber/src/roster.h	Fri Jun 10 18:42:38 2005 +0000
+++ b/mcabber/src/roster.h	Fri Jun 10 19:03:06 2005 +0000
@@ -60,6 +60,7 @@
 const char *buddy_getstatusmsg(gpointer rosterdata);
 void    buddy_setflags(gpointer rosterdata, guint flags, guint value);
 guint   buddy_getflags(gpointer rosterdata);
+gpointer unread_msg(gpointer rosterdata);
 
 GSList *compl_list(guint type);
 
--- a/mcabber/src/screen.c	Fri Jun 10 18:42:38 2005 +0000
+++ b/mcabber/src/screen.c	Fri Jun 10 19:03:06 2005 +0000
@@ -841,6 +841,52 @@
     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
+// message from unread_list.
+void scr_RosterUnreadMessage(int next)
+{
+  enum imstatus prev_st = imstatus_size; // undef
+
+  if (current_buddy) {
+    gpointer unread_ptr;
+    gpointer refbuddata;
+    gpointer ngroup;
+    GList *nbuddy;
+
+    if (next) refbuddata = BUDDATA(current_buddy);
+    else      refbuddata = NULL;
+
+    unread_ptr = unread_msg(refbuddata);
+    if (!unread_ptr) return;
+
+    // If buddy is in a folded group, we need to expand it
+    ngroup = buddy_getgroup(unread_ptr);
+    if (buddy_getflags(ngroup) & ROSTER_FLAG_HIDE) {
+      buddy_setflags(ngroup, ROSTER_FLAG_HIDE, FALSE);
+      buddylist_build();
+    }
+
+    nbuddy = g_list_find(buddylist, unread_ptr);
+    if (nbuddy) {
+      prev_st = buddy_getstatus(BUDDATA(current_buddy));
+      buddy_setflags(BUDDATA(current_buddy), ROSTER_FLAG_LOCK, FALSE);
+      current_buddy = nbuddy;
+      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();
+    } else scr_LogPrint("Error: nbuddy == NULL");
+  }
+}
+
 //  scr_ScrollUp()
 // Scroll up the current buddy window, half a screen.
 void scr_ScrollUp(void)
@@ -1410,7 +1456,7 @@
           scr_ScrollDown();
           break;
       case 17:  // Ctrl-q
-          // scr_jump_next_new_message();
+          scr_RosterUnreadMessage(1); // next unread message
           break;
       case 20:  // Ctrl-t
           readline_transpose_chars();
--- a/mcabber/src/screen.h	Fri Jun 10 18:42:38 2005 +0000
+++ b/mcabber/src/screen.h	Fri Jun 10 19:03:06 2005 +0000
@@ -43,5 +43,6 @@
 void scr_BufferTop(void);
 void scr_BufferBottom(void);
 void scr_Clear(void);
+void scr_RosterUnreadMessage(int);
 
 #endif