2022-12-26 14:45:49 -05:00
|
|
|
{-# LANGUAGE OverloadedStrings #-}
|
|
|
|
|
2020-05-28 23:17:17 -04:00
|
|
|
--------------------------------------------------------------------------------
|
2022-12-30 14:58:23 -05:00
|
|
|
-- Device plugin
|
2020-05-28 23:17:17 -04:00
|
|
|
--
|
|
|
|
-- Display different text depending on whether or not the interface has
|
|
|
|
-- connectivity
|
|
|
|
|
2022-07-09 17:08:10 -04:00
|
|
|
module Xmobar.Plugins.Device
|
2022-12-30 14:58:23 -05:00
|
|
|
( Device (..)
|
2022-07-09 17:08:10 -04:00
|
|
|
, devDep
|
2022-12-30 14:58:23 -05:00
|
|
|
)
|
|
|
|
where
|
|
|
|
|
|
|
|
import DBus
|
|
|
|
import Data.Internal.DBus
|
|
|
|
import Data.Internal.Dependency
|
|
|
|
import Data.Word
|
2022-12-30 16:59:50 -05:00
|
|
|
import RIO
|
2022-12-30 14:58:23 -05:00
|
|
|
import qualified RIO.Text as T
|
|
|
|
import XMonad.Internal.Command.Desktop
|
|
|
|
import XMonad.Internal.DBus.Common
|
|
|
|
import Xmobar
|
|
|
|
import Xmobar.Plugins.Common
|
2021-11-25 00:12:00 -05:00
|
|
|
|
2022-12-26 14:45:49 -05:00
|
|
|
newtype Device = Device (T.Text, T.Text, Colors) deriving (Read, Show)
|
2021-11-25 00:12:00 -05:00
|
|
|
|
|
|
|
nmPath :: ObjectPath
|
|
|
|
nmPath = objectPath_ "/org/freedesktop/NetworkManager"
|
2020-05-28 23:17:17 -04:00
|
|
|
|
2021-11-25 00:12:00 -05:00
|
|
|
nmInterface :: InterfaceName
|
|
|
|
nmInterface = interfaceName_ "org.freedesktop.NetworkManager"
|
2021-06-21 23:41:57 -04:00
|
|
|
|
2021-11-25 00:12:00 -05:00
|
|
|
nmDeviceInterface :: InterfaceName
|
|
|
|
nmDeviceInterface = interfaceName_ "org.freedesktop.NetworkManager.Device"
|
2020-05-28 23:17:17 -04:00
|
|
|
|
2021-11-25 00:12:00 -05:00
|
|
|
getByIP :: MemberName
|
|
|
|
getByIP = memberName_ "GetDeviceByIpIface"
|
2021-11-09 00:59:17 -05:00
|
|
|
|
2022-12-26 14:45:49 -05:00
|
|
|
devSignal :: T.Text
|
2021-11-25 00:12:00 -05:00
|
|
|
devSignal = "Ip4Connectivity"
|
|
|
|
|
2022-07-09 17:08:10 -04:00
|
|
|
devDep :: DBusDependency_ SysClient
|
2022-12-30 14:58:23 -05:00
|
|
|
devDep =
|
|
|
|
Endpoint networkManagerPkgs networkManagerBus nmPath nmInterface $
|
|
|
|
Method_ getByIP
|
2021-11-09 00:59:17 -05:00
|
|
|
|
2022-12-30 16:59:50 -05:00
|
|
|
getDevice :: MonadUnliftIO m => SysClient -> T.Text -> m (Maybe ObjectPath)
|
2022-07-09 17:44:14 -04:00
|
|
|
getDevice sys iface = bodyToMaybe <$> callMethod' sys mc
|
2021-11-25 00:12:00 -05:00
|
|
|
where
|
2022-12-30 14:58:23 -05:00
|
|
|
mc =
|
|
|
|
(methodCallBus networkManagerBus nmPath nmInterface getByIP)
|
|
|
|
{ methodCallBody = [toVariant iface]
|
|
|
|
}
|
2021-11-25 00:12:00 -05:00
|
|
|
|
2022-12-30 16:59:50 -05:00
|
|
|
getDeviceConnected :: MonadUnliftIO m => ObjectPath -> SysClient -> m [Variant]
|
2022-12-30 14:58:23 -05:00
|
|
|
getDeviceConnected path =
|
|
|
|
callPropertyGet networkManagerBus path nmDeviceInterface $
|
|
|
|
memberName_ $
|
|
|
|
T.unpack devSignal
|
2021-11-25 00:12:00 -05:00
|
|
|
|
|
|
|
matchStatus :: [Variant] -> SignalMatch Word32
|
2021-11-26 23:35:03 -05:00
|
|
|
matchStatus = matchPropertyChanged nmDeviceInterface devSignal
|
2020-05-28 23:17:17 -04:00
|
|
|
|
|
|
|
instance Exec Device where
|
2022-12-26 14:45:49 -05:00
|
|
|
alias (Device (iface, _, _)) = T.unpack iface
|
2021-11-27 17:33:02 -05:00
|
|
|
start (Device (iface, text, colors)) cb = do
|
2022-12-30 10:56:09 -05:00
|
|
|
withDBusClientConnection cb $ \sys -> do
|
2022-07-09 17:44:14 -04:00
|
|
|
path <- getDevice sys iface
|
2022-12-30 10:56:09 -05:00
|
|
|
displayMaybe' cb (listener sys) path
|
2020-05-28 23:17:17 -04:00
|
|
|
where
|
2022-07-09 17:44:14 -04:00
|
|
|
listener sys path = do
|
|
|
|
rule <- matchPropertyFull sys networkManagerBus (Just path)
|
2021-11-27 13:24:13 -05:00
|
|
|
-- TODO warn the user here rather than silently drop the listener
|
|
|
|
forM_ rule $ \r ->
|
2022-07-09 17:44:14 -04:00
|
|
|
startListener r (getDeviceConnected path) matchStatus chooseColor' cb sys
|
2021-11-27 17:33:02 -05:00
|
|
|
chooseColor' = return . (\s -> colorText colors s text) . (> 1)
|