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 に答える