summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Window.hs70
1 files changed, 38 insertions, 32 deletions
diff --git a/src/Window.hs b/src/Window.hs
index 8628435..e8739fe 100644
--- a/src/Window.hs
+++ b/src/Window.hs
@@ -33,26 +33,28 @@ import XUtil
createWin :: Display -> XFont -> Config -> IO (Rectangle,Window)
createWin d fs c = do
let dflt = defaultScreen d
- srs <- getScreenInfo d
- rootw <- rootWindow d dflt
+ srs <- getScreenInfo d
+ rootw <- rootWindow d dflt
(as,ds) <- textExtents fs "0"
- let ht = as + ds + 4
+ let ht = as + ds + 4
r = setPosition (position c) srs (fi ht)
win <- newWindow d (defaultScreenOfDisplay d) rootw r (overrideRedirect c)
+ setProperties c d win
when (lowerOnStart c) (lowerWindow d win)
- unless (hideOnStart c) $ showWindow r c d win
- setProperties r c d win srs
+ unless (hideOnStart c) $ showWindow r c d win
+ setStruts r c d win srs
return (r,win)
-- | Updates the size and position of the window
repositionWin :: Display -> Window -> XFont -> Config -> IO Rectangle
repositionWin d win fs c = do
- srs <- getScreenInfo d
+ srs <- getScreenInfo d
(as,ds) <- textExtents fs "0"
- let ht = as + ds + 4
+ let ht = as + ds + 4
r = setPosition (position c) srs (fi ht)
moveResizeWindow d win (rect_x r) (rect_y r) (rect_width r) (rect_height r)
- setProperties r c d win srs
+ setProperties c d win
+ setStruts r c d win srs
return r
setPosition :: XPosition -> [Rectangle] -> Dimension -> Rectangle
@@ -72,23 +74,22 @@ setPosition p rs ht =
(scr@(Rectangle rx ry rw rh), p') =
case p of OnScreen i x -> (fromMaybe (head rs) $ safeIndex i rs, x)
_ -> (head rs, p)
- ny = ry + fi (rh - ht)
+ ny = ry + fi (rh - ht)
center i = rx + fi (div (remwid i) 2)
right i = rx + fi (remwid i)
remwid i = rw - pw (fi i)
- ax L = const rx
- ax R = right
- ax C = center
- pw i = rw * min 100 i `div` 100
- nw = fi . pw . fi
- h = fi ht
- mh h' = max (fi h') h
- ny' h' = ry + fi (rh - mh h')
+ ax L = const rx
+ ax R = right
+ ax C = center
+ pw i = rw * min 100 i `div` 100
+ nw = fi . pw . fi
+ h = fi ht
+ mh h' = max (fi h') h
+ ny' h' = ry + fi (rh - mh h')
safeIndex i = lookup i . zip [0..]
-setProperties :: Rectangle -> Config -> Display -> Window -> [Rectangle]
- -> IO ()
-setProperties r c d w rs = do
+setProperties :: Config -> Display -> Window -> IO ()
+setProperties c d w = do
let mkatom n = internAtom d n False
card <- mkatom "CARDINAL"
atom <- mkatom "ATOM"
@@ -96,6 +97,22 @@ setProperties r c d w rs = do
setTextProperty d w "xmobar" wM_CLASS
setTextProperty d w "xmobar" wM_NAME
+ wtype <- mkatom "_NET_WM_WINDOW_TYPE"
+ dock <- mkatom "_NET_WM_WINDOW_TYPE_DOCK"
+ changeProperty32 d w wtype atom propModeReplace [fi dock]
+
+ when (allDesktops c) $ do
+ desktop <- mkatom "_NET_WM_DESKTOP"
+ changeProperty32 d w desktop card propModeReplace [0xffffffff]
+
+ pid <- mkatom "_NET_WM_PID"
+ getProcessID >>= changeProperty32 d w pid card propModeReplace . return . fi
+
+setStruts :: Rectangle -> Config -> Display -> Window -> [Rectangle] -> IO ()
+setStruts r c d w rs = do
+ let mkatom n = internAtom d n False
+ card <- mkatom "CARDINAL"
+
ismapped <- isMapped d w
let svs = if ismapped
then map fi $ getStrutValues r
@@ -108,17 +125,6 @@ setProperties r c d w rs = do
strut <- mkatom "_NET_WM_STRUT"
changeProperty32 d w strut card propModeReplace (take 4 svs)
- wtype <- mkatom "_NET_WM_WINDOW_TYPE"
- dock <- mkatom "_NET_WM_WINDOW_TYPE_DOCK"
- changeProperty32 d w wtype atom propModeReplace [fi dock]
-
- when (allDesktops c) $ do
- desktop <- mkatom "_NET_WM_DESKTOP"
- changeProperty32 d w desktop card propModeReplace [0xffffffff]
-
- pid <- mkatom "_NET_WM_PID"
- getProcessID >>= changeProperty32 d w pid card propModeReplace . return . fi
-
getRootWindowHeight :: [Rectangle] -> Int
getRootWindowHeight srs = maximum (map getMaxScreenYCoord srs)
where
@@ -148,7 +154,7 @@ getStaticStrutValues (Static cx cy cw ch) rwh
-- if the yPos is in the top half of the screen, then assume a Top
-- placement, otherwise, it's a Bottom placement
| cy < (rwh `div` 2) = [0, 0, st, 0, 0, 0, 0, 0, xs, xe, 0, 0]
- | otherwise = [0, 0, 0, sb, 0, 0, 0, 0, 0, 0, xs, xe]
+ | otherwise = [0, 0, 0, sb, 0, 0, 0, 0, 0, 0, xs, xe]
where st = cy + ch
sb = rwh - cy
xs = cx -- a simple calculation for horizontal (x) placement