tianbar-0.3.1.0: src/System/Tianbar/WebKit.hs
{-# Language OverloadedStrings #-}
module System.Tianbar.WebKit where
import Control.Concurrent.MVar
import Control.Monad
import Data.List.Split
-- TODO: Move state to DBus override
import DBus.Client (connectSession, disconnect)
import Graphics.UI.Gtk hiding (disconnect, Signal, Variant)
import Graphics.UI.Gtk.WebKit.NetworkRequest
import Graphics.UI.Gtk.WebKit.WebSettings
import Graphics.UI.Gtk.WebKit.WebView
import Graphics.UI.Gtk.WebKit.WebWindowFeatures
import Network.URI
import System.Environment.XDG.BaseDir
import System.Process
import System.Tianbar.Configuration
import System.Tianbar.DBus
import System.Tianbar.UriOverride
import Paths_tianbar
-- GSettings URI override
gsettingsGet :: String -> String -> IO String
gsettingsGet schema key = do
output <- readProcess "gsettings" ["get", schema, key] []
let len = length output
return $ drop 1 $ take (len - 2) output
gsettingsUriOverride :: UriOverride
gsettingsUriOverride = withScheme "gsettings:" $ \uri -> do
let [schema, key] = splitOn "/" $ uriPath uri
setting <- gsettingsGet schema key
returnContent setting
-- Data directory override
dataFileOverride :: UriOverride
dataFileOverride = withScheme "tianbar:" $ \uri ->
liftM ("file://" ++) $ getDataFileName $ uriPath uri
tianbarWebView :: IO WebView
tianbarWebView = do
wk <- webViewNew
-- Enable AJAX access to all domains
wsettings <- webViewGetWebSettings wk
set wsettings [webSettingsEnableUniversalAccessFromFileUris := True]
webViewSetWebSettings wk wsettings
-- Connect DBus listener, and reconnect on reloads
dbus <- liftM DBusState $ connectSession >>= newMVar
_ <- on wk loadStarted $ \_ ->
modifyMVar_ (dbusClient dbus) $ \client -> do
disconnect client
connectSession
-- Process the special overrides
let allOverrides = mergeOverrides [ gsettingsUriOverride
, dataFileOverride
, dbusOverride wk dbus
]
_ <- on wk resourceRequestStarting $ \_ _ nreq _ -> case nreq of
Nothing -> return ()
(Just req) -> do
uri <- networkRequestGetUri req
let override_ = uri >>= allOverrides
case override_ of
Nothing -> return ()
(Just override) -> override >>= networkRequestSetUri req
-- Handle new window creation
_ <- on wk createWebView $ \_ -> do
nwk <- tianbarWebView
window <- windowNew
containerAdd window nwk
_ <- on nwk webViewReady $ do
wfeat <- webViewGetWindowFeatures nwk
[wx, wy, ww, wh] <- mapM (get wfeat) [ webWindowFeaturesX
, webWindowFeaturesY
, webWindowFeaturesWidth
, webWindowFeaturesHeight
]
windowSetGeometryHints window
(Nothing :: Maybe Window)
(Just (ww, wh))
(Just (ww, wh))
Nothing
Nothing
Nothing
widgetShow window
widgetShow nwk
windowMove window wx wy
windowSetKeepAbove window True
windowStick window
return False
return nwk
return wk
loadIndexPage :: WebView -> IO ()
loadIndexPage wk = do
htmlFile <- getUserConfigFile appName "index.html"
html <- readFile htmlFile
webViewLoadHtmlString wk html $ "file://" ++ htmlFile
tianbarWebkitNew :: IO Widget
tianbarWebkitNew = do
l <- tianbarWebView
_ <- on l realize $ loadIndexPage l
Just disp <- displayGetDefault
screen <- displayGetScreen disp myScreen
(Rectangle _ _ sw _) <- screenGetMonitorGeometry screen myMonitor
_ <- on l sizeRequest $ return (Requisition (sw `div` 2) barHeight)
widgetShowAll l
return (toWidget l)