#include "mutt_curses.h"
#include "sidebar.h"
#include "buffy.h"
-#include <libgen.h>
#include "keymap.h"
+
+#include "lib/mem.h"
+#include "lib/str.h"
+#include "lib/intl.h"
+
+#include <libgen.h>
#include <ctype.h>
-/*BUFFY *CurBuffy = 0;*/
-static BUFFY *TopBuffy = 0;
-static BUFFY *BottomBuffy = 0;
+static int TopBuffy = 0;
+static int CurBuffy = 0;
static int known_lines = 0;
static short initialized = 0;
static int prev_show_value;
static short saveSidebarWidth;
static char *entry = 0;
-static int quick_log10 (int n)
-{
+/* computes how many digets a number has;
+ * FIXME move out to library?
+ */
+static int quick_log10 (int n) {
int len = 0;
for (; n > 9; len++, n /= 10);
return (++len);
}
-/* CurBuffy should contain a valid buffy
- * mailbox before calling this function!!! */
+/* computes first entry to be shown */
void calc_boundaries (int menu)
{
- BUFFY *tmp = Incoming;
- int position;
- int i, count, mailbox_position;
+ int lines = 0;
+ if (list_empty(Incoming))
+ return;
/* correct known_lines if it has changed because of a window resize */
- if (known_lines != LINES) {
+ if (known_lines != LINES)
known_lines = LINES;
- }
- /* 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 */
- position = 1;
- tmp = Incoming;
- while (tmp != CurBuffy) {
- position++;
- tmp = tmp->next;
- }
- /* 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 */
- mailbox_position = position % count;
- if (mailbox_position == 0)
- mailbox_position = count;
- /* determine topbuffy */
- TopBuffy = CurBuffy;
- for (i = mailbox_position; i > 1; i--)
- TopBuffy = TopBuffy->prev;
- /* determine bottombuffy */
- BottomBuffy = CurBuffy;
- for (i = mailbox_position; i < count && BottomBuffy->next; i++)
- BottomBuffy = BottomBuffy->next;
+ lines = LINES - 2 - (menu != MENU_PAGER || option (OPTSTATUSONTOP));
+ TopBuffy = CurBuffy - (CurBuffy % lines);
+ if (TopBuffy < 0)
+ TopBuffy = 0;
}
static char *shortened_hierarchy (char *box)
int i, j;
char *new_box;
- for (i = 0; i < mutt_strlen (box); ++i) {
+ for (i = 0; i < safe_strlen (box); ++i) {
if (box[i] == '.')
++dots;
else if (isupper (box[i]))
last_dot = strrchr (box, '.');
if (last_dot) {
++last_dot;
- new_box = safe_malloc (mutt_strlen (last_dot) + 2 * dots + 1);
+ new_box = safe_malloc (safe_strlen (last_dot) + 2 * dots + 1);
new_box[0] = box[0];
- for (i = 1, j = 1; i < mutt_strlen (box); ++i) {
+ for (i = 1, j = 1; i < safe_strlen (box); ++i) {
if (box[i] == '.') {
new_box[j++] = '.';
new_box[j] = 0;
return safe_strdup (box);
}
+/* print single item
+ * FIXME this is completely fucked up right now
+ */
char *make_sidebar_entry (char *box, int size, int new, int flagged)
{
int i = 0, dlen, max, shortened = 0;
if (SidebarWidth > COLS)
SidebarWidth = COLS;
- dlen = mutt_strlen (SidebarDelim);
+ dlen = safe_strlen (SidebarDelim);
max = SidebarWidth - dlen - 1;
safe_realloc (&entry, SidebarWidth + 1);
entry[SidebarWidth] = 0;
for (; i < SidebarWidth; entry[i++] = ' ');
#if USE_IMAP
- if (ImapHomeNamespace && mutt_strlen (ImapHomeNamespace) > 0) {
- if (strncmp (box, ImapHomeNamespace, mutt_strlen (ImapHomeNamespace)) == 0
- && strcmp (box, ImapHomeNamespace) != 0) {
- box += mutt_strlen (ImapHomeNamespace) + 1;
+ if (ImapHomeNamespace && safe_strlen (ImapHomeNamespace) > 0) {
+ if (strncmp (box, ImapHomeNamespace, safe_strlen (ImapHomeNamespace)) == 0
+ && safe_strcmp (box, ImapHomeNamespace) != 0) {
+ box += safe_strlen (ImapHomeNamespace) + 1;
}
}
#endif
max -= quick_log10 (new) + 2;
if (flagged > 0)
max -= quick_log10 (flagged) + 2;
- if (option (OPTSHORTENHIERARCHY) && mutt_strlen (box) > max) {
+ if (option (OPTSHORTENHIERARCHY) && safe_strlen (box) > max) {
box = shortened_hierarchy (box);
shortened = 1;
}
- i = mutt_strlen (box);
+ i = safe_strlen (box);
strncpy (entry, box, i < SidebarWidth - dlen ? i : SidebarWidth - dlen);
if (new) {
return entry;
}
-void set_curbuffy (char buf[LONG_STRING])
-{
- BUFFY *tmp = CurBuffy = Incoming;
-
- if (!Incoming)
- return;
-
- while (1) {
- if (!strcmp (tmp->path, buf)) {
- CurBuffy = tmp;
- break;
- }
-
- if (tmp->next)
- tmp = tmp->next;
- else
- break;
- }
+/* returns folder name of currently
+ * selected folder for <sidebar-open>
+ */
+const char* sidebar_get_current (void) {
+ if (list_empty(Incoming))
+ return (NULL);
+ return ((char*) ((BUFFY*) Incoming->data[CurBuffy])->path);
}
-void set_buffystats (CONTEXT * Context)
-{
- BUFFY *tmp = Incoming;
+/* internally sets item to buf */
+void sidebar_set_current (const char* buf) {
+ int i = buffy_lookup (buf);
+ if (i >= 0)
+ CurBuffy = i;
+}
- if (!Context)
+/* fix counters for a context
+ * FIXME since ctx must not be of our business, move it elsewhere
+ */
+void sidebar_set_buffystats (CONTEXT* Context) {
+ int i = 0;
+ BUFFY* tmp = NULL;
+ if (!Context || list_empty(Incoming) || (i = buffy_lookup (Context->path)) < 0)
return;
- while (tmp) {
- if (strcmp (tmp->path, Context->path) == 0) {
- tmp->new = Context->new;
- tmp->msg_unread = Context->unread;
- tmp->msgcount = Context->msgcount;
- tmp->msg_flagged = Context->flagged;
- break;
- }
- tmp = tmp->next;
- }
+ tmp = (BUFFY*) Incoming->data[i];
+ tmp->new = Context->new;
+ tmp->msg_unread = Context->unread;
+ tmp->msgcount = Context->msgcount;
+ tmp->msg_flagged = Context->flagged;
}
-int draw_sidebar (int menu)
+/* actually draws something
+ * FIXME this needs some clue when to do it
+ * FIXME this is completely fucked up right now
+ */
+int sidebar_draw (int menu)
{
int lines = option (OPTHELP) ? 1 : 0;
+ int draw_devider=1;
BUFFY *tmp;
- short delim_len = mutt_strlen (SidebarDelim);
+ int i = 0;
+ short delim_len = safe_strlen (SidebarDelim);
/* initialize first time */
if (!initialized) {
prev_show_value = option (OPTMBOXPANE);
saveSidebarWidth = SidebarWidth;
- if (!option (OPTMBOXPANE))
+ if (!option (OPTMBOXPANE)){
SidebarWidth = 0;
+ draw_devider = 1;
+ }
initialized = 1;
}
}
if (SidebarWidth > 0 && option (OPTMBOXPANE)
- && mutt_strlen (SidebarDelim) >= SidebarWidth) {
+ && safe_strlen (SidebarDelim) >= SidebarWidth) {
mutt_error (_("Value for sidebar_delim is too long. Disabling sidebar."));
sleep (2);
unset_option (OPTMBOXPANE);
if (SidebarWidth == 0 || !option (OPTMBOXPANE))
return 0;
-
- /* draw the divider */
- /* SETCOLOR(MT_COLOR_STATUS); */
- SETCOLOR (MT_COLOR_SIDEBAR);
- for (lines = 1;
- lines < LINES - 1 - (menu != MENU_PAGER || option (OPTSTATUSONTOP));
- lines++) {
- move (lines, SidebarWidth - delim_len);
- if (option (OPTASCIICHARS))
- addstr (NONULL (SidebarDelim));
- else if (!option (OPTASCIICHARS) && !strcmp (SidebarDelim, "|"))
- addch (ACS_VLINE);
- else if ((Charset_is_utf8) && !strcmp (SidebarDelim, "|"))
- addstr ("\342\224\202");
- else
- addstr (NONULL (SidebarDelim));
+ /* draw devider only if necessary (if the sidebar becomes visible e.g.)*/
+ if (draw_devider == 1){
+ /* draw the divider */
+ SETCOLOR (MT_COLOR_SIDEBAR);
+ for (lines = 1;
+ lines < LINES - 1 - (menu != MENU_PAGER || option (OPTSTATUSONTOP));
+ lines++) {
+ move (lines, SidebarWidth - delim_len);
+ if (option (OPTASCIICHARS))
+ addstr (NONULL (SidebarDelim));
+ else if (!option (OPTASCIICHARS) && !safe_strcmp (SidebarDelim, "|"))
+ addch (ACS_VLINE);
+ else if ((Charset_is_utf8) && !safe_strcmp (SidebarDelim, "|"))
+ addstr ("\342\224\202");
+ else
+ addstr (NONULL (SidebarDelim));
+ }
}
SETCOLOR (MT_COLOR_NORMAL);
- if (Incoming == 0)
+ if (list_empty(Incoming))
return 0;
- lines = option (OPTHELP) ? 1 : 0; /* go back to the top */
- if (CurBuffy == 0)
- CurBuffy = Incoming;
-#if 0
- if (known_lines != LINES || TopBuffy == 0 || BottomBuffy == 0)
-#endif
- calc_boundaries (menu);
+ lines = option (OPTHELP) ? 1 : 0; /* go back to the top */
- tmp = TopBuffy;
+ calc_boundaries (menu);
- for (;
- tmp && lines < LINES - 1 - (menu != MENU_PAGER
- || option (OPTSTATUSONTOP));
- tmp = tmp->next) {
- if (tmp == CurBuffy)
+ for (i = TopBuffy; i < Incoming->length && lines < LINES - 1 -
+ (menu != MENU_PAGER || option (OPTSTATUSONTOP)); i++) {
+ tmp = (BUFFY*) Incoming->data[i];
+ if (i == CurBuffy)
SETCOLOR (MT_COLOR_INDICATOR);
else if (tmp->msg_flagged > 0)
SETCOLOR (MT_COLOR_FLAGGED);
move (lines, 0);
if (option (OPTSIDEBARNEWMAILONLY)) {
if (tmp->msg_unread > 0) {
- if (Context && !strcmp (tmp->path, Context->path)) {
+ if (Context && !safe_strcmp (tmp->path, Context->path)) {
printw ("%.*s", SidebarWidth - delim_len,
make_sidebar_entry (basename (tmp->path),
Context->msgcount, Context->unread,
}
}
else {
- if (Context && !strcmp (tmp->path, Context->path)) {
+ if (Context && !safe_strcmp (tmp->path, Context->path)) {
printw ("%.*s", SidebarWidth - delim_len,
make_sidebar_entry (basename (tmp->path),
Context->msgcount, Context->unread,
return 0;
}
-BUFFY *exist_next_new ()
-{
- BUFFY *tmp = CurBuffy;
-
- if (tmp == NULL)
- return NULL;
- while (tmp->next != NULL) {
- tmp = tmp->next;
- if (tmp->msg_unread)
- return tmp;
- }
- return NULL;
+/* returns index of new item with new mail or -1 */
+static int exist_next_new () {
+ int i = 0;
+ if (list_empty(Incoming))
+ return (-1);
+ i = CurBuffy + 1;
+ while (i < Incoming->length)
+ if (((BUFFY*) Incoming->data[i++])->msg_unread)
+ return (i-1);
+ return (-1);
}
-BUFFY *exist_prev_new ()
-{
- BUFFY *tmp = CurBuffy;
-
- if (tmp == NULL)
- return NULL;
- while (tmp->prev != NULL) {
- tmp = tmp->prev;
- if (tmp->msg_unread)
- return tmp;
- }
- return NULL;
+/* returns index of prev item with new mail or -1 */
+static int exist_prev_new () {
+ int i = 0;
+ if (list_empty(Incoming))
+ return (-1);
+ i = CurBuffy - 1;
+ while (i >= 0)
+ if (((BUFFY*) Incoming->data[i--])->msg_unread)
+ return (i+1);
+ return (-1);
}
+void sidebar_scroll (int op, int menu) {
+ int i = 0;
-void scroll_sidebar (int op, int menu)
-{
- BUFFY *tmp;
-
- if (!SidebarWidth)
- return;
- if (!CurBuffy)
+ if (!SidebarWidth || list_empty(Incoming))
return;
switch (op) {
case OP_SIDEBAR_NEXT:
if (!option (OPTSIDEBARNEWMAILONLY)) {
- if (CurBuffy->next == NULL) {
+ if (CurBuffy + 1 == Incoming->length) {
mutt_error (_("You are on the last mailbox."));
return;
}
- CurBuffy = CurBuffy->next;
+ CurBuffy++;
break;
} /* the fall-through is intentional */
case OP_SIDEBAR_NEXT_NEW:
- if ((tmp = exist_next_new ()) == NULL) {
+ if ((i = exist_next_new ()) < 0) {
mutt_error (_("No next mailboxes with new mail."));
return;
}
else
- CurBuffy = tmp;
+ CurBuffy = i;
break;
case OP_SIDEBAR_PREV:
if (!option (OPTSIDEBARNEWMAILONLY)) {
- if (CurBuffy->prev == NULL) {
+ if (CurBuffy == 0) {
mutt_error (_("You are on the first mailbox."));
return;
}
- CurBuffy = CurBuffy->prev;
+ CurBuffy--;
break;
} /* the fall-through is intentional */
case OP_SIDEBAR_PREV_NEW:
- if ((tmp = exist_prev_new ()) == NULL) {
+ if ((i = exist_prev_new ()) < 0) {
mutt_error (_("No previous mailbox with new mail."));
return;
}
else
- CurBuffy = tmp;
+ CurBuffy = i;
break;
case OP_SIDEBAR_SCROLL_UP:
- CurBuffy = TopBuffy;
- if (CurBuffy != Incoming) {
- calc_boundaries (menu);
- CurBuffy = CurBuffy->prev;
+ if (TopBuffy == 0) {
+ mutt_error (_("You are on the first mailbox."));
+ return;
}
+ CurBuffy -= known_lines;
+ if (CurBuffy < 0)
+ CurBuffy = 0;
break;
case OP_SIDEBAR_SCROLL_DOWN:
- CurBuffy = BottomBuffy;
- if (CurBuffy->next) {
- calc_boundaries (menu);
- CurBuffy = CurBuffy->next;
+ if (TopBuffy + known_lines >= Incoming->length) {
+ mutt_error (_("You are on the last mailbox."));
+ return;
}
+ CurBuffy += known_lines;
+ if (CurBuffy >= Incoming->length)
+ CurBuffy = Incoming->length;
break;
default:
return;
}
calc_boundaries (menu);
- draw_sidebar (menu);
+ sidebar_draw (menu);
}