Xsetroot 출력 잘림?

Xsetroot 출력 잘림?

나는 여러 패치(중요하다면 GuixSD에서)를 사용하여 dwm 6.3에 대한 구성을 개발해 왔습니다. 대부분은 아직 6.3에서 실행되도록 업데이트되지 않았으므로 모든 문제를 해결하려면 많은 노력이 필요합니다.

상태 표시줄을 올바르게 설정하려고 하면(dualstatus 및 pango 패치가 관련됨) xsetroot -name의 문자 제한, 쉘 라인 길이 제한, pango 처리 제한 등으로 인해 발생하는 것으로 보이는 문제가 발생했습니다.

첫 번째,내 dwm 빌드, 오류가 발생한 경우. 나는 주식 시세 표시기를 포함하도록 하단 막대 텍스트를 설정하고 매일 변화하는 기호에 따라 색상을 지정하려고 합니다. 내가 찾은이것스크립트는 API에 숫자를 쿼리하고 숫자를 터미널에 표시하기 전에 형식을 지정합니다. 내 스크립트 버전은 다음과 같습니다. 터미널 색상 명령을 pango 태그 필드로 바꿔서 변경했습니다.

#!/usr/bin/env bash
set -e

LANG=C
LC_NUMERIC=C

SYMBOLS=("$@")

if ! $(type jq > /dev/null 2>&1); then
  echo "'jq' is not in the PATH. (See: https://stedolan.github.io/jq/)"
  exit 1
fi

if [ -z "$SYMBOLS" ]; then
  echo "Usage: ./ticker.sh AAPL MSFT GOOG BTC-USD"
  exit
fi

FIELDS=(symbol marketState regularMarketPrice regularMarketChange regularMarketChangePercent \
  preMarketPrice preMarketChange preMarketChangePercent postMarketPrice postMarketChange postMarketChangePercent)
API_ENDPOINT="https://query1.finance.yahoo.com/v7/finance/quote?lang=en-US&region=US&corsDomain=finance.yahoo.com"



COLOR_BOLD='<span weight="bold">'
COLOR_GREEN='<span foreground="green">'
COLOR_RED='<span foreground="red">'
COLOR_RESET='</span>'


symbols=$(IFS=,; echo "${SYMBOLS[*]}")
fields=$(IFS=,; echo "${FIELDS[*]}")

results=$(curl --silent "$API_ENDPOINT&fields=$fields&symbols=$symbols" \
  | jq '.quoteResponse .result')

query () {
  echo $results | jq -r ".[] | select(.symbol == \"$1\") | .$2"
}

for symbol in $(IFS=' '; echo "${SYMBOLS[*]}" | tr '[:lower:]' '[:upper:]'); do
  marketState="$(query $symbol 'marketState')"

  if [ -z $marketState ]; then
    printf 'No results for symbol "%s"\n' $symbol
    continue
  fi

  preMarketChange="$(query $symbol 'preMarketChange')"
  postMarketChange="$(query $symbol 'postMarketChange')"

  if [ $marketState == "PRE" ] \
    && [ $preMarketChange != "0" ] \
    && [ $preMarketChange != "null" ]; then
    nonRegularMarketSign='\*'
    price=$(query $symbol 'preMarketPrice')
    diff=$preMarketChange
    percent=$(query $symbol 'preMarketChangePercent')
  elif [ $marketState != "REGULAR" ] \
    && [ $postMarketChange != "0" ] \
    && [ $postMarketChange != "null" ]; then
    nonRegularMarketSign='*'
    price=$(query $symbol 'postMarketPrice')
    diff=$postMarketChange
    percent=$(query $symbol 'postMarketChangePercent')
  else
    nonRegularMarketSign=''
    price=$(query $symbol 'regularMarketPrice')
    diff=$(query $symbol 'regularMarketChange')
    percent=$(query $symbol 'regularMarketChangePercent')
  fi

  if [ "$diff" == "0" ] || [ "$diff" == "0.0" ]; then
    color=
  elif ( echo "$diff" | grep -q ^- ); then
    color=$COLOR_RED
  else
    color=$COLOR_GREEN
  fi

  if [ "$price" != "null" ]; then
    printf "%-10s$COLOR_BOLD%8.2f$COLOR_RESET" $symbol $price
    printf "$color%10.2f%12s$COLOR_RESET" $diff $(printf "(%.2f%%)" $percent)
    printf " %s" "${nonRegularMarketSign}"
  fi
done

상태 스크립트가 수행하는 다른 12가지 작업에서 이 오류를 분리하기 위해 다음 테스트 스크립트를 작성했습니다.

#!/bin/bash

set -f
ticker="$(bash /home/dnw/ticker.sh DIA) | $(bash /home/dnw/ticker.sh VOO) | $(bash /home/dnw/ticker.sh QQQ) | $(bash /home/dnw/ticker.sh BTC-USD)"
echo "${ticker}"
xsetroot -name ";${ticker}"

이 명령을 실행하면 올바른 에코 텍스트가 생성되지만 상태 표시줄에 표시된 텍스트는 QQQ 값을 거의 인쇄하지 않습니다. pango 태그를 끄고 줄의 변수 확장 앞에 공백을 추가하여 시간 기반 잘림이 아니라 길이 기반인지 확인했습니다. xsetroot출력에서 ​​한 문자가 손실되었습니다(처음에는 시간 기반인 것으로 생각했습니다. 내 status.sh). 이제는 멀티스레드입니다. coprocess하하).

글자수 제한이 있는 부분을 아시는 분 계신가요? 이 문제를 어떻게 해결할 수 있나요?

감사해요.

답변1

비슷한 문제가 있는 사람을 위해 게시하겠다고 생각했습니다.

이는 dwm 문제입니다. Pango 패치는 stext마커 문자를 수용하기 위해 배열 크기를 두 배로 늘리지만 extrabar 패치는 배열 크기를 두 배로 늘리지 않습니다.

관련 정보