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