Я использую xmonad и хочу включить функцию UrgencyHook, чтобы я знал, когда кто-то говорит со мной в pidgin. Для этого я использую XMonad.Hooks.UrgencyHook
. Я использую dzen2 и conky для строки состояния, и я просто хочу, чтобы xmonad подчеркнул, что пиджин рабочей области включен, когда это требует внимания.
Теперь я попытался использовать dzenUrgencyHook, и это сработало, но я на самом деле хочу, чтобы xmonad выделил рабочую область в текущем баре dzen2, который я открыл, и вот тут возникает проблема, поскольку ничего не происходит.
Таким образом, это похоже на проблему конфигурации, так как при работе с dzenUrgencyHook я предполагаю, что pidgin фактически отправляет сигнал WM_URGENT.
Вот конфиг, который я сейчас имею:
-- ~/.xmonad/xmonad.hs
-- Imports {{{
import XMonad
-- Prompt
import XMonad.Prompt
import XMonad.Prompt.RunOrRaise (runOrRaisePrompt)
import XMonad.Prompt.AppendFile (appendFilePrompt)
-- Hooks
import XMonad.Operations
import System.IO
import System.Exit
import XMonad.Util.Run
import XMonad.Actions.CycleWS
import XMonad.Hooks.ManageDocks
import XMonad.Hooks.ManageHelpers
import XMonad.Hooks.SetWMName
import XMonad.Hooks.DynamicLog
import XMonad.Hooks.UrgencyHook
import XMonad.Hooks.FadeInactive
import XMonad.Hooks.EwmhDesktops
import XMonad.Layout.NoBorders (smartBorders, noBorders)
import XMonad.Layout.PerWorkspace (onWorkspace, onWorkspaces)
import XMonad.Layout.Reflect (reflectHoriz)
import XMonad.Layout.IM
import XMonad.Layout.SimpleFloat
import XMonad.Layout.Spacing
import XMonad.Layout.ResizableTile
import XMonad.Layout.LayoutHints
import XMonad.Layout.LayoutModifier
import XMonad.Layout.Grid
import Data.Ratio ((%))
import qualified XMonad.StackSet as W
import qualified Data.Map as M
--}}}
-- Config {{{
-- Define Terminal
myTerminal = "gnome-terminal"
-- Define modMask
modMask' :: KeyMask
modMask' = mod4Mask
-- Define workspaces
myWorkspaces = ["1:main","2:web","3:vim","4:chat","5:music", "6:gimp", "7:misc"]
-- Dzen/Conky
myXmonadBar = "dzen2 -x '1440' -y '0' -h '24' -w '640' -ta 'l' -fg '#FFFFFF' -bg '#1B1D1E'"
myStatusBar = "conky -c /home/brafales/.xmonad/.conky_dzen | dzen2 -x '2080' -w '1040' -h '24' -ta 'r' -bg '#1B1D1E' -fg '#FFFFFF' -y '0'"
myBitmapsDir = "/home/brafales/.xmonad/dzen2"
--}}}
-- Main {{{
main = do
dzenLeftBar <- spawnPipe myXmonadBar
dzenRightBar <- spawnPipe myStatusBar
xmonad $ withUrgencyHook NoUrgencyHook $ defaultConfig
{ terminal = myTerminal
, workspaces = myWorkspaces
, keys = keys'
, modMask = modMask'
, layoutHook = layoutHook'
, manageHook = manageHook'
, logHook = myLogHook dzenLeftBar >> fadeInactiveLogHook 0xdddddddd
, normalBorderColor = colorNormalBorder
, focusedBorderColor = colorFocusedBorder
, borderWidth = 2
, startupHook = setWMName "LG3D"
}
--}}}
-- Hooks {{{
-- ManageHook {{{
manageHook' :: ManageHook
manageHook' = (composeAll . concat $
[ [resource =? r --> doIgnore | r <- myIgnores] -- ignore desktop
, [className =? c --> doShift "1:main" | c <- myDev ] -- move dev to main
, [className =? c --> doShift "2:web" | c <- myWebs ] -- move webs to main
, [className =? c --> doShift "3:vim" | c <- myVim ] -- move webs to main
, [className =? c --> doShift "4:chat" | c <- myChat ] -- move chat to chat
, [className =? c --> doShift "5:music" | c <- myMusic ] -- move music to music
, [className =? c --> doShift "6:gimp" | c <- myGimp ] -- move img to div
, [className =? c --> doCenterFloat | c <- myFloats ] -- float my floats
, [name =? n --> doCenterFloat | n <- myNames ] -- float my names
, [isFullscreen --> myDoFullFloat ]
])
where
role = stringProperty "WM_WINDOW_ROLE"
name = stringProperty "WM_NAME"
-- classnames
myFloats = ["Smplayer","MPlayer","VirtualBox","Xmessage","XFontSel","Downloads","Nm-connection-editor"]
myWebs = ["Firefox","Google-chrome","Chromium", "Chromium-browser"]
myMovie = ["Boxee","Trine"]
myMusic = ["Rhythmbox","Spotify"]
myChat = ["Pidgin","Buddy List"]
myGimp = ["Gimp"]
myDev = ["gnome-terminal"]
myVim = ["Gvim"]
-- resources
myIgnores = ["desktop","desktop_window","notify-osd","stalonetray","trayer"]
-- names
myNames = ["bashrun","Google Chrome Options","Chromium Options"]
-- a trick for fullscreen but stil allow focusing of other WSs
myDoFullFloat :: ManageHook
myDoFullFloat = doF W.focusDown <+> doFullFloat
-- }}}
layoutHook' = onWorkspaces ["1:main","5:music"] customLayout $
onWorkspaces ["6:gimp"] gimpLayout $
onWorkspaces ["4:chat"] imLayout $
customLayout2
--Bar
myLogHook :: Handle -> X ()
myLogHook h = dynamicLogWithPP $ defaultPP
{
ppCurrent = dzenColor "#ebac54" "#1B1D1E" . pad
, ppVisible = dzenColor "white" "#1B1D1E" . pad
, ppHidden = dzenColor "white" "#1B1D1E" . pad
, ppHiddenNoWindows = dzenColor "#7b7b7b" "#1B1D1E" . pad
, ppUrgent = dzenColor "black" "red" . pad
, ppWsSep = " "
, ppSep = " | "
, ppLayout = dzenColor "#ebac54" "#1B1D1E" .
(\x -> case x of
"ResizableTall" -> "^i(" ++ myBitmapsDir ++ "/tall.xbm)"
"Mirror ResizableTall" -> "^i(" ++ myBitmapsDir ++ "/mtall.xbm)"
"Full" -> "^i(" ++ myBitmapsDir ++ "/full.xbm)"
"Simple Float" -> "~"
_ -> x
)
, ppTitle = (" " ++) . dzenColor "white" "#1B1D1E" . dzenEscape
, ppOutput = hPutStrLn h
}
-- Layout
customLayout = avoidStruts $ tiled ||| Mirror tiled ||| Full ||| simpleFloat
where
tiled = ResizableTall 1 (2/100) (1/2) []
customLayout2 = avoidStruts $ Full ||| tiled ||| Mirror tiled ||| simpleFloat
where
tiled = ResizableTall 1 (2/100) (1/2) []
gimpLayout = avoidStruts $ withIM (0.11) (Role "gimp-toolbox") $
reflectHoriz $
withIM (0.15) (Role "gimp-dock") Full
imLayout = avoidStruts $ withIM (1%5) (And (ClassName "Pidgin") (Role "buddy_list")) Grid
--}}}
-- Theme {{{
-- Color names are easier to remember:
colorOrange = "#FD971F"
colorDarkGray = "#1B1D1E"
colorPink = "#F92672"
colorGreen = "#A6E22E"
colorBlue = "#66D9EF"
colorYellow = "#E6DB74"
colorWhite = "#CCCCC6"
colorNormalBorder = "#CCCCC6"
colorFocusedBorder = "#fd971f"
barFont = "terminus"
barXFont = "inconsolata:size=12"
xftFont = "xft: inconsolata-14"
--}}}
-- Prompt Config {{{
mXPConfig :: XPConfig
mXPConfig =
defaultXPConfig { font = barFont
, bgColor = colorDarkGray
, fgColor = colorGreen
, bgHLight = colorGreen
, fgHLight = colorDarkGray
, promptBorderWidth = 0
, height = 14
, historyFilter = deleteConsecutive
}
-- Run or Raise Menu
largeXPConfig :: XPConfig
largeXPConfig = mXPConfig
{ font = xftFont
, height = 22
}
-- }}}
-- Key mapping {{{
keys' conf@(XConfig {XMonad.modMask = modMask}) = M.fromList $
[ ((modMask, xK_p ), runOrRaisePrompt largeXPConfig)
, ((modMask .|. shiftMask, xK_Return ), spawn $ XMonad.terminal conf)
, ((modMask, xK_F2 ), spawn "gmrun")
, ((modMask .|. shiftMask, xK_c ), kill)
, ((modMask .|. shiftMask, xK_l ), spawn "slock")
-- Programs
, ((0, xK_Print ), spawn "scrot -e 'mv $f ~/screenshots/'")
, ((modMask, xK_o ), spawn "chromium-browser")
, ((modMask, xK_m ), spawn "nautilus --no-desktop --browser")
-- Media Keys
, ((0, 0x1008ff12 ), spawn "amixer -q sset Headphone toggle") -- XF86AudioMute
, ((0, 0x1008ff11 ), spawn "amixer -q sset Headphone 5%-") -- XF86AudioLowerVolume
, ((0, 0x1008ff13 ), spawn "amixer -q sset Headphone 5%+") -- XF86AudioRaiseVolume
, ((0, 0x1008ff14 ), spawn "rhythmbox-client --play-pause")
, ((0, 0x1008ff17 ), spawn "rhythmbox-client --next")
, ((0, 0x1008ff16 ), spawn "rhythmbox-client --previous")
-- layouts
, ((modMask, xK_space ), sendMessage NextLayout)
, ((modMask .|. shiftMask, xK_space ), setLayout $ XMonad.layoutHook conf) -- reset layout on current desktop to default
, ((modMask, xK_b ), sendMessage ToggleStruts)
, ((modMask, xK_n ), refresh)
, ((modMask, xK_Tab ), windows W.focusDown) -- move focus to next window
, ((modMask, xK_j ), windows W.focusDown)
, ((modMask, xK_k ), windows W.focusUp )
, ((modMask .|. shiftMask, xK_j ), windows W.swapDown) -- swap the focused window with the next window
, ((modMask .|. shiftMask, xK_k ), windows W.swapUp) -- swap the focused window with the previous window
, ((modMask, xK_Return ), windows W.swapMaster)
, ((modMask, xK_t ), withFocused $ windows . W.sink) -- Push window back into tiling
, ((modMask, xK_h ), sendMessage Shrink) -- %! Shrink a master area
, ((modMask, xK_l ), sendMessage Expand) -- %! Expand a master area
, ((modMask, xK_comma ), sendMessage (IncMasterN 1))
, ((modMask, xK_period ), sendMessage (IncMasterN (-1)))
-- workspaces
, ((modMask .|. controlMask, xK_Right ), nextWS)
, ((modMask .|. shiftMask, xK_Right ), shiftToNext)
, ((modMask .|. controlMask, xK_Left ), prevWS)
, ((modMask .|. shiftMask, xK_Left ), shiftToPrev)
-- quit, or restart
, ((modMask .|. shiftMask, xK_q ), io (exitWith ExitSuccess))
, ((modMask, xK_q ), spawn "killall conky dzen2 && && sleep 2 && /home/brafales/.cabal/bin/xmonad --recompile && /home/brafales/.cabal/bin/xmonad --restart")
]
++
-- mod-[1..9] %! Switch to workspace N
-- mod-shift-[1..9] %! Move client to workspace N
[((m .|. modMask, k), windows $ f i)
| (i, k) <- zip (XMonad.workspaces conf) [xK_1 .. xK_9]
, (f, m) <- [(W.greedyView, 0), (W.shift, shiftMask)]]
++
--
-- mod-{w,e,r}, Switch to physical/Xinerama screens 1, 2, or 3
-- mod-shift-{w,e,r}, Move client to screen 1, 2, or 3
--
[((m .|. modMask, key), screenWorkspace sc >>= flip whenJust (windows . f))
| (key, sc) <- zip [xK_w, xK_e, xK_r] [0..]
, (f, m) <- [(W.view, 0), (W.shift, shiftMask)]]
--}}}
-- vim:foldmethod=marker sw=4 sts=4 ts=4 tw=0 et ai nowrap
Теперь я ожидаю, что «4: чат» (где работает pidgin) переместится на красный фон и черный передний план, но на самом деле ничего не происходит. Интересно, что я делаю не так, поскольку я проверил похожие конфигурации и, по-видимому, они одинаковые.
Я бегу xmonad 0.9.2
Ура!