Estou tentando criar um módulo polybar personalizado que mostre a classe de janela ativa atual, já que o módulo padrão gera o nome da janela.
Estou usando este comando para obter a classe da janela:
xprop -id $(xdotool getactivewindow) WM_CLASS
e obtendo esta saída:
WM_CLASS(STRING) = "kitty", "kitty"
mas a saída desejada é:
kitty
Como eu posso fazer isso?
Responder1
Você pode se safar:
xprop -id $(xdotool getactivewindow) WM_CLASS |
awk -F '"' '{print $2}'
Mas também com (o mais simples):
xprop -id $(xdotool getactivewindow) WM_CLASS |
cut -d '"' -f 2
Ou (aviso, se a regex não corresponder, toda a entrada será impressa)
xprop -id $(xdotool getactivewindow) WM_CLASS |
sed 's/^[^"]*"\([^"]*\)".*$/\1/'
Ou sed novamente, mas um pouco mais robusto:
xprop -id $(xdotool getactivewindow) WM_CLASS |
sed -n 's/^[^"]*r"\([^"]*\)".*$/\1/p'
Ou mesmo (não tão robusto) com grep (mas apenas GNU grep e com Perl regex):
xprop -id $(xdotool getactivewindow) WM_CLASS |
grep -Po '^[^"]*"\K[^"]*'
É isso que você quer dizer?
Em palavras: extraia a string dentro do primeiro par de aspas, caso contrário, falhará?
Responder2
xprop
gera strings em um formato muito semelhante ao das $'...'
citações de ksh93/zsh/bash, onde barra invertida, caracteres de controle e não-ASCII são representados como ANSI C \\
, \n
, \r
, \t
ou \ooo
notação.
A única diferença é que, por estarem entre aspas duplas, "
ele próprio é renderizado como \"
e '
renderizado como '
em vez de \'
, portanto, não deve ser muito difícil converter essa saída para WM_CLASS=$'...'
ser avaliada pelo shell.
No entanto, é ainda mais fácil (e mais seguro) gerar xprop
valores hexadecimais e transformá-los em $'\xHH...'
:
Para o nome do aplicativo (o primeiro kitty
no seu exemplo):
eval "$(
xprop -id "$(xdotool getactivewindow)" -notype 8x WM_CLASS |
sed 's/0x/\\x/g;s/[, ]//g;s/\\x0.*/'\''/;s/=/=$'\'/
)"
para o nome da classe do aplicativo (o segundo kitty
no seu exemplo):
eval "$(
xprop -id "$(xdotool getactivewindow)" -notype 8x WM_CLASS |
sed 's/0x/\\x/g;s/[, ]//g;s/=.*\\x0\(.*\)\\x0/=$'"'\\1'/"
)"
Ambos definem a $WM_CLASS
variável shell.
Isso funcionaria independentemente do valor de byte que a propriedade possa conter.
Assume um shell com suporte para $'\xHH'
.
Responder3
Tentei com método
xprop -id $(xdotool getactivewindow) WM_CLASS| awk '{gsub(/[","]/,"",$3);print $3}'
output
kitty
Pitão
a saída do comando "xprop -id $(xdotool getactivewindow) WM_CLASS" é salva na variável "a"
#!/usr/bin/python
import re
a='"WM_CLASS(STRING) = "kitty", "kitty"'
b=a.split(' ')[2]
print b.replace('"','').replace(",","")