summaryrefslogtreecommitdiffhomepage
path: root/src/Xmobar/X11/Boxes.hs
blob: 87a081f80f4157f9cff9e62499cdd91502cd8dc8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
------------------------------------------------------------------------------
-- |
-- Module: Xmobar.X11.Boxes
-- Copyright: (c) 2022 Jose Antonio Ortega Ruiz
-- License: BSD3-style (see LICENSE)
--
-- Maintainer: jao@gnu.org
-- Stability: unstable
-- Portability: unportable
--Start date: Fri Sep 16, 2022 04:01
--
-- Borders and boxes
--
------------------------------------------------------------------------------

module Xmobar.X11.Boxes (boxLines, borderRect) where

import Xmobar.Run.Parsers
import Xmobar.Config.Types

-- | Computes the coordinates of a list of lines representing a Box.
-- The Box is to be positioned between x0 and x1, with height ht, and drawn
-- with line width lw.  The returned lists are coordinates of the beginning
-- and end of each line.
boxLines :: Box -> Double -> Double -> Double -> [(Double, Double, Double, Double)]
boxLines (Box bd offset lw _ margins) ht x0 x1 =
  case bd of
    BBTop  -> [rtop];   BBBottom -> [rbot];   BBVBoth -> [rtop, rbot]
    BBLeft -> [rleft];  BBRight  -> [rright]; BBHBoth -> [rleft, rright]
    BBFull -> [rtop, rbot, rleft, rright]
  where (BoxMargins top right bot left) = margins
        (BoxOffset align m) = offset
        ma = fromIntegral m
        (p0, p1) = case align of L -> (0, -ma); C -> (ma, -ma); R -> (ma, 0)
        lc = fromIntegral lw / 2
        [mt, mr, mb, ml] = map fromIntegral [top, right, bot, left]
        xmin = x0 - ml - lc
        xmax = x1 + mr + lc
        ymin = mt + lc
        ymax = ht - mb - lc
        rtop = (xmin + p0, ymin, xmax + p1, ymin)
        rbot = (xmin + p0, ymax, xmax + p1, ymax)
        rleft = (xmin, ymin + p0, xmin, ymax + p1)
        rright = (xmax, ymin + p0, xmax, ymax + p1)

-- | Computes the rectangle (x, y, width, height) for the given Border.
borderRect :: Border -> Double -> Double -> (Double, Double, Double, Double)
borderRect bdr w h =
  case bdr of
    TopB -> (0, 0, w - 1, 0)
    BottomB -> (0, h - 1, w - 1, 0)
    FullB -> (0, 0, w - 1, h - 1)
    TopBM m -> (0, fi m, w - 1, 0)
    BottomBM m -> (0, h - fi m, w - 1, 0)
    FullBM m -> (fi m, fi m, w - 2 * fi m, h - 2 * fi m)
    NoBorder -> (-1, -1, -1, -1)
  where fi = fromIntegral