diff options
author | Ori Bernstein <ori@eigenstate.org> | 2019-12-09 12:46:27 -0800 |
---|---|---|
committer | Ori Bernstein <ori@eigenstate.org> | 2019-12-09 12:46:27 -0800 |
commit | f7431283d906b1cd7e53eed47af055a5132bbfae (patch) | |
tree | 0cf610c006a09a3d9e9fd30a89286265ca25a38b /sys | |
parent | 55af35eeeb3026ee9aba3658b7ba12d6ea3a5015 (diff) |
upas/fs plumb flag changes.
This patch makes 3 changes:
- It makes upas/fs send plumb messages when a message
changes in the background (eg, someone on another imap
connection opens a message and sets the read flag)
- It makes faces not complain when it gets one of these
new modify messages.
- It makes acme/Mail update the flags in the display
when it gets one of these messages.
Diffstat (limited to 'sys')
-rw-r--r-- | sys/src/cmd/faces/plumb.c | 15 | ||||
-rw-r--r-- | sys/src/cmd/upas/Mail/dat.h | 1 | ||||
-rw-r--r-- | sys/src/cmd/upas/Mail/mail.c | 25 | ||||
-rw-r--r-- | sys/src/cmd/upas/fs/dat.h | 1 | ||||
-rw-r--r-- | sys/src/cmd/upas/fs/imap.c | 4 | ||||
-rw-r--r-- | sys/src/cmd/upas/fs/mbox.c | 25 |
6 files changed, 51 insertions, 20 deletions
diff --git a/sys/src/cmd/faces/plumb.c b/sys/src/cmd/faces/plumb.c index 1c85fa1a2..54abbff9f 100644 --- a/sys/src/cmd/faces/plumb.c +++ b/sys/src/cmd/faces/plumb.c @@ -273,13 +273,18 @@ nextface(void) if(m == nil) killall("error on seemail plumb port"); t = value(m->attr, "mailtype", ""); - if(strcmp(t, "delete") == 0) + if(strcmp(t, "modify") == 0) + goto Ignore; + else if(strcmp(t, "delete") == 0) delete(m->data, value(m->attr, "digest", nil)); - else if(strcmp(t, "new") != 0) + else if(strcmp(t, "new") == 0) + for(i=0; i<nmaildirs; i++){ + if(strncmp(m->data, maildirs[i], strlen(maildirs[i])) == 0) + goto Found; + } + else fprint(2, "faces: unknown plumb message type %s\n", t); - else for(i=0; i<nmaildirs; i++) - if(strncmp(m->data, maildirs[i], strlen(maildirs[i])) == 0) - goto Found; + Ignore: plumbfree(m); continue; diff --git a/sys/src/cmd/upas/Mail/dat.h b/sys/src/cmd/upas/Mail/dat.h index a2c75c4e3..8f2c747ef 100644 --- a/sys/src/cmd/upas/Mail/dat.h +++ b/sys/src/cmd/upas/Mail/dat.h @@ -124,6 +124,7 @@ extern int write2(int, int, char*, int, int); extern int mesgadd(Message*, char*, Dir*, char*); extern void mesgmenu(Window*, Message*); +extern void mesgmenuselect(Window*, Message*); extern void mesgmenunew(Window*, Message*); extern void mesgmenureflag(Window*, Message*); extern int mesgopen(Message*, char*, char*, Message*, int, char*); diff --git a/sys/src/cmd/upas/Mail/mail.c b/sys/src/cmd/upas/Mail/mail.c index a0d9fd18e..b3fef4070 100644 --- a/sys/src/cmd/upas/Mail/mail.c +++ b/sys/src/cmd/upas/Mail/mail.c @@ -189,7 +189,7 @@ threadmain(int argc, char *argv[]) wbox = newwindow(); winname(wbox, mbox.name); - wintagwrite(wbox, "Put Mail Delmesg Save ", 3+1+4+1+7+1+4+1); + wintagwrite(wbox, "Put Mail Delmesg Save Next ", 3+1+4+1+7+1+4+1+4+1); threadcreate(mainctl, wbox, STACK); fmtstrinit(&fmt); @@ -317,6 +317,22 @@ delmesg(char *name, char *digest, int dodel) } } +void +modmesg(char *name, char *digest) +{ + Message *m; + char *flags; + + if((m = mesglookupfile(&mbox, name, digest)) == nil) + return; + if((flags = readfile(name, "/flags", nil)) == nil) + return; + free(m->flags); + m->flags = flags; + mesgmenureflag(mbox.w, m); +} + + extern int mesgsave(Message*, char*); void savemesg(char *box, char *name, char *digest) @@ -361,6 +377,8 @@ plumbthread(void) newmesg(m->data, digest); else if(strcmp(type, "delete") == 0) delmesg(m->data, digest, 0); + else if(strcmp(type, "modify") == 0) + modmesg(m->data, digest); else fprint(2, "Mail: unknown plumb attribute %s\n", type); plumbfree(m); @@ -513,6 +531,11 @@ mboxcommand(Window *w, char *s) free(targs); return 1; } + if(strcmp(args[0], "Next") == 0){ + ctlprint(w->ctl, "addr=dot\n"); + winselect(w, "/^[0-9]*\\/ \\[\\*.*(\\n(\t.*)*)/", 1); + ctlprint(w->ctl, "show\n"); + } return 0; } diff --git a/sys/src/cmd/upas/fs/dat.h b/sys/src/cmd/upas/fs/dat.h index 58128644e..3e3fb48bb 100644 --- a/sys/src/cmd/upas/fs/dat.h +++ b/sys/src/cmd/upas/fs/dat.h @@ -7,6 +7,7 @@ enum { Cheader = 1<<2, Cbody = 1<<3, Cnew = 1<<4, + Cmod = 1<<5, /* encodings */ Enone= 0, diff --git a/sys/src/cmd/upas/fs/imap.c b/sys/src/cmd/upas/fs/imap.c index 6f9a2a4d9..4b1226f12 100644 --- a/sys/src/cmd/upas/fs/imap.c +++ b/sys/src/cmd/upas/fs/imap.c @@ -35,7 +35,7 @@ typedef struct { uvlong uid; ulong sizes; ulong dates; - ulong flags; + uint flags; } Fetchi; typedef struct Imap Imap; @@ -1006,6 +1006,8 @@ again: m->deleted = Disappear; ll = &m->next; }else{ + if((m->flags & ~Frecent) != (f[i].flags & ~Frecent)) + m->cstate |= Cmod; m->flags = f[i].flags; ll = &m->next; i++; diff --git a/sys/src/cmd/upas/fs/mbox.c b/sys/src/cmd/upas/fs/mbox.c index c97bb8d9c..f7b56643e 100644 --- a/sys/src/cmd/upas/fs/mbox.c +++ b/sys/src/cmd/upas/fs/mbox.c @@ -58,9 +58,6 @@ static Mailboxinit *boxinit[] = { static void delmessage(Mailbox*, Message*); static void mailplumb(Mailbox*, Message*); -/* - * do we want to plumb flag changes? - */ char* syncmbox(Mailbox *mb, int doplumb) { @@ -90,16 +87,13 @@ syncmbox(Mailbox *mb, int doplumb) cachehash(mb, m); m->cstate |= Cnew; n++; - } else if(!doplumb) - m->cstate &= ~Cnew; - if(m->cstate & Cnew){ - if(ensurecache(mb, m) == 0){ - if(doplumb) - mailplumb(mb, m); - msgdecref(mb, m); - } - m->cstate &= ~Cnew; } + if((m->cstate & (Cnew|Cmod)) && ensurecache(mb, m) == 0){ + if(doplumb) + mailplumb(mb, m); + msgdecref(mb, m); + } + m->cstate &= ~(Cnew|Cmod); } if(m->cstate & Cidxstale) y++; @@ -1555,7 +1549,12 @@ mailplumb(Mailbox *mb, Message *m) a[ai-1].next = &a[ai]; a[++ai].name = "mailtype"; - a[ai].value = !m->inmbox ? "delete": "new"; + if(m->cstate & Cmod) + a[ai].value = "modify"; + else if (!m->inmbox) + a[ai].value = "delete"; + else + a[ai].value = "new"; a[ai-1].next = &a[ai]; snprint(date, sizeof date, "%Δ", m->fileid); |