Xmobar che respawn in modo pulito quando si ricarica xmonad


9

Questo è solo un piccolo fastidio, ma ho fatto caricare il file di configurazione di XMonad xmobar usando questo codice:

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

Funziona bene, ma genera un nuovo processo xmobar ogni volta che XMonad viene ricaricato. Mi chiedo se c'è un modo semplice per uccidere quello vecchio?

aggiornamento : come suggerito da Entropo, ho creato uno script bash come questo:

#!/bin/bash

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

/usr/bin/xmobar &

e chiama quello script dal file di configurazione di XMonad.

Risposte:



16

Se hai uno script di shell per avviare XMobar, allora stai "facendo qualcosa di sbagliato". Dovresti avviare xmobar usando le funzioni Haskell corrette nel file sorgente di configurazione di xmonad.hs. Dai un'occhiata alla mia funzione principale di configurazione:

-- 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

La linea saliente è questa:

xmonad =<< xmobar myBaseConfig

Questo esegue xmobar come dovrebbe essere eseguito, anche quando si ricarica xmonad. Ottieni la funzione 'xmobar' dall'istruzione:

import XMonad.Hooks.DynamicLog (xmobar)

Che a sua volta proviene dal pacchetto xmonad-contrib .

Quindi vedi, molte cose che vuoi fare con XMonad sono già un problema risolto, devi solo sapere dove cercare. Fondamentalmente, basta abbandonare la sceneggiatura e usarla invece. Spero che questo possa essere d'aiuto.


2
Bene, ho trovato il spawnPipecodice sul sito Web XMonad, non è davvero facile sapere dove cercare! Ma alla fine, preferisco la tecnica che sto usando perché è più pulita, usando DynamicLognon ha ucciso il vecchio processo nei miei test. Mi piace molto XMonad, ma Haskell non è un buon linguaggio di configurazione.
Nicolas Buduroi,

1
Va bene, tutto ciò che funziona per te è buono alla fine. Ma penso che ci stia pensando male. Non configuri XMonad: lo estendi. Haskell il prefetto adatto per l'estensione.
Robert Massaioli,

Per me questo sta creando 2 nuovi processi ogni volta che ricarico xmonad. Utilizzando spawnPipe crea 2 processi aggiuntivi. ps -ax restituisce: "/ bin / sh -c /.cabal/bin/xmobar ~ / .xmobarrc:", "/ bin / sh -c xmobar", "~ / .cabal / bin / xmonad ~ / .xmobarrc" e "xmobar".
fsanches

La reinstallazione di entrambi ha risolto il problema nel mio encomio sopra.
fsanches

1
Sono abbastanza sicuro che il tuo spawnPipefork sarà un processo in un nuovo thread. Se invece vuoi spawnPipecreare un processo figlio (uno che si chiude quando il processo principale lo fa), temo che dovrai scrivere la tua spawnPipefunzione.
yyny,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.