У меня в офисе большой мнитор, но работаю я на ноутбуке. Поэтому подключаю его к ноуту.
Так вот почему-то не нашёл я функционала, который автоматически переключал бы изображение с одного монитора на другой.
Собственно поэтому был написан 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, из-за которого всё тормозит пару секунд, хоть и не видно нагрузки.
Так что если кто-то подскажет нормальный способ словить это событие не мешая, будет супер.