From 286234b538ae83e33b37fa8f344cccf1d4e94756 Mon Sep 17 00:00:00 2001 From: Jason Creighton Date: Mon, 30 Apr 2007 06:38:59 +0200 Subject: configurable border colors This also fixes a bug where xmonad was assuming a 24-bit display, and just using, eg, 0xff0000 as an index into a colormap without querying the X server to determine the proper pixel value for "red". darcs-hash:20070430043859-b9aa7-9467ff583ec95144e5baa088e4b1536a725e7bc6.gz --- Config.hs | 5 +++++ Main.hs | 6 ++++++ Operations.hs | 11 ++++------- XMonad.hs | 2 ++ 4 files changed, 17 insertions(+), 7 deletions(-) diff --git a/Config.hs b/Config.hs index 9f7a48a..a49f845 100644 --- a/Config.hs +++ b/Config.hs @@ -106,6 +106,11 @@ defaultDelta = 3%100 numlockMask :: KeyMask numlockMask = mod2Mask +-- Border colors for unfocused and focused windows, respectively. +normalBorderColor, focusedBorderColor :: String +normalBorderColor = "#dddddd" +focusedBorderColor = "#ff0000" + -- What layout to start in, and what the default proportion for the -- left pane should be in the tiled layout. See LayoutDesc and -- friends in XMonad.hs for options. diff --git a/Main.hs b/Main.hs index 11d839d..e1d5c90 100644 --- a/Main.hs +++ b/Main.hs @@ -35,10 +35,14 @@ main :: IO () main = do dpy <- openDisplay "" let dflt = defaultScreen dpy + initcolor c = fst `liftM` allocNamedColor dpy (defaultColormap dpy dflt) c + rootw <- rootWindow dpy dflt wmdelt <- internAtom dpy "WM_DELETE_WINDOW" False wmprot <- internAtom dpy "WM_PROTOCOLS" False xinesc <- getScreenInfo dpy + nbc <- initcolor normalBorderColor + fbc <- initcolor focusedBorderColor let st = XState { display = dpy @@ -52,6 +56,8 @@ main = do , workspace = W.empty workspaces (length xinesc) , defaultLayoutDesc = startingLayoutDesc , layoutDescs = M.empty + , normalBorder = nbc + , focusedBorder = fbc } xSetErrorHandler -- in C, I'm too lazy to write the binding diff --git a/Operations.hs b/Operations.hs index 4346398..49094d1 100644 --- a/Operations.hs +++ b/Operations.hs @@ -189,17 +189,18 @@ safeFocus w = do ws <- gets workspace -- | Explicitly set the keyboard focus to the given window setFocus :: Window -> X () setFocus w = do - ws <- gets workspace + XState { workspace = ws, display = dpy + , normalBorder = nbc, focusedBorder = fbc } <- get -- clear mouse button grab and border on other windows flip mapM_ (W.visibleWorkspaces ws) $ \n -> do flip mapM_ (W.index n ws) $ \otherw -> do setButtonGrab True otherw - setBorder otherw 0xdddddd + io $ setWindowBorder dpy otherw (color_pixel nbc) withDisplay $ \d -> io $ setInputFocus d w revertToPointerRoot 0 setButtonGrab False w - setBorder w 0xff0000 -- make this configurable + io $ setWindowBorder dpy w (color_pixel fbc) -- This does not use 'windows' intentionally. 'windows' calls refresh, -- which means infinite loops. @@ -213,10 +214,6 @@ setTopFocus = do Just new -> setFocus new Nothing -> gets theRoot >>= setFocus --- | Set the border color for a particular window. -setBorder :: Window -> Pixel -> X () -setBorder w p = withDisplay $ \d -> io $ setWindowBorder d w p - -- | raise. focus to window at offset 'n' in list. -- The currently focused window is always the head of the list raise :: Ordering -> X () diff --git a/XMonad.hs b/XMonad.hs index df0f1e8..93265a8 100644 --- a/XMonad.hs +++ b/XMonad.hs @@ -46,6 +46,8 @@ data XState = XState , defaultLayoutDesc :: !LayoutDesc -- ^ default layout , layoutDescs :: !(M.Map WorkspaceId LayoutDesc) -- ^ mapping of workspaces -- to descriptions of their layouts + , normalBorder :: !Color -- ^ border color of unfocused windows + , focusedBorder :: !Color -- ^ border color of the focused window } type WindowSet = StackSet WorkspaceId ScreenId Window -- cgit v1.2.3