png
파일로 가득 찬 디렉토리가 있습니다
$ tree ~/wallpaper/
~/wallpaper/
├── foo--1366x768.png
├── foo--1920x1080.png
├── foo--2048x1080.png
├── foo--3440x1440.png
└── foo--3840x2160.png
0 directories, 5 files
모니터를 자주 바꾸고 가끔 여러 대의 모니터를 연결하기도 합니다. 내 컴퓨터에 연결된 모니터의 크기를 감지하고 ~/wallpaper
모니터 크기에 따라 배경화면을 설정하는 스크립트를 원합니다 .
따라서 모니터에 해상도가 있고 연결되어 있으면 1366x768
스크립트 3440x1440
에서 배경 화면을 각각 ~/wallpaper/foo--1366x768.png
및 으로 설정하고 싶습니다 ~/wallpaper/foo--3440x1440.png
. 이 특정 예에서는 다음 명령을 실행하는 방법을 알고 있습니다.
feh --bg-fill ~/wallpaper/foo--1366x768.png ~/wallpaper/foo--3440x1440.png
배경화면이 올바르게 설정됩니다.
일반적인 문제를 해결하기 위해 발행할 수 있다는 것을 알고 있습니다.
xrandr | grep ' connected' | awk '{print $3}' | cut -f1 -d"+"
연결된 모니터의 크기를 가져옵니다. 실행 중인 예에서 출력은 다음과 같습니다.
1366x768
3440x1440
이제 배경 화면을 설정하는 데 사용할 수 있는 명령으로 이것을 가져오고 싶습니다 feh
. 어떻게 해야 합니까?
답변1
을 사용할 수 있으며 --no-xinerama
, 이 경우 지정한 이미지가 모든 화면에 표시됩니다. 그렇다면 유일한 질문은 모니터 설정 방법에 따라 모든 이미지를 결합하여 데스크탑 배경을 만드는 방법입니다.
내가 생각한 유일한 것은 ImageMagick을 사용하는 것이었지만 그것은 매우 이상하고 혼란스럽습니다.그래서 무슨 일이 있어도 하기로 결정했는데...전체 내용은 다음과 같습니다.
#!/bin/sh
AWK_XRANDR_PARSE='/ connected/ {
split($3,sizePos,"+")
split(sizePos[1],size,"x")
print size[1] "," size[2] "," sizePos[2] "," sizePos[3]
}'
# Fetches a wallpaper for the monitor of size $1x$2. $1 is the required width,
# and $2 is the required height.
wallpaper_file() {
# Use a case or string substitution to pick out any image files you fancy on
# your system... They must be printf'd.
printf "$HOME/.desktop"
}
# Writes any line whose $2nth column is equal to that of the first line.
# Columns are split by $1.
matching() {
SENTINEL="$([ "$#" -gt 2 ] && printf '%s' "$3" || printf 'sentinel')"
awk -F"$1" -v first="$SENTINEL" \
"{if (first == \"$SENTINEL\") first = \$$2; if (\$$2 == first) print}"
}
# Writes the value within the variable named "$1".
cat() {
printf '%s' "${!1}"
}
# Writes the $2nth column. Columns are split by $1.
nth() {
awk -F"$1" "{print \$$2}"
}
# This one variable assignment takes xrandr's output, parses it via awk, runs
# the wallpaper_file, takes it's output, and combines all that information into
# a list of tuples. Each item in the list represents a monitor, and the tuple
# is roughly equivalent to 'W,H,X,Y,F', where W is width, H is height, X is the
# X position, Y is the Y position, and F is the file of the image.
DISPLAYS="$(while read X Y REST; do
printf '%s,%s,%s,%s\n' "$X" "$Y" "$REST" "$(wallpaper_file "$X" "$Y")"
done < <(xrandr | awk "$AWK_XRANDR_PARSE" | \
awk -F',' '{print $1 " " $2 " " $3 "," $4}'))"
# This simply finds the monitor that is the farthest out in the X direction,
# and is the widest. It then combines the X position and the width of the
# monitor to find the absolute width of your desktop.
PLACEMENT_WIDTH="$(cat DISPLAYS | sort -rnt, -k3 | matching , 3)"
SIZE_WIDTH="$(cat PLACEMENT_WIDTH | sort -rnt, -k1 | head -n1)"
WIDTH="$(("$(cat SIZE_WIDTH | nth , 1)" + "$(cat SIZE_WIDTH | nth , 3)"))"
# Same goes on as above, but with the height and Y direction.
PLACEMENT_HEIGHT="$(cat DISPLAYS | sort -rnt, -k4 | matching , 4)"
SIZE_HEIGHT="$(cat PLACEMENT_HEIGHT | sort -rnt, -k2 | head -n1)"
HEIGHT="$(("$(cat SIZE_HEIGHT | nth , 2)" + "$(cat SIZE_HEIGHT | nth , 4)"))"
# Take all that information, and make a wallpaper file from it via imagemagick.
magick -size $WIDTH'x'$HEIGHT canvas:black \
$(cat DISPLAYS | awk -F',' '{print $5 " -geometry " $1 "x" $2 "+" $3 "+" $4 " -composite"}') \
/tmp/wallpaper.png
# Then set it as the background.
feh --bg-fill --no-xinerama /tmp/wallpaper.png
전체 스크립트를 요지로 게시하고 있습니다.여기, 너가 선호한다면.
아마 그렇게 하면 안 된다는 걸 알지만, 맙소사, 어쨌든 나는 그렇게 합니다.
답변2
항상 2개의 모니터를 연결하는 경우 Bash를 사용하면 쉽습니다.
#!/usr/bin/env bash
screen_size=$(xrandr | grep ' connected' | awk '{print $3}' | cut -f1 -d"+")
IFS=$'\n'
readarray -t <<<"$screen_size"
feh --bg-fill ~/wallpaper/foo--"${MAPFILE[0]}".png ~/wallpaper/foo--"${MAPFILE[1]}".png
그러나 연결된 모니터 수가 다를 수 있는 경우(실제로 그럴 가능성이 높음) 다음과 같이 feh
명령을 작성하고 eval
실행할 수 있습니다.
#!/usr/bin/env bash
screen_size=$(xrandr | grep ' connected' | awk '{print $3}' | cut -f1 -d"+")
IFS=$'\n'
readarray -t <<<"$screen_size"
feh_command="feh --bg-fill"
for i in "${MAPFILE[@]}"
do
echo size: "$i"
feh_command="$feh_command ~/wallpaper/foo--$i.png"
done
eval "$feh_command"