xmonad-config/lib/Xmobar/Plugins/VPN.hs

52 lines
1.4 KiB
Haskell
Raw Normal View History

2020-04-01 22:06:00 -04:00
--------------------------------------------------------------------------------
-- | VPN plugin
--
-- Use the NetworkManger interface on DBus to check status
module Xmobar.Plugins.VPN
( VPN(..)
, vpnAlias
, vpnDep
) where
2020-03-21 18:37:26 -04:00
2021-11-27 13:24:13 -05:00
import Control.Monad
2020-03-25 18:55:52 -04:00
import DBus
import DBus.Internal
2020-03-21 18:37:26 -04:00
import XMonad.Internal.Dependency
2021-06-19 00:54:01 -04:00
import Xmobar
import Xmobar.Plugins.Common
2020-03-21 18:37:26 -04:00
2021-11-27 17:33:02 -05:00
newtype VPN = VPN (String, Colors) deriving (Read, Show)
vpnBus :: BusName
vpnBus = busName_ "org.freedesktop.NetworkManager"
vpnPath :: ObjectPath
vpnPath = objectPath_ "/org/freedesktop/NetworkManager"
vpnInterface :: InterfaceName
vpnInterface = interfaceName_ "org.freedesktop.NetworkManager"
vpnConnType :: String
vpnConnType = "PrimaryConnectionType"
vpnAlias :: String
vpnAlias = "vpn"
2020-03-21 18:37:26 -04:00
vpnDep :: DBusDep
vpnDep = Endpoint vpnBus vpnPath vpnInterface $ Property_ vpnConnType
2020-03-22 17:17:57 -04:00
instance Exec VPN where
alias (VPN _) = vpnAlias
2021-11-27 17:33:02 -05:00
start (VPN (text, colors)) cb =
2021-11-27 13:24:13 -05:00
withDBusClientConnection True cb $ \c -> do
rule <- matchPropertyFull c vpnBus (Just vpnPath)
-- TODO intelligently warn user
forM_ rule $ \r -> startListener r getProp fromSignal chooseColor' cb c
2020-03-21 18:37:26 -04:00
where
2021-11-27 13:24:13 -05:00
getProp = callPropertyGet vpnBus vpnPath vpnInterface $ memberName_ vpnConnType
fromSignal = matchPropertyChanged vpnInterface vpnConnType
2021-11-27 17:33:02 -05:00
chooseColor' = return . (\s -> colorText colors s text) . ("vpn" ==)