Das Toshiba schickt leider für viele ACPI Tasten immer zwei Events kurz hintereinander. Besonders doof ist das freilich beim Suspend, let sich das dumme Ding doch sofort nach dem Einschlafen erneut zu einem kleinen Nickerchen nieder.
Ich entprelle darum die Tasten auf etwas ruppige Art und weise. Jeder Event wird in eine Datei geschrieben, zusammen mit einem Timestamp. Tritt dasselbe Event innerhalb von 400ms erneut auf wird es abgelent. Fürs Suspend reicht das alleine freilich nicht aus, darum wird beim ersten Event eine Marke in die Datei geschrieben, und erst beim zweiten legt sich das Notebook tatsächlich schlafen. Diese Methode scheint zwar eleganter zu sein, würde aber erfordern das ich nachsehe welche Tasten genau zum prellen neigen, worauf ich keinen Nerv habe.
#!/bin/sh
# Default acpi script that takes an entry for all actions
# NOTE: This is a 2.6-centric script. If you use 2.4.x, you'll have to
# modify it to not use /sys
BFILE="/var/run/lastacpievent"
B2FILE="/var/run/lastacmode"
function susprep {
for A in $(ls /media/); do pumount $A; done;
#/etc/rc.d/net-auto-wired stop
#/etc/rc.d/net-auto-wireless stop
netcfg -a
#rmmod ipw2200
sync
}
function suspres {
#modprobe ipw2200
#/etc/rc.d/net-auto-wired start
#/etc/rc.d/net-auto-wireless start
#if [ -f /sys/devices/platform/smapi/BAT0/start_charge_thresh ]; then
# echo 50 > /sys/devices/platform/smapi/BAT0/start_charge_thresh
# echo 90 > /sys/devices/platform/smapi/BAT0/stop_charge_thresh
#fi
#if [ -f /sys/devices/platform/smapi/BAT2/start_charge_thresh ]; then
# echo 50 > /sys/devices/platform/smapi/BAT2/start_charge_thresh
# echo 90 > /sys/devices/platform/smapi/BAT2/stop_charge_thresh
#fi
logger up
}
set $*
case "$1" in
ac_adapter)
case "$2" in
AC|ACAD|ADP0)
#source $B2FILE
#logger "$LMODE $4";
#if [ "$LMODE" == "$B4" ]; then logger "BLUB"; exit; fi
#echo "LMODE="$4"" > $B2FILE
case "$4" in
00000000)
#echo -n $minspeed >$setspeed
/etc/laptop-mode/laptop-mode start
;;
00000001)
#echo -n $maxspeed >$setspeed
/etc/laptop-mode/laptop-mode stop
;;
esac
;;
*) logger "ACPI ac action undefined: $2" ;;
esac
;;
battery)
case "$2" in
BAT0)
logger "ACPI BAT0 event"
case "$4" in
00000000)
#echo "offline" >/dev/tty5
;;
00000001)
#echo "online" >/dev/tty5
#echo 40 > /sys/devices/platform/smapi/BAT0/start_charge_thresh
#echo 90 > /sys/devices/platform/smapi/BAT0/stop_charge_thresh
;;
esac
;;
CPU0) logger "ACPI CPU0 event" ;;
PNP0C0A:00) ;;
*) logger "ACPI battery action undefined: $2" ;;
esac
;;
video/*)
ADATE=$(date +%s%N)
source $BFILE
DELTA=$(($ADATE-$LASTCOMMANDTIME))
if [ $DELTA -lt 40000000 -a "$LASTCOMMAND" == "$1 $2" ]; then logger "Two fast ($LASTCOMMAND -- $1 $2)"; exit; fi
echo "LASTCOMMAND="$1 $2"" > $BFILE
echo "LASTCOMMANDTIME=$ADATE" >> $BFILE
case "$2" in
VMOD) autorandr -c ;;
BRTDN) logger "Brightnes down Button pressed: $2" ;;
BRTUP) logger "Brightnes up Button pressed: $2" ;;
*) logger "ACPI video action undefined: $2" ;;
esac
;;
button/*)
ADATE=$(date +%s%N)
FIRST=1
if [ ! "$2" == "VOLUP" -a ! "$2" == "VOLDN" -a -f /var/run/lastacpievent ]; then
source $BFILE
DELTA=$(($ADATE-$LASTCOMMANDTIME))
if [ $DELTA -lt 40000000 -a "$LASTCOMMAND" == "$1 $2" ]; then logger "Two fast ($LASTCOMMAND -- $1 $2)"; exit; fi
fi
echo -e "LASTCOMMAND="$1 $2"nLASTCOMMANDTIME=$ADATE" > $BFILE
case "$2" in
PBTN|PWRF) logger "PowerButton pressed ($1, $2)" ;;
SLPB|SBTN) logger "Sleep Button pressed ($1, $2)"
if [ "$SECOND" == "true" ]; then exit; fi;
echo "SECOND="true"" >> $BFILE
thinkalert 3 100000
susprep
echo -n mem >/sys/power/state
suspres
;;
SUSP) logger "Suspend Button pressed ($1, $2)"
if [ $FIRST -eq 1 ]; then exit; fi;
thinkalert 3 100000
susprep
echo -n disk >/sys/power/state
suspres
;;
MUTE) logger "Mute Button pressed ($1, $2)" ;;
BAT) logger "Battery Button pressed ($1, $2)" ;;
WLAN) logger "Killswitch Button pressed ($1, $2)" ;;
PROG1) logger "Prog1 (touchpad off) Button pressed ($1, $2)" ;;
SCRNLCK) logger "Screen lock Button pressed ($1, $2)" ;;
LID) logger "Lid Button pressed ($1, $2)" ;;
VOLUP) amixer sset Master 1+; logger "vol +" ;;
VOLDN) amixer sset Master 1-; logger "vol -" ;;
#F24) logger "F24 / Eject Button pressed ($1, $2)" ;;
#ZOOM) logger "Zoom Button pressed ($1, $2)" ;;
*) logger "ACPI button action undefined: $1, $2" ;;
esac
;;
*)
logger "ACPI group/action undefined: $1 / $2"
;;
esac