Отримання xmonad для показу імені поточного робочого простору в xmobar


1

Новачок у xmonad / xmobar / haskell, намагаючись отримати ім’я поточної робочої області, яка відображатиметься у xmobar. Поки що у мене є цей xmonad.hs:

module Main where
  import XMonad
  import XMonad.Hooks.SetWMName
  import XMonad.Hooks.DynamicLog
  import XMonad.Actions.WorkspaceNames
  import XMonad.Util.EZConfig(additionalKeys)
  import XMonad.Prompt
  import XMonad.Util.EZConfig

  main = xmonad =<< xmobar myConfig

  myConfig = defaultConfig { startupHook = setWMName "LG3D" , logHook = myLogHook } `additionalKeys` [ ((mod4Mask, xK_r      ), renameWorkspace defaultXPConfig) ]

  myLogHook = workspaceNamesPP xmobarPP >>= dynamicLogString >>= xmonadPropLog

Це, здається, дозволяє мені змінити назву робочої області (принаймні з'являється підсказка з назвою "Ім'я робочої області:" і приймає мій вклад).

Однак ім'я xmobar не відображає.

Відповіді:


1

Ви змішуєте два різні способи надсилання інформації на xmobar.

Тут:

main = xmonad =<< xmobar myConfig

Ви використовуєте функцію xmobarзручності. Ви можете натиснути на посилання на джерело документації, щоб побачити, як це визначено. Він використовує statusBarфункцію для запуску xmobar із замовчуванням xmobarPP. Ця statusBarфункція використовується spawnPipeдля запуску програми рядка стану та модифікує PPвихід на цю трубу.

Це панель, яку ви бачите, із принтером та реєстратором за замовчуванням, який друкує лише теги робочих просторів. XMonad.Actions.WorkspaceNamesМодуль використовується асоціюють імена з робочими просторами тегів. Він надає workspaceNamesPPфункцію, яка поєднується з a PPдля отримання імен.

І ось:

myLogHook = workspaceNamesPP xmobarPP >>= dynamicLogString >>= xmonadPropLog

Ви використовуєте workspaceNamesPPфункцію з xmobarPP, передаєте результат тому, dynamicLogStringщо повертає статус як рядок, і передаєте цей рядок, xmonadPropLogякий записує його як _XMONAD_LOGвластивість у кореневому вікні. Це інший спосіб передачі інформації до xmobar, який можна налаштувати на зчитування цього властивості . У цьому випадку вам не доведеться запускати xmobar з xmonad.

Тож вам слід вирішити, яким способом ви хочете скористатися.

Наприклад, ви можете продовжувати запускати xmobar з XMonad за допомогою spawnPipeта myLogHookзаписати статус на трубу, яку ви переходите до нього:

import XMonad.Util.Run -- spawnPipe and associated functions

main = xmonad . myConfig =<< spawnPipe "xmobar"

myConfig pipe = defaultConfig { startupHook = setWMName "LG3D" , 
                                logHook = myLogHook pipe} 
                `additionalKeys` 
                 [((mod4Mask, xK_r), renameWorkspace defaultXPConfig)]

myLogHook pipe = workspaceNamesPP xmobarPP {ppOutput = hPutStrLn pipe}
                   >>= dynamicLogWithPP

statusBarФункція також змінює manageHookі layoutHookдодати manageDocksі avoidStrutsвід XMonad.Hooks.ManageDocks модуля до них. Ви повинні використовувати цей модуль, щоб панель та вікна не наступали один на одного. У manageDocksмарки XMonad ігнорувати вікна типу доці або на робочому столі. avoidStrutsМодифікатор розташування змінює макети для резервування місця для барів, в відповідно до їх _NET_WM_STRUT_PARTIAL власності.

manageHook layoutHookі handleEventHookє частиною XConfig, щоб додати функцію, надану XMonad.Hooks.ManageDocksмодулем:

 myConfig pipe = defaultConfig 
       { 
        startupHook = setWMName "LG3D" , 
        logHook = myLogHook pipe,
        manageHook = manageDocks <+> manageHook defaultConfig,
        layoutHook = avoidStruts $ layoutHook defaultConfig,
        handleEventHook = docksEventHook <+> handleEventHook defaultConfig
       } `additionalKeys` [((mod4Mask, xK_r), renameWorkspace defaultXPConfig) ]

xmobarФункція , яку ви використовували також пов'язує моди + B клавіш швидкого виклику sendMessage ToggleStrutsдля перемикання штрихових прогалин, так що якщо ви хочете , щоб KeyBinding ви повинні додати його теж.

Також:

import XMonad.Util.EZConfig(additionalKeys)
import XMonad.Util.EZConfig

Ви імпортуєте additionalKeysз XMonad.Util.EZConfigмодуля, а потім імпортуєте весь XMonad.Util.EZConfigмодуль.


Дякую! Близько там. Єдине дивне, що зараз xmobarховає частину екрану (наприклад, він приховує панель меню терміналів gnome), що раніше не відбувалося.
mitchus

Так, це тому, що statusBarтакож додано manageDocksі avoidStrutsфункції з модуля XMonad.Hooks.ManageDocks для вас. Відредаговано.
Леяз

"Ви повинні використовувати [XMonad.Hooks.ManageDocks], щоб панель та вікна не наступали один на одного." - намагаються, але не впевнені, як додати це до свого прикладу.
mitchus
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.