New patches: [getWMNormalHints Peter De Wachter **20070604192340] { hunk ./Graphics/X11/Xlib/Extras.hsc 778 +------------------------------------------------------------------------ +-- Size hints + +data SizeHints = SizeHints + { sh_min_size :: Maybe (Dimension, Dimension) + , sh_max_size :: Maybe (Dimension, Dimension) + , sh_resize_inc :: Maybe (Dimension, Dimension) + , sh_aspect :: Maybe ((Dimension, Dimension), (Dimension, Dimension)) + , sh_base_size :: Maybe (Dimension, Dimension) + , sh_win_gravity :: Maybe (BitGravity) + } + +pMinSizeBit = 4 +pMaxSizeBit = 5 +pResizeIncBit = 6 +pAspectBit = 7 +pBaseSizeBit = 8 +pWinGravityBit = 9 + +instance Storable SizeHints where + alignment _ = alignment (undefined :: CInt) + sizeOf _ = #{size XSizeHints} + + poke p sh = do + let whenSet f x = maybe (return ()) x (f sh) + let pokeFlag b = do flag <- #{peek XSizeHints, flags} p :: IO CLong + #{poke XSizeHints, flags} p (setBit flag b) + #{poke XSizeHints, flags} p (0 :: CLong) + whenSet sh_min_size $ \(w, h) -> do + pokeFlag pMinSizeBit + #{poke XSizeHints, min_width } p w + #{poke XSizeHints, min_height } p h + whenSet sh_max_size $ \(w, h) -> do + pokeFlag pMaxSizeBit + #{poke XSizeHints, max_width } p w + #{poke XSizeHints, max_height } p h + whenSet sh_resize_inc $ \(w, h) -> do + pokeFlag pResizeIncBit + #{poke XSizeHints, width_inc } p w + #{poke XSizeHints, height_inc } p w + whenSet sh_aspect $ \((minx, miny), (maxx, maxy)) -> do + pokeFlag pAspectBit + #{poke XSizeHints, min_aspect.x} p minx + #{poke XSizeHints, min_aspect.y} p miny + #{poke XSizeHints, max_aspect.x} p maxx + #{poke XSizeHints, max_aspect.y} p maxy + whenSet sh_base_size $ \(w, h) -> do + pokeFlag pBaseSizeBit + #{poke XSizeHints, base_width } p w + #{poke XSizeHints, base_height } p h + whenSet sh_win_gravity $ \g -> do + pokeFlag pWinGravityBit + #{poke XSizeHints, win_gravity } p g + + peek p = do + flags <- #{peek XSizeHints, flags} p :: IO CLong + let whenBit n x = if testBit flags n then liftM Just x else return Nothing + return SizeHints + `ap` whenBit pMinSizeBit (do liftM2 (,) (#{peek XSizeHints, min_width } p) + (#{peek XSizeHints, min_height } p)) + `ap` whenBit pMaxSizeBit (do liftM2 (,) (#{peek XSizeHints, max_width } p) + (#{peek XSizeHints, max_height } p)) + `ap` whenBit pResizeIncBit (do liftM2 (,) (#{peek XSizeHints, width_inc } p) + (#{peek XSizeHints, height_inc } p)) + `ap` whenBit pAspectBit (do minx <- #{peek XSizeHints, min_aspect.x} p + miny <- #{peek XSizeHints, min_aspect.y} p + maxx <- #{peek XSizeHints, max_aspect.x} p + maxy <- #{peek XSizeHints, max_aspect.y} p + return ((minx, miny), (maxx, maxy))) + `ap` whenBit pBaseSizeBit (do liftM2 (,) (#{peek XSizeHints, base_width } p) + (#{peek XSizeHints, base_height} p)) + `ap` whenBit pWinGravityBit (#{peek XSizeHints, win_gravity} p) + + +foreign import ccall unsafe "XlibExtras.h XGetWMNormalHints" + xGetWMNormalHints :: Display -> Window -> Ptr SizeHints -> Ptr CLong -> IO Status + +getWMNormalHints :: Display -> Window -> IO SizeHints +getWMNormalHints d w + = alloca $ \sh -> do + alloca $ \supplied_return -> do + -- what's the purpose of supplied_return? + xGetWMNormalHints d w sh supplied_return + peek sh + } Context: [Add XUnmapWindow binding Stefan O'Rear **20070604035056] [Add changeProperty16 and changeProperty32 Stefan O'Rear **20070604024958 Also fixes an API bug in changeProperty8 (Char /= 8 bits) that I'm pretty sure nobody depends on. ] [Add poker for ConfigureEvent Stefan O'Rear **20070603185016] [Work around Xlib's cached screen sizes Spencer Janssen **20070602063054] [TAG 0.2 Spencer Janssen **20070531005534] Patch bundle hash: a904ca68c0fcef54eedd517ab361023592b3cb46