Чисто возрождается xmobar при перезагрузке xmonad

9

Это немного раздражает, но я заставил файл конфигурации XMonad загрузить xmobar, используя этот код:

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

Он работает хорошо, но порождает новый процесс xmobar при каждой перезагрузке XMonad. Интересно, есть ли простой способ убить старого?

Обновление : по предложению entropo я создал скрипт bash, подобный этому:

#!/bin/bash

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

/usr/bin/xmobar &

и вызовите этот скрипт из файла конфигурации XMonad.

Николас Будурой
источник

Ответы:

16

Если у вас есть сценарий оболочки для запуска XMobar, то вы «делаете это неправильно». Вы должны запустить xmobar, используя правильные функции Haskell в исходном файле конфигурации xmonad.hs. Взгляните на основные функции моих конфигов:

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

Характерная черта такова:

xmonad =<< xmobar myBaseConfig

Он запускает xmobar так, как должен, даже когда вы перезагружаете xmonad. Вы получаете функцию 'xmobar' из оператора:

import XMonad.Hooks.DynamicLog (xmobar)

Что, в свою очередь, происходит из пакета xmonad-contrib .

Итак, вы видите, что большинство вещей, которые вы хотите сделать с XMonad, уже решены, вам просто нужно знать, где искать. По сути, просто бросьте свой сценарий и используйте его вместо этого. Надеюсь, это поможет.

Роберт Массайоли
источник
2
Ну, я нашел spawnPipeкод на веб-сайте XMonad, это действительно нелегко узнать, где искать! Но, в конце концов, я предпочитаю технику, которую я использую, поскольку она чище, использование DynamicLogне убило старый процесс в моих тестах. Мне действительно нравится XMonad, но Haskell не является хорошим языком конфигурации.
Николас Будурои
1
Хорошо, все, что работает для вас, хорошо в конце. Но я думаю, что вы думаете об этом неправильно. Вы не настраиваете XMonad: вы расширяете его. Хаскель идеально подходит для расширения.
Роберт Массайоли
Для меня это создает 2 новых процесса каждый раз, когда я перезагружаю xmonad. Использование spawnPipe создает 2 дополнительных процесса. ps -ax возвращает: "/ bin / sh -c /.cabal/bin/xmobar ~ / .xmobarrc:", "/ bin / sh -c xmobar", "~ / .cabal / bin / xmonad ~ / .xmobarrc" и "xmobar".
Празднества
Переустановка обоих исправила проблему в моей рекомендации выше.
fsanches
1
Я уверен, что вы spawnPipeсоздадите процесс в новом потоке. Если вы хотите spawnPipeвместо этого создать дочерний процесс (тот, который закрывается, когда основной процесс это делает), я боюсь, что вам придется написать свою собственную spawnPipeфункцию.
Ыыны