From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=0.2 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED autolearn=no autolearn_force=no version=3.4.4 Received: (qmail 7652 invoked from network); 31 Dec 2021 19:20:26 -0000 Received: from 4ess.inri.net (216.126.196.42) by inbox.vuxu.org with ESMTPUTF8; 31 Dec 2021 19:20:26 -0000 Received: from wopr.sciops.net ([216.126.196.60]) by 4ess; Fri Dec 31 14:07:09 -0500 2021 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sciops.net; s=20210706; t=1640977622; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to; bh=KUVwg7uYTkMdSyMfA9RrOT9Lh6Ji48KDl42eS8DGPFM=; b=wqk81wAg3xxqxPJCI6Xm4Gk8PbDd3h/0LCSOXarHZcYL/NyXtysG/Z0csZst/iNomaS2mc CtuM3Mm7ix9g9CKgDXAJ8BGJEfwqpzBJSKJcQBs+mbffZXxwN9AOGUasSk0IB4scTFvS67 gG46td+KYUqyO4GjJ3Sh88MaiSSJE/I= Received: by wopr.sciops.net (OpenSMTPD) with ESMTPSA id ba0eb888 (TLSv1.2:ECDHE-RSA-CHACHA20-POLY1305:256:NO) for <9front@9front.org>; Fri, 31 Dec 2021 11:07:02 -0800 (PST) Message-ID: <05E1EE387D50B7795E24DCDAA0C33033@wopr.sciops.net> Date: Fri, 31 Dec 2021 21:10:13 +0200 From: qwx@sciops.net To: 9front@9front.org In-Reply-To: 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: abstract metadata factory singleton Subject: Re: [9front] delete in page(1) Reply-To: 9front@9front.org Precedence: bulk On Fri Dec 31 04:16:49 +0200 2021, umbraticus@prosimetrum.com wrote: > hmm, still messes up. what I am doing: > 1. plumb 1.jpg, opens in new page > 2. press d > 3. plumb 2.jpg → shows image > > can continue to plumb new images but b3menu doesn't open > and prev/next doesn't work. > > Also, maybe at least have the key be D instead of d to prevent mistakes... > > umbraticus Here's a patched patch fixing this and another issue; it also has the delete command on the `D' key as suggested and has a separate `pop' command on the `p' key to only remove an entry from the list, without deleting the file. Thoughts? Thanks, qwx diff 855cf4326f5a07d7142c2d8918f5fa856d912b85 uncommitted --- a/sys/src/cmd/page.c +++ b/sys/src/cmd/page.c @@ -74,7 +74,10 @@ Czerox, Cwrite, Cext, + Cpop, Cdummy2, + Cdelete, + Cdummy3, Cquit, }; @@ -98,7 +101,10 @@ [Czerox] "zerox", 'z', 0, 0, [Cwrite] "write", 'w', 0, 0, [Cext] "ext", 'x', 0, 0, + [Cpop] "pop", 'p', 0, 0, [Cdummy2] "", 0, 0, 0, + [Cdelete] "delete", 'D', 0, 0, + [Cdummy3] "", 0, 0, 0, [Cquit] "quit", 'q', Kdel, Keof, }; @@ -134,6 +140,7 @@ void showpage(Page *); void drawpage(Page *); Point pagesize(Page *); +void drawlock(int); Page* addpage(Page *up, char *name, int (*popen)(Page *), void *pdata, int fd) @@ -986,6 +993,71 @@ } } +/* page entries are never freed, there's no point + * and would break everything */ +Page* +poppage(Page *p) +{ + Page *t, *q; + + if(p == nil) + return nil; + if(p->up != root) + return p; + qlock(&pagelock); + for(t = p->down; t != nil && t->up != root; t = q){ + qlock(t); + drawlock(0); + unloadpage(t); + drawlock(1); + free(t->name); + free(t->data); + t->name = t->data = nil; + q = nextpage(t); + qunlock(t); + } + drawlock(0); + unloadpage(p); + drawlock(1); + free(p->name); + free(p->data); + p->name = p->data = nil; + t = prevpage(p); + if(root->tail == p) + root->tail = t; + if(root->down == p || t == nil) + root->down = p->next; + else + t->next = p->next; + qunlock(&pagelock); + qunlock(p); + if(p->next != nil){ + forward = 1; + return p->next; + } + forward = -1; + return t; +} + +Page* +delpage(Page *p) +{ + if(p == nil) + return nil; + /* to remove(2) subpages in documents makes no sense, and just + * removing a subentry doesn't seem like a feature worth the bother */ + if(p->up != root) + return p; + if(p->fd >= 0) + close(p->fd); + p->fd = -1; + if(remove(p->name) < 0){ + fprint(2, "remove %s: %r", p->name); + return p; + } + return poppage(p); +} + /* * A draw operation that touches only the area contained in bot but not in top. * mp and sp get aligned with bot.min. @@ -1461,6 +1533,7 @@ char buf[NPATH], *s; Point o; int fd; + Page *p; switch(i){ case Corigsize: @@ -1546,6 +1619,28 @@ case Csnarf: writeaddr(current, "/dev/snarf"); break; + case Cpop: + if(current == nil || !canqlock(current)) + break; + if((p = poppage(current)) == current) + break; + Reset: + current = p; + if(current == nil){ + drawlock(0); + draw(screen, screen->r, paper, nil, ZP); + drawframe(screen->r); + drawlock(1); + break; + } + showpage(current); + break; + case Cdelete: + if(current == nil || !canqlock(current)) + break; + if((p = delpage(current)) == current) + break; + goto Reset; case Cnext: forward = 1; showpage(nextpage(current));