3

Я хотел бы получить разрешение текущего монитора (экран, с которого я запускаю скрипт) или название экрана (LVDS, VGA1 и т.д.).

Если я не могу получить разрешение, а только имя монитора, я могу получить вывод «xrandr -q» для получения текущего разрешения.

Заранее спасибо.

3 ответа3

3

Вы должны быть в состоянии сделать это путем комбинации xrandr и xwininfo .

  1. Получить экраны, их разрешения и смещения:

    $ xrandr | grep -w connected  | awk -F'[ \+]' '{print $1,$3,$4}'
    VGA-0 1440x900 1600
    DP-3 1600x900 0
    
  2. Получить позицию текущего окна

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

Таким образом, комбинируя эти два параметра, вы сможете получить разрешение текущего экрана:

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

Скрипт напечатает имя и разрешение текущего экрана.

1

Я изменил (превосходное) решение @ terdon, чтобы оно работало с любым количеством мониторов, расположенных горизонтально и / или вертикально, и изменил способ захвата смещений из xrandr (он не работал на моей установке, возможно, из-за изменение выходного формата 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

Стоит также отметить, что xdotool может выводить экран, на котором находится окно, но, если вы используете Xinerama, который заставляет все ваши мониторы отображаться как один большой экран, он будет выводить только 0.

0

По какой-то причине я не смог получить ответ @ adam-bowen, работающий с диспетчером окон, хотя некоторые незначительные правки для использования координат мыши работали.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .