Иконки для обозначения макетов в XMobar (XMonad)

Я знаю, что XMobar поддерживает растровые иконки, и я смог их настроить. Однако я также хочу использовать значки для обозначения текущей компоновки XMonad, но XMobar включает ее stdin от XMonad. И я не мог найти способ передать растровые иконки вместо обычных символов.

Так как же передать значки вместо символов для обозначения макета XMonad в XMobar?

Моя текущая часть конфигурации относительно макетов:

defaultLayouts = smartBorders(avoidStruts(
  renamed [Replace "R"] (ResizableTall 1 (3/100) (1/2) [])
  ||| renamed [Replace "R!"] (Mirror (ResizableTall 1 (3/100) (1/2) []))
  ||| renamed [Replace "F"] (noBorders Full)
  ||| renamed [Replace "#"] (Grid)
  ||| renamed [Replace "3C"] (ThreeColMid 1 (3/100) (3/4))
  ||| renamed [Replace "O"] (Circle)))

chatLayout = renamed [Replace "Chat"] 
  $ avoidStruts $ withIM (0.2) isPidgin 
  $ reflectHoriz $ withIM (0.2) isSkype (Grid) 
  where 
    isSkype = (Title "zoresvit - Skype™")
    isPidgin = (Title "Buddy List")

fullLayout = renamed [Replace "F"] $ avoidStruts $ noBorders $ (Full)
myLayouts = onWorkspace "η" chatLayout $ defaultLayouts

main = do
  xmproc <- spawnPipe "xmobar ~/.xmobarrc"
  xmonad $ withUrgencyHook NoUrgencyHook $ defaultConfig {
        borderWidth = myBorderWidth
      , focusedBorderColor = myFocusedBorderColor
      , handleEventHook = fullscreenEventHook
      , layoutHook = myLayouts
      , manageHook = manageHook defaultConfig
          <+> composeAll myManagementHooks
          <+> manageDocks
      , modMask = myModMask
      , normalBorderColor = myNormalBorderColor
      , startupHook = do
          spawn "~/.xmonad/startup_hook.sh"
      , terminal = myTerminal
      , workspaces = myWorkspaces
      , logHook = dynamicLogWithPP $ xmobarPP {
            ppOutput = hPutStrLn xmproc
          , ppCurrent = xmobarColor solarizedGreen "" . wrap myCurrentWSLeft myCurrentWSRight
          , ppHidden = xmobarColor solarizedBase0 ""
          , ppHiddenNoWindows = xmobarColor solarizedBase02 ""
          , ppLayout = xmobarColor solarizedCyan ""
          , ppTitle = xmobarColor solarizedBase1 "" . shorten myTitleLength
          , ppUrgent = xmobarColor solarizedRed "" . wrap myUrgentWSLeft myUrgentWSRight
          , ppVisible = xmobarColor solarizedBase01 "" . wrap myVisibleWSLeft myVisibleWSRight
          }
      } `additionalKeys` myKeyBindings

2 ответа

Решение

Просто добавьте это к вашему xmonad.hs:

import XMonad.Layout.Named
myLayout = named "<icon=/home/foo/bar/icon.xpm/>" $ ResizableTall 1 (3/100) (1/2) []

В качестве альтернативы вы можете изменить способ отображения заголовков макета в XMonad. Во-первых, измените строку

      , ppLayout = xmobarColor solarizedCyan ""

читать

      , ppLayout = xmobarColor solarizedCyan "" . myLayoutPrinter

Затем добавьте в ваш файл следующую функцию:

myLayoutPrinter :: String -> String
myLayoutPrinter "Full" = "<icon=layout_full.xbm/>"
myLayoutPrinter "Tall" = "<icon=layout_tall.xbm/>"
myLayoutPrinter "Mirror Tall" = "<icon=layout_mirror_tall.xbm/>"
myLayoutPrinter x = x

Очевидно, вам необходимо настроить имена используемых вами макетов, а также имена значков.

Теоретически, вы могли бы сделать еще один шаг вперед, если бы вы хотели стать действительно безвкусными и придать каждому макету свой цвет. Вы бы на самом деле упростили строку ppLayout до

      , ppLayout = myLayoutPrinter

Добавлены пользовательские цвета в myLayoutPrinter

myLayoutPrinter :: String -> String
myLayoutPrinter "Full" = xmobarColor "red" "" "<icon=layout_full.xbm/>"
myLayoutPrinter "Tall" = xmobarColor "green" "" "<icon=layout_tall.xbm/>"
myLayoutPrinter "Mirror Tall" = xmobarColor "blue" "" "<icon=layout_mirror_tall.xbm/>"
myLayoutPrinter x = xmobarColor "white" "" x
Другие вопросы по тегам