--- /etc/acpi/powerbtn.sh.orig 2008-09-26 09:36:54.000000000 +0800 +++ /etc/acpi/powerbtn.sh 2009-01-30 18:50:42.000000000 +0800 @@ -6,26 +6,37 @@ # Skip if we just in the middle of resuming. test -f /var/lock/acpisleep && exit 0 -# If gnome-power-manager, kpowersave or klaptopdaemon are running, let -# them handle policy This is effectively the same as 'acpi-support's +# If gnome-power-manager, kpowersave, or powerdevil are running, let +# them handle policy. This is effectively the same as 'acpi-support's # '/usr/share/acpi-support/policy-funcs' file. if pidof gnome-power-manager kpowersave > /dev/null || - (pidof dcopserver > /dev/null && test -x /usr/bin/dcop && /usr/bin/dcop kded kded loadedModules | grep -q klaptopdaemon) ; then + /usr/bin/qdbus org.kde.kded /modules/powerdevil &> /dev/null ; then exit fi # Otherwise, if KDE is found, try to ask it to logout. -# If KDE is not found, just shutdown now. -if ps -Af | grep -q '[k]desktop' && pidof dcopserver > /dev/null && test -x /usr/bin/dcop ; then - KDESES=`pidof dcopserver | wc -w` +if pidof plasma > /dev/null && pidof dbus-daemon > /dev/null && test -x /usr/bin/qdbus ; then + KDESES=`pidof ksmserver | wc -w` if [ $KDESES -eq 1 ] ; then # single KDE session -> ask user - /usr/bin/dcop --all-sessions --all-users ksmserver ksmserver logout 1 2 0 + pid=`pidof ksmserver` + user=`ps -C ksmserver -o user --no-heading` + export `grep -z DBUS_SESSION_BUS_ADDRESS /proc/$pid/environ` + su --command '/usr/bin/qdbus org.kde.ksmserver /KSMServer logout 1 2 0' $user exit 0 else # more than one KDE session - just send shutdown signal to all of them - /usr/bin/dcop --all-sessions --all-users ksmserver ksmserver logout 0 2 0 && exit 0 + ret=0 + ps -C ksmserver -o pid,user --no-heading | while read line; do + pid=`echo $line | cut -d ' ' -f 1` + user=`echo $line | cut -d ' ' -f 2` + export `grep -z DBUS_SESSION_BUS_ADDRESS /proc/$pid/environ` + su --command '/usr/bin/qdbus org.kde.ksmserver /KSMServer logout 0 2 0' $user + ret=$(( $ret + $? )) + done + # if no error ocurred, terminate script + [ $ret -eq 0 ] && exit 0 fi fi