Lubuntu:切换显示的热键

Lubuntu:切换显示的热键

我对 Linux 和 bash 脚本还比较陌生。

我正在尝试在我的旧华硕 EEE 上网本上设置 Fn-F5 键来在内置和外置显示器之间切换。

在以下位置创建一个 bash 脚本~/bin/toggle_displays.sh

    #!/bin/bash

if (xrandr | grep "VGA1 disconnected"); then
# external monitor not connected: do nothing
    xrandr --output LVDS1 --auto --output VGA1 --off 
else
# external monitor connected: toggle monitors
    if (xrandr | grep -E "LVDS1 connected (primary )?\("); then
        xrandr --output LVDS1 --auto --output VGA1 --off
    else
        xrandr --output LVDS1 --off --output VGA1 --auto
    fi
fi

将热键添加到<keyboard>部分~/.config/openbox/lubuntu-rc.xml

...
<keybind key="XF86Display">
  <action name="Execute">
    <command>~/bin/toggle_displays.sh</command>
  </action>
</keybind>
...

问题非常奇怪:当内部显示器处于活动状态时,切换到外部显示器总是有效的。但是当外部显示器处于活动状态时,切换只会使内部显示器上出现黑屏,鼠标光标也出现在屏幕上。更令人惊讶的是,如果我从终端运行脚本而不是使用热键,后一种切换有时会有效。

这可能是什么问题?我该如何调试它?

附注:从终端运行脚本以从外部显示器切换到内部显示器会打印到终端。如果我的脚本中LVDS1 connected primary (normal left inverted right x axis y axis)没有出现这种情况,为什么会发生这种情况?echo

编辑:这是我的xrandr输出(使用外部监视器):

Screen 0: minimum 8 x 8, current 1680 x 1050, maximum 32767 x 32767
LVDS1 connected primary (normal left inverted right x axis y axis)
   1024x600       60.0 +
   800x600        60.3     56.2  
   640x480        59.9  
VGA1 connected 1680x1050+0+0 (normal left inverted right x axis y axis) 473mm x 296mm
   1680x1050      60.0*+
   1600x1200      60.0  
   1280x1024      75.0     60.0  
   1440x900       75.0     59.9  
   1280x800       59.8  
   1152x864       75.0  
   1024x768       75.1     70.1     60.0  
   832x624        74.6  
   800x600        72.2     75.0     60.3     56.2  
   640x480        75.0     72.8     66.7     60.0  
   720x400        70.1  
VIRTUAL1 disconnected (normal left inverted right x axis y axis)

答案1

我自己编写了一个 bash 脚本,用于在笔记本电脑屏幕和外部屏幕之间切换。它会检查哪个屏幕处于打开状态,然后将其关闭,并以其原始分辨率打开另一个屏幕。优点是,它不需要知道屏幕的名称,因为这些名称是从 xrandr 收集的。

#!/bin/bash
#Toggles between two screens. Assuming only one external screen is connected

monitors=`xrandr | grep -P ' connected' | grep -o '^[^ ]*'`
set -- "$monitors"
#monArr contains an array of the id's of the connected screens
declare -a monArr=($*)

#onMon holds the id of the *first* on screen found
onMon=`xrandr --listmonitors | head -2 | grep -oP "[a-zA-Z]*-[0-9]$"`

#offMon holds the id of the other monitor, which is not on
if [ "$onMon" = "${monArr[0]}" ]

then
    offMon=${monArr[1]}
else
    offMon=${monArr[0]}
fi

#Switches the on screen off and vice versa
xrandr --output $offMon --auto --output $onMon --off

相关内容