/*---------------------------------------------------------------------- Straighten out any local flag problems here. We can't take care of them in the mm_exists or mm_expunged callbacks since the flags themselves are in an MESSAGECACHE and we're not allowed to reenter c-client from a callback... Args: stream -- mail stream to operate on msgmap -- messages in that stream to fix up Result: returns with local flags as they should be ----*/ void fixup_flags(MAILSTREAM *stream, MSGNO_S *msgmap) { /* * Deal with the case where expunged away all of the * zoomed messages. Unhide everything in that case... */ if(mn_get_total(msgmap) > 0L){ long i; if(any_lflagged(msgmap, MN_HIDE) >= mn_get_total(msgmap)){ for(i = 1L; i <= mn_get_total(msgmap); i++) set_lflag(stream, msgmap, i, MN_HIDE, 0); mn_set_cur(msgmap, THREADING() ? first_sorted_flagged(F_NONE, stream, 0L, (THREADING() ? 0 : FSF_SKIP_CHID) | FSF_LAST) : mn_get_total(msgmap)); } else if(any_lflagged(msgmap, MN_HIDE)){ /* * if we got here, there are some hidden messages and * some not. Make sure the current message is one * that's not... */ for(i = mn_get_cur(msgmap); i <= mn_get_total(msgmap); i++) if(!msgline_hidden(stream, msgmap, i, 0)){ mn_set_cur(msgmap, i); break; } for(i = mn_get_cur(msgmap); i > 0L; i--) if(!msgline_hidden(stream, msgmap, i, 0)){ mn_set_cur(msgmap, i); break; } } } }
/*---------------------------------------------------------------------- Decrement the current message number Accepts: msgs - pointer to message manipulation struct ----*/ void msgno_dec(MAILSTREAM *stream, MSGNO_S *msgs, int flags) { long i; if(!msgs || mn_get_total(msgs) < 1L) return; for(i = (msgs)->select[((msgs)->sel_cur)] - 1L; i >= 1L; i--){ if(!msgline_hidden(stream, msgs, i, flags)){ (msgs)->select[((msgs)->sel_cur)] = i; break; } } }
/*---------------------------------------------------------------------- Increment the current message number Accepts: msgs - pointer to message manipulation struct ----*/ void msgno_inc(MAILSTREAM *stream, MSGNO_S *msgs, int flags) { long i; if(!msgs || mn_get_total(msgs) < 1L) return; for(i = msgs->select[msgs->sel_cur] + 1; i <= mn_get_total(msgs); i++){ if(!msgline_hidden(stream, msgs, i, flags)){ (msgs)->select[((msgs)->sel_cur)] = i; break; } } }