Reaparecer limpiamente xmobar cuando se recarga xmonad

9

Esto es solo una pequeña molestia, pero hice que el archivo de configuración de XMonad cargue xmobar usando este código:

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

Funciona bien, pero genera un nuevo proceso xmobar cada vez que se recarga XMonad. Me pregunto si hay una manera fácil de matar al viejo.

actualización : como lo sugiere entropo, he creado un script bash como este:

#!/bin/bash

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

/usr/bin/xmobar &

y llame a ese script desde el archivo de configuración de XMonad.

Nicolas Buduroi
fuente

Respuestas:

16

Si tiene un script de shell para iniciar XMobar, entonces está 'haciéndolo mal'. Debería iniciar xmobar utilizando las funciones correctas de Haskell en el archivo fuente de configuración xmonad.hs. Echa un vistazo a la función principal de mi configuración:

-- 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 línea más destacada es esta:

xmonad =<< xmobar myBaseConfig

Eso ejecuta xmobar como debería ejecutarse, incluso cuando recarga xmonad. Obtiene la función 'xmobar' de la declaración:

import XMonad.Hooks.DynamicLog (xmobar)

Que a su vez proviene del paquete xmonad-contrib .

Como puede ver, la mayoría de las cosas que desea hacer con XMonad ya son un problema resuelto, solo tiene que saber dónde buscar. Básicamente, solo abandona tu script y úsalo en su lugar. Espero que esto ayude.

Robert Massaioli
fuente
2
Bueno, he encontrado el spawnPipecódigo en el sitio web de XMonad, ¡realmente no es fácil saber dónde buscar! Pero al final, prefiero la técnica que estoy usando, ya que es más limpia, el uso DynamicLogno eliminó el proceso anterior en mis pruebas. Realmente me gusta XMonad, pero Haskell no es un buen lenguaje de configuración.
Nicolas Buduroi
1
Bien, lo que sea que funcione para ti es bueno al final. Pero creo que lo estás pensando mal. No configuras XMonad: lo extiendes. Haskell, el prefecto apto para la extensión.
Robert Massaioli
Para mí, esto está creando 2 nuevos procesos cada vez que vuelvo a cargar xmonad. El uso de spawnPipe crea 2 procesos adicionales. ps -ax devuelve: "/ bin / sh -c /.cabal/bin/xmobar ~ / .xmobarrc:", "/ bin / sh -c xmobar", "~ / .cabal / bin / xmonad ~ / .xmobarrc" y "xmobar".
fsanches
La reinstalación de ambos solucionó el problema en mi recomendación anterior.
fsanches
1
Estoy bastante seguro de que tu spawnPipebifurcará un proceso en un nuevo hilo. Si desea spawnPipecrear un proceso secundario en su lugar (uno que se cierra cuando lo hace el proceso principal), me temo que tendrá que escribir su propia spawnPipefunción.
yyny