Sophie

Sophie

distrib > Mageia > 5 > x86_64 > media > core-updates-src > by-pkgid > d5e0d1e2fa40cc93b19a86577c66b049 > files > 6

pm-utils-1.4.1-9.1.mga5.src.rpm

#!/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 $?