Xmobar respawning bersih saat memuat ulang xmonad

9

Ini hanya gangguan kecil, tetapi saya telah membuat file konfigurasi XMonad memuat xmobar menggunakan kode ini:

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

Ini bekerja dengan baik, tetapi memunculkan proses xmobar baru setiap kali XMonad dimuat ulang. Aku ingin tahu apakah ada cara mudah untuk membunuh yang lama?

pembaruan : Seperti yang disarankan oleh entropo, saya telah membuat skrip bash seperti ini:

#!/bin/bash

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

/usr/bin/xmobar &

dan panggil script itu dari file konfigurasi XMonad.

Nicolas Buduroi
sumber

Jawaban:

16

Jika Anda memiliki skrip shell untuk memulai XMobar maka Anda 'salah melakukannya'. Anda harus menjalankan xmobar menggunakan fungsi Haskell yang benar di file sumber konfigurasi xmonad.hs. Lihatlah fungsi utama konfigurasi saya:

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

Garis yang menonjol adalah yang ini:

xmonad =<< xmobar myBaseConfig

Itu menjalankan xmobar sebagaimana mestinya dijalankan, bahkan ketika Anda memuat ulang xmonad. Anda mendapatkan fungsi 'xmobar' dari pernyataan:

import XMonad.Hooks.DynamicLog (xmobar)

Yang pada gilirannya berasal dari paket xmonad-contrib .

Jadi Anda tahu, sebagian besar hal yang ingin Anda lakukan dengan XMonad sudah merupakan masalah yang diselesaikan, Anda hanya perlu tahu ke mana harus mencari. Pada dasarnya, tinggalkan saja skrip Anda dan gunakan itu. Saya harap ini membantu.

Robert Massaioli
sumber
2
Yah, saya telah menemukan spawnPipekode di situs web XMonad, benar-benar tidak mudah untuk mengetahui ke mana harus mencari! Tetapi pada akhirnya, saya lebih suka teknik yang saya gunakan karena lebih bersih, menggunakan DynamicLogtidak membunuh proses lama dalam tes saya. Saya sangat suka XMonad, tetapi Haskell bukan bahasa konfigurasi yang baik.
Nicolas Buduroi
1
Oke, apa pun yang berhasil untuk Anda pada akhirnya bagus. Tapi saya pikir Anda salah memikirkannya. Anda tidak mengonfigurasi XMonad: Anda perluas. Haskell cocok untuk ekstensi untuk ekstensi.
Robert Massaioli
Bagi saya ini menciptakan 2 proses baru setiap kali saya memuat ulang xmonad. Menggunakan spawnPipe menciptakan 2 proses tambahan. ps -ax mengembalikan: "/ bin / sh -c /.cabal/bin/xmobar ~ / .xmobarrc:", "/ bin / sh -c xmobar", "~ / .cabal / bin / xmonad ~ / .xmobarrc" dan "xmobar".
fsanches
Menginstal ulang keduanya memperbaiki masalah di pujian saya di atas.
fsanches
1
Saya yakin Anda spawnPipeakan melakukan proses di utas baru. Jika Anda ingin membuat spawnPipeproses anak sebagai gantinya (yang ditutup ketika proses utama melakukannya), saya khawatir Anda harus menulis spawnPipefungsi Anda sendiri .
yyny