mirror of
https://gitdl.cn/https://github.com/chakralinux/desktop.git
synced 2025-01-24 02:22:13 +08:00
717 lines
24 KiB
Bash
717 lines
24 KiB
Bash
#!/bin/bash
|
|
#
|
|
# Copyright 2009 Nicolas Bigaouette
|
|
# This file is part of acpi-eeepc-generic.
|
|
# http://code.google.com/p/acpi-eeepc-generic/
|
|
#
|
|
# acpi-eeepc-generic 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 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# acpi-eeepc-generic 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 acpi-eeepc-generic. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
#################################################################
|
|
### Needed path
|
|
EEEPC_PATH=/etc/acpi/eeepc
|
|
EEEPC_VAR=/var/eeepc
|
|
|
|
# Load configuration
|
|
. /etc/conf.d/acpi-eeepc-generic.conf
|
|
|
|
[ ! -d "${EEEPC_VAR}/states" ] && mkdir -p ${EEEPC_VAR}/states
|
|
|
|
chmod a+w ${EEEPC_VAR}/states/* &> /dev/null
|
|
|
|
### Extract kernel version
|
|
KERNEL=`uname -r`
|
|
KERNEL=${KERNEL%%-*}
|
|
KERNEL_maj=${KERNEL%%\.*}
|
|
k=${KERNEL#${KERNEL_maj}.}
|
|
KERNEL_min=${k%%\.*}
|
|
k=${KERNEL#${KERNEL_maj}.${KERNEL_min}.}
|
|
KERNEL_rel=${k%%\.*}
|
|
k=${KERNEL#${KERNEL_maj}.${KERNEL_min}.${KERNEL_rel}}
|
|
KERNEL_patch=${k%%\.*}
|
|
|
|
### Some paths
|
|
rfkills_path="/sys/class/rfkill"
|
|
sys_path="/sys/devices/platform/eeepc"
|
|
unset eee_backlight eee_backlight_tmp
|
|
eee_backlight_tmp=(`\ls /sys/class/backlight/`)
|
|
eee_backlight="/sys/class/backlight/${eee_backlight_tmp[0]}" # take first
|
|
|
|
### Maximum try for toggling. Should not be even needed
|
|
TOGGLE_MAX_TRY=3
|
|
|
|
### Generic notification function ###############################
|
|
function eeepc_notify {
|
|
# $1: Message
|
|
# $2: Icon (only libnotify)
|
|
# $3: Duration [ms] (optional)
|
|
if [ "$NOTIFY" == "libnotify" ]; then
|
|
send_libnotify "$1" "$2" "$3"
|
|
elif [ "$NOTIFY" == "kdialog" ]; then
|
|
send_kdialog "$1" "$2" "$3"
|
|
elif [ "$NOTIFY" == "dzen" ]; then
|
|
send_dzen "$1" "$2" "$3"
|
|
elif [ "$NOTIFY" == "naughty" ]; then
|
|
send_naughty "$1" "$2" "$3"
|
|
fi
|
|
logger "EeePC $EEEPC_MODEL: $1 ($2)"
|
|
}
|
|
|
|
### libnotify ###################################################
|
|
function send_libnotify() {
|
|
if [ ! -e /usr/bin/notify-send ]; then
|
|
logger "To use libnotify's OSD, please install 'notification-daemon'"
|
|
echo "To use libnotify's OSD, please install 'notification-daemon'"
|
|
return 1
|
|
fi
|
|
icon=$2
|
|
duration=$3
|
|
[ "x$icon" == "x" ] && icon="eee"
|
|
[ "x$duration" == "x" ] && duration=${NOTIFY_DURATION}
|
|
cmd="/usr/bin/notify-send -i $icon -t $duration \"EeePC $EEEPC_MODEL\" \"$1\""
|
|
send_generic "${cmd}"
|
|
}
|
|
|
|
### kdialog #####################################################
|
|
function send_kdialog() {
|
|
if [ ! -e /usr/bin/kdialog ]; then
|
|
logger "To use kdialog's OSD, please install 'kdebase'"
|
|
echo "To use kdialog's OSD, please install 'kdebase'"
|
|
return 1
|
|
fi
|
|
duration=$3
|
|
[ "x$duration" == "x" ] && duration=${NOTIFY_DURATION}
|
|
duration=$(( $duration / 1000 )) # kdialog duration is in second
|
|
cmd="/usr/bin/kdialog --passivepopup \"$1\" --title \"EeePC $EEEPC_MODEL\" $duration"
|
|
send_generic "${cmd}"
|
|
}
|
|
|
|
### dzen ########################################################
|
|
function send_dzen() {
|
|
if [ ! -e /usr/bin/dzen2 ]; then
|
|
logger "To use dzen's OSD, please install 'dzen2'"
|
|
echo "To use dzen's OSD, please install 'dzen2'"
|
|
return 1
|
|
fi
|
|
duration=$3
|
|
[ "x$duration" == "x" ] && duration=${NOTIFY_DURATION}
|
|
duration=$(( $duration / 1000 )) # Dzen2 duration is in second
|
|
cmd="(echo \"$1\"; sleep $duration) | /usr/bin/dzen2 &"
|
|
send_generic "${cmd}"
|
|
}
|
|
|
|
### awesome / nayghty ###########################################
|
|
function send_naughty() {
|
|
if [ ! -e /usr/bin/awesome-client ]; then
|
|
logger "To use awesome's OSD, please install 'awesome'"
|
|
echo "To use awesome's OSD, please install 'awesome'"
|
|
return 1
|
|
fi
|
|
duration=$3
|
|
[ "x$duration" == "x" ] && duration=${NOTIFY_DURATION}
|
|
duration=$(( $duration / 1000 )) # naughty duration is in second
|
|
cmd="echo 'naughty.notify({title = \"EeePC $EEEPC_MODEL\", text = \"$1\", timeout = $duration})' | awesome-client - &"
|
|
send_generic "${cmd}"
|
|
}
|
|
|
|
### Make sure GUI is run as user ################################
|
|
function send_generic() {
|
|
if [ "x$UID" == "x0" ]; then
|
|
# Verify if GDM is running
|
|
# See http://code.google.com/p/acpi-eeepc-generic/issues/detail?id=62
|
|
#pkill -0 gdm
|
|
#GDM_RUNNING=$?
|
|
#if [ "x$GDM_RUNNING" == "x0" ]; then
|
|
# eval "${@}"
|
|
#else
|
|
# /bin/su $user --login -c "${@}"
|
|
#fi
|
|
#export XAUTHORITY=${XAUTHORITY-/home/$user/.Xauthority}
|
|
/bin/su $user -c "${@}"
|
|
else
|
|
#bash -c "${@}"
|
|
eval "${@}"
|
|
fi
|
|
}
|
|
|
|
### Print all commands in an array ##############################
|
|
function print_commands() {
|
|
cmds=( "$@" )
|
|
cmds_num=${#cmds[@]}
|
|
[ "$cmds_num" == "0" ] && echo "NONE"
|
|
for ((i=0;i<${cmds_num};i++)); do
|
|
c=${cmds[${i}]}
|
|
echo "#$(($i+1)): $c"
|
|
done
|
|
}
|
|
|
|
### Execute all commands in an array ############################
|
|
function execute_commands() {
|
|
[ "x$EEEPC_CONF_DONE" == "xno" ] && eeepc_notify "PLEASE EDIT YOUR CONFIGURATION FILE:
|
|
/etc/conf.d/acpi-eeepc-generic.conf" stop 20000
|
|
cmds=( "$@" )
|
|
cmds_num=${#cmds[@]}
|
|
for ((i=0;i<${cmds_num};i++)); do
|
|
c=${cmds[${i}]}
|
|
if [ "${c:0:1}" == "@" ]; then
|
|
logger "execute_commands (as user $user) #$(($i+1)): $c"
|
|
echo "execute_commands (as user $user) #$(($i+1)): $c"
|
|
/bin/su $user --login -c "${c:1} &"
|
|
else
|
|
logger "execute_commands #$(($i+1)): $c"
|
|
echo "execute_commands #$(($i+1)): $c"
|
|
eval ${c}
|
|
fi
|
|
done
|
|
}
|
|
|
|
### Load modules ################################################
|
|
function load_modules() {
|
|
modules=( "$@" )
|
|
modules_num=${#modules[@]}
|
|
for ((i=0;i<${modules_num};i++)); do
|
|
m=${modules[${i}]}
|
|
# If module is not already present, load it
|
|
if [ "`lsmod | grep \"^${m} \"`" == "" ]; then
|
|
/sbin/modprobe ${m}
|
|
fi
|
|
#sleep 1
|
|
done
|
|
}
|
|
|
|
### Unload modules ##############################################
|
|
function unload_modules() {
|
|
modules=( "$@" )
|
|
modules_num=${#modules[@]}
|
|
for ((i=0;i<${modules_num};i++)); do
|
|
m="${modules[${i}]}"
|
|
# Only the first word is the module, the rest might are options,
|
|
# which are irrevelant in unloading the module.
|
|
/sbin/modprobe -r ${m%% *}
|
|
#sleep 1
|
|
done
|
|
}
|
|
|
|
### Verify if volume is muted ###################################
|
|
function volume_is_mute() {
|
|
# 1 is true, 0 is false
|
|
# Only check the first mixer in the list
|
|
# Keep only line with [on] or [off], and extract which one
|
|
unset output_mixers output_mixers_num is_muted on_off
|
|
output_mixers=(`get_output_mixers`)
|
|
output_mixers_num=${#output_mixers[@]}
|
|
on_off=`amixer get ${output_mixers[0]} | grep -e "\[on\]" -e "\[off\]" | sed -n "1 s|.*\[\(o[nf]*\)\].*|\1|pg"`
|
|
is_muted=0
|
|
# FIXME: Cleaner fix for http://code.google.com/p/acpi-eeepc-generic/issues/detail?id=53
|
|
[ "${on_off:0:3}" == "off" ] && is_muted=1
|
|
echo $is_muted
|
|
}
|
|
|
|
### Return the volume level #####################################
|
|
function get_volume() {
|
|
# Only check the first mixer in the list
|
|
# Keep only the line containing a "%" charater. Then sed to
|
|
# get the number inside the [NUMBER%] pattern.
|
|
echo `amixer get ${ALSA_VOLUME_MIXER[0]} | grep "%" | sed "s|.*\[\([0-9]*\)%.*|\1|g"`
|
|
}
|
|
|
|
### Set the volume level ########################################
|
|
function alsa_set_volume() {
|
|
# Call this function with a parameter, for example with "5%+"
|
|
# to raise of 5% the volume of all mixers in ALSA_VOLUME_MIXER
|
|
mixers_num=${#ALSA_VOLUME_MIXER[@]}
|
|
for ((i=0;i<${mixers_num};i++)); do
|
|
m="${ALSA_VOLUME_MIXER[${i}]}"
|
|
amixer set $m $1 &
|
|
done
|
|
}
|
|
|
|
### Return the mixer ############################################
|
|
function get_output_mixers() {
|
|
# Get what is between single quotes from amixer's output
|
|
mixers=`amixer scontrols | sed "s|.*'\(.*\)',0|\1|g"`
|
|
i=0
|
|
unset output_mixers
|
|
for m in ${mixers}; do
|
|
# Skip 'Mic' or 'Boost' (to filter out 'Mic Boost')
|
|
# since we only look for output mixers and 'Mic Boost'
|
|
# is split into 'Mic' and 'Boost' by bash. Skip also 'Beep'
|
|
if [[ "`echo $m | grep -i -e mic -e boost -e beep`" != "" ]]; then
|
|
continue
|
|
fi
|
|
# If not a capture, its a playback
|
|
if [ "`amixer sget $m | grep -i capture`" == "" ]; then
|
|
output_mixers[i]=$m
|
|
i=$((i+1))
|
|
fi
|
|
done
|
|
#echo "mixers: ${mixers}"
|
|
#echo "nb: ${#mixers[@]}"
|
|
#echo "output_mixers: ${output_mixers[@]}"
|
|
#echo "nb: ${#output_mixers[@]} $i"
|
|
echo ${output_mixers[@]}
|
|
|
|
# Might be easier:
|
|
#amixer controls | grep -i Playback | sed "s|.*'\(.*\)'.*|\1|g" | awk '{print ""$1""}' | uniq
|
|
}
|
|
|
|
### Mute/Unmute mixers ##########################################
|
|
function alsa_toggle_mute() {
|
|
unset output_mixers output_mixers_num i m action
|
|
output_mixers=(`get_output_mixers`)
|
|
output_mixers_num=${#output_mixers[@]}
|
|
if [[ "`volume_is_mute`" == "0" ]]; then
|
|
action="mute"
|
|
else
|
|
action="unmute"
|
|
fi
|
|
for ((i=0 ; i < ${output_mixers_num} ; i++)); do
|
|
m="${output_mixers[${i}]}"
|
|
amixer set $m $action
|
|
done
|
|
}
|
|
|
|
### Get the model name ##########################################
|
|
function get_model() {
|
|
if [ -z "${EEEPC_MODEL}" ]; then
|
|
echo "EEEPC_MODEL=\"$(dmidecode -s system-product-name | sed 's/[ \t]*$//')\"" >> /etc/conf.d/acpi-eeepc-generic.conf
|
|
CPU=NONE
|
|
grep_cpu=`grep Celeron /proc/cpuinfo`
|
|
[ "x$grep_cpu" != "x" ] && CPU="Celeron"
|
|
grep_cpu=`grep Atom /proc/cpuinfo`
|
|
[ "x$grep_cpu" != "x" ] && CPU="Atom"
|
|
echo "EEEPC_CPU=\"$CPU\"" >> /etc/conf.d/acpi-eeepc-generic.conf
|
|
fi
|
|
}
|
|
|
|
### Return brightness level percentage ##########################
|
|
function brightness_get_percentage() {
|
|
actual_brightness=`cat ${eee_backlight}/actual_brightness`
|
|
maximum_brightness=`cat ${eee_backlight}/max_brightness`
|
|
echo $((10000*$actual_brightness / (100*$maximum_brightness) ))
|
|
}
|
|
|
|
### Set the brightness level percentage #########################
|
|
function brightness_set_percentage() {
|
|
#actual_brightness=`cat ${eee_backlight}/actual_brightness`
|
|
maximum_brightness=`cat ${eee_backlight}/max_brightness`
|
|
to_set=$(( $1 * $maximum_brightness / 100 ))
|
|
#echo "max = $maximum_brightness"
|
|
#echo "now = $actual_brightness"
|
|
#echo "1 = $1"
|
|
#echo "to set = $to_set"
|
|
echo $to_set > ${eee_backlight}/brightness
|
|
}
|
|
|
|
### Save brightness #############################################
|
|
function save_brightness() {
|
|
cat ${eee_backlight}/brightness > ${EEEPC_VAR}/states/brightness
|
|
}
|
|
|
|
### Restore brightness ##########################################
|
|
function restore_brightness() {
|
|
cat ${EEEPC_VAR}/states/brightness > ${eee_backlight}/brightness
|
|
}
|
|
|
|
### Set brightness (absolute value) #############################
|
|
function brightness_set_absolute() {
|
|
echo $1 > ${eee_backlight}/brightness
|
|
}
|
|
|
|
### Get direction of brightness change ##########################
|
|
function brightness_find_direction() {
|
|
actual_brightness=`cat ${eee_backlight}/actual_brightness`
|
|
previous_brightness=`cat ${EEEPC_VAR}/states/brightness`
|
|
[ "x$previous_brightness" == "x" ] && previous_brightness=$actual_brightness
|
|
to_return=""
|
|
[ $actual_brightness -lt $previous_brightness ] && to_return="down"
|
|
[ $actual_brightness -gt $previous_brightness ] && to_return="up"
|
|
echo $actual_brightness > ${EEEPC_VAR}/states/brightness
|
|
echo $to_return
|
|
}
|
|
|
|
### Print generic debug information #############################
|
|
function print_generic_debug() {
|
|
echo "DEBUG: EeePC model: $EEEPC_MODEL ($EEEPC_CPU)"
|
|
echo "DEBUG: BIOS version: `dmidecode | grep -A 5 BIOS | grep Version | awk '{print ""$2""}'`"
|
|
echo "DEBUG: Running kernel: `uname -a`"
|
|
if [ -e /usr/bin/pacman ]; then
|
|
echo "DEBUG: Installed kernel(s):"
|
|
/usr/bin/pacman -Qs kernel26
|
|
fi
|
|
|
|
if [ ${#DRIVERS[@]} -gt 1 ]; then
|
|
plural="s"
|
|
else
|
|
plural=""
|
|
fi
|
|
echo "DEBUG ($0): Driver${plural}: ${DRIVERS[@]} (${#DRIVERS[@]})"
|
|
echo "DEBUG ($0): is enabled: ${IS_ENABLED}"
|
|
|
|
if [ "x${INTERFACE}" != "x" ]; then
|
|
echo "DEBUG ($0): interface: ${INTERFACE}"
|
|
fi
|
|
|
|
if [ "${SYS_IS_PRESENT}" == "yes" ]; then
|
|
echo "DEBUG ($0): /sys device: ${SYS_DEVICE}"
|
|
echo "DEBUG ($0): /sys state: ${SYS_STATE}"
|
|
else
|
|
echo "DEBUG ($0): /sys device is not present"
|
|
fi
|
|
|
|
if [ "${RFKILL_IS_PRESENT}" == "yes" ]; then
|
|
echo "DEBUG ($0): rfkill switch: ${RFKILL_SWITCH}"
|
|
echo "DEBUG ($0): rfkill state: ${RFKILL_STATE}"
|
|
else
|
|
echo "DEBUG ($0): rfkill switch is not present"
|
|
fi
|
|
|
|
echo "DEBUG ($0): COMMANDS_PRE_UP:"
|
|
print_commands "${COMMANDS_PRE_UP[@]}"
|
|
echo "DEBUG ($0): COMMANDS_POST_UP:"
|
|
print_commands "${COMMANDS_POST_UP[@]}"
|
|
echo "DEBUG ($0): COMMANDS_PRE_DOWN:"
|
|
print_commands "${COMMANDS_PRE_DOWN[@]}"
|
|
echo "DEBUG ($0): COMMANDS_POST_DOWN:"
|
|
print_commands "${COMMANDS_POST_DOWN[@]}"
|
|
|
|
if [ "x${INTERFACE}" != "x" ]; then
|
|
interface_notify_msg="
|
|
interface: ${INTERFACE}"
|
|
fi
|
|
|
|
if [ "${SYS_IS_PRESENT}" == "yes" ]; then
|
|
SYS_MESSAGE="/sys device: ${SYS_DEVICE}
|
|
/sys state: ${SYS_STATE}"
|
|
else
|
|
SYS_MESSAGE="/sys device is not present"
|
|
fi
|
|
|
|
if [ "${RFKILL_IS_PRESENT}" == "yes" ]; then
|
|
RFKILL_MESSAGE="rfkill switch: ${RFKILL_SWITCH}
|
|
rfkill state: ${RFKILL_STATE}"
|
|
else
|
|
RFKILL_MESSAGE="rfkill switch is not present"
|
|
fi
|
|
|
|
eeepc_notify "${NAME}
|
|
Driver${plural}: ${DRIVERS[@]}
|
|
is enabled: ${IS_ENABLED} ${interface_notify_msg}
|
|
${SYS_MESSAGE}
|
|
${RFKILL_MESSAGE}" ${ICON} 10000
|
|
}
|
|
|
|
### Toggle the device on and off ################################
|
|
function device_toggle {
|
|
if [ "${IS_ENABLED}" == "yes" ]; then
|
|
device_off 1
|
|
else
|
|
device_on 1
|
|
fi
|
|
}
|
|
|
|
### Restore a device ############################################
|
|
function device_restore() {
|
|
if [ "${SAVED_STATE}" == "1" ]; then
|
|
device_on 1 0
|
|
else
|
|
device_off 1 0
|
|
fi
|
|
}
|
|
|
|
### Check /sys interface ########################################
|
|
function check_sys_interface() {
|
|
SYS_DEVICE="${sys_path}/${SYS_NAME}"
|
|
if [ -e ${SYS_DEVICE} ]; then
|
|
SYS_IS_PRESENT="yes"
|
|
# Get sys state (0 = card off, 1 = card on)
|
|
SYS_STATE=$(cat ${SYS_DEVICE})
|
|
else
|
|
# Some models do not have any such device (1000HE)
|
|
SYS_IS_PRESENT="no"
|
|
SYS_STATE=""
|
|
fi
|
|
}
|
|
|
|
### Check rfkill switch #########################################
|
|
function check_rfkill_switch() {
|
|
if [ -e ${rfkills_path} ]; then
|
|
# Default to the second one
|
|
rfkill="rfkill1"
|
|
for r in `/bin/ls ${rfkills_path}/`; do
|
|
name=`cat ${rfkills_path}/$r/name`
|
|
[ "$name" == "eeepc-${NAME_SMALL}" ] && rfkill=$r
|
|
done
|
|
RFKILL_IS_PRESENT="yes"
|
|
RFKILL_SWITCH="${rfkills_path}/${rfkill}/state"
|
|
# Get rfkill switch state (0 = card off, 1 = card on)
|
|
RFKILL_STATE=$(cat ${RFKILL_SWITCH})
|
|
else
|
|
# rfkill disabled/not present
|
|
RFKILL_IS_PRESENT="no"
|
|
RFKILL_SWITCH=""
|
|
RFKILL_STATE=0
|
|
fi
|
|
}
|
|
|
|
### Detect if card is enabled or disabled #######################
|
|
function detect_if_enabled() {
|
|
if [[ "${SYS_IS_PRESENT}" == "yes" && "${RFKILL_IS_PRESENT}" == "yes" ]]; then
|
|
# Both are present, no problem!
|
|
|
|
# States of both should match. Else we have a problem...
|
|
if [[ "${SYS_STATE}" == "1" && "${RFKILL_STATE}" == "1" ]]; then
|
|
IS_ENABLED="yes"
|
|
elif [[ "${SYS_STATE}" == "0" && "${RFKILL_STATE}" == "0" ]]; then
|
|
IS_ENABLED="no"
|
|
else
|
|
msg="ERROR in $0: /sys interface state (${SYS_STATE}) and rfkill switch state (${RFKILL_STATE}) do not match!"
|
|
logger "$msg"
|
|
eeepc_notify "$msg" stop
|
|
exit 1
|
|
fi
|
|
else
|
|
# One of the two is not present. Just get the state of the other
|
|
if [[ "${SYS_IS_PRESENT}" == "yes" && "${SYS_STATE}" == "1" ]]; then
|
|
IS_ENABLED="yes"
|
|
elif [[ "${RFKILL_IS_PRESENT}" == "yes" && "${RFKILL_STATE}" == "1" ]]; then
|
|
IS_ENABLED="yes"
|
|
else
|
|
IS_ENABLED="no"
|
|
fi
|
|
fi
|
|
}
|
|
|
|
### Load saved state from file ##################################
|
|
function load_saved_state() {
|
|
SAVED_STATE_FILE=${EEEPC_VAR}/states/${NAME_SMALL}
|
|
if [ -e $SAVED_STATE_FILE ]; then
|
|
SAVED_STATE=$(cat $SAVED_STATE_FILE)
|
|
else
|
|
SAVED_STATE=0
|
|
fi
|
|
}
|
|
|
|
### Turn of device ##############################################
|
|
function device_on {
|
|
# First argument ($1): Number of times the funciton has been called
|
|
# Second argument ($2): Should we show notifications?
|
|
|
|
# Check if 2nd argument to given to function is "0" and disable
|
|
# notifications,
|
|
show_notifications=1
|
|
[ "$2" == "0" ] && show_notifications=0
|
|
|
|
[ "${IS_ENABLED}" == "yes" ] && \
|
|
eeepc_notify "${NAME} already turned on!" ${ICON} && \
|
|
return 0
|
|
|
|
[ "$show_notifications" == "1" ] && \
|
|
eeepc_notify "Turning ${NAME} on..." ${ICON}
|
|
|
|
# Execute pre-up commands just once
|
|
[ $1 -eq 1 ] && \
|
|
execute_commands "${COMMANDS_PRE_UP[@]}"
|
|
|
|
# Enable rfkill switch (which might fail on less then 2.6.29)
|
|
if [ "${RFKILL_IS_PRESENT}" == "yes" ]; then
|
|
echo 1 > ${RFKILL_SWITCH}
|
|
|
|
if [ ${KERNEL_rel} -lt 29 ]; then
|
|
s="rfkill switch usage might fail on kernel lower than 2.6.29"
|
|
logger "$s"
|
|
echo "$s"
|
|
fi
|
|
fi
|
|
|
|
if [ "x$INTERFACE" != "x" ]; then
|
|
# Put interface up and wait 1 second
|
|
eval ${INTERFACE_UP}
|
|
sleep 1
|
|
fi
|
|
|
|
# Load module(s)
|
|
[ "${DRIVERS_LOAD}" != "no" ] && load_modules "${DRIVERS[@]}"
|
|
|
|
success=$?
|
|
if [ $success ]; then
|
|
# If successful, enable card
|
|
[ "${SYS_IS_PRESENT}" == "yes" ] && \
|
|
echo 1 > ${SYS_DEVICE}
|
|
|
|
# Save the card state
|
|
echo 1 > $SAVED_STATE_FILE
|
|
|
|
# Execute post-up commands
|
|
execute_commands "${COMMANDS_POST_UP[@]}"
|
|
|
|
[ "$show_notifications" == "1" ] && \
|
|
eeepc_notify "${NAME} is now on" ${ICON}
|
|
else
|
|
# If module loading was not successful...
|
|
|
|
[ "$show_notifications" == "1" ] && \
|
|
eeepc_notify "Could not enable ${NAME}" stop
|
|
|
|
# Try again
|
|
if [ $1 -lt $TOGGLE_MAX_TRY ]; then
|
|
[ "$show_notifications" == "1" ] && \
|
|
eeepc_notify "Trying again in 2 second ($(($1+1)) / $TOGGLE_MAX_TRY)" ${ICON}
|
|
sleep 2
|
|
device_on $(($1+1)) $show_notifications
|
|
fi
|
|
fi
|
|
}
|
|
|
|
### Turn off device #############################################
|
|
function device_off {
|
|
# First argument ($1): Number of times the funciton has been called
|
|
# Second argument ($2): Should we show notifications?
|
|
|
|
# Check if 2nd argument given to function is "0" and disable
|
|
# notifications.
|
|
show_notifications=1
|
|
[ "$2" == "0" ] && show_notifications=0
|
|
|
|
[ "${IS_ENABLED}" == "no" ] && \
|
|
eeepc_notify "${NAME} already turned off!" ${ICON} && \
|
|
return 0
|
|
|
|
[ "$show_notifications" == "1" ] && \
|
|
eeepc_notify "Turning ${NAME} off..." ${ICON}
|
|
|
|
# Execute pre-down commands just once
|
|
[ $1 -eq 1 ] && \
|
|
execute_commands "${COMMANDS_PRE_DOWN[@]}"
|
|
|
|
if [ "x$INTERFACE" != "x" ]; then
|
|
# Put interface down and wait 1 second
|
|
eval ${INTERFACE_DOWN}
|
|
sleep 1
|
|
fi
|
|
|
|
if [ "${RFKILL_IS_PRESENT}" == "yes" ]; then
|
|
# If rfkill switch exists
|
|
|
|
# Disable the card via rfkill switch
|
|
echo 0 > ${RFKILL_SWITCH}
|
|
|
|
if [ ${KERNEL_rel} -lt 29 ]; then
|
|
s="rfkill switch usage might fail on kernel lower than 2.6.29"
|
|
logger "$s"
|
|
echo "$s"
|
|
fi
|
|
fi
|
|
|
|
# If /sys device exists, disable it too
|
|
[ "${SYS_IS_PRESENT}" == "yes" ] && \
|
|
echo 0 > ${SYS_DEVICE}
|
|
|
|
# Save the card states
|
|
echo 0 > $SAVED_STATE_FILE
|
|
|
|
# Unload module(s)
|
|
[ "${DRIVERS_UNLOAD}" != "no" ] && unload_modules "${DRIVERS[@]}"
|
|
|
|
# Execute post-down commands
|
|
execute_commands "${COMMANDS_POST_DOWN[@]}"
|
|
|
|
[ "$show_notifications" == "1" ] && \
|
|
eeepc_notify "${NAME} is now off" ${ICON}
|
|
}
|
|
|
|
### Block suspend if certain programs are running ###############
|
|
function suspend_check_blacklisted_processes() {
|
|
processes=( "$@" )
|
|
p_num=${#processes[@]}
|
|
logger "Checking for processes before suspending: $processes ($p_num)"
|
|
for ((i=0;i<${p_num};i++)); do
|
|
p=${processes[${i}]}
|
|
pid=`pidof $p`
|
|
logger "process #$i: $p ($pid)"
|
|
echo "process #$i: $p ($pid)"
|
|
if [ "x$pid" != "x" ]; then
|
|
echo "$p is running! Canceling suspend"
|
|
logger "$p is running! Canceling suspend"
|
|
eeepc_notify "$p is running! Canceling suspend" stop 5000
|
|
exit 0
|
|
fi
|
|
done
|
|
}
|
|
|
|
### Get username ################################################
|
|
if [ -S /tmp/.X11-unix/X0 ]; then
|
|
export DISPLAY=:0
|
|
|
|
# Detect logged in user by using "who"
|
|
user=$(who | sed -n '/ (:0[\.0]*)$\| :0 /{s/ .*//p;q}')
|
|
# If there is a space in $user, autodetection failed, so clear it.
|
|
[ "x`echo $user | grep ' '`" != "x" ] && user=""
|
|
|
|
# If autodetection fails, try another way...
|
|
# Take first reported by "who"
|
|
#[ "x$user" == "x" ] && user=$(who | head -1 | awk '{print $1}')
|
|
# If there is a space in $user, autodetection failed, so clear it.
|
|
#[ "x`echo $user | grep ' '`" != "x" ] && user=""
|
|
|
|
# If autodetection fails, try another way...
|
|
# Take users reported by "who" and return uniq values
|
|
[ "x$user" == "x" ] && user=$(who | awk '{print $1}' | uniq)
|
|
# If there is a space in $user, autodetection failed, so clear it.
|
|
[ "x`echo $user | grep ' '`" != "x" ] && user=""
|
|
|
|
# If autodetection fails, try another way...
|
|
# Get user who executed startx. Might not work if a login
|
|
# manager (GDM,KDM,etc.) is used.
|
|
[ "x$user" == "x" ] && user=$(ps aux | grep '[x]init /home' | awk '{print $1}' | head -1)
|
|
# If there is a space in $user, autodetection failed, so clear it.
|
|
[ "x`echo $user | grep ' '`" != "x" ] && user=""
|
|
|
|
# If autodetection fails, fallback to default user
|
|
# set in /etc/conf.d/acpi-eeepc-generic.conf
|
|
[ "x$user" == "x" ] && user=$XUSER
|
|
|
|
# As a last resort, check all processes and their owning user,
|
|
# filtering known users.
|
|
[ "x$user" == "x" ] && user=$(ps aux | awk '{print ""$1""}' | \
|
|
sort | uniq | \
|
|
grep -v \
|
|
-e avahi -e bin -e dbus -e ftp-e hal -e nobody \
|
|
-e ntp -e nx -e policykit -e privoxy -e root \
|
|
-e tor -e USER
|
|
)
|
|
# If there is a space in $user, autodetection failed, so clear it.
|
|
[ "x`echo $user | grep ' '`" != "x" ] && user=""
|
|
|
|
# If user is _still_ empty, notify the user to set XUSER in
|
|
# configuration file.
|
|
[ "x$user" == "x" ] && \
|
|
eeepc_notify "User autodetection failed. Please edit \
|
|
your configuration file (/etc/conf.d/acpi-eeepc-generic.conf) \
|
|
and set XUSER variable to your username." stop 20000
|
|
|
|
# If user is detected correctly (not empty), set variables
|
|
# accordingly.
|
|
if [ "x$user" != "x" ]; then
|
|
home=$(getent passwd $user | cut -d: -f6)
|
|
fi
|
|
# If XAUTHORITY is not set, put a default value of
|
|
# $home/.Xauthority. Else, take that value.
|
|
XAUTHORITY=${XAUTHORITY:-$home/.Xauthority}
|
|
[ -f $XAUTHORITY ] && export XAUTHORITY
|
|
fi
|
|
|
|
### End of file #################################################
|
|
|