在Fedora上管理您的笔记本电脑的热键

在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链接

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏