From 67b6aee8fe2efa6f03a220ecc27ab0fba405109c Mon Sep 17 00:00:00 2001 From: Don Stewart Date: Sun, 27 May 2007 14:59:28 +0200 Subject: mod-b, toggle on or off the status bar gap darcs-hash:20070527125928-9c5c1-a16246810db9d4abfe81d0d5814721b64f59a14c.gz --- Config.hs | 9 +++++--- Config.hs-boot | 1 - Main.hs | 1 + Operations.hs | 14 ++++++++---- XMonad.hs | 1 + util/gapcalc.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 88 insertions(+), 8 deletions(-) create mode 100644 util/gapcalc.c diff --git a/Config.hs b/Config.hs index 617f982..0f7bb07 100644 --- a/Config.hs +++ b/Config.hs @@ -49,9 +49,9 @@ defaultDelta = 3%100 defaultWindowsInMaster :: Int defaultWindowsInMaster = 1 --- Default width of gap at top of screen for a menu bar (e.g. 16) -defaultMenuGap :: Int -defaultMenuGap = 0 +-- Default height of gap at top of screen for a menu bar (e.g. 15) +defaultStatusGap :: Int +defaultStatusGap = 0 -- 15 for default dzen -- numlock handling: -- @@ -114,6 +114,9 @@ keys = M.fromList $ , ((modMask , xK_comma ), sendMessage (IncMasterN 1)) -- @@ Increment the number of windows in the master area , ((modMask , xK_period), sendMessage (IncMasterN (-1))) -- @@ Deincrement the number of windows in the master area + -- toggle the status bar gap + , ((modMask , xK_b ), modifyGap (\n -> if n == 0 then defaultStatusGap else 0)) -- @@ Toggle the status bar gap + -- quit, or restart , ((modMask .|. shiftMask, xK_q ), io (exitWith ExitSuccess)) -- @@ Quit xmonad , ((modMask .|. shiftMask .|. controlMask, xK_q ), restart Nothing True) -- @@ Restart xmonad diff --git a/Config.hs-boot b/Config.hs-boot index fe30869..2d66ae1 100644 --- a/Config.hs-boot +++ b/Config.hs-boot @@ -1,4 +1,3 @@ module Config where import Graphics.X11.Xlib.Types (Dimension) borderWidth :: Dimension -defaultMenuGap :: Int diff --git a/Main.hs b/Main.hs index c1a8b48..f493d80 100644 --- a/Main.hs +++ b/Main.hs @@ -61,6 +61,7 @@ main = do st = XState { windowset = winset , layouts = M.fromList [(w, safeLayouts) | w <- [0 .. W workspaces - 1]] + , statusGap = defaultStatusGap , xineScreens = xinesc , dimensions = (fromIntegral (displayWidth dpy dflt), fromIntegral (displayHeight dpy dflt)) } diff --git a/Operations.hs b/Operations.hs index 96727bb..10a5882 100644 --- a/Operations.hs +++ b/Operations.hs @@ -15,7 +15,7 @@ module Operations where import XMonad import qualified StackSet as W -import {-# SOURCE #-} Config (borderWidth,defaultMenuGap) +import {-# SOURCE #-} Config (borderWidth) import Data.Maybe import Data.List (genericIndex, intersectBy) @@ -67,6 +67,12 @@ shift n = withFocused hide >> windows (W.shift n) view :: WorkspaceId -> X () view = windows . W.view +-- | Modify the size of the status gap at the top of the screen +modifyGap :: (Int -> Int) -> X () +modifyGap f = do modify $ \s -> s { statusGap = max 0 (f (statusGap s)) } + refresh + + -- | Kill the currently focused client. If we do kill it, we'll get a -- delete notify back from X. -- @@ -123,7 +129,7 @@ hide w = withDisplay $ \d -> do -- refresh :: X () refresh = do - XState { windowset = ws, layouts = fls, xineScreens = xinesc } <- get + XState { windowset = ws, layouts = fls, xineScreens = xinesc, statusGap = gap } <- get d <- asks display -- for each workspace, layout the currently visible workspaces @@ -133,8 +139,8 @@ refresh = do Just l = fmap fst $ M.lookup n fls Rectangle sx sy sw sh = genericIndex xinesc (W.screen w) -- now tile the windows on this workspace - rs <- doLayout l (Rectangle sx (sy + fromIntegral defaultMenuGap) - sw (sh - fromIntegral defaultMenuGap)) (W.index this) + rs <- doLayout l (Rectangle sx (sy + fromIntegral gap) + sw (sh - fromIntegral gap)) (W.index this) mapM_ (\(win,rect) -> io (tileWindow d win rect)) rs -- and raise the focused window if there is one. diff --git a/XMonad.hs b/XMonad.hs index 95f0c5b..6233257 100644 --- a/XMonad.hs +++ b/XMonad.hs @@ -40,6 +40,7 @@ data XState = XState { windowset :: !WindowSet -- ^ workspace list , xineScreens :: ![Rectangle] -- ^ dimensions of each screen , dimensions :: !(Position,Position) -- ^ dimensions of the screen, + , statusGap :: !Int -- ^ width of status bar -- used for hiding windows , layouts :: !(M.Map WorkspaceId (Layout, [Layout])) } -- ^ mapping of workspaces to descriptions of their layouts diff --git a/util/gapcalc.c b/util/gapcalc.c new file mode 100644 index 0000000..4a4c3db --- /dev/null +++ b/util/gapcalc.c @@ -0,0 +1,70 @@ +/* gapcalc - calculate height of given font + * Copyright (C) 2007 by Robert Manea + * + * Compile with: cc -lX11 -o gapcalc gapcalc.c + */ + +#include +#include +#include +#include +#include + +void +eprint(const char *errstr, ...) { + va_list ap; + + va_start(ap, errstr); + vfprintf(stderr, errstr, ap); + va_end(ap); + exit(EXIT_FAILURE); +} + + +int +main(int argc, char *argv[]) { + Display *dpy; + XFontStruct *xfont; + XFontSet set; + char *def, **missing; + char *fontstr; + int i, n, ascent, descent; + + if(argc < 2) + eprint("Usage: gapcalc \n"); + + if(!(dpy = XOpenDisplay(0))) + eprint("fatal: cannot open display\n"); + + fontstr = argv[1]; + missing = NULL; + + set = XCreateFontSet(dpy, fontstr, &missing, &n, &def); + if(missing) + XFreeStringList(missing); + if(set) { + XFontSetExtents *font_extents; + XFontStruct **xfonts; + char **font_names; + ascent = descent = 0; + font_extents = XExtentsOfFontSet(set); + n = XFontsOfFontSet(set, &xfonts, &font_names); + for(i = 0, ascent = 0, descent = 0; i < n; i++) { + if(ascent < (*xfonts)->ascent) + ascent = (*xfonts)->ascent; + if(descent < (*xfonts)->descent) + descent = (*xfonts)->descent; + xfonts++; + } + } else if(!set && (xfont = XLoadQueryFont(dpy, fontstr))) { + ascent = xfont->ascent; + descent = xfont->descent; + } else + eprint("fatal: cannot find specified font\n"); + + printf("%d\n", ascent + descent + 2); + + + return EXIT_SUCCESS; +} + -- cgit v1.2.3