hc
2023-12-09 b22da3d8526a935aa31e086e63f60ff3246cb61c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#!/bin/sh
 
EVENT=${1:-short-press}
 
LONG_PRESS_TIMEOUT=3 # s
DEBOUNCE=2 # s
PIDFILE="/tmp/$(basename $0).pid"
LOCKFILE=/tmp/.power_key
 
short_press()
{
   logger -t $(basename $0) "[$$]: Power key short press..."
 
   if which systemctl >/dev/null; then
       SUSPEND_CMD="systemctl suspend"
   elif which pm-suspend >/dev/null; then
       SUSPEND_CMD="pm-suspend"
   else
       SUSPEND_CMD="echo -n mem > /sys/power/state"
   fi
 
   if [ ! -f $LOCKFILE ]; then
       logger -t $(basename $0) "[$$]: Prepare to suspend..."
 
       touch $LOCKFILE
       sh -c "$SUSPEND_CMD"
       { sleep $DEBOUNCE && rm $LOCKFILE; }&
   fi
}
 
long_press()
{
   logger -t $(basename $0) "[$$]: Power key long press (${LONG_PRESS_TIMEOUT}s)..."
 
   logger -t $(basename $0) "[$$]: Prepare to power off..."
 
   poweroff
}
 
logger -t $(basename $0) "[$$]: Received power key event: $@..."
 
case "$EVENT" in
   press)
       # Lock it
       exec 3<$0
       flock -x 3
 
       start-stop-daemon -K -q -p $PIDFILE || true
       start-stop-daemon -S -q -b -m -p $PIDFILE -x /bin/sh -- \
           -c "sleep $LONG_PRESS_TIMEOUT; $0 long-press"
 
       # Unlock
       flock -u 3
       ;;
   release)
       # Avoid race with press event
       sleep .5
 
       start-stop-daemon -K -q -p $PIDFILE && short_press
       ;;
   short-press)
       short_press
       ;;
   long-press)
       long_press
       ;;
esac