packages feed

tianbar-1.2.4: src/System/Tianbar.hs

module System.Tianbar where

import Data.GI.Base
import Data.Int
import qualified Data.Text as T

import GI.Gdk.Enums hiding (WindowTypeToplevel)
import GI.Gdk.Objects.Display
import GI.Gdk.Objects.Monitor
import GI.Gdk.Objects.Screen
import qualified GI.Gdk.Structs.Rectangle as R

import GI.Gtk.Enums
import qualified GI.Gtk.Functions as GtkFunctions
import GI.Gtk.Objects.Box
import GI.Gtk.Objects.Container
import GI.Gtk.Objects.Widget
import GI.Gtk.Objects.Window

import System.Environment (getArgs, getProgName)

import System.Tianbar.Configuration
import System.Tianbar.StrutProperties
import System.Tianbar.WebKit


data Rectangle = Rectangle { rX :: Int32
                           , rY :: Int32
                           , rW :: Int32
                           , rH :: Int32
                           }

-- The rectangle Tianbar should occupy on the display
tianbarRectangle :: IO Rectangle
tianbarRectangle = do
    Just disp <- displayGetDefault
    Just monitor <- displayGetPrimaryMonitor disp
    monitorSize <- monitorGetGeometry monitor

    monitorX <- get monitorSize R.rectangleX
    monitorY <- get monitorSize R.rectangleY
    monitorW <- get monitorSize R.rectangleWidth

    return $ Rectangle monitorX monitorY monitorW (fromIntegral barHeight)


topStrut :: Rectangle -> StrutProperties
topStrut rect = (0, 0, barHeight, 0,
                 0, 0,
                 0, 0,
                 xStart, xEnd,
                 0, 0)
    where xStart = fromIntegral $ rX rect
          xEnd = fromIntegral $ rX rect + rW rect - 1


sizeMainWindow :: Window -> IO ()
sizeMainWindow window = do
    size <- tianbarRectangle

    windowSetDefaultSize window (rW size) (rH size)
    windowMove window (rX size) (rY size)
    windowResize window (rW size) (rH size)
    setStrutProperties window (topStrut size)


main :: IO ()
main = do
    progName <- getProgName
    args <- getArgs
    _ <- GtkFunctions.init $ Just $ map T.pack (progName : args)

    Just disp <- displayGetDefault
    screen <- displayGetDefaultScreen disp

    window <- windowNew WindowTypeToplevel
    widgetSetName window $ T.pack appName

    windowSetTypeHint window WindowTypeHintDock
    windowSetScreen window screen

    _ <- onWidgetRealize window $ sizeMainWindow window
    _ <- onScreenMonitorsChanged screen $ sizeMainWindow window

    box <- boxNew OrientationHorizontal 0
    containerAdd window box

    wk <- tianbarWebkitNew
    boxPackStart box wk True True 0

    widgetShow window
    widgetShow box

    GtkFunctions.main