mirror of
https://github.com/xmonad/xmonad-contrib.git
synced 2025-08-01 20:51:52 -07:00
X.U.WindowProperties: Add getProp32 and getProp32s, helpers to get properties from windows
This commit is contained in:
@@ -27,6 +27,7 @@ import XMonad
|
|||||||
import Foreign.C.Types (CLong)
|
import Foreign.C.Types (CLong)
|
||||||
import Control.Monad
|
import Control.Monad
|
||||||
import XMonad.Layout.LayoutModifier
|
import XMonad.Layout.LayoutModifier
|
||||||
|
import XMonad.Util.WindowProperties (getProp32s)
|
||||||
|
|
||||||
import Data.List (delete)
|
import Data.List (delete)
|
||||||
|
|
||||||
@@ -100,10 +101,9 @@ manageDocks = checkDock --> doIgnore
|
|||||||
-- | Checks if a window is a DOCK or DESKTOP window
|
-- | Checks if a window is a DOCK or DESKTOP window
|
||||||
checkDock :: Query Bool
|
checkDock :: Query Bool
|
||||||
checkDock = ask >>= \w -> liftX $ do
|
checkDock = ask >>= \w -> liftX $ do
|
||||||
a <- getAtom "_NET_WM_WINDOW_TYPE"
|
|
||||||
dock <- getAtom "_NET_WM_WINDOW_TYPE_DOCK"
|
dock <- getAtom "_NET_WM_WINDOW_TYPE_DOCK"
|
||||||
desk <- getAtom "_NET_WM_WINDOW_TYPE_DESKTOP"
|
desk <- getAtom "_NET_WM_WINDOW_TYPE_DESKTOP"
|
||||||
mbr <- getProp a w
|
mbr <- getProp32s "_NET_WM_WINDOW_TYPE" w
|
||||||
case mbr of
|
case mbr of
|
||||||
Just [r] -> return $ elem (fromIntegral r) [dock, desk]
|
Just [r] -> return $ elem (fromIntegral r) [dock, desk]
|
||||||
_ -> return False
|
_ -> return False
|
||||||
@@ -111,12 +111,10 @@ checkDock = ask >>= \w -> liftX $ do
|
|||||||
-- | Gets the STRUT config, if present, in xmonad gap order
|
-- | Gets the STRUT config, if present, in xmonad gap order
|
||||||
getStrut :: Window -> X [Strut]
|
getStrut :: Window -> X [Strut]
|
||||||
getStrut w = do
|
getStrut w = do
|
||||||
spa <- getAtom "_NET_WM_STRUT_PARTIAL"
|
msp <- getProp32s "_NET_WM_STRUT_PARTIAL" w
|
||||||
sa <- getAtom "_NET_WM_STRUT"
|
|
||||||
msp <- getProp spa w
|
|
||||||
case msp of
|
case msp of
|
||||||
Just sp -> return $ parseStrutPartial sp
|
Just sp -> return $ parseStrutPartial sp
|
||||||
Nothing -> fmap (maybe [] parseStrut) $ getProp sa w
|
Nothing -> fmap (maybe [] parseStrut) $ getProp32s "_NET_WM_STRUT" w
|
||||||
where
|
where
|
||||||
parseStrut xs@[_, _, _, _] = parseStrutPartial . take 12 $ xs ++ cycle [minBound, maxBound]
|
parseStrut xs@[_, _, _, _] = parseStrutPartial . take 12 $ xs ++ cycle [minBound, maxBound]
|
||||||
parseStrut _ = []
|
parseStrut _ = []
|
||||||
@@ -126,10 +124,6 @@ getStrut w = do
|
|||||||
[(L, l, ly1, ly2), (R, r, ry1, ry2), (U, t, tx1, tx2), (D, b, bx1, bx2)]
|
[(L, l, ly1, ly2), (R, r, ry1, ry2), (U, t, tx1, tx2), (D, b, bx1, bx2)]
|
||||||
parseStrutPartial _ = []
|
parseStrutPartial _ = []
|
||||||
|
|
||||||
-- | Helper to read a property
|
|
||||||
getProp :: Atom -> Window -> X (Maybe [CLong])
|
|
||||||
getProp a w = withDisplay $ \dpy -> io $ getWindowProperty32 dpy a w
|
|
||||||
|
|
||||||
-- | Goes through the list of windows and find the gap so that all
|
-- | Goes through the list of windows and find the gap so that all
|
||||||
-- STRUT settings are satisfied.
|
-- STRUT settings are satisfied.
|
||||||
calcGap :: [Direction] -> X (Rectangle -> Rectangle)
|
calcGap :: [Direction] -> X (Rectangle -> Rectangle)
|
||||||
|
@@ -46,6 +46,7 @@ module XMonad.Hooks.ManageHelpers (
|
|||||||
|
|
||||||
import XMonad
|
import XMonad
|
||||||
import qualified XMonad.StackSet as W
|
import qualified XMonad.StackSet as W
|
||||||
|
import XMonad.Util.WindowProperties (getProp32s)
|
||||||
|
|
||||||
import Data.Maybe
|
import Data.Maybe
|
||||||
import Data.Monoid
|
import Data.Monoid
|
||||||
@@ -117,9 +118,7 @@ p -?>> f = do
|
|||||||
-- | A predicate to check whether a window is a KDE system tray icon.
|
-- | A predicate to check whether a window is a KDE system tray icon.
|
||||||
isKDETrayWindow :: Query Bool
|
isKDETrayWindow :: Query Bool
|
||||||
isKDETrayWindow = ask >>= \w -> liftX $ do
|
isKDETrayWindow = ask >>= \w -> liftX $ do
|
||||||
dpy <- asks display
|
r <- getProp32s "_KDE_NET_WM_SYSTEM_TRAY_WINDOW_FOR" w
|
||||||
kde_tray <- getAtom "_KDE_NET_WM_SYSTEM_TRAY_WINDOW_FOR"
|
|
||||||
r <- io $ getWindowProperty32 dpy kde_tray w
|
|
||||||
return $ case r of
|
return $ case r of
|
||||||
Just [_] -> True
|
Just [_] -> True
|
||||||
_ -> False
|
_ -> False
|
||||||
@@ -127,10 +126,8 @@ isKDETrayWindow = ask >>= \w -> liftX $ do
|
|||||||
-- | Helper to check if a window property contains certain value.
|
-- | Helper to check if a window property contains certain value.
|
||||||
isInProperty :: String -> String -> Query Bool
|
isInProperty :: String -> String -> Query Bool
|
||||||
isInProperty p v = ask >>= \w -> liftX $ do
|
isInProperty p v = ask >>= \w -> liftX $ do
|
||||||
dpy <- asks display
|
|
||||||
pa <- getAtom p
|
|
||||||
va <- getAtom v
|
va <- getAtom v
|
||||||
r <- io $ getWindowProperty32 dpy pa w
|
r <- getProp32s p w
|
||||||
return $ case r of
|
return $ case r of
|
||||||
Just xs -> fromIntegral va `elem` xs
|
Just xs -> fromIntegral va `elem` xs
|
||||||
_ -> False
|
_ -> False
|
||||||
@@ -146,9 +143,7 @@ isDialog = isInProperty "_NET_WM_WINDOW_TYPE" "_NET_WM_WINDOW_TYPE_DIALOG"
|
|||||||
|
|
||||||
pid :: Query (Maybe ProcessID)
|
pid :: Query (Maybe ProcessID)
|
||||||
pid = ask >>= \w -> liftX $ do
|
pid = ask >>= \w -> liftX $ do
|
||||||
dpy <- asks display
|
p <- getProp32s "_NET_WM_PID" w
|
||||||
a <- getAtom "_NET_WM_PID"
|
|
||||||
p <- io $ getWindowProperty32 dpy a w
|
|
||||||
return $ case p of
|
return $ case p of
|
||||||
Just [x] -> Just (fromIntegral x)
|
Just [x] -> Just (fromIntegral x)
|
||||||
_ -> Nothing
|
_ -> Nothing
|
||||||
|
@@ -15,10 +15,12 @@ module XMonad.Util.WindowProperties (
|
|||||||
-- * Usage
|
-- * Usage
|
||||||
-- $usage
|
-- $usage
|
||||||
Property(..), hasProperty, focusedHasProperty, allWithProperty,
|
Property(..), hasProperty, focusedHasProperty, allWithProperty,
|
||||||
|
getProp32, getProp32s,
|
||||||
propertyToQuery)
|
propertyToQuery)
|
||||||
where
|
where
|
||||||
import XMonad
|
import XMonad
|
||||||
import qualified XMonad.StackSet as W
|
import qualified XMonad.StackSet as W
|
||||||
|
import Foreign.C.Types (CLong)
|
||||||
import Control.Monad
|
import Control.Monad
|
||||||
|
|
||||||
-- $usage
|
-- $usage
|
||||||
@@ -78,3 +80,11 @@ propertyToQuery (And p1 p2) = propertyToQuery p1 <&&> propertyToQuery p2
|
|||||||
propertyToQuery (Or p1 p2) = propertyToQuery p1 <||> propertyToQuery p2
|
propertyToQuery (Or p1 p2) = propertyToQuery p1 <||> propertyToQuery p2
|
||||||
propertyToQuery (Not p) = not `fmap` propertyToQuery p
|
propertyToQuery (Not p) = not `fmap` propertyToQuery p
|
||||||
propertyToQuery (Const b) = return b
|
propertyToQuery (Const b) = return b
|
||||||
|
|
||||||
|
-- | Get a window property from atom
|
||||||
|
getProp32 :: Atom -> Window -> X (Maybe [CLong])
|
||||||
|
getProp32 a w = withDisplay $ \dpy -> io $ getWindowProperty32 dpy a w
|
||||||
|
|
||||||
|
-- | Get a window property from string
|
||||||
|
getProp32s :: String -> Window -> X (Maybe [CLong])
|
||||||
|
getProp32s str w = do { a <- getAtom str; getProp32 a w }
|
||||||
|
Reference in New Issue
Block a user