web-dev-qa-db-ja.com

Ubuntu 18.04は外部モニターを切断すると画面解像度をリセットします

Ubuntu 18.04で本当に迷惑な問題があります。私のラップトップには4k 15インチディスプレイが搭載されています。これによりすべてが超小型になるため、使用時には1080x1920に縮小することをお勧めします。仕事中にデュアルモニターをセットアップし、両方をマシンに接続する小さなドック/アダプターに接続しますThunderbolt 3を使用します。NvidiaXサーバーの設定で、デュアルスクリーンが隣り合うように構成し、ラップトップスクリーンをオフにしました。

これらのディスプレイを切断すると、ノートパソコンの画面はフル4k解像度でオンに戻ります。 Nvidia X Serverに入ると、再び1080に変更できます。しかし、次にデュアルモニターに再び接続したとき、セットアップはすべて間違っており、再起動してすべてを正しく再構成するために5分を費やす必要があります。

これを修正する適切な方法はありますか?ディスプレイ構成を自動的に、またはホットキーなどで変更する方法はありますか?

私はすべての最新アップデートとNvidiaドライバー430を使用しています。

これはxrandrを実行した結果です

//Only on laptop screen(no external screen connected)

Screen 0: minimum 8 x 8, current 3840 x 2160, maximum 16384 x 16384
DP-0 disconnected (normal left inverted right x axis y axis)
DP-1 disconnected (normal left inverted right x axis y axis)
DP-2 disconnected (normal left inverted right x axis y axis)
DP-3 connected primary 3840x2160+0+0 (normal left inverted right x axis y axis) 346mm x 194mm
   3840x2160     60.00*+  50.00    48.02  
DP-4 disconnected (normal left inverted right x axis y axis)
DP-4.1 disconnected (normal left inverted right x axis y axis)
DP-4.2 disconnected (normal left inverted right x axis y axis)


//When Its connected to my dock, laptop screen disabled and two 1080 monitors. 

Screen 0: minimum 8 x 8, current 3840 x 1080, maximum 16384 x 16384
DP-0 disconnected (normal left inverted right x axis y axis)
DP-1 disconnected (normal left inverted right x axis y axis)
DP-2 disconnected (normal left inverted right x axis y axis)
DP-3 connected (normal left inverted right x axis y axis)
   3840x2160     60.00 +  50.00    48.02  
DP-4 disconnected (normal left inverted right x axis y axis)
DP-4.1 connected primary 1920x1080+0+0 (normal left inverted right x axis y axis) 527mm x 296mm
   1920x1080     60.00*+  75.00    59.94    50.00  
   1680x1050     59.95  
   1600x1200     60.00  
   1600x900      60.00  
   1440x900      59.89  
   1280x1024     75.02    60.02  
   1280x800      59.81  
   1280x720      60.00    59.94    50.00  
   1024x768      75.03    60.00  
   800x600       75.00    60.32  
   720x576       50.00  
   720x480       59.94  
   640x480       75.00    59.94    59.93  
DP-4.2 connected 1920x1080+1920+0 (normal left inverted right x axis y axis) 527mm x 296mm
   1920x1080     60.00*+  75.00    59.94    50.00  
   1680x1050     59.95  
   1600x1200     60.00  
   1600x900      60.00  
   1440x900      59.89  
   1280x1024     75.02    60.02  
   1280x800      59.81  
   1280x720      60.00    59.94    50.00  
   1024x768      75.03    60.00  
   800x600       75.00    60.32  
   720x576       50.00  
   720x480       59.94  
   640x480       75.00    59.94    59.93  
1
kalle11

これは、好みの表示モードでxrandrを呼び出すスクリプトが必要なようです。その後、そのスクリプトをホットキーにマップできます。

スクリプト

私は非常によく似た問題を抱えていて、長い調査の後に MestreLionによってこの回答が見つかりました です。その中で彼らは githubにある自家製スクリプト を参照しています。アーカイブのため、以下に複製されます。

そのスクリプトを「switch-monitor」という名前のファイルにコピーして貼り付けるだけで、実行権限がアクティブになります。

ファイルが/home/<username>にあるとすると、次のように入力してスクリプトを実行できます。

/home/<username>/switch-monitor --list

これにより、接続されたモニターのリストが表示され、構成ファイル/home/.config/switch-monitor.confが作成されます。

#!/bin/bash
#
# monitor-switch - switch outputs using xrand
#
#    Copyright (C) 2012 Rodrigo Silva (MestreLion) <[email protected]>
#
#    This program is free software: you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation, either version 3 of the License, or
#    (at your option) any later version.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with this program. See <http://www.gnu.org/licenses/gpl.html>

declare -A monitor_opts
declare -a monitors

myname="${0##*/}"
verbose=0

# Read settings from config file
config=${XDG_CONFIG_HOME:-"$HOME"/.config}/"$myname".conf
if [[ -f "$config" ]]; then
    source "$config"
fi

print_monitors() {
    while read -r output conn hex; do
        echo "# $output $conn   $(xxd -r -p <<<"$hex")"
    done < <(xrandr --prop | awk '
    !/^[ \t]/ {
        if (output && hex) print output, conn, hex
        output=$1
        hex=""
    }
    /ConnectorType:/ {conn=$2}
    /[:.]/ && h {
        sub(/.*000000fc00/, "", hex)
        hex = substr(hex, 0, 26) "0a"
        sub(/0a.*/, "", hex)
        h=0
    }
    h {sub(/[ \t]+/, ""); hex = hex $0}
    /EDID.*:/ {h=1}')
}

# if there's no pre-defined monitors list, read from xrandr
# and save them to config file
if [[ -z "$monitors" ]]; then
    while read -r output ; do
        monitors+=("$output")
    done < <(xrandr | awk '$2 ~/^c/{print $1}' | sort)
    cat > "$config" <<-EOF
        # $myname config file

        # List of monitors, from left to right. Edit to your actual layout
        monitors=(${monitors[@]})

        # Extra xrandr options for each monitor.
        # Useful when EDID data does not reflect actual preferred mode
        # Options for non-existing outputs (such as the examples below) are ignored
        # Examples:
        monitor_opts[DFPx]="--mode 1920x1080 --rate 60"
        monitor_opts[DFPy]="--mode 1280x720"

        # As a reference, these were the connected monitors when this config file was created
        # use it as a guide when editing the above monitors list and extra options
        $(print_monitors)

        # For an updated list, run $myname --list
    EOF
fi

message() { printf "%s\n" "$1" >&2 ; }
fatal()   { [[ "$1" ]] && message "$myname: error: $1" ; exit ${2:-1} ; }
argerr()  { printf "%s: %s\n" "$myname" "${1:-error}" >&2 ; usage 1 ; }
invalid() { argerr "invalid argument: $1" ; }
missing() { argerr "missing ${2:+$2 }operand${1:+ from $1}." ; }

usage() {
    cat <<-USAGE
    Usage: $myname [options]
    USAGE
    if [[ "$1" ]] ; then
        cat >&2 <<- USAGE
        Try '$myname --help' for more information.
        USAGE
        exit 1
    fi
    cat <<-USAGE

    Switch monitors using xrandr.

    Options:
      -h|--help          - show this page.
      -v|--verbose       - print in terminal the full xrandr command executed.

      -l|--list          - list connector and monitor names of connected outputs

      -a|--all           - enable all monitors.
      -s|--select OUTPUT - enable monitor OUTPUT, disable all others.
      -l|--left          - enable leftmost monitor.  Alias for --select ${monitors[0]}
      -r|--right         - enable rightmost monitor. Alias for --select ${monitors[${#monitors[@]}-1]}

    Copyright (C) 2012 Rodrigo Silva (MestreLion) <[email protected]>
    License: GPLv3 or later. See <http://www.gnu.org/licenses/gpl.html>
    USAGE
    exit 0
}

# Option handling
for arg in "$@"; do [[ "$arg" == "-h" || "$arg" == "--help" ]] && usage ; done
while (( $# )); do
    case "$1" in
    -v|--verbose) verbose=1 ;;
    -q|--no-notify) notify=0 ;;
    -l|--list) list=1 ;;
    -a|--all) all=1 ;;
    -s|--select) shift ; monitor="$1" ;;
    -l|--left ) monitor="${monitors[0]}" ;;
    -r|--right) monitor="${monitors[${#monitors[@]}-1]}" ;;
    *) invalid "$1" ;;
    esac
    shift
done

if ((list)); then
    echo "Connected monitors:"
    print_monitors
    exit
fi

if [[ -z "$monitor" && -z "$all" ]]; then
    usage
fi

# Loop outputs (monitors)
for output in "${monitors[@]}"; do
    if ((all)) || [[ "$output" = "$monitor" ]]; then
        xrandropts+=(--output "$output" --auto ${monitor_opts["$output"]})
        if ((all)); then
            if [[ "$output" = "${monitors[0]}" ]]; then
                xrandropts+=(--pos 0x0 --primary)
            else
                xrandropts+=(--right-of "$previous")
            fi
            previous="$output"
        else
            xrandropts+=(--primary)
        fi
    else
        xrandropts+=(--output "$output" --off)
    fi
done

((verbose)) && message "$myname: executing xrandr ${xrandropts[*]}"
xrandr "${xrandropts[@]}"

設定ファイル

上記で作成した構成ファイル/home/.config/switch-monitor.confを開きます。

# List of monitors, from left to right. Edit to your actual layout
monitors=(<list of monitors>)

# Extra xrandr options for each monitor.
# Useful when EDID data does not reflect actual preferred mode
# Options for non-existing outputs (such as the examples below) are ignored
# Examples:
monitor_opts[DFPx]="--mode 1920x1080 --rate 60"
monitor_opts[DFPy]="--mode 1280x720"

その中で、ディスプレイの物理的なレイアウトを変更してセットアップを反映したり、必要なモードを定義したりできます。したがって、あなたの場合は次のように変更する必要があります:

# List of monitors, from left to right. Edit to your actual layout
monitors=(DP-4.1 DP-4.2 DP-3)

# Extra xrandr options for each monitor.
# Useful when EDID data does not reflect actual preferred mode
# Options for non-existing outputs (such as the examples below) are ignored
# Examples:
monitor_opts[DP-4.1]="--primary --mode 1920x1080 --rate 60"
monitor_opts[DP-4.2]="--mode 1280x720 --rate 60"
monitor_opts[DP-3]="--mode 1920x1080 --rate 60"

ホットキー

単に この手順 に従ってショートカットを追加します。 commandボックスに登録する必要があります。

/home/<username>/switch-monitor --all

これは、設定ファイルに登録された特定のオプションですべてのモニターに参加します。

お役に立てれば :)

1
GTPV