我仍然在努力克服Haskell的X11绑定。现在,我想检测用户关闭窗口的事件。到目前为止我最好的尝试:
import Graphics.X11.Xlib
import Graphics.X11.Xlib.Extras
import Control.Concurrent (threadDelay)
import Data.Bits
main :: IO ()
main = do
dpy <- openDisplay ""
let dflt = defaultScreen dpy
border = blackPixel dpy dflt
background = whitePixel dpy dflt
rootw <- rootWindow dpy dflt
win <- createSimpleWindow dpy rootw 0 0 300 200 1 border background
setTextProperty dpy win "Hello World" wM_NAME
mapWindow dpy win
moveWindow dpy win 0 0
selectInput dpy win (structureNotifyMask .|. exposureMask)
updateWin dpy win
updateWin :: Display -> Window -> IO ()
updateWin dpy win = do
sync dpy True
allocaXEvent $ \e -> do
nextEvent dpy e
ev <- getEvent e
putStrLn $ eventName ev
threadDelay (1000000)
updateWin dpy win
但是我没有得到这个事件,而是获得了以下输出:
ConfigureNotify
XIO: fatal IO error 11 (Resource temporarily unavailable) on X server ":0.0"
after 26 requests (25 known processed) with 5 events remaining.
造成这种情况的原因是什么?处理它的正确方法是什么?
答案 0 :(得分:1)
您需要观看ClientMessage事件。没有掩码,也不需要选择它们,只需检测它们并破坏窗口即可。您还需要设置WM_DELETE_WINDOW协议。参见例如here。查找ClientMessage和WM_DELETE_WINDOW。
在某些时候,除了WM_DELETE_WINDOW之外,您还需要拦截其他客户端消息。您将需要检查ClientMessage内容,而不仅仅是。类型,但现在不需要。