xmonad-config/lib/XMonad/Internal/DBus/Control.hs

126 lines
3.4 KiB
Haskell
Raw Normal View History

{-# LANGUAGE OverloadedStrings #-}
2022-12-30 10:38:21 -05:00
{-# LANGUAGE ScopedTypeVariables #-}
--------------------------------------------------------------------------------
2022-12-30 14:58:23 -05:00
-- High-level interface for managing XMonad's DBus
2020-04-01 20:17:47 -04:00
module XMonad.Internal.DBus.Control
( Client
2022-12-30 14:58:23 -05:00
, DBusState (..)
, withDBusX
, withDBusX_
2022-12-31 22:31:23 -05:00
, withDBus
, withDBus_
2022-07-03 18:23:32 -04:00
, connectDBus
, connectDBusX
, disconnectDBus
, disconnectDBusX
, getDBusClient
2021-11-23 18:28:38 -05:00
, withDBusClient
, withDBusClient_
, disconnect
, dbusExporters
2022-12-30 14:58:23 -05:00
)
where
2020-03-20 00:51:36 -04:00
2022-12-30 14:58:23 -05:00
import DBus
import DBus.Client
import Data.Internal.DBus
import Data.Internal.Dependency
2022-12-30 17:11:06 -05:00
import RIO
import qualified RIO.Text as T
2022-12-30 14:58:23 -05:00
import XMonad.Internal.DBus.Brightness.ClevoKeyboard
import XMonad.Internal.DBus.Brightness.IntelBacklight
import XMonad.Internal.DBus.Common
import XMonad.Internal.DBus.Screensaver
2020-04-01 20:17:47 -04:00
2022-07-03 18:23:32 -04:00
-- | Current connections to the DBus (session and system buses)
data DBusState = DBusState
2022-12-30 14:58:23 -05:00
{ dbSesClient :: Maybe SesClient
, dbSysClient :: Maybe SysClient
}
2020-03-20 00:51:36 -04:00
withDBusX_
:: (MonadReader env m, HasLogFunc env, MonadUnliftIO m)
=> (DBusState -> m a)
-> m ()
withDBusX_ = void . withDBusX
withDBusX
:: (MonadReader env m, HasLogFunc env, MonadUnliftIO m)
=> (DBusState -> m a)
-> m (Maybe a)
withDBusX f = withDBus $ \db -> do
forM (dbSesClient db) $ \ses -> do
bracket_ (requestXMonadName ses) (releaseXMonadName ses) $ f db
withDBus_
:: (MonadReader env m, HasLogFunc env, MonadUnliftIO m)
=> (DBusState -> m a)
-> m ()
2022-12-31 22:31:23 -05:00
withDBus_ = void . withDBus
withDBus
:: (MonadReader env m, HasLogFunc env, MonadUnliftIO m)
=> (DBusState -> m a)
-> m a
2022-12-31 22:31:23 -05:00
withDBus = bracket connectDBus disconnectDBus
2022-07-03 18:23:32 -04:00
-- | Connect to the DBus
connectDBus
:: (MonadReader env m, HasLogFunc env, MonadUnliftIO m)
=> m DBusState
2022-07-03 18:23:32 -04:00
connectDBus = do
2022-07-09 17:08:10 -04:00
ses <- getDBusClient
sys <- getDBusClient
2022-12-30 14:58:23 -05:00
return DBusState {dbSesClient = ses, dbSysClient = sys}
2022-07-03 18:23:32 -04:00
-- | Disconnect from the DBus
2022-12-30 17:11:06 -05:00
disconnectDBus :: MonadUnliftIO m => DBusState -> m ()
2022-07-09 18:04:26 -04:00
disconnectDBus db = disc dbSesClient >> disc dbSysClient
where
disc f = maybe (return ()) disconnectDBusClient $ f db
2022-07-03 18:23:32 -04:00
-- | Connect to the DBus and request the XMonad name
connectDBusX
:: (MonadReader env m, HasLogFunc env, MonadUnliftIO m)
=> m DBusState
2022-07-03 18:23:32 -04:00
connectDBusX = do
db <- connectDBus
2022-07-09 18:04:26 -04:00
forM_ (dbSesClient db) requestXMonadName
2022-07-03 18:23:32 -04:00
return db
-- | Disconnect from DBus and release the XMonad name
2022-12-30 17:11:06 -05:00
disconnectDBusX :: MonadUnliftIO m => DBusState -> m ()
2022-07-03 18:23:32 -04:00
disconnectDBusX db = do
2022-07-09 18:04:26 -04:00
forM_ (dbSesClient db) releaseXMonadName
2022-07-03 18:23:32 -04:00
disconnectDBus db
-- | All exporter features to be assigned to the DBus
2022-07-09 17:08:10 -04:00
dbusExporters :: [Maybe SesClient -> SometimesIO]
2022-07-03 18:23:32 -04:00
dbusExporters = [exportScreensaver, exportIntelBacklight, exportClevoKeyboard]
2022-12-30 17:11:06 -05:00
releaseXMonadName :: MonadUnliftIO m => SesClient -> m ()
releaseXMonadName ses = liftIO $ void $ releaseName (toClient ses) xmonadBusName
2021-11-20 15:20:22 -05:00
requestXMonadName
:: (MonadReader env m, HasLogFunc env, MonadUnliftIO m)
=> SesClient
-> m ()
2022-07-09 18:04:26 -04:00
requestXMonadName ses = do
2022-12-30 17:11:06 -05:00
res <- liftIO $ requestName (toClient ses) xmonadBusName []
2022-12-30 14:58:23 -05:00
let msg
| res == NamePrimaryOwner = "registering name"
| res == NameAlreadyOwner = "this process already owns name"
2022-12-30 14:58:23 -05:00
| res == NameInQueue
|| res == NameExists =
"another process owns name"
| otherwise = "unknown error when requesting name"
logInfo $ msg <> ": " <> xn
2021-11-20 15:20:22 -05:00
where
xn =
Utf8Builder $
encodeUtf8Builder $
T.pack $
formatBusName xmonadBusName