Как быстро переключить ориентацию монитора с помощью сочетания клавиш?

Посмотрев, задавал ли кто-нибудь этот вопрос раньше, я нашел это для Windows.

Я хотел бы сделать что-то подобное (ярлык или псевдоним / команда терминала) в Linux/Ubuntu, чтобы можно было быстро переключать внешний монитор между альбомным и портретным режимами вместо того, чтобы переходить к дисплеям, настраивая его и подтверждая конфигурацию.

Джейкоб Влейм предоставил скрипт на Python, который работает. Если у вас есть другая идея, я бы хотел узнать об этом.

Обновление: я обновил сценарий Джейкоба, чтобы он работал на двух экранах, если они подключены.

2 ответа

Решение

Сценарий ниже должен переключать вращение любого из ваших экранов:

#!/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)
    • направление вращения, либо left или же right (между кавычками, как в примере).

      # --- 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

Поворот экрана против часовой стрелки

Я использовал сценарий Джейкоба. Однако сейчас я использую адаптер, поэтому хочу иметь возможность переключать ориентацию независимо от того, подключен ли монитор к HDMI или через адаптер. Для этого я изменил сценарий Якоба и позаимствовал другую функцию, которую он написал:

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])
Другие вопросы по тегам