#!/bin/bash
# -*- Mode: shell-script -*-
# Copyright (C) 2003-2005 by Mandriva
# Author: Chmouel Boudjnah
# Redistribution of this file is permitted under the terms of the GNU 
# Public License (GPL)
#
# suspend: 45
# resume: 7

. /etc/sysconfig/suspend

ARG=$1

if [[ -z $(pidof X) ]]; then
    exit;
fi

function pidgetenv {
    echo $(perl -an -e 's|.*'$2'=([^\000]*).*|\1|m;print $_, "\n"' < /proc/$1/environ)
}

function suspend {
    if [[ $LOCK_XFREE = "yes" ]]; then
	lock_xfree
    fi
}

function 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 "gnome-screensaver-command --display $RDISPLAY --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' gnome-screensaver-command --display $RDISPLAY --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
}

function resume {

    # 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' gnome-screensaver-command --display $RDISPLAY --poke" >/dev/null 2>&1
        done
    fi
}

case $ARG in
    suspend)
	suspend
	;;
    resume)
        resume
        ;;
esac
