From: qwx@sciops.net
To: 9front@9front.org
Subject: Re: [9front] delete in page(1)
Date: Sun, 02 Jan 2022 02:20:39 +0200 [thread overview]
Message-ID: <243435E940FFD9CE8577463D11CC0708@wopr.sciops.net> (raw)
In-Reply-To: <FE1F6B539F8FCDC12C9C4F25BF2AE8C8@prosimetrum.com>
On Sat Jan 1 12:50:01 +0200 2022, umbraticus@prosimetrum.com wrote:
> Nice work, thanks! I like the isolation in the menu too.
>
> I found another nit :)
>
> Popping a doc eg. /sys/doc/troff.ps works fine
> if you are at the root window of the document
> (the grey one with name of the file in a box)
> and popping from within the doc doesn't work,
> which is fine if that's how you want it to behave
> but if I open the doc, try to pop from eg. page 3,
> then go back to the root and try to pop from
> there things hang...
>
> umbraticus
Thanks for testing! Just another locking fuckup,
a bit of a nightmare.
qwx
diff c4e30bede2f79c42dacb8c91713abf4a4d91c45c 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,32 @@
case Csnarf:
writeaddr(current, "/dev/snarf");
break;
+ case Cpop:
+ if(current == nil || !canqlock(current))
+ break;
+ if((p = poppage(current)) == current){
+ qunlock(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){
+ qunlock(current);
+ break;
+ }
+ goto Reset;
case Cnext:
forward = 1;
showpage(nextpage(current));
next prev parent reply other threads:[~2022-01-02 0:28 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-12-30 23:15 qwx
2021-12-31 0:48 ` umbraticus
2021-12-31 1:09 ` qwx
2021-12-31 1:22 ` qwx
2021-12-31 2:05 ` umbraticus
2021-12-31 19:10 ` qwx
2022-01-01 10:42 ` umbraticus
2022-01-02 0:20 ` qwx [this message]
2022-01-02 1:19 ` umbraticus
[not found] <E7A7795549A08A34B4881C447544CF63@wopr.sciops.net>
2022-01-21 8:10 ` umbraticus
2022-01-23 1:06 ` qwx
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=243435E940FFD9CE8577463D11CC0708@wopr.sciops.net \
--to=qwx@sciops.net \
--cc=9front@9front.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).