From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eigenstate.org ([206.124.132.107]) by ewsd; Sun Dec 8 15:02:52 EST 2019 Received: from eigenstate.org (localhost [127.0.0.1]) by eigenstate.org (OpenSMTPD) with ESMTP id 83b0bc3c for <9front@9front.org>; Sun, 8 Dec 2019 12:02:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=eigenstate.org; h= message-id:to:subject:date:from:mime-version:content-type :content-transfer-encoding; s=mail; bh=QsrXsfsZmb6AH4jKH0BwYMMbD /w=; b=ZMak1I/6mcHxDC/sHTMqr+Thhblo0PRpUR2XfvmlmQY4PqE/DUvNzklcd YdxiWRSkLSdghodHOGarqcVqjekiO4DLSjDyLSCQJ/0kPat0XDrqjiWfF04om6L7 lXYfiKIVBA3TyNtubjdSYt7BXzcC0L2GLbcI6NG2ZcjPNU9OIY= DomainKey-Signature: a=rsa-sha1; c=nofws; d=eigenstate.org; h=message-id :to:subject:date:from:mime-version:content-type :content-transfer-encoding; q=dns; s=mail; b=fvbP1F5xjv+qp15i54p Fjet2CTk9i90SADRShDRtQlGoGMfPnOT6jJUioEc+ZQOjqCRdIsE14a296IihBek PgSEOx0AV0L8D74R9injaTvO/nYLF8UynwfMyNXR0+zeWwktQFMKlkwwfHxJnjSO C42rztjUXqZ0yTGOOFoUIqI8= Received: from abbatoir.hsd1.ca.comcast.net (c-76-21-119-139.hsd1.ca.comcast.net [76.21.119.139]) by eigenstate.org (OpenSMTPD) with ESMTPSA id b4dabfad (TLSv1.2:ECDHE-RSA-AES256-SHA:256:NO) for <9front@9front.org>; Sun, 8 Dec 2019 12:02:51 -0800 (PST) Message-ID: <27DBD03EAF07864ED33411518EE16A58@eigenstate.org> To: 9front@9front.org Subject: [patch] upas: plumb flag updates on messages. Date: Sun, 8 Dec 2019 12:02:44 -0800 From: ori@eigenstate.org MIME-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8bit List-ID: <9front.9front.org> List-Help: X-Glyph: ➈ X-Bullshit: progressive social GPU framework-aware plugin This patch makes 3 changes for the last bit of polish I wanted in my mail client: - 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. I've been using it for the last week with no issue, and honestly just forgot that it was there. diff -r 7f3f8606fc12 sys/src/cmd/faces/plumb.c --- a/sys/src/cmd/faces/plumb.c Sun Dec 08 11:58:52 2019 -0800 +++ b/sys/src/cmd/faces/plumb.c Sun Dec 08 11:59:39 2019 -0800 @@ -273,13 +273,18 @@ 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; idata, maildirs[i], strlen(maildirs[i])) == 0) + goto Found; + } + else fprint(2, "faces: unknown plumb message type %s\n", t); - else for(i=0; idata, maildirs[i], strlen(maildirs[i])) == 0) - goto Found; + Ignore: plumbfree(m); continue; diff -r 7f3f8606fc12 sys/src/cmd/upas/Mail/dat.h --- a/sys/src/cmd/upas/Mail/dat.h Sun Dec 08 11:58:52 2019 -0800 +++ b/sys/src/cmd/upas/Mail/dat.h Sun Dec 08 11:59:39 2019 -0800 @@ -124,6 +124,7 @@ 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 -r 7f3f8606fc12 sys/src/cmd/upas/Mail/mail.c --- a/sys/src/cmd/upas/Mail/mail.c Sun Dec 08 11:58:52 2019 -0800 +++ b/sys/src/cmd/upas/Mail/mail.c Sun Dec 08 11:59:39 2019 -0800 @@ -317,6 +317,22 @@ } } +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 @@ 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); diff -r 7f3f8606fc12 sys/src/cmd/upas/fs/dat.h --- a/sys/src/cmd/upas/fs/dat.h Sun Dec 08 11:58:52 2019 -0800 +++ b/sys/src/cmd/upas/fs/dat.h Sun Dec 08 11:59:39 2019 -0800 @@ -7,6 +7,7 @@ Cheader = 1<<2, Cbody = 1<<3, Cnew = 1<<4, + Cmod = 1<<5, /* encodings */ Enone= 0, diff -r 7f3f8606fc12 sys/src/cmd/upas/fs/fs.c --- a/sys/src/cmd/upas/fs/fs.c Sun Dec 08 11:58:52 2019 -0800 +++ b/sys/src/cmd/upas/fs/fs.c Sun Dec 08 11:59:39 2019 -0800 @@ -337,14 +337,15 @@ mboxfile = mbox; } - if(mboxfile != nil) - if(err = newmbox(mboxfile, "mbox", 0, nil)) - sysfatal("opening %s: %s", mboxfile, err); switch(rfork(RFFDG|RFPROC|RFNAMEG|RFNOTEG|RFREND)){ case -1: error("fork"); case 0: + print("child\n"); + if(mboxfile != nil) + if(err = newmbox(mboxfile, "mbox", 0, nil)) + sysfatal("opening %s: %s", mboxfile, err); henter(PATH(0, Qtop), dirtab[Qctl], (Qid){PATH(0, Qctl), 0, QTFILE}, nil, nil); close(p[1]); diff -r 7f3f8606fc12 sys/src/cmd/upas/fs/imap.c --- a/sys/src/cmd/upas/fs/imap.c Sun Dec 08 11:58:52 2019 -0800 +++ b/sys/src/cmd/upas/fs/imap.c Sun Dec 08 11:59:39 2019 -0800 @@ -35,7 +35,7 @@ uvlong uid; ulong sizes; ulong dates; - ulong flags; + uint flags; } Fetchi; typedef struct Imap Imap; @@ -1006,6 +1006,8 @@ 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 -r 7f3f8606fc12 sys/src/cmd/upas/fs/mbox.c --- a/sys/src/cmd/upas/fs/mbox.c Sun Dec 08 11:58:52 2019 -0800 +++ b/sys/src/cmd/upas/fs/mbox.c Sun Dec 08 11:59:39 2019 -0800 @@ -58,9 +58,6 @@ 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,14 @@ 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); + } + if(doplumb){ + if((m->cstate & Cnew) && ensurecache(mb, m) == 0) msgdecref(mb, m); - } - m->cstate &= ~Cnew; + if(m->cstate & (Cnew|Cmod)) + mailplumb(mb, m); } + m->cstate &= ~(Cnew|Cmod); } if(m->cstate & Cidxstale) y++; @@ -1555,7 +1550,12 @@ 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);