Q2W 26.03.2011 15:01

СкриптыПереключение с/на внешний монитор

У меня в офисе большой мнитор, но работаю я на ноутбуке. Поэтому подключаю его к ноуту.
Так вот почему-то не нашёл я функционала, который автоматически переключал бы изображение с одного монитора на другой.
Собственно поэтому был написан Perl-скрипт:

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#!/usr/bin/perl

# Переключатель мониторов. При подключении или отключении внешнего монитора нужно вызвать этот скрипт (например, повесить его на
# горячую клавишу или на событие в системе, если такое найдётся) и он переключит изображение либо на внешний монитор, если тот
# подключен, либо на дефолтный, если внешний не подключен.

use strict;
use warnings;

my $defaultMonitorOutput = 'LVDS1'; # Здесь указываем название выхода, к которому подключён дефолтный монитор.
my $externalMonitorOutput = 'VGA1'; # А здесь тот внешний выход, к котором подключаем второй монитор.
# Имена выходов можно посмотреть в выводе команды "xrandr".

my $xrandr = `xrandr`; # Вызываем xrandr, дабы узнать, какие мониторы подключены, и какие из них заюзаны

my %connected; # Те, что подключены, отмечаются xrandr'ом словом "connected"
$connected{$1} = 1 while $xrandr =~ m/^(<^ >+) connected/ogm;

my %used; # А те, что заюзаны, имеют какое-то разрешение экрана - циферку после "connected"
$used{$1} = 1 while $xrandr =~ m/^(<^ >+) connected \d/ogm;

print "\tПодключённые мониторы:\t".join(', ', keys %connected).".\n\tЗаюзанные мониторы:\t".join(', ', keys %used).".\n";

# Если на внешнем выходе что-то подключили, а заюзан всё ещё тот, что на дефолтном выходе, переключим их.
if($connected{$externalMonitorOutput} and $used{$defaultMonitorOutput})
{
print "\Заюзаем подключённый $externalMonitorOutput и убираем $defaultMonitorOutput.\n";
`xrandr --output $externalMonitorOutput --auto`; # Включаем монитор на внешнем выходе с оптимальный разрешением
`xrandr --output $defaultMonitorOutput --off`; # Выключаем монитор на дефолтном выходе
}
# А если на внешнем выходе уже ничего не подключено, а тот, что на дефолтном выходе, ещё не заюзан, переключим обратно.
elsif(!$connected{$externalMonitorOutput} and !$used{$defaultMonitorOutput})
{
print "\tУбираем отключённый $externalMonitorOutput и заюзаем $defaultMonitorOutput.\n";
`xrandr --output $defaultMonitorOutput --auto`; # Включаем монитор на дефолтном выходе с оптимальным разрешением
`xrandr --output $externalMonitorOutput --off`; # Выключаем монитор на внешнем выходе
} else {
print "\tВсё уже ОК, действия не нужны.\n";
}


Перед использованием подставьте свои названия видеовыходов в переменные $defaultMonitorOutput и $externalMonitorOutput в начале скрипта.

Сначала хотел, чтобы он сам обнаруживал подключение внешнего монитора, но узнать об этом событии я смог только периодическим парсингом вывода xrandr, из-за которого всё тормозит пару секунд, хоть и не видно нагрузки.
Так что если кто-то подскажет нормальный способ словить это событие не мешая, будет супер.


Тэги: perl xrandr монитор скрипт
+ 5 -
Похожие Поделиться

dukeglukem 26.03.2011 17:18 #
У меня тоже ноутбук подключается к большому монитору через скрипты, только еще и звук выводится на монитор, и конфигурация клавиатуры меняется. Единственное, что у меня по-другому, это выбор разрешения внешнего монитора стоит не --auto, а максимально возможное из списка.
#!/bin/bash
MAX_RES=`xrandr | grep -A 1 -i HDMI1 | tail -n 1 | awk '{ print $1 }'`
xrandr --output LVDS1 --off --output HDMI1 --mode $MAX_RES