2020-04-01 22:06:00 -04:00
|
|
|
-- | High-level interface for managing XMonad's DBus
|
|
|
|
|
2022-12-30 10:38:21 -05:00
|
|
|
{-# LANGUAGE OverloadedStrings #-}
|
|
|
|
{-# LANGUAGE ScopedTypeVariables #-}
|
|
|
|
|
2020-04-01 20:17:47 -04:00
|
|
|
module XMonad.Internal.DBus.Control
|
2020-03-28 14:44:50 -04:00
|
|
|
( Client
|
2022-07-03 18:23:32 -04:00
|
|
|
, DBusState(..)
|
|
|
|
, connectDBus
|
|
|
|
, connectDBusX
|
|
|
|
, disconnectDBus
|
|
|
|
, disconnectDBusX
|
2021-11-21 22:47:43 -05:00
|
|
|
, getDBusClient
|
2021-11-23 18:28:38 -05:00
|
|
|
, withDBusClient
|
|
|
|
, withDBusClient_
|
2021-11-21 22:47:43 -05:00
|
|
|
, disconnect
|
2022-06-16 18:50:24 -04:00
|
|
|
, dbusExporters
|
2020-04-01 20:17:47 -04:00
|
|
|
) where
|
2020-03-20 00:51:36 -04:00
|
|
|
|
2022-07-09 17:44:14 -04:00
|
|
|
import Data.Internal.DBus
|
|
|
|
import Data.Internal.Dependency
|
|
|
|
|
2021-06-21 23:41:57 -04:00
|
|
|
import DBus
|
2020-03-28 14:44:50 -04:00
|
|
|
import DBus.Client
|
2020-03-20 00:51:36 -04:00
|
|
|
|
2022-12-30 10:38:21 -05:00
|
|
|
import RIO
|
|
|
|
import qualified RIO.Text as T
|
|
|
|
|
2021-11-21 00:42:40 -05:00
|
|
|
import XMonad.Internal.DBus.Brightness.ClevoKeyboard
|
2021-11-20 15:20:22 -05:00
|
|
|
import XMonad.Internal.DBus.Brightness.IntelBacklight
|
2021-06-21 23:41:57 -04:00
|
|
|
import XMonad.Internal.DBus.Common
|
2020-04-01 20:17:47 -04:00
|
|
|
import XMonad.Internal.DBus.Screensaver
|
|
|
|
|
2022-07-03 18:23:32 -04:00
|
|
|
-- | Current connections to the DBus (session and system buses)
|
|
|
|
data DBusState = DBusState
|
2022-07-09 17:08:10 -04:00
|
|
|
{ dbSesClient :: Maybe SesClient
|
|
|
|
, dbSysClient :: Maybe SysClient
|
2022-07-03 18:23:32 -04:00
|
|
|
}
|
2020-03-20 00:51:36 -04:00
|
|
|
|
2022-07-03 18:23:32 -04:00
|
|
|
-- | Connect to the DBus
|
2022-12-30 10:38:21 -05:00
|
|
|
connectDBus
|
|
|
|
:: (MonadUnliftIO m, MonadReader env m, HasLogFunc env)
|
|
|
|
=> 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-07-03 18:23:32 -04:00
|
|
|
return DBusState { dbSesClient = ses, dbSysClient = sys }
|
|
|
|
|
|
|
|
-- | Disconnect from the DBus
|
2022-12-30 10:38:21 -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
|
2022-12-30 10:38:21 -05:00
|
|
|
connectDBusX
|
|
|
|
:: (MonadUnliftIO m, MonadReader env m, HasLogFunc env)
|
|
|
|
=> 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 10:38:21 -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 10:38:21 -05:00
|
|
|
releaseXMonadName
|
|
|
|
:: (MonadUnliftIO m)
|
|
|
|
=> SesClient
|
|
|
|
-> m ()
|
|
|
|
releaseXMonadName ses = void $ liftIO $ releaseName (toClient ses) xmonadBusName
|
2021-11-20 15:20:22 -05:00
|
|
|
|
2022-12-30 10:38:21 -05:00
|
|
|
requestXMonadName
|
|
|
|
:: (MonadUnliftIO m, MonadReader env m, HasLogFunc env)
|
|
|
|
=> SesClient
|
|
|
|
-> m ()
|
2022-07-09 18:04:26 -04:00
|
|
|
requestXMonadName ses = do
|
2022-12-30 10:38:21 -05:00
|
|
|
res <- liftIO $ requestName (toClient ses) xmonadBusName []
|
2021-11-21 00:42:40 -05:00
|
|
|
-- TODO if the client is not released on shutdown the owner will be different
|
2021-11-20 15:20:22 -05:00
|
|
|
let msg | res == NamePrimaryOwner = Nothing
|
2022-12-30 10:38:21 -05:00
|
|
|
| res == NameAlreadyOwner = Just "this process already owns bus name"
|
2021-11-20 15:20:22 -05:00
|
|
|
| res == NameInQueue
|
2022-12-30 10:38:21 -05:00
|
|
|
|| res == NameExists = Just "another process owns bus name"
|
|
|
|
| otherwise = Just "unknown error when requesting bus name"
|
|
|
|
forM_ msg $ \m ->
|
|
|
|
logError $ Utf8Builder $ encodeUtf8Builder $ T.concat [m, ": ", xn]
|
2021-11-20 15:20:22 -05:00
|
|
|
where
|
2022-12-30 10:38:21 -05:00
|
|
|
xn = T.pack $ formatBusName xmonadBusName
|