(Automaticamente) silencia o som de um aplicativo específico se sua janela não estiver na frente
Eu testei o script abaixo no Rhythmbox, fazendo o trabalho sem um único erro.
A execução do script abaixo em segundo plano pausará o processo de segmentação se a janela não estiver na frente (dentro de um segundo), silenciando o som se ele for fornecido com o aplicativo.
Sempre que a janela fica na frente novamente, o processo é retomado onde estava e o som funciona novamente.
Se o processo / aplicativo alvo não for executado , o script mudará para um período mais longo (modo), verificando apenas uma vez a cada cinco segundos se o aplicativo alvo corre ou não. Desta forma, o script é extremamente baixo em suco se não tiver trabalho a cumprir.
O script
#!/usr/bin/env python3
import subprocess
import time
# ---set the proc to pause when not the active window
wclass = "rhythmbox"
# ---
def get(cmd):
# just a helper function to not repeat verbose subprocess sections
try:
return subprocess.check_output(cmd).decode("utf-8").strip()
except subprocess.CalledProcessError:
pass
while True:
# the longer period: application is not running (saving fuel)
time.sleep(5)
front1 = ""
while True:
# if the application runs, switch to a shorter response time
time.sleep(1)
# get the possible pid, get() returns "None" if not running,
# script then switches back to 5 sec check
pid = get(["pgrep", wclass])
if pid:
front2 = wclass in get([
"xprop", "-id", get(["xdotool", "getactivewindow"])
])
# run either kill -stop or kill -cont only if there is
# a change in the situation
if front2 != front1:
if front2 == True:
cm = ["kill", "-cont", pid]
print("run") # just a test indicator, remove afterwards
else:
cm = ["kill", "-stop", pid]
print("stop") # just a test indicator, remove afterwards
subprocess.Popen(cm)
front1 = front2
else:
break
Como usar
-
O script precisa de
xdotool
para obter informações na primeira janela:sudo apt-get install xdotool
- Copie o script em um arquivo vazio, salve-o como
pause_app.py
-
Na seção head do script, defina o nome do processo para pausar (substitua
rhythmbox
).
Normalmente, isso é o mesmo que a (primeira seção) doWM_CLASS
, mas no seu caso, estou tendo dúvidas se isso não deve sersteam
ou qualquer outra coisa. Corra para se certificar de queps -u <yourname>
para fazer um palpite, e subsequentemente
kill <pid> (the process id)
para verificar.
-
Execute o script pelo comando:
python3 /path/to/pause_app.py
e verifique se tudo funciona conforme esperado.
-
Se tudo funcionar bem, adicione a Startup Applications: Dash > Aplicativos de inicialização > Adicionar. Em seguida, adicione o comando:
python3 /path/to/pause_app.py
Nota
O script pode ser facilmente editado para segmentar vários aplicativos, mas primeiro veja se é isso que você precisa.
Alternativamente
Se você preferir ignorar o som em geral quando a janela de destino não estiver na frente, substitua o comando pause o aplicativo pelo comando > mudo (/ ativar) som . O script então se torna:
#!/usr/bin/env python3
import subprocess
import time
# ---set the proc to pause when not the active window
wclass = "rhythmbox"
# ---
def get(cmd):
# just a helper function to not repeat verbose subprocess sections
try:
return subprocess.check_output(cmd).decode("utf-8").strip()
except subprocess.CalledProcessError:
pass
while True:
# the longer period: application is not running (saving fuel)
time.sleep(5)
front1 = ""
while True:
# if the application runs, switch to a shorter response time
time.sleep(1)
# get the possible pid, get() returns "None" if not running,
# script then switches back to 5 sec check
pid = get(["pgrep", wclass])
if pid:
front2 = wclass in get([
"xprop", "-id", get(["xdotool", "getactivewindow"])
])
# run either kill -stop or kill -cont only if there is
# a change in the situation
if front2 != front1:
if front2 == True:
cm = ["amixer", "-q", "-D", "pulse", "sset", "Master", "on"]
print("sound") # just a test indicator, remove afterwards
else:
cm = ["amixer", "-q", "-D", "pulse", "sset", "Master", "off"]
print("no sound") # just a test indicator, remove afterwards
subprocess.Popen(cm)
front1 = front2
else:
break
O uso é exatamente semelhante ao primeiro script.