show and update flags in acme mail
now, it's possible to tell whether you've read or replied to a message.
This commit is contained in:
parent
84c4c81cee
commit
3889b249d4
|
@ -49,6 +49,7 @@ struct Message
|
||||||
int ctlfd;
|
int ctlfd;
|
||||||
char *name;
|
char *name;
|
||||||
char *replyname;
|
char *replyname;
|
||||||
|
char *replydigest;
|
||||||
uchar opened;
|
uchar opened;
|
||||||
uchar dirty;
|
uchar dirty;
|
||||||
uchar isreply;
|
uchar isreply;
|
||||||
|
@ -70,6 +71,7 @@ struct Message
|
||||||
char *disposition;
|
char *disposition;
|
||||||
char *filename;
|
char *filename;
|
||||||
char *digest;
|
char *digest;
|
||||||
|
char *flags;
|
||||||
|
|
||||||
Message *next; /* next in this mailbox */
|
Message *next; /* next in this mailbox */
|
||||||
Message *prev; /* prev in this mailbox */
|
Message *prev; /* prev in this mailbox */
|
||||||
|
@ -123,6 +125,7 @@ extern int write2(int, int, char*, int, int);
|
||||||
extern int mesgadd(Message*, char*, Dir*, char*);
|
extern int mesgadd(Message*, char*, Dir*, char*);
|
||||||
extern void mesgmenu(Window*, Message*);
|
extern void mesgmenu(Window*, Message*);
|
||||||
extern void mesgmenunew(Window*, Message*);
|
extern void mesgmenunew(Window*, Message*);
|
||||||
|
extern void mesgmenureflag(Window*, Message*);
|
||||||
extern int mesgopen(Message*, char*, char*, Message*, int, char*);
|
extern int mesgopen(Message*, char*, char*, Message*, int, char*);
|
||||||
extern void mesgctl(void*);
|
extern void mesgctl(void*);
|
||||||
extern void mesgsend(Message*);
|
extern void mesgsend(Message*);
|
||||||
|
@ -146,6 +149,7 @@ extern char* eappend(char*, char*, char*);
|
||||||
extern void error(char*, ...);
|
extern void error(char*, ...);
|
||||||
extern int tokenizec(char*, char**, int, char*);
|
extern int tokenizec(char*, char**, int, char*);
|
||||||
extern void execproc(void*);
|
extern void execproc(void*);
|
||||||
|
extern void setflags(Message*, char *);
|
||||||
|
|
||||||
#pragma varargck argpos error 1
|
#pragma varargck argpos error 1
|
||||||
#pragma varargck argpos ctlprint 2
|
#pragma varargck argpos ctlprint 2
|
||||||
|
|
|
@ -132,7 +132,7 @@ loadinfo(Message *m, char *dir)
|
||||||
/* m->messageid = */ free(line(p, &p));
|
/* m->messageid = */ free(line(p, &p));
|
||||||
/* m->lines = */ free(line(p, &p));
|
/* m->lines = */ free(line(p, &p));
|
||||||
/* m->size = */ free(line(p, &p));
|
/* m->size = */ free(line(p, &p));
|
||||||
/* m->flags = */ free(line(p, &p));
|
m->flags = line(p, &p);
|
||||||
/* m->fileid = */ free(line(p, &p));
|
/* m->fileid = */ free(line(p, &p));
|
||||||
m->fromcolon = fc(m, line(p, &p));
|
m->fromcolon = fc(m, line(p, &p));
|
||||||
|
|
||||||
|
@ -308,14 +308,36 @@ writefile(char *dir, char *name, char *s)
|
||||||
return s == e? 0: -1;
|
return s == e? 0: -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
setflags(Message *m, char *f)
|
setflags(Message *m, char *f)
|
||||||
{
|
{
|
||||||
char *t;
|
char *flgchar = "aDdfrsS";
|
||||||
|
char *t, *p;
|
||||||
|
int rm;
|
||||||
|
|
||||||
t = smprint("%s/%s", mbox.name, m->name);
|
t = smprint("%s/%s", mbox.name, m->name);
|
||||||
writefile(t, "flags", f);
|
writefile(t, "flags", f);
|
||||||
free(t);
|
free(t);
|
||||||
|
for(; *f; f++){
|
||||||
|
rm = 0;
|
||||||
|
if(*f == '-'){
|
||||||
|
rm = 1;
|
||||||
|
f++;
|
||||||
|
}
|
||||||
|
if((p = strchr(flgchar, *f)) != nil)
|
||||||
|
m->flags[p - flgchar] = rm ? '-' : *f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
fmtflags(char *b, char *flg)
|
||||||
|
{
|
||||||
|
*b++ = '[';
|
||||||
|
*b++ = (strchr(flg, 's') == nil) ? '*' : ' '; /* unread */
|
||||||
|
*b++ = (strchr(flg, 'a') == nil) ? ' ' : 'R'; /* answered */
|
||||||
|
*b++ = ']';
|
||||||
|
*b = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
char*
|
char*
|
||||||
|
@ -324,13 +346,14 @@ info(Message *m, int ind, int ogf)
|
||||||
char *i;
|
char *i;
|
||||||
int j, len, lens;
|
int j, len, lens;
|
||||||
char *p;
|
char *p;
|
||||||
char fmt[80], s[80];
|
char fmt[80], s[80], flg[16];
|
||||||
|
|
||||||
if (ogf)
|
if (ogf)
|
||||||
p=m->to;
|
p=m->to;
|
||||||
else
|
else
|
||||||
p=m->fromcolon;
|
p=m->fromcolon;
|
||||||
|
|
||||||
|
fmtflags(flg, m->flags);
|
||||||
if(ind==0 && altmenu){
|
if(ind==0 && altmenu){
|
||||||
len = 12;
|
len = 12;
|
||||||
lens = 20;
|
lens = 20;
|
||||||
|
@ -369,6 +392,7 @@ info(Message *m, int ind, int ogf)
|
||||||
}
|
}
|
||||||
|
|
||||||
i = estrdup("");
|
i = estrdup("");
|
||||||
|
i = eappend(i, " ", flg);
|
||||||
i = eappend(i, "\t", p);
|
i = eappend(i, "\t", p);
|
||||||
i = egrow(i, "\t", stripdate(m->date));
|
i = egrow(i, "\t", stripdate(m->date));
|
||||||
if(ind == 0){
|
if(ind == 0){
|
||||||
|
@ -537,6 +561,24 @@ mesgmenudel(Window *w, Message *mbox, Message *m)
|
||||||
m->deleted = 1;
|
m->deleted = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
mesgmenureflag(Window *w, Message *m)
|
||||||
|
{
|
||||||
|
char *buf, flg[16];
|
||||||
|
|
||||||
|
fmtflags(flg, m->flags);
|
||||||
|
buf = name2regexp(deletedrx01, m->name);
|
||||||
|
strcat(buf, "+/\\[[^\\]]*\\]/");
|
||||||
|
if(w->data < 0)
|
||||||
|
w->data = winopenfile(w, "data");
|
||||||
|
if(winselect(w, buf, 1))
|
||||||
|
write(w->data, flg, strlen(flg));
|
||||||
|
free(buf);
|
||||||
|
|
||||||
|
close(w->data);
|
||||||
|
w->data = -1;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
mesgmenumark(Window *w, char *which, char *mark)
|
mesgmenumark(Window *w, char *which, char *mark)
|
||||||
{
|
{
|
||||||
|
@ -570,6 +612,7 @@ mesgfreeparts(Message *m)
|
||||||
free(m->type);
|
free(m->type);
|
||||||
free(m->disposition);
|
free(m->disposition);
|
||||||
free(m->filename);
|
free(m->filename);
|
||||||
|
free(m->flags);
|
||||||
free(m->digest);
|
free(m->digest);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1312,6 +1355,7 @@ mesgopen(Message *mbox, char *dir, char *s, Message *mesg, int plumbed, char *di
|
||||||
winclean(m->w);
|
winclean(m->w);
|
||||||
m->opened = 1;
|
m->opened = 1;
|
||||||
setflags(m, "s");
|
setflags(m, "s");
|
||||||
|
mesgmenureflag(mbox->w, m);
|
||||||
if(ndirelem == 1){
|
if(ndirelem == 1){
|
||||||
free(u);
|
free(u);
|
||||||
return 1;
|
return 1;
|
||||||
|
|
|
@ -77,8 +77,10 @@ mkreply(Message *m, char *label, char *to, Plumbattr *attr, char *quotetext)
|
||||||
quotereply = (label[0] == 'Q');
|
quotereply = (label[0] == 'Q');
|
||||||
r = emalloc(sizeof(Message));
|
r = emalloc(sizeof(Message));
|
||||||
r->isreply = 1;
|
r->isreply = 1;
|
||||||
if(m != nil)
|
if(m != nil){
|
||||||
r->replyname = estrdup(m->name);
|
r->replyname = estrdup(m->name);
|
||||||
|
r->replydigest = estrdup(m->digest);
|
||||||
|
}
|
||||||
r->next = replies.head;
|
r->next = replies.head;
|
||||||
r->prev = nil;
|
r->prev = nil;
|
||||||
if(replies.head != nil)
|
if(replies.head != nil)
|
||||||
|
@ -184,7 +186,7 @@ buildargv(char **inargv, char *argv[NARGS+1], char args[NARGCHAR])
|
||||||
void
|
void
|
||||||
execproc(void *v)
|
execproc(void *v)
|
||||||
{
|
{
|
||||||
struct Exec *e;
|
Exec *e;
|
||||||
int p[2], q[2];
|
int p[2], q[2];
|
||||||
char *prog;
|
char *prog;
|
||||||
char *argv[NARGS+1], args[NARGCHAR];
|
char *argv[NARGS+1], args[NARGCHAR];
|
||||||
|
@ -382,8 +384,9 @@ mesgsend(Message *m)
|
||||||
{
|
{
|
||||||
char *s, *body, *to;
|
char *s, *body, *to;
|
||||||
int i, j, h, n, natt, p[2];
|
int i, j, h, n, natt, p[2];
|
||||||
struct Exec *e;
|
Exec *e;
|
||||||
Channel *sync;
|
Channel *sync;
|
||||||
|
Message *r;
|
||||||
int first, nfld, delit, ofd;
|
int first, nfld, delit, ofd;
|
||||||
char *copy, *fld[100], *now;
|
char *copy, *fld[100], *now;
|
||||||
|
|
||||||
|
@ -479,7 +482,7 @@ mesgsend(Message *m)
|
||||||
fprint(ofd, "Content-Transfer-Encoding: 8bit\n");
|
fprint(ofd, "Content-Transfer-Encoding: 8bit\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
e = emalloc(sizeof(struct Exec));
|
e = emalloc(sizeof(Exec));
|
||||||
if(pipe(p) < 0)
|
if(pipe(p) < 0)
|
||||||
error("can't create pipe: %r");
|
error("can't create pipe: %r");
|
||||||
e->p[0] = p[0];
|
e->p[0] = p[0];
|
||||||
|
@ -553,8 +556,13 @@ mesgsend(Message *m)
|
||||||
close(p[1]);
|
close(p[1]);
|
||||||
free(body);
|
free(body);
|
||||||
|
|
||||||
if(m->replyname != nil)
|
print("replyname: %s, replydigest=%s\n", m->replyname, m->replydigest);
|
||||||
mesgmenumark(mbox.w, m->replyname, "\t[replied]");
|
if(m->replyname){
|
||||||
|
if((r = mesglookup(&mbox, m->replyname, m->replydigest)) != nil){
|
||||||
|
setflags(r, "a");
|
||||||
|
mesgmenureflag(mbox.w, r);
|
||||||
|
}
|
||||||
|
}
|
||||||
if(m->name[0] == '/')
|
if(m->name[0] == '/')
|
||||||
s = estrdup(m->name);
|
s = estrdup(m->name);
|
||||||
else
|
else
|
||||||
|
|
Loading…
Reference in a new issue