在Fedora上管理笔记本电脑的热键
版本1.0
作者:Oliver Meyer <o [dot] meyer [at] projektfarm [dot] de>
本文介绍如何使笔记本电脑的热键在Fedora上可用。 我已经使用Fedora 8进行了测试,但它也可以与其他Fedora版本一起使用 - 也可以与其他发行版一起进行一些修改。
这个howto是一个没有任何保证的实用指南 - 它不包括理论背景。 建立这样的系统有许多方法 - 这就是我选择的方式。
1准备
1.1需要的包
我们将使用xbindkeys为不创建ACPI事件的热键分配操作。
- xbindkeys
1.2 Xserver配置
为了能够打开和关闭Touch板,我们必须调整xserver配置(需要root权限)。
vi /etc/X11/xorg.conf
使用标识符“ Synaptics
”搜索“ InputDevice
”部分,并将以下行添加到此部分中。
Option "SHMConfig" "on"
该部分现在应如下所示:
Section "InputDevice" Identifier "Synaptics" Driver "synaptics" Option "Device" "/dev/input/mice" Option "Protocol" "auto-dev" Option "Emulate3Buttons" "yes" Option "SHMConfig" "on" EndSection
之后保存更改并注销并重新进入,使更改生效。
1.3热键事件
我们来看看当我们按下热键时会发生什么。
1.3.1 ACPI
大多数热键像“Fn按钮”将创建一个ACPI事件 - 让我们来看看它们。 跑 ...
acpi_listen
...并按一下热键几次。 你会看到这样的输出:
hotkey ATKD 00000031 0000001a
hotkey ATKD 00000031 0000001b
hotkey ATKD 00000031 0000001c
你可以看到第一个数字(position3)是静态的,第二个数字是动态的。 我们只需要静态号码。 现在按所有的热键一个接一个地写下静态数字 - 你将需要它们。
1.3.2 Xev
一些热键创建一个键码而不是ACPI事件。
xev
一个新的窗口会弹出一个小方块。 将光标移动到正方形中,然后按前面步骤中没有创建ACPI事件的所有热键。 在这段时间内不要移动鼠标 - 否则会看到许多由鼠标移动引起的事件,而不是热键。 您将在终端窗口中看到每个热键的键码 - 它可能如下所示:
KeyPress event, serial 30, synthetic NO, window 0x3a00001,
root 0x13b, subw 0x3a00002, time 3282991713, (49,43), root:(1105,203),
state 0x0, keycode 162 (keysym 0x0, NoSymbol), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
KeyRelease event, serial 30, synthetic NO, window 0x3a00001,
root 0x13b, subw 0x3a00002, time 3282991781, (49,43), root:(1105,203),
state 0x0, keycode 162 (keysym 0x0, NoSymbol), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
记下键码 - 你以后需要它们。
2处理ACPI事件
首先,我们必须告诉ACPI事件处理程序,我们将在一段时间内创建的特殊脚本将在按下热键(需要root权限)时执行。
vi /etc/acpi/events/hotkeys.conf
内容应如下所示:
# Hotkey configuration event=hotkey (ATKD|HOTK)* action=/etc/acpi/actions/hotkeys.sh %e
接下来,我们创建一个特殊的脚本来处理热键事件(需要root权限)。
vi /etc/acpi/events/hotkeys.sh
在下面我将描述脚本的单个部分。 首先,我们必须定义shell和脚本必须搜索要执行的应用程序的路径。
#!/bin/sh
PATH=/sbin:/bin:/usr/bin
该脚本能够在多用户系统上处理多个会话。 如果您是系统上唯一的用户,请在相应的字段中输入用户名。
# Possible values:
# "0" = multi user system
# "your_username" = single user system
user="0"
这是在多用户系统上检测当前活动会话的用户的部分 - 这里无法调整。
# Detect the currently active user on multi user systems
checkuser()
{
if [ $user = "0" ]
then
uid_session=$(
ck-list-sessions | \
awk '
/^Session[0-9]+:$/ { uid = active = x11 = "" ; next }
{ gsub(/'\''/, "", $3) }
$1 == "uid" { uid = $3 }
$1 == "active" { active = $3 }
$1 == "x11-display" { x11 = $3 }
active == "TRUE" && x11 != "" {
print uid
exit
}'
)
user_data=(`cat /etc/passwd | grep $uid_session | tr ':' ' '`)
user=${user_data[0]}
fi
}
现在我们到达了有趣的部分 - 在这里我们将为热键分配操作。 记住第1步.3.1中的热键事件 - ACPI事件的第三个位置包含我们需要区分事件的静态数字。 因为我们将整个ACPI事件传递给这个脚本,我们必须告诉脚本它必须使用事件的第三个位置 - 这是$ 3
。
# Assign actions to the hotkeys
case $3 in
以下热键配置是我的笔记本电脑(华硕G1S)的示例,因此您必须更换事件号码,以便它们适合您的系统。 我们将从电子邮件客户端Evolution开始。 当我在笔记本电脑上按电子邮件热键时,静态事件编号为00000050
。 当按下按钮时,将调用功能“ checkuser
”来检测当前激活的会话的用户。 之后,脚本将作为当前活动会话的用户执行Evolution,并将输出发送到nirvana :)这非常重要 - 否则,应用程序将阻止脚本,直到您关闭应用程序。 因此,请勿忘记在执行运行的应用程序的命令之前添加“ &> / dev / null&
”,直到关闭它,并将“ &> /> / dev / null
”添加到创建输出的其他应用程序。
#开始进化(电子邮件按钮)
00000050)
检查用户
su - $ user -c“evolution --component = mail&> / dev / null&”
;;
webbrowser的配置几乎等于上面的配置。
#启动Firefox(浏览器按钮)
00000051)
检查用户
su - $ user -c“firefox&> / dev / null&”
;;
现在我们到达了Touch板配置。 许多笔记本电脑有一个额外的热键的Touch板 - 我们将使用synclient
切换我们的Touch板打开和关闭,当这个热键被按下(我们在第1步.2激活了synclient)。 这是用户独立的,所以不需要调用“ checkuser
”功能。
#关闭Touch板|(Touch板按钮)
0000006b)
tp_status =(`synclient -l | grep TouchpadOff`)
if [ ${tp_status[2]} = "1" ]
then synclient TouchpadOff=0
else synclient TouchpadOff=1
fi
;;
接下来,我们必须配置用于降低和提高音量的热键。 这也是用户独立的,因为只有一个声卡可以控制(在大多数系统上)。
#较低音量(Fn + F11)
00000031)
amixer sset Master Playback Volume 5% - &gt; / dev / null
;;
# Raise volume (Fn + F12)
00000030)
amixer sset Master Playback Volume 5%+ &> /dev/null
;;
我们将使用解决方法来静音音量,因为amixer的真正静音功能会导致一个大问题 - 大多数播放器会在您使用它时崩溃。 当静音热键被按下时,脚本看起来如果声音在此刻被激活,如果是,它将当前状态写入文件,然后将其设置为0%。 当您再次按此热键(并且音量仍为0%)时,脚本将从文件中获取最后的音量状态并将其还原。
#切换静音(0% - 最后状态)(Fn + F10)
00000032)
snd_status =(`amixer sget Master Playback Volume | egrep“\ [on | off \] $”`)
cur_vol = $(echo $ {snd_status [4]} | tr'[|] |%''')
if [ $cur_vol != "0" ]
then
cat /dev/null > /opt/.volume
echo $cur_vol > /opt/.volume
amixer sset Master Playback Volume 0% &> /dev/null
else
sav_vol=$(cat /opt/.volume)
if [ $sav_vol = "" ]
then amixer sset Master Playback Volume 50% &> /dev/null
else amixer sset Master Playback Volume $sav_vol% &> /dev/null
fi
fi
;;
在最后一步中,我们关闭case子句并退出脚本。
esac
exit 0
现在保存文件并使其可执行。
chmod +x /etc/acpi/events/hotkeys.sh
例如我的系统上的整个脚本,以便更好地了解。
#!/bin/sh PATH=/sbin:/bin:/usr/bin # Possible values: # "0" = multi user system # "your_username" = single user system user="olli" # Detect the currently active user on multi user systems checkuser() { if [ $user = "0" ] then uid_session=$( ck-list-sessions | \ awk ' /^Session[0-9]+:$/ { uid = active = x11 = "" ; next } { gsub(/'\''/, "", $3) } $1 == "uid" { uid = $3 } $1 == "active" { active = $3 } $1 == "x11-display" { x11 = $3 } active == "TRUE" && x11 != "" { print uid exit }' ) user_data=(`cat /etc/passwd | grep $uid_session | tr ':' ' '`) user=${user_data[0]} fi } # Assign actions to the hotkeys case $3 in # Start Evolution (email button) 00000050) checkuser su - $user -c "evolution --component=mail &> /dev/null &" ;; # Start Firefox (browser button) 00000051) checkuser su - $user -c "firefox &> /dev/null &" ;; # Toggle touchpad on|off (touchpad button) 0000006b) tp_status=(`synclient -l | grep TouchpadOff`) if [ ${tp_status[2]} = "1" ] then synclient TouchpadOff=0 echo 1 > /sys/class/leds/asus:touchpad/brightness else synclient TouchpadOff=1 echo 0 > /sys/class/leds/asus:touchpad/brightness fi ;; # Lower volume (Fn + F11) 00000031) amixer sset Master Playback Volume 5%- &> /dev/null ;; # Raise volume (Fn + F12) 00000030) amixer sset Master Playback Volume 5%+ &> /dev/null ;; # Toggle mute (0% - last state) (Fn + F10) 00000032) snd_status=(`amixer sget Master Playback Volume | egrep "\[on|off\]$"`) cur_vol=$(echo ${snd_status[4]} | tr '[|]|%' ' ') if [ $cur_vol != "0" ] then cat /dev/null > /opt/.volume echo $cur_vol > /opt/.volume amixer sset Master Playback Volume 0% &> /dev/null else sav_vol=$(cat /opt/.volume) if [ $sav_vol = "" ] then amixer sset Master Playback Volume 50% &> /dev/null else amixer sset Master Playback Volume $sav_vol% &> /dev/null fi fi ;; esac exit 0
还有一件事要做。 在您启动/重新启动系统后,有一个错误会阻止ACPI守护程序在脚本中执行命令。 您必须在登录到GNOME会话后每次重新启动ACPI守护程序。 我想你不想手动这样做:)所以我找到了一个解决方法(需要root权限)。
vi /etc/gdm/Init/Default
在文件底部添加下列行 - 在退出之前。
# acpid workaround
/etc/init.d/acpid restart
文件的相应部分应如下所示:
[...] # acpid workaround /etc/init.d/acpid restart exit 0
现在,ACPI守护进程将在每次登录后自动重新启动。
3处理Xev事件
也许你在第1步.3.1中找到了一些没有创建ACPI事件的热键,但是在第1步.3.2中也是一个键码事件。 现在是时候配置它们了 - 首先我们必须创建所需的配置文件(没有root权限!)。
xbindkeys --defaults > $HOME/.xbindkeysrc
现在我们来编辑它
vi ~/.xbindkeysrc
您将在文件中看到一个示例配置和一些注释。 配置非常简单 - 只需添加一行即可执行的命令,以及属于此操作的键码( c:%keycode%
)下方。 例如我的笔记本电脑上的配置(几个多媒体热键,如启动/暂停,停止等)。
# MM button actions # MM play/pause "/usr/bin/audacious -p" c:162 # MM stop "/usr/bin/audacious -s" c:164 # MM rewind "/usr/bin/audacious -r" c:144 # MM forward "/usr/bin/audacious -f" c:153
现在保存更改并将xbindkeys( / usr / bin / xbindkeys
)添加到自动启动程序( 系统 - 首选项 - 个人 - 会话
)。 请注意,您必须退出并重新进入才能使更改生效。
4链接
- Fedora: http : //fedoraproject.org/