X O servidor não mostra o visor integrado do thinkpad. Distorcer tudo em configuração de vários monitores não espelhados.

2

Eu retornei recentemente ao Ubuntu (14.10) e atualmente estou tentando fazer com que a configuração de vários monitores funcione corretamente.

Funcionou bem após a primeira configuração na configuração desejada: Um monitor embutido de 1600x900 (Thinkpad T430) além de um monitor externo de 1920x1200 (Asus VK226H) conectado por DVI ou VGA ou mDP.

No entanto, após a primeira reinicialização ele me cumprimentou com 'a configuração selecionada para displays não pôde ser aplicada' e me mostrou um fundo parcialmente sobreposto e altamente distorcido com posicionamento estranho do lançador e uma interação de mouse não funcional (não clique onde é mostrado). Mudar para o modo espelhado tornou tudo funcional novamente.

Observando a configuração do X Server, notei que apenas o monitor externo está sendo representado no gráfico de layout e no menu suspenso 'Seleção', enquanto o monitor mostra os dois. A 'configuração selecionada para displays não pôde ser aplicada' começou a aparecer quase sempre que eu aplico algo em displays ou no X Server, aplico algo para mostrar, reinicializar ou reconectar o monitor externo (não importa qual porta).

porque esta é uma nova conta Eu não posso incorporar nenhuma imagem. Aqui estão 2 capturas de tela com driver rev 331 mostrando as duas exibições e a configuração do X Server antes e depois de eu ter conseguido tornar tudo visível / não sobreposto após uma reinicialização. Apesar de ter sido strongmente distorcido ao longo da dimensão vertical (e partes do ambiente de trabalho fora do ecrã) nos ecrãs físicos, isto não se reflecte no ecrã

Falhando horrivelmente com muitas configurações do X Server, decidi experimentar os drivers legados. Eu purgou os drivers atuais através deste método e instalei a versão 304 embora Software & Atualizações A mesma coisa aconteceu. Funcionou após a configuração inicial e a instalação, mas falhou novamente após a reinicialização. O monitor embutido ainda não apareceu no X Server.

Como isso não conseguiu nada, voltei ao 331 e tentei mais uma vez com o mesmo resultado. Tudo parece bem para mim no lshw e no dpkg.

dpkg -l | grep nvidia
ii  nvidia-331                                           331.113-0ubuntu0.1                       amd64        NVIDIA binary driver - version 331.113
ii  nvidia-331-uvm                                       331.113-0ubuntu0.1                       amd64        NVIDIA Unified Memory kernel module
ii  nvidia-opencl-icd-331                                331.113-0ubuntu0.1                       amd64        NVIDIA OpenCL ICD
ii  nvidia-prime                                         0.6.7                                    amd64        Tools to enable NVIDIA's Prime
ii  nvidia-settings                                      331.20-0ubuntu8                          amd64        Tool for configuring the NVIDIA graphics driver

sudo lshw -C display
   *-display               
        description: VGA compatible controller
    product: GF108M [NVS 5400M]
    vendor: NVIDIA Corporation
    physical id: 0
    bus info: pci@0000:01:00.0
    version: a1
    width: 64 bits
    clock: 33MHz
    capabilities: pm msi pciexpress vga_controller bus_master cap_list rom
    configuration: driver=nvidia latency=0
    resources: irq:48 memory:f0000000-f0ffffff memory:c0000000-cfffffff memory:d000
0000-d1ffffff ioport:4000(size=128) memory:f1000000-f107ffff

Neste ponto, não tenho ideia do que fazer, uma vez que obviamente é um problema com a colocação das minhas telas na tela virtual, mas não mostra todas elas no menu de configuração. Como faço para que ele apareça para que eu possa configurar tudo corretamente?

Qualquer ajuda seria muito apreciada.

Se você precisar de mais extratos de log ou outras informações, por favor me avise.

    
por Argysh 09.01.2015 / 00:41

1 resposta

0

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).

    
por fifaltra 11.01.2015 / 07:57