From 5a90c6adca1327783c29d7fa093d6205fed426f2 Mon Sep 17 00:00:00 2001 From: qwx Date: Wed, 22 Jan 2025 02:29:51 +0000 Subject: [PATCH] add headless mode --- draw/draw.c | 25 +++++++++++++++++++++++++ draw/drw.h | 3 +++ plan9/draw.c | 4 +++- sokol/draw.c | 4 +++- strpg.c | 20 +++++++++++++------- ui/ui.c | 2 ++ 6 files changed, 49 insertions(+), 9 deletions(-) diff --git a/draw/draw.c b/draw/draw.c index 5a80aa1..c317559 100644 --- a/draw/draw.c +++ b/draw/draw.c @@ -4,12 +4,14 @@ #include "drw.h" #include "ui.h" #include "threads.h" +#include "cmd.h" View view; RNode *rnodes; REdge *redges; ssize ndnodes, ndedges; Drawing drawing; +extern Channel *drawc; static inline void drawedge(REdge *r, RNode *u, RNode *v, int urev, int vrev) @@ -201,6 +203,29 @@ redraw(int go) return go; } +static void +ticker(void *) +{ + for(;;){ + sleep(10); + sendul(drawc, Reqrefresh); + } +} + +void +noloop(void) +{ + ulong u; + + newthread(ticker, nil, nil, nil, "ticker", mainstacksize); + while((u = recvul(drawc)) > 0){ + switch(u){ + case Reqredraw: + case Reqrefresh: pushcmd("exportlayout(\"%s\")", drawing.layfile); flushcmd(); break; + } + } +} + /* note: view screen dimensions are *not* necessarily set by the * end of all initialization */ void diff --git a/draw/drw.h b/draw/drw.h index 061ccc5..0246336 100644 --- a/draw/drw.h +++ b/draw/drw.h @@ -28,6 +28,7 @@ enum{ DFstalelen = 1<<4, DFmsaa = 1<<5, DFhidpi = 1<<6, + DFnope = 1<<7, }; struct Drawing{ int flags; @@ -37,6 +38,7 @@ struct Drawing{ Range zbound; float nodesz; float fatness; + char *layfile; }; extern Drawing drawing; @@ -162,5 +164,6 @@ void setnodeshape(int); void updatedraw(void); void reqdraw(int); void initcol(void); +void noloop(void); void initsysdraw(void); void initdrw(void); diff --git a/plan9/draw.c b/plan9/draw.c index 9951012..8c4f68f 100644 --- a/plan9/draw.c +++ b/plan9/draw.c @@ -4,6 +4,8 @@ #include "threads.h" #include +Channel *drawc; + struct Color{ u32int col; Image *i; @@ -13,7 +15,7 @@ struct Color{ static Point panmax, ΔZP; static Rectangle viewr, statr; static Image *viewfb, *selfb; -static Channel *drawc, *ticc, *framec; +static Channel *ticc, *framec; static QLock ticker; static ioff selected; /* FIXME */ diff --git a/sokol/draw.c b/sokol/draw.c index 2f36c52..ddf1af5 100644 --- a/sokol/draw.c +++ b/sokol/draw.c @@ -40,7 +40,7 @@ void event(const sapp_event*); typedef struct GLNode GLNode; typedef struct GLEdge GLEdge; -static Channel *drawc; +Channel *drawc; static int reqs; void @@ -367,6 +367,8 @@ initsysdraw(void) void evloop(void) { + ulong u; + /* wait until at least one file asks for a redraw */ while(recvul(drawc) != Reqredraw) ; diff --git a/strpg.c b/strpg.c index d83174b..fdc27e6 100644 --- a/strpg.c +++ b/strpg.c @@ -63,13 +63,14 @@ pushfile(char *file, int type) static void help(void) { - warn("usage: %s [-HMWZbhvw] [-f FILE] [-l ALG] [-t N] [-c FILE] FILE\n", argv0); + warn("usage: %s [-HMWZbhvw] [-f FILE] [-l ALG] [-n FILE] [-t N] [-c FILE] FILE\n", argv0); warn( "-b White-on-black color theme\n" "-c FILE Load tags from csv FILE\n" "-f FILE Load layout from FILE\n" "-h Print usage information and exit\n" "-l ALG Set layouting algorithm (default: pfr)\n" + "-n FILE Run layouting headless, saving to FILE periodically\n" "-t N Set number of layouting threads (1-128, default: 4)\n" "-v Print version and exit\n" "-w Do not wait for all files to load to start layouting\n" @@ -88,7 +89,7 @@ help(void) static void usage(void) { - sysfatal("usage: %s [-HMWZbhvw] [-f FILE] [-l ALG] [-t N] [-c FILE] FILE", argv0); + sysfatal("usage: %s [-HMWZbhvw] [-f FILE] [-l ALG] [-n FILE] [-t N] [-c FILE] FILE", argv0); } static void @@ -157,6 +158,10 @@ parseargs(int argc, char **argv) else sysfatal("unknown layout type"); break; + case 'n': + drawing.layfile = EARGF(usage()); + drawing.flags |= DFnope; + break; case 't': nlaythreads = atoi(EARGF(usage())); if(nlaythreads <= 0 || nlaythreads > 128){ @@ -194,11 +199,12 @@ main(int argc, char **argv) init(); initlayout(); load(); - initui(); - if(debug & Debugload) - for(;;) - sleep(1000); - evloop(); + if(drawing.flags & DFnope || debug & Debugload) + noloop(); + else{ + initui(); + evloop(); + } quit(); return 0; } diff --git a/ui/ui.c b/ui/ui.c index c0d6051..ee1ccd7 100644 --- a/ui/ui.c +++ b/ui/ui.c @@ -436,6 +436,8 @@ resetui(void) void initui(void) { + if(drawing.flags & DFnope) + return; initsysui(); view.fov = 45.0f; view.tfov = tanf(view.fov / 2);