Xmobar beim erneuten Laden von xmonad sauber wieder erscheinen lassen

9

Dies ist nur ein kleiner Ärger, aber ich habe die XMonad-Konfigurationsdatei dazu gebracht, xmobar mit diesem Code zu laden:

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

Es funktioniert gut, aber es erzeugt jedes Mal einen neuen xmobar-Prozess, wenn XMonad neu geladen wird. Ich frage mich, ob es einen einfachen Weg gibt, den alten zu töten.

Update : Wie von Entropo vorgeschlagen, habe ich ein Bash-Skript wie dieses erstellt:

#!/bin/bash

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

/usr/bin/xmobar &

und rufen Sie dieses Skript aus der XMonad-Konfigurationsdatei auf.

Nicolas Buduroi
quelle

Antworten:

16

Wenn Sie ein Shell-Skript zum Starten von XMobar haben, machen Sie es falsch. Sie sollten xmobar mit den richtigen Haskell-Funktionen in der Konfigurationsquelldatei xmonad.hs starten. Schauen Sie sich die Hauptfunktion meiner Konfiguration an:

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

Die hervorstechende Linie ist diese:

xmonad =<< xmobar myBaseConfig

Dadurch wird xmobar so ausgeführt, wie es ausgeführt werden sollte, auch wenn Sie xmonad neu laden. Sie erhalten die Funktion 'xmobar' aus der Anweisung:

import XMonad.Hooks.DynamicLog (xmobar)

Was wiederum aus dem xmonad-contrib-Paket stammt .

Sie sehen also, die meisten Dinge, die Sie mit XMonad tun möchten, sind bereits ein gelöstes Problem. Sie müssen nur wissen, wo Sie suchen müssen. Lassen Sie Ihr Skript einfach fallen und verwenden Sie es stattdessen. Ich hoffe das hilft.

Robert Massaioli
quelle
2
Nun, ich habe den spawnPipeCode auf der XMonad-Website gefunden. Es ist wirklich nicht einfach zu wissen, wo man suchen muss! Aber am Ende bevorzuge ich die Technik, die ich verwende, da sie sauberer ist und DynamicLogden alten Prozess in meinen Tests nicht beendet hat. Ich mag XMonad wirklich, aber Haskell ist keine gute Konfigurationssprache.
Nicolas Buduroi
1
Okay, was auch immer für Sie funktioniert, ist am Ende gut. Aber ich denke du denkst falsch darüber nach. Sie konfigurieren XMonad nicht: Sie erweitern es. Haskell der Präfekt fit für die Erweiterung.
Robert Massaioli
Für mich bedeutet dies, dass jedes Mal, wenn ich xmonad neu lade, zwei neue Prozesse erstellt werden. Mit spawnPipe werden 2 zusätzliche Prozesse erstellt. ps -ax gibt zurück: "/ bin / sh -c /.cabal/bin/xmobar ~ / .xmobarrc:", "/ bin / sh -c xmobar", "~ / .cabal / bin / xmonad ~ / .xmobarrc" und "xmobar".
Fsanches
Durch die Neuinstallation beider wurde das Problem in meinem obigen Lob behoben.
Fsanches
1
Ich bin mir ziemlich sicher, dass Sie spawnPipeeinen Prozess in einem neuen Thread auslösen werden. Wenn Sie spawnPipestattdessen einen untergeordneten Prozess erstellen möchten (einen, der geschlossen wird, wenn der Hauptprozess ausgeführt wird), müssen Sie leider Ihre eigene spawnPipeFunktion schreiben .
yyny