From 603e8ca2e2b4df967ce8d251a7718485f971d353 Mon Sep 17 00:00:00 2001 From: "John Ankarstr\\xf6m" Date: Tue, 1 Jun 2021 16:20:24 +0200 Subject: Use Motif instead of Athena --- xbattext.c | 120 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 xbattext.c (limited to 'xbattext.c') diff --git a/xbattext.c b/xbattext.c new file mode 100644 index 0000000..5e59ce1 --- /dev/null +++ b/xbattext.c @@ -0,0 +1,120 @@ +/* + * This is a simple X11 program that displays the battery percentage + * on NetBSD. + * + * It should be compiled with the following flags: + * + * CFLAGS = -I/usr/X11R7/include -I/usr/pkg/include + * LDFLAGS = -lXm -L/usr/X11R7/lib -L/usr/pkg/lib + * LDFLAGS += -Wl,-R/usr/X11R7/lib -Wl,-R/usr/pkg/lib + * + * It requires x11/motif to be installed. + * The fontList resource controls the font used. + * + * xbattext is written by John Ankarstr\xf6m and + * is released into the public domain; do whatever you want with it. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* interval in seconds */ +#define INTERVAL 30 + +/* low battery level */ +#define ALERT 30 + +void update(XtPointer, XtIntervalId *); + +/* application state */ +Arg wargs[10]; +char *s; +int apmfd, alert; +struct apm_power_info info; +Widget toplevel, label; +XmString str; +XtAppContext app_context; +XtIntervalId timer = 0; + +int +main(int argc, char* argv[]) +{ + toplevel = XtVaAppInitialize( + &app_context, + "XBat", + NULL, 0, + &argc, argv, + NULL, + NULL); + + if ((apmfd = open("/dev/apm", O_RDONLY, 0755)) == -1) + err(1, "open"); + + if ((s = malloc(5*sizeof(char))) == NULL) + err(1, "malloc"); + + XtSetLanguageProc(NULL, NULL, NULL); + + /* create motif label */ + label = XtVaCreateManagedWidget("text", + xmLabelWidgetClass, toplevel, + XmNlabel, "", + NULL); + alert = 0; + + update(NULL, &timer); + XtRealizeWidget(toplevel); + XtAppMainLoop(app_context); +} + +/* update battery status and (re-)add timer */ +void +update(XtPointer client_data, XtIntervalId *t) +{ + /* remove current timer */ + if (t == NULL && timer) { + XtRemoveTimeOut(timer); + timer = 0; + } + + /* get battery info */ + memset(&info, 0, sizeof(info)); + if (ioctl(apmfd, APM_IOC_GETPOWER, &info) == -1) { + fprintf(stderr, "ioctl APM_IOC_GETPOWER failed\n"); + sprintf(s, "?"); + goto end; + } + + /* put battery status into label */ + sprintf(s, "%d%%", info.battery_life); + str = XmStringCreate(s, XmFONTLIST_DEFAULT_TAG); + XtSetArg(wargs[0], XmNlabelString, str); + XtSetValues(label, wargs, 1); + XmStringFree(str); + + /* change color if low battery */ +#ifdef ALERT + if (!alert && info.battery_life < ALERT) { + XtVaSetValues(label, + XtVaTypedArg, XmNforeground, XmRString, "red", 4); + alert = 1; + } else if (alert && info.battery_life >= ALERT) { + XtVaSetValues(label, + XtVaTypedArg, XmNforeground, XmRString, "black", 4); + alert = 0; + } +#endif + + /* add new timer */ +end: timer = XtAppAddTimeOut(app_context, INTERVAL * 1000, update, toplevel); +} -- cgit v1.2.3