Czyste odrodzenie xmobar po przeładowaniu xmonada

9

To tylko mała irytacja, ale sprawiłem, że plik konfiguracyjny XMonad ładuje xmobar za pomocą tego kodu:

xmproc <- spawnPipe "/use/bin/xmobar ~/.xmobarrc"

Działa dobrze, ale odradza nowy proces xmobar za każdym razem, gdy XMonad jest ładowany ponownie. Zastanawiam się, czy istnieje prosty sposób na zabicie starego?

aktualizacja : Jak sugeruje entropo, stworzyłem skrypt bash, taki jak ten:

#!/bin/bash

for PID in `pgrep xmobar`; do
    kill ${PID} > /dev/null &
done

/usr/bin/xmobar &

i wywołaj ten skrypt z pliku konfiguracyjnego XMonad.

Nicolas Buduroi
źródło

Odpowiedzi:

16

Jeśli masz skrypt powłoki, aby uruchomić XMobar, to „robisz to źle”. Powinieneś uruchomić xmobar używając poprawnych funkcji Haskell w pliku źródłowym konfiguracji xmonad.hs. Spójrz na moją główną funkcję configs:

-- put it all together
main = do
    nScreens <- countScreens    -- just in case you are on a laptop like me count the screens so that you can go
    xmonad =<< xmobar myBaseConfig
      { modMask = myModMask
      , workspaces = withScreens nScreens myWorkspaces
      , layoutHook = myLayoutHook nScreens
      , manageHook = myManageHook
      , borderWidth = myBorderWidth
      , normalBorderColor = myNormalBorderColor
      , focusedBorderColor = myFocusedBorderColor
      , keys = myKeys
      , mouseBindings = myMouseBindings
      , logHook = myLogHook
      }
    where
        myLogHook = dynamicLogXinerama

myBaseConfig = gnomeConfig

Istotna linia jest następująca:

xmonad =<< xmobar myBaseConfig

Działa xmobar tak, jak powinien, nawet po ponownym załadowaniu xmonada. Otrzymasz funkcję „xmobar” z instrukcji:

import XMonad.Hooks.DynamicLog (xmobar)

Co z kolei pochodzi z pakietu xmonad-contrib .

Widzisz, większość rzeczy, które chcesz zrobić z XMonad, to już rozwiązany problem, musisz tylko wiedzieć, gdzie szukać. Zasadniczo po prostu porzuć skrypt i użyj go zamiast tego. Mam nadzieję, że to pomoże.

Robert Massaioli
źródło
2
Cóż, znalazłem spawnPipekod na stronie XMonad, naprawdę nie jest łatwo wiedzieć, gdzie szukać! Ale ostatecznie wolę technikę, ponieważ jest czystsza, DynamicLogponieważ nie zabiłem starego procesu w moich testach. Naprawdę lubię XMonad, ale Haskell nie jest dobrym językiem konfiguracyjnym.
Nicolas Buduroi,
1
Okej, wszystko co dla ciebie działa, jest dobre. Ale myślę, że źle o tym myślisz. Nie konfigurujesz XMonad: rozszerzasz go. Haskell idealnie nadaje się do przedłużenia.
Robert Massaioli,
Dla mnie jest to tworzenie 2 nowych procesów za każdym razem, gdy ponownie ładuję xmonad. Korzystanie ze spawnPipe tworzy 2 dodatkowe procesy. ps -ax zwraca: "/ bin / sh -c /.cabal/bin/xmobar ~ / .xmobarrc:", "/ bin / sh -c xmobar", "~ / .cabal / bin / xmonad ~ / .xmobarrc" i „xmobar”.
fsanches
Ponowne zainstalowanie obu rozwiązało problem w moim poleceniu powyżej.
fsanches
1
Jestem prawie pewien, spawnPipeże rozwiniesz proces w nowym wątku. Jeśli chcesz spawnPipezamiast tego utworzyć proces potomny (taki, który zamyka się, gdy robi to główny proces), obawiam się, że będziesz musiał napisać własną spawnPipefunkcję.
rrr