目前,随着Linux操作系统hal的探测和适配功能的不断强大,Thinkpad笔记本还是IBM笔记本的许多快捷键都可以很方便,很快捷的直接使用,但是,也有部分功能键需要用户自己去手工的设置一下,这也许就是Linux不太完善的原因吧。还需要大家不断的完善呀!

在Linux系统下,多显示输出的问题,不用多想,这肯定是与显卡驱动有很大的关系的,这的确是如此的,多显示输出的确是与显卡驱动有关系的。目前从Linux系统下使用的显卡驱动来说,大致上有两种显卡驱动模式,一种是官方驱动,这种驱动是有显卡芯片制造公司提供的,这种驱动的优点在于显卡驱动能够充分发挥显卡的性能,并且使用起来比较稳定。但是也有不少弊端,第一,驱动内容虽然老是在更新,但是都只是为了支持新出的产品,已经很久没有更新实质性的内容了,所以社区的许多新特性在这些驱动上无法使用。拿NVIDIA驱动来说,该驱动虽然能够与大部分机器充分适合,但是该驱动把所有的显示器都当作是CRT显示器处理了,所以在一些液晶显示器上,我们会看到“超出显示范围”这样的字样,很麻烦【不过这个问题是可以解决的】。再拿ATI的官方驱动来说,该驱动目前还不支持Fedora 9,Fedora 10这些最新的社区版本。这对部分喜欢Fedora的人来说,的确是件麻烦事,希望Fedora与ATI的朋友们能够尽快改进这个问题。第二,对显示器的输出考虑的不周全,也正是因为这个原因,导致所有使用官方驱动的显卡都无法使用下面的第二种设置方法。因此使用官方驱动时多显示器输出的设置方法还需要大家帮忙琢磨一下。

第二种显卡驱动就是Linux社区提供的驱动,常见的是X.org提供的。这种显卡驱动虽然不能够全面的发挥显卡的性能,但是能够很好的与社区融合,与底层的图形系统很好的摩擦在一起。而且这种驱动对多显示输出的支持比较好。

好了言归正传,下面开始介绍Thinkpad笔记本上多显示输出的适配方法。

<!--[if !supportLists]-->一、 <!--[endif]-->简单方法:

 
这个方法虽然很简单,但是用于与快捷键的直接绑定,还是有点麻烦。不过这对应不常用的用户来说,还是比较快捷的。那么是怎么样的呢?
<!--[if !supportLists]-->1. <!--[endif]-->使用grandr工具来设置。
Grandr工具是一个图形化的工具,当你接入两个或者多个显示器以后,打开grandr工具,在其中就可以看到你所接的所有显示器,只要在里面将要输出的显示器制定即可。很方便;
<!--[if !supportLists]-->2. <!--[endif]-->使用xrandr工具来设置。
Xrandr工具是Xorg自带的一个字符工具,这个工具不仅能够在当前的显示下设置多分辨率的设置,而且还能够实现多个显示器的自动切换。具体的设置步骤如下:
<!--[if !supportLists]-->a) <!--[endif]-->执行xrandr –q

命令来查看当前接入的显示器情况。如果你有多个显示器的话,你不仅能够看到你接入的显示器,而且还能够看到各个显示器下能够支持到的分辨率。

注意:在xrandr的输出信息中,各个显示器显示的不是显示器的名称,而是显示的是他们的接口名称。当然如果是这样的接口有多个,则会以数字来做区分的。不过一般的笔记本也就带一到三个不同的接口而已。

<!--[if !supportLists]-->b) <!--[endif]-->执行xrandr –output VGA –auto来输出到自己想输出的显示器上。

其中VGA,LVDS,S-video都是显示器接口类型,这要根据实际情况来定。其中—auto是指根据显示器与显卡驱动共同能够支持的分辨率,选择一个最佳分辨率输出。而这个最佳分辨率一般是以显示器的BIOS值为准。因为目前常用的分辨率,显卡驱动都能够支持到。

如果有多个显示器同时要输出,只需要在xrandr后面多个几个—output 显示器接口 –auto就可以了。

如果对输出到显示器上的分辨率不满意的话,还可以制定一个特定的分辨率,不过要注意的是,要输出分辨率必须是在xrandr –q中该显示器下能够支持到的分辨率。该参数就是—mode。具体的命令是:xrandr –output VGA –mode 1024x768。

要关闭在某个显示器上的输出,可以采用 –off参数来关闭。具体的命令是xrandr –output VGA –off。

Xrandr的常用参数介绍:

-q: 查询当前能够切换的显示器已经分辨率的支持情况;

-s 分辨率: 切换到一个指定的分辨率下。这只适合单个显示器的情况;

--output 接口名称: 指定要处理的显示器。这需要结合具体的操作来进行;

--auto: 自动选择一个最佳分辨率输出到该显示器上;

--mode 分辨率: 根据指定的分辨率输出;

--off: 关闭在该显示器上的输出。

<!--[if !supportLists]-->二、 <!--[endif]-->好的设置方法:



这个方法是针对那种想一次性绑定到快捷键上,以后常用的。具体的设置步骤如下:

<!--[if !supportLists]-->1. <!--[endif]-->设置acpi:
创建一个新文件/etc/acpi/events/thinkpad.conf,内容是:
event=ibm/hotkey HKEY 00000080 00001007
action=/usr/local/sbin/thinkpad-fn-f7
如果是ubuntu系统,请修改文件/etc/acpi/events/ibm-videobtn的内容为:
# /etc/acpi/events/ibm-videobtn
# This is called when the user presses the video button. It is currently
# a placeholder.
event=ibm/hotkey HKEY 00000080 00001007
action=/bin/true

创建文件/etc/acpi/resume.d/91-ibm-hotkey-enable.sh,在其中输入:
#!/bin/bash
# enable ibm-hotkeys (specifically Fn2, Fn7)
# 12 bit mask, little end is F1 default 0x<chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="80" unitname="C" w:st="on">080c</chmetcnv> = F12+F4+F3
echo enable,0x084e > /proc/acpi/ibm/hotkey

这里的主要工作是,将Fn+F7快捷键绑定在acpi中。
<!--[if !supportLists]-->2. <!--[endif]-->创建/usr/local/sbin/thinkpad-fn-f7脚本:
#!/bin/bash 


# External output may be "VGA" or "VGA-0" or "DVI-0" or "TMDS-1" 

EXTERNAL_OUTPUT="VGA" 

INTERNAL_OUTPUT="LVDS" 

EXTERNAL_LOCATION="left" 


# Figure out which user and X11 display to work on 

# TODO there has to be a better way to do this? 

X_USER=$(w -h -s | grep ":[0-9]/W" | head -1 | awk '{print $1}') 

export DISPLAY=$(w -h -s | grep ":[0-9]/W" | head -1 | awk '{print $3}') 


# Switch to X user if necessary 

if [ "$X_USER" != "$USER" ]; then 

 SU="su $X_USER -c" 

else 

 SU="sh -c" 

fi 


case "$EXTERNAL_LOCATION" in 

 left|LEFT) 

 EXTERNAL_LOCATION="--left-of $INTERNAL_OUTPUT" 

 ;; 

 right|RIGHT) 

 EXTERNAL_LOCATION="--right-of $INTERNAL_OUTPUT" 

 ;; 

 top|TOP|above|ABOVE) 

 EXTERNAL_LOCATION="--above $INTERNAL_OUTPUT" 

 ;; 

 bottom|BOTTOM|below|BELOW) 

 EXTERNAL_LOCATION="--below $INTERNAL_OUTPUT" 

 ;; 

 *) 

 EXTERNAL_LOCATION="--left-of $INTERNAL_OUTPUT" 

 ;; 

esac 


# Figure out current state 

INTERNAL_STATE=$($SU xrandr | grep ^$INTERNAL_OUTPUT | grep " con" | sed "s/.*connected//" | sed "s/ //" | sed "s/ .*//g") 

EXTERNAL_STATE=$($SU xrandr | grep ^$EXTERNAL_OUTPUT | grep " con" | sed "s/.*connected//" | sed "s/ //" | sed "s/ .*//g") 


if [ -z "$INTERNAL_STATE" -o $INTERNAL_STATE = "(normal" ]; then 

 STATE="external" 

elif [ -z "$EXTERNAL_STATE" -o $EXTERNAL_STATE = "(normal" ]; then 

 STATE="internal" 

else 

 INTERNAL_STATE=$(echo $INTERNAL_STATE | sed "s/[0-9]*x[0-9]*//") 

 EXTERNAL_STATE=$(echo $EXTERNAL_STATE | sed "s/[0-9]*x[0-9]*//") 

 if [ "$INTERNAL_STATE" = "$EXTERNAL_STATE" ]; then 

 STATE="both" 

 else 

 STATE="mirror" 

 fi 

fi 


if [ -f /tmp/switch -a $STATE != "internal" ]; then 

 STATE="mirror" 

fi 

function screen_external(){ 

 $SU "xrandr --output $INTERNAL_OUTPUT --off" 

 $SU "xrandr --output $EXTERNAL_OUTPUT --auto" 

 rm -f /tmp/switch 

} 


function screen_internal(){ 

 $SU "xrandr --output $EXTERNAL_OUTPUT --off" 

 $SU "xrandr --output $INTERNAL_OUTPUT --auto" 

 touch /tmp/switch 

} 


function screen_mirror(){ 

 $SU "xrandr --output $INTERNAL_OUTPUT --auto" 

 $SU "xrandr --output $EXTERNAL_OUTPUT --auto --same-as $INTERNAL_OUTPUT" 

} 


function screen_both(){ 

 $SU "xrandr --output $INTERNAL_OUTPUT --auto" 

 $SU "xrandr --output $EXTERNAL_OUTPUT --auto $EXTERNAL_LOCATION" 

} 


function screen_toggle(){ 

 case "$STATE" in 

 internal) 

 screen_mirror 

 ;; 

 mirror) 

 screen_external 

 ;; 

 external) 

 screen_both 

 ;; 

 both) 

 screen_internal 

 ;; 

 *) 

 screen_internal 

 ;; 

 esac 

} 


# What should we do? 

DO="$1" 

if [ -z "$DO" ]; then 

 if [ $(basename $0) = "thinkpad-fn-f7" ]; then 

 DO="toggle" 

 fi 

fi 


case "$DO" in 

 toggle) 

 screen_toggle 

 ;; 

 internal) 

 screen_internal 

 ;; 

 external) 

 screen_external 

 ;; 

 mirror) 

 screen_mirror 

 ;; 

 both) 

 screen_both 

 ;; 

 status) 

 echo "Current Fn-F7 state is: $STATE" 

 echo 

 echo "Attached monitors:" 

 $SU xrandr | grep "/Wconnected" | sed "s/^/ /" 

 ;; 

 *) 

 echo "usage: $0 <command>" >&2 

 echo >&2 

 echo " commands:" >&2 

 echo " status" >&2 

 echo " internal" >&2 

 echo " external" >&2 

 echo " mirror" >&2 

 echo " both" >&2 

 echo " toggle" >&2 

 echo >&2 

 ;; 

esac 



set permissions and restart acpi 



<!--[if !supportLists]-->3. <!--[endif]-->

修改脚本权限:

修改脚本的权限为可执行,具体命令是:sudo chmod 755 /usr/local/sbin/thinkpad-fn-f7
重启acpi服务,具体命令是:sudo service acpid restart

<!--[if !supportLists]-->三、 <!--[endif]-->参考文献:



http://www.thinkwiki.org/wiki/Sample_Fn-F7_script

http://www.thinkwiki.org/wiki/Install_Ubuntu_8.10_(Intrepid_Ibex)_on_a_Thinkpad_T400

http://www.thinkwiki.org/wiki/ThinkWiki

http://www.thinkwiki.org/wiki/How_to_get_special_keys_to_work