/
40xlock
123 lines (108 loc) · 4.52 KB
/
40xlock
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#!/bin/sh
# LOCK_XFREE="yes"
. "${PM_FUNCTIONS}"
pidof X >/dev/null || exit 0;
pidgetenv() {
echo $(perl -an -e 's|.*'$2'=([^\000]*).*|\1|m;print $_, "\n"' < /proc/$1/environ)
}
lock_xfree() {
# LOCKED will list the displays we already locked
# They will contain stuff like " :0- :1-", - being simplify use of grep
# Lock all xscreensaver users
xscreensaver_started="$(pidof xscreensaver)"
if [ -n "$xscreensaver_started" ]; then
for pid in $xscreensaver_started; do
RUSER=$(pidgetenv $pid USER)
RDISPLAY=$(pidgetenv $pid DISPLAY)
su $RUSER -c "xscreensaver-command -display $RDISPLAY -lock" >/dev/null 2>&1 && LOCKED="$LOCKED $RDISPLAY-"
done
fi
# Lock all gnome-screensaver users
gnomescreensaver_started="$(pidof gnome-screensaver)"
if [ -n "$gnomescreensaver_started" ]; then
for pid in $gnomecreensaver_started; do
RUSER=$(pidgetenv $pid USER)
RDISPLAY=$(pidgetenv $pid DISPLAY)
su $RUSER -c "DISPLAY='$DISPLAY' gnome-screensaver-command --lock" >/dev/null 2>&1 && LOCKED="$LOCKED $RDISPLAY-"
done
fi
# Lock all xautolock users
xautolock_started="$(pidof xautolock)"
if [ -n "$xautolock_started" ]; then
for pid in $xautolock_started; do
RUSER=$(pidgetenv $pid USER)
RDISPLAY=$(pidgetenv $pid DISPLAY)
su $USER -c "DISPLAY=$RDISPLAY xautolock -locknow" & 2>&1 >/dev/null && LOCKED="$LOCKED $RDISPLAY-"
done
fi
# Lock all kde sessions
kde_started=$(pidof "kdesktop [kdeinit]")
if [ -n "$kde_started" ];then
dcop --all-sessions --all-users kdesktop KScreensaverIface 'lock()' >/dev/null 2>&1
kdesktop_lock="$(pidof kdesktop_lock)"
if [[ -n $kdesktop_lock ]]; then
for pid in $kdesktop_lock; do
RDISPLAY=$(pidgetenv $pid DISPLAY)
LOCKED="$LOCKED $RDISPLAY-"
done
fi
fi
# Now try locking remaining displays
s2u_started="$(pidof s2u)"
if [ -n "$s2u_started" ]; then
for pid in $s2u_started; do
RUSER=$(pidgetenv $pid USER)
RDISPLAY=$(pidgetenv $pid DISPLAY) # Can be empty on some defunct s2u
if [[ -n $RDISPLAY ]] && ! echo $LOCKED | grep "$RDISPLAY-" >/dev/null; then
DBUS_SESSION_BUS_PID="$(pidgetenv $pid DBUS_SESSION_BUS_PID)"
DBUS_SESSION_BUS_ADDRESS="$(pidgetenv $pid DBUS_SESSION_BUS_ADDRESS)"
XAUTHORITY="$(pidgetenv $pid XAUTHORITY)"
TMPDIR="$(pidgetenv $pid TMPDIR)"
su $RUSER -c "TMPDIR='$TMPDIR' DBUS_SESSION_BUS_PID='$DBUS_SESSION_BUS_PID' DBUS_SESSION_BUS_ADDRESS='$DBUS_SESSION_BUS_ADDRESS' XAUTHORITY='$XAUTHORITY' gnome-screensaver --display $RDISPLAY"
if su $RUSER -c "DBUS_SESSION_BUS_PID='$DBUS_SESSION_BUS_PID' DBUS_SESSION_BUS_ADDRESS='$DBUS_SESSION_BUS_ADDRESS' DISPLAY='$RDISPLAY' gnome-screensaver-command --lock" >/dev/null 2>&1; then
LOCKED="$LOCKED $RDISPLAY-"
else
su $RUSER -c "xscreensaver -display $RDISPLAY -nosplash & xscreensaver-command -display $RDISPLAY -lock" >/dev/null 2>&1 || \
su $RUSER -c "xlock -display $RDISPLAY &" >/dev/null 2>&1 && \
LOCKED="$LOCKED $RDISPLAY-"
fi
fi
done
fi
}
unlock_xfree() {
# Prompt the user to unlock
xscreensaver_started="$(pidof xscreensaver)"
if [ -n "$xscreensaver_started" ]; then
for pid in $xscreensaver_started; do
RUSER=$(pidgetenv $pid USER)
RDISPLAY=$(pidgetenv $pid DISPLAY)
su $RUSER -c "xscreensaver-command -display $RDISPLAY -deactivate" >/dev/null 2>&1
done
fi
gnomescreensaver_started="$(pidof gnome-screensaver)"
if [ -n "$gnomescreensaver_started" ]; then
for pid in $gnomescreensaver_started; do
RUSER=$(pidgetenv $pid USER)
RDISPLAY=$(pidgetenv $pid DISPLAY)
DBUS_SESSION_BUS_PID=$(pidgetenv $pid DBUS_SESSION_BUS_PID)
DBUS_SESSION_BUS_ADDRESS=$(pidgetenv $pid DBUS_SESSION_BUS_ADDRESS)
su $RUSER -c "DBUS_SESSION_BUS_PID='$DBUS_SESSION_BUS_PID' DBUS_SESSION_BUS_ADDRESS='$DBUS_SESSION_BUS_ADDRESS' DISPLAY='$RDISPLAY' gnome-screensaver-command --poke" >/dev/null 2>&1
done
fi
}
case "$1" in
hibernate|suspend)
if [ "$LOCK_XFREE" == "yes" ]; then
lock_xfree
fi
;;
thaw|resume)
if [ "$LOCK_XFREE" == "yes" ]; then
unlock_xfree
fi
;;
*)
;;
esac
exit $?