From 9c00bdc2187960e31e0e9a732465c7224246f9bf Mon Sep 17 00:00:00 2001 From: Ilya Portnov Date: Sat, 28 May 2011 23:12:12 +0600 Subject: [PATCH] Documentation. Use LHS. --- lib/AppGroups.lhs | 9 ++-- lib/Layouts.hs | 111 ---------------------------------------- lib/Layouts.lhs | 134 +++++++++++++++++++++++++++++++++++++++++++++++++ lib/MPD.hs | 35 ------------- lib/MPD.lhs | 52 +++++++++++++++++++ lib/MyManageHooks.hs | 94 ---------------------------------- lib/MyManageHooks.lhs | 89 ++++++++++++++++++++++++++++++++ lib/Themes.lhs | 4 +- lib/Volume.hs | 29 ----------- lib/Volume.lhs | 44 ++++++++++++++++ xmonad.hs | 2 +- 11 files changed, 328 insertions(+), 275 deletions(-) delete mode 100644 lib/Layouts.hs create mode 100644 lib/Layouts.lhs delete mode 100644 lib/MPD.hs create mode 100644 lib/MPD.lhs delete mode 100644 lib/MyManageHooks.hs create mode 100644 lib/MyManageHooks.lhs delete mode 100644 lib/Volume.hs create mode 100644 lib/Volume.lhs diff --git a/lib/AppGroups.lhs b/lib/AppGroups.lhs index 6fec1bc..16a6c15 100644 --- a/lib/AppGroups.lhs +++ b/lib/AppGroups.lhs @@ -4,13 +4,14 @@ AppGroups — группы приложений Описание -------- -Группа приложений задаётся набором условий на окна. Этот модуль позволяет описать в одном месте -и ManageHook-и, и сочетания клавиш для групп приложений. Кроме того, с группой может быть связано -действие. Это действие запускается вместо переключения на группу, в том случае, если окон в группе -сейчас нет. +Группа приложений задаётся набором условий на окна. Этот модуль позволяет +описать в одном месте и ManageHook-и, и сочетания клавиш для групп приложений. +Кроме того, с группой может быть связано действие. Это действие запускается +вместо переключения на группу, в том случае, если окон в группе сейчас нет. Заголовки модуля ---------------- + Включаем нужные расширения языка. Здесь используются Existentials для организации гетерогенных списков. diff --git a/lib/Layouts.hs b/lib/Layouts.hs deleted file mode 100644 index 2e1ac79..0000000 --- a/lib/Layouts.hs +++ /dev/null @@ -1,111 +0,0 @@ -{-# LANGUAGE ExistentialQuantification, FlexibleInstances, FlexibleContexts, MultiParamTypeClasses, TypeSynonymInstances, DeriveDataTypeable, NoMonomorphismRestriction #-} -module Layouts where - -import Data.Ratio ((%)) - -import XMonad hiding ((|||)) -import XMonad.Hooks.ManageDocks hiding (L,R) -import XMonad.Util.WindowPropertiesRE - --- Import contrib layouts -import XMonad.Layout.AutoMaster -import XMonad.Layout.Column -import XMonad.Layout.Decoration -import XMonad.Layout.PerWorkspace -import XMonad.Layout.LayoutCombinators -import XMonad.Layout.Named -import XMonad.Layout.GridVariants -import XMonad.Layout.IM -import XMonad.Layout.Reflect -import XMonad.Layout.MagicFocus -import XMonad.Layout.CenteredMaster -import XMonad.Layout.OneBig -import XMonad.Layout.NoBorders -import XMonad.Layout.ComboP -import XMonad.Layout.TwoPane -import XMonad.Layout.DecorationAddons -import XMonad.Layout.ButtonDecoration -import XMonad.Layout.WindowSwitcherDecoration -import XMonad.Layout.DraggingVisualizer -import XMonad.Layout.Tabbed -import XMonad.Layout.TrackFloating -import XMonad.Layout.Maximize -import XMonad.Layout.Minimize -import XMonad.Layout.Simplest -import XMonad.Layout.Groups -import XMonad.Layout.LayoutBuilderP -import XMonad.Layout.AutoComboP -import XMonad.Layout.TwoPane - -import qualified XMonad.Layout.WindowNavigation as Nav - -import Themes - -lugChats = RE (Title "lug-mgn" `Or` Title "math") -xmonadChats = RE (Title "xmonad") -programmingChats = RE (Title "programming" `Or` Title "haskell" `Or` Title "python") - -fullscreenRect = Just $ relBox 0 0 1 1 - ----------------------------------------------------- -tWithIM = withIM (1%6) (Role "buddy_list") - -isGfxPanel = Role "gimp-toolbox" `Or` Role "Brush selector" `Or` Role "toolbox_window" `Or` Role "Layers" - -tabs = tabbed shrinkText deco - --- imlayout = addTabs shrinkText deco $ subLayout [] Simplest (autoMaster 2 (1/100) $ Grid 2) -imlayout = (layoutP programmingChats (relBox 0 0 0.55 0.5) fullscreenRect tabs) - $ (layoutP xmonadChats (relBox 0.55 0 1 0.5) Nothing tabs) - $ (layoutP lugChats (relBox 0.45 0.5 1 1) (Just $ relBox 0 0.5 1 1) tabs) - $ (layoutAll (relBox 0 0.5 0.45 1) tabs) -tabgrid = group tabs (Mirror $ Tall 1 (1/100) (2/3)) -tabfull = addTabs shrinkText deco Simplest - -grid = named "grid" $ Grid (2) -vgrid = Grid (1/2) -tiled = Tall 1 (1/100) (1/2) -dwmtile = named "dwm" tiled --- full = named "Full" $ tabbedBottom shrinkText deco -full = Full -mix = named "mix" $ Tall 1 (1/100) (2/3) -mirrored = named "mirror" $ Mirror tiled --- forgimp = named "gimp" $ reflectHoriz (Tall 1 (1/100) (1/4)) -zgrid = magicFocus (centerMaster grid) -autogrid = named "autogrid" (autoMaster 1 (1/100) grid) -autotall = Mirror (autoMaster 1 (1/100) vgrid) -autogrid2 = autoMaster 2 (1/100) grid -books = named "books" (Tall 1 (1/100) (2/3)) --- rowtile = Mirror hortile --- mgrid = centerMaster grid --- forim = named "im" (tWithIM (minimax grid ||| minimax autogrid2 ||| zgrid ||| Full)) -forim = named "im" $ tWithIM (imlayout ||| tabs) -column = Column 1.8 -forgimp = named "gimp" $ withButtons $ combineTwoP (TwoPane 0.03 0.75) column (reflectVert $ Column 0.4) $ Not isGfxPanel -onebig = named "onebig" $ (OneBig (3/4) (3/4)) --- coding = named "coding" $ reflectHoriz $ mastered (1/100) (1/3) (Column 2) - -fortext = autoCombineTwoP 0.1 0.1 0.03 (Mirror $ TwoPane 0.03 0.5) tabs grid (ClassName "Gvim") - -minimax = maximize . minimize - -withButtons = buttonDeco shrinkText decoB - -draggable layout = windowSwitcherDecorationWithButtons shrinkText decoB (draggingVisualizer $ layout) --- draggableButtons = id - --- draggable layout = windowSwitcherDecoration shrinkText decoB (draggingVisualizer $ layout) --- draggable = id - -myLayout = trackFloating $ - smartBorders $ - Nav.configurableNavigation (Nav.navigateBrightness 0.0) $ - avoidStruts $ - -- Tab.modify shrinkText deco $ - onWorkspace "inet" (minimax full) $ - onWorkspace "text" (minimax fortext ||| minimax autogrid2 ||| minimax dwmtile ||| minimax mirrored ||| books ||| autogrid ||| onebig ) $ - onWorkspace "files" (minimax full ||| minimax dwmtile ||| autogrid) $ - onWorkspace "im" forim $ - onWorkspace "term" (minimax full ||| minimax mirrored ||| autogrid) $ - onWorkspace "gimp" (forgimp ||| full ||| grid) $ - onWorkspace "trash" (full ||| autogrid ||| grid) (minimax mirrored ||| full) diff --git a/lib/Layouts.lhs b/lib/Layouts.lhs new file mode 100644 index 0000000..93667e1 --- /dev/null +++ b/lib/Layouts.lhs @@ -0,0 +1,134 @@ +Layouts +======= + +Заголовок и импорты +------------------- + +> {-# LANGUAGE ExistentialQuantification, FlexibleInstances, FlexibleContexts, MultiParamTypeClasses, TypeSynonymInstances, DeriveDataTypeable, NoMonomorphismRestriction #-} +> module Layouts where + +> import Data.Ratio ((%)) + +> import XMonad hiding ((|||)) +> import XMonad.Hooks.ManageDocks hiding (L,R) + +Этот импорт из xmonad-extras. + +> import XMonad.Util.WindowPropertiesRE + +Импорты из xmonad-contrib. + +> import XMonad.Layout.AutoMaster +> import XMonad.Layout.Column +> import XMonad.Layout.Decoration +> import XMonad.Layout.PerWorkspace +> import XMonad.Layout.LayoutCombinators +> import XMonad.Layout.Named +> import XMonad.Layout.GridVariants +> import XMonad.Layout.IM +> import XMonad.Layout.Reflect +> import XMonad.Layout.MagicFocus +> import XMonad.Layout.CenteredMaster +> import XMonad.Layout.OneBig +> import XMonad.Layout.NoBorders +> import XMonad.Layout.ComboP +> import XMonad.Layout.TwoPane +> import XMonad.Layout.DecorationAddons +> import XMonad.Layout.ButtonDecoration +> import XMonad.Layout.WindowSwitcherDecoration +> import XMonad.Layout.DraggingVisualizer +> import XMonad.Layout.Tabbed +> import XMonad.Layout.TrackFloating +> import XMonad.Layout.Maximize +> import XMonad.Layout.Minimize +> import XMonad.Layout.Simplest +> import XMonad.Layout.Groups +> import XMonad.Layout.LayoutBuilderP +> import XMonad.Layout.AutoComboP +> import XMonad.Layout.TwoPane + +> import qualified XMonad.Layout.WindowNavigation as Nav + +Модуль конфига. + +> import Themes + +Вспомогательные определения +--------------------------- + +Группы чатов. + +> lugChats = RE (Title "lug-mgn" `Or` Title "math") +> xmonadChats = RE (Title "xmonad") +> programmingChats = RE (Title "programming" `Or` Title "haskell" `Or` Title "python") + +> fullscreenRect = Just $ relBox 0 0 1 1 + +Модификатор для всяческих ростеров. + +> withRoster = withIM (1%6) (Role "buddy_list") + +> isGfxPanel = Role "gimp-toolbox" `Or` Role "Brush selector" `Or` Role "toolbox_window" `Or` Role "Layers" + +Определения Layout-ов +--------------------- + +Простой layout со вкладками. + +> tabs = tabbed shrinkText deco + +Layout для окон Pidgin. Раскладывает окна с чатами по областям с вкладками, по тематике. + +> imlayout = (layoutP programmingChats (relBox 0 0 0.55 0.5) fullscreenRect tabs) +> $ (layoutP xmonadChats (relBox 0.55 0 1 0.5) Nothing tabs) +> $ (layoutP lugChats (relBox 0.45 0.5 1 1) (Just $ relBox 0 0.5 1 1) tabs) +> $ (layoutAll (relBox 0 0.5 0.45 1) tabs) + +> tabgrid = group tabs (Mirror $ Tall 1 (1/100) (2/3)) +> tabfull = addTabs shrinkText deco Simplest + +> grid = named "grid" $ Grid (2) +> vgrid = Grid (1/2) +> tiled = Tall 1 (1/100) (1/2) +> dwmtile = named "dwm" tiled + +> full = Full +> mix = named "mix" $ Tall 1 (1/100) (2/3) +> mirrored = named "mirror" $ Mirror tiled +> -- forgimp = named "gimp" $ reflectHoriz (Tall 1 (1/100) (1/4)) +> zgrid = magicFocus (centerMaster grid) +> autogrid = named "autogrid" (autoMaster 1 (1/100) grid) +> autotall = Mirror (autoMaster 1 (1/100) vgrid) +> autogrid2 = autoMaster 2 (1/100) grid +> books = named "books" (Tall 1 (1/100) (2/3)) + +> forim = named "im" $ withRoster (imlayout ||| tabs) +> column = Column 1.8 +> forgimp = named "gimp" $ withButtons $ combineTwoP (TwoPane 0.03 0.75) column (reflectVert $ Column 0.4) $ Not isGfxPanel +> onebig = named "onebig" $ (OneBig (3/4) (3/4)) + + +> fortext = autoCombineTwoP 0.1 0.1 0.03 (Mirror $ TwoPane 0.03 0.5) tabs grid (ClassName "Gvim") + +> minimax = maximize . minimize + +> withButtons = buttonDeco shrinkText decoB + +> draggable layout = windowSwitcherDecorationWithButtons shrinkText decoB (draggingVisualizer $ layout) + +Главное определение +------------------- + +> myLayout = trackFloating $ +> smartBorders $ +> Nav.configurableNavigation (Nav.navigateBrightness 0.0) $ +> avoidStruts $ +> -- Tab.modify shrinkText deco $ +> onWorkspace "inet" (minimax full) $ +> onWorkspace "text" (minimax fortext ||| minimax autogrid2 ||| minimax dwmtile ||| minimax mirrored ||| books ||| autogrid ||| onebig ) $ +> onWorkspace "files" (minimax full ||| minimax dwmtile ||| autogrid) $ +> onWorkspace "im" forim $ +> onWorkspace "term" (minimax full ||| minimax mirrored ||| autogrid) $ +> onWorkspace "gimp" (forgimp ||| full ||| grid) $ +> onWorkspace "trash" (full ||| autogrid ||| grid) (minimax mirrored ||| full) + diff --git a/lib/MPD.hs b/lib/MPD.hs deleted file mode 100644 index 5af2e80..0000000 --- a/lib/MPD.hs +++ /dev/null @@ -1,35 +0,0 @@ -module MPD - (togglePlaying, - stopPlaying, - nextTrack, - previousTrack - ) where - -import XMonad - -import Network.MPD - -import Themes (mpdHost, mpdPort) - -mpd :: MPD a -> X () -mpd action = do - io $ withMPDEx mpdHost mpdPort "" action - return () - -togglePlaying :: X () -togglePlaying = mpd toggle - where - toggle = status >>= \st -> - case stState st of - Playing -> pause True - _ -> play Nothing - -stopPlaying :: X () -stopPlaying = mpd stop - -nextTrack :: X () -nextTrack = mpd next - -previousTrack :: X () -previousTrack = mpd previous - diff --git a/lib/MPD.lhs b/lib/MPD.lhs new file mode 100644 index 0000000..94f052b --- /dev/null +++ b/lib/MPD.lhs @@ -0,0 +1,52 @@ +Управление MPD +============== + +Заголовок и импорты +------------------- + +> module MPD +> (togglePlaying, +> stopPlaying, +> nextTrack, +> previousTrack +> ) where + +> import XMonad + +Импорт из пакета libmpd. + +> import Network.MPD + +Модуль конфига. + +> import Themes (mpdHost, mpdPort) + +Определения +----------- + +Вспомогательная «обёртка». + +> mpd :: MPD a -> X () +> mpd action = do +> io $ withMPDEx mpdHost mpdPort "" action +> return () + +Играть/пауза. + +> togglePlaying :: X () +> togglePlaying = mpd toggle +> where +> toggle = status >>= \st -> +> case stState st of +> Playing -> pause True +> _ -> play Nothing + +> stopPlaying :: X () +> stopPlaying = mpd stop + +> nextTrack :: X () +> nextTrack = mpd next + +> previousTrack :: X () +> previousTrack = mpd previous + diff --git a/lib/MyManageHooks.hs b/lib/MyManageHooks.hs deleted file mode 100644 index e64b784..0000000 --- a/lib/MyManageHooks.hs +++ /dev/null @@ -1,94 +0,0 @@ -{-# LANGUAGE NoMonomorphismRestriction #-} -module MyManageHooks - (myManageHook) - where - --- To be able to query X11 atoms and such on -import Foreign.C.Types (CLong) -import Graphics.X11.Xlib.Extras - -import Data.Char (toLower) - -import XMonad -import qualified XMonad.StackSet as W -import XMonad.Hooks.ManageHelpers hiding (C) -import XMonad.Actions.DynamicWorkspaces - -import AppGroups -import GroupsSetup (myApps) -import CommonFunctions ((~?), isFloat) - -myManageHook = basehooks <+> manageMenus <+> manageDialogs <+> floatPlasma - ------------------------------------------------------------------------- --- Window rules: - --- Float all menus -manageMenus = checkMenu --> doFloat --- Float all dialogs -manageDialogs = checkDialog --> doFloat - --- Check if window has named atom with given value -checkAtom name value = ask >>= \w -> liftX $ do - a <- getAtom name - val <- getAtom value - mbr <- getProp w a - case mbr of - Just [r] -> return $ elem (fromIntegral r) [val] - _ -> return False - --- Check if window is a menu (for Gimp tear-off menus, for example) -checkMenu = checkAtom "_NET_WM_WINDOW_TYPE" "_NET_WM_WINDOW_TYPE_MENU" --- Check if window is a dialog -checkDialog = checkAtom "_NET_WM_WINDOW_TYPE" "_NET_WM_WINDOW_TYPE_DIALOG" --- checkDesktop = checkAtom "_NET_WM_WINDOW_TYPE" "_NET_WM_WINDOW_TYPE_DESKTOP" --- checkDockAtom = checkAtom "_NET_WM_WINDOW_TYPE" "_NET_WM_WINDOW_TYPE_DOCK" --- checkOverride = checkAtom "_NET_WM_WINDOW_TYPE" "_KDE_NET_WM_WINDOW_TYPE_OVERRIDE" --- checkFullscreen = checkAtom "_NET_WM_STATE" "_NET_WM_STATE_FULLSCREEN" - --- | Helper to read a property -getProp :: Window -> Atom -> X (Maybe [CLong]) -getProp w a = withDisplay $ \dpy -> io $ getWindowProperty32 dpy a w - --- mNot = liftM not - -windowWorkspace :: Window -> X WorkspaceId -windowWorkspace win = do - cls <- withDisplay $ \d -> fmap resName $ io $ getClassHint d win - let cls' = map (anySeparatorToSpace . toLower) cls - wksp = head $ words cls' - return wksp - where - anySeparatorToSpace c | c `elem` "-._#" = ' ' - | otherwise = c - -moveToOwnWorkspace :: Apps -> ManageHook -moveToOwnWorkspace apps = do - window <- ask - matching <- liftX $ runQuery (oneOf $ map query apps) window - floating <- liftX $ isFloat window - if matching || floating - then doF id - else do - wksp <- liftX (windowWorkspace window) - if (wksp `notElem` notCreateWorkspace) - then do - liftX $ addWorkspace wksp - doF (W.shift wksp) - else doF id - -basehooks = composeOne (apps2hooks myApps) <+> moveToOwnWorkspace myApps <+> transience' - -notCreateWorkspace = ["gmrun", "plasma", "gcolor2", "ksnapshot"] - -floatPlasma = composeAll - [ className =? "Qt-subapplication" --> doFloat, - title =? "Qt-subapplication" --> doFloat, - title =? "Recently opened documents" --> doCenterFloat, - className ~? "[pP]lasma-desktop" --> doFloat, - className =? "XCalendar" --> doFloat, - className =? "Qwerty.py" --> doCenterFloat, - title =? "Копирование" --> doFloat, - title =? "Перемещение" --> doFloat, - className =? "dashboard" --> doFullscreen ] - diff --git a/lib/MyManageHooks.lhs b/lib/MyManageHooks.lhs new file mode 100644 index 0000000..2a3a5c1 --- /dev/null +++ b/lib/MyManageHooks.lhs @@ -0,0 +1,89 @@ +ManageHooks +=========== + +Заголовки и импорты +------------------- + +> {-# LANGUAGE NoMonomorphismRestriction #-} +> module MyManageHooks +> (myManageHook) +> where + +> import Data.Char + +> import XMonad +> import qualified XMonad.StackSet as W +> import XMonad.Hooks.ManageHelpers hiding (C) +> import XMonad.Actions.DynamicWorkspaces + +> import CommonFunctions +> import AppGroups +> import GroupsSetup (myApps) + +Правила для окон +---------------- + +Главное определение. + +> myManageHook = basehooks <+> manageMenus <+> manageDialogs <+> floatPlasma + +Сделать плавающими отрывающиеся меню + +> manageMenus = checkMenu --> doFloat +> where +> checkMenu = isInProperty "_NET_WM_WINDOW_TYPE" "_NET_WM_WINDOW_TYPE_MENU" + +Сделать плавающими диалоги + +> manageDialogs = isDialog --> doFloat + +Основная часть +ManageHook+-ов + +> basehooks = composeOne (apps2hooks myApps) <+> moveToOwnWorkspace myApps <+> transience' + +Сделать плавающими некоторые окна. + +> floatPlasma = composeAll +> [ className =? "Qt-subapplication" --> doFloat, +> title =? "Qt-subapplication" --> doFloat, +> title =? "Recently opened documents" --> doCenterFloat, +> className ~? "[pP]lasma-desktop" --> doFloat, +> className =? "XCalendar" --> doFloat, +> className =? "Qwerty.py" --> doCenterFloat, +> title =? "Копирование" --> doFloat, +> title =? "Перемещение" --> doFloat ] + +«Придумать» название рабочего места, на которое поместить окно. За основу +берётся свойство WM_CLASS. + +> windowWorkspace :: Window -> X WorkspaceId +> windowWorkspace win = do +> cls <- withDisplay $ \d -> fmap resName $ io $ getClassHint d win +> let cls' = map (anySeparatorToSpace . toLower) cls +> wksp = head $ words cls' +> return wksp +> where +> anySeparatorToSpace c | c `elem` "-._#" = ' ' +> | otherwise = c + +Для таких окон специальные рабочие места создаваться не будут. + +> notCreateWorkspace = ["gmrun", "plasma", "gcolor2", "ksnapshot"] + +Перемещать каждое приложение, не входящее ни в одну из групп, на своё рабочее место. + +> moveToOwnWorkspace :: Apps -> ManageHook +> moveToOwnWorkspace apps = do +> window <- ask +> matching <- liftX $ runQuery (oneOf $ map query apps) window +> floating <- liftX $ isFloat window +> if matching || floating +> then doF id +> else do +> wksp <- liftX (windowWorkspace window) +> if (wksp `notElem` notCreateWorkspace) +> then do +> liftX $ addWorkspace wksp +> doF (W.shift wksp) +> else doF id +> diff --git a/lib/Themes.lhs b/lib/Themes.lhs index 4b32d70..7493916 100644 --- a/lib/Themes.lhs +++ b/lib/Themes.lhs @@ -21,12 +21,14 @@ Themes — настройки внешнего вида Определения ----------- +Параметры соединения с сервером MPD: имя хоста и порт. + > mpdHost = "portnov.local" > mpdPort = 6600 Шрифт. -> myFont = "xft:Ubuntu-10" +> myFont = "xft:Ubuntu-11" Тема для +X.Prompt+. diff --git a/lib/Volume.hs b/lib/Volume.hs deleted file mode 100644 index 554190e..0000000 --- a/lib/Volume.hs +++ /dev/null @@ -1,29 +0,0 @@ - -module Volume - (changeVolumeBy, - toggleMute) where - -import Control.Monad (when) - -import XMonad - -import Sound.ALSA.Mixer - -changeVolumeBy :: Integer -> X () -changeVolumeBy i = io $ do - result <- getControlByName "default" "Master" - whenJust result $ \control -> - whenJust (playback $ volume control) $ \playbackVolume -> do - (min, max) <- getRange playbackVolume - mbVol <- getChannel FrontLeft $ value $ playbackVolume - whenJust mbVol $ \vol -> - when ((i > 0 && vol < max) || (i < 0 && vol > min)) - $ setChannel FrontLeft (value $ playbackVolume) $ vol + i - -toggleMute :: X () -toggleMute = io $ do - result <- getControlByName "default" "Master" - whenJust result $ \control -> - whenJust (playback $ switch control) $ \playbackSwitch -> do - mbsw <- getChannel FrontLeft playbackSwitch - whenJust mbsw $ \sw -> setChannel FrontLeft playbackSwitch $ not sw diff --git a/lib/Volume.lhs b/lib/Volume.lhs new file mode 100644 index 0000000..a819833 --- /dev/null +++ b/lib/Volume.lhs @@ -0,0 +1,44 @@ +Управление громкостью через ALSA +================================ + +Заголовок и импорты +------------------- + +> module Volume +> (changeVolumeBy, +> toggleMute) where + +> import Control.Monad (when) + +> import XMonad + +Импорт из пакета alsa-mixer. + +> import Sound.ALSA.Mixer + +Определения +----------- + +Изменить громкость (в канале Master) на i пунктов. + +> changeVolumeBy :: Integer -> X () +> changeVolumeBy i = io $ do +> result <- getControlByName "default" "Master" +> whenJust result $ \control -> +> whenJust (playback $ volume control) $ \playbackVolume -> do +> (min, max) <- getRange playbackVolume +> mbVol <- getChannel FrontLeft $ value $ playbackVolume +> whenJust mbVol $ \vol -> +> when ((i > 0 && vol < max) || (i < 0 && vol > min)) +> $ setChannel FrontLeft (value $ playbackVolume) $ vol + i + +Включить/выключить звук (в канале Master). + +> toggleMute :: X () +> toggleMute = io $ do +> result <- getControlByName "default" "Master" +> whenJust result $ \control -> +> whenJust (playback $ switch control) $ \playbackSwitch -> do +> mbsw <- getChannel FrontLeft playbackSwitch +> whenJust mbsw $ \sw -> setChannel FrontLeft playbackSwitch $ not sw + diff --git a/xmonad.hs b/xmonad.hs index 1a450ef..7ef6fc6 100644 --- a/xmonad.hs +++ b/xmonad.hs @@ -33,7 +33,7 @@ baseLogHook = logHook baseConfig main = do replace xmonad $ ewmh $ baseConfig { - terminal = "gnome-terminal", + terminal = myTerminal, focusFollowsMouse = False, borderWidth = myBorderWidth, modMask = mod4Mask, -- 1.7.2.3