Como obter a resolução atual do monitor ou o nome do monitor (LVDS, VGA1, etc)

3

Eu gostaria de obter a resolução do monitor atual (a tela de onde eu executo o script) ou o nome da tela (LVDS, VGA1, etc).

Se eu não conseguir a resolução, mas apenas o nome do monitor, eu poderia grep 'xrandr -q' output para obter a resolução atual.

Obrigado antecipadamente.

    
por Merlin Gaillard 04.06.2013 / 12:36

3 respostas

2

Você deve conseguir fazer isso combinando xrandr e xwininfo .

  1. Obtenha as telas, suas resoluções e offsets:

    $ xrandr | grep -w connected  | awk -F'[ \+]' '{print $1,$3,$4}'
    VGA-0 1440x900 1600
    DP-3 1600x900 0
    
  2. Obtenha a posição da janela atual

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

Então, combinando os dois, você deve conseguir a resolução da tela atual:

#!/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

O script imprimirá o nome e a resolução da tela atual.

    
por 04.06.2013 / 16:11
1

Eu modifiquei a solução (excelente) do @terdon para que funcionasse com qualquer número de monitores empilhados horizontalmente e / ou verticalmente, e mudasse a forma como os deslocamentos são extraídos do xrandr (não estava funcionando na minha configuração, talvez causado por uma mudança no formato de saída 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.*$/ /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.*$/    /" |
  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

Também é importante notar que xdotool pode produzir a tela na qual a janela está ativa, mas, se você estiver usando o Xinerama, o que faz com que todos os seus monitores apareçam como uma tela grande, isso só produzirá um 0.

    
por 28.10.2015 / 12:07
0

Por alguma razão, eu não consegui usar a resposta do @adam-bowen trabalhando com um gerenciador de janelas lado a lado, mas algumas pequenas edições para usar as coordenadas do mouse funcionaram.

#!/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.*$/    /" |
    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
    
por 07.08.2017 / 09:30