X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;f=cprogs%2Fxacpi-simple.c;h=73bea7f508973b40338751e7888ec435db4a095e;hb=2c56327e902fac7d700897e5e8bcc7d6d5e78411;hp=70949b91506c3d39061c62645eb0d4de4477e2dd;hpb=2e8778a4f845d16f601f2754de11c71ef570d33a;p=chiark-utils.git diff --git a/cprogs/xacpi-simple.c b/cprogs/xacpi-simple.c index 70949b9..73bea7f 100644 --- a/cprogs/xacpi-simple.c +++ b/cprogs/xacpi-simple.c @@ -62,7 +62,7 @@ #define TIMEOUT_ONERROR 3333 /* milliseconds */ static const char program_name[]= "xacpi-simple"; -static int debug, alarmlevel; +static int debug=-1, alarmlevel; /*---------- general utility stuff and declarations ----------*/ @@ -357,7 +357,7 @@ static double total_##f; ALL_ACCUMULATE_FIELDS(Q_VAR) static void acquiredata(void) { - DIR *di; + DIR *di = 0; struct dirent *de; int r; @@ -427,7 +427,7 @@ ALL_PLAIN_ACCUMULATE_FIELDS(Q_ACCUMULATE_PLAIN) } - closedir(di); + if (di) closedir(di); if (debug) { printf("TOTAL:\n"); @@ -485,6 +485,7 @@ static void initacquire(void) { static XrmDatabase xrm; static Display *disp; static int screen; +static const char *parentwindow; static const char defaultresources[]= #define GC(g) @@ -501,6 +502,9 @@ static const XrmOptionDescRec optiontable[]= { { S("-warningTime"), S("*warningTime"), XrmoptionSepArg }, { S("-display"), S("*display"), XrmoptionSepArg }, { S("-geometry"), S("*geometry"), XrmoptionSepArg }, + { S("-into"), S("*parentWindow"), XrmoptionSepArg }, + { S("-icon"), S("*icon"), XrmoptionIsArg }, + { S("-withdrawn"), S("*withdrawn"), XrmoptionIsArg }, #define GC(g) #define C(c,u) \ { S("-" #u "Color"), S("*" #u "Color"), XrmoptionSepArg }, \ @@ -526,6 +530,28 @@ static const char *getresource(const char *want) { return val.addr; } +static int getresource_bool(const char *want, int def, int *cache) { + /* *cache should be initialised to -1 and will be set to !!value */ + + if (*cache >= 0) return *cache; + const char *str= getresource(want); + int result = def; + if (str && str[0]) { + char *ep; + long l= strtol(str,&ep,0); + if (!*ep) { + result = l > 0; + } else { + switch (str[0]) { + case 't': case 'T': case 'y': case 'Y': result= 1; break; + case 'f': case 'F': case 'n': case 'N': result= 0; break; + case '-': /* option name from XrmoptionIsArg */ result= 1; break; + } + } + } + return *cache= result; +} + static void more_resources(const char *str, const char *why) { XrmDatabase more; @@ -547,11 +573,13 @@ static void parseargs(int argc, char **argv) { if (argc>1) badusage(); - debug= !!getresource("debug"); + getresource_bool("debug",0,&debug); const char *alarmlevel_string= getresource("alarmLevel"); alarmlevel = alarmlevel_string ? atoi(alarmlevel_string) : 300; + parentwindow = getresource("parentWindow"); + disp= XOpenDisplay(getresource("display")); if (!disp) fail("could not open display"); @@ -720,7 +748,13 @@ static void initgraphics(int argc, char **argv) { &width, &height, &gravity); - win= XCreateSimpleWindow(disp,DefaultRootWindow(disp), + unsigned long parentwindowid; + if (parentwindow) + parentwindowid = strtoul(parentwindow,0,0); + else + parentwindowid = DefaultRootWindow(disp); + + win= XCreateSimpleWindow(disp,parentwindowid, pos_x,pos_y,width,height,0,0,0); cmap= DefaultColormap(disp,screen); @@ -745,6 +779,9 @@ static void initgraphics(int argc, char **argv) { wm_hints->flags= InputHint; wm_hints->input= False; + wm_hints->initial_state= (getresource("withdrawn") ? WithdrawnState : + getresource("icon") ? IconicState + : NormalState); class_hint->res_name= program_name_silly; class_hint->res_class= program_name_silly;