diff options
author | Eduardo Chappa <echappa@gmx.com> | 2013-02-03 00:59:38 -0700 |
---|---|---|
committer | Eduardo Chappa <echappa@gmx.com> | 2013-02-03 00:59:38 -0700 |
commit | 094ca96844842928810f14844413109fc6cdd890 (patch) | |
tree | e60efbb980f38ba9308ccb4fb2b77b87bbc115f3 /pith/flag.h | |
download | alpine-094ca96844842928810f14844413109fc6cdd890.tar.xz |
Initial Alpine Version
Diffstat (limited to 'pith/flag.h')
-rw-r--r-- | pith/flag.h | 155 |
1 files changed, 155 insertions, 0 deletions
diff --git a/pith/flag.h b/pith/flag.h new file mode 100644 index 00000000..0e96e116 --- /dev/null +++ b/pith/flag.h @@ -0,0 +1,155 @@ +/* + * $Id: flag.h 1142 2008-08-13 17:22:21Z hubert@u.washington.edu $ + * + * ======================================================================== + * Copyright 2006-2007 University of Washington + * Copyright 2013 Eduardo Chappa + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * ======================================================================== + */ + +#ifndef PITH_FLAG_INCLUDED +#define PITH_FLAG_INCLUDED + + +#include "../pith/msgno.h" + + +/* + * Useful def's to specify interesting flags + */ +#define F_NONE 0x00000000 +#define F_SEEN 0x00000001 +#define F_UNSEEN 0x00000002 +#define F_DEL 0x00000004 +#define F_UNDEL 0x00000008 +#define F_FLAG 0x00000010 +#define F_UNFLAG 0x00000020 +#define F_ANS 0x00000040 +#define F_UNANS 0x00000080 +#define F_FWD 0x00000100 +#define F_UNFWD 0x00000200 +#define F_RECENT 0x00000400 +#define F_UNRECENT 0x00000800 +#define F_DRAFT 0x00001000 +#define F_UNDRAFT 0x00002000 + +#define F_SRCHBACK 0x00004000 /* search backwards instead of forw */ +#define F_NOFILT 0x00008000 /* defer processing filters */ + +#define F_OR_SEEN 0x00010000 +#define F_OR_UNSEEN 0x00020000 +#define F_OR_DEL 0x00040000 +#define F_OR_UNDEL 0x00080000 +#define F_OR_FLAG 0x00100000 +#define F_OR_UNFLAG 0x00200000 +#define F_OR_ANS 0x00400000 +#define F_OR_UNANS 0x00800000 +#define F_OR_FWD 0x01000000 +#define F_OR_UNFWD 0x02000000 +#define F_OR_RECENT 0x04000000 +#define F_OR_UNRECENT 0x08000000 + +#define F_KEYWORD 0x10000000 +#define F_UNKEYWORD 0x20000000 + +#define F_COMMENT 0x40000000 + + +/* + * Useful flag checking macro + */ +#define FLAG_MATCH(F,M,S) (((((F)&F_SEEN) ? (M)->seen \ + : ((F)&F_UNSEEN) ? !(M)->seen : 1) \ + && (((F)&F_DEL) ? (M)->deleted \ + : ((F)&F_UNDEL) ? !(M)->deleted : 1) \ + && (((F)&F_ANS) ? (M)->answered \ + : ((F)&F_UNANS) ? !(M)->answered : 1) \ + && (((F)&F_FWD) ? ((S) && user_flag_is_set((S),(M)->msgno,FORWARDED_FLAG)) \ + : ((F)&F_UNFWD) ? ((S) && !user_flag_is_set((S),(M)->msgno,FORWARDED_FLAG)) : 1) \ + && (((F)&F_FLAG) ? (M)->flagged \ + : ((F)&F_UNFLAG) ? !(M)->flagged : 1) \ + && (((F)&F_RECENT) ? (M)->recent \ + : ((F)&F_UNRECENT) ? !(M)->recent : 1)) \ + || ((((F)&F_OR_SEEN) ? (M)->seen \ + : ((F)&F_OR_UNSEEN) ? !(M)->seen : 0) \ + || (((F)&F_OR_DEL) ? (M)->deleted \ + : ((F)&F_OR_UNDEL) ? !(M)->deleted : 0) \ + || (((F)&F_OR_ANS) ? (M)->answered \ + : ((F)&F_OR_UNANS) ? !(M)->answered : 0) \ + || (((F)&F_OR_FWD) ? ((S) && user_flag_is_set((S),(M)->msgno,FORWARDED_FLAG)) \ + : ((F)&F_OR_UNFWD) ? !((S) && user_flag_is_set((S),(M)->msgno,FORWARDED_FLAG)) : 0) \ + || (((F)&F_OR_FLAG)? (M)->flagged \ + : ((F)&F_OR_UNFLAG) ? !(M)->flagged : 0) \ + || (((F)&F_OR_RECENT)? (M)->recent \ + : ((F)&F_OR_UNRECENT) ? !(M)->recent : 0))) + + +/* + * These are def's to help manage local, private flags pine uses + * to maintain it's mapping table (see MSGNO_S def). The local flags + * are actually stored in spare bits in c-client's per-message + * MESSAGECACHE struct. But they're private, you ask. Since the flags + * are tied to the actual message (independent of the mapping), storing + * them in the c-client means we don't have to worry about them during + * sorting and such. See {set,get}_lflags for more on local flags. + * + * MN_HIDE hides messages which are not visible due to Zooming. + * MN_EXLD hides messages which have been filtered away. + * MN_SLCT marks messages which have been Selected. + * MN_SRCH marks messages that are the result of a search + * MN_COLL marks a point in the thread tree where the view has been + * collapsed, hiding the messages below that point + * MN_CHID hides messages which are collapsed out of view + * MN_CHID2 is similar to CHID and is introduced for performance reasons. + * When using the separate-thread-index the toplevel messages are + * MN_COLL and everything else is MN_CHID. However, if we view a + * single thread from there, instead of marking all of those top + * level threads MN_HIDE (or something) we change the semantics + * of the flags. When viewing a single thread we mark the messages + * of the thread with MN_CHID2 for performance reasons. + */ +#define MN_NONE 0x0000 /* No Pine specific flags */ +#define MN_HIDE 0x0001 /* Pine specific hidden */ +#define MN_EXLD 0x0002 /* Pine specific excluded */ +#define MN_SLCT 0x0004 /* Pine specific selected */ +#define MN_COLL 0x0008 /* Pine specific collapsed */ +#define MN_CHID 0x0010 /* A parent somewhere above us is collapsed */ +#define MN_CHID2 0x0020 /* performance related */ +#define MN_USOR 0x0040 /* New message which hasn't been sorted yet */ +#define MN_STMP 0x0080 /* Temporary storage for a per-message bit */ +#define MN_SRCH 0x0100 /* Search result */ + + +/* next_sorted_flagged options */ +#define NSF_TRUST_FLAGS 0x01 /* input flag, don't need to ping */ +#define NSF_SKIP_CHID 0x02 /* input flag, skip MN_CHID messages */ +#define NSF_SEARCH_BACK 0x04 /* input flag, search backward if none forw */ +#define NSF_FLAG_MATCH 0x08 /* return flag, actually got a match */ + +/* first_sorted_flagged options */ +#define FSF_LAST 0x01 /* last instead of first */ +#define FSF_SKIP_CHID 0x02 /* skip MN_CHID messages */ + + +typedef long MsgNo; + + +/* exported protoypes */ +long count_flagged(MAILSTREAM *, long); +MsgNo first_sorted_flagged(unsigned long, MAILSTREAM *, long, int); +MsgNo next_sorted_flagged(unsigned long, MAILSTREAM *, long, int *); +int get_lflag(MAILSTREAM *, MSGNO_S *, long, int); +int set_lflag(MAILSTREAM *, MSGNO_S *, long, int, int); +void copy_lflags(MAILSTREAM *, MSGNO_S *, int, int); +void set_lflags(MAILSTREAM *, MSGNO_S *, int, int); +long any_lflagged(MSGNO_S *, int); + + +#endif /* PITH_FLAG_INCLUDED */ |