diff options
Diffstat (limited to 'src/Window.hs')
-rw-r--r-- | src/Window.hs | 70 |
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 |