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, T_SCC_BODY_TEXT_LINE autolearn=no autolearn_force=no version=3.4.4 Received: (qmail 601 invoked from network); 24 Aug 2022 01:42:39 -0000 Received: from 9front.inri.net (168.235.81.73) by inbox.vuxu.org with ESMTPUTF8; 24 Aug 2022 01:42:39 -0000 Received: from mail.posixcafe.org ([45.76.19.58]) by 9front; Tue Aug 23 21:41:00 -0400 2022 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=posixcafe.org; s=20200506; t=1661305256; 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; bh=RR6TJ/SULNFE85H1GdBo/kxGimfRqwtEX5fXXNDfQ5k=; b=hPgClHem1XIiKnvlR8cCbygNT+O6BJaUFQ4OFeQuJs5b0t2q/5waG8+SkDDohus+TkR4Mf ccYAg7zfo9xZfJny0vsQq8LqYZ/sCiwb3P3rO/4z5cmVej2k5Fw+y5O/8K5b3kVAvjukqK 29TVUa/4Gkvfjii0Eb1aERe61JyrZng= Received: from [192.168.168.200] (161-97-228-135.mynextlight.net [161.97.228.135]) by mail.posixcafe.org (OpenSMTPD) with ESMTPSA id 139b50db (TLSv1.3:TLS_AES_256_GCM_SHA384:256:NO) for <9front@9front.org>; Tue, 23 Aug 2022 20:40:55 -0500 (CDT) Message-ID: <6b1146ca-e2de-88eb-d331-e1c978baf266@posixcafe.org> Date: Tue, 23 Aug 2022 19:40:54 -0600 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.10.0 Content-Language: en-US To: 9front@9front.org From: Jacob Moody Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit List-ID: <9front.9front.org> List-Help: X-Glyph: ➈ X-Bullshit: decentralized distributed HTML base hardware-aware frontend Subject: [9front] [PATCH] programmable menus for rio Reply-To: 9front@9front.org Precedence: bulk Something I've been playing with is a way of exposing part of the rio menu to the programs running within it. This is a bit of a simple approach, but I would like to gauge interest that people have in something along these lines before continuing. This adds a /dev/menu file that can be written to to add new entries to the button3menu. The file can be read to get the text string of an added menu entry when hit by the user. Thanks, moody diff 8dcf65f21e079f471eef6d3b3d0360c7beac4cd6 uncommitted --- a/sys/src/cmd/rio/dat.h +++ b/sys/src/cmd/rio/dat.h @@ -19,6 +19,7 @@ Qwsys, /* directory of window directories */ Qwsysdir, /* window directory, child of wsys */ Qtap, + Qmenu, QMAX, }; @@ -326,6 +327,8 @@ Channel *totap; /* our keyboard input to tap program */ Channel *wintap; /* tell the tapthread which Window to send to */ Window *input; +Channel *usermenu; +Channel *userhit; QLock all; /* BUG */ Filsys *filsys; Window *hidden[100]; --- a/sys/src/cmd/rio/fsys.c +++ b/sys/src/cmd/rio/fsys.c @@ -38,6 +38,7 @@ { "window", QTFILE, Qwindow, 0400 }, { "wsys", QTDIR, Qwsys, 0500|DMDIR }, { "kbdtap", QTFILE, Qtap, 0660 }, + { "menu", QTFILE, Qmenu, 0660 }, { nil, } }; --- a/sys/src/cmd/rio/rio.c +++ b/sys/src/cmd/rio/rio.c @@ -53,6 +53,7 @@ Delete, Hide, Exit, + Hidden, }; enum @@ -82,8 +83,6 @@ menu2str }; -int Hidden = Exit+1; - char *menu3str[100] = { [New] "New", [Reshape] "Resize", @@ -94,6 +93,9 @@ nil }; +char *userentry[64] = { nil }; +int nusermenu = 0; + Menu menu3 = { menu3str @@ -193,6 +195,8 @@ if(mousectl == nil) error("can't find mouse"); mouse = mousectl; + usermenu = chancreate(sizeof(char*), 0); + userhit = chancreate(sizeof(char*), 0); kbdchan = initkbd(); if(kbdchan == nil) error("can't find keyboard"); @@ -528,7 +532,9 @@ mousethread(void*) { int sending, inside, scrolling, moving; + int j; Window *w, *winput; + char *s; Image *i; Point xy; Mouse tmp; @@ -535,6 +541,7 @@ enum { MReshape, MMouse, + MUser, NALT }; static Alt alts[NALT+1]; @@ -549,10 +556,24 @@ alts[MMouse].c = mousectl->c; alts[MMouse].v = &mousectl->Mouse; alts[MMouse].op = CHANRCV; + alts[MUser].c = usermenu; + alts[MUser].v = &s; + alts[MUser].op = CHANRCV; alts[NALT].op = CHANEND; for(;;) switch(alt(alts)){ + case MUser: + if(strncmp("add ", s, 4) == 0){ + if(s+4 != '\0') + userentry[nusermenu++] = strdup(s+4); + }else if(strncmp("reset", s, 5) == 0){ + for(j=0; j < nusermenu; j++) + free(userentry[j]); + nusermenu=0; + } + free(s); + break; case MReshape: resized(); break; @@ -771,7 +792,8 @@ void button3menu(void) { - int i, j, n; + int i, j, n, u; + char *s; n = nhidden; for(i=0; i= nelem(menu3str)-Hidden) + for(u=0; u < nusermenu; u++){ + free(menu3str[u+Hidden]); + menu3str[u+Hidden] = strdup(userentry[u]); + } + if(n >= nelem(menu3str)-(Hidden+u)) n = nelem(menu3str)-Hidden-1; - for(i=0; ilabel); + menu3str[i+Hidden] = shortlabel(hidden[i-u]->label); } for(i+=Hidden; menu3str[i]; i++){ free(menu3str[i]); @@ -818,7 +844,13 @@ confirmexit(); break; default: - unhide(i); + i -= Hidden; + if(i < u){ + s = strdup(menu3str[i+Hidden]); + if(nbsendp(userhit, s) != 1) + free(s); + } else + unhide(i-u); break; } sweeping = FALSE; @@ -1202,9 +1234,6 @@ { Window *w; - if(j < Hidden) - return; - j -= Hidden; w = hidden[j]; if(w == nil) return; --- a/sys/src/cmd/rio/xfid.c +++ b/sys/src/cmd/rio/xfid.c @@ -585,6 +585,15 @@ } break; + case Qmenu: + if(x->data[cnt-1] == '\n'){ + if(cnt == 1) + break; + x->data[cnt-1] = '\0'; + } + chanprint(usermenu, "%.*s", cnt, x->data); + break; + default: fprint(2, "unknown qid %d in write\n", qid); filsysrespond(x->fs, x, &fc, "unknown qid in write"); @@ -864,6 +873,34 @@ } free(t); return; + + case Qmenu: + alts[Adata].c = userhit; + alts[Adata].v = &t; + alts[Adata].op = CHANRCV; + alts[Agone].c = w->gone; + alts[Agone].v = nil; + alts[Agone].op = CHANRCV; + alts[Aflush].c = x->flushc; + alts[Aflush].v = nil; + alts[Aflush].op = CHANRCV; + alts[Aend].op = CHANEND; + + switch(alt(alts)){ + case Adata: + break; + case Agone: + filsysrespond(x->fs, x, &fc, Edeleted); + return; + case Aflush: + filsyscancel(x); + return; + } + fc.data = t; + fc.count = strlen(t); + filsysrespond(x->fs, x, &fc, nil); + free(t); + break; default: fprint(2, "unknown qid %d in read\n", qid);