You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断Xmonad中特定应用运行状态?修复xmobar检测失效

问题解决:Xmonad中检测xmobar运行状态及通用应用检测方法

为什么你的isApplicationRunning检测不到xmobar?

xmobar属于dock类型窗口,Xmonad的allWindows仅返回普通的、被管理的应用窗口,dock窗口默认不会被包含在windowset的普通窗口列表里,因此你的遍历逻辑无法找到它。

修复toggleXmobar的两种方法

方法1:直接调用系统命令检测进程(简单高效)

通过系统pgrep命令直接检测进程是否存在,这种方法不依赖Xmonad的窗口管理逻辑,适用于所有应用:

import XMonad
import System.Process (readProcess)
import Control.Monad.IO.Class (liftIO)

toggleXmobar :: X ()
toggleXmobar = do
  isRunning <- isApplicationRunning "xmobar"
  if isRunning
    then spawn "pkill xmobar"
    else spawn "xmobar"

isApplicationRunning :: String -> X Bool
isApplicationRunning appName = do
  -- 执行pgrep,输出非空则表示进程存在
  output <- liftIO $ readProcess "pgrep" [appName] ""
  return $ not (null output)

方法2:通过Xmonad接口遍历所有窗口(包括dock)

如果想基于X窗口属性检测,需要遍历root窗口下的所有子窗口(包括dock),检查窗口的className:

import XMonad
import Graphics.X11.Xlib (getClassHint, queryTree, Display)
import Control.Monad (foldM)

toggleXmobar :: X ()
toggleXmobar = do
  isRunning <- isApplicationRunning "xmobar"
  if isRunning
    then spawn "pkill xmobar"
    else spawn "xmobar"

isApplicationRunning :: String -> X Bool
isApplicationRunning appName = withDisplay $ \dpy -> do
  rootWin <- asks theRoot
  -- 递归遍历所有子窗口,检查className
  let checkWindow :: Display -> Window -> X Bool
      checkWindow d w = do
        (_, className) <- io $ getClassHint d w
        if className == appName
          then return True
          else do
            (_, children) <- io $ queryTree d w
            foldM (\acc child -> do
                    res <- checkWindow d child
                    return $ acc || res) False children
  checkWindow dpy rootWin

Xmonad中判断应用是否运行的通用思路

  • 进程检测法:使用pgrep/ps等系统命令,优点是简单通用,不管应用是否有窗口;缺点是可能误判同名进程(比如多个同名脚本)。
  • 窗口属性检测法:针对带窗口的应用,通过Xmonad的X11接口遍历窗口,检查className/title/resourceName等属性。需要注意窗口类型:
    • 普通应用窗口:可以用allWindows获取
    • dock/面板类窗口:需要从root窗口递归遍历,或使用XMonad.Hooks.ManageDocks中的相关接口获取dock窗口列表
    • 桌面背景类窗口:同样需要从root窗口枚举

内容的提问来源于stack exchange,提问作者kwonryul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 08:57:30