Cara mendapatkan resolusi atau nama monitor saat ini (LVDS, VGA1, dll)

4

Saya ingin mendapatkan resolusi monitor saat ini (layar tempat saya menjalankan skrip) atau nama layar (LVDS, VGA1, dll.).

Jika saya tidak bisa mendapatkan resolusi tetapi hanya nama monitor, saya bisa mendapatkan output 'xrandr -q' untuk mendapatkan resolusi saat ini.

Terima kasih sebelumnya.

Merlin Gaillard
sumber

Jawaban:

4

Anda harus dapat melakukan ini dengan kombinasi xrandrdan xwininfo.

  1. Dapatkan layar, resolusi dan offset mereka:

    $ xrandr | grep -w connected  | awk -F'[ \+]' '{print $1,$3,$4}'
    VGA-0 1440x900 1600
    DP-3 1600x900 0
    
  2. Dapatkan posisi jendela saat ini

    $ xwininfo -id $(xdotool getactivewindow) | grep Absolute
     Absolute upper-left X:  1927
     Absolute upper-left Y:  70
    

Jadi, dengan menggabungkan keduanya Anda harus bisa mendapatkan resolusi layar saat ini:

#!/usr/bin/env bash

## Get screen info
screen1=($(xrandr | grep -w connected  | awk -F'[ +]' '{print $1,$3,$4}' | 
    head -n 1))
screen2=($(xrandr | grep -w connected  | awk -F'[ +]' '{print $1,$3,$4}' | 
    tail -n 1))

## Figure out which screen is to the right of which
if [ ${screen1[2]} -eq 0  ]
then
    right=(${screen2[@]});
    left=(${screen1[@]});
else
    right=(${screen1[@]});
    left=(${screen2[@]});

fi

## Get window position
pos=$(xwininfo -id $(xdotool getactivewindow) | grep "Absolute upper-left X" | 
      awk '{print $NF}')

## Which screen is this window displayed in? If $pos
## is greater than the offset of the rightmost screen,
## then the window is on the right hand one
if [ "$pos" -gt "${right[2]}" ]
then
    echo "${right[0]} : ${right[1]}"    
else
    echo "${left[0]} : ${left[1]}"    
fi

Script akan mencetak nama dan resolusi layar saat ini.

terdon
sumber
1
Luarbiasa, terimakasih! Saya tidak mengetahui xdotool ini. Manajer jendela saya sayangnya tidak mendukung 'getactivewindow' tetapi eval $(xdotool getmouselocation --shell)akan melakukan trik. Terima kasih lagi.
Merlin Gaillard
Jika xrandrlabel salah satu layar sebagai yang utama, ini akan membuang awkekstraksi lapangan. Termasuk sedperintah untuk menghapus label utama akan memperbaikinya:xrandr | grep -w connected | sed 's/primary //' | awk -F'[ +]' '{print $1,$3,$4}'
mapeters
1

Saya telah memodifikasi solusi @ terdon (sangat baik) sehingga akan bekerja dengan sejumlah monitor yang ditumpuk secara horizontal dan / atau vertikal, dan mengubah cara offset diambil dari xrandr (tidak berfungsi pada pengaturan saya, mungkin disebabkan oleh perubahan dalam format output xrandr).

#!/usr/bin/env bash

OFFSET_RE="\+([-0-9]+)\+([-0-9]+)"

# Get the window position
pos=($(xwininfo -id $(xdotool getactivewindow) | 
  sed -nr "s/^.*geometry .*$OFFSET_RE.*$/\1 \2/p"))

# Loop through each screen and compare the offset with the window
# coordinates.
while read name width height xoff yoff
do
  if [ "${pos[0]}" -ge "$xoff" \
    -a "${pos[1]}" -ge "$yoff" \
    -a "${pos[0]}" -lt "$(($xoff+$width))" \
    -a "${pos[1]}" -lt "$(($yoff+$height))" ]
  then
    monitor=$name   
  fi
done < <(xrandr | grep -w connected |
  sed -r "s/^([^ ]*).*\b([-0-9]+)x([-0-9]+)$OFFSET_RE.*$/\1 \2 \3 \4 \5/" |
  sort -nk4,5)

# If we found a monitor, echo it out, otherwise print an error.
if [ ! -z "$monitor" ]
then
  echo $monitor
  exit 0
else
  echo "Couldn't find any monitor for the current window." >&2
  exit 1
fi

Perlu dicatat juga bahwa xdotooldapat menampilkan layar tempat sebuah jendela aktif, tetapi, jika Anda menggunakan Xinerama, yang membuat semua monitor Anda muncul sebagai satu layar besar, ini hanya akan menghasilkan angka 0.

Adam Bowen
sumber
0

Untuk beberapa alasan saya tidak bisa mendapatkan jawaban @ adam-bowen bekerja dengan manajer jendela ubin, beberapa suntingan kecil untuk menggunakan koordinat mouse bekerja.

#!/usr/bin/env bash
#
# Print's the current screen index (zero based).
#
# Modified from:
# https://superuser.com/a/992924/240907

OFFSET_RE="\+([-0-9]+)\+([-0-9]+)"

# Get the window position
eval "$(xdotool getmouselocation --shell)"

# Loop through each screen and compare the offset with the window
# coordinates.
monitor_index=0
while read name width height xoff yoff
do
    if [ "${X}" -ge "$xoff" \
      -a "${Y}" -ge "$yoff" \
      -a "${X}" -lt "$(($xoff+$width))" \
      -a "${Y}" -lt "$(($yoff+$height))" ]
    then
        monitor=$name
        break
    fi
    ((monitor_index++))
done < <(xrandr | grep -w connected |
    sed -r "s/^([^ ]*).*\b([-0-9]+)x([-0-9]+)$OFFSET_RE.*$/\1 \2 \3 \4 \5/" |
    sort -nk4,5)

# If we found a monitor, echo it out, otherwise print an error.
if [ ! -z "$monitor" ]
then
    # echo $monitor
    echo $monitor_index
    exit 0
else
    echo "Couldn't find any monitor for the current window." >&2
    exit 1
fi
gagasanman42
sumber