如何使用快捷键快速切换显示器方向?

如何使用快捷键快速切换显示器方向?

在查看是否有人问过这个问题时,我发现对于 Windows

我想在 Linux/Ubuntu 上做一些类似的事情(快捷方式或终端别名/命令),以便能够快速在横向和纵向模式之间切换外接显示器,而不必去显示器设置并确认配置。

Jacob Vlijm 提供了Python 脚本有效。如果您有其他想法,我很乐意了解。

更新:我已经更新了 Jacob 的脚本,以便能够工作两个屏幕(如果已连接)

答案1

下面的脚本用于切换任一屏幕的旋转:

#!/usr/bin/env python3
import subprocess

# --- set the name of the screen and the rotate direction below
screen = "VGA-1"
rotate = "left"
# ---

matchline = [
    l.split() for l in subprocess.check_output(["xrandr"]).decode("utf-8").splitlines()\
    if l.startswith(screen)
    ][0]
s = matchline[
    matchline.index([s for s in matchline if s.count("+") == 2][0])+1
    ]

rotate = "normal" if s == rotate else rotate
subprocess.call(["xrandr", "--output", screen, "--rotate", rotate])

如何使用

  1. 将脚本复制到一个空文件中,另存为toggle-rotate.py
  2. 在脚本的头部部分,设置:

    • 您想要切换的屏幕的名称(通过在终端中运行命令来查找xrandr
    • 旋转方向,或者leftright在引号之间,如示例中所示)。

      # --- set the name of the screen and the rotate direction below
      screen = "VGA-1"
      rotate = "left"
      # ---
      
  3. 通过命令测试运行它(两次,从终端):

    python3 /path/to/toggle-rotate.py
    
  4. 如果一切正常,请将其添加到快捷键。选择:系统设置 > “键盘” > “快捷键” > “自定义快捷键”。单击“+”并添加命令:

    python3 /path/to/toggle-rotate.py
    

    到您选择的快捷方式...

就是这样。

解释

在命令的输出中xrandr,屏幕的当前旋转(如果有)直接在屏幕位置后提及,例如:

VGA-1 connected 1024x1280+1680+0 left (normal left inverted right x axis y axis) 376mm x 301mm

在示例中,我们看到:1024x1280+1680+0 left。脚本查看脚本头部提到的与屏幕相对应的行。如果屏幕旋转时,脚本运行(xrandr)命令:

xrandr --output <screen_name> --rotate normal

如果不,它运行(例如):

xrandr --output <screen_name> --rotate left

逆时针旋转屏幕

答案2

我一直在使用 Jacob 的脚本。但是我现在正在使用适配器,因此我希望能够切换显示器是连接到 HDMI 还是通过适配器连接的方向。为此,我修改了 Javob 的脚本并借用了他写的另一个函数

import subprocess

def screens():
    '''
    get connected screens
    '''
    output = [l for l in subprocess.check_output(["xrandr"]).decode("utf-8").splitlines()]
    return [l.split()[0] for l in output if " connected " in l]

# --- set the name of the screen and the rotate direction below
# screen = "HDMI-1" # run "xrandr" to get the screen
rotate = "left" # the desired orientation

if "HDMI-1" in screens():
    screen = "HDMI-1"
elif "DP-1" in screens():
    screen = "DP-1"
else:
    pass
# ---

# only run if screen is declared (i.e. either HDMI-1 or DP-1 are connected)
if screen:

    matchline = [
        l.split() for l in subprocess.check_output(["xrandr"]).decode("utf-8").splitlines()\
        if l.startswith(screen)
        ][0]
    s = matchline[
        matchline.index([s for s in matchline if s.count("+") == 2][0])+1
        ]

    rotate = "normal" if s == rotate else rotate
    subprocess.call(["xrandr", "--output", screen, "--rotate", rotate])

相关内容