wmbattery: Import wmbattery-2.54 as wip/wmbattery

wmbattery is a dockapp that displays the status of your laptop's
battery in a small icon. This includes if it is plugged in, if the
battery is charging, how many minutes of battery life remain, battery
life remaining (with both a percentage and a graph), and battery
status (high - green, low - yellow, or critical - red).
This commit is contained in:
flurry 2020-09-01 20:14:56 -07:00
parent 6a8282513f
commit e2d9d11799
12 changed files with 395 additions and 0 deletions

View File

@ -4991,6 +4991,7 @@ SUBDIR+= wl-git
SUBDIR+= wla-dx
SUBDIR+= wla-dx-git
SUBDIR+= wlroots
SUBDIR+= wmbattery
SUBDIR+= wmc2d
SUBDIR+= wmii-devel
SUBDIR+= wmname

5
wmbattery/DESCR Normal file
View File

@ -0,0 +1,5 @@
wmbattery is a dockapp that displays the status of your laptop's
battery in a small icon. This includes if it is plugged in, if the
battery is charging, how many minutes of battery life remain, battery
life remaining (with both a percentage and a graph), and battery
status (high - green, low - yellow, or critical - red).

29
wmbattery/Makefile Normal file
View File

@ -0,0 +1,29 @@
# $NetBSD$
DISTNAME= wmbattery-2.54
CATEGORIES= x11
MASTER_SITES= https://www.dockapps.net/download/
MAINTAINER= pkgsrc-users@NetBSD.org
HOMEPAGE= https://www.dockapps.net/
COMMENT= Dockapp that shows battery status
LICENSE= gnu-gpl-v2
PATCHDIR= ${.CURDIR}/../../wip/wmbattery/patches
FILESDIR= ${.CURDIR}/../../wip/wmbattery/files
.include "options.mk"
GNU_CONFIGURE= yes
USE_TOOLS+= autoreconf autoconf automake gmake pkg-config
pre-configure:
${CP} \
${FILESDIR}/envsys.c \
${FILESDIR}/envsys.h \
${WRKSRC}
cd ${WRKSRC} && autoreconf -fi
.include "../../x11/libX11/buildlink3.mk"
.include "../../mk/bsd.pkg.mk"

17
wmbattery/PLIST Normal file
View File

@ -0,0 +1,17 @@
@comment $NetBSD$
bin/wmbattery
man/man1/wmbattery.1
share/icons/wmbattery/battery_blink.xpm
share/icons/wmbattery/battery_high.xpm
share/icons/wmbattery/battery_low.xpm
share/icons/wmbattery/battery_medium.xpm
share/icons/wmbattery/battery_none.xpm
share/icons/wmbattery/bigfont.xpm
share/icons/wmbattery/charging.xpm
share/icons/wmbattery/dial_bright.xpm
share/icons/wmbattery/dial_dim.xpm
share/icons/wmbattery/face.xpm
share/icons/wmbattery/nocharging.xpm
share/icons/wmbattery/plugged.xpm
share/icons/wmbattery/smallfont.xpm
share/icons/wmbattery/unplugged.xpm

3
wmbattery/TODO Normal file
View File

@ -0,0 +1,3 @@
- Find out if there are other battery types than acpibat* and add
support for those if so
- Check acpiacad* for whether the AC adapter is plugged in

9
wmbattery/distinfo Normal file
View File

@ -0,0 +1,9 @@
$NetBSD$
SHA1 (wmbattery-2.54.tar.gz) = 549b0eec16880f9b71b60faed6326d1a9a76af54
RMD160 (wmbattery-2.54.tar.gz) = ef709353135de51a74599f9e86967b261df1caeb
SHA512 (wmbattery-2.54.tar.gz) = 58c901ed85d3ea7e0c750bb968c3250706ed693162fe4684d75683a3897df7ff02ee4afbe12a5d26b1f1b632d4c6f9902713a632e6784173ea49bad312fd30aa
Size (wmbattery-2.54.tar.gz) = 87925 bytes
SHA1 (patch-Makefile.in) = 1445d031dd10b92e183337b4dc232e808f0e5e18
SHA1 (patch-configure.ac) = e7f0d0d7c9a168423fb29ab853e58877e50b19aa
SHA1 (patch-wmbattery.c) = 8a525090ec3cdc02090c50ead240dd839a1d08ea

181
wmbattery/files/envsys.c Normal file
View File

@ -0,0 +1,181 @@
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <prop/proplib.h>
#include <sys/envsys.h>
#include "apm.h"
#include "envsys.h"
#define _DEV_SYSMON "/dev/sysmon"
#define ACPIBAT_FMT "acpibat%d"
int
envsys_supported (void)
{
return 1; /* XXX */
}
prop_array_t
get_battery (char * battery_name)
{
prop_dictionary_t sys_dict;
prop_array_t bat_arr;
int smfd;
if (battery_name == NULL)
return NULL;
smfd = open (_DEV_SYSMON, O_RDONLY);
if (smfd == -1)
return NULL;
if (prop_dictionary_recv_ioctl (smfd,
ENVSYS_GETDICTIONARY,
&sys_dict) != 0)
{
return NULL;
}
close (smfd);
bat_arr = prop_dictionary_get (sys_dict, battery_name);
if (bat_arr == NULL)
return NULL;
prop_object_retain (bat_arr);
prop_object_release (sys_dict);
return bat_arr;
}
bool
stat_is_valid (prop_dictionary_t stat)
{
prop_string_t strval;
if (stat == NULL)
return false;
strval = prop_dictionary_get (stat, "state");
if (strval == NULL)
return false;
return prop_string_equals_cstring (strval, "valid");
}
int64_t
handle_stat (prop_dictionary_t stat,
char * key)
{
prop_number_t numval;
if (stat == NULL || key == NULL)
return -1;
numval = (prop_number_t) prop_dictionary_get (stat, key);
if (numval == NULL)
return -1;
return prop_number_integer_value (numval);
}
int
envsys_read (int battery,
apm_info *info)
{
prop_object_iterator_t iter;
prop_dictionary_t id;
prop_string_t desc;
prop_array_t bat_info;
bool is_present = false;
int64_t charge_rate = 0,
max_charge = 0,
cur_charge = 0,
warn_charge = 0,
crit_charge = 0;
char bat_name[] = ACPIBAT_FMT;
int bat_id = battery - 1;
if (info == NULL || (battery - 1 < 0))
return -1;
info->battery_flags = 0;
info->using_minutes = 1;
snprintf (bat_name, strlen (ACPIBAT_FMT), ACPIBAT_FMT, bat_id);
bat_info = get_battery (bat_name);
if (bat_info == NULL)
return -1;
iter = prop_array_iterator (bat_info);
while ((id = (prop_dictionary_t) prop_object_iterator_next (iter)) != NULL)
{
desc = (prop_string_t) prop_dictionary_get (id, "description");
if (desc == NULL) continue;
if (prop_string_equals_cstring (desc, "charging"))
{
/* 1 is AC_LINE_STATUS_ON, 0 is AC_LINE_STATUS_OFF */
info->ac_line_status = handle_stat (id, "cur-value");
} else if (prop_string_equals_cstring (desc, "charge")) {
cur_charge = handle_stat (id, "cur-value");
max_charge = handle_stat (id, "max-value");
warn_charge = handle_stat (id, "warning-capacity");
crit_charge = handle_stat (id, "critical-capacity");
} else if (prop_string_equals_cstring (desc, "charge rate")) {
if (stat_is_valid (id)) charge_rate = handle_stat (id, "cur-value");
} else if (prop_string_equals_cstring (desc, "discharge rate")) {
if (stat_is_valid (id)) charge_rate = handle_stat (id, "cur-value");
} else if (prop_string_equals_cstring (desc, "present")) {
is_present = (handle_stat (id, "cur-value") == 1);
}
}
prop_object_iterator_release (iter);
prop_object_release (bat_info);
if (max_charge > 1) {
info->battery_percentage = ( cur_charge * 100 ) / max_charge;
if (info->battery_percentage > 100) info->battery_percentage = 100;
} else {
info->battery_percentage = BATTERY_PERCENTAGE_UNKNOWN;
}
if (info->ac_line_status) {
info->battery_status = BATTERY_STATUS_CHARGING;
/*
* If our charge rate is 0, then it was either marked invalid by envsys
* or we're "charging" at 0Wh-- either way, the battery isn't charging
*/
if (charge_rate > 0) {
info->battery_flags = info->battery_flags | BATTERY_FLAGS_CHARGING;
}
} else {
if (cur_charge < crit_charge) {
info->battery_status = BATTERY_STATUS_CRITICAL;
} else if (cur_charge < warn_charge) {
info->battery_status = BATTERY_STATUS_LOW;
} else {
info->battery_status = BATTERY_STATUS_HIGH;
}
}
if (!is_present) {
info->battery_percentage = 0;
info->battery_time = 0;
info->battery_status = BATTERY_STATUS_ABSENT;
}
/* calculate time remaining */
if (charge_rate == 0) {
info->battery_time = BATTERY_TIME_UNKNOWN;
} else {
info->battery_time = ( (max_charge - cur_charge) * 60) / charge_rate;
}
return 0;
}

2
wmbattery/files/envsys.h Normal file
View File

@ -0,0 +1,2 @@
int envsys_supported(void);
int envsys_read(int battery, apm_info *info);

32
wmbattery/options.mk Normal file
View File

@ -0,0 +1,32 @@
# $NetBSD$
PKG_OPTIONS_VAR= PKG_OPTIONS.wmbattery
PKG_SUPPORTED_OPTIONS= hal upower
.include "../../mk/bsd.prefs.mk"
.if ${OPSYS} == "NetBSD"
CONFIGURE_ARGS+= --enable-envsys
.endif
.include "../../mk/bsd.options.mk"
#
# hal support
#
.if !empty(PKG_OPTIONS:Mhal)
CONFIGURE_ARGS+= --enable-hal
.include "../../sysutils/hal/buildlink3.mk"
.else
CONFIGURE_ARGS+= --disable-hal
.endif
#
# upower support
#
.if !empty(PKG_OPTIONS:Mupower)
CONFIGURE_ARGS+= --enable-upower
.include "../../sysutils/hal/buildlink3.mk"
.else
CONFIGURE_ARGS+= --disable-upower
.endif

View File

@ -0,0 +1,29 @@
$NetBSD$
Adds checks for USE_ENVSYS provided by configure.ac.
--- Makefile.in.orig 2020-09-01 05:47:00.995267854 +0000
+++ Makefile.in
@@ -21,6 +21,7 @@ LDFLAGS = @LDFLAGS@
LIBS = @LIBS@ @Xlib_LIBS@ @Xext_LIBS@ @libXpm_LIBS@
USE_HAL = @USE_HAL@
USE_UPOWER = @USE_UPOWER@
+USE_ENVSYS = @USE_ENVSYS@
all: wmbattery
@@ -80,6 +81,14 @@ upower.o: upower.c
$(CC) $(CPPFLAGS) $(CFLAGS) -c upower.c -o upower.o
endif
+ifdef USE_ENVSYS
+CPPFLAGS += -DENVSYS
+LIBS += -lprop
+OBJS += envsys.o
+envsys.o: envsys.c
+ $(CC) $(CPPFLAGS) $(CFLAGS) -c envsys.c -o envsys.o
+endif
+
wmbattery: $(OBJS)
$(CC) -o wmbattery $(LDFLAGS) $(OBJS) $(LIBS)

View File

@ -0,0 +1,20 @@
$NetBSD$
Allows enabling envsys support.
--- configure.ac.orig 2020-09-01 05:47:18.004496746 +0000
+++ configure.ac
@@ -39,6 +39,13 @@ AS_IF([test x$enable_upower != xno], [
PKG_CHECK_MODULES([upower], [upower-glib])
AC_SUBST(USE_UPOWER, 1)
])
+AC_ARG_ENABLE(envsys, AS_HELP_STRING([--enable-envsys], [enable envsys]),
+ [], [enable_envsys=no])
+AS_IF([test x$enable_envsys != xno], [
+ AC_CHECK_HEADERS(sys/envsys.h)
+ AC_CHECK_HEADERS(prop/proplib.h)
+ AC_SUBST(USE_ENVSYS, 1)
+])
dnl Checks for header files.
AC_HEADER_STDC

View File

@ -0,0 +1,67 @@
$NetBSD$
Adds support for envsys (see ../files/envsys.c).
--- wmbattery.c.orig 2020-09-01 05:47:33.306716070 +0000
+++ wmbattery.c
@@ -49,6 +49,9 @@
#ifdef UPOWER
#include "upower.h"
#endif
+#ifdef ENVSYS
+#include "envsys.h"
+#endif
Pixmap images[NUM_IMAGES];
Window root, iconwin, win;
@@ -78,6 +81,9 @@ int use_simplehal = 0;
#ifdef UPOWER
int use_upower = 0;
#endif
+#ifdef ENVSYS
+int use_envsys = 0;
+#endif
int use_sonypi = 0;
int use_acpi = 0;
int delay = 0;
@@ -719,6 +725,12 @@ void alarmhandler(int sig)
if (acpi_read(battnum, &cur_info) != 0)
error("Cannot read ACPI information.");
}
+#ifdef ENVSYS
+ else if (use_envsys) {
+ if (envsys_read(battnum, &cur_info) != 0)
+ error("Cannot read envsys information.");
+ }
+#endif
#ifdef HAL
else if (use_simplehal) {
if (simplehal_read(battnum, &cur_info) != 0)
@@ -784,8 +796,18 @@ int main(int argc, char *argv[])
{
make_window(parse_commandline(argc, argv), argc, argv);
+#ifdef ENVSYS
+ /* Check for envsys support. */
+ if (envsys_supported()) {
+ use_envsys = 1;
+ if (!delay)
+ delay = 2;
+ }
/* Check for APM support (returns 0 on success). */
+ else if (apm_exists() == 0) {
+#else
if (apm_exists() == 0) {
+#endif
if (!delay)
delay = 1;
}
@@ -816,7 +838,7 @@ int main(int argc, char *argv[])
if (!delay)
delay = 1;
} else {
- error("No APM, ACPI, UPOWER, HAL or SPIC support detected.");
+ error("No envsys, APM, ACPI, UPOWER, HAL or SPIC support detected.");
}
load_images();