Sample Fn-F7 script
From ThinkWiki
This setup will let you use fn-F7 key combination to toggle between internal, mirror, external, or both screens. Tested on ThinkPad X60s running Fedora 8.
Create /etc/acpi/events/thinkpad.conf:
# fn-F7 event=ibm/hotkey HKEY 00000080 00001007 action=/usr/local/sbin/thinkpad-fn-f7
Create /usr/local/sbin/thinkpad-fn-f7:
Note: you will have change EXTERNAL_OUTPUT and INTERNAL_OUTPUT to what xrandr shows, for example VGA and LVDS in this case:
xrandr | grep connected VGA connected 1600x1200+0+0 (normal left inverted right x axis y axis) 432mm x 324mm LVDS connected (normal left inverted right x axis y axis)
#!/bin/sh #@ seva sevatech.com EXTERNAL_OUTPUT=VGA INTERNAL_OUTPUT=LVDS EXTERNAL_LOCATION="--left-of $INTERNAL_OUTPUT" # This is to figure out which X11 display to work on SU="su $(w -h -s | grep ":[0-9]" | head -1 | awk '{print $1}') -c" export DISPLAY=$(w -h -s | grep ":[0-9]" | head -1 | awk '{print $3}') # Save the state to the file until we can figure it out by running xrandr STATE_FILE=/var/lib/thinkpad/screen.state; if [ ! -e $STATE_FILE ]; then echo "internal" > $STATE_FILE fi STATE=$(cat $STATE_FILE) function screen_external(){ $SU "xrandr --output $INTERNAL_OUTPUT --off" $SU "xrandr --output $EXTERNAL_OUTPUT --auto" echo "external" > $STATE_FILE } function screen_internal(){ $SU "xrandr --output $EXTERNAL_OUTPUT --off" $SU "xrandr --output $INTERNAL_OUTPUT --auto" echo "internal" > $STATE_FILE } function screen_mirror(){ $SU "xrandr --output $INTERNAL_OUTPUT --auto" $SU "xrandr --output $EXTERNAL_OUTPUT --auto --same-as $INTERNAL_OUTPUT" echo "mirror" > $STATE_FILE } function screen_both(){ $SU "xrandr --output $INTERNAL_OUTPUT --auto" $SU "xrandr --output $EXTERNAL_OUTPUT --auto $EXTERNAL_LOCATION" echo "both" > $STATE_FILE } 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 DO=$(basename $0) fi if [ -z "$DO" ]; then DO="internal" fi case "$DO" in toggle|thinkpad-fn-f7) echo wtf screen_toggle ;; internal) screen_internal ;; external) screen_external ;; mirror) screen_mirror ;; both) screen_both ;; status) echo $STATE ;; *) 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 echo " If no command is given default is internal" >&2 ;; esac
As root,
mkdir -p /var/lib/thinkpad echo "internal" > /var/lib/thinkpad/screen.state chmod 755 /usr/local/sbin/thinkpad-fn-f7 service acpid restart