首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XMonad卷配置不工作

XMonad卷配置不工作
EN

Stack Overflow用户
提问于 2015-03-30 00:42:39
回答 2查看 2.2K关注 0票数 5

我最近进入了XMonad,不出所料,我对Haskell一点也不了解。我正在尝试配置我的xmonad.hs文件,以便能够控制卷。但是,现在,即使我的xmonad.hs文件编译时没有错误,我也无法控制卷。

我从以下链接获得卷控制代码:http://dmwit.com/volume/

这是我的配置文件:

代码语言:javascript
复制
import XMonad
import XMonad.Util.Run(spawnPipe)
import XMonad.Hooks.DynamicLog
import XMonad.Hooks.ManageDocks
import XMonad.Actions.Volume
import XMonad.Util.Dzen
import Data.Map (fromList)
import Data.Monoid (mappend)
import System.IO

alert = dzenConfig centered . show . round
centered =
        onCurr (center 150 66)
    >=> font "-*-helvetica-*-r-*-*-64-*-*-*-*-*-*-*"
    >=> addArgs ["-fg", "#80c0ff"]
    >=> addArgs ["-bg", "#000040"]

main = do 
        xmproc <- spawnPipe "xmobar /home/david/.xmobarrc"
        xmonad $ defaultConfig
                {
                        manageHook = manageDocks <+> manageHook defaultConfig
                        , layoutHook = avoidStruts  $  layoutHook defaultConfig
                        , logHook = dynamicLogWithPP xmobarPP
                                { ppOutput = hPutStrLn xmproc
                                , ppTitle = xmobarColor "green" "" . shorten 50
                                }
                        , modMask = mod4Mask 
                        , keys =
                            keys defaultConfig `mappend`
                            \c -> fromList [
                                ((0, xK_F6), lowerVolume 4 >>= alert),
                                ((0, xK_F7), raiseVolume 4 >>= alert)
                            ]
                }

我修改了代码如下,但是卷没有改变:

代码语言:javascript
复制
main = do 
    xmproc <- spawnPipe "xmobar /home/luren/.xmobarrc"
    xmonad $ defaultConfig
            {
                    manageHook = manageDocks <+> manageHook defaultConfig
                    , layoutHook = avoidStruts  $  layoutHook defaultConfig
                    , logHook = dynamicLogWithPP xmobarPP
                            { ppOutput = hPutStrLn xmproc
                            , ppTitle = xmobarColor "green" "" . shorten 50
                            }
                    , modMask = mod4Mask 
                    , keys =
                        keys defaultConfig `mappend`
                        \c -> fromList [
                            ((0, 0x1008FF11), spawn "amixer -D pulse sset Master 4-"),
                            ((0, 0x1008FF13), spawn "amixer -D pulse sset Master 4+")
                        ]
            }

(完)

这些键是我笔记本电脑上的卷媒体键的代码。

我四处窥探,看到了一些其他的配置。我决定做一个小测试,并使音频低音量键打印Hi ppl!被压的时候。不幸的是,这是行不通的。

代码语言:javascript
复制
main = do 
    xmproc <- spawnPipe "xmobar /home/luren/.xmobarrc"
    xmonad $ defaultConfig
            {
                    manageHook = manageDocks <+> manageHook defaultConfig
                    , layoutHook = avoidStruts  $  layoutHook defaultConfig
                    , logHook = dynamicLogWithPP xmobarPP
                            { ppOutput = hPutStrLn xmproc
                            , ppTitle = xmobarColor "green" "" . shorten 50
                            }
                    , modMask = mod4Mask
            }
            `additionalKeys`
            [
                    ((0, xF86XK_AudioLowerVolume), spawn "echo 'Hi ppl!'"),
                    ((0, xF86XK_AudioRaiseVolume), spawn "amixer -D pulse sset Master 15%+")
            ]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-03 22:26:59

这是我写的用来控制脉冲音频音量的脚本。将其转储到一个名为pulse_control.pl的文件中,并确保它是可执行的和您的PATH中的。它使用pacmdpactl,您可能需要将它们与发行版的包管理器一起安装。

代码语言:javascript
复制
#!/usr/bin/perl

use List::Util qw[min max];
use Getopt::Long;

my $_IS_MUTED;
my $_TOGGLE_MUTE;
my $_VOL;
my $_INC_VOL;
my $_DEC_VOL;

GetOptions(
    "is-muted"    => \$_IS_MUTED
,   "toggle-mute" => \$_TOGGLE_MUTE
,   "volume"      => \$_VOL
,   "inc-vol"     => \$_INC_VOL
,   "dec-vol"     => \$_DEC_VOL
);

my $sink = `pactl info | sed -rn 's/^Default Sink: (.+)\$/\\1/gp'`;
chomp $sink;

sub ismuted {
    my $ismuted = `pacmd dump | grep "$sink" | grep sink-mute | grep yes`;
    chomp $ismuted;
    if ($ismuted ne "") {
        return 1;
    } else {
        0;
    }
}

sub curvol {
    my $volline = `pacmd dump | grep "$sink" | grep sink-vol`;
    if ($volline =~ m/(0x[0-9a-f]+)/ ) {
        return hex $1;
    } else {
        return 0;
    }
}

if ($_IS_MUTED) {
    print ismuted(), "\n";
}
elsif($_TOGGLE_MUTE) {
    if (ismuted()) {
        `pactl set-sink-mute $sink 0`;
    } else {
        `pactl set-sink-mute $sink 1`;
    }
}
elsif($_VOL) {
    print int(curvol() * 100.0 / hex("0x10000")), "%\n";
}
elsif($_INC_VOL) {
    my $newvol = min(hex("0x10000"), curvol() + int((hex("0x10000") * .04)));
    `pactl set-sink-volume $sink $newvol`;
}
elsif($_DEC_VOL) {
    my $newvol = max(0, curvol() - int((hex("0x10000") * .04)));
    `pactl set-sink-volume $sink $newvol`;
}

然后在xmonad配置中,我将卷控制绑定到ctrl+alt+(页面向上/页面向下/结束)。

代码语言:javascript
复制
`additionalKeys`
[
    ((controlMask .|. mod1Mask, xK_Page_Up), spawn "pulse_control.pl -inc")
,   ((controlMask .|. mod1Mask, xK_Page_Down), spawn "pulse_control.pl -dec")
,   ((controlMask .|. mod1Mask, xK_End), spawn "pulse_control.pl -toggle")
]
票数 4
EN

Stack Overflow用户

发布于 2021-04-26 07:59:09

这也可以使用下面的spawn来实现

代码语言:javascript
复制
      [ ((0, 0x1008FF11), spawn "amixer -q sset Master 2%-"),
        ((0, 0x1008FF13), spawn "amixer -q sset Master 2%+"),
        ((0, 0x1008FF12), spawn "amixer set Master toggle")]

这些是多媒体键,但您也可以使用x86Vol绑定而不是十六进制。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29336746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档