#!/bin/bash ########################################################################### # # # Thinkpad event script # # # # Copyright (C) 2005,2006,2007 SUSE Linux Products GmbH # # # # Author(s): Based on code by Stefan Seyfried # # Hotkey support by Alex Solovey, solovey@us.ibm.com # # Enhancements by Holger Macht # # # # This program is free software; you can redistribute it and/or modify it # # under the terms of the GNU General Public License as published by the # # Free Software Foundation; either version 2 of the License, or (at you # # option) any later version. # # # # This program is distributed in the hope that it will be useful, but # # WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # # General Public License for more details. # # # # You should have received a copy of the GNU General Public License along # # with this program; if not, write to the Free Software Foundation, Inc., # # 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # # # ########################################################################### # # thinkpad_acpi_events - process ThinkPad specific ACPI events generated by # thinkpad_acpi driver and log them to syslog # # Configuration changes required for the script to work: # - Issue echo 0xffff > /proc/acpi/ibm/hotkey to enable thinkpad_acpi event on FnF5 # PATH=/bin:/usr/bin:/usr/X11R6/bin:/sbin:/usr/sbin # be paranoid, we're running as root. WTTYHX=/usr/lib/powersave/wttyhx function DEBUG(){ logger "thinkpad_acpi_events $1" } get_x_user(){ [ -n "$X_USER" -a -n "$DISP" ] && return 0 local DUMMY read DUMMY X_USER DISP DUMMY < <($WTTYHX -v) return 0 } run_on_xserver() { get_x_user DEBUG "User $X_USER display $DISP $1 " INFO su $X_USER -c "DISPLAY=$DISP $1" } kde_running() { get_x_user su - $X_USER -c "DISPLAY=$DISP /opt/kde3/bin/dcopfind kdesktop >/dev/null 2>&1" && \ KDE_RUNNING=true } HOTKEY=$1 DEBUG "Custom event script for ThinkPad thinkpad_acpi driver" INFO set $HOTKEY EVENT=$1 # "ibm/hotkey" ACPI=$2 # "HOTK" WHAT=$3 # "00000080" SERIAL=$4 # "0000100c" Fn+F12 # it is easier to deal with numerical values (for me :-) declare -i VAL VAL=0x$WHAT # hex -> decimal declare -i SER SER=0x$SERIAL # hex -> decimal if [ "$EVENT" = "ibm/hotkey" ]; then ACTION="log event" if [ "$VAL" -eq 128 ]; then case $SER in 4097) HOTKEY="Fn+F1" ;; 4098) HOTKEY="Fn+F2" ACTION="lock screen" kde_running if [ -n "$KDE_RUNNING" ]; then get_x_user DEBUG "User $X_USER display $DISP" INFO su $X_USER -c "DISPLAY=$DISP /opt/kde3/bin/dcop --all-users --all-sessions kdesktop KScreensaverIface lock" else run_on_xserver "/usr/bin/xlock -mode blank" fi ;; 4099) HOTKEY="Fn+F3" if [ -x /opt/thinkpad/pm/onscreen_pm.sh ] ; then run_on_xserver "/opt/thinkpad/pm/onscreen_pm.sh start" & ACTION="start onscreen_pm applet" else run_on_xserver "xset dpms force off" & ACTION="blank screen" fi ;; 4100) HOTKEY="Fn+F4" /usr/sbin/s2ram ;; 4101) HOTKEY="Fn+F5" # Bluetooth if [ -x /opt/thinkpad/ac/onscreen_ac.sh ] ; then run_on_xserver "/opt/thinkpad/ac/onscreen_ac.sh start" & ACTION="start onscreen_ac applet" elif grep -q "status.*disabled" /proc/acpi/ibm/bluetooth ; then echo enable > /proc/acpi/ibm/bluetooth ACTION="enable bluetooth" else echo disable > /proc/acpi/ibm/bluetooth ACTION="disable bluetooth" fi ;; 4102) HOTKEY="Fn+F6" ;; 4103) HOTKEY="Fn+F7" ACTION="swap monitors" echo video_switch > /proc/acpi/ibm/video ;; 4104) HOTKEY="Fn+F8" ;; # ACTION="expand screen" # echo expand_toggle > /proc/acpi/ibm/video 4105) HOTKEY="Fn+F9" # ACTION="undock" # handled by dockutils ;; 4106) HOTKEY="Fn+F10" ;; 4107) HOTKEY="Fn+F11" ;; 4108) HOTKEY="Fn+F12" /usr/sbin/s2disk ;; 4109) HOTKEY="Fn+Backspace" ;; 4110) HOTKEY="Fn+Insert" ;; 4111) HOTKEY="Fn+Delete" ;; 4112) HOTKEY="Fn+Home" ACTION="brighter display" echo "up" >/proc/acpi/ibm/brightness ;; 4113) HOTKEY="Fn+End" ACTION="dimmer display" echo "down" >/proc/acpi/ibm/brightness ;; *) HOTKEY="Unidentified" ;; esac else HOTKEY="Unidentified" fi DEBUG "$HOTKEY hotkey: keycode $VAL serial $SER. action: $ACTION " INFO elif [ "$EVENT" = "ibm/bay" ]; then case $VAL in 1) HOTKEY="Eject lever inserted" ;; 3) HOTKEY="Eject Request" ;; *) HOTKEY="Unidentified" ;; esac DEBUG "$HOTKEY UltraBay event: $EVENT " INFO else DEBUG "Unidentified event: $EVENT $ACPI $WHAT $SERIAL" INFO fi exit 0