web-dev-qa-db-fra.com

X Server n'affiche pas l'affichage du thinkpad intégré. Tout déformer dans une configuration multi-écrans non mise en miroir.

Je suis récemment revenu sur Ubuntu (14.10) et j'essaie actuellement de faire fonctionner correctement la configuration de plusieurs moniteurs.

Cela a bien fonctionné après la première installation dans la configuration souhaitée: un moniteur intégré 1600x900 (Thinkpad T430) en plus d'un moniteur externe 1920x1200 (Asus VK226H) qui est connecté par DVI ou VGA ou mDP.

Cependant, après le premier redémarrage, il m'a accueilli avec `` la configuration sélectionnée pour les écrans ne pouvait pas être appliquée '' et m'a montré un arrière-plan partiellement chevauchant et très déformé avec un placement étrange du lanceur et une interaction de souris non fonctionnelle (ne cliquez pas là où il est montré). Le passage en mode miroir a rendu tout à nouveau fonctionnel.

Après avoir regardé la configuration de X Server, j'ai remarqué que seul le moniteur externe est représenté dans le graphique de mise en page et le menu déroulant "Sélection" tandis que les affichages les montrent tous les deux. La `` configuration sélectionnée pour les écrans n'a pas pu être appliquée '' a commencé à apparaître presque chaque fois que j'applique quelque chose aux écrans ou à X Server, applique quelque chose aux écrans, redémarre ou reconnecte le moniteur externe (quel que soit le port).

car il s'agit d'un nouveau compte, je ne suis pas autorisé à intégrer de photos. Voici 2 captures d'écran avec le pilote rev 331 montrant les deux écrans et la configuration X Server avant et après avoir réussi à tout voir/ne pas se chevaucher après un redémarrage. Bien qu'il ait été fortement déformé le long de la dimension verticale (et des parties du bureau hors écran) sur les écrans physiques, cela ne se reflète pas dans la capture d'écran

Échouant horriblement avec beaucoup de paramètres X Server, j'ai décidé d'essayer les pilotes hérités. J'ai purgé les pilotes actuels via cette méthode et installé la version 304 via Software & Updates. La même chose s'est produite. Il a fonctionné après la configuration et l'installation initiales mais a échoué à nouveau après un redémarrage. Le moniteur intégré ne s'affiche toujours pas dans X Server.

Comme cela n'a rien donné, je suis revenu à 331 et je l'ai essayé une fois de plus avec le même résultat. Tout me va bien en lshw et 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

À ce stade, je n'ai aucune idée de ce qu'il faut faire car c'est évidemment un problème avec le placement de mes écrans sur l'écran virtuel, mais il ne les affiche pas tous dans le menu de configuration. Comment le faire apparaître pour que je puisse tout configurer correctement?

Toute aide serait grandement appréciée.

Si vous avez besoin de plus d'extraits de journaux ou d'autres informations, veuillez me le faire savoir.

2
Argysh

Ok, c'est un petit script Perl, qui redéfinit les configurations d'affichage juste après le redémarrage les détruit. Depuis que j'ai demandé à mon héros Linux local d'écrire ceci pour moi, je n'en comprends que la moitié. Donc, vous devrez peut-être poser une question de suivi pour que cela fonctionne pour vous.

#!/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 "\0", 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, donc je ne sais pas si vous connaissez Perl. Ce script utilise essentiellement xrandr pour effectuer toutes les configurations. Vous devez donc avoir xrandr et Perl installés pour que cela fonctionne. Mais je pense que cela pourrait réellement fonctionner hors de la boîte (si je comprends bien votre problème). Vous devez peut-être jouer un peu avec xrandr.

Ma configuration est telle que j'ai des choses différentes sur mes deux écrans et ils sont censés être côte à côte. Si je me souviens bien. Je ne vois pas vraiment où cela se passe dans le script, mais en quelque sorte, la résolution des résolutions des écrans a fait l'affaire. (Je ne peux pas faire de test maintenant car je n'ai pas mon deuxième écran à portée de main.)

C'est évidemment un hack, donc je serais heureux s'il y avait une solution plus canonique (et quelqu'un pourrait la poster).

0
fifaltra