content: import Graphics.UI.Gtk
  import Control.Monad (when)
  import Control.Monad.Trans (liftIO)
  
  maximumWindowDimensions :: IO ()
  maximumWindowDimensions = do
      -- initialize the internal state of the GTK toolkit
      initGUI
      -- create a window
      window <- windowNew
      -- quit the application when the window is closed
      on window objectDestroy mainQuit
      -- query the size of the window when its dimensions change
      on window configureEvent printSize
      -- get the screen the window will be drawn upon
      screen <- windowGetScreen window
      -- get the size of the screen
      x <- screenGetWidth screen
      y <- screenGetHeight screen
      -- print the dimensions of the screen
      putStrLn ("The screen is " ++ show x ++ " pixels wide and " ++
          show y ++ " pixels tall for an undecorated fullscreen window.")
      -- maximize the window and show it. printSize will then be called
      windowMaximize window
      widgetShowAll window
      -- run the main GTK loop.
      -- close the window manually.
      mainGUI
  
  -- On my Xfce4 desktop, the configure_event is called three times when a
  -- top level window is maximized. The first time, the window size
  -- returned is the size prior to maximizing, and the last two times
  -- it is the size after maximizing.
  -- If the window is (un)maximized manually, the size returned is always
  -- the size of the unmaximized window.
  -- That means: either GTK or Xfce4 does not handle window maximization
  -- correctly, or the GTK bindings for Haskell are buggy, or there is an
  -- error in this program.
  
  printSize :: EventM EConfigure Bool
  printSize = do
      -- get the window that has been resized
      w <- eventWindow
      -- is the window maximized?
      s <- liftIO $ drawWindowGetState w
      when (WindowStateMaximized `elem` s) $ do
          -- get the size of the window that has been resized
          (x, y) <- eventSize
          -- print the dimensions out
          liftIO $ putStrLn ("The inner window region is now " ++ show x ++
              " pixels wide and " ++ show y ++ " pixels tall.")
      return True
  