1

我仍在为 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.

这是什么原因造成的?处理它的正确方法是什么?

4

1 回答 1

1

您需要观看 ClientMessage 事件。没有掩码,也不需要选择它们,只需检测它们并销毁窗口即可。您还需要设置 WM_DELETE_WINDOW 协议。参见例如这里。查找 ClientMessage 和 WM_DELETE_WINDOW。

在某些时候,您会想要拦截除 WM_DELETE_WINDOW 之外的其他客户端消息。您将需要检查 ClientMessage 内容,而不仅仅是。类型,但目前不需要。

于 2012-11-18T11:00:41.063 回答