(re: https://www.mail-archive.com/xorg@lists.freedesktop.org/msg14972.html)

Hello Taylor,

I have the same problem as you! I want to hook DPMS events in X. Given that you 
never got any
responses to this message, I take it the answer is that it's impossible, but 
it's been half a
decade so I thought I'd ask again: do you, or anyone else on this list, know 
how to hook DPMS state
changes in X?

My use case is a little of the more-things-change-the-more-they-stay-the-same: 
I have a tablet and
I want it to behave like Android: to save power, it should time out and blank 
the screen, or react
to the power button by blanking the screen, and it should either immediately 
lock (using slock or
i3lock) or lock after some idle time blanked (`sleep 300; slock` or `xlock 
-lockdelay 300` are
equally good), and it should disable the mouse and touchscreen while blanked 
because it's just too easy to knock the screen while it's off and wake it back 
up again (and possibly tap a button in the offing).

I can blank the screen and lock it after a delay like this:

xset dpms 0 0 45
xautolock -time 5 -locker "xlock -lockdelay 300"

And make the power button trigger:

# (this is i3 syntax but you could do it with xmodmap or the Gnome GUI or 
whatever)
bindsym XF86PowerOff exec xset dpms force off

It's a bit grungry, because xautolock works in minutes whereas xlock and xset 
work in seconds, and
you have to do a mental subtraction to work out the gap between blanking and 
locking, but it
roughly works.

It's the bit about the touchscreen/mouse that makes this really hard. I found
https://superuser.com/questions/71704/dpms-keep-screen-off-when-lid-shut from 
years ago but there's
no good solutions there. I could add a `xinput set-int-prop $TOUCHSCREEN 
"Device Enabled" 8 "0"` to the
PowerOff trigger, but there's no place to hook it in the same way for the 
timeout because y; maybe I could
use two xautolocks, one to turn off the screen and mouse and one to lock later, 
except xautolock
specifically denies that.
Maybe I could write a "locker" that looks like

#!/bin/sh
xset dpms force off
xinput set-int-prop $TOUCHSCREEN "Device Enabled" 8 "0"
xinput set-int-prop $MOUSE "Device Enabled" 8 "0"
sleep 300
xlock

and have xautolock run that. But I'd need to be careful about trapping signals 
and relaying them to
children, and it still doesn't know when to re-enable the mouse -- which should 
be tied to the
screen being on. It would be infinitely easier if there was a dpms-events and I 
could just run a
script

#!/bin/sh
TOUCHSCREEN=...
MOUSE=...
dpms-events | while read event; do
case $event in
BLANK)
xinput set-int-prop $TOUCHSCREEN "Device Enabled" 8 "0"
xinput set-int-prop $MOUSE "Device Enabled" 8 "0"
;;
UNBLANK)
xinput set-int-prop $TOUCHSCREEN "Device Enabled" 8 "1"
xinput set-int-prop $MOUSE "Device Enabled" 8 "1"
;;
done

And then let X timeout and blank the screen or run "xset force dpms off" at 
will, or "xset force
dpms on" (which is what waking the machine by tapping a button on the keyboard 
or press the power
button should do).

For clues, I went digging into jwz's xscreensaver in order to see how he 
handles it; it turns out
he wrote his own eventing system for screensavers (see 
https://www.jwz.org/xscreensaver/man3.html
-> `open (IN, "xscreensaver-command -watch |"); while (<IN>) { if 
(m/^(BLANK|LOCK)/) { ...`), but
how that's actually implemented is on top of a huge pile of hacks and 
second-guessing X in order to
handle the mismash of X variants out in the wild. The main() comment
<https://github.com/Zygo/xscreensaver/blob/39809ded547bdbb08207d3e514950425215b4410/driver/xscreensa
er.c#L12> reads

> * We do this in one of three different ways: periodically
> * checking with the XIdle server extension; selecting key and mouse events
> * on (nearly) all windows; or by waiting for the MIT-SCREEN-SAVER extension
> * to send us a "you are idle" event.

The only thing it has to do with DPMS is forcing the monitor settings to match 
what xscreensaver
thinks they should be
<https://github.com/Zygo/xscreensaver/blob/39809ded547bdbb08207d3e514950425215b4410/driver/dpms.c#L1
0>.

So after all that, I'm pretty sure what I'm looking for doesn't exist, but I am 
not very familiar
with X internals so maybe there's a secret DPMSSelectInput to match 
XScreenSaverSelectInput. Anyone got a clue?
_______________________________________________
xorg@lists.x.org: X.Org support
Archives: http://lists.freedesktop.org/archives/xorg
Info: https://lists.x.org/mailman/listinfo/xorg
Your subscription address: %(user_address)s

Reply via email to