具有以下haskell代码:

import           Control.Concurrent
import           Data.Time.Clock
import           Debug.Trace
import           Graphics.X11
import           Graphics.X11.Xlib.Extras

main :: IO ()
main = do
  d <- openDisplay ""
  loop d

loop :: Display -> IO ()
loop d = do
  time <- getCurrentTime
  (w, _) <- getInputFocus d
  maybeName <- fetchName d w
  windowAttrs <- getWindowAttributes d w
  print $ show time ++ " Name: " ++ show maybeName ++ " Width: " ++ show (wa_width windowAttrs)
  threadDelay 1000000
  loop d

fetchName返回的窗口标题总是Nothing
haskellX11库是Xlib的包装器。
可能相关问题:
窗口的宽度要么正确,要么具有1值。
XFetchName always returns 0

最佳答案

看起来fetchName并不总是填写的。相反,您需要使用_NET_WM_NAME属性:

import           Control.Concurrent
import           Data.Time.Clock
import           Debug.Trace
import           Graphics.X11
import           Graphics.X11.Xlib.Extras

main :: IO ()
main = do
  d <- openDisplay ""
  loop d

loop :: Display -> IO ()
loop d = do
  time <- getCurrentTime
  (w, _) <- getInputFocus d
  a <- internAtom d "_NET_WM_NAME" False
  p <- getTextProperty d w a
  ps <- wcTextPropertyToTextList d p
  windowAttrs <- getWindowAttributes d w
  print $ show time ++ " Name: " ++ show ps ++ " Width: " ++ show (wa_width windowAttrs)
  threadDelay 1000000
  loop d

Xmonad就是这么做的:
https://github.com/xmonad/xmonad/blob/8b055621e92e7ade127043e968f50713c15a00a0/src/XMonad/ManageHook.hs#L71-L80

关于c - X11库中的Haskell fetchName不返回窗口名称,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49887999/

10-11 00:06