<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Fri, May 27, 2016 at 12:12 AM, Mason Loring Bliss <span dir="ltr"><<a href="mailto:mason@blisses.org" target="_blank">mason@blisses.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">Traditionally I could edit scripts in /etc/acpi to accomplish things, but on<br>
EL7 I'm seeing that some combination of upower and systemd/logind appear to<br>
be the way to control responses to ACPI events.<br>
<br>
I want to have custom things happen on lid close, and I'm not seeing how to<br>
accomplish it as yet.<br>
<br>
logind.conf(5) and the web page at<br>
<a href="https://www.freedesktop.org/software/systemd/man/logind.conf.html" rel="noreferrer" target="_blank">https://www.freedesktop.org/software/systemd/man/logind.conf.html</a> both<br>
enumerate the options for HandleLidSwitch:<br>
<br>
     Can be one of "ignore", "poweroff", "reboot", "halt", "kexec",<br>
    "suspend", "hibernate", "hybrid-sleep", and "lock". If "ignore", logind<br>
     will never handle these keys.<br>
<br>
I thought at first kexec was a way I might hook in behaviour, but now I see<br>
that kexec is for fast reboots. Nothing else seems appropriate there.<br>
<br>
How can I do this? The default RHEL7 Gnome seems to be able to inject custom<br>
behaviour, as it locks the screen on lid close before sleep, but it's not yet<br>
clear how they do it.</blockquote><div><br></div><div><div><br></div><div>~ The primary method is: take a {sleep, delay} inhibitor, wait for a "PrepareForSleep" signal via D-Bus, and drop the inhibitor when done with the preparations. That's what desktop environments (e.g. GNOME) use for locking the screen, and it's what system daemons (e.g. NM) use for pausing connections and making other preparations; it's going to be the best choice if your plans involve $DISPLAY in any way at all. There was a thread just a few days earlier about doing this via Perl's Net::DBus.</div></div><div><br></div><div>~ At *system* level (no X11), If all you need is to run some rmmod/modprobe (ick), then systemd-sleep(8) hooks would be simplest. They run immediately before systemd tells the kernel to suspend, and immediately after.</div><div><br></div><div>~ If you need something more complex, but still at system level (e.g. ponies and rainbows instead of suspending), then acpid will still work. You can set HandleLidSwitch=ignore, install acpid, and use your old /etc/acpi handler scripts, manually calling `systemctl suspend` at the end.</div><div><br></div><div>~ Finally, if you're writing a *desktop environment*, you can take a {handle-lid-switch, block} inhibitor, which signals logind that you want to [temporarily] completely take over the lid-switch handling; then you can receive ACPI events directly via X11, or from /dev/input, or from netlink, or from acpid, or whatever. That's what KDE and Xfce do. GNOME doesn't handle the lid, but still takes over the power button this way.</div><div><br></div><div>(I frequently abuse the above via "systemd-inhibit --what=handle-lid-switch /bin/sleep 1h" as a quick way to temporarily disable sleep-on-close.)</div></div><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr">Mantas Mikulėnas <<a href="mailto:grawity@gmail.com" target="_blank">grawity@gmail.com</a>></div></div>
</div></div>