Openbox - vários comandos separados por & para um pressionamento de tecla

0

Estou tentando configurar o arquivo rc.xml do Openbox para manipular minhas placas de som com um pressionamento de tecla. Como tenho várias placas de som no meu sistema, tenho que manipular vários coletores de uma só vez, então eu uso vários comandos separados com & assim:

    <keybind key="XF86AudioRaiseVolumen">
   <action name="Execute">
     <command>pactl set-sink-volume alsa_output.usb-Focusrite_Scarlett_2i4_USB-00.multichannel-output +5% & pactl set-sink-volume alsa_output.pci-0000_00_1b.0.analog-stereo +5% & pactl set-sink-volume alsa_output.usb-Focusrite_Scarlett_2i4_USB-00.analog-surround-40 +5%</command>
   </action>
</keybind>

Por algum motivo, isso não funcionará no rc.xml. Alguém pode me ajudar?

    
por 71GA 03.09.2016 / 10:50

2 respostas

2

Você precisa colocar os comandos em um script de shell, tornar esse script executável e usar esse script como o comando.

<command>/usr/local/bin/volume_up</command>

O conteúdo de /usr/local/bin/volume_up

#!/bin/sh
pactl set-sink-volume alsa_output.usb-Focusrite_Scarlett_2i4_USB-00.multichannel-output +5% &
pactl set-sink-volume alsa_output.pci-0000_00_1b.0.analog-stereo +5% &
pactl set-sink-volume alsa_output.usb-Focusrite_Scarlett_2i4_USB-00.analog-surround-40 +5%

e torná-lo executável

chmod +x /usr/local/bin/volume_up

A razão é que o Openbox não está executando o conteúdo do elemento de comando em um shell, ao invés de tentar executá-lo diretamente.

Na documentação para <command> :

A string which is the command to be executed, along with any arguments to be passed to it. The "~" tilde character will be expanded to your home directory, but no other shell expansions or scripting syntax may be used in the command unless they are passed to the sh command. Also, the & character must be written as & in order to be parsed correctly. is a deprecated name for .

Outro benefício é que você pode reescrever o script para também diminuir o volume

#!/bin/sh

change_volume() {
    pactl set-sink-volume alsa_output.usb-Focusrite_Scarlett_2i4_USB-00.multichannel-output "$1"
    pactl set-sink-volume alsa_output.pci-0000_00_1b.0.analog-stereo "$1"
    pactl set-sink-volume alsa_output.usb-Focusrite_Scarlett_2i4_USB-00.analog-surround-40 "$1"
}

main() {
    case "$1" in
      up)
         change_volume +5%
         ;;
      down)
         change_volume -5%
         ;;
     *)
         printf "volume <command>\n"
         printf "          up \n"
         printf "         down\n"
    esac
}

main "$@"

Isso seria salvo em /usr/local/bin/volume e seria usado assim

<command>/usr/local/bin/volume up</command>
<command>/usr/local/bin/volume down</command>
    
por 20.09.2016 / 11:42
1

Se você não se importar com o pedido e com o fato de que todos eles serão executados mais ou menos de uma só vez, você pode fazer:

<keybind key="XF86AudioRaiseVolumen">
   <action name="Execute">
     <command>pactl set-sink-volume alsa_output.usb-Focusrite_Scarlett_2i4_USB-00.multichannel-output +5%</command>
   </action>

   <action name="Execute">
     <command>pactl set-sink-volume alsa_output.pci-0000_00_1b.0.analog-stereo +5%</command>
   </action>

   <action name="Execute">
     <command>pactl set-sink-volume alsa_output.usb-Focusrite_Scarlett_2i4_USB-00.analog-surround-40 +5%</command>
   </action>
</keybind>
    
por 20.10.2018 / 04:07

Tags