Ok, este é um pequeno script em perl, que define as configurações de exibição novamente após a reinicialização destruí-las. Desde que eu tenho o meu herói Linux local para escrever isso para mim, eu só entendo metade disso. Então, talvez você tenha que fazer uma pergunta para que isso funcione para você.
#!/usr/bin/perl
# settings
our @preferred_outputs = qw(HDMI1 VGA1 LVDS1);
our $poll_interval_seconds = 5.0; #this script actually keeps running and
# periodically checks whether I plugged in my external monitor or not
our $sleep_seconds_at_start = 5.0; #this is the important bit
our $sleep_after_set = 5.0;
# end of settings
use strict;
use feature ":5.10";
use Time::HiRes qw(sleep);
sub eq_hashes (\%\%);
fork && exit;
#this is to make sure this script runs only once... I think
my @pids = split /\s+/, qx/pgrep -x 'basename '$0''/;
my @other_pids = grep { $_ != $$ } @pids;
if(@other_pids > 0) {
kill "TERM", @other_pids;
}
sleep $sleep_seconds_at_start;
my %old_mode = get_default_mode();
set_auto_mode();
sleep $sleep_after_set;
while(sleep $poll_interval_seconds) {
my %cur_mode = get_default_mode();
unless(eq_hashes(%cur_mode, %old_mode)) {
%old_mode = %cur_mode;
set_auto_mode();
sleep $sleep_after_set;
}
}
sub eq_hashes (\%\%) {
my ($h1, $h2) = @_;
return hashref_to_string($h1) eq hashref_to_string($h2);
}
sub hashref_to_string {
my $m = $_[0];
return join "#!/usr/bin/perl
# settings
our @preferred_outputs = qw(HDMI1 VGA1 LVDS1);
our $poll_interval_seconds = 5.0; #this script actually keeps running and
# periodically checks whether I plugged in my external monitor or not
our $sleep_seconds_at_start = 5.0; #this is the important bit
our $sleep_after_set = 5.0;
# end of settings
use strict;
use feature ":5.10";
use Time::HiRes qw(sleep);
sub eq_hashes (\%\%);
fork && exit;
#this is to make sure this script runs only once... I think
my @pids = split /\s+/, qx/pgrep -x 'basename '$0''/;
my @other_pids = grep { $_ != $$ } @pids;
if(@other_pids > 0) {
kill "TERM", @other_pids;
}
sleep $sleep_seconds_at_start;
my %old_mode = get_default_mode();
set_auto_mode();
sleep $sleep_after_set;
while(sleep $poll_interval_seconds) {
my %cur_mode = get_default_mode();
unless(eq_hashes(%cur_mode, %old_mode)) {
%old_mode = %cur_mode;
set_auto_mode();
sleep $sleep_after_set;
}
}
sub eq_hashes (\%\%) {
my ($h1, $h2) = @_;
return hashref_to_string($h1) eq hashref_to_string($h2);
}
sub hashref_to_string {
my $m = $_[0];
return join "%pre%", map { $_, $m->{$_} } sort keys %$m;
}
#so this seems to be using xrandr to find out the resolution of the screen
#and then it returns that value
sub get_default_mode {
open my $xrout, "-|", "xrandr"
or die $!;
my %default_mode;
my $cur_output;
while(<$xrout>) {
given($_) {
when(/^(\w+) connected/) {
$cur_output = $1;
}
#xrandr prints all possible resolutions, and puts a + next to the default one
when(/^\s*(\d+x\d+)\s+[0-9.]+.\+/) {
$default_mode{$cur_output} = $1;
}
}
}
close $xrout;
return %default_mode;
}
sub set_auto_mode {
my %default_mode = get_default_mode();
my @opts;
my $display_chosen = 0;
for my $output (@preferred_outputs) {
push @opts, "--output", $output;
if(exists $default_mode{$output} && $display_chosen == 0) {
push @opts, "--mode", $default_mode{$output};
$display_chosen = 1;
}
push @opts, "--off";
}
system "xrandr", @opts;
}
", map { $_, $m->{$_} } sort keys %$m;
}
#so this seems to be using xrandr to find out the resolution of the screen
#and then it returns that value
sub get_default_mode {
open my $xrout, "-|", "xrandr"
or die $!;
my %default_mode;
my $cur_output;
while(<$xrout>) {
given($_) {
when(/^(\w+) connected/) {
$cur_output = $1;
}
#xrandr prints all possible resolutions, and puts a + next to the default one
when(/^\s*(\d+x\d+)\s+[0-9.]+.\+/) {
$default_mode{$cur_output} = $1;
}
}
}
close $xrout;
return %default_mode;
}
sub set_auto_mode {
my %default_mode = get_default_mode();
my @opts;
my $display_chosen = 0;
for my $output (@preferred_outputs) {
push @opts, "--output", $output;
if(exists $default_mode{$output} && $display_chosen == 0) {
push @opts, "--mode", $default_mode{$output};
$display_chosen = 1;
}
push @opts, "--off";
}
system "xrandr", @opts;
}
Ok, então não sei se você está familiarizado com o perl. Este script basicamente usa o xrandr para fazer todas as configurações. Então você precisa ter o xrandr e o perl instalados para que isso funcione. Mas eu acho que pode realmente funcionar fora da caixa (se eu entendi o seu problema corretamente). Talvez você tenha que brincar um pouco com o xrandr.
Minha configuração é tal que eu tenho coisas diferentes em minhas duas telas e elas devem estar próximas umas das outras. Se eu me lembro bem. Eu realmente não vejo onde no script isso acontece, mas de alguma forma corrigir as resoluções das telas fez o truque para mim. (Eu não posso fazer nenhum teste agora porque não tenho minha segunda tela na mão.)
Isso é obviamente um hack, então eu ficaria feliz se houvesse uma solução mais canônica (e alguém pudesse publicá-la).