Como você faz com que as teclas de volume e a tecla mudo funcionem no Xmonad


22

Sou novo no Xmonad (instalei ontem) e, como nunca usei o haskell antes, achei a configuração um pouco confusa para mim. Fiz com que o xmobar e a bandeja funcionassem, mas não tenho ideia de como criar teclas multimídia para ajustar o volume. Alguém pode ajudar com isso?

Pergunta adicional: Como você gerencia seu volume no xmonad. Você usa o ícone da bandeja ou outras coisas assim?

Aqui está minha configuração do xmonad:

import XMonad
import XMonad.Hooks.DynamicLog
import XMonad.Hooks.ManageDocks
import XMonad.Util.EZConfig(additionalKeys)
import System.IO

main = xmonad =<< statusBar myBar myPP toggleStrutKey myConfig

-- Command to launch the bar
myBar = "xmobar"

-- Custom PP, it determines what is written to the bar
myPP = xmobarPP { ppCurrent = xmobarColor "#429942" "" . wrap "<" ">" }

-- Key bindings to toggle the gap for the bar
toggleStrutKey XConfig {XMonad.modMask = modMask} = (modMask, xK_b)

myConfig = defaultConfig {
    manageHook = manageDocks <+> manageHook defaultConfig,
    layoutHook = avoidStruts $ layoutHook defaultConfig,
    modMask = mod4Mask -- Rebind Mod to windows key
    } `additionalKeys`
    [ ((mod4Mask .|. shiftMask, xK_z), spawn "xscreensaver-command -lock")
    ]

Respostas:


24

Use 'xev' e toque nas teclas multimídia para descobrir seus nomes. Um pode ser 'XF86XK_AudioMute'. Em seguida, observe o conteúdo de '/usr/include/X11/XF86keysym.h' e procure o nome. No meu sistema, 'XF86XK_AudioMute' é '0x1008FF12'.

Largue isso onde você colocaria uma chave no seu arquivo de configuração. Pode ser assim:

import XMonad
import XMonad.Hooks.DynamicLog
import XMonad.Hooks.ManageDocks
import XMonad.Util.EZConfig(additionalKeys)
import System.IO

-CORTAR-

 } `additionalKeys`
    [ ((mod4Mask .|. shiftMask, xK_z), spawn "xscreensaver-command -lock"),
      ((0                     , 0x1008FF11), spawn "amixer -q sset Master 2%-"),
      ((0                     , 0x1008FF13), spawn "amixer -q sset Master 2%+"),
      ((0                     , 0x1008FF12), spawn "amixer set Master toggle")
    ]

'amixer' ajustará seu volume. O '0' substituindo o mod4Mask permite que você toque na tecla multimídia sem pressionar a tecla mod.


se o conjunto amixer Mestre 2 não funciona para o seu sistema, tente amixer set Master 2% -
Zhenjie

1
Quando uso o xev e pressiono as teclas de volume no meu laptop HP, não recebo códigos, mas o comando showkey mostra-os como keycode 114 e keycode 115. Como preciso alterar esse arquivo de configuração do XMonad para funcionar com minhas teclas?
valentt

No Ubuntu 13.04 isso funcionou copiar / colar sem procurar os símbolos das teclas.
Cory Klein

2
Se o mudo acima não puder silenciar, tente amixer -D pulse set Master toggle.
Zw324

1
Problema com a tecla Mute: Quando inicio xeve pressiono a tecla Mute, não há nada para encontrar no terminal. (Outras teclas estão bem.) Eu olhei para cima /usr/include/X11/XF86keysym.he descobri o seguinte: #define XF86XK_AudioMute 0x1008FF12 /* Mute sound from the system */Você sabe qual é o problema da minha tecla mudo? Obrigado.
Nick

14

Veja este Graphics.X11.ExtraTypes.XF86 para obter as chaves que você deseja e adicionar ao seu arquivo de configuração:

import Graphics.X11.ExtraTypes.XF86
myKeys conf@(XConfig {XMonad.modMask = modm}) = M.fromList $
[ ...
, ((0, xF86XK_AudioLowerVolume   ), spawn "amixer set Master 2-")
, ((0, xF86XK_AudioRaiseVolume   ), spawn "amixer set Master 2+")
, ((0, xF86XK_AudioMute          ), spawn "amixer set Master toggle")
...]

Eu recebo um erro com esta configuração: "xmonad.hs: 29: 1: erro de análise (recuo possivelmente incorreto) Verifique o arquivo quanto a erros." Essa linha é onde "[..." começa ... Você sabe por que isso acontece?
valentt

4
Usar o Graphics.X11.ExtraTypes.XF86 é a melhor solução para facilitar a leitura.
quer

@valentt A linha com os pontos é apenas um exemplo. Deve parecer assim, então, em vez dos três pontos, você tem sua primeira chave definida:[ ((modMask, xK_e ), spawn "dmenu_run")
erik 4/13

9

Se você estiver usando o pulseaudio, pactltambém deve funcionar.

, ((0 , xF86XK_AudioRaiseVolume), spawn "pactl set-sink-volume 0 +1.5%")
, ((0 , xF86XK_AudioLowerVolume), spawn "pactl set-sink-volume 0 -- -1.5%")
, ((0 , xF86XK_AudioMute), spawn "pactl set-sink-mute 0 toggle")
]

0é identificação do coletor. pactl list short sinksmostrará a lista de afundamentos.

pactl stat|grep 'Default Sink' | cut -f2 -d':'

mostrará o coletor padrão atual. Você pode usar o nome do coletor em vez da identificação numérica.

Doulble dash --diz 'isso não é opção (como -h), apenas valor' para pactl.


1
Agradável! No entanto, o --não funcionou para mim em 15.10, apenas removê-lo fez o truque. Além disso, há um nome especial @DEFAULT_SINK@, para que você não precise se preocupar com nomes / números específicos do dispositivo.
IGEL

1
Isto é perfeito, substituindo 0com @DEFAULT_SINK@nos comandos acima! Pelo menos para aqueles que mudam de outros DEs - muito obrigado a você!
Jan D

Esta resposta tem o benefício de ultrapassar 100% em vez de limitar (como tampas de amixador). O ruim é que ele pára de funcionar quando você toca a música de um coletor diferente.
isopor voa

3

Se amixer set Master 2-não funcionar. Tente em amixer -D pulse set Master 2-vez disso. Também 2%-e 2%+vai mudar o volume de 2 por cento, o que pode ser mais fácil de usar. Você pode testar esses comandos no terminal para ajustá-los ao seu gosto antes de colocá-los no arquivo de configuração do xmonad.


... -D pulse ...trabalhou para mim! também, um -qsinalizador acalma a saída
Josh.F
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.