Rocco Rutte:
authorpdmef <pdmef@e385b8ad-14ed-0310-8656-cc95a2468c6d>
Tue, 1 Mar 2005 19:23:41 +0000 (19:23 +0000)
committerpdmef <pdmef@e385b8ad-14ed-0310-8656-cc95a2468c6d>
Tue, 1 Mar 2005 19:23:41 +0000 (19:23 +0000)
sidebar fixes (sort mailboxes by name, fix new mail recognition, ...)

git-svn-id: svn://svn.berlios.de/mutt-ng/trunk@127 e385b8ad-14ed-0310-8656-cc95a2468c6d

ChangeLog.mutt-ng
buffy.c
curs_main.c
sidebar.c

index d0e2f11..2908a31 100644 (file)
@@ -1,6 +1,7 @@
 Changes specific to mutt-ng:
 
 2005-03-01:
+  * made internal buffy list sorted (-> sorted in sidebar, too)
   * somewhat bigger documentation update; introduce UPGRADING document
   * fixed escape sequence problem in manual.txt
 
diff --git a/buffy.c b/buffy.c
index a90b0a8..3a0888d 100644 (file)
--- a/buffy.c
+++ b/buffy.c
@@ -24,6 +24,7 @@
 #include "buffy.h"
 #include "mailbox.h"
 #include "mx.h"
+#include "sidebar.h"
 
 #include "mutt_curses.h"
 
@@ -171,12 +172,25 @@ void mutt_update_mailbox (BUFFY * b)
 
 int mutt_parse_mailboxes (BUFFER *path, BUFFER *s, unsigned long data, BUFFER *err)
 {
-  BUFFY **tmp,*tmp1;
+  BUFFY **tmp,*tmp1,*last;
   char buf[_POSIX_PATH_MAX];
+  int dup = 0;
 #ifdef BUFFY_SIZE
   struct stat sb;
 #endif /* BUFFY_SIZE */
 
+  /*
+   * FIXME
+   * to get rid of correcting the ->prev pointers in sidebar.c,
+   * correct them right here
+   */
+
+  /*
+   * FIXME
+   * if we really want to make the sort order of the sidebar
+   * configurable, this has to go right here
+   */
+  
   while (MoreArgs (s))
   {
     mutt_extract_token (path, s, 0);
@@ -200,12 +214,19 @@ int mutt_parse_mailboxes (BUFFER *path, BUFFER *s, unsigned long data, BUFFER *e
     if(!*buf) continue;
 
     /* simple check to avoid duplicates */
-    for (tmp = &Incoming; *tmp; tmp = &((*tmp)->next))
+    dup = 0;
+    for (tmp = &Incoming; *tmp && dup == 0; tmp = &((*tmp)->next))
     {
-      if (mutt_strcmp (buf, (*tmp)->path) == 0)
-       break;
+      if (mutt_strcmp (buf, (*tmp)->path) == 0) {
+        dup = 1;
+        break;
+      }
     }
 
+    if (dup == 1)
+      continue;
+    tmp = &Incoming;
+
     if(data == M_UNMAILBOXES)
     {
       if(*tmp)
@@ -218,16 +239,32 @@ int mutt_parse_mailboxes (BUFFER *path, BUFFER *s, unsigned long data, BUFFER *e
       continue;
     }
 
-    if (!*tmp)
-    {
-      *tmp = (BUFFY *) safe_calloc (1, sizeof (BUFFY));
-      (*tmp)->path = safe_strdup (buf);
-      (*tmp)->next = NULL;
-      /* it is tempting to set magic right here */
-      (*tmp)->magic = 0;
-      
+    /* loop over list while it's sorted */
+    tmp1 = NULL;
+    last = NULL;
+    for (tmp = &Incoming; *tmp ; tmp = &((*tmp)->next)) {
+      /*
+       * FIXME
+       * change this to get whatever sorting order
+       */
+      if (mutt_strcmp (buf, (*tmp)->path) < 0) {
+        tmp1 = (*tmp);
+        break;
+      }
+      last = (*tmp);
     }
 
+    /* we want: last -> tmp -> tmp1 */
+    *tmp = (BUFFY *) safe_calloc (1, sizeof (BUFFY));
+    (*tmp)->path = safe_strdup (buf);
+    (*tmp)->magic = 0;
+
+    /* correct pointers */
+    (*tmp)->next = tmp1;
+    if (last)
+      last->next = (*tmp);
+
+    /* left as-is */
     (*tmp)->new = 0;
     (*tmp)->notified = 1;
     (*tmp)->newly_created = 0;
@@ -428,7 +465,6 @@ int mutt_buffy_check (int force)
                if (SidebarWidth == 0)
                {
                  /* if sidebar invisible -> done */
-                 tmp->new = 1;
                  break;
                }
             }
@@ -453,7 +489,6 @@ int mutt_buffy_check (int force)
             if (*de->d_name != '.' && 
                 (!(p = strstr (de->d_name, ":2,")) || !strchr (p + 3, 'T')))
             {
-              BuffyCount++;
               tmp->msgcount++;
             }
           }
@@ -565,6 +600,8 @@ int mutt_buffy_list (void)
   }
   if (!first)
   {
+    /* on new mail: redraw sidebar */
+    draw_sidebar (CurrentMenu);
     mutt_message ("%s", buffylist);
     return (1);
   }
index fd4d287..bbbc6c4 100644 (file)
@@ -537,6 +537,8 @@ int mutt_index_menu (void)
           mutt_error _("Mailbox was externally modified.  Flags may be wrong.");
         else if (check == M_NEW_MAIL)
         {
+          /* on new mail: redraw sidebar */
+          draw_sidebar (CurrentMenu);
           mutt_message _("New mail in this mailbox.");
           if (option (OPTBEEPNEW))
             beep ();
index 9290a1a..e136de6 100644 (file)
--- a/sidebar.c
+++ b/sidebar.c
@@ -46,22 +46,24 @@ static int quick_log10(int n)
   return (++len);
 }
 
-// CurBuffy should contain a valid buffy mailbox before calling this function!!!
+/* CurBuffy should contain a valid buffy 
+ * mailbox before calling this function!!! */
 void calc_boundaries (int menu)
 {
   BUFFY *tmp = Incoming;
   int position;
   int i,count, mailbox_position;
 
-  // correct known_lines if it has changed because of a window resize
+  /* correct known_lines if it has changed because of a window resize */
   if ( known_lines != LINES ) {
     known_lines = LINES;
   }
-  // fix all the prev links on all the mailboxes
+  /* fix all the prev links on all the mailboxes
+   * FIXME move this over to buffy.c where it belongs */
   for ( ; tmp->next != 0; tmp = tmp->next )
     tmp->next->prev = tmp;
 
-  // calculate the position of the current mailbox
+  /* calculate the position of the current mailbox */
   position = 1;
   tmp = Incoming;
   while (tmp != CurBuffy)
@@ -69,17 +71,18 @@ void calc_boundaries (int menu)
     position++;
     tmp = tmp->next;
   }
-  // calculate the size of the screen we can use
+  /* calculate the size of the screen we can use */
   count = LINES - 2 - (menu != MENU_PAGER || option (OPTSTATUSONTOP));
-  // calculate the position of the current mailbox on the screen
+  /* calculate the position of the current mailbox on the screen */
   mailbox_position = position%count;
   if (mailbox_position == 0) mailbox_position=count;
-  // determine topbuffy
+  /* determine topbuffy */
   TopBuffy = CurBuffy;
   for(i = mailbox_position; i >1; i--) TopBuffy = TopBuffy->prev;
-  // determine bottombuffy
+  /* determine bottombuffy */
   BottomBuffy = CurBuffy;
-  for(i = mailbox_position; i < count && BottomBuffy->next; i++) BottomBuffy = BottomBuffy->next;
+  for(i = mailbox_position; i < count && BottomBuffy->next; i++)
+    BottomBuffy = BottomBuffy->next;
 }
 
 static char * shortened_hierarchy(char * box) {
@@ -320,21 +323,31 @@ void scroll_sidebar(int op, int menu)
 
   switch (op) {
     case OP_SIDEBAR_NEXT:
-      if ( CurBuffy->next == NULL ) return;
+      if ( CurBuffy->next == NULL ) {
+        mutt_error (_("You are on the last mailbox."));
+        return;
+      }
       CurBuffy = CurBuffy->next;
       break;
     case OP_SIDEBAR_NEXT_NEW:
-      if ( (tmp = exist_next_new()) == NULL)
-          return;
+      if ( (tmp = exist_next_new()) == NULL) {
+        mutt_error (_("No next mailboxes with new mail."));
+        return;
+      }
       else CurBuffy = tmp;
       break;
     case OP_SIDEBAR_PREV:
-      if ( CurBuffy->prev == NULL ) return;
+      if ( CurBuffy->prev == NULL ) {
+        mutt_error (_("You are on the first mailbox."));
+        return;
+      }
       CurBuffy = CurBuffy->prev;
      break;
     case OP_SIDEBAR_PREV_NEW:
-      if ( (tmp = exist_prev_new()) == NULL)
-          return;
+      if ( (tmp = exist_prev_new()) == NULL) {
+        mutt_error (_("No previous mailbox with new mail."));
+        return;
+      }
       else CurBuffy = tmp;
       break;