Add sandman wrapper

weechat-hashes
C. McEnroe 2020-02-12 21:31:09 -05:00
parent c8a9570c1c
commit 9bed890aa8
5 changed files with 151 additions and 0 deletions

View File

@ -40,6 +40,17 @@ install: catgirl catgirl.1
uninstall: uninstall:
rm -f ${PREFIX}/bin/catgirl ${MANDIR}/man1/catgirl.1.gz rm -f ${PREFIX}/bin/catgirl ${MANDIR}/man1/catgirl.1.gz
scripts/sandman: scripts/sandman.o
${CC} ${LDFLAGS} scripts/sandman.o -framework Cocoa -o $@
install-sandman: scripts/sandman scripts/sandman.1
install -d ${PREFIX}/bin ${MANDIR}/man1
install scripts/sandman ${PREFIX}/bin
gzip -c scripts/sandman.1 > ${MANDIR}/man1/sandman.1.gz
uninstall-sandman:
rm -f ${PREFIX}/bin/sandman ${MANDIR}/man1/sandman.1.gz
CHROOT_USER = chat CHROOT_USER = chat
CHROOT_GROUP = ${CHROOT_USER} CHROOT_GROUP = ${CHROOT_USER}

View File

@ -99,6 +99,19 @@ For example,
PKG_CONFIG_PATH=/opt/libressl/lib/pkgconfig ./configure PKG_CONFIG_PATH=/opt/libressl/lib/pkgconfig ./configure
.Ed .Ed
. .
.Pp
The
.Nm sandman
wrapper is provided for macOS
to stop and start
.Nm
on system sleep and wake.
Install it as follows:
.Bd -literal -offset indent
make scripts/sandman
sudo make install-sandman
.Ed
.
.Sh FILES .Sh FILES
.Bl -tag -width "complete.c" -compact .Bl -tag -width "complete.c" -compact
.It Pa chat.h .It Pa chat.h
@ -127,6 +140,8 @@ XDG base directories
. .
.Pp .Pp
.Bl -tag -width "scripts/notify-send.scpt" -compact .Bl -tag -width "scripts/notify-send.scpt" -compact
.It Pa scripts/sandman.m
sleep/wake wrapper for macOS
.It Pa scripts/notify-send.scpt .It Pa scripts/notify-send.scpt
.Xr notify-send 1 .Xr notify-send 1
in AppleScript in AppleScript

1
scripts/.gitignore vendored 100644
View File

@ -0,0 +1 @@
sandman

36
scripts/sandman.1 100644
View File

@ -0,0 +1,36 @@
.Dd February 12, 2020
.Dt SANDMAN 1
.Os
.
.Sh NAME
.Nm sandman
.Nd sleep wrapper
.
.Sh SYNOPSIS
.Nm
.Op Fl t Ar secs
.Ar command ...
.
.Sh DESCRIPTION
The
.Nm
utility wraps a
.Ar command ,
sending it
.Dv SIGHUP
when the system goes to sleep,
and restarting it
when the system wakes.
.
.Pp
The arguments are as follows:
.Bl -tag -width Ds
.It Fl t Ar secs
Wait for
.Ar secs
before restarting the process.
The default is 8 seconds.
.El
.
.Sh AUTHORS
.An June Bug Aq Mt june@causal.agency

88
scripts/sandman.m 100644
View File

@ -0,0 +1,88 @@
/* Copyright (C) 2019, 2020 C. McEnroe <june@causal.agency>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#import <Cocoa/Cocoa.h>
#import <err.h>
#import <signal.h>
#import <stdio.h>
#import <stdlib.h>
#import <sysexits.h>
#import <unistd.h>
typedef unsigned uint;
static pid_t pid;
static void spawn(char *argv[]) {
pid = fork();
if (pid < 0) err(EX_OSERR, "fork");
if (pid) return;
execvp(argv[0], argv);
err(EX_CONFIG, "%s", argv[0]);
}
static void handler(int signal) {
(void)signal;
int status;
pid_t pid = wait(&status);
if (pid < 0) _exit(EX_OSERR);
_exit(status);
}
int main(int argc, char *argv[]) {
uint delay = 8;
int opt;
while (0 < (opt = getopt(argc, argv, "t:"))) {
switch (opt) {
break; case 't': delay = strtoul(optarg, NULL, 10);
break; default: return EX_USAGE;
}
}
argc -= optind;
argv += optind;
if (!argc) errx(EX_USAGE, "command required");
NSWorkspace *workspace = [NSWorkspace sharedWorkspace];
NSNotificationCenter *notifCenter = [workspace notificationCenter];
[notifCenter addObserverForName:NSWorkspaceWillSleepNotification
object:nil
queue:nil
usingBlock:^(NSNotification *notif) {
(void)notif;
signal(SIGCHLD, SIG_IGN);
int error = kill(pid, SIGHUP);
if (error) err(EX_UNAVAILABLE, "kill");
int status;
wait(&status);
}];
[notifCenter addObserverForName:NSWorkspaceDidWakeNotification
object:nil
queue:nil
usingBlock:^(NSNotification *notif) {
(void)notif;
warnx("waiting %u seconds...", delay);
sleep(delay);
signal(SIGCHLD, handler);
spawn(argv);
}];
signal(SIGCHLD, handler);
spawn(argv);
[[NSApplication sharedApplication] run];
}